`
-
-## 9. Contribute
-
-
+## Contribute
If you want to enhance Accenture SFMC DevTools you are welcome to fork the repo and create a pull request. Please understand that we will have to conduct a code review before accepting your changes.
-### 9.1. Install Guide for Developers
-
-
-
-Instead of installing Accenture SFMC DevTools as an npm dependency from our git repo, we recommend cloning our repo and then linking it locally:
-
-Assuming you cloned Accenture SFMC DevTools into `C:\repos\sfmc-devtools\` (or `~/repos/sfmc-devtools/` on Mac):
-
-1. Open a terminal in your repo folder (`repos/sfmc-devtools/`)
-2. Execute `npm install` to download all the dependencies.
-3. Execute `npx husky install` to enable our git hooks.
-4. Execute `npm install -g "C:\repos\sfmc-devtools"` (this installs mcdev globally on your computer based on your cloned repo folder. Any changes you make in there will take immediate effect without the need for publishing or re-installing it).
-
-This should tell npm to create a symlink to your cloned local directory, allowing you to see updates you make in your mcdev repo instantly.
-
-To test your new **global** developer setup, run `mcdev --version` in CLI which should return the current version (e.g. `4.1.12`). Then, go into your mcdev repo and update the version with the suffix `-dev`, e.g. to `4.1.12-dev` and then run `mcdev --version` again to verify that your change propagates instantly.
-
-> **Not recommended:** Alternatively, you can install it locally only by opening a terminal in your project directory and executing `npm install --save-dev "C:\repos\sfmc-devtools"`
-> To run the local version you need to prepend "npx" before your commands, e.g. `npx mcdev --version`
-
-**Note:** On MacOS you might need to prepend `sudo` to elevate your command.
-
-**Local vs. Global developer installation:**
-
-If you use Accenture SFMC DevTools in your team it is recommended to install your developer version **globally**, while the project's package.json should point to our Git repo in its devDependency section. Otherwise, other team members would have trouble due to potentially different paths.
-
-If you do need to install it locally, make sure you don't commit your project's package.json with this change or you might break mcdev for other developers in your team who either didn't clone the Accenture SFMC DevTools repo or stored it in a different directory.
-
-
-
-### 9.2. Local install
-
-
-
-> **Warning:** local installation (leading to the use of [npx](https://github.com/npm/npx#readme)) causes issues when spaces are used in keys/names and is therefore not recommended.
-> You will also make setting up projects much harder if you choose the local installation as you cannot use `mcdev init` to automatically setup your entire project.
-
-The following explains how you _could_ install it locally for certain edge cases:
-
-1. Create a new folder for your upcoming SFMC project. Let's assume you named it `MyProject/`
- > _Note:_ It is best practice to create a separate project folder for each of your client projects to avoid accidentally overwriting the wrong BU.
-2. Now, open a command line interface (CLI) for that folder.
- - In Windows, you can easily do that by pressing SHIFT + Right-click into that folder and then selecting the option "Open PowerShell window here".
- - Alternatively, you could use any other CLI. We recommend opting for [Visual Studio Code](https://code.visualstudio.com/download)'s "Terminal" as you can benefit from this later.
- - Your CLI prompt should look something like `PS C:\repos\MyProject>` on Windows or `~/repos/MyProject/` on Mac.
-3. Initialize your new SFMC project by running `npm init`.
- > _Note:_ npm is the "package manager" of Node.js and we use it to bundle Accenture SFMC DevTools together with other tools.
- >
- > If you are not familiar with node-projects or npm yet, we found this [blog post on nodesource.com](https://nodesource.com/blog/an-absolute-beginners-guide-to-using-npm/) to be helpful for beginners.
- > In short, a package manager provides you with an easy name-based way of installing and updating tools you want to use as a team and ensuring that you are all using the same version.
-4. Afterwards, install Accenture SFMC DevTools by running `npm install --save-dev mcdev`
- - If you get an error, please see the below troubleshooting section.
-
-When completed run `mcdev --version` and it will show you which version you installed (e.g. `4.1.12`).
-
-### 9.3. NPM Scripts
+More details on how to best do that are described in our [wiki](https://github.com/Accenture/sfmc-devtools/wiki/9.-Contribute).
-
+## Main Contacts
-- `start`: Main entry point
-- `mcdev`: alias for `start`
-- `build`: Runs documentation and linting scripts
-- `debug`: start debugging session
-- `docs`: Generates jsdocs API documentation as markdown
-- `lint`: Runs eslint with autofix and prettier
-- `test`: Runs mocha tests - outdated
-- `upgrade`: run npm-check to test for updated depdencies
+The people that lead this project:
-### 9.4. Developer Documentation
+
-
+## Copyright
-- [Link to API Documentation](docs/dist/documentation.md)
-- [Link to Considerations & Findings Documentation](docs/dist/considerations.md)
+Copyright (c) 2020-2022 Accenture. [MIT licensed](https://github.com/Accenture/sfmc-devtools/blob/main/LICENSE).
diff --git a/boilerplate/config.json b/boilerplate/config.json
index 61e2f4050..930983d53 100644
--- a/boilerplate/config.json
+++ b/boilerplate/config.json
@@ -62,14 +62,10 @@
},
"marketList": {
"deployment-source": {
- "description": "Define one 1:1 BU-Market combo here to as source for automated creation of deployment packages; you can create more than one source market list",
- "MySandbox/DEV-NL": "DEV-NL"
+ "description": "Define one 1:1 BU-Market combo here to as source for automated creation of deployment packages; you can create more than one source market list"
},
"deployment-target": {
- "description": "Define n BU-Market combo here to as target for automated creation of deployment packages; you can create more than one target market list and they can be as complex as you like",
- "MySandbox/QA-DE": "QA-DE",
- "MyProduction/PROD-DE": "PROD-DE",
- "MyProduction/PROD-NL": "PROD-NL"
+ "description": "Define n BU-Market combo here to as target for automated creation of deployment packages; you can create more than one target market list and they can be as complex as you like"
}
},
"metaDataTypes": {
diff --git a/boilerplate/files/.vscode/extensions.json b/boilerplate/files/.vscode/extensions.json
index d847fffc5..e301d3e45 100644
--- a/boilerplate/files/.vscode/extensions.json
+++ b/boilerplate/files/.vscode/extensions.json
@@ -15,6 +15,7 @@
"editorconfig.editorconfig",
"esbenp.prettier-vscode",
"sergey-agadzhanov.ampscript",
+ "FiB.beautyAmp",
// Markdown / Readme.md
"joernberkefeld.markdown-preview-bitbucket-innersource"
diff --git a/boilerplate/files/.vscode/settings.json b/boilerplate/files/.vscode/settings.json
index 1ed32c224..a1b0d83d1 100644
--- a/boilerplate/files/.vscode/settings.json
+++ b/boilerplate/files/.vscode/settings.json
@@ -59,5 +59,8 @@
},
"[markdown]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
+ },
+ "[AMPscript]": {
+ "editor.defaultFormatter": "FiB.beautyAmp"
}
}
diff --git a/docs/dist/documentation.md b/docs/dist/documentation.md
index b3a83618a..d459f97fb 100644
--- a/docs/dist/documentation.md
+++ b/docs/dist/documentation.md
@@ -101,6 +101,18 @@ Provides default functionality that can be overwritten by child metadata type cl
SetDefinition ⇐ MetadataType
SetDefinition MetadataType
+TransactionalEmail ⇐ TransactionalMessage
+TransactionalEmail MetadataType
+
+TransactionalMessage ⇐ MetadataType
+TransactionalMessage MetadataType
+
+TransactionalPush ⇐ TransactionalMessage
+TransactionalPush TransactionalMessage
+
+TransactionalSMS ⇐ TransactionalMessage
+TransactionalSMS MetadataType
+
TriggeredSendDefinition ⇐ MetadataType
MessageSendActivity MetadataType
@@ -830,7 +842,6 @@ FileTransfer MetadataType
* [.buildTemplateForNested(templateDir, targetDir, metadata, templateVariables, templateName)](#Asset.buildTemplateForNested) ⇒ Promise.<void>
* [._buildForNested(templateDir, targetDir, metadata, templateVariables, templateName, mode)](#Asset._buildForNested) ⇒ Promise.<void>
* [.setFolderPath(metadata)](#Asset.setFolderPath)
- * [.parseMetadata(metadata)](#Asset.parseMetadata) ⇒ TYPE.CodeExtractItem
* [._mergeCode(metadata, deployDir, subType, [templateName], [fileListOnly])](#Asset._mergeCode) ⇒ Promise.<Array.<TYPE.CodeExtract>>
* [._mergeCode_slots(prefix, metadataSlots, readDirArr, subtypeExtension, subDirArr, fileList, customerKey, [templateName], [fileListOnly])](#Asset._mergeCode_slots) ⇒ Promise.<void>
* [._extractCode(metadata)](#Asset._extractCode) ⇒ TYPE.CodeExtractItem
@@ -1077,18 +1088,6 @@ generic script that retrieves the folder path from cache and updates the given m
| --- | --- | --- |
| metadata | TYPE.MetadataTypeItem
| a single script activity definition |
-
-
-### Asset.parseMetadata(metadata) ⇒ TYPE.CodeExtractItem
-parses retrieved Metadata before saving
-
-**Kind**: static method of [Asset
](#Asset)
-**Returns**: TYPE.CodeExtractItem
- parsed metadata definition
-
-| Param | Type | Description |
-| --- | --- | --- |
-| metadata | TYPE.AssetItem
| a single asset definition |
-
### Asset.\_mergeCode(metadata, deployDir, subType, [templateName], [fileListOnly]) ⇒ Promise.<Array.<TYPE.CodeExtract>>
@@ -1128,7 +1127,7 @@ helper for [preDeployTasks](preDeployTasks) that loads extracted code content ba
### Asset.\_extractCode(metadata) ⇒ TYPE.CodeExtractItem
-helper for [parseMetadata](parseMetadata) that finds code content in JSON and extracts it
+helper for [postRetrieveTasks](postRetrieveTasks) that finds code content in JSON and extracts it
to allow saving that separately and formatted
**Kind**: static method of [Asset
](#Asset)
@@ -2576,20 +2575,20 @@ Folder MetadataType
**Extends**: [MetadataType
](#MetadataType)
* [Folder](#Folder) ⇐ [MetadataType
](#MetadataType)
- * [.retrieve(retrieveDir, [additionalFields], buObject, [___], [key])](#Folder.retrieve) ⇒ Promise
- * [.retrieveForCache(buObject)](#Folder.retrieveForCache) ⇒ Promise
+ * [.retrieve(retrieveDir, [additionalFields], buObject, [___], [key], [contentTypeList])](#Folder.retrieve) ⇒ Promise
+ * [.retrieveForCache(buObject, [contentTypeList])](#Folder.retrieveForCache) ⇒ Promise
* [.upsert(metadata)](#Folder.upsert) ⇒ Promise.<object>
* [.create(metadataEntry)](#Folder.create) ⇒ Promise
* [.update(metadataEntry)](#Folder.update) ⇒ Promise
* [.preDeployTasks(metadata)](#Folder.preDeployTasks) ⇒ Promise.<TYPE.MetadataTypeItem>
* [.getJsonFromFS(dir, [listBadKeys])](#Folder.getJsonFromFS) ⇒ TYPE.MetadataTypeMap
- * [.retrieveHelper([additionalFields], [queryAllAccounts])](#Folder.retrieveHelper) ⇒ Promise.<object>
+ * [.retrieveHelper([additionalFields], [queryAllAccounts], [contentTypeList])](#Folder.retrieveHelper) ⇒ Promise.<object>
* [.postRetrieveTasks(metadata)](#Folder.postRetrieveTasks) ⇒ TYPE.MetadataTypeItem
* [.saveResults(results, retrieveDir, mid)](#Folder.saveResults) ⇒ Promise.<object>
-### Folder.retrieve(retrieveDir, [additionalFields], buObject, [___], [key]) ⇒ Promise
+### Folder.retrieve(retrieveDir, [additionalFields], buObject, [___], [key], [contentTypeList]) ⇒ Promise
Retrieves metadata of metadata type into local filesystem. executes callback with retrieved metadata
**Kind**: static method of [Folder
](#Folder)
@@ -2602,10 +2601,11 @@ Retrieves metadata of metadata type into local filesystem. executes callback wit
| buObject | TYPE.BuObject
| properties for auth |
| [___] | void
| unused parameter |
| [key] | string
| customer key of single item to retrieve |
+| [contentTypeList] | Array.<string>
| content type of folder |
-### Folder.retrieveForCache(buObject) ⇒ Promise
+### Folder.retrieveForCache(buObject, [contentTypeList]) ⇒ Promise
Retrieves folder metadata for caching
**Kind**: static method of [Folder
](#Folder)
@@ -2614,6 +2614,7 @@ Retrieves folder metadata for caching
| Param | Type | Description |
| --- | --- | --- |
| buObject | TYPE.BuObject
| properties for auth |
+| [contentTypeList] | Array.<string>
| content type of folder |
@@ -2680,7 +2681,7 @@ Returns file contents mapped to their filename without '.json' ending
-### Folder.retrieveHelper([additionalFields], [queryAllAccounts]) ⇒ Promise.<object>
+### Folder.retrieveHelper([additionalFields], [queryAllAccounts], [contentTypeList]) ⇒ Promise.<object>
Helper to retrieve the folders as promise
**Kind**: static method of [Folder
](#Folder)
@@ -2690,6 +2691,7 @@ Helper to retrieve the folders as promise
| --- | --- | --- |
| [additionalFields] | Array.<string>
| Returns specified fields even if their retrieve definition is not set to true |
| [queryAllAccounts] | boolean
| which queryAllAccounts setting to use |
+| [contentTypeList] | Array.<string>
| content type of folder |
@@ -2903,15 +2905,16 @@ List MetadataType
**Extends**: [MetadataType
](#MetadataType)
* [List](#List) ⇐ [MetadataType
](#MetadataType)
- * [.retrieve(retrieveDir, [_], [__], [___], [key])](#List.retrieve) ⇒ Promise.<TYPE.MetadataTypeMapObj>
- * [.retrieveForCache()](#List.retrieveForCache) ⇒ Promise.<TYPE.MetadataTypeMapObj>
+ * [.retrieve(retrieveDir, [_], buObject, [___], [key])](#List.retrieve) ⇒ Promise.<TYPE.MetadataTypeMapObj>
+ * [.retrieveForCache(buObject)](#List.retrieveForCache) ⇒ Promise.<TYPE.MetadataTypeMapObj>
+ * [._retrieveParentAllSubs(buObject, results)](#List._retrieveParentAllSubs) ⇒ Promise.<TYPE.MetadataTypeMapObj>
* [.deleteByKey(buObject, customerKey)](#List.deleteByKey) ⇒ Promise.<boolean>
* [.postRetrieveTasks(list)](#List.postRetrieveTasks) ⇒ TYPE.MetadataTypeItem
* [.parseMetadata(metadata, [parseForCache])](#List.parseMetadata) ⇒ TYPE.MetadataTypeItem
-### List.retrieve(retrieveDir, [_], [__], [___], [key]) ⇒ Promise.<TYPE.MetadataTypeMapObj>
+### List.retrieve(retrieveDir, [_], buObject, [___], [key]) ⇒ Promise.<TYPE.MetadataTypeMapObj>
Retrieves Metadata of Lists
**Kind**: static method of [List
](#List)
@@ -2921,17 +2924,35 @@ Retrieves Metadata of Lists
| --- | --- | --- |
| retrieveDir | string
| Directory where retrieved metadata directory will be saved |
| [_] | void
| unused parameter |
-| [__] | void
| unused parameter |
+| buObject | TYPE.BuObject
| properties for auth |
| [___] | void
| unused parameter |
| [key] | string
| customer key of single item to retrieve |
-### List.retrieveForCache() ⇒ Promise.<TYPE.MetadataTypeMapObj>
+### List.retrieveForCache(buObject) ⇒ Promise.<TYPE.MetadataTypeMapObj>
Gets metadata cache with limited fields and does not store value to disk
**Kind**: static method of [List
](#List)
**Returns**: Promise.<TYPE.MetadataTypeMapObj>
- Promise of metadata
+
+| Param | Type | Description |
+| --- | --- | --- |
+| buObject | TYPE.BuObject
| properties for auth |
+
+
+
+### List.\_retrieveParentAllSubs(buObject, results) ⇒ Promise.<TYPE.MetadataTypeMapObj>
+helper for @link retrieveForCache and @link retrieve
+
+**Kind**: static method of [List
](#List)
+**Returns**: Promise.<TYPE.MetadataTypeMapObj>
- Promise
+
+| Param | Type | Description |
+| --- | --- | --- |
+| buObject | TYPE.BuObject
| properties for auth |
+| results | TYPE.MetadataTypeMapObj
| metadata from retrieve for current BU |
+
### List.deleteByKey(buObject, customerKey) ⇒ Promise.<boolean>
@@ -3004,6 +3025,7 @@ Provides default functionality that can be overwritten by child metadata type cl
* [.createSOAP(metadataEntry, [overrideType], [handleOutside])](#MetadataType.createSOAP) ⇒ Promise
* [.updateREST(metadataEntry, uri)](#MetadataType.updateREST) ⇒ Promise
* [.updateSOAP(metadataEntry, [overrideType], [handleOutside])](#MetadataType.updateSOAP) ⇒ Promise
+ * [._handleSOAPErrors(ex, msg, [metadataEntry], [handleOutside])](#MetadataType._handleSOAPErrors)
* [.retrieveSOAP(retrieveDir, buObject, [requestParams], [additionalFields])](#MetadataType.retrieveSOAP) ⇒ Promise.<TYPE.MetadataTypeMapObj>
* [.retrieveREST(retrieveDir, uri, [overrideType], [templateVariables], [singleRetrieve])](#MetadataType.retrieveREST) ⇒ Promise.<{metadata: (TYPE.MetadataTypeMap\|TYPE.MetadataTypeItem), type: string}>
* [.parseResponseBody(body, [singleRetrieve])](#MetadataType.parseResponseBody) ⇒ TYPE.MetadataTypeMap
@@ -3027,6 +3049,7 @@ Provides default functionality that can be overwritten by child metadata type cl
* [.deleteByKey(buObject, customerKey)](#MetadataType.deleteByKey) ⇒ boolean
* [.postDeleteTasks(buObject, customerKey)](#MetadataType.postDeleteTasks) ⇒ void
* [.deleteByKeySOAP(buObject, customerKey, [handleOutside])](#MetadataType.deleteByKeySOAP) ⇒ boolean
+ * [.deleteByKeyREST(buObject, url, key, [handleOutside])](#MetadataType.deleteByKeyREST) ⇒ boolean
* [.readBUMetadataForType(readDir, [listBadKeys], [buMetadata])](#MetadataType.readBUMetadataForType) ⇒ object
* [.getFilesToCommit(keyArr)](#MetadataType.getFilesToCommit) ⇒ Promise.<Array.<string>>
@@ -3331,6 +3354,18 @@ Updates a single metadata entry via fuel-soap (generic lib not wrapper)
| [overrideType] | string
| can be used if the API type differs from the otherwise used type identifier |
| [handleOutside] | boolean
| if the API reponse is irregular this allows you to handle it outside of this generic method |
+
+
+### MetadataType.\_handleSOAPErrors(ex, msg, [metadataEntry], [handleOutside])
+**Kind**: static method of [MetadataType
](#MetadataType)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| ex | Error
| error that occured |
+| msg | 'creating'
\| 'updating'
| what to print in the log |
+| [metadataEntry] | TYPE.MetadataTypeItem
| single metadata entry |
+| [handleOutside] | boolean
| if the API reponse is irregular this allows you to handle it outside of this generic method |
+
### MetadataType.retrieveSOAP(retrieveDir, buObject, [requestParams], [additionalFields]) ⇒ Promise.<TYPE.MetadataTypeMapObj>
@@ -3651,6 +3686,21 @@ Delete a data extension from the specified business unit
| customerKey | string
| Identifier of metadata |
| [handleOutside] | boolean
| if the API reponse is irregular this allows you to handle it outside of this generic method |
+
+
+### MetadataType.deleteByKeyREST(buObject, url, key, [handleOutside]) ⇒ boolean
+Delete a data extension from the specified business unit
+
+**Kind**: static method of [MetadataType
](#MetadataType)
+**Returns**: boolean
- deletion success flag
+
+| Param | Type | Description |
+| --- | --- | --- |
+| buObject | TYPE.BuObject
| references credentials |
+| url | string
| endpoint |
+| key | string
| Identifier of metadata |
+| [handleOutside] | boolean
| if the API reponse is irregular this allows you to handle it outside of this generic method |
+
### MetadataType.readBUMetadataForType(readDir, [listBadKeys], [buMetadata]) ⇒ object
@@ -4338,6 +4388,331 @@ Retrieves Metadata of schema set definitions for caching.
**Kind**: static method of [SetDefinition
](#SetDefinition)
**Returns**: Promise.<TYPE.MetadataTypeMapObj>
- Promise
+
+
+## TransactionalEmail ⇐ [TransactionalMessage
](#TransactionalMessage)
+TransactionalEmail MetadataType
+
+**Kind**: global class
+**Extends**: [TransactionalMessage
](#TransactionalMessage)
+
+* [TransactionalEmail](#TransactionalEmail) ⇐ [TransactionalMessage
](#TransactionalMessage)
+ * [.update(metadata)](#TransactionalEmail.update) ⇒ Promise
+ * [.preDeployTasks(metadata)](#TransactionalEmail.preDeployTasks) ⇒ TYPE.MetadataTypeItem
+ * [.postRetrieveTasks(metadata)](#TransactionalEmail.postRetrieveTasks) ⇒ TYPE.MetadataTypeItem
+
+
+
+### TransactionalEmail.update(metadata) ⇒ Promise
+Updates a single item
+
+**Kind**: static method of [TransactionalEmail
](#TransactionalEmail)
+**Returns**: Promise
- Promise
+
+| Param | Type | Description |
+| --- | --- | --- |
+| metadata | TYPE.MetadataTypeItem
| how the item shall look after the update |
+
+
+
+### TransactionalEmail.preDeployTasks(metadata) ⇒ TYPE.MetadataTypeItem
+prepares for deployment
+
+**Kind**: static method of [TransactionalEmail
](#TransactionalEmail)
+**Returns**: TYPE.MetadataTypeItem
- Promise
+
+| Param | Type | Description |
+| --- | --- | --- |
+| metadata | TYPE.MetadataTypeItem
| a single item |
+
+
+
+### TransactionalEmail.postRetrieveTasks(metadata) ⇒ TYPE.MetadataTypeItem
+manages post retrieve steps
+
+**Kind**: static method of [TransactionalEmail
](#TransactionalEmail)
+**Returns**: TYPE.MetadataTypeItem
- a single item
+
+| Param | Type | Description |
+| --- | --- | --- |
+| metadata | TYPE.MetadataTypeItem
| a single item |
+
+
+
+## TransactionalMessage ⇐ [MetadataType
](#MetadataType)
+TransactionalMessage MetadataType
+
+**Kind**: global class
+**Extends**: [MetadataType
](#MetadataType)
+
+* [TransactionalMessage](#TransactionalMessage) ⇐ [MetadataType
](#MetadataType)
+ * [.retrieve(retrieveDir, [_], [__], [___], [key])](#TransactionalMessage.retrieve) ⇒ Promise.<TYPE.MetadataTypeMapObj>
+ * [.retrieveForCache()](#TransactionalMessage.retrieveForCache) ⇒ Promise.<TYPE.MetadataTypeMapObj>
+ * [.update(metadata)](#TransactionalMessage.update) ⇒ Promise
+ * [.create(metadata)](#TransactionalMessage.create) ⇒ Promise
+ * [.deleteByKey(buObject, key)](#TransactionalMessage.deleteByKey) ⇒ Promise.<boolean>
+
+
+
+### TransactionalMessage.retrieve(retrieveDir, [_], [__], [___], [key]) ⇒ Promise.<TYPE.MetadataTypeMapObj>
+Retrieves Metadata of Mobile Keywords
+Endpoint /legacy/v1/beta/mobile/code/ return all Mobile Codes with all details.
+
+**Kind**: static method of [TransactionalMessage
](#TransactionalMessage)
+**Returns**: Promise.<TYPE.MetadataTypeMapObj>
- Promise of metadata
+
+| Param | Type | Description |
+| --- | --- | --- |
+| retrieveDir | string
| Directory where retrieved metadata directory will be saved |
+| [_] | void
| unused parameter |
+| [__] | void
| unused parameter |
+| [___] | void
| unused parameter |
+| [key] | string
| customer key of single item to retrieve |
+
+
+
+### TransactionalMessage.retrieveForCache() ⇒ Promise.<TYPE.MetadataTypeMapObj>
+Retrieves event definition metadata for caching
+
+**Kind**: static method of [TransactionalMessage
](#TransactionalMessage)
+**Returns**: Promise.<TYPE.MetadataTypeMapObj>
- Promise of metadata
+
+
+### TransactionalMessage.update(metadata) ⇒ Promise
+Updates a single item
+
+**Kind**: static method of [TransactionalMessage
](#TransactionalMessage)
+**Returns**: Promise
- Promise
+
+| Param | Type | Description |
+| --- | --- | --- |
+| metadata | TYPE.MetadataTypeItem
| a single item |
+
+
+
+### TransactionalMessage.create(metadata) ⇒ Promise
+Creates a single item
+
+**Kind**: static method of [TransactionalMessage
](#TransactionalMessage)
+**Returns**: Promise
- Promise
+
+| Param | Type | Description |
+| --- | --- | --- |
+| metadata | TYPE.MetadataTypeItem
| a single item |
+
+
+
+### TransactionalMessage.deleteByKey(buObject, key) ⇒ Promise.<boolean>
+Delete a metadata item from the specified business unit
+
+**Kind**: static method of [TransactionalMessage
](#TransactionalMessage)
+**Returns**: Promise.<boolean>
- deletion success status
+
+| Param | Type | Description |
+| --- | --- | --- |
+| buObject | TYPE.BuObject
| references credentials |
+| key | string
| Identifier of item |
+
+
+
+## TransactionalPush ⇐ [TransactionalMessage
](#TransactionalMessage)
+TransactionalPush TransactionalMessage
+
+**Kind**: global class
+**Extends**: [TransactionalMessage
](#TransactionalMessage)
+
+* [TransactionalPush](#TransactionalPush) ⇐ [TransactionalMessage
](#TransactionalMessage)
+ * [.preDeployTasks(metadata)](#TransactionalPush.preDeployTasks) ⇒ TYPE.MetadataTypeItem
+ * [.postRetrieveTasks(metadata)](#TransactionalPush.postRetrieveTasks) ⇒ TYPE.MetadataTypeItem
+
+
+
+### TransactionalPush.preDeployTasks(metadata) ⇒ TYPE.MetadataTypeItem
+prepares for deployment
+
+**Kind**: static method of [TransactionalPush
](#TransactionalPush)
+**Returns**: TYPE.MetadataTypeItem
- Promise
+
+| Param | Type | Description |
+| --- | --- | --- |
+| metadata | TYPE.MetadataTypeItem
| a single item |
+
+
+
+### TransactionalPush.postRetrieveTasks(metadata) ⇒ TYPE.MetadataTypeItem
+manages post retrieve steps
+
+**Kind**: static method of [TransactionalPush
](#TransactionalPush)
+**Returns**: TYPE.MetadataTypeItem
- a single item
+
+| Param | Type | Description |
+| --- | --- | --- |
+| metadata | TYPE.MetadataTypeItem
| a single item |
+
+
+
+## TransactionalSMS ⇐ [TransactionalMessage
](#TransactionalMessage)
+TransactionalSMS MetadataType
+
+**Kind**: global class
+**Extends**: [TransactionalMessage
](#TransactionalMessage)
+
+* [TransactionalSMS](#TransactionalSMS) ⇐ [TransactionalMessage
](#TransactionalMessage)
+ * [.postDeleteTasks(buObject, customerKey)](#TransactionalSMS.postDeleteTasks) ⇒ void
+ * [.preDeployTasks(metadata, dir)](#TransactionalSMS.preDeployTasks) ⇒ TYPE.MetadataTypeItem
+ * [._mergeCode(metadata, deployDir, [templateName])](#TransactionalSMS._mergeCode) ⇒ Promise.<string>
+ * [.postRetrieveTasks(metadata)](#TransactionalSMS.postRetrieveTasks) ⇒ TYPE.CodeExtractItem
+ * [.prepExtractedCode(metadataScript)](#TransactionalSMS.prepExtractedCode) ⇒ Object
+ * [.buildDefinitionForNested(templateDir, targetDir, metadata, templateVariables, templateName)](#TransactionalSMS.buildDefinitionForNested) ⇒ Promise.<Array.<Array.<string>>>
+ * [.buildTemplateForNested(templateDir, targetDir, metadata, templateVariables, templateName)](#TransactionalSMS.buildTemplateForNested) ⇒ Promise.<Array.<Array.<string>>>
+ * [._buildForNested(templateDir, targetDir, metadata, templateVariables, templateName, mode)](#TransactionalSMS._buildForNested) ⇒ Promise.<Array.<Array.<string>>>
+ * [._isHTML(code)](#TransactionalSMS._isHTML) ⇒ boolean
+ * [.getFilesToCommit(keyArr)](#TransactionalSMS.getFilesToCommit) ⇒ Array.<string>
+
+
+
+### TransactionalSMS.postDeleteTasks(buObject, customerKey) ⇒ void
+clean up after deleting a metadata item
+
+**Kind**: static method of [TransactionalSMS
](#TransactionalSMS)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| buObject | TYPE.BuObject
| references credentials |
+| customerKey | string
| Identifier of metadata item |
+
+
+
+### TransactionalSMS.preDeployTasks(metadata, dir) ⇒ TYPE.MetadataTypeItem
+prepares for deployment
+
+**Kind**: static method of [TransactionalSMS
](#TransactionalSMS)
+**Returns**: TYPE.MetadataTypeItem
- Promise
+
+| Param | Type | Description |
+| --- | --- | --- |
+| metadata | TYPE.MetadataTypeItem
| a single item |
+| dir | string
| directory of deploy files |
+
+
+
+### TransactionalSMS.\_mergeCode(metadata, deployDir, [templateName]) ⇒ Promise.<string>
+helper for [preDeployTasks](preDeployTasks) that loads extracted code content back into JSON
+
+**Kind**: static method of [TransactionalSMS
](#TransactionalSMS)
+**Returns**: Promise.<string>
- content for metadata.script
+
+| Param | Type | Description |
+| --- | --- | --- |
+| metadata | TYPE.MetadataTypeItem
| a single definition |
+| deployDir | string
| directory of deploy files |
+| [templateName] | string
| name of the template used to built defintion (prior applying templating) |
+
+
+
+### TransactionalSMS.postRetrieveTasks(metadata) ⇒ TYPE.CodeExtractItem
+manages post retrieve steps
+
+**Kind**: static method of [TransactionalSMS
](#TransactionalSMS)
+**Returns**: TYPE.CodeExtractItem
- Array with one metadata object and one ssjs string
+
+| Param | Type | Description |
+| --- | --- | --- |
+| metadata | TYPE.MetadataTypeItem
| a single item |
+
+
+
+### TransactionalSMS.prepExtractedCode(metadataScript) ⇒ Object
+helper for [parseMetadata](parseMetadata) and [_buildForNested](_buildForNested)
+
+**Kind**: static method of [TransactionalSMS
](#TransactionalSMS)
+**Returns**: Object
- returns found extension and file content
+
+| Param | Type | Description |
+| --- | --- | --- |
+| metadataScript | string
| the code of the file |
+
+
+
+### TransactionalSMS.buildDefinitionForNested(templateDir, targetDir, metadata, templateVariables, templateName) ⇒ Promise.<Array.<Array.<string>>>
+helper for [buildDefinition](#MetadataType.buildDefinition)
+handles extracted code if any are found for complex types
+
+**Kind**: static method of [TransactionalSMS
](#TransactionalSMS)
+**Returns**: Promise.<Array.<Array.<string>>>
- list of extracted files with path-parts provided as an array
+
+| Param | Type | Description |
+| --- | --- | --- |
+| templateDir | string
| Directory where metadata templates are stored |
+| targetDir | string
\| Array.<string>
| (List of) Directory where built definitions will be saved |
+| metadata | TYPE.MetadataTypeItem
| main JSON file that was read from file system |
+| templateVariables | TYPE.TemplateMap
| variables to be replaced in the metadata |
+| templateName | string
| name of the template to be built |
+
+
+
+### TransactionalSMS.buildTemplateForNested(templateDir, targetDir, metadata, templateVariables, templateName) ⇒ Promise.<Array.<Array.<string>>>
+helper for [buildTemplate](#MetadataType.buildTemplate)
+handles extracted code if any are found for complex types
+
+**Kind**: static method of [TransactionalSMS
](#TransactionalSMS)
+**Returns**: Promise.<Array.<Array.<string>>>
- list of extracted files with path-parts provided as an array
+
+| Param | Type | Description |
+| --- | --- | --- |
+| templateDir | string
| Directory where metadata templates are stored |
+| targetDir | string
\| Array.<string>
| (List of) Directory where built definitions will be saved |
+| metadata | TYPE.MetadataTypeItem
| main JSON file that was read from file system |
+| templateVariables | TYPE.TemplateMap
| variables to be replaced in the metadata |
+| templateName | string
| name of the template to be built |
+
+**Example**
+```js
+scripts are saved as 1 json and 1 ssjs file. both files need to be run through templating
+```
+
+
+### TransactionalSMS.\_buildForNested(templateDir, targetDir, metadata, templateVariables, templateName, mode) ⇒ Promise.<Array.<Array.<string>>>
+helper for [buildTemplateForNested](buildTemplateForNested) / [buildDefinitionForNested](buildDefinitionForNested)
+handles extracted code if any are found for complex types
+
+**Kind**: static method of [TransactionalSMS
](#TransactionalSMS)
+**Returns**: Promise.<Array.<Array.<string>>>
- list of extracted files with path-parts provided as an array
+
+| Param | Type | Description |
+| --- | --- | --- |
+| templateDir | string
| Directory where metadata templates are stored |
+| targetDir | string
\| Array.<string>
| (List of) Directory where built definitions will be saved |
+| metadata | TYPE.MetadataTypeItem
| main JSON file that was read from file system |
+| templateVariables | TYPE.TemplateMap
| variables to be replaced in the metadata |
+| templateName | string
| name of the template to be built |
+| mode | 'definition'
\| 'template'
| defines what we use this helper for |
+
+
+
+### TransactionalSMS.\_isHTML(code) ⇒ boolean
+very simplified test for HTML code in our SMS
+
+**Kind**: static method of [TransactionalSMS
](#TransactionalSMS)
+**Returns**: boolean
- true if HTML is found
+
+| Param | Type | Description |
+| --- | --- | --- |
+| code | string
| sms source code |
+
+
+
+### TransactionalSMS.getFilesToCommit(keyArr) ⇒ Array.<string>
+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
+
+**Kind**: static method of [TransactionalSMS
](#TransactionalSMS)
+**Returns**: Array.<string>
- list of all files that need to be committed in a flat array ['path/file1.ext', 'path/file2.ext']
+
+| Param | Type | Description |
+| --- | --- | --- |
+| keyArr | Array.<string>
| customerkey of the metadata |
+
## TriggeredSendDefinition ⇐ [MetadataType
](#MetadataType)
@@ -4519,7 +4894,7 @@ CLI entry for SFMC DevTools
* [.inverseGet(objs, val)](#Util.inverseGet) ⇒ string
* [.getMetadataHierachy(metadataTypes)](#Util.getMetadataHierachy) ⇒ Array.<string>
* [.resolveObjPath(path, obj)](#Util.resolveObjPath) ⇒ any
- * [.execSync(cmd, [args], [hideOutput])](#Util.execSync) ⇒ undefined
+ * [.execSync(cmd, [args], [hideOutput])](#Util.execSync) ⇒ string
* [.templateSearchResult(results, keyToSearch, searchValue)](#Util.templateSearchResult) ⇒ TYPE.MetadataTypeItem
* [.setLoggingLevel(argv)](#Util.setLoggingLevel) ⇒ void
@@ -4716,10 +5091,11 @@ let's you dynamically walk down an object and get a value
-### Util.execSync(cmd, [args], [hideOutput]) ⇒ undefined
+### Util.execSync(cmd, [args], [hideOutput]) ⇒ string
helper to run other commands as if run manually by user
**Kind**: static method of [Util
](#Util)
+**Returns**: string
- output of command if hideOutput is true
| Param | Type | Description |
| --- | --- | --- |
@@ -5361,6 +5737,7 @@ CLI helper class
* [._updateGitConfigUser()](#Init._updateGitConfigUser) ⇒ void
* [._getGitConfigUser()](#Init._getGitConfigUser) ⇒ Promise.<{'user.name': string, 'user.email': string}>
* [.initProject(properties, credentialName)](#Init.initProject) ⇒ Promise.<void>
+ * [._initMarkets()](#Init._initMarkets)
* [._downloadAllBUs(bu, gitStatus)](#Init._downloadAllBUs) ⇒ Promise.<void>
* [.upgradeProject(properties, [initial], [repoName])](#Init.upgradeProject) ⇒ Promise.<boolean>
* [._getMissingCredentials(properties)](#Init._getMissingCredentials) ⇒ Array.<string>
@@ -5483,6 +5860,12 @@ Creates template file for properties.json
| properties | TYPE.Mcdevrc
| config file's json |
| credentialName | string
| identifying name of the installed package / project |
+
+
+### Init.\_initMarkets()
+helper for @initProject that optionally creates markets and market lists for all BUs
+
+**Kind**: static method of [Init
](#Init)
### Init.\_downloadAllBUs(bu, gitStatus) ⇒ Promise.<void>
@@ -5568,6 +5951,7 @@ CLI helper class
* [._updateGitConfigUser()](#Init._updateGitConfigUser) ⇒ void
* [._getGitConfigUser()](#Init._getGitConfigUser) ⇒ Promise.<{'user.name': string, 'user.email': string}>
* [.initProject(properties, credentialName)](#Init.initProject) ⇒ Promise.<void>
+ * [._initMarkets()](#Init._initMarkets)
* [._downloadAllBUs(bu, gitStatus)](#Init._downloadAllBUs) ⇒ Promise.<void>
* [.upgradeProject(properties, [initial], [repoName])](#Init.upgradeProject) ⇒ Promise.<boolean>
* [._getMissingCredentials(properties)](#Init._getMissingCredentials) ⇒ Array.<string>
@@ -5690,6 +6074,12 @@ Creates template file for properties.json
| properties | TYPE.Mcdevrc
| config file's json |
| credentialName | string
| identifying name of the installed package / project |
+
+
+### Init.\_initMarkets()
+helper for @initProject that optionally creates markets and market lists for all BUs
+
+**Kind**: static method of [Init
](#Init)
### Init.\_downloadAllBUs(bu, gitStatus) ⇒ Promise.<void>
@@ -5775,6 +6165,7 @@ CLI helper class
* [._updateGitConfigUser()](#Init._updateGitConfigUser) ⇒ void
* [._getGitConfigUser()](#Init._getGitConfigUser) ⇒ Promise.<{'user.name': string, 'user.email': string}>
* [.initProject(properties, credentialName)](#Init.initProject) ⇒ Promise.<void>
+ * [._initMarkets()](#Init._initMarkets)
* [._downloadAllBUs(bu, gitStatus)](#Init._downloadAllBUs) ⇒ Promise.<void>
* [.upgradeProject(properties, [initial], [repoName])](#Init.upgradeProject) ⇒ Promise.<boolean>
* [._getMissingCredentials(properties)](#Init._getMissingCredentials) ⇒ Array.<string>
@@ -5897,6 +6288,12 @@ Creates template file for properties.json
| properties | TYPE.Mcdevrc
| config file's json |
| credentialName | string
| identifying name of the installed package / project |
+
+
+### Init.\_initMarkets()
+helper for @initProject that optionally creates markets and market lists for all BUs
+
+**Kind**: static method of [Init
](#Init)
### Init.\_downloadAllBUs(bu, gitStatus) ⇒ Promise.<void>
@@ -5982,6 +6379,7 @@ CLI helper class
* [._updateGitConfigUser()](#Init._updateGitConfigUser) ⇒ void
* [._getGitConfigUser()](#Init._getGitConfigUser) ⇒ Promise.<{'user.name': string, 'user.email': string}>
* [.initProject(properties, credentialName)](#Init.initProject) ⇒ Promise.<void>
+ * [._initMarkets()](#Init._initMarkets)
* [._downloadAllBUs(bu, gitStatus)](#Init._downloadAllBUs) ⇒ Promise.<void>
* [.upgradeProject(properties, [initial], [repoName])](#Init.upgradeProject) ⇒ Promise.<boolean>
* [._getMissingCredentials(properties)](#Init._getMissingCredentials) ⇒ Array.<string>
@@ -6104,6 +6502,12 @@ Creates template file for properties.json
| properties | TYPE.Mcdevrc
| config file's json |
| credentialName | string
| identifying name of the installed package / project |
+
+
+### Init.\_initMarkets()
+helper for @initProject that optionally creates markets and market lists for all BUs
+
+**Kind**: static method of [Init
](#Init)
### Init.\_downloadAllBUs(bu, gitStatus) ⇒ Promise.<void>
@@ -6194,7 +6598,7 @@ Util that contains logger and simple util methods
* [.inverseGet(objs, val)](#Util.inverseGet) ⇒ string
* [.getMetadataHierachy(metadataTypes)](#Util.getMetadataHierachy) ⇒ Array.<string>
* [.resolveObjPath(path, obj)](#Util.resolveObjPath) ⇒ any
- * [.execSync(cmd, [args], [hideOutput])](#Util.execSync) ⇒ undefined
+ * [.execSync(cmd, [args], [hideOutput])](#Util.execSync) ⇒ string
* [.templateSearchResult(results, keyToSearch, searchValue)](#Util.templateSearchResult) ⇒ TYPE.MetadataTypeItem
* [.setLoggingLevel(argv)](#Util.setLoggingLevel) ⇒ void
@@ -6391,10 +6795,11 @@ let's you dynamically walk down an object and get a value
-### Util.execSync(cmd, [args], [hideOutput]) ⇒ undefined
+### Util.execSync(cmd, [args], [hideOutput]) ⇒ string
helper to run other commands as if run manually by user
**Kind**: static method of [Util
](#Util)
+**Returns**: string
- output of command if hideOutput is true
| Param | Type | Description |
| --- | --- | --- |
diff --git a/lib/Deployer.js b/lib/Deployer.js
index 3ffe20267..08aa90519 100644
--- a/lib/Deployer.js
+++ b/lib/Deployer.js
@@ -116,15 +116,15 @@ class Deployer {
) {
const buObject = await Cli.getCredentialObject(
properties,
- cred !== null ? cred + '/' + bu : null,
+ cred === null ? null : cred + '/' + bu,
null,
true
);
- if (buObject !== null) {
+ if (buObject === null) {
+ return;
+ } else {
cred = buObject.credential;
bu = buObject.businessUnit;
- } else {
- return;
}
}
@@ -328,11 +328,11 @@ class Deployer {
const allowedDeFolderContentTypes = ['dataextension', 'shared_dataextension'];
for (const metadataType of metadataTypeArr) {
if (!MetadataTypeInfo[metadataType].definition.dependencies.includes('folder')) {
- Util.logger.debug(` ☇ skipping ${metadataType}: folder not a dependency`);
+ Util.logger.debug(` ☇ skipping ${metadataType} folders: folder not a dependency`);
continue;
}
if (!MetadataTypeInfo[metadataType].definition.folderType) {
- Util.logger.debug(` ☇ skipping ${metadataType}: folderType not set`);
+ Util.logger.debug(` ☇ skipping ${metadataType} folders: folderType not set`);
continue;
}
if (
@@ -341,11 +341,13 @@ class Deployer {
)
) {
Util.logger.warn(
- ` ☇ skipping ${metadataType}: folderType ${MetadataTypeInfo[metadataType].definition.folderType} not supported for deployment`
+ ` ☇ skipping ${metadataType} folders: folderType ${MetadataTypeInfo[metadataType].definition.folderType} not supported for deployment. Please consider creating folders for this type manually as a pre-deployment step, if you see errors about missing dependent folders for this type later in this log.`
);
continue;
}
- Util.logger.debug(`Creating relevant folders for ${metadataType} in deploy dir`);
+ Util.logger.debug(
+ ` - create ${metadataType} folders: Creating relevant folders in deploy dir`
+ );
const allFolders = Object.keys(metadata[metadataType])
.filter(
diff --git a/lib/MetadataTypeDefinitions.js b/lib/MetadataTypeDefinitions.js
index 4e38d59e2..148da00fe 100644
--- a/lib/MetadataTypeDefinitions.js
+++ b/lib/MetadataTypeDefinitions.js
@@ -32,6 +32,9 @@ const MetadataTypeDefinitions = {
role: require('./metadataTypes/definitions/Role.definition'),
script: require('./metadataTypes/definitions/Script.definition'),
setDefinition: require('./metadataTypes/definitions/SetDefinition.definition'),
+ transactionalEmail: require('./metadataTypes/definitions/TransactionalEmail.definition'),
+ transactionalPush: require('./metadataTypes/definitions/TransactionalPush.definition'),
+ transactionalSMS: require('./metadataTypes/definitions/TransactionalSMS.definition'),
triggeredSendDefinition: require('./metadataTypes/definitions/TriggeredSendDefinition.definition'),
};
diff --git a/lib/MetadataTypeInfo.js b/lib/MetadataTypeInfo.js
index 3291a41c6..053636fdf 100644
--- a/lib/MetadataTypeInfo.js
+++ b/lib/MetadataTypeInfo.js
@@ -32,6 +32,9 @@ const MetadataTypeInfo = {
role: require('./metadataTypes/Role'),
script: require('./metadataTypes/Script'),
setDefinition: require('./metadataTypes/SetDefinition'),
+ transactionalEmail: require('./metadataTypes/TransactionalEmail'),
+ transactionalPush: require('./metadataTypes/TransactionalPush'),
+ transactionalSMS: require('./metadataTypes/TransactionalSMS'),
triggeredSendDefinition: require('./metadataTypes/TriggeredSendDefinition'),
};
diff --git a/lib/Retriever.js b/lib/Retriever.js
index 79e0799a3..08083d86a 100644
--- a/lib/Retriever.js
+++ b/lib/Retriever.js
@@ -113,11 +113,11 @@ class Retriever {
}
Util.logger.info(
`Retrieving: ${metadataType}` +
- (typeKeyMap[metadataType][0] !== null
- ? ` ${color.dim}(Keys: ${typeKeyMap[metadataType].join(', ')})${
+ (typeKeyMap[metadataType][0] === null
+ ? ''
+ : ` ${color.dim}(Keys: ${typeKeyMap[metadataType].join(', ')})${
color.reset
- }`
- : '')
+ }`)
);
result = await (changelogOnly
? MetadataTypeInfo[type].retrieveChangelog(this.buObject, null, subType)
@@ -163,9 +163,16 @@ class Retriever {
}
}
} catch (ex) {
- Util.logger.errorStack(ex, `Retrieving ${metadataType} failed`);
- // do not continue retrieving if one type failed. simply skip processing the rest of the for-loop
- break;
+ if (
+ ex.code === 'invalid_client' ||
+ ex.message.startsWith('Client authentication failed.')
+ ) {
+ // do not continue retrieving if we logged an authentication issue
+ Util.logger.error(ex.message);
+ break;
+ } else {
+ Util.logger.errorStack(ex, ` - Retrieving ${metadataType} failed`);
+ }
}
}
return retrieveChangelog;
diff --git a/lib/cli.js b/lib/cli.js
index 0b538b098..2c6fcc474 100644
--- a/lib/cli.js
+++ b/lib/cli.js
@@ -392,6 +392,7 @@ yargs
* @returns {string[]} values split into an array.
*/
function csvToArray(csv) {
+ // eslint-disable-next-line unicorn/no-negated-condition
return !csv
? null
: csv.includes(',')
diff --git a/lib/index.js b/lib/index.js
index 2736816d0..d115fbe32 100644
--- a/lib/index.js
+++ b/lib/index.js
@@ -151,15 +151,15 @@ class Mcdev {
) {
const buObject = await Cli.getCredentialObject(
properties,
- cred !== null ? cred + '/' + bu : null,
+ cred === null ? null : cred + '/' + bu,
null,
true
);
- if (buObject !== null) {
+ if (buObject === null) {
+ return;
+ } else {
cred = buObject.credential;
bu = buObject.businessUnit;
- } else {
- return;
}
}
@@ -206,7 +206,7 @@ class Mcdev {
}
const buObject = await Cli.getCredentialObject(
properties,
- cred !== null ? cred + '/' + bu : null,
+ cred === null ? null : cred + '/' + bu,
null,
true
);
diff --git a/lib/metadataTypes/AccountUser.js b/lib/metadataTypes/AccountUser.js
index aaa6d3b6b..b8b22d41c 100644
--- a/lib/metadataTypes/AccountUser.js
+++ b/lib/metadataTypes/AccountUser.js
@@ -112,7 +112,7 @@ class AccountUser extends MetadataType {
},
};
}
-
+ Util.logger.info(` - Loading ${this.definition.type}. This might take a while...`);
return super.retrieveSOAP(retrieveDir, buObject, requestParams);
}
/**
@@ -377,7 +377,7 @@ class AccountUser extends MetadataType {
metadata.AssociatedBusinessUnits__c = this.userIdBuMap[metadata.ID] || [];
let roles;
- if (metadata.Roles.Role) {
+ if (metadata.Roles?.Role) {
// normalize to always use array
if (!metadata.Roles.Role.length) {
metadata.Roles.Role = [metadata.Roles.Role];
diff --git a/lib/metadataTypes/Asset.js b/lib/metadataTypes/Asset.js
index a19a27169..64d33f4fb 100644
--- a/lib/metadataTypes/Asset.js
+++ b/lib/metadataTypes/Asset.js
@@ -169,7 +169,7 @@ class Asset extends MetadataType {
const subtypeIds = subTypeArray?.map(
(subTypeItemName) => Asset.definition.typeMapping[subTypeItemName]
);
- const uri = 'asset/v1/content/assets/query';
+ const uri = '/asset/v1/content/assets/query';
const payload = {
page: {
page: 1,
@@ -270,6 +270,15 @@ class Asset extends MetadataType {
// only when we save results do we need the complete metadata or files. caching can skip these
if (retrieveDir && items.length > 0) {
+ for (const item of items) {
+ if (item.customerKey.trim() !== item.customerKey) {
+ Util.logger.warn(
+ ` - ${this.definition.type} ${item[this.definition.nameField]} (${
+ item[this.definition.keyField]
+ }) has leading or trailing spaces in customerKey. Please remove them in SFMC.`
+ );
+ }
+ }
// we have to wait on execution or it potentially causes memory reference issues when changing between BUs
await this.requestAndSaveExtended(items, subType, retrieveDir, templateVariables);
Util.logger.debug(`Downloaded asset-${subType}: ${items.length}`);
@@ -486,7 +495,11 @@ class Asset extends MetadataType {
* @returns {TYPE.CodeExtractItem} metadata
*/
static postRetrieveTasks(metadata) {
- return this.parseMetadata(metadata);
+ // folder
+ this.setFolderPath(metadata);
+ // extract HTML for selected subtypes and convert payload for easier processing in MetadataType.saveResults()
+ metadata = this._extractCode(metadata);
+ return metadata;
}
/**
@@ -778,19 +791,6 @@ class Asset extends MetadataType {
}
}
- /**
- * parses retrieved Metadata before saving
- *
- * @param {TYPE.AssetItem} metadata a single asset definition
- * @returns {TYPE.CodeExtractItem} parsed metadata definition
- */
- static parseMetadata(metadata) {
- // folder
- this.setFolderPath(metadata);
- // extract HTML for selected subtypes and convert payload for easier processing in MetadataType.saveResults()
- metadata = this._extractCode(metadata);
- return metadata;
- }
/**
* helper for {@link preDeployTasks} that loads extracted code content back into JSON
*
@@ -806,13 +806,15 @@ class Asset extends MetadataType {
const fileList = [];
let subDirArr;
let readDirArr;
+ // unfortunately, asset's key can contain spaces at beginning/end which can break the file system when folders are created with it
+ const customerKey = metadata.customerKey.trim();
switch (metadata.assetType.name) {
case 'templatebasedemail': // message
case 'htmlemail': {
// message
// this complex type always creates its own subdir per asset
subDirArr = [this.definition.type, subType];
- readDirArr = [deployDir, ...subDirArr, templateName || metadata.customerKey];
+ readDirArr = [deployDir, ...subDirArr, templateName || customerKey];
// metadata.views.html.content (mandatory)
// the main content can be empty (=not set up yet) hence check if we did extract sth or else readFile() will print error msgs
@@ -833,7 +835,7 @@ class Asset extends MetadataType {
if (templateName) {
// to use this method in templating, store a copy of the info in fileList
fileList.push({
- subFolder: [...subDirArr, metadata.customerKey],
+ subFolder: [...subDirArr, customerKey],
fileName: 'index' + subtypeExtension,
fileExt: 'html',
content: metadata.views.html.content,
@@ -850,7 +852,7 @@ class Asset extends MetadataType {
subtypeExtension,
subDirArr,
fileList,
- metadata.customerKey,
+ customerKey,
templateName,
fileListOnly
);
@@ -866,9 +868,7 @@ class Asset extends MetadataType {
await File.pathExists(
File.normalizePath([
...readDirArr,
- `${
- templateName || metadata.customerKey // TODO check why this could be templateName
- }${subtypeExtension}.html`,
+ `${templateName || customerKey}${subtypeExtension}.html`,
])
)
) {
@@ -876,7 +876,7 @@ class Asset extends MetadataType {
if (!fileListOnly) {
metadata.views.text.content = await File.readFilteredFilename(
readDirArr,
- (templateName || metadata.customerKey) + subtypeExtension,
+ (templateName || customerKey) + subtypeExtension,
'html'
);
}
@@ -884,7 +884,7 @@ class Asset extends MetadataType {
// to use this method in templating, store a copy of the info in fileList
fileList.push({
subFolder: subDirArr,
- fileName: metadata.customerKey + subtypeExtension,
+ fileName: customerKey + subtypeExtension,
fileExt: 'html',
content: metadata.views.text.content,
});
@@ -896,7 +896,7 @@ class Asset extends MetadataType {
// asset
// this complex type always creates its own subdir per asset
subDirArr = [this.definition.type, subType];
- readDirArr = [deployDir, ...subDirArr, templateName || metadata.customerKey];
+ readDirArr = [deployDir, ...subDirArr, templateName || customerKey];
// metadata.views.html.slots.<>.blocks.<>.content (optional) (pre & post 20222)
if (metadata?.views?.html?.slots) {
@@ -907,7 +907,7 @@ class Asset extends MetadataType {
subtypeExtension,
subDirArr,
fileList,
- metadata.customerKey,
+ customerKey,
templateName,
fileListOnly
);
@@ -934,7 +934,7 @@ class Asset extends MetadataType {
if (templateName) {
// to use this method in templating, store a copy of the info in fileList
fileList.push({
- subFolder: [...subDirArr, metadata.customerKey],
+ subFolder: [...subDirArr, customerKey],
fileName: 'views.html.content' + subtypeExtension,
fileExt: 'html',
content: metadata.views.html.content,
@@ -960,7 +960,7 @@ class Asset extends MetadataType {
if (templateName) {
// to use this method in templating, store a copy of the info in fileList
fileList.push({
- subFolder: [...subDirArr, metadata.customerKey],
+ subFolder: [...subDirArr, customerKey],
fileName: 'content' + subtypeExtension,
fileExt: 'html',
content: metadata.views.html.content,
@@ -993,7 +993,7 @@ class Asset extends MetadataType {
await File.pathExists(
File.normalizePath([
...readDirArr,
- `${templateName || metadata.customerKey}${subtypeExtension}.${ext}`,
+ `${templateName || customerKey}${subtypeExtension}.${ext}`,
])
)
) {
@@ -1001,7 +1001,7 @@ class Asset extends MetadataType {
if (!fileListOnly) {
metadata.content = await File.readFilteredFilename(
readDirArr,
- (templateName || metadata.customerKey) + subtypeExtension,
+ (templateName || customerKey) + subtypeExtension,
ext
);
}
@@ -1009,7 +1009,7 @@ class Asset extends MetadataType {
// to use this method in templating, store a copy of the info in fileList
fileList.push({
subFolder: subDirArr,
- fileName: (templateName || metadata.customerKey) + subtypeExtension,
+ fileName: (templateName || customerKey) + subtypeExtension,
fileExt: ext,
content: metadata.content,
});
@@ -1104,7 +1104,7 @@ class Asset extends MetadataType {
}
}
/**
- * helper for {@link parseMetadata} that finds code content in JSON and extracts it
+ * helper for {@link postRetrieveTasks} that finds code content in JSON and extracts it
* to allow saving that separately and formatted
*
* @param {TYPE.AssetItem} metadata a single asset definition
@@ -1113,6 +1113,8 @@ class Asset extends MetadataType {
static _extractCode(metadata) {
const codeArr = [];
let subType;
+ // unfortunately, asset's key can contain spaces at beginning/end which can break the file system when folders are created with it
+ const customerKey = metadata.customerKey.trim();
switch (metadata.assetType.name) {
case 'templatebasedemail': // message
case 'htmlemail': {
@@ -1133,7 +1135,11 @@ class Asset extends MetadataType {
this._extractCode_slots('views.html.slots', metadata.views.html.slots, codeArr);
}
- return { json: metadata, codeArr: codeArr, subFolder: [metadata.customerKey] };
+ return {
+ json: metadata,
+ codeArr: codeArr,
+ subFolder: [customerKey],
+ };
}
case 'textonlyemail': {
// message
@@ -1141,7 +1147,7 @@ class Asset extends MetadataType {
if (metadata.views?.text?.content?.length) {
codeArr.push({
subFolder: null,
- fileName: metadata.customerKey,
+ fileName: customerKey,
fileExt: 'html',
content: metadata.views.text.content,
});
@@ -1179,7 +1185,11 @@ class Asset extends MetadataType {
});
delete metadata.content;
}
- return { json: metadata, codeArr: codeArr, subFolder: [metadata.customerKey] };
+ return {
+ json: metadata,
+ codeArr: codeArr,
+ subFolder: [customerKey],
+ };
}
case 'buttonblock': // block - Button Block
case 'freeformblock': // block
@@ -1202,7 +1212,7 @@ class Asset extends MetadataType {
if (metadata?.content?.length) {
codeArr.push({
subFolder: null,
- fileName: metadata.customerKey,
+ fileName: customerKey,
fileExt: fileExt,
content: metadata.content,
});
diff --git a/lib/metadataTypes/Automation.js b/lib/metadataTypes/Automation.js
index c352cb2c1..33ff94020 100644
--- a/lib/metadataTypes/Automation.js
+++ b/lib/metadataTypes/Automation.js
@@ -937,10 +937,7 @@ class Automation extends MetadataType {
* @returns {string[]} list of all files that need to be committed in a flat array ['path/file1.ext', 'path/file2.ext']
*/
static getFilesToCommit(keyArr) {
- if (!this.properties.metaDataTypes.documentOnRetrieve.includes(this.definition.type)) {
- // document automation is not active upon retrieve, run default method instead
- return super.getFilesToCommit(keyArr);
- } else {
+ if (this.properties.metaDataTypes.documentOnRetrieve.includes(this.definition.type)) {
// document automation is active. assume we want to commit the MD file as well
const path = File.normalizePath([
this.properties.directories.retrieve,
@@ -954,6 +951,9 @@ class Automation extends MetadataType {
File.normalizePath([path, `${key}.${this.definition.type}-doc.md`]),
]);
return fileList;
+ } else {
+ // document automation is not active upon retrieve, run default method instead
+ return super.getFilesToCommit(keyArr);
}
}
}
diff --git a/lib/metadataTypes/DataExtension.js b/lib/metadataTypes/DataExtension.js
index 567962a05..1645db7f0 100644
--- a/lib/metadataTypes/DataExtension.js
+++ b/lib/metadataTypes/DataExtension.js
@@ -360,7 +360,13 @@ class DataExtension extends MetadataType {
Util.logger.info(' - Caching dependent Metadata: folder (shared via _ParentBU_)');
Folder.client = this.client;
Folder.properties = this.properties;
- const result = await Folder.retrieveForCache(buObjectParentBu);
+ const result = await Folder.retrieveForCache(buObjectParentBu, [
+ 'shared_data',
+ 'synchronizeddataextension',
+ 'salesforcedataextension',
+ 'shared_dataextension',
+ 'dataextension',
+ ]);
cache.mergeMetadata('folder', result.metadata, buObject.eid);
// get the types and clean out non-shared ones
@@ -1025,10 +1031,10 @@ class DataExtension extends MetadataType {
const { metadata } = await super.retrieveSOAP(null, null, options, additionalFields);
for (const key in metadata) {
// some system data extensions do not have CategoryID which throws errors in other places. These do not need to be parsed
- if (!metadata[key].CategoryID) {
- delete metadata[key];
- } else {
+ if (metadata[key].CategoryID) {
metadata[key].Fields = [];
+ } else {
+ delete metadata[key];
}
}
return metadata;
@@ -1041,10 +1047,7 @@ class DataExtension extends MetadataType {
* @returns {string[]} list of all files that need to be committed in a flat array ['path/file1.ext', 'path/file2.ext']
*/
static getFilesToCommit(keyArr) {
- if (!this.properties.metaDataTypes.documentOnRetrieve.includes(this.definition.type)) {
- // document dataExtension is not active upon retrieve, run default method instead
- return super.getFilesToCommit(keyArr);
- } else {
+ if (this.properties.metaDataTypes.documentOnRetrieve.includes(this.definition.type)) {
// document dataExtension is active. assume we want to commit the MD file as well
const path = File.normalizePath([
this.properties.directories.retrieve,
@@ -1058,6 +1061,9 @@ class DataExtension extends MetadataType {
File.normalizePath([path, `${key}.${this.definition.type}-doc.md`]),
]);
return fileList;
+ } else {
+ // document dataExtension is not active upon retrieve, run default method instead
+ return super.getFilesToCommit(keyArr);
}
}
}
diff --git a/lib/metadataTypes/DataExtensionField.js b/lib/metadataTypes/DataExtensionField.js
index 8a902be0d..90b96d1ff 100644
--- a/lib/metadataTypes/DataExtensionField.js
+++ b/lib/metadataTypes/DataExtensionField.js
@@ -100,6 +100,19 @@ class DataExtensionField extends MetadataType {
* @returns {Object.} existing fields by their original name to allow re-adding FieldType after update
*/
static async prepareDeployColumnsOnUpdate(deployColumns, deKey) {
+ // get row count to know which field restrictions apply
+ let hasData = false;
+ try {
+ const rowset = await this.client.rest.get(
+ `/data/v1/customobjectdata/key/${deKey}/rowset?$page=1&$pagesize=1`
+ );
+ const rowCount = rowset.count;
+ hasData = rowCount > 0;
+ Util.logger.debug(`dataExtension ${deKey} row count: ${rowCount}`);
+ } catch (ex) {
+ Util.logger.debug(`Could not retrieve rowcount for ${deKey}: ${ex.message}`);
+ }
+
// retrieve existing fields to enable updating them
const response = await this.retrieveForCache(
{
@@ -129,6 +142,7 @@ class DataExtensionField extends MetadataType {
// Updating to a new FieldType will result in an error; warn & afterwards remove it
if (itemOld.FieldType !== item.FieldType) {
+ // applicable: with or without data but simply ignored by API
Util.logger.warn(
` - The Field Type of an existing field cannot be changed. Keeping the original value for [${deKey}].[${item.Name}]: '${itemOld.FieldType}'`
);
@@ -141,14 +155,16 @@ class DataExtensionField extends MetadataType {
delete item.FieldType;
if (itemOld.MaxLength > item.MaxLength) {
+ // applicable: with or without data (Code 310007)
Util.logger.warn(
` - The length of an existing field cannot be decreased. Keeping the original value for [${deKey}].[${item.Name}]: '${itemOld.MaxLength}'`
);
item.MaxLength = itemOld.MaxLength;
}
if (Util.isFalse(itemOld.IsRequired) && Util.isTrue(item.IsRequired)) {
+ // applicable: with or without data (Code 310007)
Util.logger.warn(
- ` - A field cannot be changed to be required on update after it was created to allow nulls: [${deKey}].[${item.Name}]`
+ ` - A field cannot be changed to be required on update after it was created to allow nulls. Resetting to not equired: [${deKey}].[${item.Name}]`
);
item.IsRequired = itemOld.IsRequired;
}
@@ -179,11 +195,20 @@ class DataExtensionField extends MetadataType {
item.ObjectID = itemOld.ObjectID;
} else {
// field is getting added ---
- if (Util.isTrue(item.IsRequired) && item.DefaultValue === '') {
- Util.logger.warn(
- ` - Adding new fields to an existing table requires that these fields are either not-required (nullable) or have a default value set. Changing [${deKey}].[${item.Name}] to be not-required`
- );
- item.IsRequired = false;
+
+ if (hasData && Util.isTrue(item.IsRequired) && item.DefaultValue === '') {
+ // applicable: with data only
+ if (Util.isFalse(item.IsPrimaryKey)) {
+ Util.logger.warn(
+ ` - Adding new fields to an existing table requires that these fields are either not-required (nullable) or have a default value set. Changing [${deKey}].[${item.Name}] to be not-required`
+ );
+ item.IsRequired = false;
+ } else {
+ Util.logger.error(
+ `- You cannot add a new primary key field to an existing table that has data. Removing [${deKey}].[${item.Name}] from deployment`
+ );
+ deployColumns.splice(i, 1);
+ }
}
if (item.Name_new) {
Util.logger.warn(
@@ -194,6 +219,15 @@ class DataExtensionField extends MetadataType {
// Field doesn't exist in target, therefore Remove ObjectID if present
delete item.ObjectID;
}
+ if (Util.isTrue(item.IsPrimaryKey) && Util.isFalse(item.IsRequired)) {
+ // applicable: with or without data
+ Util.logger.warn(
+ `- Primary Key field [${deKey}].[${item.Name}] cannot be not-required (nullable). Changing field to be required!`
+ );
+ item.IsRequired = true;
+ }
+
+ // filter bad manual changes to the json
if (!Util.isTrue(item.IsRequired) && !Util.isFalse(item.IsRequired)) {
Util.logger.error(
`- Invalid value for 'IsRequired' of [${deKey}].[${item.Name}]. Found '${item.IsRequired}' instead of 'true'/'false'. Removing field from deploy!`
@@ -207,6 +241,7 @@ class DataExtensionField extends MetadataType {
deployColumns.splice(i, 1);
}
}
+
Util.logger.debug(
`${deployColumns.length} Fields added/updated for [${deKey}]${
deployColumns.length ? ': ' : ''
@@ -277,15 +312,15 @@ class DataExtensionField extends MetadataType {
this.postDeleteTasks(buObject, customerKey);
return true;
} catch (ex) {
- if (!handleOutside) {
+ if (handleOutside) {
+ throw ex;
+ } else {
const errorMsg = ex.results?.length
? `${ex.results[0].StatusMessage} (Code ${ex.results[0].ErrorCode})`
: ex.message;
Util.logger.error(
`- error deleting ${this.definition.type} '${customerKey}': ${errorMsg}`
);
- } else {
- throw ex;
}
return false;
diff --git a/lib/metadataTypes/Discovery.js b/lib/metadataTypes/Discovery.js
index 4d7de52b5..d737ecdd0 100644
--- a/lib/metadataTypes/Discovery.js
+++ b/lib/metadataTypes/Discovery.js
@@ -25,11 +25,7 @@ class Discovery extends MetadataType {
if (key) {
Util.logger.error('Discovery.retrieve() does not support key parameter');
}
- if (buObject.eid !== buObject.mid) {
- // don't run for BUs other than Parent BU
- Util.logger.warn(' - Skipping Discovery retrieval on non-parent BU');
- return;
- } else {
+ if (buObject.eid === buObject.mid) {
const res = await this.client.rest.getCollection(
Object.keys(this.definition.endPointMapping).map(
(endpoint) => this.definition.endPointMapping[endpoint]
@@ -44,6 +40,10 @@ class Discovery extends MetadataType {
await super.saveResults(metadataStructure, retrieveDir, null);
Util.logger.info('Downloaded: ' + this.definition.type);
return { metadata: metadataStructure, type: this.definition.type };
+ } else {
+ // don't run for BUs other than Parent BU
+ Util.logger.warn(' - Skipping Discovery retrieval on non-parent BU');
+ return;
}
}
}
diff --git a/lib/metadataTypes/Folder.js b/lib/metadataTypes/Folder.js
index 9d84f087c..a4ac1f614 100644
--- a/lib/metadataTypes/Folder.js
+++ b/lib/metadataTypes/Folder.js
@@ -21,16 +21,19 @@ class Folder extends MetadataType {
* @param {TYPE.BuObject} buObject properties for auth
* @param {void} [___] unused parameter
* @param {string} [key] customer key of single item to retrieve
+ * @param {string[]} [contentTypeList] content type of folder
* @returns {Promise} Promise
*/
- static async retrieve(retrieveDir, additionalFields, buObject, ___, key) {
+ static async retrieve(retrieveDir, additionalFields, buObject, ___, key, contentTypeList) {
if (key) {
Util.logger.error(`Folder.retrieve() does not support key parameter`);
}
- const queryAllFolders = await this.retrieveHelper(additionalFields, true);
+ const queryAllFolders = await this.retrieveHelper(additionalFields, true, contentTypeList);
if (buObject.eid !== buObject.mid) {
- queryAllFolders.push(...(await this.retrieveHelper(additionalFields, false)));
+ queryAllFolders.push(
+ ...(await this.retrieveHelper(additionalFields, false, contentTypeList))
+ );
}
const sortPairs = toposort(queryAllFolders.map((a) => [a.ParentFolder.ID, a.ID]));
const idMap = {};
@@ -150,10 +153,11 @@ class Folder extends MetadataType {
* Retrieves folder metadata for caching
*
* @param {TYPE.BuObject} buObject properties for auth
+ * @param {string[]} [contentTypeList] content type of folder
* @returns {Promise} Promise
*/
- static retrieveForCache(buObject) {
- return this.retrieve(null, null, buObject);
+ static retrieveForCache(buObject, contentTypeList) {
+ return this.retrieve(null, null, buObject, null, null, contentTypeList);
}
/**
@@ -515,10 +519,30 @@ class Folder extends MetadataType {
*
* @param {string[]} [additionalFields] Returns specified fields even if their retrieve definition is not set to true
* @param {boolean} [queryAllAccounts] which queryAllAccounts setting to use
+ * @param {string[]} [contentTypeList] content type of folder
* @returns {Promise.} soap object
*/
- static async retrieveHelper(additionalFields, queryAllAccounts) {
+ static async retrieveHelper(additionalFields, queryAllAccounts, contentTypeList) {
const options = { QueryAllAccounts: !!queryAllAccounts };
+ if (contentTypeList) {
+ for (const contentType of contentTypeList) {
+ options.filter = options.filter
+ ? {
+ leftOperand: {
+ leftOperand: 'ContentType',
+ operator: 'equals',
+ rightOperand: contentType,
+ },
+ operator: 'OR',
+ rightOperand: options.filter,
+ }
+ : {
+ leftOperand: 'ContentType',
+ operator: 'equals',
+ rightOperand: contentType,
+ };
+ }
+ }
const response = await this.client.soap.retrieveBulk(
'DataFolder',
this.getFieldNamesToRetrieve(additionalFields).filter(
diff --git a/lib/metadataTypes/List.js b/lib/metadataTypes/List.js
index b00b57b9a..a13146000 100644
--- a/lib/metadataTypes/List.js
+++ b/lib/metadataTypes/List.js
@@ -2,8 +2,10 @@
const TYPE = require('../../types/mcdev.d');
const MetadataType = require('./MetadataType');
+const Folder = require('./Folder');
const Util = require('../util/util');
const cache = require('../util/cache');
+const auth = require('../util/auth');
/**
* List MetadataType
@@ -16,12 +18,12 @@ class List extends MetadataType {
*
* @param {string} retrieveDir Directory where retrieved metadata directory will be saved
* @param {void} [_] unused parameter
- * @param {void} [__] unused parameter
+ * @param {TYPE.BuObject} buObject properties for auth
* @param {void} [___] unused parameter
* @param {string} [key] customer key of single item to retrieve
* @returns {Promise.} Promise
*/
- static retrieve(retrieveDir, _, __, ___, key) {
+ static async retrieve(retrieveDir, _, buObject, ___, key) {
/** @type {TYPE.SoapRequestParams} */
let requestParams = null;
if (key) {
@@ -42,21 +44,112 @@ class List extends MetadataType {
},
};
}
- return super.retrieveSOAP(retrieveDir, null, requestParams);
+ const results = await super.retrieveSOAP(retrieveDir, null, requestParams);
+ return await this._retrieveParentAllSubs(buObject, results);
}
/**
* Gets metadata cache with limited fields and does not store value to disk
*
+ * @param {TYPE.BuObject} buObject properties for auth
* @returns {Promise.} Promise of metadata
*/
- static async retrieveForCache() {
- const results = await this.retrieve(null);
+ static async retrieveForCache(buObject) {
+ const results = await this.retrieve(null, null, buObject);
+ if (!cache.getCache()?.folder) {
+ Util.logger.debug('folders not cached but required for list');
+ Util.logger.info(' - Caching dependent Metadata: folder');
+ Folder.client = this.client;
+ Folder.properties = this.properties;
+ const result = await Folder.retrieveForCache(buObject, [
+ 'list',
+ 'mysubs',
+ 'suppression_list',
+ 'publication',
+ 'contextual_suppression_list',
+ ]);
+ cache.setMetadata('folder', result.metadata);
+ }
for (const metadataEntry in results.metadata) {
this.parseMetadata(results.metadata[metadataEntry], true);
}
return results;
}
+ /**
+ * helper for @link retrieveForCache and @link retrieve
+ *
+ * @param {TYPE.BuObject} buObject properties for auth
+ * @param {TYPE.MetadataTypeMapObj} results metadata from retrieve for current BU
+ * @returns {Promise.} Promise
+ */
+ static async _retrieveParentAllSubs(buObject, results) {
+ if (buObject.eid !== buObject.mid) {
+ // for caching, we want to get the All Subscriber List from the Parent Account
+ Util.logger.debug(' - Checking MasterUnsubscribeBehavior for current BU');
+ /** @type {TYPE.BuObject} */
+ const buObjectParentBu = {
+ eid: this.properties.credentials[buObject.credential].eid,
+ mid: this.properties.credentials[buObject.credential].eid,
+ businessUnit: Util.parentBuName,
+ credential: buObject.credential,
+ };
+ try {
+ this.client = auth.getSDK(buObjectParentBu);
+ } catch (ex) {
+ Util.logger.error(ex.message);
+ return;
+ }
+ const buResult = await this.client.soap.retrieve(
+ 'BusinessUnit',
+ ['MasterUnsubscribeBehavior'],
+ {
+ QueryAllAccounts: true,
+ filter: {
+ leftOperand: 'ID',
+ operator: 'equals',
+ rightOperand: this.properties.credentials[buObject.credential].eid,
+ },
+ }
+ );
+ const masterUnsubscribeBehavior = buResult.Results[0]?.MasterUnsubscribeBehavior;
+ if (masterUnsubscribeBehavior === 'ENTIRE_ENTERPRISE') {
+ Util.logger.debug(` - BU uses ParentBU's All Subscriber List`);
+ Util.logger.info(
+ ' - Caching dependent Metadata: All Subscriber list (on _ParentBU_)'
+ );
+ const metadataParentBu = await this.retrieve(
+ null,
+ null,
+ buObjectParentBu,
+ null,
+ 'All Subscribers'
+ );
+ // manually set folder path of parent's All Subscriber List to avoid retrieving folders
+ for (const key of Object.keys(metadataParentBu.metadata)) {
+ metadataParentBu.metadata[key].r__folder_Path = 'my subscribers';
+ }
+ // find & delete local All Subscriber list to avoid referencing the wrong one
+ for (const key of Object.keys(results.metadata)) {
+ if (results.metadata[key].ListName === 'All Subscribers') {
+ delete results.metadata[key];
+ break;
+ }
+ }
+
+ // make sure to overwrite parent bu DEs with local ones
+ return {
+ metadata: { ...metadataParentBu.metadata, ...results.metadata },
+ type: results.type,
+ };
+ } else if (masterUnsubscribeBehavior === 'BUSINESS_UNIT_ONLY') {
+ Util.logger.debug(' - BU uses own All Subscriber List');
+ }
+ // revert client to current default
+ this.client = auth.getSDK(this.buObject);
+ }
+ return results;
+ }
+
/**
* Delete a metadata item from the specified business unit
*
@@ -85,20 +178,25 @@ class List extends MetadataType {
* @returns {TYPE.MetadataTypeItem} Array with one metadata object and one sql string
*/
static parseMetadata(metadata, parseForCache) {
- try {
- metadata.r__folder_Path = cache.searchForField(
- 'folder',
- metadata.Category,
- 'ID',
- 'Path'
- );
- if (!parseForCache) {
- delete metadata.Category;
+ if (!metadata.r__folder_Path) {
+ // if we cached all subs from parent bu, we don't need to parse the folder path again here
+ try {
+ metadata.r__folder_Path = cache.searchForField(
+ 'folder',
+ metadata.Category,
+ 'ID',
+ 'Path'
+ );
+ if (!parseForCache) {
+ delete metadata.Category;
+ }
+ } catch (ex) {
+ Util.logger.warn(
+ ` - List ${metadata.ID}: '${metadata.CustomerKey}': ${ex.message}`
+ );
}
- return metadata;
- } catch (ex) {
- Util.logger.warn(` - List ${metadata.ID}: '${metadata.CustomerKey}': ${ex.message}`);
}
+ return metadata;
}
}
// Assign definition to static attributes
diff --git a/lib/metadataTypes/MetadataType.js b/lib/metadataTypes/MetadataType.js
index 3c7a429e1..cc1070dcb 100644
--- a/lib/metadataTypes/MetadataType.js
+++ b/lib/metadataTypes/MetadataType.js
@@ -532,8 +532,8 @@ class MetadataType {
(filteredByPreDeploy > 0 ? ` / ${filteredByPreDeploy} filtered` : '')
);
- // if Results then parse as SOAP
if (this.definition.bodyIteratorField === 'Results') {
+ // if Results then parse as SOAP
// put in Retrieve Format for parsing
// todo add handling when response does not contain items.
// @ts-ignore
@@ -545,11 +545,12 @@ class MetadataType {
.map((r) => r.Object);
return this.parseResponseBody({ Results: metadataResults });
} else {
+ // likely comming from one of the many REST APIs
// put in Retrieve Format for parsing
// todo add handling when response does not contain items.
// @ts-ignore
const metadataResults = createResults.concat(updateResults).filter(Boolean);
- return this.parseResponseBody({ items: metadataResults });
+ return this.parseResponseBody(metadataResults);
}
}
@@ -613,20 +614,7 @@ class MetadataType {
}
return response;
} catch (ex) {
- if (!handleOutside) {
- const errorMsg =
- ex.results && ex.results.length
- ? `${ex.results[0].StatusMessage} (Code ${ex.results[0].ErrorCode})`
- : ex.message;
- Util.logger.error(
- ` ☇ error creating ${this.definition.type} '${
- metadataEntry[this.definition.keyField]
- }': ${errorMsg}`
- );
- } else {
- throw ex;
- }
-
+ this._handleSOAPErrors(ex, 'creating', metadataEntry, handleOutside);
return {};
}
}
@@ -692,22 +680,28 @@ class MetadataType {
}
return response;
} catch (ex) {
- if (!handleOutside) {
- const errorMsg = ex?.json?.Results.length
- ? `${ex.json.Results[0].StatusMessage} (Code ${ex.json.Results[0].ErrorCode})`
- : ex.message;
- Util.logger.error(
- ` ☇ error updating ${this.definition.type} '${
- metadataEntry[this.definition.keyField]
- }': ${errorMsg}`
- );
- } else {
- throw ex;
- }
-
+ this._handleSOAPErrors(ex, 'updating', metadataEntry, handleOutside);
return {};
}
}
+ /**
+ *
+ * @param {Error} ex error that occured
+ * @param {'creating'|'updating'} msg what to print in the log
+ * @param {TYPE.MetadataTypeItem} [metadataEntry] single metadata entry
+ * @param {boolean} [handleOutside] if the API reponse is irregular this allows you to handle it outside of this generic method
+ */
+ static _handleSOAPErrors(ex, msg, metadataEntry, handleOutside) {
+ if (handleOutside) {
+ throw ex;
+ } else {
+ const errorMsg = ex?.json?.Results?.length
+ ? `${ex.json.Results[0].StatusMessage} (Code ${ex.json.Results[0].ErrorCode})`
+ : ex.message;
+ const name = metadataEntry ? ` '${metadataEntry[this.definition.keyField]}'` : '';
+ Util.logger.error(` ☇ error ${msg} ${this.definition.type}${name}: ${errorMsg}`);
+ }
+ }
/**
* Retrieves SOAP via generic fuel-soap wrapper based metadata of metadata type into local filesystem. executes callback with retrieved metadata
*
@@ -720,11 +714,17 @@ class MetadataType {
static async retrieveSOAP(retrieveDir, buObject, requestParams, additionalFields) {
requestParams = requestParams || {};
const fields = this.getFieldNamesToRetrieve(additionalFields);
- const response = await this.client.soap.retrieveBulk(
- this.definition.type,
- fields,
- requestParams
- );
+ let response;
+ try {
+ response = await this.client.soap.retrieveBulk(
+ this.definition.type,
+ fields,
+ requestParams
+ );
+ } catch (ex) {
+ this._handleSOAPErrors(ex, 'retrieving');
+ return {};
+ }
const metadata = this.parseResponseBody(response);
if (retrieveDir) {
@@ -785,9 +785,9 @@ class MetadataType {
`Downloaded: ${overrideType || this.definition.type} (${
Object.keys(savedMetadata).length
})` +
- (singleRetrieve !== null
- ? ` ${color.dim}(Key: ${singleRetrieve})${color.reset}`
- : '')
+ (singleRetrieve === null
+ ? ''
+ : ` ${color.dim}(Key: ${singleRetrieve})${color.reset}`)
);
}
@@ -1454,7 +1454,7 @@ class MetadataType {
try {
// write to file
- const targetDirArr = !Array.isArray(targetDir) ? [targetDir] : targetDir;
+ const targetDirArr = Array.isArray(targetDir) ? targetDir : [targetDir];
for (const targetDir of targetDirArr) {
await File.writeJSONToFile(
@@ -1580,15 +1580,48 @@ class MetadataType {
return true;
} catch (ex) {
- if (!handleOutside) {
+ if (handleOutside) {
+ throw ex;
+ } else {
const errorMsg = ex?.results?.length
? `${ex.results[0].StatusMessage} (Code ${ex.results[0].ErrorCode})`
: ex.message;
Util.logger.error(
`- error deleting ${this.definition.type} '${customerKey}': ${errorMsg}`
);
- } else {
+ }
+
+ return false;
+ }
+ }
+ /**
+ * Delete a data extension from the specified business unit
+ *
+ * @param {TYPE.BuObject} buObject references credentials
+ * @param {string} url endpoint
+ * @param {string} key Identifier of metadata
+ * @param {boolean} [handleOutside] if the API reponse is irregular this allows you to handle it outside of this generic method
+ * @returns {boolean} deletion success flag
+ */
+ static async deleteByKeyREST(buObject, url, key, handleOutside) {
+ const keyObj = {};
+ keyObj[this.definition.keyField] = key;
+ try {
+ this.client.rest.delete(url);
+ if (!handleOutside) {
+ Util.logger.info(`- deleted ${this.definition.type}: ${key}`);
+ }
+ this.postDeleteTasks(buObject, key);
+
+ return true;
+ } catch (ex) {
+ if (handleOutside) {
throw ex;
+ } else {
+ const errorMsg = ex?.results?.length
+ ? `${ex.results[0].StatusMessage} (Code ${ex.results[0].ErrorCode})`
+ : ex.message;
+ Util.logger.error(`- error deleting ${this.definition.type} '${key}': ${errorMsg}`);
}
return false;
diff --git a/lib/metadataTypes/Query.js b/lib/metadataTypes/Query.js
index fa61e0674..d5b99cd47 100644
--- a/lib/metadataTypes/Query.js
+++ b/lib/metadataTypes/Query.js
@@ -120,7 +120,7 @@ class Query extends MetadataType {
static async preDeployTasks(metadata, deployDir) {
metadata.queryText = await File.readFilteredFilename(
deployDir + '/' + this.definition.type,
- metadata.key + '.' + this.definition.type + '-meta',
+ metadata[this.definition.keyField] + '.' + this.definition.type + '-meta',
'sql'
);
metadata.targetKey = cache.searchForField(
@@ -292,7 +292,7 @@ class Query extends MetadataType {
const codeArr = [
{
subFolder: null,
- fileName: metadata.key,
+ fileName: metadata[this.definition.keyField],
fileExt: 'sql',
content: metadata.queryText,
},
diff --git a/lib/metadataTypes/Script.js b/lib/metadataTypes/Script.js
index 809f72b77..c3839e16c 100644
--- a/lib/metadataTypes/Script.js
+++ b/lib/metadataTypes/Script.js
@@ -93,7 +93,7 @@ class Script extends MetadataType {
* @returns {Promise.} content for metadata.script
*/
static async _mergeCode(metadata, deployDir, templateName) {
- templateName = templateName || metadata.key;
+ templateName = templateName || metadata[this.definition.keyField];
let code;
const codePath = File.normalizePath([
deployDir,
@@ -275,7 +275,7 @@ class Script extends MetadataType {
delete metadata.script;
codeArr.push({
subFolder: null,
- fileName: metadata.key,
+ fileName: metadata[this.definition.keyField],
fileExt: fileExt,
content: code,
});
diff --git a/lib/metadataTypes/TransactionalEmail.js b/lib/metadataTypes/TransactionalEmail.js
new file mode 100644
index 000000000..c9e2bb652
--- /dev/null
+++ b/lib/metadataTypes/TransactionalEmail.js
@@ -0,0 +1,163 @@
+'use strict';
+
+const TYPE = require('../../types/mcdev.d');
+const TransactionalMessage = require('./TransactionalMessage');
+const Util = require('../util/util');
+const cache = require('../util/cache');
+
+/**
+ * TransactionalEmail MetadataType
+ *
+ * @augments TransactionalMessage
+ */
+class TransactionalEmail extends TransactionalMessage {
+ static subType = 'email';
+
+ /**
+ * Updates a single item
+ *
+ * @param {TYPE.MetadataTypeItem} metadata how the item shall look after the update
+ * @returns {Promise} Promise
+ */
+ static update(metadata) {
+ if (metadata.options?.createJourney) {
+ // only send this during create or else we might end up with an unexpected outcome
+ Util.logger.warn(
+ ` - ${this.definition.type} ${metadata[this.definition.nameField]} (${
+ metadata[this.definition.keyField]
+ }): Cannot update journey link during update. If you need to relink this item to a new journey please delete and recreate it.`
+ );
+ delete metadata.options.createJourney;
+ }
+ return super.update(metadata);
+ }
+
+ /**
+ * prepares for deployment
+ *
+ * @param {TYPE.MetadataTypeItem} metadata a single item
+ * @returns {TYPE.MetadataTypeItem} Promise
+ */
+ static async preDeployTasks(metadata) {
+ // asset
+ if (metadata.content?.customerKey) {
+ // we merely want to be able to show an error if it does not exist
+ cache.searchForField(
+ 'asset',
+ metadata.content.customerKey,
+ 'customerKey',
+ 'customerKey'
+ );
+ }
+ // subscriptions: dataExtension
+ if (metadata.subscriptions?.dataExtension) {
+ // we merely want to be able to show an error if it does not exist
+ cache.searchForField(
+ 'dataExtension',
+ metadata.subscriptions.dataExtension,
+ 'CustomerKey',
+ 'CustomerKey'
+ );
+ }
+ // subscriptions: list
+ if (metadata.subscriptions?.r__list_PathName) {
+ metadata.subscriptions.list = cache.getListObjectId(
+ metadata.subscriptions.r__list_PathName,
+ 'CustomerKey'
+ );
+ delete metadata.subscriptions.r__list_PathName;
+ }
+
+ // journey
+ if (metadata.journey?.interactionKey) {
+ // ! update & create enpoints dont accept journey.interactionKey. They only allow to create a new journey
+ // cache.searchForField('interaction', metadata.journey.interactionKey, 'key', 'key');
+ metadata.options = metadata.options || {};
+ metadata.options.createJourney = true; // only send this during create or else we might end up with an unexpected outcome
+ delete metadata.journey.interactionKey;
+ }
+
+ return metadata;
+ }
+ /**
+ * manages post retrieve steps
+ *
+ * @param {TYPE.MetadataTypeItem} metadata a single item
+ * @returns {TYPE.MetadataTypeItem} a single item
+ */
+ static postRetrieveTasks(metadata) {
+ // asset
+ if (metadata.content?.customerKey) {
+ try {
+ // we merely want to be able to show an error if it does not exist
+ cache.searchForField(
+ 'asset',
+ metadata.content.customerKey,
+ 'customerKey',
+ 'customerKey'
+ );
+ } catch (ex) {
+ Util.logger.warn(
+ ` - ${this.definition.type} ${metadata[this.definition.nameField]} (${
+ metadata[this.definition.keyField]
+ }): ${ex.message}.`
+ );
+ }
+ }
+ // subscriptions: dataExtension
+ if (metadata.subscriptions?.dataExtension) {
+ try {
+ // we merely want to be able to show a warning if it does not exist
+ cache.searchForField(
+ 'dataExtension',
+ metadata.subscriptions.dataExtension,
+ 'CustomerKey',
+ 'CustomerKey'
+ );
+ } catch (ex) {
+ Util.logger.warn(
+ ` - ${this.definition.type} ${metadata[this.definition.nameField]} (${
+ metadata[this.definition.keyField]
+ }): ${ex.message}.`
+ );
+ }
+ }
+ // subscriptions: list
+ if (metadata.subscriptions?.list) {
+ try {
+ // List
+ metadata.subscriptions.r__list_PathName = cache.getListPathName(
+ metadata.subscriptions.list,
+ 'CustomerKey'
+ );
+ delete metadata.subscriptions.list;
+ } catch (ex) {
+ Util.logger.warn(
+ ` - ${this.definition.type} ${metadata[this.definition.nameField]} (${
+ metadata[this.definition.keyField]
+ }): ${ex.message}.`
+ );
+ }
+ }
+ // journey
+ if (metadata.journey?.interactionKey) {
+ try {
+ // we merely want to be able to show a warning if it does not exist
+ cache.searchForField('interaction', metadata.journey.interactionKey, 'key', 'key');
+ } catch (ex) {
+ Util.logger.warn(
+ ` - ${this.definition.type} ${metadata[this.definition.nameField]} (${
+ metadata[this.definition.keyField]
+ }): ${ex.message}.`
+ );
+ }
+ }
+
+ return metadata;
+ }
+}
+
+// Assign definition to static attributes
+TransactionalEmail.definition = require('../MetadataTypeDefinitions').transactionalEmail;
+
+module.exports = TransactionalEmail;
diff --git a/lib/metadataTypes/TransactionalMessage.js b/lib/metadataTypes/TransactionalMessage.js
new file mode 100644
index 000000000..67c22ee68
--- /dev/null
+++ b/lib/metadataTypes/TransactionalMessage.js
@@ -0,0 +1,127 @@
+'use strict';
+
+const TYPE = require('../../types/mcdev.d');
+const MetadataType = require('./MetadataType');
+const Util = require('../util/util');
+
+/**
+ * TransactionalMessage MetadataType
+ *
+ * @augments MetadataType
+ */
+class TransactionalMessage extends MetadataType {
+ // define this.subType as string here for intellisense; requires to be redefined in child class
+ static subType;
+ /**
+ * Retrieves Metadata of Mobile Keywords
+ * Endpoint /legacy/v1/beta/mobile/code/ return all Mobile Codes with all details.
+ *
+ * @param {string} retrieveDir Directory where retrieved metadata directory will be saved
+ * @param {void} [_] unused parameter
+ * @param {void} [__] unused parameter
+ * @param {void} [___] unused parameter
+ * @param {string} [key] customer key of single item to retrieve
+ * @returns {Promise.} Promise of metadata
+ */
+ static async retrieve(retrieveDir, _, __, ___, key) {
+ let keyList;
+ const baseUri = '/messaging/v1/' + this.subType + '/definitions/';
+ if (key) {
+ // Retrieve single
+ keyList = [key];
+ } else {
+ // Retrieve all
+ const response = this.definition.restPagination
+ ? await this.client.rest.getBulk(baseUri)
+ : await this.client.rest.get(baseUri);
+ const parsed = this.parseResponseBody(response);
+ keyList = Object.keys(parsed).filter((item) => parsed[item].status !== 'Deleted');
+ const filteredCount = Object.keys(parsed).length - keyList.length;
+ if (filteredCount) {
+ Util.logger.info(
+ ` - Filtered ${this.definition.type} with status 'deleted': ${filteredCount} (downloaded but not saved to disk)`
+ );
+ }
+ }
+
+ // get all sms with additional details not given by the list endpoint
+ const details = (
+ await Promise.all(
+ keyList.map(async (key) => {
+ try {
+ return await this.client.rest.get(baseUri + (key || ''));
+ } catch {
+ return null;
+ }
+ })
+ )
+ ).filter(Boolean);
+ const parsed = this.parseResponseBody({ definitions: 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);
+ // defined colors for optionally printing the keys we filtered by
+ const color = {
+ reset: '\x1B[0m',
+ dim: '\x1B[2m',
+ };
+ Util.logger.info(
+ `Downloaded: ${this.definition.type} (${Object.keys(savedMetadata).length})` +
+ (key === null ? '' : ` ${color.dim}(Key: ${key})${color.reset}`)
+ );
+
+ return { metadata: savedMetadata, type: this.definition.type };
+ }
+
+ /**
+ * Retrieves event definition metadata for caching
+ *
+ * @returns {Promise.} Promise of metadata
+ */
+ static retrieveForCache() {
+ return super.retrieveREST(null, '/messaging/v1/' + this.subType + '/definitions/');
+ }
+ /**
+ * Updates a single item
+ *
+ * @param {TYPE.MetadataTypeItem} metadata a single item
+ * @returns {Promise} Promise
+ */
+ static update(metadata) {
+ return super.updateREST(
+ metadata,
+ '/messaging/v1/' + this.subType + '/definitions/' + metadata[this.definition.keyField]
+ );
+ }
+
+ /**
+ * Creates a single item
+ *
+ * @param {TYPE.MetadataTypeItem} metadata a single item
+ * @returns {Promise} Promise
+ */
+ static create(metadata) {
+ return super.createREST(metadata, '/messaging/v1/' + this.subType + '/definitions');
+ }
+ /**
+ * Delete a metadata item from the specified business unit
+ *
+ * @param {TYPE.BuObject} buObject references credentials
+ * @param {string} key Identifier of item
+ * @returns {Promise.} deletion success status
+ */
+ static deleteByKey(buObject, key) {
+ return super.deleteByKeyREST(
+ buObject,
+ '/messaging/v1/' + this.subType + '/definitions/' + key,
+ key,
+ false
+ );
+ }
+}
+
+// Assign definition to static attributes
+// ! using SMS definitions here as placeholder to have auto completion
+TransactionalMessage.definition = require('../MetadataTypeDefinitions').transactionalSMS;
+
+module.exports = TransactionalMessage;
diff --git a/lib/metadataTypes/TransactionalPush.js b/lib/metadataTypes/TransactionalPush.js
new file mode 100644
index 000000000..1b97b6922
--- /dev/null
+++ b/lib/metadataTypes/TransactionalPush.js
@@ -0,0 +1,77 @@
+'use strict';
+
+const TYPE = require('../../types/mcdev.d');
+const TransactionalMessage = require('./TransactionalMessage');
+const Util = require('../util/util');
+const cache = require('../util/cache');
+
+/**
+ * TransactionalPush TransactionalMessage
+ *
+ * @augments TransactionalMessage
+ */
+class TransactionalPush extends TransactionalMessage {
+ static subType = 'push';
+
+ /**
+ * prepares for deployment
+ *
+ * @param {TYPE.MetadataTypeItem} metadata a single item
+ * @returns {TYPE.MetadataTypeItem} Promise
+ */
+ static async preDeployTasks(metadata) {
+ // asset
+ if (metadata.content?.customerKey) {
+ // we merely want to be able to show an error if it does not exist
+ cache.searchForField(
+ 'asset',
+ metadata.content.customerKey,
+ 'customerKey',
+ 'customerKey'
+ );
+ }
+ if (metadata.options?.badge && typeof metadata.options?.badge !== 'string') {
+ // ensure it's a string, or else the API will return an error. Our SDK turns numbers in strings into actual numbers
+ metadata.options.badge += '';
+ }
+
+ return metadata;
+ }
+ /**
+ * manages post retrieve steps
+ *
+ * @param {TYPE.MetadataTypeItem} metadata a single item
+ * @returns {TYPE.MetadataTypeItem} a single item
+ */
+ static postRetrieveTasks(metadata) {
+ // asset
+ if (metadata.content?.customerKey) {
+ try {
+ // we merely want to be able to show an error if it does not exist
+ cache.searchForField(
+ 'asset',
+ metadata.content.customerKey,
+ 'customerKey',
+ 'customerKey'
+ );
+ } catch (ex) {
+ Util.logger.warn(
+ ` - ${this.definition.type} ${metadata[this.definition.nameField]} (${
+ metadata[this.definition.keyField]
+ }): ${ex.message}.`
+ );
+ }
+ }
+ if (metadata.options?.badge && typeof metadata.options?.badge !== 'string') {
+ // ensure it's a string, or else the API will return an error. Our SDK turns numbers in strings into actual numbers
+ metadata.options.badge += '';
+ }
+
+ return metadata;
+ }
+}
+
+// Assign definition to static attributes
+TransactionalPush.definition = require('../MetadataTypeDefinitions').transactionalPush;
+
+module.exports = TransactionalPush;
diff --git a/lib/metadataTypes/TransactionalSMS.js b/lib/metadataTypes/TransactionalSMS.js
new file mode 100644
index 000000000..d1f12f730
--- /dev/null
+++ b/lib/metadataTypes/TransactionalSMS.js
@@ -0,0 +1,354 @@
+'use strict';
+
+const TYPE = require('../../types/mcdev.d');
+const TransactionalMessage = require('./TransactionalMessage');
+const Util = require('../util/util');
+const File = require('../util/file');
+const beautifier = require('beauty-amp-core');
+const cache = require('../util/cache');
+
+/**
+ * TransactionalSMS MetadataType
+ *
+ * @augments TransactionalMessage
+ */
+class TransactionalSMS extends TransactionalMessage {
+ static subType = 'sms';
+ /**
+ * clean up after deleting a metadata item
+ *
+ * @param {TYPE.BuObject} buObject references credentials
+ * @param {string} customerKey Identifier of metadata item
+ * @returns {void}
+ */
+ static async postDeleteTasks(buObject, customerKey) {
+ // delete local copy: retrieve/cred/bu/type/...json
+ const fileName = File.normalizePath([
+ this.properties.directories.retrieve,
+ buObject.credential,
+ buObject.businessUnit,
+ this.definition.type,
+ `${customerKey}.${this.definition.type}-meta.`,
+ ]);
+ await File.remove(fileName + 'json');
+ await File.remove(fileName + 'amp');
+ }
+
+ /**
+ * prepares for deployment
+ *
+ * @param {TYPE.MetadataTypeItem} metadata a single item
+ * @param {string} dir directory of deploy files
+ * @returns {TYPE.MetadataTypeItem} Promise
+ */
+ static async preDeployTasks(metadata, dir) {
+ // code
+ metadata.content = {
+ message: await this._mergeCode(metadata, dir),
+ };
+
+ if (this._isHTML(metadata.content?.message)) {
+ // keep this as a non-blocking warning because the test not 100% accurate
+ Util.logger.warn(
+ ` - ${this.definition.type} ${metadata[this.definition.nameField]} (${
+ metadata[this.definition.keyField]
+ }): HTML detected`
+ );
+ }
+
+ // subscriptions: mobileCode
+ if (metadata.subscriptions?.shortCode) {
+ // we merely want to be able to show an error if it does not exist
+ cache.searchForField('mobileCode', metadata.subscriptions.shortCode, 'code', 'code');
+ }
+ // subscriptions: mobileKeyword
+ if (metadata.subscriptions?.keyword) {
+ // we merely want to be able to show an error if it does not exist
+ cache.searchForField(
+ 'mobileKeyword',
+ metadata.subscriptions.keyword,
+ 'keyword',
+ 'keyword'
+ );
+ }
+ return metadata;
+ }
+ /**
+ * 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)
+ * @returns {Promise.} content for metadata.script
+ */
+ static async _mergeCode(metadata, deployDir, templateName) {
+ templateName = templateName || metadata[this.definition.keyField];
+ const codePath = File.normalizePath([
+ deployDir,
+ this.definition.type,
+ templateName + '.' + this.definition.type + '-meta',
+ ]);
+
+ if (await File.pathExists(codePath + '.amp')) {
+ return await File.readFilteredFilename(
+ [deployDir, this.definition.type],
+ templateName + '.' + this.definition.type + '-meta',
+ 'amp'
+ );
+ } else {
+ throw new Error(`Could not find ${codePath}.amp`);
+ }
+ }
+ /**
+ * manages post retrieve steps
+ *
+ * @param {TYPE.MetadataTypeItem} metadata a single item
+ * @returns {TYPE.CodeExtractItem} Array with one metadata object and one ssjs string
+ */
+ static postRetrieveTasks(metadata) {
+ // extract message body
+ const codeArr = [];
+ // keep between tags
+ const { fileExt, code } = this.prepExtractedCode(metadata.content?.message);
+ delete metadata.content;
+ codeArr.push({
+ subFolder: null,
+ fileName: metadata[this.definition.keyField],
+ fileExt: fileExt,
+ content: code,
+ });
+
+ if (this._isHTML(code)) {
+ Util.logger.warn(
+ ` - ${this.definition.type} ${metadata[this.definition.nameField]} (${
+ metadata[this.definition.keyField]
+ }): HTML detected`
+ );
+ }
+
+ // subscriptions: mobileCode
+ if (metadata.subscriptions?.shortCode) {
+ try {
+ // we merely want to be able to show a warning if it does not exist
+ cache.searchForField(
+ 'mobileCode',
+ metadata.subscriptions.shortCode,
+ 'code',
+ 'code'
+ );
+ } catch {
+ Util.logger.warn(
+ ` - ${this.definition.type} ${metadata[this.definition.nameField]} (${
+ metadata[this.definition.keyField]
+ }): Could not find mobileCode ${metadata.subscriptions.shortCode}.`
+ );
+ }
+ }
+ // subscriptions: mobileKeyword
+ if (metadata.subscriptions?.keyword) {
+ try {
+ // we merely want to be able to show a warning if it does not exist
+ cache.searchForField(
+ 'mobileKeyword',
+ metadata.subscriptions.keyword,
+ 'keyword',
+ 'keyword'
+ );
+ } catch {
+ Util.logger.warn(
+ ` - ${this.definition.type} ${metadata[this.definition.nameField]} (${
+ metadata[this.definition.keyField]
+ }): Could not find mobileKeyword ${metadata.subscriptions.keyword}.`
+ );
+ }
+ }
+
+ return { json: metadata, codeArr: codeArr, subFolder: null };
+ }
+ /**
+ * 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
+ */
+ static prepExtractedCode(metadataScript) {
+ // immutable at the moment:
+ const ampscript = {
+ capitalizeAndOrNot: true,
+ capitalizeIfFor: true,
+ capitalizeSet: true,
+ capitalizeVar: true,
+ maxParametersPerLine: 4,
+ };
+ // immutable at the moment:
+ const editor = {
+ insertSpaces: true,
+ tabSize: 4,
+ };
+ // logs trough console only for the moment.
+ const logs = {
+ loggerOn: false, // <= disable logging
+ };
+
+ beautifier.setup(ampscript, editor, logs);
+ const code = beautifier.beautify(metadataScript);
+ const fileExt = 'amp';
+
+ return { fileExt, code };
+ }
+ /**
+ * 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
+ * @param {TYPE.TemplateMap} templateVariables variables to be replaced in the metadata
+ * @param {string} templateName name of the template to be built
+ * @returns {Promise.} list of extracted files with path-parts provided as an array
+ */
+ static buildDefinitionForNested(
+ templateDir,
+ targetDir,
+ metadata,
+ templateVariables,
+ templateName
+ ) {
+ return this._buildForNested(
+ templateDir,
+ targetDir,
+ metadata,
+ templateVariables,
+ templateName,
+ 'definition'
+ );
+ }
+ /**
+ * 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
+ * @param {TYPE.MetadataTypeItem} metadata main JSON file that was read from file system
+ * @param {TYPE.TemplateMap} templateVariables variables to be replaced in the metadata
+ * @param {string} templateName name of the template to be built
+ * @returns {Promise.} list of extracted files with path-parts provided as an array
+ */
+ static buildTemplateForNested(
+ templateDir,
+ targetDir,
+ metadata,
+ templateVariables,
+ templateName
+ ) {
+ return this._buildForNested(
+ templateDir,
+ targetDir,
+ metadata,
+ templateVariables,
+ templateName,
+ 'template'
+ );
+ }
+
+ /**
+ * 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
+ * @param {TYPE.TemplateMap} templateVariables variables to be replaced in the metadata
+ * @param {string} templateName name of the template to be built
+ * @param {'definition'|'template'} mode defines what we use this helper for
+ * @returns {Promise.} list of extracted files with path-parts provided as an array
+ */
+ static async _buildForNested(
+ templateDir,
+ targetDir,
+ metadata,
+ templateVariables,
+ templateName,
+ mode
+ ) {
+ // get code from filesystem
+ let code = await this._mergeCode(metadata, templateDir, templateName);
+ const file = this.prepExtractedCode(code, metadata.name);
+ const fileExt = file.fileExt;
+ code = file.code;
+ // apply templating
+ try {
+ if (mode === 'definition') {
+ // replace template variables with their values
+ code = this.applyTemplateValues(code, templateVariables);
+ } else if (mode === 'template') {
+ // replace template values with corresponding variable names
+ code = this.applyTemplateNames(code, templateVariables);
+ }
+ } catch {
+ throw new Error(
+ `${this.definition.type}:: Error applying template variables on ${
+ templateName + '.' + this.definition.type
+ }-meta.${fileExt}.`
+ );
+ }
+
+ // write to file
+ const targetDirArr = Array.isArray(targetDir) ? targetDir : [targetDir];
+ const nestedFilePaths = [];
+
+ // keep old name if creating templates, otherwise use new name
+ const fileName = mode === 'definition' ? metadata[this.definition.keyField] : templateName;
+
+ for (const targetDir of targetDirArr) {
+ File.writeToFile(
+ [targetDir, this.definition.type],
+ fileName + '.' + this.definition.type + '-meta',
+ fileExt,
+ code
+ );
+ nestedFilePaths.push([
+ targetDir,
+ this.definition.type,
+ fileName + '.' + this.definition.type + '-meta.' + fileExt,
+ ]);
+ }
+ return nestedFilePaths;
+ }
+ /**
+ * very simplified test for HTML code in our SMS
+ *
+ * @param {string} code sms source code
+ * @returns {boolean} true if HTML is found
+ */
+ static _isHTML(code) {
+ return /(<([^>]+)>)/gi.test(code);
+ }
+ /**
+ * 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']
+ */
+ static getFilesToCommit(keyArr) {
+ const path = File.normalizePath([
+ this.properties.directories.retrieve,
+ this.buObject.credential,
+ this.buObject.businessUnit,
+ this.definition.type,
+ ]);
+
+ const fileList = keyArr.flatMap((key) => [
+ File.normalizePath([path, `${key}.${this.definition.type}-meta.json`]),
+ File.normalizePath([path, `${key}.${this.definition.type}-meta.amp`]),
+ ]);
+ return fileList;
+ }
+}
+
+// Assign definition to static attributes
+TransactionalSMS.definition = require('../MetadataTypeDefinitions').transactionalSMS;
+
+module.exports = TransactionalSMS;
diff --git a/lib/metadataTypes/TriggeredSendDefinition.js b/lib/metadataTypes/TriggeredSendDefinition.js
index 9e718d5be..2853c1608 100644
--- a/lib/metadataTypes/TriggeredSendDefinition.js
+++ b/lib/metadataTypes/TriggeredSendDefinition.js
@@ -169,14 +169,16 @@ class TriggeredSendDefinition extends MetadataType {
);
}
}
- // List
- try {
- metadata.r__list_PathName = cache.getListPathName(metadata.List.ID, 'ID');
- delete metadata.List;
- } catch (ex) {
- Util.logger.warn(
- ` - ${this.definition.typeName} '${metadata.Name}'/'${metadata.CustomerKey}': ${ex.message}`
- );
+ // List (optional)
+ if (metadata.List) {
+ try {
+ metadata.r__list_PathName = cache.getListPathName(metadata.List.ID, 'ID');
+ delete metadata.List;
+ } catch (ex) {
+ Util.logger.warn(
+ ` - ${this.definition.typeName} '${metadata.Name}'/'${metadata.CustomerKey}': ${ex.message}`
+ );
+ }
}
return metadata;
@@ -227,7 +229,7 @@ class TriggeredSendDefinition extends MetadataType {
`r__assetMessage_Key / r__email_Name not defined but instead found Email.ID. Please try re-retrieving this TSD from your BU.`
);
}
- // get List
+ // get List (optional)
if (metadata.r__list_PathName) {
metadata.List = {
ID: cache.getListObjectId(metadata.r__list_PathName, 'ID'),
diff --git a/lib/metadataTypes/definitions/TransactionalEmail.definition.js b/lib/metadataTypes/definitions/TransactionalEmail.definition.js
new file mode 100644
index 000000000..8b8cd08e6
--- /dev/null
+++ b/lib/metadataTypes/definitions/TransactionalEmail.definition.js
@@ -0,0 +1,145 @@
+module.exports = {
+ bodyIteratorField: 'definitions',
+ dependencies: ['asset-message', 'dataExtension', 'list', 'interaction'],
+ hasExtended: false,
+ idField: 'definitionId',
+ keyField: 'definitionKey',
+ nameField: 'name',
+ createdDateField: 'createdDate',
+ createdNameField: null,
+ lastmodDateField: 'modifiedDate',
+ lastmodNameField: null,
+ restPagination: false,
+ type: 'transactionalEmail',
+ typeDescription: 'Lets you send immediate Email messages via API events',
+ typeRetrieveByDefault: true,
+ typeName: 'Transactional Email',
+ fields: {
+ name: {
+ isCreateable: true,
+ isUpdateable: true,
+ retrieving: true,
+ template: true,
+ },
+ definitionKey: {
+ isCreateable: true,
+ isUpdateable: false,
+ retrieving: true,
+ template: true,
+ },
+ description: {
+ isCreateable: true,
+ isUpdateable: true,
+ retrieving: true,
+ template: true,
+ },
+ requestId: {
+ isCreateable: false,
+ isUpdateable: false,
+ retrieving: false,
+ template: false,
+ },
+ definitionId: {
+ isCreateable: true,
+ isUpdateable: true,
+ retrieving: false,
+ template: false,
+ },
+ status: {
+ isCreateable: true,
+ isUpdateable: true,
+ retrieving: true,
+ template: true,
+ },
+ createdDate: {
+ isCreateable: false,
+ isUpdateable: false,
+ retrieving: true,
+ template: false,
+ },
+ modifiedDate: {
+ isCreateable: false,
+ isUpdateable: false,
+ retrieving: true,
+ template: false,
+ },
+ classification: {
+ isCreateable: true,
+ isUpdateable: true,
+ retrieving: true,
+ template: true,
+ },
+ 'content.customerKey': {
+ isCreateable: true,
+ isUpdateable: true,
+ retrieving: true,
+ template: true,
+ },
+ 'subscriptions.dataExtension': {
+ isCreateable: true,
+ isUpdateable: true,
+ retrieving: true,
+ template: true,
+ },
+ 'subscriptions.list': {
+ isCreateable: true,
+ isUpdateable: true,
+ retrieving: true,
+ template: true,
+ },
+ 'subscriptions.r__list_PathName': {
+ isCreateable: false,
+ isUpdateable: false,
+ retrieving: true,
+ template: true,
+ },
+ 'subscriptions.autoAddSubscriber': {
+ isCreateable: true,
+ isUpdateable: true,
+ retrieving: true,
+ template: true,
+ },
+ 'subscriptions.updateSubscriber': {
+ isCreateable: true,
+ isUpdateable: true,
+ retrieving: true,
+ template: true,
+ },
+ 'options.trackLinks': {
+ isCreateable: true,
+ isUpdateable: true,
+ retrieving: true,
+ template: true,
+ },
+ 'options.cc': {
+ isCreateable: true,
+ isUpdateable: true,
+ retrieving: true,
+ template: true,
+ },
+ 'options.bcc': {
+ isCreateable: true,
+ isUpdateable: true,
+ retrieving: true,
+ template: true,
+ },
+ 'options.createJourney': {
+ isCreateable: true,
+ isUpdateable: true,
+ retrieving: false,
+ template: false,
+ },
+ journey: {
+ isCreateable: false,
+ isUpdateable: false,
+ retrieving: true,
+ template: true,
+ },
+ 'journey.interactionKey': {
+ isCreateable: false,
+ isUpdateable: false,
+ retrieving: true,
+ template: true,
+ },
+ },
+};
diff --git a/lib/metadataTypes/definitions/TransactionalPush.definition.js b/lib/metadataTypes/definitions/TransactionalPush.definition.js
new file mode 100644
index 000000000..21caee96e
--- /dev/null
+++ b/lib/metadataTypes/definitions/TransactionalPush.definition.js
@@ -0,0 +1,109 @@
+module.exports = {
+ bodyIteratorField: 'definitions',
+ dependencies: ['asset-asset'],
+ hasExtended: false,
+ idField: 'definitionId',
+ keyField: 'definitionKey',
+ nameField: 'name',
+ createdDateField: 'createdDate',
+ createdNameField: null,
+ lastmodDateField: 'modifiedDate',
+ lastmodNameField: null,
+ restPagination: false,
+ type: 'transactionalPush',
+ typeDescription: 'Lets you send immediate Push messages via API events',
+ typeRetrieveByDefault: true,
+ typeName: 'Transactional Push',
+ fields: {
+ name: {
+ isCreateable: true,
+ isUpdateable: true,
+ retrieving: true,
+ template: true,
+ },
+ definitionKey: {
+ isCreateable: true,
+ isUpdateable: false,
+ retrieving: true,
+ template: true,
+ },
+ description: {
+ isCreateable: true,
+ isUpdateable: true,
+ retrieving: true,
+ template: true,
+ },
+ requestId: {
+ isCreateable: false,
+ isUpdateable: false,
+ retrieving: false,
+ template: false,
+ },
+ definitionId: {
+ isCreateable: true,
+ isUpdateable: true,
+ retrieving: false,
+ template: false,
+ },
+ status: {
+ isCreateable: true,
+ isUpdateable: true,
+ retrieving: true,
+ template: false,
+ },
+ createdDate: {
+ isCreateable: false,
+ isUpdateable: false,
+ retrieving: true,
+ template: false,
+ },
+ modifiedDate: {
+ isCreateable: false,
+ isUpdateable: false,
+ retrieving: true,
+ template: false,
+ },
+ 'content.customerKey': {
+ isCreateable: true,
+ isUpdateable: true,
+ retrieving: true,
+ template: true,
+ },
+ 'options.badge': {
+ isCreateable: true,
+ isUpdateable: true,
+ retrieving: true,
+ template: true,
+ },
+ 'options.sound': {
+ isCreateable: true,
+ isUpdateable: true,
+ retrieving: true,
+ template: true,
+ },
+ 'options.customKeys': {
+ isCreateable: true,
+ isUpdateable: true,
+ retrieving: true,
+ template: true,
+ },
+ 'options.customKeys[].value': {
+ isCreateable: true,
+ isUpdateable: true,
+ retrieving: true,
+ template: true,
+ },
+ 'options.customKeys[].key': {
+ isCreateable: true,
+ isUpdateable: true,
+ retrieving: true,
+ template: true,
+ },
+ applicationId: {
+ isCreateable: true,
+ isUpdateable: true,
+ retrieving: true,
+ template: true,
+ },
+ },
+};
diff --git a/lib/metadataTypes/definitions/TransactionalSMS.definition.js b/lib/metadataTypes/definitions/TransactionalSMS.definition.js
new file mode 100644
index 000000000..ff9e49d5d
--- /dev/null
+++ b/lib/metadataTypes/definitions/TransactionalSMS.definition.js
@@ -0,0 +1,103 @@
+module.exports = {
+ bodyIteratorField: 'definitions',
+ dependencies: ['mobileCode', 'mobileKeyword'],
+ hasExtended: false,
+ idField: 'definitionId',
+ keyField: 'definitionKey',
+ nameField: 'name',
+ createdDateField: 'createdDate',
+ createdNameField: null,
+ lastmodDateField: 'modifiedDate',
+ lastmodNameField: null,
+ restPagination: false,
+ type: 'transactionalSMS',
+ typeDescription: 'Lets you send immediate SMS messages via API events',
+ typeRetrieveByDefault: true,
+ typeName: 'Transactional SMS',
+ fields: {
+ name: {
+ isCreateable: true,
+ isUpdateable: true,
+ retrieving: true,
+ template: true,
+ },
+ definitionKey: {
+ isCreateable: true,
+ isUpdateable: false,
+ retrieving: true,
+ template: true,
+ },
+ description: {
+ isCreateable: true,
+ isUpdateable: true,
+ retrieving: true,
+ template: true,
+ },
+ requestId: {
+ isCreateable: false,
+ isUpdateable: false,
+ retrieving: false,
+ template: false,
+ },
+ definitionId: {
+ isCreateable: true,
+ isUpdateable: true,
+ retrieving: false,
+ template: false,
+ },
+ status: {
+ isCreateable: true,
+ isUpdateable: true,
+ retrieving: true,
+ template: true,
+ },
+ createdDate: {
+ isCreateable: false,
+ isUpdateable: false,
+ retrieving: true,
+ template: false,
+ },
+ modifiedDate: {
+ isCreateable: false,
+ isUpdateable: false,
+ retrieving: true,
+ template: false,
+ },
+ 'content.message': {
+ isCreateable: true,
+ isUpdateable: true,
+ retrieving: true,
+ template: true,
+ },
+ 'subscriptions.shortCode': {
+ isCreateable: true,
+ isUpdateable: true,
+ retrieving: true,
+ template: true,
+ },
+ 'subscriptions.countryCode': {
+ isCreateable: true,
+ isUpdateable: true,
+ retrieving: true,
+ template: true,
+ },
+ 'subscriptions.autoAddSubscriber': {
+ isCreateable: true,
+ isUpdateable: true,
+ retrieving: true,
+ template: true,
+ },
+ 'subscriptions.updateSubscriber': {
+ isCreateable: true,
+ isUpdateable: true,
+ retrieving: true,
+ template: true,
+ },
+ 'subscriptions.keyword': {
+ isCreateable: true,
+ isUpdateable: true,
+ retrieving: true,
+ template: true,
+ },
+ },
+};
diff --git a/lib/metadataTypes/definitions/TriggeredSendDefinition.definition.js b/lib/metadataTypes/definitions/TriggeredSendDefinition.definition.js
index da48afecc..705aa5059 100644
--- a/lib/metadataTypes/definitions/TriggeredSendDefinition.definition.js
+++ b/lib/metadataTypes/definitions/TriggeredSendDefinition.definition.js
@@ -22,41 +22,41 @@ module.exports = {
isCreateable: true,
isUpdateable: true,
retrieving: true,
- templating: false,
+ templating: true,
},
AutoAddSubscribers: {
isCreateable: true,
isUpdateable: true,
retrieving: true,
- templating: false,
+ templating: true,
},
AutoUpdateSubscribers: {
isCreateable: true,
isUpdateable: true,
retrieving: true,
- templating: false,
+ templating: true,
},
BatchInterval: {
isCreateable: true,
isUpdateable: true,
retrieving: true,
- templating: false,
+ templating: true,
},
BccEmail: {
isCreateable: true,
isUpdateable: true,
retrieving: true,
- templating: false,
+ templating: true,
},
CategoryID: {
isCreateable: true,
isUpdateable: true,
retrieving: true,
- templating: false,
+ templating: true,
},
CCEmail: {
- isCreateable: true,
- isUpdateable: true,
+ isCreateable: false,
+ isUpdateable: false,
retrieving: false,
templating: false,
},
@@ -88,7 +88,7 @@ module.exports = {
isCreateable: true,
isUpdateable: true,
retrieving: true,
- templating: false,
+ templating: true,
},
DataSchemas: {
isCreateable: false,
@@ -100,7 +100,7 @@ module.exports = {
isCreateable: true,
isUpdateable: true,
retrieving: true,
- templating: false,
+ templating: true,
},
'DeliveryProfile.ObjectID': {
isCreateable: true,
@@ -112,7 +112,7 @@ module.exports = {
isCreateable: true,
isUpdateable: true,
retrieving: true,
- templating: false,
+ templating: true,
},
DisableOnEmailBuildError: {
isCreateable: false,
@@ -130,13 +130,13 @@ module.exports = {
isCreateable: true,
isUpdateable: true,
retrieving: true,
- templating: false,
+ templating: true,
},
'Email.ID': {
isCreateable: true,
isUpdateable: true,
retrieving: true,
- templating: false,
+ templating: true,
},
'Email.PartnerKey': {
isCreateable: false,
@@ -154,7 +154,7 @@ module.exports = {
isCreateable: true,
isUpdateable: true,
retrieving: true,
- templating: false,
+ templating: true,
},
ExclusionFilter: {
isCreateable: false,
@@ -172,7 +172,7 @@ module.exports = {
isCreateable: true,
isUpdateable: true,
retrieving: true,
- templating: false,
+ templating: true,
},
FooterSalutationSource: {
isCreateable: false,
@@ -184,19 +184,19 @@ module.exports = {
isCreateable: true,
isUpdateable: true,
retrieving: true,
- templating: false,
+ templating: true,
},
FromName: {
isCreateable: true,
isUpdateable: true,
retrieving: true,
- templating: false,
+ templating: true,
},
'HeaderContentArea.ID': {
isCreateable: true,
isUpdateable: true,
retrieving: true,
- templating: false,
+ templating: true,
},
HeaderSalutationSource: {
isCreateable: false,
@@ -226,7 +226,7 @@ module.exports = {
isCreateable: true,
isUpdateable: true,
retrieving: true,
- templating: false,
+ templating: true,
},
IsPlatformObject: {
isCreateable: true,
@@ -244,7 +244,7 @@ module.exports = {
isCreateable: true,
isUpdateable: true,
retrieving: true,
- templating: false,
+ templating: true,
},
KeepExistingEmailSubject: {
isCreateable: false,
@@ -256,13 +256,13 @@ module.exports = {
isCreateable: true,
isUpdateable: true,
retrieving: true,
- templating: false,
+ templating: true,
},
'List.ID': {
isCreateable: true,
isUpdateable: true,
retrieving: true,
- templating: false,
+ templating: true,
},
'List.PartnerKey': {
isCreateable: false,
@@ -286,13 +286,13 @@ module.exports = {
isCreateable: true,
isUpdateable: true,
retrieving: true,
- templating: false,
+ templating: true,
},
NewSlotTrigger: {
isCreateable: true,
isUpdateable: true,
retrieving: true,
- templating: false,
+ templating: true,
},
ObjectID: {
isCreateable: false,
@@ -352,13 +352,13 @@ module.exports = {
isCreateable: true,
isUpdateable: true,
retrieving: true,
- templating: false,
+ templating: true,
},
'PrivateDomain.ObjectID': {
isCreateable: true,
isUpdateable: true,
retrieving: true,
- templating: false,
+ templating: true,
},
'PrivateDomain.PartnerKey': {
isCreateable: false,
@@ -370,7 +370,7 @@ module.exports = {
isCreateable: true,
isUpdateable: true,
retrieving: true,
- templating: false,
+ templating: true,
},
'PrivateIP.PartnerKey': {
isCreateable: false,
@@ -406,7 +406,7 @@ module.exports = {
isCreateable: true,
isUpdateable: true,
retrieving: true,
- templating: false,
+ templating: true,
},
'SendClassification.ObjectID': {
isCreateable: false,
@@ -424,7 +424,7 @@ module.exports = {
isCreateable: true,
isUpdateable: true,
retrieving: true,
- templating: false,
+ templating: true,
},
'SenderProfile.ObjectID': {
isCreateable: false,
@@ -442,7 +442,7 @@ module.exports = {
isCreateable: true,
isUpdateable: true,
retrieving: true,
- templating: false,
+ templating: true,
},
SendSourceCustomerKey: {
isCreateable: false,
@@ -460,7 +460,7 @@ module.exports = {
isCreateable: true,
isUpdateable: true,
retrieving: true,
- templating: false,
+ templating: true,
},
SendWindowDelete: {
isCreateable: false,
@@ -472,7 +472,7 @@ module.exports = {
isCreateable: true,
isUpdateable: true,
retrieving: true,
- templating: false,
+ templating: true,
},
SourceAddressType: {
isCreateable: false,
@@ -484,13 +484,13 @@ module.exports = {
isCreateable: true,
isUpdateable: true,
retrieving: true,
- templating: false,
+ templating: true,
},
TestEmailAddr: {
isCreateable: true,
isUpdateable: true,
retrieving: true,
- templating: false,
+ templating: true,
},
TriggeredSendClass: {
isCreateable: false,
@@ -502,7 +502,7 @@ module.exports = {
isCreateable: true,
isUpdateable: true,
retrieving: true,
- templating: false,
+ templating: true,
},
TriggeredSendSubClass: {
isCreateable: false,
@@ -514,7 +514,7 @@ module.exports = {
isCreateable: true,
isUpdateable: true,
retrieving: true,
- templating: false,
+ templating: true,
},
TriggeredSendVersionID: {
isCreateable: false,
diff --git a/lib/util/auth.js b/lib/util/auth.js
index 71fa18bd2..e69169b36 100644
--- a/lib/util/auth.js
+++ b/lib/util/auth.js
@@ -93,7 +93,7 @@ function setupSDK(sessionKey, authObject) {
eventHandlers: {
onLoop: (type, req) => {
Util.logger.info(
- `- Requesting next batch (currently ${req.Results.length} records)`
+ ` - Requesting next batch (currently ${req.Results.length} records)`
);
},
onRefresh: (authObject) => {
@@ -102,7 +102,7 @@ function setupSDK(sessionKey, authObject) {
},
onConnectionError: (ex, remainingAttempts) => {
Util.logger.warn(
- `- Connection problem (Code: ${ex.code}). Retrying ${remainingAttempts} time${
+ ` - Connection problem (Code: ${ex.code}). Retrying ${remainingAttempts} time${
remainingAttempts > 1 ? 's' : ''
}`
);
diff --git a/lib/util/businessUnit.js b/lib/util/businessUnit.js
index befed3e25..a3cb3937a 100644
--- a/lib/util/businessUnit.js
+++ b/lib/util/businessUnit.js
@@ -68,7 +68,7 @@ const BusinessUnit = {
myBuList[equalizedName] = element.ID;
Util.logger.info(
` - ${element.Name} ${
- element.Name !== equalizedName ? `(${equalizedName})` : ''
+ element.Name === equalizedName ? '' : `(${equalizedName})`
}`
);
}
diff --git a/lib/util/cli.js b/lib/util/cli.js
index ff620f728..2cb508c68 100644
--- a/lib/util/cli.js
+++ b/lib/util/cli.js
@@ -37,10 +37,7 @@ const Cli = {
*/
async addExtraCredential(properties) {
const skipInteraction = Util.skipInteraction;
- if (!(await config.checkProperties(properties))) {
- // return null here to avoid seeing 2 error messages for the same issue
- return null;
- } else {
+ if (await config.checkProperties(properties)) {
this.logExistingCredentials(properties);
Util.logger.info('\nPlease enter your new credentials');
if (skipInteraction && properties.credentials[skipInteraction.credentialName]) {
@@ -50,6 +47,9 @@ const Cli = {
return null;
}
return this._setCredential(properties, null);
+ } else {
+ // return null here to avoid seeing 2 error messages for the same issue
+ return null;
}
},
/**
@@ -357,11 +357,11 @@ const Cli = {
validate: (value) => {
if (!value || value.trim().length < 10) {
return 'Please enter a valid tenant identifier';
- } else if (!tenantRegex.test(value.trim())) {
- return `Please copy the URI directly from the installed package's "API Integration" section. It looks like this: https://a1b2b3xy56z.auth.marketingcloudapis.com/`;
- } else {
+ } else if (tenantRegex.test(value.trim())) {
// all good
return true;
+ } else {
+ return `Please copy the URI directly from the installed package's "API Integration" section. It looks like this: https://a1b2b3xy56z.auth.marketingcloudapis.com/`;
}
},
},
@@ -393,15 +393,19 @@ const Cli = {
*/
async selectTypes(properties, setTypesArr) {
let responses;
- if (!setTypesArr) {
- if (Util.logger.level !== 'debug') {
- Util.logger.info(
- 'Run mcdev selectTypes --debug if you need to use "disabled" types.'
- );
- } else {
+ if (setTypesArr) {
+ responses = {
+ selectedTypes: setTypesArr,
+ };
+ } else {
+ if (Util.logger.level === 'debug') {
Util.logger.warn(
'Debug mode enabled. Allowing selection of "disabled" types. Please be aware that these might be unstable.'
);
+ } else {
+ Util.logger.info(
+ 'Run mcdev selectTypes --debug if you need to use "disabled" types.'
+ );
}
const flattenedDefinitions = [];
for (const el in MetadataDefinitions) {
@@ -436,9 +440,8 @@ const Cli = {
? ' \x1B[1;30;40m(non-default)\u001B[0m'
: ''),
value: def.type,
- disabled: !(Util.logger.level === 'debug' || def.typeRetrieveByDefault)
- ? 'disabled'
- : false,
+ disabled:
+ Util.logger.level === 'debug' || def.typeRetrieveByDefault ? false : 'disabled',
// subtypes can be activated through their main type
checked:
properties.metaDataTypes.retrieve.includes(def.type) ||
@@ -475,10 +478,6 @@ const Cli = {
choices: typeChoices,
},
]);
- } else {
- responses = {
- selectedTypes: setTypesArr,
- };
}
if (responses.selectedTypes) {
diff --git a/lib/util/config.js b/lib/util/config.js
index 6f0f2afa5..de2bda103 100644
--- a/lib/util/config.js
+++ b/lib/util/config.js
@@ -128,17 +128,9 @@ const config = {
const missingFields = [];
for (const key in defaultProps) {
if (Object.prototype.hasOwnProperty.call(defaultProps, key)) {
- if (!Object.prototype.hasOwnProperty.call(properties, key)) {
- errorMsgs.push(`${key}{} missing`);
- solutionSet.add(
- `Run 'mcdev upgrade' to fix missing or changed configuration options`
- );
- missingFields.push(key);
- } else {
+ if (Object.prototype.hasOwnProperty.call(properties, key)) {
if (!silent && key === 'credentials') {
- if (!Object.keys(properties.credentials)) {
- errorMsgs.push(`no Credential defined`);
- } else {
+ if (Object.keys(properties.credentials)) {
for (const cred in properties.credentials) {
if (cred.includes('/') || cred.includes('\\')) {
errorMsgs.push(
@@ -176,6 +168,8 @@ const config = {
solutionSet.add(`Run 'mcdev reloadBUs ${cred}'`);
}
}
+ } else {
+ errorMsgs.push(`no Credential defined`);
}
} else if (['directories', 'metaDataTypes', 'options'].includes(key)) {
for (const subkey in defaultProps[key]) {
@@ -222,6 +216,12 @@ const config = {
}
}
}
+ } else {
+ errorMsgs.push(`${key}{} missing`);
+ solutionSet.add(
+ `Run 'mcdev upgrade' to fix missing or changed configuration options`
+ );
+ missingFields.push(key);
}
}
}
diff --git a/lib/util/devops.js b/lib/util/devops.js
index d721aea52..4907e1df9 100644
--- a/lib/util/devops.js
+++ b/lib/util/devops.js
@@ -113,13 +113,13 @@ const DevOps = {
.filter((file) => filterPaths.some((path) => file.file.startsWith(path)))
// ensure badly named files on unsupported metadata types are not in our subset
.filter((/** @type {TYPE.DeltaPkgItem} */ file) => {
- if (!MetadataType[file.type]) {
+ if (MetadataType[file.type]) {
+ return true;
+ } else {
Util.logger.debug(
`Unknown metadata-type found for (${file.file}): ` + file.type
);
return false;
- } else {
- return true;
}
})
.map((/** @type {TYPE.DeltaPkgItem} */ file) => {
@@ -182,7 +182,7 @@ const DevOps = {
) {
Util.logger.warn(
`- ❌ No changes found. Check what branch you are currently on and if the target branch name (${rangeUserInput}${
- range !== rangeUserInput ? ' converted to ' + range : ''
+ range === rangeUserInput ? '' : ' converted to ' + range
}) was correct`
);
return [];
diff --git a/lib/util/init.config.js b/lib/util/init.config.js
index 86251ea10..4f0ffdd02 100644
--- a/lib/util/init.config.js
+++ b/lib/util/init.config.js
@@ -78,10 +78,10 @@ const Init = {
break;
}
case 'metaDataTypes.documentOnRetrieve': {
- if (!properties.options.documentOnRetrieve) {
- properties.metaDataTypes.documentOnRetrieve = [];
- } else {
+ if (properties.options.documentOnRetrieve) {
this._updateLeaf(properties, defaultProps, fieldName);
+ } else {
+ properties.metaDataTypes.documentOnRetrieve = [];
}
delete properties.options.documentOnRetrieve;
upgradeMsgs.push(
@@ -217,10 +217,7 @@ const Init = {
Util.boilerplateDirectory,
'gitignore-template'
);
- if (!(await File.pathExists(gitignoreFileName))) {
- Util.logger.debug(`Dependency file not found in ${gitignoreFileName}`);
- return false;
- } else {
+ if (await File.pathExists(gitignoreFileName)) {
const fileContent = await File.readFile(gitignoreFileName, 'utf8');
creationLog.push(
await this._createIdeConfigFile(
@@ -229,6 +226,9 @@ const Init = {
fileContent
)
);
+ } else {
+ Util.logger.debug(`Dependency file not found in ${gitignoreFileName}`);
+ return false;
}
// load file list from boilerplate dir and initiate copy process
diff --git a/lib/util/init.git.js b/lib/util/init.git.js
index 2ee5caf47..e91de4b58 100644
--- a/lib/util/init.git.js
+++ b/lib/util/init.git.js
@@ -156,21 +156,22 @@ const Init = {
return 'Please enter a valid remote URL';
} else if (!value.startsWith('http') && !value.startsWith('ssh')) {
return `Your Git Remote URL should start with 'http' or 'ssh'`;
- } else if (!value.endsWith('.git')) {
- return `Your Git Remote URL should end with '.git'`;
- } else {
+ } else if (value.endsWith('.git')) {
// all good
return true;
+ } else {
+ return `Your Git Remote URL should end with '.git'`;
}
},
},
]);
}
/* eslint-enable unicorn/prefer-ternary */
-
- responses.gitRemoteUrl = responses.gitRemoteUrl.trim();
- Util.execSync('git', ['remote', 'add', 'origin', responses.gitRemoteUrl]);
- return responses.gitRemoteUrl.split('/').pop().split('.')[0];
+ if (typeof responses.gitRemoteUrl === 'string') {
+ responses.gitRemoteUrl = responses.gitRemoteUrl.trim();
+ Util.execSync('git', ['remote', 'add', 'origin', responses.gitRemoteUrl]);
+ return responses.gitRemoteUrl.split('/').pop().split('.')[0];
+ }
}
},
/**
@@ -251,23 +252,10 @@ const Init = {
* @returns {Promise.<{'user.name': string, 'user.email': string}>} user.name and user.email
*/
async _getGitConfigUser() {
- const gitConfigs = await git.listConfig();
- // remove local config
- delete gitConfigs.values['.git/config'];
- const result = {};
+ const names = await git.getConfig('user.name');
+ const emails = await git.getConfig('user.email');
- for (const file of Object.keys(gitConfigs.values)) {
- if (gitConfigs.values[file]['user.name']) {
- result['user.name'] = gitConfigs.values[file]['user.name'];
- }
- if (gitConfigs.values[file]['user.email']) {
- result['user.email'] = gitConfigs.values[file]['user.email'];
- }
- }
- if (!result['user.name'] || !result['user.email']) {
- return null;
- }
- return result;
+ return { 'user.name': names.value || '', 'user.email': emails.value || '' };
},
};
diff --git a/lib/util/init.js b/lib/util/init.js
index 26ab0c8b4..368c8b3b5 100644
--- a/lib/util/init.js
+++ b/lib/util/init.js
@@ -161,6 +161,9 @@ const Init = {
return;
}
+ // set up markets and market lists initially
+ await Init._initMarkets();
+
// create first commit to backup the project configuration
if (initGit.status === 'init') {
Util.logger.info(`Committing initial setup to Git:`);
@@ -182,6 +185,67 @@ const Init = {
);
}
},
+
+ /**
+ * helper for @initProject that optionally creates markets and market lists for all BUs
+ */
+ async _initMarkets() {
+ const skipInteraction = Util.skipInteraction;
+ const properties = await config.getProperties(true);
+
+ // get list of business units
+ const firstCredentialName = Object.keys(properties.credentials)[0];
+ const businessUnits = Object.keys(
+ properties.credentials[firstCredentialName].businessUnits
+ );
+
+ // set up empty markets for them
+ const markets = {};
+ for (const bu of businessUnits) {
+ markets[bu] = { suffix: '_' + bu };
+ }
+ properties.markets = markets;
+
+ let sourceBuName;
+ // set up default deployment market lists
+ if (skipInteraction) {
+ // don't ask, list all BUs in deployment-target and set deployment-source to ???
+ if (!businessUnits.includes(skipInteraction.developmentBu)) {
+ Util.logger.warn(
+ `Could not find developmentBu=${skipInteraction.developmentBu} in business units. Skipping.`
+ );
+ delete skipInteraction.developmentBu;
+ }
+ sourceBuName = skipInteraction.developmentBu || '???';
+ if (!skipInteraction.developmentBu) {
+ Util.logger.info(
+ 'Market List "deployment-source" will need to be set up manually. Marking all BUs as target BUs in "deployment-target".'
+ );
+ }
+ } else {
+ const responses = await inquirer.prompt([
+ {
+ type: 'list',
+ name: 'developmentBu',
+ message: 'Please select your development business unit:',
+ choices: businessUnits.map((bu) => ({ name: bu, value: bu })),
+ },
+ ]);
+ sourceBuName = responses.developmentBu;
+ }
+ // set source list
+ properties.marketList['deployment-source'][firstCredentialName + '/' + sourceBuName] =
+ sourceBuName;
+
+ // set target list
+ for (const bu of businessUnits) {
+ // filter out source BU & parent BU to ensure they dont get deployed to automatically
+ if (bu !== sourceBuName && bu !== '_ParentBU_') {
+ properties.marketList['deployment-target'][firstCredentialName + '/' + bu] = bu;
+ }
+ }
+ await File.saveConfigFile(properties);
+ },
/**
* helper for {@link Init.initProject}
*
diff --git a/lib/util/util.js b/lib/util/util.js
index 394ab55fe..478460f5e 100644
--- a/lib/util/util.js
+++ b/lib/util/util.js
@@ -87,10 +87,7 @@ const Util = {
* @returns {void} throws errors if problems were found
*/
verifyMarketList(mlName, properties) {
- if (!properties.marketList[mlName]) {
- // ML does not exist
- throw new Error(`Market List ${mlName} is not defined`);
- } else {
+ if (properties.marketList[mlName]) {
// ML exists, check if it is properly set up
// check if BUs in marketList are valid
@@ -111,10 +108,10 @@ const Util = {
marketArr = [marketArr];
}
for (const market of marketArr) {
- if (!properties.markets[market]) {
- throw new Error(`Market '${market}' is not defined.`);
- } else {
+ if (properties.markets[market]) {
// * markets can be empty or include variables. Nothing we can test here
+ } else {
+ throw new Error(`Market '${market}' is not defined.`);
}
}
}
@@ -122,6 +119,9 @@ const Util = {
if (!buCounter) {
throw new Error(`No BUs defined in marketList ${mlName}`);
}
+ } else {
+ // ML does not exist
+ throw new Error(`Market List ${mlName} is not defined`);
}
},
/**
@@ -355,16 +355,24 @@ const Util = {
* @param {string} cmd to be executed command
* @param {string[]} [args] list of arguments
* @param {boolean} [hideOutput] if true, output of command will be hidden from CLI
- * @returns {undefined}
+ * @returns {string} output of command if hideOutput is true
*/
execSync(cmd, args, hideOutput) {
args = args || [];
Util.logger.info('⚡ ' + cmd + ' ' + args.join(' '));
- // the following options ensure the user sees the same output and
- // interaction options as if the command was manually run
- const options = hideOutput ? {} : { stdio: [0, 1, 2] };
- return child_process.execSync(cmd + ' ' + args.join(' '), options);
+ if (hideOutput) {
+ // no output displayed to user but instead returned to parsed elsewhere
+ return child_process
+ .execSync(cmd + ' ' + args.join(' '))
+ .toString()
+ .trim();
+ } else {
+ // the following options ensure the user sees the same output and
+ // interaction options as if the command was manually run
+ child_process.execSync(cmd + ' ' + args.join(' '), { stdio: [0, 1, 2] });
+ return null;
+ }
},
/**
* standardize check to ensure only one result is returned from template search
diff --git a/package-lock.json b/package-lock.json
index c64643ac8..a9f9efff3 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,29 +1,30 @@
{
"name": "mcdev",
- "version": "4.1.12",
+ "version": "4.2.0",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "mcdev",
- "version": "4.1.12",
+ "version": "4.2.0",
"license": "MIT",
"dependencies": {
+ "beauty-amp-core": "0.3.7",
"cli-progress": "3.11.2",
"command-exists": "1.2.9",
"conf": "10.2.0",
"console.table": "0.10.0",
- "deep-equal": "2.0.5",
- "fs-extra": "10.1.0",
+ "deep-equal": "2.1.0",
+ "fs-extra": "11.1.0",
"inquirer": "8.2.2",
"json-to-table": "4.2.1",
"mustache": "4.2.0",
"p-limit": "3.1.0",
- "prettier": "2.7.1",
+ "prettier": "2.8.0",
"prettier-plugin-sql": "0.12.1",
"semver": "7.3.8",
"sfmc-sdk": "0.6.1",
- "simple-git": "3.14.1",
+ "simple-git": "3.15.1",
"toposort": "2.0.2",
"update-notifier": "5.1.0",
"winston": "3.8.2",
@@ -35,21 +36,23 @@
"devDependencies": {
"assert": "2.0.0",
"axios-mock-adapter": "1.21.2",
- "chai": "4.3.6",
- "eslint": "8.27.0",
+ "chai": "4.3.7",
+ "chai-files": "1.4.0",
+ "eslint": "8.29.0",
"eslint-config-prettier": "8.5.0",
"eslint-config-ssjs": "1.1.11",
- "eslint-plugin-jsdoc": "39.6.2",
+ "eslint-plugin-jsdoc": "39.6.4",
"eslint-plugin-mocha": "10.1.0",
"eslint-plugin-prettier": "4.2.1",
- "eslint-plugin-unicorn": "44.0.2",
+ "eslint-plugin-unicorn": "45.0.1",
"husky": "8.0.1",
- "jsdoc-to-markdown": "7.1.1",
- "lint-staged": "13.0.3",
+ "jsdoc-to-markdown": "8.0.0",
+ "lint-staged": "13.1.0",
"mocha": "10.1.0",
"mock-fs": "5.2.0",
"npm-check": "6.0.1",
"npm-run-all": "4.1.5",
+ "nyc": "15.1.0",
"prettier-eslint": "15.0.1"
},
"engines": {
@@ -63,6 +66,32 @@
"fsevents": "*"
}
},
+ "node_modules/@ampproject/remapping": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz",
+ "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.1.0",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@ampproject/remapping/node_modules/@jridgewell/gen-mapping": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz",
+ "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/set-array": "^1.0.0",
+ "@jridgewell/sourcemap-codec": "^1.4.10"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
"node_modules/@babel/code-frame": {
"version": "7.18.6",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz",
@@ -75,13 +104,61 @@
"node": ">=6.9.0"
}
},
+ "node_modules/@babel/compat-data": {
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.5.tgz",
+ "integrity": "sha512-KZXo2t10+/jxmkhNXc7pZTqRvSOIvVv/+lJwHS+B2rErwOyjuVRh60yVpb7liQ1U5t7lLJ1bz+t8tSypUZdm0g==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/core": {
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.5.tgz",
+ "integrity": "sha512-UdOWmk4pNWTm/4DlPUl/Pt4Gz4rcEMb7CY0Y3eJl5Yz1vI8ZJGmHWaVE55LoxRjdpx0z259GE9U5STA9atUinQ==",
+ "dev": true,
+ "dependencies": {
+ "@ampproject/remapping": "^2.1.0",
+ "@babel/code-frame": "^7.18.6",
+ "@babel/generator": "^7.20.5",
+ "@babel/helper-compilation-targets": "^7.20.0",
+ "@babel/helper-module-transforms": "^7.20.2",
+ "@babel/helpers": "^7.20.5",
+ "@babel/parser": "^7.20.5",
+ "@babel/template": "^7.18.10",
+ "@babel/traverse": "^7.20.5",
+ "@babel/types": "^7.20.5",
+ "convert-source-map": "^1.7.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.1",
+ "semver": "^6.3.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
+ }
+ },
+ "node_modules/@babel/core/node_modules/semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
"node_modules/@babel/generator": {
- "version": "7.18.9",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.9.tgz",
- "integrity": "sha512-wt5Naw6lJrL1/SGkipMiFxJjtyczUWTP38deiP1PO60HsBjDeKk08CGC3S8iVuvf0FmTdgKwU1KIXzSKL1G0Ug==",
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.5.tgz",
+ "integrity": "sha512-jl7JY2Ykn9S0yj4DQP82sYvPU+T3g0HFcWTqDLqiuA9tGRNIj9VfbtXGAYTTkyNEnQk1jkMGOdYka8aG/lulCA==",
"dev": true,
"dependencies": {
- "@babel/types": "^7.18.9",
+ "@babel/types": "^7.20.5",
"@jridgewell/gen-mapping": "^0.3.2",
"jsesc": "^2.5.1"
},
@@ -89,6 +166,33 @@
"node": ">=6.9.0"
}
},
+ "node_modules/@babel/helper-compilation-targets": {
+ "version": "7.20.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz",
+ "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/compat-data": "^7.20.0",
+ "@babel/helper-validator-option": "^7.18.6",
+ "browserslist": "^4.21.3",
+ "semver": "^6.3.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets/node_modules/semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
"node_modules/@babel/helper-environment-visitor": {
"version": "7.18.9",
"resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz",
@@ -99,13 +203,13 @@
}
},
"node_modules/@babel/helper-function-name": {
- "version": "7.18.9",
- "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz",
- "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==",
+ "version": "7.19.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz",
+ "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==",
"dev": true,
"dependencies": {
- "@babel/template": "^7.18.6",
- "@babel/types": "^7.18.9"
+ "@babel/template": "^7.18.10",
+ "@babel/types": "^7.19.0"
},
"engines": {
"node": ">=6.9.0"
@@ -123,6 +227,49 @@
"node": ">=6.9.0"
}
},
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz",
+ "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.20.2",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz",
+ "integrity": "sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-environment-visitor": "^7.18.9",
+ "@babel/helper-module-imports": "^7.18.6",
+ "@babel/helper-simple-access": "^7.20.2",
+ "@babel/helper-split-export-declaration": "^7.18.6",
+ "@babel/helper-validator-identifier": "^7.19.1",
+ "@babel/template": "^7.18.10",
+ "@babel/traverse": "^7.20.1",
+ "@babel/types": "^7.20.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-simple-access": {
+ "version": "7.20.2",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz",
+ "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.20.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
"node_modules/@babel/helper-split-export-declaration": {
"version": "7.18.6",
"resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz",
@@ -135,6 +282,15 @@
"node": ">=6.9.0"
}
},
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.19.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz",
+ "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
"node_modules/@babel/helper-validator-identifier": {
"version": "7.19.1",
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz",
@@ -144,6 +300,29 @@
"node": ">=6.9.0"
}
},
+ "node_modules/@babel/helper-validator-option": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz",
+ "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helpers": {
+ "version": "7.20.6",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.6.tgz",
+ "integrity": "sha512-Pf/OjgfgFRW5bApskEz5pvidpim7tEDPlFtKcNRXWmfHGn9IEI2W2flqRQXTFb7gIPTyK++N6rVHuwKut4XK6w==",
+ "dev": true,
+ "dependencies": {
+ "@babel/template": "^7.18.10",
+ "@babel/traverse": "^7.20.5",
+ "@babel/types": "^7.20.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
"node_modules/@babel/highlight": {
"version": "7.18.6",
"resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz",
@@ -230,9 +409,9 @@
}
},
"node_modules/@babel/parser": {
- "version": "7.18.9",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.9.tgz",
- "integrity": "sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg==",
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.5.tgz",
+ "integrity": "sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA==",
"dev": true,
"bin": {
"parser": "bin/babel-parser.js"
@@ -242,33 +421,33 @@
}
},
"node_modules/@babel/template": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz",
- "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==",
+ "version": "7.18.10",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz",
+ "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==",
"dev": true,
"dependencies": {
"@babel/code-frame": "^7.18.6",
- "@babel/parser": "^7.18.6",
- "@babel/types": "^7.18.6"
+ "@babel/parser": "^7.18.10",
+ "@babel/types": "^7.18.10"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/traverse": {
- "version": "7.18.9",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.9.tgz",
- "integrity": "sha512-LcPAnujXGwBgv3/WHv01pHtb2tihcyW1XuL9wd7jqh1Z8AQkTd+QVjMrMijrln0T7ED3UXLIy36P9Ao7W75rYg==",
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.5.tgz",
+ "integrity": "sha512-WM5ZNN3JITQIq9tFZaw1ojLU3WgWdtkxnhM1AegMS+PvHjkM5IXjmYEGY7yukz5XS4sJyEf2VzWjI8uAavhxBQ==",
"dev": true,
"dependencies": {
"@babel/code-frame": "^7.18.6",
- "@babel/generator": "^7.18.9",
+ "@babel/generator": "^7.20.5",
"@babel/helper-environment-visitor": "^7.18.9",
- "@babel/helper-function-name": "^7.18.9",
+ "@babel/helper-function-name": "^7.19.0",
"@babel/helper-hoist-variables": "^7.18.6",
"@babel/helper-split-export-declaration": "^7.18.6",
- "@babel/parser": "^7.18.9",
- "@babel/types": "^7.18.9",
+ "@babel/parser": "^7.20.5",
+ "@babel/types": "^7.20.5",
"debug": "^4.1.0",
"globals": "^11.1.0"
},
@@ -286,12 +465,13 @@
}
},
"node_modules/@babel/types": {
- "version": "7.18.9",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.9.tgz",
- "integrity": "sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==",
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.5.tgz",
+ "integrity": "sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==",
"dev": true,
"dependencies": {
- "@babel/helper-validator-identifier": "^7.18.6",
+ "@babel/helper-string-parser": "^7.19.4",
+ "@babel/helper-validator-identifier": "^7.19.1",
"to-fast-properties": "^2.0.0"
},
"engines": {
@@ -326,9 +506,9 @@
}
},
"node_modules/@es-joy/jsdoccomment": {
- "version": "0.36.0",
- "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.36.0.tgz",
- "integrity": "sha512-u0XZyvUF6Urb2cSivSXA8qXIpT/CxkHcdtZKoWusAzgzmsTWpg0F2FpWXsolHmMUyVY3dLWaoy+0ccJ5uf2QjA==",
+ "version": "0.36.1",
+ "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.36.1.tgz",
+ "integrity": "sha512-922xqFsTpHs6D0BUiG4toiyPOMc8/jafnWKxz1KWgS4XzKPy2qXf1Pe6UFuNSCQqt6tOuhAWXBNuuyUhJmw9Vg==",
"dev": true,
"dependencies": {
"comment-parser": "1.3.1",
@@ -339,6 +519,21 @@
"node": "^14 || ^16 || ^17 || ^18 || ^19"
}
},
+ "node_modules/@eslint-community/eslint-utils": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.1.2.tgz",
+ "integrity": "sha512-7qELuQWWjVDdVsFQ5+beUl+KPczrEDA7S3zM4QUd/bJl7oXgsmpXaEVqrRTnOBqenOV4rWf2kVZk2Ot085zPWA==",
+ "dev": true,
+ "dependencies": {
+ "eslint-visitor-keys": "^3.3.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
"node_modules/@eslint/eslintrc": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz",
@@ -417,6 +612,123 @@
"integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
"dev": true
},
+ "node_modules/@istanbuljs/load-nyc-config": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
+ "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==",
+ "dev": true,
+ "dependencies": {
+ "camelcase": "^5.3.1",
+ "find-up": "^4.1.0",
+ "get-package-type": "^0.1.0",
+ "js-yaml": "^3.13.1",
+ "resolve-from": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "dependencies": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": {
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@istanbuljs/schema": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
+ "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/@jridgewell/gen-mapping": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
@@ -465,6 +777,18 @@
"@jridgewell/sourcemap-codec": "^1.4.10"
}
},
+ "node_modules/@jsdoc/salty": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/@jsdoc/salty/-/salty-0.2.1.tgz",
+ "integrity": "sha512-JXwylDNSHa549N9uceDYu8D4GMXwSo3H8CCPYEQqxhhHpxD28+lRl2b3bS/caaPj5w1YD3SWtrficJNTnUjGpg==",
+ "dev": true,
+ "dependencies": {
+ "lodash": "^4.17.21"
+ },
+ "engines": {
+ "node": ">=v12.0.0"
+ }
+ },
"node_modules/@kwsites/file-exists": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz",
@@ -956,6 +1280,24 @@
"node": ">= 8"
}
},
+ "node_modules/append-transform": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz",
+ "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==",
+ "dev": true,
+ "dependencies": {
+ "default-require-extensions": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/archy": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz",
+ "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==",
+ "dev": true
+ },
"node_modules/argparse": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
@@ -1103,6 +1445,11 @@
}
]
},
+ "node_modules/beauty-amp-core": {
+ "version": "0.3.7",
+ "resolved": "https://registry.npmjs.org/beauty-amp-core/-/beauty-amp-core-0.3.7.tgz",
+ "integrity": "sha512-/a3jRMN0IZ4SaV8PoVLqprk0sSEXvTOOVs4jdSQhgNBJYRkHau0PhUwju6PzfNvQpleZXWdechrPQAVAxIKnHA=="
+ },
"node_modules/big-integer": {
"version": "1.6.51",
"resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz",
@@ -1185,6 +1532,34 @@
"integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
"dev": true
},
+ "node_modules/browserslist": {
+ "version": "4.21.4",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz",
+ "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ }
+ ],
+ "dependencies": {
+ "caniuse-lite": "^1.0.30001400",
+ "electron-to-chromium": "^1.4.251",
+ "node-releases": "^2.0.6",
+ "update-browserslist-db": "^1.0.9"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
"node_modules/buffer": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
@@ -1282,6 +1657,21 @@
"node": ">=8"
}
},
+ "node_modules/caching-transform": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz",
+ "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==",
+ "dev": true,
+ "dependencies": {
+ "hasha": "^5.0.0",
+ "make-dir": "^3.0.0",
+ "package-hash": "^4.0.0",
+ "write-file-atomic": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/call-bind": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
@@ -1436,6 +1826,22 @@
"node": ">=6"
}
},
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001439",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001439.tgz",
+ "integrity": "sha512-1MgUzEkoMO6gKfXflStpYgZDlFM7M/ck/bgfVCACO5vnAf0fXoNVHdWtqGU+MYca+4bL9Z5bpOVmR33cWW9G2A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ }
+ ]
+ },
"node_modules/catharsis": {
"version": "0.9.0",
"resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.9.0.tgz",
@@ -1449,14 +1855,14 @@
}
},
"node_modules/chai": {
- "version": "4.3.6",
- "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz",
- "integrity": "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==",
+ "version": "4.3.7",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz",
+ "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==",
"dev": true,
"dependencies": {
"assertion-error": "^1.1.0",
"check-error": "^1.0.2",
- "deep-eql": "^3.0.1",
+ "deep-eql": "^4.1.2",
"get-func-name": "^2.0.0",
"loupe": "^2.3.1",
"pathval": "^1.1.1",
@@ -1466,6 +1872,15 @@
"node": ">=4"
}
},
+ "node_modules/chai-files": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/chai-files/-/chai-files-1.4.0.tgz",
+ "integrity": "sha512-tPTx7H2kpR+wILWHRx8RxpXcRUdc2uH8su505C9R3p5GA+eYbZBXuxWC0RZbyElYi7X7Fp/V/S2PQjkakrT1mQ==",
+ "dev": true,
+ "dependencies": {
+ "assertion-error": "^1.0.1"
+ }
+ },
"node_modules/chalk": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
@@ -1907,9 +2322,9 @@
}
},
"node_modules/commander": {
- "version": "9.3.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-9.3.0.tgz",
- "integrity": "sha512-hv95iU5uXPbK83mjrJKuZyFM/LBAoCV/XhVGkS5Je6tl7sxr6A0ITMw5WoRV46/UaJ46Nllm3Xt7IaJhXTIkzw==",
+ "version": "9.4.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.1.tgz",
+ "integrity": "sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==",
"dev": true,
"engines": {
"node": "^12.20.0 || >=14"
@@ -1942,6 +2357,12 @@
"node": ">=4.0.0"
}
},
+ "node_modules/commondir": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
+ "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==",
+ "dev": true
+ },
"node_modules/concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@@ -2027,6 +2448,12 @@
"node": "> 0.10"
}
},
+ "node_modules/convert-source-map": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
+ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
+ "dev": true
+ },
"node_modules/cosmiconfig": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz",
@@ -2174,37 +2601,37 @@
}
},
"node_modules/deep-eql": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz",
- "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==",
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.2.tgz",
+ "integrity": "sha512-gT18+YW4CcW/DBNTwAmqTtkJh7f9qqScu2qFVlx7kCoeY9tlBu9cUcr7+I+Z/noG8INehS3xQgLpTtd/QUTn4w==",
"dev": true,
"dependencies": {
"type-detect": "^4.0.0"
},
"engines": {
- "node": ">=0.12"
+ "node": ">=6"
}
},
"node_modules/deep-equal": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.0.5.tgz",
- "integrity": "sha512-nPiRgmbAtm1a3JsnLCf6/SLfXcjyN5v8L1TXzdCmHrXJ4hx+gW/w1YCcn7z8gJtSiDArZCgYtbao3QqLm/N1Sw==",
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.1.0.tgz",
+ "integrity": "sha512-2pxgvWu3Alv1PoWEyVg7HS8YhGlUFUV7N5oOvfL6d+7xAmLSemMwv/c8Zv/i9KFzxV5Kt5CAvQc70fLwVuf4UA==",
"dependencies": {
- "call-bind": "^1.0.0",
- "es-get-iterator": "^1.1.1",
- "get-intrinsic": "^1.0.1",
- "is-arguments": "^1.0.4",
- "is-date-object": "^1.0.2",
- "is-regex": "^1.1.1",
+ "call-bind": "^1.0.2",
+ "es-get-iterator": "^1.1.2",
+ "get-intrinsic": "^1.1.3",
+ "is-arguments": "^1.1.1",
+ "is-date-object": "^1.0.5",
+ "is-regex": "^1.1.4",
"isarray": "^2.0.5",
- "object-is": "^1.1.4",
+ "object-is": "^1.1.5",
"object-keys": "^1.1.1",
- "object.assign": "^4.1.2",
- "regexp.prototype.flags": "^1.3.0",
- "side-channel": "^1.0.3",
- "which-boxed-primitive": "^1.0.1",
+ "object.assign": "^4.1.4",
+ "regexp.prototype.flags": "^1.4.3",
+ "side-channel": "^1.0.4",
+ "which-boxed-primitive": "^1.0.2",
"which-collection": "^1.0.1",
- "which-typed-array": "^1.1.2"
+ "which-typed-array": "^1.1.8"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -2224,6 +2651,30 @@
"integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
"dev": true
},
+ "node_modules/default-require-extensions": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz",
+ "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==",
+ "dev": true,
+ "dependencies": {
+ "strip-bom": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/default-require-extensions/node_modules/strip-bom": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
+ "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/defaults": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz",
@@ -2406,9 +2857,9 @@
"dev": true
},
"node_modules/dmd": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/dmd/-/dmd-6.1.0.tgz",
- "integrity": "sha512-0zQIJ873gay1scCTFZvHPWM9mVJBnaylB2NQDI8O9u8O32m00Jb6uxDKexZm8hjTRM7RiWe0FJ32pExHoXdwoQ==",
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/dmd/-/dmd-6.2.0.tgz",
+ "integrity": "sha512-uXWxLF1H7TkUAuoHK59/h/ts5cKavm2LnhrIgJWisip4BVzPoXavlwyoprFFn2CzcahKYgvkfaebS6oxzgflkg==",
"dev": true,
"dependencies": {
"array-back": "^6.2.2",
@@ -2416,7 +2867,7 @@
"common-sequence": "^2.0.2",
"file-set": "^4.0.2",
"handlebars": "^4.7.7",
- "marked": "^4.0.12",
+ "marked": "^4.2.3",
"object-get": "^2.1.1",
"reduce-flatten": "^3.0.1",
"reduce-unique": "^2.0.1",
@@ -2473,6 +2924,12 @@
"wcwidth": ">=1.0.1"
}
},
+ "node_modules/electron-to-chromium": {
+ "version": "1.4.284",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz",
+ "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==",
+ "dev": true
+ },
"node_modules/emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
@@ -2491,20 +2948,6 @@
"once": "^1.4.0"
}
},
- "node_modules/enquirer": {
- "version": "2.3.6",
- "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
- "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
- "dev": true,
- "optional": true,
- "peer": true,
- "dependencies": {
- "ansi-colors": "^4.1.1"
- },
- "engines": {
- "node": ">=8.6"
- }
- },
"node_modules/entities": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz",
@@ -2544,6 +2987,7 @@
"version": "1.19.5",
"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.5.tgz",
"integrity": "sha512-Aa2G2+Rd3b6kxEUKTF4TaW67czBLyAv3z7VOhYRU50YBx+bbsYZ9xQP4lMNazePuFlybXI0V4MruPos7qUo5fA==",
+ "dev": true,
"dependencies": {
"call-bind": "^1.0.2",
"es-to-primitive": "^1.2.1",
@@ -2595,6 +3039,7 @@
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
"integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+ "dev": true,
"dependencies": {
"is-callable": "^1.1.4",
"is-date-object": "^1.0.1",
@@ -2607,6 +3052,12 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/es6-error": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz",
+ "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==",
+ "dev": true
+ },
"node_modules/es6-object-assign": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz",
@@ -2642,9 +3093,9 @@
}
},
"node_modules/eslint": {
- "version": "8.27.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.27.0.tgz",
- "integrity": "sha512-0y1bfG2ho7mty+SiILVf9PfuRA49ek4Nc60Wmmu62QlobNR+CeXa4xXIJgcuwSQgZiWaPH+5BDsctpIW0PR/wQ==",
+ "version": "8.29.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.29.0.tgz",
+ "integrity": "sha512-isQ4EEiyUjZFbEKvEGJKKGBwXtvXX+zJbkVKCgTuB9t/+jUBcy8avhkEwWJecI15BkRkOYmvIM5ynbhRjEkoeg==",
"dev": true,
"dependencies": {
"@eslint/eslintrc": "^1.3.3",
@@ -2725,12 +3176,12 @@
}
},
"node_modules/eslint-plugin-jsdoc": {
- "version": "39.6.2",
- "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-39.6.2.tgz",
- "integrity": "sha512-dvgY/W7eUFoAIIiaWHERIMI61ZWqcz9YFjEeyTzdPlrZc3TY/3aZm5aB91NUoTLWYZmO/vFlYSuQi15tF7uE5A==",
+ "version": "39.6.4",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-39.6.4.tgz",
+ "integrity": "sha512-fskvdLCfwmPjHb6e+xNGDtGgbF8X7cDwMtVLAP2WwSf9Htrx68OAx31BESBM1FAwsN2HTQyYQq7m4aW4Q4Nlag==",
"dev": true,
"dependencies": {
- "@es-joy/jsdoccomment": "~0.36.0",
+ "@es-joy/jsdoccomment": "~0.36.1",
"comment-parser": "1.3.1",
"debug": "^4.3.4",
"escape-string-regexp": "^4.0.0",
@@ -2783,24 +3234,26 @@
}
},
"node_modules/eslint-plugin-unicorn": {
- "version": "44.0.2",
- "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-44.0.2.tgz",
- "integrity": "sha512-GLIDX1wmeEqpGaKcnMcqRvMVsoabeF0Ton0EX4Th5u6Kmf7RM9WBl705AXFEsns56ESkEs0uyelLuUTvz9Tr0w==",
+ "version": "45.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-45.0.1.tgz",
+ "integrity": "sha512-tLnIw5oDJJc3ILYtlKtqOxPP64FZLTkZkgeuoN6e7x6zw+rhBjOxyvq2c7577LGxXuIhBYrwisZuKNqOOHp3BA==",
"dev": true,
"dependencies": {
"@babel/helper-validator-identifier": "^7.19.1",
- "ci-info": "^3.4.0",
+ "@eslint-community/eslint-utils": "^4.1.0",
+ "ci-info": "^3.6.1",
"clean-regexp": "^1.0.0",
- "eslint-utils": "^3.0.0",
"esquery": "^1.4.0",
"indent-string": "^4.0.0",
"is-builtin-module": "^3.2.0",
+ "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",
"safe-regex": "^2.1.1",
- "semver": "^7.3.7",
+ "semver": "^7.3.8",
"strip-indent": "^3.0.0"
},
"engines": {
@@ -2810,14 +3263,29 @@
"url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1"
},
"peerDependencies": {
- "eslint": ">=8.23.1"
+ "eslint": ">=8.28.0"
}
},
"node_modules/eslint-plugin-unicorn/node_modules/ci-info": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.5.0.tgz",
- "integrity": "sha512-yH4RezKOGlOhxkmhbeNuC4eYZKAUsEaGtBuBzDDP1eFUKiccDWzBABxBfOx31IDwDIXMTxWuwAxUGModvkbuVw==",
- "dev": true
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.0.tgz",
+ "integrity": "sha512-2CpRNYmImPx+RXKLq6jko/L07phmS9I02TyqkcNU20GCF/GgaWvc58hPtjxDX8lPpkdwc9sNh72V9k00S7ezog==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/eslint-plugin-unicorn/node_modules/jsesc": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz",
+ "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==",
+ "dev": true,
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=6"
+ }
},
"node_modules/eslint-scope": {
"version": "7.1.1",
@@ -3191,6 +3659,87 @@
"node": ">=8"
}
},
+ "node_modules/find-cache-dir": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz",
+ "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==",
+ "dev": true,
+ "dependencies": {
+ "commondir": "^1.0.1",
+ "make-dir": "^3.0.2",
+ "pkg-dir": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/avajs/find-cache-dir?sponsor=1"
+ }
+ },
+ "node_modules/find-cache-dir/node_modules/find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/find-cache-dir/node_modules/locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/find-cache-dir/node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/find-cache-dir/node_modules/p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/find-cache-dir/node_modules/pkg-dir": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+ "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+ "dev": true,
+ "dependencies": {
+ "find-up": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/find-replace": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz",
@@ -3384,10 +3933,26 @@
}
}
},
- "node_modules/foreach": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz",
- "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k="
+ "node_modules/for-each": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
+ "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
+ "dependencies": {
+ "is-callable": "^1.1.3"
+ }
+ },
+ "node_modules/foreground-child": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz",
+ "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==",
+ "dev": true,
+ "dependencies": {
+ "cross-spawn": "^7.0.0",
+ "signal-exit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
},
"node_modules/form-data": {
"version": "4.0.0",
@@ -3402,23 +3967,43 @@
"node": ">= 6"
}
},
+ "node_modules/fromentries": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz",
+ "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
"node_modules/fs-extra": {
- "version": "10.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
- "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.0.tgz",
+ "integrity": "sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==",
"dependencies": {
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
},
"engines": {
- "node": ">=12"
+ "node": ">=14.14"
}
},
"node_modules/fs-then-native": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/fs-then-native/-/fs-then-native-2.0.0.tgz",
- "integrity": "sha1-GaEk2U2QwiyOBF8ujdbr6jbUjGc=",
+ "integrity": "sha512-X712jAOaWXkemQCAmWeg5rOT2i+KOpWz1Z/txk/cW0qlOu2oQ9H61vc5w3X/iyuUEfq/OyaFJ78/cZAQD1/bgA==",
"dev": true,
"engines": {
"node": ">=4.0.0"
@@ -3456,6 +4041,15 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
"node_modules/get-caller-file": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
@@ -3474,18 +4068,27 @@
}
},
"node_modules/get-intrinsic": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
- "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz",
+ "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==",
"dependencies": {
"function-bind": "^1.1.1",
"has": "^1.0.3",
- "has-symbols": "^1.0.1"
+ "has-symbols": "^1.0.3"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/get-package-type": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
+ "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
"node_modules/get-stream": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
@@ -3502,6 +4105,7 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
"integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
+ "dev": true,
"dependencies": {
"call-bind": "^1.0.2",
"get-intrinsic": "^1.1.1"
@@ -3649,6 +4253,17 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/gopd": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
+ "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
+ "dependencies": {
+ "get-intrinsic": "^1.1.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/got": {
"version": "9.6.0",
"resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz",
@@ -3814,6 +4429,31 @@
"node": ">=8"
}
},
+ "node_modules/hasha": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz",
+ "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==",
+ "dev": true,
+ "dependencies": {
+ "is-stream": "^2.0.0",
+ "type-fest": "^0.8.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/hasha/node_modules/type-fest": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
+ "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/he": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
@@ -3917,6 +4557,12 @@
"integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
"dev": true
},
+ "node_modules/html-escaper": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
+ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
+ "dev": true
+ },
"node_modules/http-cache-semantics": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
@@ -4080,6 +4726,7 @@
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz",
"integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==",
+ "dev": true,
"dependencies": {
"get-intrinsic": "^1.1.0",
"has": "^1.0.3",
@@ -4348,6 +4995,7 @@
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz",
"integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==",
+ "dev": true,
"engines": {
"node": ">= 0.4"
},
@@ -4441,6 +5089,7 @@
"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"
},
@@ -4488,14 +5137,14 @@
}
},
"node_modules/is-typed-array": {
- "version": "1.1.8",
- "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.8.tgz",
- "integrity": "sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA==",
+ "version": "1.1.10",
+ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz",
+ "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==",
"dependencies": {
"available-typed-arrays": "^1.0.5",
"call-bind": "^1.0.2",
- "es-abstract": "^1.18.5",
- "foreach": "^2.0.5",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
"has-tostringtag": "^1.0.0"
},
"engines": {
@@ -4533,6 +5182,7 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
"integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
+ "dev": true,
"dependencies": {
"call-bind": "^1.0.2"
},
@@ -4552,6 +5202,15 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/is-yarn-global": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz",
@@ -4568,6 +5227,121 @@
"integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
"dev": true
},
+ "node_modules/istanbul-lib-coverage": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz",
+ "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-hook": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz",
+ "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==",
+ "dev": true,
+ "dependencies": {
+ "append-transform": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-instrument": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz",
+ "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/core": "^7.7.5",
+ "@istanbuljs/schema": "^0.1.2",
+ "istanbul-lib-coverage": "^3.0.0",
+ "semver": "^6.3.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-instrument/node_modules/semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/istanbul-lib-processinfo": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz",
+ "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==",
+ "dev": true,
+ "dependencies": {
+ "archy": "^1.0.0",
+ "cross-spawn": "^7.0.3",
+ "istanbul-lib-coverage": "^3.2.0",
+ "p-map": "^3.0.0",
+ "rimraf": "^3.0.0",
+ "uuid": "^8.3.2"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-processinfo/node_modules/p-map": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz",
+ "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==",
+ "dev": true,
+ "dependencies": {
+ "aggregate-error": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-report": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
+ "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==",
+ "dev": true,
+ "dependencies": {
+ "istanbul-lib-coverage": "^3.0.0",
+ "make-dir": "^3.0.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-source-maps": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz",
+ "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^4.1.1",
+ "istanbul-lib-coverage": "^3.0.0",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/istanbul-reports": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz",
+ "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==",
+ "dev": true,
+ "dependencies": {
+ "html-escaper": "^2.0.0",
+ "istanbul-lib-report": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/js-sdsl": {
"version": "4.1.5",
"resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz",
@@ -4602,38 +5376,38 @@
}
},
"node_modules/jsdoc": {
- "version": "3.6.10",
- "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.6.10.tgz",
- "integrity": "sha512-IdQ8ppSo5LKZ9o3M+LKIIK8i00DIe5msDvG3G81Km+1dhy0XrOWD0Ji8H61ElgyEj/O9KRLokgKbAM9XX9CJAg==",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.0.tgz",
+ "integrity": "sha512-tzTgkklbWKrlaQL2+e3NNgLcZu3NaK2vsHRx7tyHQ+H5jcB9Gx0txSd2eJWlMC/xU1+7LQu4s58Ry0RkuaEQVg==",
"dev": true,
"dependencies": {
"@babel/parser": "^7.9.4",
+ "@jsdoc/salty": "^0.2.1",
"@types/markdown-it": "^12.2.3",
"bluebird": "^3.7.2",
"catharsis": "^0.9.0",
"escape-string-regexp": "^2.0.0",
"js2xmlparser": "^4.0.2",
- "klaw": "^4.0.1",
+ "klaw": "^3.0.0",
"markdown-it": "^12.3.2",
"markdown-it-anchor": "^8.4.1",
"marked": "^4.0.10",
"mkdirp": "^1.0.4",
"requizzle": "^0.2.3",
"strip-json-comments": "^3.1.0",
- "taffydb": "2.6.2",
"underscore": "~1.13.2"
},
"bin": {
"jsdoc": "jsdoc.js"
},
"engines": {
- "node": ">=8.15.0"
+ "node": ">=12.0.0"
}
},
"node_modules/jsdoc-api": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/jsdoc-api/-/jsdoc-api-7.1.1.tgz",
- "integrity": "sha512-0pkuPCzVXiqsDAsVrNFXCkHzlyNepBIDVtwwehry4RJAnZmXtlAz7rh8F9FRz53u3NeynGbex+bpYWwi8lE66A==",
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/jsdoc-api/-/jsdoc-api-8.0.0.tgz",
+ "integrity": "sha512-Rnhor0suB1Ds1abjmFkFfKeD+kSMRN9oHMTMZoJVUrmtCGDwXty+sWMA9sa4xbe4UyxuPjhC7tavZ40mDKK6QQ==",
"dev": true,
"dependencies": {
"array-back": "^6.2.2",
@@ -4641,7 +5415,7 @@
"collect-all": "^1.0.4",
"file-set": "^4.0.2",
"fs-then-native": "^2.0.0",
- "jsdoc": "^3.6.10",
+ "jsdoc": "^4.0.0",
"object-to-spawn-args": "^2.0.1",
"temp-path": "^1.0.0",
"walk-back": "^5.1.0"
@@ -4651,16 +5425,16 @@
}
},
"node_modules/jsdoc-parse": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/jsdoc-parse/-/jsdoc-parse-6.1.0.tgz",
- "integrity": "sha512-n/hDGQJa69IBun1yZAjqzV4gVR41+flZ3bIlm9fKvNe2Xjsd1/+zCo2+R9ls8LxtePgIWbpA1jU7xkB2lRdLLg==",
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/jsdoc-parse/-/jsdoc-parse-6.2.0.tgz",
+ "integrity": "sha512-Afu1fQBEb7QHt6QWX/6eUWvYHJofB90Fjx7FuJYF7mnG9z5BkAIpms1wsnvYLytfmqpEENHs/fax9p8gvMj7dw==",
"dev": true,
"dependencies": {
"array-back": "^6.2.2",
"lodash.omit": "^4.5.0",
"lodash.pick": "^4.4.0",
"reduce-extract": "^1.0.0",
- "sort-array": "^4.1.4",
+ "sort-array": "^4.1.5",
"test-value": "^3.0.0"
},
"engines": {
@@ -4668,17 +5442,17 @@
}
},
"node_modules/jsdoc-to-markdown": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/jsdoc-to-markdown/-/jsdoc-to-markdown-7.1.1.tgz",
- "integrity": "sha512-CI86d63xAVNO+ENumWwmJ034lYe5iGU5GwjtTA11EuphP9tpnoi4hrKgR/J8uME0D+o4KUpVfwX1fjZhc8dEtg==",
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/jsdoc-to-markdown/-/jsdoc-to-markdown-8.0.0.tgz",
+ "integrity": "sha512-2FQvYkg491+FP6s15eFlgSSWs69CvQrpbABGYBtvAvGWy/lWo8IKKToarT283w59rQFrpcjHl3YdhHCa3l7gXg==",
"dev": true,
"dependencies": {
"array-back": "^6.2.2",
"command-line-tool": "^0.8.0",
"config-master": "^3.1.0",
- "dmd": "^6.1.0",
- "jsdoc-api": "^7.1.1",
- "jsdoc-parse": "^6.1.0",
+ "dmd": "^6.2.0",
+ "jsdoc-api": "^8.0.0",
+ "jsdoc-parse": "^6.2.0",
"walk-back": "^5.1.0"
},
"bin": {
@@ -4801,12 +5575,12 @@
}
},
"node_modules/klaw": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/klaw/-/klaw-4.0.1.tgz",
- "integrity": "sha512-pgsE40/SvC7st04AHiISNewaIMUbY5V/K8b21ekiPiFoYs/EYSdsGa+FJArB1d441uq4Q8zZyIxvAzkGNlBdRw==",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz",
+ "integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==",
"dev": true,
- "engines": {
- "node": ">=14.14.0"
+ "dependencies": {
+ "graceful-fs": "^4.1.9"
}
},
"node_modules/kuler": {
@@ -4839,9 +5613,9 @@
}
},
"node_modules/lilconfig": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz",
- "integrity": "sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==",
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz",
+ "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==",
"dev": true,
"engines": {
"node": ">=10"
@@ -4863,24 +5637,24 @@
}
},
"node_modules/lint-staged": {
- "version": "13.0.3",
- "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.0.3.tgz",
- "integrity": "sha512-9hmrwSCFroTSYLjflGI8Uk+GWAwMB4OlpU4bMJEAT5d/llQwtYKoim4bLOyLCuWFAhWEupE0vkIFqtw/WIsPug==",
+ "version": "13.1.0",
+ "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.1.0.tgz",
+ "integrity": "sha512-pn/sR8IrcF/T0vpWLilih8jmVouMlxqXxKuAojmbiGX5n/gDnz+abdPptlj0vYnbfE0SQNl3CY/HwtM0+yfOVQ==",
"dev": true,
"dependencies": {
"cli-truncate": "^3.1.0",
- "colorette": "^2.0.17",
- "commander": "^9.3.0",
+ "colorette": "^2.0.19",
+ "commander": "^9.4.1",
"debug": "^4.3.4",
"execa": "^6.1.0",
- "lilconfig": "2.0.5",
- "listr2": "^4.0.5",
+ "lilconfig": "2.0.6",
+ "listr2": "^5.0.5",
"micromatch": "^4.0.5",
"normalize-path": "^3.0.0",
"object-inspect": "^1.12.2",
"pidtree": "^0.6.0",
"string-argv": "^0.3.1",
- "yaml": "^2.1.1"
+ "yaml": "^2.1.3"
},
"bin": {
"lint-staged": "bin/lint-staged.js"
@@ -4893,22 +5667,22 @@
}
},
"node_modules/listr2": {
- "version": "4.0.5",
- "resolved": "https://registry.npmjs.org/listr2/-/listr2-4.0.5.tgz",
- "integrity": "sha512-juGHV1doQdpNT3GSTs9IUN43QJb7KHdF9uqg7Vufs/tG9VTzpFphqF4pm/ICdAABGQxsyNn9CiYA3StkI6jpwA==",
+ "version": "5.0.6",
+ "resolved": "https://registry.npmjs.org/listr2/-/listr2-5.0.6.tgz",
+ "integrity": "sha512-u60KxKBy1BR2uLJNTWNptzWQ1ob/gjMzIJPZffAENzpZqbMZ/5PrXXOomDcevIS/+IB7s1mmCEtSlT2qHWMqag==",
"dev": true,
"dependencies": {
"cli-truncate": "^2.1.0",
- "colorette": "^2.0.16",
+ "colorette": "^2.0.19",
"log-update": "^4.0.0",
"p-map": "^4.0.0",
"rfdc": "^1.3.0",
- "rxjs": "^7.5.5",
+ "rxjs": "^7.5.7",
"through": "^2.3.8",
"wrap-ansi": "^7.0.0"
},
"engines": {
- "node": ">=12"
+ "node": "^14.13.1 || >=16.0.0"
},
"peerDependencies": {
"enquirer": ">= 2.3.0 < 3"
@@ -5050,6 +5824,12 @@
"integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
"dev": true
},
+ "node_modules/lodash.flattendeep": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz",
+ "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==",
+ "dev": true
+ },
"node_modules/lodash.merge": {
"version": "4.6.2",
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
@@ -5059,7 +5839,7 @@
"node_modules/lodash.omit": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.omit/-/lodash.omit-4.5.0.tgz",
- "integrity": "sha1-brGa5aHuHdnfC5aeZs4Lf6MLXmA=",
+ "integrity": "sha512-XeqSp49hNGmlkj2EJlfrQFIzQ6lXdNro9sddtQzcJY8QaoC2GO0DT7xaIokHeyM+mIT0mPMlPvkYzg2xCuHdZg==",
"dev": true
},
"node_modules/lodash.padend": {
@@ -5071,7 +5851,7 @@
"node_modules/lodash.pick": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz",
- "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=",
+ "integrity": "sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==",
"dev": true
},
"node_modules/log-symbols": {
@@ -5346,9 +6126,9 @@
}
},
"node_modules/markdown-it-anchor": {
- "version": "8.6.2",
- "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.2.tgz",
- "integrity": "sha512-JNaekTlIwwyYGBN3zifZDxgz4bSL8sbEj58fdTZGmPSMMGXBZapFjcZk2I33Jy79c1fvCKHpF7MA/67FOTjvzA==",
+ "version": "8.6.5",
+ "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.5.tgz",
+ "integrity": "sha512-PI1qEHHkTNWT+X6Ip9w+paonfIQ+QZP9sCeMYi47oqhH+EsW8CrJ8J7CzV19QVOj6il8ATGbK2nTECj22ZHGvQ==",
"dev": true,
"peerDependencies": {
"@types/markdown-it": "*",
@@ -5356,9 +6136,9 @@
}
},
"node_modules/marked": {
- "version": "4.0.14",
- "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.14.tgz",
- "integrity": "sha512-HL5sSPE/LP6U9qKgngIIPTthuxC0jrfxpYMZ3LdGDD3vTnLs59m2Z7r6+LNDR3ToqEQdkKd6YaaEfJhodJmijQ==",
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/marked/-/marked-4.2.3.tgz",
+ "integrity": "sha512-slWRdJkbTZ+PjkyJnE30Uid64eHwbwa1Q25INCAYfZlK4o6ylagBy/Le9eWntqJFoFT93ikUKMv47GZ4gTwHkw==",
"dev": true,
"bin": {
"marked": "bin/marked.js"
@@ -5370,7 +6150,7 @@
"node_modules/mdurl": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz",
- "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=",
+ "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==",
"dev": true
},
"node_modules/memorystream": {
@@ -5820,6 +6600,24 @@
"lodash": "^4.17.21"
}
},
+ "node_modules/node-preload": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz",
+ "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==",
+ "dev": true,
+ "dependencies": {
+ "process-on-spawn": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz",
+ "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==",
+ "dev": true
+ },
"node_modules/node-sql-parser": {
"version": "4.5.1",
"resolved": "https://registry.npmjs.org/node-sql-parser/-/node-sql-parser-4.5.1.tgz",
@@ -6126,85 +6924,274 @@
"node": ">=0.10"
}
},
- "node_modules/npm-run-all/node_modules/semver": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "node_modules/npm-run-all/node_modules/semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/npm-run-all/node_modules/shebang-command": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+ "dev": true,
+ "dependencies": {
+ "shebang-regex": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/npm-run-all/node_modules/shebang-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/npm-run-all/node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/npm-run-all/node_modules/which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "which": "bin/which"
+ }
+ },
+ "node_modules/npm-run-path": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz",
+ "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^4.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/npm-run-path/node_modules/path-key": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz",
+ "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/nyc": {
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz",
+ "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==",
+ "dev": true,
+ "dependencies": {
+ "@istanbuljs/load-nyc-config": "^1.0.0",
+ "@istanbuljs/schema": "^0.1.2",
+ "caching-transform": "^4.0.0",
+ "convert-source-map": "^1.7.0",
+ "decamelize": "^1.2.0",
+ "find-cache-dir": "^3.2.0",
+ "find-up": "^4.1.0",
+ "foreground-child": "^2.0.0",
+ "get-package-type": "^0.1.0",
+ "glob": "^7.1.6",
+ "istanbul-lib-coverage": "^3.0.0",
+ "istanbul-lib-hook": "^3.0.0",
+ "istanbul-lib-instrument": "^4.0.0",
+ "istanbul-lib-processinfo": "^2.0.2",
+ "istanbul-lib-report": "^3.0.0",
+ "istanbul-lib-source-maps": "^4.0.0",
+ "istanbul-reports": "^3.0.2",
+ "make-dir": "^3.0.0",
+ "node-preload": "^0.2.1",
+ "p-map": "^3.0.0",
+ "process-on-spawn": "^1.0.0",
+ "resolve-from": "^5.0.0",
+ "rimraf": "^3.0.0",
+ "signal-exit": "^3.0.2",
+ "spawn-wrap": "^2.0.0",
+ "test-exclude": "^6.0.0",
+ "yargs": "^15.0.2"
+ },
+ "bin": {
+ "nyc": "bin/nyc.js"
+ },
+ "engines": {
+ "node": ">=8.9"
+ }
+ },
+ "node_modules/nyc/node_modules/camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/nyc/node_modules/cliui": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
+ "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
+ "dev": true,
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^6.2.0"
+ }
+ },
+ "node_modules/nyc/node_modules/find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/nyc/node_modules/locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/nyc/node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/nyc/node_modules/p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
"dev": true,
- "bin": {
- "semver": "bin/semver"
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/npm-run-all/node_modules/shebang-command": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
- "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+ "node_modules/nyc/node_modules/p-map": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz",
+ "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==",
"dev": true,
"dependencies": {
- "shebang-regex": "^1.0.0"
+ "aggregate-error": "^3.0.0"
},
"engines": {
- "node": ">=0.10.0"
+ "node": ">=8"
}
},
- "node_modules/npm-run-all/node_modules/shebang-regex": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
- "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
+ "node_modules/nyc/node_modules/resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
"dev": true,
"engines": {
- "node": ">=0.10.0"
+ "node": ">=8"
}
},
- "node_modules/npm-run-all/node_modules/supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "node_modules/nyc/node_modules/wrap-ansi": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+ "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
"dev": true,
"dependencies": {
- "has-flag": "^3.0.0"
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
},
"engines": {
- "node": ">=4"
+ "node": ">=8"
}
},
- "node_modules/npm-run-all/node_modules/which": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
- "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
- "dev": true,
- "dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "which": "bin/which"
- }
+ "node_modules/nyc/node_modules/y18n": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
+ "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
+ "dev": true
},
- "node_modules/npm-run-path": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz",
- "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==",
+ "node_modules/nyc/node_modules/yargs": {
+ "version": "15.4.1",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
+ "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
"dev": true,
"dependencies": {
- "path-key": "^4.0.0"
+ "cliui": "^6.0.0",
+ "decamelize": "^1.2.0",
+ "find-up": "^4.1.0",
+ "get-caller-file": "^2.0.1",
+ "require-directory": "^2.1.1",
+ "require-main-filename": "^2.0.0",
+ "set-blocking": "^2.0.0",
+ "string-width": "^4.2.0",
+ "which-module": "^2.0.0",
+ "y18n": "^4.0.0",
+ "yargs-parser": "^18.1.2"
},
"engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">=8"
}
},
- "node_modules/npm-run-path/node_modules/path-key": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz",
- "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==",
+ "node_modules/nyc/node_modules/yargs-parser": {
+ "version": "18.1.3",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
+ "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
"dev": true,
- "engines": {
- "node": ">=12"
+ "dependencies": {
+ "camelcase": "^5.0.0",
+ "decamelize": "^1.2.0"
},
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "engines": {
+ "node": ">=6"
}
},
"node_modules/object-get": {
@@ -6254,13 +7241,13 @@
}
},
"node_modules/object.assign": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
- "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
+ "version": "4.1.4",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz",
+ "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==",
"dependencies": {
- "call-bind": "^1.0.0",
- "define-properties": "^1.1.3",
- "has-symbols": "^1.0.1",
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "has-symbols": "^1.0.3",
"object-keys": "^1.1.1"
},
"engines": {
@@ -6425,6 +7412,21 @@
"node": ">=6"
}
},
+ "node_modules/package-hash": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz",
+ "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.1.15",
+ "hasha": "^5.0.0",
+ "lodash.flattendeep": "^4.4.0",
+ "release-zalgo": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/package-json": {
"version": "6.5.0",
"resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz",
@@ -6716,9 +7718,9 @@
}
},
"node_modules/prettier": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz",
- "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==",
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.0.tgz",
+ "integrity": "sha512-9Lmg8hTFZKG0Asr/kW9Bp8tJjRVluO8EJQVfY2T7FMw9T5jy4I/Uvx0Rca/XWf50QQ1/SS48+6IJWnrb+2yemA==",
"bin": {
"prettier": "bin-prettier.js"
},
@@ -6822,6 +7824,18 @@
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
"dev": true
},
+ "node_modules/process-on-spawn": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz",
+ "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==",
+ "dev": true,
+ "dependencies": {
+ "fromentries": "^1.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/pump": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
@@ -7129,7 +8143,7 @@
"node_modules/reduce-extract": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/reduce-extract/-/reduce-extract-1.0.0.tgz",
- "integrity": "sha1-Z/I4W+2mUGG19fQxJmLosIDKFSU=",
+ "integrity": "sha512-QF8vjWx3wnRSL5uFMyCjDeDc5EBMiryoT9tz94VvgjKfzecHAVnqmXAwQDcr7X4JmLc2cjkjFGCVzhMqDjgR9g==",
"dev": true,
"dependencies": {
"test-value": "^1.0.1"
@@ -7141,7 +8155,7 @@
"node_modules/reduce-extract/node_modules/array-back": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz",
- "integrity": "sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs=",
+ "integrity": "sha512-1WxbZvrmyhkNoeYcizokbmh5oiOCIfyvGtcqbK3Ls1v1fKcquzxnQSceOx6tzq7jmai2kFLWIpGND2cLhH6TPw==",
"dev": true,
"dependencies": {
"typical": "^2.6.0"
@@ -7153,7 +8167,7 @@
"node_modules/reduce-extract/node_modules/test-value": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/test-value/-/test-value-1.1.0.tgz",
- "integrity": "sha1-oJE29y7AQ9J8iTcHwrFZv6196T8=",
+ "integrity": "sha512-wrsbRo7qP+2Je8x8DsK8ovCGyxe3sYfQwOraIY/09A2gFXU9DYKiTF14W4ki/01AEh56kMzAmlj9CaHGDDUBJA==",
"dev": true,
"dependencies": {
"array-back": "^1.0.2",
@@ -7184,7 +8198,7 @@
"node_modules/reduce-without": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/reduce-without/-/reduce-without-1.0.1.tgz",
- "integrity": "sha1-aK0OrRGFXJo31OglbBW7+Hly/Iw=",
+ "integrity": "sha512-zQv5y/cf85sxvdrKPlfcRzlDn/OqKFThNimYmsS3flmkioKvkUGn2Qg9cJVoQiEvdxFGLE0MQER/9fZ9sUqdxg==",
"dev": true,
"dependencies": {
"test-value": "^2.0.0"
@@ -7196,7 +8210,7 @@
"node_modules/reduce-without/node_modules/array-back": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz",
- "integrity": "sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs=",
+ "integrity": "sha512-1WxbZvrmyhkNoeYcizokbmh5oiOCIfyvGtcqbK3Ls1v1fKcquzxnQSceOx6tzq7jmai2kFLWIpGND2cLhH6TPw==",
"dev": true,
"dependencies": {
"typical": "^2.6.0"
@@ -7208,7 +8222,7 @@
"node_modules/reduce-without/node_modules/test-value": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/test-value/-/test-value-2.1.0.tgz",
- "integrity": "sha1-Edpv9nDzRxpztiXKTz/c97t0gpE=",
+ "integrity": "sha512-+1epbAxtKeXttkGFMTX9H42oqzOTufR1ceCF+GYA5aOmvaPq9wd4PUS8329fn2RRLGNeUkgRLnVpycjx8DsO2w==",
"dev": true,
"dependencies": {
"array-back": "^1.0.3",
@@ -7277,6 +8291,39 @@
"node": ">=8"
}
},
+ "node_modules/regjsparser": {
+ "version": "0.9.1",
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz",
+ "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==",
+ "dev": true,
+ "dependencies": {
+ "jsesc": "~0.5.0"
+ },
+ "bin": {
+ "regjsparser": "bin/parser"
+ }
+ },
+ "node_modules/regjsparser/node_modules/jsesc": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
+ "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==",
+ "dev": true,
+ "bin": {
+ "jsesc": "bin/jsesc"
+ }
+ },
+ "node_modules/release-zalgo": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz",
+ "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==",
+ "dev": true,
+ "dependencies": {
+ "es6-error": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
"node_modules/require-directory": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
@@ -7293,6 +8340,12 @@
"node": ">=0.10.0"
}
},
+ "node_modules/require-main-filename": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
+ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
+ "dev": true
+ },
"node_modules/require-package-name": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/require-package-name/-/require-package-name-2.0.1.tgz",
@@ -7306,12 +8359,12 @@
"dev": true
},
"node_modules/requizzle": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.3.tgz",
- "integrity": "sha512-YanoyJjykPxGHii0fZP0uUPEXpvqfBDxWV7s6GKAiiOsiqhX6vHNyW3Qzdmqp/iq/ExbhaGbVrjB4ruEVSM4GQ==",
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.4.tgz",
+ "integrity": "sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw==",
"dev": true,
"dependencies": {
- "lodash": "^4.17.14"
+ "lodash": "^4.17.21"
}
},
"node_modules/resolve": {
@@ -7431,9 +8484,9 @@
}
},
"node_modules/rxjs": {
- "version": "7.5.5",
- "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.5.tgz",
- "integrity": "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==",
+ "version": "7.6.0",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.6.0.tgz",
+ "integrity": "sha512-DDa7d8TFNUalGC9VqXvQ1euWNN7sc63TrUCuM9J998+ViviahMIjKSOU7rfcgFOF+FCD71BhDRv4hrFz+ImDLQ==",
"dependencies": {
"tslib": "^2.1.0"
}
@@ -7556,6 +8609,12 @@
"randombytes": "^2.1.0"
}
},
+ "node_modules/set-blocking": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+ "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==",
+ "dev": true
+ },
"node_modules/sfmc-sdk": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/sfmc-sdk/-/sfmc-sdk-0.6.1.tgz",
@@ -7616,9 +8675,9 @@
"integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="
},
"node_modules/simple-git": {
- "version": "3.14.1",
- "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.14.1.tgz",
- "integrity": "sha512-1ThF4PamK9wBORVGMK9HK5si4zoGS2GpRO7tkAFObA4FZv6dKaCVHLQT+8zlgiBm6K2h+wEU9yOaFCu/SR3OyA==",
+ "version": "3.15.1",
+ "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.15.1.tgz",
+ "integrity": "sha512-73MVa5984t/JP4JcQt0oZlKGr42ROYWC3BcUZfuHtT3IHKPspIvL0cZBnvPXF7LL3S/qVeVHVdYYmJ3LOTw4Rg==",
"dependencies": {
"@kwsites/file-exists": "^1.1.1",
"@kwsites/promise-deferred": "^1.1.1",
@@ -7734,6 +8793,23 @@
"integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
"dev": true
},
+ "node_modules/spawn-wrap": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz",
+ "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==",
+ "dev": true,
+ "dependencies": {
+ "foreground-child": "^2.0.0",
+ "is-windows": "^1.0.2",
+ "make-dir": "^3.0.0",
+ "rimraf": "^3.0.0",
+ "signal-exit": "^3.0.2",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/spdx-correct": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
@@ -7801,7 +8877,7 @@
"node_modules/stream-connect": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/stream-connect/-/stream-connect-1.0.2.tgz",
- "integrity": "sha1-GLyB8u2zW4tdmoAJIAqYUxRCipc=",
+ "integrity": "sha512-68Kl+79cE0RGKemKkhxTSg8+6AGrqBt+cbZAXevg2iJ6Y3zX4JhA/sZeGzLpxW9cXhmqAcE7KnJCisUmIUfnFQ==",
"dev": true,
"dependencies": {
"array-back": "^1.0.2"
@@ -7813,7 +8889,7 @@
"node_modules/stream-connect/node_modules/array-back": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz",
- "integrity": "sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs=",
+ "integrity": "sha512-1WxbZvrmyhkNoeYcizokbmh5oiOCIfyvGtcqbK3Ls1v1fKcquzxnQSceOx6tzq7jmai2kFLWIpGND2cLhH6TPw==",
"dev": true,
"dependencies": {
"typical": "^2.6.0"
@@ -7890,6 +8966,7 @@
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz",
"integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==",
+ "dev": true,
"dependencies": {
"call-bind": "^1.0.2",
"define-properties": "^1.1.3"
@@ -7902,6 +8979,7 @@
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz",
"integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==",
+ "dev": true,
"dependencies": {
"call-bind": "^1.0.2",
"define-properties": "^1.1.3"
@@ -8030,18 +9108,26 @@
"node": ">=4"
}
},
- "node_modules/taffydb": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/taffydb/-/taffydb-2.6.2.tgz",
- "integrity": "sha1-fLy2S1oUG2ou/CxdLGe04VCyomg=",
- "dev": true
- },
"node_modules/temp-path": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/temp-path/-/temp-path-1.0.0.tgz",
- "integrity": "sha1-JLFUOXOrRCiW2a02fdnL2/r+kYs=",
+ "integrity": "sha512-TvmyH7kC6ZVTYkqCODjJIbgvu0FKiwQpZ4D1aknE7xpcDf/qEOB8KZEK5ef2pfbVoiBhNWs3yx4y+ESMtNYmlg==",
"dev": true
},
+ "node_modules/test-exclude": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
+ "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
+ "dev": true,
+ "dependencies": {
+ "@istanbuljs/schema": "^0.1.2",
+ "glob": "^7.1.4",
+ "minimatch": "^3.0.4"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/test-value": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/test-value/-/test-value-3.0.0.tgz",
@@ -8245,9 +9331,9 @@
"dev": true
},
"node_modules/uglify-js": {
- "version": "3.15.4",
- "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.15.4.tgz",
- "integrity": "sha512-vMOPGDuvXecPs34V74qDKk4iJ/SN4vL3Ow/23ixafENYvtrNvtbcgUeugTcUGRGsOF/5fU8/NYSL5Hyb3l1OJA==",
+ "version": "3.17.4",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz",
+ "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==",
"dev": true,
"optional": true,
"bin": {
@@ -8261,6 +9347,7 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
"integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
+ "dev": true,
"dependencies": {
"call-bind": "^1.0.2",
"has-bigints": "^1.0.2",
@@ -8272,9 +9359,9 @@
}
},
"node_modules/underscore": {
- "version": "1.13.3",
- "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.3.tgz",
- "integrity": "sha512-QvjkYpiD+dJJraRA8+dGAU4i7aBbb2s0S3jA45TFOvg2VgqvdCDd/3N6CqA8gluk1W91GLoXg5enMUx560QzuA==",
+ "version": "1.13.6",
+ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz",
+ "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==",
"dev": true
},
"node_modules/unique-string": {
@@ -8296,6 +9383,32 @@
"node": ">= 10.0.0"
}
},
+ "node_modules/update-browserslist-db": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz",
+ "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ }
+ ],
+ "dependencies": {
+ "escalade": "^3.1.1",
+ "picocolors": "^1.0.0"
+ },
+ "bin": {
+ "browserslist-lint": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
"node_modules/update-notifier": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz",
@@ -8361,6 +9474,15 @@
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
},
+ "node_modules/uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "dev": true,
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
"node_modules/validate-npm-package-license": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
@@ -8456,6 +9578,12 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/which-module": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
+ "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==",
+ "dev": true
+ },
"node_modules/which-pm": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/which-pm/-/which-pm-2.0.0.tgz",
@@ -8470,16 +9598,16 @@
}
},
"node_modules/which-typed-array": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.7.tgz",
- "integrity": "sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw==",
+ "version": "1.1.9",
+ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz",
+ "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==",
"dependencies": {
"available-typed-arrays": "^1.0.5",
"call-bind": "^1.0.2",
- "es-abstract": "^1.18.5",
- "foreach": "^2.0.5",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
"has-tostringtag": "^1.0.0",
- "is-typed-array": "^1.1.7"
+ "is-typed-array": "^1.1.10"
},
"engines": {
"node": ">= 0.4"
@@ -8545,7 +9673,7 @@
"node_modules/wordwrap": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
- "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+ "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==",
"dev": true
},
"node_modules/wordwrapjs": {
@@ -8645,9 +9773,9 @@
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
},
"node_modules/yaml": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.1.1.tgz",
- "integrity": "sha512-o96x3OPo8GjWeSLF+wOAbrPfhFOGY0W00GNaxCDv+9hkcDJEnev1yh8S7pgHF0ik6zc8sQLuL8hjHjJULZp8bw==",
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.1.3.tgz",
+ "integrity": "sha512-AacA8nRULjKMX2DvWvOAdBZMOfQlypSFkjcOcu9FalllIDJ1kvlREzcdIZmidQUqqeMv7jorHjq2HlLv/+c2lg==",
"dev": true,
"engines": {
"node": ">= 14"
@@ -8731,6 +9859,28 @@
}
},
"dependencies": {
+ "@ampproject/remapping": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz",
+ "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==",
+ "dev": true,
+ "requires": {
+ "@jridgewell/gen-mapping": "^0.1.0",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ },
+ "dependencies": {
+ "@jridgewell/gen-mapping": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz",
+ "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==",
+ "dev": true,
+ "requires": {
+ "@jridgewell/set-array": "^1.0.0",
+ "@jridgewell/sourcemap-codec": "^1.4.10"
+ }
+ }
+ }
+ },
"@babel/code-frame": {
"version": "7.18.6",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz",
@@ -8740,17 +9890,74 @@
"@babel/highlight": "^7.18.6"
}
},
+ "@babel/compat-data": {
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.5.tgz",
+ "integrity": "sha512-KZXo2t10+/jxmkhNXc7pZTqRvSOIvVv/+lJwHS+B2rErwOyjuVRh60yVpb7liQ1U5t7lLJ1bz+t8tSypUZdm0g==",
+ "dev": true
+ },
+ "@babel/core": {
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.5.tgz",
+ "integrity": "sha512-UdOWmk4pNWTm/4DlPUl/Pt4Gz4rcEMb7CY0Y3eJl5Yz1vI8ZJGmHWaVE55LoxRjdpx0z259GE9U5STA9atUinQ==",
+ "dev": true,
+ "requires": {
+ "@ampproject/remapping": "^2.1.0",
+ "@babel/code-frame": "^7.18.6",
+ "@babel/generator": "^7.20.5",
+ "@babel/helper-compilation-targets": "^7.20.0",
+ "@babel/helper-module-transforms": "^7.20.2",
+ "@babel/helpers": "^7.20.5",
+ "@babel/parser": "^7.20.5",
+ "@babel/template": "^7.18.10",
+ "@babel/traverse": "^7.20.5",
+ "@babel/types": "^7.20.5",
+ "convert-source-map": "^1.7.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.1",
+ "semver": "^6.3.0"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true
+ }
+ }
+ },
"@babel/generator": {
- "version": "7.18.9",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.9.tgz",
- "integrity": "sha512-wt5Naw6lJrL1/SGkipMiFxJjtyczUWTP38deiP1PO60HsBjDeKk08CGC3S8iVuvf0FmTdgKwU1KIXzSKL1G0Ug==",
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.5.tgz",
+ "integrity": "sha512-jl7JY2Ykn9S0yj4DQP82sYvPU+T3g0HFcWTqDLqiuA9tGRNIj9VfbtXGAYTTkyNEnQk1jkMGOdYka8aG/lulCA==",
"dev": true,
"requires": {
- "@babel/types": "^7.18.9",
+ "@babel/types": "^7.20.5",
"@jridgewell/gen-mapping": "^0.3.2",
"jsesc": "^2.5.1"
}
},
+ "@babel/helper-compilation-targets": {
+ "version": "7.20.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz",
+ "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==",
+ "dev": true,
+ "requires": {
+ "@babel/compat-data": "^7.20.0",
+ "@babel/helper-validator-option": "^7.18.6",
+ "browserslist": "^4.21.3",
+ "semver": "^6.3.0"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true
+ }
+ }
+ },
"@babel/helper-environment-visitor": {
"version": "7.18.9",
"resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz",
@@ -8758,13 +9965,13 @@
"dev": true
},
"@babel/helper-function-name": {
- "version": "7.18.9",
- "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz",
- "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==",
+ "version": "7.19.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz",
+ "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==",
"dev": true,
"requires": {
- "@babel/template": "^7.18.6",
- "@babel/types": "^7.18.9"
+ "@babel/template": "^7.18.10",
+ "@babel/types": "^7.19.0"
}
},
"@babel/helper-hoist-variables": {
@@ -8776,6 +9983,40 @@
"@babel/types": "^7.18.6"
}
},
+ "@babel/helper-module-imports": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz",
+ "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.18.6"
+ }
+ },
+ "@babel/helper-module-transforms": {
+ "version": "7.20.2",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz",
+ "integrity": "sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-environment-visitor": "^7.18.9",
+ "@babel/helper-module-imports": "^7.18.6",
+ "@babel/helper-simple-access": "^7.20.2",
+ "@babel/helper-split-export-declaration": "^7.18.6",
+ "@babel/helper-validator-identifier": "^7.19.1",
+ "@babel/template": "^7.18.10",
+ "@babel/traverse": "^7.20.1",
+ "@babel/types": "^7.20.2"
+ }
+ },
+ "@babel/helper-simple-access": {
+ "version": "7.20.2",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz",
+ "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.20.2"
+ }
+ },
"@babel/helper-split-export-declaration": {
"version": "7.18.6",
"resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz",
@@ -8785,12 +10026,35 @@
"@babel/types": "^7.18.6"
}
},
+ "@babel/helper-string-parser": {
+ "version": "7.19.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz",
+ "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==",
+ "dev": true
+ },
"@babel/helper-validator-identifier": {
"version": "7.19.1",
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz",
"integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==",
"dev": true
},
+ "@babel/helper-validator-option": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz",
+ "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==",
+ "dev": true
+ },
+ "@babel/helpers": {
+ "version": "7.20.6",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.6.tgz",
+ "integrity": "sha512-Pf/OjgfgFRW5bApskEz5pvidpim7tEDPlFtKcNRXWmfHGn9IEI2W2flqRQXTFb7gIPTyK++N6rVHuwKut4XK6w==",
+ "dev": true,
+ "requires": {
+ "@babel/template": "^7.18.10",
+ "@babel/traverse": "^7.20.5",
+ "@babel/types": "^7.20.5"
+ }
+ },
"@babel/highlight": {
"version": "7.18.6",
"resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz",
@@ -8861,36 +10125,36 @@
}
},
"@babel/parser": {
- "version": "7.18.9",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.9.tgz",
- "integrity": "sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg==",
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.5.tgz",
+ "integrity": "sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA==",
"dev": true
},
"@babel/template": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz",
- "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==",
+ "version": "7.18.10",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz",
+ "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==",
"dev": true,
"requires": {
"@babel/code-frame": "^7.18.6",
- "@babel/parser": "^7.18.6",
- "@babel/types": "^7.18.6"
+ "@babel/parser": "^7.18.10",
+ "@babel/types": "^7.18.10"
}
},
"@babel/traverse": {
- "version": "7.18.9",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.9.tgz",
- "integrity": "sha512-LcPAnujXGwBgv3/WHv01pHtb2tihcyW1XuL9wd7jqh1Z8AQkTd+QVjMrMijrln0T7ED3UXLIy36P9Ao7W75rYg==",
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.5.tgz",
+ "integrity": "sha512-WM5ZNN3JITQIq9tFZaw1ojLU3WgWdtkxnhM1AegMS+PvHjkM5IXjmYEGY7yukz5XS4sJyEf2VzWjI8uAavhxBQ==",
"dev": true,
"requires": {
"@babel/code-frame": "^7.18.6",
- "@babel/generator": "^7.18.9",
+ "@babel/generator": "^7.20.5",
"@babel/helper-environment-visitor": "^7.18.9",
- "@babel/helper-function-name": "^7.18.9",
+ "@babel/helper-function-name": "^7.19.0",
"@babel/helper-hoist-variables": "^7.18.6",
"@babel/helper-split-export-declaration": "^7.18.6",
- "@babel/parser": "^7.18.9",
- "@babel/types": "^7.18.9",
+ "@babel/parser": "^7.20.5",
+ "@babel/types": "^7.20.5",
"debug": "^4.1.0",
"globals": "^11.1.0"
},
@@ -8904,12 +10168,13 @@
}
},
"@babel/types": {
- "version": "7.18.9",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.9.tgz",
- "integrity": "sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==",
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.5.tgz",
+ "integrity": "sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==",
"dev": true,
"requires": {
- "@babel/helper-validator-identifier": "^7.18.6",
+ "@babel/helper-string-parser": "^7.19.4",
+ "@babel/helper-validator-identifier": "^7.19.1",
"to-fast-properties": "^2.0.0"
}
},
@@ -8938,9 +10203,9 @@
}
},
"@es-joy/jsdoccomment": {
- "version": "0.36.0",
- "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.36.0.tgz",
- "integrity": "sha512-u0XZyvUF6Urb2cSivSXA8qXIpT/CxkHcdtZKoWusAzgzmsTWpg0F2FpWXsolHmMUyVY3dLWaoy+0ccJ5uf2QjA==",
+ "version": "0.36.1",
+ "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.36.1.tgz",
+ "integrity": "sha512-922xqFsTpHs6D0BUiG4toiyPOMc8/jafnWKxz1KWgS4XzKPy2qXf1Pe6UFuNSCQqt6tOuhAWXBNuuyUhJmw9Vg==",
"dev": true,
"requires": {
"comment-parser": "1.3.1",
@@ -8948,6 +10213,15 @@
"jsdoc-type-pratt-parser": "~3.1.0"
}
},
+ "@eslint-community/eslint-utils": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.1.2.tgz",
+ "integrity": "sha512-7qELuQWWjVDdVsFQ5+beUl+KPczrEDA7S3zM4QUd/bJl7oXgsmpXaEVqrRTnOBqenOV4rWf2kVZk2Ot085zPWA==",
+ "dev": true,
+ "requires": {
+ "eslint-visitor-keys": "^3.3.0"
+ }
+ },
"@eslint/eslintrc": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz",
@@ -9008,6 +10282,95 @@
"integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
"dev": true
},
+ "@istanbuljs/load-nyc-config": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
+ "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==",
+ "dev": true,
+ "requires": {
+ "camelcase": "^5.3.1",
+ "find-up": "^4.1.0",
+ "get-package-type": "^0.1.0",
+ "js-yaml": "^3.13.1",
+ "resolve-from": "^5.0.0"
+ },
+ "dependencies": {
+ "argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "requires": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "dev": true
+ },
+ "find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "requires": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ }
+ },
+ "js-yaml": {
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+ "dev": true,
+ "requires": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ }
+ },
+ "locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
+ "requires": {
+ "p-locate": "^4.1.0"
+ }
+ },
+ "p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
+ "requires": {
+ "p-try": "^2.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dev": true,
+ "requires": {
+ "p-limit": "^2.2.0"
+ }
+ },
+ "resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "dev": true
+ }
+ }
+ },
+ "@istanbuljs/schema": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
+ "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==",
+ "dev": true
+ },
"@jridgewell/gen-mapping": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
@@ -9047,6 +10410,15 @@
"@jridgewell/sourcemap-codec": "^1.4.10"
}
},
+ "@jsdoc/salty": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/@jsdoc/salty/-/salty-0.2.1.tgz",
+ "integrity": "sha512-JXwylDNSHa549N9uceDYu8D4GMXwSo3H8CCPYEQqxhhHpxD28+lRl2b3bS/caaPj5w1YD3SWtrficJNTnUjGpg==",
+ "dev": true,
+ "requires": {
+ "lodash": "^4.17.21"
+ }
+ },
"@kwsites/file-exists": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz",
@@ -9422,6 +10794,21 @@
"picomatch": "^2.0.4"
}
},
+ "append-transform": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz",
+ "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==",
+ "dev": true,
+ "requires": {
+ "default-require-extensions": "^3.0.0"
+ }
+ },
+ "archy": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz",
+ "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==",
+ "dev": true
+ },
"argparse": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
@@ -9525,6 +10912,11 @@
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
"integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="
},
+ "beauty-amp-core": {
+ "version": "0.3.7",
+ "resolved": "https://registry.npmjs.org/beauty-amp-core/-/beauty-amp-core-0.3.7.tgz",
+ "integrity": "sha512-/a3jRMN0IZ4SaV8PoVLqprk0sSEXvTOOVs4jdSQhgNBJYRkHau0PhUwju6PzfNvQpleZXWdechrPQAVAxIKnHA=="
+ },
"big-integer": {
"version": "1.6.51",
"resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz",
@@ -9592,6 +10984,18 @@
"integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
"dev": true
},
+ "browserslist": {
+ "version": "4.21.4",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz",
+ "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==",
+ "dev": true,
+ "requires": {
+ "caniuse-lite": "^1.0.30001400",
+ "electron-to-chromium": "^1.4.251",
+ "node-releases": "^2.0.6",
+ "update-browserslist-db": "^1.0.9"
+ }
+ },
"buffer": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
@@ -9655,6 +11059,18 @@
}
}
},
+ "caching-transform": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz",
+ "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==",
+ "dev": true,
+ "requires": {
+ "hasha": "^5.0.0",
+ "make-dir": "^3.0.0",
+ "package-hash": "^4.0.0",
+ "write-file-atomic": "^3.0.0"
+ }
+ },
"call-bind": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
@@ -9774,6 +11190,12 @@
}
}
},
+ "caniuse-lite": {
+ "version": "1.0.30001439",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001439.tgz",
+ "integrity": "sha512-1MgUzEkoMO6gKfXflStpYgZDlFM7M/ck/bgfVCACO5vnAf0fXoNVHdWtqGU+MYca+4bL9Z5bpOVmR33cWW9G2A==",
+ "dev": true
+ },
"catharsis": {
"version": "0.9.0",
"resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.9.0.tgz",
@@ -9784,20 +11206,29 @@
}
},
"chai": {
- "version": "4.3.6",
- "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz",
- "integrity": "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==",
+ "version": "4.3.7",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz",
+ "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==",
"dev": true,
"requires": {
"assertion-error": "^1.1.0",
"check-error": "^1.0.2",
- "deep-eql": "^3.0.1",
+ "deep-eql": "^4.1.2",
"get-func-name": "^2.0.0",
"loupe": "^2.3.1",
"pathval": "^1.1.1",
"type-detect": "^4.0.5"
}
},
+ "chai-files": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/chai-files/-/chai-files-1.4.0.tgz",
+ "integrity": "sha512-tPTx7H2kpR+wILWHRx8RxpXcRUdc2uH8su505C9R3p5GA+eYbZBXuxWC0RZbyElYi7X7Fp/V/S2PQjkakrT1mQ==",
+ "dev": true,
+ "requires": {
+ "assertion-error": "^1.0.1"
+ }
+ },
"chalk": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
@@ -10136,9 +11567,9 @@
}
},
"commander": {
- "version": "9.3.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-9.3.0.tgz",
- "integrity": "sha512-hv95iU5uXPbK83mjrJKuZyFM/LBAoCV/XhVGkS5Je6tl7sxr6A0ITMw5WoRV46/UaJ46Nllm3Xt7IaJhXTIkzw==",
+ "version": "9.4.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.1.tgz",
+ "integrity": "sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==",
"dev": true
},
"comment-parser": {
@@ -10159,6 +11590,12 @@
"integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==",
"dev": true
},
+ "commondir": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
+ "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==",
+ "dev": true
+ },
"concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@@ -10230,6 +11667,12 @@
"easy-table": "1.1.0"
}
},
+ "convert-source-map": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
+ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
+ "dev": true
+ },
"cosmiconfig": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz",
@@ -10334,34 +11777,34 @@
}
},
"deep-eql": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz",
- "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==",
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.2.tgz",
+ "integrity": "sha512-gT18+YW4CcW/DBNTwAmqTtkJh7f9qqScu2qFVlx7kCoeY9tlBu9cUcr7+I+Z/noG8INehS3xQgLpTtd/QUTn4w==",
"dev": true,
"requires": {
"type-detect": "^4.0.0"
}
},
"deep-equal": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.0.5.tgz",
- "integrity": "sha512-nPiRgmbAtm1a3JsnLCf6/SLfXcjyN5v8L1TXzdCmHrXJ4hx+gW/w1YCcn7z8gJtSiDArZCgYtbao3QqLm/N1Sw==",
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.1.0.tgz",
+ "integrity": "sha512-2pxgvWu3Alv1PoWEyVg7HS8YhGlUFUV7N5oOvfL6d+7xAmLSemMwv/c8Zv/i9KFzxV5Kt5CAvQc70fLwVuf4UA==",
"requires": {
- "call-bind": "^1.0.0",
- "es-get-iterator": "^1.1.1",
- "get-intrinsic": "^1.0.1",
- "is-arguments": "^1.0.4",
- "is-date-object": "^1.0.2",
- "is-regex": "^1.1.1",
+ "call-bind": "^1.0.2",
+ "es-get-iterator": "^1.1.2",
+ "get-intrinsic": "^1.1.3",
+ "is-arguments": "^1.1.1",
+ "is-date-object": "^1.0.5",
+ "is-regex": "^1.1.4",
"isarray": "^2.0.5",
- "object-is": "^1.1.4",
+ "object-is": "^1.1.5",
"object-keys": "^1.1.1",
- "object.assign": "^4.1.2",
- "regexp.prototype.flags": "^1.3.0",
- "side-channel": "^1.0.3",
- "which-boxed-primitive": "^1.0.1",
+ "object.assign": "^4.1.4",
+ "regexp.prototype.flags": "^1.4.3",
+ "side-channel": "^1.0.4",
+ "which-boxed-primitive": "^1.0.2",
"which-collection": "^1.0.1",
- "which-typed-array": "^1.1.2"
+ "which-typed-array": "^1.1.8"
}
},
"deep-extend": {
@@ -10375,6 +11818,23 @@
"integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
"dev": true
},
+ "default-require-extensions": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz",
+ "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==",
+ "dev": true,
+ "requires": {
+ "strip-bom": "^4.0.0"
+ },
+ "dependencies": {
+ "strip-bom": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
+ "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
+ "dev": true
+ }
+ }
+ },
"defaults": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz",
@@ -10522,9 +11982,9 @@
"dev": true
},
"dmd": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/dmd/-/dmd-6.1.0.tgz",
- "integrity": "sha512-0zQIJ873gay1scCTFZvHPWM9mVJBnaylB2NQDI8O9u8O32m00Jb6uxDKexZm8hjTRM7RiWe0FJ32pExHoXdwoQ==",
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/dmd/-/dmd-6.2.0.tgz",
+ "integrity": "sha512-uXWxLF1H7TkUAuoHK59/h/ts5cKavm2LnhrIgJWisip4BVzPoXavlwyoprFFn2CzcahKYgvkfaebS6oxzgflkg==",
"dev": true,
"requires": {
"array-back": "^6.2.2",
@@ -10532,7 +11992,7 @@
"common-sequence": "^2.0.2",
"file-set": "^4.0.2",
"handlebars": "^4.7.7",
- "marked": "^4.0.12",
+ "marked": "^4.2.3",
"object-get": "^2.1.1",
"reduce-flatten": "^3.0.1",
"reduce-unique": "^2.0.1",
@@ -10577,6 +12037,12 @@
"wcwidth": ">=1.0.1"
}
},
+ "electron-to-chromium": {
+ "version": "1.4.284",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz",
+ "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==",
+ "dev": true
+ },
"emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
@@ -10595,17 +12061,6 @@
"once": "^1.4.0"
}
},
- "enquirer": {
- "version": "2.3.6",
- "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
- "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
- "dev": true,
- "optional": true,
- "peer": true,
- "requires": {
- "ansi-colors": "^4.1.1"
- }
- },
"entities": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz",
@@ -10639,6 +12094,7 @@
"version": "1.19.5",
"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.5.tgz",
"integrity": "sha512-Aa2G2+Rd3b6kxEUKTF4TaW67czBLyAv3z7VOhYRU50YBx+bbsYZ9xQP4lMNazePuFlybXI0V4MruPos7qUo5fA==",
+ "dev": true,
"requires": {
"call-bind": "^1.0.2",
"es-to-primitive": "^1.2.1",
@@ -10681,12 +12137,19 @@
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
"integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+ "dev": true,
"requires": {
"is-callable": "^1.1.4",
"is-date-object": "^1.0.1",
"is-symbol": "^1.0.2"
}
},
+ "es6-error": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz",
+ "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==",
+ "dev": true
+ },
"es6-object-assign": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz",
@@ -10710,9 +12173,9 @@
"dev": true
},
"eslint": {
- "version": "8.27.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.27.0.tgz",
- "integrity": "sha512-0y1bfG2ho7mty+SiILVf9PfuRA49ek4Nc60Wmmu62QlobNR+CeXa4xXIJgcuwSQgZiWaPH+5BDsctpIW0PR/wQ==",
+ "version": "8.29.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.29.0.tgz",
+ "integrity": "sha512-isQ4EEiyUjZFbEKvEGJKKGBwXtvXX+zJbkVKCgTuB9t/+jUBcy8avhkEwWJecI15BkRkOYmvIM5ynbhRjEkoeg==",
"dev": true,
"requires": {
"@eslint/eslintrc": "^1.3.3",
@@ -10791,12 +12254,12 @@
"requires": {}
},
"eslint-plugin-jsdoc": {
- "version": "39.6.2",
- "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-39.6.2.tgz",
- "integrity": "sha512-dvgY/W7eUFoAIIiaWHERIMI61ZWqcz9YFjEeyTzdPlrZc3TY/3aZm5aB91NUoTLWYZmO/vFlYSuQi15tF7uE5A==",
+ "version": "39.6.4",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-39.6.4.tgz",
+ "integrity": "sha512-fskvdLCfwmPjHb6e+xNGDtGgbF8X7cDwMtVLAP2WwSf9Htrx68OAx31BESBM1FAwsN2HTQyYQq7m4aW4Q4Nlag==",
"dev": true,
"requires": {
- "@es-joy/jsdoccomment": "~0.36.0",
+ "@es-joy/jsdoccomment": "~0.36.1",
"comment-parser": "1.3.1",
"debug": "^4.3.4",
"escape-string-regexp": "^4.0.0",
@@ -10825,31 +12288,39 @@
}
},
"eslint-plugin-unicorn": {
- "version": "44.0.2",
- "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-44.0.2.tgz",
- "integrity": "sha512-GLIDX1wmeEqpGaKcnMcqRvMVsoabeF0Ton0EX4Th5u6Kmf7RM9WBl705AXFEsns56ESkEs0uyelLuUTvz9Tr0w==",
+ "version": "45.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-45.0.1.tgz",
+ "integrity": "sha512-tLnIw5oDJJc3ILYtlKtqOxPP64FZLTkZkgeuoN6e7x6zw+rhBjOxyvq2c7577LGxXuIhBYrwisZuKNqOOHp3BA==",
"dev": true,
"requires": {
"@babel/helper-validator-identifier": "^7.19.1",
- "ci-info": "^3.4.0",
+ "@eslint-community/eslint-utils": "^4.1.0",
+ "ci-info": "^3.6.1",
"clean-regexp": "^1.0.0",
- "eslint-utils": "^3.0.0",
"esquery": "^1.4.0",
"indent-string": "^4.0.0",
"is-builtin-module": "^3.2.0",
+ "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",
"safe-regex": "^2.1.1",
- "semver": "^7.3.7",
+ "semver": "^7.3.8",
"strip-indent": "^3.0.0"
},
"dependencies": {
"ci-info": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.5.0.tgz",
- "integrity": "sha512-yH4RezKOGlOhxkmhbeNuC4eYZKAUsEaGtBuBzDDP1eFUKiccDWzBABxBfOx31IDwDIXMTxWuwAxUGModvkbuVw==",
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.0.tgz",
+ "integrity": "sha512-2CpRNYmImPx+RXKLq6jko/L07phmS9I02TyqkcNU20GCF/GgaWvc58hPtjxDX8lPpkdwc9sNh72V9k00S7ezog==",
+ "dev": true
+ },
+ "jsesc": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz",
+ "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==",
"dev": true
}
}
@@ -11110,6 +12581,65 @@
"to-regex-range": "^5.0.1"
}
},
+ "find-cache-dir": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz",
+ "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==",
+ "dev": true,
+ "requires": {
+ "commondir": "^1.0.1",
+ "make-dir": "^3.0.2",
+ "pkg-dir": "^4.1.0"
+ },
+ "dependencies": {
+ "find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "requires": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ }
+ },
+ "locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
+ "requires": {
+ "p-locate": "^4.1.0"
+ }
+ },
+ "p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
+ "requires": {
+ "p-try": "^2.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dev": true,
+ "requires": {
+ "p-limit": "^2.2.0"
+ }
+ },
+ "pkg-dir": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+ "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+ "dev": true,
+ "requires": {
+ "find-up": "^4.0.0"
+ }
+ }
+ }
+ },
"find-replace": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz",
@@ -11247,10 +12777,23 @@
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz",
"integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w=="
},
- "foreach": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz",
- "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k="
+ "for-each": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
+ "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
+ "requires": {
+ "is-callable": "^1.1.3"
+ }
+ },
+ "foreground-child": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz",
+ "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==",
+ "dev": true,
+ "requires": {
+ "cross-spawn": "^7.0.0",
+ "signal-exit": "^3.0.2"
+ }
},
"form-data": {
"version": "4.0.0",
@@ -11262,10 +12805,16 @@
"mime-types": "^2.1.12"
}
},
+ "fromentries": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz",
+ "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==",
+ "dev": true
+ },
"fs-extra": {
- "version": "10.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
- "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.0.tgz",
+ "integrity": "sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==",
"requires": {
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
@@ -11275,7 +12824,7 @@
"fs-then-native": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/fs-then-native/-/fs-then-native-2.0.0.tgz",
- "integrity": "sha1-GaEk2U2QwiyOBF8ujdbr6jbUjGc=",
+ "integrity": "sha512-X712jAOaWXkemQCAmWeg5rOT2i+KOpWz1Z/txk/cW0qlOu2oQ9H61vc5w3X/iyuUEfq/OyaFJ78/cZAQD1/bgA==",
"dev": true
},
"fs.realpath": {
@@ -11300,6 +12849,12 @@
"resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
"integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ=="
},
+ "gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "dev": true
+ },
"get-caller-file": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
@@ -11312,15 +12867,21 @@
"dev": true
},
"get-intrinsic": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
- "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz",
+ "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==",
"requires": {
"function-bind": "^1.1.1",
"has": "^1.0.3",
- "has-symbols": "^1.0.1"
+ "has-symbols": "^1.0.3"
}
},
+ "get-package-type": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
+ "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
+ "dev": true
+ },
"get-stream": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
@@ -11331,6 +12892,7 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
"integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
+ "dev": true,
"requires": {
"call-bind": "^1.0.2",
"get-intrinsic": "^1.1.1"
@@ -11434,6 +12996,14 @@
"slash": "^3.0.0"
}
},
+ "gopd": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
+ "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
+ "requires": {
+ "get-intrinsic": "^1.1.3"
+ }
+ },
"got": {
"version": "9.6.0",
"resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz",
@@ -11553,6 +13123,24 @@
"resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz",
"integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw=="
},
+ "hasha": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz",
+ "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==",
+ "dev": true,
+ "requires": {
+ "is-stream": "^2.0.0",
+ "type-fest": "^0.8.0"
+ },
+ "dependencies": {
+ "type-fest": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
+ "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
+ "dev": true
+ }
+ }
+ },
"he": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
@@ -11640,6 +13228,12 @@
"integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
"dev": true
},
+ "html-escaper": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
+ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
+ "dev": true
+ },
"http-cache-semantics": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
@@ -11753,6 +13347,7 @@
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz",
"integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==",
+ "dev": true,
"requires": {
"get-intrinsic": "^1.1.0",
"has": "^1.0.3",
@@ -11922,7 +13517,8 @@
"is-negative-zero": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz",
- "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA=="
+ "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==",
+ "dev": true
},
"is-npm": {
"version": "5.0.0",
@@ -11977,6 +13573,7 @@
"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"
}
@@ -12003,14 +13600,14 @@
}
},
"is-typed-array": {
- "version": "1.1.8",
- "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.8.tgz",
- "integrity": "sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA==",
+ "version": "1.1.10",
+ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz",
+ "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==",
"requires": {
"available-typed-arrays": "^1.0.5",
"call-bind": "^1.0.2",
- "es-abstract": "^1.18.5",
- "foreach": "^2.0.5",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
"has-tostringtag": "^1.0.0"
}
},
@@ -12033,6 +13630,7 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
"integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
+ "dev": true,
"requires": {
"call-bind": "^1.0.2"
}
@@ -12046,6 +13644,12 @@
"get-intrinsic": "^1.1.1"
}
},
+ "is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+ "dev": true
+ },
"is-yarn-global": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz",
@@ -12062,6 +13666,98 @@
"integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
"dev": true
},
+ "istanbul-lib-coverage": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz",
+ "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==",
+ "dev": true
+ },
+ "istanbul-lib-hook": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz",
+ "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==",
+ "dev": true,
+ "requires": {
+ "append-transform": "^2.0.0"
+ }
+ },
+ "istanbul-lib-instrument": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz",
+ "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==",
+ "dev": true,
+ "requires": {
+ "@babel/core": "^7.7.5",
+ "@istanbuljs/schema": "^0.1.2",
+ "istanbul-lib-coverage": "^3.0.0",
+ "semver": "^6.3.0"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true
+ }
+ }
+ },
+ "istanbul-lib-processinfo": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz",
+ "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==",
+ "dev": true,
+ "requires": {
+ "archy": "^1.0.0",
+ "cross-spawn": "^7.0.3",
+ "istanbul-lib-coverage": "^3.2.0",
+ "p-map": "^3.0.0",
+ "rimraf": "^3.0.0",
+ "uuid": "^8.3.2"
+ },
+ "dependencies": {
+ "p-map": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz",
+ "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==",
+ "dev": true,
+ "requires": {
+ "aggregate-error": "^3.0.0"
+ }
+ }
+ }
+ },
+ "istanbul-lib-report": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
+ "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==",
+ "dev": true,
+ "requires": {
+ "istanbul-lib-coverage": "^3.0.0",
+ "make-dir": "^3.0.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "istanbul-lib-source-maps": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz",
+ "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==",
+ "dev": true,
+ "requires": {
+ "debug": "^4.1.1",
+ "istanbul-lib-coverage": "^3.0.0",
+ "source-map": "^0.6.1"
+ }
+ },
+ "istanbul-reports": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz",
+ "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==",
+ "dev": true,
+ "requires": {
+ "html-escaper": "^2.0.0",
+ "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",
@@ -12093,25 +13789,25 @@
}
},
"jsdoc": {
- "version": "3.6.10",
- "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.6.10.tgz",
- "integrity": "sha512-IdQ8ppSo5LKZ9o3M+LKIIK8i00DIe5msDvG3G81Km+1dhy0XrOWD0Ji8H61ElgyEj/O9KRLokgKbAM9XX9CJAg==",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.0.tgz",
+ "integrity": "sha512-tzTgkklbWKrlaQL2+e3NNgLcZu3NaK2vsHRx7tyHQ+H5jcB9Gx0txSd2eJWlMC/xU1+7LQu4s58Ry0RkuaEQVg==",
"dev": true,
"requires": {
"@babel/parser": "^7.9.4",
+ "@jsdoc/salty": "^0.2.1",
"@types/markdown-it": "^12.2.3",
"bluebird": "^3.7.2",
"catharsis": "^0.9.0",
"escape-string-regexp": "^2.0.0",
"js2xmlparser": "^4.0.2",
- "klaw": "^4.0.1",
+ "klaw": "^3.0.0",
"markdown-it": "^12.3.2",
"markdown-it-anchor": "^8.4.1",
"marked": "^4.0.10",
"mkdirp": "^1.0.4",
"requizzle": "^0.2.3",
"strip-json-comments": "^3.1.0",
- "taffydb": "2.6.2",
"underscore": "~1.13.2"
},
"dependencies": {
@@ -12124,9 +13820,9 @@
}
},
"jsdoc-api": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/jsdoc-api/-/jsdoc-api-7.1.1.tgz",
- "integrity": "sha512-0pkuPCzVXiqsDAsVrNFXCkHzlyNepBIDVtwwehry4RJAnZmXtlAz7rh8F9FRz53u3NeynGbex+bpYWwi8lE66A==",
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/jsdoc-api/-/jsdoc-api-8.0.0.tgz",
+ "integrity": "sha512-Rnhor0suB1Ds1abjmFkFfKeD+kSMRN9oHMTMZoJVUrmtCGDwXty+sWMA9sa4xbe4UyxuPjhC7tavZ40mDKK6QQ==",
"dev": true,
"requires": {
"array-back": "^6.2.2",
@@ -12134,38 +13830,38 @@
"collect-all": "^1.0.4",
"file-set": "^4.0.2",
"fs-then-native": "^2.0.0",
- "jsdoc": "^3.6.10",
+ "jsdoc": "^4.0.0",
"object-to-spawn-args": "^2.0.1",
"temp-path": "^1.0.0",
"walk-back": "^5.1.0"
}
},
"jsdoc-parse": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/jsdoc-parse/-/jsdoc-parse-6.1.0.tgz",
- "integrity": "sha512-n/hDGQJa69IBun1yZAjqzV4gVR41+flZ3bIlm9fKvNe2Xjsd1/+zCo2+R9ls8LxtePgIWbpA1jU7xkB2lRdLLg==",
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/jsdoc-parse/-/jsdoc-parse-6.2.0.tgz",
+ "integrity": "sha512-Afu1fQBEb7QHt6QWX/6eUWvYHJofB90Fjx7FuJYF7mnG9z5BkAIpms1wsnvYLytfmqpEENHs/fax9p8gvMj7dw==",
"dev": true,
"requires": {
"array-back": "^6.2.2",
"lodash.omit": "^4.5.0",
"lodash.pick": "^4.4.0",
"reduce-extract": "^1.0.0",
- "sort-array": "^4.1.4",
+ "sort-array": "^4.1.5",
"test-value": "^3.0.0"
}
},
"jsdoc-to-markdown": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/jsdoc-to-markdown/-/jsdoc-to-markdown-7.1.1.tgz",
- "integrity": "sha512-CI86d63xAVNO+ENumWwmJ034lYe5iGU5GwjtTA11EuphP9tpnoi4hrKgR/J8uME0D+o4KUpVfwX1fjZhc8dEtg==",
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/jsdoc-to-markdown/-/jsdoc-to-markdown-8.0.0.tgz",
+ "integrity": "sha512-2FQvYkg491+FP6s15eFlgSSWs69CvQrpbABGYBtvAvGWy/lWo8IKKToarT283w59rQFrpcjHl3YdhHCa3l7gXg==",
"dev": true,
"requires": {
"array-back": "^6.2.2",
"command-line-tool": "^0.8.0",
"config-master": "^3.1.0",
- "dmd": "^6.1.0",
- "jsdoc-api": "^7.1.1",
- "jsdoc-parse": "^6.1.0",
+ "dmd": "^6.2.0",
+ "jsdoc-api": "^8.0.0",
+ "jsdoc-parse": "^6.2.0",
"walk-back": "^5.1.0"
}
},
@@ -12253,10 +13949,13 @@
"dev": true
},
"klaw": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/klaw/-/klaw-4.0.1.tgz",
- "integrity": "sha512-pgsE40/SvC7st04AHiISNewaIMUbY5V/K8b21ekiPiFoYs/EYSdsGa+FJArB1d441uq4Q8zZyIxvAzkGNlBdRw==",
- "dev": true
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz",
+ "integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.9"
+ }
},
"kuler": {
"version": "2.0.0",
@@ -12282,9 +13981,9 @@
}
},
"lilconfig": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz",
- "integrity": "sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==",
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz",
+ "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==",
"dev": true
},
"lines-and-columns": {
@@ -12303,38 +14002,38 @@
}
},
"lint-staged": {
- "version": "13.0.3",
- "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.0.3.tgz",
- "integrity": "sha512-9hmrwSCFroTSYLjflGI8Uk+GWAwMB4OlpU4bMJEAT5d/llQwtYKoim4bLOyLCuWFAhWEupE0vkIFqtw/WIsPug==",
+ "version": "13.1.0",
+ "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.1.0.tgz",
+ "integrity": "sha512-pn/sR8IrcF/T0vpWLilih8jmVouMlxqXxKuAojmbiGX5n/gDnz+abdPptlj0vYnbfE0SQNl3CY/HwtM0+yfOVQ==",
"dev": true,
"requires": {
"cli-truncate": "^3.1.0",
- "colorette": "^2.0.17",
- "commander": "^9.3.0",
+ "colorette": "^2.0.19",
+ "commander": "^9.4.1",
"debug": "^4.3.4",
"execa": "^6.1.0",
- "lilconfig": "2.0.5",
- "listr2": "^4.0.5",
+ "lilconfig": "2.0.6",
+ "listr2": "^5.0.5",
"micromatch": "^4.0.5",
"normalize-path": "^3.0.0",
"object-inspect": "^1.12.2",
"pidtree": "^0.6.0",
"string-argv": "^0.3.1",
- "yaml": "^2.1.1"
+ "yaml": "^2.1.3"
}
},
"listr2": {
- "version": "4.0.5",
- "resolved": "https://registry.npmjs.org/listr2/-/listr2-4.0.5.tgz",
- "integrity": "sha512-juGHV1doQdpNT3GSTs9IUN43QJb7KHdF9uqg7Vufs/tG9VTzpFphqF4pm/ICdAABGQxsyNn9CiYA3StkI6jpwA==",
+ "version": "5.0.6",
+ "resolved": "https://registry.npmjs.org/listr2/-/listr2-5.0.6.tgz",
+ "integrity": "sha512-u60KxKBy1BR2uLJNTWNptzWQ1ob/gjMzIJPZffAENzpZqbMZ/5PrXXOomDcevIS/+IB7s1mmCEtSlT2qHWMqag==",
"dev": true,
"requires": {
"cli-truncate": "^2.1.0",
- "colorette": "^2.0.16",
+ "colorette": "^2.0.19",
"log-update": "^4.0.0",
"p-map": "^4.0.0",
"rfdc": "^1.3.0",
- "rxjs": "^7.5.5",
+ "rxjs": "^7.5.7",
"through": "^2.3.8",
"wrap-ansi": "^7.0.0"
},
@@ -12448,6 +14147,12 @@
"integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
"dev": true
},
+ "lodash.flattendeep": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz",
+ "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==",
+ "dev": true
+ },
"lodash.merge": {
"version": "4.6.2",
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
@@ -12457,7 +14162,7 @@
"lodash.omit": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.omit/-/lodash.omit-4.5.0.tgz",
- "integrity": "sha1-brGa5aHuHdnfC5aeZs4Lf6MLXmA=",
+ "integrity": "sha512-XeqSp49hNGmlkj2EJlfrQFIzQ6lXdNro9sddtQzcJY8QaoC2GO0DT7xaIokHeyM+mIT0mPMlPvkYzg2xCuHdZg==",
"dev": true
},
"lodash.padend": {
@@ -12469,7 +14174,7 @@
"lodash.pick": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz",
- "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=",
+ "integrity": "sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==",
"dev": true
},
"log-symbols": {
@@ -12674,22 +14379,22 @@
}
},
"markdown-it-anchor": {
- "version": "8.6.2",
- "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.2.tgz",
- "integrity": "sha512-JNaekTlIwwyYGBN3zifZDxgz4bSL8sbEj58fdTZGmPSMMGXBZapFjcZk2I33Jy79c1fvCKHpF7MA/67FOTjvzA==",
+ "version": "8.6.5",
+ "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.5.tgz",
+ "integrity": "sha512-PI1qEHHkTNWT+X6Ip9w+paonfIQ+QZP9sCeMYi47oqhH+EsW8CrJ8J7CzV19QVOj6il8ATGbK2nTECj22ZHGvQ==",
"dev": true,
"requires": {}
},
"marked": {
- "version": "4.0.14",
- "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.14.tgz",
- "integrity": "sha512-HL5sSPE/LP6U9qKgngIIPTthuxC0jrfxpYMZ3LdGDD3vTnLs59m2Z7r6+LNDR3ToqEQdkKd6YaaEfJhodJmijQ==",
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/marked/-/marked-4.2.3.tgz",
+ "integrity": "sha512-slWRdJkbTZ+PjkyJnE30Uid64eHwbwa1Q25INCAYfZlK4o6ylagBy/Le9eWntqJFoFT93ikUKMv47GZ4gTwHkw==",
"dev": true
},
"mdurl": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz",
- "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=",
+ "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==",
"dev": true
},
"memorystream": {
@@ -13032,6 +14737,21 @@
"lodash": "^4.17.21"
}
},
+ "node-preload": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz",
+ "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==",
+ "dev": true,
+ "requires": {
+ "process-on-spawn": "^1.0.0"
+ }
+ },
+ "node-releases": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz",
+ "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==",
+ "dev": true
+ },
"node-sql-parser": {
"version": "4.5.1",
"resolved": "https://registry.npmjs.org/node-sql-parser/-/node-sql-parser-4.5.1.tgz",
@@ -13329,6 +15049,158 @@
}
}
},
+ "nyc": {
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz",
+ "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==",
+ "dev": true,
+ "requires": {
+ "@istanbuljs/load-nyc-config": "^1.0.0",
+ "@istanbuljs/schema": "^0.1.2",
+ "caching-transform": "^4.0.0",
+ "convert-source-map": "^1.7.0",
+ "decamelize": "^1.2.0",
+ "find-cache-dir": "^3.2.0",
+ "find-up": "^4.1.0",
+ "foreground-child": "^2.0.0",
+ "get-package-type": "^0.1.0",
+ "glob": "^7.1.6",
+ "istanbul-lib-coverage": "^3.0.0",
+ "istanbul-lib-hook": "^3.0.0",
+ "istanbul-lib-instrument": "^4.0.0",
+ "istanbul-lib-processinfo": "^2.0.2",
+ "istanbul-lib-report": "^3.0.0",
+ "istanbul-lib-source-maps": "^4.0.0",
+ "istanbul-reports": "^3.0.2",
+ "make-dir": "^3.0.0",
+ "node-preload": "^0.2.1",
+ "p-map": "^3.0.0",
+ "process-on-spawn": "^1.0.0",
+ "resolve-from": "^5.0.0",
+ "rimraf": "^3.0.0",
+ "signal-exit": "^3.0.2",
+ "spawn-wrap": "^2.0.0",
+ "test-exclude": "^6.0.0",
+ "yargs": "^15.0.2"
+ },
+ "dependencies": {
+ "camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "dev": true
+ },
+ "cliui": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
+ "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
+ "dev": true,
+ "requires": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^6.2.0"
+ }
+ },
+ "find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "requires": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ }
+ },
+ "locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
+ "requires": {
+ "p-locate": "^4.1.0"
+ }
+ },
+ "p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
+ "requires": {
+ "p-try": "^2.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dev": true,
+ "requires": {
+ "p-limit": "^2.2.0"
+ }
+ },
+ "p-map": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz",
+ "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==",
+ "dev": true,
+ "requires": {
+ "aggregate-error": "^3.0.0"
+ }
+ },
+ "resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "dev": true
+ },
+ "wrap-ansi": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+ "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ }
+ },
+ "y18n": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
+ "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
+ "dev": true
+ },
+ "yargs": {
+ "version": "15.4.1",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
+ "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
+ "dev": true,
+ "requires": {
+ "cliui": "^6.0.0",
+ "decamelize": "^1.2.0",
+ "find-up": "^4.1.0",
+ "get-caller-file": "^2.0.1",
+ "require-directory": "^2.1.1",
+ "require-main-filename": "^2.0.0",
+ "set-blocking": "^2.0.0",
+ "string-width": "^4.2.0",
+ "which-module": "^2.0.0",
+ "y18n": "^4.0.0",
+ "yargs-parser": "^18.1.2"
+ }
+ },
+ "yargs-parser": {
+ "version": "18.1.3",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
+ "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
+ "dev": true,
+ "requires": {
+ "camelcase": "^5.0.0",
+ "decamelize": "^1.2.0"
+ }
+ }
+ }
+ },
"object-get": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/object-get/-/object-get-2.1.1.tgz",
@@ -13361,13 +15233,13 @@
"dev": true
},
"object.assign": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
- "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
+ "version": "4.1.4",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz",
+ "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==",
"requires": {
- "call-bind": "^1.0.0",
- "define-properties": "^1.1.3",
- "has-symbols": "^1.0.1",
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "has-symbols": "^1.0.3",
"object-keys": "^1.1.1"
}
},
@@ -13482,6 +15354,18 @@
"resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
"integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="
},
+ "package-hash": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz",
+ "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.15",
+ "hasha": "^5.0.0",
+ "lodash.flattendeep": "^4.4.0",
+ "release-zalgo": "^1.0.0"
+ }
+ },
"package-json": {
"version": "6.5.0",
"resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz",
@@ -13690,9 +15574,9 @@
"integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA=="
},
"prettier": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz",
- "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g=="
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.0.tgz",
+ "integrity": "sha512-9Lmg8hTFZKG0Asr/kW9Bp8tJjRVluO8EJQVfY2T7FMw9T5jy4I/Uvx0Rca/XWf50QQ1/SS48+6IJWnrb+2yemA=="
},
"prettier-eslint": {
"version": "15.0.1",
@@ -13771,6 +15655,15 @@
}
}
},
+ "process-on-spawn": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz",
+ "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==",
+ "dev": true,
+ "requires": {
+ "fromentries": "^1.2.0"
+ }
+ },
"pump": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
@@ -14004,7 +15897,7 @@
"reduce-extract": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/reduce-extract/-/reduce-extract-1.0.0.tgz",
- "integrity": "sha1-Z/I4W+2mUGG19fQxJmLosIDKFSU=",
+ "integrity": "sha512-QF8vjWx3wnRSL5uFMyCjDeDc5EBMiryoT9tz94VvgjKfzecHAVnqmXAwQDcr7X4JmLc2cjkjFGCVzhMqDjgR9g==",
"dev": true,
"requires": {
"test-value": "^1.0.1"
@@ -14013,7 +15906,7 @@
"array-back": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz",
- "integrity": "sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs=",
+ "integrity": "sha512-1WxbZvrmyhkNoeYcizokbmh5oiOCIfyvGtcqbK3Ls1v1fKcquzxnQSceOx6tzq7jmai2kFLWIpGND2cLhH6TPw==",
"dev": true,
"requires": {
"typical": "^2.6.0"
@@ -14022,7 +15915,7 @@
"test-value": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/test-value/-/test-value-1.1.0.tgz",
- "integrity": "sha1-oJE29y7AQ9J8iTcHwrFZv6196T8=",
+ "integrity": "sha512-wrsbRo7qP+2Je8x8DsK8ovCGyxe3sYfQwOraIY/09A2gFXU9DYKiTF14W4ki/01AEh56kMzAmlj9CaHGDDUBJA==",
"dev": true,
"requires": {
"array-back": "^1.0.2",
@@ -14046,7 +15939,7 @@
"reduce-without": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/reduce-without/-/reduce-without-1.0.1.tgz",
- "integrity": "sha1-aK0OrRGFXJo31OglbBW7+Hly/Iw=",
+ "integrity": "sha512-zQv5y/cf85sxvdrKPlfcRzlDn/OqKFThNimYmsS3flmkioKvkUGn2Qg9cJVoQiEvdxFGLE0MQER/9fZ9sUqdxg==",
"dev": true,
"requires": {
"test-value": "^2.0.0"
@@ -14055,7 +15948,7 @@
"array-back": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz",
- "integrity": "sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs=",
+ "integrity": "sha512-1WxbZvrmyhkNoeYcizokbmh5oiOCIfyvGtcqbK3Ls1v1fKcquzxnQSceOx6tzq7jmai2kFLWIpGND2cLhH6TPw==",
"dev": true,
"requires": {
"typical": "^2.6.0"
@@ -14064,7 +15957,7 @@
"test-value": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/test-value/-/test-value-2.1.0.tgz",
- "integrity": "sha1-Edpv9nDzRxpztiXKTz/c97t0gpE=",
+ "integrity": "sha512-+1epbAxtKeXttkGFMTX9H42oqzOTufR1ceCF+GYA5aOmvaPq9wd4PUS8329fn2RRLGNeUkgRLnVpycjx8DsO2w==",
"dev": true,
"requires": {
"array-back": "^1.0.3",
@@ -14111,6 +16004,32 @@
"rc": "^1.2.8"
}
},
+ "regjsparser": {
+ "version": "0.9.1",
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz",
+ "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==",
+ "dev": true,
+ "requires": {
+ "jsesc": "~0.5.0"
+ },
+ "dependencies": {
+ "jsesc": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
+ "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==",
+ "dev": true
+ }
+ }
+ },
+ "release-zalgo": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz",
+ "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==",
+ "dev": true,
+ "requires": {
+ "es6-error": "^4.0.1"
+ }
+ },
"require-directory": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
@@ -14121,6 +16040,12 @@
"resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
"integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="
},
+ "require-main-filename": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
+ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
+ "dev": true
+ },
"require-package-name": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/require-package-name/-/require-package-name-2.0.1.tgz",
@@ -14134,12 +16059,12 @@
"dev": true
},
"requizzle": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.3.tgz",
- "integrity": "sha512-YanoyJjykPxGHii0fZP0uUPEXpvqfBDxWV7s6GKAiiOsiqhX6vHNyW3Qzdmqp/iq/ExbhaGbVrjB4ruEVSM4GQ==",
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.4.tgz",
+ "integrity": "sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw==",
"dev": true,
"requires": {
- "lodash": "^4.17.14"
+ "lodash": "^4.17.21"
}
},
"resolve": {
@@ -14217,9 +16142,9 @@
}
},
"rxjs": {
- "version": "7.5.5",
- "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.5.tgz",
- "integrity": "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==",
+ "version": "7.6.0",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.6.0.tgz",
+ "integrity": "sha512-DDa7d8TFNUalGC9VqXvQ1euWNN7sc63TrUCuM9J998+ViviahMIjKSOU7rfcgFOF+FCD71BhDRv4hrFz+ImDLQ==",
"requires": {
"tslib": "^2.1.0"
}
@@ -14306,6 +16231,12 @@
"randombytes": "^2.1.0"
}
},
+ "set-blocking": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+ "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==",
+ "dev": true
+ },
"sfmc-sdk": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/sfmc-sdk/-/sfmc-sdk-0.6.1.tgz",
@@ -14353,9 +16284,9 @@
"integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="
},
"simple-git": {
- "version": "3.14.1",
- "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.14.1.tgz",
- "integrity": "sha512-1ThF4PamK9wBORVGMK9HK5si4zoGS2GpRO7tkAFObA4FZv6dKaCVHLQT+8zlgiBm6K2h+wEU9yOaFCu/SR3OyA==",
+ "version": "3.15.1",
+ "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.15.1.tgz",
+ "integrity": "sha512-73MVa5984t/JP4JcQt0oZlKGr42ROYWC3BcUZfuHtT3IHKPspIvL0cZBnvPXF7LL3S/qVeVHVdYYmJ3LOTw4Rg==",
"requires": {
"@kwsites/file-exists": "^1.1.1",
"@kwsites/promise-deferred": "^1.1.1",
@@ -14443,6 +16374,20 @@
"integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
"dev": true
},
+ "spawn-wrap": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz",
+ "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==",
+ "dev": true,
+ "requires": {
+ "foreground-child": "^2.0.0",
+ "is-windows": "^1.0.2",
+ "make-dir": "^3.0.0",
+ "rimraf": "^3.0.0",
+ "signal-exit": "^3.0.2",
+ "which": "^2.0.1"
+ }
+ },
"spdx-correct": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
@@ -14504,7 +16449,7 @@
"stream-connect": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/stream-connect/-/stream-connect-1.0.2.tgz",
- "integrity": "sha1-GLyB8u2zW4tdmoAJIAqYUxRCipc=",
+ "integrity": "sha512-68Kl+79cE0RGKemKkhxTSg8+6AGrqBt+cbZAXevg2iJ6Y3zX4JhA/sZeGzLpxW9cXhmqAcE7KnJCisUmIUfnFQ==",
"dev": true,
"requires": {
"array-back": "^1.0.2"
@@ -14513,7 +16458,7 @@
"array-back": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz",
- "integrity": "sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs=",
+ "integrity": "sha512-1WxbZvrmyhkNoeYcizokbmh5oiOCIfyvGtcqbK3Ls1v1fKcquzxnQSceOx6tzq7jmai2kFLWIpGND2cLhH6TPw==",
"dev": true,
"requires": {
"typical": "^2.6.0"
@@ -14573,6 +16518,7 @@
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz",
"integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==",
+ "dev": true,
"requires": {
"call-bind": "^1.0.2",
"define-properties": "^1.1.3"
@@ -14582,6 +16528,7 @@
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz",
"integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==",
+ "dev": true,
"requires": {
"call-bind": "^1.0.2",
"define-properties": "^1.1.3"
@@ -14672,18 +16619,23 @@
}
}
},
- "taffydb": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/taffydb/-/taffydb-2.6.2.tgz",
- "integrity": "sha1-fLy2S1oUG2ou/CxdLGe04VCyomg=",
- "dev": true
- },
"temp-path": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/temp-path/-/temp-path-1.0.0.tgz",
- "integrity": "sha1-JLFUOXOrRCiW2a02fdnL2/r+kYs=",
+ "integrity": "sha512-TvmyH7kC6ZVTYkqCODjJIbgvu0FKiwQpZ4D1aknE7xpcDf/qEOB8KZEK5ef2pfbVoiBhNWs3yx4y+ESMtNYmlg==",
"dev": true
},
+ "test-exclude": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
+ "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
+ "dev": true,
+ "requires": {
+ "@istanbuljs/schema": "^0.1.2",
+ "glob": "^7.1.4",
+ "minimatch": "^3.0.4"
+ }
+ },
"test-value": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/test-value/-/test-value-3.0.0.tgz",
@@ -14845,9 +16797,9 @@
"dev": true
},
"uglify-js": {
- "version": "3.15.4",
- "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.15.4.tgz",
- "integrity": "sha512-vMOPGDuvXecPs34V74qDKk4iJ/SN4vL3Ow/23ixafENYvtrNvtbcgUeugTcUGRGsOF/5fU8/NYSL5Hyb3l1OJA==",
+ "version": "3.17.4",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz",
+ "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==",
"dev": true,
"optional": true
},
@@ -14855,6 +16807,7 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
"integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
+ "dev": true,
"requires": {
"call-bind": "^1.0.2",
"has-bigints": "^1.0.2",
@@ -14863,9 +16816,9 @@
}
},
"underscore": {
- "version": "1.13.3",
- "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.3.tgz",
- "integrity": "sha512-QvjkYpiD+dJJraRA8+dGAU4i7aBbb2s0S3jA45TFOvg2VgqvdCDd/3N6CqA8gluk1W91GLoXg5enMUx560QzuA==",
+ "version": "1.13.6",
+ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz",
+ "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==",
"dev": true
},
"unique-string": {
@@ -14881,6 +16834,16 @@
"resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
"integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ=="
},
+ "update-browserslist-db": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz",
+ "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==",
+ "dev": true,
+ "requires": {
+ "escalade": "^3.1.1",
+ "picocolors": "^1.0.0"
+ }
+ },
"update-notifier": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz",
@@ -14937,6 +16900,12 @@
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
},
+ "uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "dev": true
+ },
"validate-npm-package-license": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
@@ -15008,6 +16977,12 @@
"is-weakset": "^2.0.1"
}
},
+ "which-module": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
+ "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==",
+ "dev": true
+ },
"which-pm": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/which-pm/-/which-pm-2.0.0.tgz",
@@ -15019,16 +16994,16 @@
}
},
"which-typed-array": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.7.tgz",
- "integrity": "sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw==",
+ "version": "1.1.9",
+ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz",
+ "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==",
"requires": {
"available-typed-arrays": "^1.0.5",
"call-bind": "^1.0.2",
- "es-abstract": "^1.18.5",
- "foreach": "^2.0.5",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
"has-tostringtag": "^1.0.0",
- "is-typed-array": "^1.1.7"
+ "is-typed-array": "^1.1.10"
}
},
"widest-line": {
@@ -15076,7 +17051,7 @@
"wordwrap": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
- "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+ "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==",
"dev": true
},
"wordwrapjs": {
@@ -15157,9 +17132,9 @@
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
},
"yaml": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.1.1.tgz",
- "integrity": "sha512-o96x3OPo8GjWeSLF+wOAbrPfhFOGY0W00GNaxCDv+9hkcDJEnev1yh8S7pgHF0ik6zc8sQLuL8hjHjJULZp8bw==",
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.1.3.tgz",
+ "integrity": "sha512-AacA8nRULjKMX2DvWvOAdBZMOfQlypSFkjcOcu9FalllIDJ1kvlREzcdIZmidQUqqeMv7jorHjq2HlLv/+c2lg==",
"dev": true
},
"yargs": {
diff --git a/package.json b/package.json
index 2cc94c2e7..c6bc4400c 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "mcdev",
- "version": "4.1.12",
+ "version": "4.2.0",
"description": "Accenture Salesforce Marketing Cloud DevTools",
"author": "Accenture: joern.berkefeld, douglas.midgley, robert.zimmermann, maciej.barnas",
"license": "MIT",
@@ -37,24 +37,29 @@
"lint-test": "eslint test/**/*.js",
"upgrade": "npm-check --update",
"manual-prepare": "husky install",
- "test": "mocha"
+ "test": "mocha",
+ "coverage": "nyc mocha",
+ "version:major": "npm version --no-commit-hooks major",
+ "version:minor": "npm version --no-commit-hooks minor",
+ "version:patch": "npm version --no-commit-hooks patch"
},
"dependencies": {
+ "beauty-amp-core": "0.3.7",
"cli-progress": "3.11.2",
"command-exists": "1.2.9",
"conf": "10.2.0",
"console.table": "0.10.0",
- "deep-equal": "2.0.5",
- "fs-extra": "10.1.0",
+ "deep-equal": "2.1.0",
+ "fs-extra": "11.1.0",
"inquirer": "8.2.2",
"json-to-table": "4.2.1",
"mustache": "4.2.0",
"p-limit": "3.1.0",
- "prettier": "2.7.1",
+ "prettier": "2.8.0",
"prettier-plugin-sql": "0.12.1",
"semver": "7.3.8",
"sfmc-sdk": "0.6.1",
- "simple-git": "3.14.1",
+ "simple-git": "3.15.1",
"toposort": "2.0.2",
"update-notifier": "5.1.0",
"winston": "3.8.2",
@@ -63,21 +68,23 @@
"devDependencies": {
"assert": "2.0.0",
"axios-mock-adapter": "1.21.2",
- "chai": "4.3.6",
- "eslint": "8.27.0",
+ "chai": "4.3.7",
+ "chai-files": "1.4.0",
+ "eslint": "8.29.0",
"eslint-config-prettier": "8.5.0",
"eslint-config-ssjs": "1.1.11",
- "eslint-plugin-jsdoc": "39.6.2",
+ "eslint-plugin-jsdoc": "39.6.4",
"eslint-plugin-mocha": "10.1.0",
"eslint-plugin-prettier": "4.2.1",
- "eslint-plugin-unicorn": "44.0.2",
+ "eslint-plugin-unicorn": "45.0.1",
"husky": "8.0.1",
- "jsdoc-to-markdown": "7.1.1",
- "lint-staged": "13.0.3",
+ "jsdoc-to-markdown": "8.0.0",
+ "lint-staged": "13.1.0",
"mocha": "10.1.0",
"mock-fs": "5.2.0",
"npm-check": "6.0.1",
"npm-run-all": "4.1.5",
+ "nyc": "15.1.0",
"prettier-eslint": "15.0.1"
},
"optionalDependencies": {
diff --git a/test/dataExtension.test.js b/test/dataExtension.test.js
index ee5f066a4..6e3c1320d 100644
--- a/test/dataExtension.test.js
+++ b/test/dataExtension.test.js
@@ -23,8 +23,8 @@ describe('dataExtension', () => {
'only one dataExtension expected'
);
assert.deepEqual(
- await testUtils.getActualFile('childBU_dataextension_test', 'dataExtension'),
- await testUtils.getExpectedFile('9999999', 'dataExtension', 'retrieve'),
+ await testUtils.getActualJson('childBU_dataextension_test', 'dataExtension'),
+ await testUtils.getExpectedJson('9999999', 'dataExtension', 'retrieve'),
'returned metadata was not equal expected'
);
@@ -37,6 +37,9 @@ describe('dataExtension', () => {
});
});
describe('Deploy ================', () => {
+ beforeEach(() => {
+ testUtils.mockSetup(true);
+ });
it('Should create & upsert a data extension', async () => {
// WHEN
await handler.deploy('testInstance/testBU', ['dataExtension']);
@@ -49,19 +52,21 @@ describe('dataExtension', () => {
2,
'two data extensions expected'
);
+ // insert
assert.deepEqual(
- await testUtils.getActualFile('testDataExtension', 'dataExtension'),
- await testUtils.getExpectedFile('9999999', 'dataExtension', 'create'),
+ await testUtils.getActualJson('testDataExtension', 'dataExtension'),
+ await testUtils.getExpectedJson('9999999', 'dataExtension', 'create'),
'returned metadata was not equal expected for create'
);
+ // update
assert.deepEqual(
- await testUtils.getActualFile('childBU_dataextension_test', 'dataExtension'),
- await testUtils.getExpectedFile('9999999', 'dataExtension', 'update'),
+ await testUtils.getActualJson('childBU_dataextension_test', 'dataExtension'),
+ await testUtils.getExpectedJson('9999999', 'dataExtension', 'update'),
'returned metadata was not equal expected for update'
);
assert.equal(
Object.values(testUtils.getAPIHistory()).flat().length,
- 11,
+ 12,
'Unexpected number of requests made'
);
return;
@@ -74,7 +79,7 @@ describe('dataExtension', () => {
'testInstance/testBU',
'dataExtension',
['childBU_dataextension_test'],
- 'testMarket'
+ 'testSourceMarket'
);
// WHEN
@@ -84,8 +89,11 @@ describe('dataExtension', () => {
'only one dataExtension expected'
);
assert.deepEqual(
- await testUtils.getActualTemplate('childBU_dataextension_test', 'dataExtension'),
- await testUtils.getExpectedFile('9999999', 'dataExtension', 'template'),
+ await testUtils.getActualTemplateJson(
+ 'childBU_dataextension_test',
+ 'dataExtension'
+ ),
+ await testUtils.getExpectedJson('9999999', 'dataExtension', 'template'),
'returned template was not equal expected'
);
// THEN
@@ -93,11 +101,14 @@ describe('dataExtension', () => {
'testInstance/testBU',
'dataExtension',
'childBU_dataextension_test',
- 'testMarket'
+ 'testTargetMarket'
);
assert.deepEqual(
- await testUtils.getActualDeployFile('childBU_dataextension_test', 'dataExtension'),
- await testUtils.getExpectedFile('9999999', 'dataExtension', 'build'),
+ await testUtils.getActualDeployJson(
+ 'childBU_dataextension_testTarget',
+ 'dataExtension'
+ ),
+ await testUtils.getExpectedJson('9999999', 'dataExtension', 'build'),
'returned deployment file was not equal expected'
);
assert.equal(
@@ -115,7 +126,7 @@ describe('dataExtension', () => {
'testInstance/testBU',
'dataExtension',
['childBU_dataextension_test'],
- 'testMarket'
+ 'testSourceMarket'
);
// WHEN
assert.equal(
@@ -124,8 +135,11 @@ describe('dataExtension', () => {
'only one dataExtension expected'
);
assert.deepEqual(
- await testUtils.getActualTemplate('childBU_dataextension_test', 'dataExtension'),
- await testUtils.getExpectedFile('9999999', 'dataExtension', 'template'),
+ await testUtils.getActualTemplateJson(
+ 'childBU_dataextension_test',
+ 'dataExtension'
+ ),
+ await testUtils.getExpectedJson('9999999', 'dataExtension', 'template'),
'returned template was not equal expected'
);
// THEN
@@ -133,12 +147,15 @@ describe('dataExtension', () => {
'testInstance/testBU',
'dataExtension',
'childBU_dataextension_test',
- 'testMarket'
+ 'testTargetMarket'
);
assert.deepEqual(
- await testUtils.getActualDeployFile('childBU_dataextension_test', 'dataExtension'),
- await testUtils.getExpectedFile('9999999', 'dataExtension', 'build'),
+ await testUtils.getActualDeployJson(
+ 'childBU_dataextension_testTarget',
+ 'dataExtension'
+ ),
+ await testUtils.getExpectedJson('9999999', 'dataExtension', 'build'),
'returned deployment file was not equal expected'
);
assert.equal(
diff --git a/test/mockRoot/.mcdevrc.json b/test/mockRoot/.mcdevrc.json
index 7cc7db444..c67fae6db 100644
--- a/test/mockRoot/.mcdevrc.json
+++ b/test/mockRoot/.mcdevrc.json
@@ -34,12 +34,23 @@
"templateBuilds": ["retrieve/", "deploy/"]
},
"markets": {
- "testMarket": {
+ "testSourceMarket": {
"mid": "9999999",
"buName": "testBU",
+ "secret": "secret",
"sharedFolder": "/Shared Data Extensions/test",
"suffix": "_test",
+ "description": "bla bla",
"countryCodeIn": "'test'"
+ },
+ "testTargetMarket": {
+ "mid": "1111111",
+ "buName": "testBUTarget",
+ "secret": "target secret",
+ "sharedFolder": "/Shared Data Extensions/test target",
+ "suffix": "_testTarget",
+ "description": "foobar",
+ "countryCodeIn": "'testTarget'"
}
},
"marketList": {},
@@ -63,5 +74,5 @@
"triggeredSendDefinition"
]
},
- "version": "4.1.12"
+ "version": "4.2.0"
}
diff --git a/test/mockRoot/deploy/testInstance/testBU/dataExtension/childBU_dataextension_test.dataExtension-meta.json b/test/mockRoot/deploy/testInstance/testBU/dataExtension/childBU_dataextension_test.dataExtension-meta.json
index b83b7e4db..219055a3a 100644
--- a/test/mockRoot/deploy/testInstance/testBU/dataExtension/childBU_dataextension_test.dataExtension-meta.json
+++ b/test/mockRoot/deploy/testInstance/testBU/dataExtension/childBU_dataextension_test.dataExtension-meta.json
@@ -1,19 +1,23 @@
{
"CustomerKey": "childBU_dataextension_test",
"Name": "childBU_dataextension_test",
- "Description": "",
- "IsSendable": false,
- "IsTestable": false,
+ "Description": "Container for my test emails",
+ "IsSendable": true,
+ "IsTestable": true,
+ "SendableDataExtensionField": { "Name": "ContactKey" },
+ "SendableSubscriberField": { "Name": "Subscriber Key" },
+ "DataRetentionPeriodLength": 6,
+ "DataRetentionPeriodUnitOfMeasure": 5,
"RowBasedRetention": true,
"ResetRetentionPeriodOnImport": false,
"DeleteAtEndOfRetentionPeriod": false,
"RetainUntil": "",
"Fields": [
{
- "Name": "testField",
+ "Name": "FirstName",
"DefaultValue": "",
- "MaxLength": 254,
- "IsRequired": true,
+ "MaxLength": 50,
+ "IsRequired": false,
"IsPrimaryKey": false,
"FieldType": "Text"
},
@@ -21,14 +25,30 @@
"Name": "LastName",
"DefaultValue": "",
"MaxLength": 55,
+ "IsRequired": false,
+ "IsPrimaryKey": false,
+ "FieldType": "Text"
+ },
+ {
+ "Name": "EmailAddress",
+ "DefaultValue": "",
+ "MaxLength": 254,
"IsRequired": true,
"IsPrimaryKey": false,
+ "FieldType": "EmailAddress"
+ },
+ {
+ "Name": "testField",
+ "DefaultValue": "",
+ "MaxLength": 254,
+ "IsRequired": false,
+ "IsPrimaryKey": false,
"FieldType": "Text"
},
{
"Name": "ContactKey",
"DefaultValue": "",
- "MaxLength": 40,
+ "MaxLength": 50,
"IsRequired": true,
"IsPrimaryKey": true,
"FieldType": "Text"
diff --git a/test/mockRoot/deploy/testInstance/testBU/query/testExistingQuery.query-meta.json b/test/mockRoot/deploy/testInstance/testBU/query/testExistingQuery.query-meta.json
index ed7beb5a9..04612115e 100644
--- a/test/mockRoot/deploy/testInstance/testBU/query/testExistingQuery.query-meta.json
+++ b/test/mockRoot/deploy/testInstance/testBU/query/testExistingQuery.query-meta.json
@@ -1,7 +1,7 @@
{
"name": "testExistingQuery",
"key": "testExistingQuery",
- "description": "updated",
+ "description": "updated on deploy",
"targetKey": "childBU_dataextension_test",
"createdDate": "2022-04-26T15:21:16.453",
"modifiedDate": "2022-04-26T16:04:15.88",
diff --git a/test/mockRoot/deploy/testInstance/testBU/query/testExistingQuery.query-meta.sql b/test/mockRoot/deploy/testInstance/testBU/query/testExistingQuery.query-meta.sql
index 9eb673f71..e78525408 100644
--- a/test/mockRoot/deploy/testInstance/testBU/query/testExistingQuery.query-meta.sql
+++ b/test/mockRoot/deploy/testInstance/testBU/query/testExistingQuery.query-meta.sql
@@ -1,4 +1,6 @@
SELECT
SubscriberKey as testField
FROM
- _Subscribers
\ No newline at end of file
+ _Subscribers
+WHERE
+ country IN ('test')
diff --git a/test/mockRoot/deploy/testInstance/testBU/query/testQuery.query-meta.json b/test/mockRoot/deploy/testInstance/testBU/query/testNewQuery.query-meta.json
similarity index 71%
rename from test/mockRoot/deploy/testInstance/testBU/query/testQuery.query-meta.json
rename to test/mockRoot/deploy/testInstance/testBU/query/testNewQuery.query-meta.json
index fc647aca4..48adbd5b1 100644
--- a/test/mockRoot/deploy/testInstance/testBU/query/testQuery.query-meta.json
+++ b/test/mockRoot/deploy/testInstance/testBU/query/testNewQuery.query-meta.json
@@ -1,7 +1,7 @@
{
- "name": "testQuery",
- "key": "testQuery",
- "description": "",
+ "name": "testNewQuery",
+ "key": "testNewQuery",
+ "description": "created on deploy",
"targetKey": "childBU_dataextension_test",
"createdDate": "2022-04-26T15:21:16.453",
"modifiedDate": "2022-04-26T16:04:15.88",
diff --git a/test/mockRoot/deploy/testInstance/testBU/query/testQuery.query-meta.sql b/test/mockRoot/deploy/testInstance/testBU/query/testNewQuery.query-meta.sql
similarity index 100%
rename from test/mockRoot/deploy/testInstance/testBU/query/testQuery.query-meta.sql
rename to test/mockRoot/deploy/testInstance/testBU/query/testNewQuery.query-meta.sql
diff --git a/test/mockRoot/deploy/testInstance/testBU/transactionalEmail/testExisting_temail.transactionalEmail-meta.json b/test/mockRoot/deploy/testInstance/testBU/transactionalEmail/testExisting_temail.transactionalEmail-meta.json
new file mode 100644
index 000000000..9d6c10fea
--- /dev/null
+++ b/test/mockRoot/deploy/testInstance/testBU/transactionalEmail/testExisting_temail.transactionalEmail-meta.json
@@ -0,0 +1,24 @@
+{
+ "name": "testExisting_temail",
+ "definitionKey": "testExisting_temail",
+ "description": "updated via deploy",
+ "classification": "Default Transactional",
+ "status": "Active",
+ "createdDate": "2020-09-10T03:29:00",
+ "modifiedDate": "2020-09-10T03:29:00",
+ "content": {
+ "customerKey": "testExisting_asset_message"
+ },
+ "subscriptions": {
+ "dataExtension": "childBU_dataextension_test",
+ "autoAddSubscriber": true,
+ "updateSubscriber": true,
+ "r__list_PathName": "my subscribers/All Subscribers"
+ },
+ "options": {
+ "trackLinks": true
+ },
+ "journey": {
+ "interactionKey": "testExisting_interaction"
+ }
+}
diff --git a/test/mockRoot/deploy/testInstance/testBU/transactionalEmail/testNew_temail.transactionalEmail-meta.json b/test/mockRoot/deploy/testInstance/testBU/transactionalEmail/testNew_temail.transactionalEmail-meta.json
new file mode 100644
index 000000000..9193a68fe
--- /dev/null
+++ b/test/mockRoot/deploy/testInstance/testBU/transactionalEmail/testNew_temail.transactionalEmail-meta.json
@@ -0,0 +1,24 @@
+{
+ "name": "testNew_temail",
+ "definitionKey": "testNew_temail",
+ "description": "created on deploy",
+ "classification": "Default Transactional",
+ "status": "Active",
+ "createdDate": "2020-09-10T03:29:00",
+ "modifiedDate": "2020-09-10T03:29:00",
+ "content": {
+ "customerKey": "testExisting_asset_message"
+ },
+ "subscriptions": {
+ "dataExtension": "childBU_dataextension_test",
+ "autoAddSubscriber": true,
+ "updateSubscriber": true,
+ "r__list_PathName": "my subscribers/All Subscribers"
+ },
+ "options": {
+ "trackLinks": true
+ },
+ "journey": {
+ "interactionKey": "testExisting_interaction"
+ }
+}
diff --git a/test/mockRoot/deploy/testInstance/testBU/transactionalPush/testExisting_tpush.transactionalPush-meta.json b/test/mockRoot/deploy/testInstance/testBU/transactionalPush/testExisting_tpush.transactionalPush-meta.json
new file mode 100644
index 000000000..39407d688
--- /dev/null
+++ b/test/mockRoot/deploy/testInstance/testBU/transactionalPush/testExisting_tpush.transactionalPush-meta.json
@@ -0,0 +1,18 @@
+{
+ "definitionKey": "testExisting_tpush",
+ "name": "testExisting_tpush",
+ "status": "Active",
+ "applicationId": "ffbab4c9-fbf6-4b87-9c9a-10c6ce86e81d",
+ "description": "updated via deploy; note that applicationId can only be manually set up in Setup - Mobile Push",
+ "content": {
+ "customerKey": "mobileMessage_test"
+ },
+ "options": {
+ "sound": "temp.wmv",
+ "badge": "1",
+ "customKeys": [
+ { "key": "key1", "value": "value1" },
+ { "key": "key2", "value": "value2" }
+ ]
+ }
+}
diff --git a/test/mockRoot/deploy/testInstance/testBU/transactionalPush/testNew_tpush.transactionalPush-meta.json b/test/mockRoot/deploy/testInstance/testBU/transactionalPush/testNew_tpush.transactionalPush-meta.json
new file mode 100644
index 000000000..e3c0301cf
--- /dev/null
+++ b/test/mockRoot/deploy/testInstance/testBU/transactionalPush/testNew_tpush.transactionalPush-meta.json
@@ -0,0 +1,18 @@
+{
+ "definitionKey": "testNew_tpush",
+ "name": "testNew_tpush",
+ "status": "Active",
+ "applicationId": "ffbab4c9-fbf6-4b87-9c9a-10c6ce86e81d",
+ "description": "created on deploy; note that applicationId can only be manually set up in Setup - Mobile Push",
+ "content": {
+ "customerKey": "mobileMessage_test"
+ },
+ "options": {
+ "sound": "temp.wmv",
+ "badge": "1",
+ "customKeys": [
+ { "key": "key1", "value": "value1" },
+ { "key": "key2", "value": "value2" }
+ ]
+ }
+}
diff --git a/test/mockRoot/deploy/testInstance/testBU/transactionalSMS/testExisting_tsms.transactionalSMS-meta.amp b/test/mockRoot/deploy/testInstance/testBU/transactionalSMS/testExisting_tsms.transactionalSMS-meta.amp
new file mode 100644
index 000000000..e4c5aff95
--- /dev/null
+++ b/test/mockRoot/deploy/testInstance/testBU/transactionalSMS/testExisting_tsms.transactionalSMS-meta.amp
@@ -0,0 +1,4 @@
+
+%%[
+ SET @key = 'secret'
+]%%
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
new file mode 100644
index 000000000..4cf9c7393
--- /dev/null
+++ b/test/mockRoot/deploy/testInstance/testBU/transactionalSMS/testExisting_tsms.transactionalSMS-meta.json
@@ -0,0 +1,15 @@
+{
+ "name": "testExisting_tsms",
+ "definitionKey": "testExisting_tsms",
+ "description": "bla bla",
+ "status": "Active",
+ "createdDate": "2022-11-07T02:24:00",
+ "modifiedDate": "2022-11-07T02:25:00",
+ "subscriptions": {
+ "shortCode": "4912312345678",
+ "countryCode": "",
+ "autoAddSubscriber": true,
+ "updateSubscriber": true,
+ "keyword": "testExisting_keyword"
+ }
+}
diff --git a/test/mockRoot/deploy/testInstance/testBU/transactionalSMS/testNew_tsms.transactionalSMS-meta.amp b/test/mockRoot/deploy/testInstance/testBU/transactionalSMS/testNew_tsms.transactionalSMS-meta.amp
new file mode 100644
index 000000000..e4c5aff95
--- /dev/null
+++ b/test/mockRoot/deploy/testInstance/testBU/transactionalSMS/testNew_tsms.transactionalSMS-meta.amp
@@ -0,0 +1,4 @@
+
+%%[
+ SET @key = 'secret'
+]%%
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
new file mode 100644
index 000000000..cb2fc540b
--- /dev/null
+++ b/test/mockRoot/deploy/testInstance/testBU/transactionalSMS/testNew_tsms.transactionalSMS-meta.json
@@ -0,0 +1,15 @@
+{
+ "name": "testNew_tsms",
+ "definitionKey": "testNew_tsms",
+ "description": "created on deploy",
+ "status": "Active",
+ "createdDate": "2022-11-07T02:24:00",
+ "modifiedDate": "2022-11-07T02:25:00",
+ "subscriptions": {
+ "shortCode": "4912312345678",
+ "countryCode": "",
+ "autoAddSubscriber": true,
+ "updateSubscriber": true,
+ "keyword": "testExisting_keyword"
+ }
+}
diff --git a/test/query.test.js b/test/query.test.js
index e2af6c9bf..76f4682fa 100644
--- a/test/query.test.js
+++ b/test/query.test.js
@@ -1,4 +1,10 @@
-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 dir = chaiFiles.dir;
const cache = require('../lib/util/cache');
const testUtils = require('./utils');
const handler = require('../lib/index');
@@ -24,10 +30,13 @@ describe('query', () => {
'only one query expected'
);
assert.deepEqual(
- await testUtils.getActualFile('testExistingQuery', 'query'),
- await testUtils.getExpectedFile('9999999', 'query', 'get'),
+ await testUtils.getActualJson('testExistingQuery', 'query'),
+ await testUtils.getExpectedJson('9999999', 'query', 'get'),
'returned metadata was not equal expected'
);
+ expect(file(testUtils.getActualFile('testExistingQuery', 'query', 'sql'))).to.equal(
+ file(testUtils.getExpectedFile('9999999', 'query', 'get', 'sql'))
+ );
assert.equal(
Object.values(testUtils.getAPIHistory()).flat().length,
6,
@@ -37,6 +46,9 @@ describe('query', () => {
});
});
describe('Deploy ================', () => {
+ beforeEach(() => {
+ testUtils.mockSetup(true);
+ });
it('Should create & upsert a query', async () => {
// WHEN
await handler.deploy('testInstance/testBU', ['query']);
@@ -48,16 +60,25 @@ describe('query', () => {
2,
'two querys expected'
);
+ // confirm created item
assert.deepEqual(
- await testUtils.getActualFile('testQuery', 'query'),
- await testUtils.getExpectedFile('9999999', 'query', 'post'),
+ await testUtils.getActualJson('testNewQuery', 'query'),
+ await testUtils.getExpectedJson('9999999', 'query', 'post'),
'returned metadata was not equal expected for insert query'
);
+ expect(file(testUtils.getActualFile('testNewQuery', 'query', 'sql'))).to.equal(
+ file(testUtils.getExpectedFile('9999999', 'query', 'post', 'sql'))
+ );
+ // confirm updated item
assert.deepEqual(
- await testUtils.getActualFile('testExistingQuery', 'query'),
- await testUtils.getExpectedFile('9999999', 'query', 'patch'),
+ await testUtils.getActualJson('testExistingQuery', 'query'),
+ await testUtils.getExpectedJson('9999999', 'query', 'patch'),
'returned metadata was not equal expected for insert query'
);
+ expect(file(testUtils.getActualFile('testExistingQuery', 'query', 'sql'))).to.equal(
+ file(testUtils.getExpectedFile('9999999', 'query', 'patch', 'sql'))
+ );
+ // check number of API calls
assert.equal(
Object.values(testUtils.getAPIHistory()).flat().length,
8,
@@ -73,7 +94,7 @@ describe('query', () => {
'testInstance/testBU',
'query',
['testExistingQuery'],
- 'testMarket'
+ 'testSourceMarket'
);
// WHEN
assert.equal(
@@ -82,22 +103,28 @@ describe('query', () => {
'only one query expected'
);
assert.deepEqual(
- await testUtils.getActualTemplate('testExistingQuery', 'query'),
- await testUtils.getExpectedFile('9999999', 'query', 'template'),
- 'returned template was not equal expected'
+ await testUtils.getActualTemplateJson('testExistingQuery', 'query'),
+ await testUtils.getExpectedJson('9999999', 'query', 'template'),
+ 'returned template JSON of retrieveAsTemplate was not equal expected'
);
+ expect(
+ file(testUtils.getActualTemplateFile('testExistingQuery', 'query', 'sql'))
+ ).to.equal(file(testUtils.getExpectedFile('9999999', 'query', 'template', 'sql')));
// THEN
await handler.buildDefinition(
'testInstance/testBU',
'query',
'testExistingQuery',
- 'testMarket'
+ 'testTargetMarket'
);
assert.deepEqual(
- await testUtils.getActualDeployFile('testExistingQuery', 'query'),
- await testUtils.getExpectedFile('9999999', 'query', 'build'),
- 'returned deployment file was not equal expected'
+ await testUtils.getActualDeployJson('testExistingQuery', 'query'),
+ await testUtils.getExpectedJson('9999999', 'query', 'build'),
+ 'returned deployment JSON was not equal expected'
);
+ expect(
+ file(testUtils.getActualDeployFile('testExistingQuery', 'query', 'sql'))
+ ).to.equal(file(testUtils.getExpectedFile('9999999', 'query', 'build', 'sql')));
assert.equal(
Object.values(testUtils.getAPIHistory()).flat().length,
6,
@@ -113,7 +140,7 @@ describe('query', () => {
'testInstance/testBU',
'query',
['testExistingQuery'],
- 'testMarket'
+ 'testSourceMarket'
);
// WHEN
assert.equal(
@@ -122,22 +149,29 @@ describe('query', () => {
'only one query expected'
);
assert.deepEqual(
- await testUtils.getActualTemplate('testExistingQuery', 'query'),
- await testUtils.getExpectedFile('9999999', 'query', 'template'),
- 'returned template was not equal expected'
+ await testUtils.getActualTemplateJson('testExistingQuery', 'query'),
+ await testUtils.getExpectedJson('9999999', 'query', 'template'),
+ 'returned template JSON of buildTemplate was not equal expected'
);
+ expect(
+ file(testUtils.getActualTemplateFile('testExistingQuery', 'query', 'sql'))
+ ).to.equal(file(testUtils.getExpectedFile('9999999', 'query', 'template', 'sql')));
// THEN
await handler.buildDefinition(
'testInstance/testBU',
'query',
'testExistingQuery',
- 'testMarket'
+ 'testTargetMarket'
);
assert.deepEqual(
- await testUtils.getActualDeployFile('testExistingQuery', 'query'),
- await testUtils.getExpectedFile('9999999', 'query', 'build'),
- 'returned deployment file was not equal expected'
+ await testUtils.getActualDeployJson('testExistingQuery', 'query'),
+ await testUtils.getExpectedJson('9999999', 'query', 'build'),
+ 'returned deployment JSON was not equal expected'
);
+ expect(
+ file(testUtils.getActualDeployFile('testExistingQuery', 'query', 'sql'))
+ ).to.equal(file(testUtils.getExpectedFile('9999999', 'query', 'build', 'sql')));
+
assert.equal(
Object.values(testUtils.getAPIHistory()).flat().length,
6,
diff --git a/test/resources/1111111/businessUnit/retrieve-response.xml b/test/resources/1111111/businessUnit/retrieve-response.xml
new file mode 100644
index 000000000..e681ce9b6
--- /dev/null
+++ b/test/resources/1111111/businessUnit/retrieve-response.xml
@@ -0,0 +1,33 @@
+
+
+
+ RetrieveResponse
+ urn:uuid:9e5f98fa-4112-4416-be42-4f9e6f6886e4
+ urn:uuid:b94fb623-e37d-40d3-8178-e6c8ee3b40b5
+ http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous
+
+
+ 2022-11-29T19:42:20Z
+ 2022-11-29T19:47:20Z
+
+
+
+
+
+ OK
+ 233a302f-6c1f-4fea-8b32-82a843ae806d
+
+
+
+ None
+
+ ENTIRE_ENTERPRISE
+
+
+
+
diff --git a/test/resources/1111111/list/retrieve-response.xml b/test/resources/1111111/list/retrieve-response.xml
new file mode 100644
index 000000000..6b43f89e8
--- /dev/null
+++ b/test/resources/1111111/list/retrieve-response.xml
@@ -0,0 +1,39 @@
+
+
+
+ RetrieveResponse
+ urn:uuid:26648e52-3bac-4eca-a5e1-ad71d38b56fe
+ urn:uuid:8552cfbd-466c-447e-a232-13d945e44a5c
+ http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous
+
+
+ 2022-11-29T19:42:21Z
+ 2022-11-29T19:47:21Z
+
+
+
+
+
+ OK
+ 11e9f8a8-e5e6-4082-93bd-5840060512ce
+
+
+ 2017-01-24T06:32:34.453
+ 2017-01-24T06:32:34.453
+ 15
+ 1f793b8b-cb23-4bb4-9ec4-1e0bf9511960
+ All Subscribers - 277
+ All Subscribers
+ 277
+ Private
+ Contains all subscribers
+ ExactTargetList
+
+
+
+
diff --git a/test/resources/9999999/asset/v1/content/assets/query/post-response.json b/test/resources/9999999/asset/v1/content/assets/query/post-response.json
new file mode 100644
index 000000000..7bb8d6ea8
--- /dev/null
+++ b/test/resources/9999999/asset/v1/content/assets/query/post-response.json
@@ -0,0 +1,72 @@
+{
+ "count": 2,
+ "page": 1,
+ "pageSize": 50,
+ "links": {},
+ "items": [
+ {
+ "id": 808714,
+ "customerKey": "testExisting_asset_message",
+ "assetType": { "id": 208, "name": "htmlemail", "displayName": "HTML Email" },
+ "name": "testExisting_asset_message",
+ "createdDate": "2021-01-31T14:11:01.423-06:00",
+ "createdBy": {
+ "id": 700304523,
+ "email": "",
+ "name": "SFMC DEVOPS app user",
+ "userId": "700304523"
+ },
+ "modifiedDate": "2021-01-31T14:13:30-06:00",
+ "modifiedBy": {
+ "id": 700304523,
+ "name": "SFMC DEVOPS app user",
+ "userId": "700304523"
+ },
+ "status": { "id": 1, "name": "Draft" },
+ "category": { "id": 290833, "name": "Content Builder", "parentId": 0 },
+ "availableViews": ["html", "text", "subjectline", "preheader"],
+ "data": {
+ "email": {
+ "options": { "characterEncoding": "us-ascii" },
+ "legacy": {
+ "legacyId": 531213,
+ "legacyKey": "testExisting_asset_message",
+ "legacyType": "email",
+ "legacyCategoryId": 290835
+ }
+ }
+ },
+ "legacyData": {
+ "legacyId": 531213,
+ "legacyKey": "testExisting_asset_message",
+ "legacyType": "email",
+ "legacyCategoryId": 290835
+ },
+ "modelVersion": 2
+ },
+ {
+ "id": 1209971,
+ "customerKey": "mobileMessage_test",
+ "assetType": { "id": 230, "name": "jsonmessage", "displayName": "JSON Message" },
+ "name": "mobileMessage_test",
+ "createdDate": "2022-12-07T02:49:36.857-06:00",
+ "createdBy": {
+ "id": 700301950,
+ "email": "joern.berkefeld@accenture.com",
+ "name": "J├Ârn Berkefeld (ASGR)",
+ "userId": "700301950"
+ },
+ "modifiedDate": "2022-12-07T02:49:57.44-06:00",
+ "modifiedBy": {
+ "id": 700301950,
+ "email": "joern.berkefeld@accenture.com",
+ "name": "J├Ârn Berkefeld (ASGR)",
+ "userId": "700301950"
+ },
+ "status": { "id": 1, "name": "Draft" },
+ "category": { "id": 283608, "name": "Content Builder", "parentId": 0 },
+ "availableViews": ["push"],
+ "modelVersion": 2
+ }
+ ]
+}
diff --git a/test/resources/9999999/automation/v1/queries/549f0568-607c-4940-afef-437965094dat/patch-response.json b/test/resources/9999999/automation/v1/queries/549f0568-607c-4940-afef-437965094dat/patch-response.json
index 8be361772..b191b4d8e 100644
--- a/test/resources/9999999/automation/v1/queries/549f0568-607c-4940-afef-437965094dat/patch-response.json
+++ b/test/resources/9999999/automation/v1/queries/549f0568-607c-4940-afef-437965094dat/patch-response.json
@@ -2,8 +2,8 @@
"queryDefinitionId": "549f0568-607c-4940-afef-437965094dat",
"name": "testExistingQuery",
"key": "testExistingQuery",
- "description": "updated",
- "queryText": "SELECT\n SubscriberKey as testField\nFROM\n _Subscribers ",
+ "description": "updated on deploy",
+ "queryText": "SELECT\n SubscriberKey as testField\nFROM\n _Subscribers\nWHERE\n country IN ('test')\n",
"targetName": "childBU_dataextension_test",
"targetKey": "childBU_dataextension_test",
"targetId": "30400c03-0ec4-ec11-b83c-48df37d1de8a",
diff --git a/test/resources/9999999/automation/v1/queries/get-response.json b/test/resources/9999999/automation/v1/queries/get-response.json
index 8592d5da1..f404fc723 100644
--- a/test/resources/9999999/automation/v1/queries/get-response.json
+++ b/test/resources/9999999/automation/v1/queries/get-response.json
@@ -7,8 +7,8 @@
"queryDefinitionId": "549f0568-607c-4940-afef-437965094dat",
"name": "testExistingQuery",
"key": "testExistingQuery",
- "description": "",
- "queryText": "SELECT\n SubscriberKey as testField\nFROM\n _Subscribers ",
+ "description": "bla bla",
+ "queryText": "SELECT\n SubscriberKey as testField\nFROM\n _Subscribers\nWHERE\n country IN ('test')\n",
"targetName": "childBU_dataextension_test",
"targetKey": "childBU_dataextension_test",
"targetId": "30400c03-0ec4-ec11-b83c-48df37d1de8a",
diff --git a/test/resources/9999999/automation/v1/queries/post-response.json b/test/resources/9999999/automation/v1/queries/post-response.json
index c46ec2940..eb0943059 100644
--- a/test/resources/9999999/automation/v1/queries/post-response.json
+++ b/test/resources/9999999/automation/v1/queries/post-response.json
@@ -1,8 +1,8 @@
{
"queryDefinitionId": "549f0568-607c-4940-afef-437965094dae",
- "name": "testQuery",
- "key": "testQuery",
- "description": "",
+ "name": "testNewQuery",
+ "key": "testNewQuery",
+ "description": "created on deploy",
"queryText": "SELECT\n SubscriberKey as testField\nFROM\n _Subscribers ",
"targetName": "childBU_dataextension_test",
"targetKey": "childBU_dataextension_test",
diff --git a/test/resources/9999999/dataExtension/build-expected.json b/test/resources/9999999/dataExtension/build-expected.json
index 2864d267b..c1c7bca76 100644
--- a/test/resources/9999999/dataExtension/build-expected.json
+++ b/test/resources/9999999/dataExtension/build-expected.json
@@ -1,6 +1,6 @@
{
- "CustomerKey": "childBU_dataextension_test",
- "Name": "childBU_dataextension_test",
+ "CustomerKey": "childBU_dataextension_testTarget",
+ "Name": "childBU_dataextension_testTarget",
"Description": "Container for my test emails",
"IsSendable": true,
"IsTestable": true,
diff --git a/test/resources/9999999/dataFolder/retrieve-response.xml b/test/resources/9999999/dataFolder/retrieve-response.xml
index 4ce07129d..a48d37473 100644
--- a/test/resources/9999999/dataFolder/retrieve-response.xml
+++ b/test/resources/9999999/dataFolder/retrieve-response.xml
@@ -1,5 +1,10 @@
-
+
RetrieveResponse
urn:uuid:f36f3303-3b5a-4641-8109-b26447634d91
@@ -60,6 +65,94 @@
false
true
+
+
+ 9999999
+
+
+ 2017-02-16T01:59:27.18
+ 2017-02-16T01:59:27.18
+ 412
+
+ mysubs_default
+
+
+ 0
+
+
+ my subscribers
+
+ mysubs
+ true
+ false
+ true
+
+
+
+ 9999999
+
+
+ 2017-02-16T01:59:27.177
+ 2017-02-16T01:59:27.177
+ 404
+
+ list_default
+
+
+ 0
+
+
+ my lists
+
+ list
+ true
+ false
+ true
+
+
+
+ 9999999
+
+
+ 2017-02-16T01:59:34.023
+ 2017-02-16T01:59:34.023
+ 424
+
+ publication_default
+
+
+ 0
+
+
+ Publication Lists
+
+ publication
+ true
+ false
+ true
+
+
+
+ 9999999
+
+
+ 2017-02-16T01:59:32.323
+ 2017-02-16T01:59:32.323
+ 419
+
+ suppression_list_default
+
+
+ 0
+
+
+ Suppression Lists
+
+ suppression_list
+ true
+ false
+ true
+
-
\ No newline at end of file
+
diff --git a/test/resources/9999999/interaction/v1/interactions/get-response.json b/test/resources/9999999/interaction/v1/interactions/get-response.json
new file mode 100644
index 000000000..1f87d37a3
--- /dev/null
+++ b/test/resources/9999999/interaction/v1/interactions/get-response.json
@@ -0,0 +1,296 @@
+{
+ "count": 1,
+ "page": 1,
+ "pageSize": 50,
+ "links": {},
+ "summary": {
+ "totalInteractions": 371,
+ "totalRunningVersionsWithDefinedGoal": 1,
+ "totalRunningVersionsMeetingGoal": 0,
+ "cumulativePopulation": 961860
+ },
+ "items": [
+ {
+ "id": "233d4413-922c-4568-85a5-e5cc77efc3be",
+ "key": "testExisting_interaction",
+ "name": "testExisting_interaction",
+ "lastPublishedDate": "2017-04-12T08:07:48",
+ "description": "",
+ "version": 1,
+ "workflowApiVersion": 1,
+ "createdDate": "2017-04-12T05:38:05.837",
+ "modifiedDate": "2017-04-12T08:07:48.333",
+ "activities": [
+ {
+ "id": "69213026-bd2c-433b-8332-5f52d3e87ca5",
+ "key": "WAIT-1",
+ "name": "",
+ "description": "",
+ "type": "WAIT",
+ "outcomes": [
+ {
+ "key": "bd3dff6b-565c-4b56-b9cb-60cd5b6d080b",
+ "next": "DATAEXTENSIONUPDATE-1",
+ "arguments": {},
+ "metaData": {}
+ }
+ ],
+ "arguments": {
+ "waitDefinitionId": "546704c0-9384-4a41-b20e-97615cc6cc6a",
+ "waitForEventId": "",
+ "executionMode": "{{Context.ExecutionMode}}",
+ "startActivityKey": "{{Context.StartActivityKey}}",
+ "waitQueueId": "{{Context.WaitQueueId}}"
+ },
+ "configurationArguments": {
+ "waitDuration": 1,
+ "waitUnit": "DAYS",
+ "specifiedTime": "",
+ "timeZone": "",
+ "description": "",
+ "waitForEventKey": ""
+ },
+ "metaData": { "waitType": "duration" },
+ "schema": {
+ "arguments": {
+ "endDate": {
+ "dataType": "Date",
+ "isNullable": false,
+ "direction": "Out",
+ "readOnly": false,
+ "access": "Hidden"
+ },
+ "waitEndDateAttributeDataBound": {
+ "dataType": "Text",
+ "isNullable": true,
+ "direction": "In",
+ "readOnly": false,
+ "access": "Hidden"
+ },
+ "waitDefinitionId": {
+ "dataType": "Text",
+ "isNullable": false,
+ "direction": "In",
+ "readOnly": false,
+ "access": "Hidden"
+ },
+ "waitForEventId": {
+ "dataType": "Text",
+ "isNullable": true,
+ "direction": "In",
+ "readOnly": false,
+ "access": "Hidden"
+ },
+ "executionMode": {
+ "dataType": "Text",
+ "isNullable": false,
+ "direction": "In",
+ "readOnly": false,
+ "access": "Hidden"
+ },
+ "startActivityKey": {
+ "dataType": "Text",
+ "isNullable": true,
+ "direction": "In",
+ "readOnly": false,
+ "access": "Hidden"
+ },
+ "waitQueueId": {
+ "dataType": "LongNumber",
+ "isNullable": true,
+ "direction": "In",
+ "readOnly": false,
+ "access": "Hidden"
+ }
+ }
+ }
+ },
+ {
+ "id": "5d93cda9-2015-4c07-a1db-0d5853d25bf6",
+ "key": "WAIT-2",
+ "name": "",
+ "description": "",
+ "type": "WAIT",
+ "outcomes": [
+ {
+ "key": "e3d3258a-891b-4838-b5a6-af37f8cb769a",
+ "arguments": {},
+ "metaData": {}
+ }
+ ],
+ "arguments": {
+ "waitDefinitionId": "deed4c9d-f487-4371-bfd9-76fca44ec49b",
+ "waitForEventId": "",
+ "executionMode": "{{Context.ExecutionMode}}",
+ "startActivityKey": "{{Context.StartActivityKey}}",
+ "waitQueueId": "{{Context.WaitQueueId}}"
+ },
+ "configurationArguments": {
+ "waitDuration": 1,
+ "waitUnit": "DAYS",
+ "specifiedTime": "",
+ "timeZone": "",
+ "description": "",
+ "waitForEventKey": ""
+ },
+ "metaData": { "waitType": "duration" },
+ "schema": {
+ "arguments": {
+ "endDate": {
+ "dataType": "Date",
+ "isNullable": false,
+ "direction": "Out",
+ "readOnly": false,
+ "access": "Hidden"
+ },
+ "waitEndDateAttributeDataBound": {
+ "dataType": "Text",
+ "isNullable": true,
+ "direction": "In",
+ "readOnly": false,
+ "access": "Hidden"
+ },
+ "waitDefinitionId": {
+ "dataType": "Text",
+ "isNullable": false,
+ "direction": "In",
+ "readOnly": false,
+ "access": "Hidden"
+ },
+ "waitForEventId": {
+ "dataType": "Text",
+ "isNullable": true,
+ "direction": "In",
+ "readOnly": false,
+ "access": "Hidden"
+ },
+ "executionMode": {
+ "dataType": "Text",
+ "isNullable": false,
+ "direction": "In",
+ "readOnly": false,
+ "access": "Hidden"
+ },
+ "startActivityKey": {
+ "dataType": "Text",
+ "isNullable": true,
+ "direction": "In",
+ "readOnly": false,
+ "access": "Hidden"
+ },
+ "waitQueueId": {
+ "dataType": "LongNumber",
+ "isNullable": true,
+ "direction": "In",
+ "readOnly": false,
+ "access": "Hidden"
+ }
+ }
+ }
+ },
+ {
+ "id": "ef4db13e-83f0-4d41-981d-4bf5810c0daa",
+ "key": "DATAEXTENSIONUPDATE-1",
+ "name": "",
+ "description": "",
+ "type": "DATAEXTENSIONUPDATE",
+ "outcomes": [
+ {
+ "key": "a49ecf04-4612-4582-85fe-d7193f872fa8",
+ "next": "WAIT-2",
+ "arguments": {},
+ "metaData": {}
+ }
+ ],
+ "arguments": { "contactKey": "{{Contact.Key}}", "value": "{{DateTime.Now}}" },
+ "configurationArguments": {
+ "dataExtensionId": "ace267f0-b81d-e711-80cc-1402ec7222b4",
+ "field": "4e875b26-0317-4525-bfa0-50c8d1b7a7b5"
+ },
+ "metaData": {
+ "dataExtensionName": "test_TestData",
+ "cachedFieldName": "JourneyConfirmed",
+ "cachedDisplayValue": ""
+ },
+ "schema": {
+ "arguments": {
+ "contactKey": {
+ "dataType": "Text",
+ "isNullable": false,
+ "direction": "In",
+ "readOnly": false,
+ "access": "Hidden"
+ },
+ "value": {
+ "dataType": "Text",
+ "isNullable": false,
+ "direction": "In",
+ "readOnly": false,
+ "access": "Hidden"
+ }
+ }
+ }
+ }
+ ],
+ "triggers": [
+ {
+ "id": "a7f8cd93-e0a6-40a5-8557-5bd6fa76c0ea",
+ "key": "TRIGGER",
+ "name": "test_TESTDataentry",
+ "description": "",
+ "type": "APIEvent",
+ "outcomes": [],
+ "arguments": {
+ "filterResult": "{{Contact.FilterId.e4ddb887-6f2d-46b1-9f64-9a020f217339}}"
+ },
+ "configurationArguments": {
+ "schemaVersionId": 133,
+ "criteria": " ",
+ "filterDefinitionId": "e4ddb887-6f2d-46b1-9f64-9a020f217339"
+ },
+ "metaData": {
+ "scheduleState": "No Schedule",
+ "sourceInteractionId": "00000000-0000-0000-0000-000000000000",
+ "eventDefinitionId": "33b4dbc5-4b58-4a54-ab57-24388f1eefe4",
+ "eventDefinitionKey": "APIEvent-60130566-e2fe-eb29-4140-15c27093a80b",
+ "chainType": "None",
+ "configurationRequired": false,
+ "iconUrl": "/events/images/icon_journeyBuilder-event-api-blue.svg",
+ "title": "",
+ "category": "Event"
+ }
+ }
+ ],
+ "goals": [],
+ "exits": [],
+ "notifiers": [],
+ "stats": {
+ "currentPopulation": 5848,
+ "cumulativePopulation": 3019,
+ "metGoal": 0,
+ "metExitCriteria": 0,
+ "goalPerformance": 0
+ },
+ "healthStats": {
+ "currentlyInCount": 0,
+ "delayedContactCount": 0,
+ "delayedMinuteInterval": 60
+ },
+ "entryMode": "OnceAndDone",
+ "definitionType": "Multistep",
+ "channel": "",
+ "defaults": {
+ "email": [
+ "{{Event.APIEvent-60130566-e2fe-eb29-4140-15c27093a80b.\"emailAddress\"}}"
+ ],
+ "properties": {}
+ },
+ "metaData": {},
+ "executionMode": "Production",
+ "categoryId": 6298,
+ "status": "Published",
+ "definitionId": "233d4413-922c-4568-85a5-e5cc77efc3be",
+ "scheduledStatus": "Draft"
+ }
+ ]
+}
diff --git a/test/resources/9999999/legacy/v1/beta/mobile/code/get-response.json b/test/resources/9999999/legacy/v1/beta/mobile/code/get-response.json
new file mode 100644
index 000000000..5c6222f44
--- /dev/null
+++ b/test/resources/9999999/legacy/v1/beta/mobile/code/get-response.json
@@ -0,0 +1,32 @@
+{
+ "startIndex": 0,
+ "itemsPerPage": 50,
+ "totalResults": 1,
+ "entry": [
+ {
+ "id": "RXBwc0JoNk9jVTY0YWJNWFZDaGxvdzo4MTow",
+ "createdDate": "2017-05-05T10:33:15.953Z",
+ "lastUpdated": "2022-11-25T15:51:14.225Z",
+ "code": "4912312345678",
+ "countryCode": "HK",
+ "startDate": "2017-05-05T06:00:00Z",
+ "endDate": "2047-05-05T06:00:00Z",
+ "keywordLimit": "Unlimited",
+ "keywordsUsed": "0",
+ "codeType": "PRIVATE",
+ "isShortCode": false,
+ "keywordsUsedOther": "0",
+ "isGsmCharacterSetOnly": false,
+ "isMms": false,
+ "isStackIndependant": false,
+ "dipSwitches": 1,
+ "moEngineVersion": 1,
+ "sendableCountries": [
+ { "countryCode": "HK", "vendor": "CLX", "fromNameSupported": true }
+ ],
+ "supportsConcatenation": true,
+ "isClientOwned": false,
+ "isOwner": false
+ }
+ ]
+}
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
new file mode 100644
index 000000000..4e8d8f539
--- /dev/null
+++ b/test/resources/9999999/legacy/v1/beta/mobile/keyword/get-response.json
@@ -0,0 +1,46 @@
+{
+ "startIndex": 0,
+ "itemsPerPage": 50,
+ "totalResults": 1,
+ "entry": [
+ {
+ "id": "cTVJaG5oSDJPVUNHcUh6Z3pQT2tVdzo4Njow",
+ "createdDate": "2018-03-27T12:37:18.12Z",
+ "lastUpdated": "2018-03-27T12:37:18.167Z",
+ "code": {
+ "id": "RXBwc0JoNk9jVTY0YWJNWFZDaGxvdzo4MTow",
+ "createdDate": "2017-05-05T10:33:15.953Z",
+ "lastUpdated": "2022-11-25T15:51:14.225Z",
+ "code": "4912312345678",
+ "countryCode": "HK",
+ "startDate": "2017-05-05T06:00:00Z",
+ "endDate": "2047-05-05T06:00:00Z",
+ "keywordLimit": "Unlimited",
+ "keywordsUsed": "0",
+ "codeType": "PRIVATE",
+ "isShortCode": false,
+ "keywordsUsedOther": "0",
+ "isGsmCharacterSetOnly": false,
+ "isMms": false,
+ "isStackIndependant": false,
+ "dipSwitches": 1,
+ "moEngineVersion": 1,
+ "sendableCountries": [
+ { "countryCode": "HK", "vendor": "CLX", "fromNameSupported": true }
+ ],
+ "supportsConcatenation": true,
+ "isClientOwned": false,
+ "isOwner": false
+ },
+ "keyword": "testExisting_keyword",
+ "startDate": "2018-03-27T12:37:18.197Z",
+ "endDate": "2038-03-27T12:37:18.197Z",
+ "status": "Active",
+ "createdBy": { "id": "abcabcabc", "name": "xyz app user" },
+ "restriction": "NONE",
+ "keywordType": "NORMAL",
+ "isInherited": false,
+ "decodedId": "9e2192ab-f611-4039-86a8-7ce0ccf3a453"
+ }
+ ]
+}
diff --git a/test/resources/9999999/list/retrieve-response.xml b/test/resources/9999999/list/retrieve-response.xml
new file mode 100644
index 000000000..a90976cae
--- /dev/null
+++ b/test/resources/9999999/list/retrieve-response.xml
@@ -0,0 +1,78 @@
+
+
+
+ RetrieveResponse
+ urn:uuid:fc7c8368-c8f0-4b86-a4ac-c420bb2517cf
+ urn:uuid:eaad475d-1129-4cf5-bbe6-a1d90a80f6da
+ http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous
+
+
+ 2022-11-29T19:42:18Z
+ 2022-11-29T19:47:18Z
+
+
+
+
+
+ OK
+ e5b8151e-8780-4543-9856-971f3023769f
+
+
+ 2017-02-16T01:59:27.29
+ 2017-02-16T01:59:27.29
+ 23
+ 95e7f560-dca9-4ad2-8bc6-850ea7506e88
+ All Subscribers - 412
+ All Subscribers
+ 412
+ Private
+ Contains all subscribers
+ ExactTargetList
+
+
+
+ 2017-06-13T06:03:10.8
+ 2017-06-13T06:03:10.8
+ 109
+ 3d03a584-453e-41e0-9ed7-3ef418d5f79c
+ Test_List - 404
+ Test_List
+ 404
+ Private
+ Test_List
+ ExactTargetList
+
+
+
+ 2017-06-26T04:46:40.887
+ 2017-06-26T04:46:40.887
+ 114
+ b3e9f648-0588-4cc4-90a5-26624cdd2e1e
+ Demo Publication List - 424
+ Demo Publication List
+ 424
+ Public
+
+ PublicationList
+
+
+
+ 2022-02-17T11:58:08.273
+ 2022-02-17T11:59:40.01
+ 1120
+ ebe40007-8776-46d7-9c9f-dc4578ac08b7
+ sfmcTest - 419
+ sfmcTest
+ 419
+ Private
+
+ SuppressionList
+
+
+
+
diff --git a/test/resources/9999999/messaging/v1/email/definitions/get-response.json b/test/resources/9999999/messaging/v1/email/definitions/get-response.json
new file mode 100644
index 000000000..3575ca537
--- /dev/null
+++ b/test/resources/9999999/messaging/v1/email/definitions/get-response.json
@@ -0,0 +1,15 @@
+{
+ "requestId": "b0a6c5aa-83fa-43c2-a6a8-1e2055c85a43",
+ "definitions": [
+ {
+ "name": "testExisting_temail",
+ "definitionKey": "testExisting_temail",
+ "status": "Active",
+ "createdDate": "2020-08-17T01:37:00",
+ "modifiedDate": "2020-08-17T01:37:00"
+ }
+ ],
+ "count": 1,
+ "page": 1,
+ "pageSize": 50
+}
diff --git a/test/resources/9999999/messaging/v1/email/definitions/post-response.json b/test/resources/9999999/messaging/v1/email/definitions/post-response.json
new file mode 100644
index 000000000..0b2f8e238
--- /dev/null
+++ b/test/resources/9999999/messaging/v1/email/definitions/post-response.json
@@ -0,0 +1,19 @@
+{
+ "requestId": "51f09ca1-1e5e-444a-8ddc-8e4ff80a9fa1",
+ "name": "testNew_temail",
+ "definitionKey": "testNew_temail",
+ "description": "created on deploy",
+ "classification": "Default Transactional",
+ "status": "Active",
+ "createdDate": "2022-12-06T06:08:00",
+ "modifiedDate": "2022-12-06T06:08:00",
+ "content": { "customerKey": "testExisting_asset_message" },
+ "subscriptions": {
+ "dataExtension": "childBU_dataextension_test",
+ "list": "All Subscribers - 277",
+ "autoAddSubscriber": true,
+ "updateSubscriber": true
+ },
+ "options": { "trackLinks": true },
+ "journey": { "interactionKey": "1f936b41-cf1b-4207-aa33-715b3bf9eab7" }
+}
diff --git a/test/resources/9999999/messaging/v1/email/definitions/testExisting_temail/get-response.json b/test/resources/9999999/messaging/v1/email/definitions/testExisting_temail/get-response.json
new file mode 100644
index 000000000..6eb37bb17
--- /dev/null
+++ b/test/resources/9999999/messaging/v1/email/definitions/testExisting_temail/get-response.json
@@ -0,0 +1,26 @@
+{
+ "requestId": "ae8511d0-9bf0-42d0-af4f-bd9c1218c812",
+ "name": "testExisting_temail",
+ "definitionKey": "testExisting_temail",
+ "definitionId": "0a650d90-755e-ed11-b852-48df37d1df5b",
+ "description": "bla bla",
+ "classification": "Default Transactional",
+ "status": "Active",
+ "createdDate": "2020-09-10T03:29:00",
+ "modifiedDate": "2020-09-10T03:29:00",
+ "content": {
+ "customerKey": "testExisting_asset_message"
+ },
+ "subscriptions": {
+ "list": "All Subscribers - 277",
+ "dataExtension": "childBU_dataextension_test",
+ "autoAddSubscriber": true,
+ "updateSubscriber": true
+ },
+ "options": {
+ "trackLinks": true
+ },
+ "journey": {
+ "interactionKey": "testExisting_interaction"
+ }
+}
diff --git a/test/resources/9999999/messaging/v1/email/definitions/testExisting_temail/patch-response.json b/test/resources/9999999/messaging/v1/email/definitions/testExisting_temail/patch-response.json
new file mode 100644
index 000000000..2e07e5e93
--- /dev/null
+++ b/test/resources/9999999/messaging/v1/email/definitions/testExisting_temail/patch-response.json
@@ -0,0 +1,26 @@
+{
+ "requestId": "ae8511d0-9bf0-42d0-af4f-bd9c1218c812",
+ "name": "testExisting_temail",
+ "definitionKey": "testExisting_temail",
+ "definitionId": "0a650d90-755e-ed11-b852-48df37d1df5b",
+ "description": "updated via deploy",
+ "classification": "Default Transactional",
+ "status": "Active",
+ "createdDate": "2020-09-10T03:29:00",
+ "modifiedDate": "2020-09-10T03:29:00",
+ "content": {
+ "customerKey": "testExisting_asset_message"
+ },
+ "subscriptions": {
+ "list": "All Subscribers - 277",
+ "dataExtension": "childBU_dataextension_test",
+ "autoAddSubscriber": true,
+ "updateSubscriber": true
+ },
+ "options": {
+ "trackLinks": true
+ },
+ "journey": {
+ "interactionKey": "testExisting_interaction"
+ }
+}
diff --git a/test/resources/9999999/messaging/v1/push/definitions/get-response.json b/test/resources/9999999/messaging/v1/push/definitions/get-response.json
new file mode 100644
index 000000000..2ee2ff921
--- /dev/null
+++ b/test/resources/9999999/messaging/v1/push/definitions/get-response.json
@@ -0,0 +1,15 @@
+{
+ "requestId": "4a89b42d-9e71-4ddd-9b4e-a3b00edbfdfb",
+ "definitions": [
+ {
+ "name": "testExisting_tpush",
+ "definitionKey": "testExisting_tpush",
+ "status": "Active",
+ "createdDate": "2022-12-07T02:56:00",
+ "modifiedDate": "2022-12-07T02:56:00"
+ }
+ ],
+ "count": 1,
+ "page": 1,
+ "pageSize": 50
+}
diff --git a/test/resources/9999999/messaging/v1/push/definitions/post-response.json b/test/resources/9999999/messaging/v1/push/definitions/post-response.json
new file mode 100644
index 000000000..fcb7834ce
--- /dev/null
+++ b/test/resources/9999999/messaging/v1/push/definitions/post-response.json
@@ -0,0 +1,13 @@
+{
+ "requestId": "ee81df03-ab61-454d-a54a-025675cf2b41",
+ "name": "testNew_tpush",
+ "definitionKey": "testNew_tpush",
+ "definitionId": "2106d3f9-0c76-ed11-b849-48df37d1de8b",
+ "description": "created on deploy; note that applicationId can only be manually set up in Setup - Mobile Push",
+ "applicationId": "ffbab4c9-fbf6-4b87-9c9a-10c6ce86e81d",
+ "status": "Active",
+ "createdDate": "2022-12-07T02:56:00",
+ "modifiedDate": "2022-12-07T03:26:00",
+ "content": { "customerKey": "mobileMessage_test" },
+ "options": { "sound": "temp.wmv", "badge": "1" }
+}
diff --git a/test/resources/9999999/messaging/v1/push/definitions/testExisting_tpush/get-response.json b/test/resources/9999999/messaging/v1/push/definitions/testExisting_tpush/get-response.json
new file mode 100644
index 000000000..bb588cc0f
--- /dev/null
+++ b/test/resources/9999999/messaging/v1/push/definitions/testExisting_tpush/get-response.json
@@ -0,0 +1,13 @@
+{
+ "requestId": "64dac58f-f6d0-4bea-9489-eb058c491a87",
+ "name": "testExisting_tpush",
+ "definitionKey": "testExisting_tpush",
+ "definitionId": "2106d3f9-0c76-ed11-b849-48df37d1de8b",
+ "description": "bla bla. note that applicationId can only be manually set up in Setup - Mobile Push",
+ "applicationId": "ffbab4c9-fbf6-4b87-9c9a-10c6ce86e81d",
+ "status": "Active",
+ "createdDate": "2022-12-07T02:56:00",
+ "modifiedDate": "2022-12-07T02:56:00",
+ "content": { "customerKey": "mobileMessage_test" },
+ "options": { "sound": "temp.wmv", "badge": "1" }
+}
diff --git a/test/resources/9999999/messaging/v1/push/definitions/testExisting_tpush/patch-response.json b/test/resources/9999999/messaging/v1/push/definitions/testExisting_tpush/patch-response.json
new file mode 100644
index 000000000..8565f8f97
--- /dev/null
+++ b/test/resources/9999999/messaging/v1/push/definitions/testExisting_tpush/patch-response.json
@@ -0,0 +1,13 @@
+{
+ "requestId": "6d796b32-dff3-4564-ae36-f51edb0e5ec6",
+ "name": "testExisting_tpush",
+ "definitionKey": "testExisting_tpush",
+ "definitionId": "2106d3f9-0c76-ed11-b849-48df37d1de8b",
+ "description": "updated via deploy; note that applicationId can only be manually set up in Setup - Mobile Push",
+ "applicationId": "ffbab4c9-fbf6-4b87-9c9a-10c6ce86e81d",
+ "status": "Active",
+ "createdDate": "2022-12-07T02:56:00",
+ "modifiedDate": "2022-12-07T03:26:00",
+ "content": { "customerKey": "mobileMessage_test" },
+ "options": { "sound": "temp.wmv", "badge": "1" }
+}
diff --git a/test/resources/9999999/messaging/v1/sms/definitions/get-response.json b/test/resources/9999999/messaging/v1/sms/definitions/get-response.json
new file mode 100644
index 000000000..8e4f28a3f
--- /dev/null
+++ b/test/resources/9999999/messaging/v1/sms/definitions/get-response.json
@@ -0,0 +1,15 @@
+{
+ "requestId": "60c26a29-e1b0-4952-a566-476a937e4a5d",
+ "definitions": [
+ {
+ "name": "testExisting_tsms",
+ "definitionKey": "testExisting_tsms",
+ "status": "Active",
+ "createdDate": "2022-11-23T02:50:00",
+ "modifiedDate": "2022-11-25T08:01:00"
+ }
+ ],
+ "count": 1,
+ "page": 1,
+ "pageSize": 50
+}
diff --git a/test/resources/9999999/messaging/v1/sms/definitions/post-response.json b/test/resources/9999999/messaging/v1/sms/definitions/post-response.json
new file mode 100644
index 000000000..c66b9bda0
--- /dev/null
+++ b/test/resources/9999999/messaging/v1/sms/definitions/post-response.json
@@ -0,0 +1,17 @@
+{
+ "requestId": "582bec09-6d04-4222-bbba-cea616495596",
+ "name": "testNew_tsms",
+ "definitionKey": "testNew_tsms",
+ "description": "created on deploy",
+ "status": "Active",
+ "createdDate": "2022-11-07T02:24:00",
+ "modifiedDate": "2022-11-07T02:25:00",
+ "content": { "message": "\n%%[\n SET @key = 'new secret'\n]%%\n" },
+ "subscriptions": {
+ "shortCode": "4912312345678",
+ "countryCode": "",
+ "autoAddSubscriber": true,
+ "updateSubscriber": true,
+ "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
new file mode 100644
index 000000000..cfca58680
--- /dev/null
+++ b/test/resources/9999999/messaging/v1/sms/definitions/testExisting_tsms/get-response.json
@@ -0,0 +1,18 @@
+{
+ "requestId": "ae8511d0-9bf0-42d0-af4f-bd9c1218c812",
+ "name": "testExisting_tsms",
+ "definitionKey": "testExisting_tsms",
+ "definitionId": "0a650d90-755e-ed11-b852-48df37d1df5b",
+ "description": "bla bla",
+ "status": "Active",
+ "createdDate": "2022-11-07T02:24:00",
+ "modifiedDate": "2022-11-07T02:25:00",
+ "content": { "message": "%%[ SET @key = 'secret' ]%%" },
+ "subscriptions": {
+ "shortCode": "4912312345678",
+ "countryCode": "",
+ "autoAddSubscriber": true,
+ "updateSubscriber": true,
+ "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
new file mode 100644
index 000000000..cfca58680
--- /dev/null
+++ b/test/resources/9999999/messaging/v1/sms/definitions/testExisting_tsms/patch-response.json
@@ -0,0 +1,18 @@
+{
+ "requestId": "ae8511d0-9bf0-42d0-af4f-bd9c1218c812",
+ "name": "testExisting_tsms",
+ "definitionKey": "testExisting_tsms",
+ "definitionId": "0a650d90-755e-ed11-b852-48df37d1df5b",
+ "description": "bla bla",
+ "status": "Active",
+ "createdDate": "2022-11-07T02:24:00",
+ "modifiedDate": "2022-11-07T02:25:00",
+ "content": { "message": "%%[ SET @key = 'secret' ]%%" },
+ "subscriptions": {
+ "shortCode": "4912312345678",
+ "countryCode": "",
+ "autoAddSubscriber": true,
+ "updateSubscriber": true,
+ "keyword": "testExisting_keyword"
+ }
+}
diff --git a/test/resources/9999999/query/build-expected.json b/test/resources/9999999/query/build-expected.json
index b9350fcaa..565a2b238 100644
--- a/test/resources/9999999/query/build-expected.json
+++ b/test/resources/9999999/query/build-expected.json
@@ -1,8 +1,8 @@
{
"name": "testExistingQuery",
"key": "testExistingQuery",
- "description": "",
- "targetKey": "childBU_dataextension_test",
+ "description": "foobar",
+ "targetKey": "childBU_dataextension_testTarget",
"targetUpdateTypeName": "Overwrite",
"r__folder_Path": "Query"
}
diff --git a/test/resources/9999999/query/build-expected.sql b/test/resources/9999999/query/build-expected.sql
new file mode 100644
index 000000000..276ccd7aa
--- /dev/null
+++ b/test/resources/9999999/query/build-expected.sql
@@ -0,0 +1,6 @@
+SELECT
+ SubscriberKey as testField
+FROM
+ _Subscribers
+WHERE
+ country IN ('testTarget')
diff --git a/test/resources/9999999/query/get-expected.json b/test/resources/9999999/query/get-expected.json
index 42036a34e..84e4e0ff1 100644
--- a/test/resources/9999999/query/get-expected.json
+++ b/test/resources/9999999/query/get-expected.json
@@ -1,7 +1,7 @@
{
"name": "testExistingQuery",
"key": "testExistingQuery",
- "description": "",
+ "description": "bla bla",
"targetKey": "childBU_dataextension_test",
"createdDate": "2022-04-26T15:21:16.453",
"modifiedDate": "2022-04-26T16:02:44.01",
diff --git a/test/resources/9999999/query/get-expected.sql b/test/resources/9999999/query/get-expected.sql
new file mode 100644
index 000000000..e78525408
--- /dev/null
+++ b/test/resources/9999999/query/get-expected.sql
@@ -0,0 +1,6 @@
+SELECT
+ SubscriberKey as testField
+FROM
+ _Subscribers
+WHERE
+ country IN ('test')
diff --git a/test/resources/9999999/query/patch-expected.json b/test/resources/9999999/query/patch-expected.json
index ed7beb5a9..04612115e 100644
--- a/test/resources/9999999/query/patch-expected.json
+++ b/test/resources/9999999/query/patch-expected.json
@@ -1,7 +1,7 @@
{
"name": "testExistingQuery",
"key": "testExistingQuery",
- "description": "updated",
+ "description": "updated on deploy",
"targetKey": "childBU_dataextension_test",
"createdDate": "2022-04-26T15:21:16.453",
"modifiedDate": "2022-04-26T16:04:15.88",
diff --git a/test/resources/9999999/query/patch-expected.sql b/test/resources/9999999/query/patch-expected.sql
new file mode 100644
index 000000000..e78525408
--- /dev/null
+++ b/test/resources/9999999/query/patch-expected.sql
@@ -0,0 +1,6 @@
+SELECT
+ SubscriberKey as testField
+FROM
+ _Subscribers
+WHERE
+ country IN ('test')
diff --git a/test/resources/9999999/query/post-expected.json b/test/resources/9999999/query/post-expected.json
index fc647aca4..48adbd5b1 100644
--- a/test/resources/9999999/query/post-expected.json
+++ b/test/resources/9999999/query/post-expected.json
@@ -1,7 +1,7 @@
{
- "name": "testQuery",
- "key": "testQuery",
- "description": "",
+ "name": "testNewQuery",
+ "key": "testNewQuery",
+ "description": "created on deploy",
"targetKey": "childBU_dataextension_test",
"createdDate": "2022-04-26T15:21:16.453",
"modifiedDate": "2022-04-26T16:04:15.88",
diff --git a/test/resources/9999999/query/post-expected.sql b/test/resources/9999999/query/post-expected.sql
new file mode 100644
index 000000000..9eb673f71
--- /dev/null
+++ b/test/resources/9999999/query/post-expected.sql
@@ -0,0 +1,4 @@
+SELECT
+ SubscriberKey as testField
+FROM
+ _Subscribers
\ No newline at end of file
diff --git a/test/resources/9999999/query/template-expected.json b/test/resources/9999999/query/template-expected.json
index bbfa58ab7..5d04b46c4 100644
--- a/test/resources/9999999/query/template-expected.json
+++ b/test/resources/9999999/query/template-expected.json
@@ -1,7 +1,7 @@
{
"name": "testExistingQuery",
"key": "testExistingQuery",
- "description": "",
+ "description": "{{{description}}}",
"targetKey": "childBU_dataextension{{{suffix}}}",
"targetUpdateTypeName": "Overwrite",
"r__folder_Path": "Query"
diff --git a/test/resources/9999999/query/template-expected.sql b/test/resources/9999999/query/template-expected.sql
new file mode 100644
index 000000000..0ed1dc1cc
--- /dev/null
+++ b/test/resources/9999999/query/template-expected.sql
@@ -0,0 +1,6 @@
+SELECT
+ SubscriberKey as testField
+FROM
+ _Subscribers
+WHERE
+ country IN ({{{countryCodeIn}}})
diff --git a/test/resources/9999999/transactionalEmail/build-expected.json b/test/resources/9999999/transactionalEmail/build-expected.json
new file mode 100644
index 000000000..e3b7dad79
--- /dev/null
+++ b/test/resources/9999999/transactionalEmail/build-expected.json
@@ -0,0 +1,22 @@
+{
+ "name": "testExisting_temail",
+ "definitionKey": "testExisting_temail",
+ "description": "foobar",
+ "classification": "Default Transactional",
+ "status": "Active",
+ "content": {
+ "customerKey": "testExisting_asset_message"
+ },
+ "subscriptions": {
+ "dataExtension": "childBU_dataextension_testTarget",
+ "autoAddSubscriber": true,
+ "updateSubscriber": true,
+ "r__list_PathName": "my subscribers/All Subscribers"
+ },
+ "options": {
+ "trackLinks": true
+ },
+ "journey": {
+ "interactionKey": "testExisting_interaction"
+ }
+}
diff --git a/test/resources/9999999/transactionalEmail/get-expected.json b/test/resources/9999999/transactionalEmail/get-expected.json
new file mode 100644
index 000000000..c6f0dfcd7
--- /dev/null
+++ b/test/resources/9999999/transactionalEmail/get-expected.json
@@ -0,0 +1,24 @@
+{
+ "name": "testExisting_temail",
+ "definitionKey": "testExisting_temail",
+ "description": "bla bla",
+ "classification": "Default Transactional",
+ "status": "Active",
+ "createdDate": "2020-09-10T03:29:00",
+ "modifiedDate": "2020-09-10T03:29:00",
+ "content": {
+ "customerKey": "testExisting_asset_message"
+ },
+ "subscriptions": {
+ "dataExtension": "childBU_dataextension_test",
+ "autoAddSubscriber": true,
+ "updateSubscriber": true,
+ "r__list_PathName": "my subscribers/All Subscribers"
+ },
+ "options": {
+ "trackLinks": true
+ },
+ "journey": {
+ "interactionKey": "testExisting_interaction"
+ }
+}
diff --git a/test/resources/9999999/transactionalEmail/patch-expected.json b/test/resources/9999999/transactionalEmail/patch-expected.json
new file mode 100644
index 000000000..9d6c10fea
--- /dev/null
+++ b/test/resources/9999999/transactionalEmail/patch-expected.json
@@ -0,0 +1,24 @@
+{
+ "name": "testExisting_temail",
+ "definitionKey": "testExisting_temail",
+ "description": "updated via deploy",
+ "classification": "Default Transactional",
+ "status": "Active",
+ "createdDate": "2020-09-10T03:29:00",
+ "modifiedDate": "2020-09-10T03:29:00",
+ "content": {
+ "customerKey": "testExisting_asset_message"
+ },
+ "subscriptions": {
+ "dataExtension": "childBU_dataextension_test",
+ "autoAddSubscriber": true,
+ "updateSubscriber": true,
+ "r__list_PathName": "my subscribers/All Subscribers"
+ },
+ "options": {
+ "trackLinks": true
+ },
+ "journey": {
+ "interactionKey": "testExisting_interaction"
+ }
+}
diff --git a/test/resources/9999999/transactionalEmail/post-expected.json b/test/resources/9999999/transactionalEmail/post-expected.json
new file mode 100644
index 000000000..5f94f6127
--- /dev/null
+++ b/test/resources/9999999/transactionalEmail/post-expected.json
@@ -0,0 +1,24 @@
+{
+ "name": "testNew_temail",
+ "definitionKey": "testNew_temail",
+ "description": "created on deploy",
+ "classification": "Default Transactional",
+ "status": "Active",
+ "createdDate": "2022-12-06T06:08:00",
+ "modifiedDate": "2022-12-06T06:08:00",
+ "content": {
+ "customerKey": "testExisting_asset_message"
+ },
+ "subscriptions": {
+ "dataExtension": "childBU_dataextension_test",
+ "autoAddSubscriber": true,
+ "updateSubscriber": true,
+ "r__list_PathName": "my subscribers/All Subscribers"
+ },
+ "options": {
+ "trackLinks": true
+ },
+ "journey": {
+ "interactionKey": "1f936b41-cf1b-4207-aa33-715b3bf9eab7"
+ }
+}
diff --git a/test/resources/9999999/transactionalEmail/template-expected.json b/test/resources/9999999/transactionalEmail/template-expected.json
new file mode 100644
index 000000000..905f1162d
--- /dev/null
+++ b/test/resources/9999999/transactionalEmail/template-expected.json
@@ -0,0 +1,22 @@
+{
+ "name": "testExisting_temail",
+ "definitionKey": "testExisting_temail",
+ "description": "{{{description}}}",
+ "classification": "Default Transactional",
+ "status": "Active",
+ "content": {
+ "customerKey": "testExisting_asset_message"
+ },
+ "subscriptions": {
+ "dataExtension": "childBU_dataextension{{{suffix}}}",
+ "autoAddSubscriber": true,
+ "updateSubscriber": true,
+ "r__list_PathName": "my subscribers/All Subscribers"
+ },
+ "options": {
+ "trackLinks": true
+ },
+ "journey": {
+ "interactionKey": "testExisting_interaction"
+ }
+}
diff --git a/test/resources/9999999/transactionalPush/build-expected.json b/test/resources/9999999/transactionalPush/build-expected.json
new file mode 100644
index 000000000..89036d8a9
--- /dev/null
+++ b/test/resources/9999999/transactionalPush/build-expected.json
@@ -0,0 +1,8 @@
+{
+ "name": "testExisting_tpush",
+ "definitionKey": "testExisting_tpush",
+ "description": "foobar. note that applicationId can only be manually set up in Setup - Mobile Push",
+ "applicationId": "ffbab4c9-fbf6-4b87-9c9a-10c6ce86e81d",
+ "content": { "customerKey": "mobileMessage_testTarget" },
+ "options": { "sound": "temp.wmv", "badge": "1" }
+}
diff --git a/test/resources/9999999/transactionalPush/get-expected.json b/test/resources/9999999/transactionalPush/get-expected.json
new file mode 100644
index 000000000..242a9a809
--- /dev/null
+++ b/test/resources/9999999/transactionalPush/get-expected.json
@@ -0,0 +1,11 @@
+{
+ "name": "testExisting_tpush",
+ "definitionKey": "testExisting_tpush",
+ "description": "bla bla. note that applicationId can only be manually set up in Setup - Mobile Push",
+ "applicationId": "ffbab4c9-fbf6-4b87-9c9a-10c6ce86e81d",
+ "status": "Active",
+ "createdDate": "2022-12-07T02:56:00",
+ "modifiedDate": "2022-12-07T02:56:00",
+ "content": { "customerKey": "mobileMessage_test" },
+ "options": { "sound": "temp.wmv", "badge": "1" }
+}
diff --git a/test/resources/9999999/transactionalPush/patch-expected.json b/test/resources/9999999/transactionalPush/patch-expected.json
new file mode 100644
index 000000000..2cf1ecd9b
--- /dev/null
+++ b/test/resources/9999999/transactionalPush/patch-expected.json
@@ -0,0 +1,16 @@
+{
+ "definitionKey": "testExisting_tpush",
+ "name": "testExisting_tpush",
+ "status": "Active",
+ "applicationId": "ffbab4c9-fbf6-4b87-9c9a-10c6ce86e81d",
+ "description": "updated via deploy; note that applicationId can only be manually set up in Setup - Mobile Push",
+ "createdDate": "2022-12-07T02:56:00",
+ "modifiedDate": "2022-12-07T03:26:00",
+ "content": {
+ "customerKey": "mobileMessage_test"
+ },
+ "options": {
+ "sound": "temp.wmv",
+ "badge": "1"
+ }
+}
diff --git a/test/resources/9999999/transactionalPush/post-expected.json b/test/resources/9999999/transactionalPush/post-expected.json
new file mode 100644
index 000000000..7f87af359
--- /dev/null
+++ b/test/resources/9999999/transactionalPush/post-expected.json
@@ -0,0 +1,16 @@
+{
+ "definitionKey": "testNew_tpush",
+ "name": "testNew_tpush",
+ "status": "Active",
+ "applicationId": "ffbab4c9-fbf6-4b87-9c9a-10c6ce86e81d",
+ "description": "created on deploy; note that applicationId can only be manually set up in Setup - Mobile Push",
+ "createdDate": "2022-12-07T02:56:00",
+ "modifiedDate": "2022-12-07T03:26:00",
+ "content": {
+ "customerKey": "mobileMessage_test"
+ },
+ "options": {
+ "sound": "temp.wmv",
+ "badge": "1"
+ }
+}
diff --git a/test/resources/9999999/transactionalPush/template-expected.json b/test/resources/9999999/transactionalPush/template-expected.json
new file mode 100644
index 000000000..26266ff35
--- /dev/null
+++ b/test/resources/9999999/transactionalPush/template-expected.json
@@ -0,0 +1,8 @@
+{
+ "name": "testExisting_tpush",
+ "definitionKey": "testExisting_tpush",
+ "description": "{{{description}}}. note that applicationId can only be manually set up in Setup - Mobile Push",
+ "applicationId": "ffbab4c9-fbf6-4b87-9c9a-10c6ce86e81d",
+ "content": { "customerKey": "mobileMessage{{{suffix}}}" },
+ "options": { "sound": "temp.wmv", "badge": "1" }
+}
diff --git a/test/resources/9999999/transactionalSMS/build-expected.amp b/test/resources/9999999/transactionalSMS/build-expected.amp
new file mode 100644
index 000000000..006734caf
--- /dev/null
+++ b/test/resources/9999999/transactionalSMS/build-expected.amp
@@ -0,0 +1,4 @@
+
+%%[
+ SET @key = 'target secret'
+]%%
diff --git a/test/resources/9999999/transactionalSMS/build-expected.json b/test/resources/9999999/transactionalSMS/build-expected.json
new file mode 100644
index 000000000..b8985f3cd
--- /dev/null
+++ b/test/resources/9999999/transactionalSMS/build-expected.json
@@ -0,0 +1,13 @@
+{
+ "name": "testExisting_tsms",
+ "definitionKey": "testExisting_tsms",
+ "description": "foobar",
+ "status": "Active",
+ "subscriptions": {
+ "shortCode": "4912312345678",
+ "countryCode": "",
+ "autoAddSubscriber": true,
+ "updateSubscriber": true,
+ "keyword": "testExisting_keyword"
+ }
+}
diff --git a/test/resources/9999999/transactionalSMS/get-expected.amp b/test/resources/9999999/transactionalSMS/get-expected.amp
new file mode 100644
index 000000000..e4c5aff95
--- /dev/null
+++ b/test/resources/9999999/transactionalSMS/get-expected.amp
@@ -0,0 +1,4 @@
+
+%%[
+ SET @key = 'secret'
+]%%
diff --git a/test/resources/9999999/transactionalSMS/get-expected.json b/test/resources/9999999/transactionalSMS/get-expected.json
new file mode 100644
index 000000000..4cf9c7393
--- /dev/null
+++ b/test/resources/9999999/transactionalSMS/get-expected.json
@@ -0,0 +1,15 @@
+{
+ "name": "testExisting_tsms",
+ "definitionKey": "testExisting_tsms",
+ "description": "bla bla",
+ "status": "Active",
+ "createdDate": "2022-11-07T02:24:00",
+ "modifiedDate": "2022-11-07T02:25:00",
+ "subscriptions": {
+ "shortCode": "4912312345678",
+ "countryCode": "",
+ "autoAddSubscriber": true,
+ "updateSubscriber": true,
+ "keyword": "testExisting_keyword"
+ }
+}
diff --git a/test/resources/9999999/transactionalSMS/patch-expected.amp b/test/resources/9999999/transactionalSMS/patch-expected.amp
new file mode 100644
index 000000000..e4c5aff95
--- /dev/null
+++ b/test/resources/9999999/transactionalSMS/patch-expected.amp
@@ -0,0 +1,4 @@
+
+%%[
+ SET @key = 'secret'
+]%%
diff --git a/test/resources/9999999/transactionalSMS/patch-expected.json b/test/resources/9999999/transactionalSMS/patch-expected.json
new file mode 100644
index 000000000..4cf9c7393
--- /dev/null
+++ b/test/resources/9999999/transactionalSMS/patch-expected.json
@@ -0,0 +1,15 @@
+{
+ "name": "testExisting_tsms",
+ "definitionKey": "testExisting_tsms",
+ "description": "bla bla",
+ "status": "Active",
+ "createdDate": "2022-11-07T02:24:00",
+ "modifiedDate": "2022-11-07T02:25:00",
+ "subscriptions": {
+ "shortCode": "4912312345678",
+ "countryCode": "",
+ "autoAddSubscriber": true,
+ "updateSubscriber": true,
+ "keyword": "testExisting_keyword"
+ }
+}
diff --git a/test/resources/9999999/transactionalSMS/post-expected.amp b/test/resources/9999999/transactionalSMS/post-expected.amp
new file mode 100644
index 000000000..a1f4bd04f
--- /dev/null
+++ b/test/resources/9999999/transactionalSMS/post-expected.amp
@@ -0,0 +1,4 @@
+
+%%[
+ SET @key = 'new secret'
+]%%
diff --git a/test/resources/9999999/transactionalSMS/post-expected.json b/test/resources/9999999/transactionalSMS/post-expected.json
new file mode 100644
index 000000000..cb2fc540b
--- /dev/null
+++ b/test/resources/9999999/transactionalSMS/post-expected.json
@@ -0,0 +1,15 @@
+{
+ "name": "testNew_tsms",
+ "definitionKey": "testNew_tsms",
+ "description": "created on deploy",
+ "status": "Active",
+ "createdDate": "2022-11-07T02:24:00",
+ "modifiedDate": "2022-11-07T02:25:00",
+ "subscriptions": {
+ "shortCode": "4912312345678",
+ "countryCode": "",
+ "autoAddSubscriber": true,
+ "updateSubscriber": true,
+ "keyword": "testExisting_keyword"
+ }
+}
diff --git a/test/resources/9999999/transactionalSMS/template-expected.amp b/test/resources/9999999/transactionalSMS/template-expected.amp
new file mode 100644
index 000000000..29e5fcafe
--- /dev/null
+++ b/test/resources/9999999/transactionalSMS/template-expected.amp
@@ -0,0 +1,4 @@
+
+%%[
+ SET @key = '{{{secret}}}'
+]%%
diff --git a/test/resources/9999999/transactionalSMS/template-expected.json b/test/resources/9999999/transactionalSMS/template-expected.json
new file mode 100644
index 000000000..c0e2712b8
--- /dev/null
+++ b/test/resources/9999999/transactionalSMS/template-expected.json
@@ -0,0 +1,13 @@
+{
+ "name": "testExisting_tsms",
+ "definitionKey": "testExisting_tsms",
+ "description": "{{{description}}}",
+ "status": "Active",
+ "subscriptions": {
+ "shortCode": "4912312345678",
+ "countryCode": "",
+ "autoAddSubscriber": true,
+ "updateSubscriber": true,
+ "keyword": "testExisting_keyword"
+ }
+}
diff --git a/test/transactionalEmail.test.js b/test/transactionalEmail.test.js
new file mode 100644
index 000000000..489535791
--- /dev/null
+++ b/test/transactionalEmail.test.js
@@ -0,0 +1,120 @@
+const chai = require('chai');
+const chaiFiles = require('chai-files');
+const assert = chai.assert;
+chai.use(chaiFiles);
+const cache = require('../lib/util/cache');
+const testUtils = require('./utils');
+const handler = require('../lib/index');
+
+describe('transactionalEmail', () => {
+ beforeEach(() => {
+ testUtils.mockSetup();
+ });
+ afterEach(() => {
+ testUtils.mockReset();
+ });
+
+ describe('Retrieve ================', () => {
+ it('Should retrieve a transactionalEmail', async () => {
+ // WHEN
+ await handler.retrieve('testInstance/testBU', ['transactionalEmail']);
+ // THEN
+ // get results from cache
+ const result = cache.getCache();
+ assert.equal(
+ result.transactionalEmail ? Object.keys(result.transactionalEmail).length : 0,
+ 1,
+ 'only one transactionalEmail expected'
+ );
+ assert.deepEqual(
+ await testUtils.getActualJson('testExisting_temail', 'transactionalEmail'),
+ await testUtils.getExpectedJson('9999999', 'transactionalEmail', 'get'),
+ 'returned JSON was not equal expected'
+ );
+ assert.equal(
+ Object.values(testUtils.getAPIHistory()).flat().length,
+ 12,
+ 'Unexpected number of requests made'
+ );
+ return;
+ });
+ });
+ describe('Deploy ================', () => {
+ beforeEach(() => {
+ testUtils.mockSetup(true);
+ });
+ it('Should create & upsert a transactionalEmail', async () => {
+ // WHEN
+ await handler.deploy('testInstance/testBU', ['transactionalEmail']);
+ // THEN
+ // get results from cache
+ const result = cache.getCache();
+ assert.equal(
+ result.transactionalEmail ? Object.keys(result.transactionalEmail).length : 0,
+ 2,
+ 'two transactionalEmails expected'
+ );
+ // confirm created item
+ assert.deepEqual(
+ await testUtils.getActualJson('testNew_temail', 'transactionalEmail'),
+ await testUtils.getExpectedJson('9999999', 'transactionalEmail', 'post'),
+ 'returned JSON was not equal expected for insert transactionalEmail'
+ );
+ // confirm updated item
+ assert.deepEqual(
+ await testUtils.getActualJson('testExisting_temail', 'transactionalEmail'),
+ await testUtils.getExpectedJson('9999999', 'transactionalEmail', 'patch'),
+ 'returned JSON was not equal expected for update transactionalEmail'
+ );
+ // check number of API calls
+ assert.equal(
+ Object.values(testUtils.getAPIHistory()).flat().length,
+ 13,
+ 'Unexpected number of requests made'
+ );
+ return;
+ });
+ });
+ describe('Templating ================', () => {
+ // it.skip('Should create a transactionalEmail template via retrieveAsTemplate and build it');
+ it('Should create a transactionalEmail template via buildTemplate and build it', async () => {
+ // download first before we test buildTemplate
+ await handler.retrieve('testInstance/testBU', ['transactionalEmail']);
+ // buildTemplate
+ const result = await handler.buildTemplate(
+ 'testInstance/testBU',
+ 'transactionalEmail',
+ ['testExisting_temail'],
+ 'testSourceMarket'
+ );
+ assert.equal(
+ result.transactionalEmail ? Object.keys(result.transactionalEmail).length : 0,
+ 1,
+ 'only one transactionalEmail expected'
+ );
+ assert.deepEqual(
+ await testUtils.getActualTemplateJson('testExisting_temail', 'transactionalEmail'),
+ await testUtils.getExpectedJson('9999999', 'transactionalEmail', 'template'),
+ 'returned template JSON was not equal expected'
+ );
+ // buildDefinition
+ await handler.buildDefinition(
+ 'testInstance/testBU',
+ 'transactionalEmail',
+ 'testExisting_temail',
+ 'testTargetMarket'
+ );
+ assert.deepEqual(
+ await testUtils.getActualDeployJson('testExisting_temail', 'transactionalEmail'),
+ await testUtils.getExpectedJson('9999999', 'transactionalEmail', 'build'),
+ 'returned deployment JSON was not equal expected'
+ );
+ assert.equal(
+ Object.values(testUtils.getAPIHistory()).flat().length,
+ 12,
+ 'Unexpected number of requests made'
+ );
+ return;
+ });
+ });
+});
diff --git a/test/transactionalPush.test.js b/test/transactionalPush.test.js
new file mode 100644
index 000000000..4fa770568
--- /dev/null
+++ b/test/transactionalPush.test.js
@@ -0,0 +1,120 @@
+const chai = require('chai');
+const chaiFiles = require('chai-files');
+const assert = chai.assert;
+chai.use(chaiFiles);
+const cache = require('../lib/util/cache');
+const testUtils = require('./utils');
+const handler = require('../lib/index');
+
+describe('transactionalPush', () => {
+ beforeEach(() => {
+ testUtils.mockSetup();
+ });
+ afterEach(() => {
+ testUtils.mockReset();
+ });
+
+ describe('Retrieve ================', () => {
+ it('Should retrieve a transactionalPush', async () => {
+ // WHEN
+ await handler.retrieve('testInstance/testBU', ['transactionalPush']);
+ // THEN
+ // get results from cache
+ const result = cache.getCache();
+ assert.equal(
+ result.transactionalPush ? Object.keys(result.transactionalPush).length : 0,
+ 1,
+ 'only one transactionalPush expected'
+ );
+ assert.deepEqual(
+ await testUtils.getActualJson('testExisting_tpush', 'transactionalPush'),
+ await testUtils.getExpectedJson('9999999', 'transactionalPush', 'get'),
+ 'returned JSON was not equal expected'
+ );
+ assert.equal(
+ Object.values(testUtils.getAPIHistory()).flat().length,
+ 3,
+ 'Unexpected number of requests made'
+ );
+ return;
+ });
+ });
+ describe('Deploy ================', () => {
+ beforeEach(() => {
+ testUtils.mockSetup(true);
+ });
+ it('Should create & upsert a transactionalPush', async () => {
+ // WHEN
+ await handler.deploy('testInstance/testBU', ['transactionalPush']);
+ // THEN
+ // get results from cache
+ const result = cache.getCache();
+ assert.equal(
+ result.transactionalPush ? Object.keys(result.transactionalPush).length : 0,
+ 2,
+ 'two transactionalPushs expected'
+ );
+ // confirm created item
+ assert.deepEqual(
+ await testUtils.getActualJson('testNew_tpush', 'transactionalPush'),
+ await testUtils.getExpectedJson('9999999', 'transactionalPush', 'post'),
+ 'returned JSON was not equal expected for insert transactionalPush'
+ );
+ // confirm updated item
+ assert.deepEqual(
+ await testUtils.getActualJson('testExisting_tpush', 'transactionalPush'),
+ await testUtils.getExpectedJson('9999999', 'transactionalPush', 'patch'),
+ 'returned JSON was not equal expected for update transactionalPush'
+ );
+ // check number of API calls
+ assert.equal(
+ Object.values(testUtils.getAPIHistory()).flat().length,
+ 4,
+ 'Unexpected number of requests made'
+ );
+ return;
+ });
+ });
+ describe('Templating ================', () => {
+ // it.skip('Should create a transactionalPush template via retrieveAsTemplate and build it');
+ it('Should create a transactionalPush template via buildTemplate and build it', async () => {
+ // download first before we test buildTemplate
+ await handler.retrieve('testInstance/testBU', ['transactionalPush']);
+ // buildTemplate
+ const result = await handler.buildTemplate(
+ 'testInstance/testBU',
+ 'transactionalPush',
+ ['testExisting_tpush'],
+ 'testSourceMarket'
+ );
+ assert.equal(
+ result.transactionalPush ? Object.keys(result.transactionalPush).length : 0,
+ 1,
+ 'only one transactionalPush expected'
+ );
+ assert.deepEqual(
+ await testUtils.getActualTemplateJson('testExisting_tpush', 'transactionalPush'),
+ await testUtils.getExpectedJson('9999999', 'transactionalPush', 'template'),
+ 'returned template JSON was not equal expected'
+ );
+ // buildDefinition
+ await handler.buildDefinition(
+ 'testInstance/testBU',
+ 'transactionalPush',
+ 'testExisting_tpush',
+ 'testTargetMarket'
+ );
+ assert.deepEqual(
+ await testUtils.getActualDeployJson('testExisting_tpush', 'transactionalPush'),
+ await testUtils.getExpectedJson('9999999', 'transactionalPush', 'build'),
+ 'returned deployment JSON was not equal expected'
+ );
+ assert.equal(
+ Object.values(testUtils.getAPIHistory()).flat().length,
+ 3,
+ 'Unexpected number of requests made'
+ );
+ return;
+ });
+ });
+});
diff --git a/test/transactionalSMS.test.js b/test/transactionalSMS.test.js
new file mode 100644
index 000000000..79a6d28f4
--- /dev/null
+++ b/test/transactionalSMS.test.js
@@ -0,0 +1,149 @@
+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');
+
+describe('transactionalSMS', () => {
+ beforeEach(() => {
+ testUtils.mockSetup();
+ });
+ afterEach(() => {
+ testUtils.mockReset();
+ });
+
+ describe('Retrieve ================', () => {
+ it('Should retrieve a transactionalSMS', async () => {
+ // WHEN
+ await handler.retrieve('testInstance/testBU', ['transactionalSMS']);
+ // THEN
+ // get results from cache
+ const result = cache.getCache();
+ assert.equal(
+ result.transactionalSMS ? Object.keys(result.transactionalSMS).length : 0,
+ 1,
+ 'only one transactionalSMS expected'
+ );
+ assert.deepEqual(
+ await testUtils.getActualJson('testExisting_tsms', 'transactionalSMS'),
+ await testUtils.getExpectedJson('9999999', 'transactionalSMS', 'get'),
+ 'returned JSON was not equal expected'
+ );
+ expect(
+ file(testUtils.getActualFile('testExisting_tsms', 'transactionalSMS', 'amp'))
+ ).to.equal(
+ file(testUtils.getExpectedFile('9999999', 'transactionalSMS', 'get', 'amp'))
+ );
+ assert.equal(
+ Object.values(testUtils.getAPIHistory()).flat().length,
+ 4,
+ 'Unexpected number of requests made'
+ );
+ return;
+ });
+ });
+ describe('Deploy ================', () => {
+ beforeEach(() => {
+ testUtils.mockSetup(true);
+ });
+ it('Should create & upsert a transactionalSMS', async () => {
+ // WHEN
+ await handler.deploy('testInstance/testBU', ['transactionalSMS']);
+ // THEN
+ // get results from cache
+ const result = cache.getCache();
+ assert.equal(
+ result.transactionalSMS ? Object.keys(result.transactionalSMS).length : 0,
+ 2,
+ 'two transactionalSMSs expected'
+ );
+ // confirm created item
+ assert.deepEqual(
+ await testUtils.getActualJson('testNew_tsms', 'transactionalSMS'),
+ await testUtils.getExpectedJson('9999999', 'transactionalSMS', 'post'),
+ 'returned JSON was not equal expected for insert transactionalSMS'
+ );
+ expect(
+ file(testUtils.getActualFile('testNew_tsms', 'transactionalSMS', 'amp'))
+ ).to.equal(
+ file(testUtils.getExpectedFile('9999999', 'transactionalSMS', 'post', 'amp'))
+ );
+ // confirm updated item
+ assert.deepEqual(
+ await testUtils.getActualJson('testExisting_tsms', 'transactionalSMS'),
+ await testUtils.getExpectedJson('9999999', 'transactionalSMS', 'patch'),
+ 'returned JSON was not equal expected for update transactionalSMS'
+ );
+ expect(
+ file(testUtils.getActualFile('testExisting_tsms', 'transactionalSMS', 'amp'))
+ ).to.equal(
+ file(testUtils.getExpectedFile('9999999', 'transactionalSMS', 'patch', 'amp'))
+ );
+ // check number of API calls
+ assert.equal(
+ Object.values(testUtils.getAPIHistory()).flat().length,
+ 5,
+ 'Unexpected number of requests made'
+ );
+ return;
+ });
+ });
+ describe('Templating ================', () => {
+ // it.skip('Should create a transactionalSMS template via retrieveAsTemplate and build it');
+ it('Should create a transactionalSMS template via buildTemplate and build it', async () => {
+ // download first before we test buildTemplate
+ await handler.retrieve('testInstance/testBU', ['transactionalSMS']);
+ // buildTemplate
+ const result = await handler.buildTemplate(
+ 'testInstance/testBU',
+ 'transactionalSMS',
+ ['testExisting_tsms'],
+ 'testSourceMarket'
+ );
+ assert.equal(
+ result.transactionalSMS ? Object.keys(result.transactionalSMS).length : 0,
+ 1,
+ 'only one transactionalSMS expected'
+ );
+ assert.deepEqual(
+ await testUtils.getActualTemplateJson('testExisting_tsms', 'transactionalSMS'),
+ await testUtils.getExpectedJson('9999999', 'transactionalSMS', 'template'),
+ 'returned template JSON was not equal expected'
+ );
+ expect(
+ file(
+ testUtils.getActualTemplateFile('testExisting_tsms', 'transactionalSMS', 'amp')
+ )
+ ).to.equal(
+ file(testUtils.getExpectedFile('9999999', 'transactionalSMS', 'template', 'amp'))
+ );
+ // buildDefinition
+ await handler.buildDefinition(
+ 'testInstance/testBU',
+ 'transactionalSMS',
+ 'testExisting_tsms',
+ 'testTargetMarket'
+ );
+ assert.deepEqual(
+ await testUtils.getActualDeployJson('testExisting_tsms', 'transactionalSMS'),
+ await testUtils.getExpectedJson('9999999', 'transactionalSMS', 'build'),
+ 'returned deployment JSON was not equal expected'
+ );
+ expect(
+ file(testUtils.getActualDeployFile('testExisting_tsms', 'transactionalSMS', 'amp'))
+ ).to.equal(
+ file(testUtils.getExpectedFile('9999999', 'transactionalSMS', 'build', 'amp'))
+ );
+ assert.equal(
+ Object.values(testUtils.getAPIHistory()).flat().length,
+ 4,
+ 'Unexpected number of requests made'
+ );
+ return;
+ });
+ });
+});
diff --git a/test/utils.js b/test/utils.js
index 243bd0646..d2d1ab5c6 100644
--- a/test/utils.js
+++ b/test/utils.js
@@ -19,8 +19,18 @@ const resourceFactory = require('./resourceFactory');
* @param {string} type of metadata
* @returns {Promise.} file in string form
*/
-exports.getActualFile = (customerKey, type) =>
+exports.getActualJson = (customerKey, type) =>
File.readJSON(`./retrieve/testInstance/testBU/${type}/${customerKey}.${type}-meta.json`);
+/**
+ * gets file from Retrieve folder
+ *
+ * @param {string} customerKey of metadata
+ * @param {string} type of metadata
+ * @param {string} ext file extension
+ * @returns {Promise.} file in string form
+ */
+exports.getActualFile = (customerKey, type, ext) =>
+ `./retrieve/testInstance/testBU/${type}/${customerKey}.${type}-meta.${ext}`;
/**
* gets file from Deploy folder
*
@@ -28,8 +38,18 @@ exports.getActualFile = (customerKey, type) =>
* @param {string} type of metadata
* @returns {Promise.} file in string form
*/
-exports.getActualDeployFile = (customerKey, type) =>
+exports.getActualDeployJson = (customerKey, type) =>
File.readJSON(`./deploy/testInstance/testBU/${type}/${customerKey}.${type}-meta.json`);
+/**
+ * gets file from Deploy folder
+ *
+ * @param {string} customerKey of metadata
+ * @param {string} type of metadata
+ * @param {string} ext file extension
+ * @returns {Promise.} file in string form
+ */
+exports.getActualDeployFile = (customerKey, type, ext) =>
+ `./deploy/testInstance/testBU/${type}/${customerKey}.${type}-meta.${ext}`;
/**
* gets file from Template folder
*
@@ -37,8 +57,18 @@ exports.getActualDeployFile = (customerKey, type) =>
* @param {string} type of metadata
* @returns {Promise.} file in string form
*/
-exports.getActualTemplate = (customerKey, type) =>
+exports.getActualTemplateJson = (customerKey, type) =>
File.readJSON(`./template/${type}/${customerKey}.${type}-meta.json`);
+/**
+ * gets file from Template folder
+ *
+ * @param {string} customerKey of metadata
+ * @param {string} type of metadata
+ * @param {string} ext file extension
+ * @returns {Promise.} file in string form
+ */
+exports.getActualTemplateFile = (customerKey, type, ext) =>
+ `./template/${type}/${customerKey}.${type}-meta.${ext}`;
/**
* gets file from resources folder which should be used for comparison
@@ -48,14 +78,27 @@ exports.getActualTemplate = (customerKey, type) =>
* @param {string} action of SOAP request
* @returns {Promise.} file in string form
*/
-exports.getExpectedFile = (mid, type, action) =>
+exports.getExpectedJson = (mid, type, action) =>
File.readJSON(path.join('test', 'resources', mid, type, action + '-expected.json'));
+/**
+ * gets file from resources folder which should be used for comparison
+ *
+ * @param {number} mid of Business Unit
+ * @param {string} type of metadata
+ * @param {string} action of SOAP request
+ * @param {string} ext file extension
+ * @returns {Promise.} file in string form
+ */
+exports.getExpectedFile = (mid, type, action, ext) =>
+ path.join('test', 'resources', mid, type, action + '-expected.' + ext);
/**
* setup mocks for API and FS
*
+ * @param {boolean} [isDeploy] if true, will mock deploy folder
* @returns {void}
*/
-exports.mockSetup = () => {
+
+exports.mockSetup = (isDeploy) => {
Util.setLoggingLevel({ debug: true });
apimock = new MockAdapter(axios, { onNoMatch: 'throwException' });
// set access_token to mid to allow for autorouting of mock to correct resources
@@ -69,17 +112,22 @@ exports.mockSetup = () => {
apimock
.onAny(new RegExp(`^${escapeRegExp(resourceFactory.restUrl)}`))
.reply((config) => resourceFactory.handleRESTRequest(config));
- fsmock({
+ const fsMockConf = {
'.prettierrc': fsmock.load(path.resolve(__dirname, '../boilerplate/files/.prettierrc')),
'.mcdevrc.json': fsmock.load(path.resolve(__dirname, 'mockRoot/.mcdevrc.json')),
'.mcdev-auth.json': fsmock.load(path.resolve(__dirname, 'mockRoot/.mcdev-auth.json')),
'boilerplate/config.json': fsmock.load(
path.resolve(__dirname, '../boilerplate/config.json')
),
- deploy: fsmock.load(path.resolve(__dirname, 'mockRoot/deploy')),
test: fsmock.load(path.resolve(__dirname)),
- });
+ };
+ if (isDeploy) {
+ // load files we manually prepared for a direct test of `deploy` command
+ fsMockConf.deploy = fsmock.load(path.resolve(__dirname, 'mockRoot/deploy'));
+ }
+ fsmock(fsMockConf);
};
+
/**
* resets mocks for API and FS
*
@@ -87,6 +135,7 @@ exports.mockSetup = () => {
*/
exports.mockReset = () => {
auth.clearSessions();
+ fsmock.restore();
apimock.restore();
};
/**