shelfware 0.0.1 → 0.1.1

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/e0d2b6a3-3a30-44b7-8c79-a56f66400005.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 +216 -0
  204. package/bin/shelfware.mjs +11 -0
  205. package/package.json +64 -5
  206. package/cli.mjs +0 -3
@@ -0,0 +1,428 @@
1
+ import { DevalueError, stringify_key, stringify_string } from './utils.js';
2
+ import {
3
+ HOLE,
4
+ NAN,
5
+ NEGATIVE_INFINITY,
6
+ NEGATIVE_ZERO,
7
+ POSITIVE_INFINITY,
8
+ SPARSE,
9
+ UNDEFINED
10
+ } from './constants.js';
11
+ import { encode64 } from './base64.js';
12
+ import { default_stringify_operations, merge_operations } from './operations.js';
13
+
14
+ /**
15
+ * Turn a value into a JSON string that can be parsed with `devalue.parse`
16
+ * @param {any} value
17
+ * @param {Record<string, (value: any) => any>} [reducers]
18
+ * @param {import('./types.js').StringifyOptions} [options]
19
+ */
20
+ export function stringify(value, reducers, options) {
21
+ const stringified = run(false, value, reducers, options);
22
+ return typeof stringified === 'string' ? stringified : `[${stringified.join(',')}]`;
23
+ }
24
+
25
+ /**
26
+ * Turn a value into a JSON string that can be parsed with `devalue.parse`
27
+ * @param {any} value
28
+ * @param {Record<string, (value: any) => any>} [reducers]
29
+ * @param {import('./types.js').StringifyOptions} [options]
30
+ */
31
+ export async function stringifyAsync(value, reducers, options) {
32
+ const stringified = run(true, value, reducers, options);
33
+
34
+ if (typeof stringified === 'string') {
35
+ return stringified;
36
+ }
37
+
38
+ let out = '[';
39
+
40
+ for (let i = 0; i < stringified.length; i += 1) {
41
+ let value = stringified[i];
42
+
43
+ if (typeof value !== 'string') {
44
+ await value;
45
+ value = stringified[i];
46
+
47
+ if (i === 0 && value < 0) {
48
+ return `${value}`;
49
+ }
50
+ }
51
+
52
+ out += value;
53
+
54
+ if (i < stringified.length - 1) {
55
+ out += ',';
56
+ }
57
+ }
58
+
59
+ out += ']';
60
+
61
+ return out;
62
+ }
63
+
64
+ /**
65
+ * @param {boolean} async
66
+ * @param {any} value
67
+ * @param {Record<string, (value: any) => any>} [reducers]
68
+ * @param {import('./types.js').StringifyOptions} [options]
69
+ */
70
+ function run(async, value, reducers, options) {
71
+ const ops = merge_operations(default_stringify_operations, options?.operations);
72
+
73
+ /** @type {any[]} */
74
+ const stringified = [];
75
+
76
+ /** @type {Map<any, number>} */
77
+ const indexes = new Map();
78
+
79
+ /** @type {Array<{ key: string, fn: (value: any) => any }>} */
80
+ const custom = [];
81
+ if (reducers) {
82
+ for (const key of Object.getOwnPropertyNames(reducers)) {
83
+ custom.push({ key, fn: reducers[key] });
84
+ }
85
+ }
86
+
87
+ /** @type {string[]} */
88
+ const keys = [];
89
+
90
+ let p = 0;
91
+
92
+ /**
93
+ * @param {any} thing
94
+ * @param {number} [index]
95
+ */
96
+ function flatten(thing, index) {
97
+ const type = ops.typeOf(thing);
98
+
99
+ if (type === 'undefined') return UNDEFINED;
100
+
101
+ /** @type {number | undefined} */
102
+ let number;
103
+
104
+ // `ops.toPrimitive` is the boundary between the value being serialized and
105
+ // plain host JavaScript: everything below operates on the extracted host
106
+ // primitive, so native comparisons and arithmetic are correct there.
107
+ if (type === 'number') {
108
+ number = /** @type {number} */ (ops.toPrimitive(thing));
109
+ if (Number.isNaN(number)) return NAN;
110
+ if (number === Infinity) return POSITIVE_INFINITY;
111
+ if (number === -Infinity) return NEGATIVE_INFINITY;
112
+ if (number === 0 && 1 / number < 0) return NEGATIVE_ZERO;
113
+ }
114
+
115
+ const id = ops.identify(thing);
116
+
117
+ if (indexes.has(id)) return /** @type {number} */ (indexes.get(id));
118
+
119
+ index ??= p++;
120
+ indexes.set(id, index);
121
+
122
+ for (const { key, fn } of custom) {
123
+ const value = fn(thing);
124
+ if (value) {
125
+ stringified[index] = `["${key}",${flatten(value)}]`;
126
+ return index;
127
+ }
128
+ }
129
+
130
+ if (type === 'function') {
131
+ throw new DevalueError(`Cannot stringify a function`, keys, thing, value);
132
+ } else if (type === 'symbol') {
133
+ throw new DevalueError(`Cannot stringify a Symbol primitive`, keys, thing, value);
134
+ }
135
+
136
+ /** @type {string | Promise<any>} */
137
+ let str = '';
138
+
139
+ if (type !== 'object') {
140
+ str = stringify_primitive(type === 'number' ? number : ops.toPrimitive(thing));
141
+ } else if (ops.isThenable(thing)) {
142
+ if (!async) {
143
+ throw new DevalueError(
144
+ `Cannot stringify a Promise or thenable — use stringifyAsync instead`,
145
+ keys,
146
+ thing,
147
+ value
148
+ );
149
+ }
150
+
151
+ str = ops.toPromise(thing).then((value) => {
152
+ const i = flatten(value, index);
153
+ if (i < 0) stringified[index] = i;
154
+ });
155
+ } else {
156
+ const tag = ops.tagOf(thing);
157
+
158
+ switch (tag) {
159
+ case 'Number':
160
+ case 'String':
161
+ case 'Boolean':
162
+ case 'BigInt':
163
+ str = `["Object",${flatten(ops.unbox(thing))}]`;
164
+ break;
165
+
166
+ case 'Date':
167
+ str = `["Date","${ops.toISOString(thing)}"]`;
168
+ break;
169
+
170
+ case 'URL':
171
+ str = `["URL",${stringify_string(ops.toStringValue(thing))}]`;
172
+ break;
173
+
174
+ case 'URLSearchParams':
175
+ str = `["URLSearchParams",${stringify_string(ops.toStringValue(thing))}]`;
176
+ break;
177
+
178
+ case 'RegExp':
179
+ const { source, flags } = ops.regExpInfo(thing);
180
+ str = flags
181
+ ? `["RegExp",${stringify_string(source)},"${flags}"]`
182
+ : `["RegExp",${stringify_string(source)}]`;
183
+ break;
184
+
185
+ case 'Array': {
186
+ // For dense arrays (no holes), we iterate normally.
187
+ // When we encounter the first hole, we call Object.keys
188
+ // to determine the sparseness, then decide between:
189
+ // - HOLE encoding: [-2, val, -2, ...] (default)
190
+ // - Sparse encoding: [-7, length, idx, val, ...] (for very sparse arrays)
191
+ // Only the sparse path avoids iterating every slot, which
192
+ // is what protects against the DoS of e.g. `arr[1000000] = 1`.
193
+ let mostly_dense = false;
194
+
195
+ const length = ops.lengthOf(thing);
196
+
197
+ str = '[';
198
+
199
+ for (let i = 0; i < length; i += 1) {
200
+ if (i > 0) str += ',';
201
+
202
+ if (ops.hasOwn(thing, i)) {
203
+ keys.push(`[${i}]`);
204
+ str += flatten(ops.get(thing, i));
205
+ keys.pop();
206
+ } else if (mostly_dense) {
207
+ // Use dense encoding. The heuristic guarantees the
208
+ // array is only mildly sparse, so iterating over every
209
+ // slot is fine.
210
+ str += HOLE;
211
+ } else {
212
+ // Decide between HOLE encoding and sparse encoding.
213
+ //
214
+ // HOLE encoding: each hole is serialized as the HOLE
215
+ // sentinel (-2). For example, [, "a", ,] becomes
216
+ // [-2, 0, -2]. Each hole costs 3 chars ("-2" + comma).
217
+ //
218
+ // Sparse encoding: lists only populated indices.
219
+ // For example, [, "a", ,] becomes [-7, 3, 1, 0] — the
220
+ // -7 sentinel, the array length (3), then index-value
221
+ // pairs. This avoids paying per-hole, but each element
222
+ // costs extra chars to write its index.
223
+ //
224
+ // The values are the same size either way, so the
225
+ // choice comes down to structural overhead:
226
+ //
227
+ // HOLE overhead:
228
+ // 3 chars per hole ("-2" + comma)
229
+ // = (L - P) * 3
230
+ //
231
+ // Sparse overhead:
232
+ // "-7," — 3 chars (sparse sentinel + comma)
233
+ // + length + "," — (d + 1) chars (array length + comma)
234
+ // + per element: index + "," — (d + 1) chars
235
+ // = (4 + d) + P * (d + 1)
236
+ //
237
+ // where L is the array length, P is the number of
238
+ // populated elements, and d is the number of digits
239
+ // in L (an upper bound on the digits in any index).
240
+ //
241
+ // Sparse encoding is cheaper when:
242
+ // (4 + d) + P * (d + 1) < (L - P) * 3
243
+ const populated_keys = ops.indicesOf(thing);
244
+ const population = populated_keys.length;
245
+ const d = String(length).length;
246
+
247
+ const hole_cost = (length - population) * 3;
248
+ const sparse_cost = 4 + d + population * (d + 1);
249
+
250
+ if (hole_cost > sparse_cost) {
251
+ str = '[' + SPARSE + ',' + length;
252
+ for (let j = 0; j < populated_keys.length; j++) {
253
+ const key = populated_keys[j];
254
+ keys.push(`[${key}]`);
255
+ str += ',' + key + ',' + flatten(ops.get(thing, key));
256
+ keys.pop();
257
+ }
258
+ break;
259
+ } else {
260
+ mostly_dense = true;
261
+ str += HOLE;
262
+ }
263
+ }
264
+ }
265
+
266
+ str += ']';
267
+
268
+ break;
269
+ }
270
+
271
+ case 'Set':
272
+ str = '["Set"';
273
+
274
+ for (const value of ops.valuesOf(thing)) {
275
+ str += `,${flatten(value)}`;
276
+ }
277
+
278
+ str += ']';
279
+ break;
280
+
281
+ case 'Map':
282
+ str = '["Map"';
283
+
284
+ for (const [key, value] of ops.entriesOf(thing)) {
285
+ const key_type = ops.typeOf(key);
286
+ const key_is_primitive =
287
+ key_type !== 'object' && key_type !== 'function' && key_type !== 'symbol';
288
+ keys.push(
289
+ `.get(${key_is_primitive ? stringify_primitive(ops.toPrimitive(key)) : '...'})`
290
+ );
291
+ str += `,${flatten(key)},${flatten(value)}`;
292
+ keys.pop();
293
+ }
294
+
295
+ str += ']';
296
+ break;
297
+
298
+ case 'Int8Array':
299
+ case 'Uint8Array':
300
+ case 'Uint8ClampedArray':
301
+ case 'Int16Array':
302
+ case 'Uint16Array':
303
+ case 'Float16Array':
304
+ case 'Int32Array':
305
+ case 'Uint32Array':
306
+ case 'Float32Array':
307
+ case 'Float64Array':
308
+ case 'BigInt64Array':
309
+ case 'BigUint64Array': {
310
+ const info = ops.viewInfo(thing);
311
+ str = '["' + tag + '",' + flatten(info.buffer);
312
+
313
+ // handle subarrays
314
+ if (info.byteLength !== info.bufferByteLength) {
315
+ str += `,${info.byteOffset},${info.length}`;
316
+ }
317
+
318
+ str += ']';
319
+ break;
320
+ }
321
+
322
+ case 'DataView': {
323
+ const info = ops.viewInfo(thing);
324
+ str = '["' + tag + '",' + flatten(info.buffer);
325
+
326
+ if (info.byteLength !== info.bufferByteLength) {
327
+ str += `,${info.byteOffset},${info.byteLength}`;
328
+ }
329
+
330
+ str += ']';
331
+ break;
332
+ }
333
+
334
+ case 'ArrayBuffer': {
335
+ const base64 = encode64(ops.toArrayBuffer(thing));
336
+
337
+ str = `["ArrayBuffer","${base64}"]`;
338
+ break;
339
+ }
340
+
341
+ case 'Temporal.Duration':
342
+ case 'Temporal.Instant':
343
+ case 'Temporal.PlainDate':
344
+ case 'Temporal.PlainTime':
345
+ case 'Temporal.PlainDateTime':
346
+ case 'Temporal.PlainMonthDay':
347
+ case 'Temporal.PlainYearMonth':
348
+ case 'Temporal.ZonedDateTime':
349
+ str = `["${tag}",${stringify_string(ops.toStringValue(thing))}]`;
350
+ break;
351
+
352
+ default: {
353
+ const shape = ops.shapeOf(thing);
354
+
355
+ if (shape.kind === 'not-plain') {
356
+ throw new DevalueError(`Cannot stringify arbitrary non-POJOs`, keys, thing, value);
357
+ }
358
+
359
+ if (shape.kind === 'symbol-keys') {
360
+ throw new DevalueError(`Cannot stringify POJOs with symbolic keys`, keys, thing, value);
361
+ }
362
+
363
+ if (shape.kind === 'null-proto') {
364
+ str = '["null"';
365
+ for (const key of shape.keys) {
366
+ if (key === '__proto__') {
367
+ throw new DevalueError(
368
+ `Cannot stringify objects with __proto__ keys`,
369
+ keys,
370
+ thing,
371
+ value
372
+ );
373
+ }
374
+
375
+ keys.push(stringify_key(key));
376
+ str += `,${stringify_string(key)},${flatten(ops.get(thing, key))}`;
377
+ keys.pop();
378
+ }
379
+ str += ']';
380
+ } else {
381
+ str = '{';
382
+ let started = false;
383
+ for (const key of shape.keys) {
384
+ if (key === '__proto__') {
385
+ throw new DevalueError(
386
+ `Cannot stringify objects with __proto__ keys`,
387
+ keys,
388
+ thing,
389
+ value
390
+ );
391
+ }
392
+
393
+ if (started) str += ',';
394
+ started = true;
395
+ keys.push(stringify_key(key));
396
+ str += `${stringify_string(key)}:${flatten(ops.get(thing, key))}`;
397
+ keys.pop();
398
+ }
399
+ str += '}';
400
+ }
401
+ }
402
+ }
403
+ }
404
+
405
+ stringified[index] = str;
406
+ return index;
407
+ }
408
+
409
+ const index = flatten(value);
410
+
411
+ // special case — value is represented as a negative index
412
+ if (index < 0) return `${index}`;
413
+
414
+ return stringified;
415
+ }
416
+
417
+ /**
418
+ * @param {any} thing
419
+ * @returns {string}
420
+ */
421
+ function stringify_primitive(thing) {
422
+ const type = typeof thing;
423
+ if (type === 'string') return stringify_string(thing);
424
+ if (thing === void 0) return UNDEFINED.toString();
425
+ if (thing === 0 && 1 / thing < 0) return NEGATIVE_ZERO.toString();
426
+ if (type === 'bigint') return `["BigInt","${thing}"]`;
427
+ return String(thing);
428
+ }