skir-codemirror-plugin 1.0.2 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -6
- package/dist/codemirror/create_editor_state.d.ts +4 -2
- package/dist/codemirror/create_editor_state.d.ts.map +1 -1
- package/dist/codemirror/create_editor_state.js +178 -31
- package/dist/codemirror/create_editor_state.js.map +1 -1
- package/dist/codemirror/json_linter.d.ts.map +1 -1
- package/dist/codemirror/json_linter.js +67 -3
- package/dist/codemirror/json_linter.js.map +1 -1
- package/dist/codemirror/json_state.d.ts +5 -1
- package/dist/codemirror/json_state.d.ts.map +1 -1
- package/dist/codemirror/json_state.js +26 -1
- package/dist/codemirror/json_state.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/json/json_parser.js +35 -1
- package/dist/json/json_parser.js.map +1 -1
- package/dist/json/json_parser.test.js +48 -0
- package/dist/json/json_parser.test.js.map +1 -1
- package/dist/json/schema_validator.d.ts.map +1 -1
- package/dist/json/schema_validator.js +16 -11
- package/dist/json/schema_validator.js.map +1 -1
- package/dist/json/schema_validator.test.js +71 -0
- package/dist/json/schema_validator.test.js.map +1 -1
- package/dist/json/to_json.d.ts +1 -1
- package/dist/json/to_json.d.ts.map +1 -1
- package/dist/json/to_json.js +3 -3
- package/dist/json/to_json.js.map +1 -1
- package/dist/json/types.d.ts +4 -0
- package/dist/json/types.d.ts.map +1 -1
- package/dist/json/types.js.map +1 -1
- package/package.json +2 -3
- package/src/codemirror/create_editor_state.ts +272 -31
- package/src/codemirror/json_linter.ts +89 -4
- package/src/codemirror/json_state.ts +44 -1
- package/src/index.ts +1 -0
- package/src/json/json_parser.test.ts +51 -0
- package/src/json/json_parser.ts +37 -1
- package/src/json/schema_validator.test.ts +75 -0
- package/src/json/schema_validator.ts +20 -10
- package/src/json/to_json.ts +3 -3
- package/src/json/types.ts +7 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json_parser.test.js","sourceRoot":"","sources":["../../src/json/json_parser.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect } from \"buckwheat\";\nimport { describe, it } from \"mocha\";\nimport { parseJsonValue } from \"./json_parser.js\";\n\ndescribe(\"json_parser\", () => {\n it(\"parses true\", () => {\n expect(parseJsonValue(\"true\")).toMatch({\n value: {\n kind: \"literal\",\n jsonCode: \"true\",\n type: \"boolean\",\n },\n errors: [],\n edits: [],\n });\n });\n\n it(\"parses false\", () => {\n expect(parseJsonValue(\"false\")).toMatch({\n value: {\n kind: \"literal\",\n jsonCode: \"false\",\n type: \"boolean\",\n },\n errors: [],\n edits: [],\n });\n });\n\n it(\"parses null\", () => {\n expect(parseJsonValue(\"null\")).toMatch({\n value: {\n kind: \"literal\",\n jsonCode: \"null\",\n type: \"null\",\n },\n errors: [],\n edits: [],\n });\n });\n\n it(\"parses number\", () => {\n expect(parseJsonValue(\"123.45\")).toMatch({\n value: {\n kind: \"literal\",\n jsonCode: \"123.45\",\n type: \"number\",\n },\n errors: [],\n edits: [],\n });\n });\n\n it(\"parses string\", () => {\n expect(parseJsonValue('\"hello\"')).toMatch({\n value: {\n kind: \"literal\",\n jsonCode: '\"hello\"',\n type: \"string\",\n },\n errors: [],\n edits: [],\n });\n });\n\n it(\"parses empty array\", () => {\n expect(parseJsonValue(\"[]\")).toMatch({\n value: { kind: \"array\", values: [] },\n errors: [],\n edits: [],\n });\n });\n\n it(\"parses array with values\", () => {\n expect(parseJsonValue(\"[1, true]\")).toMatch({\n value: {\n kind: \"array\",\n values: [\n { kind: \"literal\", jsonCode: \"1\", type: \"number\" },\n { kind: \"literal\", jsonCode: \"true\", type: \"boolean\" },\n ],\n },\n errors: [],\n edits: [\n { segment: { start: 1, end: 1 }, replacement: \"\\n \" },\n { segment: { start: 3, end: 4 }, replacement: \"\\n \" },\n { segment: { start: 8, end: 8 }, replacement: \"\\n\" },\n ],\n });\n });\n\n it(\"parses empty object\", () => {\n expect(parseJsonValue(\"{}\")).toMatch({\n value: {\n kind: \"object\",\n keyValues: {},\n },\n errors: [],\n edits: [],\n });\n });\n\n it(\"parses object with values\", () => {\n expect(parseJsonValue('{\"a\": 1}')).toMatch({\n value: {\n kind: \"object\",\n keyValues: {\n a: {\n key: \"a\",\n value: { kind: \"literal\", jsonCode: \"1\", type: \"number\" },\n },\n },\n },\n errors: [],\n edits: [\n { segment: { start: 1, end: 1 }, replacement: \"\\n \" },\n { segment: { start: 7, end: 7 }, replacement: \"\\n\" },\n ],\n });\n });\n\n it(\"parses arrays with whitespace\", () => {\n expect(parseJsonValue(\" [ 1 ] \")).toMatch({\n value: {\n kind: \"array\",\n values: [{ kind: \"literal\", jsonCode: \"1\" }],\n },\n errors: [],\n edits: [\n { segment: { start: 0, end: 1 }, replacement: \"\" },\n { segment: { start: 2, end: 3 }, replacement: \"\\n \" },\n { segment: { start: 4, end: 5 }, replacement: \"\\n\" },\n { segment: { start: 6, end: 7 }, replacement: \"\" },\n ],\n });\n });\n\n it(\"reports error for invalid token\", () => {\n expect(parseJsonValue(\"@\")).toMatch({\n value: undefined,\n errors: [\n {\n kind: \"error\",\n message: \"not a token\",\n segment: { start: 0, end: 1 },\n },\n ],\n edits: [],\n });\n });\n\n it(\"reports error for unclosed array\", () => {\n expect(parseJsonValue(\"[\")).toMatch({\n value: { kind: \"array\", values: [] },\n errors: [\n {\n kind: \"error\",\n message: \"expected: ']'\",\n segment: { start: 1, end: 1 },\n },\n ],\n edits: [{ segment: { start: 1, end: 1 }, replacement: \"\\n \" }],\n });\n });\n\n it(\"parses object with missing value (lenient)\", () => {\n expect(\n parseJsonValue(`{\n \"foo\": true,\n \"bar\"\n }`),\n ).toMatch({\n value: {\n kind: \"object\",\n keyValues: {\n foo: {\n key: \"foo\",\n value: { kind: \"literal\", jsonCode: \"true\", type: \"boolean\" },\n },\n },\n },\n errors: [\n {\n kind: \"error\",\n message: \"expected: ':'\",\n segment: { start: 37, end: 38 },\n },\n ],\n });\n });\n\n it(\"parses object with trailing comma (lenient)\", () => {\n expect(\n parseJsonValue(`{\n \"a\": 1,\n \"b\": 2,\n }`),\n ).toMatch({\n value: {\n kind: \"object\",\n keyValues: {\n a: {\n key: \"a\",\n value: { kind: \"literal\", jsonCode: \"1\", type: \"number\" },\n },\n b: {\n key: \"b\",\n value: { kind: \"literal\", jsonCode: \"2\", type: \"number\" },\n },\n },\n },\n errors: [],\n edits: [\n { segment: { start: 1, end: 8 }, replacement: \"\\n \" },\n { segment: { start: 15, end: 22 }, replacement: \"\\n \" },\n { segment: { start: 28, end: 29 }, replacement: \"\" },\n { segment: { start: 29, end: 34 }, replacement: \"\\n\" },\n ],\n });\n });\n\n it(\"parses array with trailing comma (lenient)\", () => {\n expect(parseJsonValue(`[1, 2,]`)).toMatch({\n value: {\n kind: \"array\",\n values: [\n { kind: \"literal\", jsonCode: \"1\", type: \"number\" },\n { kind: \"literal\", jsonCode: \"2\", type: \"number\" },\n ],\n },\n errors: [],\n edits: [\n { segment: { start: 1, end: 1 }, replacement: \"\\n \" },\n { segment: { start: 3, end: 4 }, replacement: \"\\n \" },\n { segment: { start: 5, end: 6 }, replacement: \"\" },\n { segment: { start: 6, end: 6 }, replacement: \"\\n\" },\n ],\n });\n });\n\n it(\"parses array without commas (adds commas via edits)\", () => {\n expect(parseJsonValue(\"[1 2 3]\")).toMatch({\n value: {\n kind: \"array\",\n values: [\n { kind: \"literal\", jsonCode: \"1\", type: \"number\" },\n { kind: \"literal\", jsonCode: \"2\", type: \"number\" },\n { kind: \"literal\", jsonCode: \"3\", type: \"number\" },\n ],\n },\n errors: [],\n edits: [\n { segment: { start: 1, end: 1 }, replacement: \"\\n \" },\n { segment: { start: 2, end: 3 }, replacement: \",\\n \" },\n { segment: { start: 4, end: 5 }, replacement: \",\\n \" },\n { segment: { start: 6, end: 6 }, replacement: \"\\n\" },\n ],\n });\n });\n\n it(\"parses object without commas (adds commas via edits)\", () => {\n expect(parseJsonValue('{\"a\": 1 \"b\": 2}')).toMatch({\n value: {\n kind: \"object\",\n keyValues: {\n a: {\n key: \"a\",\n value: { kind: \"literal\", jsonCode: \"1\", type: \"number\" },\n },\n b: {\n key: \"b\",\n value: { kind: \"literal\", jsonCode: \"2\", type: \"number\" },\n },\n },\n },\n errors: [],\n edits: [\n { segment: { start: 1, end: 1 }, replacement: \"\\n \" },\n { segment: { start: 7, end: 8 }, replacement: \",\\n \" },\n { segment: { start: 14, end: 14 }, replacement: \"\\n\" },\n ],\n });\n });\n\n it(\"parses object with key missing colon (no infinite loop)\", () => {\n const result = parseJsonValue(`\n {\n \"x\": 0,\n \"\"\n \"y\": 0\n }`);\n // Should parse without hanging\n // Note: The empty key without colon causes skip() to consume \"y\": 0\n expect(result).toMatch({\n value: {\n kind: \"object\",\n keyValues: {\n x: {\n key: \"x\",\n value: { kind: \"literal\", jsonCode: \"0\", type: \"number\" },\n },\n },\n allKeys: [\n {\n key: \"x\",\n },\n {\n key: \"\",\n },\n {\n key: \"y\",\n },\n ],\n },\n errors: [\n {\n kind: \"error\",\n message: \"expected: ':'\",\n },\n ],\n });\n });\n\n it(\"parses object with double comma (no infinite loop)\", () => {\n const result = parseJsonValue('{\"x\": 1, , \"y\": 2}');\n // Should parse without hanging - the double comma should be handled\n expect(result.value).toMatch({\n kind: \"object\",\n keyValues: {\n x: {\n key: \"x\",\n value: { kind: \"literal\", jsonCode: \"1\", type: \"number\" },\n },\n y: {\n key: \"y\",\n value: { kind: \"literal\", jsonCode: \"2\", type: \"number\" },\n },\n },\n });\n // Should have error for the unexpected comma\n expect(result.errors.length > 0).toBe(true);\n });\n\n it(\"parses array with invalid element followed by comma (no infinite loop)\", () => {\n const result = parseJsonValue(`[\n 1,\n @\n 2\n]`);\n // Invalid token @ causes tokenization error\n expect(result.value).toBe(undefined);\n // Should have error for invalid token\n expect(result.errors).toMatch([\n {\n kind: \"error\",\n message: \"not a token\",\n },\n ]);\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"json_parser.test.js","sourceRoot":"","sources":["../../src/json/json_parser.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect } from \"buckwheat\";\nimport { describe, it } from \"mocha\";\nimport { parseJsonValue } from \"./json_parser.js\";\n\ndescribe(\"json_parser\", () => {\n it(\"parses true\", () => {\n expect(parseJsonValue(\"true\")).toMatch({\n value: {\n kind: \"literal\",\n jsonCode: \"true\",\n type: \"boolean\",\n },\n errors: [],\n edits: [],\n });\n });\n\n it(\"parses false\", () => {\n expect(parseJsonValue(\"false\")).toMatch({\n value: {\n kind: \"literal\",\n jsonCode: \"false\",\n type: \"boolean\",\n },\n errors: [],\n edits: [],\n });\n });\n\n it(\"parses null\", () => {\n expect(parseJsonValue(\"null\")).toMatch({\n value: {\n kind: \"literal\",\n jsonCode: \"null\",\n type: \"null\",\n },\n errors: [],\n edits: [],\n });\n });\n\n it(\"parses number\", () => {\n expect(parseJsonValue(\"123.45\")).toMatch({\n value: {\n kind: \"literal\",\n jsonCode: \"123.45\",\n type: \"number\",\n },\n errors: [],\n edits: [],\n });\n });\n\n it(\"parses string\", () => {\n expect(parseJsonValue('\"hello\"')).toMatch({\n value: {\n kind: \"literal\",\n jsonCode: '\"hello\"',\n type: \"string\",\n },\n errors: [],\n edits: [],\n });\n });\n\n it(\"tracks indent for top-level literal\", () => {\n expect(parseJsonValue(\" true\")).toMatch({\n value: {\n kind: \"literal\",\n jsonCode: \"true\",\n type: \"boolean\",\n indent: 3,\n },\n errors: [],\n });\n });\n\n it(\"parses empty array\", () => {\n expect(parseJsonValue(\"[]\")).toMatch({\n value: { kind: \"array\", values: [] },\n errors: [],\n edits: [],\n });\n });\n\n it(\"parses array with values\", () => {\n expect(parseJsonValue(\"[1, true]\")).toMatch({\n value: {\n kind: \"array\",\n values: [\n { kind: \"literal\", jsonCode: \"1\", type: \"number\" },\n { kind: \"literal\", jsonCode: \"true\", type: \"boolean\" },\n ],\n },\n errors: [],\n edits: [\n { segment: { start: 1, end: 1 }, replacement: \"\\n \" },\n { segment: { start: 3, end: 4 }, replacement: \"\\n \" },\n { segment: { start: 8, end: 8 }, replacement: \"\\n\" },\n ],\n });\n });\n\n it(\"parses empty object\", () => {\n expect(parseJsonValue(\"{}\")).toMatch({\n value: {\n kind: \"object\",\n keyValues: {},\n },\n errors: [],\n edits: [],\n });\n });\n\n it(\"parses object with values\", () => {\n expect(parseJsonValue('{\"a\": 1}')).toMatch({\n value: {\n kind: \"object\",\n keyValues: {\n a: {\n key: \"a\",\n value: { kind: \"literal\", jsonCode: \"1\", type: \"number\" },\n },\n },\n },\n errors: [],\n edits: [\n { segment: { start: 1, end: 1 }, replacement: \"\\n \" },\n { segment: { start: 7, end: 7 }, replacement: \"\\n\" },\n ],\n });\n });\n\n it(\"tracks indent from line leading spaces for field values\", () => {\n const result = parseJsonValue(`{\n \"a\": 1,\n \"b\": [\n 2\n ]\n}`);\n\n expect(result).toMatch({\n value: {\n kind: \"object\",\n indent: 0,\n keyValues: {\n a: {\n value: {\n kind: \"literal\",\n jsonCode: \"1\",\n indent: 2,\n },\n },\n b: {\n value: {\n kind: \"array\",\n indent: 2,\n values: [\n {\n kind: \"literal\",\n jsonCode: \"2\",\n indent: 4,\n },\n ],\n },\n },\n },\n },\n errors: [],\n });\n });\n\n it(\"parses arrays with whitespace\", () => {\n expect(parseJsonValue(\" [ 1 ] \")).toMatch({\n value: {\n kind: \"array\",\n values: [{ kind: \"literal\", jsonCode: \"1\" }],\n },\n errors: [],\n edits: [\n { segment: { start: 0, end: 1 }, replacement: \"\" },\n { segment: { start: 2, end: 3 }, replacement: \"\\n \" },\n { segment: { start: 4, end: 5 }, replacement: \"\\n\" },\n { segment: { start: 6, end: 7 }, replacement: \"\" },\n ],\n });\n });\n\n it(\"reports error for invalid token\", () => {\n expect(parseJsonValue(\"@\")).toMatch({\n value: undefined,\n errors: [\n {\n kind: \"error\",\n message: \"not a token\",\n segment: { start: 0, end: 1 },\n },\n ],\n edits: [],\n });\n });\n\n it(\"reports error for unclosed array\", () => {\n expect(parseJsonValue(\"[\")).toMatch({\n value: { kind: \"array\", values: [] },\n errors: [\n {\n kind: \"error\",\n message: \"expected: ']'\",\n segment: { start: 1, end: 1 },\n },\n ],\n edits: [{ segment: { start: 1, end: 1 }, replacement: \"\\n \" }],\n });\n });\n\n it(\"parses object with missing value (lenient)\", () => {\n expect(\n parseJsonValue(`{\n \"foo\": true,\n \"bar\"\n }`),\n ).toMatch({\n value: {\n kind: \"object\",\n keyValues: {\n foo: {\n key: \"foo\",\n value: { kind: \"literal\", jsonCode: \"true\", type: \"boolean\" },\n },\n },\n },\n errors: [\n {\n kind: \"error\",\n message: \"expected: ':'\",\n segment: { start: 37, end: 38 },\n },\n ],\n });\n });\n\n it(\"parses object with trailing comma (lenient)\", () => {\n expect(\n parseJsonValue(`{\n \"a\": 1,\n \"b\": 2,\n }`),\n ).toMatch({\n value: {\n kind: \"object\",\n keyValues: {\n a: {\n key: \"a\",\n value: { kind: \"literal\", jsonCode: \"1\", type: \"number\" },\n },\n b: {\n key: \"b\",\n value: { kind: \"literal\", jsonCode: \"2\", type: \"number\" },\n },\n },\n },\n errors: [],\n edits: [\n { segment: { start: 1, end: 8 }, replacement: \"\\n \" },\n { segment: { start: 15, end: 22 }, replacement: \"\\n \" },\n { segment: { start: 28, end: 29 }, replacement: \"\" },\n { segment: { start: 29, end: 34 }, replacement: \"\\n\" },\n ],\n });\n });\n\n it(\"parses array with trailing comma (lenient)\", () => {\n expect(parseJsonValue(`[1, 2,]`)).toMatch({\n value: {\n kind: \"array\",\n values: [\n { kind: \"literal\", jsonCode: \"1\", type: \"number\" },\n { kind: \"literal\", jsonCode: \"2\", type: \"number\" },\n ],\n },\n errors: [],\n edits: [\n { segment: { start: 1, end: 1 }, replacement: \"\\n \" },\n { segment: { start: 3, end: 4 }, replacement: \"\\n \" },\n { segment: { start: 5, end: 6 }, replacement: \"\" },\n { segment: { start: 6, end: 6 }, replacement: \"\\n\" },\n ],\n });\n });\n\n it(\"parses array without commas (adds commas via edits)\", () => {\n expect(parseJsonValue(\"[1 2 3]\")).toMatch({\n value: {\n kind: \"array\",\n values: [\n { kind: \"literal\", jsonCode: \"1\", type: \"number\" },\n { kind: \"literal\", jsonCode: \"2\", type: \"number\" },\n { kind: \"literal\", jsonCode: \"3\", type: \"number\" },\n ],\n },\n errors: [],\n edits: [\n { segment: { start: 1, end: 1 }, replacement: \"\\n \" },\n { segment: { start: 2, end: 3 }, replacement: \",\\n \" },\n { segment: { start: 4, end: 5 }, replacement: \",\\n \" },\n { segment: { start: 6, end: 6 }, replacement: \"\\n\" },\n ],\n });\n });\n\n it(\"parses object without commas (adds commas via edits)\", () => {\n expect(parseJsonValue('{\"a\": 1 \"b\": 2}')).toMatch({\n value: {\n kind: \"object\",\n keyValues: {\n a: {\n key: \"a\",\n value: { kind: \"literal\", jsonCode: \"1\", type: \"number\" },\n },\n b: {\n key: \"b\",\n value: { kind: \"literal\", jsonCode: \"2\", type: \"number\" },\n },\n },\n },\n errors: [],\n edits: [\n { segment: { start: 1, end: 1 }, replacement: \"\\n \" },\n { segment: { start: 7, end: 8 }, replacement: \",\\n \" },\n { segment: { start: 14, end: 14 }, replacement: \"\\n\" },\n ],\n });\n });\n\n it(\"parses object with key missing colon (no infinite loop)\", () => {\n const result = parseJsonValue(`\n {\n \"x\": 0,\n \"\"\n \"y\": 0\n }`);\n // Should parse without hanging\n // Note: The empty key without colon causes skip() to consume \"y\": 0\n expect(result).toMatch({\n value: {\n kind: \"object\",\n keyValues: {\n x: {\n key: \"x\",\n value: { kind: \"literal\", jsonCode: \"0\", type: \"number\" },\n },\n },\n allKeys: [\n {\n key: \"x\",\n },\n {\n key: \"\",\n },\n {\n key: \"y\",\n },\n ],\n },\n errors: [\n {\n kind: \"error\",\n message: \"expected: ':'\",\n },\n ],\n });\n });\n\n it(\"parses object with double comma (no infinite loop)\", () => {\n const result = parseJsonValue('{\"x\": 1, , \"y\": 2}');\n // Should parse without hanging - the double comma should be handled\n expect(result.value).toMatch({\n kind: \"object\",\n keyValues: {\n x: {\n key: \"x\",\n value: { kind: \"literal\", jsonCode: \"1\", type: \"number\" },\n },\n y: {\n key: \"y\",\n value: { kind: \"literal\", jsonCode: \"2\", type: \"number\" },\n },\n },\n });\n // Should have error for the unexpected comma\n expect(result.errors.length > 0).toBe(true);\n });\n\n it(\"parses array with invalid element followed by comma (no infinite loop)\", () => {\n const result = parseJsonValue(`[\n 1,\n @\n 2\n]`);\n // Invalid token @ causes tokenization error\n expect(result.value).toBe(undefined);\n // Should have error for invalid token\n expect(result.errors).toMatch([\n {\n kind: \"error\",\n message: \"not a token\",\n },\n ]);\n });\n});\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema_validator.d.ts","sourceRoot":"","sources":["../../src/json/schema_validator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"schema_validator.d.ts","sourceRoot":"","sources":["../../src/json/schema_validator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAMV,SAAS,EAKT,cAAc,EAGd,gBAAgB,EAEjB,MAAM,SAAS,CAAC;AAEjB,wBAAgB,cAAc,CAC5B,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,cAAc,GACrB,gBAAgB,CAsBlB"}
|
|
@@ -33,7 +33,7 @@ class SchemaValidator {
|
|
|
33
33
|
const { idToRecordDef, typeHintStack } = this;
|
|
34
34
|
value.expectedType = schema;
|
|
35
35
|
// For every call to pushTypeHint() there emust be one call to typeHintStack.pop()
|
|
36
|
-
const pushTypeHint = () => {
|
|
36
|
+
const pushTypeHint = (options) => {
|
|
37
37
|
const typeDesc = getTypeDesc(optionalSchema ?? schema);
|
|
38
38
|
const typeDoc = getTypeDoc(schema, idToRecordDef);
|
|
39
39
|
const message = [typeDesc];
|
|
@@ -51,6 +51,7 @@ class SchemaValidator {
|
|
|
51
51
|
message: message.length === 1 ? message[0] : message,
|
|
52
52
|
valueContext: { value, path },
|
|
53
53
|
childHints: [],
|
|
54
|
+
enumDefinition: options?.enumDefinition,
|
|
54
55
|
};
|
|
55
56
|
if (typeHintStack.length) {
|
|
56
57
|
const topOfStack = typeHintStack[typeHintStack.length - 1];
|
|
@@ -177,8 +178,15 @@ class SchemaValidator {
|
|
|
177
178
|
else if (value.kind === "literal" && value.type === "string") {
|
|
178
179
|
const name = JSON.parse(value.jsonCode);
|
|
179
180
|
const fieldDef = nameToVariantDef[name];
|
|
180
|
-
if (
|
|
181
|
-
|
|
181
|
+
if (fieldDef && fieldDef.type) {
|
|
182
|
+
this.errors.push({
|
|
183
|
+
kind: "error",
|
|
184
|
+
segment: value.segment,
|
|
185
|
+
message: "Expected: uppercase variant name",
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
else if (name === "UNKNOWN" || fieldDef) {
|
|
189
|
+
pushTypeHint({ enumDefinition: recordDef });
|
|
182
190
|
typeHintStack.pop();
|
|
183
191
|
}
|
|
184
192
|
else {
|
|
@@ -461,14 +469,11 @@ function isFloat(value) {
|
|
|
461
469
|
if (value.type === "number") {
|
|
462
470
|
return true;
|
|
463
471
|
}
|
|
464
|
-
else if (value.type === "string"
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
catch {
|
|
470
|
-
return false;
|
|
471
|
-
}
|
|
472
|
+
else if (value.type === "string" &&
|
|
473
|
+
(value.jsonCode === '"NaN"' ||
|
|
474
|
+
value.jsonCode === '"Infinity"' ||
|
|
475
|
+
value.jsonCode === '"-Infinity"')) {
|
|
476
|
+
return true;
|
|
472
477
|
}
|
|
473
478
|
else {
|
|
474
479
|
return false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema_validator.js","sourceRoot":"","sources":["../../src/json/schema_validator.ts"],"names":[],"mappings":"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","sourcesContent":["import { primitiveSerializer } from \"skir-client\";\nimport { toJson } from \"./to_json\";\nimport type {\n FieldDefinition,\n Hint,\n JsonError,\n JsonObject,\n JsonValue,\n MutableTypeHint,\n Path,\n PrimitiveType,\n RecordDefinition,\n TypeDefinition,\n TypeHint,\n TypeSignature,\n ValidationResult,\n VariantDefinition,\n} from \"./types\";\n\nexport function validateSchema(\n value: JsonValue,\n schema: TypeDefinition,\n): ValidationResult {\n const idToRecordDef: { [id: string]: RecordDefinition } = {};\n for (const record of schema.records) {\n idToRecordDef[record.id] = record;\n }\n\n const validator = new SchemaValidator(idToRecordDef);\n const root: Path = { kind: \"root\" };\n validator.validate(value, root, schema.type);\n const pathToTypeHint = new Map<Path, TypeHint>();\n for (const hint of validator.hints) {\n const { valueContext } = hint;\n if (valueContext) {\n pathToTypeHint.set(valueContext.path, hint);\n }\n }\n return {\n errors: validator.errors,\n hints: validator.hints,\n rootTypeHint: validator.rootTypeHint,\n pathToTypeHint: pathToTypeHint,\n };\n}\n\nclass SchemaValidator {\n constructor(readonly idToRecordDef: { [id: string]: RecordDefinition }) {}\n readonly errors: JsonError[] = [];\n readonly hints: Hint[] = [];\n private readonly typeHintStack: MutableTypeHint[] = [];\n rootTypeHint: TypeHint | undefined;\n\n validate(\n value: JsonValue,\n path: Path,\n schema: TypeSignature,\n optionalSchema?: TypeSignature,\n ): void {\n const { idToRecordDef, typeHintStack } = this;\n value.expectedType = schema;\n // For every call to pushTypeHint() there emust be one call to typeHintStack.pop()\n const pushTypeHint = (): void => {\n const typeDesc = getTypeDesc(optionalSchema ?? schema);\n const typeDoc = getTypeDoc(schema, idToRecordDef);\n const message = [typeDesc];\n if (typeDoc) {\n message.push(typeDoc);\n }\n if (value.kind === \"array\") {\n const { length } = value.values;\n if (length) {\n message.push(`Length: ${length}`);\n }\n }\n const hint: MutableTypeHint = {\n segment: value.firstToken,\n message: message.length === 1 ? message[0] : message,\n valueContext: { value, path },\n childHints: [],\n };\n if (typeHintStack.length) {\n const topOfStack = typeHintStack[typeHintStack.length - 1];\n topOfStack.childHints.push(hint);\n } else {\n this.rootTypeHint = hint;\n }\n this.hints.push(hint);\n typeHintStack.push(hint);\n };\n switch (schema.kind) {\n case \"array\": {\n if (value.kind === \"array\") {\n pushTypeHint();\n for (const [index, item] of value.values.entries()) {\n const { key_extractor: keyExtractor, item: itemSchema } =\n schema.value;\n const itemKey = extractItemKey(item, keyExtractor);\n const itemPath: Path = {\n kind: \"array-item\",\n index: index,\n key: itemKey,\n arrayPath: path,\n };\n this.validate(item, itemPath, itemSchema);\n }\n typeHintStack.pop();\n } else {\n this.errors.push({\n kind: \"error\",\n segment: value.segment,\n message: \"Expected: array\",\n });\n }\n break;\n }\n case \"optional\": {\n if (value.kind === \"literal\" && value.jsonCode === \"null\") {\n pushTypeHint();\n typeHintStack.pop();\n } else {\n this.validate(value, path, schema.value, schema);\n }\n break;\n }\n case \"primitive\": {\n const primitiveType = schema.value;\n if (primitiveType === \"timestamp\") {\n if (this.validateTimestamp(value)) {\n pushTypeHint();\n typeHintStack.pop();\n }\n } else if (hasPrimitiveType(value, primitiveType)) {\n pushTypeHint();\n typeHintStack.pop();\n } else {\n this.errors.push({\n kind: \"error\",\n segment: value.firstToken,\n message: `Expected: ${primitiveType}`,\n });\n }\n break;\n }\n case \"record\": {\n const recordDef = idToRecordDef[schema.value];\n if (recordDef.kind === \"struct\") {\n const nameToFieldDef: { [name: string]: FieldDefinition } = {};\n recordDef.fields.forEach((field) => {\n nameToFieldDef[field.name] = field;\n });\n if (value.kind === \"object\") {\n pushTypeHint();\n for (const keyValue of Object.values(value.keyValues)) {\n const { key, value } = keyValue;\n const fieldDef = nameToFieldDef[key];\n if (fieldDef) {\n if (fieldDef.doc) {\n this.hints.push({\n segment: keyValue.keySegment,\n message: fieldDef.doc,\n });\n }\n const valuePath: Path = {\n kind: \"field-value\",\n fieldName: key,\n structPath: path,\n };\n this.validate(value, valuePath, fieldDef.type!);\n } else {\n this.errors.push({\n kind: \"error\",\n segment: keyValue.keySegment,\n message: \"Unknown field\",\n });\n }\n }\n typeHintStack.pop();\n } else {\n this.errors.push({\n kind: \"error\",\n segment: value.firstToken,\n message: \"Expected: object\",\n });\n }\n } else {\n // Enum\n const nameToVariantDef: { [name: string]: VariantDefinition } = {};\n recordDef.variants.forEach((variant) => {\n nameToVariantDef[variant.name] = variant;\n });\n if (value.kind === \"object\") {\n pushTypeHint();\n this.validateEnumObject(value, path, nameToVariantDef);\n typeHintStack.pop();\n } else if (value.kind === \"literal\" && value.type === \"string\") {\n const name = JSON.parse(value.jsonCode);\n const fieldDef = nameToVariantDef[name];\n if (name === \"UNKNOWN\" || fieldDef) {\n pushTypeHint();\n typeHintStack.pop();\n } else {\n this.errors.push({\n kind: \"error\",\n segment: value.segment,\n message: \"Unknown variant\",\n });\n }\n } else {\n this.errors.push({\n kind: \"error\",\n segment: value.firstToken,\n message: \"Expected: object or string\",\n });\n }\n }\n break;\n }\n default: {\n const _: never = schema;\n throw new Error(_);\n }\n }\n }\n\n validateEnumObject(\n object: JsonObject,\n enumPath: Path,\n nameToVariantDef: { [name: string]: VariantDefinition },\n ): void {\n const kindKv = object.keyValues[\"kind\"];\n if (!kindKv) {\n this.errors.push({\n kind: \"error\",\n segment: object.segment,\n message: \"Missing: 'kind'\",\n });\n return;\n }\n if (kindKv.value.kind !== \"literal\" || kindKv.value.type !== \"string\") {\n this.errors.push({\n kind: \"error\",\n segment: kindKv.value.firstToken,\n message: \"Expected: string\",\n });\n return;\n }\n const kind: string = JSON.parse(kindKv.value.jsonCode);\n if (kind !== kind.toLowerCase()) {\n this.errors.push({\n kind: \"error\",\n segment: kindKv.value.segment,\n message: \"Expected: lowercase variant name\",\n });\n return;\n }\n const variantDef = nameToVariantDef[kind];\n if (!variantDef) {\n this.errors.push({\n kind: \"error\",\n segment: kindKv.value.segment,\n message: \"Unknown variant\",\n });\n return;\n }\n const valueKv = object.keyValues[\"value\"];\n if (!valueKv) {\n this.errors.push({\n kind: \"error\",\n segment: object.segment,\n message: \"Missing: 'value'\",\n });\n return;\n }\n for (const key of object.allKeys) {\n if (key.key !== \"kind\" && key.key !== \"value\") {\n this.errors.push({\n kind: \"error\",\n segment: key.keySegment,\n message: \"Unexpected entry\",\n });\n }\n }\n const path: Path = {\n kind: \"variant-value\",\n variantName: variantDef.name,\n enumPath: enumPath,\n };\n this.validate(valueKv.value, path, variantDef.type!);\n }\n\n private validateTimestamp(value: JsonValue): boolean {\n if (value.kind !== \"object\") {\n this.errors.push({\n kind: \"error\",\n segment: value.firstToken,\n message: \"Expected: timestamp\",\n });\n return false;\n }\n const unixMillisKv = value.keyValues[\"unix_millis\"];\n if (!unixMillisKv) {\n this.errors.push({\n kind: \"error\",\n segment: value.firstToken,\n message: \"Missing: 'unix_millis'\",\n });\n return true;\n }\n if (\n unixMillisKv.value.kind !== \"literal\" ||\n unixMillisKv.value.type !== \"number\"\n ) {\n this.errors.push({\n kind: \"error\",\n segment: unixMillisKv.value.firstToken,\n message: \"Expected: number\",\n });\n return true;\n }\n const unixMillis = toJson(unixMillisKv.value) as number;\n if (unixMillis < -8640000000000000 || 8640000000000000 < unixMillis) {\n this.errors.push({\n kind: \"error\",\n segment: unixMillisKv.value.firstToken,\n message: \"Timestamp out of range\",\n });\n return true;\n }\n // At this point: the timestamp is technically valid.\n const formatted = value.keyValues[\"formatted\"];\n if (!formatted) {\n return true;\n }\n if (\n formatted.value.kind !== \"literal\" ||\n formatted.value.type !== \"string\"\n ) {\n this.errors.push({\n kind: \"error\",\n segment: formatted.value.firstToken,\n message: \"Expected: string\",\n });\n return true;\n }\n const formattedStr = toJson(formatted.value) as string;\n if (formattedStr === \"n/a\") {\n return true;\n }\n const parsedMillis = Date.parse(formattedStr);\n if (Number.isNaN(parsedMillis)) {\n this.errors.push({\n kind: \"error\",\n segment: formatted.value.firstToken,\n message: \"Invalid ISO 8601 date string\",\n });\n return true;\n }\n if (parsedMillis !== unixMillis) {\n this.errors.push({\n kind: \"error\",\n segment: formatted.value.firstToken,\n message: \"Does not match 'unix_millis'\",\n });\n }\n for (const key of value.allKeys) {\n if (key.key !== \"unix_millis\" && key.key !== \"formatted\") {\n this.errors.push({\n kind: \"error\",\n segment: key.keySegment,\n message: \"Unexpected entry\",\n });\n }\n }\n return true;\n }\n}\n\nfunction extractItemKey(\n item: JsonValue,\n keyExtractor: string | undefined,\n): string | null {\n if (keyExtractor === undefined) {\n return null;\n }\n const pieces = keyExtractor.split(\".\");\n let value = item;\n for (const piece of pieces) {\n if (value.kind !== \"object\") {\n // Error\n return null;\n }\n const kv = value.keyValues[piece];\n if (!kv) {\n // Error\n return null;\n }\n value = kv.value;\n }\n switch (value.kind) {\n case \"literal\": {\n switch (value.type) {\n case \"string\":\n case \"number\":\n case \"boolean\":\n return value.jsonCode;\n }\n // Error\n return null;\n }\n case \"object\": {\n const kv = value.keyValues[\"unix_millis\"];\n if (kv && kv.value.kind === \"literal\" && kv.value.type === \"number\") {\n return kv.value.jsonCode;\n } else {\n // Error\n return null;\n }\n }\n case \"array\": {\n // Error\n return null;\n }\n }\n}\n\nfunction hasPrimitiveType(\n value: JsonValue,\n expectedType: PrimitiveType,\n): boolean {\n switch (expectedType) {\n case \"bool\":\n return value.kind === \"literal\" && value.type === \"boolean\";\n case \"int32\": {\n return isInteger(value, -2147483648n, 2147483647n);\n }\n case \"int64\": {\n return isInteger(value, -9223372036854775808n, 9223372036854775807n);\n }\n case \"hash64\": {\n return isInteger(value, 0n, 18446744073709551615n);\n }\n case \"float32\":\n case \"float64\": {\n return isFloat(value);\n }\n case \"string\": {\n return value.kind === \"literal\" && value.type === \"string\";\n }\n case \"bytes\": {\n if (value.kind !== \"literal\") {\n return false;\n }\n try {\n primitiveSerializer(\"bytes\").fromJsonCode(value.jsonCode);\n return true;\n } catch {\n return false;\n }\n }\n case \"timestamp\": {\n // Case handled separately in validate()\n throw new Error();\n }\n }\n}\n\nfunction isInteger(value: JsonValue, min: bigint, max: bigint): boolean {\n if (value.kind !== \"literal\") {\n return false;\n }\n let decimalRep: string;\n if (value.type === \"string\") {\n decimalRep = JSON.parse(value.jsonCode);\n } else if (value.type === \"number\") {\n decimalRep = value.jsonCode;\n } else {\n return false;\n }\n let int: bigint;\n try {\n int = BigInt(decimalRep);\n } catch {\n return false;\n }\n return min <= int && int <= max;\n}\n\nfunction isFloat(value: JsonValue): boolean {\n if (value.kind !== \"literal\") {\n return false;\n }\n if (value.type === \"number\") {\n return true;\n } else if (value.type === \"string\") {\n try {\n primitiveSerializer(\"float64\").fromJsonCode(value.jsonCode);\n return true;\n } catch {\n return false;\n }\n } else {\n return false;\n }\n}\n\nfunction getTypeDesc(type: TypeSignature): string {\n function getTypePart(type: TypeSignature): string {\n switch (type.kind) {\n case \"primitive\":\n return type.value;\n case \"array\":\n return `[${getTypePart(type.value.item)}]`;\n case \"optional\":\n return `${getTypePart(type.value)}?`;\n case \"record\": {\n const recordId = type.value;\n return recordId.split(\":\")[1];\n }\n }\n }\n function getModulePart(type: TypeSignature): string | null {\n switch (type.kind) {\n case \"primitive\":\n return null;\n case \"array\":\n return getModulePart(type.value.item);\n case \"optional\":\n return getModulePart(type.value);\n case \"record\": {\n const recordId = type.value;\n return recordId.split(\":\")[0];\n }\n }\n }\n const typePart = getTypePart(type);\n const modulePart = getModulePart(type);\n return modulePart ? `${typePart} (${modulePart})` : typePart;\n}\n\nfunction getTypeDoc(\n type: TypeSignature,\n idToRecordDef: Readonly<{ [id: string]: RecordDefinition }>,\n): string | undefined {\n switch (type.kind) {\n case \"primitive\":\n return undefined;\n case \"array\":\n return getTypeDoc(type.value.item, idToRecordDef);\n case \"optional\":\n return getTypeDoc(type.value, idToRecordDef);\n case \"record\": {\n const recordId = type.value;\n const recordDef = idToRecordDef[recordId]!;\n return recordDef.doc;\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"schema_validator.js","sourceRoot":"","sources":["../../src/json/schema_validator.ts"],"names":[],"mappings":"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","sourcesContent":["import { primitiveSerializer } from \"skir-client\";\nimport { toJson } from \"./to_json\";\nimport type {\n EnumDefinition,\n FieldDefinition,\n Hint,\n JsonError,\n JsonObject,\n JsonValue,\n MutableTypeHint,\n Path,\n PrimitiveType,\n RecordDefinition,\n TypeDefinition,\n TypeHint,\n TypeSignature,\n ValidationResult,\n VariantDefinition,\n} from \"./types\";\n\nexport function validateSchema(\n value: JsonValue,\n schema: TypeDefinition,\n): ValidationResult {\n const idToRecordDef: { [id: string]: RecordDefinition } = {};\n for (const record of schema.records) {\n idToRecordDef[record.id] = record;\n }\n\n const validator = new SchemaValidator(idToRecordDef);\n const root: Path = { kind: \"root\" };\n validator.validate(value, root, schema.type);\n const pathToTypeHint = new Map<Path, TypeHint>();\n for (const hint of validator.hints) {\n const { valueContext } = hint;\n if (valueContext) {\n pathToTypeHint.set(valueContext.path, hint);\n }\n }\n return {\n errors: validator.errors,\n hints: validator.hints,\n rootTypeHint: validator.rootTypeHint,\n pathToTypeHint: pathToTypeHint,\n };\n}\n\nclass SchemaValidator {\n constructor(readonly idToRecordDef: { [id: string]: RecordDefinition }) {}\n readonly errors: JsonError[] = [];\n readonly hints: Hint[] = [];\n private readonly typeHintStack: MutableTypeHint[] = [];\n rootTypeHint: TypeHint | undefined;\n\n validate(\n value: JsonValue,\n path: Path,\n schema: TypeSignature,\n optionalSchema?: TypeSignature,\n ): void {\n const { idToRecordDef, typeHintStack } = this;\n value.expectedType = schema;\n // For every call to pushTypeHint() there emust be one call to typeHintStack.pop()\n const pushTypeHint = (options?: {\n enumDefinition?: EnumDefinition;\n }): void => {\n const typeDesc = getTypeDesc(optionalSchema ?? schema);\n const typeDoc = getTypeDoc(schema, idToRecordDef);\n const message = [typeDesc];\n if (typeDoc) {\n message.push(typeDoc);\n }\n if (value.kind === \"array\") {\n const { length } = value.values;\n if (length) {\n message.push(`Length: ${length}`);\n }\n }\n const hint: MutableTypeHint = {\n segment: value.firstToken,\n message: message.length === 1 ? message[0] : message,\n valueContext: { value, path },\n childHints: [],\n enumDefinition: options?.enumDefinition,\n };\n if (typeHintStack.length) {\n const topOfStack = typeHintStack[typeHintStack.length - 1];\n topOfStack.childHints.push(hint);\n } else {\n this.rootTypeHint = hint;\n }\n this.hints.push(hint);\n typeHintStack.push(hint);\n };\n switch (schema.kind) {\n case \"array\": {\n if (value.kind === \"array\") {\n pushTypeHint();\n for (const [index, item] of value.values.entries()) {\n const { key_extractor: keyExtractor, item: itemSchema } =\n schema.value;\n const itemKey = extractItemKey(item, keyExtractor);\n const itemPath: Path = {\n kind: \"array-item\",\n index: index,\n key: itemKey,\n arrayPath: path,\n };\n this.validate(item, itemPath, itemSchema);\n }\n typeHintStack.pop();\n } else {\n this.errors.push({\n kind: \"error\",\n segment: value.segment,\n message: \"Expected: array\",\n });\n }\n break;\n }\n case \"optional\": {\n if (value.kind === \"literal\" && value.jsonCode === \"null\") {\n pushTypeHint();\n typeHintStack.pop();\n } else {\n this.validate(value, path, schema.value, schema);\n }\n break;\n }\n case \"primitive\": {\n const primitiveType = schema.value;\n if (primitiveType === \"timestamp\") {\n if (this.validateTimestamp(value)) {\n pushTypeHint();\n typeHintStack.pop();\n }\n } else if (hasPrimitiveType(value, primitiveType)) {\n pushTypeHint();\n typeHintStack.pop();\n } else {\n this.errors.push({\n kind: \"error\",\n segment: value.firstToken,\n message: `Expected: ${primitiveType}`,\n });\n }\n break;\n }\n case \"record\": {\n const recordDef = idToRecordDef[schema.value];\n if (recordDef.kind === \"struct\") {\n const nameToFieldDef: { [name: string]: FieldDefinition } = {};\n recordDef.fields.forEach((field) => {\n nameToFieldDef[field.name] = field;\n });\n if (value.kind === \"object\") {\n pushTypeHint();\n for (const keyValue of Object.values(value.keyValues)) {\n const { key, value } = keyValue;\n const fieldDef = nameToFieldDef[key];\n if (fieldDef) {\n if (fieldDef.doc) {\n this.hints.push({\n segment: keyValue.keySegment,\n message: fieldDef.doc,\n });\n }\n const valuePath: Path = {\n kind: \"field-value\",\n fieldName: key,\n structPath: path,\n };\n this.validate(value, valuePath, fieldDef.type!);\n } else {\n this.errors.push({\n kind: \"error\",\n segment: keyValue.keySegment,\n message: \"Unknown field\",\n });\n }\n }\n typeHintStack.pop();\n } else {\n this.errors.push({\n kind: \"error\",\n segment: value.firstToken,\n message: \"Expected: object\",\n });\n }\n } else {\n // Enum\n const nameToVariantDef: { [name: string]: VariantDefinition } = {};\n recordDef.variants.forEach((variant) => {\n nameToVariantDef[variant.name] = variant;\n });\n if (value.kind === \"object\") {\n pushTypeHint();\n this.validateEnumObject(value, path, nameToVariantDef);\n typeHintStack.pop();\n } else if (value.kind === \"literal\" && value.type === \"string\") {\n const name = JSON.parse(value.jsonCode);\n const fieldDef = nameToVariantDef[name];\n if (fieldDef && fieldDef.type) {\n this.errors.push({\n kind: \"error\",\n segment: value.segment,\n message: \"Expected: uppercase variant name\",\n });\n } else if (name === \"UNKNOWN\" || fieldDef) {\n pushTypeHint({ enumDefinition: recordDef });\n typeHintStack.pop();\n } else {\n this.errors.push({\n kind: \"error\",\n segment: value.segment,\n message: \"Unknown variant\",\n });\n }\n } else {\n this.errors.push({\n kind: \"error\",\n segment: value.firstToken,\n message: \"Expected: object or string\",\n });\n }\n }\n break;\n }\n default: {\n const _: never = schema;\n throw new Error(_);\n }\n }\n }\n\n validateEnumObject(\n object: JsonObject,\n enumPath: Path,\n nameToVariantDef: { [name: string]: VariantDefinition },\n ): void {\n const kindKv = object.keyValues[\"kind\"];\n if (!kindKv) {\n this.errors.push({\n kind: \"error\",\n segment: object.segment,\n message: \"Missing: 'kind'\",\n });\n return;\n }\n if (kindKv.value.kind !== \"literal\" || kindKv.value.type !== \"string\") {\n this.errors.push({\n kind: \"error\",\n segment: kindKv.value.firstToken,\n message: \"Expected: string\",\n });\n return;\n }\n const kind: string = JSON.parse(kindKv.value.jsonCode);\n if (kind !== kind.toLowerCase()) {\n this.errors.push({\n kind: \"error\",\n segment: kindKv.value.segment,\n message: \"Expected: lowercase variant name\",\n });\n return;\n }\n const variantDef = nameToVariantDef[kind];\n if (!variantDef) {\n this.errors.push({\n kind: \"error\",\n segment: kindKv.value.segment,\n message: \"Unknown variant\",\n });\n return;\n }\n const valueKv = object.keyValues[\"value\"];\n if (!valueKv) {\n this.errors.push({\n kind: \"error\",\n segment: object.segment,\n message: \"Missing: 'value'\",\n });\n return;\n }\n for (const key of object.allKeys) {\n if (key.key !== \"kind\" && key.key !== \"value\") {\n this.errors.push({\n kind: \"error\",\n segment: key.keySegment,\n message: \"Unexpected entry\",\n });\n }\n }\n const path: Path = {\n kind: \"variant-value\",\n variantName: variantDef.name,\n enumPath: enumPath,\n };\n this.validate(valueKv.value, path, variantDef.type!);\n }\n\n private validateTimestamp(value: JsonValue): boolean {\n if (value.kind !== \"object\") {\n this.errors.push({\n kind: \"error\",\n segment: value.firstToken,\n message: \"Expected: timestamp\",\n });\n return false;\n }\n const unixMillisKv = value.keyValues[\"unix_millis\"];\n if (!unixMillisKv) {\n this.errors.push({\n kind: \"error\",\n segment: value.firstToken,\n message: \"Missing: 'unix_millis'\",\n });\n return true;\n }\n if (\n unixMillisKv.value.kind !== \"literal\" ||\n unixMillisKv.value.type !== \"number\"\n ) {\n this.errors.push({\n kind: \"error\",\n segment: unixMillisKv.value.firstToken,\n message: \"Expected: number\",\n });\n return true;\n }\n const unixMillis = toJson(unixMillisKv.value) as number;\n if (unixMillis < -8640000000000000 || 8640000000000000 < unixMillis) {\n this.errors.push({\n kind: \"error\",\n segment: unixMillisKv.value.firstToken,\n message: \"Timestamp out of range\",\n });\n return true;\n }\n // At this point: the timestamp is technically valid.\n const formatted = value.keyValues[\"formatted\"];\n if (!formatted) {\n return true;\n }\n if (\n formatted.value.kind !== \"literal\" ||\n formatted.value.type !== \"string\"\n ) {\n this.errors.push({\n kind: \"error\",\n segment: formatted.value.firstToken,\n message: \"Expected: string\",\n });\n return true;\n }\n const formattedStr = toJson(formatted.value) as string;\n if (formattedStr === \"n/a\") {\n return true;\n }\n const parsedMillis = Date.parse(formattedStr);\n if (Number.isNaN(parsedMillis)) {\n this.errors.push({\n kind: \"error\",\n segment: formatted.value.firstToken,\n message: \"Invalid ISO 8601 date string\",\n });\n return true;\n }\n if (parsedMillis !== unixMillis) {\n this.errors.push({\n kind: \"error\",\n segment: formatted.value.firstToken,\n message: \"Does not match 'unix_millis'\",\n });\n }\n for (const key of value.allKeys) {\n if (key.key !== \"unix_millis\" && key.key !== \"formatted\") {\n this.errors.push({\n kind: \"error\",\n segment: key.keySegment,\n message: \"Unexpected entry\",\n });\n }\n }\n return true;\n }\n}\n\nfunction extractItemKey(\n item: JsonValue,\n keyExtractor: string | undefined,\n): string | null {\n if (keyExtractor === undefined) {\n return null;\n }\n const pieces = keyExtractor.split(\".\");\n let value = item;\n for (const piece of pieces) {\n if (value.kind !== \"object\") {\n // Error\n return null;\n }\n const kv = value.keyValues[piece];\n if (!kv) {\n // Error\n return null;\n }\n value = kv.value;\n }\n switch (value.kind) {\n case \"literal\": {\n switch (value.type) {\n case \"string\":\n case \"number\":\n case \"boolean\":\n return value.jsonCode;\n }\n // Error\n return null;\n }\n case \"object\": {\n const kv = value.keyValues[\"unix_millis\"];\n if (kv && kv.value.kind === \"literal\" && kv.value.type === \"number\") {\n return kv.value.jsonCode;\n } else {\n // Error\n return null;\n }\n }\n case \"array\": {\n // Error\n return null;\n }\n }\n}\n\nfunction hasPrimitiveType(\n value: JsonValue,\n expectedType: PrimitiveType,\n): boolean {\n switch (expectedType) {\n case \"bool\":\n return value.kind === \"literal\" && value.type === \"boolean\";\n case \"int32\": {\n return isInteger(value, -2147483648n, 2147483647n);\n }\n case \"int64\": {\n return isInteger(value, -9223372036854775808n, 9223372036854775807n);\n }\n case \"hash64\": {\n return isInteger(value, 0n, 18446744073709551615n);\n }\n case \"float32\":\n case \"float64\": {\n return isFloat(value);\n }\n case \"string\": {\n return value.kind === \"literal\" && value.type === \"string\";\n }\n case \"bytes\": {\n if (value.kind !== \"literal\") {\n return false;\n }\n try {\n primitiveSerializer(\"bytes\").fromJsonCode(value.jsonCode);\n return true;\n } catch {\n return false;\n }\n }\n case \"timestamp\": {\n // Case handled separately in validate()\n throw new Error();\n }\n }\n}\n\nfunction isInteger(value: JsonValue, min: bigint, max: bigint): boolean {\n if (value.kind !== \"literal\") {\n return false;\n }\n let decimalRep: string;\n if (value.type === \"string\") {\n decimalRep = JSON.parse(value.jsonCode);\n } else if (value.type === \"number\") {\n decimalRep = value.jsonCode;\n } else {\n return false;\n }\n let int: bigint;\n try {\n int = BigInt(decimalRep);\n } catch {\n return false;\n }\n return min <= int && int <= max;\n}\n\nfunction isFloat(value: JsonValue): boolean {\n if (value.kind !== \"literal\") {\n return false;\n }\n if (value.type === \"number\") {\n return true;\n } else if (\n value.type === \"string\" &&\n (value.jsonCode === '\"NaN\"' ||\n value.jsonCode === '\"Infinity\"' ||\n value.jsonCode === '\"-Infinity\"')\n ) {\n return true;\n } else {\n return false;\n }\n}\n\nfunction getTypeDesc(type: TypeSignature): string {\n function getTypePart(type: TypeSignature): string {\n switch (type.kind) {\n case \"primitive\":\n return type.value;\n case \"array\":\n return `[${getTypePart(type.value.item)}]`;\n case \"optional\":\n return `${getTypePart(type.value)}?`;\n case \"record\": {\n const recordId = type.value;\n return recordId.split(\":\")[1];\n }\n }\n }\n function getModulePart(type: TypeSignature): string | null {\n switch (type.kind) {\n case \"primitive\":\n return null;\n case \"array\":\n return getModulePart(type.value.item);\n case \"optional\":\n return getModulePart(type.value);\n case \"record\": {\n const recordId = type.value;\n return recordId.split(\":\")[0];\n }\n }\n }\n const typePart = getTypePart(type);\n const modulePart = getModulePart(type);\n return modulePart ? `${typePart} (${modulePart})` : typePart;\n}\n\nfunction getTypeDoc(\n type: TypeSignature,\n idToRecordDef: Readonly<{ [id: string]: RecordDefinition }>,\n): string | undefined {\n switch (type.kind) {\n case \"primitive\":\n return undefined;\n case \"array\":\n return getTypeDoc(type.value.item, idToRecordDef);\n case \"optional\":\n return getTypeDoc(type.value, idToRecordDef);\n case \"record\": {\n const recordId = type.value;\n const recordDef = idToRecordDef[recordId]!;\n return recordDef.doc;\n }\n }\n}\n"]}
|
|
@@ -175,6 +175,77 @@ describe("schema_validator", () => {
|
|
|
175
175
|
},
|
|
176
176
|
]);
|
|
177
177
|
});
|
|
178
|
+
it("stores enum definition in type hint for UNKNOWN enum literal", () => {
|
|
179
|
+
const schema = {
|
|
180
|
+
type: { kind: "record", value: "MyEnum" },
|
|
181
|
+
records: [
|
|
182
|
+
{
|
|
183
|
+
kind: "enum",
|
|
184
|
+
id: "MyEnum",
|
|
185
|
+
variants: [
|
|
186
|
+
{ name: "First", number: 1 },
|
|
187
|
+
{ name: "Second", number: 2 },
|
|
188
|
+
],
|
|
189
|
+
},
|
|
190
|
+
],
|
|
191
|
+
};
|
|
192
|
+
const result = validateSchema(parse('"UNKNOWN"'), schema);
|
|
193
|
+
expect(result.errors).toMatch([]);
|
|
194
|
+
if (!result.rootTypeHint) {
|
|
195
|
+
throw new Error("Expected root type hint");
|
|
196
|
+
}
|
|
197
|
+
expect(result.rootTypeHint.enumDefinition).toMatch({
|
|
198
|
+
kind: "enum",
|
|
199
|
+
id: "MyEnum",
|
|
200
|
+
variants: [
|
|
201
|
+
{ name: "First", number: 1 },
|
|
202
|
+
{ name: "Second", number: 2 },
|
|
203
|
+
],
|
|
204
|
+
});
|
|
205
|
+
});
|
|
206
|
+
it("stores enum definition in nested UNKNOWN enum field hint", () => {
|
|
207
|
+
const schema = {
|
|
208
|
+
type: { kind: "record", value: "MyStruct" },
|
|
209
|
+
records: [
|
|
210
|
+
{
|
|
211
|
+
kind: "struct",
|
|
212
|
+
id: "MyStruct",
|
|
213
|
+
fields: [
|
|
214
|
+
{
|
|
215
|
+
name: "status",
|
|
216
|
+
number: 1,
|
|
217
|
+
type: { kind: "record", value: "MyEnum" },
|
|
218
|
+
},
|
|
219
|
+
],
|
|
220
|
+
},
|
|
221
|
+
{
|
|
222
|
+
kind: "enum",
|
|
223
|
+
id: "MyEnum",
|
|
224
|
+
variants: [
|
|
225
|
+
{ name: "First", number: 1 },
|
|
226
|
+
{ name: "Second", number: 2 },
|
|
227
|
+
],
|
|
228
|
+
},
|
|
229
|
+
],
|
|
230
|
+
};
|
|
231
|
+
const result = validateSchema(parse('{"status": "UNKNOWN"}'), schema);
|
|
232
|
+
expect(result.errors).toMatch([]);
|
|
233
|
+
if (!result.rootTypeHint) {
|
|
234
|
+
throw new Error("Expected root type hint");
|
|
235
|
+
}
|
|
236
|
+
if (result.rootTypeHint.childHints.length !== 1) {
|
|
237
|
+
throw new Error("Expected one child type hint");
|
|
238
|
+
}
|
|
239
|
+
const statusHint = result.rootTypeHint.childHints[0];
|
|
240
|
+
expect(statusHint.enumDefinition).toMatch({
|
|
241
|
+
kind: "enum",
|
|
242
|
+
id: "MyEnum",
|
|
243
|
+
variants: [
|
|
244
|
+
{ name: "First", number: 1 },
|
|
245
|
+
{ name: "Second", number: 2 },
|
|
246
|
+
],
|
|
247
|
+
});
|
|
248
|
+
});
|
|
178
249
|
it("validates enum (object with kind)", () => {
|
|
179
250
|
const schema = {
|
|
180
251
|
type: { kind: "record", value: "MyEnum" },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema_validator.test.js","sourceRoot":"","sources":["../../src/json/schema_validator.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect } from \"buckwheat\";\nimport { describe, it } from \"mocha\";\nimport { parseJsonValue } from \"./json_parser.js\";\nimport { validateSchema } from \"./schema_validator.js\";\nimport { JsonValue, TypeDefinition } from \"./types.js\";\n\nfunction parse(json: string): JsonValue {\n const result = parseJsonValue(json);\n if (!result.value) {\n throw new Error(`JSON parse error: ${JSON.stringify(result.errors)}`);\n }\n return result.value;\n}\n\ndescribe(\"schema_validator\", () => {\n it(\"validates primitive int32\", () => {\n const schema: TypeDefinition = {\n type: { kind: \"primitive\", value: \"int32\" },\n records: [],\n };\n const result = validateSchema(parse(\"123\"), schema);\n expect(result).toMatch({ errors: [] });\n if (result.hints.length === 0) {\n throw new Error(\"Expected type hints\");\n }\n });\n\n it(\"validates primitive string\", () => {\n const schema: TypeDefinition = {\n type: { kind: \"primitive\", value: \"string\" },\n records: [],\n };\n const result = validateSchema(parse('\"hello\"'), schema);\n expect(result).toMatch({ errors: [] });\n });\n\n it(\"reports error for type mismatch (int32 vs string)\", () => {\n const schema: TypeDefinition = {\n type: { kind: \"primitive\", value: \"int32\" },\n records: [],\n };\n const result = validateSchema(parse('\"hello\"'), schema);\n expect(result.errors).toMatch([\n {\n message: \"Expected: int32\",\n },\n ]);\n });\n\n it(\"validates array of primitives\", () => {\n const schema: TypeDefinition = {\n type: {\n kind: \"array\",\n value: { item: { kind: \"primitive\", value: \"int32\" } },\n },\n records: [],\n };\n const result = validateSchema(parse(\"[1, 2, 3]\"), schema);\n expect(result).toMatch({ errors: [] });\n });\n\n it(\"reports error for invalid array item\", () => {\n const schema: TypeDefinition = {\n type: {\n kind: \"array\",\n value: { item: { kind: \"primitive\", value: \"int32\" } },\n },\n records: [],\n };\n const result = validateSchema(parse('[1, \"bad\", 3]'), schema);\n expect(result.errors).toMatch([\n {\n message: \"Expected: int32\",\n segment: {\n start: 4,\n end: 9,\n },\n },\n ]);\n });\n\n it(\"validates optional field (present)\", () => {\n const schema: TypeDefinition = {\n type: {\n kind: \"optional\",\n value: { kind: \"primitive\", value: \"int32\" },\n },\n records: [],\n };\n const result = validateSchema(parse(\"123\"), schema);\n expect(result).toMatch({ errors: [] });\n });\n\n it(\"validates optional field (null)\", () => {\n const schema: TypeDefinition = {\n type: {\n kind: \"optional\",\n value: { kind: \"primitive\", value: \"int32\" },\n },\n records: [],\n };\n const result = validateSchema(parse(\"null\"), schema);\n expect(result).toMatch({ errors: [] });\n });\n\n it(\"validates struct\", () => {\n const schema: TypeDefinition = {\n type: { kind: \"record\", value: \"MyStruct\" },\n records: [\n {\n kind: \"struct\",\n id: \"MyStruct\",\n fields: [\n {\n name: \"foo\",\n number: 1,\n type: { kind: \"primitive\", value: \"string\" },\n },\n {\n name: \"bar\",\n number: 2,\n type: { kind: \"primitive\", value: \"int32\" },\n },\n ],\n },\n ],\n };\n const result = validateSchema(parse('{\"foo\": \"hi\", \"bar\": 123}'), schema);\n expect(result).toMatch({ errors: [] });\n });\n\n it(\"reports unknown field in struct\", () => {\n const schema: TypeDefinition = {\n type: { kind: \"record\", value: \"MyStruct\" },\n records: [\n {\n kind: \"struct\",\n id: \"MyStruct\",\n fields: [],\n },\n ],\n };\n const result = validateSchema(parse('{\"unknown\": 1}'), schema);\n expect(result.errors).toMatch([\n {\n message: \"Unknown field\",\n segment: {\n start: 1,\n end: 10,\n },\n },\n ]);\n });\n\n it(\"validates enum (string literal)\", () => {\n const schema: TypeDefinition = {\n type: { kind: \"record\", value: \"MyEnum\" },\n records: [\n {\n kind: \"enum\",\n id: \"MyEnum\",\n variants: [\n { name: \"First\", number: 1 },\n { name: \"Second\", number: 2 },\n ],\n },\n ],\n };\n const result = validateSchema(parse('\"First\"'), schema);\n expect(result).toMatch({ errors: [] });\n });\n\n it(\"reports unknown enum variant\", () => {\n const schema: TypeDefinition = {\n type: { kind: \"record\", value: \"MyEnum\" },\n records: [\n {\n kind: \"enum\",\n id: \"MyEnum\",\n variants: [{ name: \"First\", number: 1 }],\n },\n ],\n };\n const result = validateSchema(parse('\"Unknown\"'), schema);\n expect(result.errors).toMatch([\n {\n message: \"Unknown variant\",\n },\n ]);\n });\n\n it(\"validates enum (object with kind)\", () => {\n const schema: TypeDefinition = {\n type: { kind: \"record\", value: \"MyEnum\" },\n records: [\n {\n kind: \"enum\",\n id: \"MyEnum\",\n variants: [\n {\n name: \"complex\",\n number: 1,\n type: { kind: \"primitive\", value: \"int32\" },\n },\n ],\n },\n ],\n };\n\n expect(\n validateSchema(parse('{\"kind\": \"complex\", \"value\": 123}'), schema),\n ).toMatch({ errors: [] });\n expect(\n validateSchema(parse('{\"kind\": \"complex\", \"value\": \"foo\"}'), schema),\n ).toMatch({\n errors: [\n {\n message: \"Expected: int32\",\n },\n ],\n });\n expect(validateSchema(parse('{\"kind\": \"complex\"}'), schema)).toMatch({\n errors: [\n {\n message: \"Missing: 'value'\",\n },\n ],\n });\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"schema_validator.test.js","sourceRoot":"","sources":["../../src/json/schema_validator.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAGvD,SAAS,KAAK,CAAC,IAAY;IACzB,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACxE,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAC;AACtB,CAAC;AAED,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,MAAM,GAAmB;YAC7B,IAAI,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE;YAC3C,OAAO,EAAE,EAAE;SACZ,CAAC;QACF,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC;QACpD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;QACvC,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACzC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,MAAM,GAAmB;YAC7B,IAAI,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE;YAC5C,OAAO,EAAE,EAAE;SACZ,CAAC;QACF,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,CAAC;QACxD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,MAAM,GAAmB;YAC7B,IAAI,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE;YAC3C,OAAO,EAAE,EAAE;SACZ,CAAC;QACF,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,CAAC;QACxD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YAC5B;gBACE,OAAO,EAAE,iBAAiB;aAC3B;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,MAAM,GAAmB;YAC7B,IAAI,EAAE;gBACJ,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;aACvD;YACD,OAAO,EAAE,EAAE;SACZ,CAAC;QACF,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,CAAC;QAC1D,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,MAAM,GAAmB;YAC7B,IAAI,EAAE;gBACJ,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;aACvD;YACD,OAAO,EAAE,EAAE;SACZ,CAAC;QACF,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC,CAAC;QAC9D,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YAC5B;gBACE,OAAO,EAAE,iBAAiB;gBAC1B,OAAO,EAAE;oBACP,KAAK,EAAE,CAAC;oBACR,GAAG,EAAE,CAAC;iBACP;aACF;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,MAAM,GAAmB;YAC7B,IAAI,EAAE;gBACJ,IAAI,EAAE,UAAU;gBAChB,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE;aAC7C;YACD,OAAO,EAAE,EAAE;SACZ,CAAC;QACF,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC;QACpD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,MAAM,GAAmB;YAC7B,IAAI,EAAE;gBACJ,IAAI,EAAE,UAAU;gBAChB,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE;aAC7C;YACD,OAAO,EAAE,EAAE;SACZ,CAAC;QACF,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;QACrD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAC1B,MAAM,MAAM,GAAmB;YAC7B,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE;YAC3C,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,QAAQ;oBACd,EAAE,EAAE,UAAU;oBACd,MAAM,EAAE;wBACN;4BACE,IAAI,EAAE,KAAK;4BACX,MAAM,EAAE,CAAC;4BACT,IAAI,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE;yBAC7C;wBACD;4BACE,IAAI,EAAE,KAAK;4BACX,MAAM,EAAE,CAAC;4BACT,IAAI,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE;yBAC5C;qBACF;iBACF;aACF;SACF,CAAC;QACF,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,2BAA2B,CAAC,EAAE,MAAM,CAAC,CAAC;QAC1E,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,MAAM,GAAmB;YAC7B,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE;YAC3C,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,QAAQ;oBACd,EAAE,EAAE,UAAU;oBACd,MAAM,EAAE,EAAE;iBACX;aACF;SACF,CAAC;QACF,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC,CAAC;QAC/D,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YAC5B;gBACE,OAAO,EAAE,eAAe;gBACxB,OAAO,EAAE;oBACP,KAAK,EAAE,CAAC;oBACR,GAAG,EAAE,EAAE;iBACR;aACF;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,MAAM,GAAmB;YAC7B,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;YACzC,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,EAAE,EAAE,QAAQ;oBACZ,QAAQ,EAAE;wBACR,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE;wBAC5B,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,EAAE;qBAC9B;iBACF;aACF;SACF,CAAC;QACF,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,CAAC;QACxD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,MAAM,GAAmB;YAC7B,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;YACzC,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,EAAE,EAAE,QAAQ;oBACZ,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;iBACzC;aACF;SACF,CAAC;QACF,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,CAAC;QAC1D,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YAC5B;gBACE,OAAO,EAAE,iBAAiB;aAC3B;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,MAAM,MAAM,GAAmB;YAC7B,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;YACzC,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,EAAE,EAAE,QAAQ;oBACZ,QAAQ,EAAE;wBACR,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE;wBAC5B,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,EAAE;qBAC9B;iBACF;aACF;SACF,CAAC;QAEF,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,CAAC;QAC1D,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAClC,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC7C,CAAC;QACD,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC;YACjD,IAAI,EAAE,MAAM;YACZ,EAAE,EAAE,QAAQ;YACZ,QAAQ,EAAE;gBACR,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE;gBAC5B,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,EAAE;aAC9B;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,MAAM,GAAmB;YAC7B,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE;YAC3C,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,QAAQ;oBACd,EAAE,EAAE,UAAU;oBACd,MAAM,EAAE;wBACN;4BACE,IAAI,EAAE,QAAQ;4BACd,MAAM,EAAE,CAAC;4BACT,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;yBAC1C;qBACF;iBACF;gBACD;oBACE,IAAI,EAAE,MAAM;oBACZ,EAAE,EAAE,QAAQ;oBACZ,QAAQ,EAAE;wBACR,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE;wBAC5B,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,EAAE;qBAC9B;iBACF;aACF;SACF,CAAC;QAEF,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,uBAAuB,CAAC,EAAE,MAAM,CAAC,CAAC;QACtE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAClC,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC7C,CAAC;QACD,IAAI,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChD,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAClD,CAAC;QACD,MAAM,UAAU,GAAG,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACrD,MAAM,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC;YACxC,IAAI,EAAE,MAAM;YACZ,EAAE,EAAE,QAAQ;YACZ,QAAQ,EAAE;gBACR,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE;gBAC5B,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,EAAE;aAC9B;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,MAAM,GAAmB;YAC7B,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;YACzC,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,EAAE,EAAE,QAAQ;oBACZ,QAAQ,EAAE;wBACR;4BACE,IAAI,EAAE,SAAS;4BACf,MAAM,EAAE,CAAC;4BACT,IAAI,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE;yBAC5C;qBACF;iBACF;aACF;SACF,CAAC;QAEF,MAAM,CACJ,cAAc,CAAC,KAAK,CAAC,mCAAmC,CAAC,EAAE,MAAM,CAAC,CACnE,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;QAC1B,MAAM,CACJ,cAAc,CAAC,KAAK,CAAC,qCAAqC,CAAC,EAAE,MAAM,CAAC,CACrE,CAAC,OAAO,CAAC;YACR,MAAM,EAAE;gBACN;oBACE,OAAO,EAAE,iBAAiB;iBAC3B;aACF;SACF,CAAC,CAAC;QACH,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,qBAAqB,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;YACnE,MAAM,EAAE;gBACN;oBACE,OAAO,EAAE,kBAAkB;iBAC5B;aACF;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { expect } from \"buckwheat\";\nimport { describe, it } from \"mocha\";\nimport { parseJsonValue } from \"./json_parser.js\";\nimport { validateSchema } from \"./schema_validator.js\";\nimport { JsonValue, TypeDefinition } from \"./types.js\";\n\nfunction parse(json: string): JsonValue {\n const result = parseJsonValue(json);\n if (!result.value) {\n throw new Error(`JSON parse error: ${JSON.stringify(result.errors)}`);\n }\n return result.value;\n}\n\ndescribe(\"schema_validator\", () => {\n it(\"validates primitive int32\", () => {\n const schema: TypeDefinition = {\n type: { kind: \"primitive\", value: \"int32\" },\n records: [],\n };\n const result = validateSchema(parse(\"123\"), schema);\n expect(result).toMatch({ errors: [] });\n if (result.hints.length === 0) {\n throw new Error(\"Expected type hints\");\n }\n });\n\n it(\"validates primitive string\", () => {\n const schema: TypeDefinition = {\n type: { kind: \"primitive\", value: \"string\" },\n records: [],\n };\n const result = validateSchema(parse('\"hello\"'), schema);\n expect(result).toMatch({ errors: [] });\n });\n\n it(\"reports error for type mismatch (int32 vs string)\", () => {\n const schema: TypeDefinition = {\n type: { kind: \"primitive\", value: \"int32\" },\n records: [],\n };\n const result = validateSchema(parse('\"hello\"'), schema);\n expect(result.errors).toMatch([\n {\n message: \"Expected: int32\",\n },\n ]);\n });\n\n it(\"validates array of primitives\", () => {\n const schema: TypeDefinition = {\n type: {\n kind: \"array\",\n value: { item: { kind: \"primitive\", value: \"int32\" } },\n },\n records: [],\n };\n const result = validateSchema(parse(\"[1, 2, 3]\"), schema);\n expect(result).toMatch({ errors: [] });\n });\n\n it(\"reports error for invalid array item\", () => {\n const schema: TypeDefinition = {\n type: {\n kind: \"array\",\n value: { item: { kind: \"primitive\", value: \"int32\" } },\n },\n records: [],\n };\n const result = validateSchema(parse('[1, \"bad\", 3]'), schema);\n expect(result.errors).toMatch([\n {\n message: \"Expected: int32\",\n segment: {\n start: 4,\n end: 9,\n },\n },\n ]);\n });\n\n it(\"validates optional field (present)\", () => {\n const schema: TypeDefinition = {\n type: {\n kind: \"optional\",\n value: { kind: \"primitive\", value: \"int32\" },\n },\n records: [],\n };\n const result = validateSchema(parse(\"123\"), schema);\n expect(result).toMatch({ errors: [] });\n });\n\n it(\"validates optional field (null)\", () => {\n const schema: TypeDefinition = {\n type: {\n kind: \"optional\",\n value: { kind: \"primitive\", value: \"int32\" },\n },\n records: [],\n };\n const result = validateSchema(parse(\"null\"), schema);\n expect(result).toMatch({ errors: [] });\n });\n\n it(\"validates struct\", () => {\n const schema: TypeDefinition = {\n type: { kind: \"record\", value: \"MyStruct\" },\n records: [\n {\n kind: \"struct\",\n id: \"MyStruct\",\n fields: [\n {\n name: \"foo\",\n number: 1,\n type: { kind: \"primitive\", value: \"string\" },\n },\n {\n name: \"bar\",\n number: 2,\n type: { kind: \"primitive\", value: \"int32\" },\n },\n ],\n },\n ],\n };\n const result = validateSchema(parse('{\"foo\": \"hi\", \"bar\": 123}'), schema);\n expect(result).toMatch({ errors: [] });\n });\n\n it(\"reports unknown field in struct\", () => {\n const schema: TypeDefinition = {\n type: { kind: \"record\", value: \"MyStruct\" },\n records: [\n {\n kind: \"struct\",\n id: \"MyStruct\",\n fields: [],\n },\n ],\n };\n const result = validateSchema(parse('{\"unknown\": 1}'), schema);\n expect(result.errors).toMatch([\n {\n message: \"Unknown field\",\n segment: {\n start: 1,\n end: 10,\n },\n },\n ]);\n });\n\n it(\"validates enum (string literal)\", () => {\n const schema: TypeDefinition = {\n type: { kind: \"record\", value: \"MyEnum\" },\n records: [\n {\n kind: \"enum\",\n id: \"MyEnum\",\n variants: [\n { name: \"First\", number: 1 },\n { name: \"Second\", number: 2 },\n ],\n },\n ],\n };\n const result = validateSchema(parse('\"First\"'), schema);\n expect(result).toMatch({ errors: [] });\n });\n\n it(\"reports unknown enum variant\", () => {\n const schema: TypeDefinition = {\n type: { kind: \"record\", value: \"MyEnum\" },\n records: [\n {\n kind: \"enum\",\n id: \"MyEnum\",\n variants: [{ name: \"First\", number: 1 }],\n },\n ],\n };\n const result = validateSchema(parse('\"Unknown\"'), schema);\n expect(result.errors).toMatch([\n {\n message: \"Unknown variant\",\n },\n ]);\n });\n\n it(\"stores enum definition in type hint for UNKNOWN enum literal\", () => {\n const schema: TypeDefinition = {\n type: { kind: \"record\", value: \"MyEnum\" },\n records: [\n {\n kind: \"enum\",\n id: \"MyEnum\",\n variants: [\n { name: \"First\", number: 1 },\n { name: \"Second\", number: 2 },\n ],\n },\n ],\n };\n\n const result = validateSchema(parse('\"UNKNOWN\"'), schema);\n expect(result.errors).toMatch([]);\n if (!result.rootTypeHint) {\n throw new Error(\"Expected root type hint\");\n }\n expect(result.rootTypeHint.enumDefinition).toMatch({\n kind: \"enum\",\n id: \"MyEnum\",\n variants: [\n { name: \"First\", number: 1 },\n { name: \"Second\", number: 2 },\n ],\n });\n });\n\n it(\"stores enum definition in nested UNKNOWN enum field hint\", () => {\n const schema: TypeDefinition = {\n type: { kind: \"record\", value: \"MyStruct\" },\n records: [\n {\n kind: \"struct\",\n id: \"MyStruct\",\n fields: [\n {\n name: \"status\",\n number: 1,\n type: { kind: \"record\", value: \"MyEnum\" },\n },\n ],\n },\n {\n kind: \"enum\",\n id: \"MyEnum\",\n variants: [\n { name: \"First\", number: 1 },\n { name: \"Second\", number: 2 },\n ],\n },\n ],\n };\n\n const result = validateSchema(parse('{\"status\": \"UNKNOWN\"}'), schema);\n expect(result.errors).toMatch([]);\n if (!result.rootTypeHint) {\n throw new Error(\"Expected root type hint\");\n }\n if (result.rootTypeHint.childHints.length !== 1) {\n throw new Error(\"Expected one child type hint\");\n }\n const statusHint = result.rootTypeHint.childHints[0];\n expect(statusHint.enumDefinition).toMatch({\n kind: \"enum\",\n id: \"MyEnum\",\n variants: [\n { name: \"First\", number: 1 },\n { name: \"Second\", number: 2 },\n ],\n });\n });\n\n it(\"validates enum (object with kind)\", () => {\n const schema: TypeDefinition = {\n type: { kind: \"record\", value: \"MyEnum\" },\n records: [\n {\n kind: \"enum\",\n id: \"MyEnum\",\n variants: [\n {\n name: \"complex\",\n number: 1,\n type: { kind: \"primitive\", value: \"int32\" },\n },\n ],\n },\n ],\n };\n\n expect(\n validateSchema(parse('{\"kind\": \"complex\", \"value\": 123}'), schema),\n ).toMatch({ errors: [] });\n expect(\n validateSchema(parse('{\"kind\": \"complex\", \"value\": \"foo\"}'), schema),\n ).toMatch({\n errors: [\n {\n message: \"Expected: int32\",\n },\n ],\n });\n expect(validateSchema(parse('{\"kind\": \"complex\"}'), schema)).toMatch({\n errors: [\n {\n message: \"Missing: 'value'\",\n },\n ],\n });\n });\n});\n"]}
|
package/dist/json/to_json.d.ts
CHANGED
|
@@ -2,5 +2,5 @@ import type { Json, JsonValue, RecordDefinition, TypeSignature } from "./types";
|
|
|
2
2
|
export declare function toJson(value: JsonValue): Json;
|
|
3
3
|
export declare function makeJsonTemplate(type: TypeSignature, idToRecordDef: {
|
|
4
4
|
[id: string]: RecordDefinition;
|
|
5
|
-
},
|
|
5
|
+
}, nested?: "nested"): Json;
|
|
6
6
|
//# sourceMappingURL=to_json.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"to_json.d.ts","sourceRoot":"","sources":["../../src/json/to_json.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAEhF,wBAAgB,MAAM,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAiB7C;AAED,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,aAAa,EACnB,aAAa,EAAE;IAAE,CAAC,EAAE,EAAE,MAAM,GAAG,gBAAgB,CAAA;CAAE,EACjD,
|
|
1
|
+
{"version":3,"file":"to_json.d.ts","sourceRoot":"","sources":["../../src/json/to_json.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAEhF,wBAAgB,MAAM,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAiB7C;AAED,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,aAAa,EACnB,aAAa,EAAE;IAAE,CAAC,EAAE,EAAE,MAAM,GAAG,gBAAgB,CAAA;CAAE,EACjD,MAAM,CAAC,EAAE,QAAQ,GAChB,IAAI,CA4CN"}
|
package/dist/json/to_json.js
CHANGED
|
@@ -14,7 +14,7 @@ export function toJson(value) {
|
|
|
14
14
|
}
|
|
15
15
|
}
|
|
16
16
|
}
|
|
17
|
-
export function makeJsonTemplate(type, idToRecordDef,
|
|
17
|
+
export function makeJsonTemplate(type, idToRecordDef, nested) {
|
|
18
18
|
switch (type.kind) {
|
|
19
19
|
case "array": {
|
|
20
20
|
return [];
|
|
@@ -25,12 +25,12 @@ export function makeJsonTemplate(type, idToRecordDef, depth) {
|
|
|
25
25
|
case "record": {
|
|
26
26
|
const recordDef = idToRecordDef[type.value];
|
|
27
27
|
if (recordDef.kind === "struct") {
|
|
28
|
-
if (
|
|
28
|
+
if (nested) {
|
|
29
29
|
return {};
|
|
30
30
|
}
|
|
31
31
|
return Object.fromEntries(recordDef.fields.map((field) => [
|
|
32
32
|
field.name,
|
|
33
|
-
makeJsonTemplate(field.type, idToRecordDef, "
|
|
33
|
+
makeJsonTemplate(field.type, idToRecordDef, "nested"),
|
|
34
34
|
]));
|
|
35
35
|
}
|
|
36
36
|
else {
|
package/dist/json/to_json.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"to_json.js","sourceRoot":"","sources":["../../src/json/to_json.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,MAAM,CAAC,KAAgB;IACrC,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACpC,CAAC;QACD,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAClC,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC;gBAC/C,QAAQ,CAAC,GAAG;gBACZ,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;aACvB,CAAC,CACH,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,IAAmB,EACnB,aAAiD,EACjD,
|
|
1
|
+
{"version":3,"file":"to_json.js","sourceRoot":"","sources":["../../src/json/to_json.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,MAAM,CAAC,KAAgB;IACrC,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACpC,CAAC;QACD,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAClC,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC;gBAC/C,QAAQ,CAAC,GAAG;gBACZ,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;aACvB,CAAC,CACH,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,IAAmB,EACnB,aAAiD,EACjD,MAAiB;IAEjB,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,SAAS,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAE,CAAC;YAC7C,IAAI,SAAS,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAChC,IAAI,MAAM,EAAE,CAAC;oBACX,OAAO,EAAE,CAAC;gBACZ,CAAC;gBACD,OAAO,MAAM,CAAC,WAAW,CACvB,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;oBAC9B,KAAK,CAAC,IAAI;oBACV,gBAAgB,CAAC,KAAK,CAAC,IAAK,EAAE,aAAa,EAAE,QAAQ,CAAC;iBACvD,CAAC,CACH,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,OAAO;gBACP,OAAO,SAAS,CAAC;YACnB,CAAC;QACH,CAAC;QACD,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,QAAQ,IAAI,CAAC,KAAK,EAAE,CAAC;gBACnB,KAAK,MAAM;oBACT,OAAO,KAAK,CAAC;gBACf,KAAK,OAAO,CAAC;gBACb,KAAK,SAAS,CAAC;gBACf,KAAK,SAAS;oBACZ,OAAO,CAAC,CAAC;gBACX,KAAK,OAAO,CAAC;gBACb,KAAK,QAAQ;oBACX,OAAO,GAAG,CAAC;gBACb,KAAK,WAAW;oBACd,OAAO,EAAE,WAAW,EAAE,CAAC,EAAE,SAAS,EAAE,sBAAsB,EAAE,CAAC;gBAC/D,KAAK,QAAQ,CAAC;gBACd,KAAK,OAAO;oBACV,OAAO,EAAE,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC","sourcesContent":["import type { Json, JsonValue, RecordDefinition, TypeSignature } from \"./types\";\n\nexport function toJson(value: JsonValue): Json {\n switch (value.kind) {\n case \"literal\": {\n return JSON.parse(value.jsonCode);\n }\n case \"array\": {\n return value.values.map(toJson);\n }\n case \"object\": {\n return Object.fromEntries(\n Object.values(value.keyValues).map((keyValue) => [\n keyValue.key,\n toJson(keyValue.value),\n ]),\n );\n }\n }\n}\n\nexport function makeJsonTemplate(\n type: TypeSignature,\n idToRecordDef: { [id: string]: RecordDefinition },\n nested?: \"nested\",\n): Json {\n switch (type.kind) {\n case \"array\": {\n return [];\n }\n case \"optional\": {\n return null;\n }\n case \"record\": {\n const recordDef = idToRecordDef[type.value]!;\n if (recordDef.kind === \"struct\") {\n if (nested) {\n return {};\n }\n return Object.fromEntries(\n recordDef.fields.map((field) => [\n field.name,\n makeJsonTemplate(field.type!, idToRecordDef, \"nested\"),\n ]),\n );\n } else {\n // Enum\n return \"UNKNOWN\";\n }\n }\n case \"primitive\": {\n switch (type.value) {\n case \"bool\":\n return false;\n case \"int32\":\n case \"float32\":\n case \"float64\":\n return 0;\n case \"int64\":\n case \"hash64\":\n return \"0\";\n case \"timestamp\":\n return { unix_millis: 0, formatted: \"1970-01-01T00:00:00Z\" };\n case \"string\":\n case \"bytes\":\n return \"\";\n }\n }\n }\n}\n"]}
|
package/dist/json/types.d.ts
CHANGED
|
@@ -17,6 +17,7 @@ export interface JsonArray {
|
|
|
17
17
|
readonly firstToken: Segment;
|
|
18
18
|
readonly segment: Segment;
|
|
19
19
|
readonly values: JsonValue[];
|
|
20
|
+
readonly indent: number;
|
|
20
21
|
expectedType?: TypeSignature;
|
|
21
22
|
}
|
|
22
23
|
export interface JsonKey {
|
|
@@ -37,6 +38,7 @@ export interface JsonObject {
|
|
|
37
38
|
[key: string]: JsonKeyValue;
|
|
38
39
|
};
|
|
39
40
|
readonly allKeys: readonly JsonKey[];
|
|
41
|
+
readonly indent: number;
|
|
40
42
|
expectedType?: TypeSignature;
|
|
41
43
|
}
|
|
42
44
|
export interface JsonLiteral {
|
|
@@ -45,6 +47,7 @@ export interface JsonLiteral {
|
|
|
45
47
|
readonly segment: Segment;
|
|
46
48
|
readonly jsonCode: string;
|
|
47
49
|
readonly type: "boolean" | "null" | "number" | "string";
|
|
50
|
+
readonly indent: number;
|
|
48
51
|
expectedType?: TypeSignature;
|
|
49
52
|
}
|
|
50
53
|
export interface Segment {
|
|
@@ -148,6 +151,7 @@ export interface TypeHint {
|
|
|
148
151
|
readonly message: string | readonly string[];
|
|
149
152
|
readonly valueContext: JsonValueContext;
|
|
150
153
|
readonly childHints: readonly TypeHint[];
|
|
154
|
+
readonly enumDefinition?: EnumDefinition;
|
|
151
155
|
}
|
|
152
156
|
export type Hint = {
|
|
153
157
|
readonly segment: Segment;
|
package/dist/json/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/json/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/json/types.ts"],"names":[],"mappings":"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"}
|