@expo/schemer 1.3.32 → 1.4.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 +19 -4
- package/build/Error.d.ts +1 -0
- package/build/Error.js +1 -0
- package/build/Error.js.map +1 -1
- package/build/Util.js +1 -4
- package/build/Util.js.map +1 -1
- package/build/index.js +13 -0
- package/build/index.js.map +1 -1
- package/package.json +4 -1
package/README.md
CHANGED
|
@@ -1,8 +1,22 @@
|
|
|
1
|
-
|
|
1
|
+
<!-- Title -->
|
|
2
|
+
<h1 align="center">
|
|
3
|
+
👋 Welcome to <br><code>@expo/schemer</code>
|
|
4
|
+
</h1>
|
|
5
|
+
|
|
6
|
+
<p align="center">A Schema validation library for Expo.</p>
|
|
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
|
+
<!-- Body -->
|
|
2
17
|
|
|
3
|
-
A Schema validation library for Expo, to be used both
|
|
4
18
|
Details can be found here:
|
|
5
|
-
https://paper.dropbox.com/doc/Expo-Schema-Validation-Library-mQU07rRejSnEe4Vf5dkcS
|
|
19
|
+
* https://paper.dropbox.com/doc/Expo-Schema-Validation-Library-mQU07rRejSnEe4Vf5dkcS
|
|
6
20
|
|
|
7
21
|
## Usage
|
|
8
22
|
|
|
@@ -55,7 +69,8 @@ However, each subschema also contains a custom meta tag, which can be parsed for
|
|
|
55
69
|
|
|
56
70
|
// For custom error messages and docs
|
|
57
71
|
regexHuman,
|
|
58
|
-
autogenerated
|
|
72
|
+
autogenerated,
|
|
73
|
+
notHuman
|
|
59
74
|
}
|
|
60
75
|
}
|
|
61
76
|
```
|
package/build/Error.d.ts
CHANGED
|
@@ -24,6 +24,7 @@ export declare const ErrorCodes: {
|
|
|
24
24
|
SCHEMA_ADDITIONAL_PROPERTY: string;
|
|
25
25
|
SCHEMA_MISSING_REQUIRED_PROPERTY: string;
|
|
26
26
|
SCHEMA_INVALID_PATTERN: string;
|
|
27
|
+
SCHEMA_INVALID_NOT: string;
|
|
27
28
|
INVALID_ASSET_URI: string;
|
|
28
29
|
INVALID_DIMENSIONS: string;
|
|
29
30
|
INVALID_CONTENT_TYPE: string;
|
package/build/Error.js
CHANGED
|
@@ -27,6 +27,7 @@ exports.ErrorCodes = {
|
|
|
27
27
|
SCHEMA_ADDITIONAL_PROPERTY: 'SCHEMA_ADDITIONAL_PROPERTY',
|
|
28
28
|
SCHEMA_MISSING_REQUIRED_PROPERTY: 'SCHEMA_MISSING_REQUIRED_PROPERTY',
|
|
29
29
|
SCHEMA_INVALID_PATTERN: 'SCHEMA_INVALID_PATTERN',
|
|
30
|
+
SCHEMA_INVALID_NOT: 'SCHEMA_INVALID_NOT',
|
|
30
31
|
INVALID_ASSET_URI: 'INVALID_ASSET_URI',
|
|
31
32
|
INVALID_DIMENSIONS: 'INVALID_DIMENSIONS',
|
|
32
33
|
INVALID_CONTENT_TYPE: 'INVALID_CONTENT_TYPE',
|
package/build/Error.js.map
CHANGED
|
@@ -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;
|
|
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"]}
|
package/build/Util.js
CHANGED
|
@@ -4,13 +4,10 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.fieldPathToSchema = exports.schemaPointerToFieldPath = exports.fieldPathToSchemaPath = void 0;
|
|
7
|
-
const fill_1 = __importDefault(require("lodash/fill"));
|
|
8
|
-
const flatten_1 = __importDefault(require("lodash/flatten"));
|
|
9
7
|
const get_1 = __importDefault(require("lodash/get"));
|
|
10
8
|
const zip_1 = __importDefault(require("lodash/zip"));
|
|
11
9
|
const fieldPathToSchemaPath = (fieldPath) => {
|
|
12
|
-
|
|
13
|
-
return flatten_1.default(newPath).join('.');
|
|
10
|
+
return zip_1.default(fieldPath.split('.').fill('properties'), fieldPath.split('.')).flat().join('.');
|
|
14
11
|
};
|
|
15
12
|
exports.fieldPathToSchemaPath = fieldPathToSchemaPath;
|
|
16
13
|
// Assumption: used only for jsonPointer returned from traverse
|
package/build/Util.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Util.js","sourceRoot":"","sources":["../src/Util.ts"],"names":[],"mappings":";;;;;;AAAA,
|
|
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,aAAG,CAAC,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,aAAG,CAAC,MAAM,EAAE,6BAAqB,CAAC,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"]}
|
package/build/index.js
CHANGED
|
@@ -68,6 +68,19 @@ class Schemer {
|
|
|
68
68
|
meta,
|
|
69
69
|
});
|
|
70
70
|
}
|
|
71
|
+
case 'not': {
|
|
72
|
+
const notHuman = meta === null || meta === void 0 ? void 0 : meta.notHuman;
|
|
73
|
+
const notHumanErrorMessage = notHuman
|
|
74
|
+
? `'${dataPath}' should be ${notHuman[0].toLowerCase() + notHuman.slice(1)}`
|
|
75
|
+
: `'${dataPath}' ${message}`;
|
|
76
|
+
return new Error_1.ValidationError({
|
|
77
|
+
errorCode: 'SCHEMA_INVALID_NOT',
|
|
78
|
+
fieldPath: dataPath,
|
|
79
|
+
message: notHumanErrorMessage,
|
|
80
|
+
data,
|
|
81
|
+
meta,
|
|
82
|
+
});
|
|
83
|
+
}
|
|
71
84
|
default:
|
|
72
85
|
return new Error_1.ValidationError({
|
|
73
86
|
errorCode: 'SCHEMA_VALIDATION_ERROR',
|
package/build/index.js.map
CHANGED
|
@@ -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":";;;;;;AAAA,8CAAsB;AACtB,4CAAoB;AACpB,gFAA4C;AAC5C,qDAA6B;AAC7B,gDAAwB;AACxB,wEAA0C;AAC1C,4DAAmC;AAEnC,mCAAwD;AACxD,iCAAqE;AAuBrE,iCAA+E;AAAtE,qGAAA,YAAY,OAAA;AAAE,wGAAA,eAAe,OAAA;AAAE,mGAAA,UAAU,OAAA;AAClD,MAAqB,OAAO;IAM1B,iCAAiC;IACjC,YAAY,MAAc,EAAE,UAAmB,EAAE;QAC/C,IAAI,CAAC,OAAO,GAAG;YACb,SAAS,EAAE,IAAI;YACf,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,MAAM;YACd,cAAc,EAAE,IAAI;YACpB,GAAG,OAAO;SACX,CAAC;QAEF,IAAI,CAAC,GAAG,GAAG,IAAI,aAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACjC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,SAAS,CAAC;QACjD,IAAI,CAAC,sBAAsB,GAAG,EAAE,CAAC;IACnC,CAAC;IAED,sBAAsB,CAAC,EACrB,OAAO,EACP,QAAQ,EACR,MAAM,EACN,YAAY,EACZ,IAAI,EACJ,OAAO,GACS;QAChB,MAAM,IAAI,GAAG,YAAY,IAAK,YAAoB,CAAC,IAAI,CAAC;QACxD,+CAA+C;QAC/C,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC7B,QAAQ,OAAO,EAAE;YACf,KAAK,sBAAsB,CAAC,CAAC;gBAC3B,OAAO,IAAI,uBAAe,CAAC;oBACzB,SAAS,EAAE,4BAA4B;oBACvC,SAAS,EAAE,QAAQ;oBACnB,OAAO,EAAE,wCAAyC,MAAc,CAAC,kBAAkB,GAAG;oBACtF,IAAI;oBACJ,IAAI;iBACL,CAAC,CAAC;aACJ;YACD,KAAK,UAAU;gBACb,OAAO,IAAI,uBAAe,CAAC;oBACzB,SAAS,EAAE,kCAAkC;oBAC7C,SAAS,EAAE,QAAQ;oBACnB,OAAO,EAAE,iCAAkC,MAAc,CAAC,eAAe,GAAG;oBAC5E,IAAI;oBACJ,IAAI;iBACL,CAAC,CAAC;YACL,KAAK,SAAS,CAAC,CAAC;gBACd,+HAA+H;gBAC/H,MAAM,UAAU,GAAG,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,UAAU,CAAC;gBACpC,MAAM,iBAAiB,GAAG,UAAU;oBAClC,CAAC,CAAC,IAAI,QAAQ,iBAAiB,UAAU,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;oBAClF,CAAC,CAAC,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;gBAC/B,OAAO,IAAI,uBAAe,CAAC;oBACzB,SAAS,EAAE,wBAAwB;oBACnC,SAAS,EAAE,QAAQ;oBACnB,OAAO,EAAE,iBAAiB;oBAC1B,IAAI;oBACJ,IAAI;iBACL,CAAC,CAAC;aACJ;YACD,KAAK,KAAK,CAAC,CAAC;gBACV,MAAM,QAAQ,GAAG,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,QAAQ,CAAC;gBAChC,MAAM,oBAAoB,GAAG,QAAQ;oBACnC,CAAC,CAAC,IAAI,QAAQ,eAAe,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;oBAC5E,CAAC,CAAC,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;gBAC/B,OAAO,IAAI,uBAAe,CAAC;oBACzB,SAAS,EAAE,oBAAoB;oBAC/B,SAAS,EAAE,QAAQ;oBACnB,OAAO,EAAE,oBAAoB;oBAC7B,IAAI;oBACJ,IAAI;iBACL,CAAC,CAAC;aACJ;YACD;gBACE,OAAO,IAAI,uBAAe,CAAC;oBACzB,SAAS,EAAE,yBAAyB;oBACpC,SAAS,EAAE,QAAQ;oBACnB,OAAO,EAAE,OAAO,IAAI,kBAAkB;oBACtC,IAAI;oBACJ,IAAI;iBACL,CAAC,CAAC;SACN;IACH,CAAC;IAED,SAAS;QACP,wDAAwD;QACxD,IAAI,SAAS,GAAsB,EAAE,CAAC;QACtC,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE;YACnB,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC;SACtE;QACD,OAAO,CAAC,GAAG,SAAS,EAAE,GAAG,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACxD,CAAC;IAED,cAAc;QACZ,0CAA0C;QAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAChC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;YACrB,IAAI,CAAC,sBAAsB,GAAG,EAAE,CAAC;YACjC,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC;YACrB,MAAM,IAAI,oBAAY,CAAC,MAAM,CAAC,CAAC;SAChC;IACH,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,IAAS;QACzB,MAAM,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,IAAS;QACjC,MAAM,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,IAAS;QACjC,MAAM,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC;IAED,oBAAoB,CAAC,IAAS;QAC5B,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,IAAS;QAClC,MAAM,MAAM,GAAiB,EAAE,CAAC;QAChC,8BAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,SAAS,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE;YACxF,IAAI,QAAQ,IAAI,SAAS,CAAC,IAAI,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE;gBACtD,MAAM,SAAS,GAAG,+BAAwB,CAAC,WAAW,CAAC,CAAC;gBACxD,MAAM,CAAC,IAAI,CAAC;oBACV,SAAS;oBACT,IAAI,EAAE,aAAG,CAAC,IAAI,EAAE,SAAS,CAAC;oBAC1B,IAAI,EAAE,SAAS,CAAC,IAAI;iBACrB,CAAC,CAAC;aACJ;QACH,CAAC,CAAC,CAAC;QACH,MAAM,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACrE,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAc;QAC7D,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,EAAE;YAC9B,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,kBAAkB,EAAE,GAAS,IAAI,CAAC;YAC9D,2BAA2B;YAC3B,MAAM,QAAQ,GAAG,cAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAClD,IAAI;gBACF,gFAAgF;gBAChF,6CAA6C;gBAC7C,iEAAiE;gBACjE,wFAAwF;gBACxF,oCAAoC;gBACpC,4EAA4E;gBAC5E,MAAM,WAAW,GAAG,YAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;oBACzC,CAAC,CAAC,0BAAU,CAAC,IAAI,CAAC,MAAM,oBAAS,CAAC,QAAQ,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;oBACrD,CAAC,CAAC,MAAM,0BAAU,CAAC,IAAI,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAC;gBACtD,IAAI,CAAC,WAAW,EAAE;oBAChB,OAAO;iBACR;gBAED,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,WAAW,CAAC;gBAElD,IAAI,kBAAkB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,kBAAkB,CAAC,CAAC,EAAE;oBACrE,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAC9B,IAAI,uBAAe,CAAC;wBAClB,SAAS,EAAE,sBAAsB;wBACjC,SAAS;wBACT,OAAO,EAAE,UAAU,SAAS,qBAAqB,IAAI,CAAC,gBAAgB,qBAAqB,IAAI,cAAc,IAAI,EAAE;wBACnH,IAAI;wBACJ,IAAI;qBACL,CAAC,CACH,CAAC;iBACH;gBAED,IAAI,UAAU,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,MAAM,IAAI,UAAU,CAAC,KAAK,KAAK,KAAK,CAAC,EAAE;oBAC9E,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAC9B,IAAI,uBAAe,CAAC;wBAClB,SAAS,EAAE,oBAAoB;wBAC/B,SAAS;wBACT,OAAO,EAAE,IAAI,SAAS,4BAA4B,UAAU,CAAC,KAAK,IAAI,UAAU,CAAC,MAAM,sBAAsB,IAAI,oBAAoB,KAAK,IAAI,MAAM,EAAE;wBACtJ,IAAI;wBACJ,IAAI;qBACL,CAAC,CACH,CAAC;iBACH;gBAED,IAAI,MAAM,IAAI,KAAK,KAAK,MAAM,EAAE;oBAC9B,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAC9B,IAAI,uBAAe,CAAC;wBAClB,SAAS,EAAE,YAAY;wBACvB,SAAS;wBACT,OAAO,EAAE,4CAA4C,IAAI,oBAAoB,KAAK,IAAI,MAAM,EAAE;wBAC9F,IAAI;wBACJ,IAAI;qBACL,CAAC,CACH,CAAC;iBACH;aACF;YAAC,OAAO,CAAC,EAAE;gBACV,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAC9B,IAAI,uBAAe,CAAC;oBAClB,SAAS,EAAE,mBAAmB;oBAC9B,SAAS;oBACT,OAAO,EAAE,0BAA0B,IAAI,GAAG;oBAC1C,IAAI;oBACJ,IAAI;iBACL,CAAC,CACH,CAAC;aACH;SACF;IACH,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAc;QAC7D,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,EAAE;YAC9B,IAAI,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;gBAC3E,MAAM,IAAI,CAAC,mBAAmB,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;aAC3D;SACF;IACH,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,SAAiB,EAAE,IAAS;QACjD,MAAM,SAAS,GAAG,wBAAiB,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAC5D,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAEnC,IAAI,SAAS,CAAC,IAAI,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE;YAC1C,MAAM,IAAI,CAAC,mBAAmB,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;SAC3E;QACD,IAAI,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC;IAED,YAAY,CAAC,IAAY;QACvB,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC7C,CAAC;IAED,YAAY,CAAC,IAAY;QACvB,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC7C,CAAC;IAED,kBAAkB,CAAC,OAAe;QAChC,OAAO,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IACtD,CAAC;IAED,YAAY,CAAC,QAAgB;QAC3B,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACjD,CAAC;CACF;AAtPD,0BAsPC","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 case 'not': {\n const notHuman = meta?.notHuman;\n const notHumanErrorMessage = notHuman\n ? `'${dataPath}' should be ${notHuman[0].toLowerCase() + notHuman.slice(1)}`\n : `'${dataPath}' ${message}`;\n return new ValidationError({\n errorCode: 'SCHEMA_INVALID_NOT',\n fieldPath: dataPath,\n message: notHumanErrorMessage,\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,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@expo/schemer",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"description": "Centralized scheme validation library for Expo",
|
|
5
5
|
"main": "./build/index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -35,5 +35,8 @@
|
|
|
35
35
|
},
|
|
36
36
|
"publishConfig": {
|
|
37
37
|
"access": "public"
|
|
38
|
+
},
|
|
39
|
+
"volta": {
|
|
40
|
+
"extends": "../../package.json"
|
|
38
41
|
}
|
|
39
42
|
}
|