@expo/schemer 1.4.5 → 1.5.0

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 CHANGED
@@ -5,14 +5,6 @@
5
5
 
6
6
  <p align="center">A Schema validation library for Expo.</p>
7
7
 
8
- <p align="center">
9
- <img src="https://flat.badgen.net/packagephobia/install/@expo/schemer">
10
-
11
- <a href="https://www.npmjs.com/package/@expo/schemer">
12
- <img src="https://flat.badgen.net/npm/dw/@expo/schemer" target="_blank" />
13
- </a>
14
- </p>
15
-
16
8
  <!-- Body -->
17
9
 
18
10
  Details can be found here:
@@ -23,12 +15,13 @@ Details can be found here:
23
15
  ### Usage with XDL
24
16
 
25
17
  ```javascript
26
- import { ExpSchema } from '@expo/xdl';
27
18
  import { getConfig } from '@expo/config';
28
19
  import Schemer from '@expo/schemer';
20
+
29
21
  const { exp } = getConfig(projectRoot);
30
22
  const schema = await getSchemaAsync(exp.sdkVersion);
31
- const validator = new Schemer(schema);
23
+ const validator = new Schemer(require('schema.json'));
24
+
32
25
  validator.validateName('Wilson Zhao');
33
26
  validator.validateAssets(exp);
34
27
  ```
package/build/Error.d.ts CHANGED
@@ -7,7 +7,6 @@ export declare class ValidationError extends Error {
7
7
  readonly name = "ValidationError";
8
8
  errorCode: string;
9
9
  fieldPath: string;
10
- message: string;
11
10
  data: any;
12
11
  meta: any;
13
12
  constructor({ errorCode, fieldPath, message, data, meta, }: {
@@ -18,7 +17,7 @@ export declare class ValidationError extends Error {
18
17
  meta: any;
19
18
  });
20
19
  }
21
- export declare type ErrorCode = keyof typeof ErrorCodes;
20
+ export type ErrorCode = keyof typeof ErrorCodes;
22
21
  export declare const ErrorCodes: {
23
22
  SCHEMA_VALIDATION_ERROR: string;
24
23
  SCHEMA_ADDITIONAL_PROPERTY: string;
@@ -29,4 +28,5 @@ export declare const ErrorCodes: {
29
28
  INVALID_DIMENSIONS: string;
30
29
  INVALID_CONTENT_TYPE: string;
31
30
  NOT_SQUARE: string;
31
+ FILE_EXTENSION_MISMATCH: string;
32
32
  };
package/build/Error.js CHANGED
@@ -2,21 +2,25 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ErrorCodes = exports.ValidationError = exports.SchemerError = void 0;
4
4
  class SchemerError extends Error {
5
+ name = 'SchemerError';
6
+ errors;
5
7
  constructor(errors) {
6
8
  super('');
7
- this.name = 'SchemerError';
8
- this.message = errors.map(e => e.message).join('\n');
9
+ this.message = errors.map((error) => error.message).join('\n');
9
10
  this.errors = errors;
10
11
  }
11
12
  }
12
13
  exports.SchemerError = SchemerError;
13
14
  class ValidationError extends Error {
15
+ name = 'ValidationError';
16
+ errorCode;
17
+ fieldPath;
18
+ data;
19
+ meta;
14
20
  constructor({ errorCode, fieldPath, message, data, meta, }) {
15
21
  super(message);
16
- this.name = 'ValidationError';
17
22
  this.errorCode = errorCode;
18
23
  this.fieldPath = fieldPath;
19
- this.message = message;
20
24
  this.data = data;
21
25
  this.meta = meta;
22
26
  }
@@ -32,5 +36,6 @@ exports.ErrorCodes = {
32
36
  INVALID_DIMENSIONS: 'INVALID_DIMENSIONS',
33
37
  INVALID_CONTENT_TYPE: 'INVALID_CONTENT_TYPE',
34
38
  NOT_SQUARE: 'NOT_SQUARE',
39
+ FILE_EXTENSION_MISMATCH: 'FILE_EXTENSION_MISMATCH',
35
40
  };
36
41
  //# sourceMappingURL=Error.js.map
@@ -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;IAChD,kBAAkB,EAAE,oBAAoB;IAExC,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 SCHEMA_INVALID_NOT: 'SCHEMA_INVALID_NOT',\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;IAC5B,IAAI,GAAG,cAAc,CAAC;IAC/B,MAAM,CAAoB;IAE1B,YAAY,MAAyB;QACnC,KAAK,CAAC,EAAE,CAAC,CAAC;QACV,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/D,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AATD,oCASC;AAED,MAAa,eAAgB,SAAQ,KAAK;IAC/B,IAAI,GAAG,iBAAiB,CAAC;IAClC,SAAS,CAAS;IAClB,SAAS,CAAS;IAClB,IAAI,CAAM;IACV,IAAI,CAAM;IACV,YAAY,EACV,SAAS,EACT,SAAS,EACT,OAAO,EACP,IAAI,EACJ,IAAI,GAOL;QACC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAzBD,0CAyBC;AAIY,QAAA,UAAU,GAAG;IACxB,uBAAuB,EAAE,yBAAyB;IAClD,0BAA0B,EAAE,4BAA4B;IACxD,gCAAgC,EAAE,kCAAkC;IACpE,sBAAsB,EAAE,wBAAwB;IAChD,kBAAkB,EAAE,oBAAoB;IAExC,iBAAiB,EAAE,mBAAmB;IACtC,kBAAkB,EAAE,oBAAoB;IACxC,oBAAoB,EAAE,sBAAsB;IAC5C,UAAU,EAAE,YAAY;IACxB,uBAAuB,EAAE,yBAAyB;CACnD,CAAC"}
package/build/Util.d.ts CHANGED
@@ -1,3 +1,5 @@
1
1
  export declare const fieldPathToSchemaPath: (fieldPath: string) => string;
2
2
  export declare const schemaPointerToFieldPath: (jsonPointer: string) => string;
3
3
  export declare const fieldPathToSchema: (schema: object, fieldPath: string) => any;
4
+ export declare function pathToSegments(path: string | string[]): string[];
5
+ export declare function get(object: any, path: string | string[]): any;
package/build/Util.js CHANGED
@@ -1,13 +1,10 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.fieldPathToSchema = exports.schemaPointerToFieldPath = exports.fieldPathToSchemaPath = void 0;
7
- const get_1 = __importDefault(require("lodash/get"));
8
- const zip_1 = __importDefault(require("lodash/zip"));
3
+ exports.get = exports.pathToSegments = exports.fieldPathToSchema = exports.schemaPointerToFieldPath = exports.fieldPathToSchemaPath = void 0;
9
4
  const fieldPathToSchemaPath = (fieldPath) => {
10
- return (0, zip_1.default)(fieldPath.split('.').fill('properties'), fieldPath.split('.')).flat().join('.');
5
+ return pathToSegments(fieldPath)
6
+ .map((segment) => `properties.${segment}`)
7
+ .join('.');
11
8
  };
12
9
  exports.fieldPathToSchemaPath = fieldPathToSchemaPath;
13
10
  // Assumption: used only for jsonPointer returned from traverse
@@ -15,12 +12,26 @@ const schemaPointerToFieldPath = (jsonPointer) => {
15
12
  return jsonPointer
16
13
  .split('/')
17
14
  .slice(2)
18
- .filter(e => e !== 'properties')
15
+ .filter((error) => error !== 'properties')
19
16
  .join('.');
20
17
  };
21
18
  exports.schemaPointerToFieldPath = schemaPointerToFieldPath;
22
19
  const fieldPathToSchema = (schema, fieldPath) => {
23
- return (0, get_1.default)(schema, (0, exports.fieldPathToSchemaPath)(fieldPath));
20
+ return get(schema, (0, exports.fieldPathToSchemaPath)(fieldPath));
24
21
  };
25
22
  exports.fieldPathToSchema = fieldPathToSchema;
23
+ function pathToSegments(path) {
24
+ return Array.isArray(path) ? path : path.split('.');
25
+ }
26
+ exports.pathToSegments = pathToSegments;
27
+ function get(object, path) {
28
+ const segments = pathToSegments(path);
29
+ const length = segments.length;
30
+ let index = 0;
31
+ while (object != null && index < length) {
32
+ object = object[segments[index++]];
33
+ }
34
+ return index && index === length ? object : undefined;
35
+ }
36
+ exports.get = get;
26
37
  //# 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,qDAA6B;AAC7B,qDAA6B;AAEtB,MAAM,qBAAqB,GAAG,CAAC,SAAiB,EAAE,EAAE;IACzD,OAAO,IAAA,aAAG,EAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC7F,CAAC,CAAC;AAFW,QAAA,qBAAqB,yBAEhC;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,IAAA,aAAG,EAAC,MAAM,EAAE,IAAA,6BAAqB,EAAC,SAAS,CAAC,CAAC,CAAC;AACvD,CAAC,CAAC;AAFW,QAAA,iBAAiB,qBAE5B","sourcesContent":["import get from 'lodash/get';\nimport zip from 'lodash/zip';\n\nexport const fieldPathToSchemaPath = (fieldPath: string) => {\n return zip(fieldPath.split('.').fill('properties'), fieldPath.split('.')).flat().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":";;;AAAO,MAAM,qBAAqB,GAAG,CAAC,SAAiB,EAAE,EAAE;IACzD,OAAO,cAAc,CAAC,SAAS,CAAC;SAC7B,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,cAAc,OAAO,EAAE,CAAC;SACzC,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC,CAAC;AAJW,QAAA,qBAAqB,yBAIhC;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,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,YAAY,CAAC;SACzC,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC,CAAC;AANW,QAAA,wBAAwB,4BAMnC;AAEK,MAAM,iBAAiB,GAAG,CAAC,MAAc,EAAE,SAAiB,EAAE,EAAE;IACrE,OAAO,GAAG,CAAC,MAAM,EAAE,IAAA,6BAAqB,EAAC,SAAS,CAAC,CAAC,CAAC;AACvD,CAAC,CAAC;AAFW,QAAA,iBAAiB,qBAE5B;AAEF,SAAgB,cAAc,CAAC,IAAuB;IACpD,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACtD,CAAC;AAFD,wCAEC;AAED,SAAgB,GAAG,CAAC,MAAW,EAAE,IAAuB;IACtD,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;IAC/B,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,OAAO,MAAM,IAAI,IAAI,IAAI,KAAK,GAAG,MAAM,EAAE;QACvC,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;KACpC;IAED,OAAO,KAAK,IAAI,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AACxD,CAAC;AAVD,kBAUC"}
package/build/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import Ajv, { ErrorObject, Options } from 'ajv';
2
2
  import { ValidationError } from './Error';
3
- declare type Meta = {
3
+ type Meta = {
4
4
  asset?: boolean;
5
5
  dimensions?: {
6
6
  width: number;
@@ -10,10 +10,10 @@ declare type Meta = {
10
10
  contentTypePattern?: string;
11
11
  contentTypeHuman?: string;
12
12
  };
13
- declare type SchemerOptions = Options & {
13
+ type SchemerOptions = Options & {
14
14
  rootDir?: string;
15
15
  };
16
- declare type AssetField = {
16
+ type AssetField = {
17
17
  fieldPath: string;
18
18
  data: string;
19
19
  meta: Meta;
package/build/index.js CHANGED
@@ -8,10 +8,8 @@ const ajv_1 = __importDefault(require("ajv"));
8
8
  const ajv_formats_1 = __importDefault(require("ajv-formats"));
9
9
  const fs_1 = __importDefault(require("fs"));
10
10
  const json_schema_traverse_1 = __importDefault(require("json-schema-traverse"));
11
- const get_1 = __importDefault(require("lodash/get"));
12
11
  const path_1 = __importDefault(require("path"));
13
12
  const probe_image_size_1 = __importDefault(require("probe-image-size"));
14
- const read_chunk_1 = __importDefault(require("read-chunk"));
15
13
  const Error_1 = require("./Error");
16
14
  const Util_1 = require("./Util");
17
15
  function lowerFirst(str) {
@@ -22,6 +20,11 @@ Object.defineProperty(exports, "SchemerError", { enumerable: true, get: function
22
20
  Object.defineProperty(exports, "ValidationError", { enumerable: true, get: function () { return Error_2.ValidationError; } });
23
21
  Object.defineProperty(exports, "ErrorCodes", { enumerable: true, get: function () { return Error_2.ErrorCodes; } });
24
22
  class Schemer {
23
+ options;
24
+ ajv;
25
+ schema;
26
+ rootDir;
27
+ manualValidationErrors;
25
28
  // Schema is a JSON Schema object
26
29
  constructor(schema, options = {}) {
27
30
  this.options = {
@@ -62,7 +65,7 @@ class Schemer {
62
65
  });
63
66
  case 'pattern': {
64
67
  //@TODO Parse the message in a less hacky way. Perhaps for regex validation errors, embed the error message under the meta tag?
65
- const regexHuman = meta === null || meta === void 0 ? void 0 : meta.regexHuman;
68
+ const regexHuman = meta?.regexHuman;
66
69
  const regexErrorMessage = regexHuman
67
70
  ? `'${instancePath}' should be a ${regexHuman[0].toLowerCase() + regexHuman.slice(1)}`
68
71
  : `'${instancePath}' ${message}`;
@@ -75,7 +78,7 @@ class Schemer {
75
78
  });
76
79
  }
77
80
  case 'not': {
78
- const notHuman = meta === null || meta === void 0 ? void 0 : meta.notHuman;
81
+ const notHuman = meta?.notHuman;
79
82
  const notHumanErrorMessage = notHuman
80
83
  ? `'${instancePath}' should be ${notHuman[0].toLowerCase() + notHuman.slice(1)}`
81
84
  : `'${instancePath}' ${message}`;
@@ -101,7 +104,7 @@ class Schemer {
101
104
  // Convert AJV JSONSchema errors to our ValidationErrors
102
105
  let valErrors = [];
103
106
  if (this.ajv.errors) {
104
- valErrors = this.ajv.errors.map(e => this._formatAjvErrorMessage(e));
107
+ valErrors = this.ajv.errors.map((error) => this._formatAjvErrorMessage(error));
105
108
  }
106
109
  return [...valErrors, ...this.manualValidationErrors];
107
110
  }
@@ -137,7 +140,7 @@ class Schemer {
137
140
  const fieldPath = (0, Util_1.schemaPointerToFieldPath)(jsonPointer);
138
141
  assets.push({
139
142
  fieldPath,
140
- data: (0, get_1.default)(data, lowerFirst(fieldPath)) || (0, get_1.default)(data, fieldPath),
143
+ data: (0, Util_1.get)(data, lowerFirst(fieldPath)) || (0, Util_1.get)(data, fieldPath),
141
144
  meta: subSchema.meta,
142
145
  });
143
146
  }
@@ -150,19 +153,25 @@ class Schemer {
150
153
  // filePath could be an URL
151
154
  const filePath = path_1.default.resolve(this.rootDir, data);
152
155
  try {
153
- // NOTE(nikki): The '4100' below should be enough for most file types, though we
154
- // could probably go shorter....
155
- // http://www.garykessler.net/library/file_sigs.html
156
- // The metadata content for .jpgs might be located a lot farther down the file, so this
157
- // may pose problems in the future.
158
156
  // This cases on whether filePath is a remote URL or located on the machine
159
- const probeResult = fs_1.default.existsSync(filePath)
160
- ? probe_image_size_1.default.sync(await (0, read_chunk_1.default)(filePath, 0, 4100))
161
- : await (0, probe_image_size_1.default)(data, { useElectronNet: false });
157
+ const isLocalFile = fs_1.default.existsSync(filePath);
158
+ const probeResult = isLocalFile
159
+ ? await (0, probe_image_size_1.default)(require('fs').createReadStream(filePath))
160
+ : await (0, probe_image_size_1.default)(data);
162
161
  if (!probeResult) {
163
162
  return;
164
163
  }
165
164
  const { width, height, type, mime } = probeResult;
165
+ const fileExtension = filePath.split('.').pop();
166
+ if (isLocalFile && mime !== `image/${fileExtension}`) {
167
+ this.manualValidationErrors.push(new Error_1.ValidationError({
168
+ errorCode: 'FILE_EXTENSION_MISMATCH',
169
+ fieldPath,
170
+ message: `the file extension should match the content, but the file extension is .${fileExtension} while the file content at '${data}' is of type ${type}`,
171
+ data,
172
+ meta,
173
+ }));
174
+ }
166
175
  if (contentTypePattern && !mime.match(new RegExp(contentTypePattern))) {
167
176
  this.manualValidationErrors.push(new Error_1.ValidationError({
168
177
  errorCode: 'INVALID_CONTENT_TYPE',
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import Ajv, { ErrorObject, Options } from 'ajv';\nimport addFormats from 'ajv-formats';\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\nfunction lowerFirst(str: string): string {\n return str.charAt(0).toLowerCase() + str.slice(1);\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 SchemerOptions = Options & {\n rootDir?: 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: SchemerOptions;\n ajv: Ajv;\n schema: object;\n rootDir: string;\n manualValidationErrors: ValidationError[];\n // Schema is a JSON Schema object\n constructor(schema: object, options: SchemerOptions = {}) {\n this.options = {\n allErrors: true,\n verbose: true,\n meta: true,\n strict: false,\n unicodeRegExp: false,\n ...options,\n };\n\n this.ajv = new Ajv(this.options);\n addFormats(this.ajv, { mode: 'full' });\n this.schema = schema;\n this.rootDir = this.options.rootDir || __dirname;\n this.manualValidationErrors = [];\n }\n\n _formatAjvErrorMessage({\n keyword,\n instancePath,\n params,\n parentSchema,\n data,\n message,\n }: ErrorObject) {\n const meta = parentSchema && (parentSchema as any).meta;\n // This removes the \".\" in front of a fieldPath\n instancePath = instancePath.slice(1);\n switch (keyword) {\n case 'additionalProperties': {\n return new ValidationError({\n errorCode: 'SCHEMA_ADDITIONAL_PROPERTY',\n fieldPath: instancePath,\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: instancePath,\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 ? `'${instancePath}' should be a ${regexHuman[0].toLowerCase() + regexHuman.slice(1)}`\n : `'${instancePath}' ${message}`;\n return new ValidationError({\n errorCode: 'SCHEMA_INVALID_PATTERN',\n fieldPath: instancePath,\n message: regexErrorMessage,\n data,\n meta,\n });\n }\n case 'not': {\n const notHuman = meta?.notHuman;\n const notHumanErrorMessage = notHuman\n ? `'${instancePath}' should be ${notHuman[0].toLowerCase() + notHuman.slice(1)}`\n : `'${instancePath}' ${message}`;\n return new ValidationError({\n errorCode: 'SCHEMA_INVALID_NOT',\n fieldPath: instancePath,\n message: notHumanErrorMessage,\n data,\n meta,\n });\n }\n default:\n return new ValidationError({\n errorCode: 'SCHEMA_VALIDATION_ERROR',\n fieldPath: instancePath,\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, lowerFirst(fieldPath)) || 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 {\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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"}
package/package.json CHANGED
@@ -1,43 +1,45 @@
1
1
  {
2
2
  "name": "@expo/schemer",
3
- "version": "1.4.5",
3
+ "version": "1.5.0",
4
4
  "description": "Centralized scheme validation library for Expo",
5
+ "license": "MIT",
5
6
  "main": "./build/index.js",
7
+ "types": "./build/index.d.ts",
8
+ "files": [
9
+ "build"
10
+ ],
6
11
  "scripts": {
7
- "test": "jest --testPathIgnorePatterns network",
8
- "test-integration": "jest",
9
- "watch": "tsc --watch --preserveWatchOutput",
10
- "build": "tsc",
11
- "prepare": "yarn build"
12
+ "build": "expo-module tsc",
13
+ "prepare": "yarn run clean && yarn run build",
14
+ "clean": "expo-module clean",
15
+ "lint": "expo-module lint",
16
+ "test": "expo-module test",
17
+ "test:e2e": "expo-module test --config e2e/jest.config.js",
18
+ "typecheck": "expo-module typecheck",
19
+ "watch": "yarn run --watch --preserveWatchOutput",
20
+ "prepublishOnly": "expo-module prepublishOnly"
12
21
  },
13
- "license": "MIT",
22
+ "homepage": "https://github.com/expo/expo/tree/main/packages/@expo/schemer#readme",
14
23
  "repository": {
15
24
  "type": "git",
16
- "url": "https://github.com/expo/expo-cli.git",
17
- "directory": "packages/schemer"
25
+ "url": "https://github.com/expo/expo.git",
26
+ "directory": "packages/@expo/schemer"
18
27
  },
19
28
  "bugs": {
20
- "url": "https://github.com/expo/expo-cli/issues"
21
- },
22
- "homepage": "https://github.com/expo/expo-cli/tree/main/packages/schemer#readme",
23
- "files": [
24
- "build"
25
- ],
26
- "devDependencies": {
27
- "@types/lodash": "^4.14.176"
29
+ "url": "https://github.com/expo/expo/issues"
28
30
  },
29
31
  "dependencies": {
30
32
  "ajv": "^8.1.0",
31
33
  "ajv-formats": "^2.0.2",
32
34
  "json-schema-traverse": "^1.0.0",
33
- "lodash": "^4.17.21",
34
- "probe-image-size": "^7.1.0",
35
- "read-chunk": "^3.2.0"
35
+ "probe-image-size": "^7.1.0"
36
+ },
37
+ "devDependencies": {
38
+ "@types/probe-image-size": "^7.2.4",
39
+ "expo-module-scripts": "^3.3.0"
36
40
  },
37
41
  "publishConfig": {
38
42
  "access": "public"
39
43
  },
40
- "volta": {
41
- "extends": "../../package.json"
42
- }
44
+ "gitHead": "6aca7ce098ddc667776a3d7cf612adbb985e264a"
43
45
  }