@stackline/stable-stringify 1.0.0 → 1.0.2

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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.js"],
4
- "sourcesContent": ["const hasOwn = Object.prototype.hasOwnProperty;\nconst propertyIsEnumerable = Object.prototype.propertyIsEnumerable;\nconst objectToString = Object.prototype.toString;\nconst OMIT = Symbol('omit');\nconst ROOT_PATH = null;\n\nconst SAFE_DEFAULTS = Object.freeze({\n bigint: 'string',\n cycleValue: '[Circular]',\n maxDepth: 100,\n maxEntries: 100000,\n maxLength: 1000000,\n onCycle: 'marker'\n});\n\nconst CANONICAL_DEFAULTS = Object.freeze({\n maxDepth: 1000,\n maxEntries: 100000,\n maxLength: 16 * 1024 * 1024\n});\n\nexport class StableStringifyLimitError extends RangeError {\n constructor(kind, limit, path) {\n const location = formatPath(path);\n super(`Stable stringify ${kind} limit of ${limit} exceeded at ${location}`);\n this.name = 'StableStringifyLimitError';\n this.code = 'ERR_STABLE_STRINGIFY_LIMIT';\n this.kind = kind;\n this.limit = limit;\n this.path = location;\n }\n}\n\nexport class CanonicalizationError extends TypeError {\n constructor(reason, path) {\n const location = formatPath(path);\n super(`JSON canonicalization failed at ${location}: ${reason}`);\n this.name = 'CanonicalizationError';\n this.code = 'ERR_JSON_CANONICALIZATION';\n this.path = location;\n this.reason = reason;\n }\n}\n\nexport function stableStringify(value, inputOptions) {\n const options = normalizeStableOptions(inputOptions);\n return serialize(value, options, false);\n}\n\nexport const stringify = stableStringify;\n\nexport function configure(inputDefaults) {\n const defaults =\n typeof inputDefaults === 'function'\n ? { cmp: inputDefaults }\n : normalizeInputObject(inputDefaults);\n normalizeStableOptions(defaults);\n\n return function configuredStableStringify(value, inputOptions) {\n const overrides =\n typeof inputOptions === 'function'\n ? { cmp: inputOptions }\n : normalizeInputObject(inputOptions);\n return stableStringify(value, { ...defaults, ...overrides });\n };\n}\n\nexport function safeStringify(value, replacer, space, inputOptions) {\n const options = normalizeInputObject(inputOptions);\n const stableOptions = {\n ...SAFE_DEFAULTS,\n ...options,\n maxDepth:\n options.maxDepth === undefined ? options.depthLimit : options.maxDepth,\n maxEntries:\n options.maxEntries === undefined ? options.edgesLimit : options.maxEntries,\n replacer: replacer === undefined ? options.replacer : replacer,\n space: space === undefined ? options.space : space\n };\n\n if (stableOptions.maxDepth === undefined) {\n stableOptions.maxDepth = SAFE_DEFAULTS.maxDepth;\n }\n if (stableOptions.maxEntries === undefined) {\n stableOptions.maxEntries = SAFE_DEFAULTS.maxEntries;\n }\n\n try {\n return stableStringify(value, stableOptions);\n } catch (error) {\n if (options.throwOnError === true) throw error;\n let name = 'UnknownError';\n try {\n if (error && typeof error.name === 'string') {\n name = error.name.slice(0, 80);\n }\n } catch {\n // A thrown value can expose hostile accessors of its own.\n }\n return JSON.stringify(`[Unable to serialize: ${name}]`);\n }\n}\n\nexport function canonicalize(value, inputOptions) {\n const options = normalizeCanonicalOptions(inputOptions);\n return serialize(value, options, true);\n}\n\nexport function canonicalizeBytes(value, inputOptions) {\n return encodeUtf8(canonicalize(value, inputOptions));\n}\n\nfunction serialize(rootValue, options, canonical) {\n const state = {\n ancestors: new WeakMap(),\n canonical,\n chunks: [],\n entries: 0,\n length: 0,\n options\n };\n const holder = { '': rootValue };\n const prepared = prepareValue(rootValue, holder, '', ROOT_PATH, state);\n\n if (prepared === OMIT) return undefined;\n\n const tasks = [\n {\n depth: 0,\n path: ROOT_PATH,\n prepared,\n type: 'value'\n }\n ];\n\n while (tasks.length > 0) {\n const task = tasks.pop();\n if (task.type === 'value') {\n processValueTask(task, tasks, state);\n } else {\n processContainerTask(task, tasks, state);\n }\n }\n\n return state.chunks.join('');\n}\n\nfunction processValueTask(task, tasks, state) {\n if (task.prepared.kind === 'primitive') {\n append(state, task.prepared.text, task.path);\n return;\n }\n\n const value = task.prepared.value;\n const previousPath = state.ancestors.get(value);\n if (previousPath !== undefined || state.ancestors.has(value)) {\n appendCycle(state, previousPath, task.path);\n return;\n }\n\n enforceDepth(state, task.depth, task.path);\n const isArray = Array.isArray(value);\n if (state.canonical && !isArray) validateCanonicalObject(value, task.path);\n\n state.ancestors.set(value, task.path);\n const frame = createContainerFrame(\n value,\n isArray,\n task.depth,\n task.path,\n state\n );\n append(state, isArray ? '[' : '{', task.path);\n\n if (frame.total === 0) {\n append(state, isArray ? ']' : '}', task.path);\n state.ancestors.delete(value);\n return;\n }\n\n tasks.push(frame);\n}\n\nfunction processContainerTask(frame, tasks, state) {\n if (frame.index >= frame.total) {\n if (frame.emitted && state.options.gap !== '') {\n append(state, `\\n${frame.indent}`, frame.path);\n }\n append(state, frame.isArray ? ']' : '}', frame.path);\n state.ancestors.delete(frame.value);\n return;\n }\n\n if (frame.isArray) {\n const index = frame.index;\n frame.index += 1;\n const path = createPath(frame.path, index);\n consumeEntry(state, path);\n const rawValue = readArrayValue(frame.value, index, path, state);\n let prepared = prepareValue(\n rawValue,\n frame.value,\n String(index),\n path,\n state\n );\n if (prepared === OMIT) prepared = primitive('null');\n\n appendItemPrefix(frame, path, state);\n tasks.push(frame);\n tasks.push({\n depth: frame.depth + 1,\n path,\n prepared,\n type: 'value'\n });\n return;\n }\n\n while (frame.index < frame.total) {\n const key = frame.keys[frame.index];\n frame.index += 1;\n const path = createPath(frame.path, key);\n consumeEntry(state, path);\n const rawValue = readObjectValue(frame.value, key, path, state);\n const prepared = prepareValue(rawValue, frame.value, key, path, state);\n if (prepared === OMIT) continue;\n\n appendItemPrefix(frame, path, state);\n append(state, JSON.stringify(key), path);\n append(state, state.options.gap === '' ? ':' : ': ', path);\n tasks.push(frame);\n tasks.push({\n depth: frame.depth + 1,\n path,\n prepared,\n type: 'value'\n });\n return;\n }\n\n tasks.push(frame);\n}\n\nfunction createContainerFrame(value, isArray, depth, path, state) {\n let keys;\n let total;\n\n if (isArray) {\n total = value.length;\n } else {\n keys = getObjectKeys(value, path, state);\n total = keys.length;\n }\n\n return {\n depth,\n emitted: false,\n indent:\n state.options.gap === '' ? '' : state.options.gap.repeat(depth),\n index: 0,\n isArray,\n keys,\n path,\n total,\n type: 'container',\n value\n };\n}\n\nfunction getObjectKeys(value, path, state) {\n let keys;\n if (state.canonical || state.options.propertyList === undefined) {\n keys = Object.keys(value);\n } else {\n keys = state.options.propertyList.slice();\n }\n\n if (state.canonical) {\n rejectEnumerableSymbols(value, path);\n for (const key of keys) {\n if (hasLoneSurrogate(key)) {\n throw new CanonicalizationError(\n 'property names must not contain lone UTF-16 surrogates',\n createPath(path, key)\n );\n }\n }\n return keys.sort();\n }\n\n if (state.options.accessors !== 'invoke') {\n keys = keys.filter((key) => {\n const descriptor = Object.getOwnPropertyDescriptor(value, key);\n if (!descriptor || (!descriptor.get && !descriptor.set)) return true;\n if (state.options.accessors === 'throw') {\n throw new TypeError(\n `Refusing to invoke accessor at ${formatPath(createPath(path, key))}`\n );\n }\n return false;\n });\n }\n\n if (state.options.cmp) {\n const comparator = state.options.cmp;\n keys.sort((left, right) =>\n comparator(\n { key: left, value: readForComparator(value, left, path, state) },\n { key: right, value: readForComparator(value, right, path, state) }\n )\n );\n } else {\n keys.sort();\n }\n return keys;\n}\n\nfunction prepareValue(rawValue, holder, key, path, state) {\n if (state.canonical) return prepareCanonicalValue(rawValue, path);\n\n let value = rawValue;\n if (state.options.toJSON && value !== null && value !== undefined) {\n const method = value.toJSON;\n if (typeof method === 'function') value = method.call(value);\n }\n\n if (state.options.replacerFunction) {\n value = state.options.replacerFunction.call(holder, key, value);\n }\n\n if (value === null) return primitive('null');\n\n switch (typeof value) {\n case 'string':\n return primitive(JSON.stringify(value));\n case 'number':\n return primitive(Number.isFinite(value) ? String(value) : 'null');\n case 'boolean':\n return primitive(value ? 'true' : 'false');\n case 'bigint':\n return prepareBigInt(value, state.options.bigint, path);\n case 'object':\n return { kind: 'object', value };\n default:\n return OMIT;\n }\n}\n\nfunction prepareCanonicalValue(value, path) {\n if (value === null) return primitive('null');\n\n switch (typeof value) {\n case 'string':\n if (hasLoneSurrogate(value)) {\n throw new CanonicalizationError(\n 'strings must not contain lone UTF-16 surrogates',\n path\n );\n }\n return primitive(JSON.stringify(value));\n case 'number':\n if (!Number.isFinite(value)) {\n throw new CanonicalizationError(\n 'NaN and Infinity are not valid I-JSON numbers',\n path\n );\n }\n return primitive(JSON.stringify(value));\n case 'boolean':\n return primitive(value ? 'true' : 'false');\n case 'object':\n return { kind: 'object', value };\n case 'bigint':\n throw new CanonicalizationError(\n 'BigInt values must be represented as JSON strings',\n path\n );\n default:\n throw new CanonicalizationError(\n `values of type ${typeof value} are not valid JSON data`,\n path\n );\n }\n}\n\nfunction prepareBigInt(value, mode, path) {\n if (mode === 'string') return primitive(JSON.stringify(String(value)));\n if (mode === 'number') {\n const number = Number(value);\n if (!Number.isSafeInteger(number)) {\n throw new RangeError(\n `BigInt at ${formatPath(path)} cannot be represented as a safe JSON number`\n );\n }\n return primitive(String(number));\n }\n throw new TypeError('Do not know how to serialize a BigInt');\n}\n\nfunction primitive(text) {\n return { kind: 'primitive', text };\n}\n\nfunction readArrayValue(array, index, path, state) {\n if (state.canonical) {\n if (!hasOwn.call(array, index)) {\n throw new CanonicalizationError(\n 'sparse arrays are not valid I-JSON data',\n path\n );\n }\n return readCanonicalDescriptor(array, String(index), path);\n }\n return readStableProperty(array, String(index), path, state.options.accessors);\n}\n\nfunction readObjectValue(object, key, path, state) {\n if (state.canonical) return readCanonicalDescriptor(object, key, path);\n return readStableProperty(object, key, path, state.options.accessors);\n}\n\nfunction readCanonicalDescriptor(object, key, path) {\n const descriptor = Object.getOwnPropertyDescriptor(object, key);\n if (!descriptor || descriptor.get || descriptor.set) {\n throw new CanonicalizationError(\n 'accessor properties are not valid canonical JSON input',\n path\n );\n }\n return descriptor.value;\n}\n\nfunction readStableProperty(object, key, path, accessors) {\n if (accessors === 'invoke') return object[key];\n\n const seen = new WeakSet();\n let current = object;\n while (current !== null && !seen.has(current)) {\n seen.add(current);\n const descriptor = Object.getOwnPropertyDescriptor(current, key);\n if (descriptor) {\n if (!descriptor.get && !descriptor.set) return descriptor.value;\n if (accessors === 'throw') {\n throw new TypeError(`Refusing to invoke accessor at ${formatPath(path)}`);\n }\n return undefined;\n }\n current = Object.getPrototypeOf(current);\n }\n return undefined;\n}\n\nfunction readForComparator(object, key, path, state) {\n return readStableProperty(\n object,\n key,\n createPath(path, key),\n state.options.accessors\n );\n}\n\nfunction validateCanonicalObject(value, path) {\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== null && objectToString.call(value) !== '[object Object]') {\n throw new CanonicalizationError(\n 'only JSON objects and arrays can be canonicalized',\n path\n );\n }\n if (prototype !== null && Object.getPrototypeOf(prototype) !== null) {\n throw new CanonicalizationError(\n 'class instances must be converted to plain JSON objects',\n path\n );\n }\n}\n\nfunction rejectEnumerableSymbols(value, path) {\n if (typeof Object.getOwnPropertySymbols !== 'function') return;\n const symbols = Object.getOwnPropertySymbols(value);\n if (symbols.some((symbol) => propertyIsEnumerable.call(value, symbol))) {\n throw new CanonicalizationError(\n 'symbol properties are not valid JSON object members',\n path\n );\n }\n}\n\nfunction appendItemPrefix(frame, path, state) {\n if (state.options.gap === '') {\n if (frame.emitted) append(state, ',', path);\n } else {\n const indentation = state.options.gap.repeat(frame.depth + 1);\n append(state, frame.emitted ? `,\\n${indentation}` : `\\n${indentation}`, path);\n }\n frame.emitted = true;\n}\n\nfunction appendCycle(state, previousPath, currentPath) {\n if (state.canonical) {\n throw new CanonicalizationError('circular references are not valid JSON', currentPath);\n }\n\n switch (state.options.onCycle) {\n case 'marker':\n append(state, JSON.stringify(state.options.cycleValue), currentPath);\n return;\n case 'path':\n append(\n state,\n JSON.stringify(`[Circular ${formatPath(previousPath)}]`),\n currentPath\n );\n return;\n case 'null':\n append(state, 'null', currentPath);\n return;\n default:\n throw new TypeError('Converting circular structure to JSON');\n }\n}\n\nfunction append(state, text, path) {\n const nextLength = state.length + text.length;\n if (nextLength > state.options.maxLength) {\n throw new StableStringifyLimitError(\n 'length',\n state.options.maxLength,\n path\n );\n }\n state.length = nextLength;\n state.chunks.push(text);\n}\n\nfunction enforceDepth(state, depth, path) {\n if (depth > state.options.maxDepth) {\n throw new StableStringifyLimitError(\n 'depth',\n state.options.maxDepth,\n path\n );\n }\n}\n\nfunction consumeEntry(state, path) {\n state.entries += 1;\n if (state.entries > state.options.maxEntries) {\n throw new StableStringifyLimitError(\n 'entry',\n state.options.maxEntries,\n path\n );\n }\n}\n\nfunction normalizeStableOptions(inputOptions) {\n const input =\n typeof inputOptions === 'function'\n ? { cmp: inputOptions }\n : normalizeInputObject(inputOptions);\n\n if (input.cmp !== undefined && typeof input.cmp !== 'function') {\n throw new TypeError('cmp must be a function');\n }\n if (input.cycles !== undefined && typeof input.cycles !== 'boolean') {\n throw new TypeError('cycles must be a boolean');\n }\n if (\n input.replacer !== undefined &&\n input.replacer !== null &&\n typeof input.replacer !== 'function' &&\n !Array.isArray(input.replacer)\n ) {\n throw new TypeError('replacer must be a function or an array');\n }\n\n const onCycle =\n input.onCycle === undefined\n ? input.cycles === true\n ? 'marker'\n : 'throw'\n : input.onCycle;\n if (!['throw', 'marker', 'path', 'null'].includes(onCycle)) {\n throw new TypeError(\n \"onCycle must be 'throw', 'marker', 'path', or 'null'\"\n );\n }\n\n const bigint = input.bigint === undefined ? 'throw' : input.bigint;\n if (!['throw', 'string', 'number'].includes(bigint)) {\n throw new TypeError(\"bigint must be 'throw', 'string', or 'number'\");\n }\n\n const accessors = input.accessors === undefined ? 'invoke' : input.accessors;\n if (!['invoke', 'omit', 'throw'].includes(accessors)) {\n throw new TypeError(\"accessors must be 'invoke', 'omit', or 'throw'\");\n }\n\n if (input.toJSON !== undefined && typeof input.toJSON !== 'boolean') {\n throw new TypeError('toJSON must be a boolean');\n }\n if (\n input.cycleValue !== undefined &&\n typeof input.cycleValue !== 'string'\n ) {\n throw new TypeError('cycleValue must be a string');\n }\n\n return {\n accessors,\n bigint,\n cmp: input.cmp,\n cycleValue:\n input.cycleValue === undefined ? '__cycle__' : input.cycleValue,\n gap: normalizeGap(input.space),\n maxDepth: normalizeLimit(input.maxDepth, Infinity, 'maxDepth'),\n maxEntries: normalizeLimit(input.maxEntries, Infinity, 'maxEntries'),\n maxLength: normalizeLimit(input.maxLength, Infinity, 'maxLength'),\n onCycle,\n propertyList: Array.isArray(input.replacer)\n ? normalizePropertyList(input.replacer)\n : undefined,\n replacerFunction:\n typeof input.replacer === 'function' ? input.replacer : undefined,\n toJSON: input.toJSON === undefined ? true : input.toJSON\n };\n}\n\nfunction normalizeCanonicalOptions(inputOptions) {\n const input = normalizeInputObject(inputOptions);\n return {\n accessors: 'throw',\n bigint: 'throw',\n cmp: undefined,\n cycleValue: '',\n gap: '',\n maxDepth: normalizeLimit(\n input.maxDepth,\n CANONICAL_DEFAULTS.maxDepth,\n 'maxDepth'\n ),\n maxEntries: normalizeLimit(\n input.maxEntries,\n CANONICAL_DEFAULTS.maxEntries,\n 'maxEntries'\n ),\n maxLength: normalizeLimit(\n input.maxLength,\n CANONICAL_DEFAULTS.maxLength,\n 'maxLength'\n ),\n onCycle: 'throw',\n propertyList: undefined,\n replacerFunction: undefined,\n toJSON: false\n };\n}\n\nfunction normalizeInputObject(value) {\n if (value === undefined || value === null) return {};\n if (typeof value !== 'object') {\n throw new TypeError('options must be an object when provided');\n }\n return { ...value };\n}\n\nfunction normalizeLimit(value, fallback, name) {\n const resolved = value === undefined ? fallback : value;\n if (resolved === Infinity) return resolved;\n if (!Number.isSafeInteger(resolved) || resolved < 0) {\n throw new TypeError(\n `${name} must be a non-negative safe integer or Infinity`\n );\n }\n return resolved;\n}\n\nfunction normalizeGap(space) {\n if (typeof space === 'number') {\n return ' '.repeat(Math.min(10, Math.max(0, Math.trunc(space))));\n }\n if (typeof space === 'string') return space.slice(0, 10);\n return '';\n}\n\nfunction normalizePropertyList(input) {\n const output = [];\n const seen = new Set();\n for (const item of input) {\n let key;\n if (typeof item === 'string' || typeof item === 'number') {\n key = String(item);\n } else if (\n item &&\n (objectToString.call(item) === '[object String]' ||\n objectToString.call(item) === '[object Number]')\n ) {\n key = String(item);\n }\n if (key !== undefined && !seen.has(key)) {\n seen.add(key);\n output.push(key);\n }\n }\n return output;\n}\n\nfunction hasLoneSurrogate(value) {\n for (let index = 0; index < value.length; index += 1) {\n const code = value.charCodeAt(index);\n if (code >= 0xd800 && code <= 0xdbff) {\n const next = value.charCodeAt(index + 1);\n if (!(next >= 0xdc00 && next <= 0xdfff)) return true;\n index += 1;\n } else if (code >= 0xdc00 && code <= 0xdfff) {\n return true;\n }\n }\n return false;\n}\n\nfunction createPath(parent, key) {\n return { key, parent };\n}\n\nfunction formatPath(path) {\n if (path === ROOT_PATH) return '<root>';\n const parts = [];\n let current = path;\n while (current !== ROOT_PATH) {\n parts.push(current.key);\n current = current.parent;\n }\n parts.reverse();\n\n let output = '<root>';\n for (const part of parts) {\n if (typeof part === 'number') {\n output += `[${part}]`;\n } else if (/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(part)) {\n output += `.${part}`;\n } else {\n output += `[${JSON.stringify(part)}]`;\n }\n }\n return output;\n}\n\nfunction encodeUtf8(value) {\n if (typeof TextEncoder === 'function') return new TextEncoder().encode(value);\n\n const bytes = [];\n for (let index = 0; index < value.length; index += 1) {\n let code = value.charCodeAt(index);\n if (code >= 0xd800 && code <= 0xdbff) {\n const next = value.charCodeAt(index + 1);\n code = ((code - 0xd800) << 10) + (next - 0xdc00) + 0x10000;\n index += 1;\n }\n\n if (code <= 0x7f) {\n bytes.push(code);\n } else if (code <= 0x7ff) {\n bytes.push(0xc0 | (code >> 6), 0x80 | (code & 0x3f));\n } else if (code <= 0xffff) {\n bytes.push(\n 0xe0 | (code >> 12),\n 0x80 | ((code >> 6) & 0x3f),\n 0x80 | (code & 0x3f)\n );\n } else {\n bytes.push(\n 0xf0 | (code >> 18),\n 0x80 | ((code >> 12) & 0x3f),\n 0x80 | ((code >> 6) & 0x3f),\n 0x80 | (code & 0x3f)\n );\n }\n }\n return Uint8Array.from(bytes);\n}\n\nObject.defineProperties(stableStringify, {\n CanonicalizationError: { value: CanonicalizationError },\n StableStringifyLimitError: { value: StableStringifyLimitError },\n canonicalize: { value: canonicalize },\n canonicalizeBytes: { value: canonicalizeBytes },\n configure: { value: configure },\n default: { value: stableStringify },\n safeStringify: { value: safeStringify },\n stable: { value: stableStringify },\n stableStringify: { value: stableStringify },\n stringify: { value: stableStringify }\n});\n\nObject.defineProperties(safeStringify, {\n stable: { value: stableStringify },\n stableStringify: { value: stableStringify }\n});\n\nexport default stableStringify;\n"],
5
- "mappings": "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",
6
- "names": ["index_exports", "__export", "CanonicalizationError", "StableStringifyLimitError", "canonicalize", "canonicalizeBytes", "configure", "index_default", "safeStringify", "stableStringify", "stringify", "hasOwn", "propertyIsEnumerable", "objectToString", "OMIT", "ROOT_PATH", "SAFE_DEFAULTS", "CANONICAL_DEFAULTS", "kind", "limit", "path", "location", "formatPath", "reason", "value", "inputOptions", "options", "normalizeStableOptions", "serialize", "inputDefaults", "defaults", "normalizeInputObject", "overrides", "replacer", "space", "stableOptions", "error", "name", "e", "normalizeCanonicalOptions", "encodeUtf8", "rootValue", "canonical", "state", "prepared", "prepareValue", "tasks", "task", "processValueTask", "processContainerTask", "append", "previousPath", "appendCycle", "enforceDepth", "isArray", "validateCanonicalObject", "frame", "createContainerFrame", "index", "createPath", "consumeEntry", "rawValue", "readArrayValue", "primitive", "appendItemPrefix", "key", "readObjectValue", "depth", "keys", "total", "getObjectKeys", "rejectEnumerableSymbols", "hasLoneSurrogate", "descriptor", "comparator", "left", "right", "readForComparator", "holder", "prepareCanonicalValue", "method", "prepareBigInt", "mode", "number", "text", "array", "readCanonicalDescriptor", "readStableProperty", "object", "accessors", "seen", "current", "prototype", "symbol", "indentation", "currentPath", "nextLength", "input", "onCycle", "bigint", "normalizeGap", "normalizeLimit", "normalizePropertyList", "fallback", "resolved", "output", "item", "code", "next", "parent", "parts", "part", "bytes"]
4
+ "sourcesContent": ["const hasOwn = Object.prototype.hasOwnProperty;\nconst propertyIsEnumerable = Object.prototype.propertyIsEnumerable;\nconst objectToString = Object.prototype.toString;\nconst OMIT = Symbol('omit');\nconst ROOT_PATH = null;\n\nconst SAFE_DEFAULTS = Object.freeze({\n bigint: 'string',\n cycleValue: '[Circular]',\n maxDepth: 100,\n maxEntries: 100000,\n maxLength: 1000000,\n onCycle: 'marker'\n});\n\nconst CANONICAL_DEFAULTS = Object.freeze({\n maxDepth: 1000,\n maxEntries: 100000,\n maxLength: 16 * 1024 * 1024\n});\n\nexport class StableStringifyLimitError extends RangeError {\n constructor(kind, limit, path) {\n const location = formatPath(path);\n super(`Stable stringify ${kind} limit of ${limit} exceeded at ${location}`);\n this.name = 'StableStringifyLimitError';\n this.code = 'ERR_STABLE_STRINGIFY_LIMIT';\n this.kind = kind;\n this.limit = limit;\n this.path = location;\n }\n}\n\nexport class CanonicalizationError extends TypeError {\n constructor(reason, path) {\n const location = formatPath(path);\n super(`JSON canonicalization failed at ${location}: ${reason}`);\n this.name = 'CanonicalizationError';\n this.code = 'ERR_JSON_CANONICALIZATION';\n this.path = location;\n this.reason = reason;\n }\n}\n\nexport function stableStringify(value, inputOptions) {\n const options = normalizeStableOptions(inputOptions);\n return serialize(value, options, false);\n}\n\nexport const stringify = stableStringify;\n\nexport function configure(inputDefaults) {\n const defaults =\n typeof inputDefaults === 'function'\n ? { cmp: inputDefaults }\n : normalizeInputObject(inputDefaults);\n normalizeStableOptions(defaults);\n\n return function configuredStableStringify(value, inputOptions) {\n const overrides =\n typeof inputOptions === 'function'\n ? { cmp: inputOptions }\n : normalizeInputObject(inputOptions);\n return stableStringify(value, { ...defaults, ...overrides });\n };\n}\n\nexport function safeStringify(value, replacer, space, inputOptions) {\n const options = normalizeInputObject(inputOptions);\n const stableOptions = {\n ...SAFE_DEFAULTS,\n ...options,\n maxDepth:\n options.maxDepth === undefined ? options.depthLimit : options.maxDepth,\n maxEntries:\n options.maxEntries === undefined ? options.edgesLimit : options.maxEntries,\n replacer: replacer === undefined ? options.replacer : replacer,\n space: space === undefined ? options.space : space\n };\n\n if (stableOptions.maxDepth === undefined) {\n stableOptions.maxDepth = SAFE_DEFAULTS.maxDepth;\n }\n if (stableOptions.maxEntries === undefined) {\n stableOptions.maxEntries = SAFE_DEFAULTS.maxEntries;\n }\n\n try {\n return stableStringify(value, stableOptions);\n } catch (error) {\n if (options.throwOnError === true) throw error;\n let name = 'UnknownError';\n try {\n if (error && typeof error.name === 'string') {\n name = error.name.slice(0, 80);\n }\n } catch {\n // A thrown value can expose hostile accessors of its own.\n }\n return JSON.stringify(`[Unable to serialize: ${name}]`);\n }\n}\n\nexport function canonicalize(value, inputOptions) {\n const options = normalizeCanonicalOptions(inputOptions);\n return serialize(value, options, true);\n}\n\nexport function canonicalizeBytes(value, inputOptions) {\n return encodeUtf8(canonicalize(value, inputOptions));\n}\n\nfunction serialize(rootValue, options, canonical) {\n const state = {\n ancestors: new WeakMap(),\n canonical,\n chunks: [],\n entries: 0,\n length: 0,\n options\n };\n const holder = { '': rootValue };\n const prepared = prepareValue(rootValue, holder, '', ROOT_PATH, state);\n\n if (prepared === OMIT) return undefined;\n\n const tasks = [\n {\n depth: 0,\n path: ROOT_PATH,\n prepared,\n type: 'value'\n }\n ];\n\n while (tasks.length > 0) {\n const task = tasks.pop();\n if (task.type === 'value') {\n processValueTask(task, tasks, state);\n } else {\n processContainerTask(task, tasks, state);\n }\n }\n\n return state.chunks.join('');\n}\n\nfunction processValueTask(task, tasks, state) {\n if (task.prepared.kind === 'primitive') {\n append(state, task.prepared.text, task.path);\n return;\n }\n\n const value = task.prepared.value;\n const previousPath = state.ancestors.get(value);\n if (previousPath !== undefined || state.ancestors.has(value)) {\n appendCycle(state, previousPath, task.path);\n return;\n }\n\n enforceDepth(state, task.depth, task.path);\n const isArray = Array.isArray(value);\n if (state.canonical) {\n rejectEnumerableSymbols(value, task.path);\n if (!isArray) validateCanonicalObject(value, task.path);\n }\n\n state.ancestors.set(value, task.path);\n const frame = createContainerFrame(\n value,\n isArray,\n task.depth,\n task.path,\n state\n );\n append(state, isArray ? '[' : '{', task.path);\n\n if (frame.total === 0) {\n append(state, isArray ? ']' : '}', task.path);\n state.ancestors.delete(value);\n return;\n }\n\n tasks.push(frame);\n}\n\nfunction processContainerTask(frame, tasks, state) {\n if (frame.index >= frame.total) {\n if (frame.emitted && state.options.gap !== '') {\n append(state, `\\n${frame.indent}`, frame.path);\n }\n append(state, frame.isArray ? ']' : '}', frame.path);\n state.ancestors.delete(frame.value);\n return;\n }\n\n if (frame.isArray) {\n const index = frame.index;\n frame.index += 1;\n const path = createPath(frame.path, index);\n consumeEntry(state, path);\n const rawValue = readArrayValue(frame.value, index, path, state);\n let prepared = prepareValue(\n rawValue,\n frame.value,\n String(index),\n path,\n state\n );\n if (prepared === OMIT) prepared = primitive('null');\n\n appendItemPrefix(frame, path, state);\n tasks.push(frame);\n tasks.push({\n depth: frame.depth + 1,\n path,\n prepared,\n type: 'value'\n });\n return;\n }\n\n while (frame.index < frame.total) {\n const key = frame.keys[frame.index];\n frame.index += 1;\n const path = createPath(frame.path, key);\n consumeEntry(state, path);\n const rawValue = readObjectValue(frame.value, key, path, state);\n const prepared = prepareValue(rawValue, frame.value, key, path, state);\n if (prepared === OMIT) continue;\n\n appendItemPrefix(frame, path, state);\n append(state, JSON.stringify(key), path);\n append(state, state.options.gap === '' ? ':' : ': ', path);\n tasks.push(frame);\n tasks.push({\n depth: frame.depth + 1,\n path,\n prepared,\n type: 'value'\n });\n return;\n }\n\n tasks.push(frame);\n}\n\nfunction createContainerFrame(value, isArray, depth, path, state) {\n let keys;\n let total;\n\n if (isArray) {\n total = value.length;\n } else {\n keys = getObjectKeys(value, path, state);\n total = keys.length;\n }\n\n return {\n depth,\n emitted: false,\n indent:\n state.options.gap === '' ? '' : state.options.gap.repeat(depth),\n index: 0,\n isArray,\n keys,\n path,\n total,\n type: 'container',\n value\n };\n}\n\nfunction getObjectKeys(value, path, state) {\n let keys;\n if (state.canonical || state.options.propertyList === undefined) {\n keys = Object.keys(value);\n } else {\n keys = state.options.propertyList.slice();\n }\n\n if (state.canonical) {\n for (const key of keys) {\n if (hasLoneSurrogate(key)) {\n throw new CanonicalizationError(\n 'property names must not contain lone UTF-16 surrogates',\n createPath(path, key)\n );\n }\n }\n return keys.sort();\n }\n\n if (state.options.accessors !== 'invoke') {\n keys = keys.filter((key) => {\n const descriptor = Object.getOwnPropertyDescriptor(value, key);\n if (!descriptor || (!descriptor.get && !descriptor.set)) return true;\n if (state.options.accessors === 'throw') {\n throw new TypeError(\n `Refusing to invoke accessor at ${formatPath(createPath(path, key))}`\n );\n }\n return false;\n });\n }\n\n if (state.options.cmp) {\n const comparator = state.options.cmp;\n keys.sort((left, right) =>\n comparator(\n { key: left, value: readForComparator(value, left, path, state) },\n { key: right, value: readForComparator(value, right, path, state) }\n )\n );\n } else {\n keys.sort();\n }\n return keys;\n}\n\nfunction prepareValue(rawValue, holder, key, path, state) {\n if (state.canonical) return prepareCanonicalValue(rawValue, path);\n\n let value = rawValue;\n if (state.options.toJSON && value !== null && value !== undefined) {\n const method = value.toJSON;\n if (typeof method === 'function') value = method.call(value);\n }\n\n if (state.options.replacerFunction) {\n value = state.options.replacerFunction.call(holder, key, value);\n }\n\n if (value === null) return primitive('null');\n\n switch (typeof value) {\n case 'string':\n return primitive(JSON.stringify(value));\n case 'number':\n return primitive(Number.isFinite(value) ? String(value) : 'null');\n case 'boolean':\n return primitive(value ? 'true' : 'false');\n case 'bigint':\n return prepareBigInt(value, state.options.bigint, path);\n case 'object':\n return { kind: 'object', value };\n default:\n return OMIT;\n }\n}\n\nfunction prepareCanonicalValue(value, path) {\n if (value === null) return primitive('null');\n\n switch (typeof value) {\n case 'string':\n if (hasLoneSurrogate(value)) {\n throw new CanonicalizationError(\n 'strings must not contain lone UTF-16 surrogates',\n path\n );\n }\n return primitive(JSON.stringify(value));\n case 'number':\n if (!Number.isFinite(value)) {\n throw new CanonicalizationError(\n 'NaN and Infinity are not valid I-JSON numbers',\n path\n );\n }\n return primitive(JSON.stringify(value));\n case 'boolean':\n return primitive(value ? 'true' : 'false');\n case 'object':\n return { kind: 'object', value };\n case 'bigint':\n throw new CanonicalizationError(\n 'BigInt values must be represented as JSON strings',\n path\n );\n default:\n throw new CanonicalizationError(\n `values of type ${typeof value} are not valid JSON data`,\n path\n );\n }\n}\n\nfunction prepareBigInt(value, mode, path) {\n if (mode === 'string') return primitive(JSON.stringify(String(value)));\n if (mode === 'number') {\n const number = Number(value);\n if (!Number.isSafeInteger(number)) {\n throw new RangeError(\n `BigInt at ${formatPath(path)} cannot be represented as a safe JSON number`\n );\n }\n return primitive(String(number));\n }\n throw new TypeError('Do not know how to serialize a BigInt');\n}\n\nfunction primitive(text) {\n return { kind: 'primitive', text };\n}\n\nfunction readArrayValue(array, index, path, state) {\n if (state.canonical) {\n if (!hasOwn.call(array, index)) {\n throw new CanonicalizationError(\n 'sparse arrays are not valid I-JSON data',\n path\n );\n }\n return readCanonicalDescriptor(array, String(index), path);\n }\n return readStableProperty(array, String(index), path, state.options.accessors);\n}\n\nfunction readObjectValue(object, key, path, state) {\n if (state.canonical) return readCanonicalDescriptor(object, key, path);\n return readStableProperty(object, key, path, state.options.accessors);\n}\n\nfunction readCanonicalDescriptor(object, key, path) {\n const descriptor = Object.getOwnPropertyDescriptor(object, key);\n if (!descriptor || descriptor.get || descriptor.set) {\n throw new CanonicalizationError(\n 'accessor properties are not valid canonical JSON input',\n path\n );\n }\n return descriptor.value;\n}\n\nfunction readStableProperty(object, key, path, accessors) {\n if (accessors === 'invoke') return object[key];\n\n const seen = new WeakSet();\n let current = object;\n while (current !== null && !seen.has(current)) {\n seen.add(current);\n const descriptor = Object.getOwnPropertyDescriptor(current, key);\n if (descriptor) {\n if (!descriptor.get && !descriptor.set) return descriptor.value;\n if (accessors === 'throw') {\n throw new TypeError(`Refusing to invoke accessor at ${formatPath(path)}`);\n }\n return undefined;\n }\n current = Object.getPrototypeOf(current);\n }\n return undefined;\n}\n\nfunction readForComparator(object, key, path, state) {\n return readStableProperty(\n object,\n key,\n createPath(path, key),\n state.options.accessors\n );\n}\n\nfunction validateCanonicalObject(value, path) {\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== null && Object.getPrototypeOf(prototype) !== null) {\n throw new CanonicalizationError(\n 'class instances must be converted to plain JSON objects',\n path\n );\n }\n}\n\nfunction rejectEnumerableSymbols(value, path) {\n if (typeof Object.getOwnPropertySymbols !== 'function') return;\n const symbols = Object.getOwnPropertySymbols(value);\n if (symbols.some((symbol) => propertyIsEnumerable.call(value, symbol))) {\n throw new CanonicalizationError(\n 'symbol properties are not valid JSON object members',\n path\n );\n }\n}\n\nfunction appendItemPrefix(frame, path, state) {\n if (state.options.gap === '') {\n if (frame.emitted) append(state, ',', path);\n } else {\n const indentation = state.options.gap.repeat(frame.depth + 1);\n append(state, frame.emitted ? `,\\n${indentation}` : `\\n${indentation}`, path);\n }\n frame.emitted = true;\n}\n\nfunction appendCycle(state, previousPath, currentPath) {\n if (state.canonical) {\n throw new CanonicalizationError('circular references are not valid JSON', currentPath);\n }\n\n switch (state.options.onCycle) {\n case 'marker':\n append(state, JSON.stringify(state.options.cycleValue), currentPath);\n return;\n case 'path':\n append(\n state,\n JSON.stringify(`[Circular ${formatPath(previousPath)}]`),\n currentPath\n );\n return;\n case 'null':\n append(state, 'null', currentPath);\n return;\n default:\n throw new TypeError('Converting circular structure to JSON');\n }\n}\n\nfunction append(state, text, path) {\n const nextLength = state.length + text.length;\n if (nextLength > state.options.maxLength) {\n throw new StableStringifyLimitError(\n 'length',\n state.options.maxLength,\n path\n );\n }\n state.length = nextLength;\n state.chunks.push(text);\n}\n\nfunction enforceDepth(state, depth, path) {\n if (depth > state.options.maxDepth) {\n throw new StableStringifyLimitError(\n 'depth',\n state.options.maxDepth,\n path\n );\n }\n}\n\nfunction consumeEntry(state, path) {\n state.entries += 1;\n if (state.entries > state.options.maxEntries) {\n throw new StableStringifyLimitError(\n 'entry',\n state.options.maxEntries,\n path\n );\n }\n}\n\nfunction normalizeStableOptions(inputOptions) {\n const input =\n typeof inputOptions === 'function'\n ? { cmp: inputOptions }\n : normalizeInputObject(inputOptions);\n\n if (input.cmp !== undefined && typeof input.cmp !== 'function') {\n throw new TypeError('cmp must be a function');\n }\n if (input.cycles !== undefined && typeof input.cycles !== 'boolean') {\n throw new TypeError('cycles must be a boolean');\n }\n if (\n input.replacer !== undefined &&\n input.replacer !== null &&\n typeof input.replacer !== 'function' &&\n !Array.isArray(input.replacer)\n ) {\n throw new TypeError('replacer must be a function or an array');\n }\n\n const onCycle =\n input.onCycle === undefined\n ? input.cycles === true\n ? 'marker'\n : 'throw'\n : input.onCycle;\n if (!['throw', 'marker', 'path', 'null'].includes(onCycle)) {\n throw new TypeError(\n \"onCycle must be 'throw', 'marker', 'path', or 'null'\"\n );\n }\n\n const bigint = input.bigint === undefined ? 'throw' : input.bigint;\n if (!['throw', 'string', 'number'].includes(bigint)) {\n throw new TypeError(\"bigint must be 'throw', 'string', or 'number'\");\n }\n\n const accessors = input.accessors === undefined ? 'invoke' : input.accessors;\n if (!['invoke', 'omit', 'throw'].includes(accessors)) {\n throw new TypeError(\"accessors must be 'invoke', 'omit', or 'throw'\");\n }\n\n if (input.toJSON !== undefined && typeof input.toJSON !== 'boolean') {\n throw new TypeError('toJSON must be a boolean');\n }\n if (\n input.cycleValue !== undefined &&\n typeof input.cycleValue !== 'string'\n ) {\n throw new TypeError('cycleValue must be a string');\n }\n\n return {\n accessors,\n bigint,\n cmp: input.cmp,\n cycleValue:\n input.cycleValue === undefined ? '__cycle__' : input.cycleValue,\n gap: normalizeGap(input.space),\n maxDepth: normalizeLimit(input.maxDepth, Infinity, 'maxDepth'),\n maxEntries: normalizeLimit(input.maxEntries, Infinity, 'maxEntries'),\n maxLength: normalizeLimit(input.maxLength, Infinity, 'maxLength'),\n onCycle,\n propertyList: Array.isArray(input.replacer)\n ? normalizePropertyList(input.replacer)\n : undefined,\n replacerFunction:\n typeof input.replacer === 'function' ? input.replacer : undefined,\n toJSON: input.toJSON === undefined ? true : input.toJSON\n };\n}\n\nfunction normalizeCanonicalOptions(inputOptions) {\n const input = normalizeInputObject(inputOptions);\n return {\n accessors: 'throw',\n bigint: 'throw',\n cmp: undefined,\n cycleValue: '',\n gap: '',\n maxDepth: normalizeLimit(\n input.maxDepth,\n CANONICAL_DEFAULTS.maxDepth,\n 'maxDepth'\n ),\n maxEntries: normalizeLimit(\n input.maxEntries,\n CANONICAL_DEFAULTS.maxEntries,\n 'maxEntries'\n ),\n maxLength: normalizeLimit(\n input.maxLength,\n CANONICAL_DEFAULTS.maxLength,\n 'maxLength'\n ),\n onCycle: 'throw',\n propertyList: undefined,\n replacerFunction: undefined,\n toJSON: false\n };\n}\n\nfunction normalizeInputObject(value) {\n if (value === undefined || value === null) return {};\n if (typeof value !== 'object') {\n throw new TypeError('options must be an object when provided');\n }\n return { ...value };\n}\n\nfunction normalizeLimit(value, fallback, name) {\n const resolved = value === undefined ? fallback : value;\n if (resolved === Infinity) return resolved;\n if (!Number.isSafeInteger(resolved) || resolved < 0) {\n throw new TypeError(\n `${name} must be a non-negative safe integer or Infinity`\n );\n }\n return resolved;\n}\n\nfunction normalizeGap(space) {\n if (typeof space === 'number') {\n return ' '.repeat(Math.min(10, Math.max(0, Math.trunc(space))));\n }\n if (typeof space === 'string') return space.slice(0, 10);\n return '';\n}\n\nfunction normalizePropertyList(input) {\n const output = [];\n const seen = new Set();\n for (const item of input) {\n let key;\n if (typeof item === 'string' || typeof item === 'number') {\n key = String(item);\n } else if (\n item &&\n (objectToString.call(item) === '[object String]' ||\n objectToString.call(item) === '[object Number]')\n ) {\n key = String(item);\n }\n if (key !== undefined && !seen.has(key)) {\n seen.add(key);\n output.push(key);\n }\n }\n return output;\n}\n\nfunction hasLoneSurrogate(value) {\n for (let index = 0; index < value.length; index += 1) {\n const code = value.charCodeAt(index);\n if (code >= 0xd800 && code <= 0xdbff) {\n const next = value.charCodeAt(index + 1);\n if (!(next >= 0xdc00 && next <= 0xdfff)) return true;\n index += 1;\n } else if (code >= 0xdc00 && code <= 0xdfff) {\n return true;\n }\n }\n return false;\n}\n\nfunction createPath(parent, key) {\n return { key, parent };\n}\n\nfunction formatPath(path) {\n if (path === ROOT_PATH) return '<root>';\n const parts = [];\n let current = path;\n while (current !== ROOT_PATH) {\n parts.push(current.key);\n current = current.parent;\n }\n parts.reverse();\n\n let output = '<root>';\n for (const part of parts) {\n if (typeof part === 'number') {\n output += `[${part}]`;\n } else if (/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(part)) {\n output += `.${part}`;\n } else {\n output += `[${JSON.stringify(part)}]`;\n }\n }\n return output;\n}\n\nfunction encodeUtf8(value) {\n if (typeof TextEncoder === 'function') return new TextEncoder().encode(value);\n\n const bytes = [];\n for (let index = 0; index < value.length; index += 1) {\n let code = value.charCodeAt(index);\n if (code >= 0xd800 && code <= 0xdbff) {\n const next = value.charCodeAt(index + 1);\n code = ((code - 0xd800) << 10) + (next - 0xdc00) + 0x10000;\n index += 1;\n }\n\n if (code <= 0x7f) {\n bytes.push(code);\n } else if (code <= 0x7ff) {\n bytes.push(0xc0 | (code >> 6), 0x80 | (code & 0x3f));\n } else if (code <= 0xffff) {\n bytes.push(\n 0xe0 | (code >> 12),\n 0x80 | ((code >> 6) & 0x3f),\n 0x80 | (code & 0x3f)\n );\n } else {\n bytes.push(\n 0xf0 | (code >> 18),\n 0x80 | ((code >> 12) & 0x3f),\n 0x80 | ((code >> 6) & 0x3f),\n 0x80 | (code & 0x3f)\n );\n }\n }\n return Uint8Array.from(bytes);\n}\n\nObject.defineProperties(stableStringify, {\n CanonicalizationError: { value: CanonicalizationError },\n StableStringifyLimitError: { value: StableStringifyLimitError },\n canonicalize: { value: canonicalize },\n canonicalizeBytes: { value: canonicalizeBytes },\n configure: { value: configure },\n default: { value: stableStringify },\n safeStringify: { value: safeStringify },\n stable: { value: stableStringify },\n stableStringify: { value: stableStringify },\n stringify: { value: stableStringify }\n});\n\nObject.defineProperties(safeStringify, {\n stable: { value: stableStringify },\n stableStringify: { value: stableStringify }\n});\n\nexport default stableStringify;\n"],
5
+ "mappings": "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",
6
+ "names": ["index_exports", "__export", "CanonicalizationError", "StableStringifyLimitError", "canonicalize", "canonicalizeBytes", "configure", "index_default", "safeStringify", "stableStringify", "stringify", "hasOwn", "propertyIsEnumerable", "objectToString", "OMIT", "ROOT_PATH", "SAFE_DEFAULTS", "CANONICAL_DEFAULTS", "kind", "limit", "path", "location", "formatPath", "reason", "value", "inputOptions", "options", "normalizeStableOptions", "serialize", "inputDefaults", "defaults", "normalizeInputObject", "overrides", "replacer", "space", "stableOptions", "error", "name", "e", "normalizeCanonicalOptions", "encodeUtf8", "rootValue", "canonical", "state", "prepared", "prepareValue", "tasks", "task", "processValueTask", "processContainerTask", "append", "previousPath", "appendCycle", "enforceDepth", "isArray", "rejectEnumerableSymbols", "validateCanonicalObject", "frame", "createContainerFrame", "index", "createPath", "consumeEntry", "rawValue", "readArrayValue", "primitive", "appendItemPrefix", "key", "readObjectValue", "depth", "keys", "total", "getObjectKeys", "hasLoneSurrogate", "descriptor", "comparator", "left", "right", "readForComparator", "holder", "prepareCanonicalValue", "method", "prepareBigInt", "mode", "number", "text", "array", "readCanonicalDescriptor", "readStableProperty", "object", "accessors", "seen", "current", "prototype", "symbol", "indentation", "currentPath", "nextLength", "input", "onCycle", "bigint", "normalizeGap", "normalizeLimit", "normalizePropertyList", "fallback", "resolved", "output", "item", "code", "next", "parent", "parts", "part", "bytes"]
7
7
  }
@@ -0,0 +1,37 @@
1
+ # Adoption Guide
2
+
3
+ ## Stable cache keys
4
+
5
+ Use the default export when object insertion order must not change a cache key,
6
+ snapshot, deduplication identifier, or content hash.
7
+
8
+ ```js
9
+ import stringify from '@stackline/stable-stringify';
10
+
11
+ const key = stringify({ tenant: 42, query: { status: 'open' } });
12
+ ```
13
+
14
+ ## Drop-in package alias
15
+
16
+ Applications already using `fast-json-stable-stringify` can preserve their
17
+ imports:
18
+
19
+ ```bash
20
+ npm uninstall fast-json-stable-stringify
21
+ npm install fast-json-stable-stringify@npm:@stackline/stable-stringify
22
+ ```
23
+
24
+ Commit the lockfile and run the complete application suite. The default call
25
+ shape and comparator contract are covered by differential compatibility tests.
26
+
27
+ ## Safe diagnostics
28
+
29
+ Use `safeStringify` for logs and error paths that can contain cycles, BigInt,
30
+ getters, or deeply nested data. Its bounded defaults keep diagnostic output
31
+ from becoming another failure source.
32
+
33
+ ## Cryptographic canonicalization
34
+
35
+ Use `canonicalize` or `canonicalizeBytes` only when strict RFC 8785 behavior is
36
+ required. Canonical mode intentionally rejects values outside its I-JSON
37
+ contract instead of silently applying safe-logging policies.
@@ -0,0 +1,103 @@
1
+ # Architecture
2
+
3
+ ## Scope
4
+
5
+ The runtime converts a JavaScript value into deterministic JSON text through
6
+ three policy surfaces:
7
+
8
+ - stable mode for compatibility and cache or snapshot keys;
9
+ - safe mode for bounded diagnostics and logs;
10
+ - canonical mode for RFC 8785 interoperable bytes.
11
+
12
+ All modes share one iterative serialization engine and have zero runtime
13
+ dependencies.
14
+
15
+ ## Iterative task stack
16
+
17
+ Recursive serializers fail when object depth exceeds the JavaScript call-stack
18
+ limit. This implementation prepares a root value and processes explicit
19
+ `value` and `container` tasks in a loop. A container frame stores its key list,
20
+ index, depth, indentation, path, and emission state.
21
+
22
+ The approach makes nesting depth a policy decision instead of a runtime stack
23
+ accident. Stable mode is tested with 25,000 nested arrays. Safe and canonical
24
+ modes intentionally apply finite defaults.
25
+
26
+ ## Preparation and emission
27
+
28
+ Each value goes through preparation before output:
29
+
30
+ 1. stable mode optionally invokes `toJSON` and a replacer;
31
+ 2. the value is classified as primitive, container, or omitted;
32
+ 3. object keys are selected and sorted;
33
+ 4. descriptors or accessors are read according to policy;
34
+ 5. text chunks are appended while enforcing the output budget.
35
+
36
+ Arrays preserve order. Unsupported stable-mode array items become `null`,
37
+ matching JSON semantics. Unsupported object members are omitted.
38
+
39
+ ## Cycle detection
40
+
41
+ An operation-scoped `WeakMap` tracks active ancestors and their paths. Entries
42
+ are removed when a container closes, so repeated sibling references are not
43
+ misclassified as cycles. The current ancestor path supports strict errors,
44
+ markers, null substitution, and descriptive path markers.
45
+
46
+ No graph is retained after serialization.
47
+
48
+ ## Stable mode
49
+
50
+ Stable mode sorts own enumerable string keys by UTF-16 code units. A comparator
51
+ can instead order `{ key, value }` records. Property-list replacers are
52
+ normalized once, deduplicated, and applied at every object depth.
53
+
54
+ Compatibility defaults intentionally leave depth, entry, and length budgets
55
+ unlimited. BigInt throws, accessors and `toJSON` are invoked, and cycles throw
56
+ unless configured otherwise.
57
+
58
+ ## Safe mode
59
+
60
+ Safe mode delegates to the same engine with cycle markers, BigInt strings, and
61
+ finite budgets. It catches traversal failures and returns a controlled JSON
62
+ string unless `throwOnError` is enabled. This prevents the diagnostic path from
63
+ hiding the original application error behind a second serialization error.
64
+
65
+ ## Canonical mode
66
+
67
+ Canonical mode validates I-JSON data while traversing:
68
+
69
+ - keys use recursive UTF-16 ordering required by RFC 8785;
70
+ - numbers and strings use ECMAScript JSON serialization;
71
+ - malformed Unicode and non-finite numbers are rejected;
72
+ - only arrays, plain objects, and null-prototype objects are accepted;
73
+ - data descriptors are read without invoking accessors;
74
+ - symbols, cycles, sparse arrays, and non-JSON values are rejected;
75
+ - output contains no insignificant whitespace.
76
+
77
+ `canonicalizeBytes` encodes the resulting string as UTF-8. It uses
78
+ `TextEncoder` where available and includes a small standards-compatible
79
+ fallback for older environments.
80
+
81
+ ## Resource accounting
82
+
83
+ The engine tracks:
84
+
85
+ - container depth;
86
+ - visited object keys and array positions;
87
+ - UTF-16 output length.
88
+
89
+ Limit errors include a structured kind, configured limit, and a path such as
90
+ `<root>.request.headers` or `<root>.items[4]`.
91
+
92
+ ## Distribution
93
+
94
+ One source module builds to:
95
+
96
+ - `dist/index.js` for ESM;
97
+ - `dist/index.cjs` for callable CommonJS;
98
+ - `dist/index.min.js` for the `StacklineStableStringify` browser global;
99
+ - resolver-specific `.d.mts`, `.d.cts`, and `.d.ts` declarations;
100
+ - source maps for every JavaScript artifact.
101
+
102
+ The build banner identifies package version and MIT license. Package tests load
103
+ all three JavaScript forms and execute the browser artifact in an isolated VM.
@@ -0,0 +1,25 @@
1
+ # Benchmark Methodology
2
+
3
+ The benchmark runs native `JSON.stringify`,
4
+ `fast-json-stable-stringify@2.1.0`, stable mode, safe mode, and RFC 8785 mode
5
+ against the same representative payload in one Node.js process.
6
+
7
+ ```bash
8
+ npm ci
9
+ npm run benchmark
10
+ ```
11
+
12
+ Control the sample size with `BENCHMARK_ITERATIONS`:
13
+
14
+ ```bash
15
+ BENCHMARK_ITERATIONS=250000 npm run benchmark
16
+ ```
17
+
18
+ Native JSON is a throughput baseline only. It does not recursively sort object
19
+ keys and is not behaviorally equivalent. Stable, safe, and canonical modes
20
+ also implement different contracts, so compare a mode only with alternatives
21
+ that provide the same guarantees.
22
+
23
+ When publishing results, include the command, Node.js version, CPU, complete
24
+ raw output, and payload shape. Do not present one machine's result as a
25
+ universal ranking.
@@ -0,0 +1,79 @@
1
+ # Compatibility
2
+
3
+ ## Default contract
4
+
5
+ The default export follows documented `fast-json-stable-stringify@2.1.0`
6
+ behavior:
7
+
8
+ - object keys are sorted recursively;
9
+ - arrays retain their order;
10
+ - a comparator receives `{ key, value }` records;
11
+ - comparator functions can be passed directly or as `cmp`;
12
+ - `{ cycles: true }` writes `__cycle__` for circular objects;
13
+ - `toJSON` runs before value serialization;
14
+ - JSON omission, primitive, wrapper-object, and non-finite number behavior is
15
+ preserved.
16
+
17
+ The suite performs 30,000 deterministic differential serializations across
18
+ generated JSON-compatible values, comparators, and option forms.
19
+
20
+ ## Intentional additions
21
+
22
+ | Area | Compatible default | Addition |
23
+ | :--- | :--- | :--- |
24
+ | Circular arrays | Upstream can overflow | Same policy as circular objects |
25
+ | Deep input | Recursive stack limit | Iterative traversal |
26
+ | Cycles | Throw or `__cycle__` | Path, null, and custom marker policies |
27
+ | BigInt | Throw | String or safe-number policies |
28
+ | Replacer | Not exposed | Function and JSON property list |
29
+ | Formatting | Compact | JSON-style `space` option |
30
+ | Accessors | Invoke | Omit or throw policies |
31
+ | Resources | Unbounded | Opt-in depth, entry, and length limits |
32
+ | Diagnostics | Separate ecosystem | `safeStringify` named export |
33
+ | Canonical JSON | Separate ecosystem | RFC 8785 string and byte exports |
34
+
35
+ No addition changes output unless its option or named API is used, except that
36
+ circular arrays now return the configured cycle behavior instead of causing a
37
+ call-stack failure.
38
+
39
+ ## Package forms
40
+
41
+ | Consumer | Supported form |
42
+ | :--- | :--- |
43
+ | ESM | default and named imports |
44
+ | CommonJS | callable `require()` plus static helpers |
45
+ | Browser | `StacklineStableStringify` global |
46
+ | TypeScript | resolver-specific declarations |
47
+ | npm alias | `fast-json-stable-stringify@npm:@stackline/stable-stringify` |
48
+
49
+ ## TypeScript
50
+
51
+ The public declarations use syntax accepted by TypeScript 3.9. ESM-specific
52
+ `.d.mts` resolution is validated from TypeScript 4.7 onward. The release matrix
53
+ currently covers 3.9.10, 4.7.4, 4.9.5, 5.9.3, 6.0.2, and 7.0.2.
54
+
55
+ Return types remain `string | undefined`, matching JSON root-value behavior.
56
+ Canonical APIs return `string` or `Uint8Array` because invalid values throw.
57
+
58
+ ## Migration
59
+
60
+ Direct migration:
61
+
62
+ ```js
63
+ import stringify from '@stackline/stable-stringify';
64
+ ```
65
+
66
+ No-import-change migration:
67
+
68
+ ```bash
69
+ npm install fast-json-stable-stringify@npm:@stackline/stable-stringify
70
+ ```
71
+
72
+ The clean-install test executes both names in ESM and CommonJS from the packed
73
+ tarball, rather than resolving against the development workspace.
74
+
75
+ ## Standards boundary
76
+
77
+ Stable output is deterministic for the same JavaScript data and options. It is
78
+ not automatically RFC 8785 canonical output. Use `canonicalize` when another
79
+ system, signature specification, or protocol requires JCS.
@@ -0,0 +1,100 @@
1
+ # Market Research
2
+
3
+ ## Decision
4
+
5
+ The selected opportunity is a unified deterministic JSON serializer with a
6
+ compatible stable API, safe diagnostic mode, and RFC 8785 canonical mode.
7
+
8
+ It addresses a mature, high-volume need without copying an abandoned codebase.
9
+ The runtime is original; comparison packages are development references only.
10
+
11
+ ## Evidence window
12
+
13
+ The research uses the official npm downloads and registry APIs. The fixed
14
+ 30-day window is 2026-07-17 through 2026-08-15. The comparison window is
15
+ 2026-06-17 through 2026-07-16. Fixed dates make the findings reproducible.
16
+
17
+ | Package | Recent 30 days | Prior 30 days | Change | Latest release |
18
+ | :--- | ---: | ---: | ---: | :--- |
19
+ | `fast-json-stable-stringify` | 587,334,858 | 581,507,983 | +1.00% | 2.1.0, 2019-12-14 |
20
+ | `safe-stable-stringify` | 210,997,298 | 206,370,668 | +2.24% | 2.5.0, 2024-08-24 |
21
+ | `fast-safe-stringify` | 172,544,640 | 161,813,217 | +6.63% | 2.1.1, 2021-09-08 |
22
+ | `json-stringify-safe` | 157,096,721 | 154,552,336 | +1.65% | 5.0.1, 2015-05-19 |
23
+ | **Combined package activity** | **1,127,973,517** | **1,104,244,204** | **+2.15%** | four contracts |
24
+
25
+ The same packages recorded 9,395,146,202 combined downloads from 2025-08-16
26
+ through 2026-08-15.
27
+
28
+ These sums measure package activity, not unique users. Dependency trees can
29
+ install more than one package and repeated CI installs count again. The figures
30
+ demonstrate category scale and fragmentation; they do not guarantee adoption
31
+ for a new package.
32
+
33
+ ## Primary sources
34
+
35
+ - [fast-json-stable-stringify downloads](https://api.npmjs.org/downloads/point/2026-07-17:2026-08-15/fast-json-stable-stringify)
36
+ - [safe-stable-stringify downloads](https://api.npmjs.org/downloads/point/2026-07-17:2026-08-15/safe-stable-stringify)
37
+ - [fast-safe-stringify downloads](https://api.npmjs.org/downloads/point/2026-07-17:2026-08-15/fast-safe-stringify)
38
+ - [json-stringify-safe downloads](https://api.npmjs.org/downloads/point/2026-07-17:2026-08-15/json-stringify-safe)
39
+ - [npm registry metadata](https://registry.npmjs.org/fast-json-stable-stringify)
40
+ - [RFC 8785: JSON Canonicalization Scheme](https://www.rfc-editor.org/rfc/rfc8785.html)
41
+ - [ECMAScript JSON.stringify algorithm](https://tc39.es/ecma262/multipage/structured-data.html#sec-json.stringify)
42
+
43
+ ## Product gap
44
+
45
+ The category is split by concern:
46
+
47
+ - the largest compatibility package offers stable key order but no current ESM
48
+ declaration surface, safe diagnostic mode, resource limits, or JCS API;
49
+ - safe serializers focus on cycles and logging but differ in BigInt, getter,
50
+ `toJSON`, depth, edge, and fallback behavior;
51
+ - canonical JSON implementations form another package category even though
52
+ cache keys and signatures often exist in the same systems;
53
+ - several established releases are between two and eleven years old while
54
+ download activity continues to grow.
55
+
56
+ Open issue themes in the comparison repositories include ESM, TypeScript
57
+ options, RFC 8785 support, wrapper semantics, output limits, getters, `toJSON`,
58
+ BigInt, and deep-stack behavior. The product contract directly tests those
59
+ boundaries instead of bundling unrelated utilities.
60
+
61
+ ## Why this shape can grow
62
+
63
+ The adoption path has three levels:
64
+
65
+ 1. existing users can keep the established function signature;
66
+ 2. npm alias users can keep the existing import specifier;
67
+ 3. new users gain safe and canonical modes without adding two more packages.
68
+
69
+ Zero runtime dependencies reduce supply-chain exposure. TypeScript 3.9 through
70
+ 7.0, Node.js 14.17+, browsers, Deno, and Bun widen the usable install base.
71
+
72
+ ## Rejected directions
73
+
74
+ ### Another generic utility collection
75
+
76
+ Broad utility packages compete on dozens of unrelated APIs and create a larger
77
+ maintenance and security surface. The selected package owns one data boundary.
78
+
79
+ ### Canonical JSON only
80
+
81
+ Standards compliance is valuable but is a smaller migration surface. Combining
82
+ it with the established stable call shape creates a practical entry point.
83
+
84
+ ### Forking a legacy serializer
85
+
86
+ Forking would accelerate initial code volume but inherit architecture and
87
+ maintenance constraints. Behavioral compatibility is validated through tests;
88
+ the runtime remains independently designed and licensed.
89
+
90
+ ## Success metrics
91
+
92
+ Potential is evaluated through measurable signals, not a promised download
93
+ number:
94
+
95
+ - direct and alias installs that need no code changes;
96
+ - issue resolution time and compatibility reports;
97
+ - reverse dependencies and weekly npm downloads;
98
+ - bundle size and runtime dependency count;
99
+ - regression-free releases across the supported matrix;
100
+ - adoption of safe and canonical named APIs.
@@ -0,0 +1,68 @@
1
+ # Releasing
2
+
3
+ ## Preconditions
4
+
5
+ - `main` is the only default development branch.
6
+ - Version and changelog agree.
7
+ - Runtime dependencies remain zero or the exception is documented.
8
+ - The full local suite and GitHub CI pass.
9
+ - The npm and Verdaccio package names are available or authenticated.
10
+
11
+ ## Local release gate
12
+
13
+ ```bash
14
+ npm ci
15
+ npm test
16
+ npm run test:attw
17
+ npm run audit:dependencies
18
+ npm pack --dry-run
19
+ ```
20
+
21
+ Run the benchmark for regression evidence, not as a pass/fail release gate.
22
+
23
+ ## Artifact creation
24
+
25
+ Build once and retain one immutable tarball:
26
+
27
+ ```bash
28
+ version="$(node -p "require('./package.json').version")"
29
+ mkdir -p "release/$version"
30
+ npm pack --ignore-scripts --pack-destination "release/$version"
31
+ (cd "release/$version" && sha512sum *.tgz > SHA512SUMS)
32
+ npm sbom --omit=dev --sbom-format cyclonedx > "release/$version/sbom.cdx.json"
33
+ ```
34
+
35
+ Run `scripts/smoke-install.mjs` against the retained path. The same bytes must
36
+ be published to Verdaccio and public npm.
37
+
38
+ ## Registry order
39
+
40
+ 1. publish the retained tarball to Verdaccio;
41
+ 2. install directly and through the compatibility alias;
42
+ 3. compare tarball integrity and run smoke tests;
43
+ 4. run `publish.yml` with the expected SHA-512; the trusted workflow rebuilds
44
+ the reviewed commit and stops unless its tarball is byte-identical;
45
+ 5. let the workflow publish with npm provenance, then download it and compare
46
+ SHA-512;
47
+ 6. verify `latest`, provenance metadata, dependency audit, and registry
48
+ signature where available.
49
+
50
+ Never rebuild between registry publications.
51
+
52
+ ## GitHub release
53
+
54
+ Tag the exact tested commit as `vX.Y.Z`. Attach the tarball, `SHA512SUMS`, and
55
+ CycloneDX SBOM. Confirm CI and CodeQL are green for the tagged source.
56
+
57
+ ## Documentation
58
+
59
+ Build and test the static site, deploy it under
60
+ `/docs/vanilla/stable-stringify/`, update the central sitemap, and verify HTML,
61
+ CSS, JavaScript, image, robots, sitemap, metadata, LLM references, mobile
62
+ layout, and playground behavior in production.
63
+
64
+ ## Rollback
65
+
66
+ npm versions are immutable. Do not unpublish a consumed release except for a
67
+ compelling security or legal reason. Deprecate a bad version with a precise
68
+ message and publish a patch from the last known-good source.
@@ -0,0 +1,12 @@
1
+ import assert from 'node:assert/strict';
2
+
3
+ import stringify from '@stackline/stable-stringify';
4
+
5
+ const first = { query: { page: 2, status: 'open' }, tenant: 42 };
6
+ const second = { tenant: 42, query: { status: 'open', page: 2 } };
7
+
8
+ const firstKey = stringify(first);
9
+ const secondKey = stringify(second);
10
+
11
+ assert.equal(firstKey, secondKey);
12
+ console.log(firstKey);
@@ -0,0 +1,17 @@
1
+ import assert from 'node:assert/strict';
2
+ import { createHash } from 'node:crypto';
3
+
4
+ import { canonicalizeBytes } from '@stackline/stable-stringify';
5
+
6
+ const document = {
7
+ issuedAt: '2026-08-21T00:00:00Z',
8
+ subject: 'release-manifest',
9
+ version: 1
10
+ };
11
+
12
+ const digest = createHash('sha256')
13
+ .update(canonicalizeBytes(document))
14
+ .digest('hex');
15
+
16
+ assert.equal(digest.length, 64);
17
+ console.log(digest);