diff --git a/packages/build/package-lock.json b/packages/build/package-lock.json index 2fb094565c..797f2b8189 100644 --- a/packages/build/package-lock.json +++ b/packages/build/package-lock.json @@ -4,6 +4,18 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "ajv": { + "version": "6.12.5", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.5.tgz", + "integrity": "sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", @@ -13,6 +25,24 @@ "ms": "^2.1.1" } }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -54,11 +84,26 @@ "integrity": "sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==", "dev": true }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, "sinon-chai": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-3.5.0.tgz", "integrity": "sha512-IifbusYiQBpUxxFJkR3wTU68xzBN0+bxCScEaKMjBvAQERg6FnTTc1F17rseLb1tjmkJ23730AXpFI0c47FgAg==", "dev": true + }, + "uri-js": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", + "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } } } } diff --git a/packages/build/package.json b/packages/build/package.json index 24c59e74a7..fe80249d6c 100644 --- a/packages/build/package.json +++ b/packages/build/package.json @@ -30,6 +30,7 @@ ] }, "devDependencies": { + "ajv": "^6.12.5", "nock": "^13.0.4", "sinon-chai": "^3.5.0" }, diff --git a/packages/build/src/download-center-schema.ts b/packages/build/src/download-center-schema.ts new file mode 100644 index 0000000000..da07ab78e2 --- /dev/null +++ b/packages/build/src/download-center-schema.ts @@ -0,0 +1,84 @@ +const downloadCenterSchema = { + 'type': 'object', + 'required': [ + 'versions', + 'manual_link', + 'release_notes_link', + 'previous_releases_link', + 'development_releases_link', + 'supported_browsers_link', + 'tutorial_link' + ], + 'properties': { + 'versions': { + 'type': 'array', + 'additionalItems': false, + 'items': { + 'type': 'object', + 'required': [ + '_id', + 'version', + 'platform' + ], + 'properties': { + '_id': { + 'type': 'string' + }, + 'version': { + 'type': 'string' + }, + 'platform': { + 'type': 'array', + 'additionalItems': false, + 'items': { + 'type': 'object', + 'required': [ + 'arch', + 'os', + 'name', + 'download_link' + ], + 'properties': { + 'arch': { + 'type': 'string' + }, + 'os': { + 'type': 'string' + }, + 'name': { + 'type': 'string' + }, + 'download_link': { + 'type': 'string' + } + }, + 'additionalProperties': false + } + } + }, + 'additionalProperties': false + } + }, + 'manual_link': { + 'type': 'string' + }, + 'release_notes_link': { + 'type': 'string' + }, + 'previous_releases_link': { + 'type': 'string' + }, + 'development_releases_link': { + 'type': 'string' + }, + 'supported_browsers_link': { + 'type': 'string' + }, + 'tutorial_link': { + 'type': 'string' + } + }, + 'additionalProperties': false +}; + +export default downloadCenterSchema; diff --git a/packages/build/src/download-center.spec.ts b/packages/build/src/download-center.spec.ts index 14b14e1373..3d791ba3e3 100644 --- a/packages/build/src/download-center.spec.ts +++ b/packages/build/src/download-center.spec.ts @@ -1,11 +1,24 @@ import { expect } from 'chai'; import nock from 'nock'; +import Ajv from 'ajv'; + +import downloadCenterSchema from './download-center-schema'; + import { createDownloadCenterConfig, verifyDownloadCenterConfig } from './download-center'; +function validateWithSchema(obj, schema): void { + const ajv = new Ajv(); + const validate = ajv.compile(schema); + const valid = validate(obj); + if (!valid) { + throw new Error(ajv.errorsText(validate.errors)); + } +} + describe('download center module', () => { describe('.createDownloadCenterConfig', () => { let config; @@ -25,6 +38,14 @@ describe('download center module', () => { it('returns the string with the win version injected', () => { expect(config).to.include('mongosh-1.2.2-win32.zip'); }); + + it('produces a well formed json', () => { + expect(() => { JSON.parse(config); }).not.to.throw(); + }); + + it('produces a json valid for the download center', () => { + validateWithSchema(JSON.parse(config), downloadCenterSchema); + }); }); describe('.verifyDownloadCenterConfig', () => { diff --git a/packages/build/src/download-center.ts b/packages/build/src/download-center.ts index d39ed8e4fc..43386730ef 100644 --- a/packages/build/src/download-center.ts +++ b/packages/build/src/download-center.ts @@ -71,7 +71,7 @@ const CONFIG = ` "os": "debian", "name": "Debian 64-bit", "download_link": "https://downloads.mongodb.com/compass/mongosh_{{version}}_amd64.deb" - } + }, { "arch": "x64", "os": "rhel",