| "use strict"; |
| Object.defineProperty(exports, "__esModule", { value: true }); |
| exports.regexpCode = exports.getEsmExportName = exports.getProperty = exports.safeStringify = exports.stringify = exports.strConcat = exports.addCodeArg = exports.str = exports._ = exports.nil = exports._Code = exports.Name = exports.IDENTIFIER = exports._CodeOrName = void 0; |
| class _CodeOrName { |
| } |
| exports._CodeOrName = _CodeOrName; |
| exports.IDENTIFIER = /^[a-z$_][a-z$_0-9]*$/i; |
| class Name extends _CodeOrName { |
| constructor(s) { |
| super(); |
| if (!exports.IDENTIFIER.test(s)) |
| throw new Error("CodeGen: name must be a valid identifier"); |
| this.str = s; |
| } |
| toString() { |
| return this.str; |
| } |
| emptyStr() { |
| return false; |
| } |
| get names() { |
| return { [this.str]: 1 }; |
| } |
| } |
| exports.Name = Name; |
| class _Code extends _CodeOrName { |
| constructor(code) { |
| super(); |
| this._items = typeof code === "string" ? [code] : code; |
| } |
| toString() { |
| return this.str; |
| } |
| emptyStr() { |
| if (this._items.length > 1) |
| return false; |
| const item = this._items[0]; |
| return item === "" || item === '""'; |
| } |
| get str() { |
| var _a; |
| return ((_a = this._str) !== null && _a !== void 0 ? _a : (this._str = this._items.reduce((s, c) => `${s}${c}`, ""))); |
| } |
| get names() { |
| var _a; |
| return ((_a = this._names) !== null && _a !== void 0 ? _a : (this._names = this._items.reduce((names, c) => { |
| if (c instanceof Name) |
| names[c.str] = (names[c.str] || 0) + 1; |
| return names; |
| }, {}))); |
| } |
| } |
| exports._Code = _Code; |
| exports.nil = new _Code(""); |
| function _(strs, ...args) { |
| const code = [strs[0]]; |
| let i = 0; |
| while (i < args.length) { |
| addCodeArg(code, args[i]); |
| code.push(strs[++i]); |
| } |
| return new _Code(code); |
| } |
| exports._ = _; |
| const plus = new _Code("+"); |
| function str(strs, ...args) { |
| const expr = [safeStringify(strs[0])]; |
| let i = 0; |
| while (i < args.length) { |
| expr.push(plus); |
| addCodeArg(expr, args[i]); |
| expr.push(plus, safeStringify(strs[++i])); |
| } |
| optimize(expr); |
| return new _Code(expr); |
| } |
| exports.str = str; |
| function addCodeArg(code, arg) { |
| if (arg instanceof _Code) |
| code.push(...arg._items); |
| else if (arg instanceof Name) |
| code.push(arg); |
| else |
| code.push(interpolate(arg)); |
| } |
| exports.addCodeArg = addCodeArg; |
| function optimize(expr) { |
| let i = 1; |
| while (i < expr.length - 1) { |
| if (expr[i] === plus) { |
| const res = mergeExprItems(expr[i - 1], expr[i + 1]); |
| if (res !== undefined) { |
| expr.splice(i - 1, 3, res); |
| continue; |
| } |
| expr[i++] = "+"; |
| } |
| i++; |
| } |
| } |
| function mergeExprItems(a, b) { |
| if (b === '""') |
| return a; |
| if (a === '""') |
| return b; |
| if (typeof a == "string") { |
| if (b instanceof Name || a[a.length - 1] !== '"') |
| return; |
| if (typeof b != "string") |
| return `${a.slice(0, -1)}${b}"`; |
| if (b[0] === '"') |
| return a.slice(0, -1) + b.slice(1); |
| return; |
| } |
| if (typeof b == "string" && b[0] === '"' && !(a instanceof Name)) |
| return `"${a}${b.slice(1)}`; |
| return; |
| } |
| function strConcat(c1, c2) { |
| return c2.emptyStr() ? c1 : c1.emptyStr() ? c2 : str `${c1}${c2}`; |
| } |
| exports.strConcat = strConcat; |
| // TODO do not allow arrays here |
| function interpolate(x) { |
| return typeof x == "number" || typeof x == "boolean" || x === null |
| ? x |
| : safeStringify(Array.isArray(x) ? x.join(",") : x); |
| } |
| function stringify(x) { |
| return new _Code(safeStringify(x)); |
| } |
| exports.stringify = stringify; |
| function safeStringify(x) { |
| return JSON.stringify(x) |
| .replace(/\u2028/g, "\\u2028") |
| .replace(/\u2029/g, "\\u2029"); |
| } |
| exports.safeStringify = safeStringify; |
| function getProperty(key) { |
| return typeof key == "string" && exports.IDENTIFIER.test(key) ? new _Code(`.${key}`) : _ `[${key}]`; |
| } |
| exports.getProperty = getProperty; |
| //Does best effort to format the name properly |
| function getEsmExportName(key) { |
| if (typeof key == "string" && exports.IDENTIFIER.test(key)) { |
| return new _Code(`${key}`); |
| } |
| throw new Error(`CodeGen: invalid export name: ${key}, use explicit $id name mapping`); |
| } |
| exports.getEsmExportName = getEsmExportName; |
| function regexpCode(rx) { |
| return new _Code(rx.toString()); |
| } |
| exports.regexpCode = regexpCode; |
| //# sourceMappingURL=code.js.map |