shelfware 0.0.1 → 0.1.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 (206) hide show
  1. package/.output/nitro.json +15 -0
  2. package/.output/public/_nuxt/6IstVYrV.js +1 -0
  3. package/.output/public/_nuxt/9C5WUlLE.js +36 -0
  4. package/.output/public/_nuxt/BDNMzG2s.js +1 -0
  5. package/.output/public/_nuxt/BW3xJdEx.js +1 -0
  6. package/.output/public/_nuxt/BXXtFil5.js +1 -0
  7. package/.output/public/_nuxt/BZuUK3cr.js +1 -0
  8. package/.output/public/_nuxt/BeLyMmd4.js +1 -0
  9. package/.output/public/_nuxt/C_VgD9ZI.js +3 -0
  10. package/.output/public/_nuxt/DB5Vxbte.js +2 -0
  11. package/.output/public/_nuxt/DMg0j7gv.js +14 -0
  12. package/.output/public/_nuxt/builds/latest.json +1 -0
  13. package/.output/public/_nuxt/builds/meta/4c307968-4837-497b-a570-d6ee336accc4.json +1 -0
  14. package/.output/public/_nuxt/entry.b3_DJTEt.css +2 -0
  15. package/.output/public/_nuxt/error-404.CHsn7XF-.css +1 -0
  16. package/.output/public/_nuxt/error-500.Bawx2bLr.css +1 -0
  17. package/.output/server/chunks/_/api-handler.mjs +44 -0
  18. package/.output/server/chunks/_/batch.mjs +27 -0
  19. package/.output/server/chunks/_/catalog.mjs +1115 -0
  20. package/.output/server/chunks/_/detail.mjs +16 -0
  21. package/.output/server/chunks/_/error-500.mjs +19 -0
  22. package/.output/server/chunks/_/quarantine.mjs +159 -0
  23. package/.output/server/chunks/nitro/nitro.mjs +5399 -0
  24. package/.output/server/chunks/routes/api/_..._.mjs +16 -0
  25. package/.output/server/chunks/routes/api/health.get.mjs +13 -0
  26. package/.output/server/chunks/routes/api/skills/_id/file.get.mjs +25 -0
  27. package/.output/server/chunks/routes/api/skills/_id_.get.mjs +25 -0
  28. package/.output/server/chunks/routes/api/skills/_id_.put.mjs +74 -0
  29. package/.output/server/chunks/routes/api/skills/delete.post.mjs +48 -0
  30. package/.output/server/chunks/routes/api/skills/quarantine.post.mjs +26 -0
  31. package/.output/server/chunks/routes/api/skills/restore.post.mjs +26 -0
  32. package/.output/server/chunks/routes/api/skills.get.mjs +41 -0
  33. package/.output/server/chunks/routes/renderer.mjs +341 -0
  34. package/.output/server/chunks/virtual/_virtual_spa-template.mjs +3 -0
  35. package/.output/server/chunks/virtual/precomputed.mjs +3 -0
  36. package/.output/server/index.mjs +9 -0
  37. package/.output/server/node_modules/@babel/parser/lib/index.js +14611 -0
  38. package/.output/server/node_modules/@babel/parser/package.json +50 -0
  39. package/.output/server/node_modules/@vue/compiler-core/dist/compiler-core.cjs.prod.js +6801 -0
  40. package/.output/server/node_modules/@vue/compiler-core/package.json +58 -0
  41. package/.output/server/node_modules/@vue/compiler-dom/dist/compiler-dom.cjs.prod.js +692 -0
  42. package/.output/server/node_modules/@vue/compiler-dom/package.json +57 -0
  43. package/.output/server/node_modules/@vue/compiler-ssr/dist/compiler-ssr.cjs.js +1420 -0
  44. package/.output/server/node_modules/@vue/compiler-ssr/package.json +34 -0
  45. package/.output/server/node_modules/@vue/reactivity/dist/reactivity.cjs.prod.js +1903 -0
  46. package/.output/server/node_modules/@vue/reactivity/package.json +55 -0
  47. package/.output/server/node_modules/@vue/runtime-core/dist/runtime-core.cjs.prod.js +6980 -0
  48. package/.output/server/node_modules/@vue/runtime-core/package.json +52 -0
  49. package/.output/server/node_modules/@vue/runtime-dom/dist/runtime-dom.cjs.prod.js +1867 -0
  50. package/.output/server/node_modules/@vue/runtime-dom/package.json +60 -0
  51. package/.output/server/node_modules/@vue/server-renderer/dist/server-renderer.cjs.prod.js +904 -0
  52. package/.output/server/node_modules/@vue/server-renderer/package.json +53 -0
  53. package/.output/server/node_modules/@vue/shared/dist/shared.cjs.prod.js +636 -0
  54. package/.output/server/node_modules/@vue/shared/package.json +47 -0
  55. package/.output/server/node_modules/devalue/index.js +17 -0
  56. package/.output/server/node_modules/devalue/package.json +39 -0
  57. package/.output/server/node_modules/devalue/src/base64.js +60 -0
  58. package/.output/server/node_modules/devalue/src/constants.js +12 -0
  59. package/.output/server/node_modules/devalue/src/operations.js +193 -0
  60. package/.output/server/node_modules/devalue/src/parse.js +274 -0
  61. package/.output/server/node_modules/devalue/src/stringify.js +428 -0
  62. package/.output/server/node_modules/devalue/src/uneval.js +606 -0
  63. package/.output/server/node_modules/devalue/src/utils.js +185 -0
  64. package/.output/server/node_modules/entities/dist/commonjs/decode-codepoint.js +77 -0
  65. package/.output/server/node_modules/entities/dist/commonjs/decode.js +568 -0
  66. package/.output/server/node_modules/entities/dist/commonjs/generated/decode-data-html.js +7 -0
  67. package/.output/server/node_modules/entities/dist/commonjs/generated/decode-data-xml.js +7 -0
  68. package/.output/server/node_modules/entities/dist/commonjs/internal/bin-trie-flags.js +21 -0
  69. package/.output/server/node_modules/entities/dist/commonjs/internal/decode-shared.js +31 -0
  70. package/.output/server/node_modules/entities/dist/commonjs/package.json +3 -0
  71. package/.output/server/node_modules/entities/package.json +120 -0
  72. package/.output/server/node_modules/estree-walker/dist/umd/estree-walker.js +344 -0
  73. package/.output/server/node_modules/estree-walker/package.json +37 -0
  74. package/.output/server/node_modules/hookable/dist/index.mjs +257 -0
  75. package/.output/server/node_modules/hookable/package.json +53 -0
  76. package/.output/server/node_modules/nostics/dist/formatters/ansi.mjs +19 -0
  77. package/.output/server/node_modules/nostics/dist/index.mjs +187 -0
  78. package/.output/server/node_modules/nostics/package.json +125 -0
  79. package/.output/server/node_modules/source-map-js/lib/array-set.js +121 -0
  80. package/.output/server/node_modules/source-map-js/lib/base64-vlq.js +140 -0
  81. package/.output/server/node_modules/source-map-js/lib/base64.js +67 -0
  82. package/.output/server/node_modules/source-map-js/lib/binary-search.js +111 -0
  83. package/.output/server/node_modules/source-map-js/lib/mapping-list.js +79 -0
  84. package/.output/server/node_modules/source-map-js/lib/quick-sort.js +132 -0
  85. package/.output/server/node_modules/source-map-js/lib/source-map-consumer.js +1188 -0
  86. package/.output/server/node_modules/source-map-js/lib/source-map-generator.js +444 -0
  87. package/.output/server/node_modules/source-map-js/lib/source-node.js +413 -0
  88. package/.output/server/node_modules/source-map-js/lib/util.js +594 -0
  89. package/.output/server/node_modules/source-map-js/package.json +71 -0
  90. package/.output/server/node_modules/source-map-js/source-map.js +8 -0
  91. package/.output/server/node_modules/ufo/dist/index.mjs +645 -0
  92. package/.output/server/node_modules/ufo/package.json +48 -0
  93. package/.output/server/node_modules/unhead/dist/client.mjs +22 -0
  94. package/.output/server/node_modules/unhead/dist/legacy.mjs +33 -0
  95. package/.output/server/node_modules/unhead/dist/minify.mjs +183 -0
  96. package/.output/server/node_modules/unhead/dist/parser.mjs +518 -0
  97. package/.output/server/node_modules/unhead/dist/plugins.mjs +720 -0
  98. package/.output/server/node_modules/unhead/dist/server.mjs +99 -0
  99. package/.output/server/node_modules/unhead/dist/shared/unhead.-hZVKou0.mjs +400 -0
  100. package/.output/server/node_modules/unhead/dist/shared/unhead.BEmVMkeA.mjs +673 -0
  101. package/.output/server/node_modules/unhead/dist/shared/unhead.BGFxPGPQ.mjs +47 -0
  102. package/.output/server/node_modules/unhead/dist/shared/unhead.BQWSw36o.mjs +192 -0
  103. package/.output/server/node_modules/unhead/dist/shared/unhead.Bf_fPVYA.mjs +6 -0
  104. package/.output/server/node_modules/unhead/dist/shared/unhead.Bjbp1C8D.mjs +224 -0
  105. package/.output/server/node_modules/unhead/dist/shared/unhead.Bm4Y6XQI.mjs +17 -0
  106. package/.output/server/node_modules/unhead/dist/shared/unhead.C5Bksi2B.mjs +49 -0
  107. package/.output/server/node_modules/unhead/dist/shared/unhead.CGPOfp5O.mjs +32 -0
  108. package/.output/server/node_modules/unhead/dist/shared/unhead.CHEy9ana.mjs +7 -0
  109. package/.output/server/node_modules/unhead/dist/shared/unhead.D7HkBzZn.mjs +59 -0
  110. package/.output/server/node_modules/unhead/dist/shared/unhead.Dssd7L5I.mjs +196 -0
  111. package/.output/server/node_modules/unhead/dist/shared/unhead.jEy9BmRq.mjs +264 -0
  112. package/.output/server/node_modules/unhead/dist/shared/unhead.oZ7pkTV1.mjs +19 -0
  113. package/.output/server/node_modules/unhead/dist/shared/unhead.tQnRaXfX.mjs +240 -0
  114. package/.output/server/node_modules/unhead/dist/stream/client.mjs +33 -0
  115. package/.output/server/node_modules/unhead/dist/stream/iife.mjs +2 -0
  116. package/.output/server/node_modules/unhead/dist/stream/server.mjs +445 -0
  117. package/.output/server/node_modules/unhead/dist/utils.mjs +7 -0
  118. package/.output/server/node_modules/unhead/package.json +179 -0
  119. package/.output/server/node_modules/vue/dist/vue.cjs.js +80 -0
  120. package/.output/server/node_modules/vue/dist/vue.cjs.prod.js +66 -0
  121. package/.output/server/node_modules/vue/index.js +7 -0
  122. package/.output/server/node_modules/vue/index.mjs +1 -0
  123. package/.output/server/node_modules/vue/package.json +112 -0
  124. package/.output/server/node_modules/vue/server-renderer/index.mjs +1 -0
  125. package/.output/server/node_modules/vue-bundle-renderer/dist/runtime.mjs +278 -0
  126. package/.output/server/node_modules/vue-bundle-renderer/package.json +54 -0
  127. package/.output/server/node_modules/yaml/dist/compose/compose-collection.js +90 -0
  128. package/.output/server/node_modules/yaml/dist/compose/compose-doc.js +45 -0
  129. package/.output/server/node_modules/yaml/dist/compose/compose-node.js +112 -0
  130. package/.output/server/node_modules/yaml/dist/compose/compose-scalar.js +88 -0
  131. package/.output/server/node_modules/yaml/dist/compose/composer.js +224 -0
  132. package/.output/server/node_modules/yaml/dist/compose/resolve-block-map.js +117 -0
  133. package/.output/server/node_modules/yaml/dist/compose/resolve-block-scalar.js +200 -0
  134. package/.output/server/node_modules/yaml/dist/compose/resolve-block-seq.js +51 -0
  135. package/.output/server/node_modules/yaml/dist/compose/resolve-end.js +39 -0
  136. package/.output/server/node_modules/yaml/dist/compose/resolve-flow-collection.js +209 -0
  137. package/.output/server/node_modules/yaml/dist/compose/resolve-flow-scalar.js +227 -0
  138. package/.output/server/node_modules/yaml/dist/compose/resolve-props.js +148 -0
  139. package/.output/server/node_modules/yaml/dist/compose/util-contains-newline.js +36 -0
  140. package/.output/server/node_modules/yaml/dist/compose/util-empty-scalar-position.js +28 -0
  141. package/.output/server/node_modules/yaml/dist/compose/util-flow-indent-check.js +17 -0
  142. package/.output/server/node_modules/yaml/dist/compose/util-map-includes.js +15 -0
  143. package/.output/server/node_modules/yaml/dist/doc/Document.js +337 -0
  144. package/.output/server/node_modules/yaml/dist/doc/anchors.js +76 -0
  145. package/.output/server/node_modules/yaml/dist/doc/applyReviver.js +57 -0
  146. package/.output/server/node_modules/yaml/dist/doc/createNode.js +90 -0
  147. package/.output/server/node_modules/yaml/dist/doc/directives.js +178 -0
  148. package/.output/server/node_modules/yaml/dist/errors.js +62 -0
  149. package/.output/server/node_modules/yaml/dist/index.js +50 -0
  150. package/.output/server/node_modules/yaml/dist/log.js +19 -0
  151. package/.output/server/node_modules/yaml/dist/nodes/Alias.js +118 -0
  152. package/.output/server/node_modules/yaml/dist/nodes/Collection.js +151 -0
  153. package/.output/server/node_modules/yaml/dist/nodes/Node.js +40 -0
  154. package/.output/server/node_modules/yaml/dist/nodes/Pair.js +39 -0
  155. package/.output/server/node_modules/yaml/dist/nodes/Scalar.js +27 -0
  156. package/.output/server/node_modules/yaml/dist/nodes/YAMLMap.js +147 -0
  157. package/.output/server/node_modules/yaml/dist/nodes/YAMLSeq.js +115 -0
  158. package/.output/server/node_modules/yaml/dist/nodes/addPairToJSMap.js +65 -0
  159. package/.output/server/node_modules/yaml/dist/nodes/identity.js +53 -0
  160. package/.output/server/node_modules/yaml/dist/nodes/toJS.js +39 -0
  161. package/.output/server/node_modules/yaml/dist/parse/cst-scalar.js +218 -0
  162. package/.output/server/node_modules/yaml/dist/parse/cst-stringify.js +63 -0
  163. package/.output/server/node_modules/yaml/dist/parse/cst-visit.js +99 -0
  164. package/.output/server/node_modules/yaml/dist/parse/cst.js +112 -0
  165. package/.output/server/node_modules/yaml/dist/parse/lexer.js +723 -0
  166. package/.output/server/node_modules/yaml/dist/parse/line-counter.js +41 -0
  167. package/.output/server/node_modules/yaml/dist/parse/parser.js +980 -0
  168. package/.output/server/node_modules/yaml/dist/public-api.js +107 -0
  169. package/.output/server/node_modules/yaml/dist/schema/Schema.js +39 -0
  170. package/.output/server/node_modules/yaml/dist/schema/common/map.js +19 -0
  171. package/.output/server/node_modules/yaml/dist/schema/common/null.js +17 -0
  172. package/.output/server/node_modules/yaml/dist/schema/common/seq.js +19 -0
  173. package/.output/server/node_modules/yaml/dist/schema/common/string.js +16 -0
  174. package/.output/server/node_modules/yaml/dist/schema/core/bool.js +21 -0
  175. package/.output/server/node_modules/yaml/dist/schema/core/float.js +47 -0
  176. package/.output/server/node_modules/yaml/dist/schema/core/int.js +42 -0
  177. package/.output/server/node_modules/yaml/dist/schema/core/schema.js +25 -0
  178. package/.output/server/node_modules/yaml/dist/schema/json/schema.js +64 -0
  179. package/.output/server/node_modules/yaml/dist/schema/tags.js +99 -0
  180. package/.output/server/node_modules/yaml/dist/schema/yaml-1.1/binary.js +70 -0
  181. package/.output/server/node_modules/yaml/dist/schema/yaml-1.1/bool.js +29 -0
  182. package/.output/server/node_modules/yaml/dist/schema/yaml-1.1/float.js +50 -0
  183. package/.output/server/node_modules/yaml/dist/schema/yaml-1.1/int.js +76 -0
  184. package/.output/server/node_modules/yaml/dist/schema/yaml-1.1/merge.js +71 -0
  185. package/.output/server/node_modules/yaml/dist/schema/yaml-1.1/omap.js +77 -0
  186. package/.output/server/node_modules/yaml/dist/schema/yaml-1.1/pairs.js +82 -0
  187. package/.output/server/node_modules/yaml/dist/schema/yaml-1.1/schema.js +41 -0
  188. package/.output/server/node_modules/yaml/dist/schema/yaml-1.1/set.js +96 -0
  189. package/.output/server/node_modules/yaml/dist/schema/yaml-1.1/timestamp.js +105 -0
  190. package/.output/server/node_modules/yaml/dist/stringify/foldFlowLines.js +151 -0
  191. package/.output/server/node_modules/yaml/dist/stringify/stringify.js +132 -0
  192. package/.output/server/node_modules/yaml/dist/stringify/stringifyCollection.js +155 -0
  193. package/.output/server/node_modules/yaml/dist/stringify/stringifyComment.js +24 -0
  194. package/.output/server/node_modules/yaml/dist/stringify/stringifyDocument.js +87 -0
  195. package/.output/server/node_modules/yaml/dist/stringify/stringifyNumber.js +27 -0
  196. package/.output/server/node_modules/yaml/dist/stringify/stringifyPair.js +152 -0
  197. package/.output/server/node_modules/yaml/dist/stringify/stringifyString.js +338 -0
  198. package/.output/server/node_modules/yaml/dist/visit.js +236 -0
  199. package/.output/server/node_modules/yaml/package.json +97 -0
  200. package/.output/server/package.json +28 -0
  201. package/LICENSE +21 -0
  202. package/README.md +57 -1
  203. package/bin/launch.mjs +158 -0
  204. package/bin/shelfware.mjs +6 -0
  205. package/package.json +64 -5
  206. package/cli.mjs +0 -3
@@ -0,0 +1,606 @@
1
+ import {
2
+ DevalueError,
3
+ enumerable_symbols,
4
+ escaped,
5
+ get_type,
6
+ is_plain_object,
7
+ is_primitive,
8
+ stringify_key,
9
+ stringify_string,
10
+ valid_array_indices
11
+ } from './utils.js';
12
+
13
+ const chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_$';
14
+ const unsafe_chars = /[<\b\f\n\r\t\0\u2028\u2029]/g;
15
+ const reserved =
16
+ /^(?:do|if|in|for|int|let|new|try|var|byte|case|char|else|enum|goto|long|this|void|with|await|break|catch|class|const|final|float|short|super|throw|while|yield|delete|double|export|import|native|return|switch|throws|typeof|boolean|default|extends|finally|package|private|abstract|continue|debugger|function|volatile|interface|protected|transient|implements|instanceof|synchronized)$/;
17
+
18
+ /**
19
+ * Turn a value into the JavaScript that creates an equivalent value
20
+ * @param {any} value
21
+ * @param {(value: any, uneval: (value: any) => string) => string | void} [replacer]
22
+ */
23
+ export function uneval(value, replacer) {
24
+ const counts = new Map();
25
+
26
+ /** @type {string[]} */
27
+ const keys = [];
28
+
29
+ const custom = new Map();
30
+
31
+ /** @param {any} thing */
32
+ function walk(thing) {
33
+ if (!is_primitive(thing)) {
34
+ if (counts.has(thing)) {
35
+ counts.set(thing, counts.get(thing) + 1);
36
+ return;
37
+ }
38
+
39
+ counts.set(thing, 1);
40
+
41
+ if (replacer) {
42
+ const str = replacer(thing, (value) => uneval(value, replacer));
43
+
44
+ if (typeof str === 'string') {
45
+ custom.set(thing, str);
46
+ return;
47
+ }
48
+ }
49
+
50
+ if (typeof thing === 'function') {
51
+ throw new DevalueError(`Cannot stringify a function`, keys, thing, value);
52
+ }
53
+
54
+ const type = get_type(thing);
55
+
56
+ switch (type) {
57
+ case 'Number':
58
+ case 'BigInt':
59
+ case 'String':
60
+ case 'Boolean':
61
+ case 'Date':
62
+ case 'RegExp':
63
+ case 'URL':
64
+ case 'URLSearchParams':
65
+ return;
66
+
67
+ case 'Array':
68
+ /** @type {any[]} */ (thing).forEach((value, i) => {
69
+ keys.push(`[${i}]`);
70
+ walk(value);
71
+ keys.pop();
72
+ });
73
+ break;
74
+
75
+ case 'Set':
76
+ Array.from(thing).forEach(walk);
77
+ break;
78
+
79
+ case 'Map':
80
+ for (const [key, value] of thing) {
81
+ keys.push(`.get(${is_primitive(key) ? stringify_primitive(key) : '...'})`);
82
+ walk(key);
83
+ walk(value);
84
+ keys.pop();
85
+ }
86
+ break;
87
+
88
+ case 'Int8Array':
89
+ case 'Uint8Array':
90
+ case 'Uint8ClampedArray':
91
+ case 'Int16Array':
92
+ case 'Uint16Array':
93
+ case 'Float16Array':
94
+ case 'Int32Array':
95
+ case 'Uint32Array':
96
+ case 'Float32Array':
97
+ case 'Float64Array':
98
+ case 'BigInt64Array':
99
+ case 'BigUint64Array':
100
+ case 'DataView':
101
+ walk(thing.buffer);
102
+ return;
103
+
104
+ case 'ArrayBuffer':
105
+ return;
106
+
107
+ case 'Temporal.Duration':
108
+ case 'Temporal.Instant':
109
+ case 'Temporal.PlainDate':
110
+ case 'Temporal.PlainTime':
111
+ case 'Temporal.PlainDateTime':
112
+ case 'Temporal.PlainMonthDay':
113
+ case 'Temporal.PlainYearMonth':
114
+ case 'Temporal.ZonedDateTime':
115
+ return;
116
+
117
+ default:
118
+ if (!is_plain_object(thing)) {
119
+ throw new DevalueError(`Cannot stringify arbitrary non-POJOs`, keys, thing, value);
120
+ }
121
+
122
+ if (enumerable_symbols(thing).length > 0) {
123
+ throw new DevalueError(`Cannot stringify POJOs with symbolic keys`, keys, thing, value);
124
+ }
125
+
126
+ for (const key of Object.keys(thing)) {
127
+ if (key === '__proto__') {
128
+ throw new DevalueError(
129
+ `Cannot stringify objects with __proto__ keys`,
130
+ keys,
131
+ thing,
132
+ value
133
+ );
134
+ }
135
+
136
+ keys.push(stringify_key(key));
137
+ walk(thing[key]);
138
+ keys.pop();
139
+ }
140
+ }
141
+ } else if (typeof thing === 'symbol') {
142
+ throw new DevalueError(`Cannot stringify a Symbol primitive`, keys, thing, value);
143
+ }
144
+ }
145
+
146
+ walk(value);
147
+
148
+ const names = new Map();
149
+
150
+ Array.from(counts)
151
+ .filter((entry) => entry[1] > 1)
152
+ .sort((a, b) => b[1] - a[1])
153
+ .forEach((entry, i) => {
154
+ names.set(entry[0], get_name(i));
155
+ });
156
+
157
+ /**
158
+ * @param {any} thing
159
+ * @returns {string}
160
+ */
161
+ function stringify(thing) {
162
+ if (names.has(thing)) {
163
+ return names.get(thing);
164
+ }
165
+
166
+ if (is_primitive(thing)) {
167
+ return stringify_primitive(thing);
168
+ }
169
+
170
+ if (custom.has(thing)) {
171
+ return custom.get(thing);
172
+ }
173
+
174
+ const type = get_type(thing);
175
+
176
+ switch (type) {
177
+ case 'Number':
178
+ case 'String':
179
+ case 'Boolean':
180
+ case 'BigInt':
181
+ return `Object(${stringify(thing.valueOf())})`;
182
+
183
+ case 'RegExp':
184
+ const { source, flags } = thing;
185
+ return flags
186
+ ? `new RegExp(${stringify_string(source)},"${flags}")`
187
+ : `new RegExp(${stringify_string(source)})`;
188
+
189
+ case 'Date':
190
+ return `new Date(${thing.getTime()})`;
191
+
192
+ case 'URL':
193
+ return `new URL(${stringify_string(thing.toString())})`;
194
+
195
+ case 'URLSearchParams':
196
+ return `new URLSearchParams(${stringify_string(thing.toString())})`;
197
+
198
+ case 'Array': {
199
+ // For dense arrays (no holes), we iterate normally.
200
+ // When we encounter the first hole, we call Object.keys
201
+ // to determine the sparseness, then decide between:
202
+ // - Array literal with holes: [,"a",,] (default)
203
+ // - Object.assign: Object.assign(Array(n),{...}) (for very sparse arrays)
204
+ // Only the Object.assign path avoids iterating every slot, which
205
+ // is what protects against the DoS of e.g. `arr[1000000] = 1`.
206
+ let has_holes = false;
207
+
208
+ let result = '[';
209
+
210
+ for (let i = 0; i < thing.length; i += 1) {
211
+ if (i > 0) result += ',';
212
+
213
+ if (Object.hasOwn(thing, i)) {
214
+ result += stringify(thing[i]);
215
+ } else if (!has_holes) {
216
+ // Decide between array literal and Object.assign.
217
+ //
218
+ // Array literal: holes are consecutive commas.
219
+ // For example, [, "a", ,] is written as [,"a",,].
220
+ // Each hole costs 1 char (a comma).
221
+ //
222
+ // Object.assign: populated indices are listed explicitly.
223
+ // For example, [, "a", ,] would be written as
224
+ // Object.assign(Array(3),{1:"a"}). This avoids paying
225
+ // per-hole, but has a large fixed overhead for the
226
+ // "Object.assign(Array(n),{...})" wrapper, and each
227
+ // element costs extra chars for its index and colon.
228
+ //
229
+ // The serialized values are the same size either way, so
230
+ // the choice comes down to the structural overhead:
231
+ //
232
+ // Array literal overhead:
233
+ // 1 char per element or hole (comma separators)
234
+ // + 2 chars for "[" and "]"
235
+ // = L + 2
236
+ //
237
+ // Object.assign overhead:
238
+ // "Object.assign(Array(" — 20 chars
239
+ // + length — d chars
240
+ // + "),{" — 3 chars
241
+ // + for each populated element:
242
+ // index + ":" + "," — (d + 2) chars
243
+ // + "})" — 2 chars
244
+ // = (25 + d) + P * (d + 2)
245
+ //
246
+ // where L is the array length, P is the number of
247
+ // populated elements, and d is the number of digits
248
+ // in L (an upper bound on the digits in any index).
249
+ //
250
+ // Object.assign is cheaper when:
251
+ // (25 + d) + P * (d + 2) < L + 2
252
+ const populated_keys = valid_array_indices(/** @type {any[]} */ (thing));
253
+ const population = populated_keys.length;
254
+ const d = String(thing.length).length;
255
+
256
+ const hole_cost = thing.length + 2;
257
+ const sparse_cost = 25 + d + population * (d + 2);
258
+
259
+ if (hole_cost > sparse_cost) {
260
+ const entries = populated_keys.map((k) => `${k}:${stringify(thing[k])}`).join(',');
261
+ return `Object.assign(Array(${thing.length}),{${entries}})`;
262
+ }
263
+
264
+ has_holes = true;
265
+ }
266
+ // else: already decided on array literal, hole is just an empty slot
267
+ // (the comma separator is all we need — no content for this position)
268
+ }
269
+
270
+ const tail = thing.length === 0 || thing.length - 1 in thing ? '' : ',';
271
+ return result + tail + ']';
272
+ }
273
+
274
+ case 'Set':
275
+ case 'Map':
276
+ return `new ${type}([${Array.from(thing).map(stringify).join(',')}])`;
277
+
278
+ case 'Int8Array':
279
+ case 'Uint8Array':
280
+ case 'Uint8ClampedArray':
281
+ case 'Int16Array':
282
+ case 'Uint16Array':
283
+ case 'Float16Array':
284
+ case 'Int32Array':
285
+ case 'Uint32Array':
286
+ case 'Float32Array':
287
+ case 'Float64Array':
288
+ case 'BigInt64Array':
289
+ case 'BigUint64Array': {
290
+ let str = `new ${type}`;
291
+
292
+ if (!names.has(thing.buffer)) {
293
+ str += `([${stringify_typed_array_elements(type, thing.buffer)}])`;
294
+ } else {
295
+ str += `(${stringify(thing.buffer)})`;
296
+ }
297
+
298
+ // handle subarrays
299
+ if (thing.byteLength !== thing.buffer.byteLength) {
300
+ const start = thing.byteOffset / thing.BYTES_PER_ELEMENT;
301
+ const end = start + thing.length;
302
+ str += `.subarray(${start},${end})`;
303
+ }
304
+
305
+ return str;
306
+ }
307
+
308
+ case 'DataView': {
309
+ let str = `new DataView`;
310
+
311
+ if (!names.has(thing.buffer)) {
312
+ str += `(new Uint8Array([${new Uint8Array(thing.buffer)}]).buffer`;
313
+ } else {
314
+ str += `(${stringify(thing.buffer)}`;
315
+ }
316
+
317
+ // handle subviews
318
+ if (thing.byteLength !== thing.buffer.byteLength) {
319
+ str += `,${thing.byteOffset},${thing.byteLength}`;
320
+ }
321
+
322
+ return str + ')';
323
+ }
324
+
325
+ case 'ArrayBuffer': {
326
+ const ui8 = new Uint8Array(thing);
327
+ return `new Uint8Array([${ui8.toString()}]).buffer`;
328
+ }
329
+
330
+ case 'Temporal.Duration':
331
+ case 'Temporal.Instant':
332
+ case 'Temporal.PlainDate':
333
+ case 'Temporal.PlainTime':
334
+ case 'Temporal.PlainDateTime':
335
+ case 'Temporal.PlainMonthDay':
336
+ case 'Temporal.PlainYearMonth':
337
+ case 'Temporal.ZonedDateTime':
338
+ return `${type}.from(${stringify_string(thing.toString())})`;
339
+
340
+ default:
341
+ const keys = Object.keys(thing);
342
+ const obj = keys.map((key) => `${safe_key(key)}:${stringify(thing[key])}`).join(',');
343
+ const proto = Object.getPrototypeOf(thing);
344
+ if (proto === null) {
345
+ return keys.length > 0 ? `{${obj},__proto__:null}` : `{__proto__:null}`;
346
+ }
347
+
348
+ return `{${obj}}`;
349
+ }
350
+ }
351
+
352
+ const str = stringify(value);
353
+
354
+ if (names.size) {
355
+ /** @type {string[]} */
356
+ const params = [];
357
+
358
+ /** @type {string[]} */
359
+ const statements = [];
360
+
361
+ /** @type {string[]} */
362
+ const values = [];
363
+
364
+ // Reconstructions (e.g. `b = new Uint8Array(...)`) reassign a placeholder
365
+ // parameter. They must run before the `statements` that reference them,
366
+ // otherwise those statements capture the placeholder. They only depend on
367
+ // IIFE arguments (never on each other), so emitting them first is safe.
368
+ /** @type {string[]} */
369
+ const reconstructions = [];
370
+
371
+ names.forEach((name, thing) => {
372
+ params.push(name);
373
+
374
+ if (custom.has(thing)) {
375
+ values.push(/** @type {string} */ (custom.get(thing)));
376
+ return;
377
+ }
378
+
379
+ if (is_primitive(thing)) {
380
+ values.push(stringify_primitive(thing));
381
+ return;
382
+ }
383
+
384
+ const type = get_type(thing);
385
+
386
+ switch (type) {
387
+ case 'Number':
388
+ case 'String':
389
+ case 'Boolean':
390
+ case 'BigInt':
391
+ values.push(`Object(${stringify(thing.valueOf())})`);
392
+ break;
393
+
394
+ case 'RegExp':
395
+ const { source, flags } = thing;
396
+ const regexp = flags
397
+ ? `new RegExp(${stringify_string(source)},"${flags}")`
398
+ : `new RegExp(${stringify_string(source)})`
399
+ values.push(regexp);
400
+ break;
401
+
402
+ case 'Date':
403
+ values.push(`new Date(${thing.getTime()})`);
404
+ break;
405
+
406
+ case 'URL':
407
+ values.push(`new URL(${stringify_string(thing.toString())})`);
408
+ break;
409
+
410
+ case 'URLSearchParams':
411
+ values.push(`new URLSearchParams(${stringify_string(thing.toString())})`);
412
+ break;
413
+
414
+ case 'Array':
415
+ values.push(`Array(${thing.length})`);
416
+ /** @type {any[]} */ (thing).forEach((v, i) => {
417
+ statements.push(`${name}[${i}]=${stringify(v)}`);
418
+ });
419
+ break;
420
+
421
+ case 'Set': {
422
+ values.push(`new Set`);
423
+ const adds = Array.from(thing).map((v) => `.add(${stringify(v)})`);
424
+ // An empty Set is fully built by `new Set`; a chained statement would
425
+ // otherwise be a dangling `name.`.
426
+ if (adds.length > 0) statements.push(name + adds.join(''));
427
+ break;
428
+ }
429
+
430
+ case 'Map': {
431
+ values.push(`new Map`);
432
+ const sets = Array.from(thing).map(
433
+ ([k, v]) => `.set(${stringify(k)}, ${stringify(v)})`
434
+ );
435
+ if (sets.length > 0) statements.push(name + sets.join(''));
436
+ break;
437
+ }
438
+
439
+ case 'Int8Array':
440
+ case 'Uint8Array':
441
+ case 'Uint8ClampedArray':
442
+ case 'Int16Array':
443
+ case 'Uint16Array':
444
+ case 'Float16Array':
445
+ case 'Int32Array':
446
+ case 'Uint32Array':
447
+ case 'Float32Array':
448
+ case 'Float64Array':
449
+ case 'BigInt64Array':
450
+ case 'BigUint64Array': {
451
+ let str = `new ${type}`;
452
+
453
+ if (!names.has(thing.buffer)) {
454
+ str += `([${stringify_typed_array_elements(type, thing.buffer)}])`;
455
+ } else {
456
+ str += `(${stringify(thing.buffer)})`;
457
+ }
458
+
459
+ // handle subarrays
460
+ if (thing.byteLength !== thing.buffer.byteLength) {
461
+ const start = thing.byteOffset / thing.BYTES_PER_ELEMENT;
462
+ const end = start + thing.length;
463
+ str += `.subarray(${start},${end})`;
464
+ }
465
+
466
+ values.push(`{}`);
467
+ reconstructions.push(`${name}=${str}`);
468
+ break;
469
+ }
470
+
471
+ case 'DataView': {
472
+ let str = `new DataView`;
473
+
474
+ if (!names.has(thing.buffer)) {
475
+ str += `(new Uint8Array([${new Uint8Array(thing.buffer)}]).buffer`;
476
+ } else {
477
+ str += `(${stringify(thing.buffer)}`;
478
+ }
479
+
480
+ // handle subviews
481
+ if (thing.byteLength !== thing.buffer.byteLength) {
482
+ str += `,${thing.byteOffset},${thing.byteLength}`;
483
+ }
484
+
485
+ str += ')';
486
+
487
+ values.push(`{}`);
488
+ reconstructions.push(`${name}=${str}`);
489
+ break;
490
+ }
491
+
492
+ case 'ArrayBuffer':
493
+ values.push(`new Uint8Array([${new Uint8Array(thing)}]).buffer`);
494
+ break;
495
+
496
+ case 'Temporal.Duration':
497
+ case 'Temporal.Instant':
498
+ case 'Temporal.PlainDate':
499
+ case 'Temporal.PlainTime':
500
+ case 'Temporal.PlainDateTime':
501
+ case 'Temporal.PlainMonthDay':
502
+ case 'Temporal.PlainYearMonth':
503
+ case 'Temporal.ZonedDateTime':
504
+ values.push(`${type}.from(${stringify_string(thing.toString())})`);
505
+ break;
506
+
507
+ default:
508
+ values.push(Object.getPrototypeOf(thing) === null ? 'Object.create(null)' : '{}');
509
+ Object.keys(thing).forEach((key) => {
510
+ statements.push(`${name}${safe_prop(key)}=${stringify(thing[key])}`);
511
+ });
512
+ }
513
+ });
514
+
515
+ statements.push(`return ${str}`);
516
+
517
+ const body = [...reconstructions, ...statements].join(';');
518
+ // A function may have at most 65535 parameters (and a call at most that
519
+ // many arguments). For very large graphs, pass the hoisted values as a
520
+ // single array argument and destructure them into the placeholder names,
521
+ // so the emitted code stays within the engine limit (#93).
522
+ if (params.length > 65534) {
523
+ return `(function(){var[${params.join(',')}]=arguments[0];${body}}([${values.join(',')}]))`;
524
+ }
525
+
526
+ return `(function(${params.join(',')}){${body}}(${values.join(',')}))`;
527
+ } else {
528
+ return str;
529
+ }
530
+ }
531
+
532
+ /**
533
+ * Serialize the elements of `buffer`, read as `type`, as a comma-separated list.
534
+ * The view is created from `type` rather than from the serialized value's own
535
+ * constructor, which may be a subclass like Node's `Buffer` whose `toString`
536
+ * decodes the bytes instead of listing them.
537
+ * `BigInt64Array`/`BigUint64Array` elements are bigints and must be written
538
+ * with an `n` suffix, otherwise the emitted `new BigInt64Array([...])` throws.
539
+ * @param {string} type
540
+ * @param {ArrayBufferLike} buffer
541
+ */
542
+ function stringify_typed_array_elements(type, buffer) {
543
+ const array = new (/** @type {any} */ (globalThis)[type])(buffer);
544
+
545
+ if (type === 'BigInt64Array' || type === 'BigUint64Array') {
546
+ return Array.from(array, (element) => `${element}n`).join(',');
547
+ }
548
+
549
+ // Float arrays can hold `-0`, which `toString()` collapses to `"0"`, silently
550
+ // losing the sign on round-trip. Emit `-0` explicitly for those elements.
551
+ if (
552
+ array instanceof Float32Array ||
553
+ array instanceof Float64Array ||
554
+ (typeof Float16Array !== 'undefined' && array instanceof Float16Array)
555
+ ) {
556
+ return Array.from(array, (element) => (Object.is(element, -0) ? '-0' : `${element}`)).join(',');
557
+ }
558
+
559
+ return array.toString();
560
+ }
561
+
562
+ /** @param {number} num */
563
+ function get_name(num) {
564
+ let name = '';
565
+
566
+ do {
567
+ name = chars[num % chars.length] + name;
568
+ num = ~~(num / chars.length) - 1;
569
+ } while (num >= 0);
570
+
571
+ return reserved.test(name) ? `${name}0` : name;
572
+ }
573
+
574
+ /** @param {string} c */
575
+ function escape_unsafe_char(c) {
576
+ return escaped[c] || c;
577
+ }
578
+
579
+ /** @param {string} str */
580
+ function escape_unsafe_chars(str) {
581
+ return str.replace(unsafe_chars, escape_unsafe_char);
582
+ }
583
+
584
+ /** @param {string} key */
585
+ function safe_key(key) {
586
+ return /^[_$a-zA-Z][_$a-zA-Z0-9]*$/.test(key) ? key : escape_unsafe_chars(JSON.stringify(key));
587
+ }
588
+
589
+ /** @param {string} key */
590
+ function safe_prop(key) {
591
+ return /^[_$a-zA-Z][_$a-zA-Z0-9]*$/.test(key)
592
+ ? `.${key}`
593
+ : `[${escape_unsafe_chars(JSON.stringify(key))}]`;
594
+ }
595
+
596
+ /** @param {any} thing */
597
+ function stringify_primitive(thing) {
598
+ const type = typeof thing;
599
+ if (type === 'string') return stringify_string(thing);
600
+ if (thing === void 0) return 'void 0';
601
+ if (thing === 0 && 1 / thing < 0) return '-0';
602
+ const str = String(thing);
603
+ if (type === 'number') return str.replace(/^(-)?0\./, '$1.');
604
+ if (type === 'bigint') return thing + 'n';
605
+ return str;
606
+ }