diff --git a/package-lock.json b/package-lock.json index 1ed2e917aa4..0599041e894 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5062,7 +5062,8 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "aproba": { "version": "1.2.0", @@ -5083,12 +5084,14 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -5103,17 +5106,20 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -5230,7 +5236,8 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -5242,6 +5249,7 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -5256,6 +5264,7 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -5263,12 +5272,14 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "minipass": { "version": "2.3.5", "bundled": true, "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -5287,6 +5298,7 @@ "version": "0.5.1", "bundled": true, "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -5367,7 +5379,8 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -5379,6 +5392,7 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -5464,7 +5478,8 @@ "safe-buffer": { "version": "5.1.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "safer-buffer": { "version": "2.1.2", @@ -5500,6 +5515,7 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -5519,6 +5535,7 @@ "version": "3.0.1", "bundled": true, "dev": true, + "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -5562,12 +5579,14 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "yallist": { "version": "3.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true } } }, diff --git a/packages/initiatives/package-lock.json b/packages/initiatives/package-lock.json index 2565e9415da..aa0d6a8fee6 100644 --- a/packages/initiatives/package-lock.json +++ b/packages/initiatives/package-lock.json @@ -1,47 +1,72 @@ { - "requires": true, - "lockfileVersion": 1, - "dependencies": { - "@esri/arcgis-rest-auth": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@esri/arcgis-rest-auth/-/arcgis-rest-auth-2.0.1.tgz", - "integrity": "sha512-88SVnEpX/JpnLqeWxyf07c+dXEDfibKol7bZIRrrbBuw28dsRiwQqlMqI+bF0Vbyj0zTid/zvBLn74DNovKkFg==", - "requires": { - "@esri/arcgis-rest-types": "^2.0.1", - "tslib": "^1.9.3" - } - }, - "@esri/arcgis-rest-portal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@esri/arcgis-rest-portal/-/arcgis-rest-portal-2.0.1.tgz", - "integrity": "sha512-KlSvvojy6NKR2TXgNJq+w/jwhpIouiNihtnv8v2o2XKt6pRrMgL7qIzZssQbB6UZ1FD8gxbdXe6xdwRgW+yaiQ==", - "requires": { - "@esri/arcgis-rest-types": "^2.0.1", - "tslib": "^1.9.3" - } - }, - "@esri/arcgis-rest-request": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@esri/arcgis-rest-request/-/arcgis-rest-request-2.0.1.tgz", - "integrity": "sha512-lAhX15VI306bzzMH6xWCSSg1GHZxa5eWLb0r5M94Uet/Z0mMTXXTtIMQWYO0WQ05jEpLnZ5UKvNR0v9aKyFNkw==", - "requires": { - "tslib": "^1.9.3" - } - }, - "@esri/arcgis-rest-types": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@esri/arcgis-rest-types/-/arcgis-rest-types-2.0.1.tgz", - "integrity": "sha512-3bsrqespqnjAkT+fdnEOfyX57cjnijEWegnXngeD6QlBohTtIys0bhw5bKySOkq4Jnv3JZzmiPYqVZCuJcDKig==" - }, - "blob": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", - "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=" - }, - "tslib": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" - } - } + "name": "@esri/hub-initiatives", + "version": "3.6.5", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@esri/arcgis-rest-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@esri/arcgis-rest-auth/-/arcgis-rest-auth-2.0.1.tgz", + "integrity": "sha512-88SVnEpX/JpnLqeWxyf07c+dXEDfibKol7bZIRrrbBuw28dsRiwQqlMqI+bF0Vbyj0zTid/zvBLn74DNovKkFg==", + "dev": true, + "requires": { + "@esri/arcgis-rest-types": "^2.0.1", + "tslib": "^1.9.3" + } + }, + "@esri/arcgis-rest-portal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@esri/arcgis-rest-portal/-/arcgis-rest-portal-2.0.1.tgz", + "integrity": "sha512-KlSvvojy6NKR2TXgNJq+w/jwhpIouiNihtnv8v2o2XKt6pRrMgL7qIzZssQbB6UZ1FD8gxbdXe6xdwRgW+yaiQ==", + "dev": true, + "requires": { + "@esri/arcgis-rest-types": "^2.0.1", + "tslib": "^1.9.3" + } + }, + "@esri/arcgis-rest-request": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@esri/arcgis-rest-request/-/arcgis-rest-request-2.0.1.tgz", + "integrity": "sha512-lAhX15VI306bzzMH6xWCSSg1GHZxa5eWLb0r5M94Uet/Z0mMTXXTtIMQWYO0WQ05jEpLnZ5UKvNR0v9aKyFNkw==", + "dev": true, + "requires": { + "tslib": "^1.9.3" + } + }, + "@esri/arcgis-rest-types": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@esri/arcgis-rest-types/-/arcgis-rest-types-2.0.1.tgz", + "integrity": "sha512-3bsrqespqnjAkT+fdnEOfyX57cjnijEWegnXngeD6QlBohTtIys0bhw5bKySOkq4Jnv3JZzmiPYqVZCuJcDKig==", + "dev": true + }, + "@esri/hub-common": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/@esri/hub-common/-/hub-common-3.6.5.tgz", + "integrity": "sha512-fGVX6lP25aNndUPAhyfYxPkAjfaZEr3dOxGWVBX75rV88HfmxrvXxstLlM7NGTXOmhPIgWIrx+f3RwoUw067tQ==", + "dev": true, + "requires": { + "tslib": "^1.9.3" + } + }, + "@esri/hub-sites": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/@esri/hub-sites/-/hub-sites-3.6.5.tgz", + "integrity": "sha512-dWbo2d4rVrMzXaRFn7UcGxkkQ4i8pgu6Wpm3QKUrFzStVLnLvN33yQKgkS6FHEVB2/KSSJcBOhmx5I1kjmnLOw==", + "dev": true, + "requires": { + "tslib": "^1.9.3" + } + }, + "blob": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", + "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=", + "dev": true + }, + "tslib": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.0.tgz", + "integrity": "sha512-BmndXUtiTn/VDDrJzQE7Mm22Ix3PxgLltW9bSNLoeCY31gnG2OPx0QqJnuc9oMIKioYrz487i6K9o4Pdn0j+Kg==" + } + } } diff --git a/packages/initiatives/src/migrations/upgrade-two-dot-two.ts b/packages/initiatives/src/migrations/upgrade-two-dot-two.ts new file mode 100644 index 00000000000..f9b0222bba6 --- /dev/null +++ b/packages/initiatives/src/migrations/upgrade-two-dot-two.ts @@ -0,0 +1,56 @@ +/* Copyright (c) 2020 Environmental Systems Research Institute, Inc. + * Apache-2.0 */ +import { getProp, cloneObject } from "@esri/hub-common"; +import { IInitiativeModel } from "@esri/hub-common"; + +/** + * Apply the 2.1 --> 2.2 Migration to an Initiative Model + * Note: we need this migration to run every time for now, so we + * will always run it + * + * @param model + * @protected + */ +export function upgradeToTwoDotTwo(model: IInitiativeModel): IInitiativeModel { + // const currVersion = getProp(model, "item.properties.schemaVersion"); + // if (currVersion < 2.2) { + const clone = cloneObject(model) as IInitiativeModel; + // store the schemaVersion + // clone.item.properties.schemaVersion = 2.2; + const steps = getProp(clone, "data.steps"); + const templateIdsFromSteps = getTemplateIdsFromSteps(steps); + const recommendedTemplates = + getProp(clone, "data.recommendedTemplates") || []; + const allTemplateIds = templateIdsFromSteps.concat(recommendedTemplates); + // strip out duplicates + clone.data.recommendedTemplates = allTemplateIds.reduce( + (acc: string[], id: string) => { + if (acc.indexOf(id) < 0) { + acc.push(id); + } + return acc; + }, + [] + ); + return clone; + // } else { + // return model; + // } +} + +/** + * Reduce the solution template ids out of the steps array + * @param steps is the steps array from an initiative item model.data + */ +function getTemplateIdsFromSteps(steps: any): string[] { + let templateIds: string[] = []; + if (Array.isArray(steps)) { + templateIds = steps.reduce((acc: string[], step: any) => { + if (getProp(step, "templateIds.length")) { + return acc.concat(step.templateIds); + } + return acc; + }, []); + } + return templateIds; +} diff --git a/packages/initiatives/src/migrator.ts b/packages/initiatives/src/migrator.ts index a2147125ff9..fdfb6ba93c1 100644 --- a/packages/initiatives/src/migrator.ts +++ b/packages/initiatives/src/migrator.ts @@ -6,12 +6,13 @@ import { applyInitialSchema } from "./migrations/apply-schema"; import { upgradeToOneDotOne } from "./migrations/upgrade-one-dot-one"; import { upgradeToTwoDotZero } from "./migrations/upgrade-two-dot-zero"; import { upgradeToTwoDotOne } from "./migrations/upgrade-two-dot-one"; +import { upgradeToTwoDotTwo } from "./migrations/upgrade-two-dot-two"; /** * Current Schema Version * @protected */ -export const CURRENT_SCHEMA_VERSION = 2.1; +export const CURRENT_SCHEMA_VERSION = 2.2; /** * Handle Initiative Schema Migrations. @@ -40,6 +41,7 @@ export function migrateSchema( model = upgradeToOneDotOne(model, portalUrl); model = upgradeToTwoDotZero(model, portalUrl); model = upgradeToTwoDotOne(model); + model = upgradeToTwoDotTwo(model); // etc return model; } diff --git a/packages/initiatives/test/mocks/initiative-versionTwoDotOne.ts b/packages/initiatives/test/mocks/initiative-versionTwoDotOne.ts new file mode 100644 index 00000000000..54573125c26 --- /dev/null +++ b/packages/initiatives/test/mocks/initiative-versionTwoDotOne.ts @@ -0,0 +1,26 @@ +/* Copyright (c) 2020 Environmental Systems Research Institute, Inc. + * Apache-2.0 */ +import { IInitiativeModel, IInitiativeItem } from "@esri/hub-common"; + +export const initiativeVersionTwoDotOne: IInitiativeModel = { + item: { + properties: { + schemaVersion: 2.1 + } + } as IInitiativeItem, + data: { + recommendedTemplates: ["4ef", "1ef"], + steps: [ + { + templateIds: ["1ef", "2ef"] + }, + { + templateIds: ["3ef"] + }, + { + templateIds: [] + }, + {} + ] + } +}; diff --git a/packages/initiatives/test/upgrades/upgrade-two-dot-two.test.ts b/packages/initiatives/test/upgrades/upgrade-two-dot-two.test.ts new file mode 100644 index 00000000000..d9aa034fc7d --- /dev/null +++ b/packages/initiatives/test/upgrades/upgrade-two-dot-two.test.ts @@ -0,0 +1,39 @@ +/* Copyright (c) 2019 Environmental Systems Research Institute, Inc. + * Apache-2.0 */ +import { IInitiativeModel, cloneObject } from "@esri/hub-common"; +import { upgradeToTwoDotTwo } from "../../src/migrations/upgrade-two-dot-two"; +import { initiativeVersionTwoDotOne } from "../mocks/initiative-versionTwoDotOne"; + +describe("Applying v2.2 Initiative Schema ::", () => { + const model = cloneObject(initiativeVersionTwoDotOne) as IInitiativeModel; + + describe("Upgrade Instance ::", () => { + // it("should return the model if it is at 2.2", done => { + // const instance = cloneObject(model) as IInitiativeModel; + // instance.item.properties.schemaVersion = 2.2; + // const chk = upgradeToTwoDotTwo(instance); + // expect(chk).toBe(instance, "should return the same object"); + // done(); + // }); + + it("should create recommendedTemplates array", done => { + const instance = cloneObject(model) as IInitiativeModel; + const chk = upgradeToTwoDotTwo(instance); + expect(chk).not.toBe(instance, "should return a new object"); + expect(chk.item.properties.schemaVersion).toBeDefined("schema version"); + // TODO change to 2.2 + expect(chk.item.properties.schemaVersion).toEqual( + 2.1, + "should set version to 2.1" + ); + expect(chk.data.recommendedTemplates).toBeDefined( + "should set recommendedTemplates array" + ); + expect(chk.data.recommendedTemplates.length).toEqual( + 4, + "should add all unique template ids" + ); + done(); + }); + }); +}); diff --git a/packages/initiatives/tsconfig.json b/packages/initiatives/tsconfig.json index 90cbf37afa2..04aadd1c0dc 100644 --- a/packages/initiatives/tsconfig.json +++ b/packages/initiatives/tsconfig.json @@ -3,4 +3,4 @@ "include": [ "src/**/*.ts" ] -} \ No newline at end of file +}