@expo/schemer 1.3.28 → 1.3.32

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/build/Error.js CHANGED
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ErrorCodes = exports.ValidationError = exports.SchemerError = void 0;
3
4
  class SchemerError extends Error {
4
5
  constructor(errors) {
5
6
  super('');
@@ -1 +1 @@
1
- {"version":3,"file":"Error.js","sourceRoot":"","sources":["../src/Error.ts"],"names":[],"mappings":";;AAAA,MAAa,YAAa,SAAQ,KAAK;IAIrC,YAAY,MAAyB;QACnC,KAAK,CAAC,EAAE,CAAC,CAAC;QAJH,SAAI,GAAG,cAAc,CAAC;QAK7B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AATD,oCASC;AAED,MAAa,eAAgB,SAAQ,KAAK;IAOxC,YAAY,EACV,SAAS,EACT,SAAS,EACT,OAAO,EACP,IAAI,EACJ,IAAI,GAOL;QACC,KAAK,CAAC,OAAO,CAAC,CAAC;QAnBR,SAAI,GAAG,iBAAiB,CAAC;QAoBhC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AA3BD,0CA2BC;AAIY,QAAA,UAAU,GAAG;IACxB,uBAAuB,EAAE,yBAAyB;IAClD,0BAA0B,EAAE,4BAA4B;IACxD,gCAAgC,EAAE,kCAAkC;IACpE,sBAAsB,EAAE,wBAAwB;IAEhD,iBAAiB,EAAE,mBAAmB;IACtC,kBAAkB,EAAE,oBAAoB;IACxC,oBAAoB,EAAE,sBAAsB;IAC5C,UAAU,EAAE,YAAY;CACzB,CAAC","sourcesContent":["export class SchemerError extends Error {\n readonly name = 'SchemerError';\n errors: ValidationError[];\n\n constructor(errors: ValidationError[]) {\n super('');\n this.message = errors.map(e => e.message).join('\\n');\n this.errors = errors;\n }\n}\n\nexport class ValidationError extends Error {\n readonly name = 'ValidationError';\n errorCode: string;\n fieldPath: string;\n message: string;\n data: any;\n meta: any;\n constructor({\n errorCode,\n fieldPath,\n message,\n data,\n meta,\n }: {\n errorCode: ErrorCode;\n fieldPath: string;\n message: string;\n data: any;\n meta: any;\n }) {\n super(message);\n this.errorCode = errorCode;\n this.fieldPath = fieldPath;\n this.message = message;\n this.data = data;\n this.meta = meta;\n }\n}\n\nexport type ErrorCode = keyof typeof ErrorCodes;\n\nexport const ErrorCodes = {\n SCHEMA_VALIDATION_ERROR: 'SCHEMA_VALIDATION_ERROR',\n SCHEMA_ADDITIONAL_PROPERTY: 'SCHEMA_ADDITIONAL_PROPERTY',\n SCHEMA_MISSING_REQUIRED_PROPERTY: 'SCHEMA_MISSING_REQUIRED_PROPERTY',\n SCHEMA_INVALID_PATTERN: 'SCHEMA_INVALID_PATTERN',\n\n INVALID_ASSET_URI: 'INVALID_ASSET_URI',\n INVALID_DIMENSIONS: 'INVALID_DIMENSIONS',\n INVALID_CONTENT_TYPE: 'INVALID_CONTENT_TYPE',\n NOT_SQUARE: 'NOT_SQUARE',\n};\n"]}
1
+ {"version":3,"file":"Error.js","sourceRoot":"","sources":["../src/Error.ts"],"names":[],"mappings":";;;AAAA,MAAa,YAAa,SAAQ,KAAK;IAIrC,YAAY,MAAyB;QACnC,KAAK,CAAC,EAAE,CAAC,CAAC;QAJH,SAAI,GAAG,cAAc,CAAC;QAK7B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AATD,oCASC;AAED,MAAa,eAAgB,SAAQ,KAAK;IAOxC,YAAY,EACV,SAAS,EACT,SAAS,EACT,OAAO,EACP,IAAI,EACJ,IAAI,GAOL;QACC,KAAK,CAAC,OAAO,CAAC,CAAC;QAnBR,SAAI,GAAG,iBAAiB,CAAC;QAoBhC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AA3BD,0CA2BC;AAIY,QAAA,UAAU,GAAG;IACxB,uBAAuB,EAAE,yBAAyB;IAClD,0BAA0B,EAAE,4BAA4B;IACxD,gCAAgC,EAAE,kCAAkC;IACpE,sBAAsB,EAAE,wBAAwB;IAEhD,iBAAiB,EAAE,mBAAmB;IACtC,kBAAkB,EAAE,oBAAoB;IACxC,oBAAoB,EAAE,sBAAsB;IAC5C,UAAU,EAAE,YAAY;CACzB,CAAC","sourcesContent":["export class SchemerError extends Error {\n readonly name = 'SchemerError';\n errors: ValidationError[];\n\n constructor(errors: ValidationError[]) {\n super('');\n this.message = errors.map(e => e.message).join('\\n');\n this.errors = errors;\n }\n}\n\nexport class ValidationError extends Error {\n readonly name = 'ValidationError';\n errorCode: string;\n fieldPath: string;\n message: string;\n data: any;\n meta: any;\n constructor({\n errorCode,\n fieldPath,\n message,\n data,\n meta,\n }: {\n errorCode: ErrorCode;\n fieldPath: string;\n message: string;\n data: any;\n meta: any;\n }) {\n super(message);\n this.errorCode = errorCode;\n this.fieldPath = fieldPath;\n this.message = message;\n this.data = data;\n this.meta = meta;\n }\n}\n\nexport type ErrorCode = keyof typeof ErrorCodes;\n\nexport const ErrorCodes = {\n SCHEMA_VALIDATION_ERROR: 'SCHEMA_VALIDATION_ERROR',\n SCHEMA_ADDITIONAL_PROPERTY: 'SCHEMA_ADDITIONAL_PROPERTY',\n SCHEMA_MISSING_REQUIRED_PROPERTY: 'SCHEMA_MISSING_REQUIRED_PROPERTY',\n SCHEMA_INVALID_PATTERN: 'SCHEMA_INVALID_PATTERN',\n\n INVALID_ASSET_URI: 'INVALID_ASSET_URI',\n INVALID_DIMENSIONS: 'INVALID_DIMENSIONS',\n INVALID_CONTENT_TYPE: 'INVALID_CONTENT_TYPE',\n NOT_SQUARE: 'NOT_SQUARE',\n};\n"]}
package/build/Util.js CHANGED
@@ -3,23 +3,27 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.fieldPathToSchema = exports.schemaPointerToFieldPath = exports.fieldPathToSchemaPath = void 0;
6
7
  const fill_1 = __importDefault(require("lodash/fill"));
7
8
  const flatten_1 = __importDefault(require("lodash/flatten"));
8
9
  const get_1 = __importDefault(require("lodash/get"));
9
10
  const zip_1 = __importDefault(require("lodash/zip"));
10
- exports.fieldPathToSchemaPath = (fieldPath) => {
11
+ const fieldPathToSchemaPath = (fieldPath) => {
11
12
  const newPath = zip_1.default(fill_1.default(fieldPath.split('.'), 'properties'), fieldPath.split('.'));
12
13
  return flatten_1.default(newPath).join('.');
13
14
  };
15
+ exports.fieldPathToSchemaPath = fieldPathToSchemaPath;
14
16
  // Assumption: used only for jsonPointer returned from traverse
15
- exports.schemaPointerToFieldPath = (jsonPointer) => {
17
+ const schemaPointerToFieldPath = (jsonPointer) => {
16
18
  return jsonPointer
17
19
  .split('/')
18
20
  .slice(2)
19
21
  .filter(e => e !== 'properties')
20
22
  .join('.');
21
23
  };
22
- exports.fieldPathToSchema = (schema, fieldPath) => {
24
+ exports.schemaPointerToFieldPath = schemaPointerToFieldPath;
25
+ const fieldPathToSchema = (schema, fieldPath) => {
23
26
  return get_1.default(schema, exports.fieldPathToSchemaPath(fieldPath));
24
27
  };
28
+ exports.fieldPathToSchema = fieldPathToSchema;
25
29
  //# sourceMappingURL=Util.js.map
package/build/Util.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"Util.js","sourceRoot":"","sources":["../src/Util.ts"],"names":[],"mappings":";;;;;AAAA,uDAA+B;AAC/B,6DAAqC;AACrC,qDAA6B;AAC7B,qDAA6B;AAEhB,QAAA,qBAAqB,GAAG,CAAC,SAAiB,EAAE,EAAE;IACzD,MAAM,OAAO,GAAG,aAAG,CAAC,cAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,YAAY,CAAC,EAAE,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IACpF,OAAO,iBAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACpC,CAAC,CAAC;AACF,+DAA+D;AAClD,QAAA,wBAAwB,GAAG,CAAC,WAAmB,EAAE,EAAE;IAC9D,OAAO,WAAW;SACf,KAAK,CAAC,GAAG,CAAC;SACV,KAAK,CAAC,CAAC,CAAC;SACR,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,YAAY,CAAC;SAC/B,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC,CAAC;AAEW,QAAA,iBAAiB,GAAG,CAAC,MAAc,EAAE,SAAiB,EAAE,EAAE;IACrE,OAAO,aAAG,CAAC,MAAM,EAAE,6BAAqB,CAAC,SAAS,CAAC,CAAC,CAAC;AACvD,CAAC,CAAC","sourcesContent":["import fill from 'lodash/fill';\nimport flatten from 'lodash/flatten';\nimport get from 'lodash/get';\nimport zip from 'lodash/zip';\n\nexport const fieldPathToSchemaPath = (fieldPath: string) => {\n const newPath = zip(fill(fieldPath.split('.'), 'properties'), fieldPath.split('.'));\n return flatten(newPath).join('.');\n};\n// Assumption: used only for jsonPointer returned from traverse\nexport const schemaPointerToFieldPath = (jsonPointer: string) => {\n return jsonPointer\n .split('/')\n .slice(2)\n .filter(e => e !== 'properties')\n .join('.');\n};\n\nexport const fieldPathToSchema = (schema: object, fieldPath: string) => {\n return get(schema, fieldPathToSchemaPath(fieldPath));\n};\n"]}
1
+ {"version":3,"file":"Util.js","sourceRoot":"","sources":["../src/Util.ts"],"names":[],"mappings":";;;;;;AAAA,uDAA+B;AAC/B,6DAAqC;AACrC,qDAA6B;AAC7B,qDAA6B;AAEtB,MAAM,qBAAqB,GAAG,CAAC,SAAiB,EAAE,EAAE;IACzD,MAAM,OAAO,GAAG,aAAG,CAAC,cAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,YAAY,CAAC,EAAE,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IACpF,OAAO,iBAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACpC,CAAC,CAAC;AAHW,QAAA,qBAAqB,yBAGhC;AACF,+DAA+D;AACxD,MAAM,wBAAwB,GAAG,CAAC,WAAmB,EAAE,EAAE;IAC9D,OAAO,WAAW;SACf,KAAK,CAAC,GAAG,CAAC;SACV,KAAK,CAAC,CAAC,CAAC;SACR,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,YAAY,CAAC;SAC/B,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC,CAAC;AANW,QAAA,wBAAwB,4BAMnC;AAEK,MAAM,iBAAiB,GAAG,CAAC,MAAc,EAAE,SAAiB,EAAE,EAAE;IACrE,OAAO,aAAG,CAAC,MAAM,EAAE,6BAAqB,CAAC,SAAS,CAAC,CAAC,CAAC;AACvD,CAAC,CAAC;AAFW,QAAA,iBAAiB,qBAE5B","sourcesContent":["import fill from 'lodash/fill';\nimport flatten from 'lodash/flatten';\nimport get from 'lodash/get';\nimport zip from 'lodash/zip';\n\nexport const fieldPathToSchemaPath = (fieldPath: string) => {\n const newPath = zip(fill(fieldPath.split('.'), 'properties'), fieldPath.split('.'));\n return flatten(newPath).join('.');\n};\n// Assumption: used only for jsonPointer returned from traverse\nexport const schemaPointerToFieldPath = (jsonPointer: string) => {\n return jsonPointer\n .split('/')\n .slice(2)\n .filter(e => e !== 'properties')\n .join('.');\n};\n\nexport const fieldPathToSchema = (schema: object, fieldPath: string) => {\n return get(schema, fieldPathToSchemaPath(fieldPath));\n};\n"]}
package/build/index.js CHANGED
@@ -3,6 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ErrorCodes = exports.ValidationError = exports.SchemerError = void 0;
6
7
  const ajv_1 = __importDefault(require("ajv"));
7
8
  const fs_1 = __importDefault(require("fs"));
8
9
  const json_schema_traverse_1 = __importDefault(require("json-schema-traverse"));
@@ -13,13 +14,19 @@ const read_chunk_1 = __importDefault(require("read-chunk"));
13
14
  const Error_1 = require("./Error");
14
15
  const Util_1 = require("./Util");
15
16
  var Error_2 = require("./Error");
16
- exports.SchemerError = Error_2.SchemerError;
17
- exports.ValidationError = Error_2.ValidationError;
18
- exports.ErrorCodes = Error_2.ErrorCodes;
17
+ Object.defineProperty(exports, "SchemerError", { enumerable: true, get: function () { return Error_2.SchemerError; } });
18
+ Object.defineProperty(exports, "ValidationError", { enumerable: true, get: function () { return Error_2.ValidationError; } });
19
+ Object.defineProperty(exports, "ErrorCodes", { enumerable: true, get: function () { return Error_2.ErrorCodes; } });
19
20
  class Schemer {
20
21
  // Schema is a JSON Schema object
21
22
  constructor(schema, options = {}) {
22
- this.options = Object.assign({ allErrors: true, verbose: true, format: 'full', metaValidation: true }, options);
23
+ this.options = {
24
+ allErrors: true,
25
+ verbose: true,
26
+ format: 'full',
27
+ metaValidation: true,
28
+ ...options,
29
+ };
23
30
  this.ajv = new ajv_1.default(this.options);
24
31
  this.schema = schema;
25
32
  this.rootDir = this.options.rootDir || __dirname;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import Ajv from 'ajv';\nimport fs from 'fs';\nimport traverse from 'json-schema-traverse';\nimport get from 'lodash/get';\nimport path from 'path';\nimport imageProbe from 'probe-image-size';\nimport readChunk from 'read-chunk';\n\nimport { SchemerError, ValidationError } from './Error';\nimport { fieldPathToSchema, schemaPointerToFieldPath } from './Util';\n\ntype Options = {\n allErrors?: boolean;\n rootDir?: string;\n verbose?: boolean;\n format?: 'full' | 'empty'; //figure out later\n metaValidation?: boolean;\n};\n\ntype Meta = {\n asset?: boolean;\n dimensions?: {\n width: number;\n height: number;\n };\n square?: boolean;\n contentTypePattern?: string;\n contentTypeHuman?: string;\n};\n\ntype AssetField = { fieldPath: string; data: string; meta: Meta };\n\nexport { SchemerError, ValidationError, ErrorCodes, ErrorCode } from './Error';\nexport default class Schemer {\n options: Options;\n ajv: Ajv.Ajv;\n schema: object;\n rootDir: string;\n manualValidationErrors: ValidationError[];\n // Schema is a JSON Schema object\n constructor(schema: object, options: Options = {}) {\n this.options = {\n allErrors: true,\n verbose: true,\n format: 'full',\n metaValidation: true,\n ...options,\n };\n\n this.ajv = new Ajv(this.options);\n this.schema = schema;\n this.rootDir = this.options.rootDir || __dirname;\n this.manualValidationErrors = [];\n }\n\n _formatAjvErrorMessage({\n keyword,\n dataPath,\n params,\n parentSchema,\n data,\n message,\n }: Ajv.ErrorObject) {\n const meta = parentSchema && (parentSchema as any).meta;\n // This removes the \".\" in front of a fieldPath\n dataPath = dataPath.slice(1);\n switch (keyword) {\n case 'additionalProperties': {\n return new ValidationError({\n errorCode: 'SCHEMA_ADDITIONAL_PROPERTY',\n fieldPath: dataPath,\n message: `should NOT have additional property '${(params as any).additionalProperty}'`,\n data,\n meta,\n });\n }\n case 'required':\n return new ValidationError({\n errorCode: 'SCHEMA_MISSING_REQUIRED_PROPERTY',\n fieldPath: dataPath,\n message: `is missing required property '${(params as any).missingProperty}'`,\n data,\n meta,\n });\n case 'pattern': {\n //@TODO Parse the message in a less hacky way. Perhaps for regex validation errors, embed the error message under the meta tag?\n const regexHuman = meta?.regexHuman;\n const regexErrorMessage = regexHuman\n ? `'${dataPath}' should be a ${regexHuman[0].toLowerCase() + regexHuman.slice(1)}`\n : `'${dataPath}' ${message}`;\n return new ValidationError({\n errorCode: 'SCHEMA_INVALID_PATTERN',\n fieldPath: dataPath,\n message: regexErrorMessage,\n data,\n meta,\n });\n }\n default:\n return new ValidationError({\n errorCode: 'SCHEMA_VALIDATION_ERROR',\n fieldPath: dataPath,\n message: message || 'Validation error',\n data,\n meta,\n });\n }\n }\n\n getErrors(): ValidationError[] {\n // Convert AJV JSONSchema errors to our ValidationErrors\n let valErrors: ValidationError[] = [];\n if (this.ajv.errors) {\n valErrors = this.ajv.errors.map(e => this._formatAjvErrorMessage(e));\n }\n return [...valErrors, ...this.manualValidationErrors];\n }\n\n _throwOnErrors() {\n // Clean error state after each validation\n const errors = this.getErrors();\n if (errors.length > 0) {\n this.manualValidationErrors = [];\n this.ajv.errors = [];\n throw new SchemerError(errors);\n }\n }\n\n async validateAll(data: any) {\n await this._validateSchemaAsync(data);\n await this._validateAssetsAsync(data);\n this._throwOnErrors();\n }\n\n async validateAssetsAsync(data: any) {\n await this._validateAssetsAsync(data);\n this._throwOnErrors();\n }\n\n async validateSchemaAsync(data: any) {\n await this._validateSchemaAsync(data);\n this._throwOnErrors();\n }\n\n _validateSchemaAsync(data: any) {\n this.ajv.validate(this.schema, data);\n }\n\n async _validateAssetsAsync(data: any) {\n const assets: AssetField[] = [];\n traverse(this.schema, { allKeys: true }, (subSchema, jsonPointer, a, b, c, d, property) => {\n if (property && subSchema.meta && subSchema.meta.asset) {\n const fieldPath = schemaPointerToFieldPath(jsonPointer);\n assets.push({\n fieldPath,\n data: get(data, fieldPath),\n meta: subSchema.meta,\n });\n }\n });\n await Promise.all(assets.map(this._validateAssetAsync.bind(this)));\n }\n\n async _validateImageAsync({ fieldPath, data, meta }: AssetField) {\n if (meta && meta.asset && data) {\n const { dimensions, square, contentTypePattern }: Meta = meta;\n // filePath could be an URL\n const filePath = path.resolve(this.rootDir, data);\n try {\n // NOTE(nikki): The '4100' below should be enough for most file types, though we\n // could probably go shorter....\n // http://www.garykessler.net/library/file_sigs.html\n // The metadata content for .jpgs might be located a lot farther down the file, so this\n // may pose problems in the future.\n // This cases on whether filePath is a remote URL or located on the machine\n const probeResult = fs.existsSync(filePath)\n ? imageProbe.sync(await readChunk(filePath, 0, 4100))\n : await imageProbe(data, { useElectronNet: false });\n if (!probeResult) {\n return;\n }\n\n const { width, height, type, mime } = probeResult;\n\n if (contentTypePattern && !mime.match(new RegExp(contentTypePattern))) {\n this.manualValidationErrors.push(\n new ValidationError({\n errorCode: 'INVALID_CONTENT_TYPE',\n fieldPath,\n message: `field '${fieldPath}' should point to ${meta.contentTypeHuman} but the file at '${data}' has type ${type}`,\n data,\n meta,\n })\n );\n }\n\n if (dimensions && (dimensions.height !== height || dimensions.width !== width)) {\n this.manualValidationErrors.push(\n new ValidationError({\n errorCode: 'INVALID_DIMENSIONS',\n fieldPath,\n message: `'${fieldPath}' should have dimensions ${dimensions.width}x${dimensions.height}, but the file at '${data}' has dimensions ${width}x${height}`,\n data,\n meta,\n })\n );\n }\n\n if (square && width !== height) {\n this.manualValidationErrors.push(\n new ValidationError({\n errorCode: 'NOT_SQUARE',\n fieldPath,\n message: `image should be square, but the file at '${data}' has dimensions ${width}x${height}`,\n data,\n meta,\n })\n );\n }\n } catch (e) {\n this.manualValidationErrors.push(\n new ValidationError({\n errorCode: 'INVALID_ASSET_URI',\n fieldPath,\n message: `cannot access file at '${data}'`,\n data,\n meta,\n })\n );\n }\n }\n }\n\n async _validateAssetAsync({ fieldPath, data, meta }: AssetField) {\n if (meta && meta.asset && data) {\n if (meta.contentTypePattern && meta.contentTypePattern.startsWith('^image')) {\n await this._validateImageAsync({ fieldPath, data, meta });\n }\n }\n }\n\n async validateProperty(fieldPath: string, data: any) {\n const subSchema = fieldPathToSchema(this.schema, fieldPath);\n this.ajv.validate(subSchema, data);\n\n if (subSchema.meta && subSchema.meta.asset) {\n await this._validateAssetAsync({ fieldPath, data, meta: subSchema.meta });\n }\n this._throwOnErrors();\n }\n\n validateName(name: string) {\n return this.validateProperty('name', name);\n }\n\n validateSlug(slug: string) {\n return this.validateProperty('slug', slug);\n }\n\n validateSdkVersion(version: string) {\n return this.validateProperty('sdkVersion', version);\n }\n\n validateIcon(iconPath: string) {\n return this.validateProperty('icon', iconPath);\n }\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import Ajv from 'ajv';\nimport fs from 'fs';\nimport traverse from 'json-schema-traverse';\nimport get from 'lodash/get';\nimport path from 'path';\nimport imageProbe from 'probe-image-size';\nimport readChunk from 'read-chunk';\n\nimport { SchemerError, ValidationError } from './Error';\nimport { fieldPathToSchema, schemaPointerToFieldPath } from './Util';\n\ntype Options = {\n allErrors?: boolean;\n rootDir?: string;\n verbose?: boolean;\n format?: 'full' | 'empty'; //figure out later\n metaValidation?: boolean;\n};\n\ntype Meta = {\n asset?: boolean;\n dimensions?: {\n width: number;\n height: number;\n };\n square?: boolean;\n contentTypePattern?: string;\n contentTypeHuman?: string;\n};\n\ntype AssetField = { fieldPath: string; data: string; meta: Meta };\n\nexport { SchemerError, ValidationError, ErrorCodes, ErrorCode } from './Error';\nexport default class Schemer {\n options: Options;\n ajv: Ajv.Ajv;\n schema: object;\n rootDir: string;\n manualValidationErrors: ValidationError[];\n // Schema is a JSON Schema object\n constructor(schema: object, options: Options = {}) {\n this.options = {\n allErrors: true,\n verbose: true,\n format: 'full',\n metaValidation: true,\n ...options,\n };\n\n this.ajv = new Ajv(this.options);\n this.schema = schema;\n this.rootDir = this.options.rootDir || __dirname;\n this.manualValidationErrors = [];\n }\n\n _formatAjvErrorMessage({\n keyword,\n dataPath,\n params,\n parentSchema,\n data,\n message,\n }: Ajv.ErrorObject) {\n const meta = parentSchema && (parentSchema as any).meta;\n // This removes the \".\" in front of a fieldPath\n dataPath = dataPath.slice(1);\n switch (keyword) {\n case 'additionalProperties': {\n return new ValidationError({\n errorCode: 'SCHEMA_ADDITIONAL_PROPERTY',\n fieldPath: dataPath,\n message: `should NOT have additional property '${(params as any).additionalProperty}'`,\n data,\n meta,\n });\n }\n case 'required':\n return new ValidationError({\n errorCode: 'SCHEMA_MISSING_REQUIRED_PROPERTY',\n fieldPath: dataPath,\n message: `is missing required property '${(params as any).missingProperty}'`,\n data,\n meta,\n });\n case 'pattern': {\n //@TODO Parse the message in a less hacky way. Perhaps for regex validation errors, embed the error message under the meta tag?\n const regexHuman = meta?.regexHuman;\n const regexErrorMessage = regexHuman\n ? `'${dataPath}' should be a ${regexHuman[0].toLowerCase() + regexHuman.slice(1)}`\n : `'${dataPath}' ${message}`;\n return new ValidationError({\n errorCode: 'SCHEMA_INVALID_PATTERN',\n fieldPath: dataPath,\n message: regexErrorMessage,\n data,\n meta,\n });\n }\n default:\n return new ValidationError({\n errorCode: 'SCHEMA_VALIDATION_ERROR',\n fieldPath: dataPath,\n message: message || 'Validation error',\n data,\n meta,\n });\n }\n }\n\n getErrors(): ValidationError[] {\n // Convert AJV JSONSchema errors to our ValidationErrors\n let valErrors: ValidationError[] = [];\n if (this.ajv.errors) {\n valErrors = this.ajv.errors.map(e => this._formatAjvErrorMessage(e));\n }\n return [...valErrors, ...this.manualValidationErrors];\n }\n\n _throwOnErrors() {\n // Clean error state after each validation\n const errors = this.getErrors();\n if (errors.length > 0) {\n this.manualValidationErrors = [];\n this.ajv.errors = [];\n throw new SchemerError(errors);\n }\n }\n\n async validateAll(data: any) {\n await this._validateSchemaAsync(data);\n await this._validateAssetsAsync(data);\n this._throwOnErrors();\n }\n\n async validateAssetsAsync(data: any) {\n await this._validateAssetsAsync(data);\n this._throwOnErrors();\n }\n\n async validateSchemaAsync(data: any) {\n await this._validateSchemaAsync(data);\n this._throwOnErrors();\n }\n\n _validateSchemaAsync(data: any) {\n this.ajv.validate(this.schema, data);\n }\n\n async _validateAssetsAsync(data: any) {\n const assets: AssetField[] = [];\n traverse(this.schema, { allKeys: true }, (subSchema, jsonPointer, a, b, c, d, property) => {\n if (property && subSchema.meta && subSchema.meta.asset) {\n const fieldPath = schemaPointerToFieldPath(jsonPointer);\n assets.push({\n fieldPath,\n data: get(data, fieldPath),\n meta: subSchema.meta,\n });\n }\n });\n await Promise.all(assets.map(this._validateAssetAsync.bind(this)));\n }\n\n async _validateImageAsync({ fieldPath, data, meta }: AssetField) {\n if (meta && meta.asset && data) {\n const { dimensions, square, contentTypePattern }: Meta = meta;\n // filePath could be an URL\n const filePath = path.resolve(this.rootDir, data);\n try {\n // NOTE(nikki): The '4100' below should be enough for most file types, though we\n // could probably go shorter....\n // http://www.garykessler.net/library/file_sigs.html\n // The metadata content for .jpgs might be located a lot farther down the file, so this\n // may pose problems in the future.\n // This cases on whether filePath is a remote URL or located on the machine\n const probeResult = fs.existsSync(filePath)\n ? imageProbe.sync(await readChunk(filePath, 0, 4100))\n : await imageProbe(data, { useElectronNet: false });\n if (!probeResult) {\n return;\n }\n\n const { width, height, type, mime } = probeResult;\n\n if (contentTypePattern && !mime.match(new RegExp(contentTypePattern))) {\n this.manualValidationErrors.push(\n new ValidationError({\n errorCode: 'INVALID_CONTENT_TYPE',\n fieldPath,\n message: `field '${fieldPath}' should point to ${meta.contentTypeHuman} but the file at '${data}' has type ${type}`,\n data,\n meta,\n })\n );\n }\n\n if (dimensions && (dimensions.height !== height || dimensions.width !== width)) {\n this.manualValidationErrors.push(\n new ValidationError({\n errorCode: 'INVALID_DIMENSIONS',\n fieldPath,\n message: `'${fieldPath}' should have dimensions ${dimensions.width}x${dimensions.height}, but the file at '${data}' has dimensions ${width}x${height}`,\n data,\n meta,\n })\n );\n }\n\n if (square && width !== height) {\n this.manualValidationErrors.push(\n new ValidationError({\n errorCode: 'NOT_SQUARE',\n fieldPath,\n message: `image should be square, but the file at '${data}' has dimensions ${width}x${height}`,\n data,\n meta,\n })\n );\n }\n } catch (e) {\n this.manualValidationErrors.push(\n new ValidationError({\n errorCode: 'INVALID_ASSET_URI',\n fieldPath,\n message: `cannot access file at '${data}'`,\n data,\n meta,\n })\n );\n }\n }\n }\n\n async _validateAssetAsync({ fieldPath, data, meta }: AssetField) {\n if (meta && meta.asset && data) {\n if (meta.contentTypePattern && meta.contentTypePattern.startsWith('^image')) {\n await this._validateImageAsync({ fieldPath, data, meta });\n }\n }\n }\n\n async validateProperty(fieldPath: string, data: any) {\n const subSchema = fieldPathToSchema(this.schema, fieldPath);\n this.ajv.validate(subSchema, data);\n\n if (subSchema.meta && subSchema.meta.asset) {\n await this._validateAssetAsync({ fieldPath, data, meta: subSchema.meta });\n }\n this._throwOnErrors();\n }\n\n validateName(name: string) {\n return this.validateProperty('name', name);\n }\n\n validateSlug(slug: string) {\n return this.validateProperty('slug', slug);\n }\n\n validateSdkVersion(version: string) {\n return this.validateProperty('sdkVersion', version);\n }\n\n validateIcon(iconPath: string) {\n return this.validateProperty('icon', iconPath);\n }\n}\n"]}
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@expo/schemer",
3
- "version": "1.3.28",
3
+ "version": "1.3.32",
4
4
  "description": "Centralized scheme validation library for Expo",
5
5
  "main": "./build/index.js",
6
6
  "scripts": {
7
7
  "test": "jest --testPathIgnorePatterns network",
8
8
  "test-integration": "jest",
9
- "watch": "tsc --watch",
9
+ "watch": "tsc --watch --preserveWatchOutput",
10
10
  "build": "tsc",
11
11
  "prepare": "yarn build"
12
12
  },
@@ -19,12 +19,12 @@
19
19
  "bugs": {
20
20
  "url": "https://github.com/expo/expo-cli/issues"
21
21
  },
22
- "homepage": "https://github.com/expo/expo-cli/tree/master/packages/schemer#readme",
22
+ "homepage": "https://github.com/expo/expo-cli/tree/main/packages/schemer#readme",
23
23
  "files": [
24
24
  "build"
25
25
  ],
26
26
  "devDependencies": {
27
- "@expo/babel-preset-cli": "0.2.20"
27
+ "@types/lodash": "^4.14.176"
28
28
  },
29
29
  "dependencies": {
30
30
  "ajv": "^5.2.2",