You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					91 lines
				
				3.4 KiB
			
		
		
			
		
	
	
					91 lines
				
				3.4 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								"use strict";
							 | 
						||
| 
								 | 
							
								Object.defineProperty(exports, "__esModule", { value: true });
							 | 
						||
| 
								 | 
							
								exports.stringify = void 0;
							 | 
						||
| 
								 | 
							
								const stringify_1 = require("./stringify");
							 | 
						||
| 
								 | 
							
								const quote_1 = require("./quote");
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * Root path node.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								const ROOT_SENTINEL = Symbol("root");
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * Stringify any JavaScript value.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								function stringify(value, replacer, indent, options = {}) {
							 | 
						||
| 
								 | 
							
								    const space = typeof indent === "string" ? indent : " ".repeat(indent || 0);
							 | 
						||
| 
								 | 
							
								    const path = [];
							 | 
						||
| 
								 | 
							
								    const stack = new Set();
							 | 
						||
| 
								 | 
							
								    const tracking = new Map();
							 | 
						||
| 
								 | 
							
								    const unpack = new Map();
							 | 
						||
| 
								 | 
							
								    let valueCount = 0;
							 | 
						||
| 
								 | 
							
								    const { maxDepth = 100, references = false, skipUndefinedProperties = false, maxValues = 100000, } = options;
							 | 
						||
| 
								 | 
							
								    // Wrap replacer function to support falling back on supported stringify.
							 | 
						||
| 
								 | 
							
								    const valueToString = replacerToString(replacer);
							 | 
						||
| 
								 | 
							
								    // Every time you call `next(value)` execute this function.
							 | 
						||
| 
								 | 
							
								    const onNext = (value, key) => {
							 | 
						||
| 
								 | 
							
								        if (++valueCount > maxValues)
							 | 
						||
| 
								 | 
							
								            return;
							 | 
						||
| 
								 | 
							
								        if (skipUndefinedProperties && value === undefined)
							 | 
						||
| 
								 | 
							
								            return;
							 | 
						||
| 
								 | 
							
								        if (path.length > maxDepth)
							 | 
						||
| 
								 | 
							
								            return;
							 | 
						||
| 
								 | 
							
								        // An undefined key is treated as an out-of-band "value".
							 | 
						||
| 
								 | 
							
								        if (key === undefined)
							 | 
						||
| 
								 | 
							
								            return valueToString(value, space, onNext, key);
							 | 
						||
| 
								 | 
							
								        path.push(key);
							 | 
						||
| 
								 | 
							
								        const result = builder(value, key === ROOT_SENTINEL ? undefined : key);
							 | 
						||
| 
								 | 
							
								        path.pop();
							 | 
						||
| 
								 | 
							
								        return result;
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								    const builder = references
							 | 
						||
| 
								 | 
							
								        ? (value, key) => {
							 | 
						||
| 
								 | 
							
								            if (value !== null &&
							 | 
						||
| 
								 | 
							
								                (typeof value === "object" ||
							 | 
						||
| 
								 | 
							
								                    typeof value === "function" ||
							 | 
						||
| 
								 | 
							
								                    typeof value === "symbol")) {
							 | 
						||
| 
								 | 
							
								                // Track nodes to restore later.
							 | 
						||
| 
								 | 
							
								                if (tracking.has(value)) {
							 | 
						||
| 
								 | 
							
								                    unpack.set(path.slice(1), tracking.get(value));
							 | 
						||
| 
								 | 
							
								                    // Use `undefined` as temporaray stand-in for referenced nodes
							 | 
						||
| 
								 | 
							
								                    return valueToString(undefined, space, onNext, key);
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								                // Track encountered nodes.
							 | 
						||
| 
								 | 
							
								                tracking.set(value, path.slice(1));
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            return valueToString(value, space, onNext, key);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        : (value, key) => {
							 | 
						||
| 
								 | 
							
								            // Stop on recursion.
							 | 
						||
| 
								 | 
							
								            if (stack.has(value))
							 | 
						||
| 
								 | 
							
								                return;
							 | 
						||
| 
								 | 
							
								            stack.add(value);
							 | 
						||
| 
								 | 
							
								            const result = valueToString(value, space, onNext, key);
							 | 
						||
| 
								 | 
							
								            stack.delete(value);
							 | 
						||
| 
								 | 
							
								            return result;
							 | 
						||
| 
								 | 
							
								        };
							 | 
						||
| 
								 | 
							
								    const result = onNext(value, ROOT_SENTINEL);
							 | 
						||
| 
								 | 
							
								    // Attempt to restore circular references.
							 | 
						||
| 
								 | 
							
								    if (unpack.size) {
							 | 
						||
| 
								 | 
							
								        const sp = space ? " " : "";
							 | 
						||
| 
								 | 
							
								        const eol = space ? "\n" : "";
							 | 
						||
| 
								 | 
							
								        let wrapper = `var x${sp}=${sp}${result};${eol}`;
							 | 
						||
| 
								 | 
							
								        for (const [key, value] of unpack.entries()) {
							 | 
						||
| 
								 | 
							
								            const keyPath = quote_1.stringifyPath(key, onNext);
							 | 
						||
| 
								 | 
							
								            const valuePath = quote_1.stringifyPath(value, onNext);
							 | 
						||
| 
								 | 
							
								            wrapper += `x${keyPath}${sp}=${sp}x${valuePath};${eol}`;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        return `(function${sp}()${sp}{${eol}${wrapper}return x;${eol}}())`;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return result;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								exports.stringify = stringify;
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * Create `toString()` function from replacer.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								function replacerToString(replacer) {
							 | 
						||
| 
								 | 
							
								    if (!replacer)
							 | 
						||
| 
								 | 
							
								        return stringify_1.toString;
							 | 
						||
| 
								 | 
							
								    return (value, space, next, key) => {
							 | 
						||
| 
								 | 
							
								        return replacer(value, space, (value) => stringify_1.toString(value, space, next, key), key);
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								//# sourceMappingURL=index.js.map
							 |