This commit is contained in:
tatianamac
2019-11-26 14:50:43 -08:00
parent 8a55660ed0
commit 6d5445ecc5
13894 changed files with 2233957 additions and 0 deletions

5
node_modules/javascript-stringify/dist/array.d.ts generated vendored Normal file
View File

@ -0,0 +1,5 @@
import { ToString } from "./types";
/**
* Stringify an array of values.
*/
export declare const arrayToString: ToString;

19
node_modules/javascript-stringify/dist/array.js generated vendored Normal file
View File

@ -0,0 +1,19 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
/**
* Stringify an array of values.
*/
exports.arrayToString = (array, space, next) => {
// Map array values to their stringified values with correct indentation.
const values = array
.map(function (value, index) {
const result = next(value, index);
if (result === undefined)
return String(result);
return space + result.split("\n").join(`\n${space}`);
})
.join(space ? ",\n" : ",");
const eol = space && values ? "\n" : "";
return `[${eol}${values}${eol}]`;
};
//# sourceMappingURL=array.js.map

1
node_modules/javascript-stringify/dist/array.js.map generated vendored Normal file
View File

@ -0,0 +1 @@
{"version":3,"file":"array.js","sourceRoot":"","sources":["../src/array.ts"],"names":[],"mappings":";;AAEA;;GAEG;AACU,QAAA,aAAa,GAAa,CAAC,KAAY,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;IACnE,yEAAyE;IACzE,MAAM,MAAM,GAAG,KAAK;SACjB,GAAG,CAAC,UAAS,KAAK,EAAE,KAAK;QACxB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAElC,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC;QAEhD,OAAO,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;IACvD,CAAC,CAAC;SACD,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAE7B,MAAM,GAAG,GAAG,KAAK,IAAI,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IACxC,OAAO,IAAI,GAAG,GAAG,MAAM,GAAG,GAAG,GAAG,CAAC;AACnC,CAAC,CAAC","sourcesContent":["import { ToString } from \"./types\";\n\n/**\n * Stringify an array of values.\n */\nexport const arrayToString: ToString = (array: any[], space, next) => {\n // Map array values to their stringified values with correct indentation.\n const values = array\n .map(function(value, index) {\n const result = next(value, index);\n\n if (result === undefined) return String(result);\n\n return space + result.split(\"\\n\").join(`\\n${space}`);\n })\n .join(space ? \",\\n\" : \",\");\n\n const eol = space && values ? \"\\n\" : \"\";\n return `[${eol}${values}${eol}]`;\n};\n"]}

85
node_modules/javascript-stringify/dist/function.d.ts generated vendored Normal file
View File

@ -0,0 +1,85 @@
import { Next, ToString } from "./types";
declare const FUNCTION_PREFIXES: {
Function: string;
GeneratorFunction: string;
AsyncFunction: string;
AsyncGeneratorFunction: string;
};
/**
* Track function parser usage.
*/
export declare const USED_METHOD_KEY: WeakSet<Function>;
/**
* Stringify a function.
*/
export declare const functionToString: ToString;
/**
* Rewrite a stringified function to remove initial indentation.
*/
export declare function dedentFunction(fnString: string): string;
/**
* Function parser and stringify.
*/
export declare class FunctionParser {
fn: Function;
indent: string;
next: Next;
key?: string | undefined;
fnString: string;
fnType: keyof typeof FUNCTION_PREFIXES;
keyQuote: string | undefined;
keyPrefix: string;
isMethodCandidate: boolean;
pos: number;
hadKeyword: boolean;
constructor(fn: Function, indent: string, next: Next, key?: string | undefined);
stringify(): string;
getPrefix(): string;
tryParse(): string | undefined;
/**
* Attempt to parse the function from the current position by first stripping
* the function's name from the front. This is not a fool-proof method on all
* JavaScript engines, but yields good results on Node.js 4 (and slightly
* less good results on Node.js 6 and 8).
*/
tryStrippingName(): string | undefined;
/**
* Attempt to advance the parser past the keywords expected to be at the
* start of this function's definition. This method sets `this.hadKeyword`
* based on whether or not a `function` keyword is consumed.
*
* @return {boolean}
*/
tryParsePrefixTokens(): boolean;
/**
* Advance the parser past one element of JavaScript syntax. This could be a
* matched pair of delimiters, like braces or parentheses, or an atomic unit
* like a keyword, variable, or operator. Return a normalized string
* representation of the element parsed--for example, returns '{}' for a
* matched pair of braces. Comments and whitespace are skipped.
*
* (This isn't a full parser, so the token scanning logic used here is as
* simple as it can be. As a consequence, some things that are one token in
* JavaScript, like decimal number literals or most multicharacter operators
* like '&&', are split into more than one token here. However, awareness of
* some multicharacter sequences like '=>' is necessary, so we match the few
* of them that we care about.)
*/
consumeSyntax(wordLikeToken?: string): string | undefined;
consumeSyntaxUntil(startToken: string, endToken: string): string | undefined;
consumeMatch(re: RegExp): RegExpExecArray | null;
/**
* Advance the parser past an arbitrary regular expression. Return `token`,
* or the match object of the regexp.
*/
consumeRegExp(re: RegExp, token: string): string | undefined;
/**
* Advance the parser past a template string.
*/
consumeTemplate(): "`" | undefined;
/**
* Advance the parser past any whitespace or comments.
*/
consumeWhitespace(): void;
}
export {};

303
node_modules/javascript-stringify/dist/function.js generated vendored Normal file
View File

@ -0,0 +1,303 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const quote_1 = require("./quote");
/**
* Used in function stringification.
*/
/* istanbul ignore next */
const METHOD_NAMES_ARE_QUOTED = {
" "() {
/* Empty. */
}
}[" "]
.toString()
.charAt(0) === '"';
const FUNCTION_PREFIXES = {
Function: "function ",
GeneratorFunction: "function* ",
AsyncFunction: "async function ",
AsyncGeneratorFunction: "async function* "
};
const METHOD_PREFIXES = {
Function: "",
GeneratorFunction: "*",
AsyncFunction: "async ",
AsyncGeneratorFunction: "async *"
};
const TOKENS_PRECEDING_REGEXPS = new Set(("case delete else in instanceof new return throw typeof void " +
", ; : + - ! ~ & | ^ * / % < > ? =").split(" "));
/**
* Track function parser usage.
*/
exports.USED_METHOD_KEY = new WeakSet();
/**
* Stringify a function.
*/
exports.functionToString = (fn, space, next, key) => {
const name = typeof key === "string" ? key : undefined;
// Track in function parser for object stringify to avoid duplicate output.
if (name !== undefined)
exports.USED_METHOD_KEY.add(fn);
return new FunctionParser(fn, space, next, name).stringify();
};
/**
* Rewrite a stringified function to remove initial indentation.
*/
function dedentFunction(fnString) {
let found;
for (const line of fnString.split("\n").slice(1)) {
const m = /^[\s\t]+/.exec(line);
if (!m)
return fnString; // Early exit without indent.
const [str] = m;
if (found === undefined)
found = str;
else if (str.length < found.length)
found = str;
}
return found ? fnString.split(`\n${found}`).join("\n") : fnString;
}
exports.dedentFunction = dedentFunction;
/**
* Function parser and stringify.
*/
class FunctionParser {
constructor(fn, indent, next, key) {
this.fn = fn;
this.indent = indent;
this.next = next;
this.key = key;
this.pos = 0;
this.hadKeyword = false;
this.fnString = Function.prototype.toString.call(fn);
this.fnType = fn.constructor.name;
this.keyQuote = key === undefined ? "" : quote_1.quoteKey(key, next);
this.keyPrefix =
key === undefined ? "" : `${this.keyQuote}:${indent ? " " : ""}`;
this.isMethodCandidate =
key === undefined ? false : this.fn.name === "" || this.fn.name === key;
}
stringify() {
const value = this.tryParse();
// If we can't stringify this function, return a void expression; for
// bonus help with debugging, include the function as a string literal.
if (!value) {
return `${this.keyPrefix}void ${this.next(this.fnString)}`;
}
return dedentFunction(value);
}
getPrefix() {
if (this.isMethodCandidate && !this.hadKeyword) {
return METHOD_PREFIXES[this.fnType] + this.keyQuote;
}
return this.keyPrefix + FUNCTION_PREFIXES[this.fnType];
}
tryParse() {
if (this.fnString[this.fnString.length - 1] !== "}") {
// Must be an arrow function.
return this.keyPrefix + this.fnString;
}
// Attempt to remove function prefix.
if (this.fn.name) {
const result = this.tryStrippingName();
if (result)
return result;
}
// Support class expressions.
const prevPos = this.pos;
if (this.consumeSyntax() === "class")
return this.fnString;
this.pos = prevPos;
if (this.tryParsePrefixTokens()) {
const result = this.tryStrippingName();
if (result)
return result;
let offset = this.pos;
switch (this.consumeSyntax("WORD_LIKE")) {
case "WORD_LIKE":
if (this.isMethodCandidate && !this.hadKeyword) {
offset = this.pos;
}
// tslint:disable-next-line no-switch-case-fall-through
case "()":
if (this.fnString.substr(this.pos, 2) === "=>") {
return this.keyPrefix + this.fnString;
}
this.pos = offset;
// tslint:disable-next-line no-switch-case-fall-through
case '"':
case "'":
case "[]":
return this.getPrefix() + this.fnString.substr(this.pos);
}
}
}
/**
* Attempt to parse the function from the current position by first stripping
* the function's name from the front. This is not a fool-proof method on all
* JavaScript engines, but yields good results on Node.js 4 (and slightly
* less good results on Node.js 6 and 8).
*/
tryStrippingName() {
if (METHOD_NAMES_ARE_QUOTED) {
// ... then this approach is unnecessary and yields false positives.
return;
}
let start = this.pos;
const prefix = this.fnString.substr(this.pos, this.fn.name.length);
if (prefix === this.fn.name) {
this.pos += prefix.length;
if (this.consumeSyntax() === "()" &&
this.consumeSyntax() === "{}" &&
this.pos === this.fnString.length) {
// Don't include the function's name if it will be included in the
// prefix, or if it's invalid as a name in a function expression.
if (this.isMethodCandidate || !quote_1.isValidVariableName(prefix)) {
start += prefix.length;
}
return this.getPrefix() + this.fnString.substr(start);
}
}
this.pos = start;
}
/**
* Attempt to advance the parser past the keywords expected to be at the
* start of this function's definition. This method sets `this.hadKeyword`
* based on whether or not a `function` keyword is consumed.
*
* @return {boolean}
*/
tryParsePrefixTokens() {
let posPrev = this.pos;
this.hadKeyword = false;
switch (this.fnType) {
case "AsyncFunction":
if (this.consumeSyntax() !== "async")
return false;
posPrev = this.pos;
// tslint:disable-next-line no-switch-case-fall-through
case "Function":
if (this.consumeSyntax() === "function") {
this.hadKeyword = true;
}
else {
this.pos = posPrev;
}
return true;
case "AsyncGeneratorFunction":
if (this.consumeSyntax() !== "async")
return false;
// tslint:disable-next-line no-switch-case-fall-through
case "GeneratorFunction":
let token = this.consumeSyntax();
if (token === "function") {
token = this.consumeSyntax();
this.hadKeyword = true;
}
return token === "*";
}
}
/**
* Advance the parser past one element of JavaScript syntax. This could be a
* matched pair of delimiters, like braces or parentheses, or an atomic unit
* like a keyword, variable, or operator. Return a normalized string
* representation of the element parsed--for example, returns '{}' for a
* matched pair of braces. Comments and whitespace are skipped.
*
* (This isn't a full parser, so the token scanning logic used here is as
* simple as it can be. As a consequence, some things that are one token in
* JavaScript, like decimal number literals or most multicharacter operators
* like '&&', are split into more than one token here. However, awareness of
* some multicharacter sequences like '=>' is necessary, so we match the few
* of them that we care about.)
*/
consumeSyntax(wordLikeToken) {
const m = this.consumeMatch(/^(?:([A-Za-z_0-9$\xA0-\uFFFF]+)|=>|\+\+|\-\-|.)/);
if (!m)
return;
const [token, match] = m;
this.consumeWhitespace();
if (match)
return wordLikeToken || match;
switch (token) {
case "(":
return this.consumeSyntaxUntil("(", ")");
case "[":
return this.consumeSyntaxUntil("[", "]");
case "{":
return this.consumeSyntaxUntil("{", "}");
case "`":
return this.consumeTemplate();
case '"':
return this.consumeRegExp(/^(?:[^\\"]|\\.)*"/, '"');
case "'":
return this.consumeRegExp(/^(?:[^\\']|\\.)*'/, "'");
}
return token;
}
consumeSyntaxUntil(startToken, endToken) {
let isRegExpAllowed = true;
for (;;) {
const token = this.consumeSyntax();
if (token === endToken)
return startToken + endToken;
if (!token || token === ")" || token === "]" || token === "}")
return;
if (token === "/" &&
isRegExpAllowed &&
this.consumeMatch(/^(?:\\.|[^\\\/\n[]|\[(?:\\.|[^\]])*\])+\/[a-z]*/)) {
isRegExpAllowed = false;
this.consumeWhitespace();
}
else {
isRegExpAllowed = TOKENS_PRECEDING_REGEXPS.has(token);
}
}
}
consumeMatch(re) {
const m = re.exec(this.fnString.substr(this.pos));
if (m)
this.pos += m[0].length;
return m;
}
/**
* Advance the parser past an arbitrary regular expression. Return `token`,
* or the match object of the regexp.
*/
consumeRegExp(re, token) {
const m = re.exec(this.fnString.substr(this.pos));
if (!m)
return;
this.pos += m[0].length;
this.consumeWhitespace();
return token;
}
/**
* Advance the parser past a template string.
*/
consumeTemplate() {
for (;;) {
this.consumeMatch(/^(?:[^`$\\]|\\.|\$(?!{))*/);
if (this.fnString[this.pos] === "`") {
this.pos++;
this.consumeWhitespace();
return "`";
}
if (this.fnString.substr(this.pos, 2) === "${") {
this.pos += 2;
this.consumeWhitespace();
if (this.consumeSyntaxUntil("{", "}"))
continue;
}
return;
}
}
/**
* Advance the parser past any whitespace or comments.
*/
consumeWhitespace() {
this.consumeMatch(/^(?:\s|\/\/.*|\/\*[^]*?\*\/)*/);
}
}
exports.FunctionParser = FunctionParser;
//# sourceMappingURL=function.js.map

File diff suppressed because one or more lines are too long

11
node_modules/javascript-stringify/dist/index.d.ts generated vendored Normal file
View File

@ -0,0 +1,11 @@
import { ToString } from "./types";
export interface Options {
maxDepth?: number;
maxValues?: number;
references?: boolean;
skipUndefinedProperties?: boolean;
}
/**
* Stringify any JavaScript value.
*/
export declare function stringify(value: any, replacer?: ToString | null, indent?: string | number | null, options?: Options): string | undefined;

89
node_modules/javascript-stringify/dist/index.js generated vendored Normal file
View File

@ -0,0 +1,89 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
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));
return; // Avoid serializing referenced nodes on an expression.
}
// 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

1
node_modules/javascript-stringify/dist/index.js.map generated vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
export {};

521
node_modules/javascript-stringify/dist/index.spec.js generated vendored Normal file
View File

@ -0,0 +1,521 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const fc = require("fast-check");
const semver_1 = require("semver");
const index_1 = require("./index");
// Evaluate a string into JavaScript
const evalValue = (str) => {
// tslint:disable-next-line no-eval
return eval(`(${str})`);
};
/**
* Create a quick test function wrapper.
*/
function test(value, result, indent, options) {
return () => {
expect(index_1.stringify(value, null, indent, options)).toEqual(result);
};
}
/**
* Create a wrapper for round-trip eval tests.
*/
function testRoundTrip(expression, indent, options) {
return () => test(evalValue(expression), expression, indent, options)();
}
/**
* Check if syntax is supported.
*/
function isSupported(expr) {
try {
// tslint:disable-next-line no-eval
eval(expr);
return true;
}
catch (err) {
if (err.name === "SyntaxError")
return false;
throw err;
}
}
/**
* Generate a list of test cases to run.
*/
function cases(cases) {
return () => {
for (const value of cases) {
if (value)
it(value, testRoundTrip(value));
}
};
}
/**
* Conditionally execute test cases.
*/
function describeIf(description, condition, fn) {
return condition ? describe(description, fn) : describe.skip(description, fn);
}
describe("javascript-stringify", () => {
describe("types", () => {
describe("booleans", () => {
it("should be stringified", test(true, "true"));
});
describe("strings", () => {
it("should wrap in single quotes", test("string", "'string'"));
it("should escape quote characters", test("'test'", "'\\'test\\''"));
it("should escape control characters", test("multi\nline", "'multi\\nline'"));
it("should escape back slashes", test("back\\slash", "'back\\\\slash'"));
it("should escape certain unicode sequences", test("\u0602", "'\\u0602'"));
});
describe("numbers", () => {
it("should stringify integers", test(10, "10"));
it("should stringify floats", test(10.5, "10.5"));
it('should stringify "NaN"', test(10.5, "10.5"));
it('should stringify "Infinity"', test(Infinity, "Infinity"));
it('should stringify "-Infinity"', test(-Infinity, "-Infinity"));
it('should stringify "-0"', test(-0, "-0"));
});
describe("arrays", () => {
it("should stringify as array shorthand", test([1, 2, 3], "[1,2,3]"));
it("should indent elements", test([{ x: 10 }], "[\n\t{\n\t\tx: 10\n\t}\n]", "\t"));
});
describe("objects", () => {
it("should stringify as object shorthand", test({ key: "value", "-": 10 }, "{key:'value','-':10}"));
it("should stringify undefined keys", test({ a: true, b: undefined }, "{a:true,b:undefined}"));
it("should stringify omit undefined keys", test({ a: true, b: undefined }, "{a:true}", null, {
skipUndefinedProperties: true
}));
it("should quote reserved word keys", test({ if: true, else: false }, "{'if':true,'else':false}"));
it("should not quote Object.prototype keys", test({ constructor: 1, toString: 2 }, "{constructor:1,toString:2}"));
});
describe("functions", () => {
it("should reindent function bodies", test(evalValue(`function() {
if (true) {
return "hello";
}
}`), 'function () {\n if (true) {\n return "hello";\n }\n}', 2));
it("should reindent function bodies in objects", test(evalValue(`
{
fn: function() {
if (true) {
return "hello";
}
}
}
`), '{\n fn: function () {\n if (true) {\n return "hello";\n }\n }\n}', 2));
it("should reindent function bodies in arrays", test(evalValue(`[
function() {
if (true) {
return "hello";
}
}
]`), '[\n function () {\n if (true) {\n return "hello";\n }\n }\n]', 2));
it("should not need to reindent one-liners", testRoundTrip("{\n fn: function () { return; }\n}", 2));
it("should gracefully handle unexpected Function.toString formats", () => {
const origToString = Function.prototype.toString;
Function.prototype.toString = () => "{nope}";
try {
expect(index_1.stringify(function () {
/* Empty */
})).toEqual("void '{nope}'");
}
finally {
Function.prototype.toString = origToString;
}
});
describe("omit the names of their keys", cases(["{name:function () {}}", "{'tricky name':function () {}}"]));
});
describe("native instances", () => {
describe("Date", () => {
const date = new Date();
it("should stringify", test(date, "new Date(" + date.getTime() + ")"));
});
describe("RegExp", () => {
it("should stringify as shorthand", test(/[abc]/gi, "/[abc]/gi"));
});
describe("Number", () => {
it("should stringify", test(new Number(10), "new Number(10)"));
});
describe("String", () => {
it("should stringify", test(new String("abc"), "new String('abc')"));
});
describe("Boolean", () => {
it("should stringify", test(new Boolean(true), "new Boolean(true)"));
});
describeIf("Buffer", typeof Buffer === "function", () => {
it("should stringify", test(Buffer.from("test"), "new Buffer('test')"));
});
describeIf("BigInt", typeof BigInt === "function", () => {
it("should stringify", test(BigInt("10"), "BigInt('10')"));
});
describe("Error", () => {
it("should stringify", test(new Error("test"), "new Error('test')"));
});
describe("unknown native type", () => {
it("should be omitted", test({
k: typeof process === "undefined"
? window.navigator
: process
}, "{}"));
});
});
describeIf("ES6", typeof Array.from === "function", () => {
describeIf("Map", typeof Map === "function", () => {
it("should stringify", test(new Map([["key", "value"]]), "new Map([['key','value']])"));
});
describeIf("Set", typeof Set === "function", () => {
it("should stringify", test(new Set(["key", "value"]), "new Set(['key','value'])"));
});
describe("arrow functions", () => {
describe("should stringify", cases([
"(a, b) => a + b",
"o => { return o.a + o.b; }",
"(a, b) => { if (a) { return b; } }",
"(a, b) => ({ [a]: b })",
"a => b => () => a + b"
]));
it("should reindent function bodies", test(evalValue(" () => {\n" +
" if (true) {\n" +
' return "hello";\n' +
" }\n" +
" }"), '() => {\n if (true) {\n return "hello";\n }\n}', 2));
describeIf("arrows with patterns", isSupported("({x}) => x"), () => {
describe("should stringify", cases([
"({ x, y }) => x + y",
"({ x, y }) => { if (x === '}') { return y; } }",
"({ x, y = /[/})]/.test(x) }) => { return y ? x : 0; }"
]));
});
});
describe("generators", () => {
it("should stringify", testRoundTrip("function* (x) { yield x; }"));
});
describe("class notation", () => {
it("should stringify classes", testRoundTrip("class {}"));
it("should stringify class and method", testRoundTrip("class { method() {} }"));
it("should stringify with newline", testRoundTrip("class\n{ method() {} }"));
it("should stringify with comment", testRoundTrip("class/*test*/\n{ method() {} }"));
});
describe("method notation", () => {
it("should stringify", testRoundTrip("{a(b, c) { return b + c; }}"));
it("should stringify generator methods", testRoundTrip("{*a(b) { yield b; }}"));
describe("should not be fooled by tricky names", cases([
"{'function a'(b, c) { return b + c; }}",
"{'a(a'(b, c) { return b + c; }}",
"{'() => function '() {}}",
"{'['() { return x[y]()\n{ return true; }}}",
"{'() { return false;//'() { return true;\n}}"
]));
it("should not be fooled by tricky generator names", testRoundTrip("{*'function a'(b, c) { return b + c; }}"));
it("should not be fooled by empty names", testRoundTrip("{''(b, c) { return b + c; }}"));
it("should not be fooled by keys that look like functions", () => {
const fn = evalValue('{ "() => ": () => () => 42 }')["() => "];
expect(index_1.stringify(fn)).toEqual("() => () => 42");
});
describe("should not be fooled by arrow functions", cases([
"{a:(b, c) => b + c}",
"{a:a => a + 1}",
"{'() => ':() => () => 42}",
'{\'() => "\':() => "() {//"}',
'{\'() => "\':() => "() {`//"}',
'{\'() => "\':() => "() {`${//"}',
'{\'() => "\':() => "() {/*//"}',
semver_1.satisfies(process.versions.node, "<=4 || >=10")
? "{'a => function ':a => function () { return a + 1; }}"
: undefined
]));
describe("should not be fooled by regexp literals", cases([
"{' '(s) { return /}/.test(s); }}",
"{' '(s) { return /abc/ .test(s); }}",
"{' '() { return x / y; // /}\n}}",
"{' '() { return / y; }//* } */}}",
"{' '() { return delete / y; }/.x}}",
"{' '() { switch (x) { case / y; }}/: }}}",
"{' '() { if (x) return; else / y;}/; }}",
"{' '() { return x in / y;}/; }}",
"{' '() { return x instanceof / y;}/; }}",
"{' '() { return new / y;}/.x; }}",
"{' '() { throw / y;}/.x; }}",
"{' '() { return typeof / y;}/; }}",
"{' '() { void / y;}/; }}",
"{' '() { return x, / y;}/; }}",
"{' '() { return x; / y;}/; }}",
"{' '() { return { x: / y;}/ }; }}",
"{' '() { return x + / y;}/.x; }}",
"{' '() { return x - / y;}/.x; }}",
"{' '() { return !/ y;}/; }}",
"{' '() { return ~/ y;}/.x; }}",
"{' '() { return x && / y;}/; }}",
"{' '() { return x || / y;}/; }}",
"{' '() { return x ^ / y;}/.x; }}",
"{' '() { return x * / y;}/.x; }}",
"{' '() { return x / / y;}/.x; }}",
"{' '() { return x % / y;}/.x; }}",
"{' '() { return x < / y;}/.x; }}",
"{' '() { return x > / y;}/.x; }}",
"{' '() { return x <= / y;}/.x; }}",
"{' '() { return x /= / y;}/.x; }}",
"{' '() { return x ? / y;}/ : false; }}"
]));
describe("should not be fooled by computed names", () => {
it("1", test(evalValue('{ ["foobar".slice(3)](x) { return x + 1; } }'), "{bar(x) { return x + 1; }}"));
it("2", test(evalValue('{[((s,a,b)=>a+s(a)+","+s(b)+b)(JSON.stringify,"[((s,a,b)=>a+s(a)+\\",\\"+s(b)+b)(JSON.stringify,",")]() {}")]() {}}'), '{\'[((s,a,b)=>a+s(a)+","+s(b)+b)(JSON.stringify,"[((s,a,b)=>a+s(a)+\\\\",\\\\"+s(b)+b)(JSON.stringify,",")]() {}")]() {}\'() {}}'));
it("3", test(evalValue('{[`over${`6${"0".repeat(3)}`.replace("6", "9")}`]() { this.activateHair(); }}'), "{over9000() { this.activateHair(); }}"));
it("4", test(evalValue("{[\"() {'\"]() {''}}"), "{'() {\\''() {''}}"));
it("5", test(evalValue('{["() {`"]() {``}}'), "{'() {`'() {``}}"));
it("6", test(evalValue('{["() {/*"]() {/*`${()=>{/*}*/}}'), "{'() {/*'() {/*`${()=>{/*}*/}}"));
});
// These two cases demonstrate that branching on
// METHOD_NAMES_ARE_QUOTED is unavoidable--you can't write code
// without it that will pass both of these cases on both node.js 4
// and node.js 10. (If you think you can, consider that the name and
// toString of the first case when executed on node.js 10 are
// identical to the name and toString of the second case when
// executed on node.js 4, so good luck telling them apart without
// knowing which node you're on.)
describe("should handle different versions of node correctly", () => {
it("1", test(evalValue('{[((s,a,b)=>a+s(a)+","+s(b)+b)(JSON.stringify,"[((s,a,b)=>a+s(a)+\\",\\"+s(b)+b)(JSON.stringify,",")]() { return 0; /*")]() { return 0; /*() {/* */ return 1;}}'), '{\'[((s,a,b)=>a+s(a)+","+s(b)+b)(JSON.stringify,"[((s,a,b)=>a+s(a)+\\\\",\\\\"+s(b)+b)(JSON.stringify,",")]() { return 0; /*")]() { return 0; /*\'() { return 0; /*() {/* */ return 1;}}'));
it("2", test(evalValue('{\'[((s,a,b)=>a+s(a)+","+s(b)+b)(JSON.stringify,"[((s,a,b)=>a+s(a)+\\\\",\\\\"+s(b)+b)(JSON.stringify,",")]() { return 0; /*")]() { return 0; /*\'() {/* */ return 1;}}'), '{\'[((s,a,b)=>a+s(a)+","+s(b)+b)(JSON.stringify,"[((s,a,b)=>a+s(a)+\\\\",\\\\"+s(b)+b)(JSON.stringify,",")]() { return 0; /*")]() { return 0; /*\'() {/* */ return 1;}}'));
});
it("should not be fooled by comments", test(evalValue("{'method' /* a comment! */ () /* another comment! */ {}}"), "{method() /* another comment! */ {}}"));
it("should stringify extracted methods", () => {
const fn = evalValue("{ foo(x) { return x + 1; } }").foo;
expect(index_1.stringify(fn)).toEqual("function foo(x) { return x + 1; }");
});
it("should stringify extracted generators", () => {
const fn = evalValue("{ *foo(x) { yield x; } }").foo;
expect(index_1.stringify(fn)).toEqual("function* foo(x) { yield x; }");
});
it("should stringify extracted methods with tricky names", () => {
const fn = evalValue('{ "a(a"(x) { return x + 1; } }')["a(a"];
expect(index_1.stringify(fn)).toEqual("function (x) { return x + 1; }");
});
it("should stringify extracted methods with arrow-like tricky names", () => {
const fn = evalValue('{ "() => function "(x) { return x + 1; } }')["() => function "];
expect(index_1.stringify(fn)).toEqual("function (x) { return x + 1; }");
});
it("should stringify extracted methods with empty names", () => {
const fn = evalValue('{ ""(x) { return x + 1; } }')[""];
expect(index_1.stringify(fn)).toEqual("function (x) { return x + 1; }");
});
it("should handle transplanted names", () => {
const fn = evalValue("{ foo(x) { return x + 1; } }").foo;
expect(index_1.stringify({ bar: fn })).toEqual("{bar:function foo(x) { return x + 1; }}");
});
it("should handle transplanted names with generators", () => {
const fn = evalValue("{ *foo(x) { yield x; } }").foo;
expect(index_1.stringify({ bar: fn })).toEqual("{bar:function* foo(x) { yield x; }}");
});
it("should reindent methods", test(evalValue(" {\n" +
" fn() {\n" +
" if (true) {\n" +
' return "hello";\n' +
" }\n" +
" }\n" +
" }"), '{\n fn() {\n if (true) {\n return "hello";\n }\n }\n}', 2));
});
});
describe("ES2017", () => {
describeIf("async functions", isSupported("(async function () {})"), () => {
it("should stringify", testRoundTrip("async function (x) { await x; }"));
it("should gracefully handle unexpected Function.toString formats", () => {
const origToString = Function.prototype.toString;
Function.prototype.toString = () => "{nope}";
try {
expect(index_1.stringify(evalValue("async function () {}"))).toEqual("void '{nope}'");
}
finally {
Function.prototype.toString = origToString;
}
});
});
describeIf("async arrows", isSupported("async () => {}"), () => {
describe("should stringify", cases([
"async (x) => x + 1",
"async x => x + 1",
"async x => { await x.then(y => y + 1); }"
]));
describe("should stringify as object properties", cases([
"{f:async a => a + 1}",
semver_1.satisfies(process.versions.node, "<=4 || >=10")
? "{'async a => function ':async a => function () { return a + 1; }}"
: undefined
]));
});
});
describe("ES2018", () => {
describeIf("async generators", isSupported("(async function* () {})"), () => {
it("should stringify", testRoundTrip("async function* (x) { yield x; }"));
it("should gracefully handle unexpected Function.toString formats", () => {
const origToString = Function.prototype.toString;
Function.prototype.toString = () => "{nope}";
try {
expect(index_1.stringify(evalValue("async function* () {}"))).toEqual("void '{nope}'");
}
finally {
Function.prototype.toString = origToString;
}
});
});
});
describe("global", () => {
it("should access the global in the current environment", testRoundTrip("Function('return this')()"));
});
});
describe("circular references", () => {
it("should omit circular references", () => {
const obj = { key: "value" };
obj.obj = obj;
const result = index_1.stringify(obj);
expect(result).toEqual("{key:'value'}");
});
it("should restore value", () => {
const obj = { key: "value" };
obj.obj = obj;
const result = index_1.stringify(obj, null, null, { references: true });
expect(result).toEqual("(function(){var x={key:'value'};x.obj=x;return x;}())");
});
it("should omit recursive array value", () => {
const obj = [1, 2, 3];
obj.push(obj);
const result = index_1.stringify(obj);
expect(result).toEqual("[1,2,3,undefined]");
});
it("should restore array value", () => {
const obj = [1, 2, 3];
obj.push(obj);
const result = index_1.stringify(obj, null, null, { references: true });
expect(result).toEqual("(function(){var x=[1,2,3,undefined];x[3]=x;return x;}())");
});
it("should print repeated values when no references enabled", () => {
const obj = {};
const child = {};
obj.a = child;
obj.b = child;
const result = index_1.stringify(obj);
expect(result).toEqual("{a:{},b:{}}");
});
it("should restore repeated values", () => {
const obj = {};
const child = {};
obj.a = child;
obj.b = child;
const result = index_1.stringify(obj, null, null, { references: true });
expect(result).toEqual("(function(){var x={a:{}};x.b=x.a;return x;}())");
});
it("should restore repeated values with indentation", function () {
const obj = {};
const child = {};
obj.a = child;
obj.b = child;
const result = index_1.stringify(obj, null, 2, { references: true });
expect(result).toEqual("(function () {\nvar x = {\n a: {}\n};\nx.b = x.a;\nreturn x;\n}())");
});
});
describe("custom indent", () => {
it("string", () => {
const result = index_1.stringify({
test: [1, 2, 3],
nested: {
key: "value"
}
}, null, "\t");
expect(result).toEqual("{\n" +
"\ttest: [\n\t\t1,\n\t\t2,\n\t\t3\n\t],\n" +
"\tnested: {\n\t\tkey: 'value'\n\t}\n" +
"}");
});
it("integer", () => {
const result = index_1.stringify({
test: [1, 2, 3],
nested: {
key: "value"
}
}, null, 2);
expect(result).toEqual("{\n" +
" test: [\n 1,\n 2,\n 3\n ],\n" +
" nested: {\n key: 'value'\n }\n" +
"}");
});
it("float", () => {
const result = index_1.stringify({
test: [1, 2, 3],
nested: {
key: "value"
}
}, null, 2.6);
expect(result).toEqual("{\n" +
" test: [\n 1,\n 2,\n 3\n ],\n" +
" nested: {\n key: 'value'\n }\n" +
"}");
});
});
describe("replacer function", () => {
it("should allow custom replacements", () => {
let callCount = 0;
const result = index_1.stringify({
test: "value"
}, function (value, indent, next) {
callCount++;
if (typeof value === "string") {
return '"hello"';
}
return next(value);
});
expect(callCount).toEqual(2);
expect(result).toEqual('{test:"hello"}');
});
it("change primitive to object", () => {
const result = index_1.stringify({
test: 10
}, function (value, indent, next) {
if (typeof value === "number") {
return next({ obj: "value" });
}
return next(value);
});
expect(result).toEqual("{test:{obj:'value'}}");
});
it("change object to primitive", () => {
const result = index_1.stringify({
test: 10
}, value => Object.prototype.toString.call(value));
expect(result).toEqual("[object Object]");
});
it("should support object functions", () => {
function makeRaw(str) {
const fn = () => {
/* Noop. */
};
fn.__expression = str;
return fn;
}
const result = index_1.stringify({
"no-console": makeRaw(`process.env.NODE_ENV === 'production' ? 'error' : 'off'`),
"no-debugger": makeRaw(`process.env.NODE_ENV === 'production' ? 'error' : 'off'`)
}, (val, indent, stringify) => {
if (val && val.__expression) {
return val.__expression;
}
return stringify(val);
}, 2);
expect(result).toEqual(`{
'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',
'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off'
}`);
});
});
describe("max depth", () => {
const obj = { a: { b: { c: 1 } } };
it("should get all object", test(obj, "{a:{b:{c:1}}}"));
it("should get part of the object", test(obj, "{a:{b:{}}}", null, { maxDepth: 2 }));
it("should get part of the object when tracking references", test(obj, "{a:{b:{}}}", null, { maxDepth: 2, references: true }));
});
describe("property based", () => {
it("should produce string evaluating to the original value", () => {
fc.assert(fc.property(fc.anything(), value => {
expect(evalValue(index_1.stringify(value))).toEqual(value);
}));
});
});
});
//# sourceMappingURL=index.spec.js.map

File diff suppressed because one or more lines are too long

5
node_modules/javascript-stringify/dist/object.d.ts generated vendored Normal file
View File

@ -0,0 +1,5 @@
import { ToString } from "./types";
/**
* Transform an object into a string.
*/
export declare const objectToString: ToString;

84
node_modules/javascript-stringify/dist/object.js generated vendored Normal file
View File

@ -0,0 +1,84 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const quote_1 = require("./quote");
const function_1 = require("./function");
const array_1 = require("./array");
/**
* Transform an object into a string.
*/
exports.objectToString = (value, space, next, key) => {
if (typeof Buffer === "function" && Buffer.isBuffer(value)) {
return `new Buffer(${next(value.toString())})`;
}
// Use the internal object string to select stringify method.
const toString = OBJECT_TYPES[Object.prototype.toString.call(value)];
return toString ? toString(value, space, next, key) : undefined;
};
/**
* Stringify an object of keys and values.
*/
const rawObjectToString = (obj, indent, next) => {
const eol = indent ? "\n" : "";
const space = indent ? " " : "";
// Iterate over object keys and concat string together.
const values = Object.keys(obj)
.reduce(function (values, key) {
const fn = obj[key];
const result = next(fn, key);
// Omit `undefined` object entries.
if (result === undefined)
return values;
// String format the value data.
const value = result.split("\n").join(`\n${indent}`);
// Skip `key` prefix for function parser.
if (function_1.USED_METHOD_KEY.has(fn)) {
values.push(`${indent}${value}`);
return values;
}
values.push(`${indent}${quote_1.quoteKey(key, next)}:${space}${value}`);
return values;
}, [])
.join(`,${eol}`);
// Avoid new lines in an empty object.
if (values === "")
return "{}";
return `{${eol}${values}${eol}}`;
};
/**
* Stringify global variable access.
*/
const globalToString = (value, space, next) => {
return `Function(${next("return this")})()`;
};
/**
* Convert JavaScript objects into strings.
*/
const OBJECT_TYPES = {
"[object Array]": array_1.arrayToString,
"[object Object]": rawObjectToString,
"[object Error]": (error, space, next) => {
return `new Error(${next(error.message)})`;
},
"[object Date]": (date) => {
return `new Date(${date.getTime()})`;
},
"[object String]": (str, space, next) => {
return `new String(${next(str.toString())})`;
},
"[object Number]": (num) => {
return `new Number(${num})`;
},
"[object Boolean]": (bool) => {
return `new Boolean(${bool})`;
},
"[object Set]": (set, space, next) => {
return `new Set(${next(Array.from(set))})`;
},
"[object Map]": (map, space, next) => {
return `new Map(${next(Array.from(map))})`;
},
"[object RegExp]": String,
"[object global]": globalToString,
"[object Window]": globalToString
};
//# sourceMappingURL=object.js.map

1
node_modules/javascript-stringify/dist/object.js.map generated vendored Normal file

File diff suppressed because one or more lines are too long

21
node_modules/javascript-stringify/dist/quote.d.ts generated vendored Normal file
View File

@ -0,0 +1,21 @@
import { Next } from "./types";
/**
* Quote a string.
*/
export declare function quoteString(str: string): string;
/**
* Test for valid JavaScript identifier.
*/
export declare const IS_VALID_IDENTIFIER: RegExp;
/**
* Check if a variable name is valid.
*/
export declare function isValidVariableName(name: PropertyKey): name is string;
/**
* Quote JavaScript key access.
*/
export declare function quoteKey(key: PropertyKey, next: Next): string | undefined;
/**
* Serialize the path to a string.
*/
export declare function stringifyPath(path: PropertyKey[], next: Next): string;

85
node_modules/javascript-stringify/dist/quote.js generated vendored Normal file
View File

@ -0,0 +1,85 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
/**
* Match all characters that need to be escaped in a string. Modified from
* source to match single quotes instead of double.
*
* Source: https://github.com/douglascrockford/JSON-js/blob/master/json2.js
*/
const ESCAPABLE = /[\\\'\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
/**
* Map of characters to escape characters.
*/
const META_CHARS = new Map([
["\b", "\\b"],
["\t", "\\t"],
["\n", "\\n"],
["\f", "\\f"],
["\r", "\\r"],
["'", "\\'"],
['"', '\\"'],
["\\", "\\\\"]
]);
/**
* Escape any character into its literal JavaScript string.
*
* @param {string} char
* @return {string}
*/
function escapeChar(char) {
return (META_CHARS.get(char) ||
`\\u${`0000${char.charCodeAt(0).toString(16)}`.slice(-4)}`);
}
/**
* Quote a string.
*/
function quoteString(str) {
return `'${str.replace(ESCAPABLE, escapeChar)}'`;
}
exports.quoteString = quoteString;
/**
* JavaScript reserved keywords.
*/
const RESERVED_WORDS = new Set(("break else new var case finally return void catch for switch while " +
"continue function this with default if throw delete in try " +
"do instanceof typeof abstract enum int short boolean export " +
"interface static byte extends long super char final native synchronized " +
"class float package throws const goto private transient debugger " +
"implements protected volatile double import public let yield").split(" "));
/**
* Test for valid JavaScript identifier.
*/
exports.IS_VALID_IDENTIFIER = /^[A-Za-z_$][A-Za-z0-9_$]*$/;
/**
* Check if a variable name is valid.
*/
function isValidVariableName(name) {
return (typeof name === "string" &&
!RESERVED_WORDS.has(name) &&
exports.IS_VALID_IDENTIFIER.test(name));
}
exports.isValidVariableName = isValidVariableName;
/**
* Quote JavaScript key access.
*/
function quoteKey(key, next) {
return isValidVariableName(key) ? key : next(key);
}
exports.quoteKey = quoteKey;
/**
* Serialize the path to a string.
*/
function stringifyPath(path, next) {
let result = "";
for (const key of path) {
if (isValidVariableName(key)) {
result += `.${key}`;
}
else {
result += `[${next(key)}]`;
}
}
return result;
}
exports.stringifyPath = stringifyPath;
//# sourceMappingURL=quote.js.map

1
node_modules/javascript-stringify/dist/quote.js.map generated vendored Normal file
View File

@ -0,0 +1 @@
{"version":3,"file":"quote.js","sourceRoot":"","sources":["../src/quote.ts"],"names":[],"mappings":";;AAEA;;;;;GAKG;AACH,MAAM,SAAS,GAAG,0HAA0H,CAAC;AAE7I;;GAEG;AACH,MAAM,UAAU,GAAG,IAAI,GAAG,CAAiB;IACzC,CAAC,IAAI,EAAE,KAAK,CAAC;IACb,CAAC,IAAI,EAAE,KAAK,CAAC;IACb,CAAC,IAAI,EAAE,KAAK,CAAC;IACb,CAAC,IAAI,EAAE,KAAK,CAAC;IACb,CAAC,IAAI,EAAE,KAAK,CAAC;IACb,CAAC,GAAG,EAAE,KAAK,CAAC;IACZ,CAAC,GAAG,EAAE,KAAK,CAAC;IACZ,CAAC,IAAI,EAAE,MAAM,CAAC;CACf,CAAC,CAAC;AAEH;;;;;GAKG;AACH,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,CACL,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;QACpB,MAAM,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAC3D,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,WAAW,CAAC,GAAW;IACrC,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,GAAG,CAAC;AACnD,CAAC;AAFD,kCAEC;AAED;;GAEG;AACH,MAAM,cAAc,GAAG,IAAI,GAAG,CAC5B,CACE,qEAAqE;IACrE,6DAA6D;IAC7D,8DAA8D;IAC9D,0EAA0E;IAC1E,mEAAmE;IACnE,8DAA8D,CAC/D,CAAC,KAAK,CAAC,GAAG,CAAC,CACb,CAAC;AAEF;;GAEG;AACU,QAAA,mBAAmB,GAAG,4BAA4B,CAAC;AAEhE;;GAEG;AACH,SAAgB,mBAAmB,CAAC,IAAiB;IACnD,OAAO,CACL,OAAO,IAAI,KAAK,QAAQ;QACxB,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC;QACzB,2BAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAC/B,CAAC;AACJ,CAAC;AAND,kDAMC;AAED;;GAEG;AACH,SAAgB,QAAQ,CAAC,GAAgB,EAAE,IAAU;IACnD,OAAO,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACpD,CAAC;AAFD,4BAEC;AAED;;GAEG;AACH,SAAgB,aAAa,CAAC,IAAmB,EAAE,IAAU;IAC3D,IAAI,MAAM,GAAG,EAAE,CAAC;IAEhB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;QACtB,IAAI,mBAAmB,CAAC,GAAG,CAAC,EAAE;YAC5B,MAAM,IAAI,IAAI,GAAG,EAAE,CAAC;SACrB;aAAM;YACL,MAAM,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;SAC5B;KACF;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAZD,sCAYC","sourcesContent":["import { Next } from \"./types\";\n\n/**\n * Match all characters that need to be escaped in a string. Modified from\n * source to match single quotes instead of double.\n *\n * Source: https://github.com/douglascrockford/JSON-js/blob/master/json2.js\n */\nconst ESCAPABLE = /[\\\\\\'\\x00-\\x1f\\x7f-\\x9f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g;\n\n/**\n * Map of characters to escape characters.\n */\nconst META_CHARS = new Map<string, string>([\n [\"\\b\", \"\\\\b\"],\n [\"\\t\", \"\\\\t\"],\n [\"\\n\", \"\\\\n\"],\n [\"\\f\", \"\\\\f\"],\n [\"\\r\", \"\\\\r\"],\n [\"'\", \"\\\\'\"],\n ['\"', '\\\\\"'],\n [\"\\\\\", \"\\\\\\\\\"]\n]);\n\n/**\n * Escape any character into its literal JavaScript string.\n *\n * @param {string} char\n * @return {string}\n */\nfunction escapeChar(char: string) {\n return (\n META_CHARS.get(char) ||\n `\\\\u${`0000${char.charCodeAt(0).toString(16)}`.slice(-4)}`\n );\n}\n\n/**\n * Quote a string.\n */\nexport function quoteString(str: string) {\n return `'${str.replace(ESCAPABLE, escapeChar)}'`;\n}\n\n/**\n * JavaScript reserved keywords.\n */\nconst RESERVED_WORDS = new Set(\n (\n \"break else new var case finally return void catch for switch while \" +\n \"continue function this with default if throw delete in try \" +\n \"do instanceof typeof abstract enum int short boolean export \" +\n \"interface static byte extends long super char final native synchronized \" +\n \"class float package throws const goto private transient debugger \" +\n \"implements protected volatile double import public let yield\"\n ).split(\" \")\n);\n\n/**\n * Test for valid JavaScript identifier.\n */\nexport const IS_VALID_IDENTIFIER = /^[A-Za-z_$][A-Za-z0-9_$]*$/;\n\n/**\n * Check if a variable name is valid.\n */\nexport function isValidVariableName(name: PropertyKey): name is string {\n return (\n typeof name === \"string\" &&\n !RESERVED_WORDS.has(name) &&\n IS_VALID_IDENTIFIER.test(name)\n );\n}\n\n/**\n * Quote JavaScript key access.\n */\nexport function quoteKey(key: PropertyKey, next: Next) {\n return isValidVariableName(key) ? key : next(key);\n}\n\n/**\n * Serialize the path to a string.\n */\nexport function stringifyPath(path: PropertyKey[], next: Next) {\n let result = \"\";\n\n for (const key of path) {\n if (isValidVariableName(key)) {\n result += `.${key}`;\n } else {\n result += `[${next(key)}]`;\n }\n }\n\n return result;\n}\n"]}

View File

@ -0,0 +1,5 @@
import { ToString } from "./types";
/**
* Stringify a value recursively.
*/
export declare const toString: ToString;

35
node_modules/javascript-stringify/dist/stringify.js generated vendored Normal file
View File

@ -0,0 +1,35 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const quote_1 = require("./quote");
const object_1 = require("./object");
const function_1 = require("./function");
/**
* Stringify primitive values.
*/
const PRIMITIVE_TYPES = {
string: quote_1.quoteString,
number: (value) => (Object.is(value, -0) ? "-0" : String(value)),
boolean: String,
symbol: (value, space, next) => {
const key = Symbol.keyFor(value);
if (key !== undefined)
return `Symbol.for(${next(key)})`;
// ES2018 `Symbol.description`.
return `Symbol(${next(value.description)})`;
},
bigint: (value, space, next) => {
return `BigInt(${next(String(value))})`;
},
undefined: String,
object: object_1.objectToString,
function: function_1.functionToString
};
/**
* Stringify a value recursively.
*/
exports.toString = (value, space, next, key) => {
if (value === null)
return "null";
return PRIMITIVE_TYPES[typeof value](value, space, next, key);
};
//# sourceMappingURL=stringify.js.map

View File

@ -0,0 +1 @@
{"version":3,"file":"stringify.js","sourceRoot":"","sources":["../src/stringify.ts"],"names":[],"mappings":";;AAAA,mCAAsC;AAEtC,qCAA0C;AAC1C,yCAA8C;AAE9C;;GAEG;AACH,MAAM,eAAe,GAA6B;IAChD,MAAM,EAAE,mBAAW;IACnB,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACxE,OAAO,EAAE,MAAM;IACf,MAAM,EAAE,CAAC,KAAa,EAAE,KAAa,EAAE,IAAU,EAAE,EAAE;QACnD,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAEjC,IAAI,GAAG,KAAK,SAAS;YAAE,OAAO,cAAc,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;QAEzD,+BAA+B;QAC/B,OAAO,UAAU,IAAI,CAAE,KAAa,CAAC,WAAW,CAAC,GAAG,CAAC;IACvD,CAAC;IACD,MAAM,EAAE,CAAC,KAAa,EAAE,KAAa,EAAE,IAAU,EAAE,EAAE;QACnD,OAAO,UAAU,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC;IAC1C,CAAC;IACD,SAAS,EAAE,MAAM;IACjB,MAAM,EAAE,uBAAc;IACtB,QAAQ,EAAE,2BAAgB;CAC3B,CAAC;AAEF;;GAEG;AACU,QAAA,QAAQ,GAAa,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;IAC5D,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IAElC,OAAO,eAAe,CAAC,OAAO,KAAK,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;AAChE,CAAC,CAAC","sourcesContent":["import { quoteString } from \"./quote\";\nimport { Next, ToString } from \"./types\";\nimport { objectToString } from \"./object\";\nimport { functionToString } from \"./function\";\n\n/**\n * Stringify primitive values.\n */\nconst PRIMITIVE_TYPES: Record<string, ToString> = {\n string: quoteString,\n number: (value: number) => (Object.is(value, -0) ? \"-0\" : String(value)),\n boolean: String,\n symbol: (value: symbol, space: string, next: Next) => {\n const key = Symbol.keyFor(value);\n\n if (key !== undefined) return `Symbol.for(${next(key)})`;\n\n // ES2018 `Symbol.description`.\n return `Symbol(${next((value as any).description)})`;\n },\n bigint: (value: bigint, space: string, next: Next) => {\n return `BigInt(${next(String(value))})`;\n },\n undefined: String,\n object: objectToString,\n function: functionToString\n};\n\n/**\n * Stringify a value recursively.\n */\nexport const toString: ToString = (value, space, next, key) => {\n if (value === null) return \"null\";\n\n return PRIMITIVE_TYPES[typeof value](value, space, next, key);\n};\n"]}

8
node_modules/javascript-stringify/dist/types.d.ts generated vendored Normal file
View File

@ -0,0 +1,8 @@
/**
* Call `next()` every time you want to stringify a new value.
*/
export declare type Next = (value: any, key?: PropertyKey) => string | undefined;
/**
* Stringify a value.
*/
export declare type ToString = (value: any, space: string, next: Next, key: PropertyKey | undefined) => string | undefined;

3
node_modules/javascript-stringify/dist/types.js generated vendored Normal file
View File

@ -0,0 +1,3 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=types.js.map

1
node_modules/javascript-stringify/dist/types.js.map generated vendored Normal file
View File

@ -0,0 +1 @@
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"","sourcesContent":["/**\n * Call `next()` every time you want to stringify a new value.\n */\nexport type Next = (value: any, key?: PropertyKey) => string | undefined;\n\n/**\n * Stringify a value.\n */\nexport type ToString = (\n value: any,\n space: string,\n next: Next,\n key: PropertyKey | undefined\n) => string | undefined;\n"]}