tynder
Version:
TypeScript friendly Data validator for JavaScript.
1,524 lines (1,359 loc) • 401 kB
JavaScript
#!/usr/bin/env node
module.exports.tynder =
/******/ (() => { // webpackBootstrap
/******/ "use strict";
/******/ var __webpack_modules__ = ({
/***/ "./node_modules/fruitsconfits/modules/lib/object-parser.js":
/*!*****************************************************************!*\
!*** ./node_modules/fruitsconfits/modules/lib/object-parser.js ***!
\*****************************************************************/
/*! namespace exports */
/*! export getObjectParsers [provided] [no usage info] [missing usage info prevents renaming] */
/*! export objClass [provided] [no usage info] [missing usage info prevents renaming] */
/*! export objClassByNeedleFn [provided] [no usage info] [missing usage info prevents renaming] */
/*! export objClassNot [provided] [no usage info] [missing usage info prevents renaming] */
/*! export objSequence [provided] [no usage info] [missing usage info prevents renaming] */
/*! other exports [not provided] [no usage info] */
/*! runtime requirements: __webpack_require__, __webpack_require__.r, __webpack_exports__, __webpack_require__.d, __webpack_require__.* */
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "objSequence": () => /* binding */ objSequence,
/* harmony export */ "objClass": () => /* binding */ objClass,
/* harmony export */ "objClassNot": () => /* binding */ objClassNot,
/* harmony export */ "objClassByNeedleFn": () => /* binding */ objClassByNeedleFn,
/* harmony export */ "getObjectParsers": () => /* binding */ getObjectParsers
/* harmony export */ });
/* harmony import */ var _parser__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./parser */ "./node_modules/fruitsconfits/modules/lib/parser.js");
// Copyright (c) 2019 Shellyl_N and Authors
// license: ISC
// https://github.com/shellyln
function objSequence(helper, comparator) {
return needle => {
return input => {
const len = Math.max(0, input.end - input.start);
let matched = true;
if (len >= needle.length) {
for (let i = 0; i < needle.length; i++) {
if (!comparator(input.src[input.start + i], needle[i])) {
matched = false;
break;
}
}
} else {
matched = false;
}
return matched ? {
succeeded: true,
next: {
src: input.src,
start: input.start + needle.length,
end: input.end,
context: input.context,
templateArgs: input.templateArgs,
templateArgsPos: input.templateArgsPos
},
tokens: [helper(needle)]
} : {
succeeded: false,
error: false,
src: input.src,
pos: input.start,
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
message: `operator "objSequence(${needle})"`
};
};
};
}
function objClass(helper, comparator) {
// NOTE: <T> version `needles` type is `T`.
return (...needles) => {
return input => {
const len = Math.max(0, input.end - input.start);
let index = -1;
const succeeded = len > 0 ? needles.some((needle, idx) => {
if (comparator(input.src[input.start], needle)) {
index = idx;
return true;
}
}) : false;
return succeeded ? {
succeeded: true,
next: {
src: input.src,
start: input.start + 1,
end: input.end,
context: input.context,
templateArgs: input.templateArgs,
templateArgsPos: input.templateArgsPos
},
tokens: [helper(needles[index])]
} : {
succeeded: false,
error: false,
src: input.src,
pos: input.start,
message: `operator "objClass(${needles.join(',')})"`
};
};
};
}
function objClassNot(helper, comparator) {
// NOTE: <T> version `needles` type is `T`.
return (...needles) => {
return input => {
const len = Math.max(0, input.end - input.start);
if (len > 0) {
for (const needle of needles) {
let matched = true;
if (!comparator(input.src[input.start], needle)) {
matched = false;
break;
}
if (matched) {
return {
succeeded: false,
error: false,
src: input.src,
pos: input.start,
message: `operator "objClassNot(${needles.join(',')})"`
};
}
}
}
return {
succeeded: true,
next: {
src: input.src,
start: input.start + 1,
end: input.end,
context: input.context,
templateArgs: input.templateArgs,
templateArgsPos: input.templateArgsPos
},
tokens: [helper(input.src[input.start])]
};
};
};
}
function objClassByNeedleFn(helper, comparator) {
// NOTE: needles[i] should be one character. surrogate pair and/or ligature are accepted.
// NOTE: <T> version `needles` type is `T`.
return needle => {
return input => {
const len = Math.max(0, input.end - input.start);
const matched = len > 0 ? needle(input.src[input.start]) : false;
return matched ? {
succeeded: true,
next: {
src: input.src,
start: input.start + 1,
end: input.end,
context: input.context,
templateArgs: input.templateArgs,
templateArgsPos: input.templateArgsPos
},
tokens: [helper(input.src[input.start])]
} : {
succeeded: false,
error: false,
src: input.src,
pos: input.start,
message: `operator "objClassByNeedleFn"`
};
};
};
} // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
function getObjectParsers(params) {
const clsFn = objClassByNeedleFn(params.rawToToken, params.comparator);
const isAny = clsFn(src => true); // TODO: reduce unneccessary call for adding types.
return {
seq: objSequence(params.rawToToken, params.comparator),
cls: objClass(params.rawToToken, params.comparator),
notCls: objClassNot(params.rawToToken, params.comparator),
clsFn,
classes: {
any: isAny
},
cat: (0,_parser__WEBPACK_IMPORTED_MODULE_0__.transform)(params.concatTokens),
once: (0,_parser__WEBPACK_IMPORTED_MODULE_0__.quantify)(1, 1),
repeat: (0,_parser__WEBPACK_IMPORTED_MODULE_0__.quantify)(),
qty: (min, max) => (0,_parser__WEBPACK_IMPORTED_MODULE_0__.quantify)(min, max),
zeroWidth: helper => (0,_parser__WEBPACK_IMPORTED_MODULE_0__.zeroWidth)(helper),
err: message => (0,_parser__WEBPACK_IMPORTED_MODULE_0__.zeroWidthError)(message),
beginning: helper => (0,_parser__WEBPACK_IMPORTED_MODULE_0__.beginning)(helper),
end: helper => (0,_parser__WEBPACK_IMPORTED_MODULE_0__.end)(helper),
first: (...parsers) => (0,_parser__WEBPACK_IMPORTED_MODULE_0__.first)(...parsers),
or: (...parsers) => (0,_parser__WEBPACK_IMPORTED_MODULE_0__.or)(...parsers),
combine: (0,_parser__WEBPACK_IMPORTED_MODULE_0__.transform)(),
erase: (0,_parser__WEBPACK_IMPORTED_MODULE_0__.transform)(tokens => []),
trans: fn => (0,_parser__WEBPACK_IMPORTED_MODULE_0__.transform)(fn),
ahead: (...parsers) => (0,_parser__WEBPACK_IMPORTED_MODULE_0__.lookAhead)(...parsers),
behind: (n, helper) => (0,_parser__WEBPACK_IMPORTED_MODULE_0__.lookBehind)(n, helper),
rules: args => (0,_parser__WEBPACK_IMPORTED_MODULE_0__.applyProductionRules)(args),
makeProgram: _parser__WEBPACK_IMPORTED_MODULE_0__.makeProgram
};
}
/***/ }),
/***/ "./node_modules/fruitsconfits/modules/lib/parser.js":
/*!**********************************************************!*\
!*** ./node_modules/fruitsconfits/modules/lib/parser.js ***!
\**********************************************************/
/*! namespace exports */
/*! export applyProductionRules [provided] [no usage info] [missing usage info prevents renaming] */
/*! export beginning [provided] [no usage info] [missing usage info prevents renaming] */
/*! export combine [provided] [no usage info] [missing usage info prevents renaming] */
/*! export end [provided] [no usage info] [missing usage info prevents renaming] */
/*! export first [provided] [no usage info] [missing usage info prevents renaming] */
/*! export formatErrorMessage [provided] [no usage info] [missing usage info prevents renaming] */
/*! export lookAhead [provided] [no usage info] [missing usage info prevents renaming] */
/*! export lookBehind [provided] [no usage info] [missing usage info prevents renaming] */
/*! export makeProgram [provided] [no usage info] [missing usage info prevents renaming] */
/*! export or [provided] [no usage info] [missing usage info prevents renaming] */
/*! export quantify [provided] [no usage info] [missing usage info prevents renaming] */
/*! export transform [provided] [no usage info] [missing usage info prevents renaming] */
/*! export zeroWidth [provided] [no usage info] [missing usage info prevents renaming] */
/*! export zeroWidthError [provided] [no usage info] [missing usage info prevents renaming] */
/*! other exports [not provided] [no usage info] */
/*! runtime requirements: __webpack_require__, __webpack_require__.r, __webpack_exports__, __webpack_require__.d, __webpack_require__.* */
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "formatErrorMessage": () => /* binding */ formatErrorMessage,
/* harmony export */ "zeroWidth": () => /* binding */ zeroWidth,
/* harmony export */ "zeroWidthError": () => /* binding */ zeroWidthError,
/* harmony export */ "beginning": () => /* binding */ beginning,
/* harmony export */ "end": () => /* binding */ end,
/* harmony export */ "quantify": () => /* binding */ quantify,
/* harmony export */ "first": () => /* binding */ first,
/* harmony export */ "or": () => /* binding */ or,
/* harmony export */ "transform": () => /* binding */ transform,
/* harmony export */ "combine": () => /* binding */ combine,
/* harmony export */ "lookAhead": () => /* binding */ lookAhead,
/* harmony export */ "lookBehind": () => /* binding */ lookBehind,
/* harmony export */ "applyProductionRules": () => /* binding */ applyProductionRules,
/* harmony export */ "makeProgram": () => /* binding */ makeProgram
/* harmony export */ });
/* harmony import */ var _types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./types */ "./node_modules/fruitsconfits/modules/lib/types.js");
// Copyright (c) 2019 Shellyl_N and Authors
// license: ISC
// https://github.com/shellyln
function getLineAndCol(src, pos) {
let line = 1;
let col = 1;
for (let i = 0; i <= pos; i++) {
switch (src[i]) {
case '\r':
if (src[i + 1] === '\n') {
i++;
}
// Fall Throught
case '\n':
line++;
col = 1;
break;
default:
col++;
break;
}
}
return {
line,
col
};
}
function formatErrorMessage(result) {
let msg = '';
let src = '';
if (typeof result.src === 'string') {
src = result.src.slice(Math.max(result.pos - 5, 0), result.pos + 55); // NOTE: (TS>=4.0) TS2339: Property 'slice' does not exist on type 'never'.
let ar = src.split(/\r\n|\n|\r/);
ar = ar.slice(0, 1).concat(' ^~~~~~~~').concat(...ar.slice(1));
src = ar.join('\n') + '\n\n';
const lineAndCol = getLineAndCol(result.src, result.pos);
msg = `parse failed at position:${result.pos} line:${lineAndCol.line} col:${lineAndCol.col} ${result.message ? ` ${result.message}` : ''}\n ${src}`;
} else {
src = ' (object)\n ^~~~~~~~';
try {
src = ' ' + // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
JSON.stringify(result.src.slice(Math.max(result.pos - 10, 0), result.pos)) + '\n ' + // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
JSON.stringify(result.src.slice(result.pos, result.pos + 1)) + '\n ' + // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
JSON.stringify(result.src.slice(result.pos + 1, result.pos + 10));
let ar = src.split(/\r\n|\n|\r/);
ar = ar.slice(0, 2).concat(' ^~~~~~~~').concat(...ar.slice(2));
src = ar.join('\n') + '\n\n';
} catch (e) {// Nothing to do.
}
msg = `parse failed at position:${result.pos} ${result.message ? ` ${result.message}` : ''}\n ${src}`;
}
return msg;
}
function zeroWidth(helper) {
return input => {
return {
succeeded: true,
next: {
src: input.src,
start: input.start,
end: input.end,
context: input.context,
templateArgs: input.templateArgs,
templateArgsPos: input.templateArgsPos
},
tokens: helper ? [helper()] : []
};
};
}
function zeroWidthError(message) {
return input => {
throw new _types__WEBPACK_IMPORTED_MODULE_0__.ParseError({
succeeded: false,
error: true,
src: input.src,
pos: input.start,
message: message || ''
}); // return ({
// succeeded: false,
// error: true,
// src: input.src,
// pos: input.start,
// message: message || '',
// });
};
}
function beginning(helper) {
return input => {
return input.start === 0 ? {
succeeded: true,
next: {
src: input.src,
start: input.start,
end: input.end,
context: input.context,
templateArgs: input.templateArgs,
templateArgsPos: input.templateArgsPos
},
tokens: helper ? [helper()] : []
} : {
succeeded: false,
error: false,
src: input.src,
pos: input.start,
message: 'operator "beginning"'
};
};
}
function end(helper) {
return input => {
return input.start === input.end ? {
succeeded: true,
next: {
src: input.src,
start: input.start,
end: input.end,
context: input.context,
templateArgs: input.templateArgs,
templateArgsPos: input.templateArgsPos
},
tokens: helper ? [helper()] : []
} : {
succeeded: false,
error: false,
src: input.src,
pos: input.start,
message: 'operator "end"'
};
};
} // TODO: match by callback function parser
// TODO: `nesting` parser
function quantify(min, max) {
min = min || 0;
return parser => {
return input => {
let next = input;
const matched = [];
for (;;) {
const x = parser(next);
if (x.succeeded) {
next = x.next;
matched.push({
next: x.next,
tokens: x.tokens
});
if (max && max === matched.length) {
break;
}
} else {
if (x.error) {
return x;
}
if (matched.length >= min) {
break;
} else {
return {
succeeded: false,
error: false,
src: next.src,
pos: next.start,
message: 'operator "quantify"'
};
}
}
}
if (matched.length > 0) {
const r = [];
for (const x of matched) {
r.push(...x.tokens);
}
return {
succeeded: true,
next: matched[matched.length - 1].next,
tokens: r
};
} else {
return {
succeeded: true,
next: {
src: input.src,
start: input.start,
end: input.end,
context: input.context,
templateArgs: input.templateArgs,
templateArgsPos: input.templateArgsPos
},
tokens: []
};
}
};
};
}
function first(...parsers) {
return input => {
let matched = null;
let last = null;
for (const parser of parsers) {
const x = parser(input);
if (x.succeeded) {
matched = {
next: x.next,
tokens: x.tokens
};
break;
}
if (last) {
if (x.error) {
if (!last.error || last.pos < x.pos) {
last = x;
}
} else if (last.pos < x.pos) {
last = x;
}
} else {
last = x;
}
}
return matched ? {
succeeded: true,
next: matched.next,
tokens: matched.tokens
} : last ? last : {
succeeded: false,
error: false,
src: input.src,
pos: input.start,
message: 'operator "first"'
};
};
}
function or(...parsers) {
return input => {
const matched = [];
let last = null;
for (const parser of parsers) {
const x = parser(input);
if (x.succeeded) {
matched.push({
next: x.next,
tokens: x.tokens
});
} else {
if (last) {
if (x.error) {
if (!last.error || last.pos < x.pos) {
last = x;
}
} else if (last.pos < x.pos) {
last = x;
}
} else {
last = x;
}
}
}
if (matched.length > 0) {
const z = matched.reduce((a, b) => a.next.start >= b.next.start ? a : b);
return {
succeeded: true,
next: z.next,
tokens: z.tokens
};
}
return last ? last : {
succeeded: false,
error: false,
src: input.src,
pos: input.start,
message: 'operator "or"'
};
};
}
function transform(trans, ctxTrans) {
return (...parsers) => {
return input => {
let next = input;
const tokens = [];
for (const parser of parsers) {
const x = parser(next);
if (!x.succeeded) {
return x;
}
next = x.next;
tokens.push(...x.tokens);
} // TODO: report errors while transforming
const t2 = trans ? trans(tokens, input) : tokens;
return {
succeeded: true,
next: ctxTrans ? {
src: next.src,
start: next.start,
end: next.end,
context: ctxTrans(next.context),
templateArgs: next.templateArgs,
templateArgsPos: next.templateArgsPos
} : next,
tokens: t2
};
};
};
}
function combine(...parsers) {
return transform()(...parsers);
}
function lookAhead(...parsers) {
return input => {
let next = input;
for (const parser of parsers) {
const x = parser(next);
if (!x.succeeded) {
return x;
}
next = x.next;
}
return {
succeeded: true,
next: input,
tokens: []
};
};
}
function lookBehind(n, helper) {
return (...parsers) => {
return input => {
if (input.start - n < 0) {
return {
succeeded: false,
error: false,
src: input.src,
pos: input.start,
message: 'lookBehind: src is too short'
};
}
let next = {
src: input.src,
start: input.start - n,
end: input.end,
context: input.context,
templateArgs: input.templateArgs,
templateArgsPos: input.templateArgsPos
};
for (const parser of parsers) {
const x = parser(next);
if (!x.succeeded) {
return x;
}
next = x.next;
}
return {
succeeded: true,
next: input,
tokens: helper ? [helper()] : []
};
};
};
}
function applyProductionRules(args) {
return lexer => {
return lexerInput => {
const lexResult = lexer(lexerInput);
if (!lexResult.succeeded) {
return lexResult;
}
const input = (0,_types__WEBPACK_IMPORTED_MODULE_0__.parserInput)(lexResult.tokens, lexerInput.context);
let next = input;
let completed = false;
if (args.check(next).succeeded) {
return {
succeeded: true,
next: lexResult.next,
tokens: lexResult.tokens
};
}
completed: for (let i = 0; args.maxApply !== void 0 ? i < args.maxApply : true; i++) {
let matched = false;
rules: for (const rule of args.rules) {
const {
parser,
rtol
} = typeof rule === 'function' ? {
parser: rule,
rtol: false
} : rule;
const len = next.src.length;
for (let s = 0; s <= len; s++) {
const x = parser({
src: next.src,
start: rtol ? len - s : s,
end: next.src.length,
context: next.context,
templateArgs: next.templateArgs,
templateArgsPos: next.templateArgsPos
});
if (x.succeeded) {
matched = true;
const nextSrc = next.src.slice(0, rtol ? len - s : s);
nextSrc.push(...x.tokens);
nextSrc.push(...next.src.slice(x.next.start));
next = {
src: nextSrc,
start: 0,
end: nextSrc.length,
context: x.next.context,
templateArgs: x.next.templateArgs,
templateArgsPos: x.next.templateArgsPos
};
if (args.check(next).succeeded) {
completed = true;
break completed;
}
break rules;
}
}
}
if (!matched) {
break;
}
}
if (!completed) {
if (!args.check(next).succeeded) {
throw new _types__WEBPACK_IMPORTED_MODULE_0__.ParseError({
succeeded: false,
error: true,
src: input.src,
pos: input.start,
message: 'The application of production rules was not finished'
});
}
}
return {
succeeded: true,
next: lexResult.next,
tokens: next.src
};
};
};
}
function makeProgram(parser) {
return input => {
try {
return parser(input);
} catch (e) {
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
if (e.result) {
// eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-member-access
return e.result;
} else {
throw e;
}
}
};
}
/***/ }),
/***/ "./node_modules/fruitsconfits/modules/lib/string-parser.js":
/*!*****************************************************************!*\
!*** ./node_modules/fruitsconfits/modules/lib/string-parser.js ***!
\*****************************************************************/
/*! namespace exports */
/*! export charClass [provided] [no usage info] [missing usage info prevents renaming] */
/*! export charClassByNeedleFn [provided] [no usage info] [missing usage info prevents renaming] */
/*! export charClassNot [provided] [no usage info] [missing usage info prevents renaming] */
/*! export charSequence [provided] [no usage info] [missing usage info prevents renaming] */
/*! export getStringParsers [provided] [no usage info] [missing usage info prevents renaming] */
/*! export templateStringsParam [provided] [no usage info] [missing usage info prevents renaming] */
/*! other exports [not provided] [no usage info] */
/*! runtime requirements: __webpack_require__, __webpack_require__.r, __webpack_exports__, __webpack_require__.d, __webpack_require__.* */
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "charSequence": () => /* binding */ charSequence,
/* harmony export */ "charClass": () => /* binding */ charClass,
/* harmony export */ "charClassNot": () => /* binding */ charClassNot,
/* harmony export */ "charClassByNeedleFn": () => /* binding */ charClassByNeedleFn,
/* harmony export */ "templateStringsParam": () => /* binding */ templateStringsParam,
/* harmony export */ "getStringParsers": () => /* binding */ getStringParsers
/* harmony export */ });
/* harmony import */ var _parser__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./parser */ "./node_modules/fruitsconfits/modules/lib/parser.js");
// Copyright (c) 2019 Shellyl_N and Authors
// license: ISC
// https://github.com/shellyln
function charSequence(helper) {
return needle => {
return input => {
const src = input.src.slice(input.start, input.end);
return src.startsWith(needle) ? {
succeeded: true,
next: {
src: input.src,
start: input.start + needle.length,
end: input.end,
context: input.context,
templateArgs: input.templateArgs,
templateArgsPos: input.templateArgsPos
},
tokens: [helper(needle)]
} : {
succeeded: false,
error: false,
src: input.src,
pos: input.start,
message: `operator "charSequence(${needle})"`
};
};
};
}
function charClass(helper) {
// NOTE: needles[i] should be one character. surrogate pair and/or ligature are accepted.
return (...needles) => {
return input => {
const src = input.src.slice(input.start, input.end);
let index = -1;
const succeeded = needles.some((needle, idx) => {
const matched = src.startsWith(needle);
if (matched) {
index = idx;
return true;
}
});
return succeeded ? {
succeeded: true,
next: {
src: input.src,
start: input.start + needles[index].length,
end: input.end,
context: input.context,
templateArgs: input.templateArgs,
templateArgsPos: input.templateArgsPos
},
tokens: [helper(needles[index])]
} : {
succeeded: false,
error: false,
src: input.src,
pos: input.start,
message: `operator "charClass(${needles.join(',')})"`
};
};
};
}
function charClassNot(helper) {
// NOTE: needles[i] should be one character. surrogate pair and/or ligature are accepted.
return (...needles) => {
return input => {
const src = input.src.slice(input.start, input.end);
for (const needle of needles) {
const matched = src.startsWith(needle);
if (matched) {
return {
succeeded: false,
error: false,
src: input.src,
pos: input.start,
message: `operator "charClassNot(${needles.join(',')})"`
};
}
}
const p = input.src.codePointAt(input.start);
if (p === void 0) {
return {
succeeded: false,
error: false,
src: input.src,
pos: input.start,
message: `operator "charClassNot(${needles.join(',')})"`
};
}
const c = String.fromCodePoint(p);
return {
succeeded: true,
next: {
src: input.src,
start: input.start + c.length,
end: input.end,
context: input.context,
templateArgs: input.templateArgs,
templateArgsPos: input.templateArgsPos
},
tokens: [helper(c)]
};
};
};
}
function charClassByNeedleFn(helper) {
// NOTE: needles[i] should be one character. surrogate pair and/or ligature are accepted.
return needle => {
return input => {
const src = input.src.slice(input.start, input.end);
const len = needle(src);
return len >= 0 ? {
succeeded: true,
next: {
src: input.src,
start: input.start + len,
end: input.end,
context: input.context,
templateArgs: input.templateArgs,
templateArgsPos: input.templateArgsPos
},
tokens: [helper(src.substring(0, len))]
} : {
succeeded: false,
error: false,
src: input.src,
pos: input.start,
message: `operator "charClassByNeedleFn"`
};
};
};
}
function templateStringsParam(criteria, conv) {
return input => {
const src = input.src.slice(input.start, input.start + 1);
if (src === '\x00') {
if (input.templateArgsPos) {
let argIdx = -1;
const strIdx = input.templateArgsPos.findIndex((v, i) => {
argIdx = i;
return v === input.start;
});
if (0 <= strIdx) {
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-non-null-assertion
const o = input.templateArgs[argIdx];
if (criteria(o)) {
return {
succeeded: true,
next: {
src: input.src,
start: input.start + 1,
end: input.end,
context: input.context,
templateArgs: input.templateArgs,
templateArgsPos: input.templateArgsPos
},
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
tokens: [conv ? conv(o) : o]
};
}
}
}
}
return {
succeeded: false,
error: false,
src: input.src,
pos: input.start,
message: `operator "stringTemplatesParam()"`
};
};
} // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
function getStringParsers(params) {
const seq = charSequence(params.rawToToken);
const cls = charClass(params.rawToToken);
const notCls = charClassNot(params.rawToToken);
const clsFn = charClassByNeedleFn(params.rawToToken);
const cat = (0,_parser__WEBPACK_IMPORTED_MODULE_0__.transform)(params.concatTokens);
const once = (0,_parser__WEBPACK_IMPORTED_MODULE_0__.quantify)(1, 1);
const repeat = (0,_parser__WEBPACK_IMPORTED_MODULE_0__.quantify)(); // TODO: reduce unneccessary call for adding types.
const qty = (min, max) => (0,_parser__WEBPACK_IMPORTED_MODULE_0__.quantify)(min, max);
const combine = (0,_parser__WEBPACK_IMPORTED_MODULE_0__.transform)();
const erase = (0,_parser__WEBPACK_IMPORTED_MODULE_0__.transform)(tokens => []);
const isAlpha = clsFn(src => {
const p = src.codePointAt(0);
if (p === void 0) {
return -1;
}
const c = String.fromCodePoint(p);
return 'A' <= c && c <= 'Z' || 'a' <= c && c <= 'z' ? c.length : -1;
});
const isUpper = clsFn(src => {
const p = src.codePointAt(0);
if (p === void 0) {
return -1;
}
const c = String.fromCodePoint(p);
return 'A' <= c && c <= 'Z' ? c.length : -1;
});
const isLower = clsFn(src => {
const p = src.codePointAt(0);
if (p === void 0) {
return -1;
}
const c = String.fromCodePoint(p);
return 'a' <= c && c <= 'z' ? c.length : -1;
});
const isNumber = clsFn(src => {
const p = src.codePointAt(0);
if (p === void 0) {
return -1;
}
const c = String.fromCodePoint(p);
return '0' <= c && c <= '9' ? c.length : -1;
});
const isNonZeroNumber = clsFn(src => {
const p = src.codePointAt(0);
if (p === void 0) {
return -1;
}
const c = String.fromCodePoint(p);
return '1' <= c && c <= '9' ? c.length : -1;
});
const isBinNum = clsFn(src => {
const p = src.codePointAt(0);
if (p === void 0) {
return -1;
}
const c = String.fromCodePoint(p);
return '0' <= c && c <= '1' ? c.length : -1;
});
const isOctNum = clsFn(src => {
const p = src.codePointAt(0);
if (p === void 0) {
return -1;
}
const c = String.fromCodePoint(p);
return '0' <= c && c <= '7' ? c.length : -1;
});
const isHexNum = clsFn(src => {
const p = src.codePointAt(0);
if (p === void 0) {
return -1;
}
const c = String.fromCodePoint(p);
return 'A' <= c && c <= 'F' || 'a' <= c && c <= 'f' || '0' <= c && c <= '9' ? c.length : -1;
});
const isAlNum = clsFn(src => {
const p = src.codePointAt(0);
if (p === void 0) {
return -1;
}
const c = String.fromCodePoint(p);
return 'A' <= c && c <= 'Z' || 'a' <= c && c <= 'z' || '0' <= c && c <= '9' ? c.length : -1;
});
const isSpace = clsFn(src => {
const p = src.codePointAt(0);
if (p === void 0) {
return -1;
}
const c = String.fromCodePoint(p);
return (' \f\n\r\t\v\u00a0\u1680\u180e' + '\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a' + '\u2028\u2029\u202f\u205f\u3000\ufeff').includes(c) ? c.length : -1;
});
const isSpaceWithinSingleLine = clsFn(src => {
const p = src.codePointAt(0);
if (p === void 0) {
return -1;
}
const c = String.fromCodePoint(p);
return (' \f\t\v\u00a0\u1680\u180e' + '\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a' + '\u2028\u2029\u202f\u205f\u3000\ufeff').includes(c) ? c.length : -1;
});
const isControl = clsFn(src => {
const p = src.codePointAt(0);
if (p === void 0) {
return -1;
}
const c = String.fromCodePoint(p);
return 0x0000 <= p && p <= 0x001f || 0x007f <= p && p <= 0x009f ? c.length : -1;
});
const isWord = clsFn(src => {
const p = src.codePointAt(0);
if (p === void 0) {
return -1;
}
const c = String.fromCodePoint(p);
return (' \f\n\r\t\v\u00a0\u1680\u180e' + '\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a' + '\u2028\u2029\u202f\u205f\u3000\ufeff').includes(c) || 0x0000 <= p && p <= 0x001f || 0x007f <= p && p <= 0x009f ? -1 : c.length;
});
const isNewline = cls('\r\n', '\n', '\r');
const isAny = clsFn(src => {
const p = src.codePointAt(0);
if (p === void 0) {
return -1;
}
const c = String.fromCodePoint(p);
return c.length;
});
const binSep = (0,_parser__WEBPACK_IMPORTED_MODULE_0__.first)(isBinNum, cls('_'));
const octSep = (0,_parser__WEBPACK_IMPORTED_MODULE_0__.first)(isOctNum, cls('_'));
const hexSep = (0,_parser__WEBPACK_IMPORTED_MODULE_0__.first)(isHexNum, cls('_'));
const binaryIntegerNumber = (...prefixes) => combine(erase((0,_parser__WEBPACK_IMPORTED_MODULE_0__.first)(...prefixes)), cat(once(isBinNum), repeat(binSep)));
const octalIntegerNumber = (...prefixes) => combine(erase((0,_parser__WEBPACK_IMPORTED_MODULE_0__.first)(...prefixes)), cat(once(isOctNum), repeat(octSep)));
const hexIntegerValue = (...prefixes) => combine(erase((0,_parser__WEBPACK_IMPORTED_MODULE_0__.first)(...prefixes)), cat(once(isHexNum), repeat(hexSep)));
const decimalIntegerNumber = combine(cat(qty(0, 1)(cls('+', '-')), (0,_parser__WEBPACK_IMPORTED_MODULE_0__.first)(combine(once(isNonZeroNumber), repeat((0,_parser__WEBPACK_IMPORTED_MODULE_0__.first)(isNumber, cls('_')))), seq('0'))));
const bigDecimalIntegerNumber = combine(cat(decimalIntegerNumber, erase(seq('n'))));
const floatingPointNumber = combine(cat(qty(0, 1)(cls('+', '-')), (0,_parser__WEBPACK_IMPORTED_MODULE_0__.first)(combine(once(isNonZeroNumber), repeat((0,_parser__WEBPACK_IMPORTED_MODULE_0__.first)(isNumber, cls('_')))), seq('0')), qty(0, 1)(combine(seq('.'), qty(1)((0,_parser__WEBPACK_IMPORTED_MODULE_0__.first)(isNumber, cls('_'))))), qty(0, 1)(combine(cls('E', 'e'), qty(0, 1)(cls('+', '-')), (0,_parser__WEBPACK_IMPORTED_MODULE_0__.first)(combine(once(isNonZeroNumber), repeat(isNumber)), seq('0')))))); // TODO: reduce unneccessary call for adding types.
return {
seq,
cls,
notCls,
clsFn,
classes: {
alpha: isAlpha,
upper: isUpper,
lower: isLower,
num: isNumber,
nonzero: isNonZeroNumber,
bin: isBinNum,
oct: isOctNum,
hex: isHexNum,
alnum: isAlNum,
space: isSpace,
spaceWithinSingleLine: isSpaceWithinSingleLine,
ctrl: isControl,
newline: isNewline,
word: isWord,
any: isAny
},
numbers: {
bin: binaryIntegerNumber,
oct: octalIntegerNumber,
hex: hexIntegerValue,
int: decimalIntegerNumber,
bigint: bigDecimalIntegerNumber,
float: floatingPointNumber
},
isParam: templateStringsParam,
cat,
once,
repeat,
qty,
zeroWidth: helper => (0,_parser__WEBPACK_IMPORTED_MODULE_0__.zeroWidth)(helper),
err: message => (0,_parser__WEBPACK_IMPORTED_MODULE_0__.zeroWidthError)(message),
beginning: helper => (0,_parser__WEBPACK_IMPORTED_MODULE_0__.beginning)(helper),
end: helper => (0,_parser__WEBPACK_IMPORTED_MODULE_0__.end)(helper),
first: (...parsers) => (0,_parser__WEBPACK_IMPORTED_MODULE_0__.first)(...parsers),
or: (...parsers) => (0,_parser__WEBPACK_IMPORTED_MODULE_0__.or)(...parsers),
combine,
erase,
trans: fn => (0,_parser__WEBPACK_IMPORTED_MODULE_0__.transform)(fn),
ahead: (...parsers) => (0,_parser__WEBPACK_IMPORTED_MODULE_0__.lookAhead)(...parsers),
behind: (n, helper) => (0,_parser__WEBPACK_IMPORTED_MODULE_0__.lookBehind)(n, helper),
rules: args => (0,_parser__WEBPACK_IMPORTED_MODULE_0__.applyProductionRules)(args),
makeProgram: _parser__WEBPACK_IMPORTED_MODULE_0__.makeProgram
};
}
/***/ }),
/***/ "./node_modules/fruitsconfits/modules/lib/types.js":
/*!*********************************************************!*\
!*** ./node_modules/fruitsconfits/modules/lib/types.js ***!
\*********************************************************/
/*! namespace exports */
/*! export ParseError [provided] [no usage info] [missing usage info prevents renaming] */
/*! export parserInput [provided] [no usage info] [missing usage info prevents renaming] */
/*! export templateStringsParserInput [provided] [no usage info] [missing usage info prevents renaming] */
/*! other exports [not provided] [no usage info] */
/*! runtime requirements: __webpack_require__.r, __webpack_exports__, __webpack_require__.d, __webpack_require__.* */
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "ParseError": () => /* binding */ ParseError,
/* harmony export */ "parserInput": () => /* binding */ parserInput,
/* harmony export */ "templateStringsParserInput": () => /* binding */ templateStringsParserInput
/* harmony export */ });
// Copyright (c) 2019 Shellyl_N and Authors
// license: ISC
// https://github.com/shellyln
class ParseError extends Error {
constructor(result) {
super(result.message);
this.result = result;
}
}
function parserInput(src, context) {
return {
src,
start: 0,
end: src.length,
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
context: context,
templateArgs: [],
templateArgsPos: []
};
}
function templateStringsParserInput(strings, values, context) {
const templateArgsPos = [];
let pos = 0;
if (values.length) {
for (let i = 0; i < strings.length; i++) {
const x = strings[i];
if (i < values.length) {
templateArgsPos.push(pos + x.length);
pos += x.length + 1;
}
}
}
const joined = strings.join('\x00');
return {
src: joined,
start: 0,
end: joined.length,
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
context: context,
templateArgs: values,
templateArgsPos
};
}
/***/ }),
/***/ "./node_modules/liyad/modules/s-exp/ast.js":
/*!*************************************************!*\
!*** ./node_modules/liyad/modules/s-exp/ast.js ***!
\*************************************************/
/*! namespace exports */
/*! export backquote [provided] [no usage info] [missing usage info prevents renaming] */
/*! export isBackquoted [provided] [no usage info] [missing usage info prevents renaming] */
/*! export isQuoted [provided] [no usage info] [missing usage info prevents renaming] */
/*! export isSymbol [provided] [no usage info] [missing usage info prevents renaming] */
/*! export isUnquoted [provided] [no usage info] [missing usage info prevents renaming] */
/*! export quote [provided] [no usage info] [missing usage info prevents renaming] */
/*! export splice [provided] [no usage info] [missing usage info prevents renaming] */
/*! export spread [provided] [no usage info] [missing usage info prevents renaming] */
/*! export wrapByUnquote [provided] [no usage info] [missing usage info prevents renaming] */
/*! other exports [not provided] [no usage info] */
/*! runtime requirements: __webpack_require__.r, __webpack_exports__, __webpack_require__.d, __webpack_require__.* */
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "quote": () => /* binding */ quote,
/* harmony export */ "isQuoted": () => /* binding */ isQuoted,
/* harmony export */ "backquote": () => /* binding */ backquote,
/* harmony export */ "isBackquoted": () => /* binding */ isBackquoted,
/* harmony export */ "wrapByUnquote": () => /* binding */ wrapByUnquote,
/* harmony export */ "isUnquoted": () => /* binding */ isUnquoted,
/* harmony export */ "spread": () => /* binding */ spread,
/* harmony export */ "splice": () => /* binding */ splice,
/* harmony export */ "isSymbol": () => /* binding */ isSymbol
/* harmony export */ });
// Copyright (c) 2018, Shellyl_N and Authors
// license: ISC
// https://github.com/shellyln
function quote(state, x) {
return [{
symbol: state.config.reservedNames.quote
}, x];
}
function isQuoted(state, x) {
if (Array.isArray(x) && 0 < x.length) {
const q = isSymbol(x);
if (q && q.symbol === state.config.reservedNames.quote) {
return true;
}
}
return false;
}
function backquote(state, x) {
return [{
symbol: state.config.reservedNames.backquote
}, x];
}
function isBackquoted(state, x) {
if (Array.isArray(x) && 0 < x.length) {
const q = isSymbol(x);
if (q && q.symbol === state.config.reservedNames.backquote) {
return true;
}
}
return false;
}
function wrapByUnquote(state, x) {
return [{
symbol: state.config.reservedNames.unquote
}, x];
}
function isUnquoted(state, x) {
if (Array.isArray(x) && 0 < x.length) {
const q = isSymbol(x);
if (q && q.symbol === state.config.reservedNames.unquote) {
return true;
}
}
return false;
}
function spread(state, x) {
return [{
symbol: state.config.reservedNames.spread
}, x];
}
function splice(state, x) {
return [{
symbol: state.config.reservedNames.splice
}, x];
}
function isSymbol(x, name) {
if (x && typeof x === 'object' && Object.prototype.hasOwnProperty.call(x, 'symbol')) {
if (name !== void 0) {
return x.symbol === name ? x : null;
} else {
return x;
}
}
return null;
}
/***/ }),
/***/ "./node_modules/liyad/modules/s-exp/compile.js":
/*!*****************************************************!*\
!*** ./node_modules/liyad/modules/s-exp/compile.js ***!
\*****************************************************/
/*! namespace exports */
/*! export compileLambda [provided] [no usage info] [missing usage info prevents renaming] */
/*! other exports [not provided] [no usage info] */
/*! runtime requirements: __webpack_require__, __webpack_require__.r, __webpack_exports__, __webpack_require__.d, __webpack_require__.* */
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "compileLambda": () => /* binding */ compileLambda
/* harmony export */ });
/* harmony import */ var _ast__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./ast */ "./node_modules/liyad/modules/s-exp/ast.js");
/* harmony import */ var _evaluate__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./evaluate */ "./node_modules/liyad/modules/s-exp/evaluate.js");
/* harmony import */ var _errors__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./errors */ "./node_modules/liyad/modules/s-exp/errors.js");
/* harmony import */ var _compile_ops_helpers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./compile.ops/helpers */ "./node_modules/liyad/modules/s-exp/compile.ops/helpers.js");
/* harmony import */ var _compile_ops__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./compile.ops */ "./node_modules/liyad/modules/s-exp/compile.ops/index.js");
// Copyright (c) 2018, Shellyl_N and Authors
// license: ISC
// https://github.com/shellyln
// tslint:disable-next-line:variable-name
function compileCore(state, formalArgs, lastIsSpread, fnBody, _$_vars) {
function makeScope(scoped) {
const varNamesCopy = new Map();
for (const x of ctx.varNames.entries()) {
varNamesCopy.set(x[0], x[1]);
}
scoped();
ctx.varNames = varNamesCopy;
}
function compileValue(b) {
let compFnBody = '';
if (b === null) {
compFnBody += '(null)';
} else if (b === void 0) {
compFnBody += '(void 0)';
} else switch (typeof b) {
case 'boolean':
case 'number':
compFnBody += `(${String(b)})`;
break;
case 'object':
if ((0,_ast__WEBPACK_IMPORTED_MODULE_4__.isSymbol)(b)) {
const sym = b;
(0,_errors__WEBPACK_IMPORTED_MODULE_1__.checkUnsafeVarNamesEx)('(compiler)compileValue', ctx.varNames, sym.symbol);
if (ctx.varNames.has(sym.symbol)) {
compFnBody += `(${ctx.varNames.get(sym.symbol)})`;
} else {
_$_vars[ctx.varsCount] = sym.symbol;
compFnBody += `(_$_vars[${String(ctx.varsCount++)}])`;
}
break;
} else {}
// FALL_THRU
default:
_$_vars[ctx.varsCount] = b;
compFnBody += `(_$_vars[${String(ctx.varsCount++)}])`;
break;
}
return compFnBody;
}
function compileToken(body, i) {
let compFnBody = '';
const b = body[i];
if (Array.isArray(b)) {
if (0 < b.length) {
const r = (0,_compile_ops_helpers__WEBPACK_IMPORTED_MODULE_2__.applyMacros)(state, b);
if (Array.isArray(r)) {
if (0 < r.length) {
if ((0,_ast__WEBPACK_IMPORTED_MODULE_4__.isSymbol)(r[0])) {
const sym = r[0];
const args = r.slice(1);
(0,_errors__WEBPACK_IMPORTED_MODULE_1__.checkUnsafeVarNamesEx)('(compiler)compileToken', ops, sym.symbol);
if (ops.has(sym.symbol)) {
compFnBody += ops.get(sym.symbol)(r, args);
} else {
if (sym.symbol === state.config.reservedNames.spread) {
compFnBody += `...(${args.map(x => compileToken([(0,_compile_ops_helpers__WEBPACK_IMPORTED_MODULE_2__.stripQuoteOrPass)(state, x)], 0)).join(',')})`;
} else if (state.funcMap.has(sym.symbol)) {
_$_vars[ctx.varsCount] = state.funcMap.get(sym.symbol).fn(state, '');
compFnBody += `((_$_vars[${String(ctx.varsCount++)}])(${args.map(x => compileToken([(0,_compile_ops_helpers__WEBPACK_IMPORTED_MODULE_2__.stripQuoteOrPass)(state, x)], 0)).join(',')}))`;
} else if (ctx.varNames.has(sym.symbol)) {
compFnBody += `(${String(ctx.varNames.get(sym.symbol))})(${args.map(x => compileToken([(0,_compile_ops_helpers__WEBPACK_IMPORTED_MODULE_2__.stripQuoteOrPass)(state, x)], 0)).join(',')})`;
} else {
_$_vars[ctx.varsCount] = (0,_compile_ops_helpers__WEBPACK_IMPORTED_MODULE_2__.resolveValueSymbol_dynamic)(state, sym.symbol);
compFnBody += `((_$_vars[${String(ctx.varsCount++)}])()(${args.map(x => compileToken([(0,_compile_ops_helpers__WEBPACK_IMPORTED_MODULE_2__.stripQuoteOrPass)(state, x)], 0)).join(',')}))`;
}
}
} else {
switch (typeof r[0]) {
case 'function':
_$_vars[ctx.varsCount] = r[0];
compFnBody += `((_$_vars[${String(ctx.varsCount++)}])(${r.slice(1).map((x, idx, arr) => compileToken([(0,_compile_ops_helpers__WEBPACK_IMPORTED_MODULE_2__.stripQuoteOrPass)(state, x)], 0)).join(',')}))`;
break;
default:
throw new Error(`[SX] compileToken: First item of list is not a function: ${JSON.stringify(r[0])}.`);
}
}
} else {
compFnBody += '([])';
}
} else {
compFnBody += compileValue(b);
}
} else {
compFnBody += '([])';
}
} else {
compFnBody += compileValue(b);
}
return compFnBody;
}
const ctx = {
_$_vars,
varsCount: 1,
varNames: new Map(),
varNamesCount: 0,
varDefs: 'var x0;',
ops: new Map(),
makeScope,
compileToken
};
(0,_compile_ops__WEBPACK_IMPORTED_MODULE_3__.registerOperators)(state, ctx);
const ops = ctx.ops;
if (state.config.enableTailCallOptimization) {
fnBody = (0,_evaluate__WEBPACK_IMPORTED_MODULE_0__.optimizeTailCall)(state, formalArgs, fnBody);
} // set 'this' object
ctx.varNames.set(state.config.reservedNames.thiz, `(this===(Function('return this')())?null:(this===void 0?null:this))`);
const capturedScopes = (0,_evaluate__WEBPACK_IMPORTED_MODULE_0__.getCapturedScopes)(state);
if (capturedScopes) {
for (const x in capturedScopes) {
if (Object.prototype.hasOwnProperty.call(capt