return sch;
}
exports.default = compileParser;
-const undef = codegen_1._ `undefined`;
+const undef = (0, codegen_1._) `undefined`;
function parserFunction(cxt) {
const { gen, parseName, char } = cxt;
- gen.func(parseName, codegen_1._ `${names_1.default.json}, ${names_1.default.jsonPos}, ${names_1.default.jsonPart}`, false, () => {
+ gen.func(parseName, (0, codegen_1._) `${names_1.default.json}, ${names_1.default.jsonPos}, ${names_1.default.jsonPart}`, false, () => {
gen.let(names_1.default.data);
gen.let(char);
- gen.assign(codegen_1._ `${parseName}.message`, undef);
- gen.assign(codegen_1._ `${parseName}.position`, undef);
- gen.assign(names_1.default.jsonPos, codegen_1._ `${names_1.default.jsonPos} || 0`);
- gen.const(names_1.default.jsonLen, codegen_1._ `${names_1.default.json}.length`);
+ gen.assign((0, codegen_1._) `${parseName}.message`, undef);
+ gen.assign((0, codegen_1._) `${parseName}.position`, undef);
+ gen.assign(names_1.default.jsonPos, (0, codegen_1._) `${names_1.default.jsonPos} || 0`);
+ gen.const(names_1.default.jsonLen, (0, codegen_1._) `${names_1.default.json}.length`);
parseCode(cxt);
skipWhitespace(cxt);
gen.if(names_1.default.jsonPart, () => {
- gen.assign(codegen_1._ `${parseName}.position`, names_1.default.jsonPos);
+ gen.assign((0, codegen_1._) `${parseName}.position`, names_1.default.jsonPos);
gen.return(names_1.default.data);
});
- gen.if(codegen_1._ `${names_1.default.jsonPos} === ${names_1.default.jsonLen}`, () => gen.return(names_1.default.data));
+ gen.if((0, codegen_1._) `${names_1.default.jsonPos} === ${names_1.default.jsonLen}`, () => gen.return(names_1.default.data));
jsonSyntaxError(cxt);
});
}
const { gen, schema, data } = cxt;
parseToken(cxt, "[");
const ix = gen.let("i", 0);
- gen.assign(data, codegen_1._ `[]`);
+ gen.assign(data, (0, codegen_1._) `[]`);
parseItems(cxt, "]", () => {
const el = gen.let("el");
parseCode({ ...cxt, schema: schema.elements, data: el });
- gen.assign(codegen_1._ `${data}[${ix}++]`, el);
+ gen.assign((0, codegen_1._) `${data}[${ix}++]`, el);
});
}
function parseValues(cxt) {
const { gen, schema, data } = cxt;
parseToken(cxt, "{");
- gen.assign(data, codegen_1._ `{}`);
+ gen.assign(data, (0, codegen_1._) `{}`);
parseItems(cxt, "}", () => parseKeyValue(cxt, schema.values));
}
function parseItems(cxt, endToken, block) {
}
function tryParseItems(cxt, endToken, block) {
const { gen } = cxt;
- gen.for(codegen_1._ `;${names_1.default.jsonPos}<${names_1.default.jsonLen} && ${jsonSlice(1)}!==${endToken};`, () => {
+ gen.for((0, codegen_1._) `;${names_1.default.jsonPos}<${names_1.default.jsonLen} && ${jsonSlice(1)}!==${endToken};`, () => {
block();
tryParseToken(cxt, ",", () => gen.break(), hasItem);
});
const { gen, data, schema } = cxt;
const { discriminator, mapping } = schema;
parseToken(cxt, "{");
- gen.assign(data, codegen_1._ `{}`);
+ gen.assign(data, (0, codegen_1._) `{}`);
const startPos = gen.const("pos", names_1.default.jsonPos);
const value = gen.let("value");
const tag = gen.let("tag");
const key = gen.let("key");
parseString({ ...cxt, data: key });
parseToken(cxt, ":");
- gen.if(codegen_1._ `${key} === ${discriminator}`, () => {
+ gen.if((0, codegen_1._) `${key} === ${discriminator}`, () => {
parseString({ ...cxt, data: tag });
- gen.assign(codegen_1._ `${data}[${key}]`, tag);
+ gen.assign((0, codegen_1._) `${data}[${key}]`, tag);
gen.break();
}, () => parseEmpty({ ...cxt, data: value }) // can be discarded/skipped
);
});
gen.assign(names_1.default.jsonPos, startPos);
- gen.if(codegen_1._ `${tag} === undefined`);
- parsingError(cxt, codegen_1.str `discriminator tag not found`);
+ gen.if((0, codegen_1._) `${tag} === undefined`);
+ parsingError(cxt, (0, codegen_1.str) `discriminator tag not found`);
for (const tagValue in mapping) {
- gen.elseIf(codegen_1._ `${tag} === ${tagValue}`);
+ gen.elseIf((0, codegen_1._) `${tag} === ${tagValue}`);
parseSchemaProperties({ ...cxt, schema: mapping[tagValue] }, discriminator);
}
gen.else();
- parsingError(cxt, codegen_1.str `discriminator value not in schema`);
+ parsingError(cxt, (0, codegen_1.str) `discriminator value not in schema`);
gen.endIf();
}
function parseProperties(cxt) {
const { gen, data } = cxt;
parseToken(cxt, "{");
- gen.assign(data, codegen_1._ `{}`);
+ gen.assign(data, (0, codegen_1._) `{}`);
parseSchemaProperties(cxt);
}
function parseSchemaProperties(cxt, discriminator) {
parseDefinedProperty(cxt, key, properties);
parseDefinedProperty(cxt, key, optionalProperties);
if (discriminator) {
- gen.elseIf(codegen_1._ `${key} === ${discriminator}`);
+ gen.elseIf((0, codegen_1._) `${key} === ${discriminator}`);
const tag = gen.let("tag");
parseString({ ...cxt, data: tag }); // can be discarded, it is already assigned
}
gen.else();
if (additionalProperties) {
- parseEmpty({ ...cxt, data: codegen_1._ `${data}[${key}]` });
+ parseEmpty({ ...cxt, data: (0, codegen_1._) `${data}[${key}]` });
}
else {
- parsingError(cxt, codegen_1.str `property ${key} not allowed`);
+ parsingError(cxt, (0, codegen_1.str) `property ${key} not allowed`);
}
gen.endIf();
});
if (properties) {
- const hasProp = code_1.hasPropFunc(gen);
- const allProps = codegen_1.and(...Object.keys(properties).map((p) => codegen_1._ `${hasProp}.call(${data}, ${p})`));
- gen.if(codegen_1.not(allProps), () => parsingError(cxt, codegen_1.str `missing required properties`));
+ const hasProp = (0, code_1.hasPropFunc)(gen);
+ const allProps = (0, codegen_1.and)(...Object.keys(properties).map((p) => (0, codegen_1._) `${hasProp}.call(${data}, ${p})`));
+ gen.if((0, codegen_1.not)(allProps), () => parsingError(cxt, (0, codegen_1.str) `missing required properties`));
}
}
function parseDefinedProperty(cxt, key, schemas = {}) {
const { gen } = cxt;
for (const prop in schemas) {
- gen.elseIf(codegen_1._ `${key} === ${prop}`);
+ gen.elseIf((0, codegen_1._) `${key} === ${prop}`);
parsePropertyValue(cxt, key, schemas[prop]);
}
}
function parsePropertyValue(cxt, key, schema) {
- parseCode({ ...cxt, schema, data: codegen_1._ `${cxt.data}[${key}]` });
+ parseCode({ ...cxt, schema, data: (0, codegen_1._) `${cxt.data}[${key}]` });
}
function parseType(cxt) {
- const { gen, schema, data } = cxt;
+ const { gen, schema, data, self } = cxt;
switch (schema.type) {
case "boolean":
parseBoolean(cxt);
parseString(cxt);
break;
case "timestamp": {
- // TODO parse timestamp?
parseString(cxt);
- const vts = util_1.useFunc(gen, timestamp_1.default);
- gen.if(codegen_1._ `!${vts}(${data})`, () => parsingError(cxt, codegen_1.str `invalid timestamp`));
+ const vts = (0, util_1.useFunc)(gen, timestamp_1.default);
+ const { allowDate, parseDate } = self.opts;
+ const notValid = allowDate ? (0, codegen_1._) `!${vts}(${data}, true)` : (0, codegen_1._) `!${vts}(${data})`;
+ const fail = parseDate
+ ? (0, codegen_1.or)(notValid, (0, codegen_1._) `(${data} = new Date(${data}), false)`, (0, codegen_1._) `isNaN(${data}.valueOf())`)
+ : notValid;
+ gen.if(fail, () => parsingError(cxt, (0, codegen_1.str) `invalid timestamp`));
break;
}
case "float32":
parseNumber(cxt);
break;
default: {
- const [min, max, maxDigits] = type_1.intRange[schema.type];
- parseNumber(cxt, maxDigits);
- gen.if(codegen_1._ `${data} < ${min} || ${data} > ${max}`, () => parsingError(cxt, codegen_1.str `integer out of range`));
+ const t = schema.type;
+ if (!self.opts.int32range && (t === "int32" || t === "uint32")) {
+ parseNumber(cxt, 16); // 2 ** 53 - max safe integer
+ if (t === "uint32") {
+ gen.if((0, codegen_1._) `${data} < 0`, () => parsingError(cxt, (0, codegen_1.str) `integer out of range`));
+ }
+ }
+ else {
+ const [min, max, maxDigits] = type_1.intRange[t];
+ parseNumber(cxt, maxDigits);
+ gen.if((0, codegen_1._) `${data} < ${min} || ${data} > ${max}`, () => parsingError(cxt, (0, codegen_1.str) `integer out of range`));
+ }
}
}
}
gen.if(false);
for (const value of enumSch) {
const valueStr = JSON.stringify(value).slice(1); // remove starting quote
- gen.elseIf(codegen_1._ `${jsonSlice(valueStr.length)} === ${valueStr}`);
- gen.assign(data, codegen_1.str `${value}`);
+ gen.elseIf((0, codegen_1._) `${jsonSlice(valueStr.length)} === ${valueStr}`);
+ gen.assign(data, (0, codegen_1.str) `${value}`);
gen.add(names_1.default.jsonPos, valueStr.length);
}
gen.else();
function parseNumber(cxt, maxDigits) {
const { gen } = cxt;
skipWhitespace(cxt);
- gen.if(codegen_1._ `"-0123456789".indexOf(${jsonSlice(1)}) < 0`, () => jsonSyntaxError(cxt), () => parseWith(cxt, parseJson_1.parseJsonNumber, maxDigits));
+ gen.if((0, codegen_1._) `"-0123456789".indexOf(${jsonSlice(1)}) < 0`, () => jsonSyntaxError(cxt), () => parseWith(cxt, parseJson_1.parseJsonNumber, maxDigits));
}
function parseBooleanToken(bool, fail) {
return (cxt) => {
const refSchema = definitions[ref];
if (!refSchema)
throw new ref_error_1.default("", ref, `No definition ${ref}`);
- if (!ref_1.hasRef(refSchema))
+ if (!(0, ref_1.hasRef)(refSchema))
return parseCode({ ...cxt, schema: refSchema });
const { root } = schemaEnv;
const sch = compileParser.call(self, new __1.SchemaEnv({ schema: refSchema, root }), definitions);
function getParser(gen, sch) {
return sch.parse
? gen.scopeValue("parse", { ref: sch.parse })
- : codegen_1._ `${gen.scopeValue("wrapper", { ref: sch })}.parse`;
+ : (0, codegen_1._) `${gen.scopeValue("wrapper", { ref: sch })}.parse`;
}
function parseEmpty(cxt) {
parseWith(cxt, parseJson_1.parseJson);
}
function parseWith(cxt, parseFunc, args) {
- partialParse(cxt, util_1.useFunc(cxt.gen, parseFunc), args);
+ partialParse(cxt, (0, util_1.useFunc)(cxt.gen, parseFunc), args);
}
function partialParse(cxt, parseFunc, args) {
const { gen, data } = cxt;
- gen.assign(data, codegen_1._ `${parseFunc}(${names_1.default.json}, ${names_1.default.jsonPos}${args ? codegen_1._ `, ${args}` : codegen_1.nil})`);
- gen.assign(names_1.default.jsonPos, codegen_1._ `${parseFunc}.position`);
- gen.if(codegen_1._ `${data} === undefined`, () => parsingError(cxt, codegen_1._ `${parseFunc}.message`));
+ gen.assign(data, (0, codegen_1._) `${parseFunc}(${names_1.default.json}, ${names_1.default.jsonPos}${args ? (0, codegen_1._) `, ${args}` : codegen_1.nil})`);
+ gen.assign(names_1.default.jsonPos, (0, codegen_1._) `${parseFunc}.position`);
+ gen.if((0, codegen_1._) `${data} === undefined`, () => parsingError(cxt, (0, codegen_1._) `${parseFunc}.message`));
}
function parseToken(cxt, tok) {
tryParseToken(cxt, tok, jsonSyntaxError);
const { gen } = cxt;
const n = tok.length;
skipWhitespace(cxt);
- gen.if(codegen_1._ `${jsonSlice(n)} === ${tok}`, () => {
+ gen.if((0, codegen_1._) `${jsonSlice(n)} === ${tok}`, () => {
gen.add(names_1.default.jsonPos, n);
success === null || success === void 0 ? void 0 : success(cxt);
}, () => fail(cxt));
}
function skipWhitespace({ gen, char: c }) {
- gen.code(codegen_1._ `while((${c}=${names_1.default.json}[${names_1.default.jsonPos}],${c}===" "||${c}==="\\n"||${c}==="\\r"||${c}==="\\t"))${names_1.default.jsonPos}++;`);
+ gen.code((0, codegen_1._) `while((${c}=${names_1.default.json}[${names_1.default.jsonPos}],${c}===" "||${c}==="\\n"||${c}==="\\r"||${c}==="\\t"))${names_1.default.jsonPos}++;`);
}
function jsonSlice(len) {
return len === 1
- ? codegen_1._ `${names_1.default.json}[${names_1.default.jsonPos}]`
- : codegen_1._ `${names_1.default.json}.slice(${names_1.default.jsonPos}, ${names_1.default.jsonPos}+${len})`;
+ ? (0, codegen_1._) `${names_1.default.json}[${names_1.default.jsonPos}]`
+ : (0, codegen_1._) `${names_1.default.json}.slice(${names_1.default.jsonPos}, ${names_1.default.jsonPos}+${len})`;
}
function jsonSyntaxError(cxt) {
- parsingError(cxt, codegen_1._ `"unexpected token " + ${names_1.default.json}[${names_1.default.jsonPos}]`);
+ parsingError(cxt, (0, codegen_1._) `"unexpected token " + ${names_1.default.json}[${names_1.default.jsonPos}]`);
}
function parsingError({ gen, parseName }, msg) {
- gen.assign(codegen_1._ `${parseName}.message`, msg);
- gen.assign(codegen_1._ `${parseName}.position`, names_1.default.jsonPos);
+ gen.assign((0, codegen_1._) `${parseName}.message`, msg);
+ gen.assign((0, codegen_1._) `${parseName}.position`, names_1.default.jsonPos);
gen.return(undef);
}
//# sourceMappingURL=parse.js.map
\ No newline at end of file