From 4128d06560b931e053beed22c3f1056807e1fcd3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Berkefeld?= Date: Mon, 13 Mar 2023 18:29:52 +0100 Subject: [PATCH 01/73] #800: ensure document is not run on keyed REST retrieves --- docs/dist/documentation.md | 2 +- lib/metadataTypes/MetadataType.js | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/docs/dist/documentation.md b/docs/dist/documentation.md index 6934f89fc..7ee9cfe8d 100644 --- a/docs/dist/documentation.md +++ b/docs/dist/documentation.md @@ -3472,7 +3472,7 @@ MetadataType upsert, after retrieving from target and comparing to check if crea | Param | Type | Description | | --- | --- | --- | -| metadata | TYPE.MetadataTypeItem | single metadata itme | +| metadata | TYPE.MetadataTypeItem | single metadata item | | metadataKey | string | key of item we are looking at | | hasError | boolean | error flag from previous code | | metadataToUpdate | Array.<TYPE.MetadataTypeItemDiff> | list of items to update | diff --git a/lib/metadataTypes/MetadataType.js b/lib/metadataTypes/MetadataType.js index d8f1ac3cd..ade46e020 100644 --- a/lib/metadataTypes/MetadataType.js +++ b/lib/metadataTypes/MetadataType.js @@ -543,7 +543,7 @@ class MetadataType { /** * - * @param {TYPE.MetadataTypeItem} metadata single metadata itme + * @param {TYPE.MetadataTypeItem} metadata single metadata item * @param {string} metadataKey key of item we are looking at * @param {boolean} hasError error flag from previous code * @param {TYPE.MetadataTypeItemDiff[]} metadataToUpdate list of items to update @@ -832,6 +832,20 @@ class MetadataType { `Downloaded: ${this.definition.type} (${Object.keys(savedMetadata).length})` + Util.getKeysString(singleRetrieve) ); + if ( + this.buObject && + this.properties.metaDataTypes.documentOnRetrieve.includes(this.definition.type) + ) { + if (!singleRetrieve || (singleRetrieve && !this.definition.documentInOneFile)) { + await this.document(savedMetadata); + } else { + Util.logger.info( + Util.getGrayMsg( + 'Skipped running document because you supplied keys and the metadata type is configured to document to one file.' + ) + ); + } + } } return { From d8e321c75c3bc110e5d490b29a0ddc8e2afe1f11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Berkefeld?= Date: Thu, 11 May 2023 21:40:35 +0200 Subject: [PATCH 02/73] #0: improve API request body log --- lib/util/auth.js | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/lib/util/auth.js b/lib/util/auth.js index 34f4180bf..e569d1ff2 100644 --- a/lib/util/auth.js +++ b/lib/util/auth.js @@ -11,7 +11,6 @@ let authfile; const Auth = { /** * For each business unit, set up base credentials to be used. - * * @param {TYPE.AuthObject} authObject details for * @param {string} credential of the instance * @returns {void} @@ -48,7 +47,6 @@ const Auth = { }, /** * Returns an SDK instance to be used for API calls - * * @param {TYPE.BuObject} buObject information about current context * @returns {SDK} auth object */ @@ -73,7 +71,6 @@ const Auth = { }, /** * helper to clear all auth sessions - * * @returns {void} */ clearSessions() { @@ -83,7 +80,6 @@ const Auth = { }; /** * Returns an SDK instance to be used for API calls - * * @param {string} sessionKey key for specific BU * @param {TYPE.AuthObject} authObject credentials for specific BU * @returns {SDK} auth object @@ -137,7 +133,10 @@ function setupSDK(sessionKey, authObject) { Util.logger.debug('API REQUEST >> ' + JSON.stringify(msg, null, 2)); if (data) { // printing it separately leads to better formatting - Util.logger.debug('API REQUEST body >> \n ' + data); + Util.logger.debug( + 'API REQUEST body >> \n ' + + (typeof data === 'string' ? data : JSON.stringify(data, null, 2)) + ); } } }, From 0d22d37258fff50ad6f76aa43c0c32c33a4f2609 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Berkefeld?= Date: Fri, 12 May 2023 09:48:45 +0200 Subject: [PATCH 03/73] #889: switch mobileKeyword's keyField to `id` to avoid duplicate overrides --- docs/dist/documentation.md | 21 +----- lib/metadataTypes/MobileKeyword.js | 66 ++----------------- .../definitions/MobileKeyword.definition.js | 2 +- 3 files changed, 9 insertions(+), 80 deletions(-) diff --git a/docs/dist/documentation.md b/docs/dist/documentation.md index 586655ff7..3bd1b8a38 100644 --- a/docs/dist/documentation.md +++ b/docs/dist/documentation.md @@ -4007,7 +4007,6 @@ MobileKeyword MetadataType * [MobileKeyword](#MobileKeyword) ⇐ [MetadataType](#MetadataType) * [.retrieve(retrieveDir, [_], [__], [key])](#MobileKeyword.retrieve) ⇒ Promise.<TYPE.MetadataTypeMapObj> \| void * [.retrieveForCache(_, __, [key])](#MobileKeyword.retrieveForCache) ⇒ Promise.<TYPE.MetadataTypeMapObj> - * [.retrieveAsTemplate(templateDir, name, templateVariables)](#MobileKeyword.retrieveAsTemplate) ⇒ Promise.<TYPE.MetadataTypeItemObj> * [.create(MobileKeyword)](#MobileKeyword.create) ⇒ Promise * [.update(metadata)](#MobileKeyword.update) ⇒ Promise * [.postRetrieveTasks(metadata)](#MobileKeyword.postRetrieveTasks) ⇒ TYPE.CodeExtractItem \| TYPE.MetadataTypeItem @@ -4019,7 +4018,7 @@ MobileKeyword MetadataType * [.postCreateTasks(metadataEntry, apiResponse)](#MobileKeyword.postCreateTasks) ⇒ void * [.postUpdateTasks(metadataEntry, apiResponse)](#MobileKeyword.postUpdateTasks) ⇒ void * [._mergeCode(metadata, deployDir, [templateName])](#MobileKeyword._mergeCode) ⇒ Promise.<string> - * [.deleteByKey(key)](#MobileKeyword.deleteByKey) ⇒ Promise.<boolean> + * [.deleteByKey(id)](#MobileKeyword.deleteByKey) ⇒ Promise.<boolean> * [.postDeleteTasks(customerKey)](#MobileKeyword.postDeleteTasks) ⇒ void * [.getFilesToCommit(keyArr)](#MobileKeyword.getFilesToCommit) ⇒ Array.<string> @@ -4053,20 +4052,6 @@ Retrieves event definition metadata for caching | __ | void | parameter not used | | [key] | string | customer key of single item to retrieve | - - -### MobileKeyword.retrieveAsTemplate(templateDir, name, templateVariables) ⇒ Promise.<TYPE.MetadataTypeItemObj> -Retrieve a specific keyword - -**Kind**: static method of [MobileKeyword](#MobileKeyword) -**Returns**: Promise.<TYPE.MetadataTypeItemObj> - Promise of metadata - -| Param | Type | Description | -| --- | --- | --- | -| templateDir | string | Directory where retrieved metadata directory will be saved | -| name | string | name of the metadata file | -| templateVariables | TYPE.TemplateMap | variables to be replaced in the metadata | - ### MobileKeyword.create(MobileKeyword) ⇒ Promise @@ -4224,7 +4209,7 @@ helper for [preDeployTasks](preDeployTasks) that loads extracted code content ba -### MobileKeyword.deleteByKey(key) ⇒ Promise.<boolean> +### MobileKeyword.deleteByKey(id) ⇒ Promise.<boolean> Delete a metadata item from the specified business unit **Kind**: static method of [MobileKeyword](#MobileKeyword) @@ -4232,7 +4217,7 @@ Delete a metadata item from the specified business unit | Param | Type | Description | | --- | --- | --- | -| key | string | Identifier of item | +| id | string | Identifier of item | diff --git a/lib/metadataTypes/MobileKeyword.js b/lib/metadataTypes/MobileKeyword.js index 4ccc7af43..3d6f35c44 100644 --- a/lib/metadataTypes/MobileKeyword.js +++ b/lib/metadataTypes/MobileKeyword.js @@ -8,14 +8,12 @@ const cache = require('../util/cache'); /** * MobileKeyword MetadataType - * * @augments MetadataType */ class MobileKeyword extends MetadataType { /** * Retrieves Metadata of Mobile Keywords * Endpoint /legacy/v1/beta/mobile/keyword/ return all Mobile Keywords with all details. - * * @param {string} retrieveDir Directory where retrieved metadata directory will be saved * @param {void} [_] unused parameter * @param {void} [__] unused parameter @@ -27,11 +25,7 @@ class MobileKeyword extends MetadataType { return super.retrieveREST( retrieveDir, '/legacy/v1/beta/mobile/keyword/' + - (key - ? key.startsWith('id:') - ? key.slice(3) - : `?view=simple&$where=keyword%20eq%20%27${key}%27%20` - : '?view=simple'), + (key ? (key.startsWith('id:') ? key.slice(3) : key) : '?view=simple'), null, key ); @@ -49,7 +43,6 @@ class MobileKeyword extends MetadataType { /** * Retrieves event definition metadata for caching - * * @param {void} _ parameter not used * @param {void} __ parameter not used * @param {string} [key] customer key of single item to retrieve @@ -59,37 +52,8 @@ class MobileKeyword extends MetadataType { return this.retrieve(null, null, null, key); } - /** - * Retrieve a specific keyword - * - * @param {string} templateDir Directory where retrieved metadata directory will be saved - * @param {string} name name of the metadata file - * @param {TYPE.TemplateMap} templateVariables variables to be replaced in the metadata - * @returns {Promise.} Promise of metadata - */ - static async retrieveAsTemplate(templateDir, name, templateVariables) { - try { - return super.retrieveTemplateREST( - templateDir, - `/legacy/v1/beta/mobile/keyword/?view=simple&$where=keyword%20eq%20%27${name}%27%20`, - templateVariables, - name - ); - } catch (ex) { - // if the mobileMessage does not exist, the API returns the error "Request failed with status code 400 (ERR_BAD_REQUEST)" which would otherwise bring execution to a hold - if (name && ex.code === 'ERR_BAD_REQUEST') { - Util.logger.info( - `Downloaded: ${this.definition.type} (0)${Util.getKeysString(name)}` - ); - } else { - throw ex; - } - } - } - /** * Creates a single Event Definition - * * @param {TYPE.MetadataTypeItem} MobileKeyword a single Event Definition * @returns {Promise} Promise */ @@ -98,7 +62,6 @@ class MobileKeyword extends MetadataType { } /** * Updates a single item - * * @param {TYPE.MetadataTypeItem} metadata a single item * @returns {Promise} Promise */ @@ -112,7 +75,6 @@ class MobileKeyword extends MetadataType { /** * manages post retrieve steps - * * @param {TYPE.MetadataTypeItem} metadata a single item * @returns {TYPE.CodeExtractItem | TYPE.MetadataTypeItem} Array with one metadata object and one ssjs string */ @@ -136,7 +98,6 @@ class MobileKeyword extends MetadataType { } /** * helper for {@link parseMetadata} and {@link _buildForNested} - * * @param {string} metadataScript the code of the file * @returns {{fileExt:string,code:string}} returns found extension and file content */ @@ -149,7 +110,6 @@ class MobileKeyword extends MetadataType { /** * helper for {@link MetadataType.buildDefinition} * handles extracted code if any are found for complex types - * * @param {string} templateDir Directory where metadata templates are stored * @param {string|string[]} targetDir (List of) Directory where built definitions will be saved * @param {TYPE.MetadataTypeItem} metadata main JSON file that was read from file system @@ -176,7 +136,6 @@ class MobileKeyword extends MetadataType { /** * helper for {@link MetadataType.buildTemplate} * handles extracted code if any are found for complex types - * * @example scripts are saved as 1 json and 1 ssjs file. both files need to be run through templating * @param {string} templateDir Directory where metadata templates are stored * @param {string|string[]} targetDir (List of) Directory where built definitions will be saved @@ -205,7 +164,6 @@ class MobileKeyword extends MetadataType { /** * helper for {@link buildTemplateForNested} / {@link buildDefinitionForNested} * handles extracted code if any are found for complex types - * * @param {string} templateDir Directory where metadata templates are stored * @param {string|string[]} targetDir (List of) Directory where built definitions will be saved * @param {TYPE.MetadataTypeItem} metadata main JSON file that was read from file system @@ -272,7 +230,6 @@ class MobileKeyword extends MetadataType { /** * prepares an event definition for deployment - * * @param {TYPE.MetadataTypeItem} metadata a single MobileKeyword * @param {string} deployDir directory of deploy files * @returns {Promise.} Promise @@ -301,7 +258,6 @@ class MobileKeyword extends MetadataType { } /** * helper for {@link createREST} - * * @param {TYPE.MetadataTypeItem} metadataEntry a single metadata Entry * @param {object} apiResponse varies depending on the API call * @returns {void} @@ -311,7 +267,6 @@ class MobileKeyword extends MetadataType { } /** * helper for {@link updateREST} - * * @param {TYPE.MetadataTypeItem} metadataEntry a single metadata Entry * @param {object} apiResponse varies depending on the API call * @returns {void} @@ -322,7 +277,6 @@ class MobileKeyword extends MetadataType { /** * helper for {@link preDeployTasks} that loads extracted code content back into JSON - * * @param {TYPE.MetadataTypeItem} metadata a single definition * @param {string} deployDir directory of deploy files * @param {string} [templateName] name of the template used to built defintion (prior applying templating) @@ -350,28 +304,19 @@ class MobileKeyword extends MetadataType { } /** * Delete a metadata item from the specified business unit - * - * @param {string} key Identifier of item + * @param {string} id Identifier of item * @returns {Promise.} deletion success status */ - static async deleteByKey(key) { - // get id from cache - const { metadata } = await this.retrieveForCache(key); - if (!metadata[key]) { - Util.logger.error(`Could not find ${this.definition.type} with key ${key}.`); - return false; - } - const id = metadata[key][this.definition.idField]; + static async deleteByKey(id) { // execute delete Util.logger.info( - ' - Note: As long as the provided API key once existed, you will not see an error even if the mobileKeyword is already deleted.' + ' - Note: As long as the provided API id once existed, you will not see an error even if the mobileKeyword is already deleted.' ); - return super.deleteByKeyREST('/legacy/v1/beta/mobile/keyword/' + id, key, false); + return super.deleteByKeyREST('/legacy/v1/beta/mobile/keyword/' + id, id, false); } /** * clean up after deleting a metadata item - * * @param {string} customerKey Identifier of metadata item * @returns {void} */ @@ -383,7 +328,6 @@ class MobileKeyword extends MetadataType { /** * should return only the json for all but asset, query and script that are saved as multiple files * additionally, the documentation for dataExtension and automation should be returned - * * @param {string[]} keyArr customerkey of the metadata * @returns {string[]} list of all files that need to be committed in a flat array ['path/file1.ext', 'path/file2.ext'] */ diff --git a/lib/metadataTypes/definitions/MobileKeyword.definition.js b/lib/metadataTypes/definitions/MobileKeyword.definition.js index 3f4ebd663..9d95d23b4 100644 --- a/lib/metadataTypes/definitions/MobileKeyword.definition.js +++ b/lib/metadataTypes/definitions/MobileKeyword.definition.js @@ -4,7 +4,7 @@ module.exports = { hasExtended: false, idField: 'id', keyIsFixed: false, - keyField: 'keyword', + keyField: 'id', nameField: 'keyword', createdDateField: 'createdDate', createdNameField: 'createdBy.name', From 5844061fae77199b5a3faff192d262d4d65593d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Berkefeld?= Date: Fri, 12 May 2023 10:05:38 +0200 Subject: [PATCH 04/73] #0: correct eslint jsdoc/tag-lines setting to match existing code after lib update --- .eslintrc.json | 1 + 1 file changed, 1 insertion(+) diff --git a/.eslintrc.json b/.eslintrc.json index c888eb659..355ff1839 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -84,6 +84,7 @@ } } ], + "jsdoc/tag-lines": ["warn", "any", { "startLines": 1 }], "spaced-comment": ["warn", "always", { "block": { "exceptions": ["*"], "balanced": true } }] }, "overrides": [ From 154568c9b3ba5250c2b5284f1778443d0f5eb7c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Berkefeld?= Date: Mon, 15 May 2023 15:26:07 +0200 Subject: [PATCH 05/73] #906: ensure explainTypes cli output is valid json with double quotes --- lib/util/cli.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/util/cli.js b/lib/util/cli.js index 0aa2d098c..a18927798 100644 --- a/lib/util/cli.js +++ b/lib/util/cli.js @@ -570,7 +570,7 @@ const Cli = { } if (Util.OPTIONS.json) { if (Util.OPTIONS.loggerLevel !== 'error') { - console.log(json); // eslint-disable-line no-console + console.log(JSON.stringify(json, null, 2)); // eslint-disable-line no-console } return json; } From 45e3459110a60c53eee461cf76787915b63ba559 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 May 2023 14:45:43 +0000 Subject: [PATCH 06/73] Bump simple-git from 3.16.0 to 3.18.0 Bumps [simple-git](https://github.com/steveukx/git-js/tree/HEAD/simple-git) from 3.16.0 to 3.18.0. - [Release notes](https://github.com/steveukx/git-js/releases) - [Changelog](https://github.com/steveukx/git-js/blob/main/simple-git/CHANGELOG.md) - [Commits](https://github.com/steveukx/git-js/commits/simple-git@3.18.0/simple-git) --- updated-dependencies: - dependency-name: simple-git dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index bd5167255..87c02702e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,7 +24,7 @@ "prettier-plugin-sql": "0.14.0", "semver": "7.5.0", "sfmc-sdk": "1.0.0", - "simple-git": "3.16.0", + "simple-git": "3.18.0", "toposort": "2.0.2", "update-notifier": "5.1.0", "winston": "3.8.2", @@ -8740,9 +8740,9 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, "node_modules/simple-git": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.16.0.tgz", - "integrity": "sha512-zuWYsOLEhbJRWVxpjdiXl6eyAyGo/KzVW+KFhhw9MqEEJttcq+32jTWSGyxTdf9e/YCohxRE+9xpWFj9FdiJNw==", + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.18.0.tgz", + "integrity": "sha512-Yt0GJ5aYrpPci3JyrYcsPz8Xc05Hi4JPSOb+Sgn/BmPX35fn/6Fp9Mef8eMBCrL2siY5w4j49TA5Q+bxPpri1Q==", "dependencies": { "@kwsites/file-exists": "^1.1.1", "@kwsites/promise-deferred": "^1.1.1", @@ -16389,9 +16389,9 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, "simple-git": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.16.0.tgz", - "integrity": "sha512-zuWYsOLEhbJRWVxpjdiXl6eyAyGo/KzVW+KFhhw9MqEEJttcq+32jTWSGyxTdf9e/YCohxRE+9xpWFj9FdiJNw==", + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.18.0.tgz", + "integrity": "sha512-Yt0GJ5aYrpPci3JyrYcsPz8Xc05Hi4JPSOb+Sgn/BmPX35fn/6Fp9Mef8eMBCrL2siY5w4j49TA5Q+bxPpri1Q==", "requires": { "@kwsites/file-exists": "^1.1.1", "@kwsites/promise-deferred": "^1.1.1", diff --git a/package.json b/package.json index fbfe1fef7..c179eb8c1 100644 --- a/package.json +++ b/package.json @@ -73,7 +73,7 @@ "prettier-plugin-sql": "0.14.0", "semver": "7.5.0", "sfmc-sdk": "1.0.0", - "simple-git": "3.16.0", + "simple-git": "3.18.0", "toposort": "2.0.2", "update-notifier": "5.1.0", "winston": "3.8.2", From 9a7be1a8254df0e12d2551f2d036f0c9908e43fb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 May 2023 14:55:30 +0000 Subject: [PATCH 07/73] Bump lint-staged from 13.2.0 to 13.2.2 Bumps [lint-staged](https://github.com/okonet/lint-staged) from 13.2.0 to 13.2.2. - [Release notes](https://github.com/okonet/lint-staged/releases) - [Commits](https://github.com/okonet/lint-staged/compare/v13.2.0...v13.2.2) --- updated-dependencies: - dependency-name: lint-staged dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 18 +++++++++--------- package.json | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index 87c02702e..41a35a8fc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -48,7 +48,7 @@ "fast-xml-parser": "4.2.2", "husky": "8.0.3", "jsdoc-to-markdown": "8.0.0", - "lint-staged": "13.2.0", + "lint-staged": "13.2.2", "mocha": "10.2.0", "mock-fs": "5.2.0", "npm-check": "6.0.1", @@ -5682,9 +5682,9 @@ } }, "node_modules/lint-staged": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.0.tgz", - "integrity": "sha512-GbyK5iWinax5Dfw5obm2g2ccUiZXNGtAS4mCbJ0Lv4rq6iEtfBSjOYdcbOtAIFtM114t0vdpViDDetjVTSd8Vw==", + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.2.tgz", + "integrity": "sha512-71gSwXKy649VrSU09s10uAT0rWCcY3aewhMaHyl2N84oBk4Xs9HgxvUp3AYu+bNsK4NrOYYxvSgg7FyGJ+jGcA==", "dev": true, "dependencies": { "chalk": "5.2.0", @@ -5699,7 +5699,7 @@ "object-inspect": "^1.12.3", "pidtree": "^0.6.0", "string-argv": "^0.3.1", - "yaml": "^2.2.1" + "yaml": "^2.2.2" }, "bin": { "lint-staged": "bin/lint-staged.js" @@ -14090,9 +14090,9 @@ } }, "lint-staged": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.0.tgz", - "integrity": "sha512-GbyK5iWinax5Dfw5obm2g2ccUiZXNGtAS4mCbJ0Lv4rq6iEtfBSjOYdcbOtAIFtM114t0vdpViDDetjVTSd8Vw==", + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.2.tgz", + "integrity": "sha512-71gSwXKy649VrSU09s10uAT0rWCcY3aewhMaHyl2N84oBk4Xs9HgxvUp3AYu+bNsK4NrOYYxvSgg7FyGJ+jGcA==", "dev": true, "requires": { "chalk": "5.2.0", @@ -14107,7 +14107,7 @@ "object-inspect": "^1.12.3", "pidtree": "^0.6.0", "string-argv": "^0.3.1", - "yaml": "^2.2.1" + "yaml": "^2.2.2" }, "dependencies": { "chalk": { diff --git a/package.json b/package.json index c179eb8c1..d4efb3adb 100644 --- a/package.json +++ b/package.json @@ -94,7 +94,7 @@ "fast-xml-parser": "4.2.2", "husky": "8.0.3", "jsdoc-to-markdown": "8.0.0", - "lint-staged": "13.2.0", + "lint-staged": "13.2.2", "mocha": "10.2.0", "mock-fs": "5.2.0", "npm-check": "6.0.1", From 21d9ff7bd6157eca2af31837cf91da74a250425c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 May 2023 14:58:03 +0000 Subject: [PATCH 08/73] Bump deep-equal from 2.1.0 to 2.2.1 Bumps [deep-equal](https://github.com/inspect-js/node-deep-equal) from 2.1.0 to 2.2.1. - [Changelog](https://github.com/inspect-js/node-deep-equal/blob/master/CHANGELOG.md) - [Commits](https://github.com/inspect-js/node-deep-equal/compare/v2.1.0...v2.2.1) --- updated-dependencies: - dependency-name: deep-equal dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 215 ++++++++++++++++++++++++++++++++-------------- package.json | 2 +- 2 files changed, 151 insertions(+), 66 deletions(-) diff --git a/package-lock.json b/package-lock.json index 41a35a8fc..0057e87c5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,7 @@ "command-exists": "1.2.9", "conf": "10.2.0", "console.table": "0.10.0", - "deep-equal": "2.1.0", + "deep-equal": "2.2.1", "fs-extra": "11.1.0", "inquirer": "8.2.5", "json-to-table": "4.2.1", @@ -1340,6 +1340,18 @@ "node": ">=12.17" } }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array-differ": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", @@ -2642,25 +2654,28 @@ } }, "node_modules/deep-equal": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.1.0.tgz", - "integrity": "sha512-2pxgvWu3Alv1PoWEyVg7HS8YhGlUFUV7N5oOvfL6d+7xAmLSemMwv/c8Zv/i9KFzxV5Kt5CAvQc70fLwVuf4UA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.1.tgz", + "integrity": "sha512-lKdkdV6EOGoVn65XaOsPdH4rMxTZOnmFyuIkMjM1i5HHCbfjC97dawgTAy0deYNfuqUqW+Q5VrVaQYtUpSd6yQ==", "dependencies": { + "array-buffer-byte-length": "^1.0.0", "call-bind": "^1.0.2", - "es-get-iterator": "^1.1.2", - "get-intrinsic": "^1.1.3", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.0", "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", "is-date-object": "^1.0.5", "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", "isarray": "^2.0.5", "object-is": "^1.1.5", "object-keys": "^1.1.1", "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", + "regexp.prototype.flags": "^1.5.0", "side-channel": "^1.0.4", "which-boxed-primitive": "^1.0.2", "which-collection": "^1.0.1", - "which-typed-array": "^1.1.8" + "which-typed-array": "^1.1.9" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2718,9 +2733,9 @@ "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" }, "node_modules/define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", "dependencies": { "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" @@ -3047,18 +3062,19 @@ } }, "node_modules/es-get-iterator": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.2.tgz", - "integrity": "sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", "dependencies": { "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.0", - "has-symbols": "^1.0.1", - "is-arguments": "^1.1.0", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", "is-map": "^2.0.2", "is-set": "^2.0.2", - "is-string": "^1.0.5", - "isarray": "^2.0.5" + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4112,12 +4128,13 @@ } }, "node_modules/get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3" }, "funding": { @@ -4440,6 +4457,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -4768,12 +4796,11 @@ } }, "node_modules/internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", - "dev": true, + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", "dependencies": { - "get-intrinsic": "^1.1.0", + "get-intrinsic": "^1.2.0", "has": "^1.0.3", "side-channel": "^1.0.4" }, @@ -4805,6 +4832,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -5134,7 +5174,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, "dependencies": { "call-bind": "^1.0.2" }, @@ -8304,13 +8343,13 @@ } }, "node_modules/regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" @@ -8939,6 +8978,17 @@ "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", "dev": true }, + "node_modules/stop-iteration-iterator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", + "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "dependencies": { + "internal-slot": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/stream-connect": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/stream-connect/-/stream-connect-1.0.2.tgz", @@ -10903,6 +10953,15 @@ "integrity": "sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==", "dev": true }, + "array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "requires": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + } + }, "array-differ": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", @@ -11870,25 +11929,28 @@ } }, "deep-equal": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.1.0.tgz", - "integrity": "sha512-2pxgvWu3Alv1PoWEyVg7HS8YhGlUFUV7N5oOvfL6d+7xAmLSemMwv/c8Zv/i9KFzxV5Kt5CAvQc70fLwVuf4UA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.1.tgz", + "integrity": "sha512-lKdkdV6EOGoVn65XaOsPdH4rMxTZOnmFyuIkMjM1i5HHCbfjC97dawgTAy0deYNfuqUqW+Q5VrVaQYtUpSd6yQ==", "requires": { + "array-buffer-byte-length": "^1.0.0", "call-bind": "^1.0.2", - "es-get-iterator": "^1.1.2", - "get-intrinsic": "^1.1.3", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.0", "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", "is-date-object": "^1.0.5", "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", "isarray": "^2.0.5", "object-is": "^1.1.5", "object-keys": "^1.1.1", "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", + "regexp.prototype.flags": "^1.5.0", "side-channel": "^1.0.4", "which-boxed-primitive": "^1.0.2", "which-collection": "^1.0.1", - "which-typed-array": "^1.1.8" + "which-typed-array": "^1.1.9" } }, "deep-extend": { @@ -11933,9 +11995,9 @@ "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" }, "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", "requires": { "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" @@ -12203,18 +12265,19 @@ } }, "es-get-iterator": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.2.tgz", - "integrity": "sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", "requires": { "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.0", - "has-symbols": "^1.0.1", - "is-arguments": "^1.1.0", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", "is-map": "^2.0.2", "is-set": "^2.0.2", - "is-string": "^1.0.5", - "isarray": "^2.0.5" + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" } }, "es-to-primitive": { @@ -12954,12 +13017,13 @@ "dev": true }, "get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3" } }, @@ -13192,6 +13256,11 @@ "get-intrinsic": "^1.1.1" } }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, "has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -13432,12 +13501,11 @@ } }, "internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", - "dev": true, + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", "requires": { - "get-intrinsic": "^1.1.0", + "get-intrinsic": "^1.2.0", "has": "^1.0.3", "side-channel": "^1.0.4" } @@ -13460,6 +13528,16 @@ "has-tostringtag": "^1.0.0" } }, + "is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + } + }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -13661,7 +13739,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, "requires": { "call-bind": "^1.0.2" } @@ -16074,13 +16151,13 @@ "dev": true }, "regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" } }, "registry-auth-token": { @@ -16551,6 +16628,14 @@ "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", "dev": true }, + "stop-iteration-iterator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", + "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "requires": { + "internal-slot": "^1.0.4" + } + }, "stream-connect": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/stream-connect/-/stream-connect-1.0.2.tgz", diff --git a/package.json b/package.json index d4efb3adb..259396128 100644 --- a/package.json +++ b/package.json @@ -63,7 +63,7 @@ "command-exists": "1.2.9", "conf": "10.2.0", "console.table": "0.10.0", - "deep-equal": "2.1.0", + "deep-equal": "2.2.1", "fs-extra": "11.1.0", "inquirer": "8.2.5", "json-to-table": "4.2.1", From ca0097a5baffc33134290010b66e04252db2fd5e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 May 2023 15:44:06 +0000 Subject: [PATCH 09/73] Bump eslint-plugin-jsdoc from 43.1.1 to 44.2.4 Bumps [eslint-plugin-jsdoc](https://github.com/gajus/eslint-plugin-jsdoc) from 43.1.1 to 44.2.4. - [Release notes](https://github.com/gajus/eslint-plugin-jsdoc/releases) - [Changelog](https://github.com/gajus/eslint-plugin-jsdoc/blob/main/.releaserc) - [Commits](https://github.com/gajus/eslint-plugin-jsdoc/compare/v43.1.1...v44.2.4) --- updated-dependencies: - dependency-name: eslint-plugin-jsdoc dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- package-lock.json | 62 +++++++++++++++++++++++++++++++++-------------- package.json | 2 +- 2 files changed, 45 insertions(+), 19 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0057e87c5..e5fd4bc18 100644 --- a/package-lock.json +++ b/package-lock.json @@ -41,7 +41,7 @@ "eslint": "8.39.0", "eslint-config-prettier": "8.7.0", "eslint-config-ssjs": "1.1.11", - "eslint-plugin-jsdoc": "43.1.1", + "eslint-plugin-jsdoc": "44.2.4", "eslint-plugin-mocha": "10.1.0", "eslint-plugin-prettier": "4.2.1", "eslint-plugin-unicorn": "46.0.0", @@ -507,9 +507,9 @@ } }, "node_modules/@es-joy/jsdoccomment": { - "version": "0.37.1", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.37.1.tgz", - "integrity": "sha512-5vxWJ1gEkEF0yRd0O+uK6dHJf7adrxwQSX8PuRiPfFSAbNLnY0ZJfXaZucoz14Jj2N11xn2DnlEPwWRpYpvRjg==", + "version": "0.39.4", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.39.4.tgz", + "integrity": "sha512-Jvw915fjqQct445+yron7Dufix9A+m9j1fCJYlCo1FWlRvTxa3pjJelxdSTdaLWcTwRU6vbL+NYjO4YuNIS5Qg==", "dev": true, "dependencies": { "comment-parser": "1.3.1", @@ -517,7 +517,7 @@ "jsdoc-type-pratt-parser": "~4.0.0" }, "engines": { - "node": "^14 || ^16 || ^17 || ^18 || ^19 || ^20" + "node": ">=16" } }, "node_modules/@eslint-community/eslint-utils": { @@ -3222,18 +3222,18 @@ } }, "node_modules/eslint-plugin-jsdoc": { - "version": "43.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-43.1.1.tgz", - "integrity": "sha512-J2kjjsJ5vBXSyNzqJhceeSGTAgVgZHcPSJKo3vD4tNjUdfky98rR2VfZUDsS1GKL6isyVa8GWvr+Az7Vyg2HXA==", + "version": "44.2.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-44.2.4.tgz", + "integrity": "sha512-/EMMxCyRh1SywhCb66gAqoGX4Yv6Xzc4bsSkF1AiY2o2+bQmGMQ05QZ5+JjHbdFTPDZY9pfn+DsSNP0a5yQpIg==", "dev": true, "dependencies": { - "@es-joy/jsdoccomment": "~0.37.1", + "@es-joy/jsdoccomment": "~0.39.3", "are-docs-informative": "^0.0.2", "comment-parser": "1.3.1", "debug": "^4.3.4", "escape-string-regexp": "^4.0.0", "esquery": "^1.5.0", - "semver": "^7.5.0", + "semver": "^7.5.1", "spdx-expression-parse": "^3.0.1" }, "engines": { @@ -3243,6 +3243,21 @@ "eslint": "^7.0.0 || ^8.0.0" } }, + "node_modules/eslint-plugin-jsdoc/node_modules/semver": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/eslint-plugin-mocha": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.1.0.tgz", @@ -10318,9 +10333,9 @@ } }, "@es-joy/jsdoccomment": { - "version": "0.37.1", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.37.1.tgz", - "integrity": "sha512-5vxWJ1gEkEF0yRd0O+uK6dHJf7adrxwQSX8PuRiPfFSAbNLnY0ZJfXaZucoz14Jj2N11xn2DnlEPwWRpYpvRjg==", + "version": "0.39.4", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.39.4.tgz", + "integrity": "sha512-Jvw915fjqQct445+yron7Dufix9A+m9j1fCJYlCo1FWlRvTxa3pjJelxdSTdaLWcTwRU6vbL+NYjO4YuNIS5Qg==", "dev": true, "requires": { "comment-parser": "1.3.1", @@ -12402,19 +12417,30 @@ "requires": {} }, "eslint-plugin-jsdoc": { - "version": "43.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-43.1.1.tgz", - "integrity": "sha512-J2kjjsJ5vBXSyNzqJhceeSGTAgVgZHcPSJKo3vD4tNjUdfky98rR2VfZUDsS1GKL6isyVa8GWvr+Az7Vyg2HXA==", + "version": "44.2.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-44.2.4.tgz", + "integrity": "sha512-/EMMxCyRh1SywhCb66gAqoGX4Yv6Xzc4bsSkF1AiY2o2+bQmGMQ05QZ5+JjHbdFTPDZY9pfn+DsSNP0a5yQpIg==", "dev": true, "requires": { - "@es-joy/jsdoccomment": "~0.37.1", + "@es-joy/jsdoccomment": "~0.39.3", "are-docs-informative": "^0.0.2", "comment-parser": "1.3.1", "debug": "^4.3.4", "escape-string-regexp": "^4.0.0", "esquery": "^1.5.0", - "semver": "^7.5.0", + "semver": "^7.5.1", "spdx-expression-parse": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } } }, "eslint-plugin-mocha": { diff --git a/package.json b/package.json index 259396128..c06aca5d2 100644 --- a/package.json +++ b/package.json @@ -87,7 +87,7 @@ "eslint": "8.39.0", "eslint-config-prettier": "8.7.0", "eslint-config-ssjs": "1.1.11", - "eslint-plugin-jsdoc": "43.1.1", + "eslint-plugin-jsdoc": "44.2.4", "eslint-plugin-mocha": "10.1.0", "eslint-plugin-prettier": "4.2.1", "eslint-plugin-unicorn": "46.0.0", From a0e7e60b52c1c82ff8c0205dfff96587c7a197ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Berkefeld?= Date: Wed, 17 May 2023 10:10:33 +0200 Subject: [PATCH 10/73] #912: run npm install on git checkout, merge if necessary and always on git clone --- .husky/post-checkout | 23 ++++++++++++++++++++++- .husky/post-merge | 18 ++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 .husky/post-merge diff --git a/.husky/post-checkout b/.husky/post-checkout index 0f7e57076..c36fb670c 100644 --- a/.husky/post-checkout +++ b/.husky/post-checkout @@ -1,5 +1,26 @@ #!/bin/sh +# ### git commit message template ### git config commit.template .git/templatemessage TICKETID=`git rev-parse --abbrev-ref HEAD | LC_ALL=en_US.utf8 grep -oP '((feature|bug|bugfix|fix|hotfix|task|chore)\/)\K\d{1,7}'` echo "[POST_CHECKOUT] Setting template commit to $TICKETID" -echo "#$TICKETID: " > ".git/templatemessage" \ No newline at end of file +echo "#$TICKETID: " > ".git/templatemessage" + + + +# ### run npm install ### +. "$(dirname "$0")/_/husky.sh" + +IFS=$'\n' +# regex supports mono-repos with a package.json at root-level and at package-level +PACKAGE_LOCK_REGEX="(^packages\/.*\/package-lock\.json)|(^package-lock\.json)" +# extract all paths to package-lock.json files +PACKAGES=("$(git diff --name-only HEAD@{1} HEAD | grep -E "$PACKAGE_LOCK_REGEX")") + +if [[ ${PACKAGES[@]} ]]; then + for package in $PACKAGES; do + echo "[POST-CHECKOUT]" + echo "📦 $package was changed. Running npm install to update your dependencies..." + DIR=$(dirname package) + cd "$DIR" && npm install + done +fi \ No newline at end of file diff --git a/.husky/post-merge b/.husky/post-merge new file mode 100644 index 000000000..59a890ea9 --- /dev/null +++ b/.husky/post-merge @@ -0,0 +1,18 @@ +#!/bin/sh +# ### run npm install ### +. "$(dirname "$0")/_/husky.sh" + +IFS=$'\n' +# regex supports mono-repos with a package.json at root-level and at package-level +PACKAGE_LOCK_REGEX="(^packages\/.*\/package-lock\.json)|(^package-lock\.json)" +# extract all paths to package-lock.json files +PACKAGES=("$(git diff --name-only HEAD@{1} HEAD | grep -E "$PACKAGE_LOCK_REGEX")") + +if [[ ${PACKAGES[@]} ]]; then + for package in $PACKAGES; do + echo "[POST-MERGE]" + echo "📦 $package was changed. Running npm install to update your dependencies..." + DIR=$(dirname package) + cd "$DIR" && npm install + done +fi \ No newline at end of file From 5d9afc91f87c007db802b3fb7489a52b6b506054 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Berkefeld?= Date: Wed, 17 May 2023 10:15:18 +0200 Subject: [PATCH 11/73] #912: enable debugging temporarily --- .husky/post-checkout | 2 +- .husky/post-merge | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.husky/post-checkout b/.husky/post-checkout index c36fb670c..43c4b0df5 100644 --- a/.husky/post-checkout +++ b/.husky/post-checkout @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/sh -xv # ### git commit message template ### git config commit.template .git/templatemessage TICKETID=`git rev-parse --abbrev-ref HEAD | LC_ALL=en_US.utf8 grep -oP '((feature|bug|bugfix|fix|hotfix|task|chore)\/)\K\d{1,7}'` diff --git a/.husky/post-merge b/.husky/post-merge index 59a890ea9..258dedaa7 100644 --- a/.husky/post-merge +++ b/.husky/post-merge @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/sh -xv # ### run npm install ### . "$(dirname "$0")/_/husky.sh" From ab4be953cf6530f4aacb0290c5a2a123992be377 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Berkefeld?= Date: Wed, 17 May 2023 10:21:01 +0200 Subject: [PATCH 12/73] #912: refactoring --- .husky/post-checkout | 3 ++- .husky/pre-commit | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.husky/post-checkout b/.husky/post-checkout index 43c4b0df5..bd2d54bdd 100644 --- a/.husky/post-checkout +++ b/.husky/post-checkout @@ -1,4 +1,6 @@ #!/bin/sh -xv +. "$(dirname "$0")/_/husky.sh" + # ### git commit message template ### git config commit.template .git/templatemessage TICKETID=`git rev-parse --abbrev-ref HEAD | LC_ALL=en_US.utf8 grep -oP '((feature|bug|bugfix|fix|hotfix|task|chore)\/)\K\d{1,7}'` @@ -8,7 +10,6 @@ echo "#$TICKETID: " > ".git/templatemessage" # ### run npm install ### -. "$(dirname "$0")/_/husky.sh" IFS=$'\n' # regex supports mono-repos with a package.json at root-level and at package-level diff --git a/.husky/pre-commit b/.husky/pre-commit index d10908f8f..287490035 100644 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,5 +1,6 @@ #!/bin/sh . "$(dirname "$0")/_/husky.sh" + npm run docs git update-index --add docs/dist/documentation.md npx --no lint-staged From 1e418cb0c0e92afc9160b7ccd4349750dbb5dc28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Berkefeld?= Date: Wed, 17 May 2023 10:24:08 +0200 Subject: [PATCH 13/73] #912: debug msgs --- .husky/post-checkout | 5 ++++- .husky/post-merge | 4 ++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/.husky/post-checkout b/.husky/post-checkout index bd2d54bdd..7a59d5238 100644 --- a/.husky/post-checkout +++ b/.husky/post-checkout @@ -10,12 +10,15 @@ echo "#$TICKETID: " > ".git/templatemessage" # ### run npm install ### - +echo "[POST-CHECKOUT-1]" IFS=$'\n' +echo "[POST-CHECKOUT-2]" # regex supports mono-repos with a package.json at root-level and at package-level PACKAGE_LOCK_REGEX="(^packages\/.*\/package-lock\.json)|(^package-lock\.json)" +echo "[POST-CHECKOUT-3]" # extract all paths to package-lock.json files PACKAGES=("$(git diff --name-only HEAD@{1} HEAD | grep -E "$PACKAGE_LOCK_REGEX")") +echo "[POST-CHECKOUT-4]" if [[ ${PACKAGES[@]} ]]; then for package in $PACKAGES; do diff --git a/.husky/post-merge b/.husky/post-merge index 258dedaa7..2c6ae4041 100644 --- a/.husky/post-merge +++ b/.husky/post-merge @@ -1,12 +1,16 @@ #!/bin/sh -xv # ### run npm install ### . "$(dirname "$0")/_/husky.sh" +echo "[POST-MERGE-1]" IFS=$'\n' +echo "[POST-MERGE-2]" # regex supports mono-repos with a package.json at root-level and at package-level PACKAGE_LOCK_REGEX="(^packages\/.*\/package-lock\.json)|(^package-lock\.json)" +echo "[POST-MERGE-3]" # extract all paths to package-lock.json files PACKAGES=("$(git diff --name-only HEAD@{1} HEAD | grep -E "$PACKAGE_LOCK_REGEX")") +echo "[POST-MERGE-4]" if [[ ${PACKAGES[@]} ]]; then for package in $PACKAGES; do From cd43d9b7b3cb749e5f1a964bf6511549c4e9116a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Berkefeld?= Date: Wed, 17 May 2023 10:30:24 +0200 Subject: [PATCH 14/73] #912: attempt at fixing error --- .husky/post-checkout | 7 ++++--- .husky/post-merge | 7 ++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/.husky/post-checkout b/.husky/post-checkout index 7a59d5238..6b5666379 100644 --- a/.husky/post-checkout +++ b/.husky/post-checkout @@ -17,14 +17,15 @@ echo "[POST-CHECKOUT-2]" PACKAGE_LOCK_REGEX="(^packages\/.*\/package-lock\.json)|(^package-lock\.json)" echo "[POST-CHECKOUT-3]" # extract all paths to package-lock.json files -PACKAGES=("$(git diff --name-only HEAD@{1} HEAD | grep -E "$PACKAGE_LOCK_REGEX")") +PACKAGES=("git diff --name-only HEAD@{1} HEAD | grep -E "$PACKAGE_LOCK_REGEX) echo "[POST-CHECKOUT-4]" if [[ ${PACKAGES[@]} ]]; then for package in $PACKAGES; do echo "[POST-CHECKOUT]" echo "📦 $package was changed. Running npm install to update your dependencies..." - DIR=$(dirname package) - cd "$DIR" && npm install + # DIR=$(dirname package) + # cd "$DIR" && npm install done + npm install fi \ No newline at end of file diff --git a/.husky/post-merge b/.husky/post-merge index 2c6ae4041..0b8fc38af 100644 --- a/.husky/post-merge +++ b/.husky/post-merge @@ -9,14 +9,15 @@ echo "[POST-MERGE-2]" PACKAGE_LOCK_REGEX="(^packages\/.*\/package-lock\.json)|(^package-lock\.json)" echo "[POST-MERGE-3]" # extract all paths to package-lock.json files -PACKAGES=("$(git diff --name-only HEAD@{1} HEAD | grep -E "$PACKAGE_LOCK_REGEX")") +PACKAGES=("git diff --name-only HEAD@{1} HEAD | grep -E "$PACKAGE_LOCK_REGEX) echo "[POST-MERGE-4]" if [[ ${PACKAGES[@]} ]]; then for package in $PACKAGES; do echo "[POST-MERGE]" echo "📦 $package was changed. Running npm install to update your dependencies..." - DIR=$(dirname package) - cd "$DIR" && npm install + # DIR=$(dirname package) + # cd "$DIR" && npm install done + npm install fi \ No newline at end of file From 13de337ce0db59403f5c2e06de1a4e8c91c81464 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Berkefeld?= Date: Wed, 17 May 2023 10:34:34 +0200 Subject: [PATCH 15/73] #912: improve log output for when no updates are required --- .husky/post-checkout | 4 +++- .husky/post-merge | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/.husky/post-checkout b/.husky/post-checkout index 6b5666379..fb2e737e3 100644 --- a/.husky/post-checkout +++ b/.husky/post-checkout @@ -1,4 +1,4 @@ -#!/bin/sh -xv +#!/bin/sh . "$(dirname "$0")/_/husky.sh" # ### git commit message template ### @@ -28,4 +28,6 @@ if [[ ${PACKAGES[@]} ]]; then # cd "$DIR" && npm install done npm install +else + echo "📦 All packages up-to-date. No need to run npm install." fi \ No newline at end of file diff --git a/.husky/post-merge b/.husky/post-merge index 0b8fc38af..f100a1f19 100644 --- a/.husky/post-merge +++ b/.husky/post-merge @@ -1,4 +1,4 @@ -#!/bin/sh -xv +#!/bin/sh # ### run npm install ### . "$(dirname "$0")/_/husky.sh" echo "[POST-MERGE-1]" @@ -20,4 +20,6 @@ if [[ ${PACKAGES[@]} ]]; then # cd "$DIR" && npm install done npm install +else + echo "📦 All packages up-to-date. No need to run npm install." fi \ No newline at end of file From 3c42ae4fd596df21b8c1ec2eb8fc847712ba7797 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Berkefeld?= Date: Wed, 17 May 2023 10:39:08 +0200 Subject: [PATCH 16/73] #912: improve hook logs --- .husky/post-checkout | 4 +--- .husky/post-merge | 4 +--- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/.husky/post-checkout b/.husky/post-checkout index fb2e737e3..6dbe27606 100644 --- a/.husky/post-checkout +++ b/.husky/post-checkout @@ -10,12 +10,9 @@ echo "#$TICKETID: " > ".git/templatemessage" # ### run npm install ### -echo "[POST-CHECKOUT-1]" IFS=$'\n' -echo "[POST-CHECKOUT-2]" # regex supports mono-repos with a package.json at root-level and at package-level PACKAGE_LOCK_REGEX="(^packages\/.*\/package-lock\.json)|(^package-lock\.json)" -echo "[POST-CHECKOUT-3]" # extract all paths to package-lock.json files PACKAGES=("git diff --name-only HEAD@{1} HEAD | grep -E "$PACKAGE_LOCK_REGEX) echo "[POST-CHECKOUT-4]" @@ -27,6 +24,7 @@ if [[ ${PACKAGES[@]} ]]; then # DIR=$(dirname package) # cd "$DIR" && npm install done + echo "[POST-MERGE] Running npm install to update your dependencies..." npm install else echo "📦 All packages up-to-date. No need to run npm install." diff --git a/.husky/post-merge b/.husky/post-merge index f100a1f19..442bfd86f 100644 --- a/.husky/post-merge +++ b/.husky/post-merge @@ -1,13 +1,10 @@ #!/bin/sh # ### run npm install ### . "$(dirname "$0")/_/husky.sh" -echo "[POST-MERGE-1]" IFS=$'\n' -echo "[POST-MERGE-2]" # regex supports mono-repos with a package.json at root-level and at package-level PACKAGE_LOCK_REGEX="(^packages\/.*\/package-lock\.json)|(^package-lock\.json)" -echo "[POST-MERGE-3]" # extract all paths to package-lock.json files PACKAGES=("git diff --name-only HEAD@{1} HEAD | grep -E "$PACKAGE_LOCK_REGEX) echo "[POST-MERGE-4]" @@ -19,6 +16,7 @@ if [[ ${PACKAGES[@]} ]]; then # DIR=$(dirname package) # cd "$DIR" && npm install done + echo "[POST-MERGE] Running npm install to update your dependencies..." npm install else echo "📦 All packages up-to-date. No need to run npm install." From 48a19daa0febfa66947d63d2a46f762f83f66d0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Berkefeld?= Date: Wed, 17 May 2023 11:18:38 +0200 Subject: [PATCH 17/73] #912: fix call to git diff --- .husky/post-checkout | 11 ++--------- .husky/post-merge | 10 ++-------- 2 files changed, 4 insertions(+), 17 deletions(-) diff --git a/.husky/post-checkout b/.husky/post-checkout index fb2e737e3..c27bff3c5 100644 --- a/.husky/post-checkout +++ b/.husky/post-checkout @@ -10,24 +10,17 @@ echo "#$TICKETID: " > ".git/templatemessage" # ### run npm install ### -echo "[POST-CHECKOUT-1]" IFS=$'\n' -echo "[POST-CHECKOUT-2]" -# regex supports mono-repos with a package.json at root-level and at package-level -PACKAGE_LOCK_REGEX="(^packages\/.*\/package-lock\.json)|(^package-lock\.json)" -echo "[POST-CHECKOUT-3]" # extract all paths to package-lock.json files -PACKAGES=("git diff --name-only HEAD@{1} HEAD | grep -E "$PACKAGE_LOCK_REGEX) +PACKAGES=`git diff --name-only HEAD^1 HEAD | grep -E '(^package-lock\.json)'` echo "[POST-CHECKOUT-4]" if [[ ${PACKAGES[@]} ]]; then for package in $PACKAGES; do echo "[POST-CHECKOUT]" echo "📦 $package was changed. Running npm install to update your dependencies..." - # DIR=$(dirname package) - # cd "$DIR" && npm install + npm install done - npm install else echo "📦 All packages up-to-date. No need to run npm install." fi \ No newline at end of file diff --git a/.husky/post-merge b/.husky/post-merge index f100a1f19..880b8a0ea 100644 --- a/.husky/post-merge +++ b/.husky/post-merge @@ -4,22 +4,16 @@ echo "[POST-MERGE-1]" IFS=$'\n' -echo "[POST-MERGE-2]" -# regex supports mono-repos with a package.json at root-level and at package-level -PACKAGE_LOCK_REGEX="(^packages\/.*\/package-lock\.json)|(^package-lock\.json)" -echo "[POST-MERGE-3]" # extract all paths to package-lock.json files -PACKAGES=("git diff --name-only HEAD@{1} HEAD | grep -E "$PACKAGE_LOCK_REGEX) +PACKAGES=`git diff --name-only HEAD^1 HEAD | grep -E '(^package-lock\.json)'` echo "[POST-MERGE-4]" if [[ ${PACKAGES[@]} ]]; then for package in $PACKAGES; do echo "[POST-MERGE]" echo "📦 $package was changed. Running npm install to update your dependencies..." - # DIR=$(dirname package) - # cd "$DIR" && npm install + npm install done - npm install else echo "📦 All packages up-to-date. No need to run npm install." fi \ No newline at end of file From 16a290c72a95a42416dafca6a94f1ba81edda820 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Berkefeld?= Date: Wed, 17 May 2023 11:20:40 +0200 Subject: [PATCH 18/73] #912: install something for testing purposes --- package-lock.json | 164 ++++++++++++++++++++++++++++++++++++++++++++++ package.json | 1 + 2 files changed, 165 insertions(+) diff --git a/package-lock.json b/package-lock.json index e5fd4bc18..3ec158742 100644 --- a/package-lock.json +++ b/package-lock.json @@ -46,6 +46,7 @@ "eslint-plugin-prettier": "4.2.1", "eslint-plugin-unicorn": "46.0.0", "fast-xml-parser": "4.2.2", + "git-pull-run": "1.4.0", "husky": "8.0.3", "jsdoc-to-markdown": "8.0.0", "lint-staged": "13.2.2", @@ -4193,6 +4194,103 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/git-pull-run": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/git-pull-run/-/git-pull-run-1.4.0.tgz", + "integrity": "sha512-QtH0X318MaJM2EYoGFebjc/NtumkrlN1foNeHLi1pcVjiZlCjqRFQmfGF12l4zdyZMNlebrTCiv/nD/A5wEqew==", + "dev": true, + "dependencies": { + "colorette": "^2.0.19", + "commander": "^8.3.0", + "debug": "^4.3.3", + "execa": "^6.1.0", + "listr2": "^5.0.5", + "micromatch": "^4.0.4" + }, + "bin": { + "git-pull-run": "dist/cli.js" + } + }, + "node_modules/git-pull-run/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/git-pull-run/node_modules/execa": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz", + "integrity": "sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^3.0.1", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/git-pull-run/node_modules/human-signals": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz", + "integrity": "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==", + "dev": true, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/git-pull-run/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/git-pull-run/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/git-pull-run/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/giturl": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/giturl/-/giturl-1.0.1.tgz", @@ -13075,6 +13173,72 @@ "get-intrinsic": "^1.1.1" } }, + "git-pull-run": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/git-pull-run/-/git-pull-run-1.4.0.tgz", + "integrity": "sha512-QtH0X318MaJM2EYoGFebjc/NtumkrlN1foNeHLi1pcVjiZlCjqRFQmfGF12l4zdyZMNlebrTCiv/nD/A5wEqew==", + "dev": true, + "requires": { + "colorette": "^2.0.19", + "commander": "^8.3.0", + "debug": "^4.3.3", + "execa": "^6.1.0", + "listr2": "^5.0.5", + "micromatch": "^4.0.4" + }, + "dependencies": { + "commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true + }, + "execa": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz", + "integrity": "sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^3.0.1", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + } + }, + "human-signals": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz", + "integrity": "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==", + "dev": true + }, + "is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true + }, + "mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true + }, + "onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "requires": { + "mimic-fn": "^4.0.0" + } + } + } + }, "giturl": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/giturl/-/giturl-1.0.1.tgz", diff --git a/package.json b/package.json index c06aca5d2..00552f752 100644 --- a/package.json +++ b/package.json @@ -92,6 +92,7 @@ "eslint-plugin-prettier": "4.2.1", "eslint-plugin-unicorn": "46.0.0", "fast-xml-parser": "4.2.2", + "git-pull-run": "1.4.0", "husky": "8.0.3", "jsdoc-to-markdown": "8.0.0", "lint-staged": "13.2.2", From bf9e4f301c6fa6c7c1f4727059df444850c61859 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Berkefeld?= Date: Wed, 17 May 2023 11:30:15 +0200 Subject: [PATCH 19/73] #912: test --- 912-test.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 912-test.txt diff --git a/912-test.txt b/912-test.txt new file mode 100644 index 000000000..30d74d258 --- /dev/null +++ b/912-test.txt @@ -0,0 +1 @@ +test \ No newline at end of file From 5c279fb876053499698b996b10447a367cd05b95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Berkefeld?= Date: Wed, 17 May 2023 11:38:10 +0200 Subject: [PATCH 20/73] #912: HUSKY_GIT_PARAMS https://typicode.github.io/husky/#manually --- .husky/post-checkout | 2 +- .husky/post-merge | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.husky/post-checkout b/.husky/post-checkout index c27bff3c5..589c869a7 100644 --- a/.husky/post-checkout +++ b/.husky/post-checkout @@ -12,7 +12,7 @@ echo "#$TICKETID: " > ".git/templatemessage" # ### run npm install ### IFS=$'\n' # extract all paths to package-lock.json files -PACKAGES=`git diff --name-only HEAD^1 HEAD | grep -E '(^package-lock\.json)'` +PACKAGES=`git diff --name-only $1 HEAD | grep -E '(^package-lock\.json)'` echo "[POST-CHECKOUT-4]" if [[ ${PACKAGES[@]} ]]; then diff --git a/.husky/post-merge b/.husky/post-merge index ff5dfffc6..c9e3261ae 100644 --- a/.husky/post-merge +++ b/.husky/post-merge @@ -4,7 +4,7 @@ IFS=$'\n' # extract all paths to package-lock.json files -PACKAGES=`git diff --name-only HEAD^1 HEAD | grep -E '(^package-lock\.json)'` +PACKAGES=`git diff --name-only HEAD@{1} HEAD | grep -E '(^package-lock\.json)'` echo "[POST-MERGE-4]" if [[ ${PACKAGES[@]} ]]; then From b2cf57be811cf0f22d619155b7ef0412ff8d9c25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Berkefeld?= Date: Wed, 17 May 2023 13:25:09 +0200 Subject: [PATCH 21/73] #912: test git parameters --- .husky/post-checkout | 7 ++++++- .husky/post-merge | 9 ++++++++- 912-test.txt | 2 +- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/.husky/post-checkout b/.husky/post-checkout index 589c869a7..1ffa019ee 100644 --- a/.husky/post-checkout +++ b/.husky/post-checkout @@ -7,7 +7,12 @@ TICKETID=`git rev-parse --abbrev-ref HEAD | LC_ALL=en_US.utf8 grep -oP '((featur echo "[POST_CHECKOUT] Setting template commit to $TICKETID" echo "#$TICKETID: " > ".git/templatemessage" - +echo "[POST-CHECKOUT-#1]" +echo $1 +echo "[POST-CHECKOUT-#2]" +echo $2 +echo "[POST-CHECKOUT-#3]" +echo $3 # ### run npm install ### IFS=$'\n' diff --git a/.husky/post-merge b/.husky/post-merge index c9e3261ae..0d691d6b6 100644 --- a/.husky/post-merge +++ b/.husky/post-merge @@ -2,9 +2,16 @@ # ### run npm install ### . "$(dirname "$0")/_/husky.sh" +echo "[POST-MERGE-#1]" +echo $1 +echo "[POST-MERGE-#2]" +echo $2 +echo "[POST-MERGE-#3]" +echo $3 + IFS=$'\n' # extract all paths to package-lock.json files -PACKAGES=`git diff --name-only HEAD@{1} HEAD | grep -E '(^package-lock\.json)'` +PACKAGES=`git diff --name-only HEAD^1 HEAD | grep -E '(^package-lock\.json)'` echo "[POST-MERGE-4]" if [[ ${PACKAGES[@]} ]]; then diff --git a/912-test.txt b/912-test.txt index 30d74d258..81403e41b 100644 --- a/912-test.txt +++ b/912-test.txt @@ -1 +1 @@ -test \ No newline at end of file +test 2 \ No newline at end of file From e28f54043220a4c1de4b6256489bd1acbbc9f813 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Berkefeld?= Date: Wed, 17 May 2023 13:41:21 +0200 Subject: [PATCH 22/73] #912: debug info --- .husky/post-checkout | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/.husky/post-checkout b/.husky/post-checkout index 1ffa019ee..14d5d3033 100644 --- a/.husky/post-checkout +++ b/.husky/post-checkout @@ -17,8 +17,14 @@ echo $3 # ### run npm install ### IFS=$'\n' # extract all paths to package-lock.json files -PACKAGES=`git diff --name-only $1 HEAD | grep -E '(^package-lock\.json)'` -echo "[POST-CHECKOUT-4]" +# $1 is the new HEAD pointer +# $2 is the previous HEAD pointer +echo "[POST-CHECKOUT-#4]" +echo "git diff --name-only `$1 $2` | grep -E '(^package-lock\.json)'" +echo "[POST-CHECKOUT-5]" + +PACKAGES=`git diff --name-only `$1 $2` | grep -E '(^package-lock\.json)'` +echo "[POST-CHECKOUT-6]" if [[ ${PACKAGES[@]} ]]; then for package in $PACKAGES; do From c2d21f56f06de58e7dda4daa66250c0eb3687b15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Berkefeld?= Date: Wed, 17 May 2023 13:52:44 +0200 Subject: [PATCH 23/73] #912: fiddle with variables --- .husky/post-checkout | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.husky/post-checkout b/.husky/post-checkout index 14d5d3033..822428819 100644 --- a/.husky/post-checkout +++ b/.husky/post-checkout @@ -20,10 +20,10 @@ IFS=$'\n' # $1 is the new HEAD pointer # $2 is the previous HEAD pointer echo "[POST-CHECKOUT-#4]" -echo "git diff --name-only `$1 $2` | grep -E '(^package-lock\.json)'" +echo "git diff --name-only $1 $2 | grep -E '(^package-lock\.json)'" echo "[POST-CHECKOUT-5]" -PACKAGES=`git diff --name-only `$1 $2` | grep -E '(^package-lock\.json)'` +PACKAGES=`git diff --name-only $1 $2 | grep -E '(^package-lock\.json)'` echo "[POST-CHECKOUT-6]" if [[ ${PACKAGES[@]} ]]; then From 16d12bd271e22a1e0b5dc3a8dcbb4bf3327cb867 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Berkefeld?= Date: Wed, 17 May 2023 15:02:54 +0200 Subject: [PATCH 24/73] #912: turn PACKAGES into an array --- .husky/post-checkout | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.husky/post-checkout b/.husky/post-checkout index 822428819..67b42b9a9 100644 --- a/.husky/post-checkout +++ b/.husky/post-checkout @@ -21,9 +21,8 @@ IFS=$'\n' # $2 is the previous HEAD pointer echo "[POST-CHECKOUT-#4]" echo "git diff --name-only $1 $2 | grep -E '(^package-lock\.json)'" -echo "[POST-CHECKOUT-5]" - -PACKAGES=`git diff --name-only $1 $2 | grep -E '(^package-lock\.json)'` +echo "[POST-CHECKOUT-#5]" +PACKAGES=("git diff --name-only $1 $2 | grep -E '(^package-lock\.json)'") echo "[POST-CHECKOUT-6]" if [[ ${PACKAGES[@]} ]]; then From dee8d3ae5685db5c7a0dcd1dedd1c3a3d86913b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Berkefeld?= Date: Wed, 17 May 2023 15:27:31 +0200 Subject: [PATCH 25/73] #912: fix array --- .husky/post-checkout | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.husky/post-checkout b/.husky/post-checkout index 67b42b9a9..c9f7cc6c5 100644 --- a/.husky/post-checkout +++ b/.husky/post-checkout @@ -22,7 +22,7 @@ IFS=$'\n' echo "[POST-CHECKOUT-#4]" echo "git diff --name-only $1 $2 | grep -E '(^package-lock\.json)'" echo "[POST-CHECKOUT-#5]" -PACKAGES=("git diff --name-only $1 $2 | grep -E '(^package-lock\.json)'") +PACKAGES=("$(git diff --name-only $1 $2 | grep -E '(^package-lock\.json)')") echo "[POST-CHECKOUT-6]" if [[ ${PACKAGES[@]} ]]; then From a7fcc6d8c63c9ce1bc8dc1a4b0412e4ac448b67e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Berkefeld?= Date: Wed, 17 May 2023 16:31:35 +0200 Subject: [PATCH 26/73] #912: fix errorCode 1 when nothing was found --- .husky/post-checkout | 33 ++++++++++++++++----------------- .husky/post-merge | 19 ++++++++----------- 2 files changed, 24 insertions(+), 28 deletions(-) diff --git a/.husky/post-checkout b/.husky/post-checkout index c9f7cc6c5..02f58444a 100644 --- a/.husky/post-checkout +++ b/.husky/post-checkout @@ -7,30 +7,29 @@ TICKETID=`git rev-parse --abbrev-ref HEAD | LC_ALL=en_US.utf8 grep -oP '((featur echo "[POST_CHECKOUT] Setting template commit to $TICKETID" echo "#$TICKETID: " > ".git/templatemessage" -echo "[POST-CHECKOUT-#1]" -echo $1 -echo "[POST-CHECKOUT-#2]" -echo $2 -echo "[POST-CHECKOUT-#3]" -echo $3 # ### run npm install ### -IFS=$'\n' -# extract all paths to package-lock.json files +echo "[POST-CHECKOUT] 📦 Checking for changes to dependencies" +# set -x +# NEWHEAD="5c279fb876053499698b996b10447a367cd05b95" # $1 is the new HEAD pointer +NEWHEAD=$1 +# OLDHEAD="16d12bd271e22a1e0b5dc3a8dcbb4bf3327cb867" # $2 is the previous HEAD pointer -echo "[POST-CHECKOUT-#4]" -echo "git diff --name-only $1 $2 | grep -E '(^package-lock\.json)'" -echo "[POST-CHECKOUT-#5]" -PACKAGES=("$(git diff --name-only $1 $2 | grep -E '(^package-lock\.json)')") -echo "[POST-CHECKOUT-6]" +OLDHEAD=$2 +# define how to split strings into array elements +IFS=$'\n' +# extract all paths to package-lock.json files +PACKAGE_LOCK_REGEX="(^package-lock\.json)" +PACKAGES=$(git diff --name-only $NEWHEAD $OLDHEAD | grep -E $PACKAGE_LOCK_REGEX || true) if [[ ${PACKAGES[@]} ]]; then for package in $PACKAGES; do - echo "[POST-CHECKOUT]" - echo "📦 $package was changed. Running npm install to update your dependencies..." - npm install + echo "📦 $package was changed." done + echo "📦 Running npm install to update your dependencies..." + npm install else echo "📦 All packages up-to-date. No need to run npm install." -fi \ No newline at end of file +fi +# set +x \ No newline at end of file diff --git a/.husky/post-merge b/.husky/post-merge index 0d691d6b6..2a0063d63 100644 --- a/.husky/post-merge +++ b/.husky/post-merge @@ -2,24 +2,21 @@ # ### run npm install ### . "$(dirname "$0")/_/husky.sh" -echo "[POST-MERGE-#1]" -echo $1 -echo "[POST-MERGE-#2]" -echo $2 -echo "[POST-MERGE-#3]" -echo $3 + +echo "[POST-MERGE] 📦 Checking for changes to dependencies" IFS=$'\n' # extract all paths to package-lock.json files -PACKAGES=`git diff --name-only HEAD^1 HEAD | grep -E '(^package-lock\.json)'` -echo "[POST-MERGE-4]" +PACKAGE_LOCK_REGEX="(^package-lock\.json)" +# PACKAGES=`git diff --name-only HEAD^1 HEAD | grep -E '(^package-lock\.json)'` +PACKAGES=$(git diff --name-only HEAD^1 HEAD | grep -E $PACKAGE_LOCK_REGEX || true) if [[ ${PACKAGES[@]} ]]; then for package in $PACKAGES; do - echo "[POST-MERGE]" - echo "📦 $package was changed. Running npm install to update your dependencies..." - npm install + echo "📦 $package was changed." done + echo "📦 Running npm install to update your dependencies..." + npm install else echo "📦 All packages up-to-date. No need to run npm install." fi \ No newline at end of file From f0aff187543dbf8ff8d569af4a51d5519e3566de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Berkefeld?= Date: Wed, 17 May 2023 16:33:59 +0200 Subject: [PATCH 27/73] #912: refactoring --- .husky/post-checkout | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.husky/post-checkout b/.husky/post-checkout index 02f58444a..c2a84ae99 100644 --- a/.husky/post-checkout +++ b/.husky/post-checkout @@ -11,14 +11,14 @@ echo "#$TICKETID: " > ".git/templatemessage" # ### run npm install ### echo "[POST-CHECKOUT] 📦 Checking for changes to dependencies" # set -x -# NEWHEAD="5c279fb876053499698b996b10447a367cd05b95" +# define how to split strings into array elements +IFS=$'\n' # $1 is the new HEAD pointer NEWHEAD=$1 -# OLDHEAD="16d12bd271e22a1e0b5dc3a8dcbb4bf3327cb867" +# NEWHEAD="5c279fb876053499698b996b10447a367cd05b95" # $2 is the previous HEAD pointer OLDHEAD=$2 -# define how to split strings into array elements -IFS=$'\n' +# OLDHEAD="16d12bd271e22a1e0b5dc3a8dcbb4bf3327cb867" # extract all paths to package-lock.json files PACKAGE_LOCK_REGEX="(^package-lock\.json)" PACKAGES=$(git diff --name-only $NEWHEAD $OLDHEAD | grep -E $PACKAGE_LOCK_REGEX || true) From 5223df8ad8391c01fb258e3b1255737e36286398 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Berkefeld?= Date: Wed, 17 May 2023 16:36:16 +0200 Subject: [PATCH 28/73] #912: remove test install --- package-lock.json | 164 ---------------------------------------------- package.json | 1 - 2 files changed, 165 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3ec158742..e5fd4bc18 100644 --- a/package-lock.json +++ b/package-lock.json @@ -46,7 +46,6 @@ "eslint-plugin-prettier": "4.2.1", "eslint-plugin-unicorn": "46.0.0", "fast-xml-parser": "4.2.2", - "git-pull-run": "1.4.0", "husky": "8.0.3", "jsdoc-to-markdown": "8.0.0", "lint-staged": "13.2.2", @@ -4194,103 +4193,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/git-pull-run": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/git-pull-run/-/git-pull-run-1.4.0.tgz", - "integrity": "sha512-QtH0X318MaJM2EYoGFebjc/NtumkrlN1foNeHLi1pcVjiZlCjqRFQmfGF12l4zdyZMNlebrTCiv/nD/A5wEqew==", - "dev": true, - "dependencies": { - "colorette": "^2.0.19", - "commander": "^8.3.0", - "debug": "^4.3.3", - "execa": "^6.1.0", - "listr2": "^5.0.5", - "micromatch": "^4.0.4" - }, - "bin": { - "git-pull-run": "dist/cli.js" - } - }, - "node_modules/git-pull-run/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true, - "engines": { - "node": ">= 12" - } - }, - "node_modules/git-pull-run/node_modules/execa": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz", - "integrity": "sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^3.0.1", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/git-pull-run/node_modules/human-signals": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz", - "integrity": "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==", - "dev": true, - "engines": { - "node": ">=12.20.0" - } - }, - "node_modules/git-pull-run/node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/git-pull-run/node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/git-pull-run/node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/giturl": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/giturl/-/giturl-1.0.1.tgz", @@ -13173,72 +13075,6 @@ "get-intrinsic": "^1.1.1" } }, - "git-pull-run": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/git-pull-run/-/git-pull-run-1.4.0.tgz", - "integrity": "sha512-QtH0X318MaJM2EYoGFebjc/NtumkrlN1foNeHLi1pcVjiZlCjqRFQmfGF12l4zdyZMNlebrTCiv/nD/A5wEqew==", - "dev": true, - "requires": { - "colorette": "^2.0.19", - "commander": "^8.3.0", - "debug": "^4.3.3", - "execa": "^6.1.0", - "listr2": "^5.0.5", - "micromatch": "^4.0.4" - }, - "dependencies": { - "commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true - }, - "execa": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz", - "integrity": "sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^3.0.1", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - } - }, - "human-signals": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz", - "integrity": "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==", - "dev": true - }, - "is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true - }, - "mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true - }, - "onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "requires": { - "mimic-fn": "^4.0.0" - } - } - } - }, "giturl": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/giturl/-/giturl-1.0.1.tgz", diff --git a/package.json b/package.json index 00552f752..c06aca5d2 100644 --- a/package.json +++ b/package.json @@ -92,7 +92,6 @@ "eslint-plugin-prettier": "4.2.1", "eslint-plugin-unicorn": "46.0.0", "fast-xml-parser": "4.2.2", - "git-pull-run": "1.4.0", "husky": "8.0.3", "jsdoc-to-markdown": "8.0.0", "lint-staged": "13.2.2", From 3c84ef00d426c935814baf1e00894b83ed25b9c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Berkefeld?= Date: Wed, 17 May 2023 16:47:49 +0200 Subject: [PATCH 29/73] #912: cleanup --- .husky/post-checkout | 4 ---- .husky/post-merge | 1 - 912-test.txt | 1 - 3 files changed, 6 deletions(-) delete mode 100644 912-test.txt diff --git a/.husky/post-checkout b/.husky/post-checkout index c2a84ae99..eac9a9a7c 100644 --- a/.husky/post-checkout +++ b/.husky/post-checkout @@ -10,15 +10,12 @@ echo "#$TICKETID: " > ".git/templatemessage" # ### run npm install ### echo "[POST-CHECKOUT] 📦 Checking for changes to dependencies" -# set -x # define how to split strings into array elements IFS=$'\n' # $1 is the new HEAD pointer NEWHEAD=$1 -# NEWHEAD="5c279fb876053499698b996b10447a367cd05b95" # $2 is the previous HEAD pointer OLDHEAD=$2 -# OLDHEAD="16d12bd271e22a1e0b5dc3a8dcbb4bf3327cb867" # extract all paths to package-lock.json files PACKAGE_LOCK_REGEX="(^package-lock\.json)" PACKAGES=$(git diff --name-only $NEWHEAD $OLDHEAD | grep -E $PACKAGE_LOCK_REGEX || true) @@ -32,4 +29,3 @@ if [[ ${PACKAGES[@]} ]]; then else echo "📦 All packages up-to-date. No need to run npm install." fi -# set +x \ No newline at end of file diff --git a/.husky/post-merge b/.husky/post-merge index 2a0063d63..06f668cd4 100644 --- a/.husky/post-merge +++ b/.husky/post-merge @@ -8,7 +8,6 @@ echo "[POST-MERGE] 📦 Checking for changes to dependencies" IFS=$'\n' # extract all paths to package-lock.json files PACKAGE_LOCK_REGEX="(^package-lock\.json)" -# PACKAGES=`git diff --name-only HEAD^1 HEAD | grep -E '(^package-lock\.json)'` PACKAGES=$(git diff --name-only HEAD^1 HEAD | grep -E $PACKAGE_LOCK_REGEX || true) if [[ ${PACKAGES[@]} ]]; then diff --git a/912-test.txt b/912-test.txt deleted file mode 100644 index 81403e41b..000000000 --- a/912-test.txt +++ /dev/null @@ -1 +0,0 @@ -test 2 \ No newline at end of file From 5557d8b64bfcc20bae4532389f00403879a0535e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Berkefeld?= Date: Wed, 17 May 2023 17:33:01 +0200 Subject: [PATCH 30/73] #914: catch error for unrecognized branch names that broke the post-checkout hook --- .husky/post-checkout | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/.husky/post-checkout b/.husky/post-checkout index eac9a9a7c..6d21e44b9 100644 --- a/.husky/post-checkout +++ b/.husky/post-checkout @@ -3,9 +3,14 @@ # ### git commit message template ### git config commit.template .git/templatemessage -TICKETID=`git rev-parse --abbrev-ref HEAD | LC_ALL=en_US.utf8 grep -oP '((feature|bug|bugfix|fix|hotfix|task|chore)\/)\K\d{1,7}'` -echo "[POST_CHECKOUT] Setting template commit to $TICKETID" -echo "#$TICKETID: " > ".git/templatemessage" +TICKETID=`git rev-parse --abbrev-ref HEAD | LC_ALL=en_US.utf8 grep -oP '((feature|bug|bugfix|fix|hotfix|task|chore)\/)\K\d{1,7}' || true` +if [ -z "$TICKETID" ] +then + TICKETID="0" +fi +TEMPLATE="#$TICKETID: " +echo "[POST_CHECKOUT] Setting template commit to '$TEMPLATE'" +echo $TEMPLATE > ".git/templatemessage" # ### run npm install ### From 31d83c37b87f552c1b0eba2c45a96e5a0d7f8690 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Berkefeld?= Date: Wed, 17 May 2023 17:34:47 +0200 Subject: [PATCH 31/73] #914: make "type-subfolder" in branch name optional for post-checkout hook --- .husky/post-checkout | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.husky/post-checkout b/.husky/post-checkout index 6d21e44b9..176606dc0 100644 --- a/.husky/post-checkout +++ b/.husky/post-checkout @@ -3,7 +3,7 @@ # ### git commit message template ### git config commit.template .git/templatemessage -TICKETID=`git rev-parse --abbrev-ref HEAD | LC_ALL=en_US.utf8 grep -oP '((feature|bug|bugfix|fix|hotfix|task|chore)\/)\K\d{1,7}' || true` +TICKETID=`git rev-parse --abbrev-ref HEAD | LC_ALL=en_US.utf8 grep -oP '((feature|bug|bugfix|fix|hotfix|task|chore)\/)?\K\d{1,7}' || true` if [ -z "$TICKETID" ] then TICKETID="0" From 0ee272ccbb4b739567f88660e6b4470c948edb5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Berkefeld?= Date: Wed, 17 May 2023 17:53:48 +0200 Subject: [PATCH 32/73] #914: ensure numbers are only taken from the start --- .husky/post-checkout | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.husky/post-checkout b/.husky/post-checkout index 176606dc0..e2201380c 100644 --- a/.husky/post-checkout +++ b/.husky/post-checkout @@ -3,7 +3,7 @@ # ### git commit message template ### git config commit.template .git/templatemessage -TICKETID=`git rev-parse --abbrev-ref HEAD | LC_ALL=en_US.utf8 grep -oP '((feature|bug|bugfix|fix|hotfix|task|chore)\/)?\K\d{1,7}' || true` +TICKETID=`git rev-parse --abbrev-ref HEAD | LC_ALL=en_US.utf8 grep -oP '^((feature|bug|bugfix|fix|hotfix|task|chore)\/)?\K\d{1,7}' || true` if [ -z "$TICKETID" ] then TICKETID="0" From 5086250fdadcaa0bf8b5f93e17f2b43133f22400 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 17 May 2023 15:58:12 +0000 Subject: [PATCH 33/73] Bump eslint-plugin-unicorn from 46.0.0 to 47.0.0 Bumps [eslint-plugin-unicorn](https://github.com/sindresorhus/eslint-plugin-unicorn) from 46.0.0 to 47.0.0. - [Release notes](https://github.com/sindresorhus/eslint-plugin-unicorn/releases) - [Commits](https://github.com/sindresorhus/eslint-plugin-unicorn/compare/v46.0.0...v47.0.0) --- updated-dependencies: - dependency-name: eslint-plugin-unicorn dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- package-lock.json | 92 +++++++++++++++++++++++++---------------------- package.json | 2 +- 2 files changed, 50 insertions(+), 44 deletions(-) diff --git a/package-lock.json b/package-lock.json index e5fd4bc18..d9468e449 100644 --- a/package-lock.json +++ b/package-lock.json @@ -44,7 +44,7 @@ "eslint-plugin-jsdoc": "44.2.4", "eslint-plugin-mocha": "10.1.0", "eslint-plugin-prettier": "4.2.1", - "eslint-plugin-unicorn": "46.0.0", + "eslint-plugin-unicorn": "47.0.0", "fast-xml-parser": "4.2.2", "husky": "8.0.3", "jsdoc-to-markdown": "8.0.0", @@ -521,9 +521,9 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.2.0.tgz", - "integrity": "sha512-gB8T4H4DEfX2IV9zGDJPOBgP1e/DbfCPDTtEqUMckpvzS1OYtva8JdFYBqMwYk7xAQ429WGF/UPqn8uQ//h2vQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", "dev": true, "dependencies": { "eslint-visitor-keys": "^3.3.0" @@ -3296,43 +3296,49 @@ } }, "node_modules/eslint-plugin-unicorn": { - "version": "46.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-46.0.0.tgz", - "integrity": "sha512-j07WkC+PFZwk8J33LYp6JMoHa1lXc1u6R45pbSAipjpfpb7KIGr17VE2D685zCxR5VL4cjrl65kTJflziQWMDA==", + "version": "47.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-47.0.0.tgz", + "integrity": "sha512-ivB3bKk7fDIeWOUmmMm9o3Ax9zbMz1Bsza/R2qm46ufw4T6VBFBaJIR1uN3pCKSmSXm8/9Nri8V+iUut1NhQGA==", "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.19.1", - "@eslint-community/eslint-utils": "^4.1.2", - "ci-info": "^3.6.1", + "@eslint-community/eslint-utils": "^4.4.0", + "ci-info": "^3.8.0", "clean-regexp": "^1.0.0", - "esquery": "^1.4.0", + "esquery": "^1.5.0", "indent-string": "^4.0.0", - "is-builtin-module": "^3.2.0", + "is-builtin-module": "^3.2.1", "jsesc": "^3.0.2", "lodash": "^4.17.21", "pluralize": "^8.0.0", "read-pkg-up": "^7.0.1", "regexp-tree": "^0.1.24", - "regjsparser": "^0.9.1", + "regjsparser": "^0.10.0", "safe-regex": "^2.1.1", "semver": "^7.3.8", "strip-indent": "^3.0.0" }, "engines": { - "node": ">=14.18" + "node": ">=16" }, "funding": { "url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1" }, "peerDependencies": { - "eslint": ">=8.28.0" + "eslint": ">=8.38.0" } }, "node_modules/eslint-plugin-unicorn/node_modules/ci-info": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.0.tgz", - "integrity": "sha512-2CpRNYmImPx+RXKLq6jko/L07phmS9I02TyqkcNU20GCF/GgaWvc58hPtjxDX8lPpkdwc9sNh72V9k00S7ezog==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], "engines": { "node": ">=8" } @@ -4928,9 +4934,9 @@ } }, "node_modules/is-builtin-module": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.0.tgz", - "integrity": "sha512-phDA4oSGt7vl1n5tJvTWooWWAsXLY+2xCnxNqvKhGEzujg+A43wPlPOyDg3C8XQHN+6k/JTQWJ/j0dQh/qr+Hw==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", + "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", "dev": true, "dependencies": { "builtin-modules": "^3.3.0" @@ -8396,9 +8402,9 @@ } }, "node_modules/regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.10.0.tgz", + "integrity": "sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==", "dev": true, "dependencies": { "jsesc": "~0.5.0" @@ -10344,9 +10350,9 @@ } }, "@eslint-community/eslint-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.2.0.tgz", - "integrity": "sha512-gB8T4H4DEfX2IV9zGDJPOBgP1e/DbfCPDTtEqUMckpvzS1OYtva8JdFYBqMwYk7xAQ429WGF/UPqn8uQ//h2vQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", "dev": true, "requires": { "eslint-visitor-keys": "^3.3.0" @@ -12463,33 +12469,33 @@ } }, "eslint-plugin-unicorn": { - "version": "46.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-46.0.0.tgz", - "integrity": "sha512-j07WkC+PFZwk8J33LYp6JMoHa1lXc1u6R45pbSAipjpfpb7KIGr17VE2D685zCxR5VL4cjrl65kTJflziQWMDA==", + "version": "47.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-47.0.0.tgz", + "integrity": "sha512-ivB3bKk7fDIeWOUmmMm9o3Ax9zbMz1Bsza/R2qm46ufw4T6VBFBaJIR1uN3pCKSmSXm8/9Nri8V+iUut1NhQGA==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.19.1", - "@eslint-community/eslint-utils": "^4.1.2", - "ci-info": "^3.6.1", + "@eslint-community/eslint-utils": "^4.4.0", + "ci-info": "^3.8.0", "clean-regexp": "^1.0.0", - "esquery": "^1.4.0", + "esquery": "^1.5.0", "indent-string": "^4.0.0", - "is-builtin-module": "^3.2.0", + "is-builtin-module": "^3.2.1", "jsesc": "^3.0.2", "lodash": "^4.17.21", "pluralize": "^8.0.0", "read-pkg-up": "^7.0.1", "regexp-tree": "^0.1.24", - "regjsparser": "^0.9.1", + "regjsparser": "^0.10.0", "safe-regex": "^2.1.1", "semver": "^7.3.8", "strip-indent": "^3.0.0" }, "dependencies": { "ci-info": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.0.tgz", - "integrity": "sha512-2CpRNYmImPx+RXKLq6jko/L07phmS9I02TyqkcNU20GCF/GgaWvc58hPtjxDX8lPpkdwc9sNh72V9k00S7ezog==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", "dev": true }, "jsesc": { @@ -13603,9 +13609,9 @@ "dev": true }, "is-builtin-module": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.0.tgz", - "integrity": "sha512-phDA4oSGt7vl1n5tJvTWooWWAsXLY+2xCnxNqvKhGEzujg+A43wPlPOyDg3C8XQHN+6k/JTQWJ/j0dQh/qr+Hw==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", + "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", "dev": true, "requires": { "builtin-modules": "^3.3.0" @@ -16203,9 +16209,9 @@ } }, "regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.10.0.tgz", + "integrity": "sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==", "dev": true, "requires": { "jsesc": "~0.5.0" diff --git a/package.json b/package.json index c06aca5d2..ca03eead0 100644 --- a/package.json +++ b/package.json @@ -90,7 +90,7 @@ "eslint-plugin-jsdoc": "44.2.4", "eslint-plugin-mocha": "10.1.0", "eslint-plugin-prettier": "4.2.1", - "eslint-plugin-unicorn": "46.0.0", + "eslint-plugin-unicorn": "47.0.0", "fast-xml-parser": "4.2.2", "husky": "8.0.3", "jsdoc-to-markdown": "8.0.0", From 0680d688274caf269c3aabff7845fba9fa654438 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Berkefeld?= Date: Wed, 17 May 2023 20:58:41 +0200 Subject: [PATCH 34/73] #0: eslint --fix --- lib/Deployer.js | 1 - lib/metadataTypes/Asset.js | 2 +- lib/metadataTypes/User.js | 4 ++-- lib/util/auth.js | 4 ++++ 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/lib/Deployer.js b/lib/Deployer.js index 9aa8f8024..29e267c2d 100644 --- a/lib/Deployer.js +++ b/lib/Deployer.js @@ -18,7 +18,6 @@ class Deployer { /** * Creates a Deployer, uses v2 auth if v2AuthOptions are passed. * - * * @param {TYPE.Mcdevrc} properties General configuration to be used in retrieve * @param {TYPE.BuObject} buObject properties for auth */ diff --git a/lib/metadataTypes/Asset.js b/lib/metadataTypes/Asset.js index c4c370167..6c6b13dc6 100644 --- a/lib/metadataTypes/Asset.js +++ b/lib/metadataTypes/Asset.js @@ -235,7 +235,7 @@ class Asset extends MetadataType { rightOperand: { property: 'id', simpleOperator: 'greaterThan', - value: items[items.length - 1].id, + value: items.at(-1).id, }, }; lastPage = 0; diff --git a/lib/metadataTypes/User.js b/lib/metadataTypes/User.js index d53a3ff75..e2343fc1a 100644 --- a/lib/metadataTypes/User.js +++ b/lib/metadataTypes/User.js @@ -215,12 +215,12 @@ class User extends MetadataType { ); if (action === 'create') { - const createItem = metadataToCreate[metadataToCreate.length - 1]; + const createItem = metadataToCreate.at(-1); User._setPasswordForNewUser(createItem); User._prepareRoleAssignments({ after: createItem }); User._prepareBuAssignments(metadata[metadataKey], null, createItem); } else if (action === 'update') { - const updateItem = metadataToUpdate[metadataToUpdate.length - 1]; + const updateItem = metadataToUpdate.at(-1); User._prepareRoleAssignments(updateItem); User._prepareBuAssignments(metadata[metadataKey], updateItem, null); } diff --git a/lib/util/auth.js b/lib/util/auth.js index e569d1ff2..1109b945f 100644 --- a/lib/util/auth.js +++ b/lib/util/auth.js @@ -11,6 +11,7 @@ let authfile; const Auth = { /** * For each business unit, set up base credentials to be used. + * * @param {TYPE.AuthObject} authObject details for * @param {string} credential of the instance * @returns {void} @@ -47,6 +48,7 @@ const Auth = { }, /** * Returns an SDK instance to be used for API calls + * * @param {TYPE.BuObject} buObject information about current context * @returns {SDK} auth object */ @@ -71,6 +73,7 @@ const Auth = { }, /** * helper to clear all auth sessions + * * @returns {void} */ clearSessions() { @@ -80,6 +83,7 @@ const Auth = { }; /** * Returns an SDK instance to be used for API calls + * * @param {string} sessionKey key for specific BU * @param {TYPE.AuthObject} authObject credentials for specific BU * @returns {SDK} auth object From bc33a05f2925cd22be88e55fc2604fb19fc6b76a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Berkefeld?= Date: Wed, 24 May 2023 22:22:34 +0200 Subject: [PATCH 35/73] #923: corrected dataExtensionField rename log message --- lib/metadataTypes/DataExtensionField.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/metadataTypes/DataExtensionField.js b/lib/metadataTypes/DataExtensionField.js index c710650d0..61b68d642 100644 --- a/lib/metadataTypes/DataExtensionField.js +++ b/lib/metadataTypes/DataExtensionField.js @@ -170,11 +170,11 @@ class DataExtensionField extends MetadataType { // enable renaming if (item.Name_new) { + Util.logger.info( + ` - Found Name_new='${item.Name_new}' for field ${deKey}.${item.Name} - trying to rename.` + ); item.Name = item.Name_new; delete item.Name_new; - Util.logger.warn( - ` - Found 'Name_new' value '${item.Name_new}' for ${deKey}.${item.Name} - trying to rename.` - ); } // check if any changes were found @@ -210,8 +210,8 @@ class DataExtensionField extends MetadataType { } } if (item.Name_new) { - Util.logger.warn( - ` - Found 'Name_new' value '${item.Name_new}' for ${deKey}.${item.Name} but could not find a corresponding DE field on the server - adding new field instead of updating.` + Util.logger.info( + ` - Found Name_new='${item.Name_new}' for field ${deKey}.${item.Name} but could not find a corresponding DE field on the server - adding new field instead of updating.` ); delete item.Name_new; } From 61591a0edcfcb05c439d17db954f55de9a1eeb9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Berkefeld?= Date: Wed, 24 May 2023 22:27:43 +0200 Subject: [PATCH 36/73] #923: add empty test for renaming fields --- test/type.dataExtension.test.js | 1 + 1 file changed, 1 insertion(+) diff --git a/test/type.dataExtension.test.js b/test/type.dataExtension.test.js index 0b086ebb7..b91a2f496 100644 --- a/test/type.dataExtension.test.js +++ b/test/type.dataExtension.test.js @@ -74,6 +74,7 @@ describe('type: dataExtension', () => { return; }); it('Should change the key during update via --changeKeyValue'); + it('Should rename fields'); }); describe('Templating ================', () => { it('Should create a dataExtension template via retrieveAsTemplate and build it', async () => { From c8759df2ea57e8461a3dcfc2aa24c7043dcc7def Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Berkefeld?= Date: Wed, 24 May 2023 22:39:28 +0200 Subject: [PATCH 37/73] #892: delete old interaction folder on retrieve of journey --- lib/index.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/index.js b/lib/index.js index 18b340c16..ecd28d298 100644 --- a/lib/index.js +++ b/lib/index.js @@ -256,11 +256,12 @@ class Mcdev { cred = buObject.credential; bu = buObject.businessUnit; // clean up old folders after types were renamed - // TODO: Remove this with version 5.0.0 + // TODO: Remove renamedTypes-logic 6 months after version 5 release const renamedTypes = { emailSend: 'emailSendDefinition', event: 'eventDefinition', fileLocation: 'ftpLocation', + journey: 'interaction', triggeredSend: 'triggeredSendDefinition', user: 'accountUser', }; From 4b0530d33a099172817eb344b3ee0a7ed0293a5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Berkefeld?= Date: Wed, 24 May 2023 22:57:45 +0200 Subject: [PATCH 38/73] #909: clarify that bd and bdb require the template's file name --- lib/cli.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/lib/cli.js b/lib/cli.js index d314a0968..992d6f9f9 100644 --- a/lib/cli.js +++ b/lib/cli.js @@ -240,7 +240,7 @@ yargs }, }) .command({ - command: 'buildDefinition ', + command: 'buildDefinition ', aliases: ['bd'], desc: 'builds metadata definition based on template', builder: (yargs) => { @@ -253,9 +253,9 @@ yargs type: 'string', describe: 'metadata type', }) - .positional('NAME', { + .positional('FILENAME', { type: 'string', - describe: 'name of the metadata component', + describe: 'File name of the metadata template without the extension', }) .positional('MARKET', { type: 'string', @@ -264,11 +264,11 @@ yargs }, handler: (argv) => { Mcdev.setOptions(argv); - Mcdev.buildDefinition(argv.BU, argv.TYPE, argv.NAME, argv.MARKET); + Mcdev.buildDefinition(argv.BU, argv.TYPE, argv.FILENAME, argv.MARKET); }, }) .command({ - command: 'buildDefinitionBulk ', + command: 'buildDefinitionBulk ', aliases: ['bdb'], desc: 'builds metadata definition based on template en bulk', builder: (yargs) => { @@ -281,14 +281,14 @@ yargs type: 'string', describe: 'metadata type', }) - .positional('NAME', { + .positional('FILENAME', { type: 'string', - describe: 'name of the metadata component', + describe: 'File name of the metadata template without the extension', }); }, handler: (argv) => { Mcdev.setOptions(argv); - Mcdev.buildDefinitionBulk(argv.LISTNAME, argv.TYPE, argv.NAME); + Mcdev.buildDefinitionBulk(argv.LISTNAME, argv.TYPE, argv.FILENAME); }, }) .command({ From dc0021988e0a3e15052eae0af8306e7e0b92cf55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Berkefeld?= Date: Wed, 24 May 2023 23:20:20 +0200 Subject: [PATCH 39/73] #889: eslint --fix and jsdoc fixes --- lib/metadataTypes/MobileKeyword.js | 17 +++++++++++++++++ lib/util/util.js | 1 + 2 files changed, 18 insertions(+) diff --git a/lib/metadataTypes/MobileKeyword.js b/lib/metadataTypes/MobileKeyword.js index 3d6f35c44..f42e95021 100644 --- a/lib/metadataTypes/MobileKeyword.js +++ b/lib/metadataTypes/MobileKeyword.js @@ -8,12 +8,14 @@ const cache = require('../util/cache'); /** * MobileKeyword MetadataType + * * @augments MetadataType */ class MobileKeyword extends MetadataType { /** * Retrieves Metadata of Mobile Keywords * Endpoint /legacy/v1/beta/mobile/keyword/ return all Mobile Keywords with all details. + * * @param {string} retrieveDir Directory where retrieved metadata directory will be saved * @param {void} [_] unused parameter * @param {void} [__] unused parameter @@ -43,6 +45,7 @@ class MobileKeyword extends MetadataType { /** * Retrieves event definition metadata for caching + * * @param {void} _ parameter not used * @param {void} __ parameter not used * @param {string} [key] customer key of single item to retrieve @@ -54,6 +57,7 @@ class MobileKeyword extends MetadataType { /** * Creates a single Event Definition + * * @param {TYPE.MetadataTypeItem} MobileKeyword a single Event Definition * @returns {Promise} Promise */ @@ -62,6 +66,7 @@ class MobileKeyword extends MetadataType { } /** * Updates a single item + * * @param {TYPE.MetadataTypeItem} metadata a single item * @returns {Promise} Promise */ @@ -75,6 +80,7 @@ class MobileKeyword extends MetadataType { /** * manages post retrieve steps + * * @param {TYPE.MetadataTypeItem} metadata a single item * @returns {TYPE.CodeExtractItem | TYPE.MetadataTypeItem} Array with one metadata object and one ssjs string */ @@ -98,6 +104,7 @@ class MobileKeyword extends MetadataType { } /** * helper for {@link parseMetadata} and {@link _buildForNested} + * * @param {string} metadataScript the code of the file * @returns {{fileExt:string,code:string}} returns found extension and file content */ @@ -110,6 +117,7 @@ class MobileKeyword extends MetadataType { /** * helper for {@link MetadataType.buildDefinition} * handles extracted code if any are found for complex types + * * @param {string} templateDir Directory where metadata templates are stored * @param {string|string[]} targetDir (List of) Directory where built definitions will be saved * @param {TYPE.MetadataTypeItem} metadata main JSON file that was read from file system @@ -136,6 +144,7 @@ class MobileKeyword extends MetadataType { /** * helper for {@link MetadataType.buildTemplate} * handles extracted code if any are found for complex types + * * @example scripts are saved as 1 json and 1 ssjs file. both files need to be run through templating * @param {string} templateDir Directory where metadata templates are stored * @param {string|string[]} targetDir (List of) Directory where built definitions will be saved @@ -164,6 +173,7 @@ class MobileKeyword extends MetadataType { /** * helper for {@link buildTemplateForNested} / {@link buildDefinitionForNested} * handles extracted code if any are found for complex types + * * @param {string} templateDir Directory where metadata templates are stored * @param {string|string[]} targetDir (List of) Directory where built definitions will be saved * @param {TYPE.MetadataTypeItem} metadata main JSON file that was read from file system @@ -230,6 +240,7 @@ class MobileKeyword extends MetadataType { /** * prepares an event definition for deployment + * * @param {TYPE.MetadataTypeItem} metadata a single MobileKeyword * @param {string} deployDir directory of deploy files * @returns {Promise.} Promise @@ -258,6 +269,7 @@ class MobileKeyword extends MetadataType { } /** * helper for {@link createREST} + * * @param {TYPE.MetadataTypeItem} metadataEntry a single metadata Entry * @param {object} apiResponse varies depending on the API call * @returns {void} @@ -267,6 +279,7 @@ class MobileKeyword extends MetadataType { } /** * helper for {@link updateREST} + * * @param {TYPE.MetadataTypeItem} metadataEntry a single metadata Entry * @param {object} apiResponse varies depending on the API call * @returns {void} @@ -277,6 +290,7 @@ class MobileKeyword extends MetadataType { /** * helper for {@link preDeployTasks} that loads extracted code content back into JSON + * * @param {TYPE.MetadataTypeItem} metadata a single definition * @param {string} deployDir directory of deploy files * @param {string} [templateName] name of the template used to built defintion (prior applying templating) @@ -304,6 +318,7 @@ class MobileKeyword extends MetadataType { } /** * Delete a metadata item from the specified business unit + * * @param {string} id Identifier of item * @returns {Promise.} deletion success status */ @@ -317,6 +332,7 @@ class MobileKeyword extends MetadataType { /** * clean up after deleting a metadata item + * * @param {string} customerKey Identifier of metadata item * @returns {void} */ @@ -328,6 +344,7 @@ class MobileKeyword extends MetadataType { /** * should return only the json for all but asset, query and script that are saved as multiple files * additionally, the documentation for dataExtension and automation should be returned + * * @param {string[]} keyArr customerkey of the metadata * @returns {string[]} list of all files that need to be committed in a flat array ['path/file1.ext', 'path/file2.ext'] */ diff --git a/lib/util/util.js b/lib/util/util.js index cc24c49ba..482cbd0c5 100644 --- a/lib/util/util.js +++ b/lib/util/util.js @@ -437,6 +437,7 @@ const Util = { } } catch { // avoid errors from execSync to bubble up + return null; } }, /** From cccad4f484b15a0d8b760e5fe0443429613225d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Berkefeld?= Date: Thu, 25 May 2023 00:26:13 +0200 Subject: [PATCH 40/73] #889: rewrite how other types check mobileKeywords --- docs/dist/documentation.md | 9 ++++--- lib/metadataTypes/MobileKeyword.js | 10 ++++--- lib/metadataTypes/MobileMessage.js | 22 ++++++++++------ lib/metadataTypes/TransactionalSMS.js | 10 +++---- lib/util/cache.js | 38 +++++++++++++++++++++++++++ 5 files changed, 67 insertions(+), 22 deletions(-) diff --git a/docs/dist/documentation.md b/docs/dist/documentation.md index 3bd1b8a38..c748e3e3f 100644 --- a/docs/dist/documentation.md +++ b/docs/dist/documentation.md @@ -4007,7 +4007,7 @@ MobileKeyword MetadataType * [MobileKeyword](#MobileKeyword) ⇐ [MetadataType](#MetadataType) * [.retrieve(retrieveDir, [_], [__], [key])](#MobileKeyword.retrieve) ⇒ Promise.<TYPE.MetadataTypeMapObj> \| void * [.retrieveForCache(_, __, [key])](#MobileKeyword.retrieveForCache) ⇒ Promise.<TYPE.MetadataTypeMapObj> - * [.create(MobileKeyword)](#MobileKeyword.create) ⇒ Promise + * [.create(metadata)](#MobileKeyword.create) ⇒ Promise * [.update(metadata)](#MobileKeyword.update) ⇒ Promise * [.postRetrieveTasks(metadata)](#MobileKeyword.postRetrieveTasks) ⇒ TYPE.CodeExtractItem \| TYPE.MetadataTypeItem * [.prepExtractedCode(metadataScript)](#MobileKeyword.prepExtractedCode) ⇒ Object @@ -4054,15 +4054,16 @@ Retrieves event definition metadata for caching -### MobileKeyword.create(MobileKeyword) ⇒ Promise -Creates a single Event Definition +### MobileKeyword.create(metadata) ⇒ Promise +/** +Creates a single item **Kind**: static method of [MobileKeyword](#MobileKeyword) **Returns**: Promise - Promise | Param | Type | Description | | --- | --- | --- | -| MobileKeyword | TYPE.MetadataTypeItem | a single Event Definition | +| metadata | TYPE.MetadataTypeItem | a single item | diff --git a/lib/metadataTypes/MobileKeyword.js b/lib/metadataTypes/MobileKeyword.js index f42e95021..fa4768609 100644 --- a/lib/metadataTypes/MobileKeyword.js +++ b/lib/metadataTypes/MobileKeyword.js @@ -56,13 +56,15 @@ class MobileKeyword extends MetadataType { } /** - * Creates a single Event Definition * - * @param {TYPE.MetadataTypeItem} MobileKeyword a single Event Definition + /** + * Creates a single item + * + * @param {TYPE.MetadataTypeItem} metadata a single item * @returns {Promise} Promise */ - static create(MobileKeyword) { - return super.createREST(MobileKeyword, '/legacy/v1/beta/mobile/keyword/'); + static create(metadata) { + return super.createREST(metadata, '/legacy/v1/beta/mobile/keyword/'); } /** * Updates a single item diff --git a/lib/metadataTypes/MobileMessage.js b/lib/metadataTypes/MobileMessage.js index 0ad0f2b3d..03546a4bc 100644 --- a/lib/metadataTypes/MobileMessage.js +++ b/lib/metadataTypes/MobileMessage.js @@ -164,18 +164,16 @@ class MobileMessage extends MetadataType { // mobileKeyword try { if (metadata.keyword?.keyword) { - cache.searchForField( - 'mobileKeyword', + cache.searchForMobileKeyword( + metadata.code.code, metadata.keyword.keyword, - 'keyword', 'keyword' ); } if (metadata.subscriptionKeyword?.keyword) { - cache.searchForField( - 'mobileKeyword', + cache.searchForMobileKeyword( + metadata.code.code, metadata.subscriptionKeyword.keyword, - 'keyword', 'keyword' ); } @@ -266,14 +264,22 @@ class MobileMessage extends MetadataType { // mobileKeyword if (metadata.keyword?.keyword) { - const keyword = cache.getByKey('mobileKeyword', metadata.keyword.keyword); + const keyword = cache.searchForMobileKeyword( + metadata.code.code, + metadata.keyword.keyword, + 'keyword' + ); if (!keyword) { throw new Error(`mobileKeyword ${metadata.keyword.keyword} not found in cache`); } metadata.keyword = keyword; } if (metadata.subscriptionKeyword?.keyword) { - const keyword = cache.getByKey('mobileKeyword', metadata.subscriptionKeyword.keyword); + const keyword = cache.searchForMobileKeyword( + metadata.code.code, + metadata.subscriptionKeyword.keyword, + 'keyword' + ); if (!keyword) { throw new Error(`mobileKeyword ${metadata.keyword.keyword} not found in cache`); } diff --git a/lib/metadataTypes/TransactionalSMS.js b/lib/metadataTypes/TransactionalSMS.js index 5b429c491..d7998896a 100644 --- a/lib/metadataTypes/TransactionalSMS.js +++ b/lib/metadataTypes/TransactionalSMS.js @@ -56,10 +56,9 @@ class TransactionalSMS extends TransactionalMessage { // subscriptions: mobileKeyword if (metadata.subscriptions?.keyword) { // we merely want to be able to show an error if it does not exist - cache.searchForField( - 'mobileKeyword', + cache.searchForMobileKeyword( + metadata.subscriptions.shortCode, metadata.subscriptions.keyword, - 'keyword', 'keyword' ); } @@ -140,10 +139,9 @@ class TransactionalSMS extends TransactionalMessage { if (metadata.subscriptions?.keyword) { try { // we merely want to be able to show a warning if it does not exist - cache.searchForField( - 'mobileKeyword', + cache.searchForMobileKeyword( + metadata.subscriptions.shortCode, metadata.subscriptions.keyword, - 'keyword', 'keyword' ); } catch { diff --git a/lib/util/cache.js b/lib/util/cache.js index bcea3a35d..f84dba02d 100644 --- a/lib/util/cache.js +++ b/lib/util/cache.js @@ -120,6 +120,44 @@ module.exports = { `Dependent ${metadataType} with ${searchField}='${searchValue}' was not found on your BU` ); }, + /** + * standardized method for getting data from cache. + * + * @param {string} code mobileCode + * @param {string} keyword mobileKeyword + * @param {string} returnField field which should be returned + * @returns {string|number|boolean} value of specified field. Error is thrown if not found + */ + searchForMobileKeyword(code, keyword, returnField) { + const metadataType = 'mobileKeyword'; + for (const key in dataStore[currentMID]?.[metadataType]) { + if ( + Util.resolveObjPath('code.code', dataStore[currentMID][metadataType][key]) == + code && + Util.resolveObjPath('keyword', dataStore[currentMID][metadataType][key]) == keyword + ) { + try { + if ( + Util.resolveObjPath(returnField, dataStore[currentMID][metadataType][key]) + ) { + return Util.resolveObjPath( + returnField, + dataStore[currentMID][metadataType][key] + ); + } else { + throw new Error(); // eslint-disable-line unicorn/error-message + } + } catch { + throw new Error( + `${metadataType} with code ${code} and keyword ${keyword} does not have field '${returnField}'` + ); + } + } + } + throw new Error( + `Dependent ${metadataType} with code ${code} and keyword ${keyword} was not found on your BU` + ); + }, /** * standardized method for getting data from cache - adapted for special case of lists * ! keeping this in util/cache.js rather than in metadataTypes/List.js to avoid potential circular dependencies From 350e6bb59b2a91bc94e9a4ec2db8a672c4762c50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Berkefeld?= Date: Thu, 25 May 2023 17:46:50 +0200 Subject: [PATCH 41/73] #889: ensure mobileKeywords for which the mobileCode was deleted are not saved to disk --- docs/dist/documentation.md | 6 +++--- lib/metadataTypes/MobileKeyword.js | 9 ++++++++- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/docs/dist/documentation.md b/docs/dist/documentation.md index c748e3e3f..4751efbd1 100644 --- a/docs/dist/documentation.md +++ b/docs/dist/documentation.md @@ -4009,7 +4009,7 @@ MobileKeyword MetadataType * [.retrieveForCache(_, __, [key])](#MobileKeyword.retrieveForCache) ⇒ Promise.<TYPE.MetadataTypeMapObj> * [.create(metadata)](#MobileKeyword.create) ⇒ Promise * [.update(metadata)](#MobileKeyword.update) ⇒ Promise - * [.postRetrieveTasks(metadata)](#MobileKeyword.postRetrieveTasks) ⇒ TYPE.CodeExtractItem \| TYPE.MetadataTypeItem + * [.postRetrieveTasks(metadata)](#MobileKeyword.postRetrieveTasks) ⇒ TYPE.CodeExtractItem \| TYPE.MetadataTypeItem \| void * [.prepExtractedCode(metadataScript)](#MobileKeyword.prepExtractedCode) ⇒ Object * [.buildDefinitionForNested(templateDir, targetDir, metadata, templateVariables, templateName)](#MobileKeyword.buildDefinitionForNested) ⇒ Promise.<Array.<Array.<string>>> * [.buildTemplateForNested(templateDir, targetDir, metadata, templateVariables, templateName)](#MobileKeyword.buildTemplateForNested) ⇒ Promise.<Array.<Array.<string>>> @@ -4079,11 +4079,11 @@ Updates a single item -### MobileKeyword.postRetrieveTasks(metadata) ⇒ TYPE.CodeExtractItem \| TYPE.MetadataTypeItem +### MobileKeyword.postRetrieveTasks(metadata) ⇒ TYPE.CodeExtractItem \| TYPE.MetadataTypeItem \| void manages post retrieve steps **Kind**: static method of [MobileKeyword](#MobileKeyword) -**Returns**: TYPE.CodeExtractItem \| TYPE.MetadataTypeItem - Array with one metadata object and one ssjs string +**Returns**: TYPE.CodeExtractItem \| TYPE.MetadataTypeItem \| void - Array with one metadata object and one ssjs string; or single metadata object; nothing if filtered | Param | Type | Description | | --- | --- | --- | diff --git a/lib/metadataTypes/MobileKeyword.js b/lib/metadataTypes/MobileKeyword.js index fa4768609..b4d81f2d5 100644 --- a/lib/metadataTypes/MobileKeyword.js +++ b/lib/metadataTypes/MobileKeyword.js @@ -84,9 +84,16 @@ class MobileKeyword extends MetadataType { * manages post retrieve steps * * @param {TYPE.MetadataTypeItem} metadata a single item - * @returns {TYPE.CodeExtractItem | TYPE.MetadataTypeItem} Array with one metadata object and one ssjs string + * @returns {TYPE.CodeExtractItem | TYPE.MetadataTypeItem | void} Array with one metadata object and one ssjs string; or single metadata object; nothing if filtered */ static postRetrieveTasks(metadata) { + try { + cache.searchForField('mobileCode', metadata.code.code, 'code', 'id'); + } catch { + // in case the the mobileCode cannot be found, do not save this keyword as its no longer accessible in the UI either + return; + } + if (metadata.responseMessage) { // extract message body const codeArr = []; From 44df15d2fc66544489986ee8e79424ce84db52ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Berkefeld?= Date: Thu, 25 May 2023 18:06:55 +0200 Subject: [PATCH 42/73] #12: refactoring --- docs/dist/documentation.md | 8 +++---- lib/metadataTypes/Automation.js | 37 +++++++++++++++++---------------- 2 files changed, 23 insertions(+), 22 deletions(-) diff --git a/docs/dist/documentation.md b/docs/dist/documentation.md index 586655ff7..c331a7158 100644 --- a/docs/dist/documentation.md +++ b/docs/dist/documentation.md @@ -1212,7 +1212,7 @@ Automation MetadataType * [.update(metadata, metadataBefore)](#Automation.update) ⇒ Promise * [.preDeployTasks(metadata)](#Automation.preDeployTasks) ⇒ Promise.<TYPE.AutomationItem> * [.validateDeployMetadata(metadata)](#Automation.validateDeployMetadata) ⇒ boolean - * [.postDeployTasks(metadata, originalMetadata)](#Automation.postDeployTasks) ⇒ Promise.<void> + * [.postDeployTasks(metadataMap, originalMetadataMap)](#Automation.postDeployTasks) ⇒ Promise.<void> * [.setFolderPath(metadata)](#Automation.setFolderPath) * [.setFolderId(metadata)](#Automation.setFolderId) * [.parseMetadata(metadata)](#Automation.parseMetadata) ⇒ TYPE.AutomationItem \| void @@ -1345,7 +1345,7 @@ Whitelisted Activites are deployed but require configuration -### Automation.postDeployTasks(metadata, originalMetadata) ⇒ Promise.<void> +### Automation.postDeployTasks(metadataMap, originalMetadataMap) ⇒ Promise.<void> Gets executed after deployment of metadata type **Kind**: static method of [Automation](#Automation) @@ -1353,8 +1353,8 @@ Gets executed after deployment of metadata type | Param | Type | Description | | --- | --- | --- | -| metadata | TYPE.AutomationMap | metadata mapped by their keyField | -| originalMetadata | TYPE.AutomationMap | metadata to be updated (contains additioanl fields) | +| metadataMap | TYPE.AutomationMap | metadata mapped by their keyField | +| originalMetadataMap | TYPE.AutomationMap | metadata to be updated (contains additioanl fields) | diff --git a/lib/metadataTypes/Automation.js b/lib/metadataTypes/Automation.js index 83d6b54d3..31c0edcee 100644 --- a/lib/metadataTypes/Automation.js +++ b/lib/metadataTypes/Automation.js @@ -397,23 +397,23 @@ class Automation extends MetadataType { /** * Gets executed after deployment of metadata type * - * @param {TYPE.AutomationMap} metadata metadata mapped by their keyField - * @param {TYPE.AutomationMap} originalMetadata metadata to be updated (contains additioanl fields) + * @param {TYPE.AutomationMap} metadataMap metadata mapped by their keyField + * @param {TYPE.AutomationMap} originalMetadataMap metadata to be updated (contains additioanl fields) * @returns {Promise.} - */ - static async postDeployTasks(metadata, originalMetadata) { - for (const key in metadata) { + static async postDeployTasks(metadataMap, originalMetadataMap) { + for (const key in metadataMap) { // need to put schedule on here if status is scheduled - if (originalMetadata[key]?.type === 'scheduled') { + if (originalMetadataMap[key]?.type === 'scheduled') { // Starting Source == 'Schedule': Try starting the automation - if (originalMetadata[key].status === 'Scheduled') { + if (originalMetadataMap[key].status === 'Scheduled') { let schedule = null; try { - schedule = this._buildSchedule(originalMetadata[key].schedule); + schedule = this._buildSchedule(originalMetadataMap[key].schedule); } catch (ex) { Util.logger.error( - `- Could not create schedule for automation ${originalMetadata[key].name} to start it: ${ex.message}` + `- Could not create schedule for automation ${originalMetadataMap[key].name} to start it: ${ex.message}` ); } if (schedule !== null) { @@ -431,7 +431,7 @@ class Automation extends MetadataType { schedule, { Interaction: { - ObjectID: metadata[key].id, + ObjectID: metadataMap[key].id, }, }, 'start', @@ -445,31 +445,32 @@ class Automation extends MetadataType { (schedule_interval > 1 ? 's' : '')); Util.logger.warn( ` - scheduled automation '${ - originalMetadata[key].name + originalMetadataMap[key].name }' deployed Active: runs every ${intervalString} starting ${ schedule_StartDateTime.split('T').join(' ').split('.')[0] } ${schedule_timezoneString}` ); } catch (ex) { Util.logger.error( - `- Could not start scheduled automation '${originalMetadata[key].name}': ${ex.message}` + `- Could not start scheduled automation '${originalMetadataMap[key].name}': ${ex.message}` ); } } } else { Util.logger.warn( - ` - scheduled automation '${originalMetadata[key].name}' deployed Paused` + ` - scheduled automation '${originalMetadataMap[key].name}' deployed Paused` ); } } - if (metadata[key].startSource) { - metadata[key].schedule = metadata[key].startSource.schedule; + if (metadataMap[key].startSource) { + metadataMap[key].schedule = metadataMap[key].startSource.schedule; - delete metadata[key].startSource; + delete metadataMap[key].startSource; + } + if (metadataMap[key].schedule) { + metadataMap[key].schedule.typeId = metadataMap[key].schedule.scheduleTypeId; + delete metadataMap[key].schedule.scheduleTypeId; } - if (metadata[key].schedule) { - metadata[key].schedule.typeId = metadata[key].schedule.scheduleTypeId; - delete metadata[key].schedule.scheduleTypeId; } } } From c51a7150a3e141a1f8ca6b6df1d98bb3a12bd832 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Berkefeld?= Date: Thu, 25 May 2023 18:07:28 +0200 Subject: [PATCH 43/73] #12: re-retrieve automation after deployment to get accurate json --- lib/metadataTypes/Automation.js | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/lib/metadataTypes/Automation.js b/lib/metadataTypes/Automation.js index 31c0edcee..50e114595 100644 --- a/lib/metadataTypes/Automation.js +++ b/lib/metadataTypes/Automation.js @@ -70,18 +70,19 @@ class Automation extends MetadataType { }) ) : []; - const parsed = this.parseResponseBody({ items: details }); - - // * retrieveDir is mandatory in this method as it is not used for caching (there is a seperate method for that) - const savedMetadata = await this.saveResults(parsed, retrieveDir, null, null); - Util.logger.info( - `Downloaded: ${this.definition.type} (${Object.keys(savedMetadata).length})` + - Util.getKeysString(key) - ); - if (this.properties.metaDataTypes.documentOnRetrieve.includes(this.definition.type)) { - await this.document(savedMetadata); + let metadataMap = this.parseResponseBody({ items: details }); + // * retrieveDir can be empty when we use it in the context of postDeployTasks + if (retrieveDir) { + metadataMap = await this.saveResults(metadataMap, retrieveDir, null, null); + Util.logger.info( + `Downloaded: ${this.definition.type} (${Object.keys(metadataMap).length})` + + Util.getKeysString(key) + ); + if (this.properties.metaDataTypes.documentOnRetrieve.includes(this.definition.type)) { + await this.document(metadataMap); + } } - return { metadata: savedMetadata, type: this.definition.type }; + return { metadata: metadataMap, type: this.definition.type }; } /** * Retrieves Metadata of Automation @@ -471,6 +472,16 @@ class Automation extends MetadataType { metadataMap[key].schedule.typeId = metadataMap[key].schedule.scheduleTypeId; delete metadataMap[key].schedule.scheduleTypeId; } + + // re-retrieve deployed items because the API does not return any info for them except the new id (api key) + try { + const { metadata } = await this.retrieve(null, null, null, key); + metadataMap[key] = Object.values(metadata)[0]; + // postRetrieveTasks will be run automatically on this via super.saveResult + } catch (ex) { + throw new Error( + `Could not get details for new ${this.definition.type} ${key} from server (${ex.message})` + ); } } } From 3a43aea26d8386df256dd5ef1a95bfb80dfeea86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Berkefeld?= Date: Fri, 26 May 2023 10:21:26 +0200 Subject: [PATCH 44/73] #889: ensure we always keep the id if it is used as key --- lib/metadataTypes/MetadataType.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/metadataTypes/MetadataType.js b/lib/metadataTypes/MetadataType.js index 80fe60d34..4658a7484 100644 --- a/lib/metadataTypes/MetadataType.js +++ b/lib/metadataTypes/MetadataType.js @@ -1528,7 +1528,10 @@ class MetadataType { // so its in retrieve but not in save. Here we put into the clone so that the original // object used for caching doesnt have the Id removed. const saveClone = JSON.parse(JSON.stringify(results[originalKey])); - if (!this.definition.keepId) { + if ( + !this.definition.keepId && + this.definition.idField !== this.definition.keyField + ) { delete saveClone[this.definition.idField]; } From a5d2337b6957e23bea012a85029680896bf2a0ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Berkefeld?= Date: Fri, 26 May 2023 10:23:48 +0200 Subject: [PATCH 45/73] #889: fix mobileKeyword test cases after switching keyField to "id" --- .../definitions/MobileKeyword.definition.js | 5 +- .../testNew_keyword.mobileKeyword-meta.json | 1 + ...ew_keyword_blocked.mobileKeyword-meta.json | 1 + .../9999999/mobileKeyword/build-expected.json | 1 + .../9999999/mobileKeyword/get-expected.json | 1 + .../mobileKeyword/post-create-expected.json | 1 + .../mobileKeyword/template-expected.json | 1 + .../transactionalEmail/get-expected.json | 1 + test/type.mobileKeyword.test.js | 96 +++++++++---------- 9 files changed, 56 insertions(+), 52 deletions(-) diff --git a/lib/metadataTypes/definitions/MobileKeyword.definition.js b/lib/metadataTypes/definitions/MobileKeyword.definition.js index 9d95d23b4..695c4c877 100644 --- a/lib/metadataTypes/definitions/MobileKeyword.definition.js +++ b/lib/metadataTypes/definitions/MobileKeyword.definition.js @@ -3,7 +3,8 @@ module.exports = { dependencies: ['mobileCode'], hasExtended: false, idField: 'id', - keyIsFixed: false, + keepId: true, + keyIsFixed: true, // key == id keyField: 'id', nameField: 'keyword', createdDateField: 'createdDate', @@ -22,7 +23,7 @@ module.exports = { isCreateable: false, isUpdateable: true, retrieving: true, - template: false, + template: true, }, keyword: { isCreateable: true, diff --git a/test/mockRoot/deploy/testInstance/testBU/mobileKeyword/testNew_keyword.mobileKeyword-meta.json b/test/mockRoot/deploy/testInstance/testBU/mobileKeyword/testNew_keyword.mobileKeyword-meta.json index 0e3525320..0daf6b944 100644 --- a/test/mockRoot/deploy/testInstance/testBU/mobileKeyword/testNew_keyword.mobileKeyword-meta.json +++ b/test/mockRoot/deploy/testInstance/testBU/mobileKeyword/testNew_keyword.mobileKeyword-meta.json @@ -2,6 +2,7 @@ "code": { "code": "4912312345678" }, + "id": "testNew_keyword", "keyword": "testNew_keyword", "status": "Active", "restriction": "NONE", diff --git a/test/mockRoot/deploy/testInstance/testBU/mobileKeyword/testNew_keyword_blocked.mobileKeyword-meta.json b/test/mockRoot/deploy/testInstance/testBU/mobileKeyword/testNew_keyword_blocked.mobileKeyword-meta.json index ba94f5392..982b8d2d2 100644 --- a/test/mockRoot/deploy/testInstance/testBU/mobileKeyword/testNew_keyword_blocked.mobileKeyword-meta.json +++ b/test/mockRoot/deploy/testInstance/testBU/mobileKeyword/testNew_keyword_blocked.mobileKeyword-meta.json @@ -2,6 +2,7 @@ "code": { "code": "4912312345678" }, + "id": "testNew_keyword_blocked", "keyword": "testNew_keyword_blocked", "status": "Active", "restriction": "NONE", diff --git a/test/resources/9999999/mobileKeyword/build-expected.json b/test/resources/9999999/mobileKeyword/build-expected.json index 75331b6b2..bfef5a1f9 100644 --- a/test/resources/9999999/mobileKeyword/build-expected.json +++ b/test/resources/9999999/mobileKeyword/build-expected.json @@ -1,4 +1,5 @@ { + "id": "cTVJaG5oSDJPVUNHcUh6Z3pQT2tVdzo4Njow", "code": { "code": "4912312345678" }, diff --git a/test/resources/9999999/mobileKeyword/get-expected.json b/test/resources/9999999/mobileKeyword/get-expected.json index 398d759cf..b4e0bfe33 100644 --- a/test/resources/9999999/mobileKeyword/get-expected.json +++ b/test/resources/9999999/mobileKeyword/get-expected.json @@ -1,4 +1,5 @@ { + "id": "cTVJaG5oSDJPVUNHcUh6Z3pQT2tVdzo4Njow", "createdDate": "2018-03-27T12:37:18.12Z", "lastUpdated": "2018-03-27T12:37:18.167Z", "code": { diff --git a/test/resources/9999999/mobileKeyword/post-create-expected.json b/test/resources/9999999/mobileKeyword/post-create-expected.json index 0c3f1b7d4..c33ef6c2a 100644 --- a/test/resources/9999999/mobileKeyword/post-create-expected.json +++ b/test/resources/9999999/mobileKeyword/post-create-expected.json @@ -1,4 +1,5 @@ { + "id": "NXV4ZFMwTEFwRVczd3RaLUF5X3p5dzo4Njow", "code": { "code": "4912312345678" }, diff --git a/test/resources/9999999/mobileKeyword/template-expected.json b/test/resources/9999999/mobileKeyword/template-expected.json index a79e3f458..8a07c052e 100644 --- a/test/resources/9999999/mobileKeyword/template-expected.json +++ b/test/resources/9999999/mobileKeyword/template-expected.json @@ -1,4 +1,5 @@ { + "id": "cTVJaG5oSDJPVUNHcUh6Z3pQT2tVdzo4Njow", "code": { "code": "4912312345678" }, diff --git a/test/resources/9999999/transactionalEmail/get-expected.json b/test/resources/9999999/transactionalEmail/get-expected.json index 2bb3340b2..2af37069c 100644 --- a/test/resources/9999999/transactionalEmail/get-expected.json +++ b/test/resources/9999999/transactionalEmail/get-expected.json @@ -1,4 +1,5 @@ { + "id": "cTVJaG5oSDJPVUNHcUh6Z3pQT2tVdzo4Njow", "name": "testExisting_temail", "definitionKey": "testExisting_temail", "description": "bla bla", diff --git a/test/type.mobileKeyword.test.js b/test/type.mobileKeyword.test.js index bac8e0ee1..52ef4cefe 100644 --- a/test/type.mobileKeyword.test.js +++ b/test/type.mobileKeyword.test.js @@ -30,12 +30,21 @@ describe('type: mobileKeyword', () => { 'only 1 mobileKeywords expected' ); assert.deepEqual( - await testUtils.getActualJson('testExisting_keyword', 'mobileKeyword'), + await testUtils.getActualJson( + 'cTVJaG5oSDJPVUNHcUh6Z3pQT2tVdzo4Njow', + 'mobileKeyword' + ), await testUtils.getExpectedJson('9999999', 'mobileKeyword', 'get'), 'saved JSON was not equal expected' ); expect( - file(testUtils.getActualFile('testExisting_keyword', 'mobileKeyword', 'amp')) + file( + testUtils.getActualFile( + 'cTVJaG5oSDJPVUNHcUh6Z3pQT2tVdzo4Njow', + 'mobileKeyword', + 'amp' + ) + ) ).to.equal(file(testUtils.getExpectedFile('9999999', 'mobileKeyword', 'get', 'amp'))); assert.equal( testUtils.getAPIHistoryLength(), @@ -51,7 +60,7 @@ describe('type: mobileKeyword', () => { }); it('Should create (but not update) a mobileKeyword', async () => { // WHEN - await handler.deploy('testInstance/testBU', ['mobileKeyword'], ['testNew_keyword']); + await handler.deploy('testInstance/testBU', ['mobileKeyword'], ['testNew_keyword']); // the key is not actually send to the server because key==id and the id is auto-generated // THEN assert.equal(process.exitCode, false, 'deploy should not have thrown an error'); // get results from cache @@ -63,12 +72,21 @@ describe('type: mobileKeyword', () => { ); // confirm created item assert.deepEqual( - await testUtils.getActualJson('testNew_keyword', 'mobileKeyword'), + await testUtils.getActualJson( + 'NXV4ZFMwTEFwRVczd3RaLUF5X3p5dzo4Njow', + 'mobileKeyword' + ), await testUtils.getExpectedJson('9999999', 'mobileKeyword', 'post-create'), 'returned JSON was not equal expected for insert mobileKeyword' ); expect( - file(testUtils.getActualFile('testNew_keyword', 'mobileKeyword', 'amp')) + file( + testUtils.getActualFile( + 'NXV4ZFMwTEFwRVczd3RaLUF5X3p5dzo4Njow', + 'mobileKeyword', + 'amp' + ) + ) ).to.equal( file(testUtils.getExpectedFile('9999999', 'mobileKeyword', 'post-create', 'amp')) ); @@ -108,44 +126,6 @@ describe('type: mobileKeyword', () => { it('Should change the key during update via --changeKeyValue'); }); describe('Templating ================', () => { - it('Should create a mobileKeyword template via retrieveAsTemplate and build it', async () => { - // GIVEN there is a template - const result = await handler.retrieveAsTemplate( - 'testInstance/testBU', - 'mobileKeyword', - ['testExisting_keyword'], - 'testSourceMarket' - ); - // WHEN - assert.equal( - process.exitCode, - false, - 'retrieveAsTemplate should not have thrown an error' - ); - assert.equal( - result.mobileKeyword ? Object.keys(result.mobileKeyword).length : 0, - 1, - 'only one item expected' - ); - assert.deepEqual( - await testUtils.getActualTemplateJson('testExisting_keyword', 'mobileKeyword'), - await testUtils.getExpectedJson('9999999', 'mobileKeyword', 'template'), - 'returned template JSON was not equal expected' - ); - expect( - file( - testUtils.getActualTemplateFile('testExisting_keyword', 'mobileKeyword', 'amp') - ) - ).to.equal( - file(testUtils.getExpectedFile('9999999', 'mobileKeyword', 'template', 'amp')) - ); - assert.equal( - testUtils.getAPIHistoryLength(), - 2, - 'Unexpected number of requests made. Run testUtils.logAPIHistoryDebug() to see the requests' - ); - return; - }); it('Should create a mobileKeyword template via buildTemplate and build it', async () => { // download first before we test buildTemplate await handler.retrieve('testInstance/testBU', ['mobileKeyword']); @@ -153,7 +133,7 @@ describe('type: mobileKeyword', () => { const result = await handler.buildTemplate( 'testInstance/testBU', 'mobileKeyword', - ['testExisting_keyword'], + ['cTVJaG5oSDJPVUNHcUh6Z3pQT2tVdzo4Njow'], 'testSourceMarket' ); assert.equal(process.exitCode, false, 'buildTemplate should not have thrown an error'); @@ -164,13 +144,20 @@ describe('type: mobileKeyword', () => { 'only one mobileKeyword expected' ); assert.deepEqual( - await testUtils.getActualTemplateJson('testExisting_keyword', 'mobileKeyword'), + await testUtils.getActualTemplateJson( + 'cTVJaG5oSDJPVUNHcUh6Z3pQT2tVdzo4Njow', + 'mobileKeyword' + ), await testUtils.getExpectedJson('9999999', 'mobileKeyword', 'template'), 'returned template JSON was not equal expected' ); expect( file( - testUtils.getActualTemplateFile('testExisting_keyword', 'mobileKeyword', 'amp') + testUtils.getActualTemplateFile( + 'cTVJaG5oSDJPVUNHcUh6Z3pQT2tVdzo4Njow', + 'mobileKeyword', + 'amp' + ) ) ).to.equal( file(testUtils.getExpectedFile('9999999', 'mobileKeyword', 'template', 'amp')) @@ -180,7 +167,7 @@ describe('type: mobileKeyword', () => { await handler.buildDefinition( 'testInstance/testBU', 'mobileKeyword', - 'testExisting_keyword', + 'cTVJaG5oSDJPVUNHcUh6Z3pQT2tVdzo4Njow', 'testTargetMarket' ); assert.equal( @@ -189,12 +176,21 @@ describe('type: mobileKeyword', () => { 'buildDefinition should not have thrown an error' ); assert.deepEqual( - await testUtils.getActualDeployJson('testTemplated_keyword', 'mobileKeyword'), + await testUtils.getActualDeployJson( + 'cTVJaG5oSDJPVUNHcUh6Z3pQT2tVdzo4Njow', + 'mobileKeyword' + ), await testUtils.getExpectedJson('9999999', 'mobileKeyword', 'build'), 'returned deployment JSON was not equal expected' ); expect( - file(testUtils.getActualDeployFile('testTemplated_keyword', 'mobileKeyword', 'amp')) + file( + testUtils.getActualDeployFile( + 'cTVJaG5oSDJPVUNHcUh6Z3pQT2tVdzo4Njow', + 'mobileKeyword', + 'amp' + ) + ) ).to.equal(file(testUtils.getExpectedFile('9999999', 'mobileKeyword', 'build', 'amp'))); assert.equal( @@ -209,7 +205,7 @@ describe('type: mobileKeyword', () => { it('Should delete the item', async () => { // WHEN const result = await handler.deleteByKey('testInstance/testBU', 'mobileKeyword', [ - 'testExisting_keyword', + 'cTVJaG5oSDJPVUNHcUh6Z3pQT2tVdzo4Njow', ]); // THEN assert.equal(process.exitCode, false, 'delete should not have thrown an error'); From b6086724c83c3a0bdfb5bf3b235d753488e0ffff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Berkefeld?= Date: Fri, 26 May 2023 10:27:22 +0200 Subject: [PATCH 46/73] #889: revert previous commit --- test/resources/9999999/transactionalEmail/get-expected.json | 1 - 1 file changed, 1 deletion(-) diff --git a/test/resources/9999999/transactionalEmail/get-expected.json b/test/resources/9999999/transactionalEmail/get-expected.json index 2af37069c..2bb3340b2 100644 --- a/test/resources/9999999/transactionalEmail/get-expected.json +++ b/test/resources/9999999/transactionalEmail/get-expected.json @@ -1,5 +1,4 @@ { - "id": "cTVJaG5oSDJPVUNHcUh6Z3pQT2tVdzo4Njow", "name": "testExisting_temail", "definitionKey": "testExisting_temail", "description": "bla bla", From e5fff961fbb9a24a5a1c7d0200bf920d802440ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Berkefeld?= Date: Fri, 26 May 2023 13:07:22 +0200 Subject: [PATCH 47/73] #889: switch to custom keyField c__codeKeyword and support RETRIEVE --- docs/dist/documentation.md | 14 ++++ lib/metadataTypes/MobileKeyword.js | 80 ++++++++++++++++++- .../definitions/MobileKeyword.definition.js | 26 ++++-- 3 files changed, 111 insertions(+), 9 deletions(-) diff --git a/docs/dist/documentation.md b/docs/dist/documentation.md index 779f5886f..6e7090d9b 100644 --- a/docs/dist/documentation.md +++ b/docs/dist/documentation.md @@ -4006,6 +4006,7 @@ MobileKeyword MetadataType * [MobileKeyword](#MobileKeyword) ⇐ [MetadataType](#MetadataType) * [.retrieve(retrieveDir, [_], [__], [key])](#MobileKeyword.retrieve) ⇒ Promise.<TYPE.MetadataTypeMapObj> \| void + * [.parseResponseBody(body, [singleRetrieve])](#MobileKeyword.parseResponseBody) ⇒ TYPE.MetadataTypeMap * [.retrieveForCache(_, __, [key])](#MobileKeyword.retrieveForCache) ⇒ Promise.<TYPE.MetadataTypeMapObj> * [.create(metadata)](#MobileKeyword.create) ⇒ Promise * [.update(metadata)](#MobileKeyword.update) ⇒ Promise @@ -4038,6 +4039,19 @@ Endpoint /legacy/v1/beta/mobile/keyword/ return all Mobile Keywords with all det | [__] | void | unused parameter | | [key] | string | customer key of single item to retrieve | + + +### MobileKeyword.parseResponseBody(body, [singleRetrieve]) ⇒ TYPE.MetadataTypeMap +Builds map of metadata entries mapped to their keyfields + +**Kind**: static method of [MobileKeyword](#MobileKeyword) +**Returns**: TYPE.MetadataTypeMap - keyField => metadata map + +| Param | Type | Description | +| --- | --- | --- | +| body | object | json of response body | +| [singleRetrieve] | string \| number | key of single item to filter by | + ### MobileKeyword.retrieveForCache(_, __, [key]) ⇒ Promise.<TYPE.MetadataTypeMapObj> diff --git a/lib/metadataTypes/MobileKeyword.js b/lib/metadataTypes/MobileKeyword.js index b4d81f2d5..e30996b7e 100644 --- a/lib/metadataTypes/MobileKeyword.js +++ b/lib/metadataTypes/MobileKeyword.js @@ -24,10 +24,27 @@ class MobileKeyword extends MetadataType { */ static retrieve(retrieveDir, _, __, key) { try { + let queryParams; + if (key) { + if (key.startsWith('id:')) { + // overwrite queryParams + queryParams = key.slice(3); + } else if (key.includes('.')) { + // format: code.keyword + const [code, keyword] = key.split('.'); + queryParams = `?view=simple&$where=keyword%20eq%20%27${keyword}%27%20and%code%20eq%20%27${code}%27%20`; + } else { + throw new Error( + `key ${key} has unexpected format. Expected 'code.keyword' or 'id:yourId'` + ); + } + } else { + queryParams = '?view=simple'; + } + return super.retrieveREST( retrieveDir, - '/legacy/v1/beta/mobile/keyword/' + - (key ? (key.startsWith('id:') ? key.slice(3) : key) : '?view=simple'), + '/legacy/v1/beta/mobile/keyword/' + queryParams, null, key ); @@ -43,6 +60,65 @@ class MobileKeyword extends MetadataType { } } + /** + * Builds map of metadata entries mapped to their keyfields + * + * @param {object} body json of response body + * @param {string|number} [singleRetrieve] key of single item to filter by + * @returns {TYPE.MetadataTypeMap} keyField => metadata map + */ + static parseResponseBody(body, singleRetrieve) { + const bodyIteratorField = this.definition.bodyIteratorField; + const keyField = this.definition.keyField; + const metadataStructure = {}; + if (body !== null) { + if (Array.isArray(body)) { + // in some cases data is just an array + for (const item of body) { + this.#createCustomKeyField(item); + const key = item[keyField]; + metadataStructure[key] = item; + } + } else if (body[bodyIteratorField]) { + for (const item of body[bodyIteratorField]) { + this.#createCustomKeyField(item); + const key = item[keyField]; + metadataStructure[key] = item; + } + } else if (singleRetrieve) { + // some types will return a single item intead of an array if the key is supported by their api + // ! currently, the id: prefix is only supported by journey (interaction) + if (singleRetrieve.startsWith('id:')) { + singleRetrieve = body[keyField]; + } + metadataStructure[singleRetrieve] = body; + return metadataStructure; + } + if ( + metadataStructure[singleRetrieve] && + (typeof singleRetrieve === 'string' || typeof singleRetrieve === 'number') + ) { + // in case we really just wanted one entry but couldnt do so in the api call, filter it here + const single = {}; + single[singleRetrieve] = metadataStructure[singleRetrieve]; + return single; + } else if (singleRetrieve) { + return {}; + } + } + return metadataStructure; + } + + /** + * helper for {@link parseResponseBody} that creates a custom key field for this type based on mobileCode and keyword + * + * @private + * @param {TYPE.MetadataType} metadata single item + */ + static #createCustomKeyField(metadata) { + metadata.c__codeKeyword = metadata.code.code + '.' + metadata.keyword; + } + /** * Retrieves event definition metadata for caching * diff --git a/lib/metadataTypes/definitions/MobileKeyword.definition.js b/lib/metadataTypes/definitions/MobileKeyword.definition.js index 695c4c877..9fffc21b4 100644 --- a/lib/metadataTypes/definitions/MobileKeyword.definition.js +++ b/lib/metadataTypes/definitions/MobileKeyword.definition.js @@ -3,9 +3,9 @@ module.exports = { dependencies: ['mobileCode'], hasExtended: false, idField: 'id', - keepId: true, - keyIsFixed: true, // key == id - keyField: 'id', + keepId: false, + keyIsFixed: true, // custom field + keyField: 'c__codeKeyword', nameField: 'keyword', createdDateField: 'createdDate', createdNameField: 'createdBy.name', @@ -22,14 +22,20 @@ module.exports = { // irregular format: NXV4ZFMwTEFwRVczd3RaLUF5X3p5dzo4Njow isCreateable: false, isUpdateable: true, + retrieving: false, + template: false, + }, + c__codeKeyword: { + isCreateable: false, + isUpdateable: false, retrieving: true, template: true, }, keyword: { isCreateable: true, isUpdateable: true, - retrieving: true, - template: true, + retrieving: false, + template: false, }, createdDate: { isCreateable: false, @@ -134,11 +140,17 @@ module.exports = { retrieving: true, template: false, }, + code: { + isCreateable: true, + isUpdateable: true, + retrieving: false, + template: false, + }, 'code.code': { isCreateable: false, isUpdateable: false, - retrieving: true, - template: true, + retrieving: false, + template: false, }, 'code.id': { isCreateable: true, From cc018986f1d5266e32588f15b212352f064f88ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Berkefeld?= Date: Fri, 26 May 2023 13:29:48 +0200 Subject: [PATCH 48/73] #889: enable DELETE with new custom keyField --- docs/dist/documentation.md | 6 +++--- lib/metadataTypes/MobileKeyword.js | 15 +++++++++++---- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/docs/dist/documentation.md b/docs/dist/documentation.md index 6e7090d9b..f86c5fdb0 100644 --- a/docs/dist/documentation.md +++ b/docs/dist/documentation.md @@ -4019,7 +4019,7 @@ MobileKeyword MetadataType * [.postCreateTasks(metadataEntry, apiResponse)](#MobileKeyword.postCreateTasks) ⇒ void * [.postUpdateTasks(metadataEntry, apiResponse)](#MobileKeyword.postUpdateTasks) ⇒ void * [._mergeCode(metadata, deployDir, [templateName])](#MobileKeyword._mergeCode) ⇒ Promise.<string> - * [.deleteByKey(id)](#MobileKeyword.deleteByKey) ⇒ Promise.<boolean> + * [.deleteByKey(key)](#MobileKeyword.deleteByKey) ⇒ Promise.<boolean> * [.postDeleteTasks(customerKey)](#MobileKeyword.postDeleteTasks) ⇒ void * [.getFilesToCommit(keyArr)](#MobileKeyword.getFilesToCommit) ⇒ Array.<string> @@ -4224,7 +4224,7 @@ helper for [preDeployTasks](preDeployTasks) that loads extracted code content ba -### MobileKeyword.deleteByKey(id) ⇒ Promise.<boolean> +### MobileKeyword.deleteByKey(key) ⇒ Promise.<boolean> Delete a metadata item from the specified business unit **Kind**: static method of [MobileKeyword](#MobileKeyword) @@ -4232,7 +4232,7 @@ Delete a metadata item from the specified business unit | Param | Type | Description | | --- | --- | --- | -| id | string | Identifier of item | +| key | string | Identifier of item | diff --git a/lib/metadataTypes/MobileKeyword.js b/lib/metadataTypes/MobileKeyword.js index e30996b7e..33114c661 100644 --- a/lib/metadataTypes/MobileKeyword.js +++ b/lib/metadataTypes/MobileKeyword.js @@ -404,15 +404,22 @@ class MobileKeyword extends MetadataType { /** * Delete a metadata item from the specified business unit * - * @param {string} id Identifier of item + * @param {string} key Identifier of item * @returns {Promise.} deletion success status */ - static async deleteByKey(id) { + static async deleteByKey(key) { + // get id from cache + const { metadata } = await this.retrieveForCache(key); + if (!metadata[key]) { + Util.logger.error(`Could not find ${this.definition.type} with key ${key}.`); + return false; + } + const id = metadata[key][this.definition.idField]; // execute delete Util.logger.info( - ' - Note: As long as the provided API id once existed, you will not see an error even if the mobileKeyword is already deleted.' + ' - Note: As long as the provided API key once existed, you will not see an error even if the mobileKeyword is already deleted.' ); - return super.deleteByKeyREST('/legacy/v1/beta/mobile/keyword/' + id, id, false); + return super.deleteByKeyREST('/legacy/v1/beta/mobile/keyword/' + id, key, false); } /** From 4fc45c83997c252142e49cd7cbfdf7b1d5cb532e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Berkefeld?= Date: Fri, 26 May 2023 13:45:08 +0200 Subject: [PATCH 49/73] #889: enable DEPLOY with new custom keyField --- lib/metadataTypes/MobileKeyword.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/metadataTypes/MobileKeyword.js b/lib/metadataTypes/MobileKeyword.js index 33114c661..08fa85a7f 100644 --- a/lib/metadataTypes/MobileKeyword.js +++ b/lib/metadataTypes/MobileKeyword.js @@ -87,6 +87,7 @@ class MobileKeyword extends MetadataType { } } else if (singleRetrieve) { // some types will return a single item intead of an array if the key is supported by their api + this.#createCustomKeyField(body); // ! currently, the id: prefix is only supported by journey (interaction) if (singleRetrieve.startsWith('id:')) { singleRetrieve = body[keyField]; @@ -347,9 +348,15 @@ class MobileKeyword extends MetadataType { }. Setting to IGNORED.` ); } + const [code, keyword] = metadata.c__codeKeyword.split('.'); // mobileCode - metadata.code.id = cache.searchForField('mobileCode', metadata.code.code, 'code', 'id'); + metadata.code = { + id: cache.searchForField('mobileCode', code, 'code', 'id'), + }; + + // keyword + metadata.keyword = keyword; return metadata; } /** From e4569db897f8c2847a6c79f07f31142b9a676f27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Berkefeld?= Date: Fri, 26 May 2023 13:59:45 +0200 Subject: [PATCH 50/73] #889: enable updating the keyword via changeKeyValue / changeKeyField --- docs/dist/documentation.md | 17 ++++++ lib/metadataTypes/MobileKeyword.js | 52 ++++++++++++++++--- .../definitions/MobileKeyword.definition.js | 3 +- 3 files changed, 62 insertions(+), 10 deletions(-) diff --git a/docs/dist/documentation.md b/docs/dist/documentation.md index f86c5fdb0..03433eab9 100644 --- a/docs/dist/documentation.md +++ b/docs/dist/documentation.md @@ -4007,6 +4007,7 @@ MobileKeyword MetadataType * [MobileKeyword](#MobileKeyword) ⇐ [MetadataType](#MetadataType) * [.retrieve(retrieveDir, [_], [__], [key])](#MobileKeyword.retrieve) ⇒ Promise.<TYPE.MetadataTypeMapObj> \| void * [.parseResponseBody(body, [singleRetrieve])](#MobileKeyword.parseResponseBody) ⇒ TYPE.MetadataTypeMap + * [.createOrUpdate(metadataMap, metadataKey, hasError, metadataToUpdate, metadataToCreate)](#MobileKeyword.createOrUpdate) ⇒ 'create' \| 'update' \| 'skip' * [.retrieveForCache(_, __, [key])](#MobileKeyword.retrieveForCache) ⇒ Promise.<TYPE.MetadataTypeMapObj> * [.create(metadata)](#MobileKeyword.create) ⇒ Promise * [.update(metadata)](#MobileKeyword.update) ⇒ Promise @@ -4052,6 +4053,22 @@ Builds map of metadata entries mapped to their keyfields | body | object | json of response body | | [singleRetrieve] | string \| number | key of single item to filter by | + + +### MobileKeyword.createOrUpdate(metadataMap, metadataKey, hasError, metadataToUpdate, metadataToCreate) ⇒ 'create' \| 'update' \| 'skip' +helper for [upsert](#MetadataType.upsert) + +**Kind**: static method of [MobileKeyword](#MobileKeyword) +**Returns**: 'create' \| 'update' \| 'skip' - action to take + +| Param | Type | Description | +| --- | --- | --- | +| metadataMap | TYPE.MetadataTypeMap | list of metadata | +| metadataKey | string | key of item we are looking at | +| hasError | boolean | error flag from previous code | +| metadataToUpdate | Array.<TYPE.MetadataTypeItemDiff> | list of items to update | +| metadataToCreate | Array.<TYPE.MetadataTypeItem> | list of items to create | + ### MobileKeyword.retrieveForCache(_, __, [key]) ⇒ Promise.<TYPE.MetadataTypeMapObj> diff --git a/lib/metadataTypes/MobileKeyword.js b/lib/metadataTypes/MobileKeyword.js index 08fa85a7f..77c7d5f0b 100644 --- a/lib/metadataTypes/MobileKeyword.js +++ b/lib/metadataTypes/MobileKeyword.js @@ -120,6 +120,49 @@ class MobileKeyword extends MetadataType { metadata.c__codeKeyword = metadata.code.code + '.' + metadata.keyword; } + /** + * helper for {@link preDeployTasks} and {@link createOrUpdate} to ensure we have code & keyword properly set + * + * @private + * @param {TYPE.MetadataType} metadata single item + */ + static #setCodeAndKeyword(metadata) { + const [code, keyword] = metadata.c__codeKeyword.split('.'); + + // mobileCode + metadata.code = { + id: cache.searchForField('mobileCode', code, 'code', 'id'), + }; + + // keyword + metadata.keyword = keyword; + } + + /** + * helper for {@link MetadataType.upsert} + * + * @param {TYPE.MetadataTypeMap} metadataMap list of metadata + * @param {string} metadataKey key of item we are looking at + * @param {boolean} hasError error flag from previous code + * @param {TYPE.MetadataTypeItemDiff[]} metadataToUpdate list of items to update + * @param {TYPE.MetadataTypeItem[]} metadataToCreate list of items to create + * @returns {'create' | 'update' | 'skip'} action to take + */ + static createOrUpdate(metadataMap, metadataKey, hasError, metadataToUpdate, metadataToCreate) { + const createOrUpdateAction = super.createOrUpdate( + metadataMap, + metadataKey, + hasError, + metadataToUpdate, + metadataToCreate + ); + if (createOrUpdateAction === 'update') { + // in case --changeKeyField or --changeKeyValue was used, let's ensure we set code & keyword here again + this.#setCodeAndKeyword(metadataMap[metadataKey]); + } + return createOrUpdateAction; + } + /** * Retrieves event definition metadata for caching * @@ -348,15 +391,8 @@ class MobileKeyword extends MetadataType { }. Setting to IGNORED.` ); } - const [code, keyword] = metadata.c__codeKeyword.split('.'); - // mobileCode - metadata.code = { - id: cache.searchForField('mobileCode', code, 'code', 'id'), - }; - - // keyword - metadata.keyword = keyword; + this.#setCodeAndKeyword(metadata); return metadata; } /** diff --git a/lib/metadataTypes/definitions/MobileKeyword.definition.js b/lib/metadataTypes/definitions/MobileKeyword.definition.js index 9fffc21b4..72ac918af 100644 --- a/lib/metadataTypes/definitions/MobileKeyword.definition.js +++ b/lib/metadataTypes/definitions/MobileKeyword.definition.js @@ -3,8 +3,7 @@ module.exports = { dependencies: ['mobileCode'], hasExtended: false, idField: 'id', - keepId: false, - keyIsFixed: true, // custom field + keyIsFixed: false, // custom field but mapped to normal fields keyField: 'c__codeKeyword', nameField: 'keyword', createdDateField: 'createdDate', From 89959fbb772967a261a05a199082d1f1461b9313 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Berkefeld?= Date: Fri, 26 May 2023 14:02:50 +0200 Subject: [PATCH 51/73] #889: ensure lowercased searches are not rejected keywords are automatically uppercased by SFMC --- lib/metadataTypes/MobileKeyword.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/metadataTypes/MobileKeyword.js b/lib/metadataTypes/MobileKeyword.js index 77c7d5f0b..af5c15aea 100644 --- a/lib/metadataTypes/MobileKeyword.js +++ b/lib/metadataTypes/MobileKeyword.js @@ -30,6 +30,8 @@ class MobileKeyword extends MetadataType { // overwrite queryParams queryParams = key.slice(3); } else if (key.includes('.')) { + // keywords are always uppercased + key = key.toUpperCase(); // format: code.keyword const [code, keyword] = key.split('.'); queryParams = `?view=simple&$where=keyword%20eq%20%27${keyword}%27%20and%code%20eq%20%27${code}%27%20`; From 8d35cb69cbae0f1bb49b568421cfbf2dad325308 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Berkefeld?= Date: Fri, 26 May 2023 14:07:32 +0200 Subject: [PATCH 52/73] Revert "#889: fix mobileKeyword test cases after switching keyField to "id"" This reverts commit a5d2337b6957e23bea012a85029680896bf2a0ce. # Conflicts: # lib/metadataTypes/definitions/MobileKeyword.definition.js --- .../testNew_keyword.mobileKeyword-meta.json | 1 - ...ew_keyword_blocked.mobileKeyword-meta.json | 1 - .../9999999/mobileKeyword/build-expected.json | 1 - .../9999999/mobileKeyword/get-expected.json | 1 - .../mobileKeyword/post-create-expected.json | 1 - .../mobileKeyword/template-expected.json | 1 - test/type.mobileKeyword.test.js | 96 ++++++++++--------- 7 files changed, 50 insertions(+), 52 deletions(-) diff --git a/test/mockRoot/deploy/testInstance/testBU/mobileKeyword/testNew_keyword.mobileKeyword-meta.json b/test/mockRoot/deploy/testInstance/testBU/mobileKeyword/testNew_keyword.mobileKeyword-meta.json index 0daf6b944..0e3525320 100644 --- a/test/mockRoot/deploy/testInstance/testBU/mobileKeyword/testNew_keyword.mobileKeyword-meta.json +++ b/test/mockRoot/deploy/testInstance/testBU/mobileKeyword/testNew_keyword.mobileKeyword-meta.json @@ -2,7 +2,6 @@ "code": { "code": "4912312345678" }, - "id": "testNew_keyword", "keyword": "testNew_keyword", "status": "Active", "restriction": "NONE", diff --git a/test/mockRoot/deploy/testInstance/testBU/mobileKeyword/testNew_keyword_blocked.mobileKeyword-meta.json b/test/mockRoot/deploy/testInstance/testBU/mobileKeyword/testNew_keyword_blocked.mobileKeyword-meta.json index 982b8d2d2..ba94f5392 100644 --- a/test/mockRoot/deploy/testInstance/testBU/mobileKeyword/testNew_keyword_blocked.mobileKeyword-meta.json +++ b/test/mockRoot/deploy/testInstance/testBU/mobileKeyword/testNew_keyword_blocked.mobileKeyword-meta.json @@ -2,7 +2,6 @@ "code": { "code": "4912312345678" }, - "id": "testNew_keyword_blocked", "keyword": "testNew_keyword_blocked", "status": "Active", "restriction": "NONE", diff --git a/test/resources/9999999/mobileKeyword/build-expected.json b/test/resources/9999999/mobileKeyword/build-expected.json index bfef5a1f9..75331b6b2 100644 --- a/test/resources/9999999/mobileKeyword/build-expected.json +++ b/test/resources/9999999/mobileKeyword/build-expected.json @@ -1,5 +1,4 @@ { - "id": "cTVJaG5oSDJPVUNHcUh6Z3pQT2tVdzo4Njow", "code": { "code": "4912312345678" }, diff --git a/test/resources/9999999/mobileKeyword/get-expected.json b/test/resources/9999999/mobileKeyword/get-expected.json index b4e0bfe33..398d759cf 100644 --- a/test/resources/9999999/mobileKeyword/get-expected.json +++ b/test/resources/9999999/mobileKeyword/get-expected.json @@ -1,5 +1,4 @@ { - "id": "cTVJaG5oSDJPVUNHcUh6Z3pQT2tVdzo4Njow", "createdDate": "2018-03-27T12:37:18.12Z", "lastUpdated": "2018-03-27T12:37:18.167Z", "code": { diff --git a/test/resources/9999999/mobileKeyword/post-create-expected.json b/test/resources/9999999/mobileKeyword/post-create-expected.json index c33ef6c2a..0c3f1b7d4 100644 --- a/test/resources/9999999/mobileKeyword/post-create-expected.json +++ b/test/resources/9999999/mobileKeyword/post-create-expected.json @@ -1,5 +1,4 @@ { - "id": "NXV4ZFMwTEFwRVczd3RaLUF5X3p5dzo4Njow", "code": { "code": "4912312345678" }, diff --git a/test/resources/9999999/mobileKeyword/template-expected.json b/test/resources/9999999/mobileKeyword/template-expected.json index 8a07c052e..a79e3f458 100644 --- a/test/resources/9999999/mobileKeyword/template-expected.json +++ b/test/resources/9999999/mobileKeyword/template-expected.json @@ -1,5 +1,4 @@ { - "id": "cTVJaG5oSDJPVUNHcUh6Z3pQT2tVdzo4Njow", "code": { "code": "4912312345678" }, diff --git a/test/type.mobileKeyword.test.js b/test/type.mobileKeyword.test.js index 52ef4cefe..bac8e0ee1 100644 --- a/test/type.mobileKeyword.test.js +++ b/test/type.mobileKeyword.test.js @@ -30,21 +30,12 @@ describe('type: mobileKeyword', () => { 'only 1 mobileKeywords expected' ); assert.deepEqual( - await testUtils.getActualJson( - 'cTVJaG5oSDJPVUNHcUh6Z3pQT2tVdzo4Njow', - 'mobileKeyword' - ), + await testUtils.getActualJson('testExisting_keyword', 'mobileKeyword'), await testUtils.getExpectedJson('9999999', 'mobileKeyword', 'get'), 'saved JSON was not equal expected' ); expect( - file( - testUtils.getActualFile( - 'cTVJaG5oSDJPVUNHcUh6Z3pQT2tVdzo4Njow', - 'mobileKeyword', - 'amp' - ) - ) + file(testUtils.getActualFile('testExisting_keyword', 'mobileKeyword', 'amp')) ).to.equal(file(testUtils.getExpectedFile('9999999', 'mobileKeyword', 'get', 'amp'))); assert.equal( testUtils.getAPIHistoryLength(), @@ -60,7 +51,7 @@ describe('type: mobileKeyword', () => { }); it('Should create (but not update) a mobileKeyword', async () => { // WHEN - await handler.deploy('testInstance/testBU', ['mobileKeyword'], ['testNew_keyword']); // the key is not actually send to the server because key==id and the id is auto-generated + await handler.deploy('testInstance/testBU', ['mobileKeyword'], ['testNew_keyword']); // THEN assert.equal(process.exitCode, false, 'deploy should not have thrown an error'); // get results from cache @@ -72,21 +63,12 @@ describe('type: mobileKeyword', () => { ); // confirm created item assert.deepEqual( - await testUtils.getActualJson( - 'NXV4ZFMwTEFwRVczd3RaLUF5X3p5dzo4Njow', - 'mobileKeyword' - ), + await testUtils.getActualJson('testNew_keyword', 'mobileKeyword'), await testUtils.getExpectedJson('9999999', 'mobileKeyword', 'post-create'), 'returned JSON was not equal expected for insert mobileKeyword' ); expect( - file( - testUtils.getActualFile( - 'NXV4ZFMwTEFwRVczd3RaLUF5X3p5dzo4Njow', - 'mobileKeyword', - 'amp' - ) - ) + file(testUtils.getActualFile('testNew_keyword', 'mobileKeyword', 'amp')) ).to.equal( file(testUtils.getExpectedFile('9999999', 'mobileKeyword', 'post-create', 'amp')) ); @@ -126,6 +108,44 @@ describe('type: mobileKeyword', () => { it('Should change the key during update via --changeKeyValue'); }); describe('Templating ================', () => { + it('Should create a mobileKeyword template via retrieveAsTemplate and build it', async () => { + // GIVEN there is a template + const result = await handler.retrieveAsTemplate( + 'testInstance/testBU', + 'mobileKeyword', + ['testExisting_keyword'], + 'testSourceMarket' + ); + // WHEN + assert.equal( + process.exitCode, + false, + 'retrieveAsTemplate should not have thrown an error' + ); + assert.equal( + result.mobileKeyword ? Object.keys(result.mobileKeyword).length : 0, + 1, + 'only one item expected' + ); + assert.deepEqual( + await testUtils.getActualTemplateJson('testExisting_keyword', 'mobileKeyword'), + await testUtils.getExpectedJson('9999999', 'mobileKeyword', 'template'), + 'returned template JSON was not equal expected' + ); + expect( + file( + testUtils.getActualTemplateFile('testExisting_keyword', 'mobileKeyword', 'amp') + ) + ).to.equal( + file(testUtils.getExpectedFile('9999999', 'mobileKeyword', 'template', 'amp')) + ); + assert.equal( + testUtils.getAPIHistoryLength(), + 2, + 'Unexpected number of requests made. Run testUtils.logAPIHistoryDebug() to see the requests' + ); + return; + }); it('Should create a mobileKeyword template via buildTemplate and build it', async () => { // download first before we test buildTemplate await handler.retrieve('testInstance/testBU', ['mobileKeyword']); @@ -133,7 +153,7 @@ describe('type: mobileKeyword', () => { const result = await handler.buildTemplate( 'testInstance/testBU', 'mobileKeyword', - ['cTVJaG5oSDJPVUNHcUh6Z3pQT2tVdzo4Njow'], + ['testExisting_keyword'], 'testSourceMarket' ); assert.equal(process.exitCode, false, 'buildTemplate should not have thrown an error'); @@ -144,20 +164,13 @@ describe('type: mobileKeyword', () => { 'only one mobileKeyword expected' ); assert.deepEqual( - await testUtils.getActualTemplateJson( - 'cTVJaG5oSDJPVUNHcUh6Z3pQT2tVdzo4Njow', - 'mobileKeyword' - ), + await testUtils.getActualTemplateJson('testExisting_keyword', 'mobileKeyword'), await testUtils.getExpectedJson('9999999', 'mobileKeyword', 'template'), 'returned template JSON was not equal expected' ); expect( file( - testUtils.getActualTemplateFile( - 'cTVJaG5oSDJPVUNHcUh6Z3pQT2tVdzo4Njow', - 'mobileKeyword', - 'amp' - ) + testUtils.getActualTemplateFile('testExisting_keyword', 'mobileKeyword', 'amp') ) ).to.equal( file(testUtils.getExpectedFile('9999999', 'mobileKeyword', 'template', 'amp')) @@ -167,7 +180,7 @@ describe('type: mobileKeyword', () => { await handler.buildDefinition( 'testInstance/testBU', 'mobileKeyword', - 'cTVJaG5oSDJPVUNHcUh6Z3pQT2tVdzo4Njow', + 'testExisting_keyword', 'testTargetMarket' ); assert.equal( @@ -176,21 +189,12 @@ describe('type: mobileKeyword', () => { 'buildDefinition should not have thrown an error' ); assert.deepEqual( - await testUtils.getActualDeployJson( - 'cTVJaG5oSDJPVUNHcUh6Z3pQT2tVdzo4Njow', - 'mobileKeyword' - ), + await testUtils.getActualDeployJson('testTemplated_keyword', 'mobileKeyword'), await testUtils.getExpectedJson('9999999', 'mobileKeyword', 'build'), 'returned deployment JSON was not equal expected' ); expect( - file( - testUtils.getActualDeployFile( - 'cTVJaG5oSDJPVUNHcUh6Z3pQT2tVdzo4Njow', - 'mobileKeyword', - 'amp' - ) - ) + file(testUtils.getActualDeployFile('testTemplated_keyword', 'mobileKeyword', 'amp')) ).to.equal(file(testUtils.getExpectedFile('9999999', 'mobileKeyword', 'build', 'amp'))); assert.equal( @@ -205,7 +209,7 @@ describe('type: mobileKeyword', () => { it('Should delete the item', async () => { // WHEN const result = await handler.deleteByKey('testInstance/testBU', 'mobileKeyword', [ - 'cTVJaG5oSDJPVUNHcUh6Z3pQT2tVdzo4Njow', + 'testExisting_keyword', ]); // THEN assert.equal(process.exitCode, false, 'delete should not have thrown an error'); From 8c8781f94e2f0593ab9da3749326684e6ac553eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Berkefeld?= Date: Fri, 26 May 2023 14:30:41 +0200 Subject: [PATCH 53/73] #889: fix test cases for new code.keyword custom keyField --- test/mockRoot/.mcdevrc.json | 2 + ...78.TESTNEW_KEYWORD.mobileKeyword-meta.amp} | 0 ...8.TESTNEW_KEYWORD.mobileKeyword-meta.json} | 5 +- ...EW_KEYWORD_BLOCKED.mobileKeyword-meta.amp} | 0 ...W_KEYWORD_BLOCKED.mobileKeyword-meta.json} | 5 +- .../get-response.json | 2 +- .../v1/beta/mobile/keyword/get-response.json | 2 +- .../9999999/mobileKeyword/build-expected.json | 5 +- .../9999999/mobileKeyword/get-expected.json | 5 +- .../mobileKeyword/post-create-expected.json | 5 +- .../mobileKeyword/template-expected.json | 5 +- test/type.mobileKeyword.test.js | 76 ++++++++++++++----- 12 files changed, 67 insertions(+), 45 deletions(-) rename test/mockRoot/deploy/testInstance/testBU/mobileKeyword/{testNew_keyword.mobileKeyword-meta.amp => 4912312345678.TESTNEW_KEYWORD.mobileKeyword-meta.amp} (100%) rename test/mockRoot/deploy/testInstance/testBU/mobileKeyword/{testNew_keyword.mobileKeyword-meta.json => 4912312345678.TESTNEW_KEYWORD.mobileKeyword-meta.json} (55%) rename test/mockRoot/deploy/testInstance/testBU/mobileKeyword/{testNew_keyword_blocked.mobileKeyword-meta.amp => 4912312345678.TESTNEW_KEYWORD_BLOCKED.mobileKeyword-meta.amp} (100%) rename test/mockRoot/deploy/testInstance/testBU/mobileKeyword/{testNew_keyword_blocked.mobileKeyword-meta.json => 4912312345678.TESTNEW_KEYWORD_BLOCKED.mobileKeyword-meta.json} (53%) diff --git a/test/mockRoot/.mcdevrc.json b/test/mockRoot/.mcdevrc.json index f4763aee5..e87ecaa83 100644 --- a/test/mockRoot/.mcdevrc.json +++ b/test/mockRoot/.mcdevrc.json @@ -41,6 +41,7 @@ "sharedFolder": "/Shared Data Extensions/test", "suffix": "_test", "prefix": "testExisting_", + "prefixUpper": "TESTEXISTING_", "description": "bla bla", "countryCodeIn": "'test'" }, @@ -51,6 +52,7 @@ "sharedFolder": "/Shared Data Extensions/test target", "suffix": "_testTarget", "prefix": "testTemplated_", + "prefixUpper": "TESTTEMPLATED_", "description": "foobar", "countryCodeIn": "'testTarget'" } diff --git a/test/mockRoot/deploy/testInstance/testBU/mobileKeyword/testNew_keyword.mobileKeyword-meta.amp b/test/mockRoot/deploy/testInstance/testBU/mobileKeyword/4912312345678.TESTNEW_KEYWORD.mobileKeyword-meta.amp similarity index 100% rename from test/mockRoot/deploy/testInstance/testBU/mobileKeyword/testNew_keyword.mobileKeyword-meta.amp rename to test/mockRoot/deploy/testInstance/testBU/mobileKeyword/4912312345678.TESTNEW_KEYWORD.mobileKeyword-meta.amp diff --git a/test/mockRoot/deploy/testInstance/testBU/mobileKeyword/testNew_keyword.mobileKeyword-meta.json b/test/mockRoot/deploy/testInstance/testBU/mobileKeyword/4912312345678.TESTNEW_KEYWORD.mobileKeyword-meta.json similarity index 55% rename from test/mockRoot/deploy/testInstance/testBU/mobileKeyword/testNew_keyword.mobileKeyword-meta.json rename to test/mockRoot/deploy/testInstance/testBU/mobileKeyword/4912312345678.TESTNEW_KEYWORD.mobileKeyword-meta.json index 0e3525320..ee2208c03 100644 --- a/test/mockRoot/deploy/testInstance/testBU/mobileKeyword/testNew_keyword.mobileKeyword-meta.json +++ b/test/mockRoot/deploy/testInstance/testBU/mobileKeyword/4912312345678.TESTNEW_KEYWORD.mobileKeyword-meta.json @@ -1,8 +1,5 @@ { - "code": { - "code": "4912312345678" - }, - "keyword": "testNew_keyword", + "c__codeKeyword": "4912312345678.TESTNEW_KEYWORD", "status": "Active", "restriction": "NONE", "keywordType": "STOP", diff --git a/test/mockRoot/deploy/testInstance/testBU/mobileKeyword/testNew_keyword_blocked.mobileKeyword-meta.amp b/test/mockRoot/deploy/testInstance/testBU/mobileKeyword/4912312345678.TESTNEW_KEYWORD_BLOCKED.mobileKeyword-meta.amp similarity index 100% rename from test/mockRoot/deploy/testInstance/testBU/mobileKeyword/testNew_keyword_blocked.mobileKeyword-meta.amp rename to test/mockRoot/deploy/testInstance/testBU/mobileKeyword/4912312345678.TESTNEW_KEYWORD_BLOCKED.mobileKeyword-meta.amp diff --git a/test/mockRoot/deploy/testInstance/testBU/mobileKeyword/testNew_keyword_blocked.mobileKeyword-meta.json b/test/mockRoot/deploy/testInstance/testBU/mobileKeyword/4912312345678.TESTNEW_KEYWORD_BLOCKED.mobileKeyword-meta.json similarity index 53% rename from test/mockRoot/deploy/testInstance/testBU/mobileKeyword/testNew_keyword_blocked.mobileKeyword-meta.json rename to test/mockRoot/deploy/testInstance/testBU/mobileKeyword/4912312345678.TESTNEW_KEYWORD_BLOCKED.mobileKeyword-meta.json index ba94f5392..69e9a88ad 100644 --- a/test/mockRoot/deploy/testInstance/testBU/mobileKeyword/testNew_keyword_blocked.mobileKeyword-meta.json +++ b/test/mockRoot/deploy/testInstance/testBU/mobileKeyword/4912312345678.TESTNEW_KEYWORD_BLOCKED.mobileKeyword-meta.json @@ -1,8 +1,5 @@ { - "code": { - "code": "4912312345678" - }, - "keyword": "testNew_keyword_blocked", + "c__codeKeyword": "4912312345678.TESTNEW_KEYWORD_BLOCKED", "status": "Active", "restriction": "NONE", "keywordType": "NORMAL", diff --git a/test/resources/9999999/legacy/v1/beta/mobile/keyword/NXV4ZFMwTEFwRVczd3RaLUF5X3p5dzo4Njow/get-response.json b/test/resources/9999999/legacy/v1/beta/mobile/keyword/NXV4ZFMwTEFwRVczd3RaLUF5X3p5dzo4Njow/get-response.json index c58232ce3..cde6ad4a1 100644 --- a/test/resources/9999999/legacy/v1/beta/mobile/keyword/NXV4ZFMwTEFwRVczd3RaLUF5X3p5dzo4Njow/get-response.json +++ b/test/resources/9999999/legacy/v1/beta/mobile/keyword/NXV4ZFMwTEFwRVczd3RaLUF5X3p5dzo4Njow/get-response.json @@ -25,7 +25,7 @@ "isClientOwned": false, "isOwner": false }, - "keyword": "testNew_keyword", + "keyword": "TESTNEW_KEYWORD", "startDate": "2023-03-30T14:00:11.843Z", "endDate": "2043-03-30T14:00:11.843Z", "status": "Active", diff --git a/test/resources/9999999/legacy/v1/beta/mobile/keyword/get-response.json b/test/resources/9999999/legacy/v1/beta/mobile/keyword/get-response.json index 959782996..b256ebe20 100644 --- a/test/resources/9999999/legacy/v1/beta/mobile/keyword/get-response.json +++ b/test/resources/9999999/legacy/v1/beta/mobile/keyword/get-response.json @@ -32,7 +32,7 @@ "isClientOwned": false, "isOwner": false }, - "keyword": "testExisting_keyword", + "keyword": "TESTEXISTING_KEYWORD", "startDate": "2018-03-27T12:37:18.197Z", "endDate": "2038-03-27T12:37:18.197Z", "status": "Active", diff --git a/test/resources/9999999/mobileKeyword/build-expected.json b/test/resources/9999999/mobileKeyword/build-expected.json index 75331b6b2..d23e6a7c1 100644 --- a/test/resources/9999999/mobileKeyword/build-expected.json +++ b/test/resources/9999999/mobileKeyword/build-expected.json @@ -1,8 +1,5 @@ { - "code": { - "code": "4912312345678" - }, - "keyword": "testTemplated_keyword", + "c__codeKeyword": "4912312345678.TESTTEMPLATED_KEYWORD", "keywordType": "NORMAL", "isInherited": false, "restriction": "NONE" diff --git a/test/resources/9999999/mobileKeyword/get-expected.json b/test/resources/9999999/mobileKeyword/get-expected.json index 398d759cf..f06aecbed 100644 --- a/test/resources/9999999/mobileKeyword/get-expected.json +++ b/test/resources/9999999/mobileKeyword/get-expected.json @@ -1,10 +1,7 @@ { "createdDate": "2018-03-27T12:37:18.12Z", "lastUpdated": "2018-03-27T12:37:18.167Z", - "code": { - "code": "4912312345678" - }, - "keyword": "testExisting_keyword", + "c__codeKeyword": "4912312345678.TESTEXISTING_KEYWORD", "startDate": "2018-03-27T12:37:18.197Z", "endDate": "2038-03-27T12:37:18.197Z", "status": "Active", diff --git a/test/resources/9999999/mobileKeyword/post-create-expected.json b/test/resources/9999999/mobileKeyword/post-create-expected.json index 0c3f1b7d4..bfca2dd7c 100644 --- a/test/resources/9999999/mobileKeyword/post-create-expected.json +++ b/test/resources/9999999/mobileKeyword/post-create-expected.json @@ -1,14 +1,11 @@ { - "code": { - "code": "4912312345678" - }, "createdBy": { "name": "API_JornBerkefeld app user" }, "createdDate": "2023-03-30T14:00:11.907Z", "endDate": "2043-03-30T14:00:11.843Z", "isInherited": false, - "keyword": "testNew_keyword", + "c__codeKeyword": "4912312345678.TESTNEW_KEYWORD", "keywordType": "NORMAL", "lastUpdated": "2023-03-30T14:00:12.295Z", "restriction": "NONE", diff --git a/test/resources/9999999/mobileKeyword/template-expected.json b/test/resources/9999999/mobileKeyword/template-expected.json index a79e3f458..d14dac5fe 100644 --- a/test/resources/9999999/mobileKeyword/template-expected.json +++ b/test/resources/9999999/mobileKeyword/template-expected.json @@ -1,8 +1,5 @@ { - "code": { - "code": "4912312345678" - }, - "keyword": "{{{prefix}}}keyword", + "c__codeKeyword": "4912312345678.{{{prefixUpper}}}KEYWORD", "keywordType": "NORMAL", "isInherited": false, "restriction": "NONE" diff --git a/test/type.mobileKeyword.test.js b/test/type.mobileKeyword.test.js index bac8e0ee1..9f37bffc7 100644 --- a/test/type.mobileKeyword.test.js +++ b/test/type.mobileKeyword.test.js @@ -30,12 +30,21 @@ describe('type: mobileKeyword', () => { 'only 1 mobileKeywords expected' ); assert.deepEqual( - await testUtils.getActualJson('testExisting_keyword', 'mobileKeyword'), + await testUtils.getActualJson( + '4912312345678.TESTEXISTING_KEYWORD', + 'mobileKeyword' + ), await testUtils.getExpectedJson('9999999', 'mobileKeyword', 'get'), 'saved JSON was not equal expected' ); expect( - file(testUtils.getActualFile('testExisting_keyword', 'mobileKeyword', 'amp')) + file( + testUtils.getActualFile( + '4912312345678.TESTEXISTING_KEYWORD', + 'mobileKeyword', + 'amp' + ) + ) ).to.equal(file(testUtils.getExpectedFile('9999999', 'mobileKeyword', 'get', 'amp'))); assert.equal( testUtils.getAPIHistoryLength(), @@ -51,7 +60,11 @@ describe('type: mobileKeyword', () => { }); it('Should create (but not update) a mobileKeyword', async () => { // WHEN - await handler.deploy('testInstance/testBU', ['mobileKeyword'], ['testNew_keyword']); + await handler.deploy( + 'testInstance/testBU', + ['mobileKeyword'], + ['4912312345678.TESTNEW_KEYWORD'] + ); // THEN assert.equal(process.exitCode, false, 'deploy should not have thrown an error'); // get results from cache @@ -63,12 +76,14 @@ describe('type: mobileKeyword', () => { ); // confirm created item assert.deepEqual( - await testUtils.getActualJson('testNew_keyword', 'mobileKeyword'), + await testUtils.getActualJson('4912312345678.TESTNEW_KEYWORD', 'mobileKeyword'), await testUtils.getExpectedJson('9999999', 'mobileKeyword', 'post-create'), 'returned JSON was not equal expected for insert mobileKeyword' ); expect( - file(testUtils.getActualFile('testNew_keyword', 'mobileKeyword', 'amp')) + file( + testUtils.getActualFile('4912312345678.TESTNEW_KEYWORD', 'mobileKeyword', 'amp') + ) ).to.equal( file(testUtils.getExpectedFile('9999999', 'mobileKeyword', 'post-create', 'amp')) ); @@ -92,7 +107,7 @@ describe('type: mobileKeyword', () => { await handler.deploy( 'testInstance/testBU', ['mobileKeyword'], - ['testNew_keyword_blocked'] + ['4912312345678.TESTNEW_KEYWORD_BLOCKED'] ); // THEN assert.equal(process.exitCode, true, 'deploy should have thrown an error'); @@ -113,7 +128,7 @@ describe('type: mobileKeyword', () => { const result = await handler.retrieveAsTemplate( 'testInstance/testBU', 'mobileKeyword', - ['testExisting_keyword'], + ['4912312345678.TESTEXISTING_KEYWORD'], 'testSourceMarket' ); // WHEN @@ -128,13 +143,20 @@ describe('type: mobileKeyword', () => { 'only one item expected' ); assert.deepEqual( - await testUtils.getActualTemplateJson('testExisting_keyword', 'mobileKeyword'), + await testUtils.getActualTemplateJson( + '4912312345678.TESTEXISTING_KEYWORD', + 'mobileKeyword' + ), await testUtils.getExpectedJson('9999999', 'mobileKeyword', 'template'), 'returned template JSON was not equal expected' ); expect( file( - testUtils.getActualTemplateFile('testExisting_keyword', 'mobileKeyword', 'amp') + testUtils.getActualTemplateFile( + '4912312345678.TESTEXISTING_KEYWORD', + 'mobileKeyword', + 'amp' + ) ) ).to.equal( file(testUtils.getExpectedFile('9999999', 'mobileKeyword', 'template', 'amp')) @@ -153,7 +175,7 @@ describe('type: mobileKeyword', () => { const result = await handler.buildTemplate( 'testInstance/testBU', 'mobileKeyword', - ['testExisting_keyword'], + ['4912312345678.TESTEXISTING_KEYWORD'], 'testSourceMarket' ); assert.equal(process.exitCode, false, 'buildTemplate should not have thrown an error'); @@ -164,13 +186,20 @@ describe('type: mobileKeyword', () => { 'only one mobileKeyword expected' ); assert.deepEqual( - await testUtils.getActualTemplateJson('testExisting_keyword', 'mobileKeyword'), + await testUtils.getActualTemplateJson( + '4912312345678.TESTEXISTING_KEYWORD', + 'mobileKeyword' + ), await testUtils.getExpectedJson('9999999', 'mobileKeyword', 'template'), 'returned template JSON was not equal expected' ); expect( file( - testUtils.getActualTemplateFile('testExisting_keyword', 'mobileKeyword', 'amp') + testUtils.getActualTemplateFile( + '4912312345678.TESTEXISTING_KEYWORD', + 'mobileKeyword', + 'amp' + ) ) ).to.equal( file(testUtils.getExpectedFile('9999999', 'mobileKeyword', 'template', 'amp')) @@ -180,7 +209,7 @@ describe('type: mobileKeyword', () => { await handler.buildDefinition( 'testInstance/testBU', 'mobileKeyword', - 'testExisting_keyword', + '4912312345678.TESTEXISTING_KEYWORD', 'testTargetMarket' ); assert.equal( @@ -189,12 +218,21 @@ describe('type: mobileKeyword', () => { 'buildDefinition should not have thrown an error' ); assert.deepEqual( - await testUtils.getActualDeployJson('testTemplated_keyword', 'mobileKeyword'), + await testUtils.getActualDeployJson( + '4912312345678.TESTTEMPLATED_KEYWORD', + 'mobileKeyword' + ), await testUtils.getExpectedJson('9999999', 'mobileKeyword', 'build'), 'returned deployment JSON was not equal expected' ); expect( - file(testUtils.getActualDeployFile('testTemplated_keyword', 'mobileKeyword', 'amp')) + file( + testUtils.getActualDeployFile( + '4912312345678.TESTTEMPLATED_KEYWORD', + 'mobileKeyword', + 'amp' + ) + ) ).to.equal(file(testUtils.getExpectedFile('9999999', 'mobileKeyword', 'build', 'amp'))); assert.equal( @@ -209,7 +247,7 @@ describe('type: mobileKeyword', () => { it('Should delete the item', async () => { // WHEN const result = await handler.deleteByKey('testInstance/testBU', 'mobileKeyword', [ - 'testExisting_keyword', + '4912312345678.TESTEXISTING_KEYWORD', ]); // THEN assert.equal(process.exitCode, false, 'delete should not have thrown an error'); @@ -224,7 +262,7 @@ describe('type: mobileKeyword', () => { const fileList = await handler.getFilesToCommit( 'testInstance/testBU', 'mobileKeyword', - ['testExisting_keyword'] + ['4912312345678.TESTEXISTING_KEYWORD'] ); // THEN assert.equal( @@ -236,12 +274,12 @@ describe('type: mobileKeyword', () => { assert.equal( fileList[0].split('\\').join('/'), - 'retrieve/testInstance/testBU/mobileKeyword/testExisting_keyword.mobileKeyword-meta.json', + 'retrieve/testInstance/testBU/mobileKeyword/4912312345678.TESTEXISTING_KEYWORD.mobileKeyword-meta.json', 'wrong JSON path' ); assert.equal( fileList[1].split('\\').join('/'), - 'retrieve/testInstance/testBU/mobileKeyword/testExisting_keyword.mobileKeyword-meta.amp', + 'retrieve/testInstance/testBU/mobileKeyword/4912312345678.TESTEXISTING_KEYWORD.mobileKeyword-meta.amp', 'wrong AMP path' ); return; From 7cd3620297cf192216f16e095d57e9c10879ea5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Berkefeld?= Date: Fri, 26 May 2023 14:43:57 +0200 Subject: [PATCH 54/73] Revert "#889: switch mobileKeyword's keyField to `id` to avoid duplicate overrides" This reverts commit 0d22d37258fff50ad6f76aa43c0c32c33a4f2609. # Conflicts: # docs/dist/documentation.md # lib/metadataTypes/MobileKeyword.js # lib/metadataTypes/definitions/MobileKeyword.definition.js --- docs/dist/documentation.md | 16 +++++++++++++++- lib/metadataTypes/MobileKeyword.js | 26 ++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/docs/dist/documentation.md b/docs/dist/documentation.md index 03433eab9..e628348c1 100644 --- a/docs/dist/documentation.md +++ b/docs/dist/documentation.md @@ -4009,6 +4009,7 @@ MobileKeyword MetadataType * [.parseResponseBody(body, [singleRetrieve])](#MobileKeyword.parseResponseBody) ⇒ TYPE.MetadataTypeMap * [.createOrUpdate(metadataMap, metadataKey, hasError, metadataToUpdate, metadataToCreate)](#MobileKeyword.createOrUpdate) ⇒ 'create' \| 'update' \| 'skip' * [.retrieveForCache(_, __, [key])](#MobileKeyword.retrieveForCache) ⇒ Promise.<TYPE.MetadataTypeMapObj> + * [.retrieveAsTemplate(templateDir, name, templateVariables)](#MobileKeyword.retrieveAsTemplate) ⇒ Promise.<TYPE.MetadataTypeItemObj> * [.create(metadata)](#MobileKeyword.create) ⇒ Promise * [.update(metadata)](#MobileKeyword.update) ⇒ Promise * [.postRetrieveTasks(metadata)](#MobileKeyword.postRetrieveTasks) ⇒ TYPE.CodeExtractItem \| TYPE.MetadataTypeItem \| void @@ -4083,10 +4084,23 @@ Retrieves event definition metadata for caching | __ | void | parameter not used | | [key] | string | customer key of single item to retrieve | + + +### MobileKeyword.retrieveAsTemplate(templateDir, name, templateVariables) ⇒ Promise.<TYPE.MetadataTypeItemObj> +retrieve an item and create a template from it + +**Kind**: static method of [MobileKeyword](#MobileKeyword) +**Returns**: Promise.<TYPE.MetadataTypeItemObj> - Promise of metadata + +| Param | Type | Description | +| --- | --- | --- | +| templateDir | string | Directory where retrieved metadata directory will be saved | +| name | string | name of the metadata file | +| templateVariables | TYPE.TemplateMap | variables to be replaced in the metadata | + ### MobileKeyword.create(metadata) ⇒ Promise -/** Creates a single item **Kind**: static method of [MobileKeyword](#MobileKeyword) diff --git a/lib/metadataTypes/MobileKeyword.js b/lib/metadataTypes/MobileKeyword.js index af5c15aea..c31080c29 100644 --- a/lib/metadataTypes/MobileKeyword.js +++ b/lib/metadataTypes/MobileKeyword.js @@ -178,7 +178,33 @@ class MobileKeyword extends MetadataType { } /** + * retrieve an item and create a template from it * + * @param {string} templateDir Directory where retrieved metadata directory will be saved + * @param {string} name name of the metadata file + * @param {TYPE.TemplateMap} templateVariables variables to be replaced in the metadata + * @returns {Promise.} Promise of metadata + */ + static async retrieveAsTemplate(templateDir, name, templateVariables) { + try { + return super.retrieveTemplateREST( + templateDir, + `/legacy/v1/beta/mobile/keyword/?view=simple&$where=keyword%20eq%20%27${name}%27%20`, + templateVariables, + name + ); + } catch (ex) { + // if the mobileMessage does not exist, the API returns the error "Request failed with status code 400 (ERR_BAD_REQUEST)" which would otherwise bring execution to a hold + if (name && ex.code === 'ERR_BAD_REQUEST') { + Util.logger.info( + `Downloaded: ${this.definition.type} (0)${Util.getKeysString(name)}` + ); + } else { + throw ex; + } + } + } + /** * Creates a single item * From 751aee3ad567b3e69bf8392026164e9c39c4488f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Berkefeld?= Date: Fri, 26 May 2023 14:45:55 +0200 Subject: [PATCH 55/73] #889: apply same code.keyword logic to retrieve and retrieveAsTemplate --- docs/dist/documentation.md | 6 +-- lib/metadataTypes/MobileKeyword.js | 64 +++++++++++++++++++----------- 2 files changed, 43 insertions(+), 27 deletions(-) diff --git a/docs/dist/documentation.md b/docs/dist/documentation.md index e628348c1..de168d7b0 100644 --- a/docs/dist/documentation.md +++ b/docs/dist/documentation.md @@ -4009,7 +4009,7 @@ MobileKeyword MetadataType * [.parseResponseBody(body, [singleRetrieve])](#MobileKeyword.parseResponseBody) ⇒ TYPE.MetadataTypeMap * [.createOrUpdate(metadataMap, metadataKey, hasError, metadataToUpdate, metadataToCreate)](#MobileKeyword.createOrUpdate) ⇒ 'create' \| 'update' \| 'skip' * [.retrieveForCache(_, __, [key])](#MobileKeyword.retrieveForCache) ⇒ Promise.<TYPE.MetadataTypeMapObj> - * [.retrieveAsTemplate(templateDir, name, templateVariables)](#MobileKeyword.retrieveAsTemplate) ⇒ Promise.<TYPE.MetadataTypeItemObj> + * [.retrieveAsTemplate(templateDir, key, templateVariables)](#MobileKeyword.retrieveAsTemplate) ⇒ Promise.<TYPE.MetadataTypeItemObj> * [.create(metadata)](#MobileKeyword.create) ⇒ Promise * [.update(metadata)](#MobileKeyword.update) ⇒ Promise * [.postRetrieveTasks(metadata)](#MobileKeyword.postRetrieveTasks) ⇒ TYPE.CodeExtractItem \| TYPE.MetadataTypeItem \| void @@ -4086,7 +4086,7 @@ Retrieves event definition metadata for caching -### MobileKeyword.retrieveAsTemplate(templateDir, name, templateVariables) ⇒ Promise.<TYPE.MetadataTypeItemObj> +### MobileKeyword.retrieveAsTemplate(templateDir, key, templateVariables) ⇒ Promise.<TYPE.MetadataTypeItemObj> retrieve an item and create a template from it **Kind**: static method of [MobileKeyword](#MobileKeyword) @@ -4095,7 +4095,7 @@ retrieve an item and create a template from it | Param | Type | Description | | --- | --- | --- | | templateDir | string | Directory where retrieved metadata directory will be saved | -| name | string | name of the metadata file | +| key | string | name of the metadata file | | templateVariables | TYPE.TemplateMap | variables to be replaced in the metadata | diff --git a/lib/metadataTypes/MobileKeyword.js b/lib/metadataTypes/MobileKeyword.js index c31080c29..60fdb0caa 100644 --- a/lib/metadataTypes/MobileKeyword.js +++ b/lib/metadataTypes/MobileKeyword.js @@ -25,24 +25,7 @@ class MobileKeyword extends MetadataType { static retrieve(retrieveDir, _, __, key) { try { let queryParams; - if (key) { - if (key.startsWith('id:')) { - // overwrite queryParams - queryParams = key.slice(3); - } else if (key.includes('.')) { - // keywords are always uppercased - key = key.toUpperCase(); - // format: code.keyword - const [code, keyword] = key.split('.'); - queryParams = `?view=simple&$where=keyword%20eq%20%27${keyword}%27%20and%code%20eq%20%27${code}%27%20`; - } else { - throw new Error( - `key ${key} has unexpected format. Expected 'code.keyword' or 'id:yourId'` - ); - } - } else { - queryParams = '?view=simple'; - } + [key, queryParams] = this.#getRetrieveKeyAndUrl(key); return super.retrieveREST( retrieveDir, @@ -181,23 +164,26 @@ class MobileKeyword extends MetadataType { * retrieve an item and create a template from it * * @param {string} templateDir Directory where retrieved metadata directory will be saved - * @param {string} name name of the metadata file + * @param {string} key name of the metadata file * @param {TYPE.TemplateMap} templateVariables variables to be replaced in the metadata * @returns {Promise.} Promise of metadata */ - static async retrieveAsTemplate(templateDir, name, templateVariables) { + static async retrieveAsTemplate(templateDir, key, templateVariables) { try { + let queryParams; + [key, queryParams] = this.#getRetrieveKeyAndUrl(key); + return super.retrieveTemplateREST( templateDir, - `/legacy/v1/beta/mobile/keyword/?view=simple&$where=keyword%20eq%20%27${name}%27%20`, + `/legacy/v1/beta/mobile/keyword/` + queryParams, templateVariables, - name + key ); } catch (ex) { // if the mobileMessage does not exist, the API returns the error "Request failed with status code 400 (ERR_BAD_REQUEST)" which would otherwise bring execution to a hold - if (name && ex.code === 'ERR_BAD_REQUEST') { + if (key && ex.code === 'ERR_BAD_REQUEST') { Util.logger.info( - `Downloaded: ${this.definition.type} (0)${Util.getKeysString(name)}` + `Downloaded: ${this.definition.type} (0)${Util.getKeysString(key)}` ); } else { throw ex; @@ -205,6 +191,36 @@ class MobileKeyword extends MetadataType { } } + /** + * helper for {@link retrieve} and {@link retrieveAsTemplate} + * + * @private + * @param {string} key customer key of single item to retrieve / name of the metadata file + * @returns {Array} key, queryParams + */ + static #getRetrieveKeyAndUrl(key) { + let queryParams; + if (key) { + if (key.startsWith('id:')) { + // overwrite queryParams + queryParams = key.slice(3); + } else if (key.includes('.')) { + // keywords are always uppercased + key = key.toUpperCase(); + // format: code.keyword + const [code, keyword] = key.split('.'); + queryParams = `?view=simple&$where=keyword%20eq%20%27${keyword}%27%20and%code%20eq%20%27${code}%27%20`; + } else { + throw new Error( + `key ${key} has unexpected format. Expected 'code.keyword' or 'id:yourId'` + ); + } + } else { + queryParams = '?view=simple'; + } + return [key, queryParams]; + } + /** * Creates a single item * From 84733d51279e2673ad54d02ee8165c9c9c00bdca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Berkefeld?= Date: Fri, 26 May 2023 15:35:21 +0200 Subject: [PATCH 56/73] #889: remove searchForMobileKeyword; reference c__codeKeyword across other types --- lib/metadataTypes/Journey.js | 21 +++---- lib/metadataTypes/MobileMessage.js | 54 +++++++---------- lib/metadataTypes/TransactionalSMS.js | 18 +++--- .../definitions/MobileMessage.definition.js | 58 ++++++++++++++++--- lib/util/cache.js | 38 ------------ .../9999999/journey/build-expected.json | 2 +- .../9999999/journey/get-expected.json | 2 +- .../9999999/journey/put-expected.json | 2 +- .../9999999/journey/template-expected.json | 2 +- 9 files changed, 95 insertions(+), 102 deletions(-) diff --git a/lib/metadataTypes/Journey.js b/lib/metadataTypes/Journey.js index 95fce8fe4..7c20b2ee3 100644 --- a/lib/metadataTypes/Journey.js +++ b/lib/metadataTypes/Journey.js @@ -542,12 +542,13 @@ class Journey extends MetadataType { try { // mobileKeyword if (activity.configurationArguments?.keywordId) { - activity.configurationArguments.c__mobileKeyword = cache.searchForField( - 'mobileKeyword', - activity.configurationArguments.keywordId, - 'id', - 'keyword' - ); + activity.configurationArguments.r__mobileKeyword_codeKeyword = + cache.searchForField( + 'mobileKeyword', + activity.configurationArguments.keywordId, + 'id', + 'c__codeKeyword' + ); delete activity.configurationArguments.keywordId; } } catch (ex) { @@ -833,14 +834,14 @@ class Journey extends MetadataType { delete activity.configurationArguments.c__mobileMessage_id; } // mobileKeyword - if (activity.configurationArguments?.c__mobileKeyword) { + if (activity.configurationArguments?.r__mobileKeyword_codeKeyword) { activity.configurationArguments.keywordId = cache.searchForField( 'mobileKeyword', - activity.c__mobileKeyword, - 'keyword', + activity.r__mobileKeyword_codeKeyword, + 'c__codeKeyword', 'id' ); - delete activity.configurationArguments.c__mobileKeyword; + delete activity.configurationArguments.r__mobileKeyword_codeKeyword; } if (activity.configurationArguments?.c__next_mobileKeyword) { activity.configurationArguments.nextKeywordId = cache.searchForField( diff --git a/lib/metadataTypes/MobileMessage.js b/lib/metadataTypes/MobileMessage.js index 03546a4bc..a9a1f8227 100644 --- a/lib/metadataTypes/MobileMessage.js +++ b/lib/metadataTypes/MobileMessage.js @@ -163,19 +163,17 @@ class MobileMessage extends MetadataType { // mobileKeyword try { - if (metadata.keyword?.keyword) { - cache.searchForMobileKeyword( - metadata.code.code, - metadata.keyword.keyword, - 'keyword' - ); - } - if (metadata.subscriptionKeyword?.keyword) { - cache.searchForMobileKeyword( - metadata.code.code, - metadata.subscriptionKeyword.keyword, - 'keyword' - ); + for (const attr of ['keyword', 'subscriptionKeyword', 'nextKeyword']) { + if (metadata[attr]?.id) { + metadata[attr] = { + c__codeKeyword: cache.searchForField( + 'mobileKeyword', + metadata[attr].id, + 'id', + 'c__codeKeyword' + ), + }; + } } } catch (ex) { Util.logger.warn( @@ -263,28 +261,16 @@ class MobileMessage extends MetadataType { metadata.code = code; // mobileKeyword - if (metadata.keyword?.keyword) { - const keyword = cache.searchForMobileKeyword( - metadata.code.code, - metadata.keyword.keyword, - 'keyword' - ); - if (!keyword) { - throw new Error(`mobileKeyword ${metadata.keyword.keyword} not found in cache`); - } - metadata.keyword = keyword; - } - if (metadata.subscriptionKeyword?.keyword) { - const keyword = cache.searchForMobileKeyword( - metadata.code.code, - metadata.subscriptionKeyword.keyword, - 'keyword' - ); - if (!keyword) { - throw new Error(`mobileKeyword ${metadata.keyword.keyword} not found in cache`); + for (const attr of ['keyword', 'subscriptionKeyword', 'nextKeyword']) { + if (metadata[attr]?.c__codeKeyword) { + const keywordObj = cache.getByKey('mobileKeyword', metadata[attr].c__codeKeyword); + if (!keywordObj) { + throw new Error( + `mobileKeyword ${metadata[attr].c__codeKeyword} not found in cache` + ); + } + metadata[attr] = keywordObj; } - - metadata.subscriptionKeyword.keyword = keyword; } // campaign diff --git a/lib/metadataTypes/TransactionalSMS.js b/lib/metadataTypes/TransactionalSMS.js index d7998896a..4e9bfb3db 100644 --- a/lib/metadataTypes/TransactionalSMS.js +++ b/lib/metadataTypes/TransactionalSMS.js @@ -56,10 +56,11 @@ class TransactionalSMS extends TransactionalMessage { // subscriptions: mobileKeyword if (metadata.subscriptions?.keyword) { // we merely want to be able to show an error if it does not exist - cache.searchForMobileKeyword( - metadata.subscriptions.shortCode, - metadata.subscriptions.keyword, - 'keyword' + cache.searchForField( + 'mobileKeyword', + metadata.subscriptions.shortCode + '.' + metadata.subscriptions.keyword, + 'c__codeKeyword', + 'id' ); } return metadata; @@ -139,10 +140,11 @@ class TransactionalSMS extends TransactionalMessage { if (metadata.subscriptions?.keyword) { try { // we merely want to be able to show a warning if it does not exist - cache.searchForMobileKeyword( - metadata.subscriptions.shortCode, - metadata.subscriptions.keyword, - 'keyword' + cache.searchForField( + 'mobileKeyword', + metadata.subscriptions.shortCode + '.' + metadata.subscriptions.keyword, + 'keyword', + 'id' ); } catch { Util.logger.warn( diff --git a/lib/metadataTypes/definitions/MobileMessage.definition.js b/lib/metadataTypes/definitions/MobileMessage.definition.js index 463447380..93bfc9eeb 100644 --- a/lib/metadataTypes/definitions/MobileMessage.definition.js +++ b/lib/metadataTypes/definitions/MobileMessage.definition.js @@ -316,6 +316,12 @@ module.exports = { 'keyword.keyword': { isCreateable: true, isUpdateable: true, + retrieving: false, + template: false, + }, + 'keyword.c__codeKeyword': { + isCreateable: false, + isUpdateable: false, retrieving: true, template: true, }, @@ -620,27 +626,63 @@ module.exports = { 'subscriptionKeyword.id': { isCreatable: true, isUpdatable: true, - retrieving: true, - template: true, + retrieving: false, + template: false, }, 'subscriptionKeyword.keyword': { - isCreatable: true, - isUpdatable: true, + isCreatable: false, + isUpdatable: false, + retrieving: false, + template: false, + }, + 'subscriptionKeyword.c__codeKeyword': { + isCreateable: false, + isUpdateable: false, retrieving: true, template: true, }, 'subscriptionKeyword.restriction': { - isCreatable: true, - isUpdatable: true, - retrieving: true, - template: true, + isCreatable: false, + isUpdatable: false, + retrieving: false, + template: false, }, 'subscriptionKeyword.isInherited': { + isCreatable: false, + isUpdatable: false, + retrieving: false, + template: false, + }, + 'nextKeyword.id': { isCreatable: true, isUpdatable: true, + retrieving: false, + template: false, + }, + 'nextKeyword.keyword': { + isCreatable: false, + isUpdatable: false, + retrieving: false, + template: false, + }, + 'nextKeyword.c__codeKeyword': { + isCreateable: false, + isUpdateable: false, retrieving: true, template: true, }, + 'nextKeyword.restriction': { + isCreatable: false, + isUpdatable: false, + retrieving: false, + template: false, + }, + 'nextKeyword.isInherited': { + isCreatable: false, + isUpdatable: false, + retrieving: false, + template: false, + }, subscriberResponseMessage: { isCreatable: true, isUpdatable: true, diff --git a/lib/util/cache.js b/lib/util/cache.js index f84dba02d..bcea3a35d 100644 --- a/lib/util/cache.js +++ b/lib/util/cache.js @@ -120,44 +120,6 @@ module.exports = { `Dependent ${metadataType} with ${searchField}='${searchValue}' was not found on your BU` ); }, - /** - * standardized method for getting data from cache. - * - * @param {string} code mobileCode - * @param {string} keyword mobileKeyword - * @param {string} returnField field which should be returned - * @returns {string|number|boolean} value of specified field. Error is thrown if not found - */ - searchForMobileKeyword(code, keyword, returnField) { - const metadataType = 'mobileKeyword'; - for (const key in dataStore[currentMID]?.[metadataType]) { - if ( - Util.resolveObjPath('code.code', dataStore[currentMID][metadataType][key]) == - code && - Util.resolveObjPath('keyword', dataStore[currentMID][metadataType][key]) == keyword - ) { - try { - if ( - Util.resolveObjPath(returnField, dataStore[currentMID][metadataType][key]) - ) { - return Util.resolveObjPath( - returnField, - dataStore[currentMID][metadataType][key] - ); - } else { - throw new Error(); // eslint-disable-line unicorn/error-message - } - } catch { - throw new Error( - `${metadataType} with code ${code} and keyword ${keyword} does not have field '${returnField}'` - ); - } - } - } - throw new Error( - `Dependent ${metadataType} with code ${code} and keyword ${keyword} was not found on your BU` - ); - }, /** * standardized method for getting data from cache - adapted for special case of lists * ! keeping this in util/cache.js rather than in metadataTypes/List.js to avoid potential circular dependencies diff --git a/test/resources/9999999/journey/build-expected.json b/test/resources/9999999/journey/build-expected.json index 87036f2b5..b3e4d5489 100644 --- a/test/resources/9999999/journey/build-expected.json +++ b/test/resources/9999999/journey/build-expected.json @@ -323,7 +323,7 @@ }, "configurationArguments": { "c__mobileMessage_id": "NTIzOjc4OjA", - "c__mobileKeyword": "testTemplated_keyword", + "r__mobileKeyword_codeKeyword": "4912312345678.TESTTEMPLATED_KEYWORD", "isOptIn": false, "honorBlackoutWindowEnum": 0, "mobileBlackoutWindowStartTime": "", diff --git a/test/resources/9999999/journey/get-expected.json b/test/resources/9999999/journey/get-expected.json index ba60a360e..19b1f9330 100644 --- a/test/resources/9999999/journey/get-expected.json +++ b/test/resources/9999999/journey/get-expected.json @@ -326,7 +326,7 @@ }, "configurationArguments": { "c__mobileMessage_id": "NTIzOjc4OjA", - "c__mobileKeyword": "testExisting_keyword", + "r__mobileKeyword_codeKeyword": "4912312345678.TESTEXISTING_KEYWORD", "isOptIn": false, "honorBlackoutWindowEnum": 0, "mobileBlackoutWindowStartTime": "", diff --git a/test/resources/9999999/journey/put-expected.json b/test/resources/9999999/journey/put-expected.json index f21faf546..aa005cf60 100644 --- a/test/resources/9999999/journey/put-expected.json +++ b/test/resources/9999999/journey/put-expected.json @@ -326,7 +326,7 @@ }, "configurationArguments": { "c__mobileMessage_id": "NTIzOjc4OjA", - "c__mobileKeyword": "testExisting_keyword", + "r__mobileKeyword_codeKeyword": "4912312345678.TESTEXISTING_KEYWORD", "isOptIn": false, "honorBlackoutWindowEnum": 0, "mobileBlackoutWindowStartTime": "", diff --git a/test/resources/9999999/journey/template-expected.json b/test/resources/9999999/journey/template-expected.json index c474ee3ed..ec0b7e58f 100644 --- a/test/resources/9999999/journey/template-expected.json +++ b/test/resources/9999999/journey/template-expected.json @@ -323,7 +323,7 @@ }, "configurationArguments": { "c__mobileMessage_id": "NTIzOjc4OjA", - "c__mobileKeyword": "{{{prefix}}}keyword", + "r__mobileKeyword_codeKeyword": "4912312345678.{{{prefixUpper}}}KEYWORD", "isOptIn": false, "honorBlackoutWindowEnum": 0, "mobileBlackoutWindowStartTime": "", From 0c60da40e9e938a75131bb7bd71a88932c80106c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Berkefeld?= Date: Fri, 26 May 2023 15:36:45 +0200 Subject: [PATCH 57/73] #889: enforce upper-cased keywords in tests --- .../testExisting_tsms.transactionalSMS-meta.json | 2 +- .../transactionalSMS/testNew_tsms.transactionalSMS-meta.json | 2 +- .../legacy/v1/beta/mobile/message/NTIzOjc4OjA/get-response.json | 2 +- .../9999999/legacy/v1/beta/mobile/message/get-response.json | 2 +- .../9999999/messaging/v1/sms/definitions/post-response.json | 2 +- .../v1/sms/definitions/testExisting_tsms/get-response.json | 2 +- .../v1/sms/definitions/testExisting_tsms/patch-response.json | 2 +- test/resources/9999999/transactionalSMS/build-expected.json | 2 +- test/resources/9999999/transactionalSMS/get-expected.json | 2 +- test/resources/9999999/transactionalSMS/patch-expected.json | 2 +- test/resources/9999999/transactionalSMS/post-expected.json | 2 +- test/resources/9999999/transactionalSMS/template-expected.json | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/test/mockRoot/deploy/testInstance/testBU/transactionalSMS/testExisting_tsms.transactionalSMS-meta.json b/test/mockRoot/deploy/testInstance/testBU/transactionalSMS/testExisting_tsms.transactionalSMS-meta.json index 4cf9c7393..3ec2688e1 100644 --- a/test/mockRoot/deploy/testInstance/testBU/transactionalSMS/testExisting_tsms.transactionalSMS-meta.json +++ b/test/mockRoot/deploy/testInstance/testBU/transactionalSMS/testExisting_tsms.transactionalSMS-meta.json @@ -10,6 +10,6 @@ "countryCode": "", "autoAddSubscriber": true, "updateSubscriber": true, - "keyword": "testExisting_keyword" + "keyword": "TESTEXISTING_KEYWORD" } } diff --git a/test/mockRoot/deploy/testInstance/testBU/transactionalSMS/testNew_tsms.transactionalSMS-meta.json b/test/mockRoot/deploy/testInstance/testBU/transactionalSMS/testNew_tsms.transactionalSMS-meta.json index cb2fc540b..262b76007 100644 --- a/test/mockRoot/deploy/testInstance/testBU/transactionalSMS/testNew_tsms.transactionalSMS-meta.json +++ b/test/mockRoot/deploy/testInstance/testBU/transactionalSMS/testNew_tsms.transactionalSMS-meta.json @@ -10,6 +10,6 @@ "countryCode": "", "autoAddSubscriber": true, "updateSubscriber": true, - "keyword": "testExisting_keyword" + "keyword": "TESTEXISTING_KEYWORD" } } diff --git a/test/resources/9999999/legacy/v1/beta/mobile/message/NTIzOjc4OjA/get-response.json b/test/resources/9999999/legacy/v1/beta/mobile/message/NTIzOjc4OjA/get-response.json index 22a604705..5e69ccee8 100644 --- a/test/resources/9999999/legacy/v1/beta/mobile/message/NTIzOjc4OjA/get-response.json +++ b/test/resources/9999999/legacy/v1/beta/mobile/message/NTIzOjc4OjA/get-response.json @@ -90,7 +90,7 @@ "isSentImmediately": true, "nextKeyword": { "id": "cTVJaG5oSDJPVUNHcUh6Z3pQT2tVdzo4Njow", - "keyword": "testExisting_keyword", + "keyword": "TESTEXISTING_KEYWORD", "restriction": "NONE", "isInherited": false }, diff --git a/test/resources/9999999/legacy/v1/beta/mobile/message/get-response.json b/test/resources/9999999/legacy/v1/beta/mobile/message/get-response.json index 43ba203a7..8cf078833 100644 --- a/test/resources/9999999/legacy/v1/beta/mobile/message/get-response.json +++ b/test/resources/9999999/legacy/v1/beta/mobile/message/get-response.json @@ -111,7 +111,7 @@ "isSentImmediately": true, "nextKeyword": { "id": "cTVJaG5oSDJPVUNHcUh6Z3pQT2tVdzo4Njow", - "keyword": "testExisting_keyword", + "keyword": "TESTEXISTING_KEYWORD", "restriction": "NONE", "isInherited": false }, diff --git a/test/resources/9999999/messaging/v1/sms/definitions/post-response.json b/test/resources/9999999/messaging/v1/sms/definitions/post-response.json index c66b9bda0..d78803aa8 100644 --- a/test/resources/9999999/messaging/v1/sms/definitions/post-response.json +++ b/test/resources/9999999/messaging/v1/sms/definitions/post-response.json @@ -12,6 +12,6 @@ "countryCode": "", "autoAddSubscriber": true, "updateSubscriber": true, - "keyword": "testExisting_keyword" + "keyword": "TESTEXISTING_KEYWORD" } } diff --git a/test/resources/9999999/messaging/v1/sms/definitions/testExisting_tsms/get-response.json b/test/resources/9999999/messaging/v1/sms/definitions/testExisting_tsms/get-response.json index cfca58680..e42c625ff 100644 --- a/test/resources/9999999/messaging/v1/sms/definitions/testExisting_tsms/get-response.json +++ b/test/resources/9999999/messaging/v1/sms/definitions/testExisting_tsms/get-response.json @@ -13,6 +13,6 @@ "countryCode": "", "autoAddSubscriber": true, "updateSubscriber": true, - "keyword": "testExisting_keyword" + "keyword": "TESTEXISTING_KEYWORD" } } diff --git a/test/resources/9999999/messaging/v1/sms/definitions/testExisting_tsms/patch-response.json b/test/resources/9999999/messaging/v1/sms/definitions/testExisting_tsms/patch-response.json index cfca58680..e42c625ff 100644 --- a/test/resources/9999999/messaging/v1/sms/definitions/testExisting_tsms/patch-response.json +++ b/test/resources/9999999/messaging/v1/sms/definitions/testExisting_tsms/patch-response.json @@ -13,6 +13,6 @@ "countryCode": "", "autoAddSubscriber": true, "updateSubscriber": true, - "keyword": "testExisting_keyword" + "keyword": "TESTEXISTING_KEYWORD" } } diff --git a/test/resources/9999999/transactionalSMS/build-expected.json b/test/resources/9999999/transactionalSMS/build-expected.json index 43f5c142f..951d2e441 100644 --- a/test/resources/9999999/transactionalSMS/build-expected.json +++ b/test/resources/9999999/transactionalSMS/build-expected.json @@ -8,6 +8,6 @@ "countryCode": "", "autoAddSubscriber": true, "updateSubscriber": true, - "keyword": "testTemplated_keyword" + "keyword": "TESTTEMPLATED_KEYWORD" } } diff --git a/test/resources/9999999/transactionalSMS/get-expected.json b/test/resources/9999999/transactionalSMS/get-expected.json index 4cf9c7393..3ec2688e1 100644 --- a/test/resources/9999999/transactionalSMS/get-expected.json +++ b/test/resources/9999999/transactionalSMS/get-expected.json @@ -10,6 +10,6 @@ "countryCode": "", "autoAddSubscriber": true, "updateSubscriber": true, - "keyword": "testExisting_keyword" + "keyword": "TESTEXISTING_KEYWORD" } } diff --git a/test/resources/9999999/transactionalSMS/patch-expected.json b/test/resources/9999999/transactionalSMS/patch-expected.json index 4cf9c7393..3ec2688e1 100644 --- a/test/resources/9999999/transactionalSMS/patch-expected.json +++ b/test/resources/9999999/transactionalSMS/patch-expected.json @@ -10,6 +10,6 @@ "countryCode": "", "autoAddSubscriber": true, "updateSubscriber": true, - "keyword": "testExisting_keyword" + "keyword": "TESTEXISTING_KEYWORD" } } diff --git a/test/resources/9999999/transactionalSMS/post-expected.json b/test/resources/9999999/transactionalSMS/post-expected.json index cb2fc540b..262b76007 100644 --- a/test/resources/9999999/transactionalSMS/post-expected.json +++ b/test/resources/9999999/transactionalSMS/post-expected.json @@ -10,6 +10,6 @@ "countryCode": "", "autoAddSubscriber": true, "updateSubscriber": true, - "keyword": "testExisting_keyword" + "keyword": "TESTEXISTING_KEYWORD" } } diff --git a/test/resources/9999999/transactionalSMS/template-expected.json b/test/resources/9999999/transactionalSMS/template-expected.json index 238056a5f..302c20679 100644 --- a/test/resources/9999999/transactionalSMS/template-expected.json +++ b/test/resources/9999999/transactionalSMS/template-expected.json @@ -8,6 +8,6 @@ "countryCode": "", "autoAddSubscriber": true, "updateSubscriber": true, - "keyword": "{{{prefix}}}keyword" + "keyword": "{{{prefixUpper}}}KEYWORD" } } From 5ab2c35996a0af8bf16437a0aa8c85b82aaea204 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Berkefeld?= Date: Fri, 26 May 2023 15:38:35 +0200 Subject: [PATCH 58/73] #936: allow "Revert ..." commit messages --- .husky/commit-msg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.husky/commit-msg b/.husky/commit-msg index fdf5fdf80..cf7663854 100644 --- a/.husky/commit-msg +++ b/.husky/commit-msg @@ -2,7 +2,7 @@ . "$(dirname "$0")/_/husky.sh" INPUT_FILE=$1 START_LINE=`head -n1 $INPUT_FILE` -PATTERN="^(#[[:digit:]]|Merge)" +PATTERN="^(#[[:digit:]]|Merge|Revert)" if ! [[ "$START_LINE" =~ $PATTERN ]] ; then echo "Bad commit message, see example: \"#431 commit message\", you provided: \"$START_LINE\"" From b772bb5f47dbbd036a46192586d91822ee03ee5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Berkefeld?= Date: Fri, 26 May 2023 15:55:22 +0200 Subject: [PATCH 59/73] #889: enhance debug log for filtered keywords --- lib/metadataTypes/MobileKeyword.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/metadataTypes/MobileKeyword.js b/lib/metadataTypes/MobileKeyword.js index 60fdb0caa..02ade31c3 100644 --- a/lib/metadataTypes/MobileKeyword.js +++ b/lib/metadataTypes/MobileKeyword.js @@ -255,6 +255,11 @@ class MobileKeyword extends MetadataType { cache.searchForField('mobileCode', metadata.code.code, 'code', 'id'); } catch { // in case the the mobileCode cannot be found, do not save this keyword as its no longer accessible in the UI either + Util.logger.debug( + ` - skipping ${this.definition.type} ${ + metadata[this.definition.keyField] + }. Could not find parent mobileCode ${metadata.code.code}` + ); return; } From 665018e17c94fc70df57358de89c642ae1aa44be Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 May 2023 08:07:00 +0000 Subject: [PATCH 60/73] Bump eslint from 8.39.0 to 8.41.0 Bumps [eslint](https://github.com/eslint/eslint) from 8.39.0 to 8.41.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v8.39.0...v8.41.0) --- updated-dependencies: - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 120 ++++++++++++++++++++-------------------------- package.json | 2 +- 2 files changed, 54 insertions(+), 68 deletions(-) diff --git a/package-lock.json b/package-lock.json index d9468e449..44c95f900 100644 --- a/package-lock.json +++ b/package-lock.json @@ -38,7 +38,7 @@ "axios-mock-adapter": "1.21.3", "chai": "4.3.7", "chai-files": "1.4.0", - "eslint": "8.39.0", + "eslint": "8.41.0", "eslint-config-prettier": "8.7.0", "eslint-config-ssjs": "1.1.11", "eslint-plugin-jsdoc": "44.2.4", @@ -545,14 +545,14 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz", - "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", + "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.5.1", + "espree": "^9.5.2", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -590,9 +590,9 @@ "dev": true }, "node_modules/@eslint/js": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.39.0.tgz", - "integrity": "sha512-kf9RB0Fg7NZfap83B3QOqOGg9QmD9yBudqQXzzOtn3i4y7ZUXe5ONeW34Gwi+TxhH4mvj72R1Zc300KUMa9Bng==", + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.41.0.tgz", + "integrity": "sha512-LxcyMGxwmTh2lY9FwHPGWOHmYFCZvbrFCBZL4FzSSsxsRPuhrYUg/49/0KDfW8tnIEaEHtfmn6+NPN+1DqaNmA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3138,15 +3138,15 @@ } }, "node_modules/eslint": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.39.0.tgz", - "integrity": "sha512-mwiok6cy7KTW7rBpo05k6+p4YVZByLNjAZ/ACB9DRCu4YDRwjXI01tWHp6KAUWelsBetTxKK/2sHB0vdS8Z2Og==", + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.41.0.tgz", + "integrity": "sha512-WQDQpzGBOP5IrXPo4Hc0814r4/v2rrIsB0rhT7jtunIalgg6gYXWhRMOejVO8yH21T/FGaxjmFjBMNqcIlmH1Q==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.2", - "@eslint/js": "8.39.0", + "@eslint/eslintrc": "^2.0.3", + "@eslint/js": "8.41.0", "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -3157,8 +3157,8 @@ "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.2.0", - "eslint-visitor-keys": "^3.4.0", - "espree": "^9.5.1", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.5.2", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -3166,13 +3166,12 @@ "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", + "graphemer": "^1.4.0", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", @@ -3399,9 +3398,9 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", - "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3433,14 +3432,14 @@ "dev": true }, "node_modules/espree": { - "version": "9.5.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz", - "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==", + "version": "9.5.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", + "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", "dev": true, "dependencies": { "acorn": "^8.8.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.0" + "eslint-visitor-keys": "^3.4.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -4383,10 +4382,10 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, "node_modules/handlebars": { @@ -5447,12 +5446,6 @@ "node": ">=8" } }, - "node_modules/js-sdsl": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz", - "integrity": "sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==", - "dev": true - }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -10365,14 +10358,14 @@ "dev": true }, "@eslint/eslintrc": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz", - "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", + "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.5.1", + "espree": "^9.5.2", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -10402,9 +10395,9 @@ } }, "@eslint/js": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.39.0.tgz", - "integrity": "sha512-kf9RB0Fg7NZfap83B3QOqOGg9QmD9yBudqQXzzOtn3i4y7ZUXe5ONeW34Gwi+TxhH4mvj72R1Zc300KUMa9Bng==", + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.41.0.tgz", + "integrity": "sha512-LxcyMGxwmTh2lY9FwHPGWOHmYFCZvbrFCBZL4FzSSsxsRPuhrYUg/49/0KDfW8tnIEaEHtfmn6+NPN+1DqaNmA==", "dev": true }, "@humanwhocodes/config-array": { @@ -12341,15 +12334,15 @@ "dev": true }, "eslint": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.39.0.tgz", - "integrity": "sha512-mwiok6cy7KTW7rBpo05k6+p4YVZByLNjAZ/ACB9DRCu4YDRwjXI01tWHp6KAUWelsBetTxKK/2sHB0vdS8Z2Og==", + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.41.0.tgz", + "integrity": "sha512-WQDQpzGBOP5IrXPo4Hc0814r4/v2rrIsB0rhT7jtunIalgg6gYXWhRMOejVO8yH21T/FGaxjmFjBMNqcIlmH1Q==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.2", - "@eslint/js": "8.39.0", + "@eslint/eslintrc": "^2.0.3", + "@eslint/js": "8.41.0", "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -12360,8 +12353,8 @@ "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.2.0", - "eslint-visitor-keys": "^3.4.0", - "espree": "^9.5.1", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.5.2", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -12369,13 +12362,12 @@ "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", + "graphemer": "^1.4.0", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", @@ -12534,20 +12526,20 @@ } }, "eslint-visitor-keys": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", - "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", "dev": true }, "espree": { - "version": "9.5.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz", - "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==", + "version": "9.5.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", + "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", "dev": true, "requires": { "acorn": "^8.8.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.0" + "eslint-visitor-keys": "^3.4.1" } }, "esprima": { @@ -13220,10 +13212,10 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" }, - "grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, "handlebars": { @@ -13955,12 +13947,6 @@ "istanbul-lib-report": "^3.0.0" } }, - "js-sdsl": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz", - "integrity": "sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==", - "dev": true - }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", diff --git a/package.json b/package.json index ca03eead0..090569f48 100644 --- a/package.json +++ b/package.json @@ -84,7 +84,7 @@ "axios-mock-adapter": "1.21.3", "chai": "4.3.7", "chai-files": "1.4.0", - "eslint": "8.39.0", + "eslint": "8.41.0", "eslint-config-prettier": "8.7.0", "eslint-config-ssjs": "1.1.11", "eslint-plugin-jsdoc": "44.2.4", From b8537d789f055ff723c3aa2654c050c3600969b0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 May 2023 08:09:57 +0000 Subject: [PATCH 61/73] Bump eslint-plugin-jsdoc from 44.2.4 to 45.0.0 Bumps [eslint-plugin-jsdoc](https://github.com/gajus/eslint-plugin-jsdoc) from 44.2.4 to 45.0.0. - [Release notes](https://github.com/gajus/eslint-plugin-jsdoc/releases) - [Changelog](https://github.com/gajus/eslint-plugin-jsdoc/blob/main/.releaserc) - [Commits](https://github.com/gajus/eslint-plugin-jsdoc/compare/v44.2.4...v45.0.0) --- updated-dependencies: - dependency-name: eslint-plugin-jsdoc dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- package-lock.json | 18 +++++++++--------- package.json | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index 44c95f900..e4d7b97bb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -41,7 +41,7 @@ "eslint": "8.41.0", "eslint-config-prettier": "8.7.0", "eslint-config-ssjs": "1.1.11", - "eslint-plugin-jsdoc": "44.2.4", + "eslint-plugin-jsdoc": "45.0.0", "eslint-plugin-mocha": "10.1.0", "eslint-plugin-prettier": "4.2.1", "eslint-plugin-unicorn": "47.0.0", @@ -3221,12 +3221,12 @@ } }, "node_modules/eslint-plugin-jsdoc": { - "version": "44.2.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-44.2.4.tgz", - "integrity": "sha512-/EMMxCyRh1SywhCb66gAqoGX4Yv6Xzc4bsSkF1AiY2o2+bQmGMQ05QZ5+JjHbdFTPDZY9pfn+DsSNP0a5yQpIg==", + "version": "45.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-45.0.0.tgz", + "integrity": "sha512-l2+Jcs/Ps7oFA+SWY+0sweU/e5LgricnEl6EsDlyRTF5y0+NWL1y9Qwz9PHwHAxtdJq6lxPjEQWmYLMkvhzD4g==", "dev": true, "dependencies": { - "@es-joy/jsdoccomment": "~0.39.3", + "@es-joy/jsdoccomment": "~0.39.4", "are-docs-informative": "^0.0.2", "comment-parser": "1.3.1", "debug": "^4.3.4", @@ -12415,12 +12415,12 @@ "requires": {} }, "eslint-plugin-jsdoc": { - "version": "44.2.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-44.2.4.tgz", - "integrity": "sha512-/EMMxCyRh1SywhCb66gAqoGX4Yv6Xzc4bsSkF1AiY2o2+bQmGMQ05QZ5+JjHbdFTPDZY9pfn+DsSNP0a5yQpIg==", + "version": "45.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-45.0.0.tgz", + "integrity": "sha512-l2+Jcs/Ps7oFA+SWY+0sweU/e5LgricnEl6EsDlyRTF5y0+NWL1y9Qwz9PHwHAxtdJq6lxPjEQWmYLMkvhzD4g==", "dev": true, "requires": { - "@es-joy/jsdoccomment": "~0.39.3", + "@es-joy/jsdoccomment": "~0.39.4", "are-docs-informative": "^0.0.2", "comment-parser": "1.3.1", "debug": "^4.3.4", diff --git a/package.json b/package.json index 090569f48..9ba4d433b 100644 --- a/package.json +++ b/package.json @@ -87,7 +87,7 @@ "eslint": "8.41.0", "eslint-config-prettier": "8.7.0", "eslint-config-ssjs": "1.1.11", - "eslint-plugin-jsdoc": "44.2.4", + "eslint-plugin-jsdoc": "45.0.0", "eslint-plugin-mocha": "10.1.0", "eslint-plugin-prettier": "4.2.1", "eslint-plugin-unicorn": "47.0.0", From 3cfb7b7ed670bcfc06a4abddb7b07414934f5ab3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 May 2023 08:12:02 +0000 Subject: [PATCH 62/73] Bump yargs from 17.6.0 to 17.7.2 Bumps [yargs](https://github.com/yargs/yargs) from 17.6.0 to 17.7.2. - [Release notes](https://github.com/yargs/yargs/releases) - [Changelog](https://github.com/yargs/yargs/blob/main/CHANGELOG.md) - [Commits](https://github.com/yargs/yargs/compare/v17.6.0...v17.7.2) --- updated-dependencies: - dependency-name: yargs dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 30 +++++++++++++++--------------- package.json | 2 +- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/package-lock.json b/package-lock.json index e4d7b97bb..142e78bcf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -28,7 +28,7 @@ "toposort": "2.0.2", "update-notifier": "5.1.0", "winston": "3.8.2", - "yargs": "17.6.0" + "yargs": "17.7.2" }, "bin": { "mcdev": "lib/cli.js" @@ -9911,9 +9911,9 @@ } }, "node_modules/yargs": { - "version": "17.6.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.0.tgz", - "integrity": "sha512-8H/wTDqlSwoSnScvV2N/JHfLWOKuh5MVla9hqLjK3nsfyy6Y4kDSYSvkU5YCUEPOSnRXfIyx3Sq+B/IWudTo4g==", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -9921,16 +9921,16 @@ "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" + "yargs-parser": "^21.1.1" }, "engines": { "node": ">=12" } }, "node_modules/yargs-parser": { - "version": "21.0.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", - "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "engines": { "node": ">=12" } @@ -17346,9 +17346,9 @@ "dev": true }, "yargs": { - "version": "17.6.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.0.tgz", - "integrity": "sha512-8H/wTDqlSwoSnScvV2N/JHfLWOKuh5MVla9hqLjK3nsfyy6Y4kDSYSvkU5YCUEPOSnRXfIyx3Sq+B/IWudTo4g==", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "requires": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -17356,7 +17356,7 @@ "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" + "yargs-parser": "^21.1.1" }, "dependencies": { "cliui": { @@ -17372,9 +17372,9 @@ } }, "yargs-parser": { - "version": "21.0.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", - "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==" + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==" }, "yargs-unparser": { "version": "2.0.0", diff --git a/package.json b/package.json index 9ba4d433b..44973608f 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ "toposort": "2.0.2", "update-notifier": "5.1.0", "winston": "3.8.2", - "yargs": "17.6.0" + "yargs": "17.7.2" }, "devDependencies": { "assert": "2.0.0", From e10a52196c0b905d7fdd52230b864a31ffb1db55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Berkefeld?= Date: Tue, 30 May 2023 10:48:51 +0200 Subject: [PATCH 63/73] #893: bump sfmc-sdk from 1.0.0 to 1.0.1 to handle the API issue --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 142e78bcf..27d25f1ae 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,7 +23,7 @@ "prettier": "2.8.8", "prettier-plugin-sql": "0.14.0", "semver": "7.5.0", - "sfmc-sdk": "1.0.0", + "sfmc-sdk": "1.0.1", "simple-git": "3.18.0", "toposort": "2.0.2", "update-notifier": "5.1.0", @@ -8719,9 +8719,9 @@ "dev": true }, "node_modules/sfmc-sdk": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/sfmc-sdk/-/sfmc-sdk-1.0.0.tgz", - "integrity": "sha512-Okw99BwTXYsTxrt1URYBiWvC8xFGZSn1bB+uO/Z2i/tn/f2CxzsJusrCGmq8IlX/oXJXaYsI1kSulbUrcOtDtg==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sfmc-sdk/-/sfmc-sdk-1.0.1.tgz", + "integrity": "sha512-0GdDnNa6jqoLGSHf3ByoQNAzlzdGxjSHeH55zFaY9tM4YPtSRgTrsBkZCh5xOBLwr4u7u2X9lbJpxbTWyULhpA==", "dependencies": { "axios": "^1.3.5", "fast-xml-parser": "4.2.0", @@ -16428,9 +16428,9 @@ "dev": true }, "sfmc-sdk": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/sfmc-sdk/-/sfmc-sdk-1.0.0.tgz", - "integrity": "sha512-Okw99BwTXYsTxrt1URYBiWvC8xFGZSn1bB+uO/Z2i/tn/f2CxzsJusrCGmq8IlX/oXJXaYsI1kSulbUrcOtDtg==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sfmc-sdk/-/sfmc-sdk-1.0.1.tgz", + "integrity": "sha512-0GdDnNa6jqoLGSHf3ByoQNAzlzdGxjSHeH55zFaY9tM4YPtSRgTrsBkZCh5xOBLwr4u7u2X9lbJpxbTWyULhpA==", "requires": { "axios": "^1.3.5", "fast-xml-parser": "4.2.0", diff --git a/package.json b/package.json index 44973608f..798d6dadc 100644 --- a/package.json +++ b/package.json @@ -72,7 +72,7 @@ "prettier": "2.8.8", "prettier-plugin-sql": "0.14.0", "semver": "7.5.0", - "sfmc-sdk": "1.0.0", + "sfmc-sdk": "1.0.1", "simple-git": "3.18.0", "toposort": "2.0.2", "update-notifier": "5.1.0", From 4f5a916537a37a898195294d72f67504a75e717b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Berkefeld?= Date: Tue, 30 May 2023 13:28:46 +0200 Subject: [PATCH 64/73] #800: ensure retrieve-by-key does not trigger documenting if documentation is done in a single file --- docs/dist/documentation.md | 14 +++++++++ lib/metadataTypes/Automation.js | 5 ++-- lib/metadataTypes/DataExtension.js | 4 +-- lib/metadataTypes/MetadataType.js | 46 +++++++++++++++++------------- lib/metadataTypes/Role.js | 5 ++-- lib/metadataTypes/User.js | 8 +----- 6 files changed, 46 insertions(+), 36 deletions(-) diff --git a/docs/dist/documentation.md b/docs/dist/documentation.md index de168d7b0..d9363cd3c 100644 --- a/docs/dist/documentation.md +++ b/docs/dist/documentation.md @@ -3167,6 +3167,7 @@ Provides default functionality that can be overwritten by child metadata type cl * [.getSOAPErrorMsg(ex)](#MetadataType.getSOAPErrorMsg) ⇒ string * [.retrieveSOAP(retrieveDir, [requestParams], [singleRetrieve], [additionalFields])](#MetadataType.retrieveSOAP) ⇒ Promise.<TYPE.MetadataTypeMapObj> * [.retrieveREST(retrieveDir, uri, [templateVariables], [singleRetrieve])](#MetadataType.retrieveREST) ⇒ Promise.<{metadata: (TYPE.MetadataTypeMap\|TYPE.MetadataTypeItem), type: string}> + * [.runDocumentOnRetrieve([singleRetrieve], metadataMap)](#MetadataType.runDocumentOnRetrieve) ⇒ Promise.<void> * [.parseResponseBody(body, [singleRetrieve])](#MetadataType.parseResponseBody) ⇒ TYPE.MetadataTypeMap * [.deleteFieldByDefinition(metadataEntry, fieldPath, definitionProperty, origin)](#MetadataType.deleteFieldByDefinition) ⇒ void * [.removeNotCreateableFields(metadataEntry)](#MetadataType.removeNotCreateableFields) ⇒ void @@ -3632,6 +3633,19 @@ Retrieves Metadata for Rest Types | [templateVariables] | TYPE.TemplateMap | variables to be replaced in the metadata | | [singleRetrieve] | string \| number | key of single item to filter by | + + +### MetadataType.runDocumentOnRetrieve([singleRetrieve], metadataMap) ⇒ Promise.<void> +helper for [retrieveREST](retrieveREST) and [retrieveSOAP](retrieveSOAP) + +**Kind**: static method of [MetadataType](#MetadataType) +**Returns**: Promise.<void> - - + +| Param | Type | Description | +| --- | --- | --- | +| [singleRetrieve] | string \| number | key of single item to filter by | +| metadataMap | TYPE.MetadataTypeMap | saved metadata | + ### MetadataType.parseResponseBody(body, [singleRetrieve]) ⇒ TYPE.MetadataTypeMap diff --git a/lib/metadataTypes/Automation.js b/lib/metadataTypes/Automation.js index 50e114595..8232a2e11 100644 --- a/lib/metadataTypes/Automation.js +++ b/lib/metadataTypes/Automation.js @@ -78,9 +78,8 @@ class Automation extends MetadataType { `Downloaded: ${this.definition.type} (${Object.keys(metadataMap).length})` + Util.getKeysString(key) ); - if (this.properties.metaDataTypes.documentOnRetrieve.includes(this.definition.type)) { - await this.document(metadataMap); - } + + await this.runDocumentOnRetrieve(key, metadataMap); } return { metadata: metadataMap, type: this.definition.type }; } diff --git a/lib/metadataTypes/DataExtension.js b/lib/metadataTypes/DataExtension.js index bfae1fdc3..cd50d099e 100644 --- a/lib/metadataTypes/DataExtension.js +++ b/lib/metadataTypes/DataExtension.js @@ -464,9 +464,7 @@ class DataExtension extends MetadataType { `Downloaded: ${this.definition.type} (${Object.keys(savedMetadata).length})` + Util.getKeysString(key) ); - if (this.properties.metaDataTypes.documentOnRetrieve.includes(this.definition.type)) { - await this.document(savedMetadata); - } + await this.runDocumentOnRetrieve(key, savedMetadata); } return { metadata: metadata, type: 'dataExtension' }; } diff --git a/lib/metadataTypes/MetadataType.js b/lib/metadataTypes/MetadataType.js index 17593ddbc..4ebe7b656 100644 --- a/lib/metadataTypes/MetadataType.js +++ b/lib/metadataTypes/MetadataType.js @@ -1016,12 +1016,7 @@ class MetadataType { `Downloaded: ${this.definition.type} (${Object.keys(savedMetadata).length})` + Util.getKeysString(singleRetrieve) ); - if ( - this.buObject && - this.properties.metaDataTypes.documentOnRetrieve.includes(this.definition.type) - ) { - await this.document(savedMetadata); - } + await this.runDocumentOnRetrieve(singleRetrieve, savedMetadata); } return { metadata: metadata, type: this.definition.type }; } @@ -1063,20 +1058,7 @@ class MetadataType { `Downloaded: ${this.definition.type} (${Object.keys(savedMetadata).length})` + Util.getKeysString(singleRetrieve) ); - if ( - this.buObject && - this.properties.metaDataTypes.documentOnRetrieve.includes(this.definition.type) - ) { - if (!singleRetrieve || (singleRetrieve && !this.definition.documentInOneFile)) { - await this.document(savedMetadata); - } else { - Util.logger.info( - Util.getGrayMsg( - 'Skipped running document because you supplied keys and the metadata type is configured to document to one file.' - ) - ); - } - } + await this.runDocumentOnRetrieve(singleRetrieve, savedMetadata); } return { @@ -1085,6 +1067,30 @@ class MetadataType { }; } + /** + * helper for {@link retrieveREST} and {@link retrieveSOAP} + * + * @param {string|number} [singleRetrieve] key of single item to filter by + * @param {TYPE.MetadataTypeMap} metadataMap saved metadata + * @returns {Promise.} - + */ + static async runDocumentOnRetrieve(singleRetrieve, metadataMap) { + if ( + this.buObject && + this.properties.metaDataTypes.documentOnRetrieve.includes(this.definition.type) + ) { + if (!singleRetrieve || (singleRetrieve && !this.definition.documentInOneFile)) { + await this.document(metadataMap); + } else { + Util.logger.info( + Util.getGrayMsg( + ` - Skipped running document because you supplied keys and ${this.definition.type} is documented in a single file for all.` + ) + ); + } + } + } + /** * Builds map of metadata entries mapped to their keyfields * diff --git a/lib/metadataTypes/Role.js b/lib/metadataTypes/Role.js index d6d4d7c85..63e5d2533 100644 --- a/lib/metadataTypes/Role.js +++ b/lib/metadataTypes/Role.js @@ -102,9 +102,8 @@ class Role extends MetadataType { `Downloaded: ${this.definition.type} (${Object.keys(savedMetadata).length})` + Util.getKeysString(key) ); - if (this.properties.metaDataTypes.documentOnRetrieve.includes(this.definition.type)) { - await this.document(savedMetadata); - } + + await this.runDocumentOnRetrieve(key, savedMetadata); } return { metadata: parsed, type: this.definition.type }; } diff --git a/lib/metadataTypes/User.js b/lib/metadataTypes/User.js index e2343fc1a..49b44d8f9 100644 --- a/lib/metadataTypes/User.js +++ b/lib/metadataTypes/User.js @@ -731,13 +731,7 @@ class User extends MetadataType { ) ); } - if ( - !singleRetrieve && - this.buObject && - this.properties.metaDataTypes.documentOnRetrieve.includes(this.definition.type) - ) { - await this.document(savedMetadata); - } + await this.runDocumentOnRetrieve(singleRetrieve, savedMetadata); } return { metadata: metadata, type: this.definition.type }; } From a998c6cba1a4289aec09b2dcae185261402e6146 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Berkefeld?= Date: Tue, 30 May 2023 13:43:00 +0200 Subject: [PATCH 65/73] #800: improve logs --- lib/metadataTypes/MetadataType.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/metadataTypes/MetadataType.js b/lib/metadataTypes/MetadataType.js index 4ebe7b656..69b582593 100644 --- a/lib/metadataTypes/MetadataType.js +++ b/lib/metadataTypes/MetadataType.js @@ -1080,6 +1080,10 @@ class MetadataType { this.properties.metaDataTypes.documentOnRetrieve.includes(this.definition.type) ) { if (!singleRetrieve || (singleRetrieve && !this.definition.documentInOneFile)) { + const count = Object.keys(metadataMap).length; + Util.logger.debug( + ` - Running document for ${count} record${count === 1 ? '' : 's'}` + ); await this.document(metadataMap); } else { Util.logger.info( From 1646d296f06afc519632b88768ab0c615a7676c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Berkefeld?= Date: Tue, 30 May 2023 13:45:29 +0200 Subject: [PATCH 66/73] #800: ensure document is not run for users if only specific keys were retrieved --- lib/metadataTypes/definitions/User.definition.js | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/metadataTypes/definitions/User.definition.js b/lib/metadataTypes/definitions/User.definition.js index adae97e17..34d3b5e0b 100644 --- a/lib/metadataTypes/definitions/User.definition.js +++ b/lib/metadataTypes/definitions/User.definition.js @@ -17,6 +17,7 @@ module.exports = { typeDescription: 'Marketing Cloud users', typeName: 'User', typeRetrieveByDefault: false, + documentInOneFile: true, stringifyFieldsBeforeTemplate: ['DefaultBusinessUnit', 'c__AssociatedBusinessUnits'], fields: { AccountUserID: { From 7e0b929d3c0e33123bc8956e4c05f86a725ad180 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Berkefeld?= Date: Tue, 30 May 2023 15:14:49 +0200 Subject: [PATCH 67/73] #800: remove outdated check (replaced by definition.documentInOneFile) --- lib/metadataTypes/User.js | 8 -------- 1 file changed, 8 deletions(-) diff --git a/lib/metadataTypes/User.js b/lib/metadataTypes/User.js index 49b44d8f9..59701f082 100644 --- a/lib/metadataTypes/User.js +++ b/lib/metadataTypes/User.js @@ -938,14 +938,6 @@ class User extends MetadataType { return; } - // if ran as part of retrieve/deploy with key, exit here - if (metadata && Object.keys(metadata).length === 1) { - Util.logger.debug( - 'Only 1 user found. Skipping documentation, assuming we ran retrieve-by-key.' - ); - return; - } - if (!metadata) { // load users from disk if document was called directly and not part of a retrieve try { From 1f3e0d37fb1cae2bfb39fbecfa6795aa34dd5dc0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Berkefeld?= Date: Tue, 30 May 2023 15:19:04 +0200 Subject: [PATCH 68/73] #800: add tests for when document is run (user, dataExtension) --- .../1111111/user/retrieve-expected.md | 19 ++++++++++++ .../dataExtension/retrieve-expected.md | 18 +++++++++++ test/type.dataExtension.test.js | 13 +++++++- test/type.user.test.js | 31 ++++++++++++++++++- test/utils.js | 10 ++++++ 5 files changed, 89 insertions(+), 2 deletions(-) create mode 100644 test/resources/1111111/user/retrieve-expected.md create mode 100644 test/resources/9999999/dataExtension/retrieve-expected.md diff --git a/test/resources/1111111/user/retrieve-expected.md b/test/resources/1111111/user/retrieve-expected.md new file mode 100644 index 000000000..50eb1b2ec --- /dev/null +++ b/test/resources/1111111/user/retrieve-expected.md @@ -0,0 +1,19 @@ +# User Overview - testInstance + +## Users (1) + +| Name | Last successful Login | Active | Access Locked out | API User | Must change PW | Default BU | BU Access | Roles | Login | ID | Key | E-Mail | Notification E-Mail | Timezone | SFMC Locale | Modified Date | Modified By | Created Date | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| user test | 96 days | ✓ | - | - | - | _ParentBU_ (1111111) | _ParentBU_ (1111111),
testBU (9999999) | Administrator,
Content Creator,
Marketing Cloud Administrator | user_test@accenture.asgr | 700301950 | testExisting_user | user_test@accenture.com | user_test@accenture.com | GMT+01:00 | en-GB | 2022-06-21 01:43:02.64 | 123456 | 2019-09-06 01:59:07.097 | + + +## Inactivated Users (0) + +| Name | Last successful Login | Active | Access Locked out | API User | Must change PW | Default BU | BU Access | Roles | Login | ID | Key | E-Mail | Notification E-Mail | Timezone | SFMC Locale | Modified Date | Modified By | Created Date | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | + + +## Installed Packages (0) + +| Name | Last successful Login | Active | Access Locked out | API User | Must change PW | Default BU | BU Access | Roles | Login | ID | Key | E-Mail | Notification E-Mail | Timezone | SFMC Locale | Modified Date | Modified By | Created Date | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | diff --git a/test/resources/9999999/dataExtension/retrieve-expected.md b/test/resources/9999999/dataExtension/retrieve-expected.md new file mode 100644 index 000000000..fda321a2d --- /dev/null +++ b/test/resources/9999999/dataExtension/retrieve-expected.md @@ -0,0 +1,18 @@ +## testExisting_dataExtension + +**Description:** bla bla + +**Folder:** Data Extensions/ + +**Fields in table:** 4 + +**Sendable:** Yes (`ContactKey` to `Subscriber Key`) + +**Testable:** Yes + +| Name | FieldType | MaxLength | IsPrimaryKey | IsNullable | DefaultValue | +| --- | --- | --- | --- | --- | --- | +| FirstName | Text | 50 | - | + | | +| LastName | Text | 50 | - | + | | +| EmailAddress | EmailAddress | 254 | - | - | | +| ContactKey | Text | 50 | + | - | | diff --git a/test/type.dataExtension.test.js b/test/type.dataExtension.test.js index b91a2f496..968a0d164 100644 --- a/test/type.dataExtension.test.js +++ b/test/type.dataExtension.test.js @@ -1,4 +1,8 @@ -const assert = require('chai').assert; +const chai = require('chai'); +const chaiFiles = require('chai-files'); +const assert = chai.assert; +const expect = chai.expect; +const file = chaiFiles.file; const cache = require('../lib/util/cache'); const testUtils = require('./utils'); const handler = require('../lib/index'); @@ -29,6 +33,13 @@ describe('type: dataExtension', () => { 'returned metadata was not equal expected' ); + // check if MD file was created and equals expectations + expect( + file(testUtils.getActualDoc('testExisting_dataExtension', 'dataExtension')) + ).to.equal( + file(testUtils.getExpectedFile('9999999', 'dataExtension', 'retrieve', 'md')) + ); + assert.equal( testUtils.getAPIHistoryLength(), 5, diff --git a/test/type.user.test.js b/test/type.user.test.js index 26be1696c..697c5a5f7 100644 --- a/test/type.user.test.js +++ b/test/type.user.test.js @@ -1,4 +1,9 @@ -const assert = require('chai').assert; +const chai = require('chai'); +const chaiFiles = require('chai-files'); +const assert = chai.assert; +chai.use(chaiFiles); +const expect = chai.expect; +const file = chaiFiles.file; const cache = require('../lib/util/cache'); const testUtils = require('./utils'); const handler = require('../lib/index'); @@ -29,6 +34,11 @@ describe('type: user', () => { 'returned metadata was not equal expected' ); + // check if MD file was created and equals expectations + expect(file(`./docs/user/testInstance.users.md`)).to.equal( + file(testUtils.getExpectedFile('1111111', 'user', 'retrieve', 'md')) + ); + assert.equal( testUtils.getAPIHistoryLength(), 6, @@ -36,6 +46,22 @@ describe('type: user', () => { ); return; }); + it('Should retrieve a specific user but not run document', async () => { + // WHEN + await handler.retrieve('testInstance/_ParentBU_', ['user'], ['testExisting_user']); + // THEN + assert.equal(process.exitCode, false, 'retrieve should not have thrown an error'); + + // because user is single-document-type we would not want to find an md file when we retrieve specific keys. only the generic retrieve updates it + expect(file(`./docs/user/testInstance.users.md`)).to.not.exist; + + assert.equal( + testUtils.getAPIHistoryLength(), + 4, + 'Unexpected number of requests made. Run testUtils.logAPIHistoryDebug() to see the requests' + ); + return; + }); }); describe('Deploy ================', () => { beforeEach(() => { @@ -74,6 +100,9 @@ describe('type: user', () => { await testUtils.getExpectedJson('1111111', 'user', 'update'), 'returned metadata was not equal expected for update' ); + // because user is single-document-type we would not want to find an md file getting created by deploy. only retrieve updates it + expect(file(`./docs/user/testInstance.users.md`)).to.not.exist; + assert.equal( testUtils.getAPIHistoryLength(), 9, diff --git a/test/utils.js b/test/utils.js index 5f1e64809..6f0a628e1 100644 --- a/test/utils.js +++ b/test/utils.js @@ -22,6 +22,16 @@ const resourceFactory = require('./resourceFactory'); */ exports.getActualJson = (customerKey, type, buName = 'testBU') => File.readJSON(`./retrieve/testInstance/${buName}/${type}/${customerKey}.${type}-meta.json`); +/** + * gets file from Retrieve folder + * + * @param {string} customerKey of metadata + * @param {string} type of metadata + * @param {string} [buName] used when we need to test on ParentBU + * @returns {Promise.} file in string form + */ +exports.getActualDoc = (customerKey, type, buName = 'testBU') => + `./retrieve/testInstance/${buName}/${type}/${customerKey}.${type}-doc.md`; /** * gets file from Retrieve folder * From 270eb47068c2d2d90622e52c8823e7d129f87c46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Berkefeld?= Date: Tue, 30 May 2023 16:41:11 +0200 Subject: [PATCH 69/73] #945: corrected expected SQL to have uppercased "AS" statements --- test/resources/9999999/query/build-expected.sql | 2 +- test/resources/9999999/query/get-expected.sql | 2 +- test/resources/9999999/query/patch-expected.sql | 2 +- test/resources/9999999/query/post-expected.sql | 2 +- test/resources/9999999/query/template-expected.sql | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/test/resources/9999999/query/build-expected.sql b/test/resources/9999999/query/build-expected.sql index 276ccd7aa..4385e76e8 100644 --- a/test/resources/9999999/query/build-expected.sql +++ b/test/resources/9999999/query/build-expected.sql @@ -1,5 +1,5 @@ SELECT - SubscriberKey as testField + SubscriberKey AS testField FROM _Subscribers WHERE diff --git a/test/resources/9999999/query/get-expected.sql b/test/resources/9999999/query/get-expected.sql index e78525408..2a32f5fad 100644 --- a/test/resources/9999999/query/get-expected.sql +++ b/test/resources/9999999/query/get-expected.sql @@ -1,5 +1,5 @@ SELECT - SubscriberKey as testField + SubscriberKey AS testField FROM _Subscribers WHERE diff --git a/test/resources/9999999/query/patch-expected.sql b/test/resources/9999999/query/patch-expected.sql index e78525408..2a32f5fad 100644 --- a/test/resources/9999999/query/patch-expected.sql +++ b/test/resources/9999999/query/patch-expected.sql @@ -1,5 +1,5 @@ SELECT - SubscriberKey as testField + SubscriberKey AS testField FROM _Subscribers WHERE diff --git a/test/resources/9999999/query/post-expected.sql b/test/resources/9999999/query/post-expected.sql index 8020314ea..4148833c4 100644 --- a/test/resources/9999999/query/post-expected.sql +++ b/test/resources/9999999/query/post-expected.sql @@ -1,4 +1,4 @@ SELECT - SubscriberKey as testField + SubscriberKey AS testField FROM _Subscribers diff --git a/test/resources/9999999/query/template-expected.sql b/test/resources/9999999/query/template-expected.sql index 0ed1dc1cc..06aae9b31 100644 --- a/test/resources/9999999/query/template-expected.sql +++ b/test/resources/9999999/query/template-expected.sql @@ -1,5 +1,5 @@ SELECT - SubscriberKey as testField + SubscriberKey AS testField FROM _Subscribers WHERE From 749364734cf3dddaa2c14bb03d04faeb55d1292a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Berkefeld?= Date: Tue, 30 May 2023 16:57:57 +0200 Subject: [PATCH 70/73] #945: ensure we re-initialize the prettier config for each file extension --- lib/util/file.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/util/file.js b/lib/util/file.js index d4d9c6946..89206f83e 100644 --- a/lib/util/file.js +++ b/lib/util/file.js @@ -517,9 +517,10 @@ const File = { * @param {string} [filetype='html'] filetype ie. JSON or SSJS * @returns {Promise.} success of config load */ - async initPrettier(filetype) { - if (FileFs.prettierConfig === null) { - filetype ||= 'html'; + async initPrettier(filetype = 'html') { + if (FileFs.prettierConfig === null || FileFs.prettierConfigFileType !== filetype) { + // run this if no config was yet found or if the filetype previously used to initialize it differs (because it results in a potentially different config!) + FileFs.prettierConfigFileType = filetype; try { // pass in project dir with fake index.html to avoid "no parser" error // by using process.cwd we are limiting ourselves to a config in the project root @@ -547,5 +548,6 @@ const File = { }; const FileFs = { ...fs, ...File }; FileFs.prettierConfig = null; +FileFs.prettierConfigFileType = null; module.exports = FileFs; From 575554d00f56112e0e4897df15d37d9c949f7531 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Berkefeld?= Date: Tue, 30 May 2023 16:59:01 +0200 Subject: [PATCH 71/73] #945: only initialize prettier config if we actually plan on saving files - not for caching --- lib/metadataTypes/Asset.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/metadataTypes/Asset.js b/lib/metadataTypes/Asset.js index 6c6b13dc6..3ff861cce 100644 --- a/lib/metadataTypes/Asset.js +++ b/lib/metadataTypes/Asset.js @@ -26,7 +26,9 @@ class Asset extends MetadataType { static async retrieve(retrieveDir, _, subTypeArr, key) { const items = []; subTypeArr ||= this._getSubTypes(); - await File.initPrettier(); + if (retrieveDir) { + await File.initPrettier(); + } // loop through subtypes and return results of each subType for caching (saving is handled per subtype) for (const subType of subTypeArr) { // each subtype contains multiple different specific types (images contains jpg and png for example) From c343c6490728fd691a896186761af8debefdc235 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Berkefeld?= Date: Tue, 30 May 2023 17:17:43 +0200 Subject: [PATCH 72/73] 5.0.2 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 27d25f1ae..cdc2e50d5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "mcdev", - "version": "5.0.1", + "version": "5.0.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "mcdev", - "version": "5.0.1", + "version": "5.0.2", "license": "MIT", "dependencies": { "beauty-amp-core": "0.3.7", diff --git a/package.json b/package.json index 798d6dadc..255dd3212 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mcdev", - "version": "5.0.1", + "version": "5.0.2", "description": "Accenture Salesforce Marketing Cloud DevTools", "author": "Accenture: joern.berkefeld, douglas.midgley, robert.zimmermann, maciej.barnas", "license": "MIT", From 2791d8052b337dfc68203759b385ca065ef426fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Berkefeld?= Date: Tue, 30 May 2023 17:18:33 +0200 Subject: [PATCH 73/73] #0: prepping 5.0.2 release --- .github/ISSUE_TEMPLATE/bug.yml | 1 + test/mockRoot/.mcdevrc.json | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/bug.yml b/.github/ISSUE_TEMPLATE/bug.yml index 53b343b4e..bca928014 100644 --- a/.github/ISSUE_TEMPLATE/bug.yml +++ b/.github/ISSUE_TEMPLATE/bug.yml @@ -39,6 +39,7 @@ body: label: Version description: What version of our software are you running? (mcdev --version) options: + - 5.0.2 - 5.0.1 - 5.0.0 - 4.3.4 diff --git a/test/mockRoot/.mcdevrc.json b/test/mockRoot/.mcdevrc.json index e87ecaa83..f8e5c389c 100644 --- a/test/mockRoot/.mcdevrc.json +++ b/test/mockRoot/.mcdevrc.json @@ -78,5 +78,5 @@ "triggeredSend" ] }, - "version": "5.0.1" + "version": "5.0.2" }