@datastream/validate
Advanced tools
+21
-12
@@ -19,3 +19,6 @@ var __create = Object.create; | ||
| }; | ||
| var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod)); | ||
| var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( | ||
| isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, | ||
| mod | ||
| )); | ||
| var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); | ||
@@ -47,10 +50,17 @@ var validate_exports = {}; | ||
| }; | ||
| const validateStream = (chunkSchema, config, options) => { | ||
| const { idxStart, key } = { | ||
| const validateStream = (validateOptions, streamOptions) => { | ||
| let { | ||
| schema, | ||
| idxStart, | ||
| resultKey, | ||
| ...ajvOptions | ||
| } = { | ||
| ...jsonSchemaValidateDefaults, | ||
| ...config | ||
| ...validateOptions | ||
| }; | ||
| if (typeof chunkSchema !== "function") { | ||
| const ajv = new Ajv(ajvDefaults); | ||
| chunkSchema = ajv.compile(chunkSchema); | ||
| if (typeof schema !== "function") { | ||
| const ajv = new Ajv({ ...ajvDefaults, ...ajvOptions }); | ||
| (0, import_ajv_formats.default)(ajv); | ||
| (0, import_ajv_formats_draft2019.default)(ajv); | ||
| schema = ajv.compile(schema); | ||
| } | ||
@@ -61,6 +71,5 @@ const value = {}; | ||
| idx += 1; | ||
| const chunkValid = chunkSchema(chunk); | ||
| console.log({ chunkValid }); | ||
| const chunkValid = schema(chunk); | ||
| if (!chunkValid) { | ||
| for (const error of chunkSchema.errors) { | ||
| for (const error of schema.errors) { | ||
| const { id, keys, message } = processError(error); | ||
@@ -75,4 +84,4 @@ if (!value[id]) { | ||
| }; | ||
| const stream = (0, import_core.createTransformStream)(transform, options); | ||
| stream.result = () => ({ key, value }); | ||
| const stream = (0, import_core.createTransformStream)(transform, streamOptions); | ||
| stream.result = () => ({ key: resultKey ?? "validate", value }); | ||
| return stream; | ||
@@ -79,0 +88,0 @@ }; |
| { | ||
| "version": 3, | ||
| "sources": ["index.js"], | ||
| "sourcesContent": ["import { createTransformStream } from '@datastream/core'\nimport _ajv from 'ajv/dist/2020.js'\nimport formats from 'ajv-formats'\nimport formatsDraft2019 from 'ajv-formats-draft2019'\nimport uriResolver from 'fast-uri'\n\nconst Ajv = _ajv.default // esm workaround for linting\n\nconst ajvDefaults = {\n strict: true,\n coerceTypes: 'array',\n allErrors: true,\n useDefaults: 'empty',\n uriResolver,\n}\n\nconst jsonSchemaValidateDefaults = {\n idxStart: 0,\n key: 'ajvErrors',\n language: 'en',\n availableLanguages: undefined,\n}\n\nexport const validateStream = (chunkSchema, config, options) => {\n const { idxStart, key /*, language, availableLanguages*/ } = {\n ...jsonSchemaValidateDefaults,\n ...config,\n }\n if (typeof chunkSchema !== 'function') {\n const ajv = new Ajv(ajvDefaults)\n chunkSchema = ajv.compile(chunkSchema)\n }\n\n const value = {} // aka errors\n let idx = idxStart - 1\n const transform = (chunk) => {\n idx += 1\n\n const chunkValid = chunkSchema(chunk)\n console.log({ chunkValid })\n if (!chunkValid) {\n // if (availableLanguages) {\n // availableLanguages[language](chunkSchema.errors)\n // }\n\n for (const error of chunkSchema.errors) {\n const { id, keys, message } = processError(error)\n\n if (!value[id]) {\n value[id] = { id, keys, message, idx: [] }\n }\n value[id].idx.push(idx)\n }\n }\n return chunk // TODO option to not pass chunk on?\n }\n const stream = createTransformStream(transform, options)\n stream.result = () => ({ key, value })\n return stream\n}\n\nconst processError = (error) => {\n const message = error.message || ''\n\n let id = error.schemaPath\n\n let keys = []\n if (error.keyword === 'errorMessage') {\n error.params.errors.forEach((error) => {\n const value = makeKeys(error)\n if (value) keys.push(value)\n })\n keys = [...new Set(keys.sort())]\n } else {\n keys.push(makeKeys(error))\n }\n if (!error.instancePath && keys.length) {\n id += `/${keys.join('|')}`\n }\n return { id, keys, message }\n}\n\nconst makeKeys = (error) => {\n // deps groups columns that are related in anyOf/oneOf.\n /* error.params.deps ?? */\n return (\n error.params.missingProperty ||\n error.params.additionalProperty ||\n error.instancePath.replace('/', '')\n )\n}\n\nexport default validateStream\n"], | ||
| "mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAsC;AACtC,eAAiB;AACjB,yBAAoB;AACpB,mCAA6B;AAC7B,sBAAwB;AAExB,MAAM,MAAM,iBAAK;AAEjB,MAAM,cAAc;AAAA,EAClB,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,WAAW;AAAA,EACX,aAAa;AAAA,EACb;AACF;AAEA,MAAM,6BAA6B;AAAA,EACjC,UAAU;AAAA,EACV,KAAK;AAAA,EACL,UAAU;AAAA,EACV,oBAAoB;AACtB;AAEO,MAAM,iBAAiB,CAAC,aAAa,QAAQ,YAAY;AAC9D,QAAM,EAAE,UAAU,QAA2C;AAAA,IAC3D,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACA,MAAI,OAAO,gBAAgB,YAAY;AACrC,UAAM,MAAM,IAAI,IAAI,WAAW;AAC/B,kBAAc,IAAI,QAAQ,WAAW;AAAA,EACvC;AAEA,QAAM,QAAQ,CAAC;AACf,MAAI,MAAM,WAAW;AACrB,QAAM,YAAY,CAAC,UAAU;AAC3B,WAAO;AAEP,UAAM,aAAa,YAAY,KAAK;AACpC,YAAQ,IAAI,EAAE,WAAW,CAAC;AAC1B,QAAI,CAAC,YAAY;AAKf,iBAAW,SAAS,YAAY,QAAQ;AACtC,cAAM,EAAE,IAAI,MAAM,YAAY,aAAa,KAAK;AAEhD,YAAI,CAAC,MAAM,KAAK;AACd,gBAAM,MAAM,EAAE,IAAI,MAAM,SAAS,KAAK,CAAC,EAAE;AAAA,QAC3C;AACA,cAAM,IAAI,IAAI,KAAK,GAAG;AAAA,MACxB;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACA,QAAM,SAAS,uCAAsB,WAAW,OAAO;AACvD,SAAO,SAAS,MAAO,GAAE,KAAK,MAAM;AACpC,SAAO;AACT;AAEA,MAAM,eAAe,CAAC,UAAU;AAC9B,QAAM,UAAU,MAAM,WAAW;AAEjC,MAAI,KAAK,MAAM;AAEf,MAAI,OAAO,CAAC;AACZ,MAAI,MAAM,YAAY,gBAAgB;AACpC,UAAM,OAAO,OAAO,QAAQ,CAAC,WAAU;AACrC,YAAM,QAAQ,SAAS,MAAK;AAC5B,UAAI;AAAO,aAAK,KAAK,KAAK;AAAA,IAC5B,CAAC;AACD,WAAO,CAAC,GAAG,IAAI,IAAI,KAAK,KAAK,CAAC,CAAC;AAAA,EACjC,OAAO;AACL,SAAK,KAAK,SAAS,KAAK,CAAC;AAAA,EAC3B;AACA,MAAI,CAAC,MAAM,gBAAgB,KAAK,QAAQ;AACtC,UAAM,IAAI,KAAK,KAAK,GAAG;AAAA,EACzB;AACA,SAAO,EAAE,IAAI,MAAM,QAAQ;AAC7B;AAEA,MAAM,WAAW,CAAC,UAAU;AAG1B,SACE,MAAM,OAAO,mBACb,MAAM,OAAO,sBACb,MAAM,aAAa,QAAQ,KAAK,EAAE;AAEtC;AAEA,IAAO,mBAAQ;", | ||
| "names": [] | ||
| "sourcesContent": ["import { createTransformStream } from '@datastream/core'\nimport _ajv from 'ajv/dist/2020.js'\nimport formats from 'ajv-formats'\nimport formatsDraft2019 from 'ajv-formats-draft2019'\nimport uriResolver from 'fast-uri'\n\nconst Ajv = _ajv.default // esm workaround for linting\n\nconst ajvDefaults = {\n strict: true,\n coerceTypes: 'array',\n allErrors: true,\n useDefaults: 'empty',\n uriResolver\n}\n\nconst jsonSchemaValidateDefaults = {\n idxStart: 0,\n key: 'ajvErrors',\n language: 'en',\n availableLanguages: undefined\n}\n\nexport const validateStream = (validateOptions, streamOptions) => {\n let {\n schema,\n idxStart,\n resultKey /* language, availableLanguages */,\n ...ajvOptions\n } = {\n ...jsonSchemaValidateDefaults,\n ...validateOptions\n }\n if (typeof schema !== 'function') {\n const ajv = new Ajv({ ...ajvDefaults, ...ajvOptions })\n formats(ajv)\n formatsDraft2019(ajv)\n schema = ajv.compile(schema)\n }\n\n const value = {} // aka errors\n let idx = idxStart - 1\n const transform = (chunk) => {\n idx += 1\n\n const chunkValid = schema(chunk)\n //console.log({ chunkValid })\n if (!chunkValid) {\n // if (availableLanguages) {\n // availableLanguages[language](chunkSchema.errors)\n // }\n\n for (const error of schema.errors) {\n const { id, keys, message } = processError(error)\n\n if (!value[id]) {\n value[id] = { id, keys, message, idx: [] }\n }\n value[id].idx.push(idx)\n }\n }\n return chunk // TODO option to not pass chunk on?\n }\n const stream = createTransformStream(transform, streamOptions)\n stream.result = () => ({ key: resultKey ?? 'validate', value })\n return stream\n}\n\nconst processError = (error) => {\n const message = error.message || ''\n\n let id = error.schemaPath\n\n let keys = []\n if (error.keyword === 'errorMessage') {\n error.params.errors.forEach((error) => {\n const value = makeKeys(error)\n if (value) keys.push(value)\n })\n keys = [...new Set(keys.sort())]\n } else {\n keys.push(makeKeys(error))\n }\n if (!error.instancePath && keys.length) {\n id += `/${keys.join('|')}`\n }\n return { id, keys, message }\n}\n\nconst makeKeys = (error) => {\n // deps groups columns that are related in anyOf/oneOf.\n /* error.params.deps ?? */\n return (\n error.params.missingProperty ||\n error.params.additionalProperty ||\n error.instancePath.replace('/', '')\n )\n}\n\nexport default validateStream\n"], | ||
| "mappings": ";;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAsC;AACtC,eAAiB;AACjB,yBAAoB;AACpB,mCAA6B;AAC7B,sBAAwB;AAExB,MAAM,MAAM,SAAAA,QAAK;AAEjB,MAAM,cAAc;AAAA,EAClB,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,WAAW;AAAA,EACX,aAAa;AAAA,EACb,6BAAAC;AACF;AAEA,MAAM,6BAA6B;AAAA,EACjC,UAAU;AAAA,EACV,KAAK;AAAA,EACL,UAAU;AAAA,EACV,oBAAoB;AACtB;AAEO,MAAM,iBAAiB,CAAC,iBAAiB,kBAAkB;AAChE,MAAI;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,OACG;AAAA,EACL,IAAI;AAAA,IACF,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACA,MAAI,OAAO,WAAW,YAAY;AAChC,UAAM,MAAM,IAAI,IAAI,EAAE,GAAG,aAAa,GAAG,WAAW,CAAC;AACrD,2BAAAC,SAAQ,GAAG;AACX,qCAAAC,SAAiB,GAAG;AACpB,aAAS,IAAI,QAAQ,MAAM;AAAA,EAC7B;AAEA,QAAM,QAAQ,CAAC;AACf,MAAI,MAAM,WAAW;AACrB,QAAM,YAAY,CAAC,UAAU;AAC3B,WAAO;AAEP,UAAM,aAAa,OAAO,KAAK;AAE/B,QAAI,CAAC,YAAY;AAKf,iBAAW,SAAS,OAAO,QAAQ;AACjC,cAAM,EAAE,IAAI,MAAM,QAAQ,IAAI,aAAa,KAAK;AAEhD,YAAI,CAAC,MAAM,KAAK;AACd,gBAAM,MAAM,EAAE,IAAI,MAAM,SAAS,KAAK,CAAC,EAAE;AAAA,QAC3C;AACA,cAAM,IAAI,IAAI,KAAK,GAAG;AAAA,MACxB;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACA,QAAM,aAAS,mCAAsB,WAAW,aAAa;AAC7D,SAAO,SAAS,OAAO,EAAE,KAAK,aAAa,YAAY,MAAM;AAC7D,SAAO;AACT;AAEA,MAAM,eAAe,CAAC,UAAU;AAC9B,QAAM,UAAU,MAAM,WAAW;AAEjC,MAAI,KAAK,MAAM;AAEf,MAAI,OAAO,CAAC;AACZ,MAAI,MAAM,YAAY,gBAAgB;AACpC,UAAM,OAAO,OAAO,QAAQ,CAACC,WAAU;AACrC,YAAM,QAAQ,SAASA,MAAK;AAC5B,UAAI;AAAO,aAAK,KAAK,KAAK;AAAA,IAC5B,CAAC;AACD,WAAO,CAAC,GAAG,IAAI,IAAI,KAAK,KAAK,CAAC,CAAC;AAAA,EACjC,OAAO;AACL,SAAK,KAAK,SAAS,KAAK,CAAC;AAAA,EAC3B;AACA,MAAI,CAAC,MAAM,gBAAgB,KAAK,QAAQ;AACtC,UAAM,IAAI,KAAK,KAAK,GAAG;AAAA,EACzB;AACA,SAAO,EAAE,IAAI,MAAM,QAAQ;AAC7B;AAEA,MAAM,WAAW,CAAC,UAAU;AAG1B,SACE,MAAM,OAAO,mBACb,MAAM,OAAO,sBACb,MAAM,aAAa,QAAQ,KAAK,EAAE;AAEtC;AAEA,IAAO,mBAAQ;", | ||
| "names": ["_ajv", "uriResolver", "formats", "formatsDraft2019", "error"] | ||
| } |
+17
-11
@@ -20,10 +20,17 @@ import { createTransformStream } from "@datastream/core"; | ||
| }; | ||
| const validateStream = (chunkSchema, config, options) => { | ||
| const { idxStart, key } = { | ||
| const validateStream = (validateOptions, streamOptions) => { | ||
| let { | ||
| schema, | ||
| idxStart, | ||
| resultKey, | ||
| ...ajvOptions | ||
| } = { | ||
| ...jsonSchemaValidateDefaults, | ||
| ...config | ||
| ...validateOptions | ||
| }; | ||
| if (typeof chunkSchema !== "function") { | ||
| const ajv = new Ajv(ajvDefaults); | ||
| chunkSchema = ajv.compile(chunkSchema); | ||
| if (typeof schema !== "function") { | ||
| const ajv = new Ajv({ ...ajvDefaults, ...ajvOptions }); | ||
| formats(ajv); | ||
| formatsDraft2019(ajv); | ||
| schema = ajv.compile(schema); | ||
| } | ||
@@ -34,6 +41,5 @@ const value = {}; | ||
| idx += 1; | ||
| const chunkValid = chunkSchema(chunk); | ||
| console.log({ chunkValid }); | ||
| const chunkValid = schema(chunk); | ||
| if (!chunkValid) { | ||
| for (const error of chunkSchema.errors) { | ||
| for (const error of schema.errors) { | ||
| const { id, keys, message } = processError(error); | ||
@@ -48,4 +54,4 @@ if (!value[id]) { | ||
| }; | ||
| const stream = createTransformStream(transform, options); | ||
| stream.result = () => ({ key, value }); | ||
| const stream = createTransformStream(transform, streamOptions); | ||
| stream.result = () => ({ key: resultKey ?? "validate", value }); | ||
| return stream; | ||
@@ -52,0 +58,0 @@ }; |
| { | ||
| "version": 3, | ||
| "sources": ["index.js"], | ||
| "sourcesContent": ["import { createTransformStream } from '@datastream/core'\nimport _ajv from 'ajv/dist/2020.js'\nimport formats from 'ajv-formats'\nimport formatsDraft2019 from 'ajv-formats-draft2019'\nimport uriResolver from 'fast-uri'\n\nconst Ajv = _ajv.default // esm workaround for linting\n\nconst ajvDefaults = {\n strict: true,\n coerceTypes: 'array',\n allErrors: true,\n useDefaults: 'empty',\n uriResolver,\n}\n\nconst jsonSchemaValidateDefaults = {\n idxStart: 0,\n key: 'ajvErrors',\n language: 'en',\n availableLanguages: undefined,\n}\n\nexport const validateStream = (chunkSchema, config, options) => {\n const { idxStart, key /*, language, availableLanguages*/ } = {\n ...jsonSchemaValidateDefaults,\n ...config,\n }\n if (typeof chunkSchema !== 'function') {\n const ajv = new Ajv(ajvDefaults)\n chunkSchema = ajv.compile(chunkSchema)\n }\n\n const value = {} // aka errors\n let idx = idxStart - 1\n const transform = (chunk) => {\n idx += 1\n\n const chunkValid = chunkSchema(chunk)\n console.log({ chunkValid })\n if (!chunkValid) {\n // if (availableLanguages) {\n // availableLanguages[language](chunkSchema.errors)\n // }\n\n for (const error of chunkSchema.errors) {\n const { id, keys, message } = processError(error)\n\n if (!value[id]) {\n value[id] = { id, keys, message, idx: [] }\n }\n value[id].idx.push(idx)\n }\n }\n return chunk // TODO option to not pass chunk on?\n }\n const stream = createTransformStream(transform, options)\n stream.result = () => ({ key, value })\n return stream\n}\n\nconst processError = (error) => {\n const message = error.message || ''\n\n let id = error.schemaPath\n\n let keys = []\n if (error.keyword === 'errorMessage') {\n error.params.errors.forEach((error) => {\n const value = makeKeys(error)\n if (value) keys.push(value)\n })\n keys = [...new Set(keys.sort())]\n } else {\n keys.push(makeKeys(error))\n }\n if (!error.instancePath && keys.length) {\n id += `/${keys.join('|')}`\n }\n return { id, keys, message }\n}\n\nconst makeKeys = (error) => {\n // deps groups columns that are related in anyOf/oneOf.\n /* error.params.deps ?? */\n return (\n error.params.missingProperty ||\n error.params.additionalProperty ||\n error.instancePath.replace('/', '')\n )\n}\n\nexport default validateStream\n"], | ||
| "mappings": "AAAA;AACA;AACA;AACA;AACA;AAEA,MAAM,MAAM,KAAK;AAEjB,MAAM,cAAc;AAAA,EAClB,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,WAAW;AAAA,EACX,aAAa;AAAA,EACb;AACF;AAEA,MAAM,6BAA6B;AAAA,EACjC,UAAU;AAAA,EACV,KAAK;AAAA,EACL,UAAU;AAAA,EACV,oBAAoB;AACtB;AAEO,MAAM,iBAAiB,CAAC,aAAa,QAAQ,YAAY;AAC9D,QAAM,EAAE,UAAU,QAA2C;AAAA,IAC3D,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACA,MAAI,OAAO,gBAAgB,YAAY;AACrC,UAAM,MAAM,IAAI,IAAI,WAAW;AAC/B,kBAAc,IAAI,QAAQ,WAAW;AAAA,EACvC;AAEA,QAAM,QAAQ,CAAC;AACf,MAAI,MAAM,WAAW;AACrB,QAAM,YAAY,CAAC,UAAU;AAC3B,WAAO;AAEP,UAAM,aAAa,YAAY,KAAK;AACpC,YAAQ,IAAI,EAAE,WAAW,CAAC;AAC1B,QAAI,CAAC,YAAY;AAKf,iBAAW,SAAS,YAAY,QAAQ;AACtC,cAAM,EAAE,IAAI,MAAM,YAAY,aAAa,KAAK;AAEhD,YAAI,CAAC,MAAM,KAAK;AACd,gBAAM,MAAM,EAAE,IAAI,MAAM,SAAS,KAAK,CAAC,EAAE;AAAA,QAC3C;AACA,cAAM,IAAI,IAAI,KAAK,GAAG;AAAA,MACxB;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACA,QAAM,SAAS,sBAAsB,WAAW,OAAO;AACvD,SAAO,SAAS,MAAO,GAAE,KAAK,MAAM;AACpC,SAAO;AACT;AAEA,MAAM,eAAe,CAAC,UAAU;AAC9B,QAAM,UAAU,MAAM,WAAW;AAEjC,MAAI,KAAK,MAAM;AAEf,MAAI,OAAO,CAAC;AACZ,MAAI,MAAM,YAAY,gBAAgB;AACpC,UAAM,OAAO,OAAO,QAAQ,CAAC,WAAU;AACrC,YAAM,QAAQ,SAAS,MAAK;AAC5B,UAAI;AAAO,aAAK,KAAK,KAAK;AAAA,IAC5B,CAAC;AACD,WAAO,CAAC,GAAG,IAAI,IAAI,KAAK,KAAK,CAAC,CAAC;AAAA,EACjC,OAAO;AACL,SAAK,KAAK,SAAS,KAAK,CAAC;AAAA,EAC3B;AACA,MAAI,CAAC,MAAM,gBAAgB,KAAK,QAAQ;AACtC,UAAM,IAAI,KAAK,KAAK,GAAG;AAAA,EACzB;AACA,SAAO,EAAE,IAAI,MAAM,QAAQ;AAC7B;AAEA,MAAM,WAAW,CAAC,UAAU;AAG1B,SACE,MAAM,OAAO,mBACb,MAAM,OAAO,sBACb,MAAM,aAAa,QAAQ,KAAK,EAAE;AAEtC;AAEA,IAAO,mBAAQ;", | ||
| "names": [] | ||
| "sourcesContent": ["import { createTransformStream } from '@datastream/core'\nimport _ajv from 'ajv/dist/2020.js'\nimport formats from 'ajv-formats'\nimport formatsDraft2019 from 'ajv-formats-draft2019'\nimport uriResolver from 'fast-uri'\n\nconst Ajv = _ajv.default // esm workaround for linting\n\nconst ajvDefaults = {\n strict: true,\n coerceTypes: 'array',\n allErrors: true,\n useDefaults: 'empty',\n uriResolver\n}\n\nconst jsonSchemaValidateDefaults = {\n idxStart: 0,\n key: 'ajvErrors',\n language: 'en',\n availableLanguages: undefined\n}\n\nexport const validateStream = (validateOptions, streamOptions) => {\n let {\n schema,\n idxStart,\n resultKey /* language, availableLanguages */,\n ...ajvOptions\n } = {\n ...jsonSchemaValidateDefaults,\n ...validateOptions\n }\n if (typeof schema !== 'function') {\n const ajv = new Ajv({ ...ajvDefaults, ...ajvOptions })\n formats(ajv)\n formatsDraft2019(ajv)\n schema = ajv.compile(schema)\n }\n\n const value = {} // aka errors\n let idx = idxStart - 1\n const transform = (chunk) => {\n idx += 1\n\n const chunkValid = schema(chunk)\n //console.log({ chunkValid })\n if (!chunkValid) {\n // if (availableLanguages) {\n // availableLanguages[language](chunkSchema.errors)\n // }\n\n for (const error of schema.errors) {\n const { id, keys, message } = processError(error)\n\n if (!value[id]) {\n value[id] = { id, keys, message, idx: [] }\n }\n value[id].idx.push(idx)\n }\n }\n return chunk // TODO option to not pass chunk on?\n }\n const stream = createTransformStream(transform, streamOptions)\n stream.result = () => ({ key: resultKey ?? 'validate', value })\n return stream\n}\n\nconst processError = (error) => {\n const message = error.message || ''\n\n let id = error.schemaPath\n\n let keys = []\n if (error.keyword === 'errorMessage') {\n error.params.errors.forEach((error) => {\n const value = makeKeys(error)\n if (value) keys.push(value)\n })\n keys = [...new Set(keys.sort())]\n } else {\n keys.push(makeKeys(error))\n }\n if (!error.instancePath && keys.length) {\n id += `/${keys.join('|')}`\n }\n return { id, keys, message }\n}\n\nconst makeKeys = (error) => {\n // deps groups columns that are related in anyOf/oneOf.\n /* error.params.deps ?? */\n return (\n error.params.missingProperty ||\n error.params.additionalProperty ||\n error.instancePath.replace('/', '')\n )\n}\n\nexport default validateStream\n"], | ||
| "mappings": "AAAA,SAAS,6BAA6B;AACtC,OAAO,UAAU;AACjB,OAAO,aAAa;AACpB,OAAO,sBAAsB;AAC7B,OAAO,iBAAiB;AAExB,MAAM,MAAM,KAAK;AAEjB,MAAM,cAAc;AAAA,EAClB,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,WAAW;AAAA,EACX,aAAa;AAAA,EACb;AACF;AAEA,MAAM,6BAA6B;AAAA,EACjC,UAAU;AAAA,EACV,KAAK;AAAA,EACL,UAAU;AAAA,EACV,oBAAoB;AACtB;AAEO,MAAM,iBAAiB,CAAC,iBAAiB,kBAAkB;AAChE,MAAI;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,OACG;AAAA,EACL,IAAI;AAAA,IACF,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACA,MAAI,OAAO,WAAW,YAAY;AAChC,UAAM,MAAM,IAAI,IAAI,EAAE,GAAG,aAAa,GAAG,WAAW,CAAC;AACrD,YAAQ,GAAG;AACX,qBAAiB,GAAG;AACpB,aAAS,IAAI,QAAQ,MAAM;AAAA,EAC7B;AAEA,QAAM,QAAQ,CAAC;AACf,MAAI,MAAM,WAAW;AACrB,QAAM,YAAY,CAAC,UAAU;AAC3B,WAAO;AAEP,UAAM,aAAa,OAAO,KAAK;AAE/B,QAAI,CAAC,YAAY;AAKf,iBAAW,SAAS,OAAO,QAAQ;AACjC,cAAM,EAAE,IAAI,MAAM,QAAQ,IAAI,aAAa,KAAK;AAEhD,YAAI,CAAC,MAAM,KAAK;AACd,gBAAM,MAAM,EAAE,IAAI,MAAM,SAAS,KAAK,CAAC,EAAE;AAAA,QAC3C;AACA,cAAM,IAAI,IAAI,KAAK,GAAG;AAAA,MACxB;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACA,QAAM,SAAS,sBAAsB,WAAW,aAAa;AAC7D,SAAO,SAAS,OAAO,EAAE,KAAK,aAAa,YAAY,MAAM;AAC7D,SAAO;AACT;AAEA,MAAM,eAAe,CAAC,UAAU;AAC9B,QAAM,UAAU,MAAM,WAAW;AAEjC,MAAI,KAAK,MAAM;AAEf,MAAI,OAAO,CAAC;AACZ,MAAI,MAAM,YAAY,gBAAgB;AACpC,UAAM,OAAO,OAAO,QAAQ,CAACA,WAAU;AACrC,YAAM,QAAQ,SAASA,MAAK;AAC5B,UAAI;AAAO,aAAK,KAAK,KAAK;AAAA,IAC5B,CAAC;AACD,WAAO,CAAC,GAAG,IAAI,IAAI,KAAK,KAAK,CAAC,CAAC;AAAA,EACjC,OAAO;AACL,SAAK,KAAK,SAAS,KAAK,CAAC;AAAA,EAC3B;AACA,MAAI,CAAC,MAAM,gBAAgB,KAAK,QAAQ;AACtC,UAAM,IAAI,KAAK,KAAK,GAAG;AAAA,EACzB;AACA,SAAO,EAAE,IAAI,MAAM,QAAQ;AAC7B;AAEA,MAAM,WAAW,CAAC,UAAU;AAG1B,SACE,MAAM,OAAO,mBACb,MAAM,OAAO,sBACb,MAAM,aAAa,QAAQ,KAAK,EAAE;AAEtC;AAEA,IAAO,mBAAQ;", | ||
| "names": ["error"] | ||
| } |
+17
-11
@@ -20,10 +20,17 @@ import { createTransformStream } from "@datastream/core"; | ||
| }; | ||
| const validateStream = (chunkSchema, config, options) => { | ||
| const { idxStart, key } = { | ||
| const validateStream = (validateOptions, streamOptions) => { | ||
| let { | ||
| schema, | ||
| idxStart, | ||
| resultKey, | ||
| ...ajvOptions | ||
| } = { | ||
| ...jsonSchemaValidateDefaults, | ||
| ...config | ||
| ...validateOptions | ||
| }; | ||
| if (typeof chunkSchema !== "function") { | ||
| const ajv = new Ajv(ajvDefaults); | ||
| chunkSchema = ajv.compile(chunkSchema); | ||
| if (typeof schema !== "function") { | ||
| const ajv = new Ajv({ ...ajvDefaults, ...ajvOptions }); | ||
| formats(ajv); | ||
| formatsDraft2019(ajv); | ||
| schema = ajv.compile(schema); | ||
| } | ||
@@ -34,6 +41,5 @@ const value = {}; | ||
| idx += 1; | ||
| const chunkValid = chunkSchema(chunk); | ||
| console.log({ chunkValid }); | ||
| const chunkValid = schema(chunk); | ||
| if (!chunkValid) { | ||
| for (const error of chunkSchema.errors) { | ||
| for (const error of schema.errors) { | ||
| const { id, keys, message } = processError(error); | ||
@@ -48,4 +54,4 @@ if (!value[id]) { | ||
| }; | ||
| const stream = createTransformStream(transform, options); | ||
| stream.result = () => ({ key, value }); | ||
| const stream = createTransformStream(transform, streamOptions); | ||
| stream.result = () => ({ key: resultKey ?? "validate", value }); | ||
| return stream; | ||
@@ -52,0 +58,0 @@ }; |
| { | ||
| "version": 3, | ||
| "sources": ["index.js"], | ||
| "sourcesContent": ["import { createTransformStream } from '@datastream/core'\nimport _ajv from 'ajv/dist/2020.js'\nimport formats from 'ajv-formats'\nimport formatsDraft2019 from 'ajv-formats-draft2019'\nimport uriResolver from 'fast-uri'\n\nconst Ajv = _ajv.default // esm workaround for linting\n\nconst ajvDefaults = {\n strict: true,\n coerceTypes: 'array',\n allErrors: true,\n useDefaults: 'empty',\n uriResolver,\n}\n\nconst jsonSchemaValidateDefaults = {\n idxStart: 0,\n key: 'ajvErrors',\n language: 'en',\n availableLanguages: undefined,\n}\n\nexport const validateStream = (chunkSchema, config, options) => {\n const { idxStart, key /*, language, availableLanguages*/ } = {\n ...jsonSchemaValidateDefaults,\n ...config,\n }\n if (typeof chunkSchema !== 'function') {\n const ajv = new Ajv(ajvDefaults)\n chunkSchema = ajv.compile(chunkSchema)\n }\n\n const value = {} // aka errors\n let idx = idxStart - 1\n const transform = (chunk) => {\n idx += 1\n\n const chunkValid = chunkSchema(chunk)\n console.log({ chunkValid })\n if (!chunkValid) {\n // if (availableLanguages) {\n // availableLanguages[language](chunkSchema.errors)\n // }\n\n for (const error of chunkSchema.errors) {\n const { id, keys, message } = processError(error)\n\n if (!value[id]) {\n value[id] = { id, keys, message, idx: [] }\n }\n value[id].idx.push(idx)\n }\n }\n return chunk // TODO option to not pass chunk on?\n }\n const stream = createTransformStream(transform, options)\n stream.result = () => ({ key, value })\n return stream\n}\n\nconst processError = (error) => {\n const message = error.message || ''\n\n let id = error.schemaPath\n\n let keys = []\n if (error.keyword === 'errorMessage') {\n error.params.errors.forEach((error) => {\n const value = makeKeys(error)\n if (value) keys.push(value)\n })\n keys = [...new Set(keys.sort())]\n } else {\n keys.push(makeKeys(error))\n }\n if (!error.instancePath && keys.length) {\n id += `/${keys.join('|')}`\n }\n return { id, keys, message }\n}\n\nconst makeKeys = (error) => {\n // deps groups columns that are related in anyOf/oneOf.\n /* error.params.deps ?? */\n return (\n error.params.missingProperty ||\n error.params.additionalProperty ||\n error.instancePath.replace('/', '')\n )\n}\n\nexport default validateStream\n"], | ||
| "mappings": "AAAA;AACA;AACA;AACA;AACA;AAEA,MAAM,MAAM,KAAK;AAEjB,MAAM,cAAc;AAAA,EAClB,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,WAAW;AAAA,EACX,aAAa;AAAA,EACb;AACF;AAEA,MAAM,6BAA6B;AAAA,EACjC,UAAU;AAAA,EACV,KAAK;AAAA,EACL,UAAU;AAAA,EACV,oBAAoB;AACtB;AAEO,MAAM,iBAAiB,CAAC,aAAa,QAAQ,YAAY;AAC9D,QAAM,EAAE,UAAU,QAA2C;AAAA,IAC3D,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACA,MAAI,OAAO,gBAAgB,YAAY;AACrC,UAAM,MAAM,IAAI,IAAI,WAAW;AAC/B,kBAAc,IAAI,QAAQ,WAAW;AAAA,EACvC;AAEA,QAAM,QAAQ,CAAC;AACf,MAAI,MAAM,WAAW;AACrB,QAAM,YAAY,CAAC,UAAU;AAC3B,WAAO;AAEP,UAAM,aAAa,YAAY,KAAK;AACpC,YAAQ,IAAI,EAAE,WAAW,CAAC;AAC1B,QAAI,CAAC,YAAY;AAKf,iBAAW,SAAS,YAAY,QAAQ;AACtC,cAAM,EAAE,IAAI,MAAM,YAAY,aAAa,KAAK;AAEhD,YAAI,CAAC,MAAM,KAAK;AACd,gBAAM,MAAM,EAAE,IAAI,MAAM,SAAS,KAAK,CAAC,EAAE;AAAA,QAC3C;AACA,cAAM,IAAI,IAAI,KAAK,GAAG;AAAA,MACxB;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACA,QAAM,SAAS,sBAAsB,WAAW,OAAO;AACvD,SAAO,SAAS,MAAO,GAAE,KAAK,MAAM;AACpC,SAAO;AACT;AAEA,MAAM,eAAe,CAAC,UAAU;AAC9B,QAAM,UAAU,MAAM,WAAW;AAEjC,MAAI,KAAK,MAAM;AAEf,MAAI,OAAO,CAAC;AACZ,MAAI,MAAM,YAAY,gBAAgB;AACpC,UAAM,OAAO,OAAO,QAAQ,CAAC,WAAU;AACrC,YAAM,QAAQ,SAAS,MAAK;AAC5B,UAAI;AAAO,aAAK,KAAK,KAAK;AAAA,IAC5B,CAAC;AACD,WAAO,CAAC,GAAG,IAAI,IAAI,KAAK,KAAK,CAAC,CAAC;AAAA,EACjC,OAAO;AACL,SAAK,KAAK,SAAS,KAAK,CAAC;AAAA,EAC3B;AACA,MAAI,CAAC,MAAM,gBAAgB,KAAK,QAAQ;AACtC,UAAM,IAAI,KAAK,KAAK,GAAG;AAAA,EACzB;AACA,SAAO,EAAE,IAAI,MAAM,QAAQ;AAC7B;AAEA,MAAM,WAAW,CAAC,UAAU;AAG1B,SACE,MAAM,OAAO,mBACb,MAAM,OAAO,sBACb,MAAM,aAAa,QAAQ,KAAK,EAAE;AAEtC;AAEA,IAAO,mBAAQ;", | ||
| "names": [] | ||
| "sourcesContent": ["import { createTransformStream } from '@datastream/core'\nimport _ajv from 'ajv/dist/2020.js'\nimport formats from 'ajv-formats'\nimport formatsDraft2019 from 'ajv-formats-draft2019'\nimport uriResolver from 'fast-uri'\n\nconst Ajv = _ajv.default // esm workaround for linting\n\nconst ajvDefaults = {\n strict: true,\n coerceTypes: 'array',\n allErrors: true,\n useDefaults: 'empty',\n uriResolver\n}\n\nconst jsonSchemaValidateDefaults = {\n idxStart: 0,\n key: 'ajvErrors',\n language: 'en',\n availableLanguages: undefined\n}\n\nexport const validateStream = (validateOptions, streamOptions) => {\n let {\n schema,\n idxStart,\n resultKey /* language, availableLanguages */,\n ...ajvOptions\n } = {\n ...jsonSchemaValidateDefaults,\n ...validateOptions\n }\n if (typeof schema !== 'function') {\n const ajv = new Ajv({ ...ajvDefaults, ...ajvOptions })\n formats(ajv)\n formatsDraft2019(ajv)\n schema = ajv.compile(schema)\n }\n\n const value = {} // aka errors\n let idx = idxStart - 1\n const transform = (chunk) => {\n idx += 1\n\n const chunkValid = schema(chunk)\n //console.log({ chunkValid })\n if (!chunkValid) {\n // if (availableLanguages) {\n // availableLanguages[language](chunkSchema.errors)\n // }\n\n for (const error of schema.errors) {\n const { id, keys, message } = processError(error)\n\n if (!value[id]) {\n value[id] = { id, keys, message, idx: [] }\n }\n value[id].idx.push(idx)\n }\n }\n return chunk // TODO option to not pass chunk on?\n }\n const stream = createTransformStream(transform, streamOptions)\n stream.result = () => ({ key: resultKey ?? 'validate', value })\n return stream\n}\n\nconst processError = (error) => {\n const message = error.message || ''\n\n let id = error.schemaPath\n\n let keys = []\n if (error.keyword === 'errorMessage') {\n error.params.errors.forEach((error) => {\n const value = makeKeys(error)\n if (value) keys.push(value)\n })\n keys = [...new Set(keys.sort())]\n } else {\n keys.push(makeKeys(error))\n }\n if (!error.instancePath && keys.length) {\n id += `/${keys.join('|')}`\n }\n return { id, keys, message }\n}\n\nconst makeKeys = (error) => {\n // deps groups columns that are related in anyOf/oneOf.\n /* error.params.deps ?? */\n return (\n error.params.missingProperty ||\n error.params.additionalProperty ||\n error.instancePath.replace('/', '')\n )\n}\n\nexport default validateStream\n"], | ||
| "mappings": "AAAA,SAAS,6BAA6B;AACtC,OAAO,UAAU;AACjB,OAAO,aAAa;AACpB,OAAO,sBAAsB;AAC7B,OAAO,iBAAiB;AAExB,MAAM,MAAM,KAAK;AAEjB,MAAM,cAAc;AAAA,EAClB,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,WAAW;AAAA,EACX,aAAa;AAAA,EACb;AACF;AAEA,MAAM,6BAA6B;AAAA,EACjC,UAAU;AAAA,EACV,KAAK;AAAA,EACL,UAAU;AAAA,EACV,oBAAoB;AACtB;AAEO,MAAM,iBAAiB,CAAC,iBAAiB,kBAAkB;AAChE,MAAI;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,OACG;AAAA,EACL,IAAI;AAAA,IACF,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACA,MAAI,OAAO,WAAW,YAAY;AAChC,UAAM,MAAM,IAAI,IAAI,EAAE,GAAG,aAAa,GAAG,WAAW,CAAC;AACrD,YAAQ,GAAG;AACX,qBAAiB,GAAG;AACpB,aAAS,IAAI,QAAQ,MAAM;AAAA,EAC7B;AAEA,QAAM,QAAQ,CAAC;AACf,MAAI,MAAM,WAAW;AACrB,QAAM,YAAY,CAAC,UAAU;AAC3B,WAAO;AAEP,UAAM,aAAa,OAAO,KAAK;AAE/B,QAAI,CAAC,YAAY;AAKf,iBAAW,SAAS,OAAO,QAAQ;AACjC,cAAM,EAAE,IAAI,MAAM,QAAQ,IAAI,aAAa,KAAK;AAEhD,YAAI,CAAC,MAAM,KAAK;AACd,gBAAM,MAAM,EAAE,IAAI,MAAM,SAAS,KAAK,CAAC,EAAE;AAAA,QAC3C;AACA,cAAM,IAAI,IAAI,KAAK,GAAG;AAAA,MACxB;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACA,QAAM,SAAS,sBAAsB,WAAW,aAAa;AAC7D,SAAO,SAAS,OAAO,EAAE,KAAK,aAAa,YAAY,MAAM;AAC7D,SAAO;AACT;AAEA,MAAM,eAAe,CAAC,UAAU;AAC9B,QAAM,UAAU,MAAM,WAAW;AAEjC,MAAI,KAAK,MAAM;AAEf,MAAI,OAAO,CAAC;AACZ,MAAI,MAAM,YAAY,gBAAgB;AACpC,UAAM,OAAO,OAAO,QAAQ,CAACA,WAAU;AACrC,YAAM,QAAQ,SAASA,MAAK;AAC5B,UAAI;AAAO,aAAK,KAAK,KAAK;AAAA,IAC5B,CAAC;AACD,WAAO,CAAC,GAAG,IAAI,IAAI,KAAK,KAAK,CAAC,CAAC;AAAA,EACjC,OAAO;AACL,SAAK,KAAK,SAAS,KAAK,CAAC;AAAA,EAC3B;AACA,MAAI,CAAC,MAAM,gBAAgB,KAAK,QAAQ;AACtC,UAAM,IAAI,KAAK,KAAK,GAAG;AAAA,EACzB;AACA,SAAO,EAAE,IAAI,MAAM,QAAQ;AAC7B;AAEA,MAAM,WAAW,CAAC,UAAU;AAG1B,SACE,MAAM,OAAO,mBACb,MAAM,OAAO,sBACb,MAAM,aAAa,QAAQ,KAAK,EAAE;AAEtC;AAEA,IAAO,mBAAQ;", | ||
| "names": ["error"] | ||
| } |
+4
-4
| { | ||
| "name": "@datastream/validate", | ||
| "version": "0.0.3", | ||
| "version": "0.0.4", | ||
| "description": "", | ||
@@ -68,4 +68,4 @@ "type": "module", | ||
| "dependencies": { | ||
| "@datastream/core": "0.0.3", | ||
| "@datastream/validate": "0.0.2", | ||
| "@datastream/core": "0.0.4", | ||
| "@datastream/validate": "0.0.4", | ||
| "ajv": "8.11.0", | ||
@@ -76,3 +76,3 @@ "ajv-formats": "2.1.1", | ||
| }, | ||
| "gitHead": "70834bdf6ea9d690ca90a079371b73a0c7ea4a14" | ||
| "gitHead": "c1774a4040720e50335008861b279b738e2e3ff1" | ||
| } |
23679
5.34%275
8.27%+ Added
- Removed
Updated
Updated