diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 3566f965ec..ef4bb176cc 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -34,7 +34,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v3.5.3 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL diff --git a/.github/workflows/jira.yml b/.github/workflows/jira.yml index 5ddf87a65c..c4f9d9f575 100644 --- a/.github/workflows/jira.yml +++ b/.github/workflows/jira.yml @@ -7,7 +7,7 @@ jobs: if: ${{ github.actor == 'dependabot[bot]' || github.actor == 'snyk-bot' || contains(github.event.pull_request.head.ref, 'snyk-fix-') || contains(github.event.pull_request.head.ref, 'snyk-upgrade-')}} runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3.5.3 - name: Login into JIRA uses: atlassian/gajira-login@master env: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 259704b7d4..5fb673798b 100755 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -8,13 +8,13 @@ jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - uses: pnpm/action-setup@v2 + - uses: actions/checkout@v3.5.3 + - uses: pnpm/action-setup@v2.2.4 with: version: 7 - uses: actions/setup-node@v1 with: - node-version: '16.x' + node-version: '18.x' cache: 'pnpm' - name: Reading Configuration id: release_config @@ -32,7 +32,7 @@ jobs: working-directory: ./packages/contentstack-dev-dependencies run: npm run prepack - name: Publishing dev dependencies - uses: JS-DevTools/npm-publish@v1 + uses: JS-DevTools/npm-publish@v2.2.1 if: ${{ steps.dev-dependencies-installation.conclusion == 'success' }} with: token: ${{ secrets.NPM_TOKEN }} @@ -47,7 +47,7 @@ jobs: working-directory: ./packages/contentstack-utilities run: npm run prepack - name: Publishing utilities - uses: JS-DevTools/npm-publish@v1 + uses: JS-DevTools/npm-publish@v2.2.1 if: ${{ steps.utilities-installation.conclusion == 'success' }} with: token: ${{ secrets.NPM_TOKEN }} @@ -62,7 +62,7 @@ jobs: working-directory: ./packages/contentstack-command run: npm run prepack - name: Publishing command - uses: JS-DevTools/npm-publish@v1 + uses: JS-DevTools/npm-publish@v2.2.1 if: ${{ steps.command-installation.conclusion == 'success' }} with: token: ${{ secrets.NPM_TOKEN }} @@ -77,7 +77,7 @@ jobs: working-directory: ./packages/contentstack-config run: npm run prepack - name: Publishing config - uses: JS-DevTools/npm-publish@v1 + uses: JS-DevTools/npm-publish@v2.2.1 if: ${{ steps.config-installation.conclusion == 'success' }} with: token: ${{ secrets.NPM_TOKEN }} @@ -92,7 +92,7 @@ jobs: working-directory: ./packages/contentstack-auth run: npm run prepack - name: Publishing auth - uses: JS-DevTools/npm-publish@v1 + uses: JS-DevTools/npm-publish@v2.2.1 if: ${{ steps.auth-installation.conclusion == 'success' }} with: token: ${{ secrets.NPM_TOKEN }} @@ -102,8 +102,12 @@ jobs: if: ${{ env.release_releaseAll == 'true' || env.release_plugins_export == 'true'}} working-directory: ./packages/contentstack-export run: npm install + - name: Compiling export + if: ${{ steps.export-installation.conclusion == 'success' }} + working-directory: ./packages/contentstack-export + run: npm run prepack - name: Publishing export - uses: JS-DevTools/npm-publish@v1 + uses: JS-DevTools/npm-publish@v2.2.1 if: ${{ steps.export-installation.conclusion == 'success' }} with: token: ${{ secrets.NPM_TOKEN }} @@ -113,8 +117,12 @@ jobs: if: ${{env.release_releaseAll == 'true' || env.release_plugins_import == 'true'}} working-directory: ./packages/contentstack-import run: npm install + - name: Compiling import + if: ${{ steps.import-installation.conclusion == 'success' }} + working-directory: ./packages/contentstack-import + run: npm run prepack - name: Publishing import - uses: JS-DevTools/npm-publish@v1 + uses: JS-DevTools/npm-publish@v2.2.1 if: ${{ steps.import-installation.conclusion == 'success' }} with: token: ${{ secrets.NPM_TOKEN }} @@ -125,7 +133,7 @@ jobs: working-directory: ./packages/contentstack-clone run: npm install - name: Publishing clone - uses: JS-DevTools/npm-publish@v1 + uses: JS-DevTools/npm-publish@v2.2.1 if: ${{ steps.clone-installation.conclusion == 'success' }} with: token: ${{ secrets.NPM_TOKEN }} @@ -136,7 +144,7 @@ jobs: working-directory: ./packages/contentstack-export-to-csv run: npm install - name: Publishing export to csv - uses: JS-DevTools/npm-publish@v1 + uses: JS-DevTools/npm-publish@v2.2.1 if: ${{ steps.export-to-csv-installation.conclusion == 'success' }} with: token: ${{ secrets.NPM_TOKEN }} @@ -147,7 +155,7 @@ jobs: working-directory: ./packages/contentstack-migrate-rte run: npm install - name: Publishing migrate rte - uses: JS-DevTools/npm-publish@v1 + uses: JS-DevTools/npm-publish@v2.2.1 if: ${{ steps.migrate-rte-installation.conclusion == 'success' }} with: token: ${{ secrets.NPM_TOKEN }} @@ -158,7 +166,7 @@ jobs: working-directory: ./packages/contentstack-migration run: npm install - name: Publishing migration - uses: JS-DevTools/npm-publish@v1 + uses: JS-DevTools/npm-publish@v2.2.1 if: ${{ steps.migration-installation.conclusion == 'success' }} with: token: ${{ secrets.NPM_TOKEN }} @@ -173,7 +181,7 @@ jobs: working-directory: ./packages/contentstack-seed run: npm run prepack - name: Publishing seed - uses: JS-DevTools/npm-publish@v1 + uses: JS-DevTools/npm-publish@v2.2.1 if: ${{ steps.seed-installation.conclusion == 'success' }} with: token: ${{ secrets.NPM_TOKEN }} @@ -188,7 +196,7 @@ jobs: working-directory: ./packages/contentstack-bootstrap run: npm run prepack - name: Publishing bootstrap - uses: JS-DevTools/npm-publish@v1 + uses: JS-DevTools/npm-publish@v2.2.1 if: ${{ steps.bootstrap-installation.conclusion == 'success' }} with: token: ${{ secrets.NPM_TOKEN }} @@ -199,7 +207,7 @@ jobs: working-directory: ./packages/contentstack-bulk-publish run: npm install - name: Publishing bulk publish - uses: JS-DevTools/npm-publish@v1 + uses: JS-DevTools/npm-publish@v2.2.1 if: ${{ steps.bulk-publish-installation.conclusion == 'success' }} with: token: ${{ secrets.NPM_TOKEN }} @@ -214,7 +222,7 @@ jobs: working-directory: ./packages/contentstack-launch run: npm run prepack - name: Publishing launch - uses: JS-DevTools/npm-publish@v1 + uses: JS-DevTools/npm-publish@v2.2.1 if: ${{ steps.launch-installation.conclusion == 'success' }} with: token: ${{ secrets.NPM_TOKEN }} @@ -230,7 +238,7 @@ jobs: working-directory: ./packages/contentstack-branches run: npm run prepack - name: Publishing branches - uses: JS-DevTools/npm-publish@v1 + uses: JS-DevTools/npm-publish@v2.2.1 if: ${{ steps.branches-installation.conclusion == 'success' }} with: token: ${{ secrets.NPM_TOKEN }} @@ -241,14 +249,18 @@ jobs: if: ${{env.release_releaseAll == 'true' || env.release_plugins_core == 'true'}} working-directory: ./packages/contentstack run: npm install + - name: Compiling core + if: ${{ steps.core-installation.conclusion == 'success' }} + working-directory: ./packages/contentstack + run: npm run prepack - name: Publishing core id: publish-core - uses: JS-DevTools/npm-publish@v1 + uses: JS-DevTools/npm-publish@v2.2.1 if: ${{ steps.core-installation.conclusion == 'success' }} with: token: ${{ secrets.NPM_TOKEN }} package: ./packages/contentstack/package.json - - uses: actions/checkout@v2 + - uses: actions/checkout@v3.5.3 with: ref: 'prod-qa-pipeline' - run: echo ${{ steps.publish-core.outputs.version }} > version.md @@ -256,12 +268,7 @@ jobs: with: message: 'Released version' - name: Create Release - uses: actions/create-release@v1 id: create_release env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - tag_name: v${{ steps.publish-core.outputs.version }} - release_name: Release ${{ steps.publish-core.outputs.version }} - draft: false # Default value, but nice to set explicitly - prerelease: false # Default value, but nice to set explicitly + run: gh release create v${{ steps.publish-core.outputs.version }} --title "Release ${{ steps.publish-core.outputs.version }}" --generate-notes diff --git a/.github/workflows/sast-scan.yml b/.github/workflows/sast-scan.yml deleted file mode 100644 index f9316303a9..0000000000 --- a/.github/workflows/sast-scan.yml +++ /dev/null @@ -1,11 +0,0 @@ -name: SAST Scan -on: - pull_request: - types: [opened, synchronize, reopened] -jobs: - security: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Horusec Scan - run: docker run -v /var/run/docker.sock:/var/run/docker.sock -v $(pwd):/src horuszup/horusec-cli:latest horusec start -p /src -P $(pwd) \ No newline at end of file diff --git a/.github/workflows/sca-scan.yml b/.github/workflows/sca-scan.yml index f3fee00926..21ac795a5b 100644 --- a/.github/workflows/sca-scan.yml +++ b/.github/workflows/sca-scan.yml @@ -10,10 +10,10 @@ jobs: - uses: pnpm/action-setup@v2 with: version: 7 - - name: Use Node.js 16.x - uses: actions/setup-node@v3 + - name: Use Node.js 18.x + uses: actions/setup-node@v3.7.0 with: - node-version: '16.x' + node-version: '18.x' cache: 'pnpm' - name: Install dependencies run: pnpm install --no-frozen-lockfile diff --git a/.github/workflows/secrets-scan.yml b/.github/workflows/secrets-scan.yml deleted file mode 100644 index 1e8f176164..0000000000 --- a/.github/workflows/secrets-scan.yml +++ /dev/null @@ -1,11 +0,0 @@ -name: Secrets Scan -on: - pull_request: - types: [opened, synchronize, reopened] -jobs: - security: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Gittyleaks - uses: gupy-io/gittyleaks-action@v0.1 \ No newline at end of file diff --git a/.gitignore b/.gitignore index be51e1eb9d..636bcbe56e 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,4 @@ oclif.manifest.json contentstack-cli-logs packages/**/package-lock.json .dccache +yarn.lock \ No newline at end of file diff --git a/README.md b/README.md index 43b8e03a27..8aa26668ec 100755 --- a/README.md +++ b/README.md @@ -3,30 +3,37 @@ Contentstack is a headless CMS with an API-first approach that puts content at the centre. It is designed to simplify the process of publication by separating code from content. -Currently, the CLI is in Beta and supports content management scripts through which you can perform the following tasks: +CLI supports content management scripts through which you can perform the following tasks: - Bulk publish content -- Export content +- Export content - Import content - Clone Stack -- Seed Stack from Github +- Seed Stack from GitHub +- Perform Launch operations +- Migrate content +- Migrate HTML RTE to JSON RTE content +- Change Master Locale +- Use Bootstrap plugin +- Use Tsgen plugin + ## Installing CLI ### Prerequisites Contentstack account -Node.js version 8 or above +Node.js version 16 or above ### Installation To install CLI on your system, run the below command in your terminal: ``` -npm install -g @contentstack/cli +npm install -g @contentstack/cli ``` To verify the installation, run `csdx` in the command window. ## Usage -After the successful installation of CLI, use the `--help` parameter to display the help section of the CLI. You can even combine this parameter with a specific command to get the help section of that command. +After the successful installation of CLI, use the `--help` parameter to display the help section of the CLI. You can even combine this parameter with a specific command to get the help section of that command. ```shell $ csdx --help diff --git a/package-lock.json b/package-lock.json index 97183daf78..978c6447b6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,6 +18,15 @@ "node": ">=14.0.0" } }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/@ampproject/remapping": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", @@ -32,14 +41,14 @@ } }, "node_modules/@apollo/client": { - "version": "3.7.14", - "resolved": "https://registry.npmjs.org/@apollo/client/-/client-3.7.14.tgz", - "integrity": "sha512-BRvdkwq5PAXBkjXjboO12uksDm3nrZEqDi4xF97Fk3Mnaa0zDOEfJa7hoKTY9b9KA1EkeWv9BL3i7hSd4SfGBg==", + "version": "3.7.17", + "resolved": "https://registry.npmjs.org/@apollo/client/-/client-3.7.17.tgz", + "integrity": "sha512-0EErSHEtKPNl5wgWikHJbKFAzJ/k11O0WO2QyqZSHpdxdAnw7UWHY4YiLbHCFG7lhrD+NTQ3Z/H9Jn4rcikoJA==", "dependencies": { "@graphql-typed-document-node/core": "^3.1.1", "@wry/context": "^0.7.0", "@wry/equality": "^0.5.0", - "@wry/trie": "^0.3.0", + "@wry/trie": "^0.4.0", "graphql-tag": "^2.12.6", "hoist-non-react-statics": "^3.3.2", "optimism": "^0.16.2", @@ -73,47 +82,47 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", - "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", + "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", "dev": true, "dependencies": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.21.9", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.9.tgz", - "integrity": "sha512-FUGed8kfhyWvbYug/Un/VPJD41rDIgoVVcR+FuzhzOYyRz5uED+Gd3SLZml0Uw2l2aHFb7ZgdW5mGA3G2cCCnQ==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", + "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.21.8", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.8.tgz", - "integrity": "sha512-YeM22Sondbo523Sz0+CirSPnbj9bG3P0CdHcBZdqUuaeOaYEFbOLoGU7lebvGP6P5J/WE9wOn7u7C4J9HvS1xQ==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.9.tgz", + "integrity": "sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.5", - "@babel/helper-compilation-targets": "^7.21.5", - "@babel/helper-module-transforms": "^7.21.5", - "@babel/helpers": "^7.21.5", - "@babel/parser": "^7.21.8", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.5", - "@babel/types": "^7.21.5", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.9", + "@babel/helper-module-transforms": "^7.22.9", + "@babel/helpers": "^7.22.6", + "@babel/parser": "^7.22.7", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.8", + "@babel/types": "^7.22.5", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.2", - "semver": "^6.3.0" + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -124,23 +133,23 @@ } }, "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==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/eslint-parser": { - "version": "7.21.8", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.21.8.tgz", - "integrity": "sha512-HLhI+2q+BP3sf78mFUZNCGc10KEmoUqtUT1OCdMZsN+qr4qFeLUod62/zAnF3jNQstwyasDkZnVXwfK2Bml7MQ==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.22.9.tgz", + "integrity": "sha512-xdMkt39/nviO/4vpVdrEYPwXCsYIXSSAr6mC7WQsNIlGnuxKyKE7GZjalcnbSWiC4OXGNNN3UQPeHfjSC6sTDA==", "dev": true, "dependencies": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", "eslint-visitor-keys": "^2.1.0", - "semver": "^6.3.0" + "semver": "^6.3.1" }, "engines": { "node": "^10.13.0 || ^12.13.0 || >=14.0.0" @@ -160,21 +169,21 @@ } }, "node_modules/@babel/eslint-parser/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/generator": { - "version": "7.21.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.9.tgz", - "integrity": "sha512-F3fZga2uv09wFdEjEQIJxXALXfz0+JaOb7SabvVMmjHxeVTuGW8wgE8Vp1Hd7O+zMTYtcfEISGRzPkeiaPPsvg==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.9.tgz", + "integrity": "sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==", "dev": true, "dependencies": { - "@babel/types": "^7.21.5", + "@babel/types": "^7.22.5", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -184,16 +193,16 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.5.tgz", - "integrity": "sha512-1RkbFGUKex4lvsB9yhIfWltJM5cZKUftB2eNajaDv3dCMEp49iBG0K14uH8NnX9IPux2+mK7JGEOB0jn48/J6w==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz", + "integrity": "sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.21.5", - "@babel/helper-validator-option": "^7.21.0", - "browserslist": "^4.21.3", + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.5", + "browserslist": "^4.21.9", "lru-cache": "^5.1.1", - "semver": "^6.3.0" + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -203,160 +212,160 @@ } }, "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==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.21.5.tgz", - "integrity": "sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", - "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", "dev": true, "dependencies": { - "@babel/template": "^7.20.7", - "@babel/types": "^7.21.0" + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", - "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", "dev": true, "dependencies": { - "@babel/types": "^7.21.4" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.5.tgz", - "integrity": "sha512-bI2Z9zBGY2q5yMHoBvJ2a9iX3ZOAzJPm7Q8Yz6YeoUjU/Cvhmi2G4QyTNyPBqqXSgTjUxRg3L0xV45HvkNWWBw==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", + "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.21.5", - "@babel/helper-module-imports": "^7.21.4", - "@babel/helper-simple-access": "^7.21.5", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.5", - "@babel/types": "^7.21.5" + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.5" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz", - "integrity": "sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz", - "integrity": "sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dev": true, "dependencies": { - "@babel/types": "^7.21.5" + "@babel/types": "^7.22.5" }, "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", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz", - "integrity": "sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", "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", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", - "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", + "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.5.tgz", - "integrity": "sha512-BSY+JSlHxOmGsPTydUkPf1MdMQ3M81x5xGCOVgWM3G8XH77sJ292Y2oqcp0CbbgxhqBuI46iUz1tT7hqP7EfgA==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.6.tgz", + "integrity": "sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==", "dev": true, "dependencies": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.5", - "@babel/types": "^7.21.5" + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.6", + "@babel/types": "^7.22.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", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", + "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", + "@babel/helper-validator-identifier": "^7.22.5", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, @@ -436,9 +445,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.21.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.9.tgz", - "integrity": "sha512-q5PNg/Bi1OpGgx5jYlvWZwAorZepEudDMCLtj967aeS7WMont7dUZI46M2XwcIQqvUlMxWfdLFu4S/qSxeUu5g==", + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz", + "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -508,12 +517,12 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz", - "integrity": "sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", + "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -610,12 +619,12 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz", - "integrity": "sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", + "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -625,9 +634,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.5.tgz", - "integrity": "sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", + "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", "dev": true, "dependencies": { "regenerator-runtime": "^0.13.11" @@ -637,33 +646,33 @@ } }, "node_modules/@babel/template": { - "version": "7.21.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.21.9.tgz", - "integrity": "sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.21.4", - "@babel/parser": "^7.21.9", - "@babel/types": "^7.21.5" + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.5.tgz", - "integrity": "sha512-AhQoI3YjWi6u/y/ntv7k48mcrCXmus0t79J9qPNlk/lAsFlCiJ047RmbfMOawySTHtywXhbXgpx/8nXMYd+oFw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.5", - "@babel/helper-environment-visitor": "^7.21.5", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.5", - "@babel/types": "^7.21.5", + "version": "7.22.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.8.tgz", + "integrity": "sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.7", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.7", + "@babel/types": "^7.22.5", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -681,13 +690,13 @@ } }, "node_modules/@babel/types": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.5.tgz", - "integrity": "sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", + "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.21.5", - "@babel/helper-validator-identifier": "^7.19.1", + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", "to-fast-properties": "^2.0.0" }, "engines": { @@ -701,9 +710,9 @@ "dev": true }, "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", + "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", "engines": { "node": ">=0.1.90" } @@ -798,9 +807,9 @@ } }, "node_modules/@contentstack/management": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@contentstack/management/-/management-1.8.0.tgz", - "integrity": "sha512-rKI9CEwwmh8L0f5OaicjBlty0O77BT3KiHkPj23rJ2lLWlas7RlWaVhbavXJASSpS0w1FWx8+BmGwkaAoRVyRg==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@contentstack/management/-/management-1.10.0.tgz", + "integrity": "sha512-wnmVS19n3cZeh6T2PbBXGCr4irktunVmuECTyPF5++Rsc6GDO+FoQGCZdvzHpRZE0GLiPFIID50z2TZuNArEOg==", "dependencies": { "axios": "^0.27.2", "form-data": "^3.0.1", @@ -906,14 +915,14 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", - "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz", + "integrity": "sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.5.2", + "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -969,9 +978,9 @@ "dev": true }, "node_modules/@eslint/js": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.41.0.tgz", - "integrity": "sha512-LxcyMGxwmTh2lY9FwHPGWOHmYFCZvbrFCBZL4FzSSsxsRPuhrYUg/49/0KDfW8tnIEaEHtfmn6+NPN+1DqaNmA==", + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz", + "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1028,9 +1037,9 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", @@ -1125,9 +1134,9 @@ } }, "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "dependencies": { "ansi-regex": "^6.0.1" @@ -1249,16 +1258,16 @@ } }, "node_modules/@jest/console": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.5.0.tgz", - "integrity": "sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.1.tgz", + "integrity": "sha512-Aj772AYgwTSr5w8qnyoJ0eDYvN6bMsH3ORH1ivMotrInHLKdUz6BDlaEXHdM6kODaBIkNIyQGzsMvRdOv7VG7Q==", "dev": true, "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.1", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0", + "jest-message-util": "^29.6.1", + "jest-util": "^29.6.1", "slash": "^3.0.0" }, "engines": { @@ -1266,16 +1275,16 @@ } }, "node_modules/@jest/core": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.5.0.tgz", - "integrity": "sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.1.tgz", + "integrity": "sha512-CcowHypRSm5oYQ1obz1wfvkjZZ2qoQlrKKvlfPwh5jUXVU12TWr2qMeH8chLMuTFzHh5a1g2yaqlqDICbr+ukQ==", "dev": true, "dependencies": { - "@jest/console": "^29.5.0", - "@jest/reporters": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/console": "^29.6.1", + "@jest/reporters": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", @@ -1283,20 +1292,20 @@ "exit": "^0.1.2", "graceful-fs": "^4.2.9", "jest-changed-files": "^29.5.0", - "jest-config": "^29.5.0", - "jest-haste-map": "^29.5.0", - "jest-message-util": "^29.5.0", + "jest-config": "^29.6.1", + "jest-haste-map": "^29.6.1", + "jest-message-util": "^29.6.1", "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.5.0", - "jest-resolve-dependencies": "^29.5.0", - "jest-runner": "^29.5.0", - "jest-runtime": "^29.5.0", - "jest-snapshot": "^29.5.0", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", - "jest-watcher": "^29.5.0", + "jest-resolve": "^29.6.1", + "jest-resolve-dependencies": "^29.6.1", + "jest-runner": "^29.6.1", + "jest-runtime": "^29.6.1", + "jest-snapshot": "^29.6.1", + "jest-util": "^29.6.1", + "jest-validate": "^29.6.1", + "jest-watcher": "^29.6.1", "micromatch": "^4.0.4", - "pretty-format": "^29.5.0", + "pretty-format": "^29.6.1", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, @@ -1325,12 +1334,12 @@ } }, "node_modules/@jest/core/node_modules/pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", + "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", "dev": true, "dependencies": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.0", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -1345,37 +1354,37 @@ "dev": true }, "node_modules/@jest/environment": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.5.0.tgz", - "integrity": "sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.1.tgz", + "integrity": "sha512-RMMXx4ws+Gbvw3DfLSuo2cfQlK7IwGbpuEWXCqyYDcqYTI+9Ju3a5hDnXaxjNsa6uKh9PQF2v+qg+RLe63tz5A==", "dev": true, "dependencies": { - "@jest/fake-timers": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/fake-timers": "^29.6.1", + "@jest/types": "^29.6.1", "@types/node": "*", - "jest-mock": "^29.5.0" + "jest-mock": "^29.6.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.5.0.tgz", - "integrity": "sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.1.tgz", + "integrity": "sha512-N5xlPrAYaRNyFgVf2s9Uyyvr795jnB6rObuPx4QFvNJz8aAjpZUDfO4bh5G/xuplMID8PrnuF1+SfSyDxhsgYg==", "dev": true, "dependencies": { - "expect": "^29.5.0", - "jest-snapshot": "^29.5.0" + "expect": "^29.6.1", + "jest-snapshot": "^29.6.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.5.0.tgz", - "integrity": "sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.1.tgz", + "integrity": "sha512-o319vIf5pEMx0LmzSxxkYYxo4wrRLKHq9dP1yJU7FoPTB0LfAKSz8SWD6D/6U3v/O52t9cF5t+MeJiRsfk7zMw==", "dev": true, "dependencies": { "jest-get-type": "^29.4.3" @@ -1385,49 +1394,49 @@ } }, "node_modules/@jest/fake-timers": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.5.0.tgz", - "integrity": "sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.1.tgz", + "integrity": "sha512-RdgHgbXyosCDMVYmj7lLpUwXA4c69vcNzhrt69dJJdf8azUrpRh3ckFCaTPNjsEeRi27Cig0oKDGxy5j7hOgHg==", "dev": true, "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.1", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^29.5.0", - "jest-mock": "^29.5.0", - "jest-util": "^29.5.0" + "jest-message-util": "^29.6.1", + "jest-mock": "^29.6.1", + "jest-util": "^29.6.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/globals": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.5.0.tgz", - "integrity": "sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.1.tgz", + "integrity": "sha512-2VjpaGy78JY9n9370H8zGRCFbYVWwjY6RdDMhoJHa1sYfwe6XM/azGN0SjY8kk7BOZApIejQ1BFPyH7FPG0w3A==", "dev": true, "dependencies": { - "@jest/environment": "^29.5.0", - "@jest/expect": "^29.5.0", - "@jest/types": "^29.5.0", - "jest-mock": "^29.5.0" + "@jest/environment": "^29.6.1", + "@jest/expect": "^29.6.1", + "@jest/types": "^29.6.1", + "jest-mock": "^29.6.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.5.0.tgz", - "integrity": "sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.1.tgz", + "integrity": "sha512-9zuaI9QKr9JnoZtFQlw4GREQbxgmNYXU6QuWtmuODvk5nvPUeBYapVR/VYMyi2WSx3jXTLJTJji8rN6+Cm4+FA==", "dev": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", - "@jridgewell/trace-mapping": "^0.3.15", + "@jest/console": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", + "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", @@ -1439,9 +1448,9 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0", - "jest-worker": "^29.5.0", + "jest-message-util": "^29.6.1", + "jest-util": "^29.6.1", + "jest-worker": "^29.6.1", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", @@ -1460,24 +1469,24 @@ } }, "node_modules/@jest/schemas": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", - "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz", + "integrity": "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==", "dev": true, "dependencies": { - "@sinclair/typebox": "^0.25.16" + "@sinclair/typebox": "^0.27.8" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/source-map": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.4.3.tgz", - "integrity": "sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w==", + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.0.tgz", + "integrity": "sha512-oA+I2SHHQGxDCZpbrsCQSoMLb3Bz547JnM+jUr9qEbuw0vQlWZfpPS7CO9J7XiwKicEz9OFn/IYoLkkiUD7bzA==", "dev": true, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.15", + "@jridgewell/trace-mapping": "^0.3.18", "callsites": "^3.0.0", "graceful-fs": "^4.2.9" }, @@ -1486,13 +1495,13 @@ } }, "node_modules/@jest/test-result": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.5.0.tgz", - "integrity": "sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.1.tgz", + "integrity": "sha512-Ynr13ZRcpX6INak0TPUukU8GWRfm/vAytE3JbJNGAvINySWYdfE7dGZMbk36oVuK4CigpbhMn8eg1dixZ7ZJOw==", "dev": true, "dependencies": { - "@jest/console": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/console": "^29.6.1", + "@jest/types": "^29.6.1", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" }, @@ -1501,14 +1510,14 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.5.0.tgz", - "integrity": "sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.1.tgz", + "integrity": "sha512-oBkC36PCDf/wb6dWeQIhaviU0l5u6VCsXa119yqdUosYAt7/FbQU2M2UoziO3igj/HBDEgp57ONQ3fm0v9uyyg==", "dev": true, "dependencies": { - "@jest/test-result": "^29.5.0", + "@jest/test-result": "^29.6.1", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", + "jest-haste-map": "^29.6.1", "slash": "^3.0.0" }, "engines": { @@ -1516,22 +1525,22 @@ } }, "node_modules/@jest/transform": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.5.0.tgz", - "integrity": "sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.1.tgz", + "integrity": "sha512-URnTneIU3ZjRSaf906cvf6Hpox3hIeJXRnz3VDSw5/X93gR8ycdfSIEy19FlVx8NFmpN7fe3Gb1xF+NjXaQLWg==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", - "@jest/types": "^29.5.0", - "@jridgewell/trace-mapping": "^0.3.15", + "@jest/types": "^29.6.1", + "@jridgewell/trace-mapping": "^0.3.18", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", + "jest-haste-map": "^29.6.1", "jest-regex-util": "^29.4.3", - "jest-util": "^29.5.0", + "jest-util": "^29.6.1", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", @@ -1548,12 +1557,12 @@ "dev": true }, "node_modules/@jest/types": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz", - "integrity": "sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.1.tgz", + "integrity": "sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==", "dev": true, "dependencies": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.0", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", @@ -1637,28 +1646,6 @@ "eslint-scope": "5.1.1" } }, - "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -1954,9 +1941,9 @@ } }, "node_modules/@oclif/color": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@oclif/color/-/color-1.0.5.tgz", - "integrity": "sha512-CeUDnzGOt3G7k6KJolTueTMYfJnU/zc6MouwF3sgL+7lnrwTiLaLwQ384EVFtUaIlRHNA0WifGh6FHKc8jqw2g==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@oclif/color/-/color-1.0.8.tgz", + "integrity": "sha512-XD1MLzkVsPzlkTN6OV0DeN/5iK/bv/MpGRnAZ+lCc20LO0Tyjyph6DUdoRNTJ4iMqliJt32uE3FrFK+Qms2Kjg==", "dependencies": { "ansi-styles": "^4.2.1", "chalk": "^4.1.0", @@ -1969,16 +1956,16 @@ } }, "node_modules/@oclif/command": { - "version": "1.8.26", - "resolved": "https://registry.npmjs.org/@oclif/command/-/command-1.8.26.tgz", - "integrity": "sha512-IT9kOLFRMc3s6KJ1FymsNjbHShI211eVgAg+JMiDVl8LXwOJxYe8ybesgL1kpV9IUFByOBwZKNG2mmrVeNBHPg==", + "version": "1.8.32", + "resolved": "https://registry.npmjs.org/@oclif/command/-/command-1.8.32.tgz", + "integrity": "sha512-vPoSvNM08RCHRcwBK9AyXQW+Np4Ba1ny6tSHTT8G+mqrYDWoCNBx0BD4n58laB1X8rFJ8rMi+L5S8tPAnAZ93w==", "dependencies": { "@oclif/config": "^1.18.2", "@oclif/errors": "^1.3.6", "@oclif/help": "^1.0.1", - "@oclif/parser": "^3.8.11", + "@oclif/parser": "^3.8.14", "debug": "^4.1.1", - "semver": "^7.5.1" + "semver": "^7.5.4" }, "engines": { "node": ">=12.0.0" @@ -1988,12 +1975,12 @@ } }, "node_modules/@oclif/config": { - "version": "1.18.9", - "resolved": "https://registry.npmjs.org/@oclif/config/-/config-1.18.9.tgz", - "integrity": "sha512-CGABvY60IbzK3kecDekCQS4T7fvpraBHV3nvYDtehrqljbMxtTeeJkFJVLbBnZnwzD2u1ApQX/Zggja3lyCoJA==", + "version": "1.18.13", + "resolved": "https://registry.npmjs.org/@oclif/config/-/config-1.18.13.tgz", + "integrity": "sha512-Ja0KJvRBYm6xwgJpdn9oZ1DofE7MZ2wB320dblHDOdVQcpKRHnX64R0BlEqXsU6jJO7w95iy1geeKFxIVmfuWA==", "dependencies": { "@oclif/errors": "^1.3.6", - "@oclif/parser": "^3.8.11", + "@oclif/parser": "^3.8.14", "debug": "^4.3.4", "globby": "^11.1.0", "is-wsl": "^2.1.1", @@ -2023,9 +2010,9 @@ } }, "node_modules/@oclif/core": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/@oclif/core/-/core-2.8.5.tgz", - "integrity": "sha512-316DLfrHQDYmWDriI4Woxk9y1wVUrPN1sZdbQLHdOdlTA9v/twe7TdHpWOriEypfl6C85NWEJKc1870yuLtjrQ==", + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/@oclif/core/-/core-2.9.3.tgz", + "integrity": "sha512-0KLiVpXCJivAjLoj/LAXQf85MtGzyforyPkgNJQEP6QQugnuq2kHcG+DojWEQYz0sADXT2259EdPibslEThUMg==", "dependencies": { "@types/cli-progress": "^3.11.0", "ansi-escapes": "^4.3.2", @@ -2046,7 +2033,8 @@ "natural-orderby": "^2.0.3", "object-treeify": "^1.1.33", "password-prompt": "^1.1.2", - "semver": "^7.3.7", + "semver": "^7.5.3", + "slice-ansi": "^4.0.0", "string-width": "^4.2.3", "strip-ansi": "^6.0.1", "supports-color": "^8.1.1", @@ -2061,6 +2049,14 @@ "node": ">=14.0.0" } }, + "node_modules/@oclif/core/node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "engines": { + "node": ">=8" + } + }, "node_modules/@oclif/core/node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -2080,6 +2076,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@oclif/core/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, "node_modules/@oclif/errors": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/@oclif/errors/-/errors-1.3.6.tgz", @@ -2125,11 +2137,11 @@ } }, "node_modules/@oclif/help": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@oclif/help/-/help-1.0.5.tgz", - "integrity": "sha512-77ZXqVXcd+bQ6EafN56KbL4PbNtZM/Lq4GQElekNav+CPIgPNKT3AtMTQrc0fWke6bb/BTLB+1Fu1gWgx643jQ==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@oclif/help/-/help-1.0.11.tgz", + "integrity": "sha512-zc44XfjG8Ff0y9cF9LoLd6MBssV7vHuwFpdvvSsLD/pdjGid+EOgAwy/jYYDajThxWPatcVscKXlnDvyFQ8Y0A==", "dependencies": { - "@oclif/config": "1.18.6", + "@oclif/config": "1.18.12", "@oclif/errors": "1.3.6", "chalk": "^4.1.2", "indent-string": "^4.0.0", @@ -2144,16 +2156,16 @@ } }, "node_modules/@oclif/help/node_modules/@oclif/config": { - "version": "1.18.6", - "resolved": "https://registry.npmjs.org/@oclif/config/-/config-1.18.6.tgz", - "integrity": "sha512-OWhCpdu4QqggOPX1YPZ4XVmLLRX+lhGjXV6RNA7sogOwLqlEmSslnN/lhR5dkhcWZbKWBQH29YCrB3LDPRu/IA==", + "version": "1.18.12", + "resolved": "https://registry.npmjs.org/@oclif/config/-/config-1.18.12.tgz", + "integrity": "sha512-hbZv4N3J9pE4yzQIqrklJFgXhqYiQTN3uV5uBC8VaIZ1qEPzZv6lN9rDmcYIuEOBPzQvvSIBuaH/IDzo3F71PQ==", "dependencies": { "@oclif/errors": "^1.3.6", - "@oclif/parser": "^3.8.9", + "@oclif/parser": "^3.8.13", "debug": "^4.3.4", "globby": "^11.1.0", "is-wsl": "^2.1.1", - "tslib": "^2.3.1" + "tslib": "^2.5.0" }, "engines": { "node": ">=8.0.0" @@ -2197,39 +2209,38 @@ "integrity": "sha512-Ups2dShK52xXa8w6iBWLgcjPJWjais6KPJQq3gQ/88AY6BXoTX+MIGFPrWQO1KLMiQfoTpcLnUwloN4brrVUHw==" }, "node_modules/@oclif/parser": { - "version": "3.8.11", - "resolved": "https://registry.npmjs.org/@oclif/parser/-/parser-3.8.11.tgz", - "integrity": "sha512-B3NweRn1yZw2g7xaF10Zh/zwlqTJJINfU+CRkqll+LaTisSNvZbW0RR9WGan26EqqLp4qzNjzX/e90Ew8l9NLw==", + "version": "3.8.14", + "resolved": "https://registry.npmjs.org/@oclif/parser/-/parser-3.8.14.tgz", + "integrity": "sha512-dGF3/Db+YZTxlR2f5cUbFcUXhrGxeVu9aT+Y/J7Wt6KMRiBJ6igIBChDHvRjjQVujR00OpdkS6fyLgBFI5meWQ==", "dependencies": { "@oclif/errors": "^1.3.6", "@oclif/linewrap": "^1.0.0", "chalk": "^4.1.0", - "tslib": "^2.5.2" + "tslib": "^2.6.0" }, "engines": { "node": ">=8.0.0" } }, "node_modules/@oclif/plugin-help": { - "version": "5.2.9", - "resolved": "https://registry.npmjs.org/@oclif/plugin-help/-/plugin-help-5.2.9.tgz", - "integrity": "sha512-0J3oowPURZJ4Dn1p1WpQ46E4+CoV20KTn1cvsNiDl6Hmbw+qoljKQnArJJzNFeZQxWo4R7/S42PrzKJTVYh68Q==", + "version": "5.2.13", + "resolved": "https://registry.npmjs.org/@oclif/plugin-help/-/plugin-help-5.2.13.tgz", + "integrity": "sha512-8+uJ9fxZhb76T+NiHDyLQWmHVhu1ONj+e47w3bMLe3+absfuGsWYZm5+W8ApJxQKoLgB5pW810idO0f7iP/4tw==", "dependencies": { - "@oclif/core": "^2.8.0" + "@oclif/core": "^2.9.3" }, "engines": { "node": ">=12.0.0" } }, "node_modules/@oclif/plugin-not-found": { - "version": "2.3.23", - "resolved": "https://registry.npmjs.org/@oclif/plugin-not-found/-/plugin-not-found-2.3.23.tgz", - "integrity": "sha512-UZM8aolxXvqwH8WcmJxRNASDWgMoSQm/pgCdkc1AGCRevYc8+LBSO+U6nLWq+Dx8H/dn9RyIv5oiUIOGkKDlZA==", + "version": "2.3.31", + "resolved": "https://registry.npmjs.org/@oclif/plugin-not-found/-/plugin-not-found-2.3.31.tgz", + "integrity": "sha512-KHBCDJbDrkFc5vuPxg4JZ3wBTrdPPHOQOWp4bLCV4cnVSUHBKnfCqnCg2aXmRb97nbzY3P13/i8Th3KQjArqmg==", "dependencies": { - "@oclif/color": "^1.0.4", - "@oclif/core": "^2.8.0", - "fast-levenshtein": "^3.0.0", - "lodash": "^4.17.21" + "@oclif/color": "^1.0.8", + "@oclif/core": "^2.9.3", + "fast-levenshtein": "^3.0.0" }, "engines": { "node": ">=12.0.0" @@ -2257,40 +2268,40 @@ } }, "node_modules/@oclif/plugin-warn-if-update-available": { - "version": "2.0.37", - "resolved": "https://registry.npmjs.org/@oclif/plugin-warn-if-update-available/-/plugin-warn-if-update-available-2.0.37.tgz", - "integrity": "sha512-rfDNvplwgiwV+QSV4JU96ypmWgNJ6Hk5FEAEAKzqF0v0J8AHwZGpwwYO/MCZSkbc7bfYpkqLx/sxjpMO6j6PmQ==", + "version": "2.0.43", + "resolved": "https://registry.npmjs.org/@oclif/plugin-warn-if-update-available/-/plugin-warn-if-update-available-2.0.43.tgz", + "integrity": "sha512-8nMnBJxV158bKGStsSqcg9FY1PD+WaNc6Soz74py9aq956i+wJax5xL8+U9J5/UmNixHzhdEzlioyHcUH/7CXQ==", "dev": true, "dependencies": { - "@oclif/core": "^2.8.2", + "@oclif/core": "^2.9.3", "chalk": "^4.1.0", "debug": "^4.1.0", "fs-extra": "^9.0.1", "http-call": "^5.2.2", "lodash": "^4.17.21", - "semver": "^7.5.1" + "semver": "^7.5.4" }, "engines": { "node": ">=12.0.0" } }, "node_modules/@oclif/test": { - "version": "2.3.21", - "resolved": "https://registry.npmjs.org/@oclif/test/-/test-2.3.21.tgz", - "integrity": "sha512-RaFNf3/PMwBLrL9yu8aFsONsUSpyI16AGC6HiAabDyu534Rh+jBtqy/dPZ53/SOCBOholhZmVs7jT0UE5Utwew==", + "version": "2.3.30", + "resolved": "https://registry.npmjs.org/@oclif/test/-/test-2.3.30.tgz", + "integrity": "sha512-zuOv23wiF+H7cRGMjcKx/91qhdcNMcZnr+1TCpbyDeQBIvRs/nGWyuwfrmoF2fXs+HtNZsNFvwbjg7Ue5JfAug==", "dev": true, "dependencies": { - "@oclif/core": "^2.8.5", - "fancy-test": "^2.0.23" + "@oclif/core": "^2.9.3", + "fancy-test": "^2.0.29" }, "engines": { "node": ">=12.0.0" } }, "node_modules/@oclif/test/node_modules/fancy-test": { - "version": "2.0.23", - "resolved": "https://registry.npmjs.org/fancy-test/-/fancy-test-2.0.23.tgz", - "integrity": "sha512-RPX4iAzAioH9nxkqk2yrcunBLBmnMLxtIsw3Pjgj2PGPHTdT3wZ6asKv9U332+UQyZwZWWc4bP64JOa6DcVhnQ==", + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/fancy-test/-/fancy-test-2.0.30.tgz", + "integrity": "sha512-bDQnAXYYODKwjb/6VEwAovEN0uJ1iRMTahEqOpQCRxIX7rIqoFHCy0LEqWYAU3kVw4ERgK4HQSn6GISEA1ipxg==", "dev": true, "dependencies": { "@types/chai": "*", @@ -2299,7 +2310,7 @@ "@types/sinon": "*", "lodash": "^4.17.13", "mock-stdin": "^1.0.0", - "nock": "^13.3.1", + "nock": "^13.3.2", "stdout-stderr": "^0.1.9" }, "engines": { @@ -2476,10 +2487,23 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/@sigstore/tuf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-1.0.2.tgz", + "integrity": "sha512-vjwcYePJzM01Ha6oWWZ9gNcdIgnzyFxfqfWzph483DPJTH8Tb7f7bQRRll3CYVkyH56j0AgcPAcl6Vg95DPF+Q==", + "dev": true, + "dependencies": { + "@sigstore/protobuf-specs": "^0.1.0", + "tuf-js": "^1.1.7" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/@sinclair/typebox": { - "version": "0.25.24", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", - "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", "dev": true }, "node_modules/@sindresorhus/is": { @@ -2503,9 +2527,9 @@ } }, "node_modules/@sinonjs/fake-timers": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.2.0.tgz", - "integrity": "sha512-OPwQlEdg40HAj5KNF8WW6q2KG4Z+cBCZb3m4ninfTZKaBmbIJodviQsDBoYMPHkOyJJMHnOJo5j2+LKDOhOACg==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dependencies": { "@sinonjs/commons": "^3.0.0" } @@ -2605,9 +2629,9 @@ } }, "node_modules/@tufjs/models/node_modules/minimatch": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz", - "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -2629,9 +2653,9 @@ } }, "node_modules/@types/babel__core": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz", - "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==", + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", + "integrity": "sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==", "dev": true, "dependencies": { "@babel/parser": "^7.20.7", @@ -2661,14 +2685,20 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.18.5", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.5.tgz", - "integrity": "sha512-enCvTL8m/EHS/zIvJno9nE+ndYPh1/oNFzRYRmtUqJICG2VnCSBzMLW5VN2KCQU91f23tsNKR8v7VJJQMatl7Q==", + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz", + "integrity": "sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==", "dev": true, "dependencies": { - "@babel/types": "^7.3.0" + "@babel/types": "^7.20.7" } }, + "node_modules/@types/bluebird": { + "version": "3.5.38", + "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.38.tgz", + "integrity": "sha512-yR/Kxc0dd4FfwtEoLZMoqJbM/VE/W7hXn/MIjb+axcwag0iFmSPK7OBUZq1YWLynJUoWQkfUrI7T0HDqGApNSg==", + "dev": true + }, "node_modules/@types/body-parser": { "version": "1.19.2", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", @@ -2785,6 +2815,11 @@ "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", "dev": true }, + "node_modules/@types/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==" + }, "node_modules/@types/ini": { "version": "1.3.31", "resolved": "https://registry.npmjs.org/@types/ini/-/ini-1.3.31.tgz", @@ -2801,6 +2836,15 @@ "rxjs": "^7.2.0" } }, + "node_modules/@types/inquirer/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", @@ -2836,9 +2880,9 @@ } }, "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", "dev": true }, "node_modules/@types/keyv": { @@ -2888,6 +2932,16 @@ "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", "dev": true }, + "node_modules/@types/minipass": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@types/minipass/-/minipass-3.3.5.tgz", + "integrity": "sha512-M2BLHQdEmDmH671h0GIlOQQJrgezd1vNqq7PVj1VOsHZ2uQQb4iPiQIl0SlMdhxZPUsLIfEklmeEHXg8DJRewA==", + "deprecated": "This is a stub types definition. minipass provides its own type definitions, so you do not need this installed.", + "dev": true, + "dependencies": { + "minipass": "*" + } + }, "node_modules/@types/mkdirp": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-1.0.2.tgz", @@ -2903,10 +2957,19 @@ "integrity": "sha512-ekGvFhFgrc2zYQoX4JeZPmVzZxw6Dtllga7iGHzfbYIYkAMUx/sAFP2GdFpLff+vdHXu5fl7WX9AT+TtqYcsyw==", "dev": true }, + "node_modules/@types/ncp": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/ncp/-/ncp-2.0.5.tgz", + "integrity": "sha512-ocK0p8JuFmX7UkMabFPjY0F7apPvQyLWt5qtdvuvQEBz9i4m2dbzV+6L1zNaUp042RfnL6pHnxDE53OH6XQ9VQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/node": { - "version": "14.18.47", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.47.tgz", - "integrity": "sha512-OuJi8bIng4wYHHA3YpKauL58dZrPxro3d0tabPHyiNF8rKfGKuVfr83oFlPLmKri1cX+Z3cJP39GXmnqkP11Gw==" + "version": "14.18.53", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.53.tgz", + "integrity": "sha512-soGmOpVBUq+gaBMwom1M+krC/NNbWlosh4AtGA03SyWNDiqSKtwp7OulO1M6+mg8YkHMvJ/y0AkCeO8d1hNb7A==" }, "node_modules/@types/normalize-package-data": { "version": "2.4.1", @@ -2915,11 +2978,20 @@ "dev": true }, "node_modules/@types/prettier": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", - "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==", + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", "dev": true }, + "node_modules/@types/progress-stream": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@types/progress-stream/-/progress-stream-2.0.2.tgz", + "integrity": "sha512-u9N40mYX/Nx/Pmt847+G2N72s5QL2jwgXrVKCIcxgOdMBdIzY+e/m3m1gQBNPmgvQQBO79EisLAcVJ/p0qKuvA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/qs": { "version": "6.9.7", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", @@ -2939,6 +3011,12 @@ "@types/node": "*" } }, + "node_modules/@types/semver": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", + "dev": true + }, "node_modules/@types/send": { "version": "0.17.1", "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", @@ -2949,10 +3027,11 @@ } }, "node_modules/@types/serve-static": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz", - "integrity": "sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz", + "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==", "dependencies": { + "@types/http-errors": "*", "@types/mime": "*", "@types/node": "*" } @@ -3031,6 +3110,40 @@ "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", "dev": true }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/@typescript-eslint/experimental-utils": { "version": "4.33.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz", @@ -3055,29 +3168,7 @@ "eslint": "*" } }, - "node_modules/@typescript-eslint/experimental-utils/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@typescript-eslint/experimental-utils/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/@typescript-eslint/scope-manager": { + "node_modules/@typescript-eslint/experimental-utils/node_modules/@typescript-eslint/scope-manager": { "version": "4.33.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz", "integrity": "sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==", @@ -3094,7 +3185,7 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/types": { + "node_modules/@typescript-eslint/experimental-utils/node_modules/@typescript-eslint/types": { "version": "4.33.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz", "integrity": "sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==", @@ -3107,7 +3198,7 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/typescript-estree": { + "node_modules/@typescript-eslint/experimental-utils/node_modules/@typescript-eslint/typescript-estree": { "version": "4.33.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz", "integrity": "sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==", @@ -3134,7 +3225,33 @@ } } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/globby": { + "node_modules/@typescript-eslint/experimental-utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz", + "integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.33.0", + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/experimental-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/experimental-utils/node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", @@ -3154,30 +3271,179 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz", - "integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==", + "node_modules/@typescript-eslint/parser": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", "dev": true, + "peer": true, "dependencies": { - "@typescript-eslint/types": "4.33.0", - "eslint-visitor-keys": "^2.0.0" + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "debug": "^4.3.4" }, "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, "node_modules/@wry/context": { @@ -3203,9 +3469,9 @@ } }, "node_modules/@wry/trie": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@wry/trie/-/trie-0.3.2.tgz", - "integrity": "sha512-yRTyhWSls2OY/pYLfwff867r8ekooZ4UI+/gxot5Wj8EFwSf2rG+n+Mo/6LoLQm1TKA4GRj2+LCpbfS937dClQ==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@wry/trie/-/trie-0.4.3.tgz", + "integrity": "sha512-I6bHwH0fSf6RqQcnnXLJKhkSXG45MFral3GxPaY4uAl0LYDZM+YDVDAiU9bYwjTuysy1S0IeecWtmq1SZA3M1w==", "dependencies": { "tslib": "^2.3.0" }, @@ -3224,6 +3490,18 @@ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dev": true, + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -3237,9 +3515,9 @@ } }, "node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", "bin": { "acorn": "bin/acorn" }, @@ -3604,13 +3882,12 @@ } }, "node_modules/astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true, - "peer": true, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/async": { @@ -3631,6 +3908,14 @@ "node": ">= 4.0.0" } }, + "node_modules/atomically": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/atomically/-/atomically-1.7.0.tgz", + "integrity": "sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w==", + "engines": { + "node": ">=10.12.0" + } + }, "node_modules/available-typed-arrays": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", @@ -3644,9 +3929,9 @@ } }, "node_modules/aws-sdk": { - "version": "2.1383.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1383.0.tgz", - "integrity": "sha512-A8sdfcrlGYXqu5x8dpwh1lg9/o354leCx08N/irwH3U4sAwQin0vHsI9DHmaJ0PLNo/TuzeLE3s4dLpI3mWtww==", + "version": "2.1416.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1416.0.tgz", + "integrity": "sha512-AP36hsRZhyceyCoTYrsV9FH04CEcAegQYcrg2ybsYB4axo5uvwM67YLFcwc9jAAbk4l2ALWv2XnI0e7HZFCGqQ==", "dev": true, "dependencies": { "buffer": "4.9.2", @@ -3684,12 +3969,12 @@ } }, "node_modules/babel-jest": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.5.0.tgz", - "integrity": "sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.1.tgz", + "integrity": "sha512-qu+3bdPEQC6KZSPz+4Fyjbga5OODNcp49j6GKzG1EKbkfyJBxEYGVUmVGpwCSeGouG52R4EgYMLb6p9YeEEQ4A==", "dev": true, "dependencies": { - "@jest/transform": "^29.5.0", + "@jest/transform": "^29.6.1", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.5.0", @@ -4012,9 +4297,9 @@ "dev": true }, "node_modules/browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "version": "4.21.9", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", + "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", "dev": true, "funding": [ { @@ -4024,13 +4309,17 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" + "caniuse-lite": "^1.0.30001503", + "electron-to-chromium": "^1.4.431", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" }, "bin": { "browserslist": "cli.js" @@ -4225,9 +4514,9 @@ } }, "node_modules/cacheable-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", - "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", "dev": true, "dependencies": { "clone-response": "^1.0.2", @@ -4314,9 +4603,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001489", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001489.tgz", - "integrity": "sha512-x1mgZEXK8jHIfAxm+xgdpHpk50IN3z3q3zP261/WS+uvePxW8izXuCu6AHz0lkuYTlATDehiZ/tNyYBdSQsOUQ==", + "version": "1.0.30001516", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001516.tgz", + "integrity": "sha512-Wmec9pCBY8CWbmI4HsjBeQLqDTqV91nFVR83DnZpYyRnPI1wePDsTg0bGLPC5VU/3OIZV1fmxEea1b+tFKe86g==", "dev": true, "funding": [ { @@ -4492,9 +4781,9 @@ } }, "node_modules/cjs-module-lexer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", - "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", "dev": true }, "node_modules/clean-regexp": { @@ -4616,6 +4905,14 @@ "node": ">=0.10.0" } }, + "node_modules/cli-truncate/node_modules/slice-ansi": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "integrity": "sha512-up04hB2hR92PgjpyU3y/eg91yIBILyjVY26NvvciY3EVVPjybkMszMpXQ9QAkcS3I5rtJBDLoTxxg+qvW8c7rw==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/cli-truncate/node_modules/string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", @@ -4761,9 +5058,9 @@ } }, "node_modules/collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", "dev": true }, "node_modules/color": { @@ -5015,6 +5312,38 @@ "url": "https://opencollective.com/date-fns" } }, + "node_modules/concurrently/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/conf": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/conf/-/conf-10.2.0.tgz", + "integrity": "sha512-8fLl9F04EJqjSqH+QjITQfJF8BrOVaYr1jewVgSRAEWePfxT0sku4w2hrGQ60BC/TNLGQ2pgxNlTbWQmMPFvXg==", + "dependencies": { + "ajv": "^8.6.3", + "ajv-formats": "^2.1.1", + "atomically": "^1.7.0", + "debounce-fn": "^4.0.0", + "dot-prop": "^6.0.1", + "env-paths": "^2.2.1", + "json-schema-typed": "^7.0.3", + "onetime": "^5.1.2", + "pkg-up": "^3.1.0", + "semver": "^7.3.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/config-master": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/config-master/-/config-master-3.1.0.tgz", @@ -5109,11 +5438,11 @@ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" }, "node_modules/cross-fetch": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.6.tgz", - "integrity": "sha512-riRvo06crlE8HiqOwIpQhxwdOk4fOeR7FVM/wXoxchFEqMNUjvbs3bfo4OTgMEMHzppd4DxFBDbyySj8Cv781g==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", + "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", "dependencies": { - "node-fetch": "^2.6.11" + "node-fetch": "^2.6.12" } }, "node_modules/cross-spawn": { @@ -5203,6 +5532,20 @@ "node": "*" } }, + "node_modules/debounce-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/debounce-fn/-/debounce-fn-4.0.0.tgz", + "integrity": "sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ==", + "dependencies": { + "mimic-fn": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -5223,6 +5566,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", "integrity": "sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", "dev": true, "engines": { "node": "*" @@ -5299,7 +5643,8 @@ "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true }, "node_modules/deepmerge": { "version": "4.3.1", @@ -5512,12 +5857,29 @@ "dot-object": "bin/dot-object" } }, + "node_modules/dot-prop": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/dotenv": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", - "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" } }, "node_modules/dotenv-expand": { @@ -5555,9 +5917,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.405", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.405.tgz", - "integrity": "sha512-JdDgnwU69FMZURoesf9gNOej2Cms1XJFfLk24y1IBtnAdhTcJY/mXnokmpmxHN59PcykBP4bgUU98vLY44Lhuw==", + "version": "1.4.463", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.463.tgz", + "integrity": "sha512-fT3hvdUWLjDbaTGzyOjng/CQhQJSQP8ThO3XZAoaxHvHo2kUXiRQVMj9M235l8uDFiNPsPa6KHT1p3RaR6ugRw==", "dev": true }, "node_modules/elegant-spinner": { @@ -5720,14 +6082,13 @@ } }, "node_modules/escodegen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", "dependencies": { "esprima": "^4.0.1", "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" + "esutils": "^2.0.2" }, "bin": { "escodegen": "bin/escodegen.js", @@ -5740,69 +6101,25 @@ "source-map": "~0.6.1" } }, - "node_modules/escodegen/node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" - }, - "node_modules/escodegen/node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "dependencies": { - "prelude-ls": "~1.1.2" - }, + "node_modules/escodegen/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "engines": { - "node": ">= 0.8.0" + "node": ">=4.0" } }, "node_modules/eslint": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.41.0.tgz", - "integrity": "sha512-WQDQpzGBOP5IrXPo4Hc0814r4/v2rrIsB0rhT7jtunIalgg6gYXWhRMOejVO8yH21T/FGaxjmFjBMNqcIlmH1Q==", + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.45.0.tgz", + "integrity": "sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.3", - "@eslint/js": "8.41.0", - "@humanwhocodes/config-array": "^0.11.8", + "@eslint/eslintrc": "^2.1.0", + "@eslint/js": "8.44.0", + "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", @@ -5813,7 +6130,7 @@ "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.2.0", "eslint-visitor-keys": "^3.4.1", - "espree": "^9.5.2", + "espree": "^9.6.0", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -5823,7 +6140,6 @@ "globals": "^13.19.0", "graphemer": "^1.4.0", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", @@ -5833,9 +6149,8 @@ "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.1", + "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" }, "bin": { @@ -6061,6 +6376,16 @@ "node": ">=4" } }, + "node_modules/eslint-config-oclif-typescript/node_modules/astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, "node_modules/eslint-config-oclif-typescript/node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -6131,9 +6456,9 @@ } }, "node_modules/eslint-config-oclif-typescript/node_modules/cross-spawn/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "peer": true, "bin": { @@ -6335,9 +6660,9 @@ } }, "node_modules/eslint-config-oclif-typescript/node_modules/eslint-plugin-node/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "bin": { "semver": "bin/semver" @@ -6365,19 +6690,6 @@ "eslint": ">=5.0.0" } }, - "node_modules/eslint-config-oclif-typescript/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, "node_modules/eslint-config-oclif-typescript/node_modules/eslint-utils": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", @@ -6440,9 +6752,9 @@ } }, "node_modules/eslint-config-oclif-typescript/node_modules/eslint/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "peer": true, "bin": { @@ -6464,15 +6776,6 @@ "node": ">=6.0.0" } }, - "node_modules/eslint-config-oclif-typescript/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/eslint-config-oclif-typescript/node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", @@ -6750,19 +7053,6 @@ "rimraf": "bin.js" } }, - "node_modules/eslint-config-oclif-typescript/node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "peer": true, - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, "node_modules/eslint-config-oclif-typescript/node_modules/safe-regex": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", @@ -6914,13 +7204,6 @@ "node": ">=6" } }, - "node_modules/eslint-config-oclif-typescript/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true, - "peer": true - }, "node_modules/eslint-config-oclif-typescript/node_modules/type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", @@ -7087,9 +7370,9 @@ } }, "node_modules/eslint-plugin-node/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -7125,19 +7408,16 @@ } }, "node_modules/eslint-scope": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", - "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" + "estraverse": "^4.1.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=8.0.0" } }, "node_modules/eslint-template-visitor": { @@ -7226,6 +7506,31 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.1.tgz", + "integrity": "sha512-CvefSOsDdaYYvxChovdrPo/ZGt8d5lrJWleAc1diXRKhHGiTYEI26cvo8Kle/wGnsizoCJjK73FMg1/IkIwiNA==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, "node_modules/eslint/node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -7253,12 +7558,12 @@ } }, "node_modules/espree": { - "version": "9.5.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", - "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "dependencies": { - "acorn": "^8.8.0", + "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.4.1" }, @@ -7293,6 +7598,15 @@ "node": ">=0.10" } }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, "node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", @@ -7305,10 +7619,20 @@ "node": ">=4.0" } }, - "node_modules/estraverse": { + "node_modules/esrecurse/node_modules/estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, "engines": { "node": ">=4.0" } @@ -7329,6 +7653,15 @@ "node": ">= 0.6" } }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", @@ -7377,21 +7710,28 @@ } }, "node_modules/expect": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.5.0.tgz", - "integrity": "sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.1.tgz", + "integrity": "sha512-XEdDLonERCU1n9uR56/Stx9OqojaLAQtZf9PrCHH9Hl8YXiEIka3H4NXJ3NOIBmQJTg7+j7buh34PMHfJujc8g==", "dev": true, "dependencies": { - "@jest/expect-utils": "^29.5.0", + "@jest/expect-utils": "^29.6.1", + "@types/node": "*", "jest-get-type": "^29.4.3", - "jest-matcher-utils": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0" + "jest-matcher-utils": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-util": "^29.6.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/exponential-backoff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", + "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", + "dev": true + }, "node_modules/express": { "version": "4.18.2", "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", @@ -7528,9 +7868,9 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", + "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -8301,9 +8641,9 @@ "dev": true }, "node_modules/graphql": { - "version": "16.6.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.6.0.tgz", - "integrity": "sha512-KPIBPDlW7NxrbT/eh4qPXz5FiFdL5UbaA0XUNz2Rp3Z3hqBSkbj0GVjwFDztsWVauZUWsbKHgMg++sk8UX0bkw==", + "version": "16.7.1", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.7.1.tgz", + "integrity": "sha512-DRYR9tf+UGU0KOsMcKAlXeFfX89UiiIZ0dRU3mR0yJfu6OjZqUcp68NnFLnqQU5RexygFoDy1EW+ccOYcPfmHg==", "engines": { "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" } @@ -9310,6 +9650,14 @@ "node": ">=0.6.0" } }, + "node_modules/inquirer/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dependencies": { + "tslib": "^2.1.0" + } + }, "node_modules/interpret": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", @@ -9652,16 +10000,12 @@ } }, "node_modules/is-typed-array": { - "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==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "which-typed-array": "^1.1.11" }, "engines": { "node": ">= 0.4" @@ -9798,9 +10142,9 @@ } }, "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==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -9931,9 +10275,9 @@ } }, "node_modules/jake": { - "version": "10.8.6", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.6.tgz", - "integrity": "sha512-G43Ub9IYEFfu72sua6rzooi8V8Gz2lkfk48rW20vEWCGizeaEPlKB1Kh8JIA84yQbiAEfqlPmSpGgCKKxH3rDA==", + "version": "10.8.7", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", + "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", "dependencies": { "async": "^3.2.3", "chalk": "^4.0.2", @@ -9948,15 +10292,15 @@ } }, "node_modules/jest": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.5.0.tgz", - "integrity": "sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.1.tgz", + "integrity": "sha512-Nirw5B4nn69rVUZtemCQhwxOBhm0nsp3hmtF4rzCeWD7BkjAXRIji7xWQfnTNbz9g0aVsBX6aZK3n+23LM6uDw==", "dev": true, "dependencies": { - "@jest/core": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/core": "^29.6.1", + "@jest/types": "^29.6.1", "import-local": "^3.0.2", - "jest-cli": "^29.5.0" + "jest-cli": "^29.6.1" }, "bin": { "jest": "bin/jest.js" @@ -9987,28 +10331,28 @@ } }, "node_modules/jest-circus": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.5.0.tgz", - "integrity": "sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.1.tgz", + "integrity": "sha512-tPbYLEiBU4MYAL2XoZme/bgfUeotpDBd81lgHLCbDZZFaGmECk0b+/xejPFtmiBP87GgP/y4jplcRpbH+fgCzQ==", "dev": true, "dependencies": { - "@jest/environment": "^29.5.0", - "@jest/expect": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/environment": "^29.6.1", + "@jest/expect": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/types": "^29.6.1", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^0.7.0", "is-generator-fn": "^2.0.0", - "jest-each": "^29.5.0", - "jest-matcher-utils": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-runtime": "^29.5.0", - "jest-snapshot": "^29.5.0", - "jest-util": "^29.5.0", + "jest-each": "^29.6.1", + "jest-matcher-utils": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-runtime": "^29.6.1", + "jest-snapshot": "^29.6.1", + "jest-util": "^29.6.1", "p-limit": "^3.1.0", - "pretty-format": "^29.5.0", + "pretty-format": "^29.6.1", "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" @@ -10030,12 +10374,12 @@ } }, "node_modules/jest-circus/node_modules/pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", + "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", "dev": true, "dependencies": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.0", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -10050,21 +10394,21 @@ "dev": true }, "node_modules/jest-cli": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.5.0.tgz", - "integrity": "sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.1.tgz", + "integrity": "sha512-607dSgTA4ODIN6go9w6xY3EYkyPFGicx51a69H7yfvt7lN53xNswEVLovq+E77VsTRi5fWprLH0yl4DJgE8Ing==", "dev": true, "dependencies": { - "@jest/core": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/core": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/types": "^29.6.1", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^29.5.0", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", + "jest-config": "^29.6.1", + "jest-util": "^29.6.1", + "jest-validate": "^29.6.1", "prompts": "^2.0.1", "yargs": "^17.3.1" }, @@ -10084,31 +10428,31 @@ } }, "node_modules/jest-config": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.5.0.tgz", - "integrity": "sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.1.tgz", + "integrity": "sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.5.0", - "@jest/types": "^29.5.0", - "babel-jest": "^29.5.0", + "@jest/test-sequencer": "^29.6.1", + "@jest/types": "^29.6.1", + "babel-jest": "^29.6.1", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^29.5.0", - "jest-environment-node": "^29.5.0", + "jest-circus": "^29.6.1", + "jest-environment-node": "^29.6.1", "jest-get-type": "^29.4.3", "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.5.0", - "jest-runner": "^29.5.0", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", + "jest-resolve": "^29.6.1", + "jest-runner": "^29.6.1", + "jest-util": "^29.6.1", + "jest-validate": "^29.6.1", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^29.5.0", + "pretty-format": "^29.6.1", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, @@ -10159,12 +10503,12 @@ } }, "node_modules/jest-config/node_modules/pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", + "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", "dev": true, "dependencies": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.0", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -10215,16 +10559,16 @@ } }, "node_modules/jest-each": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.5.0.tgz", - "integrity": "sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.1.tgz", + "integrity": "sha512-n5eoj5eiTHpKQCAVcNTT7DRqeUmJ01hsAL0Q1SMiBHcBcvTKDELixQOGMCpqhbIuTcfC4kMfSnpmDqRgRJcLNQ==", "dev": true, "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.1", "chalk": "^4.0.0", "jest-get-type": "^29.4.3", - "jest-util": "^29.5.0", - "pretty-format": "^29.5.0" + "jest-util": "^29.6.1", + "pretty-format": "^29.6.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -10243,12 +10587,12 @@ } }, "node_modules/jest-each/node_modules/pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", + "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", "dev": true, "dependencies": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.0", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -10263,17 +10607,17 @@ "dev": true }, "node_modules/jest-environment-node": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.5.0.tgz", - "integrity": "sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.1.tgz", + "integrity": "sha512-ZNIfAiE+foBog24W+2caIldl4Irh8Lx1PUhg/GZ0odM1d/h2qORAsejiFc7zb+SEmYPn1yDZzEDSU5PmDkmVLQ==", "dev": true, "dependencies": { - "@jest/environment": "^29.5.0", - "@jest/fake-timers": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/environment": "^29.6.1", + "@jest/fake-timers": "^29.6.1", + "@jest/types": "^29.6.1", "@types/node": "*", - "jest-mock": "^29.5.0", - "jest-util": "^29.5.0" + "jest-mock": "^29.6.1", + "jest-util": "^29.6.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -10289,20 +10633,20 @@ } }, "node_modules/jest-haste-map": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.5.0.tgz", - "integrity": "sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.1.tgz", + "integrity": "sha512-0m7f9PZXxOCk1gRACiVgX85knUKPKLPg4oRCjLoqIm9brTHXaorMA0JpmtmVkQiT8nmXyIVoZd/nnH1cfC33ig==", "dev": true, "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.1", "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.4.3", - "jest-util": "^29.5.0", - "jest-worker": "^29.5.0", + "jest-util": "^29.6.1", + "jest-worker": "^29.6.1", "micromatch": "^4.0.4", "walker": "^1.0.8" }, @@ -10314,13 +10658,13 @@ } }, "node_modules/jest-leak-detector": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz", - "integrity": "sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.1.tgz", + "integrity": "sha512-OrxMNyZirpOEwkF3UHnIkAiZbtkBWiye+hhBweCHkVbCgyEy71Mwbb5zgeTNYWJBi1qgDVfPC1IwO9dVEeTLwQ==", "dev": true, "dependencies": { "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" + "pretty-format": "^29.6.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -10339,12 +10683,12 @@ } }, "node_modules/jest-leak-detector/node_modules/pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", + "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", "dev": true, "dependencies": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.0", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -10359,15 +10703,15 @@ "dev": true }, "node_modules/jest-matcher-utils": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz", - "integrity": "sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.1.tgz", + "integrity": "sha512-SLaztw9d2mfQQKHmJXKM0HCbl2PPVld/t9Xa6P9sgiExijviSp7TnZZpw2Fpt+OI3nwUO/slJbOfzfUMKKC5QA==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^29.5.0", + "jest-diff": "^29.6.1", "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" + "pretty-format": "^29.6.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -10395,27 +10739,27 @@ } }, "node_modules/jest-matcher-utils/node_modules/jest-diff": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.5.0.tgz", - "integrity": "sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.1.tgz", + "integrity": "sha512-FsNCvinvl8oVxpNLttNQX7FAq7vR+gMDGj90tiP7siWw1UdakWUGqrylpsYrpvj908IYckm5Y0Q7azNAozU1Kg==", "dev": true, "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.4.3", "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" + "pretty-format": "^29.6.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-matcher-utils/node_modules/pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", + "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", "dev": true, "dependencies": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.0", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -10430,18 +10774,18 @@ "dev": true }, "node_modules/jest-message-util": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.5.0.tgz", - "integrity": "sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.1.tgz", + "integrity": "sha512-KoAW2zAmNSd3Gk88uJ56qXUWbFk787QKmjjJVOjtGFmmGSZgDBrlIL4AfQw1xyMYPNVD7dNInfIbur9B2rd/wQ==", "dev": true, "dependencies": { "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.1", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.5.0", + "pretty-format": "^29.6.1", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -10462,12 +10806,12 @@ } }, "node_modules/jest-message-util/node_modules/pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", + "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", "dev": true, "dependencies": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.0", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -10482,14 +10826,14 @@ "dev": true }, "node_modules/jest-mock": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.5.0.tgz", - "integrity": "sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.1.tgz", + "integrity": "sha512-brovyV9HBkjXAEdRooaTQK42n8usKoSRR3gihzUpYeV/vwqgSoNfrksO7UfSACnPmxasO/8TmHM3w9Hp3G1dgw==", "dev": true, "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.1", "@types/node": "*", - "jest-util": "^29.5.0" + "jest-util": "^29.6.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -10522,17 +10866,17 @@ } }, "node_modules/jest-resolve": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.5.0.tgz", - "integrity": "sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.1.tgz", + "integrity": "sha512-AeRkyS8g37UyJiP9w3mmI/VXU/q8l/IH52vj/cDAyScDcemRbSBhfX/NMYIGilQgSVwsjxrCHf3XJu4f+lxCMg==", "dev": true, "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", + "jest-haste-map": "^29.6.1", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", + "jest-util": "^29.6.1", + "jest-validate": "^29.6.1", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" @@ -10542,43 +10886,43 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz", - "integrity": "sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.1.tgz", + "integrity": "sha512-BbFvxLXtcldaFOhNMXmHRWx1nXQO5LoXiKSGQcA1LxxirYceZT6ch8KTE1bK3X31TNG/JbkI7OkS/ABexVahiw==", "dev": true, "dependencies": { "jest-regex-util": "^29.4.3", - "jest-snapshot": "^29.5.0" + "jest-snapshot": "^29.6.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runner": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.5.0.tgz", - "integrity": "sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.1.tgz", + "integrity": "sha512-tw0wb2Q9yhjAQ2w8rHRDxteryyIck7gIzQE4Reu3JuOBpGp96xWgF0nY8MDdejzrLCZKDcp8JlZrBN/EtkQvPQ==", "dev": true, "dependencies": { - "@jest/console": "^29.5.0", - "@jest/environment": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/console": "^29.6.1", + "@jest/environment": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", "jest-docblock": "^29.4.3", - "jest-environment-node": "^29.5.0", - "jest-haste-map": "^29.5.0", - "jest-leak-detector": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-resolve": "^29.5.0", - "jest-runtime": "^29.5.0", - "jest-util": "^29.5.0", - "jest-watcher": "^29.5.0", - "jest-worker": "^29.5.0", + "jest-environment-node": "^29.6.1", + "jest-haste-map": "^29.6.1", + "jest-leak-detector": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-resolve": "^29.6.1", + "jest-runtime": "^29.6.1", + "jest-util": "^29.6.1", + "jest-watcher": "^29.6.1", + "jest-worker": "^29.6.1", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, @@ -10587,31 +10931,31 @@ } }, "node_modules/jest-runtime": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.5.0.tgz", - "integrity": "sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.5.0", - "@jest/fake-timers": "^29.5.0", - "@jest/globals": "^29.5.0", - "@jest/source-map": "^29.4.3", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.1.tgz", + "integrity": "sha512-D6/AYOA+Lhs5e5il8+5pSLemjtJezUr+8zx+Sn8xlmOux3XOqx4d8l/2udBea8CRPqqrzhsKUsN/gBDE/IcaPQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.6.1", + "@jest/fake-timers": "^29.6.1", + "@jest/globals": "^29.6.1", + "@jest/source-map": "^29.6.0", + "@jest/test-result": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", "@types/node": "*", "chalk": "^4.0.0", "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-mock": "^29.5.0", + "jest-haste-map": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-mock": "^29.6.1", "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.5.0", - "jest-snapshot": "^29.5.0", - "jest-util": "^29.5.0", + "jest-resolve": "^29.6.1", + "jest-snapshot": "^29.6.1", + "jest-util": "^29.6.1", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, @@ -10620,34 +10964,32 @@ } }, "node_modules/jest-snapshot": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.5.0.tgz", - "integrity": "sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.1.tgz", + "integrity": "sha512-G4UQE1QQ6OaCgfY+A0uR1W2AY0tGXUPQpoUClhWHq1Xdnx1H6JOrC2nH5lqnOEqaDgbHFgIwZ7bNq24HpB180A==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", "@babel/generator": "^7.7.2", "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", - "@types/babel__traverse": "^7.0.6", + "@jest/expect-utils": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", "@types/prettier": "^2.1.5", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^29.5.0", + "expect": "^29.6.1", "graceful-fs": "^4.2.9", - "jest-diff": "^29.5.0", + "jest-diff": "^29.6.1", "jest-get-type": "^29.4.3", - "jest-matcher-utils": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0", + "jest-matcher-utils": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-util": "^29.6.1", "natural-compare": "^1.4.0", - "pretty-format": "^29.5.0", - "semver": "^7.3.5" + "pretty-format": "^29.6.1", + "semver": "^7.5.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -10675,27 +11017,27 @@ } }, "node_modules/jest-snapshot/node_modules/jest-diff": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.5.0.tgz", - "integrity": "sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.1.tgz", + "integrity": "sha512-FsNCvinvl8oVxpNLttNQX7FAq7vR+gMDGj90tiP7siWw1UdakWUGqrylpsYrpvj908IYckm5Y0Q7azNAozU1Kg==", "dev": true, "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.4.3", "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" + "pretty-format": "^29.6.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-snapshot/node_modules/pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", + "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", "dev": true, "dependencies": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.0", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -10710,12 +11052,12 @@ "dev": true }, "node_modules/jest-util": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz", - "integrity": "sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.1.tgz", + "integrity": "sha512-NRFCcjc+/uO3ijUVyNOQJluf8PtGCe/W6cix36+M3cTFgiYqFOOW5MgN4JOOcvbUhcKTYVd1CvHz/LWi8d16Mg==", "dev": true, "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.1", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", @@ -10727,17 +11069,17 @@ } }, "node_modules/jest-validate": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.5.0.tgz", - "integrity": "sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.1.tgz", + "integrity": "sha512-r3Ds69/0KCN4vx4sYAbGL1EVpZ7MSS0vLmd3gV78O+NAx3PDQQukRU5hNHPXlyqCgFY8XUk7EuTMLugh0KzahA==", "dev": true, "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.1", "camelcase": "^6.2.0", "chalk": "^4.0.0", "jest-get-type": "^29.4.3", "leven": "^3.1.0", - "pretty-format": "^29.5.0" + "pretty-format": "^29.6.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -10768,12 +11110,12 @@ } }, "node_modules/jest-validate/node_modules/pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", + "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", "dev": true, "dependencies": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.0", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -10788,18 +11130,18 @@ "dev": true }, "node_modules/jest-watcher": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.5.0.tgz", - "integrity": "sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.1.tgz", + "integrity": "sha512-d4wpjWTS7HEZPaaj8m36QiaP856JthRZkrgcIY/7ISoUWPIillrXM23WPboZVLbiwZBt4/qn2Jke84Sla6JhFA==", "dev": true, "dependencies": { - "@jest/test-result": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/test-result": "^29.6.1", + "@jest/types": "^29.6.1", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", - "jest-util": "^29.5.0", + "jest-util": "^29.6.1", "string-length": "^4.0.1" }, "engines": { @@ -10807,13 +11149,13 @@ } }, "node_modules/jest-worker": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.5.0.tgz", - "integrity": "sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.1.tgz", + "integrity": "sha512-U+Wrbca7S8ZAxAe9L6nb6g8kPdia5hj32Puu5iOqBCMTMWFHXuK6dOV2IFrpedbTV8fjMFLdWNttQTBL6u2MRA==", "dev": true, "dependencies": { "@types/node": "*", - "jest-util": "^29.5.0", + "jest-util": "^29.6.1", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -11030,6 +11372,11 @@ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, + "node_modules/json-schema-typed": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-7.0.3.tgz", + "integrity": "sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A==" + }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", @@ -11126,9 +11473,9 @@ "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==" }, "node_modules/keyv": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", - "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", + "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", "dev": true, "dependencies": { "json-buffer": "3.0.1" @@ -11459,22 +11806,6 @@ "node": ">=0.10.0" } }, - "node_modules/listr/node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/listr/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, "node_modules/load-json-file": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-5.3.0.tgz", @@ -11871,6 +12202,14 @@ "triple-beam": "^1.3.0" } }, + "node_modules/logform/node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "engines": { + "node": ">=0.1.90" + } + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -11925,9 +12264,9 @@ } }, "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -12264,6 +12603,14 @@ "node": ">= 0.6" } }, + "node_modules/mimic-fn": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", + "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", + "engines": { + "node": ">=8" + } + }, "node_modules/mimic-response": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", @@ -12545,9 +12892,9 @@ "dev": true }, "node_modules/mocha": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", - "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.1.0.tgz", + "integrity": "sha512-vUF7IYxEoN7XhQpFLxQAEMtE4W91acW4B6En9l97MwE9stL1A9gusXfoHZCLVHDUJ/7V5+lbCM6yMqzo5vNymg==", "dev": true, "dependencies": { "ansi-colors": "4.1.1", @@ -12775,6 +13122,12 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, "node_modules/natural-orderby": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/natural-orderby/-/natural-orderby-2.0.3.tgz", @@ -12783,6 +13136,14 @@ "node": "*" } }, + "node_modules/ncp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", + "integrity": "sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==", + "bin": { + "ncp": "bin/ncp" + } + }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -12836,9 +13197,9 @@ } }, "node_modules/nock": { - "version": "13.3.1", - "resolved": "https://registry.npmjs.org/nock/-/nock-13.3.1.tgz", - "integrity": "sha512-vHnopocZuI93p2ccivFyGuUfzjq2fxNyNurp7816mlT5V5HF4SzXu8lvLrVzBbNqzs+ODooZ6OksuSUNM7Njkw==", + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/nock/-/nock-13.3.2.tgz", + "integrity": "sha512-CwbljitiWJhF1gL83NbanhoKs1l23TDlRioNraPTZrzZIEooPemrHRj5m0FZCPkB1ecdYCSWWGcHysJgX/ngnQ==", "dependencies": { "debug": "^4.1.0", "json-stringify-safe": "^5.0.1", @@ -12850,9 +13211,9 @@ } }, "node_modules/node-fetch": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", - "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", + "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -13011,9 +13372,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", - "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==", + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", "dev": true }, "node_modules/nopt": { @@ -13476,9 +13837,9 @@ } }, "node_modules/nwsapi": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.4.tgz", - "integrity": "sha512-NHj4rzRo0tQdijE9ZqAx6kYDcoRwYwSYzCA8MY3JzfxlrvEU0jhnhJT9BhqhJs7I/dKcrDm6TyulaRqZPIhN5g==" + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", + "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==" }, "node_modules/nyc": { "version": "15.1.0", @@ -13636,9 +13997,9 @@ } }, "node_modules/nyc/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -13764,9 +14125,9 @@ } }, "node_modules/oclif": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/oclif/-/oclif-3.9.0.tgz", - "integrity": "sha512-fsFyHVQYJdE50EcKrBjwzl2WT5sZUtTiRY1vqMwykgLFUDYrQS0lj7yqy2IgcPSmAWaLQryODdfBujCWOU98Ww==", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/oclif/-/oclif-3.9.1.tgz", + "integrity": "sha512-gJ8gJrohFY8qEeVBOw7wgAFdwPt2CTTkEFXDTkfUeXap6URIy6ngP7g/E1A2zFt2I0wH/qQHwcfuTpfBbj1+Uw==", "dev": true, "dependencies": { "@oclif/core": "^2.8.4", @@ -13914,18 +14275,29 @@ "@wry/trie": "^0.3.0" } }, + "node_modules/optimism/node_modules/@wry/trie": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@wry/trie/-/trie-0.3.2.tgz", + "integrity": "sha512-yRTyhWSls2OY/pYLfwff867r8ekooZ4UI+/gxot5Wj8EFwSf2rG+n+Mo/6LoLQm1TKA4GRj2+LCpbfS937dClQ==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "type-check": "^0.4.0" }, "engines": { "node": ">= 0.8.0" @@ -14297,9 +14669,9 @@ } }, "node_modules/password-prompt/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "bin": { "semver": "bin/semver" } @@ -14381,13 +14753,13 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-scurry": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.9.2.tgz", - "integrity": "sha512-qSDLy2aGFPm8i4rsbHd4MNyTcrzHFsLQykrtbuGRknZZCBBVXSv2tSCDN2Cg6Rt/GFRw8GoW9y9Ecw5rIPG1sg==", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", "dev": true, "dependencies": { - "lru-cache": "^9.1.1", - "minipass": "^5.0.0 || ^6.0.2" + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -14397,18 +14769,18 @@ } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.1.tgz", - "integrity": "sha512-65/Jky17UwSb0BuB9V+MyDpsOtXKmYwzhyl+cOa9XUiI4uV2Ouy/2voFP3+al0BjZbJgMBD8FojMpAf+Z+qn4A==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.0.tgz", + "integrity": "sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw==", "dev": true, "engines": { "node": "14 || >=16.14" } }, "node_modules/path-scurry/node_modules/minipass": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-6.0.2.tgz", - "integrity": "sha512-MzWSV5nYVT7mVyWCwn2o7JH13w2TBRmmSqSRCKzTw+lmft9X4z+3wjvs06Tzijo5z4W/kahUCDpRXTF+ZrmF/w==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.2.tgz", + "integrity": "sha512-eL79dXrE1q9dBbDCLg7xfn/vl7MS4F1gvJAgjJrQli/jbQWdUttuVawphqpffoIYfRdq78LHx6GP4bU/EQ2ATA==", "dev": true, "engines": { "node": ">=16 || 14 >=14.17" @@ -14475,9 +14847,9 @@ } }, "node_modules/pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", "dev": true, "engines": { "node": ">= 6" @@ -14624,9 +14996,9 @@ } }, "node_modules/pnpm": { - "version": "7.32.5", - "resolved": "https://registry.npmjs.org/pnpm/-/pnpm-7.32.5.tgz", - "integrity": "sha512-Q5WVGhbDVTEjyGk/njUOnOGIJPYCta8Vj7F8LW7hClMlFURSLjHjAD07G5v1Qi0lyhT4bo0QBTxVJnTunjP9FQ==", + "version": "7.33.4", + "resolved": "https://registry.npmjs.org/pnpm/-/pnpm-7.33.4.tgz", + "integrity": "sha512-xEbf/tkwHpGM/GXq5U/sDSiE6ykLPho+o71PHNRWqkVLm6dJe4G/5Pg619Ow32ovekrr7pii5qtfamujB/+1bA==", "dev": true, "bin": { "pnpm": "bin/pnpm.cjs", @@ -14836,6 +15208,14 @@ "node": ">= 6.0.0" } }, + "node_modules/prompt/node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "engines": { + "node": ">=0.1.90" + } + }, "node_modules/prompt/node_modules/async": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", @@ -15085,9 +15465,9 @@ } }, "node_modules/read-package-json": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.3.tgz", - "integrity": "sha512-4QbpReW4kxFgeBQ0vPAqh2y8sXEB3D4t3jsXbJKIhBiF80KT6XRo45reqwtftju5J6ru1ax06A2Gb/wM1qCOEQ==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.4.tgz", + "integrity": "sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==", "dev": true, "dependencies": { "glob": "^10.2.2", @@ -15138,16 +15518,16 @@ } }, "node_modules/read-package-json/node_modules/glob": { - "version": "10.2.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.2.6.tgz", - "integrity": "sha512-U/rnDpXJGF414QQQZv5uVsabTVxMSwzS5CH0p3DRCIV6ownl4f7PzGnkGmvlum2wB+9RlJWJZ6ACU1INnBqiPA==", + "version": "10.3.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.3.tgz", + "integrity": "sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==", "dev": true, "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^2.0.3", "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2", - "path-scurry": "^1.7.0" + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" }, "bin": { "glob": "dist/cjs/src/bin.js" @@ -15190,9 +15570,9 @@ } }, "node_modules/read-package-json/node_modules/minimatch": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz", - "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -15205,9 +15585,9 @@ } }, "node_modules/read-package-json/node_modules/minipass": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-6.0.2.tgz", - "integrity": "sha512-MzWSV5nYVT7mVyWCwn2o7JH13w2TBRmmSqSRCKzTw+lmft9X4z+3wjvs06Tzijo5z4W/kahUCDpRXTF+ZrmF/w==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.2.tgz", + "integrity": "sha512-eL79dXrE1q9dBbDCLg7xfn/vl7MS4F1gvJAgjJrQli/jbQWdUttuVawphqpffoIYfRdq78LHx6GP4bU/EQ2ATA==", "dev": true, "engines": { "node": ">=16 || 14 >=14.17" @@ -15379,9 +15759,9 @@ } }, "node_modules/read-pkg/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "bin": { "semver": "bin/semver" @@ -15827,13 +16207,21 @@ } }, "node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", "dependencies": { - "tslib": "^2.1.0" + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" } }, + "node_modules/rxjs/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -15902,9 +16290,9 @@ } }, "node_modules/semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -16108,14 +16496,14 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, "node_modules/sigstore": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.5.2.tgz", - "integrity": "sha512-X95v6xAAooVpn7PaB94TDmFeSO5SBfCtB1R23fvzr36WTfjtkiiyOeei979nbTjc8nzh6FSLeltQZuODsm1EjQ==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.7.0.tgz", + "integrity": "sha512-KP7QULhWdlu3hlp+jw2EvgWKlOGOY9McLj/jrchLjHNlNPK0KWIwF919cbmOp6QiKXLmPijR2qH/5KYWlbtG9Q==", "dev": true, "dependencies": { "@sigstore/protobuf-specs": "^0.1.0", - "make-fetch-happen": "^11.0.1", - "tuf-js": "^1.1.3" + "@sigstore/tuf": "^1.0.1", + "make-fetch-happen": "^11.0.1" }, "bin": { "sigstore": "bin/sigstore.js" @@ -16197,16 +16585,16 @@ } }, "node_modules/sigstore/node_modules/glob": { - "version": "10.2.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.2.6.tgz", - "integrity": "sha512-U/rnDpXJGF414QQQZv5uVsabTVxMSwzS5CH0p3DRCIV6ownl4f7PzGnkGmvlum2wB+9RlJWJZ6ACU1INnBqiPA==", + "version": "10.3.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.3.tgz", + "integrity": "sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==", "dev": true, "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^2.0.3", "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2", - "path-scurry": "^1.7.0" + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" }, "bin": { "glob": "dist/cjs/src/bin.js" @@ -16254,9 +16642,9 @@ } }, "node_modules/sigstore/node_modules/minimatch": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz", - "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -16385,12 +16773,12 @@ "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" }, "node_modules/sinon": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-15.1.0.tgz", - "integrity": "sha512-cS5FgpDdE9/zx7no8bxROHymSlPLZzq0ChbbLk1DrxBfc+eTeBK3y8nIL+nu/0QeYydhhbLIr7ecHJpywjQaoQ==", + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-15.2.0.tgz", + "integrity": "sha512-nPS85arNqwBXaIsFCkolHjGIkFo+Oxu9vbgmBJizLAhqe6P2o3Qmj3KCUoRkfhHtvgDhZdWD3risLHAUJ8npjw==", "dependencies": { "@sinonjs/commons": "^3.0.0", - "@sinonjs/fake-timers": "^10.2.0", + "@sinonjs/fake-timers": "^10.3.0", "@sinonjs/samsam": "^8.0.0", "diff": "^5.1.0", "nise": "^5.1.4", @@ -16464,11 +16852,20 @@ } }, "node_modules/slice-ansi": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", - "integrity": "sha512-up04hB2hR92PgjpyU3y/eg91yIBILyjVY26NvvciY3EVVPjybkMszMpXQ9QAkcS3I5rtJBDLoTxxg+qvW8c7rw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, "node_modules/smart-buffer": { @@ -17016,32 +17413,6 @@ "node": ">=4" } }, - "node_modules/table/node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/table/node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, "node_modules/taketalk": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/taketalk/-/taketalk-1.0.0.tgz", @@ -17228,9 +17599,9 @@ } }, "node_modules/tough-cookie": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz", - "integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", "dependencies": { "psl": "^1.1.33", "punycode": "^2.1.1", @@ -17276,9 +17647,12 @@ "dev": true }, "node_modules/triple-beam": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", - "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", + "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", + "engines": { + "node": ">= 14.0.0" + } }, "node_modules/ts-invariant": { "version": "0.10.3", @@ -17292,9 +17666,9 @@ } }, "node_modules/ts-jest": { - "version": "29.1.0", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.0.tgz", - "integrity": "sha512-ZhNr7Z4PcYa+JjMl62ir+zPiNJfXJN6E8hSLnaUKhOgqcn8vb3e537cpkd0FuAfRK3sR1LSqM1MOhliXNgOFPA==", + "version": "29.1.1", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz", + "integrity": "sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==", "dev": true, "dependencies": { "bs-logger": "0.x", @@ -17303,7 +17677,7 @@ "json5": "^2.2.3", "lodash.memoize": "4.x", "make-error": "1.x", - "semver": "7.x", + "semver": "^7.5.3", "yargs-parser": "^21.0.1" }, "bin": { @@ -17394,9 +17768,9 @@ } }, "node_modules/tslib": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.2.tgz", - "integrity": "sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA==" + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==" }, "node_modules/tsutils": { "version": "3.21.0", @@ -17420,14 +17794,14 @@ "dev": true }, "node_modules/tuf-js": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.6.tgz", - "integrity": "sha512-CXwFVIsXGbVY4vFiWF7TJKWmlKJAT8TWkH4RmiohJRcDJInix++F0dznDmoVbtJNzZ8yLprKUG4YrDIhv3nBMg==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.7.tgz", + "integrity": "sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==", "dev": true, "dependencies": { "@tufjs/models": "1.0.4", "debug": "^4.3.4", - "make-fetch-happen": "^11.1.0" + "make-fetch-happen": "^11.1.1" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" @@ -17506,16 +17880,16 @@ } }, "node_modules/tuf-js/node_modules/glob": { - "version": "10.2.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.2.6.tgz", - "integrity": "sha512-U/rnDpXJGF414QQQZv5uVsabTVxMSwzS5CH0p3DRCIV6ownl4f7PzGnkGmvlum2wB+9RlJWJZ6ACU1INnBqiPA==", + "version": "10.3.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.3.tgz", + "integrity": "sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==", "dev": true, "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^2.0.3", "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2", - "path-scurry": "^1.7.0" + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" }, "bin": { "glob": "dist/cjs/src/bin.js" @@ -17563,9 +17937,9 @@ } }, "node_modules/tuf-js/node_modules/minimatch": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz", - "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -18187,17 +18561,16 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", "dev": true, "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -18227,9 +18600,9 @@ } }, "node_modules/winston": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.8.2.tgz", - "integrity": "sha512-MsE1gRx1m5jdTTO9Ld/vND4krP2To+lgDoMEHGGa4HIlAUyXJtfc7CxQcGXVyz2IBpw5hbFkj2b/AtUdQwyRew==", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.10.0.tgz", + "integrity": "sha512-nT6SIDaE9B7ZRO0u3UvdrimG0HkB7dSTAgInQnNR2SOPJ4bvq5q79+pXLftKmP52lJGW15+H5MCK0nM9D3KB/g==", "dependencies": { "@colors/colors": "1.5.0", "@dabh/diagnostics": "^2.0.2", @@ -18273,6 +18646,14 @@ "node": ">= 6" } }, + "node_modules/winston/node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "engines": { + "node": ">=0.1.90" + } + }, "node_modules/winston/node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", @@ -18287,9 +18668,11 @@ } }, "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -18586,9 +18969,9 @@ } }, "node_modules/yeoman-environment": { - "version": "3.18.3", - "resolved": "https://registry.npmjs.org/yeoman-environment/-/yeoman-environment-3.18.3.tgz", - "integrity": "sha512-OF5C87D7QUDOe4Lo2QucPnqFz0V3dNvC7D5Up6kVxUZKrY3LtNM7JIFAb/rhfEp/lKlZ28Olrb/BYFTDHcJ2og==", + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/yeoman-environment/-/yeoman-environment-3.19.3.tgz", + "integrity": "sha512-/+ODrTUHtlDPRH9qIC0JREH8+7nsRcjDl3Bxn2Xo/rvAaVvixH5275jHwg0C85g4QsF4P6M2ojfScPPAl+pLAg==", "dev": true, "dependencies": { "@npmcli/arborist": "^4.0.4", @@ -18621,6 +19004,7 @@ "pacote": "^12.0.2", "preferred-pm": "^3.0.3", "pretty-bytes": "^5.3.0", + "readable-stream": "^4.3.0", "semver": "^7.1.3", "slash": "^3.0.0", "strip-ansi": "^6.0.0", @@ -18635,6 +19019,30 @@ "node": ">=12.10.0" } }, + "node_modules/yeoman-environment/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "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" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, "node_modules/yeoman-environment/node_modules/commander": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.1.0.tgz", @@ -18644,6 +19052,15 @@ "node": ">= 10" } }, + "node_modules/yeoman-environment/node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, "node_modules/yeoman-environment/node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -18664,6 +19081,26 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/yeoman-environment/node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "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/yeoman-environment/node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -18680,6 +19117,31 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/yeoman-environment/node_modules/readable-stream": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.2.tgz", + "integrity": "sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==", + "dev": true, + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/yeoman-environment/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/yeoman-generator": { "version": "5.9.0", "resolved": "https://registry.npmjs.org/yeoman-generator/-/yeoman-generator-5.9.0.tgz", @@ -18727,9 +19189,9 @@ } }, "node_modules/yeoman-generator/node_modules/@npmcli/git": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.0.4.tgz", - "integrity": "sha512-5yZghx+u5M47LghaybLCkdSyFzV/w4OuH12d96HO389Ik9CDsLaDZJVynSGGVJOLn6gy/k7Dz5XYcplM3uxXRg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.1.0.tgz", + "integrity": "sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==", "dev": true, "dependencies": { "@npmcli/promise-spawn": "^6.0.0", @@ -18761,20 +19223,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/yeoman-generator/node_modules/@npmcli/move-file": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", - "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", - "deprecated": "This functionality has been moved to @npmcli/fs", - "dev": true, - "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, "node_modules/yeoman-generator/node_modules/@npmcli/node-gyp": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", @@ -18867,16 +19315,16 @@ } }, "node_modules/yeoman-generator/node_modules/cacache/node_modules/glob": { - "version": "10.2.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.2.6.tgz", - "integrity": "sha512-U/rnDpXJGF414QQQZv5uVsabTVxMSwzS5CH0p3DRCIV6ownl4f7PzGnkGmvlum2wB+9RlJWJZ6ACU1INnBqiPA==", + "version": "10.3.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.3.tgz", + "integrity": "sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==", "dev": true, "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^2.0.3", "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2", - "path-scurry": "^1.7.0" + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" }, "bin": { "glob": "dist/cjs/src/bin.js" @@ -18990,169 +19438,35 @@ } }, "node_modules/yeoman-generator/node_modules/make-fetch-happen": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", - "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", "dev": true, "dependencies": { "agentkeepalive": "^4.2.1", - "cacache": "^16.1.0", - "http-cache-semantics": "^4.1.0", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", "http-proxy-agent": "^5.0.0", "https-proxy-agent": "^5.0.0", "is-lambda": "^1.0.1", "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "negotiator": "^0.6.3", "promise-retry": "^2.0.1", "socks-proxy-agent": "^7.0.0", - "ssri": "^9.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/yeoman-generator/node_modules/make-fetch-happen/node_modules/@npmcli/fs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", - "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", - "dev": true, - "dependencies": { - "@gar/promisify": "^1.1.3", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/yeoman-generator/node_modules/make-fetch-happen/node_modules/cacache": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", - "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", - "dev": true, - "dependencies": { - "@npmcli/fs": "^2.1.0", - "@npmcli/move-file": "^2.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "infer-owner": "^1.0.4", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11", - "unique-filename": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/yeoman-generator/node_modules/make-fetch-happen/node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/yeoman-generator/node_modules/make-fetch-happen/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/yeoman-generator/node_modules/make-fetch-happen/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yeoman-generator/node_modules/make-fetch-happen/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yeoman-generator/node_modules/make-fetch-happen/node_modules/ssri": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", - "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", - "dev": true, - "dependencies": { - "minipass": "^3.1.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/yeoman-generator/node_modules/make-fetch-happen/node_modules/unique-filename": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", - "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", - "dev": true, - "dependencies": { - "unique-slug": "^3.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/yeoman-generator/node_modules/make-fetch-happen/node_modules/unique-slug": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", - "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4" + "ssri": "^10.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/yeoman-generator/node_modules/minimatch": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz", - "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -19174,44 +19488,33 @@ } }, "node_modules/yeoman-generator/node_modules/minipass-fetch": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", - "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.3.tgz", + "integrity": "sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ==", "dev": true, "dependencies": { - "minipass": "^3.1.6", + "minipass": "^5.0.0", "minipass-sized": "^1.0.3", "minizlib": "^2.1.2" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" }, "optionalDependencies": { "encoding": "^0.1.13" } }, - "node_modules/yeoman-generator/node_modules/minipass-fetch/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/yeoman-generator/node_modules/node-gyp": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.3.1.tgz", - "integrity": "sha512-4Q16ZCqq3g8awk6UplT7AuxQ35XN4R/yf/+wSAwcBUAjg7l58RTactWaP8fIDTi0FzI7YcVLujwExakZlfWkXg==", + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.0.tgz", + "integrity": "sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg==", "dev": true, "dependencies": { "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", "glob": "^7.1.4", "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", + "make-fetch-happen": "^11.0.3", "nopt": "^6.0.0", "npmlog": "^6.0.0", "rimraf": "^3.0.2", @@ -19349,49 +19652,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/yeoman-generator/node_modules/npm-registry-fetch/node_modules/make-fetch-happen": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", - "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", - "dev": true, - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", - "http-cache-semantics": "^4.1.1", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^10.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/yeoman-generator/node_modules/npm-registry-fetch/node_modules/minipass-fetch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.3.tgz", - "integrity": "sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ==", - "dev": true, - "dependencies": { - "minipass": "^5.0.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, "node_modules/yeoman-generator/node_modules/npmlog": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", @@ -19582,12 +19842,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/yeoman-generator/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", @@ -19819,26 +20073,26 @@ }, "packages/contentstack": { "name": "@contentstack/cli", - "version": "1.7.9", + "version": "1.8.3", "license": "MIT", "dependencies": { - "@contentstack/cli-auth": "^1.3.10", - "@contentstack/cli-cm-bootstrap": "^1.4.11", - "@contentstack/cli-cm-branches": "^1.0.8", - "@contentstack/cli-cm-bulk-publish": "^1.3.8", - "@contentstack/cli-cm-clone": "^1.4.11", - "@contentstack/cli-cm-export": "^1.5.9", - "@contentstack/cli-cm-export-to-csv": "^1.3.10", - "@contentstack/cli-cm-import": "^1.5.11", - "@contentstack/cli-cm-migrate-rte": "^1.4.8", - "@contentstack/cli-cm-seed": "^1.4.11", - "@contentstack/cli-command": "^1.2.9", - "@contentstack/cli-config": "^1.4.8", - "@contentstack/cli-launch": "^1.0.7", - "@contentstack/cli-migration": "^1.3.8", - "@contentstack/cli-utilities": "^1.4.5", - "@contentstack/management": "^1.8.0", - "@oclif/core": "^2.8.2", + "@contentstack/cli-auth": "~1.3.12", + "@contentstack/cli-cm-bootstrap": "~1.4.14", + "@contentstack/cli-cm-branches": "~1.0.11", + "@contentstack/cli-cm-bulk-publish": "~1.3.10", + "@contentstack/cli-cm-clone": "~1.4.15", + "@contentstack/cli-cm-export": "~1.8.0", + "@contentstack/cli-cm-export-to-csv": "~1.4.0", + "@contentstack/cli-cm-import": "~1.8.2", + "@contentstack/cli-cm-migrate-rte": "~1.4.10", + "@contentstack/cli-cm-seed": "~1.4.14", + "@contentstack/cli-command": "~1.2.11", + "@contentstack/cli-config": "~1.4.10", + "@contentstack/cli-launch": "~1.0.10", + "@contentstack/cli-migration": "~1.3.11", + "@contentstack/cli-utilities": "~1.5.1", + "@contentstack/management": "~1.10.0", + "@oclif/core": "^2.9.3", "@oclif/plugin-help": "^5", "@oclif/plugin-not-found": "^2.3.9", "@oclif/plugin-plugins": "^2.1.7", @@ -19868,7 +20122,7 @@ "eslint-config-oclif": "^4.0.0", "eslint-config-oclif-typescript": "^0.1.0", "globby": "^10.0.2", - "mocha": "^10.0.0", + "mocha": "10.1.0", "nock": "^13.1.0", "nyc": "^15.1.0", "oclif": "^3.8.1", @@ -19877,6 +20131,7 @@ "sinon": "^15.0.1", "tmp": "^0.2.1", "ts-node": "^10.9.1", + "tslib": "^2.4.1", "typescript": "^4.9.3" }, "engines": { @@ -19885,11 +20140,11 @@ }, "packages/contentstack-auth": { "name": "@contentstack/cli-auth", - "version": "1.3.10", + "version": "1.3.12", "license": "MIT", "dependencies": { - "@contentstack/cli-command": "^1.2.9", - "@contentstack/cli-utilities": "^1.4.5", + "@contentstack/cli-command": "~1.2.11", + "@contentstack/cli-utilities": "~1.5.1", "chalk": "^4.0.0", "debug": "^4.1.1", "inquirer": "8.2.4", @@ -19924,164 +20179,14 @@ "node": ">=14.0.0" } }, - "packages/contentstack-auth/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "packages/contentstack-auth/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "packages/contentstack-auth/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "packages/contentstack-auth/node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "packages/contentstack-auth/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "packages/contentstack-auth/node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/contentstack-auth/node_modules/mocha": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.1.0.tgz", - "integrity": "sha512-vUF7IYxEoN7XhQpFLxQAEMtE4W91acW4B6En9l97MwE9stL1A9gusXfoHZCLVHDUJ/7V5+lbCM6yMqzo5vNymg==", - "dev": true, - "dependencies": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "nanoid": "3.3.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha.js" - }, - "engines": { - "node": ">= 14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" - } - }, - "packages/contentstack-auth/node_modules/mocha/node_modules/minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "packages/contentstack-auth/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "packages/contentstack-auth/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, "packages/contentstack-bootstrap": { "name": "@contentstack/cli-cm-bootstrap", - "version": "1.4.11", + "version": "1.4.14", "license": "MIT", "dependencies": { - "@contentstack/cli-cm-seed": "^1.4.11", - "@contentstack/cli-command": "^1.2.9", - "@contentstack/cli-utilities": "^1.4.5", + "@contentstack/cli-cm-seed": "~1.4.14", + "@contentstack/cli-command": "~1.2.11", + "@contentstack/cli-utilities": "~1.5.1", "inquirer": "8.2.4", "mkdirp": "^1.0.4", "tar": "^6.1.13" @@ -20097,7 +20202,7 @@ "eslint-config-oclif": "^4.0.0", "eslint-config-oclif-typescript": "^0.1.0", "globby": "^10.0.2", - "mocha": "^10.0.0", + "mocha": "10.1.0", "nyc": "^15.1.0", "oclif": "^3.8.1", "rimraf": "^2.7.1", @@ -20155,14 +20260,14 @@ }, "packages/contentstack-branches": { "name": "@contentstack/cli-cm-branches", - "version": "1.0.8", + "version": "1.0.11", "license": "MIT", "dependencies": { - "@contentstack/cli-command": "^1.2.9", - "@contentstack/cli-utilities": "^1.4.5", + "@contentstack/cli-command": "~1.2.11", + "@contentstack/cli-utilities": "~1.5.1", "@oclif/command": "^1.8.16", "@oclif/config": "^1.18.3", - "@oclif/core": "^2.3.0", + "@oclif/core": "^2.9.3", "async": "^3.2.4", "big-json": "^3.2.0", "bluebird": "^3.7.2", @@ -20180,9 +20285,9 @@ "winston": "^3.7.2" }, "devDependencies": { - "@contentstack/cli-auth": "^1.3.8", - "@contentstack/cli-config": "^1.4.6", - "@contentstack/cli-dev-dependencies": "^1.2.3", + "@contentstack/cli-auth": "~1.3.11", + "@contentstack/cli-config": "~1.4.9", + "@contentstack/cli-dev-dependencies": "~1.2.3", "@oclif/plugin-help": "^5.1.19", "@oclif/test": "^1.2.6", "@types/flat": "^5.0.2", @@ -20216,167 +20321,19 @@ "node": ">=8.0.0" } }, - "packages/contentstack-branches/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "packages/contentstack-branches/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "packages/contentstack-branches/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "packages/contentstack-branches/node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "packages/contentstack-branches/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "packages/contentstack-branches/node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/contentstack-branches/node_modules/mocha": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.1.0.tgz", - "integrity": "sha512-vUF7IYxEoN7XhQpFLxQAEMtE4W91acW4B6En9l97MwE9stL1A9gusXfoHZCLVHDUJ/7V5+lbCM6yMqzo5vNymg==", - "dev": true, - "dependencies": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "nanoid": "3.3.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha.js" - }, - "engines": { - "node": ">= 14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" - } - }, - "packages/contentstack-branches/node_modules/mocha/node_modules/minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "packages/contentstack-branches/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "packages/contentstack-branches/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, "packages/contentstack-bulk-publish": { "name": "@contentstack/cli-cm-bulk-publish", - "version": "1.3.8", + "version": "1.3.10", "license": "MIT", "dependencies": { - "@contentstack/cli-command": "^1.2.9", - "@contentstack/cli-utilities": "^1.4.5", + "@contentstack/cli-command": "~1.2.11", + "@contentstack/cli-utilities": "~1.5.1", "bluebird": "^3.7.2", "chalk": "^4.1.2", + "dotenv": "^16.1.4", "inquirer": "8.2.4", "lodash": "^4.17.15", + "mkdirp": "^1.0.4", "nock": "^13.0.2", "winston": "^3.7.2" }, @@ -20415,14 +20372,14 @@ }, "packages/contentstack-clone": { "name": "@contentstack/cli-cm-clone", - "version": "1.4.11", + "version": "1.4.15", "license": "MIT", "dependencies": { "@colors/colors": "^1.5.0", - "@contentstack/cli-cm-export": "^1.5.9", - "@contentstack/cli-cm-import": "^1.5.11", - "@contentstack/cli-command": "^1.2.9", - "@contentstack/cli-utilities": "^1.4.5", + "@contentstack/cli-cm-export": "~1.8.0", + "@contentstack/cli-cm-import": "~1.8.0", + "@contentstack/cli-command": "~1.2.11", + "@contentstack/cli-utilities": "~1.5.1", "async": "^3.2.4", "chalk": "^4.1.0", "child_process": "^1.0.2", @@ -20477,10 +20434,10 @@ }, "packages/contentstack-command": { "name": "@contentstack/cli-command", - "version": "1.2.9", + "version": "1.2.11", "license": "MIT", "dependencies": { - "@contentstack/cli-utilities": "^1.4.5", + "@contentstack/cli-utilities": "~1.5.1", "contentstack": "^3.10.1" }, "devDependencies": { @@ -20505,138 +20462,15 @@ "node": ">=14.0.0" } }, - "packages/contentstack-command/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "packages/contentstack-command/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "packages/contentstack-command/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "packages/contentstack-command/node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "packages/contentstack-command/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "packages/contentstack-command/node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/contentstack-command/node_modules/mocha": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.1.0.tgz", - "integrity": "sha512-vUF7IYxEoN7XhQpFLxQAEMtE4W91acW4B6En9l97MwE9stL1A9gusXfoHZCLVHDUJ/7V5+lbCM6yMqzo5vNymg==", - "dev": true, - "dependencies": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "nanoid": "3.3.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha.js" - }, - "engines": { - "node": ">= 14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" - } - }, - "packages/contentstack-command/node_modules/mocha/node_modules/minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "packages/contentstack-command/node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, "engines": { - "node": ">=10" + "node": ">=0.3.1" } }, - "packages/contentstack-command/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, "packages/contentstack-command/node_modules/source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", @@ -20672,44 +20506,18 @@ "typescript": ">=2.7" } }, - "packages/contentstack-command/node_modules/ts-node/node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "packages/contentstack-command/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, "packages/contentstack-config": { "name": "@contentstack/cli-config", - "version": "1.4.8", + "version": "1.4.10", "license": "MIT", "dependencies": { - "@contentstack/cli-command": "^1.2.9", - "@contentstack/cli-utilities": "^1.4.5", + "@contentstack/cli-command": "~1.2.11", + "@contentstack/cli-utilities": "~1.5.1", "chalk": "^4.0.0", "debug": "^4.1.1", "inquirer": "8.2.4", "lodash": "^4.17.20", + "mkdirp": "^1.0.4", "winston": "^3.7.2" }, "devDependencies": { @@ -20738,178 +20546,212 @@ "node": ">=14.0.0" } }, - "packages/contentstack-config/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "packages/contentstack-config/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, + "packages/contentstack-dev-dependencies": { + "name": "@contentstack/cli-dev-dependencies", + "version": "1.2.3", + "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "@oclif/core": "^2.9.3", + "lodash": "^4.17.21" + }, + "devDependencies": { + "@types/node": "^14.14.32", + "eslint": "^7.32.0", + "fancy-test": "^2.0.0", + "mocha": "10.1.0", + "ts-node": "^10.9.1", + "tslib": "^2.5.0", + "typescript": "^4.9.3" } }, - "packages/contentstack-config/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "packages/contentstack-dev-dependencies/node_modules/@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", "dev": true, "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" + "@babel/highlight": "^7.10.4" } }, - "packages/contentstack-config/node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "packages/contentstack-dev-dependencies/node_modules/@eslint/eslintrc": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", "dev": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "strip-json-comments": "^3.1.1" }, "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": "^10.12.0 || >=12.0.0" } }, - "packages/contentstack-config/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "packages/contentstack-dev-dependencies/node_modules/@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", "dev": true, "dependencies": { - "argparse": "^2.0.1" + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">=10.10.0" } }, - "packages/contentstack-config/node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "packages/contentstack-dev-dependencies/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" + "bin": { + "acorn": "bin/acorn" }, "engines": { - "node": ">=10" + "node": ">=0.4.0" + } + }, + "packages/contentstack-dev-dependencies/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "packages/contentstack-config/node_modules/mocha": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.1.0.tgz", - "integrity": "sha512-vUF7IYxEoN7XhQpFLxQAEMtE4W91acW4B6En9l97MwE9stL1A9gusXfoHZCLVHDUJ/7V5+lbCM6yMqzo5vNymg==", + "packages/contentstack-dev-dependencies/node_modules/eslint": { + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", "dev": true, "dependencies": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "nanoid": "3.3.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" }, "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha.js" + "eslint": "bin/eslint.js" }, "engines": { - "node": ">= 14.0.0" + "node": "^10.12.0 || >=12.0.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" + "url": "https://opencollective.com/eslint" } }, - "packages/contentstack-config/node_modules/mocha/node_modules/minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "packages/contentstack-dev-dependencies/node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "dev": true, "dependencies": { - "brace-expansion": "^2.0.1" + "eslint-visitor-keys": "^1.1.0" }, "engines": { - "node": ">=10" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" } }, - "packages/contentstack-config/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "packages/contentstack-dev-dependencies/node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } }, - "packages/contentstack-config/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "packages/contentstack-dev-dependencies/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, "engines": { "node": ">=10" } }, - "packages/contentstack-dev-dependencies": { - "name": "@contentstack/cli-dev-dependencies", - "version": "1.2.3", - "license": "MIT", + "packages/contentstack-dev-dependencies/node_modules/espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, "dependencies": { - "@oclif/core": "^2.8.5", - "lodash": "^4.17.21" + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" }, - "devDependencies": { - "@types/node": "^14.14.32", - "eslint": "^8.18.0", - "fancy-test": "^2.0.0", - "mocha": "^10.0.0", - "ts-node": "^10.9.1", - "tslib": "^2.5.0", - "typescript": "^4.9.3" + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "packages/contentstack-dev-dependencies/node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" } }, "packages/contentstack-dev-dependencies/node_modules/fancy-test": { - "version": "2.0.23", - "resolved": "https://registry.npmjs.org/fancy-test/-/fancy-test-2.0.23.tgz", - "integrity": "sha512-RPX4iAzAioH9nxkqk2yrcunBLBmnMLxtIsw3Pjgj2PGPHTdT3wZ6asKv9U332+UQyZwZWWc4bP64JOa6DcVhnQ==", + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/fancy-test/-/fancy-test-2.0.30.tgz", + "integrity": "sha512-bDQnAXYYODKwjb/6VEwAovEN0uJ1iRMTahEqOpQCRxIX7rIqoFHCy0LEqWYAU3kVw4ERgK4HQSn6GISEA1ipxg==", "dev": true, "dependencies": { "@types/chai": "*", @@ -20918,41 +20760,73 @@ "@types/sinon": "*", "lodash": "^4.17.13", "mock-stdin": "^1.0.0", - "nock": "^13.3.1", + "nock": "^13.3.2", "stdout-stderr": "^0.1.9" }, "engines": { "node": ">=12.0.0" } }, + "packages/contentstack-dev-dependencies/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "packages/contentstack-dev-dependencies/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "packages/contentstack-dev-dependencies/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, "packages/contentstack-export": { "name": "@contentstack/cli-cm-export", - "version": "1.5.9", + "version": "1.8.0", "license": "MIT", "dependencies": { - "@contentstack/cli-command": "^1.2.9", - "@contentstack/cli-utilities": "^1.4.5", + "@contentstack/cli-command": "~1.2.11", + "@contentstack/cli-utilities": "~1.5.1", "@oclif/command": "^1.8.16", "@oclif/config": "^1.18.3", + "@oclif/core": "^2.9.3", "async": "^3.2.4", "big-json": "^3.2.0", "bluebird": "^3.7.2", "chalk": "^4.1.2", "is-valid-path": "^0.1.1", "lodash": "^4.17.20", - "mkdirp": "^2.1.3", + "merge": "^2.1.1", + "mkdirp": "^1.0.4", "path": "^0.12.7", "progress-stream": "^2.0.0", "promise-limit": "^2.7.0", "proxyquire": "^2.1.3", + "tslib": "^2.4.1", "winston": "^3.7.2" }, "devDependencies": { - "@contentstack/cli-auth": "^1.3.8", - "@contentstack/cli-config": "^1.4.6", - "@contentstack/cli-dev-dependencies": "^1.2.3", + "@contentstack/cli-auth": "~1.3.11", + "@contentstack/cli-config": "~1.4.9", + "@contentstack/cli-dev-dependencies": "~1.2.3", "@oclif/plugin-help": "^5.1.19", "@oclif/test": "^1.2.6", + "@types/mkdirp": "^1.0.2", + "@types/progress-stream": "^2.0.2", "assert": "^2.0.0", "chai": "^4.2.0", "dotenv": "^16.0.1", @@ -20963,7 +20837,9 @@ "mocha": "10.1.0", "nyc": "^15.1.0", "oclif": "^3.8.1", - "sinon": "^15.0.1" + "sinon": "^15.0.1", + "ts-node": "^10.9.1", + "typescript": "^4.9.3" }, "engines": { "node": ">=14.0.0" @@ -20971,11 +20847,11 @@ }, "packages/contentstack-export-to-csv": { "name": "@contentstack/cli-cm-export-to-csv", - "version": "1.3.10", + "version": "1.4.0", "license": "MIT", "dependencies": { - "@contentstack/cli-command": "^1.2.9", - "@contentstack/cli-utilities": "^1.4.5", + "@contentstack/cli-command": "~1.2.11", + "@contentstack/cli-utilities": "~1.5.1", "chalk": "^4.1.0", "fast-csv": "^4.3.6", "inquirer": "8.2.4", @@ -20986,7 +20862,7 @@ "@oclif/test": "^2.2.10", "chai": "^4.2.0", "debug": "^4.3.1", - "eslint": "^8.18.0", + "eslint": "^7.32.0", "eslint-config-oclif": "^4.0.0", "globby": "^10.0.2", "mocha": "^10.0.0", @@ -20997,210 +20873,275 @@ "node": ">=14.0.0" } }, - "packages/contentstack-export/node_modules/@oclif/test": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/@oclif/test/-/test-1.2.9.tgz", - "integrity": "sha512-op+ak0NTyeBKqjLVH1jfPCRGWK5befIoQpCL/xwekjucUEmMfCbUpV1Sa60f9rU8X58HEqrclwWbAH+DtQR6FQ==", + "packages/contentstack-export-to-csv/node_modules/@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", "dev": true, "dependencies": { - "fancy-test": "^1.4.10" - }, - "engines": { - "node": ">=8.0.0" + "@babel/highlight": "^7.10.4" } }, - "packages/contentstack-export/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "packages/contentstack-export/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "packages/contentstack-export-to-csv/node_modules/@eslint/eslintrc": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", "dev": true, "dependencies": { - "balanced-match": "^1.0.0" + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" } }, - "packages/contentstack-export/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "packages/contentstack-export-to-csv/node_modules/@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", "dev": true, "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" } }, - "packages/contentstack-export/node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "packages/contentstack-export-to-csv/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "bin": { + "acorn": "bin/acorn" }, "engines": { - "node": "*" + "node": ">=0.4.0" + } + }, + "packages/contentstack-export-to-csv/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "packages/contentstack-export/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "packages/contentstack-export-to-csv/node_modules/eslint": { + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", "dev": true, "dependencies": { - "argparse": "^2.0.1" + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" }, "bin": { - "js-yaml": "bin/js-yaml.js" + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "packages/contentstack-export/node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "packages/contentstack-export-to-csv/node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "dev": true, "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" + "eslint-visitor-keys": "^1.1.0" }, "engines": { - "node": ">=10" + "node": ">=6" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/mysticatea" } }, - "packages/contentstack-export/node_modules/mkdirp": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-2.1.6.tgz", - "integrity": "sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, + "packages/contentstack-export-to-csv/node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "packages/contentstack-export-to-csv/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" } }, - "packages/contentstack-export/node_modules/mocha": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.1.0.tgz", - "integrity": "sha512-vUF7IYxEoN7XhQpFLxQAEMtE4W91acW4B6En9l97MwE9stL1A9gusXfoHZCLVHDUJ/7V5+lbCM6yMqzo5vNymg==", + "packages/contentstack-export-to-csv/node_modules/espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", "dev": true, "dependencies": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "nanoid": "3.3.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha.js" + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" }, "engines": { - "node": ">= 14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" + "node": "^10.12.0 || >=12.0.0" } }, - "packages/contentstack-export/node_modules/mocha/node_modules/minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "packages/contentstack-export-to-csv/node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "packages/contentstack-export-to-csv/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "dependencies": { - "brace-expansion": "^2.0.1" + "is-glob": "^4.0.1" }, "engines": { - "node": ">=10" + "node": ">= 6" } }, - "packages/contentstack-export/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "packages/contentstack-export-to-csv/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "packages/contentstack-export-to-csv/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, - "packages/contentstack-export/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "packages/contentstack-export/node_modules/@oclif/test": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@oclif/test/-/test-1.2.9.tgz", + "integrity": "sha512-op+ak0NTyeBKqjLVH1jfPCRGWK5befIoQpCL/xwekjucUEmMfCbUpV1Sa60f9rU8X58HEqrclwWbAH+DtQR6FQ==", "dev": true, "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" + "fancy-test": "^1.4.10" }, "engines": { - "node": ">=10" + "node": ">=8.0.0" } }, "packages/contentstack-import": { "name": "@contentstack/cli-cm-import", - "version": "1.5.11", + "version": "1.8.2", "license": "MIT", "dependencies": { - "@contentstack/cli-command": "^1.2.9", - "@contentstack/cli-utilities": "^1.4.5", + "@contentstack/cli-command": "~1.2.11", + "@contentstack/cli-utilities": "~1.5.1", + "@contentstack/management": "~1.10.0", "@oclif/config": "^1.18.3", + "@oclif/core": "^2.9.3", "big-json": "^3.2.0", "bluebird": "^3.7.2", "chalk": "^4.1.2", "debug": "^4.1.0", - "fs-extra": "^11.1.1", "lodash": "^4.17.20", "marked": "^4.0.17", + "merge": "^2.1.1", "mkdirp": "^1.0.4", + "ncp": "^2.0.0", "promise-limit": "^2.7.0", + "tslib": "^2.4.1", "winston": "^3.7.2" }, "devDependencies": { "@oclif/test": "^1.2.6", + "@types/bluebird": "^3.5.38", + "@types/chai": "^4.2.18", + "@types/mkdirp": "^1.0.2", + "@types/mocha": "^8.2.2", + "@types/ncp": "^2.0.5", + "@types/node": "^14.14.32", + "@types/sinon": "^10.0.2", + "@types/tar": "^4.0.3", + "@typescript-eslint/eslint-plugin": "^5.48.2", "chai": "^4.2.0", "eslint": "^8.18.0", "eslint-config-oclif": "^4.0.0", "globby": "^10.0.2", "mocha": "^10.0.0", "nyc": "^15.1.0", - "oclif": "^3.8.1" + "oclif": "^3.8.1", + "rimraf": "^2.7.1", + "sinon": "^11.1.1", + "tmp": "^0.2.1", + "ts-node": "^10.9.1", + "typescript": "^4.9.3" }, "engines": { "node": ">=14.0.0" @@ -21218,28 +21159,84 @@ "node": ">=8.0.0" } }, - "packages/contentstack-import/node_modules/fs-extra": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", - "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "packages/contentstack-import/node_modules/@sinonjs/commons": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "dev": true, "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "type-detect": "4.0.8" + } + }, + "packages/contentstack-import/node_modules/@sinonjs/fake-timers": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz", + "integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "packages/contentstack-import/node_modules/@sinonjs/samsam": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.1.3.tgz", + "integrity": "sha512-nhOb2dWPeb1sd3IQXL/dVPnKHDOAFfvichtBf4xV00/rU1QbPCQqKMbvIheIjqwVjh7qIgf2AHTHi391yMOMpQ==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.6.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" + } + }, + "packages/contentstack-import/node_modules/@types/tar": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/tar/-/tar-4.0.5.tgz", + "integrity": "sha512-cgwPhNEabHaZcYIy5xeMtux2EmYBitfqEceBUi2t5+ETy4dW6kswt6WX4+HqLeiiKOo42EXbGiDmVJ2x+vi37Q==", + "dev": true, + "dependencies": { + "@types/minipass": "*", + "@types/node": "*" + } + }, + "packages/contentstack-import/node_modules/sinon": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-11.1.2.tgz", + "integrity": "sha512-59237HChms4kg7/sXhiRcUzdSkKuydDeTiamT/jesUVHshBgL8XAmhgFo0GfK6RruMDM/iRSij1EybmMog9cJw==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.8.3", + "@sinonjs/fake-timers": "^7.1.2", + "@sinonjs/samsam": "^6.0.2", + "diff": "^5.0.0", + "nise": "^5.1.0", + "supports-color": "^7.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/sinon" + } + }, + "packages/contentstack-import/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" }, "engines": { - "node": ">=14.14" + "node": ">=8" } }, "packages/contentstack-launch": { "name": "@contentstack/cli-launch", - "version": "1.0.7", + "version": "1.0.10", "license": "MIT", "dependencies": { "@apollo/client": "^3.7.9", - "@contentstack/cli-command": "^1.2.9", - "@contentstack/cli-utilities": "^1.4.5", - "@oclif/core": "^2.8.2", + "@contentstack/cli-command": "~1.2.11", + "@contentstack/cli-utilities": "~1.5.1", + "@oclif/core": "^2.9.3", "@oclif/plugin-help": "^5", "@oclif/plugin-plugins": "^2.3.2", "@types/express": "^4.17.17", @@ -21326,9 +21323,9 @@ } }, "packages/contentstack-launch/node_modules/@types/node": { - "version": "16.18.32", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.32.tgz", - "integrity": "sha512-zpnXe4dEz6PrWz9u7dqyRoq9VxwCvoXRPy/ewhmMa1CgEyVmtL1NJPQ2MX+4pf97vetquVKkpiMx0MwI8pjNOw==", + "version": "16.18.38", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.38.tgz", + "integrity": "sha512-6sfo1qTulpVbkxECP+AVrHV9OoJqhzCsfTNp5NIG+enM4HyM3HvZCO798WShIXBN0+QtDIcutJCjsVYnQP5rIQ==", "dev": true }, "packages/contentstack-launch/node_modules/@typescript-eslint/eslint-plugin": { @@ -21399,6 +21396,80 @@ } } }, + "packages/contentstack-launch/node_modules/@typescript-eslint/scope-manager": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz", + "integrity": "sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/visitor-keys": "4.33.0" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "packages/contentstack-launch/node_modules/@typescript-eslint/types": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz", + "integrity": "sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==", + "dev": true, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "packages/contentstack-launch/node_modules/@typescript-eslint/typescript-estree": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz", + "integrity": "sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/visitor-keys": "4.33.0", + "debug": "^4.3.1", + "globby": "^11.0.3", + "is-glob": "^4.0.1", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "packages/contentstack-launch/node_modules/@typescript-eslint/visitor-keys": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz", + "integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.33.0", + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "packages/contentstack-launch/node_modules/acorn": { "version": "7.4.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", @@ -21536,19 +21607,6 @@ "eslint": ">=7.32.0" } }, - "packages/contentstack-launch/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, "packages/contentstack-launch/node_modules/eslint-utils": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", @@ -21605,15 +21663,6 @@ "node": ">=4" } }, - "packages/contentstack-launch/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "packages/contentstack-launch/node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", @@ -21626,6 +21675,35 @@ "node": ">= 6" } }, + "packages/contentstack-launch/node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/contentstack-launch/node_modules/globby/node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, "packages/contentstack-launch/node_modules/ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", @@ -21643,12 +21721,12 @@ }, "packages/contentstack-migrate-rte": { "name": "@contentstack/cli-cm-migrate-rte", - "version": "1.4.8", + "version": "1.4.10", "license": "MIT", "dependencies": { - "@contentstack/cli-command": "^1.2.9", - "@contentstack/cli-utilities": "^1.4.5", - "@contentstack/json-rte-serializer": "^2.0.2", + "@contentstack/cli-command": "~1.2.11", + "@contentstack/cli-utilities": "~1.5.1", + "@contentstack/json-rte-serializer": "~2.0.2", "chalk": "^4.1.2", "collapse-whitespace": "^1.1.7", "jsdom": "^20.0.3", @@ -21682,11 +21760,11 @@ }, "packages/contentstack-migration": { "name": "@contentstack/cli-migration", - "version": "1.3.8", + "version": "1.3.11", "license": "MIT", "dependencies": { - "@contentstack/cli-command": "^1.2.9", - "@contentstack/cli-utilities": "^1.4.5", + "@contentstack/cli-command": "~1.2.11", + "@contentstack/cli-utilities": "~1.5.1", "@oclif/command": "^1.8.16", "@oclif/config": "^1.18.3", "async": "^3.2.4", @@ -21707,7 +21785,6 @@ "jsdoc": "^4.0.0", "jsdoc-to-markdown": "^7.0.1", "mkdirp": "^1.0.4", - "mocha": "^10.0.0", "nock": "^13.1.1", "nyc": "^15.1.0", "oclif": "^3.8.1" @@ -21718,12 +21795,12 @@ }, "packages/contentstack-seed": { "name": "@contentstack/cli-cm-seed", - "version": "1.4.11", + "version": "1.4.14", "license": "MIT", "dependencies": { - "@contentstack/cli-cm-import": "^1.5.11", - "@contentstack/cli-command": "^1.2.9", - "@contentstack/cli-utilities": "^1.4.5", + "@contentstack/cli-cm-import": "~1.8.0", + "@contentstack/cli-command": "~1.2.11", + "@contentstack/cli-utilities": "~1.5.1", "axios": "1.3.4", "inquirer": "8.2.4", "mkdirp": "^1.0.4", @@ -21799,11 +21876,11 @@ }, "packages/contentstack-utilities": { "name": "@contentstack/cli-utilities", - "version": "1.4.5", + "version": "1.5.1", "license": "MIT", "dependencies": { - "@contentstack/management": "^1.8.0", - "@oclif/core": "^2.8.2", + "@contentstack/management": "~1.10.0", + "@oclif/core": "^2.9.3", "axios": "1.3.4", "chalk": "^4.0.0", "cli-cursor": "^3.1.0", @@ -21815,6 +21892,7 @@ "inquirer-search-checkbox": "^1.0.0", "inquirer-search-list": "^1.2.6", "lodash": "^4.17.15", + "mkdirp": "^1.0.4", "open": "^8.4.2", "ora": "^5.4.0", "rxjs": "^6.6.7", @@ -21876,9 +21954,9 @@ } }, "packages/contentstack-utilities/node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -21953,27 +22031,14 @@ "node": ">=4" } }, - "packages/contentstack-utilities/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "packages/contentstack-utilities/node_modules/atomically": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/atomically/-/atomically-1.7.0.tgz", - "integrity": "sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w==", - "engines": { - "node": ">=10.12.0" - } - }, - "packages/contentstack-utilities/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "packages/contentstack-utilities/node_modules/astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" + "peer": true, + "engines": { + "node": ">=4" } }, "packages/contentstack-utilities/node_modules/cli-width": { @@ -21983,17 +22048,6 @@ "dev": true, "peer": true }, - "packages/contentstack-utilities/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, "packages/contentstack-utilities/node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -22011,63 +22065,6 @@ "dev": true, "peer": true }, - "packages/contentstack-utilities/node_modules/conf": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/conf/-/conf-10.2.0.tgz", - "integrity": "sha512-8fLl9F04EJqjSqH+QjITQfJF8BrOVaYr1jewVgSRAEWePfxT0sku4w2hrGQ60BC/TNLGQ2pgxNlTbWQmMPFvXg==", - "dependencies": { - "ajv": "^8.6.3", - "ajv-formats": "^2.1.1", - "atomically": "^1.7.0", - "debounce-fn": "^4.0.0", - "dot-prop": "^6.0.1", - "env-paths": "^2.2.1", - "json-schema-typed": "^7.0.3", - "onetime": "^5.1.2", - "pkg-up": "^3.1.0", - "semver": "^7.3.5" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/contentstack-utilities/node_modules/conf/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "packages/contentstack-utilities/node_modules/conf/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "packages/contentstack-utilities/node_modules/conf/node_modules/semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "packages/contentstack-utilities/node_modules/cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", @@ -22085,42 +22082,6 @@ "node": ">=4.8" } }, - "packages/contentstack-utilities/node_modules/debounce-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/debounce-fn/-/debounce-fn-4.0.0.tgz", - "integrity": "sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ==", - "dependencies": { - "mimic-fn": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/contentstack-utilities/node_modules/debounce-fn/node_modules/mimic-fn": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", - "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", - "engines": { - "node": ">=8" - } - }, - "packages/contentstack-utilities/node_modules/dot-prop": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", - "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "packages/contentstack-utilities/node_modules/emoji-regex": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", @@ -22128,6 +22089,16 @@ "dev": true, "peer": true }, + "packages/contentstack-utilities/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.8.0" + } + }, "packages/contentstack-utilities/node_modules/eslint-config-oclif-typescript": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eslint-config-oclif-typescript/-/eslint-config-oclif-typescript-0.2.0.tgz", @@ -22237,6 +22208,16 @@ } } }, + "packages/contentstack-utilities/node_modules/eslint-config-oclif-typescript/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, "packages/contentstack-utilities/node_modules/eslint-config-oclif-typescript/node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -22265,16 +22246,6 @@ "node": ">=4" } }, - "packages/contentstack-utilities/node_modules/eslint-config-oclif-typescript/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.8.0" - } - }, "packages/contentstack-utilities/node_modules/eslint-config-oclif-typescript/node_modules/eslint": { "version": "5.16.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", @@ -22415,16 +22386,6 @@ "node": ">=6.0.0" } }, - "packages/contentstack-utilities/node_modules/eslint-config-oclif-typescript/node_modules/inquirer/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, "packages/contentstack-utilities/node_modules/eslint-config-oclif-typescript/node_modules/inquirer/node_modules/strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", @@ -22438,31 +22399,17 @@ "node": ">=6" } }, - "packages/contentstack-utilities/node_modules/eslint-config-oclif-typescript/node_modules/onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", - "dev": true, - "peer": true, - "dependencies": { - "mimic-fn": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "packages/contentstack-utilities/node_modules/eslint-config-oclif-typescript/node_modules/restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", + "packages/contentstack-utilities/node_modules/eslint-config-oclif-typescript/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "peer": true, "dependencies": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" + "minimist": "^1.2.6" }, - "engines": { - "node": ">=4" + "bin": { + "mkdirp": "bin/cmd.js" } }, "packages/contentstack-utilities/node_modules/eslint-config-oclif-typescript/node_modules/string-width": { @@ -22479,42 +22426,6 @@ "node": ">=4" } }, - "packages/contentstack-utilities/node_modules/eslint-config-oclif-typescript/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", - "dev": true, - "peer": true, - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "packages/contentstack-utilities/node_modules/eslint-config-oclif-typescript/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "packages/contentstack-utilities/node_modules/eslint-config-oclif-typescript/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, - "peer": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "packages/contentstack-utilities/node_modules/eslint-plugin-es": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-1.4.1.tgz", @@ -22597,19 +22508,6 @@ "eslint": ">=5.0.0" } }, - "packages/contentstack-utilities/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, "packages/contentstack-utilities/node_modules/eslint-utils": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", @@ -22646,19 +22544,10 @@ "node": ">=6.0.0" } }, - "packages/contentstack-utilities/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "packages/contentstack-utilities/node_modules/fancy-test": { - "version": "2.0.23", - "resolved": "https://registry.npmjs.org/fancy-test/-/fancy-test-2.0.23.tgz", - "integrity": "sha512-RPX4iAzAioH9nxkqk2yrcunBLBmnMLxtIsw3Pjgj2PGPHTdT3wZ6asKv9U332+UQyZwZWWc4bP64JOa6DcVhnQ==", + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/fancy-test/-/fancy-test-2.0.30.tgz", + "integrity": "sha512-bDQnAXYYODKwjb/6VEwAovEN0uJ1iRMTahEqOpQCRxIX7rIqoFHCy0LEqWYAU3kVw4ERgK4HQSn6GISEA1ipxg==", "dev": true, "dependencies": { "@types/chai": "*", @@ -22667,7 +22556,7 @@ "@types/sinon": "*", "lodash": "^4.17.13", "mock-stdin": "^1.0.0", - "nock": "^13.3.1", + "nock": "^13.3.2", "stdout-stderr": "^0.1.9" }, "engines": { @@ -22729,26 +22618,6 @@ "dev": true, "peer": true }, - "packages/contentstack-utilities/node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "packages/contentstack-utilities/node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -22795,11 +22664,6 @@ "dev": true, "peer": true }, - "packages/contentstack-utilities/node_modules/json-schema-typed": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-7.0.3.tgz", - "integrity": "sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A==" - }, "packages/contentstack-utilities/node_modules/levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", @@ -22814,26 +22678,11 @@ "node": ">= 0.8.0" } }, - "packages/contentstack-utilities/node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "packages/contentstack-utilities/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, "dependencies": { "yallist": "^4.0.0" }, @@ -22851,96 +22700,26 @@ "node": ">=4" } }, - "packages/contentstack-utilities/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "peer": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "packages/contentstack-utilities/node_modules/mocha": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.1.0.tgz", - "integrity": "sha512-vUF7IYxEoN7XhQpFLxQAEMtE4W91acW4B6En9l97MwE9stL1A9gusXfoHZCLVHDUJ/7V5+lbCM6yMqzo5vNymg==", - "dev": true, - "dependencies": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "nanoid": "3.3.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha.js" - }, - "engines": { - "node": ">= 14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" - } - }, - "packages/contentstack-utilities/node_modules/mocha/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "packages/contentstack-utilities/node_modules/mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==", "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } + "peer": true }, - "packages/contentstack-utilities/node_modules/mocha/node_modules/minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "packages/contentstack-utilities/node_modules/onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", "dev": true, + "peer": true, "dependencies": { - "brace-expansion": "^2.0.1" + "mimic-fn": "^1.0.0" }, "engines": { - "node": ">=10" + "node": ">=4" } }, - "packages/contentstack-utilities/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "packages/contentstack-utilities/node_modules/mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==", - "dev": true, - "peer": true - }, "packages/contentstack-utilities/node_modules/optionator": { "version": "0.8.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", @@ -22985,15 +22764,18 @@ "integrity": "sha512-hLWjpy7EnsDBb0p+Z3B7rPi3GDeRG5ZtiI33kJhTt+ORCd38AbAIjB/9zRIUoeTbE/AVX5ZkU7m6bznsvrf8eQ==", "dev": true }, - "packages/contentstack-utilities/node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "packages/contentstack-utilities/node_modules/restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", + "dev": true, + "peer": true, "dependencies": { - "tslib": "^1.9.0" + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" }, "engines": { - "npm": ">=2.0.0" + "node": ">=4" } }, "packages/contentstack-utilities/node_modules/safe-regex": { @@ -23006,9 +22788,9 @@ } }, "packages/contentstack-utilities/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "bin": { "semver": "bin/semver" @@ -23052,23 +22834,22 @@ "node": ">=6" } }, - "packages/contentstack-utilities/node_modules/table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "packages/contentstack-utilities/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "peer": true, "dependencies": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" }, "engines": { - "node": ">=6.0.0" + "node": ">=6" } }, - "packages/contentstack-utilities/node_modules/table/node_modules/ansi-regex": { + "packages/contentstack-utilities/node_modules/string-width/node_modules/ansi-regex": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", @@ -23078,38 +22859,76 @@ "node": ">=6" } }, - "packages/contentstack-utilities/node_modules/table/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "packages/contentstack-utilities/node_modules/string-width/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "peer": true, "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "ansi-regex": "^4.1.0" }, "engines": { "node": ">=6" } }, - "packages/contentstack-utilities/node_modules/table/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "packages/contentstack-utilities/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", "dev": true, "peer": true, "dependencies": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^3.0.0" }, "engines": { - "node": ">=6" + "node": ">=4" + } + }, + "packages/contentstack-utilities/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "packages/contentstack-utilities/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, + "peer": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "packages/contentstack-utilities/node_modules/table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "peer": true, + "dependencies": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" } }, "packages/contentstack-utilities/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true }, "packages/contentstack-utilities/node_modules/type-check": { "version": "0.3.2", @@ -23140,28 +22959,17 @@ "packages/contentstack-utilities/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "packages/contentstack-utilities/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true } }, "dependencies": { + "@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true + }, "@ampproject/remapping": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", @@ -23173,14 +22981,14 @@ } }, "@apollo/client": { - "version": "3.7.14", - "resolved": "https://registry.npmjs.org/@apollo/client/-/client-3.7.14.tgz", - "integrity": "sha512-BRvdkwq5PAXBkjXjboO12uksDm3nrZEqDi4xF97Fk3Mnaa0zDOEfJa7hoKTY9b9KA1EkeWv9BL3i7hSd4SfGBg==", + "version": "3.7.17", + "resolved": "https://registry.npmjs.org/@apollo/client/-/client-3.7.17.tgz", + "integrity": "sha512-0EErSHEtKPNl5wgWikHJbKFAzJ/k11O0WO2QyqZSHpdxdAnw7UWHY4YiLbHCFG7lhrD+NTQ3Z/H9Jn4rcikoJA==", "requires": { "@graphql-typed-document-node/core": "^3.1.1", "@wry/context": "^0.7.0", "@wry/equality": "^0.5.0", - "@wry/trie": "^0.3.0", + "@wry/trie": "^0.4.0", "graphql-tag": "^2.12.6", "hoist-non-react-statics": "^3.3.2", "optimism": "^0.16.2", @@ -23193,60 +23001,60 @@ } }, "@babel/code-frame": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", - "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", + "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", "dev": true, "requires": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.22.5" } }, "@babel/compat-data": { - "version": "7.21.9", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.9.tgz", - "integrity": "sha512-FUGed8kfhyWvbYug/Un/VPJD41rDIgoVVcR+FuzhzOYyRz5uED+Gd3SLZml0Uw2l2aHFb7ZgdW5mGA3G2cCCnQ==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", + "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", "dev": true }, "@babel/core": { - "version": "7.21.8", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.8.tgz", - "integrity": "sha512-YeM22Sondbo523Sz0+CirSPnbj9bG3P0CdHcBZdqUuaeOaYEFbOLoGU7lebvGP6P5J/WE9wOn7u7C4J9HvS1xQ==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.9.tgz", + "integrity": "sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==", "dev": true, "requires": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.5", - "@babel/helper-compilation-targets": "^7.21.5", - "@babel/helper-module-transforms": "^7.21.5", - "@babel/helpers": "^7.21.5", - "@babel/parser": "^7.21.8", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.5", - "@babel/types": "^7.21.5", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.9", + "@babel/helper-module-transforms": "^7.22.9", + "@babel/helpers": "^7.22.6", + "@babel/parser": "^7.22.7", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.8", + "@babel/types": "^7.22.5", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.2", - "semver": "^6.3.0" + "semver": "^6.3.1" }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true } } }, "@babel/eslint-parser": { - "version": "7.21.8", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.21.8.tgz", - "integrity": "sha512-HLhI+2q+BP3sf78mFUZNCGc10KEmoUqtUT1OCdMZsN+qr4qFeLUod62/zAnF3jNQstwyasDkZnVXwfK2Bml7MQ==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.22.9.tgz", + "integrity": "sha512-xdMkt39/nviO/4vpVdrEYPwXCsYIXSSAr6mC7WQsNIlGnuxKyKE7GZjalcnbSWiC4OXGNNN3UQPeHfjSC6sTDA==", "dev": true, "requires": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", "eslint-visitor-keys": "^2.1.0", - "semver": "^6.3.0" + "semver": "^6.3.1" }, "dependencies": { "eslint-visitor-keys": { @@ -23256,156 +23064,153 @@ "dev": true }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true } } }, "@babel/generator": { - "version": "7.21.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.9.tgz", - "integrity": "sha512-F3fZga2uv09wFdEjEQIJxXALXfz0+JaOb7SabvVMmjHxeVTuGW8wgE8Vp1Hd7O+zMTYtcfEISGRzPkeiaPPsvg==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.9.tgz", + "integrity": "sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==", "dev": true, "requires": { - "@babel/types": "^7.21.5", + "@babel/types": "^7.22.5", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" } }, "@babel/helper-compilation-targets": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.5.tgz", - "integrity": "sha512-1RkbFGUKex4lvsB9yhIfWltJM5cZKUftB2eNajaDv3dCMEp49iBG0K14uH8NnX9IPux2+mK7JGEOB0jn48/J6w==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz", + "integrity": "sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==", "dev": true, "requires": { - "@babel/compat-data": "^7.21.5", - "@babel/helper-validator-option": "^7.21.0", - "browserslist": "^4.21.3", + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.5", + "browserslist": "^4.21.9", "lru-cache": "^5.1.1", - "semver": "^6.3.0" + "semver": "^6.3.1" }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true } } }, "@babel/helper-environment-visitor": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.21.5.tgz", - "integrity": "sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", "dev": true }, "@babel/helper-function-name": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", - "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", "dev": true, "requires": { - "@babel/template": "^7.20.7", - "@babel/types": "^7.21.0" + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" } }, "@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" } }, "@babel/helper-module-imports": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", - "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", "dev": true, "requires": { - "@babel/types": "^7.21.4" + "@babel/types": "^7.22.5" } }, "@babel/helper-module-transforms": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.5.tgz", - "integrity": "sha512-bI2Z9zBGY2q5yMHoBvJ2a9iX3ZOAzJPm7Q8Yz6YeoUjU/Cvhmi2G4QyTNyPBqqXSgTjUxRg3L0xV45HvkNWWBw==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", + "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", "dev": true, "requires": { - "@babel/helper-environment-visitor": "^7.21.5", - "@babel/helper-module-imports": "^7.21.4", - "@babel/helper-simple-access": "^7.21.5", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.5", - "@babel/types": "^7.21.5" + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.5" } }, "@babel/helper-plugin-utils": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz", - "integrity": "sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", "dev": true }, "@babel/helper-simple-access": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz", - "integrity": "sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dev": true, "requires": { - "@babel/types": "^7.21.5" + "@babel/types": "^7.22.5" } }, "@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", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" } }, "@babel/helper-string-parser": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz", - "integrity": "sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", "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==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", "dev": true }, "@babel/helper-validator-option": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", - "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", + "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", "dev": true }, "@babel/helpers": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.5.tgz", - "integrity": "sha512-BSY+JSlHxOmGsPTydUkPf1MdMQ3M81x5xGCOVgWM3G8XH77sJ292Y2oqcp0CbbgxhqBuI46iUz1tT7hqP7EfgA==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.6.tgz", + "integrity": "sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==", "dev": true, "requires": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.5", - "@babel/types": "^7.21.5" + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.6", + "@babel/types": "^7.22.5" } }, "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", + "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.18.6", + "@babel/helper-validator-identifier": "^7.22.5", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, @@ -23469,9 +23274,9 @@ } }, "@babel/parser": { - "version": "7.21.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.9.tgz", - "integrity": "sha512-q5PNg/Bi1OpGgx5jYlvWZwAorZepEudDMCLtj967aeS7WMont7dUZI46M2XwcIQqvUlMxWfdLFu4S/qSxeUu5g==", + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz", + "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==", "dev": true }, "@babel/plugin-syntax-async-generators": { @@ -23520,12 +23325,12 @@ } }, "@babel/plugin-syntax-jsx": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz", - "integrity": "sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", + "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-syntax-logical-assignment-operators": { @@ -23592,48 +23397,48 @@ } }, "@babel/plugin-syntax-typescript": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz", - "integrity": "sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", + "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/runtime": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.5.tgz", - "integrity": "sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", + "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", "dev": true, "requires": { "regenerator-runtime": "^0.13.11" } }, "@babel/template": { - "version": "7.21.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.21.9.tgz", - "integrity": "sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", "dev": true, "requires": { - "@babel/code-frame": "^7.21.4", - "@babel/parser": "^7.21.9", - "@babel/types": "^7.21.5" + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" } }, "@babel/traverse": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.5.tgz", - "integrity": "sha512-AhQoI3YjWi6u/y/ntv7k48mcrCXmus0t79J9qPNlk/lAsFlCiJ047RmbfMOawySTHtywXhbXgpx/8nXMYd+oFw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.5", - "@babel/helper-environment-visitor": "^7.21.5", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.5", - "@babel/types": "^7.21.5", + "version": "7.22.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.8.tgz", + "integrity": "sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.7", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.7", + "@babel/types": "^7.22.5", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -23647,13 +23452,13 @@ } }, "@babel/types": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.5.tgz", - "integrity": "sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", + "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", "dev": true, "requires": { - "@babel/helper-string-parser": "^7.21.5", - "@babel/helper-validator-identifier": "^7.19.1", + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", "to-fast-properties": "^2.0.0" } }, @@ -23664,30 +23469,30 @@ "dev": true }, "@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==" + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", + "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==" }, "@contentstack/cli": { "version": "file:packages/contentstack", "requires": { - "@contentstack/cli-auth": "^1.3.10", - "@contentstack/cli-cm-bootstrap": "^1.4.11", - "@contentstack/cli-cm-branches": "^1.0.8", - "@contentstack/cli-cm-bulk-publish": "^1.3.8", - "@contentstack/cli-cm-clone": "^1.4.11", - "@contentstack/cli-cm-export": "^1.5.9", - "@contentstack/cli-cm-export-to-csv": "^1.3.10", - "@contentstack/cli-cm-import": "^1.5.11", - "@contentstack/cli-cm-migrate-rte": "^1.4.8", - "@contentstack/cli-cm-seed": "^1.4.11", - "@contentstack/cli-command": "^1.2.9", - "@contentstack/cli-config": "^1.4.8", - "@contentstack/cli-launch": "^1.0.7", - "@contentstack/cli-migration": "^1.3.8", - "@contentstack/cli-utilities": "^1.4.5", - "@contentstack/management": "^1.8.0", - "@oclif/core": "^2.8.2", + "@contentstack/cli-auth": "~1.3.12", + "@contentstack/cli-cm-bootstrap": "~1.4.14", + "@contentstack/cli-cm-branches": "~1.0.11", + "@contentstack/cli-cm-bulk-publish": "~1.3.10", + "@contentstack/cli-cm-clone": "~1.4.15", + "@contentstack/cli-cm-export": "~1.8.0", + "@contentstack/cli-cm-export-to-csv": "~1.4.0", + "@contentstack/cli-cm-import": "~1.8.2", + "@contentstack/cli-cm-migrate-rte": "~1.4.10", + "@contentstack/cli-cm-seed": "~1.4.14", + "@contentstack/cli-command": "~1.2.11", + "@contentstack/cli-config": "~1.4.10", + "@contentstack/cli-launch": "~1.0.10", + "@contentstack/cli-migration": "~1.3.11", + "@contentstack/cli-utilities": "~1.5.1", + "@contentstack/management": "~1.10.0", + "@oclif/core": "^2.9.3", "@oclif/plugin-help": "^5", "@oclif/plugin-not-found": "^2.3.9", "@oclif/plugin-plugins": "^2.1.7", @@ -23707,7 +23512,7 @@ "figlet": "^1.5.2", "globby": "^10.0.2", "inquirer": "8.2.4", - "mocha": "^10.0.0", + "mocha": "10.1.0", "nock": "^13.1.0", "node-machine-id": "^1.1.12", "nyc": "^15.1.0", @@ -23717,175 +23522,54 @@ "shelljs": "^0.8.4", "short-uuid": "^4.2.2", "sinon": "^15.0.1", - "tmp": "^0.2.1", - "ts-node": "^10.9.1", - "typescript": "^4.9.3", - "uuid": "^9.0.0", - "winston": "^3.7.2" - } - }, - "@contentstack/cli-auth": { - "version": "file:packages/contentstack-auth", - "requires": { - "@contentstack/cli-command": "^1.2.9", - "@contentstack/cli-utilities": "^1.4.5", - "@fancy-test/nock": "^0.1.1", - "@oclif/plugin-help": "^5.1.19", - "@oclif/test": "^2.2.10", - "@types/chai": "^4.2.18", - "@types/inquirer": "^9.0.3", - "@types/mkdirp": "^1.0.1", - "@types/mocha": "^8.2.2", - "@types/node": "^14.14.32", - "@types/sinon": "^10.0.2", - "chai": "^4.3.4", - "chalk": "^4.0.0", - "debug": "^4.1.1", - "dotenv": "^16.0.3", - "eslint": "^8.18.0", - "eslint-config-oclif": "^4.0.0", - "eslint-config-oclif-typescript": "^0.1.0", - "globby": "^10.0.2", - "inquirer": "8.2.4", - "mocha": "10.1.0", - "nyc": "^15.1.0", - "oclif": "^3.8.1", - "rimraf": "^2.7.1", - "sinon": "^15.0.1", - "tmp": "^0.2.1", - "ts-node": "^10.9.1", - "typescript": "^4.9.3", - "winston": "^3.7.2" - }, - "dependencies": { - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - } - }, - "mocha": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.1.0.tgz", - "integrity": "sha512-vUF7IYxEoN7XhQpFLxQAEMtE4W91acW4B6En9l97MwE9stL1A9gusXfoHZCLVHDUJ/7V5+lbCM6yMqzo5vNymg==", - "dev": true, - "requires": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "nanoid": "3.3.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "dependencies": { - "minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - } + "tmp": "^0.2.1", + "ts-node": "^10.9.1", + "tslib": "^2.4.1", + "typescript": "^4.9.3", + "uuid": "^9.0.0", + "winston": "^3.7.2" + } + }, + "@contentstack/cli-auth": { + "version": "file:packages/contentstack-auth", + "requires": { + "@contentstack/cli-command": "~1.2.11", + "@contentstack/cli-utilities": "~1.5.1", + "@fancy-test/nock": "^0.1.1", + "@oclif/plugin-help": "^5.1.19", + "@oclif/test": "^2.2.10", + "@types/chai": "^4.2.18", + "@types/inquirer": "^9.0.3", + "@types/mkdirp": "^1.0.1", + "@types/mocha": "^8.2.2", + "@types/node": "^14.14.32", + "@types/sinon": "^10.0.2", + "chai": "^4.3.4", + "chalk": "^4.0.0", + "debug": "^4.1.1", + "dotenv": "^16.0.3", + "eslint": "^8.18.0", + "eslint-config-oclif": "^4.0.0", + "eslint-config-oclif-typescript": "^0.1.0", + "globby": "^10.0.2", + "inquirer": "8.2.4", + "mocha": "10.1.0", + "nyc": "^15.1.0", + "oclif": "^3.8.1", + "rimraf": "^2.7.1", + "sinon": "^15.0.1", + "tmp": "^0.2.1", + "ts-node": "^10.9.1", + "typescript": "^4.9.3", + "winston": "^3.7.2" } }, "@contentstack/cli-cm-bootstrap": { "version": "file:packages/contentstack-bootstrap", "requires": { - "@contentstack/cli-cm-seed": "^1.4.11", - "@contentstack/cli-command": "^1.2.9", - "@contentstack/cli-utilities": "^1.4.5", + "@contentstack/cli-cm-seed": "~1.4.14", + "@contentstack/cli-command": "~1.2.11", + "@contentstack/cli-utilities": "~1.5.1", "@oclif/test": "^2.2.10", "@types/inquirer": "^9.0.3", "@types/mkdirp": "^1.0.1", @@ -23898,7 +23582,7 @@ "globby": "^10.0.2", "inquirer": "8.2.4", "mkdirp": "^1.0.4", - "mocha": "^10.0.0", + "mocha": "10.1.0", "nyc": "^15.1.0", "oclif": "^3.8.1", "rimraf": "^2.7.1", @@ -23942,14 +23626,14 @@ "@contentstack/cli-cm-branches": { "version": "file:packages/contentstack-branches", "requires": { - "@contentstack/cli-auth": "^1.3.8", - "@contentstack/cli-command": "^1.2.9", - "@contentstack/cli-config": "^1.4.6", - "@contentstack/cli-dev-dependencies": "^1.2.3", - "@contentstack/cli-utilities": "^1.4.5", + "@contentstack/cli-auth": "~1.3.11", + "@contentstack/cli-command": "~1.2.11", + "@contentstack/cli-config": "~1.4.9", + "@contentstack/cli-dev-dependencies": "~1.2.3", + "@contentstack/cli-utilities": "~1.5.1", "@oclif/command": "^1.8.16", "@oclif/config": "^1.18.3", - "@oclif/core": "^2.3.0", + "@oclif/core": "^2.9.3", "@oclif/plugin-help": "^5.1.19", "@oclif/test": "^1.2.6", "@types/flat": "^5.0.2", @@ -23991,143 +23675,25 @@ "requires": { "fancy-test": "^1.4.10" } - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - } - }, - "mocha": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.1.0.tgz", - "integrity": "sha512-vUF7IYxEoN7XhQpFLxQAEMtE4W91acW4B6En9l97MwE9stL1A9gusXfoHZCLVHDUJ/7V5+lbCM6yMqzo5vNymg==", - "dev": true, - "requires": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "nanoid": "3.3.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "dependencies": { - "minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } } } }, "@contentstack/cli-cm-bulk-publish": { "version": "file:packages/contentstack-bulk-publish", "requires": { - "@contentstack/cli-command": "^1.2.9", - "@contentstack/cli-utilities": "^1.4.5", + "@contentstack/cli-command": "~1.2.11", + "@contentstack/cli-utilities": "~1.5.1", "@oclif/test": "^1.2.6", "bluebird": "^3.7.2", "chai": "^4.2.0", "chalk": "^4.1.2", + "dotenv": "^16.1.4", "eslint": "^8.18.0", "eslint-config-oclif": "^4.0.0", "globby": "^10.0.2", "inquirer": "8.2.4", "lodash": "^4.17.15", + "mkdirp": "^1.0.4", "mocha": "^10.0.0", "nock": "^13.0.2", "nyc": "^15.1.0", @@ -24157,10 +23723,10 @@ "version": "file:packages/contentstack-clone", "requires": { "@colors/colors": "^1.5.0", - "@contentstack/cli-cm-export": "^1.5.9", - "@contentstack/cli-cm-import": "^1.5.11", - "@contentstack/cli-command": "^1.2.9", - "@contentstack/cli-utilities": "^1.4.5", + "@contentstack/cli-cm-export": "~1.8.0", + "@contentstack/cli-cm-import": "~1.8.0", + "@contentstack/cli-command": "~1.2.11", + "@contentstack/cli-utilities": "~1.5.1", "@oclif/test": "^1.2.7", "async": "^3.2.4", "chai": "^4.2.0", @@ -24204,15 +23770,18 @@ "@contentstack/cli-cm-export": { "version": "file:packages/contentstack-export", "requires": { - "@contentstack/cli-auth": "^1.3.8", - "@contentstack/cli-command": "^1.2.9", - "@contentstack/cli-config": "^1.4.6", - "@contentstack/cli-dev-dependencies": "^1.2.3", - "@contentstack/cli-utilities": "^1.4.5", + "@contentstack/cli-auth": "~1.3.11", + "@contentstack/cli-command": "~1.2.11", + "@contentstack/cli-config": "~1.4.9", + "@contentstack/cli-dev-dependencies": "~1.2.3", + "@contentstack/cli-utilities": "~1.5.1", "@oclif/command": "^1.8.16", "@oclif/config": "^1.18.3", + "@oclif/core": "^2.9.3", "@oclif/plugin-help": "^5.1.19", "@oclif/test": "^1.2.6", + "@types/mkdirp": "^1.0.2", + "@types/progress-stream": "^2.0.2", "assert": "^2.0.0", "async": "^3.2.4", "big-json": "^3.2.0", @@ -24226,7 +23795,8 @@ "globby": "^10.0.2", "is-valid-path": "^0.1.1", "lodash": "^4.17.20", - "mkdirp": "^2.1.3", + "merge": "^2.1.1", + "mkdirp": "^1.0.4", "mocha": "10.1.0", "nyc": "^15.1.0", "oclif": "^3.8.1", @@ -24235,6 +23805,9 @@ "promise-limit": "^2.7.0", "proxyquire": "^2.1.3", "sinon": "^15.0.1", + "ts-node": "^10.9.1", + "tslib": "^2.4.1", + "typescript": "^4.9.3", "winston": "^3.7.2" }, "dependencies": { @@ -24246,162 +23819,216 @@ "requires": { "fancy-test": "^1.4.10" } - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + } + } + }, + "@contentstack/cli-cm-export-to-csv": { + "version": "file:packages/contentstack-export-to-csv", + "requires": { + "@contentstack/cli-command": "~1.2.11", + "@contentstack/cli-utilities": "~1.5.1", + "@oclif/test": "^2.2.10", + "chai": "^4.2.0", + "chalk": "^4.1.0", + "debug": "^4.3.1", + "eslint": "^7.32.0", + "eslint-config-oclif": "^4.0.0", + "fast-csv": "^4.3.6", + "globby": "^10.0.2", + "inquirer": "8.2.4", + "inquirer-checkbox-plus-prompt": "1.4.2", + "mkdirp": "^1.0.4", + "mocha": "^10.0.0", + "nyc": "^15.1.0", + "oclif": "^3.8.1" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", "dev": true, "requires": { - "balanced-match": "^1.0.0" + "@babel/highlight": "^7.10.4" } }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "@eslint/eslintrc": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", "dev": true, "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" } }, - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", "dev": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" } }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "requires": { - "argparse": "^2.0.1" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, - "log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "eslint": { + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", "dev": true, "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" } }, - "mkdirp": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-2.1.6.tgz", - "integrity": "sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==" - }, - "mocha": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.1.0.tgz", - "integrity": "sha512-vUF7IYxEoN7XhQpFLxQAEMtE4W91acW4B6En9l97MwE9stL1A9gusXfoHZCLVHDUJ/7V5+lbCM6yMqzo5vNymg==", - "dev": true, - "requires": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "nanoid": "3.3.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" }, "dependencies": { - "minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true } } }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", "dev": true, "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true } } }, - "@contentstack/cli-cm-export-to-csv": { - "version": "file:packages/contentstack-export-to-csv", - "requires": { - "@contentstack/cli-command": "^1.2.9", - "@contentstack/cli-utilities": "^1.4.5", - "@oclif/test": "^2.2.10", - "chai": "^4.2.0", - "chalk": "^4.1.0", - "debug": "^4.3.1", - "eslint": "^8.18.0", - "eslint-config-oclif": "^4.0.0", - "fast-csv": "^4.3.6", - "globby": "^10.0.2", - "inquirer": "8.2.4", - "inquirer-checkbox-plus-prompt": "1.4.2", - "mkdirp": "^1.0.4", - "mocha": "^10.0.0", - "nyc": "^15.1.0", - "oclif": "^3.8.1" - } - }, "@contentstack/cli-cm-import": { "version": "file:packages/contentstack-import", "requires": { - "@contentstack/cli-command": "^1.2.9", - "@contentstack/cli-utilities": "^1.4.5", + "@contentstack/cli-command": "~1.2.11", + "@contentstack/cli-utilities": "~1.5.1", + "@contentstack/management": "~1.10.0", "@oclif/config": "^1.18.3", + "@oclif/core": "^2.9.3", "@oclif/test": "^1.2.6", + "@types/bluebird": "^3.5.38", + "@types/chai": "^4.2.18", + "@types/mkdirp": "^1.0.2", + "@types/mocha": "^8.2.2", + "@types/ncp": "^2.0.5", + "@types/node": "^14.14.32", + "@types/sinon": "^10.0.2", + "@types/tar": "^4.0.3", + "@typescript-eslint/eslint-plugin": "^5.48.2", "big-json": "^3.2.0", "bluebird": "^3.7.2", "chai": "^4.2.0", @@ -24409,15 +24036,22 @@ "debug": "^4.1.0", "eslint": "^8.18.0", "eslint-config-oclif": "^4.0.0", - "fs-extra": "^11.1.1", "globby": "^10.0.2", "lodash": "^4.17.20", "marked": "^4.0.17", + "merge": "^2.1.1", "mkdirp": "^1.0.4", "mocha": "^10.0.0", + "ncp": "^2.0.0", "nyc": "^15.1.0", "oclif": "^3.8.1", "promise-limit": "^2.7.0", + "rimraf": "^2.7.1", + "sinon": "^11.1.1", + "tmp": "^0.2.1", + "ts-node": "^10.9.1", + "tslib": "^2.4.1", + "typescript": "^4.9.3", "winston": "^3.7.2" }, "dependencies": { @@ -24430,14 +24064,66 @@ "fancy-test": "^1.4.10" } }, - "fs-extra": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", - "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "@sinonjs/commons": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "dev": true, "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz", + "integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, + "@sinonjs/samsam": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.1.3.tgz", + "integrity": "sha512-nhOb2dWPeb1sd3IQXL/dVPnKHDOAFfvichtBf4xV00/rU1QbPCQqKMbvIheIjqwVjh7qIgf2AHTHi391yMOMpQ==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.6.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" + } + }, + "@types/tar": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/tar/-/tar-4.0.5.tgz", + "integrity": "sha512-cgwPhNEabHaZcYIy5xeMtux2EmYBitfqEceBUi2t5+ETy4dW6kswt6WX4+HqLeiiKOo42EXbGiDmVJ2x+vi37Q==", + "dev": true, + "requires": { + "@types/minipass": "*", + "@types/node": "*" + } + }, + "sinon": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-11.1.2.tgz", + "integrity": "sha512-59237HChms4kg7/sXhiRcUzdSkKuydDeTiamT/jesUVHshBgL8XAmhgFo0GfK6RruMDM/iRSij1EybmMog9cJw==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.8.3", + "@sinonjs/fake-timers": "^7.1.2", + "@sinonjs/samsam": "^6.0.2", + "diff": "^5.0.0", + "nise": "^5.1.0", + "supports-color": "^7.2.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" } } } @@ -24445,9 +24131,9 @@ "@contentstack/cli-cm-migrate-rte": { "version": "file:packages/contentstack-migrate-rte", "requires": { - "@contentstack/cli-command": "^1.2.9", - "@contentstack/cli-utilities": "^1.4.5", - "@contentstack/json-rte-serializer": "^2.0.2", + "@contentstack/cli-command": "~1.2.11", + "@contentstack/cli-utilities": "~1.5.1", + "@contentstack/json-rte-serializer": "~2.0.2", "@oclif/test": "^2.2.10", "chai": "^4.3.4", "chalk": "^4.1.2", @@ -24479,9 +24165,9 @@ "@contentstack/cli-cm-seed": { "version": "file:packages/contentstack-seed", "requires": { - "@contentstack/cli-cm-import": "^1.5.11", - "@contentstack/cli-command": "^1.2.9", - "@contentstack/cli-utilities": "^1.4.5", + "@contentstack/cli-cm-import": "~1.8.0", + "@contentstack/cli-command": "~1.2.11", + "@contentstack/cli-utilities": "~1.5.1", "@oclif/plugin-help": "^5.1.19", "@types/inquirer": "^9.0.3", "@types/jest": "^26.0.15", @@ -24540,7 +24226,7 @@ "@contentstack/cli-command": { "version": "file:packages/contentstack-command", "requires": { - "@contentstack/cli-utilities": "^1.4.5", + "@contentstack/cli-utilities": "~1.5.1", "@oclif/test": "^2.2.10", "@types/chai": "^4.2.18", "@types/mkdirp": "^1.0.1", @@ -24560,109 +24246,10 @@ "typescript": "^4.9.3" }, "dependencies": { - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - } - }, - "mocha": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.1.0.tgz", - "integrity": "sha512-vUF7IYxEoN7XhQpFLxQAEMtE4W91acW4B6En9l97MwE9stL1A9gusXfoHZCLVHDUJ/7V5+lbCM6yMqzo5vNymg==", - "dev": true, - "requires": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "nanoid": "3.3.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "dependencies": { - "minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true }, "source-map-support": { @@ -24686,29 +24273,6 @@ "make-error": "^1.1.1", "source-map-support": "^0.5.17", "yn": "3.1.1" - }, - "dependencies": { - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - } - } - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" } } } @@ -24716,8 +24280,8 @@ "@contentstack/cli-config": { "version": "file:packages/contentstack-config", "requires": { - "@contentstack/cli-command": "^1.2.9", - "@contentstack/cli-utilities": "^1.4.5", + "@contentstack/cli-command": "~1.2.11", + "@contentstack/cli-utilities": "~1.5.1", "@oclif/test": "^2.2.10", "@types/chai": "^4.2.18", "@types/inquirer": "^9.0.3", @@ -24734,6 +24298,7 @@ "globby": "^10.0.2", "inquirer": "8.2.4", "lodash": "^4.17.20", + "mkdirp": "^1.0.4", "mocha": "10.1.0", "nyc": "^15.1.0", "oclif": "^3.8.1", @@ -24743,148 +24308,171 @@ "ts-node": "^10.9.1", "typescript": "^4.9.3", "winston": "^3.7.2" + } + }, + "@contentstack/cli-dev-dependencies": { + "version": "file:packages/contentstack-dev-dependencies", + "requires": { + "@oclif/core": "^2.9.3", + "@types/node": "^14.14.32", + "eslint": "^7.32.0", + "fancy-test": "^2.0.0", + "lodash": "^4.17.21", + "mocha": "10.1.0", + "ts-node": "^10.9.1", + "tslib": "^2.5.0", + "typescript": "^4.9.3" }, "dependencies": { - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", "dev": true, "requires": { - "balanced-match": "^1.0.0" + "@babel/highlight": "^7.10.4" } }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "@eslint/eslintrc": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", "dev": true, "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" } }, - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", "dev": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" } }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "requires": { - "argparse": "^2.0.1" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, - "log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "eslint": { + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", "dev": true, "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" } }, - "mocha": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.1.0.tgz", - "integrity": "sha512-vUF7IYxEoN7XhQpFLxQAEMtE4W91acW4B6En9l97MwE9stL1A9gusXfoHZCLVHDUJ/7V5+lbCM6yMqzo5vNymg==", - "dev": true, - "requires": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "nanoid": "3.3.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" }, "dependencies": { - "minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true } } }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", "dev": true, "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } } - } - } - }, - "@contentstack/cli-dev-dependencies": { - "version": "file:packages/contentstack-dev-dependencies", - "requires": { - "@oclif/core": "^2.8.5", - "@types/node": "^14.14.32", - "eslint": "^8.18.0", - "fancy-test": "^2.0.0", - "lodash": "^4.17.21", - "mocha": "^10.0.0", - "ts-node": "^10.9.1", - "tslib": "^2.5.0", - "typescript": "^4.9.3" - }, - "dependencies": { + }, "fancy-test": { - "version": "2.0.23", - "resolved": "https://registry.npmjs.org/fancy-test/-/fancy-test-2.0.23.tgz", - "integrity": "sha512-RPX4iAzAioH9nxkqk2yrcunBLBmnMLxtIsw3Pjgj2PGPHTdT3wZ6asKv9U332+UQyZwZWWc4bP64JOa6DcVhnQ==", + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/fancy-test/-/fancy-test-2.0.30.tgz", + "integrity": "sha512-bDQnAXYYODKwjb/6VEwAovEN0uJ1iRMTahEqOpQCRxIX7rIqoFHCy0LEqWYAU3kVw4ERgK4HQSn6GISEA1ipxg==", "dev": true, "requires": { "@types/chai": "*", @@ -24893,9 +24481,30 @@ "@types/sinon": "*", "lodash": "^4.17.13", "mock-stdin": "^1.0.0", - "nock": "^13.3.1", + "nock": "^13.3.2", "stdout-stderr": "^0.1.9" } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true } } }, @@ -24903,9 +24512,9 @@ "version": "file:packages/contentstack-launch", "requires": { "@apollo/client": "^3.7.9", - "@contentstack/cli-command": "^1.2.9", - "@contentstack/cli-utilities": "^1.4.5", - "@oclif/core": "^2.8.2", + "@contentstack/cli-command": "~1.2.11", + "@contentstack/cli-utilities": "~1.5.1", + "@oclif/core": "^2.9.3", "@oclif/plugin-help": "^5", "@oclif/plugin-plugins": "^2.3.2", "@oclif/test": "^2.3.6", @@ -24978,9 +24587,9 @@ } }, "@types/node": { - "version": "16.18.32", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.32.tgz", - "integrity": "sha512-zpnXe4dEz6PrWz9u7dqyRoq9VxwCvoXRPy/ewhmMa1CgEyVmtL1NJPQ2MX+4pf97vetquVKkpiMx0MwI8pjNOw==", + "version": "16.18.38", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.38.tgz", + "integrity": "sha512-6sfo1qTulpVbkxECP+AVrHV9OoJqhzCsfTNp5NIG+enM4HyM3HvZCO798WShIXBN0+QtDIcutJCjsVYnQP5rIQ==", "dev": true }, "@typescript-eslint/eslint-plugin": { @@ -25019,6 +24628,47 @@ "debug": "^4.3.1" } }, + "@typescript-eslint/scope-manager": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz", + "integrity": "sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/visitor-keys": "4.33.0" + } + }, + "@typescript-eslint/types": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz", + "integrity": "sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz", + "integrity": "sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/visitor-keys": "4.33.0", + "debug": "^4.3.1", + "globby": "^11.0.3", + "is-glob": "^4.0.1", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz", + "integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.33.0", + "eslint-visitor-keys": "^2.0.0" + } + }, "acorn": { "version": "7.4.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", @@ -25116,16 +24766,6 @@ "eslint-config-xo": "^0.38.0" } }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, "eslint-utils": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", @@ -25168,12 +24808,6 @@ } } }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, "glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", @@ -25183,6 +24817,28 @@ "is-glob": "^4.0.1" } }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "dependencies": { + "ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true + } + } + }, "ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", @@ -25200,8 +24856,8 @@ "@contentstack/cli-migration": { "version": "file:packages/contentstack-migration", "requires": { - "@contentstack/cli-command": "^1.2.9", - "@contentstack/cli-utilities": "^1.4.5", + "@contentstack/cli-command": "~1.2.11", + "@contentstack/cli-utilities": "~1.5.1", "@oclif/command": "^1.8.16", "@oclif/config": "^1.18.3", "@oclif/test": "^2.2.10", @@ -25219,7 +24875,6 @@ "jsdoc-to-markdown": "^7.0.1", "listr": "^0.14.3", "mkdirp": "^1.0.4", - "mocha": "^10.0.0", "nock": "^13.1.1", "nyc": "^15.1.0", "oclif": "^3.8.1", @@ -25229,8 +24884,8 @@ "@contentstack/cli-utilities": { "version": "file:packages/contentstack-utilities", "requires": { - "@contentstack/management": "^1.8.0", - "@oclif/core": "^2.8.2", + "@contentstack/management": "~1.10.0", + "@oclif/core": "^2.9.3", "@oclif/test": "^2.2.10", "@types/chai": "^4.2.18", "@types/inquirer": "^9.0.3", @@ -25255,6 +24910,7 @@ "inquirer-search-checkbox": "^1.0.0", "inquirer-search-list": "^1.2.6", "lodash": "^4.17.15", + "mkdirp": "^1.0.4", "mocha": "10.1.0", "nock": "^13.1.0", "nyc": "^15.1.0", @@ -25289,9 +24945,9 @@ }, "dependencies": { "semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -25343,25 +24999,12 @@ "color-convert": "^1.9.0" } }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "atomically": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/atomically/-/atomically-1.7.0.tgz", - "integrity": "sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w==" - }, - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } + "peer": true }, "cli-width": { "version": "2.2.1", @@ -25370,17 +25013,6 @@ "dev": true, "peer": true }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -25398,49 +25030,6 @@ "dev": true, "peer": true }, - "conf": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/conf/-/conf-10.2.0.tgz", - "integrity": "sha512-8fLl9F04EJqjSqH+QjITQfJF8BrOVaYr1jewVgSRAEWePfxT0sku4w2hrGQ60BC/TNLGQ2pgxNlTbWQmMPFvXg==", - "requires": { - "ajv": "^8.6.3", - "ajv-formats": "^2.1.1", - "atomically": "^1.7.0", - "debounce-fn": "^4.0.0", - "dot-prop": "^6.0.1", - "env-paths": "^2.2.1", - "json-schema-typed": "^7.0.3", - "onetime": "^5.1.2", - "pkg-up": "^3.1.0", - "semver": "^7.3.5" - }, - "dependencies": { - "ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", @@ -25455,29 +25044,6 @@ "which": "^1.2.9" } }, - "debounce-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/debounce-fn/-/debounce-fn-4.0.0.tgz", - "integrity": "sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ==", - "requires": { - "mimic-fn": "^3.0.0" - }, - "dependencies": { - "mimic-fn": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", - "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==" - } - } - }, - "dot-prop": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", - "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", - "requires": { - "is-obj": "^2.0.0" - } - }, "emoji-regex": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", @@ -25485,6 +25051,13 @@ "dev": true, "peer": true }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "peer": true + }, "eslint-config-oclif-typescript": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eslint-config-oclif-typescript/-/eslint-config-oclif-typescript-0.2.0.tgz", @@ -25546,6 +25119,13 @@ "eslint-visitor-keys": "^1.1.0" } }, + "ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true, + "peer": true + }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -25568,13 +25148,6 @@ "restore-cursor": "^2.0.0" } }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "peer": true - }, "eslint": { "version": "5.16.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", @@ -25688,13 +25261,6 @@ "through": "^2.3.6" }, "dependencies": { - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, - "peer": true - }, "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", @@ -25707,25 +25273,14 @@ } } }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", - "dev": true, - "peer": true, - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "peer": true, "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" + "minimist": "^1.2.6" } }, "string-width": { @@ -25738,33 +25293,6 @@ "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", - "dev": true, - "peer": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true, - "peer": true - }, - "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, - "peer": true, - "requires": { - "has-flag": "^3.0.0" - } } } }, @@ -25825,16 +25353,6 @@ "safe-regex": "^1.1.0" } }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, "eslint-utils": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", @@ -25862,16 +25380,10 @@ "eslint-visitor-keys": "^1.0.0" } }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, "fancy-test": { - "version": "2.0.23", - "resolved": "https://registry.npmjs.org/fancy-test/-/fancy-test-2.0.23.tgz", - "integrity": "sha512-RPX4iAzAioH9nxkqk2yrcunBLBmnMLxtIsw3Pjgj2PGPHTdT3wZ6asKv9U332+UQyZwZWWc4bP64JOa6DcVhnQ==", + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/fancy-test/-/fancy-test-2.0.30.tgz", + "integrity": "sha512-bDQnAXYYODKwjb/6VEwAovEN0uJ1iRMTahEqOpQCRxIX7rIqoFHCy0LEqWYAU3kVw4ERgK4HQSn6GISEA1ipxg==", "dev": true, "requires": { "@types/chai": "*", @@ -25880,7 +25392,7 @@ "@types/sinon": "*", "lodash": "^4.17.13", "mock-stdin": "^1.0.0", - "nock": "^13.3.1", + "nock": "^13.3.2", "stdout-stderr": "^0.1.9" } }, @@ -25932,20 +25444,6 @@ "dev": true, "peer": true }, - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -25980,11 +25478,6 @@ "dev": true, "peer": true }, - "json-schema-typed": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-7.0.3.tgz", - "integrity": "sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A==" - }, "levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", @@ -25996,20 +25489,11 @@ "type-check": "~0.3.2" } }, - "log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - } - }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, "requires": { "yallist": "^4.0.0" } @@ -26021,71 +25505,6 @@ "dev": true, "peer": true }, - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "peer": true, - "requires": { - "minimist": "^1.2.6" - } - }, - "mocha": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.1.0.tgz", - "integrity": "sha512-vUF7IYxEoN7XhQpFLxQAEMtE4W91acW4B6En9l97MwE9stL1A9gusXfoHZCLVHDUJ/7V5+lbCM6yMqzo5vNymg==", - "dev": true, - "requires": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "nanoid": "3.3.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "dependencies": { - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, "mute-stream": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", @@ -26093,6 +25512,16 @@ "dev": true, "peer": true }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", + "dev": true, + "peer": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, "optionator": { "version": "0.8.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", @@ -26128,12 +25557,15 @@ "integrity": "sha512-hLWjpy7EnsDBb0p+Z3B7rPi3GDeRG5ZtiI33kJhTt+ORCd38AbAIjB/9zRIUoeTbE/AVX5ZkU7m6bznsvrf8eQ==", "dev": true }, - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", + "dev": true, + "peer": true, "requires": { - "tslib": "^1.9.0" + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" } }, "safe-regex": { @@ -26146,9 +25578,9 @@ } }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true }, "shebang-command": { @@ -26180,17 +25612,16 @@ "is-fullwidth-code-point": "^2.0.0" } }, - "table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "peer": true, "requires": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" }, "dependencies": { "ansi-regex": { @@ -26200,18 +25631,6 @@ "dev": true, "peer": true }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "peer": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", @@ -26224,10 +25643,51 @@ } } }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "dev": true, + "peer": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "peer": true + }, + "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, + "peer": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "peer": true, + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + } + }, "tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true }, "type-check": { "version": "0.3.2", @@ -26252,22 +25712,8 @@ "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true } } }, @@ -26292,9 +25738,9 @@ } }, "@contentstack/management": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@contentstack/management/-/management-1.8.0.tgz", - "integrity": "sha512-rKI9CEwwmh8L0f5OaicjBlty0O77BT3KiHkPj23rJ2lLWlas7RlWaVhbavXJASSpS0w1FWx8+BmGwkaAoRVyRg==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@contentstack/management/-/management-1.10.0.tgz", + "integrity": "sha512-wnmVS19n3cZeh6T2PbBXGCr4irktunVmuECTyPF5++Rsc6GDO+FoQGCZdvzHpRZE0GLiPFIID50z2TZuNArEOg==", "requires": { "axios": "^0.27.2", "form-data": "^3.0.1", @@ -26385,14 +25831,14 @@ "dev": true }, "@eslint/eslintrc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", - "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz", + "integrity": "sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.5.2", + "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -26437,9 +25883,9 @@ } }, "@eslint/js": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.41.0.tgz", - "integrity": "sha512-LxcyMGxwmTh2lY9FwHPGWOHmYFCZvbrFCBZL4FzSSsxsRPuhrYUg/49/0KDfW8tnIEaEHtfmn6+NPN+1DqaNmA==", + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz", + "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==", "dev": true }, "@fancy-test/nock": { @@ -26488,9 +25934,9 @@ "requires": {} }, "@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", "dev": true, "requires": { "@humanwhocodes/object-schema": "^1.2.1", @@ -26554,9 +26000,9 @@ } }, "strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "requires": { "ansi-regex": "^6.0.1" @@ -26646,30 +26092,30 @@ "dev": true }, "@jest/console": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.5.0.tgz", - "integrity": "sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.1.tgz", + "integrity": "sha512-Aj772AYgwTSr5w8qnyoJ0eDYvN6bMsH3ORH1ivMotrInHLKdUz6BDlaEXHdM6kODaBIkNIyQGzsMvRdOv7VG7Q==", "dev": true, "requires": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.1", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0", + "jest-message-util": "^29.6.1", + "jest-util": "^29.6.1", "slash": "^3.0.0" } }, "@jest/core": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.5.0.tgz", - "integrity": "sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.1.tgz", + "integrity": "sha512-CcowHypRSm5oYQ1obz1wfvkjZZ2qoQlrKKvlfPwh5jUXVU12TWr2qMeH8chLMuTFzHh5a1g2yaqlqDICbr+ukQ==", "dev": true, "requires": { - "@jest/console": "^29.5.0", - "@jest/reporters": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/console": "^29.6.1", + "@jest/reporters": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", @@ -26677,20 +26123,20 @@ "exit": "^0.1.2", "graceful-fs": "^4.2.9", "jest-changed-files": "^29.5.0", - "jest-config": "^29.5.0", - "jest-haste-map": "^29.5.0", - "jest-message-util": "^29.5.0", + "jest-config": "^29.6.1", + "jest-haste-map": "^29.6.1", + "jest-message-util": "^29.6.1", "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.5.0", - "jest-resolve-dependencies": "^29.5.0", - "jest-runner": "^29.5.0", - "jest-runtime": "^29.5.0", - "jest-snapshot": "^29.5.0", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", - "jest-watcher": "^29.5.0", + "jest-resolve": "^29.6.1", + "jest-resolve-dependencies": "^29.6.1", + "jest-runner": "^29.6.1", + "jest-runtime": "^29.6.1", + "jest-snapshot": "^29.6.1", + "jest-util": "^29.6.1", + "jest-validate": "^29.6.1", + "jest-watcher": "^29.6.1", "micromatch": "^4.0.4", - "pretty-format": "^29.5.0", + "pretty-format": "^29.6.1", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, @@ -26702,12 +26148,12 @@ "dev": true }, "pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", + "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", "dev": true, "requires": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.0", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" } @@ -26721,74 +26167,74 @@ } }, "@jest/environment": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.5.0.tgz", - "integrity": "sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.1.tgz", + "integrity": "sha512-RMMXx4ws+Gbvw3DfLSuo2cfQlK7IwGbpuEWXCqyYDcqYTI+9Ju3a5hDnXaxjNsa6uKh9PQF2v+qg+RLe63tz5A==", "dev": true, "requires": { - "@jest/fake-timers": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/fake-timers": "^29.6.1", + "@jest/types": "^29.6.1", "@types/node": "*", - "jest-mock": "^29.5.0" + "jest-mock": "^29.6.1" } }, "@jest/expect": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.5.0.tgz", - "integrity": "sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.1.tgz", + "integrity": "sha512-N5xlPrAYaRNyFgVf2s9Uyyvr795jnB6rObuPx4QFvNJz8aAjpZUDfO4bh5G/xuplMID8PrnuF1+SfSyDxhsgYg==", "dev": true, "requires": { - "expect": "^29.5.0", - "jest-snapshot": "^29.5.0" + "expect": "^29.6.1", + "jest-snapshot": "^29.6.1" } }, "@jest/expect-utils": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.5.0.tgz", - "integrity": "sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.1.tgz", + "integrity": "sha512-o319vIf5pEMx0LmzSxxkYYxo4wrRLKHq9dP1yJU7FoPTB0LfAKSz8SWD6D/6U3v/O52t9cF5t+MeJiRsfk7zMw==", "dev": true, "requires": { "jest-get-type": "^29.4.3" } }, "@jest/fake-timers": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.5.0.tgz", - "integrity": "sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.1.tgz", + "integrity": "sha512-RdgHgbXyosCDMVYmj7lLpUwXA4c69vcNzhrt69dJJdf8azUrpRh3ckFCaTPNjsEeRi27Cig0oKDGxy5j7hOgHg==", "dev": true, "requires": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.1", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^29.5.0", - "jest-mock": "^29.5.0", - "jest-util": "^29.5.0" + "jest-message-util": "^29.6.1", + "jest-mock": "^29.6.1", + "jest-util": "^29.6.1" } }, "@jest/globals": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.5.0.tgz", - "integrity": "sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.1.tgz", + "integrity": "sha512-2VjpaGy78JY9n9370H8zGRCFbYVWwjY6RdDMhoJHa1sYfwe6XM/azGN0SjY8kk7BOZApIejQ1BFPyH7FPG0w3A==", "dev": true, "requires": { - "@jest/environment": "^29.5.0", - "@jest/expect": "^29.5.0", - "@jest/types": "^29.5.0", - "jest-mock": "^29.5.0" + "@jest/environment": "^29.6.1", + "@jest/expect": "^29.6.1", + "@jest/types": "^29.6.1", + "jest-mock": "^29.6.1" } }, "@jest/reporters": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.5.0.tgz", - "integrity": "sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.1.tgz", + "integrity": "sha512-9zuaI9QKr9JnoZtFQlw4GREQbxgmNYXU6QuWtmuODvk5nvPUeBYapVR/VYMyi2WSx3jXTLJTJji8rN6+Cm4+FA==", "dev": true, "requires": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", - "@jridgewell/trace-mapping": "^0.3.15", + "@jest/console": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", + "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", @@ -26800,9 +26246,9 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0", - "jest-worker": "^29.5.0", + "jest-message-util": "^29.6.1", + "jest-util": "^29.6.1", + "jest-worker": "^29.6.1", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", @@ -26810,66 +26256,66 @@ } }, "@jest/schemas": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", - "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz", + "integrity": "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==", "dev": true, "requires": { - "@sinclair/typebox": "^0.25.16" + "@sinclair/typebox": "^0.27.8" } }, "@jest/source-map": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.4.3.tgz", - "integrity": "sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w==", + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.0.tgz", + "integrity": "sha512-oA+I2SHHQGxDCZpbrsCQSoMLb3Bz547JnM+jUr9qEbuw0vQlWZfpPS7CO9J7XiwKicEz9OFn/IYoLkkiUD7bzA==", "dev": true, "requires": { - "@jridgewell/trace-mapping": "^0.3.15", + "@jridgewell/trace-mapping": "^0.3.18", "callsites": "^3.0.0", "graceful-fs": "^4.2.9" } }, "@jest/test-result": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.5.0.tgz", - "integrity": "sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.1.tgz", + "integrity": "sha512-Ynr13ZRcpX6INak0TPUukU8GWRfm/vAytE3JbJNGAvINySWYdfE7dGZMbk36oVuK4CigpbhMn8eg1dixZ7ZJOw==", "dev": true, "requires": { - "@jest/console": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/console": "^29.6.1", + "@jest/types": "^29.6.1", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "@jest/test-sequencer": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.5.0.tgz", - "integrity": "sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.1.tgz", + "integrity": "sha512-oBkC36PCDf/wb6dWeQIhaviU0l5u6VCsXa119yqdUosYAt7/FbQU2M2UoziO3igj/HBDEgp57ONQ3fm0v9uyyg==", "dev": true, "requires": { - "@jest/test-result": "^29.5.0", + "@jest/test-result": "^29.6.1", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", + "jest-haste-map": "^29.6.1", "slash": "^3.0.0" } }, "@jest/transform": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.5.0.tgz", - "integrity": "sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.1.tgz", + "integrity": "sha512-URnTneIU3ZjRSaf906cvf6Hpox3hIeJXRnz3VDSw5/X93gR8ycdfSIEy19FlVx8NFmpN7fe3Gb1xF+NjXaQLWg==", "dev": true, "requires": { "@babel/core": "^7.11.6", - "@jest/types": "^29.5.0", - "@jridgewell/trace-mapping": "^0.3.15", + "@jest/types": "^29.6.1", + "@jridgewell/trace-mapping": "^0.3.18", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", + "jest-haste-map": "^29.6.1", "jest-regex-util": "^29.4.3", - "jest-util": "^29.5.0", + "jest-util": "^29.6.1", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", @@ -26885,12 +26331,12 @@ } }, "@jest/types": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz", - "integrity": "sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.1.tgz", + "integrity": "sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==", "dev": true, "requires": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.0", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", @@ -26959,24 +26405,6 @@ "dev": true, "requires": { "eslint-scope": "5.1.1" - }, - "dependencies": { - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - } } }, "@nodelib/fs.scandir": { @@ -27227,9 +26655,9 @@ } }, "@oclif/color": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@oclif/color/-/color-1.0.5.tgz", - "integrity": "sha512-CeUDnzGOt3G7k6KJolTueTMYfJnU/zc6MouwF3sgL+7lnrwTiLaLwQ384EVFtUaIlRHNA0WifGh6FHKc8jqw2g==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@oclif/color/-/color-1.0.8.tgz", + "integrity": "sha512-XD1MLzkVsPzlkTN6OV0DeN/5iK/bv/MpGRnAZ+lCc20LO0Tyjyph6DUdoRNTJ4iMqliJt32uE3FrFK+Qms2Kjg==", "requires": { "ansi-styles": "^4.2.1", "chalk": "^4.1.0", @@ -27239,25 +26667,25 @@ } }, "@oclif/command": { - "version": "1.8.26", - "resolved": "https://registry.npmjs.org/@oclif/command/-/command-1.8.26.tgz", - "integrity": "sha512-IT9kOLFRMc3s6KJ1FymsNjbHShI211eVgAg+JMiDVl8LXwOJxYe8ybesgL1kpV9IUFByOBwZKNG2mmrVeNBHPg==", + "version": "1.8.32", + "resolved": "https://registry.npmjs.org/@oclif/command/-/command-1.8.32.tgz", + "integrity": "sha512-vPoSvNM08RCHRcwBK9AyXQW+Np4Ba1ny6tSHTT8G+mqrYDWoCNBx0BD4n58laB1X8rFJ8rMi+L5S8tPAnAZ93w==", "requires": { "@oclif/config": "^1.18.2", "@oclif/errors": "^1.3.6", "@oclif/help": "^1.0.1", - "@oclif/parser": "^3.8.11", + "@oclif/parser": "^3.8.14", "debug": "^4.1.1", - "semver": "^7.5.1" + "semver": "^7.5.4" } }, "@oclif/config": { - "version": "1.18.9", - "resolved": "https://registry.npmjs.org/@oclif/config/-/config-1.18.9.tgz", - "integrity": "sha512-CGABvY60IbzK3kecDekCQS4T7fvpraBHV3nvYDtehrqljbMxtTeeJkFJVLbBnZnwzD2u1ApQX/Zggja3lyCoJA==", + "version": "1.18.13", + "resolved": "https://registry.npmjs.org/@oclif/config/-/config-1.18.13.tgz", + "integrity": "sha512-Ja0KJvRBYm6xwgJpdn9oZ1DofE7MZ2wB320dblHDOdVQcpKRHnX64R0BlEqXsU6jJO7w95iy1geeKFxIVmfuWA==", "requires": { "@oclif/errors": "^1.3.6", - "@oclif/parser": "^3.8.11", + "@oclif/parser": "^3.8.14", "debug": "^4.3.4", "globby": "^11.1.0", "is-wsl": "^2.1.1", @@ -27280,9 +26708,9 @@ } }, "@oclif/core": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/@oclif/core/-/core-2.8.5.tgz", - "integrity": "sha512-316DLfrHQDYmWDriI4Woxk9y1wVUrPN1sZdbQLHdOdlTA9v/twe7TdHpWOriEypfl6C85NWEJKc1870yuLtjrQ==", + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/@oclif/core/-/core-2.9.3.tgz", + "integrity": "sha512-0KLiVpXCJivAjLoj/LAXQf85MtGzyforyPkgNJQEP6QQugnuq2kHcG+DojWEQYz0sADXT2259EdPibslEThUMg==", "requires": { "@types/cli-progress": "^3.11.0", "ansi-escapes": "^4.3.2", @@ -27303,7 +26731,8 @@ "natural-orderby": "^2.0.3", "object-treeify": "^1.1.33", "password-prompt": "^1.1.2", - "semver": "^7.3.7", + "semver": "^7.5.3", + "slice-ansi": "^4.0.0", "string-width": "^4.2.3", "strip-ansi": "^6.0.1", "supports-color": "^8.1.1", @@ -27315,6 +26744,11 @@ "wrap-ansi": "^7.0.0" }, "dependencies": { + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==" + }, "globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -27327,6 +26761,16 @@ "merge2": "^1.4.1", "slash": "^3.0.0" } + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } } } }, @@ -27368,11 +26812,11 @@ } }, "@oclif/help": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@oclif/help/-/help-1.0.5.tgz", - "integrity": "sha512-77ZXqVXcd+bQ6EafN56KbL4PbNtZM/Lq4GQElekNav+CPIgPNKT3AtMTQrc0fWke6bb/BTLB+1Fu1gWgx643jQ==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@oclif/help/-/help-1.0.11.tgz", + "integrity": "sha512-zc44XfjG8Ff0y9cF9LoLd6MBssV7vHuwFpdvvSsLD/pdjGid+EOgAwy/jYYDajThxWPatcVscKXlnDvyFQ8Y0A==", "requires": { - "@oclif/config": "1.18.6", + "@oclif/config": "1.18.12", "@oclif/errors": "1.3.6", "chalk": "^4.1.2", "indent-string": "^4.0.0", @@ -27384,16 +26828,16 @@ }, "dependencies": { "@oclif/config": { - "version": "1.18.6", - "resolved": "https://registry.npmjs.org/@oclif/config/-/config-1.18.6.tgz", - "integrity": "sha512-OWhCpdu4QqggOPX1YPZ4XVmLLRX+lhGjXV6RNA7sogOwLqlEmSslnN/lhR5dkhcWZbKWBQH29YCrB3LDPRu/IA==", + "version": "1.18.12", + "resolved": "https://registry.npmjs.org/@oclif/config/-/config-1.18.12.tgz", + "integrity": "sha512-hbZv4N3J9pE4yzQIqrklJFgXhqYiQTN3uV5uBC8VaIZ1qEPzZv6lN9rDmcYIuEOBPzQvvSIBuaH/IDzo3F71PQ==", "requires": { "@oclif/errors": "^1.3.6", - "@oclif/parser": "^3.8.9", + "@oclif/parser": "^3.8.13", "debug": "^4.3.4", "globby": "^11.1.0", "is-wsl": "^2.1.1", - "tslib": "^2.3.1" + "tslib": "^2.5.0" } }, "globby": { @@ -27427,33 +26871,32 @@ "integrity": "sha512-Ups2dShK52xXa8w6iBWLgcjPJWjais6KPJQq3gQ/88AY6BXoTX+MIGFPrWQO1KLMiQfoTpcLnUwloN4brrVUHw==" }, "@oclif/parser": { - "version": "3.8.11", - "resolved": "https://registry.npmjs.org/@oclif/parser/-/parser-3.8.11.tgz", - "integrity": "sha512-B3NweRn1yZw2g7xaF10Zh/zwlqTJJINfU+CRkqll+LaTisSNvZbW0RR9WGan26EqqLp4qzNjzX/e90Ew8l9NLw==", + "version": "3.8.14", + "resolved": "https://registry.npmjs.org/@oclif/parser/-/parser-3.8.14.tgz", + "integrity": "sha512-dGF3/Db+YZTxlR2f5cUbFcUXhrGxeVu9aT+Y/J7Wt6KMRiBJ6igIBChDHvRjjQVujR00OpdkS6fyLgBFI5meWQ==", "requires": { "@oclif/errors": "^1.3.6", "@oclif/linewrap": "^1.0.0", "chalk": "^4.1.0", - "tslib": "^2.5.2" + "tslib": "^2.6.0" } }, "@oclif/plugin-help": { - "version": "5.2.9", - "resolved": "https://registry.npmjs.org/@oclif/plugin-help/-/plugin-help-5.2.9.tgz", - "integrity": "sha512-0J3oowPURZJ4Dn1p1WpQ46E4+CoV20KTn1cvsNiDl6Hmbw+qoljKQnArJJzNFeZQxWo4R7/S42PrzKJTVYh68Q==", + "version": "5.2.13", + "resolved": "https://registry.npmjs.org/@oclif/plugin-help/-/plugin-help-5.2.13.tgz", + "integrity": "sha512-8+uJ9fxZhb76T+NiHDyLQWmHVhu1ONj+e47w3bMLe3+absfuGsWYZm5+W8ApJxQKoLgB5pW810idO0f7iP/4tw==", "requires": { - "@oclif/core": "^2.8.0" + "@oclif/core": "^2.9.3" } }, "@oclif/plugin-not-found": { - "version": "2.3.23", - "resolved": "https://registry.npmjs.org/@oclif/plugin-not-found/-/plugin-not-found-2.3.23.tgz", - "integrity": "sha512-UZM8aolxXvqwH8WcmJxRNASDWgMoSQm/pgCdkc1AGCRevYc8+LBSO+U6nLWq+Dx8H/dn9RyIv5oiUIOGkKDlZA==", + "version": "2.3.31", + "resolved": "https://registry.npmjs.org/@oclif/plugin-not-found/-/plugin-not-found-2.3.31.tgz", + "integrity": "sha512-KHBCDJbDrkFc5vuPxg4JZ3wBTrdPPHOQOWp4bLCV4cnVSUHBKnfCqnCg2aXmRb97nbzY3P13/i8Th3KQjArqmg==", "requires": { - "@oclif/color": "^1.0.4", - "@oclif/core": "^2.8.0", - "fast-levenshtein": "^3.0.0", - "lodash": "^4.17.21" + "@oclif/color": "^1.0.8", + "@oclif/core": "^2.9.3", + "fast-levenshtein": "^3.0.0" } }, "@oclif/plugin-plugins": { @@ -27475,34 +26918,34 @@ } }, "@oclif/plugin-warn-if-update-available": { - "version": "2.0.37", - "resolved": "https://registry.npmjs.org/@oclif/plugin-warn-if-update-available/-/plugin-warn-if-update-available-2.0.37.tgz", - "integrity": "sha512-rfDNvplwgiwV+QSV4JU96ypmWgNJ6Hk5FEAEAKzqF0v0J8AHwZGpwwYO/MCZSkbc7bfYpkqLx/sxjpMO6j6PmQ==", + "version": "2.0.43", + "resolved": "https://registry.npmjs.org/@oclif/plugin-warn-if-update-available/-/plugin-warn-if-update-available-2.0.43.tgz", + "integrity": "sha512-8nMnBJxV158bKGStsSqcg9FY1PD+WaNc6Soz74py9aq956i+wJax5xL8+U9J5/UmNixHzhdEzlioyHcUH/7CXQ==", "dev": true, "requires": { - "@oclif/core": "^2.8.2", + "@oclif/core": "^2.9.3", "chalk": "^4.1.0", "debug": "^4.1.0", "fs-extra": "^9.0.1", "http-call": "^5.2.2", "lodash": "^4.17.21", - "semver": "^7.5.1" + "semver": "^7.5.4" } }, "@oclif/test": { - "version": "2.3.21", - "resolved": "https://registry.npmjs.org/@oclif/test/-/test-2.3.21.tgz", - "integrity": "sha512-RaFNf3/PMwBLrL9yu8aFsONsUSpyI16AGC6HiAabDyu534Rh+jBtqy/dPZ53/SOCBOholhZmVs7jT0UE5Utwew==", + "version": "2.3.30", + "resolved": "https://registry.npmjs.org/@oclif/test/-/test-2.3.30.tgz", + "integrity": "sha512-zuOv23wiF+H7cRGMjcKx/91qhdcNMcZnr+1TCpbyDeQBIvRs/nGWyuwfrmoF2fXs+HtNZsNFvwbjg7Ue5JfAug==", "dev": true, "requires": { - "@oclif/core": "^2.8.5", - "fancy-test": "^2.0.23" + "@oclif/core": "^2.9.3", + "fancy-test": "^2.0.29" }, "dependencies": { "fancy-test": { - "version": "2.0.23", - "resolved": "https://registry.npmjs.org/fancy-test/-/fancy-test-2.0.23.tgz", - "integrity": "sha512-RPX4iAzAioH9nxkqk2yrcunBLBmnMLxtIsw3Pjgj2PGPHTdT3wZ6asKv9U332+UQyZwZWWc4bP64JOa6DcVhnQ==", + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/fancy-test/-/fancy-test-2.0.30.tgz", + "integrity": "sha512-bDQnAXYYODKwjb/6VEwAovEN0uJ1iRMTahEqOpQCRxIX7rIqoFHCy0LEqWYAU3kVw4ERgK4HQSn6GISEA1ipxg==", "dev": true, "requires": { "@types/chai": "*", @@ -27511,7 +26954,7 @@ "@types/sinon": "*", "lodash": "^4.17.13", "mock-stdin": "^1.0.0", - "nock": "^13.3.1", + "nock": "^13.3.2", "stdout-stderr": "^0.1.9" } } @@ -27662,10 +27105,20 @@ "integrity": "sha512-a31EnjuIDSX8IXBUib3cYLDRlPMU36AWX4xS8ysLaNu4ZzUesDiPt83pgrW2X1YLMe5L2HbDyaKK5BrL4cNKaQ==", "dev": true }, + "@sigstore/tuf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-1.0.2.tgz", + "integrity": "sha512-vjwcYePJzM01Ha6oWWZ9gNcdIgnzyFxfqfWzph483DPJTH8Tb7f7bQRRll3CYVkyH56j0AgcPAcl6Vg95DPF+Q==", + "dev": true, + "requires": { + "@sigstore/protobuf-specs": "^0.1.0", + "tuf-js": "^1.1.7" + } + }, "@sinclair/typebox": { - "version": "0.25.24", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", - "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", "dev": true }, "@sindresorhus/is": { @@ -27683,9 +27136,9 @@ } }, "@sinonjs/fake-timers": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.2.0.tgz", - "integrity": "sha512-OPwQlEdg40HAj5KNF8WW6q2KG4Z+cBCZb3m4ninfTZKaBmbIJodviQsDBoYMPHkOyJJMHnOJo5j2+LKDOhOACg==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "requires": { "@sinonjs/commons": "^3.0.0" } @@ -27775,9 +27228,9 @@ } }, "minimatch": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz", - "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, "requires": { "brace-expansion": "^2.0.1" @@ -27795,9 +27248,9 @@ } }, "@types/babel__core": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz", - "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==", + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", + "integrity": "sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==", "dev": true, "requires": { "@babel/parser": "^7.20.7", @@ -27827,14 +27280,20 @@ } }, "@types/babel__traverse": { - "version": "7.18.5", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.5.tgz", - "integrity": "sha512-enCvTL8m/EHS/zIvJno9nE+ndYPh1/oNFzRYRmtUqJICG2VnCSBzMLW5VN2KCQU91f23tsNKR8v7VJJQMatl7Q==", + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz", + "integrity": "sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==", "dev": true, "requires": { - "@babel/types": "^7.3.0" + "@babel/types": "^7.20.7" } }, + "@types/bluebird": { + "version": "3.5.38", + "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.38.tgz", + "integrity": "sha512-yR/Kxc0dd4FfwtEoLZMoqJbM/VE/W7hXn/MIjb+axcwag0iFmSPK7OBUZq1YWLynJUoWQkfUrI7T0HDqGApNSg==", + "dev": true + }, "@types/body-parser": { "version": "1.19.2", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", @@ -27951,6 +27410,11 @@ "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", "dev": true }, + "@types/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==" + }, "@types/ini": { "version": "1.3.31", "resolved": "https://registry.npmjs.org/@types/ini/-/ini-1.3.31.tgz", @@ -27965,6 +27429,17 @@ "requires": { "@types/through": "*", "rxjs": "^7.2.0" + }, + "dependencies": { + "rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "requires": { + "tslib": "^2.1.0" + } + } } }, "@types/istanbul-lib-coverage": { @@ -28002,9 +27477,9 @@ } }, "@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", "dev": true }, "@types/keyv": { @@ -28054,6 +27529,15 @@ "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", "dev": true }, + "@types/minipass": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@types/minipass/-/minipass-3.3.5.tgz", + "integrity": "sha512-M2BLHQdEmDmH671h0GIlOQQJrgezd1vNqq7PVj1VOsHZ2uQQb4iPiQIl0SlMdhxZPUsLIfEklmeEHXg8DJRewA==", + "dev": true, + "requires": { + "minipass": "*" + } + }, "@types/mkdirp": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-1.0.2.tgz", @@ -28069,10 +27553,19 @@ "integrity": "sha512-ekGvFhFgrc2zYQoX4JeZPmVzZxw6Dtllga7iGHzfbYIYkAMUx/sAFP2GdFpLff+vdHXu5fl7WX9AT+TtqYcsyw==", "dev": true }, + "@types/ncp": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/ncp/-/ncp-2.0.5.tgz", + "integrity": "sha512-ocK0p8JuFmX7UkMabFPjY0F7apPvQyLWt5qtdvuvQEBz9i4m2dbzV+6L1zNaUp042RfnL6pHnxDE53OH6XQ9VQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/node": { - "version": "14.18.47", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.47.tgz", - "integrity": "sha512-OuJi8bIng4wYHHA3YpKauL58dZrPxro3d0tabPHyiNF8rKfGKuVfr83oFlPLmKri1cX+Z3cJP39GXmnqkP11Gw==" + "version": "14.18.53", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.53.tgz", + "integrity": "sha512-soGmOpVBUq+gaBMwom1M+krC/NNbWlosh4AtGA03SyWNDiqSKtwp7OulO1M6+mg8YkHMvJ/y0AkCeO8d1hNb7A==" }, "@types/normalize-package-data": { "version": "2.4.1", @@ -28081,11 +27574,20 @@ "dev": true }, "@types/prettier": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", - "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==", + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", "dev": true }, + "@types/progress-stream": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@types/progress-stream/-/progress-stream-2.0.2.tgz", + "integrity": "sha512-u9N40mYX/Nx/Pmt847+G2N72s5QL2jwgXrVKCIcxgOdMBdIzY+e/m3m1gQBNPmgvQQBO79EisLAcVJ/p0qKuvA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/qs": { "version": "6.9.7", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", @@ -28105,6 +27607,12 @@ "@types/node": "*" } }, + "@types/semver": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", + "dev": true + }, "@types/send": { "version": "0.17.1", "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", @@ -28115,10 +27623,11 @@ } }, "@types/serve-static": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz", - "integrity": "sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz", + "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==", "requires": { + "@types/http-errors": "*", "@types/mime": "*", "@types/node": "*" } @@ -28197,6 +27706,24 @@ "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", "dev": true }, + "@typescript-eslint/eslint-plugin": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", + "dev": true, + "requires": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, "@typescript-eslint/experimental-utils": { "version": "4.33.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz", @@ -28211,52 +27738,122 @@ "eslint-utils": "^3.0.0" }, "dependencies": { - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "@typescript-eslint/scope-manager": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz", + "integrity": "sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==", "dev": true, "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/visitor-keys": "4.33.0" } }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "@typescript-eslint/types": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz", + "integrity": "sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz", + "integrity": "sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/visitor-keys": "4.33.0", + "debug": "^4.3.1", + "globby": "^11.0.3", + "is-glob": "^4.0.1", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz", + "integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.33.0", + "eslint-visitor-keys": "^2.0.0" + } + }, + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } } } }, + "@typescript-eslint/parser": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "dev": true, + "peer": true, + "requires": { + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "debug": "^4.3.4" + } + }, "@typescript-eslint/scope-manager": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz", - "integrity": "sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", "dev": true, "requires": { - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/visitor-keys": "4.33.0" + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + } + }, + "@typescript-eslint/type-utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", + "dev": true, + "requires": { + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz", - "integrity": "sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz", - "integrity": "sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", "dev": true, "requires": { - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/visitor-keys": "4.33.0", - "debug": "^4.3.1", - "globby": "^11.0.3", - "is-glob": "^4.0.1", - "semver": "^7.3.5", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", "tsutils": "^3.21.0" }, "dependencies": { @@ -28276,22 +27873,30 @@ } } }, + "@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + } + }, "@typescript-eslint/visitor-keys": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz", - "integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", "dev": true, "requires": { - "@typescript-eslint/types": "4.33.0", - "eslint-visitor-keys": "^2.0.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - } + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" } }, "@wry/context": { @@ -28311,9 +27916,9 @@ } }, "@wry/trie": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@wry/trie/-/trie-0.3.2.tgz", - "integrity": "sha512-yRTyhWSls2OY/pYLfwff867r8ekooZ4UI+/gxot5Wj8EFwSf2rG+n+Mo/6LoLQm1TKA4GRj2+LCpbfS937dClQ==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@wry/trie/-/trie-0.4.3.tgz", + "integrity": "sha512-I6bHwH0fSf6RqQcnnXLJKhkSXG45MFral3GxPaY4uAl0LYDZM+YDVDAiU9bYwjTuysy1S0IeecWtmq1SZA3M1w==", "requires": { "tslib": "^2.3.0" } @@ -28329,6 +27934,15 @@ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true }, + "abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dev": true, + "requires": { + "event-target-shim": "^5.0.0" + } + }, "accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -28339,9 +27953,9 @@ } }, "acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==" + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==" }, "acorn-globals": { "version": "7.0.1", @@ -28614,11 +28228,10 @@ "dev": true }, "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true, - "peer": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true }, "async": { "version": "3.2.4", @@ -28635,6 +28248,11 @@ "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" }, + "atomically": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/atomically/-/atomically-1.7.0.tgz", + "integrity": "sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w==" + }, "available-typed-arrays": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", @@ -28642,9 +28260,9 @@ "dev": true }, "aws-sdk": { - "version": "2.1383.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1383.0.tgz", - "integrity": "sha512-A8sdfcrlGYXqu5x8dpwh1lg9/o354leCx08N/irwH3U4sAwQin0vHsI9DHmaJ0PLNo/TuzeLE3s4dLpI3mWtww==", + "version": "2.1416.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1416.0.tgz", + "integrity": "sha512-AP36hsRZhyceyCoTYrsV9FH04CEcAegQYcrg2ybsYB4axo5uvwM67YLFcwc9jAAbk4l2ALWv2XnI0e7HZFCGqQ==", "dev": true, "requires": { "buffer": "4.9.2", @@ -28678,12 +28296,12 @@ } }, "babel-jest": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.5.0.tgz", - "integrity": "sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.1.tgz", + "integrity": "sha512-qu+3bdPEQC6KZSPz+4Fyjbga5OODNcp49j6GKzG1EKbkfyJBxEYGVUmVGpwCSeGouG52R4EgYMLb6p9YeEEQ4A==", "dev": true, "requires": { - "@jest/transform": "^29.5.0", + "@jest/transform": "^29.6.1", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.5.0", @@ -28926,15 +28544,15 @@ "dev": true }, "browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "version": "4.21.9", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", + "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" + "caniuse-lite": "^1.0.30001503", + "electron-to-chromium": "^1.4.431", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" } }, "bs-logger": { @@ -29085,9 +28703,9 @@ "dev": true }, "cacheable-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", - "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", "dev": true, "requires": { "clone-response": "^1.0.2", @@ -29157,9 +28775,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001489", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001489.tgz", - "integrity": "sha512-x1mgZEXK8jHIfAxm+xgdpHpk50IN3z3q3zP261/WS+uvePxW8izXuCu6AHz0lkuYTlATDehiZ/tNyYBdSQsOUQ==", + "version": "1.0.30001516", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001516.tgz", + "integrity": "sha512-Wmec9pCBY8CWbmI4HsjBeQLqDTqV91nFVR83DnZpYyRnPI1wePDsTg0bGLPC5VU/3OIZV1fmxEea1b+tFKe86g==", "dev": true }, "cardinal": { @@ -29275,9 +28893,9 @@ "dev": true }, "cjs-module-lexer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", - "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", "dev": true }, "clean-regexp": { @@ -29362,6 +28980,11 @@ "number-is-nan": "^1.0.0" } }, + "slice-ansi": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "integrity": "sha512-up04hB2hR92PgjpyU3y/eg91yIBILyjVY26NvvciY3EVVPjybkMszMpXQ9QAkcS3I5rtJBDLoTxxg+qvW8c7rw==" + }, "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", @@ -29475,9 +29098,9 @@ } }, "collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", "dev": true }, "color": { @@ -29680,9 +29303,35 @@ "requires": { "@babel/runtime": "^7.21.0" } + }, + "rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "requires": { + "tslib": "^2.1.0" + } } } }, + "conf": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/conf/-/conf-10.2.0.tgz", + "integrity": "sha512-8fLl9F04EJqjSqH+QjITQfJF8BrOVaYr1jewVgSRAEWePfxT0sku4w2hrGQ60BC/TNLGQ2pgxNlTbWQmMPFvXg==", + "requires": { + "ajv": "^8.6.3", + "ajv-formats": "^2.1.1", + "atomically": "^1.7.0", + "debounce-fn": "^4.0.0", + "dot-prop": "^6.0.1", + "env-paths": "^2.2.1", + "json-schema-typed": "^7.0.3", + "onetime": "^5.1.2", + "pkg-up": "^3.1.0", + "semver": "^7.3.5" + } + }, "config-master": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/config-master/-/config-master-3.1.0.tgz", @@ -29764,11 +29413,11 @@ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" }, "cross-fetch": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.6.tgz", - "integrity": "sha512-riRvo06crlE8HiqOwIpQhxwdOk4fOeR7FVM/wXoxchFEqMNUjvbs3bfo4OTgMEMHzppd4DxFBDbyySj8Cv781g==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", + "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", "requires": { - "node-fetch": "^2.6.11" + "node-fetch": "^2.6.12" } }, "cross-spawn": { @@ -29839,6 +29488,14 @@ "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==", "dev": true }, + "debounce-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/debounce-fn/-/debounce-fn-4.0.0.tgz", + "integrity": "sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ==", + "requires": { + "mimic-fn": "^3.0.0" + } + }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -29905,7 +29562,8 @@ "deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true }, "deepmerge": { "version": "4.3.1", @@ -30060,10 +29718,18 @@ "glob": "^7.1.5" } }, + "dot-prop": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", + "requires": { + "is-obj": "^2.0.0" + } + }, "dotenv": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", - "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==" + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==" }, "dotenv-expand": { "version": "9.0.0", @@ -30091,9 +29757,9 @@ } }, "electron-to-chromium": { - "version": "1.4.405", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.405.tgz", - "integrity": "sha512-JdDgnwU69FMZURoesf9gNOej2Cms1XJFfLk24y1IBtnAdhTcJY/mXnokmpmxHN59PcykBP4bgUU98vLY44Lhuw==", + "version": "1.4.463", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.463.tgz", + "integrity": "sha512-fT3hvdUWLjDbaTGzyOjng/CQhQJSQP8ThO3XZAoaxHvHo2kUXiRQVMj9M235l8uDFiNPsPa6KHT1p3RaR6ugRw==", "dev": true }, "elegant-spinner": { @@ -30225,70 +29891,34 @@ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" }, "escodegen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", "requires": { "esprima": "^4.0.1", "estraverse": "^5.2.0", "esutils": "^2.0.2", - "optionator": "^0.8.1", "source-map": "~0.6.1" }, "dependencies": { - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==" - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "requires": { - "prelude-ls": "~1.1.2" - } + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" } } }, "eslint": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.41.0.tgz", - "integrity": "sha512-WQDQpzGBOP5IrXPo4Hc0814r4/v2rrIsB0rhT7jtunIalgg6gYXWhRMOejVO8yH21T/FGaxjmFjBMNqcIlmH1Q==", + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.45.0.tgz", + "integrity": "sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.3", - "@eslint/js": "8.41.0", - "@humanwhocodes/config-array": "^0.11.8", + "@eslint/eslintrc": "^2.1.0", + "@eslint/js": "8.44.0", + "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", @@ -30299,7 +29929,7 @@ "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.2.0", "eslint-visitor-keys": "^3.4.1", - "espree": "^9.5.2", + "espree": "^9.6.0", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -30309,7 +29939,6 @@ "globals": "^13.19.0", "graphemer": "^1.4.0", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", @@ -30319,9 +29948,8 @@ "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.1", + "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" }, "dependencies": { @@ -30343,6 +29971,22 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "eslint-scope": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.1.tgz", + "integrity": "sha512-CvefSOsDdaYYvxChovdrPo/ZGt8d5lrJWleAc1diXRKhHGiTYEI26cvo8Kle/wGnsizoCJjK73FMg1/IkIwiNA==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, "js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -30492,6 +30136,13 @@ "color-convert": "^1.9.0" } }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true, + "peer": true + }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -30553,9 +30204,9 @@ }, "dependencies": { "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "peer": true } @@ -30649,9 +30300,9 @@ "peer": true }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "peer": true } @@ -30745,9 +30396,9 @@ } }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true } } @@ -30768,16 +30419,6 @@ "safe-regex": "^1.1.0" } }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, "eslint-utils": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", @@ -30805,12 +30446,6 @@ "eslint-visitor-keys": "^1.0.0" } }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", @@ -31033,16 +30668,6 @@ "glob": "^7.1.3" } }, - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "peer": true, - "requires": { - "tslib": "^1.9.0" - } - }, "safe-regex": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", @@ -31163,13 +30788,6 @@ } } }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true, - "peer": true - }, "type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", @@ -31277,9 +30895,9 @@ "dev": true }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true } } @@ -31305,13 +30923,13 @@ } }, "eslint-scope": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", - "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "requires": { "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" + "estraverse": "^4.1.1" } }, "eslint-template-visitor": { @@ -31364,12 +30982,12 @@ "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==" }, "espree": { - "version": "9.5.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", - "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "requires": { - "acorn": "^8.8.0", + "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.4.1" } @@ -31386,6 +31004,14 @@ "dev": true, "requires": { "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } } }, "esrecurse": { @@ -31395,12 +31021,21 @@ "dev": true, "requires": { "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } } }, "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true }, "esutils": { "version": "2.0.3", @@ -31412,6 +31047,12 @@ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" }, + "event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "dev": true + }, "eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", @@ -31448,18 +31089,25 @@ "dev": true }, "expect": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.5.0.tgz", - "integrity": "sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.1.tgz", + "integrity": "sha512-XEdDLonERCU1n9uR56/Stx9OqojaLAQtZf9PrCHH9Hl8YXiEIka3H4NXJ3NOIBmQJTg7+j7buh34PMHfJujc8g==", "dev": true, "requires": { - "@jest/expect-utils": "^29.5.0", + "@jest/expect-utils": "^29.6.1", + "@types/node": "*", "jest-get-type": "^29.4.3", - "jest-matcher-utils": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0" + "jest-matcher-utils": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-util": "^29.6.1" } }, + "exponential-backoff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", + "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", + "dev": true + }, "express": { "version": "4.18.2", "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", @@ -31576,9 +31224,9 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", + "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -32161,9 +31809,9 @@ "dev": true }, "graphql": { - "version": "16.6.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.6.0.tgz", - "integrity": "sha512-KPIBPDlW7NxrbT/eh4qPXz5FiFdL5UbaA0XUNz2Rp3Z3hqBSkbj0GVjwFDztsWVauZUWsbKHgMg++sk8UX0bkw==" + "version": "16.7.1", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.7.1.tgz", + "integrity": "sha512-DRYR9tf+UGU0KOsMcKAlXeFfX89UiiIZ0dRU3mR0yJfu6OjZqUcp68NnFLnqQU5RexygFoDy1EW+ccOYcPfmHg==" }, "graphql-tag": { "version": "2.12.6", @@ -32526,6 +32174,16 @@ "strip-ansi": "^6.0.0", "through": "^2.3.6", "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "requires": { + "tslib": "^2.1.0" + } + } } }, "inquirer-checkbox-plus-prompt": { @@ -33159,16 +32817,12 @@ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" }, "is-typed-array": { - "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==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", "dev": true, "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "which-typed-array": "^1.1.11" } }, "is-typedarray": { @@ -33269,9 +32923,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true } } @@ -33370,9 +33024,9 @@ } }, "jake": { - "version": "10.8.6", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.6.tgz", - "integrity": "sha512-G43Ub9IYEFfu72sua6rzooi8V8Gz2lkfk48rW20vEWCGizeaEPlKB1Kh8JIA84yQbiAEfqlPmSpGgCKKxH3rDA==", + "version": "10.8.7", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", + "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", "requires": { "async": "^3.2.3", "chalk": "^4.0.2", @@ -33381,15 +33035,15 @@ } }, "jest": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.5.0.tgz", - "integrity": "sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.1.tgz", + "integrity": "sha512-Nirw5B4nn69rVUZtemCQhwxOBhm0nsp3hmtF4rzCeWD7BkjAXRIji7xWQfnTNbz9g0aVsBX6aZK3n+23LM6uDw==", "dev": true, "requires": { - "@jest/core": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/core": "^29.6.1", + "@jest/types": "^29.6.1", "import-local": "^3.0.2", - "jest-cli": "^29.5.0" + "jest-cli": "^29.6.1" } }, "jest-changed-files": { @@ -33403,28 +33057,28 @@ } }, "jest-circus": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.5.0.tgz", - "integrity": "sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.1.tgz", + "integrity": "sha512-tPbYLEiBU4MYAL2XoZme/bgfUeotpDBd81lgHLCbDZZFaGmECk0b+/xejPFtmiBP87GgP/y4jplcRpbH+fgCzQ==", "dev": true, "requires": { - "@jest/environment": "^29.5.0", - "@jest/expect": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/environment": "^29.6.1", + "@jest/expect": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/types": "^29.6.1", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^0.7.0", "is-generator-fn": "^2.0.0", - "jest-each": "^29.5.0", - "jest-matcher-utils": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-runtime": "^29.5.0", - "jest-snapshot": "^29.5.0", - "jest-util": "^29.5.0", + "jest-each": "^29.6.1", + "jest-matcher-utils": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-runtime": "^29.6.1", + "jest-snapshot": "^29.6.1", + "jest-util": "^29.6.1", "p-limit": "^3.1.0", - "pretty-format": "^29.5.0", + "pretty-format": "^29.6.1", "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" @@ -33437,12 +33091,12 @@ "dev": true }, "pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", + "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", "dev": true, "requires": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.0", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" } @@ -33456,51 +33110,51 @@ } }, "jest-cli": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.5.0.tgz", - "integrity": "sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.1.tgz", + "integrity": "sha512-607dSgTA4ODIN6go9w6xY3EYkyPFGicx51a69H7yfvt7lN53xNswEVLovq+E77VsTRi5fWprLH0yl4DJgE8Ing==", "dev": true, "requires": { - "@jest/core": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/core": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/types": "^29.6.1", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^29.5.0", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", + "jest-config": "^29.6.1", + "jest-util": "^29.6.1", + "jest-validate": "^29.6.1", "prompts": "^2.0.1", "yargs": "^17.3.1" } }, "jest-config": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.5.0.tgz", - "integrity": "sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.1.tgz", + "integrity": "sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ==", "dev": true, "requires": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.5.0", - "@jest/types": "^29.5.0", - "babel-jest": "^29.5.0", + "@jest/test-sequencer": "^29.6.1", + "@jest/types": "^29.6.1", + "babel-jest": "^29.6.1", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^29.5.0", - "jest-environment-node": "^29.5.0", + "jest-circus": "^29.6.1", + "jest-environment-node": "^29.6.1", "jest-get-type": "^29.4.3", "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.5.0", - "jest-runner": "^29.5.0", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", + "jest-resolve": "^29.6.1", + "jest-runner": "^29.6.1", + "jest-util": "^29.6.1", + "jest-validate": "^29.6.1", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^29.5.0", + "pretty-format": "^29.6.1", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, @@ -33524,12 +33178,12 @@ } }, "pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", + "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", "dev": true, "requires": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.0", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" } @@ -33572,16 +33226,16 @@ } }, "jest-each": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.5.0.tgz", - "integrity": "sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.1.tgz", + "integrity": "sha512-n5eoj5eiTHpKQCAVcNTT7DRqeUmJ01hsAL0Q1SMiBHcBcvTKDELixQOGMCpqhbIuTcfC4kMfSnpmDqRgRJcLNQ==", "dev": true, "requires": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.1", "chalk": "^4.0.0", "jest-get-type": "^29.4.3", - "jest-util": "^29.5.0", - "pretty-format": "^29.5.0" + "jest-util": "^29.6.1", + "pretty-format": "^29.6.1" }, "dependencies": { "ansi-styles": { @@ -33591,12 +33245,12 @@ "dev": true }, "pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", + "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", "dev": true, "requires": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.0", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" } @@ -33610,17 +33264,17 @@ } }, "jest-environment-node": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.5.0.tgz", - "integrity": "sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.1.tgz", + "integrity": "sha512-ZNIfAiE+foBog24W+2caIldl4Irh8Lx1PUhg/GZ0odM1d/h2qORAsejiFc7zb+SEmYPn1yDZzEDSU5PmDkmVLQ==", "dev": true, "requires": { - "@jest/environment": "^29.5.0", - "@jest/fake-timers": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/environment": "^29.6.1", + "@jest/fake-timers": "^29.6.1", + "@jest/types": "^29.6.1", "@types/node": "*", - "jest-mock": "^29.5.0", - "jest-util": "^29.5.0" + "jest-mock": "^29.6.1", + "jest-util": "^29.6.1" } }, "jest-get-type": { @@ -33630,12 +33284,12 @@ "dev": true }, "jest-haste-map": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.5.0.tgz", - "integrity": "sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.1.tgz", + "integrity": "sha512-0m7f9PZXxOCk1gRACiVgX85knUKPKLPg4oRCjLoqIm9brTHXaorMA0JpmtmVkQiT8nmXyIVoZd/nnH1cfC33ig==", "dev": true, "requires": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.1", "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", @@ -33643,20 +33297,20 @@ "fsevents": "^2.3.2", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.4.3", - "jest-util": "^29.5.0", - "jest-worker": "^29.5.0", + "jest-util": "^29.6.1", + "jest-worker": "^29.6.1", "micromatch": "^4.0.4", "walker": "^1.0.8" } }, "jest-leak-detector": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz", - "integrity": "sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.1.tgz", + "integrity": "sha512-OrxMNyZirpOEwkF3UHnIkAiZbtkBWiye+hhBweCHkVbCgyEy71Mwbb5zgeTNYWJBi1qgDVfPC1IwO9dVEeTLwQ==", "dev": true, "requires": { "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" + "pretty-format": "^29.6.1" }, "dependencies": { "ansi-styles": { @@ -33666,12 +33320,12 @@ "dev": true }, "pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", + "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", "dev": true, "requires": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.0", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" } @@ -33685,15 +33339,15 @@ } }, "jest-matcher-utils": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz", - "integrity": "sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.1.tgz", + "integrity": "sha512-SLaztw9d2mfQQKHmJXKM0HCbl2PPVld/t9Xa6P9sgiExijviSp7TnZZpw2Fpt+OI3nwUO/slJbOfzfUMKKC5QA==", "dev": true, "requires": { "chalk": "^4.0.0", - "jest-diff": "^29.5.0", + "jest-diff": "^29.6.1", "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" + "pretty-format": "^29.6.1" }, "dependencies": { "ansi-styles": { @@ -33709,24 +33363,24 @@ "dev": true }, "jest-diff": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.5.0.tgz", - "integrity": "sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.1.tgz", + "integrity": "sha512-FsNCvinvl8oVxpNLttNQX7FAq7vR+gMDGj90tiP7siWw1UdakWUGqrylpsYrpvj908IYckm5Y0Q7azNAozU1Kg==", "dev": true, "requires": { "chalk": "^4.0.0", "diff-sequences": "^29.4.3", "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" + "pretty-format": "^29.6.1" } }, "pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", + "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", "dev": true, "requires": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.0", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" } @@ -33740,18 +33394,18 @@ } }, "jest-message-util": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.5.0.tgz", - "integrity": "sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.1.tgz", + "integrity": "sha512-KoAW2zAmNSd3Gk88uJ56qXUWbFk787QKmjjJVOjtGFmmGSZgDBrlIL4AfQw1xyMYPNVD7dNInfIbur9B2rd/wQ==", "dev": true, "requires": { "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.1", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.5.0", + "pretty-format": "^29.6.1", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -33763,12 +33417,12 @@ "dev": true }, "pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", + "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", "dev": true, "requires": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.0", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" } @@ -33782,14 +33436,14 @@ } }, "jest-mock": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.5.0.tgz", - "integrity": "sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.1.tgz", + "integrity": "sha512-brovyV9HBkjXAEdRooaTQK42n8usKoSRR3gihzUpYeV/vwqgSoNfrksO7UfSACnPmxasO/8TmHM3w9Hp3G1dgw==", "dev": true, "requires": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.1", "@types/node": "*", - "jest-util": "^29.5.0" + "jest-util": "^29.6.1" } }, "jest-pnp-resolver": { @@ -33806,120 +33460,118 @@ "dev": true }, "jest-resolve": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.5.0.tgz", - "integrity": "sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.1.tgz", + "integrity": "sha512-AeRkyS8g37UyJiP9w3mmI/VXU/q8l/IH52vj/cDAyScDcemRbSBhfX/NMYIGilQgSVwsjxrCHf3XJu4f+lxCMg==", "dev": true, "requires": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", + "jest-haste-map": "^29.6.1", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", + "jest-util": "^29.6.1", + "jest-validate": "^29.6.1", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" } }, "jest-resolve-dependencies": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz", - "integrity": "sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.1.tgz", + "integrity": "sha512-BbFvxLXtcldaFOhNMXmHRWx1nXQO5LoXiKSGQcA1LxxirYceZT6ch8KTE1bK3X31TNG/JbkI7OkS/ABexVahiw==", "dev": true, "requires": { "jest-regex-util": "^29.4.3", - "jest-snapshot": "^29.5.0" + "jest-snapshot": "^29.6.1" } }, "jest-runner": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.5.0.tgz", - "integrity": "sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.1.tgz", + "integrity": "sha512-tw0wb2Q9yhjAQ2w8rHRDxteryyIck7gIzQE4Reu3JuOBpGp96xWgF0nY8MDdejzrLCZKDcp8JlZrBN/EtkQvPQ==", "dev": true, "requires": { - "@jest/console": "^29.5.0", - "@jest/environment": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/console": "^29.6.1", + "@jest/environment": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", "jest-docblock": "^29.4.3", - "jest-environment-node": "^29.5.0", - "jest-haste-map": "^29.5.0", - "jest-leak-detector": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-resolve": "^29.5.0", - "jest-runtime": "^29.5.0", - "jest-util": "^29.5.0", - "jest-watcher": "^29.5.0", - "jest-worker": "^29.5.0", + "jest-environment-node": "^29.6.1", + "jest-haste-map": "^29.6.1", + "jest-leak-detector": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-resolve": "^29.6.1", + "jest-runtime": "^29.6.1", + "jest-util": "^29.6.1", + "jest-watcher": "^29.6.1", + "jest-worker": "^29.6.1", "p-limit": "^3.1.0", "source-map-support": "0.5.13" } }, "jest-runtime": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.5.0.tgz", - "integrity": "sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw==", - "dev": true, - "requires": { - "@jest/environment": "^29.5.0", - "@jest/fake-timers": "^29.5.0", - "@jest/globals": "^29.5.0", - "@jest/source-map": "^29.4.3", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.1.tgz", + "integrity": "sha512-D6/AYOA+Lhs5e5il8+5pSLemjtJezUr+8zx+Sn8xlmOux3XOqx4d8l/2udBea8CRPqqrzhsKUsN/gBDE/IcaPQ==", + "dev": true, + "requires": { + "@jest/environment": "^29.6.1", + "@jest/fake-timers": "^29.6.1", + "@jest/globals": "^29.6.1", + "@jest/source-map": "^29.6.0", + "@jest/test-result": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", "@types/node": "*", "chalk": "^4.0.0", "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-mock": "^29.5.0", + "jest-haste-map": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-mock": "^29.6.1", "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.5.0", - "jest-snapshot": "^29.5.0", - "jest-util": "^29.5.0", + "jest-resolve": "^29.6.1", + "jest-snapshot": "^29.6.1", + "jest-util": "^29.6.1", "slash": "^3.0.0", "strip-bom": "^4.0.0" } }, "jest-snapshot": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.5.0.tgz", - "integrity": "sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.1.tgz", + "integrity": "sha512-G4UQE1QQ6OaCgfY+A0uR1W2AY0tGXUPQpoUClhWHq1Xdnx1H6JOrC2nH5lqnOEqaDgbHFgIwZ7bNq24HpB180A==", "dev": true, "requires": { "@babel/core": "^7.11.6", "@babel/generator": "^7.7.2", "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", - "@types/babel__traverse": "^7.0.6", + "@jest/expect-utils": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", "@types/prettier": "^2.1.5", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^29.5.0", + "expect": "^29.6.1", "graceful-fs": "^4.2.9", - "jest-diff": "^29.5.0", + "jest-diff": "^29.6.1", "jest-get-type": "^29.4.3", - "jest-matcher-utils": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0", + "jest-matcher-utils": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-util": "^29.6.1", "natural-compare": "^1.4.0", - "pretty-format": "^29.5.0", - "semver": "^7.3.5" + "pretty-format": "^29.6.1", + "semver": "^7.5.3" }, "dependencies": { "ansi-styles": { @@ -33935,24 +33587,24 @@ "dev": true }, "jest-diff": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.5.0.tgz", - "integrity": "sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.1.tgz", + "integrity": "sha512-FsNCvinvl8oVxpNLttNQX7FAq7vR+gMDGj90tiP7siWw1UdakWUGqrylpsYrpvj908IYckm5Y0Q7azNAozU1Kg==", "dev": true, "requires": { "chalk": "^4.0.0", "diff-sequences": "^29.4.3", "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" + "pretty-format": "^29.6.1" } }, "pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", + "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", "dev": true, "requires": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.0", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" } @@ -33966,12 +33618,12 @@ } }, "jest-util": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz", - "integrity": "sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.1.tgz", + "integrity": "sha512-NRFCcjc+/uO3ijUVyNOQJluf8PtGCe/W6cix36+M3cTFgiYqFOOW5MgN4JOOcvbUhcKTYVd1CvHz/LWi8d16Mg==", "dev": true, "requires": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.1", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", @@ -33980,17 +33632,17 @@ } }, "jest-validate": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.5.0.tgz", - "integrity": "sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.1.tgz", + "integrity": "sha512-r3Ds69/0KCN4vx4sYAbGL1EVpZ7MSS0vLmd3gV78O+NAx3PDQQukRU5hNHPXlyqCgFY8XUk7EuTMLugh0KzahA==", "dev": true, "requires": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.1", "camelcase": "^6.2.0", "chalk": "^4.0.0", "jest-get-type": "^29.4.3", "leven": "^3.1.0", - "pretty-format": "^29.5.0" + "pretty-format": "^29.6.1" }, "dependencies": { "ansi-styles": { @@ -34006,12 +33658,12 @@ "dev": true }, "pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", + "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", "dev": true, "requires": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.0", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" } @@ -34025,29 +33677,29 @@ } }, "jest-watcher": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.5.0.tgz", - "integrity": "sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.1.tgz", + "integrity": "sha512-d4wpjWTS7HEZPaaj8m36QiaP856JthRZkrgcIY/7ISoUWPIillrXM23WPboZVLbiwZBt4/qn2Jke84Sla6JhFA==", "dev": true, "requires": { - "@jest/test-result": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/test-result": "^29.6.1", + "@jest/types": "^29.6.1", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", - "jest-util": "^29.5.0", + "jest-util": "^29.6.1", "string-length": "^4.0.1" } }, "jest-worker": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.5.0.tgz", - "integrity": "sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.1.tgz", + "integrity": "sha512-U+Wrbca7S8ZAxAe9L6nb6g8kPdia5hj32Puu5iOqBCMTMWFHXuK6dOV2IFrpedbTV8fjMFLdWNttQTBL6u2MRA==", "dev": true, "requires": { "@types/node": "*", - "jest-util": "^29.5.0", + "jest-util": "^29.6.1", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } @@ -34219,6 +33871,11 @@ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, + "json-schema-typed": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-7.0.3.tgz", + "integrity": "sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A==" + }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", @@ -34292,9 +33949,9 @@ "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==" }, "keyv": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", - "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", + "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", "dev": true, "requires": { "json-buffer": "3.0.1" @@ -34371,19 +34028,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==" - }, - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "requires": { - "tslib": "^1.9.0" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" } } }, @@ -34887,6 +34531,13 @@ "ms": "^2.1.1", "safe-stable-stringify": "^2.3.1", "triple-beam": "^1.3.0" + }, + "dependencies": { + "@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==" + } } }, "loose-envify": { @@ -34931,9 +34582,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true } } @@ -35194,6 +34845,11 @@ "mime-db": "1.52.0" } }, + "mimic-fn": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", + "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==" + }, "mimic-response": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", @@ -35427,9 +35083,9 @@ "dev": true }, "mocha": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", - "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.1.0.tgz", + "integrity": "sha512-vUF7IYxEoN7XhQpFLxQAEMtE4W91acW4B6En9l97MwE9stL1A9gusXfoHZCLVHDUJ/7V5+lbCM6yMqzo5vNymg==", "dev": true, "requires": { "ansi-colors": "4.1.1", @@ -35618,11 +35274,22 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, + "natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, "natural-orderby": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/natural-orderby/-/natural-orderby-2.0.3.tgz", "integrity": "sha512-p7KTHxU0CUrcOXe62Zfrb5Z13nLvPhSWR/so3kFulUQU0sgUll2Z0LwpsLN351eOOD+hRGu/F1g+6xDfPeD++Q==" }, + "ncp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", + "integrity": "sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==" + }, "negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -35675,9 +35342,9 @@ } }, "nock": { - "version": "13.3.1", - "resolved": "https://registry.npmjs.org/nock/-/nock-13.3.1.tgz", - "integrity": "sha512-vHnopocZuI93p2ccivFyGuUfzjq2fxNyNurp7816mlT5V5HF4SzXu8lvLrVzBbNqzs+ODooZ6OksuSUNM7Njkw==", + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/nock/-/nock-13.3.2.tgz", + "integrity": "sha512-CwbljitiWJhF1gL83NbanhoKs1l23TDlRioNraPTZrzZIEooPemrHRj5m0FZCPkB1ecdYCSWWGcHysJgX/ngnQ==", "requires": { "debug": "^4.1.0", "json-stringify-safe": "^5.0.1", @@ -35686,9 +35353,9 @@ } }, "node-fetch": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", - "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", + "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", "requires": { "whatwg-url": "^5.0.0" }, @@ -35813,9 +35480,9 @@ } }, "node-releases": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", - "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==", + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", "dev": true }, "nopt": { @@ -36179,9 +35846,9 @@ "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==" }, "nwsapi": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.4.tgz", - "integrity": "sha512-NHj4rzRo0tQdijE9ZqAx6kYDcoRwYwSYzCA8MY3JzfxlrvEU0jhnhJT9BhqhJs7I/dKcrDm6TyulaRqZPIhN5g==" + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", + "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==" }, "nyc": { "version": "15.1.0", @@ -36303,9 +35970,9 @@ } }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true }, "wrap-ansi": { @@ -36400,9 +36067,9 @@ "integrity": "sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==" }, "oclif": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/oclif/-/oclif-3.9.0.tgz", - "integrity": "sha512-fsFyHVQYJdE50EcKrBjwzl2WT5sZUtTiRY1vqMwykgLFUDYrQS0lj7yqy2IgcPSmAWaLQryODdfBujCWOU98Ww==", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/oclif/-/oclif-3.9.1.tgz", + "integrity": "sha512-gJ8gJrohFY8qEeVBOw7wgAFdwPt2CTTkEFXDTkfUeXap6URIy6ngP7g/E1A2zFt2I0wH/qQHwcfuTpfBbj1+Uw==", "dev": true, "requires": { "@oclif/core": "^2.8.4", @@ -36518,20 +36185,30 @@ "requires": { "@wry/context": "^0.7.0", "@wry/trie": "^0.3.0" + }, + "dependencies": { + "@wry/trie": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@wry/trie/-/trie-0.3.2.tgz", + "integrity": "sha512-yRTyhWSls2OY/pYLfwff867r8ekooZ4UI+/gxot5Wj8EFwSf2rG+n+Mo/6LoLQm1TKA4GRj2+LCpbfS937dClQ==", + "requires": { + "tslib": "^2.3.0" + } + } } }, "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, "requires": { + "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "type-check": "^0.4.0" }, "dependencies": { "fast-levenshtein": { @@ -36808,9 +36485,9 @@ "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==" }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" }, "shebang-command": { "version": "1.2.0", @@ -36888,25 +36565,25 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "path-scurry": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.9.2.tgz", - "integrity": "sha512-qSDLy2aGFPm8i4rsbHd4MNyTcrzHFsLQykrtbuGRknZZCBBVXSv2tSCDN2Cg6Rt/GFRw8GoW9y9Ecw5rIPG1sg==", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", "dev": true, "requires": { - "lru-cache": "^9.1.1", - "minipass": "^5.0.0 || ^6.0.2" + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "dependencies": { "lru-cache": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.1.tgz", - "integrity": "sha512-65/Jky17UwSb0BuB9V+MyDpsOtXKmYwzhyl+cOa9XUiI4uV2Ouy/2voFP3+al0BjZbJgMBD8FojMpAf+Z+qn4A==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.0.tgz", + "integrity": "sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw==", "dev": true }, "minipass": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-6.0.2.tgz", - "integrity": "sha512-MzWSV5nYVT7mVyWCwn2o7JH13w2TBRmmSqSRCKzTw+lmft9X4z+3wjvs06Tzijo5z4W/kahUCDpRXTF+ZrmF/w==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.2.tgz", + "integrity": "sha512-eL79dXrE1q9dBbDCLg7xfn/vl7MS4F1gvJAgjJrQli/jbQWdUttuVawphqpffoIYfRdq78LHx6GP4bU/EQ2ATA==", "dev": true } } @@ -36944,9 +36621,9 @@ "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" }, "pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", "dev": true }, "pkg-dir": { @@ -37052,9 +36729,9 @@ "dev": true }, "pnpm": { - "version": "7.32.5", - "resolved": "https://registry.npmjs.org/pnpm/-/pnpm-7.32.5.tgz", - "integrity": "sha512-Q5WVGhbDVTEjyGk/njUOnOGIJPYCta8Vj7F8LW7hClMlFURSLjHjAD07G5v1Qi0lyhT4bo0QBTxVJnTunjP9FQ==", + "version": "7.33.4", + "resolved": "https://registry.npmjs.org/pnpm/-/pnpm-7.33.4.tgz", + "integrity": "sha512-xEbf/tkwHpGM/GXq5U/sDSiE6ykLPho+o71PHNRWqkVLm6dJe4G/5Pg619Ow32ovekrr7pii5qtfamujB/+1bA==", "dev": true }, "preferred-pm": { @@ -37219,6 +36896,11 @@ "winston": "2.x" }, "dependencies": { + "@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==" + }, "async": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", @@ -37405,9 +37087,9 @@ "dev": true }, "read-package-json": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.3.tgz", - "integrity": "sha512-4QbpReW4kxFgeBQ0vPAqh2y8sXEB3D4t3jsXbJKIhBiF80KT6XRo45reqwtftju5J6ru1ax06A2Gb/wM1qCOEQ==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.4.tgz", + "integrity": "sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==", "dev": true, "requires": { "glob": "^10.2.2", @@ -37436,16 +37118,16 @@ } }, "glob": { - "version": "10.2.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.2.6.tgz", - "integrity": "sha512-U/rnDpXJGF414QQQZv5uVsabTVxMSwzS5CH0p3DRCIV6ownl4f7PzGnkGmvlum2wB+9RlJWJZ6ACU1INnBqiPA==", + "version": "10.3.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.3.tgz", + "integrity": "sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==", "dev": true, "requires": { "foreground-child": "^3.1.0", "jackspeak": "^2.0.3", "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2", - "path-scurry": "^1.7.0" + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" } }, "hosted-git-info": { @@ -37470,18 +37152,18 @@ "dev": true }, "minimatch": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz", - "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, "requires": { "brace-expansion": "^2.0.1" } }, "minipass": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-6.0.2.tgz", - "integrity": "sha512-MzWSV5nYVT7mVyWCwn2o7JH13w2TBRmmSqSRCKzTw+lmft9X4z+3wjvs06Tzijo5z4W/kahUCDpRXTF+ZrmF/w==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.2.tgz", + "integrity": "sha512-eL79dXrE1q9dBbDCLg7xfn/vl7MS4F1gvJAgjJrQli/jbQWdUttuVawphqpffoIYfRdq78LHx6GP4bU/EQ2ATA==", "dev": true }, "normalize-package-data": { @@ -37563,9 +37245,9 @@ } }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true }, "type-fest": { @@ -37959,11 +37641,18 @@ } }, "rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", "requires": { - "tslib": "^2.1.0" + "tslib": "^1.9.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } } }, "safe-buffer": { @@ -38011,9 +37700,9 @@ "dev": true }, "semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "requires": { "lru-cache": "^6.0.0" }, @@ -38180,14 +37869,14 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, "sigstore": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.5.2.tgz", - "integrity": "sha512-X95v6xAAooVpn7PaB94TDmFeSO5SBfCtB1R23fvzr36WTfjtkiiyOeei979nbTjc8nzh6FSLeltQZuODsm1EjQ==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.7.0.tgz", + "integrity": "sha512-KP7QULhWdlu3hlp+jw2EvgWKlOGOY9McLj/jrchLjHNlNPK0KWIwF919cbmOp6QiKXLmPijR2qH/5KYWlbtG9Q==", "dev": true, "requires": { "@sigstore/protobuf-specs": "^0.1.0", - "make-fetch-happen": "^11.0.1", - "tuf-js": "^1.1.3" + "@sigstore/tuf": "^1.0.1", + "make-fetch-happen": "^11.0.1" }, "dependencies": { "@npmcli/fs": { @@ -38248,16 +37937,16 @@ } }, "glob": { - "version": "10.2.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.2.6.tgz", - "integrity": "sha512-U/rnDpXJGF414QQQZv5uVsabTVxMSwzS5CH0p3DRCIV6ownl4f7PzGnkGmvlum2wB+9RlJWJZ6ACU1INnBqiPA==", + "version": "10.3.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.3.tgz", + "integrity": "sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==", "dev": true, "requires": { "foreground-child": "^3.1.0", "jackspeak": "^2.0.3", "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2", - "path-scurry": "^1.7.0" + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" } }, "lru-cache": { @@ -38290,9 +37979,9 @@ } }, "minimatch": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz", - "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, "requires": { "brace-expansion": "^2.0.1" @@ -38387,12 +38076,12 @@ } }, "sinon": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-15.1.0.tgz", - "integrity": "sha512-cS5FgpDdE9/zx7no8bxROHymSlPLZzq0ChbbLk1DrxBfc+eTeBK3y8nIL+nu/0QeYydhhbLIr7ecHJpywjQaoQ==", + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-15.2.0.tgz", + "integrity": "sha512-nPS85arNqwBXaIsFCkolHjGIkFo+Oxu9vbgmBJizLAhqe6P2o3Qmj3KCUoRkfhHtvgDhZdWD3risLHAUJ8npjw==", "requires": { "@sinonjs/commons": "^3.0.0", - "@sinonjs/fake-timers": "^10.2.0", + "@sinonjs/fake-timers": "^10.3.0", "@sinonjs/samsam": "^8.0.0", "diff": "^5.1.0", "nise": "^5.1.4", @@ -38451,9 +38140,15 @@ } }, "slice-ansi": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", - "integrity": "sha512-up04hB2hR92PgjpyU3y/eg91yIBILyjVY26NvvciY3EVVPjybkMszMpXQ9QAkcS3I5rtJBDLoTxxg+qvW8c7rw==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } }, "smart-buffer": { "version": "4.2.0", @@ -38856,25 +38551,6 @@ "slice-ansi": "^4.0.0", "string-width": "^4.2.3", "strip-ansi": "^6.0.1" - }, - "dependencies": { - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true - }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } - } } }, "table-layout": { @@ -39054,9 +38730,9 @@ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" }, "tough-cookie": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz", - "integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", "requires": { "psl": "^1.1.33", "punycode": "^2.1.1", @@ -39092,9 +38768,9 @@ "dev": true }, "triple-beam": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", - "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", + "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==" }, "ts-invariant": { "version": "0.10.3", @@ -39105,9 +38781,9 @@ } }, "ts-jest": { - "version": "29.1.0", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.0.tgz", - "integrity": "sha512-ZhNr7Z4PcYa+JjMl62ir+zPiNJfXJN6E8hSLnaUKhOgqcn8vb3e537cpkd0FuAfRK3sR1LSqM1MOhliXNgOFPA==", + "version": "29.1.1", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz", + "integrity": "sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==", "dev": true, "requires": { "bs-logger": "0.x", @@ -39116,7 +38792,7 @@ "json5": "^2.2.3", "lodash.memoize": "4.x", "make-error": "1.x", - "semver": "7.x", + "semver": "^7.5.3", "yargs-parser": "^21.0.1" }, "dependencies": { @@ -39156,9 +38832,9 @@ } }, "tslib": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.2.tgz", - "integrity": "sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA==" + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==" }, "tsutils": { "version": "3.21.0", @@ -39178,14 +38854,14 @@ } }, "tuf-js": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.6.tgz", - "integrity": "sha512-CXwFVIsXGbVY4vFiWF7TJKWmlKJAT8TWkH4RmiohJRcDJInix++F0dznDmoVbtJNzZ8yLprKUG4YrDIhv3nBMg==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.7.tgz", + "integrity": "sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==", "dev": true, "requires": { "@tufjs/models": "1.0.4", "debug": "^4.3.4", - "make-fetch-happen": "^11.1.0" + "make-fetch-happen": "^11.1.1" }, "dependencies": { "@npmcli/fs": { @@ -39246,16 +38922,16 @@ } }, "glob": { - "version": "10.2.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.2.6.tgz", - "integrity": "sha512-U/rnDpXJGF414QQQZv5uVsabTVxMSwzS5CH0p3DRCIV6ownl4f7PzGnkGmvlum2wB+9RlJWJZ6ACU1INnBqiPA==", + "version": "10.3.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.3.tgz", + "integrity": "sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==", "dev": true, "requires": { "foreground-child": "^3.1.0", "jackspeak": "^2.0.3", "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2", - "path-scurry": "^1.7.0" + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" } }, "lru-cache": { @@ -39288,9 +38964,9 @@ } }, "minimatch": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz", - "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, "requires": { "brace-expansion": "^2.0.1" @@ -39764,17 +39440,16 @@ } }, "which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", "dev": true, "requires": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" + "has-tostringtag": "^1.0.0" } }, "wide-align": { @@ -39795,9 +39470,9 @@ } }, "winston": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.8.2.tgz", - "integrity": "sha512-MsE1gRx1m5jdTTO9Ld/vND4krP2To+lgDoMEHGGa4HIlAUyXJtfc7CxQcGXVyz2IBpw5hbFkj2b/AtUdQwyRew==", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.10.0.tgz", + "integrity": "sha512-nT6SIDaE9B7ZRO0u3UvdrimG0HkB7dSTAgInQnNR2SOPJ4bvq5q79+pXLftKmP52lJGW15+H5MCK0nM9D3KB/g==", "requires": { "@colors/colors": "1.5.0", "@dabh/diagnostics": "^2.0.2", @@ -39812,6 +39487,11 @@ "winston-transport": "^4.5.0" }, "dependencies": { + "@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==" + }, "readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", @@ -39847,9 +39527,11 @@ } }, "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "peer": true }, "wordwrap": { "version": "1.0.0", @@ -40059,9 +39741,9 @@ "integrity": "sha512-/0V5q0WbslqnwP91tirOvldvYISzaqhClxzyUKXYxs07yUILIs5jx/k6CFe8bvKSkds5w+eiOqta39Wk3WxdcQ==" }, "yeoman-environment": { - "version": "3.18.3", - "resolved": "https://registry.npmjs.org/yeoman-environment/-/yeoman-environment-3.18.3.tgz", - "integrity": "sha512-OF5C87D7QUDOe4Lo2QucPnqFz0V3dNvC7D5Up6kVxUZKrY3LtNM7JIFAb/rhfEp/lKlZ28Olrb/BYFTDHcJ2og==", + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/yeoman-environment/-/yeoman-environment-3.19.3.tgz", + "integrity": "sha512-/+ODrTUHtlDPRH9qIC0JREH8+7nsRcjDl3Bxn2Xo/rvAaVvixH5275jHwg0C85g4QsF4P6M2ojfScPPAl+pLAg==", "dev": true, "requires": { "@npmcli/arborist": "^4.0.4", @@ -40094,6 +39776,7 @@ "pacote": "^12.0.2", "preferred-pm": "^3.0.3", "pretty-bytes": "^5.3.0", + "readable-stream": "^4.3.0", "semver": "^7.1.3", "slash": "^3.0.0", "strip-ansi": "^6.0.0", @@ -40102,12 +39785,28 @@ "untildify": "^4.0.0" }, "dependencies": { + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, "commander": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.1.0.tgz", "integrity": "sha512-pRxBna3MJe6HKnBGsDyMv8ETbptw3axEdYHoqNh7gu5oDcew8fs0xnivZGm06Ogk8zGAJ9VX+OPEr2GXEQK4dg==", "dev": true }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true + }, "globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -40122,6 +39821,12 @@ "slash": "^3.0.0" } }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, "log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -40131,6 +39836,28 @@ "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" } + }, + "readable-stream": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.2.tgz", + "integrity": "sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==", + "dev": true, + "requires": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } } } }, @@ -40167,9 +39894,9 @@ } }, "@npmcli/git": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.0.4.tgz", - "integrity": "sha512-5yZghx+u5M47LghaybLCkdSyFzV/w4OuH12d96HO389Ik9CDsLaDZJVynSGGVJOLn6gy/k7Dz5XYcplM3uxXRg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.1.0.tgz", + "integrity": "sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==", "dev": true, "requires": { "@npmcli/promise-spawn": "^6.0.0", @@ -40192,16 +39919,6 @@ "npm-normalize-package-bin": "^3.0.0" } }, - "@npmcli/move-file": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", - "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", - "dev": true, - "requires": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - } - }, "@npmcli/node-gyp": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", @@ -40279,16 +39996,16 @@ }, "dependencies": { "glob": { - "version": "10.2.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.2.6.tgz", - "integrity": "sha512-U/rnDpXJGF414QQQZv5uVsabTVxMSwzS5CH0p3DRCIV6ownl4f7PzGnkGmvlum2wB+9RlJWJZ6ACU1INnBqiPA==", + "version": "10.3.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.3.tgz", + "integrity": "sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==", "dev": true, "requires": { "foreground-child": "^3.1.0", "jackspeak": "^2.0.3", "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2", - "path-scurry": "^1.7.0" + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" } } } @@ -40367,138 +40084,32 @@ "dev": true }, "make-fetch-happen": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", - "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", "dev": true, "requires": { "agentkeepalive": "^4.2.1", - "cacache": "^16.1.0", - "http-cache-semantics": "^4.1.0", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", "http-proxy-agent": "^5.0.0", "https-proxy-agent": "^5.0.0", "is-lambda": "^1.0.1", "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "negotiator": "^0.6.3", "promise-retry": "^2.0.1", "socks-proxy-agent": "^7.0.0", - "ssri": "^9.0.0" - }, - "dependencies": { - "@npmcli/fs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", - "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", - "dev": true, - "requires": { - "@gar/promisify": "^1.1.3", - "semver": "^7.3.5" - } - }, - "cacache": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", - "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", - "dev": true, - "requires": { - "@npmcli/fs": "^2.1.0", - "@npmcli/move-file": "^2.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "infer-owner": "^1.0.4", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11", - "unique-filename": "^2.0.0" - } - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - } - }, - "minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "ssri": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", - "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", - "dev": true, - "requires": { - "minipass": "^3.1.1" - } - }, - "unique-filename": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", - "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", - "dev": true, - "requires": { - "unique-slug": "^3.0.0" - } - }, - "unique-slug": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", - "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } - } + "ssri": "^10.0.0" } }, "minimatch": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz", - "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, "requires": { "brace-expansion": "^2.0.1" @@ -40511,38 +40122,28 @@ "dev": true }, "minipass-fetch": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", - "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.3.tgz", + "integrity": "sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ==", "dev": true, "requires": { "encoding": "^0.1.13", - "minipass": "^3.1.6", + "minipass": "^5.0.0", "minipass-sized": "^1.0.3", "minizlib": "^2.1.2" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - } } }, "node-gyp": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.3.1.tgz", - "integrity": "sha512-4Q16ZCqq3g8awk6UplT7AuxQ35XN4R/yf/+wSAwcBUAjg7l58RTactWaP8fIDTi0FzI7YcVLujwExakZlfWkXg==", + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.0.tgz", + "integrity": "sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg==", "dev": true, "requires": { "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", "glob": "^7.1.4", "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", + "make-fetch-happen": "^11.0.3", "nopt": "^6.0.0", "npmlog": "^6.0.0", "rimraf": "^3.0.2", @@ -40641,43 +40242,6 @@ "minizlib": "^2.1.2", "npm-package-arg": "^10.0.0", "proc-log": "^3.0.0" - }, - "dependencies": { - "make-fetch-happen": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", - "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", - "dev": true, - "requires": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", - "http-cache-semantics": "^4.1.1", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^10.0.0" - } - }, - "minipass-fetch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.3.tgz", - "integrity": "sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ==", - "dev": true, - "requires": { - "encoding": "^0.1.13", - "minipass": "^5.0.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - } - } } }, "npmlog": { @@ -40818,12 +40382,6 @@ "requires": { "isexe": "^2.0.0" } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true } } }, diff --git a/packages/contentstack-auth/.gitignore b/packages/contentstack-auth/.gitignore index 4e1d11fa26..3182a9a207 100644 --- a/packages/contentstack-auth/.gitignore +++ b/packages/contentstack-auth/.gitignore @@ -8,4 +8,5 @@ node_modules .DS_Store coverage -.talismanrc \ No newline at end of file +.talismanrc +.env diff --git a/packages/contentstack-auth/.mocharc.json b/packages/contentstack-auth/.mocharc.json index ef6efe7ed4..b90d7f028c 100644 --- a/packages/contentstack-auth/.mocharc.json +++ b/packages/contentstack-auth/.mocharc.json @@ -1,12 +1,12 @@ { - "require": [ - "test/helpers/init.js", - "ts-node/register", - "source-map-support/register" - ], - "watch-extensions": [ - "ts" - ], - "recursive": true, - "timeout": 5000 - } \ No newline at end of file + "require": [ + "test/helpers/init.js", + "ts-node/register", + "source-map-support/register" + ], + "watch-extensions": [ + "ts" + ], + "recursive": true, + "timeout": 5000 +} \ No newline at end of file diff --git a/packages/contentstack-auth/README.md b/packages/contentstack-auth/README.md index ad6315c043..3ca095069f 100644 --- a/packages/contentstack-auth/README.md +++ b/packages/contentstack-auth/README.md @@ -18,7 +18,7 @@ $ npm install -g @contentstack/cli-auth $ csdx COMMAND running command... $ csdx (--version) -@contentstack/cli-auth/1.3.10 darwin-arm64 node-v18.16.0 +@contentstack/cli-auth/1.3.12 darwin-arm64 node-v20.3.1 $ csdx --help [COMMAND] USAGE $ csdx COMMAND diff --git a/packages/contentstack-auth/env.example b/packages/contentstack-auth/env.example new file mode 100644 index 0000000000..664bac1fca --- /dev/null +++ b/packages/contentstack-auth/env.example @@ -0,0 +1,8 @@ +BRANCH_ENABLED_API_KEY +BRANCH_ENABLED_MGMT_TOKEN +BRANCH_DISABLED_API_KEY +BRANCH_DISABLED_MGMT_TOKEN +BRANCH_ENABLED_DELIVERY_TOKEN +BRANCH_DISABLED_DELIVERY_TOKEN +BRANCH_ENABLED_ENVIRONMENT +BRANCH_DISABLED_ENVIRONMENT diff --git a/packages/contentstack-auth/messages/index.json b/packages/contentstack-auth/messages/index.json index 6759718937..94bfa2857c 100644 --- a/packages/contentstack-auth/messages/index.json +++ b/packages/contentstack-auth/messages/index.json @@ -1,4 +1,5 @@ { + "CLI_AUTH_LOGIN_ASK_CHANNEL_FOR_OTP": "Please select OTP channel", "CLI_AUTH_LOGIN_ENTER_EMAIL_ADDRESS": "Enter your email address", "CLI_AUTH_LOGIN_ENTER_PASSWORD": "Enter your password", "CLI_AUTH_LOGIN_SUCCESS": "Successfully logged in!!", diff --git a/packages/contentstack-auth/package.json b/packages/contentstack-auth/package.json index d3b4295e99..2b931ec9bc 100644 --- a/packages/contentstack-auth/package.json +++ b/packages/contentstack-auth/package.json @@ -1,7 +1,7 @@ { "name": "@contentstack/cli-auth", "description": "Contentstack CLI plugin for authentication activities", - "version": "1.3.10", + "version": "1.3.12", "author": "Contentstack", "bugs": "https://github.com/contentstack/cli/issues", "scripts": { @@ -22,8 +22,8 @@ "test:unit:report": "nyc --extension .ts mocha --forbid-only \"test/unit/**/*.test.ts\"" }, "dependencies": { - "@contentstack/cli-command": "^1.2.9", - "@contentstack/cli-utilities": "^1.4.5", + "@contentstack/cli-command": "~1.2.11", + "@contentstack/cli-utilities": "~1.5.1", "chalk": "^4.0.0", "debug": "^4.1.1", "inquirer": "8.2.4", @@ -85,5 +85,15 @@ "auth:tokens:remove": "RMTKN" } }, + "csdxConfig": { + "shortCommandName": { + "auth:login": "LOGIN", + "auth:logout": "LOGOUT", + "auth:whoami": "WHOMAI", + "auth:tokens": "LSTTKN", + "auth:tokens:add": "ADDTKN", + "auth:tokens:remove": "RMVTKN" + } + }, "repository": "contentstack/cli" -} \ No newline at end of file +} diff --git a/packages/contentstack-auth/src/commands/auth/tokens/add.ts b/packages/contentstack-auth/src/commands/auth/tokens/add.ts index 40d9396c7b..63a9c9f943 100644 --- a/packages/contentstack-auth/src/commands/auth/tokens/add.ts +++ b/packages/contentstack-auth/src/commands/auth/tokens/add.ts @@ -2,16 +2,14 @@ import { Command } from '@contentstack/cli-command'; import { logger, cliux, - CLIError, configHandler, printFlagDeprecation, flags, - managementSDKClient, FlagInput, + HttpClient, + messageHandler, } from '@contentstack/cli-utilities'; import { askTokenType } from '../../../utils/interactive'; -import { tokenValidation } from '../../../utils'; - export default class TokensAddCommand extends Command { static description = 'Adds management/delivery tokens to your session to use it with other CLI commands'; @@ -130,39 +128,6 @@ export default class TokensAddCommand extends Command { token = await cliux.inquire({ type: 'input', message: 'CLI_AUTH_TOKENS_ADD_ENTER_TOKEN', name: 'token' }); } - const managementAPIClient = await managementSDKClient({ host: this.cmaHost }); - - let doBranchesExistInPlan: boolean = false; - - if (isManagement && apiKey && token) { - await managementAPIClient - .stack({ api_key: apiKey, management_token: token }) - .branch() - .query() - .find() - .then(() => (doBranchesExistInPlan = true)) - .catch((err) => { - if (err.errorCode && err.errorMessage && branch) { - throw new Error(err.errorMessage); - } - }); - } else { - if (!apiKey) { - throw new Error('Api key is required'); - } - if (!token) { - throw new Error('Token is required'); - } - } - - if (doBranchesExistInPlan && !branch) { - branch = await cliux.inquire({ - type: 'input', - message: 'CLI_AUTH_ENTER_BRANCH', - name: 'branch', - }); - } - if (isDelivery && !environment) { environment = await cliux.inquire({ type: 'input', @@ -171,31 +136,18 @@ export default class TokensAddCommand extends Command { }); } - let tokenValidationResult; - - if (type === 'delivery') { - branch = branch || 'main'; - tokenValidationResult = await tokenValidation.validateDeliveryToken( - this.deliveryAPIClient, - apiKey, - token, - environment, - this.region.name, - this.cdaHost, - branch, - ); - } else if (type === 'management') { - tokenValidationResult = await tokenValidation.validateManagementToken( - managementAPIClient, - apiKey, - token, - doBranchesExistInPlan ? branch : null, - ); - } - if (!tokenValidationResult.valid) { - throw new CLIError(tokenValidationResult.message); - } + if (type === 'management') { + // FIXME - Once the SDK refresh token issue is resolved, need to revert this back to SDK call + const httpClient = new HttpClient({ headers: { api_key: apiKey, authorization: token } }); + const response = (await httpClient.get(`https://${this.cmaHost}/v3/environments?limit=1`)).data; + + if (response?.error_code === 105) { + throw new Error(messageHandler.parse('CLI_AUTH_TOKENS_VALIDATION_INVALID_MANAGEMENT_TOKEN')); + } else if (response?.error_message) { + throw new Error(response.error_message); + } + } if (isManagement) { configHandler.set(`${configKeyTokens}.${alias}`, { token, apiKey, type }); } else { @@ -210,7 +162,7 @@ export default class TokensAddCommand extends Command { } catch (error) { logger.error('token add error', error.message); cliux.print('CLI_AUTH_TOKENS_ADD_FAILED', { color: 'yellow' }); - cliux.print(error.message.message ? error.message.message : error.message, { color: 'red' }); + cliux.error(error.message.message ? error.message.message : error.message); } } } diff --git a/packages/contentstack-auth/src/utils/tokens-validation.ts b/packages/contentstack-auth/src/utils/tokens-validation.ts index 1ffff1738c..a2ed06add7 100644 --- a/packages/contentstack-auth/src/utils/tokens-validation.ts +++ b/packages/contentstack-auth/src/utils/tokens-validation.ts @@ -1,66 +1,5 @@ import { messageHandler, logger } from '@contentstack/cli-utilities'; -/** - * Validate delivery token - * @param contentStackClient - * @param apiKey - * @param deliveryToken - * @param environment - * @param region - * @returns - */ -export const validateDeliveryToken = async ( - contentStackClient: any, - apiKey: string, - deliveryToken: string, - environment: string, - region: string, - host: string, - branch: string, -): Promise => { - let result: { valid: boolean; message: string }; - try { - const regionMap = { - EU: 'eu', - NA: 'us', - AZURE_NA: 'azure-na', - AZURE_EU: 'azure-eu', - }; - - const stack = contentStackClient.Stack({ - api_key: apiKey, - delivery_token: deliveryToken, - environment, - region: regionMap[region], - host, - branch, - }); - - const parsedHost = host.replace(/^https?:\/\//, ''); - stack.setHost(parsedHost); - const deliveryTokenResult = await stack.getContentTypes({ limit: 1 }); - - logger.debug('delivery token validation result', deliveryTokenResult); - if (deliveryTokenResult?.content_types) { - result = { valid: true, message: deliveryTokenResult }; - } else { - result = { valid: false, message: messageHandler.parse('CLI_AUTH_TOKENS_VALIDATION_INVALID_DELIVERY_TOKEN') }; - } - } catch (error) { - logger.debug('validate delivery token error', error); - if (error.error_code === 109) { - result = { valid: false, message: messageHandler.parse('CLI_AUTH_TOKENS_VALIDATION_INVALID_API_KEY') }; - } else if (error.error_code === 141) { - result = { valid: false, message: messageHandler.parse('CLI_AUTH_TOKENS_VALIDATION_INVALID_ENVIRONMENT_NAME') }; - } else if (error?.error_code) { - throw new Error(error?.error_message); - } else { - result = { valid: false, message: messageHandler.parse('CLI_AUTH_TOKENS_VALIDATION_INVALID_DELIVERY_TOKEN') }; - } - } - return result; -}; - /** * Validate environment * @param contentStackClient @@ -75,7 +14,7 @@ export const validateEnvironment = async ( ): Promise => { let result: { valid: boolean; message: string }; try { - const validationResult = await contentStackClient.stack({ api_key: apiKey }).environment(environment).fetch(); + const validationResult = await contentStackClient.Stack({ api_key: apiKey }).environment(environment).fetch(); logger.debug('environment validation result', validationResult); if (validationResult.name === environment) { result = { valid: true, message: validationResult }; @@ -89,46 +28,6 @@ export const validateEnvironment = async ( return result; }; -/** - * Validate management token - * @param contentStackClient - * @param apiKey - * @param managementToken - * @returns { valid: boolean; message: any } - * Note: Fetching one content type using the management token to check whether it is valid or not - */ -export const validateManagementToken = async ( - contentStackClient: any, - apiKey: string, - managementToken: string, - branch: string, -): Promise => { - let result: { valid: boolean; message: string }; - try { - const validationResuslt = await contentStackClient.axiosInstance.get('/content_types?limit=1&include_branch=true', { - headers: { api_key: apiKey, authorization: managementToken, branch }, - }); - - logger.debug('Management validation result', validationResuslt); - if (validationResuslt.status === 200) { - result = { valid: true, message: validationResuslt }; - } else { - result = { valid: false, message: messageHandler.parse('CLI_AUTH_TOKENS_VALIDATION_INVALID_MANAGEMENT_TOKEN') }; - } - } catch (error) { - logger.error('Failed to validate management token', error); - if (error.response && error.response.status === 401) { - result = { valid: false, message: messageHandler.parse('CLI_AUTH_TOKENS_VALIDATION_INVALID_MANAGEMENT_TOKEN') }; - } - if (error?.response?.data) { - throw new Error(error.response.data?.error_message); - } else { - result = { valid: false, message: messageHandler.parse('CLI_AUTH_TOKENS_VALIDATION_INVALID_API_KEY') }; - } - } - return result; -}; - /** * Validate API key * @param contentStackClient diff --git a/packages/contentstack-auth/test/unit/commands/tokens-add.test.ts b/packages/contentstack-auth/test/unit/commands/tokens-add.test.ts index 3a2ce24850..6c9cb45ac7 100644 --- a/packages/contentstack-auth/test/unit/commands/tokens-add.test.ts +++ b/packages/contentstack-auth/test/unit/commands/tokens-add.test.ts @@ -1,9 +1,12 @@ import { expect } from 'chai'; import * as sinon from 'sinon'; -import { configHandler } from '@contentstack/cli-utilities'; +import { configHandler, cliux, logger } from '@contentstack/cli-utilities'; import TokensAddCommand from '../../../src/commands/auth/tokens/add'; import { tokenValidation } from '../../../src/utils'; -import { cliux } from '@contentstack/cli-utilities'; +import { stub, assert } from 'sinon'; +import { config as dotenvConfig } from 'dotenv'; + +dotenvConfig(); const config = configHandler; const configKeyTokens = 'tokens'; @@ -13,12 +16,14 @@ function resetConfig() { config.delete(`${configKeyTokens}.test-management-token`); config.delete(`${configKeyTokens}.test-management-token2`); config.delete(`${configKeyTokens}.test-api-key-token`); + config.delete(`${configKeyTokens}.newToken`); } describe('Tokens Add Command', () => { let apiKeyValidationStub; let deliveryTokenValidationStub; let managementTokenValidationStub; let environmentTokenValidationStub; + let printStub; const validAPIKey = 'adasdfagsf'; const validDeliveryToken = 'cdae3493fkdflklssw'; const validmanagementToken = 'cmajhsd98939482'; @@ -26,6 +31,7 @@ describe('Tokens Add Command', () => { before(function () { resetConfig(); + printStub = stub(cliux, 'print'); apiKeyValidationStub = sinon .stub(tokenValidation, 'validateAPIKey') .callsFake(function (client: any, apiKey: string): Promise { @@ -66,37 +72,255 @@ describe('Tokens Add Command', () => { deliveryTokenValidationStub.restore(); managementTokenValidationStub.restore(); environmentTokenValidationStub.restore(); + printStub.restore(); resetConfig(); }); it('Add a token with valid api key, should be added scuccessfully', async function () { const inquireStub = sinon.stub(cliux, 'inquire').resolves(validEnvironment); - await TokensAddCommand.run(['-a', 'test-api-key-token', '-k', validAPIKey, '-d', '-t', validDeliveryToken]); + await TokensAddCommand.run([ + '--alias', + 'test-api-key-token', + '--stack-api-key', + validAPIKey, + '--delivery', + '--token', + validDeliveryToken, + ]); expect(Boolean(config.get(`${configKeyTokens}.test-api-key-token`))).to.be.true; inquireStub.restore(); }); it('Add a valid management token, should be added scuccessfully', async function () { - await TokensAddCommand.run(['-a', 'test-management-token', '-k', validAPIKey, '-m', '-t', validmanagementToken]); + await TokensAddCommand.run([ + '--alias', + 'test-management-token', + '--stack-api-key', + validAPIKey, + '--management', + '--token', + validmanagementToken, + ]); expect(Boolean(config.get(`${configKeyTokens}.test-management-token`))).to.be.true; }); it('Add a invalid management token, should fail to add', async function () { - await TokensAddCommand.run(['-a', 'test-management-token2', '-k', validAPIKey, '-m', '-t', 'invalid']); + await TokensAddCommand.run([ + '--alias', + 'test-management-token2', + '--stack-api-key', + validAPIKey, + '--management', + '--token', + 'invalid', + ]); expect(Boolean(config.get(`${configKeyTokens}.test-management-token2`))).to.be.false; }); it('Replace an existing token, should prompt for confirmation', async function () { const inquireStub = sinon.stub(cliux, 'inquire').resolves(true); - await TokensAddCommand.run(['-a', 'test-management-token', '-k', validAPIKey, '-m', '-t', 'invalid']); + await TokensAddCommand.run([ + '--alias', + 'test-management-token', + '--stack-api-key', + validAPIKey, + '--management', + '--token', + 'invalid', + ]); expect(inquireStub.calledOnce).to.be.true; inquireStub.restore(); }); it('Add a token without alias, should prompt for alias', async function () { const inquireStub = sinon.stub(cliux, 'inquire').resolves(true); - await TokensAddCommand.run(['-k', validAPIKey, '-m', '-t', 'invalid']); + await TokensAddCommand.run(['--stack-api-key', validAPIKey, '--management', '--token', 'invalid']); expect(inquireStub.calledOnce).to.be.true; inquireStub.restore(); }); }); + +describe('Management and Delivery token flags', () => { + let inquireStub; + let errorStub; + let successStub; + let printStub; + + beforeEach(() => { + inquireStub = stub(cliux, 'inquire'); + errorStub = stub(logger, 'error'); + successStub = stub(cliux, 'success'); + printStub = stub(cliux, 'print'); + resetConfig(); + }); + + afterEach(() => { + inquireStub.restore(); + errorStub.restore(); + successStub.restore(); + printStub.restore(); + resetConfig(); + }); + + describe('- Management token', () => { + it('Should ask for a prompt to select type of token to add', async () => { + await TokensAddCommand.run([]); + assert.calledWith(inquireStub, { + type: 'list', + name: 'tokenType', + message: 'CLI_SELECT_TOKEN_TYPE', + choices: [ + { name: 'Management Token', value: 'management' }, + { name: 'Delivery Token', value: 'delivery' }, + ], + }); + }); + + it('Should ask for api key ', async () => { + await TokensAddCommand.run(['--management', '--alias', 'newToken']); + assert.calledWith(inquireStub, { type: 'input', message: 'CLI_AUTH_TOKENS_ADD_ENTER_API_KEY', name: 'apiKey' }); + }); + it('Should ask for api key ', async () => { + await TokensAddCommand.run(['--management', '--alias', 'newToken']); + assert.calledWith(inquireStub, { type: 'input', message: 'CLI_AUTH_TOKENS_ADD_ENTER_API_KEY', name: 'apiKey' }); + }); + it('Invalid API key should throw error', async () => { + await TokensAddCommand.run(['--management', '--alias', 'newToken', '--stack-api-key', 'asdf', '--token', 'asdf']); + assert.calledTwice(errorStub); + }); + it('Throw error if api key is kept empty', async () => { + await TokensAddCommand.run(['--management', '--alias', 'newToken', '--stack-api-key', ' ', '--token', 'asdf']); + assert.calledTwice(errorStub); + }); + it('Throw error if token is kept empty', async () => { + await TokensAddCommand.run([ + '--management', + '--alias', + 'newToken', + '--stack-api-key', + process.env.BRANCH_ENABLED_API_KEY!, + '--token', + '', + ]); + assert.calledWith(errorStub); + }); + it('Should add a token successfully after all the values are passed with stack having branches enabled', async () => { + await TokensAddCommand.run([ + '--management', + '--alias', + 'newToken', + '--stack-api-key', + process.env.BRANCH_ENABLED_API_KEY!, + '--token', + process.env.BRANCH_ENABLED_MGMT_TOKEN!, + '--branch', + 'main', + ]); + assert.calledWith(successStub, 'CLI_AUTH_TOKENS_ADD_SUCCESS'); + }); + it('Should add a token successfully for stack with branches disabled after all the values are passed', async () => { + await TokensAddCommand.run([ + '--management', + '--alias', + 'newToken', + '--stack-api-key', + process.env.BRANCH_DISABLED_API_KEY!, + '--token', + process.env.BRANCH_DISABLED_MGMT_TOKEN!, + ]); + assert.calledWith(successStub, 'CLI_AUTH_TOKENS_ADD_SUCCESS'); + }); + it('Should throw an error if branch flag is passed along with stack not having branches enabled', async () => { + await TokensAddCommand.run([ + '--management', + '--alias', + 'newToken', + '--stack-api-key', + process.env.BRANCH_DISABLED_API_KEY!, + '--token', + process.env.BRANCH_DISABLED_MGMT_TOKEN!, + '--branch', + 'main', + ]); + assert.calledOnce(errorStub); + }); + }); + + describe('- Delivery token', () => { + it('Should ask for api key', async () => { + await TokensAddCommand.run(['--delivery', '--alias', 'newToken']); + assert.calledWith(inquireStub, { type: 'input', message: 'CLI_AUTH_TOKENS_ADD_ENTER_API_KEY', name: 'apiKey' }); + }); + it('Should ask for delivery token', async () => { + await TokensAddCommand.run([ + '--delivery', + '--alias', + 'newToken', + '--stack-api-key', + process.env.BRANCH_ENABLED_API_KEY!, + ]); + assert.calledWith(inquireStub, { type: 'input', message: 'CLI_AUTH_TOKENS_ADD_ENTER_TOKEN', name: 'token' }); + }); + it('Should ask for environment', async () => { + await TokensAddCommand.run([ + '--delivery', + '--alias', + 'newToken', + '--stack-api-key', + process.env.BRANCH_ENABLED_API_KEY!, + '--token', + process.env.BRANCH_ENABLED_DELIVERY_TOKEN!, + ]); + assert.calledWith(inquireStub, { + type: 'input', + message: 'CLI_AUTH_TOKENS_ADD_ENTER_ENVIRONMENT', + name: 'env', + }); + }); + it('Should add a new token if all the values are set correctly for stack with branches enabled', async () => { + await TokensAddCommand.run([ + '--delivery', + '--alias', + 'newToken', + '--stack-api-key', + process.env.BRANCH_ENABLED_API_KEY!, + '--token', + process.env.BRANCH_ENABLED_DELIVERY_TOKEN!, + '--environment', + process.env.BRANCH_ENABLED_ENVIRONMENT!, + ]); + assert.calledWith(successStub, 'CLI_AUTH_TOKENS_ADD_SUCCESS'); + }); + it('Should add a new token if all the values are set correctly for stack with branches disabled', async () => { + await TokensAddCommand.run([ + '--delivery', + '--alias', + 'newToken', + '--stack-api-key', + process.env.BRANCH_DISABLED_API_KEY!, + '--token', + process.env.BRANCH_DISABLED_DELIVERY_TOKEN!, + '--environment', + process.env.BRANCH_DISABLED_ENVIRONMENT!, + ]); + assert.calledWith(successStub, 'CLI_AUTH_TOKENS_ADD_SUCCESS'); + }); + it('Should throw and error for stack with branches disabled', async () => { + let branch = 'my-branch'; + await TokensAddCommand.run([ + '--delivery', + '--alias', + 'newToken', + '--stack-api-key', + process.env.BRANCH_DISABLED_API_KEY!, + '--token', + process.env.BRANCH_DISABLED_DELIVERY_TOKEN!, + '--environment', + process.env.BRANCH_DISABLED_ENVIRONMENT!, + '--branch', + branch, + ]); + assert.calledOnce(errorStub); + }); + }); +}); diff --git a/packages/contentstack-bootstrap/README.md b/packages/contentstack-bootstrap/README.md index 0f8568196f..993ef9d09c 100644 --- a/packages/contentstack-bootstrap/README.md +++ b/packages/contentstack-bootstrap/README.md @@ -15,7 +15,7 @@ $ npm install -g @contentstack/cli-cm-bootstrap $ csdx COMMAND running command... $ csdx (--version) -@contentstack/cli-cm-bootstrap/1.4.10 darwin-arm64 node-v18.16.0 +@contentstack/cli-cm-bootstrap/1.4.14 darwin-arm64 node-v20.3.1 $ csdx --help [COMMAND] USAGE $ csdx COMMAND @@ -45,9 +45,10 @@ Bootstrap contentstack apps ``` USAGE $ csdx cm:bootstrap [--app-name ] [--project-dir ] [-k | --org | -n ] [-y - ] + ] [-a ] FLAGS + -a, --alias= Alias of the management token -k, --stack-api-key= Provide stack API key to seed content -n, --stack-name= Name of a new stack that will be created. -y, --yes= [Optional] Skip stack confirmation diff --git a/packages/contentstack-bootstrap/package.json b/packages/contentstack-bootstrap/package.json index 499676c4c7..ba1c090620 100644 --- a/packages/contentstack-bootstrap/package.json +++ b/packages/contentstack-bootstrap/package.json @@ -1,7 +1,7 @@ { "name": "@contentstack/cli-cm-bootstrap", "description": "Bootstrap contentstack apps", - "version": "1.4.11", + "version": "1.4.14", "author": "Contentstack", "bugs": "https://github.com/contentstack/cli/issues", "scripts": { @@ -17,9 +17,9 @@ "test:report": "nyc --reporter=lcov mocha \"test/**/*.test.js\"" }, "dependencies": { - "@contentstack/cli-cm-seed": "^1.4.11", - "@contentstack/cli-command": "^1.2.9", - "@contentstack/cli-utilities": "^1.4.5", + "@contentstack/cli-cm-seed": "~1.4.14", + "@contentstack/cli-command": "~1.2.11", + "@contentstack/cli-utilities": "~1.5.1", "inquirer": "8.2.4", "mkdirp": "^1.0.4", "tar": "^6.1.13" @@ -35,7 +35,7 @@ "eslint-config-oclif": "^4.0.0", "eslint-config-oclif-typescript": "^0.1.0", "globby": "^10.0.2", - "mocha": "^10.0.0", + "mocha": "10.1.0", "nyc": "^15.1.0", "oclif": "^3.8.1", "rimraf": "^2.7.1", @@ -73,4 +73,4 @@ } }, "repository": "contentstack/cli" -} +} \ No newline at end of file diff --git a/packages/contentstack-bootstrap/src/bootstrap/index.ts b/packages/contentstack-bootstrap/src/bootstrap/index.ts index d5a49a0b4e..ba33cb3dbc 100644 --- a/packages/contentstack-bootstrap/src/bootstrap/index.ts +++ b/packages/contentstack-bootstrap/src/bootstrap/index.ts @@ -26,6 +26,8 @@ export interface SeedParams { org?: string; stackName?: string; yes?: string; + managementTokenAlias?: string | undefined; + managementToken?: string | undefined; } /** @@ -62,7 +64,7 @@ export default class Bootstrap { } async run(): Promise { - cliux.loader(messageHandler.parse('CLI_BOOTSTRAP_START_CLONE_APP')) + cliux.loader(messageHandler.parse('CLI_BOOTSTRAP_START_CLONE_APP')); try { await this.ghClient.getLatest(this.cloneDirectory); @@ -79,21 +81,25 @@ export default class Bootstrap { // seed plugin start try { - const cmd = ['--repo', this.appConfig.stack] + const cmd = ['--repo', this.appConfig.stack]; if (this.options.seedParams.stackAPIKey) { - cmd.push('--stack-api-key', this.options.seedParams.stackAPIKey) + cmd.push('--stack-api-key', this.options.seedParams.stackAPIKey); } if (this.options.seedParams.org) { - cmd.push('--org', this.options.seedParams.org) + cmd.push('--org', this.options.seedParams.org); } if (this.options.seedParams.stackName) { - cmd.push('-n', this.options.seedParams.stackName) + cmd.push('-n', this.options.seedParams.stackName); } if (this.options.seedParams.yes) { cmd.push('-y', this.options.seedParams.yes); } + if (this.options.seedParams.managementTokenAlias) { + cmd.push('--alias', this.options.seedParams.managementTokenAlias); + } + const result = await ContentStackSeed.run(cmd); - if ( result && result.api_key) { + if (result && result.api_key) { await setupEnvironments( this.managementAPIClient, result.api_key, @@ -101,13 +107,14 @@ export default class Bootstrap { this.cloneDirectory, this.region, this.options.livePreviewEnabled as boolean, + this.options.seedParams.managementToken as string, ); } else { throw new Error(messageHandler.parse('CLI_BOOTSTRAP_NO_API_KEY_FOUND')); } - cliux.print(messageHandler.parse('CLI_BOOTSTRAP_SUCCESS')) + cliux.print(messageHandler.parse('CLI_BOOTSTRAP_SUCCESS')); } catch (error) { - cliux.error(messageHandler.parse('CLI_BOOTSTRAP_STACK_CREATION_FAILED', this.appConfig.stack)) + cliux.error(messageHandler.parse('CLI_BOOTSTRAP_STACK_CREATION_FAILED', this.appConfig.stack)); } } } diff --git a/packages/contentstack-bootstrap/src/bootstrap/utils.ts b/packages/contentstack-bootstrap/src/bootstrap/utils.ts index 6c6e88f9f8..351b1aa638 100644 --- a/packages/contentstack-bootstrap/src/bootstrap/utils.ts +++ b/packages/contentstack-bootstrap/src/bootstrap/utils.ts @@ -26,8 +26,13 @@ export const setupEnvironments = async ( clonedDirectory: string, region: any, livePreviewEnabled: boolean, + managementToken?: string, ) => { - const environmentResult = await managementAPIClient.stack({ api_key }).environment().query().find(); + const environmentResult = await managementAPIClient + .stack({ api_key, management_token: managementToken }) + .environment() + .query() + .find(); if (Array.isArray(environmentResult.items) && environmentResult.items.length > 0) { for (const environment of environmentResult.items) { if (environment.name) { @@ -49,22 +54,30 @@ export const setupEnvironments = async ( ], }, }; - try { - const tokenResult = await managementAPIClient.stack({ api_key }).deliveryToken().create(body); - if (tokenResult.token) { - const environmentVariables: EnviornmentVariables = { - api_key, - deliveryToken: tokenResult.token, - environment: environment.name, - livePreviewEnabled, - }; - await envFileHandler(appConfig.appConfigKey || '', environmentVariables, clonedDirectory, region, livePreviewEnabled); - } else { - cliux.print(messageHandler.parse('CLI_BOOTSTRAP_APP_FAILED_TO_CREATE_TOKEN_FOR_ENV', environment.name)); + if (!managementToken) { + try { + const tokenResult = await managementAPIClient.stack({ api_key }).deliveryToken().create(body); + if (tokenResult.token) { + const environmentVariables: EnviornmentVariables = { + api_key, + deliveryToken: tokenResult.token, + environment: environment.name, + livePreviewEnabled, + }; + await envFileHandler( + appConfig.appConfigKey || '', + environmentVariables, + clonedDirectory, + region, + livePreviewEnabled, + ); + } else { + cliux.print(messageHandler.parse('CLI_BOOTSTRAP_APP_FAILED_TO_CREATE_TOKEN_FOR_ENV', environment.name)); + } + } catch (error) { + console.log('error', error); + cliux.print(messageHandler.parse('CLI_BOOTSTRAP_APP_FAILED_TO_CREATE_ENV_FILE_FOR_ENV', environment.name)); } - } catch (error) { - console.log('error', error); - cliux.print(messageHandler.parse('CLI_BOOTSTRAP_APP_FAILED_TO_CREATE_ENV_FILE_FOR_ENV', environment.name)); } } else { cliux.print('No environments name found for the environment'); @@ -102,83 +115,111 @@ const envFileHandler = async ( region: any, livePreviewEnabled: boolean, ) => { - if (!appConfigKey || !environmentVariables) { - return - } - let content - let result - let filePath - let fileName - let customHost; - const regionName = region && region.name && region.name.toLowerCase(); - const managementAPIHost = region.cma && region.cma.substring('8'); - const isUSRegion = (regionName === 'us' || regionName === 'na') - if (regionName !== 'eu' && !isUSRegion) { - customHost = region.cma && region.cma.substring('8'); - } - const production = (environmentVariables.environment === 'production' ? true : false) - switch (appConfigKey) { - case 'reactjs': - case 'reactjs-starter': - fileName = `.env.${environmentVariables.environment}.local` - filePath = path.join(clonedDirectory, fileName) - content = `REACT_APP_CONTENTSTACK_API_KEY=${environmentVariables.api_key}\nREACT_APP_CONTENTSTACK_DELIVERY_TOKEN=${environmentVariables.deliveryToken}\nREACT_APP_CONTENTSTACK_ENVIRONMENT=${environmentVariables.environment}${(customHost ? '\nREACT_APP_CONTENTSTACK_API_HOST=' + customHost : '')}${(!isUSRegion && !customHost) ? '\nREACT_APP_CONTENTSTACK_REGION=' + region.name : ''}\nSKIP_PREFLIGHT_CHECK=true\nREACT_APP_CONTENTSTACK_LIVE_PREVIEW=${livePreviewEnabled}` - result = await writeEnvFile(content, filePath) - break - case 'nextjs': - case 'nextjs-starter': - fileName = `.env.${environmentVariables.environment}.local` - filePath = path.join(clonedDirectory, fileName) - content = `CONTENTSTACK_API_KEY=${environmentVariables.api_key}\nCONTENTSTACK_DELIVERY_TOKEN=${environmentVariables.deliveryToken}\nCONTENTSTACK_ENVIRONMENT=${environmentVariables.environment}${(customHost ? '\nCONTENTSTACK_API_HOST=' + customHost : '')}${(!isUSRegion && !customHost ? '\nCONTENTSTACK_REGION=' + region.name : '')}\nCONTENTSTACK_LIVE_PREVIEW=${livePreviewEnabled}` - result = await writeEnvFile(content, filePath) - break - case 'gatsby': - case 'gatsby-starter': - fileName = `.env.${environmentVariables.environment}` - filePath = path.join(clonedDirectory, fileName) - content = `CONTENTSTACK_API_KEY=${environmentVariables.api_key}\nCONTENTSTACK_DELIVERY_TOKEN=${environmentVariables.deliveryToken}\nCONTENTSTACK_ENVIRONMENT=${environmentVariables.environment}\nCONTENTSTACK_API_HOST=${managementAPIHost}\nCONTENTSTACK_LIVE_PREVIEW=${livePreviewEnabled}` - result = await writeEnvFile(content, filePath) - break - case 'angular': - content = `export const environment = { \n\tproduction:${(environmentVariables.environment === 'production' ? true : false)}, \n\tconfig : { \n\t\tapi_key: '${environmentVariables.api_key}', \n\t\tdelivery_token: '${environmentVariables.deliveryToken}', \n\t\tenvironment: '${environmentVariables.environment}'${ (!isUSRegion && !customHost ? `,\n\t\tregion: '${region.name}'` : '')} \n\t } \n };` - fileName = `environment${(environmentVariables.environment === 'production' ? '.prod.' : ".")}ts` - filePath = path.join( - clonedDirectory, - 'src', - 'environments', - fileName - ) - result = await writeEnvFile(content, filePath) - break - case 'angular-starter': - content = `export const environment = { \n\tproduction: true \n}; \nexport const Config = { \n\tapi_key: '${environmentVariables.api_key}', \n\tdelivery_token: '${environmentVariables.deliveryToken}', \n\tenvironment: '${environmentVariables.environment}'${( !isUSRegion && !customHost ? `,\n\tregion: '${region.name}'`: '') },\n\tapi_host: '${customHost ? customHost: managementAPIHost}',\n\tapp_host: '',\n\tmanagement_token: '',\n\tlive_preview: ${livePreviewEnabled}\n};` - fileName = `environment${(environmentVariables.environment === 'production' ? '.prod.' : ".")}ts` - filePath = path.join( - clonedDirectory, - 'src', - 'environments', - fileName - ) - result = await writeEnvFile(content, filePath) - break - case 'nuxtjs': - case 'nuxt-starter': - case 'stencil-starter': - fileName = (production ? '.env.production' : '.env') - filePath = path.join(clonedDirectory, fileName) - // Note: Stencil app needs all the env variables, even if they are not having values otherwise the rollup does not work properly and throws process in undefined error. - content = `CONTENTSTACK_API_KEY=${environmentVariables.api_key}\nCONTENTSTACK_DELIVERY_TOKEN=${environmentVariables.deliveryToken}\nCONTENTSTACK_ENVIRONMENT=${environmentVariables.environment}${(!isUSRegion && !customHost ? '\nCONTENTSTACK_REGION=' + region.name : '')}\nCONTENTSTACK_LIVE_PREVIEW=${livePreviewEnabled}\nCONTENTSTACK_MANAGEMENT_TOKEN=''\nCONTENTSTACK_API_HOST='${customHost ? customHost : managementAPIHost}'\nCONTENTSTACK_APP_HOST=''\nCONTENTSTACK_LIVE_EDIT_TAGS=false`; - result = await writeEnvFile(content, filePath) - break - case 'vue-starter': - fileName = '.env' - filePath = path.join(clonedDirectory, fileName) - content = `VUE_APP_CONTENTSTACK_API_KEY=${environmentVariables.api_key}\nVUE_APP_CONTENTSTACK_DELIVERY_TOKEN=${environmentVariables.deliveryToken}\nVUE_APP_CONTENTSTACK_ENVIRONMENT=${environmentVariables.environment}${(customHost ? '\nVUE_APP_CONTENTSTACK_API_HOST=' + customHost : '')}${(!isUSRegion && !customHost ? '\nVUE_APP_CONTENTSTACK_REGION=' + region.name : '')}\nVUE_APP_CONTENTSTACK_LIVE_PREVIEW=${livePreviewEnabled}` - result = await writeEnvFile(content, filePath) - break - default: - cliux.error(messageHandler.parse('CLI_BOOTSTRAP_INVALID_APP_NAME')) - } + if (!appConfigKey || !environmentVariables) { + return; + } + let content; + let result; + let filePath; + let fileName; + let customHost; + const regionName = region && region.name && region.name.toLowerCase(); + const managementAPIHost = region.cma && region.cma.substring('8'); + const isUSRegion = regionName === 'us' || regionName === 'na'; + if (regionName !== 'eu' && !isUSRegion) { + customHost = region.cma && region.cma.substring('8'); + } + const production = environmentVariables.environment === 'production' ? true : false; + switch (appConfigKey) { + case 'reactjs': + case 'reactjs-starter': + fileName = `.env.${environmentVariables.environment}.local`; + filePath = path.join(clonedDirectory, fileName); + content = `REACT_APP_CONTENTSTACK_API_KEY=${ + environmentVariables.api_key + }\nREACT_APP_CONTENTSTACK_DELIVERY_TOKEN=${ + environmentVariables.deliveryToken + }\nREACT_APP_CONTENTSTACK_ENVIRONMENT=${environmentVariables.environment}${ + customHost ? '\nREACT_APP_CONTENTSTACK_API_HOST=' + customHost : '' + }${ + !isUSRegion && !customHost ? '\nREACT_APP_CONTENTSTACK_REGION=' + region.name : '' + }\nSKIP_PREFLIGHT_CHECK=true\nREACT_APP_CONTENTSTACK_LIVE_PREVIEW=${livePreviewEnabled}`; + result = await writeEnvFile(content, filePath); + break; + case 'nextjs': + case 'nextjs-starter': + fileName = `.env.${environmentVariables.environment}.local`; + filePath = path.join(clonedDirectory, fileName); + content = `CONTENTSTACK_API_KEY=${environmentVariables.api_key}\nCONTENTSTACK_DELIVERY_TOKEN=${ + environmentVariables.deliveryToken + }\nCONTENTSTACK_ENVIRONMENT=${environmentVariables.environment}${ + customHost ? '\nCONTENTSTACK_API_HOST=' + customHost : '' + }${ + !isUSRegion && !customHost ? '\nCONTENTSTACK_REGION=' + region.name : '' + }\nCONTENTSTACK_LIVE_PREVIEW=${livePreviewEnabled}`; + result = await writeEnvFile(content, filePath); + break; + case 'gatsby': + case 'gatsby-starter': + fileName = `.env.${environmentVariables.environment}`; + filePath = path.join(clonedDirectory, fileName); + content = `CONTENTSTACK_API_KEY=${environmentVariables.api_key}\nCONTENTSTACK_DELIVERY_TOKEN=${environmentVariables.deliveryToken}\nCONTENTSTACK_ENVIRONMENT=${environmentVariables.environment}\nCONTENTSTACK_API_HOST=${managementAPIHost}\nCONTENTSTACK_LIVE_PREVIEW=${livePreviewEnabled}`; + result = await writeEnvFile(content, filePath); + break; + case 'angular': + content = `export const environment = { \n\tproduction:${ + environmentVariables.environment === 'production' ? true : false + }, \n\tconfig : { \n\t\tapi_key: '${environmentVariables.api_key}', \n\t\tdelivery_token: '${ + environmentVariables.deliveryToken + }', \n\t\tenvironment: '${environmentVariables.environment}'${ + !isUSRegion && !customHost ? `,\n\t\tregion: '${region.name}'` : '' + } \n\t } \n };`; + fileName = `environment${environmentVariables.environment === 'production' ? '.prod.' : '.'}ts`; + filePath = path.join(clonedDirectory, 'src', 'environments', fileName); + result = await writeEnvFile(content, filePath); + break; + case 'angular-starter': + content = `export const environment = { \n\tproduction: true \n}; \nexport const Config = { \n\tapi_key: '${ + environmentVariables.api_key + }', \n\tdelivery_token: '${environmentVariables.deliveryToken}', \n\tenvironment: '${ + environmentVariables.environment + }'${!isUSRegion && !customHost ? `,\n\tregion: '${region.name}'` : ''},\n\tapi_host: '${ + customHost ? customHost : managementAPIHost + }',\n\tapp_host: '',\n\tmanagement_token: '',\n\tlive_preview: ${livePreviewEnabled}\n};`; + fileName = `environment${environmentVariables.environment === 'production' ? '.prod.' : '.'}ts`; + filePath = path.join(clonedDirectory, 'src', 'environments', fileName); + result = await writeEnvFile(content, filePath); + break; + case 'nuxtjs': + case 'nuxt-starter': + case 'stencil-starter': + fileName = production ? '.env.production' : '.env'; + filePath = path.join(clonedDirectory, fileName); + // Note: Stencil app needs all the env variables, even if they are not having values otherwise the rollup does not work properly and throws process in undefined error. + content = `CONTENTSTACK_API_KEY=${environmentVariables.api_key}\nCONTENTSTACK_DELIVERY_TOKEN=${ + environmentVariables.deliveryToken + }\nCONTENTSTACK_ENVIRONMENT=${environmentVariables.environment}${ + !isUSRegion && !customHost ? '\nCONTENTSTACK_REGION=' + region.name : '' + }\nCONTENTSTACK_LIVE_PREVIEW=${livePreviewEnabled}\nCONTENTSTACK_MANAGEMENT_TOKEN=''\nCONTENTSTACK_API_HOST='${ + customHost ? customHost : managementAPIHost + }'\nCONTENTSTACK_APP_HOST=''\nCONTENTSTACK_LIVE_EDIT_TAGS=false`; + result = await writeEnvFile(content, filePath); + break; + case 'vue-starter': + fileName = '.env'; + filePath = path.join(clonedDirectory, fileName); + content = `VUE_APP_CONTENTSTACK_API_KEY=${environmentVariables.api_key}\nVUE_APP_CONTENTSTACK_DELIVERY_TOKEN=${ + environmentVariables.deliveryToken + }\nVUE_APP_CONTENTSTACK_ENVIRONMENT=${environmentVariables.environment}${ + customHost ? '\nVUE_APP_CONTENTSTACK_API_HOST=' + customHost : '' + }${ + !isUSRegion && !customHost ? '\nVUE_APP_CONTENTSTACK_REGION=' + region.name : '' + }\nVUE_APP_CONTENTSTACK_LIVE_PREVIEW=${livePreviewEnabled}`; + result = await writeEnvFile(content, filePath); + break; + default: + cliux.error(messageHandler.parse('CLI_BOOTSTRAP_INVALID_APP_NAME')); + } return result; }; diff --git a/packages/contentstack-bootstrap/src/commands/cm/bootstrap.ts b/packages/contentstack-bootstrap/src/commands/cm/bootstrap.ts index 3aafebfe34..7aef231b8c 100644 --- a/packages/contentstack-bootstrap/src/commands/cm/bootstrap.ts +++ b/packages/contentstack-bootstrap/src/commands/cm/bootstrap.ts @@ -13,6 +13,7 @@ import { flags, isAuthenticated, FlagInput, + configHandler, } from '@contentstack/cli-utilities'; import config, { getAppLevelConfigByName, AppConfig } from '../../config'; import messageHandler from '../../messages'; @@ -101,18 +102,23 @@ export default class BootstrapCommand extends Command { hidden: true, parse: printFlagDeprecation(['-s', '--appType'], ['--app-type']), }), + alias: flags.string({ + char: 'a', + description: 'Alias of the management token', + }), }; async run() { const { flags: bootstrapCommandFlags } = await this.parse(BootstrapCommand); - + const managementTokenAlias = bootstrapCommandFlags.alias; try { - if (!isAuthenticated()) { + if (!isAuthenticated() && !managementTokenAlias) { this.error(messageHandler.parse('CLI_BOOTSTRAP_LOGIN_FAILED'), { exit: 2, suggestions: ['https://www.contentstack.com/docs/developers/cli/authentication/'], }); } + this.bootstrapManagementAPIClient = await managementSDKClient({ host: this.cmaHost, }); @@ -152,18 +158,25 @@ export default class BootstrapCommand extends Command { if (!cloneDirectory) { cloneDirectory = await inquireCloneDirectory(); } + cloneDirectory = resolve(cloneDirectory); const livePreviewEnabled = bootstrapCommandFlags.yes ? true : await inquireLivePreviewSupport(); const seedParams: SeedParams = {}; const stackAPIKey = bootstrapCommandFlags['stack-api-key']; - const org = bootstrapCommandFlags['org']; + const org = bootstrapCommandFlags.org; const stackName = bootstrapCommandFlags['stack-name']; if (stackAPIKey) seedParams.stackAPIKey = stackAPIKey; if (org) seedParams.org = org; if (stackName) seedParams.stackName = stackName; if (yes) seedParams.yes = yes; + if (managementTokenAlias) { + seedParams.managementTokenAlias = managementTokenAlias; + const listOfTokens = configHandler.get('tokens'); + const managementToken = listOfTokens[managementTokenAlias].token; + seedParams.managementToken = managementToken; + } // initiate bootstrsourceap const options: BootstrapOptions = { diff --git a/packages/contentstack-branches/README.md b/packages/contentstack-branches/README.md index 3661384b3e..d6c9aeb884 100755 --- a/packages/contentstack-branches/README.md +++ b/packages/contentstack-branches/README.md @@ -37,7 +37,7 @@ $ npm install -g @contentstack/cli-cm-branches $ csdx COMMAND running command... $ csdx (--version) -@contentstack/cli-cm-branches/1.0.7 darwin-arm64 node-v18.16.0 +@contentstack/cli-cm-branches/1.0.11 darwin-arm64 node-v20.3.1 $ csdx --help [COMMAND] USAGE $ csdx COMMAND diff --git a/packages/contentstack-branches/package.json b/packages/contentstack-branches/package.json index 176425054b..7d788ef48f 100644 --- a/packages/contentstack-branches/package.json +++ b/packages/contentstack-branches/package.json @@ -1,15 +1,15 @@ { "name": "@contentstack/cli-cm-branches", "description": "Contentstack CLI plugin to do branches operations", - "version": "1.0.8", + "version": "1.0.11", "author": "Contentstack", "bugs": "https://github.com/contentstack/cli/issues", "dependencies": { - "@contentstack/cli-command": "^1.2.9", - "@contentstack/cli-utilities": "^1.4.5", + "@contentstack/cli-command": "~1.2.11", + "@contentstack/cli-utilities": "~1.5.1", "@oclif/command": "^1.8.16", "@oclif/config": "^1.18.3", - "@oclif/core": "^2.3.0", + "@oclif/core": "^2.9.3", "async": "^3.2.4", "big-json": "^3.2.0", "bluebird": "^3.7.2", @@ -27,9 +27,9 @@ "winston": "^3.7.2" }, "devDependencies": { - "@contentstack/cli-auth": "^1.3.8", - "@contentstack/cli-config": "^1.4.6", - "@contentstack/cli-dev-dependencies": "^1.2.3", + "@contentstack/cli-auth": "~1.3.11", + "@contentstack/cli-config": "~1.4.9", + "@contentstack/cli-dev-dependencies": "~1.2.3", "@oclif/plugin-help": "^5.1.19", "@oclif/test": "^1.2.6", "@types/flat": "^5.0.2", diff --git a/packages/contentstack-branches/src/branch/merge-handler.ts b/packages/contentstack-branches/src/branch/merge-handler.ts index 3e74f4474d..823da0743a 100644 --- a/packages/contentstack-branches/src/branch/merge-handler.ts +++ b/packages/contentstack-branches/src/branch/merge-handler.ts @@ -14,10 +14,10 @@ import { executeMerge, generateMergeScripts, selectCustomPreferences, + selectContentMergePreference, + selectContentMergeCustomPreferences, } from '../utils'; -const enableEntryExp = false; - export default class MergeHandler { private strategy: string; private strategySubOption?: string; @@ -66,6 +66,12 @@ export default class MergeHandler { await this.executeMerge(mergePayload); } else if (this.executeOption === 'export') { await this.exportSummary(mergePayload); + } else if (this.executeOption === 'merge_n_scripts') { + this.enableEntryExp = true; + await this.executeMerge(mergePayload); + } else if (this.executeOption === 'summary_n_scripts') { + this.enableEntryExp = true; + await this.exportSummary(mergePayload); } else { await this.exportSummary(mergePayload); await this.executeMerge(mergePayload); @@ -203,6 +209,10 @@ export default class MergeHandler { }; await writeFile(path.join(this.exportSummaryPath, 'merge-summary.json'), summary); cliux.success('Exported the summary successfully'); + + if (this.enableEntryExp) { + this.executeEntryExpFlow(this.stackAPIKey, mergePayload); + } } async executeMerge(mergePayload) { @@ -227,14 +237,63 @@ export default class MergeHandler { } } - executeEntryExpFlow(mergeJobUID: string, mergePayload) { - let scriptFolderPath = generateMergeScripts(this.mergeSettings.mergeContent, mergeJobUID); + async executeEntryExpFlow(mergeJobUID: string, mergePayload) { + const { mergeContent } = this.mergeSettings; + let mergePreference = await selectContentMergePreference(); + let selectedMergePreference; + + const updateEntryMergeStrategy = (items, mergeStrategy) => { + items && + items.forEach((item) => { + item.entry_merge_strategy = mergeStrategy; + }); + }; + + switch (mergePreference) { + case 'existing_new': + selectedMergePreference = 'merge_existing_new'; + updateEntryMergeStrategy(mergeContent.content_types.added, selectedMergePreference); + updateEntryMergeStrategy(mergeContent.content_types.modified, selectedMergePreference); + break; + + case 'new': + selectedMergePreference = 'merge_new'; + updateEntryMergeStrategy(mergeContent.content_types.added, selectedMergePreference); + break; + + case 'existing': + selectedMergePreference = 'merge_existing'; + updateEntryMergeStrategy(mergeContent.content_types.modified, selectedMergePreference); + break; + + case 'ask_preference': + selectedMergePreference = 'custom'; + const selectedMergeItems = await selectContentMergeCustomPreferences(mergeContent.content_types); + mergeContent.content_types = { + added: [], + modified: [], + deleted: [], + }; + + selectedMergeItems.forEach((item) => { + mergeContent.content_types[item.status].push(item.value); + }); + break; + + default: + cliux.error(`error: Invalid preference ${mergePreference}`); + process.exit(1); + } + + let scriptFolderPath = generateMergeScripts(mergeContent.content_types, mergeJobUID); if (scriptFolderPath !== undefined) { cliux.success(`\nSuccess! We have generated entry migration files in the folder ${scriptFolderPath}`); - + cliux.print('\nWARNING!!! Migration is not intended to be run more than once. Migrated(entries/assets) will be duplicated if run more than once', {color: 'yellow'}); + + const migrationCommand = `csdx cm:stacks:migration --multiple --file-path ./${scriptFolderPath} --config {compare-branch:${mergePayload.compare_branch},file-path:./${scriptFolderPath}} --branch ${mergePayload.base_branch} --stack-api-key ${this.stackAPIKey}`; cliux.print( - `\nKindly follow the steps in the guide "https://www.contentstack.com/docs/developers/cli/migrate-branch-entries" to update the migration scripts, and then run the command \n\ncsdx cm:stacks:migration --multiple --file-path ./${scriptFolderPath} --config compare-branch:${mergePayload.compare_branch} --branch ${mergePayload.base_branch} --stack-api-key ${this.stackAPIKey}`, + `\nKindly follow the steps in the guide "https://www.contentstack.com/docs/developers/cli/migrate-branch-entries" to update the migration scripts, and then run the command:\n\n${migrationCommand}`, { color: 'blue' }, ); } diff --git a/packages/contentstack-branches/src/commands/cm/branches/create.ts b/packages/contentstack-branches/src/commands/cm/branches/create.ts index 11214ab0af..00d264484b 100644 --- a/packages/contentstack-branches/src/commands/cm/branches/create.ts +++ b/packages/contentstack-branches/src/commands/cm/branches/create.ts @@ -1,7 +1,7 @@ import { Command } from '@contentstack/cli-command'; -import { messageHandler, flags } from '@contentstack/cli-utilities'; +import { messageHandler, flags, isAuthenticated } from '@contentstack/cli-utilities'; import { createBranch } from '../../../utils/create-branch'; -import { interactive } from '../../../utils'; +import { interactive, handleErrorMsg } from '../../../utils'; export default class BranchCreateCommand extends Command { static description: string = messageHandler.parse('Create a new branch'); // Note: Update the description @@ -33,7 +33,10 @@ export default class BranchCreateCommand extends Command { uid: branchCreateFlags.uid, source: branchCreateFlags.source, }; - + if (!isAuthenticated()) { + const err = { errorMessage: 'You are not logged in. Please login with command $ csdx auth:login' }; + handleErrorMsg(err); + } if (!apiKey) { apiKey = await interactive.askStackAPIKey(); } diff --git a/packages/contentstack-branches/src/commands/cm/branches/delete.ts b/packages/contentstack-branches/src/commands/cm/branches/delete.ts index a391e35293..b6787b13cf 100644 --- a/packages/contentstack-branches/src/commands/cm/branches/delete.ts +++ b/packages/contentstack-branches/src/commands/cm/branches/delete.ts @@ -1,7 +1,7 @@ import { Command } from '@contentstack/cli-command'; -import { messageHandler, flags, cliux } from '@contentstack/cli-utilities'; +import { messageHandler, flags, cliux, isAuthenticated } from '@contentstack/cli-utilities'; import { deleteBranch } from '../../../utils/delete-branch'; -import { interactive } from '../../../utils'; +import { interactive, handleErrorMsg } from '../../../utils'; export default class BranchDeleteCommand extends Command { static description: string = messageHandler.parse('Delete a branch'); @@ -32,7 +32,10 @@ export default class BranchDeleteCommand extends Command { async run(): Promise { const { flags: branchDeleteFlags } = await this.parse(BranchDeleteCommand); let apiKey = branchDeleteFlags['stack-api-key']; - + if (!isAuthenticated()) { + const err = { errorMessage: 'You are not logged in. Please login with command $ csdx auth:login' }; + handleErrorMsg(err); + } if (!apiKey) { apiKey = await interactive.askStackAPIKey(); } diff --git a/packages/contentstack-branches/src/commands/cm/branches/diff.ts b/packages/contentstack-branches/src/commands/cm/branches/diff.ts index c46b3d698a..054a613d82 100644 --- a/packages/contentstack-branches/src/commands/cm/branches/diff.ts +++ b/packages/contentstack-branches/src/commands/cm/branches/diff.ts @@ -1,7 +1,8 @@ import { Command } from '@contentstack/cli-command'; -import { messageHandler, flags } from '@contentstack/cli-utilities'; +import { messageHandler, flags, isAuthenticated } from '@contentstack/cli-utilities'; import { BranchOptions } from '../../../interfaces/index'; import { BranchDiffHandler } from '../../../branch'; +import { handleErrorMsg } from '../../../utils'; export default class BranchDiffCommand extends Command { static description: string = messageHandler.parse('Differences between two branches'); @@ -59,6 +60,10 @@ export default class BranchDiffCommand extends Command { format: branchDiffFlags.format, host: this.cmaHost }; + if (!isAuthenticated()) { + const err = { errorMessage: 'You are not logged in. Please login with command $ csdx auth:login' }; + handleErrorMsg(err); + } const diffHandler = new BranchDiffHandler(options); await diffHandler.run(); } catch (error: any) { diff --git a/packages/contentstack-branches/src/commands/cm/branches/index.ts b/packages/contentstack-branches/src/commands/cm/branches/index.ts index b16eb79b65..2be2e4b689 100644 --- a/packages/contentstack-branches/src/commands/cm/branches/index.ts +++ b/packages/contentstack-branches/src/commands/cm/branches/index.ts @@ -1,8 +1,7 @@ import { Command } from '@contentstack/cli-command'; -import { cliux, messageHandler, managementSDKClient, flags } from '@contentstack/cli-utilities'; +import { cliux, messageHandler, managementSDKClient, flags, isAuthenticated } from '@contentstack/cli-utilities'; import { getbranchesList, getbranchConfig, interactive, handleErrorMsg } from '../../../utils/index'; import chalk from 'chalk'; - export default class BranchListCommand extends Command { static description: string = messageHandler.parse('List the branches'); // Note: Update the description @@ -28,6 +27,10 @@ export default class BranchListCommand extends Command { stackApiKey = await interactive.askStackAPIKey(); } + if (!isAuthenticated()) { + const err = { errorMessage: 'You are not logged in. Please login with command $ csdx auth:login' }; + handleErrorMsg(err); + } const baseBranch: string = getbranchConfig(stackApiKey) || 'main'; const listOfBranch = await managementAPIClient .stack({ api_key: stackApiKey }) diff --git a/packages/contentstack-branches/src/commands/cm/branches/merge.ts b/packages/contentstack-branches/src/commands/cm/branches/merge.ts index 8e66765749..2d65484670 100644 --- a/packages/contentstack-branches/src/commands/cm/branches/merge.ts +++ b/packages/contentstack-branches/src/commands/cm/branches/merge.ts @@ -1,6 +1,6 @@ import { Command } from '@contentstack/cli-command'; -import { cliux, flags } from '@contentstack/cli-utilities'; -import { setupMergeInputs, displayBranchStatus } from '../../../utils'; +import { cliux, flags, isAuthenticated } from '@contentstack/cli-utilities'; +import { setupMergeInputs, displayBranchStatus, handleErrorMsg } from '../../../utils'; import { MergeHandler } from '../../../branch'; export default class BranchMergeCommand extends Command { static description: string = 'Merge changes from a branch'; //TBD update the description @@ -65,6 +65,10 @@ export default class BranchMergeCommand extends Command { try { let { flags: branchMergeFlags } = await this.parse(BranchMergeCommand); branchMergeFlags = await setupMergeInputs(branchMergeFlags); + if (!isAuthenticated()) { + const err = { errorMessage: 'You are not logged in. Please login with command $ csdx auth:login' }; + handleErrorMsg(err); + } // display branch status const branchCompareData = await displayBranchStatus({ stackAPIKey: branchMergeFlags['stack-api-key'], @@ -87,7 +91,7 @@ export default class BranchMergeCommand extends Command { exportSummaryPath: branchMergeFlags['export-summary-path'], mergeSummary: branchMergeFlags.mergeSummary, host: this.cmaHost, - enableEntryExp: true, + enableEntryExp: false, }).start(); } catch (error) { console.log('Error in Merge operations', error); diff --git a/packages/contentstack-branches/src/utils/asset-folder-create-script.ts b/packages/contentstack-branches/src/utils/asset-folder-create-script.ts new file mode 100644 index 0000000000..30ad3ec1fe --- /dev/null +++ b/packages/contentstack-branches/src/utils/asset-folder-create-script.ts @@ -0,0 +1,157 @@ +export function assetFolderCreateScript(contentType) { + return ` + const fs = require('fs'); + const path = require('path'); + module.exports = async ({ migration, stackSDKInstance, managementAPIClient, config, branch, apiKey }) => { + let filePath = config['file-path'] || process.cwd(); + let compareBranch = config['compare-branch']; + let folderMapper = {}; + let folderBucket = []; + + const getAssetCount = async function (branchName, isDir = false) { + const queryParam = { + asc: 'created_at', + include_count: true, + skip: 10 ** 100, + }; + + if (isDir) queryParam.query = { is_dir: true }; + + return await managementAPIClient + .stack({ api_key: stackSDKInstance.api_key, branch_uid: branchName }) + .asset() + .query(queryParam) + .count() + .then(({ assets }) => assets) + .catch((error) => {}); + }; + + async function getFolderJSON(skip, fCount, branchName, folderData = []) { + const queryRequestObj = { + skip, + include_folders: true, + query: { is_dir: true }, + }; + + return await managementAPIClient + .stack({ api_key: stackSDKInstance.api_key, branch_uid: branchName }) + .asset() + .query(queryRequestObj) + .find() + .then(async (response) => { + skip += 100; + folderData = [...folderData, ...response.items]; + if (skip >= fCount) { + return folderData; + } + return await getFolderJSON(skip, fCount, branchName, folderData); + }) + .catch((error) => {}); + } + + function buildTree(coll) { + let tree = {}; + for (let i = 0; i < coll.length; i++) { + if (coll[i].parent_uid === null || !coll[i].hasOwnProperty('parent_uid')) { + tree[coll[i].uid] = {}; + } + } + findBranches(tree, Object.keys(tree), coll); + return tree; + } + + function findBranches(tree, branches, coll) { + branches.forEach((branch) => { + for (const element of coll) { + if (branch === element.parent_uid) { + let childUid = element.uid; + tree[branch][childUid] = {}; + return findBranches(tree[branch], [childUid], coll); + } + } + }); + } + + function buildFolderReqObjs(baseFolderUIDs, compareAssetsFolder, tree, parent_uid) { + for (let leaf in tree) { + //folder doesn't exists + if (baseFolderUIDs.indexOf(leaf) === -1) { + let folderObj = compareAssetsFolder.filter((folder) => folder.uid === leaf); + if (folderObj && folderObj.length) { + let requestOption = { + folderReq: { + asset: { + name: folderObj[0].name, + parent_uid: parent_uid || null, + }, + }, + oldUid: leaf, + }; + folderBucket.push(requestOption); + } + } + if (Object.keys(tree[leaf]).length > 0) { + buildFolderReqObjs(baseFolderUIDs, compareAssetsFolder, tree[leaf], leaf, folderBucket); + } + } + } + + async function createFolder(payload) { + if (folderMapper.hasOwnProperty(payload.folderReq.asset.parent_uid)) { + // replace old uid with new + payload.folderReq.asset.parent_uid = folderMapper[payload.folderReq.asset.parent_uid]; + } + await managementAPIClient + .stack({ api_key: apiKey, branch_uid: branch }) + .asset() + .folder() + .create(payload.folderReq) + .then((res) => { + folderMapper[payload.oldUid] = res.uid; + }) + .catch((err) => console.log(err)); + } + + const createAssetTask = () => { + return { + title: 'Create Assets Folder', + successTitle: 'Assets folder Created Successfully', + failedTitle: 'Failed to create assets folder', + task: async () => { + try { + const baseAssetsFolderCount = await getAssetCount(branch, true); + const compareAssetsFolderCount = await getAssetCount(compareBranch, true); + const baseAssetsFolder = await getFolderJSON(0, baseAssetsFolderCount, branch); + const compareAssetsFolder = await getFolderJSON(0, compareAssetsFolderCount, compareBranch); + if (Array.isArray(compareAssetsFolder) && Array.isArray(baseAssetsFolder)) { + const baseAssetUIDs = baseAssetsFolder.map((bAsset) => bAsset.uid); + //create new asset folder in base branch and update it in mapper + const tree = buildTree(compareAssetsFolder); + buildFolderReqObjs(baseAssetUIDs, compareAssetsFolder, tree, null); + for (let i = 0; i < folderBucket.length; i++) { + await createFolder(folderBucket[i]); + } + fs.writeFileSync(path.resolve(filePath, 'folder-mapper.json'), JSON.stringify(folderMapper)); + } + } catch (error) { + throw error; + } + }, + }; + }; + if (compareBranch && branch.length !== 0 && apiKey.length !== 0) { + migration.addTask(createAssetTask()); + } else { + if (apiKey.length === 0) { + console.error('Please provide api key using --stack-api-key flag'); + } + if (!compareBranch) { + console.error('Please provide compare branch through --config compare-branch: flag'); + } + if (branch.length === 0) { + console.error('Please provide branch name through --branch flag'); + } + } +} +`; +} diff --git a/packages/contentstack-branches/src/utils/create-merge-scripts.ts b/packages/contentstack-branches/src/utils/create-merge-scripts.ts index 1e8cc05bd8..9112abe615 100644 --- a/packages/contentstack-branches/src/utils/create-merge-scripts.ts +++ b/packages/contentstack-branches/src/utils/create-merge-scripts.ts @@ -1,29 +1,57 @@ import fs from 'fs'; +import { cliux } from '@contentstack/cli-utilities'; import { entryCreateScript } from './entry-create-script'; import { entryUpdateScript } from './entry-update-script'; +import { entryCreateUpdateScript } from './entry-create-update-script'; +import { assetFolderCreateScript } from './asset-folder-create-script'; type CreateMergeScriptsProps = { uid: string; - status: string; + entry_merge_strategy: string; + type?: string; }; export function generateMergeScripts(mergeSummary, mergeJobUID) { try { let scriptFolderPath; - if (mergeSummary.content_types.modified && mergeSummary.content_types.modified?.length !== 0) { - mergeSummary.content_types.modified.map((contentType) => { - let data = entryUpdateScript(contentType.uid); - scriptFolderPath = createMergeScripts(contentType, data, mergeJobUID); - }); - } + const processContentType = (contentType, scriptFunction) => { + let data: any; + if (contentType.uid) { + data = scriptFunction(contentType.uid); + } else { + data = scriptFunction(); + } + scriptFolderPath = createMergeScripts(contentType, mergeJobUID, data); + }; - if (mergeSummary.content_types.added && mergeSummary.content_types.added?.length !== 0) { - mergeSummary.content_types.added?.map((contentType) => { - let data = entryCreateScript(contentType.uid); - scriptFolderPath = createMergeScripts(contentType, data, mergeJobUID); - }); - } + const mergeStrategies = { + asset_create_folder: assetFolderCreateScript, + merge_existing_new: entryCreateUpdateScript, + merge_existing: entryUpdateScript, + merge_new: entryCreateScript, + ignore: entryCreateUpdateScript, + }; + + const processContentTypes = (contentTypes, messageType) => { + if (contentTypes && contentTypes.length > 0) { + processContentType( + { type: 'assets', uid: '', entry_merge_strategy: '' }, + mergeStrategies['asset_create_folder'], + ); + contentTypes.forEach((contentType) => { + const mergeStrategy = contentType.entry_merge_strategy; + if (mergeStrategies.hasOwnProperty(mergeStrategy)) { + processContentType(contentType, mergeStrategies[mergeStrategy]); + } + }); + } else { + cliux.print(`No ${messageType} entries selected for merge`, { color: 'yellow' }); + } + }; + + processContentTypes(mergeSummary.modified, 'Modified'); + processContentTypes(mergeSummary.added, 'New'); return scriptFolderPath; } catch (error) { @@ -31,17 +59,19 @@ export function generateMergeScripts(mergeSummary, mergeJobUID) { } } -export function getContentypeMergeStatus(status) { - if (status === 'modified') { +export function getContentTypeMergeStatus(status) { + if (status === 'merge_existing') { return 'updated'; - } else if (status === 'compare_only') { + } else if (status === 'merge_new') { return 'created'; + } else if (status === 'merge_existing_new') { + return 'created_updated'; } else { return ''; } } -export function createMergeScripts(contentType: CreateMergeScriptsProps, content, mergeJobUID) { +export function createMergeScripts(contentType: CreateMergeScriptsProps, mergeJobUID: string, content?: any) { const date = new Date(); const rootFolder = 'merge_scripts'; const fileCreatedAt = `${date.getFullYear()}${ @@ -63,11 +93,15 @@ export function createMergeScripts(contentType: CreateMergeScriptsProps, content if (!fs.existsSync(fullPath)) { fs.mkdirSync(fullPath); } - fs.writeFileSync( - `${fullPath}/${fileCreatedAt}_${getContentypeMergeStatus(contentType.status)}_${contentType.uid}.js`, - content, - 'utf-8', - ); + let filePath: string; + if (contentType.type === 'assets') { + filePath = `${fullPath}/${fileCreatedAt}_create_assets_folder.js`; + } else { + filePath = `${fullPath}/${fileCreatedAt}_${getContentTypeMergeStatus(contentType.entry_merge_strategy)}_${ + contentType.uid + }.js`; + } + fs.writeFileSync(filePath, content, 'utf-8'); } return fullPath; } catch (error) { diff --git a/packages/contentstack-branches/src/utils/entry-create-script.ts b/packages/contentstack-branches/src/utils/entry-create-script.ts index fb1c1d6ce1..682ffb8b0f 100644 --- a/packages/contentstack-branches/src/utils/entry-create-script.ts +++ b/packages/contentstack-branches/src/utils/entry-create-script.ts @@ -1,69 +1,508 @@ export function entryCreateScript(contentType) { return ` -module.exports = async ({ migration, stackSDKInstance, managementAPIClient, config, branch, apiKey }) => { - const keysToRemove = [ - 'content_type_uid', - 'created_at', - 'updated_at', - 'created_by', - 'updated_by', - 'ACL', - 'stackHeaders', - 'urlPath', - '_version', - '_in_progress', - 'update', - 'delete', - 'fetch', - 'publish', - 'unpublish', - 'publishRequest', - 'setWorkflowStage', - 'import', - ]; + const fs = require('fs'); + const path = require('path'); + module.exports = async ({ migration, stackSDKInstance, managementAPIClient, config, branch, apiKey }) => { + const keysToRemove = [ + 'content_type_uid', + 'created_at', + 'updated_at', + 'created_by', + 'updated_by', + 'ACL', + 'stackHeaders', + 'urlPath', + '_version', + '_in_progress', + 'update', + 'delete', + 'fetch', + 'publish', + 'unpublish', + 'publishRequest', + 'setWorkflowStage', + 'import', + ]; - let compareBranch = config['compare-branch']; + let compareBranch = config['compare-branch']; + let filePath = config['file-path'] || process.cwd(); + let assetDirPath = path.resolve(filePath, 'assets'); + let cAssetDetails = []; + let assetUIDMapper = {}; + let assetUrlMapper = {}; + let assetRefPath = {}; + let isAssetDownload = false; - const createEntryTask = () => { - return { - title: 'Create Entries', - successTitle: 'Entries Created Successfully', - failedTitle: 'Failed to create entries', - task: async () => { - const compareBranchEntries = await managementAPIClient - .stack({ api_key: stackSDKInstance.api_key, branch_uid: compareBranch }) // - .contentType('${contentType}') - .entry() - .query() - .find(); - const compareFilteredProperties = compareBranchEntries.items.map((entry) => { - keysToRemove.map((key) => delete entry[key]); - return entry; - }); - try { - compareFilteredProperties.length !== 0 && - compareFilteredProperties.forEach(async (entryDetails) => { - await stackSDKInstance.contentType('${contentType}').entry().create({ entry: entryDetails }); - }); - } catch (error) { - throw error; + function getValueByPath(obj, path) { + return path.split('[').reduce((o, key) => o && o[key.replace(/\]$/, '')], obj); + } + + function updateValueByPath(obj, path, newValue, type, fileIndex) { + path.split('[').reduce((o, key, index, arr) => { + if (index === arr.length - 1) { + if (type === 'file') { + o[key.replace(/]$/, '')][fileIndex] = newValue; + } else { + o[key.replace(/]$/, '')][0].uid = newValue; + } + } else { + return o[key.replace(/\]$/, '')]; + } + }, obj); + } + + const findReference = function (schema, path, flag) { + let references = []; + + for (const i in schema) { + const currentPath = path ? path + '[' + schema[i].uid : schema[i].uid; + if (schema[i].data_type === 'group' || schema[i].data_type === 'global_field') { + references = references.concat(findReference(schema[i].schema, currentPath, flag)); + } else if (schema[i].data_type === 'blocks') { + for (const block in schema[i].blocks) { + references = references.concat( + findReference( + schema[i].blocks[block].schema, + currentPath + '[' + block + '][' + schema[i].blocks[block].uid + ']', + flag, + ), + ); + } + } else if (schema[i].data_type === 'reference') { + flag.references = true; + references.push(currentPath); } - }, + } + + return references; }; - }; - if (compareBranch && branch.length !== 0 && apiKey.length !== 0) { - migration.addTask(createEntryTask()); - } else { - if (apiKey.length === 0) { - console.error('Please provide api key using --stack-api-key flag'); + + const findAssets = function (schema, entry, refPath, path) { + for (const i in schema) { + const currentPath = path ? path + '[' + schema[i].uid : schema[i].uid; + if (schema[i].data_type === 'group' || schema[i].data_type === 'global_field') { + findAssets(schema[i].schema, entry, refPath, currentPath + '[0]'); + } else if (schema[i].data_type === 'blocks') { + for (const block in schema[i].blocks) { + { + if (schema[i].blocks[block].schema) { + findAssets( + schema[i].blocks[block].schema, + entry, + refPath, + currentPath + '[' + block + '][' + schema[i].blocks[block].uid + ']', + ); + } + } + } + } else if (schema[i].data_type === 'json' && schema[i].field_metadata.rich_text_type) { + findAssetIdsFromJsonRte(entry, schema, refPath, path); + } else if ( + schema[i].data_type === 'text' && + schema[i].field_metadata && + (schema[i].field_metadata.markdown || schema[i].field_metadata.rich_text_type) + ) { + findFileUrls(schema[i], entry); + } else if (schema[i].data_type === 'file') { + refPath.push(currentPath) + const imgDetails = getValueByPath(entry, currentPath); + if (schema[i].multiple) { + if (imgDetails && imgDetails.length) { + imgDetails.forEach((img) => { + const obj = { + uid: img.uid, + parent_uid: img.parent_uid, + description: img.description, + title: img.title, + filename: img.filename, + url: img.url, + }; + cAssetDetails.push(obj); + }); + } + } else { + if (imgDetails) { + const obj = { + uid: imgDetails.uid, + parent_uid: imgDetails.parent_uid, + description: imgDetails.description, + title: imgDetails.title, + filename: imgDetails.filename, + url: imgDetails.url, + }; + cAssetDetails.push(obj); + } + } + } + } + }; + + function findFileUrls(schema, _entry) { + let markdownRegEx; + let markdownMatch; + let text; + // Regex to detect v3 asset uri patterns + if (schema && schema.field_metadata && schema.field_metadata.markdown) { + text = marked(JSON.stringify(_entry)); + } else { + text = JSON.stringify(_entry); + } + markdownRegEx = new RegExp( + '(https://(assets|(eu-|azure-na-|azure-eu-)?images).contentstack.(io|com)/v3/assets/(.*?)/(.*?)/(.*?)/(.*?)(?="))', + 'g', + ); + while ((markdownMatch = markdownRegEx.exec(text)) !== null) { + if (markdownMatch && typeof markdownMatch[0] === 'string') { + const assetDetails = markdownMatch[0].split('/'); + //fetch assetUID from url + const assetUID = assetDetails && assetDetails[6]; + const obj = { + uid: assetUID, + url: markdownMatch[0], + }; + cAssetDetails.push(obj); + } + } + } + + function findAssetIdsFromJsonRte(entryObj, ctSchema) { + if(ctSchema !== undefined){ + for (const element of ctSchema) { + switch (element.data_type) { + case 'blocks': { + if (entryObj[element.uid]) { + if (element.multiple) { + entryObj[element.uid].forEach((e) => { + let key = Object.keys(e).pop(); + let subBlock = element.blocks.filter((block) => block.uid === key).pop(); + findAssetIdsFromJsonRte(e[key], subBlock.schema); + }); + } + } + break; + } + case 'global_field': + case 'group': { + if (entryObj[element.uid]) { + if (element.multiple) { + entryObj[element.uid].forEach((e) => { + findAssetIdsFromJsonRte(e, element.schema); + }); + } else { + findAssetIdsFromJsonRte(entryObj[element.uid], element.schema); + } + } + break; + } + case 'json': { + if (entryObj[element.uid] && element.field_metadata.rich_text_type) { + if (element.multiple) { + entryObj[element.uid].forEach((jsonRteData) => { + gatherJsonRteAssetIds(jsonRteData); + }); + } else { + gatherJsonRteAssetIds(entryObj[element.uid]); + } + } + break; + } + } + } + } + } + + function gatherJsonRteAssetIds(jsonRteData) { + jsonRteData.children.forEach((element) => { + if (element.type) { + switch (element.type) { + case 'a': + case 'p': { + if (element.children && element.children.length > 0) { + gatherJsonRteAssetIds(element); + } + break; + } + case 'reference': { + if (Object.keys(element.attrs).length > 0 && element.attrs.type === 'asset') { + cAssetDetails.push({ uid: element.attrs['asset-uid'] }); + if (element.attrs['asset-link']) { + const assetDetails = element.attrs['asset-link'].split('/'); + //fetch assetUID from url + const assetUID = assetDetails && assetDetails[6]; + const obj = { + uid: assetUID, + url: element.attrs['asset-link'], + }; + cAssetDetails.push(obj); + } else if (element.attrs['href']) { + const assetDetails = element.attrs['href'].split('/'); + //fetch assetUID from url + const assetUID = assetDetails && assetDetails[6]; + const obj = { + uid: assetUID, + url: element.attrs['href'], + }; + cAssetDetails.push(obj); + } + } + if (element.children && element.children.length > 0) { + gatherJsonRteAssetIds(element); + } + break; + } + } + } + }); } - if (!compareBranch) { - console.error('Please provide compare branch through --config compare-branch: flag'); + + const updateAssetDetailsInEntries = function (entry) { + assetRefPath[entry.uid].forEach((refPath) => { + let imgDetails = entry[refPath]; + if (imgDetails !== undefined) { + if (imgDetails && !Array.isArray(imgDetails)) { + entry[refPath] = assetUIDMapper[imgDetails.uid]; + } else if (imgDetails && Array.isArray(imgDetails)) { + for (let i = 0; i < imgDetails.length; i++) { + const img = imgDetails[i]; + entry[refPath][i] = assetUIDMapper[img.uid]; + } + } + } else { + imgDetails = getValueByPath(entry, refPath); + if (imgDetails && !Array.isArray(imgDetails)) { + const imgUID = imgDetails?.uid; + updateValueByPath(entry, refPath, assetUIDMapper[imgUID], 'file', 0); + } else if (imgDetails && Array.isArray(imgDetails)) { + for (let i = 0; i < imgDetails.length; i++) { + const img = imgDetails[i]; + const imgUID = img?.uid; + updateValueByPath(entry, refPath, assetUIDMapper[imgUID], 'file', i); + } + } + } + }); + entry = JSON.stringify(entry); + const assetUrls = cAssetDetails.map((asset) => asset.url); + const assetUIDs = cAssetDetails.map((asset) => asset.uid); + assetUrls.forEach(function (assetUrl) { + let mappedAssetUrl = assetUrlMapper[assetUrl]; + if (typeof mappedAssetUrl !== 'undefined') { + entry = entry.replace(assetUrl, mappedAssetUrl); + } + }); + + assetUIDs.forEach(function (assetUid) { + let uid = assetUIDMapper[assetUid]; + if (typeof uid !== 'undefined') { + entry = entry.replace(new RegExp(assetUid, 'img'), uid); + } + }); + return JSON.parse(entry); + }; + + const checkAndDownloadAsset = async function (cAsset) { + const assetUID = cAsset?.uid; + if (cAsset && assetUID) { + const bAssetDetail = await managementAPIClient + .stack({ api_key: stackSDKInstance.api_key, branch_uid: branch }) + .asset(assetUID) + .fetch() + .then((assets) => assets) + .catch((error) => {}); + if (bAssetDetail) { + assetUIDMapper[cAsset.uid] = bAssetDetail.uid; + assetUrlMapper[cAsset.url] = bAssetDetail.url; + return false; + } + else { + isAssetDownload = true; + const cAssetDetail = await managementAPIClient + .stack({ api_key: stackSDKInstance.api_key, branch_uid: compareBranch }) + .asset(assetUID) + .fetch() + .then((assets) => assets) + .catch((error) => {}); + const updatedObj = { + parent_uid: cAssetDetail.parent_uid, + description: cAssetDetail.description, + title: cAssetDetail.title, + filename: cAssetDetail.filename, + url: cAssetDetail.url, + }; + Object.assign(cAsset, updatedObj); + const url = cAssetDetail?.url; + if (url) { + const assetFolderPath = path.resolve(assetDirPath, assetUID); + if (!fs.existsSync(assetFolderPath)) fs.mkdirSync(assetFolderPath); + const assetFilePath = path.resolve(assetFolderPath, cAsset.filename); + const assetWriterStream = fs.createWriteStream(assetFilePath); + const data = await managementAPIClient + .stack({ api_key: stackSDKInstance.api_key, branch_uid: compareBranch }) + .asset(assetUID) + .download({ url, responseType: 'stream' }) + .then(({ data }) => data) + .catch((error) => { + throw error; + }); + assetWriterStream.on('error', (error) => { + throw error; + }); + data.pipe(assetWriterStream); + } + } + } + return cAsset; + }; + + const uploadAssets = async function () { + const assetFolderMap = JSON.parse(fs.readFileSync(path.resolve(filePath, 'folder-mapper.json'), 'utf8')); + const stackAPIClient = managementAPIClient.stack({ api_key: stackSDKInstance.api_key, branch_uid: branch }); + for (let i = 0; i < cAssetDetails?.length; i++) { + const asset = cAssetDetails[i]; + let requestOption = {}; + + requestOption.parent_uid = assetFolderMap[asset.parent_uid] || asset.parent_uid; + + if (asset.hasOwnProperty('description') && typeof asset.description === 'string') { + requestOption.description = asset.description; + } + + if (asset.hasOwnProperty('tags') && Array.isArray(asset.tags)) { + requestOption.tags = asset.tags; + } + + if (asset.hasOwnProperty('title') && typeof asset.title === 'string') { + requestOption.title = asset.title; + } + requestOption.upload = path.resolve(assetDirPath, asset.uid, asset.filename); + const res = await stackAPIClient + .asset() + .create(requestOption) + .then((asset) => asset) + .catch((error) => { + throw error; + }); + assetUIDMapper[asset.uid] = res && res.uid; + assetUrlMapper[asset.url] = res && res.url; + } + }; + + function handleErrorMsg(err) { + if (err?.errorMessage) { + console.log(err.errorMessage); + } else if (err?.message) { + console.log(err.message); + } } - if (branch.length === 0) { - console.error('Please provide branch name through --branch flag'); + + const createEntryTask = () => { + return { + title: 'Create Entries', + successTitle: 'Entries Created Successfully', + failedTitle: 'Failed to create entries', + task: async () => { + const compareBranchEntries = await managementAPIClient + .stack({ api_key: stackSDKInstance.api_key, branch_uid: compareBranch }) + .contentType('${contentType}') + .entry() + .query() + .find(); + + const compareFilteredProperties = compareBranchEntries.items.map((entry) => { + keysToRemove.map((key) => delete entry[key]); + return entry; + }); + + let contentType = await managementAPIClient + .stack({ api_key: stackSDKInstance.api_key, branch_uid: compareBranch }) + .contentType('${contentType}') + .fetch(); + + for (let i = 0; i < compareBranchEntries?.items?.length; i++) { + assetRefPath[compareBranchEntries.items[i].uid] = [] + findAssets(contentType.schema, compareBranchEntries.items[i], assetRefPath[compareBranchEntries.items[i].uid]); + cAssetDetails = [...new Map(cAssetDetails.map((item) => [item['uid'], item])).values()]; + } + if (cAssetDetails && cAssetDetails.length) { + if (!fs.existsSync(assetDirPath)) { + fs.mkdirSync(assetDirPath); + } + for (let i = 0; i < cAssetDetails.length; i++) { + const asset = cAssetDetails[i]; + const updatedCAsset = await checkAndDownloadAsset(asset); + if (updatedCAsset) { + cAssetDetails[i] = updatedCAsset; + } + } + if (isAssetDownload) await uploadAssets(); + } + + let flag = { + references: false, + }; + + const references = await findReference(contentType.schema, '', flag); + + async function updateEntry(entry, entryDetails) { + Object.assign(entry, { ...entryDetails }); + await entry.update(); + } + + async function updateReferences(entryDetails, baseEntry, references) { + for (let i in references) { + let compareEntryRef = getValueByPath(entryDetails, references[i]); + let baseEntryRef = getValueByPath(baseEntry, references[i]); + + if (compareEntryRef && compareEntryRef.length > 0 && baseEntryRef && baseEntryRef.length >= 0) { + let compareRefEntry = await managementAPIClient + .stack({ api_key: stackSDKInstance.api_key, branch_uid: compareBranch }) + .contentType(compareEntryRef[0]._content_type_uid) + .entry(compareEntryRef[0].uid) + .fetch(); + let baseRefEntry = await stackSDKInstance + .contentType(compareEntryRef[0]._content_type_uid) + .entry() + .query({ query: { title: compareRefEntry.title } }) + .find(); + + updateValueByPath(entryDetails, references[i], baseRefEntry.items[0].uid); + } + } + } + + try { + compareFilteredProperties.length !== 0 && + compareFilteredProperties.forEach(async (entryDetails) => { + entryDetails = updateAssetDetailsInEntries(entryDetails); + let createdEntry = await stackSDKInstance.contentType('${contentType}').entry().create({ entry: entryDetails }).catch(error => { + throw error; + }); + if(createdEntry){ + if (flag.references) { + await updateReferences(entryDetails, createdEntry, references); + } + await updateEntry(createdEntry, entryDetails); + } + }); + } catch (error) { + throw error; + } + }, + }; + }; + if (compareBranch && branch.length !== 0 && apiKey.length !== 0) { + migration.addTask(createEntryTask()); + } else { + if (apiKey.length === 0) { + console.error('Please provide api key using --stack-api-key flag'); + } + if (!compareBranch) { + console.error('Please provide compare branch through --config compare-branch: flag'); + } + if (branch.length === 0) { + console.error('Please provide branch name through --branch flag'); + } } - } -}; + }; `; } diff --git a/packages/contentstack-branches/src/utils/entry-create-update-script.ts b/packages/contentstack-branches/src/utils/entry-create-update-script.ts new file mode 100644 index 0000000000..9926436dba --- /dev/null +++ b/packages/contentstack-branches/src/utils/entry-create-update-script.ts @@ -0,0 +1,567 @@ +export function entryCreateUpdateScript(contentType) { + return ` + const fs = require('fs'); + const path = require('path'); + module.exports = async ({ migration, stackSDKInstance, managementAPIClient, config, branch, apiKey }) => { + const keysToRemove = [ + 'content_type_uid', + 'created_at', + 'updated_at', + 'created_by', + 'updated_by', + 'ACL', + 'stackHeaders', + 'urlPath', + '_version', + '_in_progress', + 'update', + 'delete', + 'fetch', + 'publish', + 'unpublish', + 'publishRequest', + 'setWorkflowStage', + 'import', + ]; + + let compareBranch = config['compare-branch']; + let filePath = config['file-path'] || process.cwd(); + let assetDirPath = path.resolve(filePath, 'assets'); + let assetDetails = []; + let newAssetDetails = []; + let assetUIDMapper = {}; + let assetUrlMapper = {}; + let assetRefPath = {}; + let isAssetDownload = false; + + function converter(data) { + let arr = []; + for (const elm of data.entries()) { + // @ts-ignore + arr.push([elm[1].title, elm[1]]); + } + return arr; + } + + function deleteUnwantedKeysFromObject(obj, keysToRemove) { + if(obj){ + keysToRemove.map((key) => delete obj[key]); + return obj; + } + } + + function uniquelyConcatenateArrays(compareArr, baseArr) { + let uniqueArray = compareArr.concat(baseArr.filter((item) => compareArr.indexOf(item) < 0)); + return uniqueArray; + } + + function getValueByPath(obj, path) { + return path.split('[').reduce((o, key) => o && o[key.replace(/\]$/, '')], obj); + } + + function updateValueByPath(obj, path, newValue, type, fileIndex) { + path.split('[').reduce((o, key, index, arr) => { + if (index === arr.length - 1) { + if (type === 'file') { + o[key.replace(/]$/, '')][fileIndex] = newValue; + } else { + o[key.replace(/]$/, '')][0].uid = newValue; + } + } else { + return o[key.replace(/\]$/, '')]; + } + }, obj); + } + + const findReference = function (schema, path, flag) { + let references = []; + + for (const i in schema) { + const currentPath = path ? path + '[' + schema[i].uid : schema[i].uid; + if (schema[i].data_type === 'group' || schema[i].data_type === 'global_field') { + references = references.concat(findReference(schema[i].schema, currentPath, flag)); + } else if (schema[i].data_type === 'blocks') { + for (const block in schema[i].blocks) { + references = references.concat( + findReference( + schema[i].blocks[block].schema, + currentPath + '[' + block + '][' + schema[i].blocks[block].uid + ']', + flag, + ), + ); + } + } else if (schema[i].data_type === 'reference') { + flag.references = true; + references.push(currentPath); + } + } + + return references; + }; + + const findAssets = function (schema, entry, refPath, path) { + for (const i in schema) { + const currentPath = path ? path + '[' + schema[i].uid : schema[i].uid; + if (schema[i].data_type === 'group' || schema[i].data_type === 'global_field') { + findAssets(schema[i].schema, entry, refPath, currentPath + '[0]'); + } else if (schema[i].data_type === 'blocks') { + for (const block in schema[i].blocks) { + { + if (schema[i].blocks[block].schema) { + findAssets( + schema[i].blocks[block].schema, + entry, + refPath, + currentPath + '[' + block + '][' + schema[i].blocks[block].uid + ']', + ); + } + } + } + } else if (schema[i].data_type === 'json' && schema[i].field_metadata.rich_text_type) { + findAssetIdsFromJsonRte(entry, schema, refPath, path); + } else if ( + schema[i].data_type === 'text' && + schema[i].field_metadata && + (schema[i].field_metadata.markdown || schema[i].field_metadata.rich_text_type) + ) { + findFileUrls(schema[i], entry); + } else if (schema[i].data_type === 'file') { + refPath.push(currentPath) + const imgDetails = getValueByPath(entry, currentPath); + if (schema[i].multiple) { + if (imgDetails && imgDetails.length) { + imgDetails.forEach((img) => { + const obj = { + uid: img.uid, + parent_uid: img.parent_uid, + description: img.description, + title: img.title, + filename: img.filename, + url: img.url, + }; + assetDetails.push(obj); + }); + } + } else { + if (imgDetails) { + const obj = { + uid: imgDetails.uid, + parent_uid: imgDetails.parent_uid, + description: imgDetails.description, + title: imgDetails.title, + filename: imgDetails.filename, + url: imgDetails.url, + }; + assetDetails.push(obj); + } + } + } + } + }; + + function findFileUrls(schema, _entry) { + let markdownRegEx; + let markdownMatch; + let text; + // Regex to detect v3 asset uri patterns + if (schema && schema.field_metadata && schema.field_metadata.markdown) { + text = marked(JSON.stringify(_entry)); + } else { + text = JSON.stringify(_entry); + } + markdownRegEx = new RegExp( + '(https://(assets|(eu-|azure-na-|azure-eu-)?images).contentstack.(io|com)/v3/assets/(.*?)/(.*?)/(.*?)/(.*?)(?="))', + 'g', + ); + while ((markdownMatch = markdownRegEx.exec(text)) !== null) { + if (markdownMatch && typeof markdownMatch[0] === 'string') { + const assetDetails = markdownMatch[0].split('/'); + //fetch assetUID from url + const assetUID = assetDetails && assetDetails[6]; + const obj = { + uid: assetUID, + url: markdownMatch[0], + }; + assetDetails.push(obj); + } + } + } + + function findAssetIdsFromJsonRte(entryObj, ctSchema) { + if(ctSchema !== undefined){ + for (const element of ctSchema) { + switch (element.data_type) { + case 'blocks': { + if (entryObj[element.uid]) { + if (element.multiple) { + entryObj[element.uid].forEach((e) => { + let key = Object.keys(e).pop(); + let subBlock = element.blocks.filter((block) => block.uid === key).pop(); + findAssetIdsFromJsonRte(e[key], subBlock.schema); + }); + } + } + break; + } + case 'global_field': + case 'group': { + if (entryObj[element.uid]) { + if (element.multiple) { + entryObj[element.uid].forEach((e) => { + findAssetIdsFromJsonRte(e, element.schema); + }); + } else { + findAssetIdsFromJsonRte(entryObj[element.uid], element.schema); + } + } + break; + } + case 'json': { + if (entryObj[element.uid] && element.field_metadata.rich_text_type) { + if (element.multiple) { + entryObj[element.uid].forEach((jsonRteData) => { + gatherJsonRteAssetIds(jsonRteData); + }); + } else { + gatherJsonRteAssetIds(entryObj[element.uid]); + } + } + break; + } + } + } + } + } + + function gatherJsonRteAssetIds(jsonRteData) { + jsonRteData.children.forEach((element) => { + if (element.type) { + switch (element.type) { + case 'a': + case 'p': { + if (element.children && element.children.length > 0) { + gatherJsonRteAssetIds(element); + } + break; + } + case 'reference': { + if (Object.keys(element.attrs).length > 0 && element.attrs.type === 'asset') { + assetDetails.push({ uid: element.attrs['asset-uid'] }); + if (element.attrs['asset-link']) { + const assetDetails = element.attrs['asset-link'].split('/'); + //fetch assetUID from url + const assetUID = assetDetails && assetDetails[6]; + const obj = { + uid: assetUID, + url: element.attrs['asset-link'], + }; + assetDetails.push(obj); + } else if (element.attrs['href']) { + const assetDetails = element.attrs['href'].split('/'); + //fetch assetUID from url + const assetUID = assetDetails && assetDetails[6]; + const obj = { + uid: assetUID, + url: element.attrs['href'], + }; + assetDetails.push(obj); + } + } + if (element.children && element.children.length > 0) { + gatherJsonRteAssetIds(element); + } + break; + } + } + } + }); + } + + const updateAssetDetailsInEntries = function (entry) { + assetRefPath[entry.uid].forEach((refPath) => { + let imgDetails = entry[refPath]; + if (imgDetails !== undefined) { + if (imgDetails && !Array.isArray(imgDetails)) { + entry[refPath] = assetUIDMapper[imgDetails.uid]; + } else if (imgDetails && Array.isArray(imgDetails)) { + for (let i = 0; i < imgDetails.length; i++) { + const img = imgDetails[i]; + entry[refPath][i] = assetUIDMapper[img.uid]; + } + } + } else { + imgDetails = getValueByPath(entry, refPath); + if (imgDetails && !Array.isArray(imgDetails)) { + const imgUID = imgDetails?.uid; + updateValueByPath(entry, refPath, assetUIDMapper[imgUID], 'file', 0); + } else if (imgDetails && Array.isArray(imgDetails)) { + for (let i = 0; i < imgDetails.length; i++) { + const img = imgDetails[i]; + const imgUID = img?.uid; + updateValueByPath(entry, refPath, assetUIDMapper[imgUID], 'file', i); + } + } + } + }); + entry = JSON.stringify(entry); + const assetUrls = assetDetails.map((asset) => asset.url); + const assetUIDs = assetDetails.map((asset) => asset.uid); + assetUrls.forEach(function (assetUrl) { + let mappedAssetUrl = assetUrlMapper[assetUrl]; + if (typeof mappedAssetUrl !== 'undefined') { + entry = entry.replace(assetUrl, mappedAssetUrl); + } + }); + + assetUIDs.forEach(function (assetUid) { + let uid = assetUIDMapper[assetUid]; + if (typeof uid !== 'undefined') { + entry = entry.replace(new RegExp(assetUid, 'img'), uid); + } + }); + return JSON.parse(entry); + }; + + const checkAndDownloadAsset = async function (cAsset) { + if (cAsset) { + const assetUID = cAsset.uid; + const bAssetDetail = await managementAPIClient + .stack({ api_key: stackSDKInstance.api_key, branch_uid: branch }) + .asset(assetUID) + .fetch() + .then((assets) => assets) + .catch((error) => {}); + if (bAssetDetail) { + assetUIDMapper[cAsset.uid] = bAssetDetail.uid; + assetUrlMapper[cAsset.url] = bAssetDetail.url; + return false; + } + else { + isAssetDownload = true; + const cAssetDetail = await managementAPIClient + .stack({ api_key: stackSDKInstance.api_key, branch_uid: compareBranch }) + .asset(assetUID) + .fetch() + .then((assets) => assets) + .catch((error) => {}); + const updatedObj = { + parent_uid: cAssetDetail.parent_uid, + description: cAssetDetail.description, + title: cAssetDetail.title, + filename: cAssetDetail.filename, + url: cAssetDetail.url, + }; + Object.assign(cAsset, updatedObj); + const url = cAssetDetail?.url; + if (url) { + const assetFolderPath = path.resolve(assetDirPath, assetUID); + if (!fs.existsSync(assetFolderPath)) fs.mkdirSync(assetFolderPath); + const assetFilePath = path.resolve(assetFolderPath, cAsset.filename); + const assetWriterStream = fs.createWriteStream(assetFilePath); + const data = await managementAPIClient + .stack({ api_key: stackSDKInstance.api_key, branch_uid: compareBranch }) + .asset(assetUID) + .download({ url, responseType: 'stream' }) + .then(({ data }) => data) + .catch((error) => { + throw error; + }); + assetWriterStream.on('error', (error) => { + throw error; + }); + data.pipe(assetWriterStream); + } + } + } + return cAsset; + }; + + const uploadAssets = async function () { + const assetFolderMap = JSON.parse(fs.readFileSync(path.resolve(filePath, 'folder-mapper.json'), 'utf8')); + const stackAPIClient = managementAPIClient.stack({ api_key: stackSDKInstance.api_key, branch_uid: branch }); + for (let i = 0; i < assetDetails?.length; i++) { + const asset = assetDetails[i]; + let requestOption = {}; + + requestOption.parent_uid = assetFolderMap[asset.parent_uid] || asset.parent_uid; + + if (asset.hasOwnProperty('description') && typeof asset.description === 'string') { + requestOption.description = asset.description; + } + + if (asset.hasOwnProperty('tags') && Array.isArray(asset.tags)) { + requestOption.tags = asset.tags; + } + + if (asset.hasOwnProperty('title') && typeof asset.title === 'string') { + requestOption.title = asset.title; + } + requestOption.upload = path.resolve(assetDirPath, asset.uid, asset.filename); + const res = await stackAPIClient + .asset() + .create(requestOption) + .then((asset) => asset) + .catch((error) => { + throw error; + }); + assetUIDMapper[asset.uid] = res && res.uid; + assetUrlMapper[asset.url] = res && res.url; + } + }; + + + const updateEntryTask = () => { + return { + title: 'Update Entries', + successMessage: 'Entries Updated Successfully', + failedMessage: 'Failed to update entries', + task: async () => { + let compareBranchEntries = await managementAPIClient + .stack({ api_key: stackSDKInstance.api_key, branch_uid: compareBranch }) + .contentType('${contentType}') + .entry() + .query() + .find(); + + let baseBranchEntries = await stackSDKInstance.contentType('${contentType}').entry().query().find(); + + let contentType = await managementAPIClient + .stack({ api_key: stackSDKInstance.api_key, branch_uid: compareBranch }) + .contentType('${contentType}') + .fetch(); + + for (let i = 0; i < compareBranchEntries?.items?.length; i++) { + assetRefPath[compareBranchEntries.items[i].uid] = [] + findAssets(contentType.schema, compareBranchEntries.items[i], assetRefPath[compareBranchEntries.items[i].uid]); + } + + for (let i = 0; i < baseBranchEntries?.items?.length; i++) { + assetRefPath[baseBranchEntries.items[i].uid] = [] + findAssets(contentType.schema, baseBranchEntries.items[i], assetRefPath[baseBranchEntries.items[i].uid]); + } + assetDetails = [...new Map(assetDetails.map((item) => [item['uid'], item])).values()]; + newAssetDetails = assetDetails; + + if (newAssetDetails && newAssetDetails.length) { + if (!fs.existsSync(assetDirPath)) { + fs.mkdirSync(assetDirPath); + } + for (let i = 0; i < newAssetDetails.length; i++) { + const asset = newAssetDetails[i]; + const updatedCAsset = await checkAndDownloadAsset(asset); + if(updatedCAsset){ + newAssetDetails[i] = updatedCAsset; + } + } + if (isAssetDownload) await uploadAssets(); + } + + let flag = { + references: false + }; + + const references = await findReference(contentType.schema, '', flag); + + async function updateEntry(entry, entryDetails) { + Object.assign(entry, { ...entryDetails }); + await entry.update(); + } + + async function updateReferences(entryDetails, baseEntry, references) { + for (let i in references) { + let compareEntryRef = getValueByPath(entryDetails, references[i]); + let baseEntryRef = getValueByPath(baseEntry, references[i]); + + if (compareEntryRef && compareEntryRef.length > 0 && baseEntryRef && baseEntryRef.length >= 0) { + let compareRefEntry = await managementAPIClient + .stack({ api_key: stackSDKInstance.api_key, branch_uid: compareBranch }) + .contentType(compareEntryRef[0]._content_type_uid) + .entry(compareEntryRef[0].uid) + .fetch(); + let baseRefEntry = await stackSDKInstance + .contentType(compareEntryRef[0]._content_type_uid) + .entry() + .query({ query: { title: compareRefEntry.title } }) + .find(); + + updateValueByPath(entryDetails, references[i], baseRefEntry.items[0].uid); + } + } + } + + try { + if (contentType.options.singleton) { + compareBranchEntries.items.map(async (el) => { + let entryDetails = deleteUnwantedKeysFromObject(el, keysToRemove); + entryDetails = updateAssetDetailsInEntries(entryDetails); + + if (baseBranchEntries && baseBranchEntries.items.length) { + let baseEntryUid = baseBranchEntries.items[0].uid; + let entry = await stackSDKInstance.contentType('${contentType}').entry(baseEntryUid); + + if (flag.references) { + await updateReferences(entryDetails, baseBranchEntries.items[0], references); + } + + await updateEntry(entry, entryDetails); + } else { + let createdEntry = await stackSDKInstance.contentType('${contentType}').entry().create({ entry: entryDetails }); + + if (flag.references) { + await updateReferences(entryDetails, createdEntry, references); + } + + await updateEntry(createdEntry, entryDetails); + } + }); + } else { + let compareMap = new Map(converter(compareBranchEntries.items)); + let baseMap = new Map(converter(baseBranchEntries.items)); + + let arr = uniquelyConcatenateArrays(Array.from(compareMap.keys()), Array.from(baseMap.keys())); + + arr.map(async (el) => { + let entryDetails = deleteUnwantedKeysFromObject(compareMap.get(el), keysToRemove); + entryDetails = updateAssetDetailsInEntries(entryDetails); + if (compareMap.get(el) && !baseMap.get(el)) { + let createdEntry = await stackSDKInstance.contentType('${contentType}').entry().create({ entry: entryDetails }); + + if (flag.references) { + await updateReferences(entryDetails, createdEntry, references); + } + + await updateEntry(createdEntry, entryDetails); + } else if (compareMap.get(el) && baseMap.get(el)) { + let baseEntry = baseMap.get(el); + let entry = await stackSDKInstance.contentType('${contentType}').entry(baseEntry.uid); + + if (flag.references) { + await updateReferences(entryDetails, baseEntry, references); + } + + await updateEntry(entry, entryDetails); + } + }); + } + } catch (error) { + throw error; + } + }, + }; + }; + + if (compareBranch && branch.length !== 0 && apiKey.length !== 0) { + migration.addTask(updateEntryTask()); + } else { + if (apiKey.length === 0) { + console.error('Please provide api key using --stack-api-key flag'); + } + if (!compareBranch) { + console.error('Please provide compare branch through --config compare-branch: flag'); + } + if (branch.length === 0) { + console.error('Please provide branch name through --branch flag'); + } + } + };`; +} diff --git a/packages/contentstack-branches/src/utils/entry-update-script.ts b/packages/contentstack-branches/src/utils/entry-update-script.ts index ebd4678681..1ee65bff4a 100644 --- a/packages/contentstack-branches/src/utils/entry-update-script.ts +++ b/packages/contentstack-branches/src/utils/entry-update-script.ts @@ -1,122 +1,566 @@ export function entryUpdateScript(contentType) { return ` -module.exports = async ({ migration, stackSDKInstance, managementAPIClient, config, branch, apiKey }) => { - const keysToRemove = [ - 'content_type_uid', - 'created_at', - 'updated_at', - 'created_by', - 'updated_by', - 'ACL', - 'stackHeaders', - 'urlPath', - '_version', - '_in_progress', - 'update', - 'delete', - 'fetch', - 'publish', - 'unpublish', - 'publishRequest', - 'setWorkflowStage', - 'import', - ]; + const fs = require('fs'); + const path = require('path'); + module.exports = async ({ migration, stackSDKInstance, managementAPIClient, config, branch, apiKey }) => { + const keysToRemove = [ + 'content_type_uid', + 'created_at', + 'updated_at', + 'created_by', + 'updated_by', + 'ACL', + 'stackHeaders', + 'urlPath', + '_version', + '_in_progress', + 'update', + 'delete', + 'fetch', + 'publish', + 'unpublish', + 'publishRequest', + 'setWorkflowStage', + 'import', + ]; + + let compareBranch = config['compare-branch']; + let filePath = config['file-path'] || process.cwd(); + let assetDirPath = path.resolve(filePath, 'assets'); + let assetDetails = []; + let newAssetDetails = []; + let assetUIDMapper = {}; + let assetUrlMapper = {}; + let assetRefPath = {}; + let isAssetDownload = false; + + function converter(data) { + let arr = []; + for (const elm of data.entries()) { + // @ts-ignore + arr.push([elm[1].title, elm[1]]); + } + return arr; + } + + function deleteUnwantedKeysFromObject(obj, keysToRemove) { + if(obj){ + keysToRemove.map((key) => delete obj[key]); + return obj; + } + } + + function uniquelyConcatenateArrays(compareArr, baseArr) { + let uniqueArray = compareArr.concat(baseArr.filter((item) => compareArr.indexOf(item) < 0)); + return uniqueArray; + } + + function getValueByPath(obj, path) { + return path.split('[').reduce((o, key) => o && o[key.replace(/\]$/, '')], obj); + } + + function updateValueByPath(obj, path, newValue, type, fileIndex) { + path.split('[').reduce((o, key, index, arr) => { + if (index === arr.length - 1) { + if (type === 'file') { + o[key.replace(/]$/, '')][fileIndex] = newValue; + } else { + o[key.replace(/]$/, '')][0].uid = newValue; + } + } else { + return o[key.replace(/\]$/, '')]; + } + }, obj); + } - let compareBranch = config['compare-branch']; + const findReference = function (schema, path, flag) { + let references = []; + + for (const i in schema) { + const currentPath = path ? path + '[' + schema[i].uid : schema[i].uid; + if (schema[i].data_type === 'group' || schema[i].data_type === 'global_field') { + references = references.concat(findReference(schema[i].schema, currentPath, flag)); + } else if (schema[i].data_type === 'blocks') { + for (const block in schema[i].blocks) { + references = references.concat( + findReference( + schema[i].blocks[block].schema, + currentPath + '[' + block + '][' + schema[i].blocks[block].uid + ']', + flag, + ), + ); + } + } else if (schema[i].data_type === 'reference') { + flag.references = true; + references.push(currentPath); + } + } + + return references; + }; - function converter(data) { - let arr = []; - for (const elm of data.entries()) { - // @ts-ignore - arr.push([elm[1].title, elm[1]]); + const findAssets = function (schema, entry, refPath, path) { + for (const i in schema) { + const currentPath = path ? path + '[' + schema[i].uid : schema[i].uid; + if (schema[i].data_type === 'group' || schema[i].data_type === 'global_field') { + findAssets(schema[i].schema, entry, refPath, currentPath + '[0]'); + } else if (schema[i].data_type === 'blocks') { + for (const block in schema[i].blocks) { + { + if (schema[i].blocks[block].schema) { + findAssets( + schema[i].blocks[block].schema, + entry, + refPath, + currentPath + '[' + block + '][' + schema[i].blocks[block].uid + ']', + ); + } + } + } + } else if (schema[i].data_type === 'json' && schema[i].field_metadata.rich_text_type) { + findAssetIdsFromJsonRte(entry, schema, refPath, path); + } else if ( + schema[i].data_type === 'text' && + schema[i].field_metadata && + (schema[i].field_metadata.markdown || schema[i].field_metadata.rich_text_type) + ) { + findFileUrls(schema[i], entry); + } else if (schema[i].data_type === 'file') { + refPath.push(currentPath) + const imgDetails = getValueByPath(entry, currentPath); + if (schema[i].multiple) { + if (imgDetails && imgDetails.length) { + imgDetails.forEach((img) => { + const obj = { + uid: img.uid, + parent_uid: img.parent_uid, + description: img.description, + title: img.title, + filename: img.filename, + url: img.url, + }; + assetDetails.push(obj); + }); + } + } else { + if (imgDetails) { + const obj = { + uid: imgDetails.uid, + parent_uid: imgDetails.parent_uid, + description: imgDetails.description, + title: imgDetails.title, + filename: imgDetails.filename, + url: imgDetails.url, + }; + assetDetails.push(obj); + } + } + } + } + }; + + function findFileUrls(schema, _entry) { + let markdownRegEx; + let markdownMatch; + let text; + // Regex to detect v3 asset uri patterns + if (schema && schema.field_metadata && schema.field_metadata.markdown) { + text = marked(JSON.stringify(_entry)); + } else { + text = JSON.stringify(_entry); + } + markdownRegEx = new RegExp( + '(https://(assets|(eu-|azure-na-|azure-eu-)?images).contentstack.(io|com)/v3/assets/(.*?)/(.*?)/(.*?)/(.*?)(?="))', + 'g', + ); + while ((markdownMatch = markdownRegEx.exec(text)) !== null) { + if (markdownMatch && typeof markdownMatch[0] === 'string') { + const assetDetails = markdownMatch[0].split('/'); + //fetch assetUID from url + const assetUID = assetDetails && assetDetails[6]; + const obj = { + uid: assetUID, + url: markdownMatch[0], + }; + assetDetails.push(obj); + } + } } - return arr; - } - - function deleteUnwantedKeysFromObject(obj, keysToRemove) { - if(obj){ - keysToRemove.map((key) => delete obj[key]); - return obj; + + function findAssetIdsFromJsonRte(entryObj, ctSchema) { + if(ctSchema !== undefined){ + for (const element of ctSchema) { + switch (element.data_type) { + case 'blocks': { + if (entryObj[element.uid]) { + if (element.multiple) { + entryObj[element.uid].forEach((e) => { + let key = Object.keys(e).pop(); + let subBlock = element.blocks.filter((block) => block.uid === key).pop(); + findAssetIdsFromJsonRte(e[key], subBlock.schema); + }); + } + } + break; + } + case 'global_field': + case 'group': { + if (entryObj[element.uid]) { + if (element.multiple) { + entryObj[element.uid].forEach((e) => { + findAssetIdsFromJsonRte(e, element.schema); + }); + } else { + findAssetIdsFromJsonRte(entryObj[element.uid], element.schema); + } + } + break; + } + case 'json': { + if (entryObj[element.uid] && element.field_metadata.rich_text_type) { + if (element.multiple) { + entryObj[element.uid].forEach((jsonRteData) => { + gatherJsonRteAssetIds(jsonRteData); + }); + } else { + gatherJsonRteAssetIds(entryObj[element.uid]); + } + } + break; + } + } + } + } } - } - - function uniquelyConcatenateArrays(compareArr, baseArr) { - let uniqueArray = compareArr.concat(baseArr.filter((item) => compareArr.indexOf(item) < 0)); - return uniqueArray; - } + + function gatherJsonRteAssetIds(jsonRteData) { + jsonRteData.children.forEach((element) => { + if (element.type) { + switch (element.type) { + case 'a': + case 'p': { + if (element.children && element.children.length > 0) { + gatherJsonRteAssetIds(element); + } + break; + } + case 'reference': { + if (Object.keys(element.attrs).length > 0 && element.attrs.type === 'asset') { + assetDetails.push({ uid: element.attrs['asset-uid'] }); + if (element.attrs['asset-link']) { + const assetDetails = element.attrs['asset-link'].split('/'); + //fetch assetUID from url + const assetUID = assetDetails && assetDetails[6]; + const obj = { + uid: assetUID, + url: element.attrs['asset-link'], + }; + assetDetails.push(obj); + } else if (element.attrs['href']) { + const assetDetails = element.attrs['href'].split('/'); + //fetch assetUID from url + const assetUID = assetDetails && assetDetails[6]; + const obj = { + uid: assetUID, + url: element.attrs['href'], + }; + assetDetails.push(obj); + } + } + if (element.children && element.children.length > 0) { + gatherJsonRteAssetIds(element); + } + break; + } + } + } + }); + } + + const updateAssetDetailsInEntries = function (entry) { + assetRefPath[entry.uid].forEach((refPath) => { + let imgDetails = entry[refPath]; + if (imgDetails !== undefined) { + if (imgDetails && !Array.isArray(imgDetails)) { + entry[refPath] = assetUIDMapper[imgDetails.uid]; + } else if (imgDetails && Array.isArray(imgDetails)) { + for (let i = 0; i < imgDetails.length; i++) { + const img = imgDetails[i]; + entry[refPath][i] = assetUIDMapper[img.uid]; + } + } + } else { + imgDetails = getValueByPath(entry, refPath); + if (imgDetails && !Array.isArray(imgDetails)) { + const imgUID = imgDetails?.uid; + updateValueByPath(entry, refPath, assetUIDMapper[imgUID], 'file', 0); + } else if (imgDetails && Array.isArray(imgDetails)) { + for (let i = 0; i < imgDetails.length; i++) { + const img = imgDetails[i]; + const imgUID = img?.uid; + updateValueByPath(entry, refPath, assetUIDMapper[imgUID], 'file', i); + } + } + } + }); + entry = JSON.stringify(entry); + const assetUrls = assetDetails.map((asset) => asset.url); + const assetUIDs = assetDetails.map((asset) => asset.uid); + assetUrls.forEach(function (assetUrl) { + let mappedAssetUrl = assetUrlMapper[assetUrl]; + if (typeof mappedAssetUrl !== 'undefined') { + entry = entry.replace(assetUrl, mappedAssetUrl); + } + }); + + assetUIDs.forEach(function (assetUid) { + let uid = assetUIDMapper[assetUid]; + if (typeof uid !== 'undefined') { + entry = entry.replace(new RegExp(assetUid, 'img'), uid); + } + }); + return JSON.parse(entry); + }; + + const checkAndDownloadAsset = async function (cAsset) { + if (cAsset) { + const assetUID = cAsset.uid; + const bAssetDetail = await managementAPIClient + .stack({ api_key: stackSDKInstance.api_key, branch_uid: branch }) + .asset(assetUID) + .fetch() + .then((assets) => assets) + .catch((error) => {}); + if (bAssetDetail) { + assetUIDMapper[cAsset.uid] = bAssetDetail.uid; + assetUrlMapper[cAsset.url] = bAssetDetail.url; + return false; + } + else { + isAssetDownload = true; + const cAssetDetail = await managementAPIClient + .stack({ api_key: stackSDKInstance.api_key, branch_uid: compareBranch }) + .asset(assetUID) + .fetch() + .then((assets) => assets) + .catch((error) => {}); + const updatedObj = { + parent_uid: cAssetDetail.parent_uid, + description: cAssetDetail.description, + title: cAssetDetail.title, + filename: cAssetDetail.filename, + url: cAssetDetail.url, + }; + Object.assign(cAsset, updatedObj); + const url = cAssetDetail?.url; + if (url) { + const assetFolderPath = path.resolve(assetDirPath, assetUID); + if (!fs.existsSync(assetFolderPath)) fs.mkdirSync(assetFolderPath); + const assetFilePath = path.resolve(assetFolderPath, cAsset.filename); + const assetWriterStream = fs.createWriteStream(assetFilePath); + const data = await managementAPIClient + .stack({ api_key: stackSDKInstance.api_key, branch_uid: compareBranch }) + .asset(assetUID) + .download({ url, responseType: 'stream' }) + .then(({ data }) => data) + .catch((error) => { + throw error; + }); + assetWriterStream.on('error', (error) => { + throw error; + }); + data.pipe(assetWriterStream); + } + } + } + return cAsset; + }; + + const uploadAssets = async function () { + const assetFolderMap = JSON.parse(fs.readFileSync(path.resolve(filePath, 'folder-mapper.json'), 'utf8')); + const stackAPIClient = managementAPIClient.stack({ api_key: stackSDKInstance.api_key, branch_uid: branch }); + for (let i = 0; i < assetDetails?.length; i++) { + const asset = assetDetails[i]; + let requestOption = {}; + + requestOption.parent_uid = assetFolderMap[asset.parent_uid] || asset.parent_uid; + + if (asset.hasOwnProperty('description') && typeof asset.description === 'string') { + requestOption.description = asset.description; + } + + if (asset.hasOwnProperty('tags') && Array.isArray(asset.tags)) { + requestOption.tags = asset.tags; + } + + if (asset.hasOwnProperty('title') && typeof asset.title === 'string') { + requestOption.title = asset.title; + } + requestOption.upload = path.resolve(assetDirPath, asset.uid, asset.filename); + const res = await stackAPIClient + .asset() + .create(requestOption) + .then((asset) => asset) + .catch((error) => { + throw error; + }); + assetUIDMapper[asset.uid] = res && res.uid; + assetUrlMapper[asset.url] = res && res.url; + } + }; - const updateEntryTask = () => { - return { - title: 'Update Entries', - successMessage: 'Entries Updated Successfully', - failedMessage: 'Failed to update entries', - task: async () => { - let compareBranchEntries = await managementAPIClient - .stack({ api_key: stackSDKInstance.api_key, branch_uid: compareBranch }) - .contentType('${contentType}') - .entry() - .query() - .find(); + const updateEntryTask = () => { + return { + title: 'Update Entries', + successMessage: 'Entries Updated Successfully', + failedMessage: 'Failed to update entries', + task: async () => { + let compareBranchEntries = await managementAPIClient + .stack({ api_key: stackSDKInstance.api_key, branch_uid: compareBranch }) + .contentType('${contentType}') + .entry() + .query() + .find(); + + let baseBranchEntries = await stackSDKInstance.contentType('${contentType}').entry().query().find(); + + let contentType = await managementAPIClient + .stack({ api_key: stackSDKInstance.api_key, branch_uid: compareBranch }) + .contentType('${contentType}') + .fetch(); - let baseBranchEntries = await stackSDKInstance.contentType('${contentType}').entry().query().find(); + for (let i = 0; i < compareBranchEntries?.items?.length; i++) { + assetRefPath[compareBranchEntries.items[i].uid] = [] + findAssets(contentType.schema, compareBranchEntries.items[i], assetRefPath[compareBranchEntries.items[i].uid]); + } - let contentType = await managementAPIClient - .stack({ api_key: stackSDKInstance.api_key, branch_uid: compareBranch }) - .contentType('${contentType}') - .fetch(); - try { - if (contentType.options.singleton) { - compareBranchEntries.items.map(async (el) => { - let entryDetails = deleteUnwantedKeysFromObject(el, keysToRemove); + for (let i = 0; i < baseBranchEntries?.items?.length; i++) { + assetRefPath[baseBranchEntries.items[i].uid] = [] + findAssets(contentType.schema, baseBranchEntries.items[i], assetRefPath[baseBranchEntries.items[i].uid]); + } + assetDetails = [...new Map(assetDetails.map((item) => [item['uid'], item])).values()]; + newAssetDetails = assetDetails; - if (baseBranchEntries.items.length) { - let baseEntryUid = baseBranchEntries.items[0].uid; - let entry = await stackSDKInstance.contentType('${contentType}').entry(baseEntryUid); - Object.assign(entry, { ...entryDetails }); - entry.update(); - } else { - await stackSDKInstance.contentType('${contentType}').entry().create({ entry: entryDetails }); + if (newAssetDetails && newAssetDetails.length) { + if (!fs.existsSync(assetDirPath)) { + fs.mkdirSync(assetDirPath); + } + for (let i = 0; i < newAssetDetails.length; i++) { + const asset = newAssetDetails[i]; + const updatedCAsset = await checkAndDownloadAsset(asset); + if(updatedCAsset){ + newAssetDetails[i] = updatedCAsset; } - }); - } else { - let compareMap = new Map(converter(compareBranchEntries.items)); - let baseMap = new Map(converter(baseBranchEntries.items)); + } + if (isAssetDownload) await uploadAssets(); + } - let arr = uniquelyConcatenateArrays(Array.from(compareMap.keys()), Array.from(baseMap.keys())); + let flag = { + references: false + }; + + const references = await findReference(contentType.schema, '', flag); + + async function updateEntry(entry, entryDetails) { + Object.assign(entry, { ...entryDetails }); + await entry.update(); + } - arr.map(async (el) => { - let entryDetails = deleteUnwantedKeysFromObject(compareMap.get(el), keysToRemove); + async function updateReferences(entryDetails, baseEntry, references) { + for (let i in references) { + let compareEntryRef = getValueByPath(entryDetails, references[i]); + let baseEntryRef = getValueByPath(baseEntry, references[i]); + + if (compareEntryRef && compareEntryRef.length > 0 && baseEntryRef && baseEntryRef.length >= 0) { + let compareRefEntry = await managementAPIClient + .stack({ api_key: stackSDKInstance.api_key, branch_uid: compareBranch }) + .contentType(compareEntryRef[0]._content_type_uid) + .entry(compareEntryRef[0].uid) + .fetch(); + let baseRefEntry = await stackSDKInstance + .contentType(compareEntryRef[0]._content_type_uid) + .entry() + .query({ query: { title: compareRefEntry.title } }) + .find(); + + updateValueByPath(entryDetails, references[i], baseRefEntry.items[0].uid); + } + } + } - if (compareMap.get(el) && !baseMap.get(el)) { - await stackSDKInstance.contentType('${contentType}').entry().create({ entry: entryDetails }); - } else if (compareMap.get(el) && baseMap.get(el)) { - let baseEntry = baseMap.get(el); + try { + if (contentType.options.singleton) { + compareBranchEntries.items.map(async (el) => { + let entryDetails = deleteUnwantedKeysFromObject(el, keysToRemove); + entryDetails = updateAssetDetailsInEntries(entryDetails); + + if (baseBranchEntries && baseBranchEntries.items.length) { + let baseEntryUid = baseBranchEntries.items[0].uid; + let entry = await stackSDKInstance.contentType('${contentType}').entry(baseEntryUid); + + if (flag.references) { + await updateReferences(entryDetails, baseBranchEntries.items[0], references); + } + + await updateEntry(entry, entryDetails); + } else { + let createdEntry = await stackSDKInstance.contentType('${contentType}').entry().create({ entry: entryDetails }); + + if (flag.references) { + await updateReferences(entryDetails, createdEntry, references); + } + + await updateEntry(createdEntry, entryDetails); + } + }); + } else { + let compareMap = new Map(converter(compareBranchEntries.items)); + let baseMap = new Map(converter(baseBranchEntries.items)); + + let arr = uniquelyConcatenateArrays(Array.from(compareMap.keys()), Array.from(baseMap.keys())); + + arr.map(async (el) => { + let entryDetails = deleteUnwantedKeysFromObject(compareMap.get(el), keysToRemove); + entryDetails = updateAssetDetailsInEntries(entryDetails); + if (compareMap.get(el) && !baseMap.get(el)) { + let createdEntry = await stackSDKInstance.contentType('${contentType}').entry().create({ entry: entryDetails }); + + if (flag.references) { + await updateReferences(entryDetails, createdEntry, references); + } + + await updateEntry(createdEntry, entryDetails); + } else if (compareMap.get(el) && baseMap.get(el)) { + let baseEntry = baseMap.get(el); + let entry = await stackSDKInstance.contentType('${contentType}').entry(baseEntry.uid); + + if (flag.references) { + await updateReferences(entryDetails, baseEntry, references); + } - let entry = await stackSDKInstance.contentType('${contentType}').entry(baseEntry.uid); - Object.assign(entry, { ...entryDetails }); - entry.update(); - } - }); + await updateEntry(entry, entryDetails); + } + }); + } + } catch (error) { + throw error; } - } catch (error) { - throw error; - } - }, + }, + }; }; - }; - - if (compareBranch && branch.length !== 0 && apiKey.length !== 0) { - migration.addTask(updateEntryTask()); - } else { - if (apiKey.length === 0) { - console.error('Please provide api key using --stack-api-key flag'); - } - if (!compareBranch) { - console.error('Please provide compare branch through --config compare-branch: flag'); - } - if (branch.length === 0) { - console.error('Please provide branch name through --branch flag'); + + if (compareBranch && branch.length !== 0 && apiKey.length !== 0) { + migration.addTask(updateEntryTask()); + } else { + if (apiKey.length === 0) { + console.error('Please provide api key using --stack-api-key flag'); + } + if (!compareBranch) { + console.error('Please provide compare branch through --config compare-branch: flag'); + } + if (branch.length === 0) { + console.error('Please provide branch name through --branch flag'); + } } - } -};`; + };`; } diff --git a/packages/contentstack-branches/src/utils/interactive.ts b/packages/contentstack-branches/src/utils/interactive.ts index cfe27e9f67..958eca36e5 100644 --- a/packages/contentstack-branches/src/utils/interactive.ts +++ b/packages/contentstack-branches/src/utils/interactive.ts @@ -134,6 +134,8 @@ export async function selectMergeExecution(): Promise { choices: [ { name: 'Execute Merge', value: 'both' }, { name: 'Export Merge Summary', value: 'export' }, + { name: 'Execute Merge and Generate Content Migration Scripts', value: 'merge_n_scripts' }, + { name: 'Export Summary and Generate Content Migration Scripts', value: 'summary_n_scripts' }, { name: 'Go Back', value: 'previous' }, { name: 'Start Over', value: 'restart' }, ], @@ -148,6 +150,28 @@ export async function selectMergeExecution(): Promise { return strategy; } +export async function selectContentMergePreference(): Promise { + const strategy = await cliux + .inquire({ + type: 'list', + name: 'module', + choices: [ + { name: 'Both existing and new', value: 'existing_new' }, + { name: 'New only', value: 'new' }, + { name: 'Existing only', value: 'existing' }, + { name: 'Ask for preference', value: 'ask_preference' }, + ], + message: 'What content entries do you want to migrate?', + }) + .then((name) => name as string) + .catch((err) => { + cliux.error('Failed to collect the preference'); + process.exit(1); + }); + + return strategy; +} + export async function askExportMergeSummaryPath(): Promise { return await cliux.inquire({ type: 'input', @@ -247,3 +271,66 @@ export async function askBranchNameConfirmation(): Promise { validate: inquireRequireFieldValidation, }); } + +export async function selectContentMergeCustomPreferences(payload) { + // parse rows + const tableRows = []; + if (payload.modified?.length || payload.added?.length) { + forEach(payload.added, (item: BranchDiffRes) => { + const row: any = {}; + row.name = `+ ${item.title}`; + row.status = 'added'; + row.value = item; + tableRows.push(row); + }); + + forEach(payload.modified, (item: BranchDiffRes) => { + const row: any = {}; + row.name = `± ${item.title}`; + row.status = 'modified'; + row.value = item; + tableRows.push(row); + }); + } else { + return; + } + + const selectedStrategies = await cliux.inquire({ + type: 'table', + message: `Select the Content Entry changes for merge`, + name: 'mergeContentEntriesPreferences', + selectAll: true, + pageSize: 10, + columns: [ + { + name: 'Merge New Only', + value: 'merge_new', + }, + { + name: 'Merge Modified Only', + value: 'merge_existing', + }, + { + name: 'Merge Both', + value: 'merge_existing_new', + }, + { + name: 'Ignore', + value: 'ignore', + }, + ], + rows: tableRows, + }); + + let updatedArray = []; + forEach(selectedStrategies, (strategy: string, index: number) => { + const selectedItem = tableRows[index]; + + if (strategy && selectedItem) { + selectedItem.value.entry_merge_strategy = strategy; + updatedArray.push(selectedItem); + } + }); + + return updatedArray; // selected items +} diff --git a/packages/contentstack-bulk-publish/.mocharc.json b/packages/contentstack-bulk-publish/.mocharc.json new file mode 100644 index 0000000000..50e4a68045 --- /dev/null +++ b/packages/contentstack-bulk-publish/.mocharc.json @@ -0,0 +1,13 @@ +{ + "recursive": true, + "spec": [ + "test/unit/commands/assets/publish.test.js", + "test/unit/commands/assets/unpublish.test.js", + "test/unit/commands/bulk-publish/cross-publish.test.js", + "test/unit/commands/entries/publish.test.js", + "test/unit/commands/entries/unpublish.test.js" + ], + "reporter": "dot", + "timeout": 60000, + "exit": true +} \ No newline at end of file diff --git a/packages/contentstack-bulk-publish/README.md b/packages/contentstack-bulk-publish/README.md index 7de57a81c3..c7295eccb1 100644 --- a/packages/contentstack-bulk-publish/README.md +++ b/packages/contentstack-bulk-publish/README.md @@ -18,7 +18,7 @@ $ npm install -g @contentstack/cli-cm-bulk-publish $ csdx COMMAND running command... $ csdx (--version) -@contentstack/cli-cm-bulk-publish/1.3.8 darwin-arm64 node-v18.16.0 +@contentstack/cli-cm-bulk-publish/1.3.10 darwin-arm64 node-v20.3.1 $ csdx --help [COMMAND] USAGE $ csdx COMMAND @@ -70,6 +70,7 @@ FLAGS -a, --alias= Alias(name) for the management token -c, --config= Path to the config file -e, --environments=... Environments where assets will be published + -k, --stack-api-key= Stack api key to be used -l, --locales=... Locales to where assets will be published -y, --yes Agree to process the command with the current configuration --api-version= API Version to be used. Values [Default: 3, Nested Reference Publishing: 3.2]. @@ -124,6 +125,12 @@ EXAMPLES Using --source-env $ csdx cm:assets:publish --environments [ENVIRONMENT 1] [ENVIRONMENT 2] --locales [LOCALE] --alias [MANAGEMENT TOKEN ALIAS] --source-env [SOURCE ENVIRONMENT] --delivery-token [DELIVERY TOKEN] + + + + Using --stack-api-key flag + + $ csdx cm:assets:publish --environments [ENVIRONMENT 1] [ENVIRONMENT 2] --locales [LOCALE] --stack-api-key [STACK API KEY] ``` _See code: [src/commands/cm/assets/publish.js](https://github.com/contentstack/cli/blob/main/packages/contentstack-bulk-publish/src/commands/cm/assets/publish.js)_ @@ -134,22 +141,23 @@ Unpublish assets from given environment ``` USAGE - $ csdx cm:assets:unpublish [-a ] [-e ] [-c ] [-y] [--locale ] [--branch ] - [--retry-failed ] [--bulk-unpublish ] [--api-version ] [--delivery-token ] + $ csdx cm:assets:unpublish [-a ] [-k ] [-e ] [-c ] [-y] [--locale ] [--branch + ] [--retry-failed ] [--bulk-unpublish ] [--api-version ] [--delivery-token ] FLAGS - -a, --alias= Alias(name) for the management token - -c, --config= Path to the config file - -e, --environment= Source Environment - -y, --yes Agree to process the command with the current configuration - --api-version= API Version to be used. Values [Default: 3, Nested Reference Publishing: 3.2]. - --branch= [default: main] Specify the branch to fetch the content (by default the main branch is - selected) - --bulk-unpublish= [default: true] By default this flag is set as true. It indicates that contentstack's - bulkpublish API will be used to unpublish the assets - --delivery-token= Delivery Token for source environment - --locale= Locale filter - --retry-failed= Retry unpublishing failed assets from the logfile + -a, --alias= Alias(name) for the management token + -c, --config= Path to the config file + -e, --environment= Source Environment + -k, --stack-api-key= Stack api key to be used + -y, --yes Agree to process the command with the current configuration + --api-version= API Version to be used. Values [Default: 3, Nested Reference Publishing: 3.2]. + --branch= [default: main] Specify the branch to fetch the content (by default the main branch is + selected) + --bulk-unpublish= [default: true] By default this flag is set as true. It indicates that contentstack's + bulkpublish API will be used to unpublish the assets + --delivery-token= Delivery Token for source environment + --locale= Locale filter + --retry-failed= Retry unpublishing failed assets from the logfile DESCRIPTION Unpublish assets from given environment @@ -184,6 +192,12 @@ EXAMPLES Using --branch flag $ csdx cm:assets:unpublish --bulk-unpublish --environment [SOURCE ENV] --locale [LOCALE] --alias [MANAGEMENT TOKEN ALIAS] --delivery-token [DELIVERY TOKEN] --branch [BRANCH NAME] + + + + Using --stack-api-key flag + + $ csdx cm:assets:unpublish --bulk-unpublish --environment [SOURCE ENV] --locale [LOCALE] --stack-api-key [STACK API KEY] --delivery-token [DELIVERY TOKEN] ``` _See code: [src/commands/cm/assets/unpublish.js](https://github.com/contentstack/cli/blob/main/packages/contentstack-bulk-publish/src/commands/cm/assets/unpublish.js)_ @@ -217,6 +231,7 @@ FLAGS -a, --alias= Alias(name) for the management token -c, --config= Path to the config file -e, --environments=... Environments where entries will be published + -k, --stack-api-key= Stack api key to be used -l, --locales=... Locales where entries will be published -t, --contentTypes=... The Contenttypes from which entries will be published -y, --yes Agree to process the command with the current configuration @@ -242,7 +257,7 @@ ALIASES EXAMPLES General Usage - $ csdx cm:entries:update-and-publish --content-types [CONTENT TYPE 1] [CONTENT TYPE 2] -e [ENVIRONMENT 1] [ENVIRONMENT 2] --locale [LOCALE 1] [LOCALE 2] -a [MANAGEMENT TOKEN ALIAS] + $ csdx cm:entries:update-and-publish --content-types [CONTENT TYPE 1] [CONTENT TYPE 2] -e [ENVIRONMENT 1] [ENVIRONMENT 2] --locales [LOCALE 1] [LOCALE 2] -a [MANAGEMENT TOKEN ALIAS] @@ -264,7 +279,13 @@ EXAMPLES Using --branch - $ csdx cm:entries:update-and-publish --content-types [CONTENT TYPE 1] [CONTENT TYPE 2] -e [ENVIRONMENT 1] [ENVIRONMENT 2] --locale [LOCALE 1] [LOCALE 2] -a [MANAGEMENT TOKEN ALIAS] --branch [BRANCH NAME] + $ csdx cm:entries:update-and-publish --content-types [CONTENT TYPE 1] [CONTENT TYPE 2] -e [ENVIRONMENT 1] [ENVIRONMENT 2] --locales [LOCALE 1] [LOCALE 2] -a [MANAGEMENT TOKEN ALIAS] --branch [BRANCH NAME] + + + + Using --stack-api-key + + $ csdx cm:entries:update-and-publish --content-types [CONTENT TYPE 1] [CONTENT TYPE 2] -e [ENVIRONMENT 1] [ENVIRONMENT 2] --locales [LOCALE 1] [LOCALE 2] --stack-api-key [STACK API KEY] ``` ## `csdx cm:assets:publish [-a ] [--retry-failed ] [-e ] [--folder-uid ] [--bulk-publish ] [-c ] [-y] [--locales ] [--branch ] [--delivery-token ] [--source-env ]` @@ -282,6 +303,7 @@ FLAGS -a, --alias= Alias(name) for the management token -c, --config= Path to the config file -e, --environments=... Environments where assets will be published + -k, --stack-api-key= Stack api key to be used -l, --locales=... Locales to where assets will be published -y, --yes Agree to process the command with the current configuration --api-version= API Version to be used. Values [Default: 3, Nested Reference Publishing: 3.2]. @@ -336,6 +358,12 @@ EXAMPLES Using --source-env $ csdx cm:assets:publish --environments [ENVIRONMENT 1] [ENVIRONMENT 2] --locales [LOCALE] --alias [MANAGEMENT TOKEN ALIAS] --source-env [SOURCE ENVIRONMENT] --delivery-token [DELIVERY TOKEN] + + + + Using --stack-api-key flag + + $ csdx cm:assets:publish --environments [ENVIRONMENT 1] [ENVIRONMENT 2] --locales [LOCALE] --stack-api-key [STACK API KEY] ``` ## `csdx cm:bulk-publish:clear` @@ -372,10 +400,11 @@ The configure command is used to generate a configuration file for publish scrip ``` USAGE - $ csdx cm:bulk-publish:configure [-a ] + $ csdx cm:bulk-publish:configure [-a ] [-k ] FLAGS - -a, --alias= Alias(name) for the management token + -a, --alias= Alias(name) for the management token + -k, --stack-api-key= Stack api key to be used DESCRIPTION The configure command is used to generate a configuration file for publish scripts. @@ -389,6 +418,8 @@ EXAMPLES $ csdx cm:stacks:publish-configure -a $ csdx cm:stacks:publish-configure --alias + + $ csdx cm:stacks:publish-configure --stack-api-key ``` ## `csdx cm:bulk-publish:cross-publish [-a ] [--retry-failed ] [--bulk-publish ] [--content-type ] [--locales ] [--source-env ] [--environments ] [--delivery-token ] [-c ] [-y] [--branch ] [--onlyAssets] [--onlyEntries]` @@ -402,23 +433,24 @@ USAGE [-y] [--branch ] [--onlyAssets] [--onlyEntries] FLAGS - -B, --branch= [default: main] Specify the branch to fetch the content (by default the main branch is - selected) - -a, --alias= Alias(name) for the management token - -c, --config= Path to the config file - -y, --yes Agree to process the command with the current configuration - --api-version= API Version to be used. Values [Default: 3, Nested Reference Publishing: 3.2]. - --bulk-publish= [default: true] This flag is set to true by default. It indicates that contentstack's - bulkpublish API will be used to publish the entries - --content-type=... The Contenttypes from which entries will be published - --delivery-token= Delivery token for source environment - --environments=... Destination Environments - --locales= Source locale - --onlyAssets Unpublish only assets - --onlyEntries Unpublish only entries - --retry-failed= (optional) Retry publishing failed entries from the logfile (this flag overrides all other - flags) - --source-env= Source Env + -B, --branch= [default: main] Specify the branch to fetch the content (by default the main branch is + selected) + -a, --alias= Alias(name) for the management token + -c, --config= Path to the config file + -k, --stack-api-key= Stack api key to be used + -y, --yes Agree to process the command with the current configuration + --api-version= API Version to be used. Values [Default: 3, Nested Reference Publishing: 3.2]. + --bulk-publish= [default: true] This flag is set to true by default. It indicates that contentstack's + bulkpublish API will be used to publish the entries + --content-type=... The Contenttypes from which entries will be published + --delivery-token= Delivery token for source environment + --environments=... Destination Environments + --locales= Source locale + --onlyAssets Unpublish only assets + --onlyEntries Unpublish only entries + --retry-failed= (optional) Retry publishing failed entries from the logfile (this flag overrides all + other flags) + --source-env= Source Env DESCRIPTION Publish entries and assets from one environment to other environments @@ -457,6 +489,12 @@ EXAMPLES Using --branch flag $ csdx cm:bulk-publish:cross-publish --content-type [CONTENT TYPE] --source-env [SOURCE ENV] --environments [DESTINATION ENVIRONMENT] --locales [LOCALE] -a [MANAGEMENT TOKEN ALIAS] --delivery-token [DELIVERY TOKEN] --branch [BRANCH NAME] + + + + Using --stack-api-key flag + + $ csdx cm:bulk-publish:cross-publish --content-type [CONTENT TYPE] --source-env [SOURCE ENV] --environments [DESTINATION ENVIRONMENT] --locales [LOCALE] --stack-api-key [STACK API KEY] --delivery-token [DELIVERY TOKEN] ``` _See code: [src/commands/cm/bulk-publish/cross-publish.js](https://github.com/contentstack/cli/blob/main/packages/contentstack-bulk-publish/src/commands/cm/bulk-publish/cross-publish.js)_ @@ -478,6 +516,7 @@ FLAGS -c, --config= Path for the external config file (A new config file can be generated at the current working directory using `csdx cm:bulk-publish:configure -a [ALIAS]`) -e, --environments=... Environments where entries will be published + -k, --stack-api-key= Stack api key to be used -l, --locales=... Locales where entries will be published -y, --yes Agree to process the command with the current configuration --api-version= API Version to be used. Values [Default: 3, Nested Reference Publishing: 3.2]. @@ -537,6 +576,12 @@ EXAMPLES Using --source-env $ csdx cm:entries:publish --content-types [CONTENT TYPE 1] [CONTENT TYPE 2] -e [ENVIRONMENT 1] [ENVIRONMENT 2] --locales [LOCALE 1] [LOCALE 2] -a [MANAGEMENT TOKEN ALIAS] --source-env [SOURCE ENVIRONMENT] --delivery-token [DELIVERY TOKEN] + + + + Using --stack-api-key + + $ csdx cm:entries:publish -e [ENVIRONMENT 1] [ENVIRONMENT 2] --locales [LOCALE 1] [LOCALE 2] --stack-api-key [STACK API KEY] --source-env [SOURCE ENVIRONMENT] --delivery-token [DELIVERY TOKEN] ``` ## `csdx cm:entries:publish-modified [-a ] [--retry-failed ] [--bulk-publish ] [--source-env ] [--content-types ] [--locales ] [-e ] [-c ] [-y] [--branch ]` @@ -554,6 +599,7 @@ FLAGS -a, --alias= Alias(name) for the management token -c, --config= Path to the config file -e, --environments=... Destination environments + -k, --stack-api-key= Stack api key to be used -l, --locales=... Locales where edited entries will be published -y, --yes Agree to process the command with the current configuration --api-version= API Version to be used. Values [Default: 3, Nested Reference Publishing: 3.2]. @@ -604,6 +650,12 @@ EXAMPLES Using --branch $ csdx cm:entries:publish-modified --content-types [CONTENT TYPE 1] [CONTENT TYPE 2] --source-env [SOURCE_ENV] -e [ENVIRONMENT 1] [ENVIRONMENT 2] --locales [LOCALE 1] [LOCALE 2] -a [MANAGEMENT TOKEN ALIAS] --branch [BRANCH NAME] + + + + Using --stack-api-key + + $ csdx cm:entries:publish-modified --content-types [CONTENT TYPE 1] [CONTENT TYPE 2] --source-env [SOURCE_ENV] -e [ENVIRONMENT 1] [ENVIRONMENT 2] --locales [LOCALE 1] [LOCALE 2] -stack-api-key [STACK API KEY] ``` ## `csdx cm:entries:publish-non-localized-fields [-a ] [--retry-failed ] [--bulk-publish ] [--source-env ] [--content-types ] [-e ] [-c ] [-y] [--branch ]` @@ -621,6 +673,7 @@ FLAGS -a, --alias= Alias(name) for the management token -c, --config= Path to the config file -e, --environments=... Destination environments + -k, --stack-api-key= Stack api key to be used -y, --yes Agree to process the command with the current configuration --api-version= API Version to be used. Values [Default: 3, Nested Reference Publishing: 3.2]. --bulk-publish= [default: true] This flag is set to true by default. It indicates that contentstack's @@ -667,6 +720,12 @@ EXAMPLES Using --branch flag $ csdx cm:entries:publish-non-localized-fields --content-types [CONTENT TYPE 1] [CONTENT TYPE 2] --environments [ENVIRONMENT 1] [ENVIRONMENT 2] --alias [MANAGEMENT TOKEN ALIAS] --source-env [SOURCE ENV] --branch [BRANCH NAME] + + + + Using --stack-api-key flag + + $ csdx cm:entries:publish-non-localized-fields --content-types [CONTENT TYPE 1] [CONTENT TYPE 2] --environments [ENVIRONMENT 1] [ENVIRONMENT 2] --stack-api-key [STACK API KEY] --source-env [SOURCE ENV] ``` ## `csdx cm:bulk-publish:revert` @@ -713,18 +772,19 @@ USAGE [--only-assets] [--only-entries] FLAGS - -B, --branch= [default: main] Specify the branch to fetch the content from (default is main branch) - -a, --alias= Alias(name) for the management token - -c, --config= Path to the config file - -e, --environment= Source Environment - -l, --locale= Locale filter - -y, --yes Agree to process the command with the current configuration - --api-version= API Version to be used. Values [Default: 3, Nested Reference Publishing: 3.2]. - --bulk-unpublish= [default: true] This flag is set to true by default. It indicates that contentstack's - bulkpublish API will be used to unpublish the entries and assets - --content-type= Content type filter - --delivery-token= Delivery token for source environment - --retry-failed= Retry publishing failed entries from the logfile (optional, overrides all other flags) + -B, --branch= [default: main] Specify the branch to fetch the content from (default is main branch) + -a, --alias= Alias(name) for the management token + -c, --config= Path to the config file + -e, --environment= Source Environment + -k, --stack-api-key= Stack api key to be used + -l, --locale= Locale filter + -y, --yes Agree to process the command with the current configuration + --api-version= API Version to be used. Values [Default: 3, Nested Reference Publishing: 3.2]. + --bulk-unpublish= [default: true] This flag is set to true by default. It indicates that contentstack's + bulkpublish API will be used to unpublish the entries and assets + --content-type= Content type filter + --delivery-token= Delivery token for source environment + --retry-failed= Retry publishing failed entries from the logfile (optional, overrides all other flags) DESCRIPTION Unpublish entries or assets of given content types from the specified environment @@ -790,6 +850,12 @@ EXAMPLES Using --branch flag $ csdx cm:stacks:unpublish --bulk-unpublish --content-type [CONTENT TYPE] --environment [SOURCE ENV] --locale [LOCALE] --alias [MANAGEMENT TOKEN ALIAS] --delivery-token [DELIVERY TOKEN] --branch [BRANCH NAME] + + + + Using --stack-api-key flag + + $ csdx cm:stacks:unpublish --bulk-unpublish --content-type [CONTENT TYPE] --environment [SOURCE ENV] --locale [LOCALE] --stack-api-key [STACK API KEY] --delivery-token [DELIVERY TOKEN] ``` ## `csdx cm:entries:publish-only-unpublished [-a ] [--retry-failed ] [--bulk-publish ] [--source-env ] [--content-types ] [--locales ] [-e ] [-c ] [-y] [--branch ]` @@ -810,6 +876,7 @@ FLAGS bulkpublish API will be used to publish the entries -c, --config= Path to the config file -e, --environments=... Destination environments + -k, --stack-api-key= Stack api key to be used -y, --yes Agree to process the command with the current configuration --api-version= API Version to be used. Values [Default: 3, Nested Reference Publishing: 3.2]. --content-types=... The Contenttypes from which entries will be published @@ -856,6 +923,12 @@ EXAMPLES Using --branch $ csdx cm:entries:publish-only-unpublished -b --content-types [CONTENT TYPES] -e [ENVIRONMENTS] --locales LOCALE -a [MANAGEMENT TOKEN ALIAS] --branch [BRANCH NAME] -source-env [SOURCE ENV] + + + + Using --stack-api-key + + $ csdx cm:entries:publish-only-unpublished -b --content-types [CONTENT TYPES] -e [ENVIRONMENTS] --locales LOCALE -a [MANAGEMENT TOKEN ALIAS] --stack-api-key [STACK API KEY] -source-env [SOURCE ENV] ``` ## `csdx cm:entries:publish [-a ] [--retry-failed ] [--bulk-publish ] [--publish-all-content-types] [--content-types ] [--locales ] [-e ] [-c ] [-y] [--branch ] [--delivery-token ] [--source-env ]` @@ -875,6 +948,7 @@ FLAGS -c, --config= Path for the external config file (A new config file can be generated at the current working directory using `csdx cm:bulk-publish:configure -a [ALIAS]`) -e, --environments=... Environments where entries will be published + -k, --stack-api-key= Stack api key to be used -l, --locales=... Locales where entries will be published -y, --yes Agree to process the command with the current configuration --api-version= API Version to be used. Values [Default: 3, Nested Reference Publishing: 3.2]. @@ -934,6 +1008,12 @@ EXAMPLES Using --source-env $ csdx cm:entries:publish --content-types [CONTENT TYPE 1] [CONTENT TYPE 2] -e [ENVIRONMENT 1] [ENVIRONMENT 2] --locales [LOCALE 1] [LOCALE 2] -a [MANAGEMENT TOKEN ALIAS] --source-env [SOURCE ENVIRONMENT] --delivery-token [DELIVERY TOKEN] + + + + Using --stack-api-key + + $ csdx cm:entries:publish -e [ENVIRONMENT 1] [ENVIRONMENT 2] --locales [LOCALE 1] [LOCALE 2] --stack-api-key [STACK API KEY] --source-env [SOURCE ENVIRONMENT] --delivery-token [DELIVERY TOKEN] ``` _See code: [src/commands/cm/entries/publish.js](https://github.com/contentstack/cli/blob/main/packages/contentstack-bulk-publish/src/commands/cm/entries/publish.js)_ @@ -953,6 +1033,7 @@ FLAGS -a, --alias= Alias(name) for the management token -c, --config= Path to the config file -e, --environments=... Destination environments + -k, --stack-api-key= Stack api key to be used -l, --locales=... Locales where edited entries will be published -y, --yes Agree to process the command with the current configuration --api-version= API Version to be used. Values [Default: 3, Nested Reference Publishing: 3.2]. @@ -1003,6 +1084,12 @@ EXAMPLES Using --branch $ csdx cm:entries:publish-modified --content-types [CONTENT TYPE 1] [CONTENT TYPE 2] --source-env [SOURCE_ENV] -e [ENVIRONMENT 1] [ENVIRONMENT 2] --locales [LOCALE 1] [LOCALE 2] -a [MANAGEMENT TOKEN ALIAS] --branch [BRANCH NAME] + + + + Using --stack-api-key + + $ csdx cm:entries:publish-modified --content-types [CONTENT TYPE 1] [CONTENT TYPE 2] --source-env [SOURCE_ENV] -e [ENVIRONMENT 1] [ENVIRONMENT 2] --locales [LOCALE 1] [LOCALE 2] -stack-api-key [STACK API KEY] ``` _See code: [src/commands/cm/entries/publish-modified.js](https://github.com/contentstack/cli/blob/main/packages/contentstack-bulk-publish/src/commands/cm/entries/publish-modified.js)_ @@ -1022,6 +1109,7 @@ FLAGS -a, --alias= Alias(name) for the management token -c, --config= Path to the config file -e, --environments=... Destination environments + -k, --stack-api-key= Stack api key to be used -y, --yes Agree to process the command with the current configuration --api-version= API Version to be used. Values [Default: 3, Nested Reference Publishing: 3.2]. --bulk-publish= [default: true] This flag is set to true by default. It indicates that contentstack's @@ -1068,6 +1156,12 @@ EXAMPLES Using --branch flag $ csdx cm:entries:publish-non-localized-fields --content-types [CONTENT TYPE 1] [CONTENT TYPE 2] --environments [ENVIRONMENT 1] [ENVIRONMENT 2] --alias [MANAGEMENT TOKEN ALIAS] --source-env [SOURCE ENV] --branch [BRANCH NAME] + + + + Using --stack-api-key flag + + $ csdx cm:entries:publish-non-localized-fields --content-types [CONTENT TYPE 1] [CONTENT TYPE 2] --environments [ENVIRONMENT 1] [ENVIRONMENT 2] --stack-api-key [STACK API KEY] --source-env [SOURCE ENV] ``` _See code: [src/commands/cm/entries/publish-non-localized-fields.js](https://github.com/contentstack/cli/blob/main/packages/contentstack-bulk-publish/src/commands/cm/entries/publish-non-localized-fields.js)_ @@ -1090,6 +1184,7 @@ FLAGS bulkpublish API will be used to publish the entries -c, --config= Path to the config file -e, --environments=... Destination environments + -k, --stack-api-key= Stack api key to be used -y, --yes Agree to process the command with the current configuration --api-version= API Version to be used. Values [Default: 3, Nested Reference Publishing: 3.2]. --content-types=... The Contenttypes from which entries will be published @@ -1136,6 +1231,12 @@ EXAMPLES Using --branch $ csdx cm:entries:publish-only-unpublished -b --content-types [CONTENT TYPES] -e [ENVIRONMENTS] --locales LOCALE -a [MANAGEMENT TOKEN ALIAS] --branch [BRANCH NAME] -source-env [SOURCE ENV] + + + + Using --stack-api-key + + $ csdx cm:entries:publish-only-unpublished -b --content-types [CONTENT TYPES] -e [ENVIRONMENTS] --locales LOCALE -a [MANAGEMENT TOKEN ALIAS] --stack-api-key [STACK API KEY] -source-env [SOURCE ENV] ``` _See code: [src/commands/cm/entries/publish-only-unpublished.js](https://github.com/contentstack/cli/blob/main/packages/contentstack-bulk-publish/src/commands/cm/entries/publish-only-unpublished.js)_ @@ -1146,24 +1247,25 @@ Unpublish entries from the given environment ``` USAGE - $ csdx cm:entries:unpublish [-a ] [-e ] [-c ] [-y] [--locale ] [--branch ] - [--retry-failed ] [--bulk-unpublish ] [--api-version ] [--content-type ] + $ csdx cm:entries:unpublish [-a ] [-k ] [-e ] [-c ] [-y] [--locale ] [--branch + ] [--retry-failed ] [--bulk-unpublish ] [--api-version ] [--content-type ] [--delivery-token ] FLAGS - -a, --alias= Alias(name) for the management token - -c, --config= Path to the config file - -e, --environment= Source Environment - -y, --yes Agree to process the command with the current configuration - --api-version= API Version to be used. Values [Default: 3, Nested Reference Publishing: 3.2]. - --branch= [default: main] Specify the branch to fetch the content (by default the main branch is - selected) - --bulk-unpublish= [default: true] This flag is set to true by default. It indicates that contentstack's - bulkpublish API will be used to unpublish the entries - --content-type= Content type filter - --delivery-token= Delivery token for source environment - --locale= Locale filter - --retry-failed= Retry publishing failed entries from the logfile + -a, --alias= Alias(name) for the management token + -c, --config= Path to the config file + -e, --environment= Source Environment + -k, --stack-api-key= Stack api key to be used + -y, --yes Agree to process the command with the current configuration + --api-version= API Version to be used. Values [Default: 3, Nested Reference Publishing: 3.2]. + --branch= [default: main] Specify the branch to fetch the content (by default the main branch is + selected) + --bulk-unpublish= [default: true] This flag is set to true by default. It indicates that contentstack's + bulkpublish API will be used to unpublish the entries + --content-type= Content type filter + --delivery-token= Delivery token for source environment + --locale= Locale filter + --retry-failed= Retry publishing failed entries from the logfile DESCRIPTION Unpublish entries from the given environment @@ -1195,11 +1297,15 @@ EXAMPLES - - Using --branch flag $ csdx cm:stacks:unpublish --bulk-unpublish --content-type [CONTENT TYPE] --environment [SOURCE ENV] --locale [LOCALE] --alias [MANAGEMENT TOKEN ALIAS] --delivery-token [DELIVERY TOKEN] --branch [BRANCH NAME] + + + + Using --stack-api-key flag + + $ csdx cm:stacks:unpublish --bulk-unpublish --content-type [CONTENT TYPE] --environment [SOURCE ENV] --locale [LOCALE] --stack-api-key [STACK API KEY] --delivery-token [DELIVERY TOKEN] ``` _See code: [src/commands/cm/entries/unpublish.js](https://github.com/contentstack/cli/blob/main/packages/contentstack-bulk-publish/src/commands/cm/entries/unpublish.js)_ @@ -1219,6 +1325,7 @@ FLAGS -a, --alias= Alias(name) for the management token -c, --config= Path to the config file -e, --environments=... Environments where entries will be published + -k, --stack-api-key= Stack api key to be used -l, --locales=... Locales where entries will be published -t, --contentTypes=... The Contenttypes from which entries will be published -y, --yes Agree to process the command with the current configuration @@ -1244,7 +1351,7 @@ ALIASES EXAMPLES General Usage - $ csdx cm:entries:update-and-publish --content-types [CONTENT TYPE 1] [CONTENT TYPE 2] -e [ENVIRONMENT 1] [ENVIRONMENT 2] --locale [LOCALE 1] [LOCALE 2] -a [MANAGEMENT TOKEN ALIAS] + $ csdx cm:entries:update-and-publish --content-types [CONTENT TYPE 1] [CONTENT TYPE 2] -e [ENVIRONMENT 1] [ENVIRONMENT 2] --locales [LOCALE 1] [LOCALE 2] -a [MANAGEMENT TOKEN ALIAS] @@ -1266,7 +1373,13 @@ EXAMPLES Using --branch - $ csdx cm:entries:update-and-publish --content-types [CONTENT TYPE 1] [CONTENT TYPE 2] -e [ENVIRONMENT 1] [ENVIRONMENT 2] --locale [LOCALE 1] [LOCALE 2] -a [MANAGEMENT TOKEN ALIAS] --branch [BRANCH NAME] + $ csdx cm:entries:update-and-publish --content-types [CONTENT TYPE 1] [CONTENT TYPE 2] -e [ENVIRONMENT 1] [ENVIRONMENT 2] --locales [LOCALE 1] [LOCALE 2] -a [MANAGEMENT TOKEN ALIAS] --branch [BRANCH NAME] + + + + Using --stack-api-key + + $ csdx cm:entries:update-and-publish --content-types [CONTENT TYPE 1] [CONTENT TYPE 2] -e [ENVIRONMENT 1] [ENVIRONMENT 2] --locales [LOCALE 1] [LOCALE 2] --stack-api-key [STACK API KEY] ``` _See code: [src/commands/cm/entries/update-and-publish.js](https://github.com/contentstack/cli/blob/main/packages/contentstack-bulk-publish/src/commands/cm/entries/update-and-publish.js)_ @@ -1359,10 +1472,11 @@ The configure command is used to generate a configuration file for publish scrip ``` USAGE - $ csdx cm:stacks:publish-configure [-a ] + $ csdx cm:stacks:publish-configure [-a ] [-k ] FLAGS - -a, --alias= Alias(name) for the management token + -a, --alias= Alias(name) for the management token + -k, --stack-api-key= Stack api key to be used DESCRIPTION The configure command is used to generate a configuration file for publish scripts. @@ -1376,6 +1490,8 @@ EXAMPLES $ csdx cm:stacks:publish-configure -a $ csdx cm:stacks:publish-configure --alias + + $ csdx cm:stacks:publish-configure --stack-api-key ``` _See code: [src/commands/cm/stacks/publish-configure.js](https://github.com/contentstack/cli/blob/main/packages/contentstack-bulk-publish/src/commands/cm/stacks/publish-configure.js)_ @@ -1426,18 +1542,19 @@ USAGE [--only-assets] [--only-entries] FLAGS - -B, --branch= [default: main] Specify the branch to fetch the content from (default is main branch) - -a, --alias= Alias(name) for the management token - -c, --config= Path to the config file - -e, --environment= Source Environment - -l, --locale= Locale filter - -y, --yes Agree to process the command with the current configuration - --api-version= API Version to be used. Values [Default: 3, Nested Reference Publishing: 3.2]. - --bulk-unpublish= [default: true] This flag is set to true by default. It indicates that contentstack's - bulkpublish API will be used to unpublish the entries and assets - --content-type= Content type filter - --delivery-token= Delivery token for source environment - --retry-failed= Retry publishing failed entries from the logfile (optional, overrides all other flags) + -B, --branch= [default: main] Specify the branch to fetch the content from (default is main branch) + -a, --alias= Alias(name) for the management token + -c, --config= Path to the config file + -e, --environment= Source Environment + -k, --stack-api-key= Stack api key to be used + -l, --locale= Locale filter + -y, --yes Agree to process the command with the current configuration + --api-version= API Version to be used. Values [Default: 3, Nested Reference Publishing: 3.2]. + --bulk-unpublish= [default: true] This flag is set to true by default. It indicates that contentstack's + bulkpublish API will be used to unpublish the entries and assets + --content-type= Content type filter + --delivery-token= Delivery token for source environment + --retry-failed= Retry publishing failed entries from the logfile (optional, overrides all other flags) DESCRIPTION Unpublish entries or assets of given content types from the specified environment @@ -1503,6 +1620,12 @@ EXAMPLES Using --branch flag $ csdx cm:stacks:unpublish --bulk-unpublish --content-type [CONTENT TYPE] --environment [SOURCE ENV] --locale [LOCALE] --alias [MANAGEMENT TOKEN ALIAS] --delivery-token [DELIVERY TOKEN] --branch [BRANCH NAME] + + + + Using --stack-api-key flag + + $ csdx cm:stacks:unpublish --bulk-unpublish --content-type [CONTENT TYPE] --environment [SOURCE ENV] --locale [LOCALE] --stack-api-key [STACK API KEY] --delivery-token [DELIVERY TOKEN] ``` _See code: [src/commands/cm/stacks/unpublish.js](https://github.com/contentstack/cli/blob/main/packages/contentstack-bulk-publish/src/commands/cm/stacks/unpublish.js)_ diff --git a/packages/contentstack-bulk-publish/package.json b/packages/contentstack-bulk-publish/package.json index 02f49ca681..650f8ea220 100644 --- a/packages/contentstack-bulk-publish/package.json +++ b/packages/contentstack-bulk-publish/package.json @@ -1,16 +1,18 @@ { "name": "@contentstack/cli-cm-bulk-publish", "description": "Contentstack CLI plugin for bulk publish actions", - "version": "1.3.8", + "version": "1.3.10", "author": "Contentstack", "bugs": "https://github.com/contentstack/cli/issues", "dependencies": { - "@contentstack/cli-command": "^1.2.9", - "@contentstack/cli-utilities": "^1.4.5", + "@contentstack/cli-command": "~1.2.11", + "@contentstack/cli-utilities": "~1.5.1", "bluebird": "^3.7.2", "chalk": "^4.1.2", + "dotenv": "^16.1.4", "inquirer": "8.2.4", "lodash": "^4.17.15", + "mkdirp": "^1.0.4", "nock": "^13.0.2", "winston": "^3.7.2" }, @@ -92,7 +94,7 @@ "scripts": { "postpack": "rm -f oclif.manifest.json", "prepack": "oclif manifest && oclif readme", - "test": "nyc mocha --forbid-only \"test/**/*.test.js\"", + "test:unit": "nyc mocha --forbid-only \"test/unit/**/*.test.js\"", "posttest": "eslint .", "version": "oclif readme && git add README.md", "clean": "rm -rf ./node_modules tsconfig.build.tsbuildinfo" diff --git a/packages/contentstack-bulk-publish/src/commands/cm/assets/publish.js b/packages/contentstack-bulk-publish/src/commands/cm/assets/publish.js index a68bc68215..4fd065f7f2 100644 --- a/packages/contentstack-bulk-publish/src/commands/cm/assets/publish.js +++ b/packages/contentstack-bulk-publish/src/commands/cm/assets/publish.js @@ -1,5 +1,5 @@ const { Command } = require('@contentstack/cli-command'); -const { printFlagDeprecation, flags } = require('@contentstack/cli-utilities'); +const { printFlagDeprecation, flags, isAuthenticated } = require('@contentstack/cli-utilities'); const { start: startPublish } = require('../../../producer/publish-assets'); const { start: startCrossPublish } = require('../../../producer/cross-publish'); const store = require('../../../util/store.js'); @@ -30,33 +30,39 @@ class AssetsPublishCommand extends Command { if (this.validate(updatedFlags)) { let stack; if (!updatedFlags.retryFailed) { - if (!updatedFlags.alias) { - updatedFlags.alias = await cliux.prompt('Please enter the management token alias to be used'); + config = { + host: this.cmaHost, + cda: this.cdaHost, + branch: assetsFlags.branch, + }; + if (updatedFlags.alias) { + // Validate management token alias. + try { + this.getToken(updatedFlags.alias); + config.alias = updatedFlags.alias; + } catch (error) { + this.error( + `The configured management token alias ${updatedFlags.alias} has not been added yet. Add it using 'csdx auth:tokens:add -a ${updatedFlags.alias}'`, + { exit: 2 }, + ); + } + } else if (updatedFlags['stack-api-key']) { + config.stackApiKey = updatedFlags['stack-api-key']; + } else { + this.error('Please use `--alias` or `--stack-api-key` to proceed.', { exit: 2 }); } updatedFlags.bulkPublish = updatedFlags.bulkPublish === 'false' ? false : true; if (updatedFlags.folderUid === undefined) { // set default value for folderUid updatedFlags.folderUid = 'cs_root'; } - // Validate management token alias. - try { - this.getToken(updatedFlags.alias); - } catch (error) { - this.error( - `The configured management token alias ${updatedFlags.alias} has not been added yet. Add it using 'csdx auth:tokens:add -a ${updatedFlags.alias}'`, - { exit: 2 }, - ); - } - config = { - alias: updatedFlags.alias, - host: this.cmaHost, - cda: this.cdaHost, - branch: assetsFlags.branch, - }; stack = await getStack(config); } if (await this.confirmFlags(updatedFlags)) { try { + if (process.env.NODE_ENV === 'test') { + return; + } const publishFunction = async (func) => { if (!updatedFlags.retryFailed) { try { @@ -153,6 +159,11 @@ AssetsPublishCommand.flags = { char: 'a', description: 'Alias(name) for the management token', }), + 'stack-api-key': flags.string({ + char: 'k', + description: 'Stack api key to be used', + required: false, + }), 'retry-failed': flags.string({ description: 'Retry publishing failed assets from the logfile (optional, will override all other flags)', }), @@ -238,6 +249,9 @@ AssetsPublishCommand.examples = [ '', 'Using --source-env', 'csdx cm:assets:publish --environments [ENVIRONMENT 1] [ENVIRONMENT 2] --locales [LOCALE] --alias [MANAGEMENT TOKEN ALIAS] --source-env [SOURCE ENVIRONMENT] --delivery-token [DELIVERY TOKEN]', + '', + 'Using --stack-api-key flag', + 'csdx cm:assets:publish --environments [ENVIRONMENT 1] [ENVIRONMENT 2] --locales [LOCALE] --stack-api-key [STACK API KEY]', ]; AssetsPublishCommand.aliases = ['cm:bulk-publish:assets']; diff --git a/packages/contentstack-bulk-publish/src/commands/cm/assets/unpublish.js b/packages/contentstack-bulk-publish/src/commands/cm/assets/unpublish.js index 4c0c7d842c..5e1ffe1f65 100644 --- a/packages/contentstack-bulk-publish/src/commands/cm/assets/unpublish.js +++ b/packages/contentstack-bulk-publish/src/commands/cm/assets/unpublish.js @@ -1,7 +1,7 @@ /* eslint-disable no-console */ /* eslint-disable node/no-extraneous-require */ const { Command } = require('@contentstack/cli-command'); -const { cliux, flags } = require('@contentstack/cli-utilities'); +const { cliux, flags, isAuthenticated } = require('@contentstack/cli-utilities'); const { start } = require('../../../producer/unpublish'); const store = require('../../../util/store.js'); const configKey = 'Unpublish'; @@ -33,28 +33,31 @@ class UnpublishCommand extends Command { if (this.validate(updatedFlags)) { let stack; if (!updatedFlags.retryFailed) { - if (!updatedFlags.alias) { - updatedFlags.alias = await cliux.prompt('Please enter the management token alias to be used'); - } - if (!updatedFlags.deliveryToken) { - updatedFlags.deliveryToken = await cliux.prompt('Enter delivery token of your source environment'); - } - updatedFlags.bulkUnpublish = updatedFlags.bulkUnpublish === 'false' ? false : true; - // Validate management token alias. - try { - this.getToken(updatedFlags.alias); - } catch (error) { - this.error( - `The configured management token alias ${updatedFlags.alias} has not been added yet. Add it using 'csdx auth:tokens:add --alias ${updatedFlags.alias}'`, - { exit: 2 }, - ); - } config = { - alias: updatedFlags.alias, host: this.cmaHost, cda: this.cdaHost, branch: unpublishFlags.branch, }; + if (updatedFlags.alias) { + // Validate management token alias. + try { + this.getToken(updatedFlags.alias); + config.alias = updatedFlags.alias; + } catch (error) { + this.error( + `The configured management token alias ${updatedFlags.alias} has not been added yet. Add it using 'csdx auth:tokens:add -a ${updatedFlags.alias}'`, + { exit: 2 }, + ); + } + } else if (updatedFlags['stack-api-key']) { + config.stackApiKey = updatedFlags['stack-api-key']; + } else { + this.error('Please use `--alias` or `--stack-api-key` to proceed.', { exit: 2 }); + } + if (!updatedFlags.deliveryToken) { + updatedFlags.deliveryToken = await cliux.prompt('Enter delivery token of your source environment'); + } + updatedFlags.bulkUnpublish = updatedFlags.bulkUnpublish === 'false' ? false : true; stack = await getStack(config); } if (!updatedFlags.deliveryToken && updatedFlags.deliveryToken.length === 0) { @@ -63,6 +66,9 @@ class UnpublishCommand extends Command { if (await this.confirmFlags(updatedFlags)) { try { + if (process.env.NODE_ENV === 'test') { + return; + } if (!updatedFlags.retryFailed) { await start(updatedFlags, stack, config); } else { @@ -130,6 +136,11 @@ UnpublishCommand.flags = { char: 'a', description: 'Alias(name) for the management token', }), + 'stack-api-key': flags.string({ + char: 'k', + description: 'Stack api key to be used', + required: false, + }), environment: flags.string({ char: 'e', description: 'Source Environment', @@ -179,6 +190,9 @@ UnpublishCommand.examples = [ '', 'Using --branch flag', 'csdx cm:assets:unpublish --bulk-unpublish --environment [SOURCE ENV] --locale [LOCALE] --alias [MANAGEMENT TOKEN ALIAS] --delivery-token [DELIVERY TOKEN] --branch [BRANCH NAME]', + '', + 'Using --stack-api-key flag', + 'csdx cm:assets:unpublish --bulk-unpublish --environment [SOURCE ENV] --locale [LOCALE] --stack-api-key [STACK API KEY] --delivery-token [DELIVERY TOKEN]', ]; module.exports = UnpublishCommand; diff --git a/packages/contentstack-bulk-publish/src/commands/cm/bulk-publish/cross-publish.js b/packages/contentstack-bulk-publish/src/commands/cm/bulk-publish/cross-publish.js index fb4c0bd346..7b7925cab1 100644 --- a/packages/contentstack-bulk-publish/src/commands/cm/bulk-publish/cross-publish.js +++ b/packages/contentstack-bulk-publish/src/commands/cm/bulk-publish/cross-publish.js @@ -1,6 +1,6 @@ /* eslint-disable node/no-extraneous-require */ const { Command } = require('@contentstack/cli-command'); -const { cliux, printFlagDeprecation, flags } = require('@contentstack/cli-utilities'); +const { cliux, printFlagDeprecation, flags, isAuthenticated } = require('@contentstack/cli-utilities'); const { start } = require('../../../producer/cross-publish'); const store = require('../../../util/store.js'); const configKey = 'cross_env_publish'; @@ -22,28 +22,31 @@ class CrossPublishCommand extends Command { if (this.validate(updatedFlags)) { let stack; if (!updatedFlags.retryFailed) { - if (!updatedFlags.alias) { - updatedFlags.alias = await cliux.prompt('Please enter the management token alias to be used'); - } - if (!updatedFlags.deliveryToken) { - updatedFlags.deliveryToken = await cliux.prompt('Enter delivery token of your source environment'); - } - updatedFlags.bulkPublish = updatedFlags.bulkPublish === 'false' ? false : true; - // Validate management token alias. - try { - this.getToken(updatedFlags.alias); - } catch (error) { - this.error( - `The configured management token alias ${updatedFlags.alias} has not been added yet. Add it using 'csdx auth:tokens:add -a ${updatedFlags.alias}'`, - { exit: 2 }, - ); - } config = { - alias: updatedFlags.alias, host: this.cmaHost, cda: this.cdaHost, branch: crossPublishFlags.branch, }; + if (updatedFlags.alias) { + try { + this.getToken(updatedFlags.alias); + config.alias = updatedFlags.alias; + } catch (error) { + this.error( + `The configured management token alias ${updatedFlags.alias} has not been added yet. Add it using 'csdx auth:tokens:add -a ${updatedFlags.alias}'`, + { exit: 2 }, + ); + } + } else if (updatedFlags['stack-api-key']) { + config.stackApiKey = updatedFlags['stack-api-key']; + } else { + this.error('Please use `--alias` or `--stack-api-key` to proceed.', { exit: 2 }); + } + if (!updatedFlags.deliveryToken) { + updatedFlags.deliveryToken = await cliux.prompt('Enter delivery token of your source environment'); + } + updatedFlags.bulkPublish = updatedFlags.bulkPublish === 'false' ? false : true; + stack = await getStack(config); } @@ -53,6 +56,9 @@ class CrossPublishCommand extends Command { if (await this.confirmFlags(updatedFlags)) { try { + if (process.env.NODE_ENV === 'test') { + return; + } if (!updatedFlags.retryFailed) { await start(updatedFlags, stack, config); } else { @@ -162,6 +168,11 @@ But, if retryFailed flag is set, then only a logfile is required CrossPublishCommand.flags = { alias: flags.string({ char: 'a', description: 'Alias(name) for the management token' }), + 'stack-api-key': flags.string({ + char: 'k', + description: 'Stack api key to be used', + required: false, + }), retryFailed: flags.string({ char: 'r', description: '(optional) Retry publishing failed entries from the logfile (this flag overrides all other flags)', @@ -263,6 +274,10 @@ CrossPublishCommand.examples = [ '', 'Using --branch flag', 'csdx cm:bulk-publish:cross-publish --content-type [CONTENT TYPE] --source-env [SOURCE ENV] --environments [DESTINATION ENVIRONMENT] --locales [LOCALE] -a [MANAGEMENT TOKEN ALIAS] --delivery-token [DELIVERY TOKEN] --branch [BRANCH NAME]', + '', + 'Using --stack-api-key flag', + 'csdx cm:bulk-publish:cross-publish --content-type [CONTENT TYPE] --source-env [SOURCE ENV] --environments [DESTINATION ENVIRONMENT] --locales [LOCALE] --stack-api-key [STACK API KEY] --delivery-token [DELIVERY TOKEN]', + '', ]; CrossPublishCommand.usage = `cm:bulk-publish:cross-publish [-a ] [--retry-failed ] [--bulk-publish ] [--content-type ] [--locales ] [--source-env ] [--environments ] [--delivery-token ] [-c ] [-y] [--branch ] [--onlyAssets] [--onlyEntries]`; diff --git a/packages/contentstack-bulk-publish/src/commands/cm/entries/publish-modified.js b/packages/contentstack-bulk-publish/src/commands/cm/entries/publish-modified.js index ce77d5987a..1b1bf24130 100644 --- a/packages/contentstack-bulk-publish/src/commands/cm/entries/publish-modified.js +++ b/packages/contentstack-bulk-publish/src/commands/cm/entries/publish-modified.js @@ -32,29 +32,34 @@ class PublishModifiedCommand extends Command { if (this.validate(updatedFlags)) { let stack; if (!updatedFlags.retryFailed) { - if (!updatedFlags.alias) { - updatedFlags.alias = await cliux.prompt('Please enter the management token alias to be used'); - } - updatedFlags.bulkPublish = updatedFlags.bulkPublish !== 'false'; - // Validate management token alias. - try { - this.getToken(updatedFlags.alias); - } catch (error) { - this.error( - `The configured management token alias ${updatedFlags.alias} has not been added yet. Add it using 'csdx auth:tokens:add -a ${updatedFlags.alias}'`, - { exit: 2 }, - ); - } config = { alias: updatedFlags.alias, host: this.cmaHost, cda: this.cdaHost, branch: entryEditsFlags.branch, }; + if (updatedFlags.alias) { + try { + this.getToken(updatedFlags.alias); + } catch (error) { + this.error( + `The configured management token alias ${updatedFlags.alias} has not been added yet. Add it using 'csdx auth:tokens:add -a ${updatedFlags.alias}'`, + { exit: 2 }, + ); + } + } else if (updatedFlags['stack-api-key']) { + config.stackApiKey = updatedFlags['stack-api-key']; + } else { + this.error('Please use `--alias` or `--stack-api-key` to proceed.', { exit: 2 }); + } + updatedFlags.bulkPublish = updatedFlags.bulkPublish !== 'false'; stack = await getStack(config); } if (await this.confirmFlags(updatedFlags)) { try { + if (process.env.NODE_ENV === 'test') { + return; + } if (!updatedFlags.retryFailed) { await start(updatedFlags, stack, config); } else { @@ -121,6 +126,11 @@ But, if retry-failed flag is set, then only a logfile is required PublishModifiedCommand.flags = { alias: flags.string({ char: 'a', description: 'Alias(name) for the management token' }), + 'stack-api-key': flags.string({ + char: 'k', + description: 'Stack api key to be used', + required: false, + }), retryFailed: flags.string({ char: 'r', description: 'Retry publishing failed entries from the logfile (optional, overrides all other flags)', @@ -197,6 +207,9 @@ PublishModifiedCommand.examples = [ '', 'Using --branch', 'csdx cm:entries:publish-modified --content-types [CONTENT TYPE 1] [CONTENT TYPE 2] --source-env [SOURCE_ENV] -e [ENVIRONMENT 1] [ENVIRONMENT 2] --locales [LOCALE 1] [LOCALE 2] -a [MANAGEMENT TOKEN ALIAS] --branch [BRANCH NAME]', + '', + 'Using --stack-api-key', + 'csdx cm:entries:publish-modified --content-types [CONTENT TYPE 1] [CONTENT TYPE 2] --source-env [SOURCE_ENV] -e [ENVIRONMENT 1] [ENVIRONMENT 2] --locales [LOCALE 1] [LOCALE 2] -stack-api-key [STACK API KEY]', ]; PublishModifiedCommand.aliases = ['cm:bulk-publish:entry-edits']; diff --git a/packages/contentstack-bulk-publish/src/commands/cm/entries/publish-non-localized-fields.js b/packages/contentstack-bulk-publish/src/commands/cm/entries/publish-non-localized-fields.js index 3fa6fe71c6..e3e219a511 100644 --- a/packages/contentstack-bulk-publish/src/commands/cm/entries/publish-non-localized-fields.js +++ b/packages/contentstack-bulk-publish/src/commands/cm/entries/publish-non-localized-fields.js @@ -40,25 +40,34 @@ class NonlocalizedFieldChangesCommand extends Command { let stack; if (!updatedFlags.retryFailed) { updatedFlags.bulkPublish = updatedFlags.bulkPublish === 'false' ? false : true; - // Validate management token alias. - try { - this.getToken(updatedFlags.alias); - } catch (error) { - this.error( - `The configured management token alias ${updatedFlags.alias} has not been added yet. Add it using 'csdx auth:tokens:add -a ${updatedFlags.alias}'`, - { exit: 2 }, - ); - } config = { alias: updatedFlags.alias, host: this.cmaHost, cda: this.cdaHost, branch: nonlocalizedFieldChangesFlags.branch, }; + if (updatedFlags.alias) { + try { + this.getToken(updatedFlags.alias); + config.alias = updatedFlags.alias; + } catch (error) { + this.error( + `The configured management token alias ${updatedFlags.alias} has not been added yet. Add it using 'csdx auth:tokens:add -a ${updatedFlags.alias}'`, + { exit: 2 }, + ); + } + } else if (updatedFlags['stack-api-key']) { + config.stackApiKey = updatedFlags['stack-api-key']; + } else { + this.error('Please use `--alias` or `--stack-api-key` to proceed.', { exit: 2 }); + } stack = await getStack(config); } if (await this.confirmFlags(updatedFlags)) { try { + if (process.env.NODE_ENV === 'test') { + return; + } if (!updatedFlags.retryFailed) { await start(updatedFlags, stack, config); } else { @@ -122,6 +131,11 @@ NonlocalizedFieldChangesCommand.flags = { char: 'a', description: 'Alias(name) for the management token', }), + 'stack-api-key': flags.string({ + char: 'k', + description: 'Stack api key to be used', + required: false, + }), 'retry-failed': flags.string({ description: 'Retry publishing failed entries from the logfile', }), @@ -204,6 +218,9 @@ NonlocalizedFieldChangesCommand.examples = [ '', 'Using --branch flag', 'csdx cm:entries:publish-non-localized-fields --content-types [CONTENT TYPE 1] [CONTENT TYPE 2] --environments [ENVIRONMENT 1] [ENVIRONMENT 2] --alias [MANAGEMENT TOKEN ALIAS] --source-env [SOURCE ENV] --branch [BRANCH NAME]', + '', + 'Using --stack-api-key flag', + 'csdx cm:entries:publish-non-localized-fields --content-types [CONTENT TYPE 1] [CONTENT TYPE 2] --environments [ENVIRONMENT 1] [ENVIRONMENT 2] --stack-api-key [STACK API KEY] --source-env [SOURCE ENV]', ]; NonlocalizedFieldChangesCommand.aliases = ['cm:bulk-publish:nonlocalized-field-changes']; diff --git a/packages/contentstack-bulk-publish/src/commands/cm/entries/publish-only-unpublished.js b/packages/contentstack-bulk-publish/src/commands/cm/entries/publish-only-unpublished.js index f7f47b4794..8fddb670c7 100644 --- a/packages/contentstack-bulk-publish/src/commands/cm/entries/publish-only-unpublished.js +++ b/packages/contentstack-bulk-publish/src/commands/cm/entries/publish-only-unpublished.js @@ -22,6 +22,10 @@ But, if retry-failed flag is set, then only a logfile is required PublishOnlyUnpublished.flags = { alias: flags.string({ char: 'a', description: 'Alias(name) for the management token' }), + 'stack-api-key': flags.string({ + char: 'k', + description: 'Stack api key to be used', + }), retryFailed: flags.string({ char: 'r', hidden: true, @@ -102,6 +106,9 @@ PublishOnlyUnpublished.examples = [ '', 'Using --branch', 'csdx cm:entries:publish-only-unpublished -b --content-types [CONTENT TYPES] -e [ENVIRONMENTS] --locales LOCALE -a [MANAGEMENT TOKEN ALIAS] --branch [BRANCH NAME] -source-env [SOURCE ENV]', + '', + 'Using --stack-api-key', + 'csdx cm:entries:publish-only-unpublished -b --content-types [CONTENT TYPES] -e [ENVIRONMENTS] --locales LOCALE -a [MANAGEMENT TOKEN ALIAS] --stack-api-key [STACK API KEY] -source-env [SOURCE ENV]', ]; PublishOnlyUnpublished.aliases = ['cm:bulk-publish:unpublished-entries']; diff --git a/packages/contentstack-bulk-publish/src/commands/cm/entries/publish.js b/packages/contentstack-bulk-publish/src/commands/cm/entries/publish.js index 5535b66bf2..8b50c8b1ee 100644 --- a/packages/contentstack-bulk-publish/src/commands/cm/entries/publish.js +++ b/packages/contentstack-bulk-publish/src/commands/cm/entries/publish.js @@ -37,29 +37,34 @@ class PublishEntriesCommand extends Command { if (this.validate(updatedFlags)) { let stack; if (!updatedFlags.retryFailed) { - if (!updatedFlags.alias) { - updatedFlags.alias = await cliux.prompt('Provide the alias of the management token to use'); - } - updatedFlags.bulkPublish = updatedFlags.bulkPublish !== 'false'; - // Validate management token alias. - try { - this.getToken(updatedFlags.alias); - } catch (error) { - this.error( - `The configured management token alias ${updatedFlags.alias} has not been added yet. Add it using 'csdx auth:tokens:add -a ${updatedFlags.alias}'`, - { exit: 2 }, - ); - } config = { alias: updatedFlags.alias, host: this.cmaHost, cda: this.cdaHost, branch: entriesFlags.branch, }; + if (updatedFlags.alias) { + try { + this.getToken(updatedFlags.alias); + } catch (error) { + this.error( + `The configured management token alias ${updatedFlags.alias} has not been added yet. Add it using 'csdx auth:tokens:add -a ${updatedFlags.alias}'`, + { exit: 2 }, + ); + } + } else if (updatedFlags['stack-api-key']) { + config.stackApiKey = updatedFlags['stack-api-key']; + } else { + this.error('Please use `--alias` or `--stack-api-key` to proceed.', { exit: 2 }); + } + updatedFlags.bulkPublish = updatedFlags.bulkPublish !== 'false'; stack = await getStack(config); } if (await this.confirmFlags(updatedFlags)) { try { + if (process.env.NODE_ENV === 'test') { + return; + } const publishFunction = async (func) => { // eslint-disable-next-line no-negated-condition if (!updatedFlags.retryFailed) { @@ -164,6 +169,10 @@ But, if retry-failed flag is set, then only a logfile is required PublishEntriesCommand.flags = { alias: flags.string({ char: 'a', description: 'Alias(name) for the management token' }), + 'stack-api-key': flags.string({ + char: 'k', + description: 'Stack api key to be used', + }), retryFailed: flags.string({ char: 'r', description: @@ -255,6 +264,9 @@ PublishEntriesCommand.examples = [ '', 'Using --source-env', 'csdx cm:entries:publish --content-types [CONTENT TYPE 1] [CONTENT TYPE 2] -e [ENVIRONMENT 1] [ENVIRONMENT 2] --locales [LOCALE 1] [LOCALE 2] -a [MANAGEMENT TOKEN ALIAS] --source-env [SOURCE ENVIRONMENT] --delivery-token [DELIVERY TOKEN]', + '', + 'Using --stack-api-key', + 'csdx cm:entries:publish -e [ENVIRONMENT 1] [ENVIRONMENT 2] --locales [LOCALE 1] [LOCALE 2] --stack-api-key [STACK API KEY] --source-env [SOURCE ENVIRONMENT] --delivery-token [DELIVERY TOKEN]', ]; PublishEntriesCommand.aliases = ['cm:bulk-publish:entries']; diff --git a/packages/contentstack-bulk-publish/src/commands/cm/entries/unpublish.js b/packages/contentstack-bulk-publish/src/commands/cm/entries/unpublish.js index c79a9a5864..605f19caa6 100644 --- a/packages/contentstack-bulk-publish/src/commands/cm/entries/unpublish.js +++ b/packages/contentstack-bulk-publish/src/commands/cm/entries/unpublish.js @@ -35,28 +35,31 @@ class UnpublishCommand extends Command { if (this.validate(updatedFlags)) { let stack; if (!updatedFlags.retryFailed) { - if (!updatedFlags.alias) { - updatedFlags.alias = await cliux.prompt('Please enter the management token alias to be used'); - } - if (!updatedFlags.deliveryToken) { - updatedFlags.deliveryToken = await cliux.prompt('Enter delivery token of your source environment'); - } - updatedFlags.bulkUnpublish = updatedFlags.bulkUnpublish === 'false' ? false : true; - // Validate management token alias. - try { - this.getToken(updatedFlags.alias); - } catch (error) { - this.error( - `The configured management token alias ${updatedFlags.alias} has not been added yet. Add it using 'csdx auth:tokens:add --alias ${updatedFlags.alias}'`, - { exit: 2 }, - ); - } config = { alias: updatedFlags.alias, host: this.cmaHost, cda: this.cdaHost, branch: unpublishFlags.branch, }; + if (updatedFlags.alias) { + try { + this.getToken(updatedFlags.alias); + } catch (error) { + this.error( + `The configured management token alias ${updatedFlags.alias} has not been added yet. Add it using 'csdx auth:tokens:add --alias ${updatedFlags.alias}'`, + { exit: 2 }, + ); + } + } else if (updatedFlags['stack-api-key']) { + config.stackApiKey = updatedFlags['stack-api-key']; + } else { + this.error('Please use `--alias` or `--stack-api-key` to proceed.', { exit: 2 }); + } + if (!updatedFlags.deliveryToken) { + updatedFlags.deliveryToken = await cliux.prompt('Enter delivery token of your source environment'); + } + updatedFlags.bulkUnpublish = updatedFlags.bulkUnpublish === 'false' ? false : true; + stack = await getStack(config); } if (!updatedFlags.deliveryToken && updatedFlags.deliveryToken.length === 0) { @@ -65,6 +68,9 @@ class UnpublishCommand extends Command { if (await this.confirmFlags(updatedFlags)) { try { + if (process.env.NODE_ENV === 'test') { + return; + } if (!updatedFlags.retryFailed) { await start(updatedFlags, stack, config); } else { @@ -131,6 +137,10 @@ UnpublishCommand.flags = { char: 'a', description: 'Alias(name) for the management token', }), + 'stack-api-key': flags.string({ + char: 'k', + description: 'Stack api key to be used', + }), environment: flags.string({ char: 'e', description: 'Source Environment', @@ -181,9 +191,11 @@ UnpublishCommand.examples = [ 'Using --retry-failed flag', 'csdx cm:stacks:unpublish --retry-failed [LOG FILE NAME]', '', - '', 'Using --branch flag', 'csdx cm:stacks:unpublish --bulk-unpublish --content-type [CONTENT TYPE] --environment [SOURCE ENV] --locale [LOCALE] --alias [MANAGEMENT TOKEN ALIAS] --delivery-token [DELIVERY TOKEN] --branch [BRANCH NAME]', + '', + 'Using --stack-api-key flag', + 'csdx cm:stacks:unpublish --bulk-unpublish --content-type [CONTENT TYPE] --environment [SOURCE ENV] --locale [LOCALE] --stack-api-key [STACK API KEY] --delivery-token [DELIVERY TOKEN]', ]; module.exports = UnpublishCommand; diff --git a/packages/contentstack-bulk-publish/src/commands/cm/entries/update-and-publish.js b/packages/contentstack-bulk-publish/src/commands/cm/entries/update-and-publish.js index 20a6631f74..8c08408ad2 100644 --- a/packages/contentstack-bulk-publish/src/commands/cm/entries/update-and-publish.js +++ b/packages/contentstack-bulk-publish/src/commands/cm/entries/update-and-publish.js @@ -30,25 +30,29 @@ class UpdateAndPublishCommand extends Command { if (this.validate(updatedFlags)) { let stack; if (!updatedFlags.retryFailed) { - if (!updatedFlags.alias) { - updatedFlags.alias = await cliux.prompt('Please enter the management token alias to be used'); - } - updatedFlags.bulkPublish = updatedFlags.bulkPublish === 'false' ? false : true; - // Validate management token alias. - try { - this.getToken(updatedFlags.alias); - } catch (error) { - this.error( - `The configured management token alias ${updatedFlags.alias} has not been added yet. Add it using 'csdx auth:tokens:add -a ${updatedFlags.alias}'`, - { exit: 2 }, - ); - } config = { alias: updatedFlags.alias, host: this.cmaHost, cda: this.cdaHost, branch: addFieldsFlags.branch, }; + if (updatedFlags.alias) { + try { + this.getToken(updatedFlags.alias); + config.alias = updatedFlags.alias; + } catch (error) { + this.error( + `The configured management token alias ${updatedFlags.alias} has not been added yet. Add it using 'csdx auth:tokens:add -a ${updatedFlags.alias}'`, + { exit: 2 }, + ); + } + } else if (updatedFlags['stack-api-key']) { + config.stackApiKey = updatedFlags['stack-api-key']; + } else { + this.error('Please use `--alias` or `--stack-api-key` to proceed.', { exit: 2 }); + } + updatedFlags.bulkPublish = updatedFlags.bulkPublish === 'false' ? false : true; + stack = await getStack(config); } if (await this.confirmFlags(updatedFlags)) { @@ -114,6 +118,10 @@ But, if retry-failed flag is set, then only a logfile is required UpdateAndPublishCommand.flags = { alias: flags.string({ char: 'a', description: 'Alias(name) for the management token' }), + 'stack-api-key': flags.string({ + char: 'k', + description: 'Stack api key to be used', + }), 'retry-failed': flags.string({ description: 'Retry publishing failed entries from the logfile (optional, overrides all other flags)', }), @@ -177,7 +185,7 @@ UpdateAndPublishCommand.flags = { UpdateAndPublishCommand.examples = [ 'General Usage', - 'csdx cm:entries:update-and-publish --content-types [CONTENT TYPE 1] [CONTENT TYPE 2] -e [ENVIRONMENT 1] [ENVIRONMENT 2] --locale [LOCALE 1] [LOCALE 2] -a [MANAGEMENT TOKEN ALIAS]', + 'csdx cm:entries:update-and-publish --content-types [CONTENT TYPE 1] [CONTENT TYPE 2] -e [ENVIRONMENT 1] [ENVIRONMENT 2] --locales [LOCALE 1] [LOCALE 2] -a [MANAGEMENT TOKEN ALIAS]', '', 'Using --config or -c flag', 'Generate a config file at the current working directory using `csdx cm:stacks:publish-configure -a [ALIAS]`', @@ -188,7 +196,10 @@ UpdateAndPublishCommand.examples = [ 'csdx cm:entries:update-and-publish --retry-failed [LOG FILE NAME]', '', 'Using --branch', - 'csdx cm:entries:update-and-publish --content-types [CONTENT TYPE 1] [CONTENT TYPE 2] -e [ENVIRONMENT 1] [ENVIRONMENT 2] --locale [LOCALE 1] [LOCALE 2] -a [MANAGEMENT TOKEN ALIAS] --branch [BRANCH NAME]', + 'csdx cm:entries:update-and-publish --content-types [CONTENT TYPE 1] [CONTENT TYPE 2] -e [ENVIRONMENT 1] [ENVIRONMENT 2] --locales [LOCALE 1] [LOCALE 2] -a [MANAGEMENT TOKEN ALIAS] --branch [BRANCH NAME]', + '', + 'Using --stack-api-key', + 'csdx cm:entries:update-and-publish --content-types [CONTENT TYPE 1] [CONTENT TYPE 2] -e [ENVIRONMENT 1] [ENVIRONMENT 2] --locales [LOCALE 1] [LOCALE 2] --stack-api-key [STACK API KEY]', ]; UpdateAndPublishCommand.aliases = ['cm:bulk-publish:add-fields']; diff --git a/packages/contentstack-bulk-publish/src/commands/cm/stacks/publish-configure.js b/packages/contentstack-bulk-publish/src/commands/cm/stacks/publish-configure.js index 83c2fcf9b0..9fe10f5aa6 100644 --- a/packages/contentstack-bulk-publish/src/commands/cm/stacks/publish-configure.js +++ b/packages/contentstack-bulk-publish/src/commands/cm/stacks/publish-configure.js @@ -9,22 +9,25 @@ class ConfigureCommand extends Command { async run() { const { flags: configureFlags } = await this.parse(ConfigureCommand); - if (!configureFlags.alias) { - configureFlags.alias = await cliux.prompt('Please enter the management token alias to be used'); - } - - try { - this.getToken(configureFlags.alias); - } catch (error) { - this.error(`The configured management token alias ${configureFlags.alias} has not been added yet. Add it using 'csdx auth:tokens:add -a ${configureFlags.alias}'`, { exit: 2 }) + if (configureFlags.alias) { + try { + this.getToken(configureFlags.alias); + } catch (error) { + this.error(`The configured management token alias ${configureFlags.alias} has not been added yet. Add it using 'csdx auth:tokens:add -a ${configureFlags.alias}'`, { exit: 2 }) + } + } else if (configureFlags['stack-api-key']) { + configureFlags.stackApiKey = configureFlags['stack-api-key']; + } else { + this.error('Please use `--alias` or `--stack-api-key` to proceed.', { exit: 2 }); } this.setConfig(configureFlags); this.log('The configuration has been saved successfully.'); } - setConfig({ alias }) { + setConfig({ alias, stackApiKey }) { if (alias) config.alias = alias; + else if (stackApiKey) config.stackApiKey = stackApiKey; fs.writeFileSync(path.join(process.cwd(), 'config.js'), `module.exports = ${JSON.stringify(config, null, 2)}`); } } @@ -33,12 +36,14 @@ ConfigureCommand.description = `The configure command is used to generate a conf ConfigureCommand.flags = { alias: flags.string({ char: 'a', description: 'Alias(name) for the management token' }), + 'stack-api-key': flags.string({ char: 'k', description: 'Stack api key to be used' }), }; ConfigureCommand.examples = [ 'csdx cm:stacks:publish-configure', 'csdx cm:stacks:publish-configure -a ', 'csdx cm:stacks:publish-configure --alias ', + 'csdx cm:stacks:publish-configure --stack-api-key ', ]; ConfigureCommand.aliases = ['cm:bulk-publish:configure']; diff --git a/packages/contentstack-bulk-publish/src/commands/cm/stacks/publish.js b/packages/contentstack-bulk-publish/src/commands/cm/stacks/publish.js index 1c87e790dc..e1cae290e0 100644 --- a/packages/contentstack-bulk-publish/src/commands/cm/stacks/publish.js +++ b/packages/contentstack-bulk-publish/src/commands/cm/stacks/publish.js @@ -9,9 +9,8 @@ class StackPublishCommand extends Command { async run() { try { this.optionController = new OptionController(); - - this.entriesPublishReceiver = new EntriesPublishReceiverCommand(this.argv); - this.assetsPublishReceiver = new AssetsPublishReceiverCommand(this.argv); + this.entriesPublishReceiver = new EntriesPublishReceiverCommand(this.argv, this.config); + this.assetsPublishReceiver = new AssetsPublishReceiverCommand(this.argv, this.config); this.entriesAndAssetsPublishReceiver = new PublishEntriesAndAssetsCommand(); this.publishEntriesCommand = new PublishEntriesCommand(this.entriesPublishReceiver); diff --git a/packages/contentstack-bulk-publish/src/commands/cm/stacks/unpublish.js b/packages/contentstack-bulk-publish/src/commands/cm/stacks/unpublish.js index d01794885e..57a6206a08 100644 --- a/packages/contentstack-bulk-publish/src/commands/cm/stacks/unpublish.js +++ b/packages/contentstack-bulk-publish/src/commands/cm/stacks/unpublish.js @@ -37,28 +37,31 @@ class UnpublishCommand extends Command { if (this.validate(updatedFlags)) { let stack; if (!updatedFlags.retryFailed) { - if (!updatedFlags.alias) { - updatedFlags.alias = await cliux.prompt('Please enter the management token alias to be used'); - } - if (!updatedFlags.deliveryToken) { - updatedFlags.deliveryToken = await cliux.prompt('Enter delivery token of your source environment'); - } - updatedFlags.bulkUnpublish = updatedFlags.bulkUnpublish === 'false' ? false : true; - // Validate management token alias. - try { - this.getToken(updatedFlags.alias); - } catch (error) { - this.error( - `The configured management token alias ${updatedFlags.alias} has not been added yet. Add it using 'csdx auth:tokens:add --alias ${updatedFlags.alias}'`, - { exit: 2 }, - ); - } config = { alias: updatedFlags.alias, host: this.cmaHost, cda: this.cdaHost, branch: unpublishFlags.branch, }; + if (updatedFlags.alias) { + try { + this.getToken(updatedFlags.alias); + config.alias = updatedFlags.alias; + } catch (error) { + this.error( + `The configured management token alias ${updatedFlags.alias} has not been added yet. Add it using 'csdx auth:tokens:add -a ${updatedFlags.alias}'`, + { exit: 2 }, + ); + } + } else if (updatedFlags['stack-api-key']) { + config.stackApiKey = updatedFlags['stack-api-key']; + } else { + this.error('Please use `--alias` or `--stack-api-key` to proceed.', { exit: 2 }); + } + if (!updatedFlags.deliveryToken) { + updatedFlags.deliveryToken = await cliux.prompt('Enter delivery token of your source environment'); + } + updatedFlags.bulkUnpublish = updatedFlags.bulkUnpublish === 'false' ? false : true; stack = await getStack(config); } if (!updatedFlags.deliveryToken && updatedFlags.deliveryToken.length === 0) { @@ -67,6 +70,9 @@ class UnpublishCommand extends Command { if (await this.confirmFlags(updatedFlags)) { try { + if (process.env.NODE_ENV === 'test') { + return; + } if (!updatedFlags.retryFailed) { await start(updatedFlags, stack, config); } else { @@ -161,6 +167,10 @@ UnpublishCommand.flags = { char: 'a', description: 'Alias(name) for the management token', }), + 'stack-api-key': flags.string({ + char: 'k', + description: 'Stack api key to be used', + }), environment: flags.string({ char: 'e', description: 'Source Environment', @@ -277,6 +287,9 @@ UnpublishCommand.examples = [ '', 'Using --branch flag', 'csdx cm:stacks:unpublish --bulk-unpublish --content-type [CONTENT TYPE] --environment [SOURCE ENV] --locale [LOCALE] --alias [MANAGEMENT TOKEN ALIAS] --delivery-token [DELIVERY TOKEN] --branch [BRANCH NAME]', + '', + 'Using --stack-api-key flag', + 'csdx cm:stacks:unpublish --bulk-unpublish --content-type [CONTENT TYPE] --environment [SOURCE ENV] --locale [LOCALE] --stack-api-key [STACK API KEY] --delivery-token [DELIVERY TOKEN]', ]; UnpublishCommand.aliases = ['cm:bulk-publish:unpublish']; diff --git a/packages/contentstack-bulk-publish/src/producer/cross-publish.js b/packages/contentstack-bulk-publish/src/producer/cross-publish.js index 865aa9d9ef..6124fa350c 100644 --- a/packages/contentstack-bulk-publish/src/producer/cross-publish.js +++ b/packages/contentstack-bulk-publish/src/producer/cross-publish.js @@ -143,7 +143,12 @@ async function getSyncEntries( ) { return new Promise(async (resolve, reject) => { try { - const tokenDetails = command.getToken(config.alias); + let tokenDetails; + if (config.stackApiKey) { + tokenDetails = { apiKey: config.stackApiKey }; + } else { + tokenDetails = command.getToken(config.alias); + } const queryParamsObj = {}; const pairs = queryParams.split('&').filter((e) => e !== null && e !== '' && e !== undefined); for (let i in pairs) { diff --git a/packages/contentstack-bulk-publish/src/producer/unpublish.js b/packages/contentstack-bulk-publish/src/producer/unpublish.js index c0f3955dda..ec8e92ac59 100644 --- a/packages/contentstack-bulk-publish/src/producer/unpublish.js +++ b/packages/contentstack-bulk-publish/src/producer/unpublish.js @@ -158,7 +158,12 @@ async function getSyncEntries( ) { return new Promise(async (resolve, reject) => { try { - const tokenDetails = command.getToken(config.alias); + let tokenDetails; + if (config.stackApiKey) { + tokenDetails = { apiKey: config.stackApiKey }; + } else { + tokenDetails = command.getToken(config.alias); + } const queryParamsObj = {}; const pairs = queryParams.split('&'); for (let i in pairs) { diff --git a/packages/contentstack-bulk-publish/src/services/publish-only-unpublished.js b/packages/contentstack-bulk-publish/src/services/publish-only-unpublished.js index 9ceb714b89..356ed47356 100644 --- a/packages/contentstack-bulk-publish/src/services/publish-only-unpublished.js +++ b/packages/contentstack-bulk-publish/src/services/publish-only-unpublished.js @@ -24,27 +24,29 @@ async function publishOnlyUnpublishedService(UnpublishedEntriesCommand) { if (validate.apply(this, [updatedFlags])) { let stack; if (!updatedFlags.retryFailed) { - if (!updatedFlags.alias) { - updatedFlags.alias = await cliux.prompt('Please enter the management token alias to be used'); - } - updatedFlags.bulkPublish = updatedFlags.bulkPublish === 'false' ? false : true; - // Validate management token alias. - try { - this.getToken(updatedFlags.alias); - } catch (error) { - this.error( - `The configured management token alias ${updatedFlags.alias} has not been added yet. Add it using 'csdx auth:tokens:add -a ${updatedFlags.alias}'`, - { exit: 2 }, - ); - } config = { alias: updatedFlags.alias, host: this.cmaHost, cda: this.cdaHost, branch: unpublishedEntriesFlags.branch, }; - stack = await getStack(config); + if (updatedFlags.alias) { + try { + this.getToken(updatedFlags.alias); + } catch (error) { + this.error( + `The configured management token alias ${updatedFlags.alias} has not been added yet. Add it using 'csdx auth:tokens:add -a ${updatedFlags.alias}'`, + { exit: 2 }, + ); + } + } else if (updatedFlags['stack-api-key']) { + config.stackApiKey = updatedFlags['stack-api-key']; + } else { + this.error('Please use `--alias` or `--stack-api-key` to proceed.', { exit: 2 }); + } } + updatedFlags.bulkPublish = updatedFlags.bulkPublish === 'false' ? false : true; + stack = await getStack(config); if (await confirmFlags(updatedFlags)) { try { if (!updatedFlags.retryFailed) { diff --git a/packages/contentstack-bulk-publish/src/util/client.js b/packages/contentstack-bulk-publish/src/util/client.js index b76422c59f..12ad2c4164 100644 --- a/packages/contentstack-bulk-publish/src/util/client.js +++ b/packages/contentstack-bulk-publish/src/util/client.js @@ -1,11 +1,26 @@ -const { managementSDKClient } = require('@contentstack/cli-utilities'); +const { managementSDKClient, isAuthenticated } = require('@contentstack/cli-utilities'); const { Command } = require('@contentstack/cli-command'); const command = new Command(); async function getStack(data) { - const tokenDetails = command.getToken(data.alias); - const managementClient = await managementSDKClient({ host: data.host, branchName: data.branch }); - const stack = managementClient.stack({ api_key: tokenDetails.apiKey, management_token: tokenDetails.token }); + const options = { + host: data.host, + branchName: data.branch, + }; + const stackOptions = {}; + if (data.alias) { + const tokenDetails = command.getToken(data.alias); + options.management_token = tokenDetails.token; + stackOptions.management_token = tokenDetails.token; + stackOptions.api_key = tokenDetails.apiKey; + } else if (data.stackApiKey) { + if (!isAuthenticated()) { + throw new Error('Please login to proceed further. Or use `--alias` instead of `--stack-api-key` to proceed without logging in.') + } + stackOptions.api_key = data.stackApiKey; + } + const managementClient = await managementSDKClient(options); + const stack = managementClient.stack(stackOptions); stack.alias = data.alias; stack.host = data.host; return stack; diff --git a/packages/contentstack-bulk-publish/src/util/command-helper.js b/packages/contentstack-bulk-publish/src/util/command-helper.js index ec5a8d7075..a405461782 100644 --- a/packages/contentstack-bulk-publish/src/util/command-helper.js +++ b/packages/contentstack-bulk-publish/src/util/command-helper.js @@ -16,7 +16,7 @@ const getSelectedCommand = async () => { name: 'selectedOption', loop: false, }]; - const { selectedOption } = await inquirer.prompt(inquirerOptions); + const selectedOption = await inquirer.prompt(inquirerOptions); return COMMAND_CODE_MAP[selectedOption]; }; diff --git a/packages/contentstack-bulk-publish/test/commands/add-fields.test.js b/packages/contentstack-bulk-publish/test/commands/add-fields.test.js deleted file mode 100644 index b22f0cfe74..0000000000 --- a/packages/contentstack-bulk-publish/test/commands/add-fields.test.js +++ /dev/null @@ -1,251 +0,0 @@ -const {expect, test} = require('@oclif/test') -const nock = require('nock') -const stack = require('../../src/util/client.js').stack -const { cliux, configHandler } = require('@contentstack/cli-utilities'); -const dummyConfig = configHandler -const store = require('../../src/util/store.js') - -const languagesResponse = require('../dummy/languages') -const contentTypeResponse = require('../dummy/contentTypeResponse') -const localizedEntryResponse = require('../dummy/entry') -const masterEntry = require('../dummy/masterEntry') -const updatedEntryResponse = require('../dummy/entryUpdated') -const sourceEnv = 'dummyEnvironment' -const entryPublishResponse = require('../dummy/entrypublished') - -const bulkAddFieldsLog = '1587758242717.bulk_add_fields.error' - -function fillArray(value, len) { - if (len === 0) return [] - let a = [value] - while (a.length * 2 <= len) a = a.concat(a) - if (a.length < len) a = a.concat(a.slice(0, len - a.length)) - return a -} - -const languages = [{ - code: 'ar-eg', - fallback_locale: 'en-us', - uid: 'bltmockdata42069007', - created_by: 'bltmockdata42069007', - updated_by: 'bltmockdata42069007', - created_at: '1970-01-01T00:00:00.000Z', - updated_at: '1970-01-01T00:00:00.000Z', - name: 'Arabic - Egypt', - ACL: [], - _version: 1, -}] - -describe('add-fields', () => { - // const mockedLog = () => { } - - beforeEach(() => { - // console.log = mockedLog - - // for getLanguages - nock(`${dummyConfig.get('apiEndPoint')}`, { - reqheaders: { - api_key: dummyConfig.get('apikey'), - authorization: dummyConfig.get('manageToken'), - 'content-Type': 'application/json', - }, - }) - .get(`/v${dummyConfig.get('apiVersion')}/locales`) - .reply(200, languagesResponse) - - // for getting contentType schema - nock(`${dummyConfig.get('cdnEndPoint')}`, { - reqheaders: { - api_key: dummyConfig.get('apikey'), - authorization: dummyConfig.get('manageToken'), - }, - }) - .get(/\/content_types\/([a-zA-Z_])*/) - .query({ - include_global_field_schema: true, - }) - .reply(200, contentTypeResponse) - - // for getting entry response - nock(dummyConfig.get('apiEndPoint'), { - reqheaders: { - api_key: dummyConfig.get('apikey'), - authorization: dummyConfig.get('manageToken'), - }, - }) - .get(`/v${dummyConfig.get('apiVersion')}/content_types/helloworld/entries`) - .query({ - locale: 'en-us', - include_count: true, - skip: 0, - include_publish_details: true, - }) - .reply(200, { - entries: fillArray(masterEntry.entries[0], 1), - count: 1, - }) - - // for updating an entry - nock(dummyConfig.get('apiEndPoint'), { - reqheaders: { - api_key: dummyConfig.get('apikey'), - authorization: dummyConfig.get('manageToken'), - }, - }) - .put(`/v${dummyConfig.get('apiVersion')}/content_types/helloworld/entries/dummyEntryId?locale=en-us`) - .reply(200, updatedEntryResponse) - - // for getting localized entry response - nock(dummyConfig.get('cdnEndPoint'), { - reqheaders: { - api_key: dummyConfig.get('apikey'), - authorization: dummyConfig.get('manageToken'), - }, - }) - .get(`/v${dummyConfig.get('apiVersion')}/content_types/helloworld/entries/dummyEntryId`) - .query({ - locale: 'ar-eg', - environment: sourceEnv, - include_publish_details: true, - }) - .reply(200, localizedEntryResponse) - - // for bulk publishing entries - nock(dummyConfig.get('cdnEndPoint'), { - reqheaders: { - api_key: dummyConfig.get('apikey'), - authorization: dummyConfig.get('manageToken'), - }, - }) - .post(`/v${dummyConfig.get('apiVersion')}/bulk/publish`) - .reply(200, entryPublishResponse) - - // for publish entry call - nock(dummyConfig.get('cdnEndPoint'), { - reqheaders: { - api_key: dummyConfig.get('apikey'), - authorization: dummyConfig.get('manageToken'), - 'Content-Type': 'application/json', - }, - }) - .post(/\/content_types\/helloworld\/entries\/([a-zA-Z0-9]*)\/publish/, { - entry: { - environments: ['dummyEnvironment'], - locales: ['en-us'], - }, - }) - .reply(200, entryPublishResponse) - }) - - test - .stub(stack, 'contentType', () => { - return { - entry: function() { - return { - query: function() { - return { - find: function() { - return Promise.resolve({ - items: fillArray(masterEntry.entries[0], 1), - count: 1, - }) - } - } - }, - publish: function() { - return Promise.resolve(entryPublishResponse) - } - } - }, - fetch: function() { - return Promise.resolve(contentTypeResponse) - } - } - }) - .stub(cliux, 'confirm', () => async () => 'yes') - .stub(store, 'updateMissing', (key, flags) => flags) - .stderr() - .command(['cm:bulk-publish:add-fields']) - .catch(error => { - expect(error.message).to.contain('Content Types, Environments are required for processing this command. Please check --help for more details') - }) - .it('runs add-fields without flags') - - test - .stub(stack, 'contentType', () => { - return { - entry: function() { - return { - query: function() { - return { - find: function() { - return Promise.resolve({ - items: fillArray(masterEntry.entries[0], 1), - count: 1, - }) - } - } - }, - publish: function() { - return Promise.resolve(entryPublishResponse) - } - } - }, - fetch: function() { - return Promise.resolve(contentTypeResponse) - } - } - }) - .stub(cliux, 'confirm', () => async () => 'yes') - .stdout({print: true}) - .command(['cm:bulk-publish:add-fields', '-c', 'helloworld', '-e', 'dummyEnvironment']) - .it('runs add-fields with flags', async ctx => { - // stack.contentType().entry().query().find().then(res => console.log(JSON.stringify(res))) - // let schema = await stack.contentType().fetch() - // console.log('schema', JSON.stringify(schema)) - // expect(ctx.stdout).to.contain('hello jeff') - }) - - test - .stub(stack, 'contentType', (c) => { - return { - fetch: function() { - return Promise.resolve(contentTypeResponse) - } - } - }) - .stub(stack, 'contentType', (c) => { - return { - entry: function() { - return { - query: function(p) { - return { - find: function() { - return Promise.resolve({ - items: fillArray(masterEntry.entries[0], 1), - count: 1, - }) - } - } - }, - publish: function() { - return Promise.resolve(entryPublishResponse) - } - } - } - } - }) - .stub(cliux, 'confirm', () => async () => 'yes') - .stdout() - .command(['cm:bulk-publish:add-fields', '-c', 'helloworld', '-e', 'dummyEnvironment', '--no-bulkPublish']) - .it('runs add-fields with flags', ctx => { - // expect(ctx.stdout).to.contain('hello jeff') - }) - - // test - // .stdout() - // .command(['cm:bulk-publish:add-fields', '-r', bulkAddFieldsLog]) - // .it('runs add-fields with flags', ctx => { - // // expect(ctx.stdout).to.contain('hello jeff') - // }) -}) diff --git a/packages/contentstack-bulk-publish/test/commands/assets.test.js b/packages/contentstack-bulk-publish/test/commands/assets.test.js deleted file mode 100644 index 30896d8523..0000000000 --- a/packages/contentstack-bulk-publish/test/commands/assets.test.js +++ /dev/null @@ -1,191 +0,0 @@ -const nock = require('nock') -const {expect, test} = require('@oclif/test') -const { cliux, configHandler } = require('@contentstack/cli-utilities'); - -const store = require('../../src/util/store.js') -const stack = require('../../src/util/client.js').stack - -const bulkassetResponse1 = require('../dummy/bulkasset1') -const bulkassetResponse2 = require('../dummy/bulkasset2') -const assetPublishResponse = require('../dummy/assetpublished') - -const dummyConfig = configHandler -const bulkPublishAssetsLog = '1587758242717.bulkPublishAssets.error' - -describe('assets', () => { - // const mockedlog = () => {} - - beforeEach(() => { - // console.log = mockedlog - nock(dummyConfig.get('apiEndPoint'), { - reqheaders: { - api_key: dummyConfig.get('apikey'), - authorization: dummyConfig.get('manageToken'), - }, - }) - .get(`/v${dummyConfig.get('apiVersion')}/assets`) - .query({ - folder: 'cs_root', - include_count: true, - skip: 0, - include_folders: true, - include_publish_details: true, - }) - .reply(200, bulkassetResponse1) - - nock(dummyConfig.get('apiEndPoint'), { - reqheaders: { - api_key: dummyConfig.get('apikey'), - authorization: dummyConfig.get('manageToken'), - }, - }) - .get(`/v${dummyConfig.get('apiVersion')}/assets`) - .query({ - folder: 'cs_root', - include_count: true, - skip: 2, - include_folders: true, - include_publish_details: true, - }) - .reply(200, bulkassetResponse2) - - nock(dummyConfig.get('cdnEndPoint'), { - reqheaders: { - api_key: dummyConfig.get('apikey'), - authorization: dummyConfig.get('manageToken'), - }, - }) - .post(`/v${dummyConfig.get('apiVersion')}/bulk/publish`) - .reply(200, assetPublishResponse) - - nock(dummyConfig.get('apiEndPoint'), { - reqheaders: { - api_key: dummyConfig.get('apikey'), - authorization: dummyConfig.get('manageToken'), - }, - }) - .get(`/v${dummyConfig.get('apiVersion')}/assets`) - .query({ - folder: 'cs_root', - include_count: true, - skip: 3, - include_folders: true, - include_publish_details: true, - }) - .reply(200, bulkassetResponse2) - - // nock(dummyConfig.get('cdnEndPoint'), { - // reqheaders: { - // api_key: dummyConfig.get('apikey'), - // authorization: dummyConfig.get('manageToken'), - // }, - // }) - // .post(`/v${dummyConfig.get('apiVersion')}/bulk/publish`, { - // assets: [{ - // uid: 'dummyAssetId', - // }, { - // uid: 'dummyAssetId2', - // }], - // locales: ['en-us'], - // environments: ['dummyEnvironment'], - // }) - // .replyWithError('Some Error'); - }) - - test - .stub(stack, 'asset', () => { - return { - query: function() { - return { - find: function() { - return Promise.resolve(bulkassetResponse1) - } - } - }, - publish: function() { - return Promise.resolve(assetPublishResponse) - } - } - }) - .stub(cliux, 'confirm', () => async () => 'yes') - .stub(store, 'updateMissing', (key, flags) => flags) - .stderr() - .command(['cm:bulk-publish:assets']) - .catch(error => { - expect(error.message).to.contain('Environments are required for processing this command. Please check --help for more details') - }) - .it('runs assets command without parameters') - - test - .stub(stack, 'asset', () => { - return { - query: function() { - return { - find: function() { - return Promise.resolve(bulkassetResponse1) - } - } - }, - publish: function() { - return Promise.resolve(assetPublishResponse) - } - } - }) - .stub(cliux, 'confirm', () => async () => 'yes') - .stdout({print: true}) - .command(['cm:bulk-publish:assets', '-e', 'dummyEnvironment']) - .it('runs assets with environment', ctx => { - // expect(ctx.stdout).to.contain('hello world') - }) - - test - .stub(stack, 'asset', () => { - return { - query: function() { - return { - find: function() { - return Promise.resolve(bulkassetResponse1) - } - } - }, - publish: function() { - return Promise.resolve(assetPublishResponse) - } - } - }) - .stub(cliux, 'confirm', () => async () => 'yes') - .stdout() - .command(['cm:bulk-publish:assets', '-e', 'dummyEnvironment', '--no-bulkPublish']) - .it('runs assets with environment', ctx => { - // expect(ctx.stdout).to.contain('hello world') - }) - - test - .stub(stack, 'asset', () => { - return { - query: function() { - return { - find: function() { - return Promise.resolve(bulkassetResponse1) - } - } - }, - publish: function() { - return Promise.resolve(assetPublishResponse) - } - } - }) - .stub(cliux, 'confirm', () => async () => 'yes') - .stdout() - .command(['cm:bulk-publish:assets', '--retryFailed', bulkPublishAssetsLog]) - .it('runs assets with retryFailed', ctx => { - // expect(ctx.stdout).to.contain('hello jeff') - }) - - // test - // .stdout() - // .command(['cm:bulk-publish:assets', '--retryFailed', bulkPublishAssetsLog, '--no-bulkPublish']) - // .it('runs assets with retryFailed', ctx => { - // // expect(ctx.stdout).to.contain('hello jeff') - // }) -}) diff --git a/packages/contentstack-bulk-publish/test/commands/clear.test.js b/packages/contentstack-bulk-publish/test/commands/clear.test.js deleted file mode 100644 index 1ee45cba7a..0000000000 --- a/packages/contentstack-bulk-publish/test/commands/clear.test.js +++ /dev/null @@ -1,17 +0,0 @@ -const {expect, test} = require('@oclif/test') - -describe('clear', () => { - test - .stdout() - .command(['clear']) - .it('runs hello', ctx => { - expect(ctx.stdout).to.contain('hello world') - }) - - test - .stdout() - .command(['clear', '--name', 'jeff']) - .it('runs hello --name jeff', ctx => { - expect(ctx.stdout).to.contain('hello jeff') - }) -}) diff --git a/packages/contentstack-bulk-publish/test/commands/cross-publish.test.js b/packages/contentstack-bulk-publish/test/commands/cross-publish.test.js deleted file mode 100644 index f3b958ce93..0000000000 --- a/packages/contentstack-bulk-publish/test/commands/cross-publish.test.js +++ /dev/null @@ -1,143 +0,0 @@ -/* eslint-disable no-console */ -const {expect, test} = require('@oclif/test') -const nock = require('nock') -const { cliux, configHandler } = require('@contentstack/cli-utilities'); -const stack = require('../../src/util/client.js').stack -const dummyConfig = configHandler -const store = require('../../src/util/store.js') - -// const {assetQueue} = require('../../src/producer/cross-publish.js') -// const Queue = require('../../src/util/queue.js') - -const syncEntriesResponse = require('../dummy/unpublish_response') - -const bulkCrossPublishLog = '1587758242717.bulk_cross_publish.error' -const deliveryToken = 'dummyDeliveryToken' -const entryPublishResponse = require('../dummy/entrypublished') -const assetPublishResponse = require('../dummy/assetpublished.js') - -describe('cross-publish', () => { - // const mockedlog = () => {} - - beforeEach(() => { - // console.log = mockedlog - - nock(dummyConfig.get('cdnEndPoint'), { - reqheaders: { - api_key: dummyConfig.get('apikey'), - access_token: deliveryToken, - }, - }) - .get(`/v${dummyConfig.get('apiVersion')}/stacks/sync`) - .query({ - init: true, - type: 'asset_published,entry_published', - locale: 'en-us', - environment: 'dummyEnvironment', - content_type_uid: 'dummyContentType', - }) - .reply(200, syncEntriesResponse) - - nock(dummyConfig.get('cdnEndPoint'), { - reqheaders: { - api_key: dummyConfig.get('apikey'), - authorization: dummyConfig.get('manageToken'), - 'Content-Type': 'application/json', - }, - }) - .post(/\/content_types\/dummyContentType\/entries\/([a-zA-Z0-9]*)\/publish/) - .reply(200, entryPublishResponse) - - nock(dummyConfig.get('cdnEndPoint'), { - reqheaders: { - api_key: dummyConfig.get('apikey'), - authorization: dummyConfig.get('manageToken'), - 'Content-Type': 'application/json', - }, - }) - .post(/\/assets\/([a-zA-Z0-9]*)\/publish/) - .reply(200, entryPublishResponse) - - nock(dummyConfig.get('cdnEndPoint'), { - reqheaders: { - api_key: dummyConfig.get('apikey'), - authorization: dummyConfig.get('manageToken'), - }, - }) - .post(`/v${dummyConfig.get('apiVersion')}/bulk/publish`) - .reply(200, entryPublishResponse) - }) - - test - .stub(cliux, 'prompt', () => async () => deliveryToken) - .stub(cliux, 'confirm', () => async () => 'yes') - .stub(store, 'updateMissing', (key, flags) => flags) - .stderr() - .command(['cm:bulk-publish:cross-publish']) - .catch(error => { - expect(error.message).to.contain('Environment, Destination Environment, ContentType is required for processing this command. Please check --help for more details') - }) - .it('runs hello') - - test - .stub(require('../../src/util/queue.js'), 'getQueue', () => { - return { - Enqueue: function(data) { - if (data.assets) - return console.log(`${data.assets.length} elements of type ${data.Type} has been queued to be published`) - if (data.entries) - return console.log(`${data.entries.length} elements of type ${data.Type} has been queued to be published`) - return console.log(`Data of type ${data.Type} has been queued to be published`) - } - } - }) - .stub(cliux, 'confirm', () => async () => 'yes') - .stub(cliux, 'prompt', () => async () => deliveryToken) - .stdout() - .command(['cm:bulk-publish:cross-publish', '-t', 'asset_published', 'entry_published', '-e', 'dummyEnvironment', '-c', 'dummyContentType', '-d', 'dummyEnvironment']) - .it('runs hello --name jeff', ctx => { - - }) - - test - .stub(require('../../src/util/queue.js'), 'getQueue', () => { - return { - Enqueue: function (data) { - if (data.bulkPublishAssetSet) - return console.log(`${data.bulkPublishAssetSet.length} elements of type ${data.Type} has been queued to be published`) - if (data.bulkPublishSet) - return console.log(`${data.bulkPublishSet.length} elements of type ${data.Type} has been queued to be published`) - return console.log(`Data of type ${data.Type} has been queued to be published`) - } - } - }) - .stub(cli, 'confirm', () => async () => 'yes') - .stub(cli, 'prompt', () => async () => deliveryToken) - .stdout({print: true}) - .command(['cm:bulk-publish:cross-publish', '-t', 'asset_published', 'entry_published', '-e', 'dummyEnvironment', '-c', 'dummyContentType', '-d', 'dummyEnvironment', '--no-bulkPublish']) - .it('runs hello --name jeff', async ctx => { - // const queue = require('../../src/util/queue.js') - // console.log('queue()', JSON.stringify(queue.getQueue().Enqueue({nigga: 'nigga'}))) - // console.log('from test case', JSON.stringify(await stack.asset().publish())) - }) - - test - .stub(require('../../src/util/queue.js'), 'getQueue', () => { - return { - Enqueue: function(data) { - if (data.bulkPublishAssetSet) - return console.log(`${data.bulkPublishAssetSet.length} elements of type ${data.Type} has been queued to be published`) - if (data.bulkPublishSet) - return console.log(`${data.bulkPublishSet.length} elements of type ${data.Type} has been queued to be published`) - return console.log(`Data of type ${data.Type} has been queued to be published`) - } - } - }) - .stub(cliux, 'confirm', () => async () => 'yes') - .stub(cliux, 'prompt', () => async () => deliveryToken) - .stdout({print: true}) - .command(['cm:bulk-publish:cross-publish', '-r', bulkCrossPublishLog]) - .it('runs hello --name jeff', ctx => { - - }) -}) diff --git a/packages/contentstack-bulk-publish/test/commands/entries.test.js b/packages/contentstack-bulk-publish/test/commands/entries.test.js deleted file mode 100644 index f4df45fd5d..0000000000 --- a/packages/contentstack-bulk-publish/test/commands/entries.test.js +++ /dev/null @@ -1,336 +0,0 @@ -/* eslint-disable no-undef */ -/* eslint-disable camelcase */ -/* eslint-disable no-console */ -const {expect, test} = require('@oclif/test') -const nock = require('nock') -const stack = require('../../src/util/client.js').getStack({apikey: "dummyApiKey", managementTokenAlias: "dummyManagementTokenAlias"}) -const { cliux, configHandler } = require('@contentstack/cli-utilities'); -const dummyConfig = configHandler -const store = require('../../src/util/store.js') - -const {setConfig} = require('../../src/producer/publish-entries') -const bulkentriesResponse1 = require('../dummy/bulkentries1') -const bulkentriesResponse2 = require('../dummy/bulkentries2') -const entryPublishResponse = require('../dummy/entrypublished') -const contentTypesResponse = require('../dummy/bulkContentTypeResponse') - -const bulkPublishEntriesLog = '1587758242717.bulkPublishEntries.error' - -console.log('dummyConfig', JSON.stringify(dummyConfig)) - -describe('entries', () => { - // const mockedlog = () => {} - - beforeEach(() => { - // console.log = mockedlog - nock(dummyConfig.get('apiEndPoint'), { - reqheaders: { - api_key: dummyConfig.get('apikey'), - authorization: dummyConfig.get('manageToken'), - }, - }) - .get(`/v${dummyConfig.get('apiVersion')}/content_types/dummyContentType/entries`) - .query({ - include_count: true, - skip: 0, - include_publish_details: true, - locale: 'en-us', - }) - .reply(200, bulkentriesResponse1) - - nock(dummyConfig.get('apiEndPoint'), { - reqheaders: { - api_key: dummyConfig.get('apikey'), - authorization: dummyConfig.get('manageToken'), - }, - }) - .get(`/v${dummyConfig.get('apiVersion')}/content_types/dummyContentType/entries`) - .query({ - include_count: true, - skip: 2, - include_publish_details: true, - locale: 'en-us', - }) - .reply(200, bulkentriesResponse2) - - nock(dummyConfig.get('cdnEndPoint'), { - reqheaders: { - api_key: dummyConfig.get('apikey'), - authorization: dummyConfig.get('manageToken'), - }, - }) - .post(`/v${dummyConfig.get('apiVersion')}/bulk/publish`) - .reply(200, entryPublishResponse) - - nock(dummyConfig.get('cdnEndPoint'), { - reqheaders: { - api_key: dummyConfig.get('apikey'), - authorization: dummyConfig.get('manageToken'), - 'Content-Type': 'application/json', - }, - }) - .post(/\/content_types\/dummyContentType\/entries\/([a-zA-Z0-9]*)\/publish/, { - entry: { - environments: ['dummyEnvironment'], - locales: ['en-us'], - }, - }) - .reply(200, entryPublishResponse) - - nock(dummyConfig.get('cdnEndPoint'), { - reqheaders: { - api_key: dummyConfig.get('apikey'), - authorization: dummyConfig.get('manageToken'), - }, - }) - .get(`/v${dummyConfig.get('apiVersion')}/content_types`) - .query({ - include_count: true, - skip: 0, - }) - .reply(200, { - content_types: [ - { - created_at: '2019-08-16T08:18:56.914Z', - updated_at: '2019-08-16T08:18:58.736Z', - title: 'dummyContentType', - uid: 'dummyContentType', - }, - ], - }) - - nock(dummyConfig.get('cdnEndPoint'), { - reqheaders: { - api_key: dummyConfig.get('apikey'), - authorization: dummyConfig.get('manageToken'), - }, - }) - .get(`/v${dummyConfig.get('apiVersion')}/content_types`) - .query({ - include_count: true, - skip: 1, - }) - .replyWithError('Some Error') - }) - - test - .stub(stack, 'contentType', () => { - return { - entry: function() { - return { - query: function() { - return { - find: function() { - return Promise.resolve(bulkentriesResponse1) - } - } - }, - publish: function() { - return Promise.resolve(entryPublishResponse) - } - } - } - } - }) - .stub(cliux, 'confirm', () => async () => 'yes') - .stub(this.config.userConfig, 'getRegion', () => { - return { - cma: "dummyCma", cda: "dummyCda", name: "dummyName" - } - }) - .stdout({print: true}) - .command(['cm:bulk-publish:entries', '-c', 'dummyContentType', '-l', 'en-us', '-e', 'dummyEnvironment', '--no-bulkPublish', '-k', 'dummyApiKey', '-i', 'dummyManagementTokenAlias', '-y']) - .it('runs entries command without bulk publish', ctx => { - expect(ctx.stdout).to.contain('published') - }) - - // test - // .stub(stack, 'contentType', () => { - // return { - // entry: function() { - // return { - // query: function() { - // return { - // find: function() { - // return Promise.resolve(bulkentriesResponse1) - // } - // } - // }, - // publish: function() { - // return Promise.resolve(entryPublishResponse) - // } - // } - // } - // } - // }) - // .stub(cli, 'confirm', () => async () => 'yes') - // .stdout() - // .command(['cm:bulk-publish:entries', '-c', 'dummyContentType', '-l', 'en-us', '-e', 'dummyEnvironment']) - // .it('runs entries command with bulk publish', ctx => { - // // expect(ctx.stdout).to.contain('hello jeff') - // // console.log(ctx.stdout) - // }) - - // test - // .stub(stack, 'contentType', () => { - // return { - // entry: function() { - // return { - // query: function() { - // return { - // find: function() { - // return Promise.resolve(bulkentriesResponse1) - // } - // } - // }, - // publish: function() { - // return Promise.resolve(entryPublishResponse) - // } - // } - // } - // } - // }) - // .stub(cli, 'confirm', () => async () => 'yes') - // .stdout() - // .command(['cm:bulk-publish:entries', '-c', 'dummyContentType', '-l', 'en-us', '-e', 'dummyEnvironment']) - // .it('runs entries command with bulk publish', ctx => { - // // expect(ctx.stdout).to.contain('hello jeff') - // console.log(ctx.stdout) - // }) - - // test - // .stub(stack, 'contentType', () => { - // return { - // entry: function() { - // return { - // query: function() { - // return { - // find: function() { - // return Promise.resolve(bulkentriesResponse1) - // } - // } - // }, - // publish: function() { - // return Promise.resolve(entryPublishResponse) - // } - // } - // } - // } - // }) - // .stub(cli, 'confirm', () => async () => 'yes') - // .stub(store, 'updateMissing', (key, flags) => flags) - // .stderr() - // .command(['cm:bulk-publish:entries']) - // .catch(error => { - // expect(error.message).to.contain('Content Types') - // }) - // .it('runs entries command without any parameters') - - // test - // .stub(stack, 'contentType', () => { - // return { - // entry: function() { - // return { - // query: function() { - // return { - // find: function() { - // return Promise.resolve(bulkentriesResponse1) - // } - // } - // }, - // publish: function() { - // return Promise.resolve(entryPublishResponse) - // } - // } - // } - // } - // }) - // .stub(cli, 'confirm', () => async () => 'yes') - // .stderr() - // .command(['cm:bulk-publish:entries', '-a', '-c', 'dummyContentType']) - // .catch(error => { - // expect(error.message).to.contain('contentTypes when publishAllContentTypes') - // }) - // .it('runs entries command with publishAllContentTypes set and content type specified') - - // test - // .stub(stack, 'contentType', () => { - // return { - // entry: function() { - // return { - // query: function() { - // return { - // find: function() { - // return Promise.resolve(bulkentriesResponse1) - // } - // } - // }, - // publish: function() { - // return Promise.resolve(entryPublishResponse) - // } - // } - // } - // } - // }) - // .stub(cli, 'confirm', () => async () => 'yes') - // .stdout() - // .command(['cm:bulk-publish:entries', '-a', '-l', 'en-us', '-e', 'dummyEnvironment']) - // .it('runs entries command with bulk publish', ctx => { - // // expect(ctx.stdout).to.contain('hello jeff') - // console.log(ctx.stdout) - // }) - - // test - // .stub(stack, 'contentType', () => { - // return { - // entry: function() { - // return { - // query: function() { - // return { - // find: function() { - // return Promise.resolve(bulkentriesResponse1) - // } - // } - // }, - // publish: function() { - // return Promise.resolve(entryPublishResponse) - // } - // } - // } - // } - // }) - // .stub(cli, 'confirm', () => async () => 'yes') - // .stdout() - // .command(['cm:bulk-publish:entries', '-r', bulkPublishEntriesLog]) - // .it('runs entries command with bulk publish', ctx => { - // // expect(ctx.stdout).to.contain('hello jeff') - // console.log(ctx.stdout) - // }) - - // test - // .stub(stack, 'contentType', () => { - // return { - // entry: function() { - // return { - // query: function() { - // return { - // find: function() { - // return Promise.resolve(bulkentriesResponse1) - // } - // } - // }, - // publish: function() { - // return Promise.resolve(entryPublishResponse) - // } - // } - // } - // } - // }) - // .stub(cli, 'confirm', () => async () => 'yes') - // .stdout() - // .command(['cm:bulk-publish:entries', '-r', bulkPublishEntriesLog, '-b']) - // .it('runs entries command with bulk publish', ctx => { - // // expect(ctx.stdout).to.contain('hello jeff') - // console.log(ctx.stdout) - // }) -}) diff --git a/packages/contentstack-bulk-publish/test/commands/entry-edits.test.js b/packages/contentstack-bulk-publish/test/commands/entry-edits.test.js deleted file mode 100644 index 0a7b56f5b5..0000000000 --- a/packages/contentstack-bulk-publish/test/commands/entry-edits.test.js +++ /dev/null @@ -1,247 +0,0 @@ -/* eslint-disable no-console */ -const {expect, test} = require('@oclif/test') -const nock = require('nock') -const { cliux, configHandler } = require('@contentstack/cli-utilities'); - -const stack = require('../../src/util/client.js').stack -const store = require('../../src/util/store.js') - -const dummyConfig = configHandler; -const bulkentriesResponse1 = require('../dummy/bulkentries1') -const bulkentriesResponse2 = require('../dummy/bulkentries2') -const entryPublishResponse = require('../dummy/entrypublished') -const contentTypesResponse = require('../dummy/bulkContentTypeResponse') -const environmentResponse = require('../dummy/environment') - -const bulkPublishEntriesLog = '1587758242717.bulk_publish_edits.error' - -describe('entry-edits', () => { - // const mockedlog = () => { } - beforeEach(() => { - // console.log = mockedlog - nock(dummyConfig.get('apiEndPoint'), { - reqheaders: { - api_key: dummyConfig.get('apikey'), - authorization: dummyConfig.get('manageToken'), - }, - }) - .get(`/v${dummyConfig.get('apiVersion')}/content_types/dummyContentType/entries`) - .query({ - include_count: true, - skip: 0, - include_publish_details: true, - locale: 'en-us', - }) - .reply(200, bulkentriesResponse1) - - nock(dummyConfig.get('apiEndPoint'), { - reqheaders: { - api_key: dummyConfig.get('apikey'), - authorization: dummyConfig.get('manageToken'), - }, - }) - .get(`/v${dummyConfig.get('apiVersion')}/content_types/dummyContentType/entries`) - .query({ - include_count: true, - skip: 2, - include_publish_details: true, - locale: 'en-us', - }) - .reply(200, bulkentriesResponse2) - - nock(dummyConfig.get('cdnEndPoint'), { - reqheaders: { - api_key: dummyConfig.get('apikey'), - authorization: dummyConfig.get('manageToken'), - }, - }) - .post(`/v${dummyConfig.get('apiVersion')}/bulk/publish`) - .reply(200, entryPublishResponse) - - nock(dummyConfig.get('cdnEndPoint'), { - reqheaders: { - api_key: dummyConfig.get('apikey'), - authorization: dummyConfig.get('manageToken'), - 'Content-Type': 'application/json', - }, - }) - .post(/\/entries\/([a-zA-Z]*)\/publish/, { - entry: { - environments: ['dummyEnvironment'], - locales: ['en-us'], - }, - }) - .reply(200, entryPublishResponse) - - nock(dummyConfig.get('cdnEndPoint'), { - reqheaders: { - api_key: dummyConfig.get('apikey'), - authorization: dummyConfig.get('manageToken'), - }, - }) - .get(`/v${dummyConfig.get('apiVersion')}/content_types`) - .query({ - include_count: true, - skip: 0, - }) - .reply(200, contentTypesResponse) - - nock(dummyConfig.get('cdnEndPoint'), { - reqheaders: { - api_key: dummyConfig.get('apikey'), - authorization: dummyConfig.get('manageToken'), - }, - }) - .get(`/v${dummyConfig.get('apiVersion')}/content_types`) - .query({ - include_count: true, - skip: 1, - }) - .replyWithError('Some Error') - - nock(dummyConfig.get('cdnEndPoint'), { - reqheaders: { - api_key: dummyConfig.get('apikey'), - authorization: dummyConfig.get('manageToken'), - }, - }) - .get(`/v${dummyConfig.get('apiVersion')}/environments/dummyEnvironment`) - .reply(200, environmentResponse) - }) - - test - .stub(stack, 'contentType', () => { - return { - entry: function() { - return { - query: function() { - return { - find: function() { - return Promise.resolve(bulkentriesResponse1) - } - } - }, - publish: function() { - return Promise.resolve(entryPublishResponse) - } - } - } - } - }) - .stub(stack, 'environment', () => { - return { - fetch: function() { - return Promise.resolve(environmentResponse) - } - } - }) - .stub(cliux, 'confirm', () => async () => 'yes') - .stdout({print: true}) - .command(['cm:bulk-publish:entry-edits', '-s', 'dummyEnvironment', '-c', 'dummyContentType', '-e', 'dummyEnvironment']) - .it('runs hello', ctx => { - // expect(ctx.stdout).to.contain('hello world') - // stack.environment('kuchbhi').fetch().then(res => console.log(res)) - }) - - test - .stub(stack, 'contentType', () => { - return { - entry: function() { - return { - query: function() { - return { - find: function() { - return Promise.resolve(bulkentriesResponse1) - } - } - }, - publish: function() { - return Promise.resolve(entryPublishResponse) - } - } - } - } - }) - .stub(stack, 'environment', (e) => { - return { - fetch: function() { - return Promise.resolve(environmentResponse) - } - } - }) - .stub(cliux, 'confirm', () => async () => 'yes') - .stub(store, 'updateMissing', (key, flags) => flags) - .stderr() - .command(['cm:bulk-publish:entry-edits']) - .catch(error => { - expect(error.message).to.contain('Content Types, SourceEnv, Environments are required for processing this command. Please check --help for more details') - }) - .it('Run entry-edits without any flags') - - test - .stub(stack, 'contentType', () => { - return { - entry: function() { - return { - query: function() { - return { - find: function() { - return Promise.resolve(bulkentriesResponse1) - } - } - }, - publish: function() { - return Promise.resolve(entryPublishResponse) - } - } - } - } - }) - .stub(stack, 'environment', (e) => { - return { - fetch: function() { - return Promise.resolve(environmentResponse) - } - } - }) - .stub(cliux, 'confirm', () => async () => 'yes') - .stdout() - .command(['cm:bulk-publish:entry-edits', '-r', bulkPublishEntriesLog]) - .it('runs hello', ctx => { - // expect(ctx.stdout).to.contain('hello world') - console.log(ctx.stdout) - }) - - test - .stub(stack, 'contentType', () => { - return { - entry: function() { - return { - query: function() { - return { - find: function() { - return Promise.resolve(bulkentriesResponse1) - } - } - }, - publish: function() { - return Promise.resolve(entryPublishResponse) - } - } - } - } - }) - .stub(stack, 'environment', (e) => { - return { - fetch: function() { - return Promise.resolve(environmentResponse) - } - } - }) - .stub(cliux, 'confirm', () => async () => 'yes') - .stdout({print: true}) - .command(['cm:bulk-publish:entry-edits', '-s', 'dummyEnvironment', '-c', 'dummyContentType', '-e', 'dummyEnvironment', '--no-bulkPublish']) - .it('runs command with --no-bulkPublish', ctx => { - // expect(ctx.stdout).to.contain('hello jeff') - }) -}) diff --git a/packages/contentstack-bulk-publish/test/commands/hello.test.js b/packages/contentstack-bulk-publish/test/commands/hello.test.js deleted file mode 100644 index 4b1349795d..0000000000 --- a/packages/contentstack-bulk-publish/test/commands/hello.test.js +++ /dev/null @@ -1,17 +0,0 @@ -const {expect, test} = require('@oclif/test') - -describe('hello', () => { - test - .stdout() - .command(['hello']) - .it('runs hello', ctx => { - expect(ctx.stdout).to.contain('hello world') - }) - - test - .stdout() - .command(['hello', '--name', 'jeff']) - .it('runs hello --name jeff', ctx => { - expect(ctx.stdout).to.contain('hello jeff') - }) -}) diff --git a/packages/contentstack-bulk-publish/test/commands/nonlocalized-field-changes.test.js b/packages/contentstack-bulk-publish/test/commands/nonlocalized-field-changes.test.js deleted file mode 100644 index 108fe975dc..0000000000 --- a/packages/contentstack-bulk-publish/test/commands/nonlocalized-field-changes.test.js +++ /dev/null @@ -1,343 +0,0 @@ -const { expect, test } = require('@oclif/test') -const nock = require('nock') -const stack = require('../../src/util/client.js').stack -const { cliux, configHandler } = require('@contentstack/cli-utilities'); -const dummyConfig = configHandler -const store = require('../../src/util/store.js') - -const languagesResponse = require('../dummy/languages') -const contentTypeResponse = require('../dummy/contentTypeResponse') -const localizedEntryResponse = require('../dummy/entry') -const masterEntry = require('../dummy/masterEntry') -const sourceEnv = 'dummyEnvironment' -const entryPublishResponse = require('../dummy/entrypublished') - -const bulkNonLocalizedLog = '1587758242717.bulk_nonlocalized_field_changes.error' - -function fillArray(value, len) { - if (len === 0) return [] - let a = [value] - while (a.length * 2 <= len) a = a.concat(a) - if (a.length < len) a = a.concat(a.slice(0, len - a.length)) - return a -} - -const languages = [{ - code: 'ar-eg', - fallback_locale: 'en-us', - uid: 'bltmockdata42069007', - created_by: 'bltmockdata42069007', - updated_by: 'bltmockdata42069007', - created_at: '1970-01-01T00:00:00.000Z', - updated_at: '1970-01-01T00:00:00.000Z', - name: 'Arabic - Egypt', - ACL: [], - _version: 1, -}] - -describe('nonlocalized-field-changes', () => { - // const mockedLog = () => { } - - beforeEach(() => { - // console.log = mockedLog; - - // for getLanguages - nock(`${dummyConfig.get('apiEndPoint')}`, { - 'content-Type': 'application/json', - reqheaders: { - api_key: dummyConfig.get('apikey'), - authorization: dummyConfig.get('manageToken'), - }, - }) - .get(`/v${dummyConfig.get('apiVersion')}/locales`) - .reply(200, languagesResponse) - - // for getting contentType schema - nock(`${dummyConfig.get('cdnEndPoint')}`, { - reqheaders: { - api_key: dummyConfig.get('apikey'), - authorization: dummyConfig.get('manageToken'), - }, - }) - .get(/\/content_types\/([a-zA-Z_])/) - .query({ - include_global_field_schema: true, - }) - .reply(200, contentTypeResponse) - - // for getting entry response - nock(dummyConfig.get('apiEndPoint'), { - reqheaders: { - api_key: dummyConfig.get('apikey'), - authorization: dummyConfig.get('manageToken'), - }, - }) - .get(`/v${dummyConfig.get('apiVersion')}/content_types/helloworld/entries`) - .query({ - locale: 'en-us', - environment: sourceEnv, - include_count: true, - skip: 0, - }) - .reply(200, { - entries: fillArray(masterEntry.entries[0], 12), - count: 12, - }) - - // for getting localized entry response - nock(dummyConfig.get('cdnEndPoint'), { - reqheaders: { - api_key: dummyConfig.get('apikey'), - authorization: dummyConfig.get('manageToken'), - }, - }) - .get(`/v${dummyConfig.get('apiVersion')}/content_types/helloworld/entries/dummyEntryId`) - .query({ - locale: 'ar-eg', - environment: sourceEnv, - include_publish_details: true, - }) - .reply(200, localizedEntryResponse) - - nock(dummyConfig.get('cdnEndPoint'), { - reqheaders: { - api_key: dummyConfig.get('apikey'), - authorization: dummyConfig.get('manageToken'), - }, - }) - .post(`/v${dummyConfig.get('apiVersion')}/bulk/publish`) - .reply(200, entryPublishResponse) - - nock(dummyConfig.get('cdnEndPoint'), { - reqheaders: { - api_key: dummyConfig.get('apikey'), - authorization: dummyConfig.get('manageToken'), - 'Content-Type': 'application/json', - }, - }) - .post(/\/content_types\/helloworld\/entries\/([a-zA-Z0-9]*)\/publish/) - .reply(200, entryPublishResponse) - }) - - test - .stub(stack, 'contentType', (c) => { - return { - fetch: function() { - return Promise.resolve(contentTypeResponse) - } - } - }) - .stub(stack, 'contentType', (c) => { - return { - entry: function() { - return { - query: function(p) { - return { - find: function() { - return Promise.resolve({ - items: fillArray(masterEntry.entries[0], 1), - count: 1, - }) - } - } - }, - publish: function() { - return Promise.resolve(entryPublishResponse) - } - } - } - } - }) - .stub(cliux, 'confirm', () => async () => 'yes') - .stub(store, 'updateMissing', (key, flags) => flags) - .stderr() - .command(['cm:bulk-publish:nonlocalized-field-changes']) - .catch(error => { - expect(error.message) - }) - .it('runs command without flags') - - test - .stub(stack, 'locale', () => { - return { - query: function () { - return { - find: function () { - return Promise.resolve(languagesResponse) - }, - } - }, - } - }) - .stub(stack, 'contentType', () => { - return { - entry: function () { - return { - query: function () { - return { - find: function () { - return Promise.resolve({ - items: fillArray(masterEntry.entries[0], 1), - count: 1, - }) - } - } - }, - fetch: function() { - return Promise.resolve(localizedEntryResponse) - }, - publish: function () { - return Promise.resolve(entryPublishResponse) - } - } - }, - fetch: function () { - return Promise.resolve(contentTypeResponse) - } - } - }) - .stub(cliux, 'confirm', () => async () => 'yes') - .stdout({ print: true }) - .command(['cm:bulk-publish:nonlocalized-field-changes', '-s', 'dummyEnvironment', '-c', 'helloworld', '-e', 'dummyEnvironment']) - .it('runs command', ctx => { - // expect(ctx.stdout).to.contain('hello jeff') - }) - - test - .stub(stack, 'locale', () => { - return { - query: function () { - return { - find: function () { - return Promise.resolve(languagesResponse) - }, - } - }, - } - }) - .stub(stack, 'contentType', () => { - return { - entry: function () { - return { - query: function () { - return { - find: function () { - return Promise.resolve({ - items: fillArray(masterEntry.entries[0], 1), - count: 1, - }) - } - } - }, - fetch: function() { - return Promise.resolve(localizedEntryResponse) - }, - publish: function () { - return Promise.resolve(entryPublishResponse) - } - } - }, - fetch: function () { - return Promise.resolve(contentTypeResponse) - } - } - }) - .stub(cliux, 'confirm', () => async () => 'yes') - .stdout({print: true}) - .command(['cm:bulk-publish:nonlocalized-field-changes', '-s', 'dummyEnvironment', '-c', 'helloworld', '-e', 'dummyEnvironment', '--no-bulkPublish']) - .it('runs command', ctx => { - // expect(ctx.stdout).to.contain('hello jeff') - }) - - test - .stub(stack, 'locale', () => { - return { - query: function () { - return { - find: function () { - return Promise.resolve(languagesResponse) - }, - } - }, - } - }) - .stub(stack, 'contentType', () => { - return { - entry: function () { - return { - query: function () { - return { - find: function () { - return Promise.resolve({ - items: fillArray(masterEntry.entries[0], 1), - count: 1, - }) - } - } - }, - fetch: function() { - return Promise.resolve(localizedEntryResponse) - }, - publish: function () { - return Promise.resolve(entryPublishResponse) - } - } - }, - fetch: function () { - return Promise.resolve(contentTypeResponse) - } - } - }) - .stub(cliux, 'confirm', () => async () => 'yes') - .stdout({print: true}) - .command(['cm:bulk-publish:nonlocalized-field-changes', '-r', bulkNonLocalizedLog]) - .it('runs command', ctx => { - // expect(ctx.stdout).to.contain('hello jeff') - }) - - test - .stub(stack, 'locale', () => { - return { - query: function () { - return { - find: function () { - return Promise.resolve(languagesResponse) - }, - } - }, - } - }) - .stub(stack, 'contentType', () => { - return { - entry: function () { - return { - query: function () { - return { - find: function () { - return Promise.resolve({ - items: fillArray(masterEntry.entries[0], 1), - count: 1, - }) - } - } - }, - fetch: function() { - return Promise.resolve(localizedEntryResponse) - }, - publish: function () { - return Promise.resolve(entryPublishResponse) - } - } - }, - fetch: function () { - return Promise.resolve(contentTypeResponse) - } - } - }) - .stub(cliux, 'confirm', () => async () => 'yes') - .stdout({print: true}) - .command(['cm:bulk-publish:nonlocalized-field-changes', '-r', bulkNonLocalizedLog, '--no-bulkPublish']) - .it('runs command', ctx => { - // expect(ctx.stdout).to.contain('hello jeff') - }) -}) diff --git a/packages/contentstack-bulk-publish/test/commands/revert.test.js b/packages/contentstack-bulk-publish/test/commands/revert.test.js deleted file mode 100644 index 562f6af370..0000000000 --- a/packages/contentstack-bulk-publish/test/commands/revert.test.js +++ /dev/null @@ -1,118 +0,0 @@ -const {expect, test} = require('@oclif/test') -const nock = require('nock') - -const stack = require('../../src/util/client.js').stack -const { cliux, configHandler } = require('@contentstack/cli-utilities'); -const dummyConfig = configHandler -const store = require('../../src/util/store.js') - -const entriesLogFileName = '1587758242717.PublishEntries.success' -const assetLogFileName = '1587956283100.PublishAssets.success' - -const entryPublishResponse = require('../dummy/entrypublished') -const environmentsResponse = require('../dummy/environments') - -const retryFailedLog = '1587758242717.revert.error' - -describe('revert', () => { - // const mockedlog = () => { } - - beforeEach(() => { - // console.log = mockedlog - - nock(dummyConfig.get('apiEndPoint'), { - reqheaders: { - api_key: dummyConfig.get('apikey'), - authorization: dummyConfig.get('manageToken'), - }, - }) - .get(`/v${dummyConfig.get('apiVersion')}/environments`) - .reply(200, environmentsResponse) - - nock(dummyConfig.get('cdnEndPoint'), { - reqheaders: { - api_key: dummyConfig.get('apikey'), - authorization: dummyConfig.get('manageToken'), - }, - }) - .post(`/v${dummyConfig.get('apiVersion')}/bulk/publish`) - .reply(200, entryPublishResponse) - - nock(dummyConfig.get('cdnEndPoint'), { - reqheaders: { - api_key: dummyConfig.get('apikey'), - authorization: dummyConfig.get('manageToken'), - 'Content-Type': 'application/json', - }, - }) - .post(/\/content_types\/dummyContentType\/entries\/([a-zA-Z0-9]*)\/publish/) - .reply(200, entryPublishResponse) - }) - - // test - // .stub(cli, 'confirm', () => async () => 'yes') - // .stub(store, 'updateMissing', (key, flags) => flags) - // .stderr() - // .command(['cm:bulk-publish:revert']) - // .catch(error => { - // expect(error.message).to.contain('Logfile is required for processing this command. Please check --help for more details') - // }) - // .it('runs hello') - - test - .stub(stack, 'environment', () => { - return { - query: function() { - return { - find: function() { - return Promise.resolve(environmentsResponse) - } - } - } - } - }) - .stub(cliux, 'confirm', () => async () => 'yes') - .stdout({print: true}) - .command(['cm:bulk-publish:revert', '-l', entriesLogFileName]) - .it('revert entries', ctx => { - // stack.environment().query().find().then(res => { - // console.log(res.items.length) - // }) - // console.log(stack.environment()) - }) - - // test - // .stdout() - // .command(['cm:bulk-publish:revert', '-l', assetLogFileName]) - // .it('revert assets', ctx => { - - // }) - - // test - // .stdout() - // .command(['cm:bulk-publish:revert', '-l', '1587758242717.PublishEntries.txt']) - // .it('runs revert with a txt file', ctx => { - - // }) - - // test - // .stdout() - // .command(['cm:bulk-publish:revert', '-l', '1587758242717.PublishEntries']) - // .it('runs hello --name jeff', ctx => { - - // }) - - // test - // .stdout() - // .command(['cm:bulk-publish:revert', '-l', '1587758242717.publishentries.success']) - // .it('runs hello --name jeff', ctx => { - - // }) - - // test - // .stdout() - // .command(['cm:bulk-publish:revert', '-r', retryFailedLog]) - // .it('runs hello --name jeff', ctx => { - - // }) -}) diff --git a/packages/contentstack-bulk-publish/test/commands/unpublish.test.js b/packages/contentstack-bulk-publish/test/commands/unpublish.test.js deleted file mode 100644 index c4e77fb1e9..0000000000 --- a/packages/contentstack-bulk-publish/test/commands/unpublish.test.js +++ /dev/null @@ -1,141 +0,0 @@ -/* eslint-disable no-undef */ -/* eslint-disable node/no-extraneous-require */ -const nock = require('nock') -const {expect, test} = require('@oclif/test') - -const { cliux, configHandler } = require('@contentstack/cli-utilities'); -const dummyConfig = configHandler -const store = require('../../src/util/store.js') - -const deliveryToken = 'dummyDeliveryToken' - -const syncEntriesResponse = require('../dummy/unpublish_response') -const bulkUnpublishResponse = require('../dummy/bulkUnpublishResponse') - -const bulkUnpublishLog = '1587758242717.bulkUnpublish.error' - -describe('unpublish', () => { - const mockedlog = () => { } - - beforeEach(() => { - console.log = mockedlog - - nock(dummyConfig.get('cdnEndPoint'), { - reqheaders: { - api_key: dummyConfig.get('apikey'), - access_token: deliveryToken, - }, - }) - .get(`/v${dummyConfig.get('apiVersion')}/stacks/sync`) - .query({ - init: true, - type: 'asset_published,entry_published', - locale: 'en-us', - environment: 'dummyEnvironment', - content_type_uid: 'dummyContentType', - }) - .reply(200, syncEntriesResponse) - - // for unpublish entries - nock(dummyConfig.get('apiEndPoint'), { - reqheaders: { - api_key: dummyConfig.get('apikey'), - authorization: dummyConfig.get('manageToken'), - 'Content-Type': 'application/json', - }, - }) - .post(/content_types\/([a-zA-Z0-9]*)\/entries\/([a-zA-Z0-9]*)\/unpublish/) - .reply(200, bulkUnpublishResponse) - - // for unpublish assets - nock(dummyConfig.get('apiEndPoint'), { - reqheaders: { - api_key: dummyConfig.get('apikey'), - authorization: dummyConfig.get('manageToken'), - 'Content-Type': 'application/json', - }, - }) - .post(/assets\/([a-zA-Z0-9]*)\/unpublish/) - .reply(200, bulkUnpublishResponse) - - // for bulk unpublish - nock(dummyConfig.get('cdnEndPoint'), { - reqheaders: { - api_key: dummyConfig.get('apikey'), - authorization: dummyConfig.get('manageToken'), - 'Content-Type': 'application/json', - }, - }) - .post(`/v${dummyConfig.get('apiVersion')}/bulk/unpublish`) - .reply(200, bulkUnpublishResponse) - - // nock(dummyConfig.get('cdnEndPoint'), { - // reqheaders: { - // api_key: dummyConfig.get('apikey'), - // access_token: deliveryToken, - // }, - // }) - // .post(`/v${dummyConfig.get('apiVersion')}/bulk/unpublish`) - // .reply(200, bulkUnpublishResponse); - - // nock(dummyConfig.get('cdnEndPoint'), { - // reqheaders: { - // api_key: dummyConfig.get('apikey'), - // access_token: deliveryToken, - // }, - // }) - // .post(`/v${dummyConfig.get('apiVersion')}/bulk/unpublish`) - // .reply(200, bulkUnpublishResponse); - }) - - test - .stub(cliux, 'prompt', () => async () => deliveryToken) - .stub(cliux, 'confirm', () => async () => 'yes') - .stub(store, 'updateMissing', (key, flags) => flags) - .stderr({print: true}) - .command(['cm:bulk-publish:unpublish']) - .catch(error => { - expect(error.message).to.contain('Environment, ContentType is required for processing this command. Please check --help for more details') - }) - .it('runs unpublish command without any flags') - - test - .stub(cliux, 'prompt', () => async () => deliveryToken) - .stub(cliux, 'confirm', () => async () => 'yes') - .stub(store, 'updateMissing', (key, flags) => flags) - .stdout({print: true}) - .command(['cm:bulk-publish:unpublish', '-e', 'dummyEnvironment', '-t', 'asset_published', 'entry_published', '-c', 'dummyContentType']) - .it('runs unpublish with environment', ctx => { - - }) - - test - .stub(cliux, 'prompt', () => async () => deliveryToken) - .stub(cliux, 'confirm', () => async () => 'yes') - .stub(store, 'updateMissing', (key, flags) => flags) - .stdout({print: true}) - .command(['cm:bulk-publish:unpublish', '-e', 'dummyEnvironment', '-t', 'asset_published', 'entry_published', '-c', 'dummyContentType', '--no-bulkUnpublish']) - .it('runs hello --name jeff', ctx => { - // expect(ctx.stdout).to.contain('hello jeff') - }) - - test - .stub(cliux, 'prompt', () => async () => deliveryToken) - .stub(cliux, 'confirm', () => async () => 'yes') - .stub(store, 'updateMissing', (key, flags) => flags) - .stdout({print: true}) - .command(['cm:bulk-publish:unpublish', '-r', bulkUnpublishLog]) - .it('runs hello --name jeff', ctx => { - // expect(ctx.stdout).to.contain('hello jeff') - }) - - test - .stub(cliux, 'prompt', () => async () => deliveryToken) - .stub(cliux, 'confirm', () => async () => 'yes') - .stub(store, 'updateMissing', (key, flags) => flags) - .stdout({print: true}) - .command(['cm:bulk-publish:unpublish', '-r', bulkUnpublishLog, '--no-bulkUnpublish']) - .it('runs hello --name jeff', ctx => { - // expect(ctx.stdout).to.contain('hello jeff') - }) -}) diff --git a/packages/contentstack-bulk-publish/test/commands/unpublished-entries.test.js b/packages/contentstack-bulk-publish/test/commands/unpublished-entries.test.js deleted file mode 100644 index a0c9334c58..0000000000 --- a/packages/contentstack-bulk-publish/test/commands/unpublished-entries.test.js +++ /dev/null @@ -1,216 +0,0 @@ -const {expect, test} = require('@oclif/test') -const nock = require('nock') -const stack = require('../../src/util/client.js').stack - -const { cliux, configHandler } = require('@contentstack/cli-utilities'); -const dummyConfig = configHandler -const store = require('../../src/util/store.js') - -const environmentResponse = require('../dummy/environment') -const entryPublishResponse = require('../dummy/entrypublished') -const bulkentriesResponse1 = require('../dummy/bulkentries1') -const bulkentriesResponse2 = require('../dummy/bulkentries2') - -const bulkPublishDraftsLog = '1587758242717.Bulk_publish_draft.error' - -describe('unpublished-entries', () => { - // const mockedlog = () => {} - - beforeEach(() => { - // console.log = mockedlog - - nock(dummyConfig.get('cdnEndPoint'), { - reqheaders: { - api_key: dummyConfig.get('apikey'), - authorization: dummyConfig.get('manageToken'), - }, - }) - .get(`/v${dummyConfig.get('apiVersion')}/environments/dummyEnvironment`) - .reply(200, environmentResponse) - - nock(dummyConfig.get('apiEndPoint'), { - reqheaders: { - api_key: dummyConfig.get('apikey'), - authorization: dummyConfig.get('manageToken'), - }, - }) - .get(`/v${dummyConfig.get('apiVersion')}/content_types/dummyContentType/entries`) - .query({ - include_count: true, - skip: 0, - include_publish_details: true, - }) - .reply(200, bulkentriesResponse1) - - nock(dummyConfig.get('cdnEndPoint'), { - reqheaders: { - api_key: dummyConfig.get('apikey'), - authorization: dummyConfig.get('manageToken'), - }, - }) - .get(`/v${dummyConfig.get('apiVersion')}/content_types/dummyContentType/entries`) - .query({ - include_count: true, - skip: 2, - include_publish_details: true, - }) - .reply(200, bulkentriesResponse2) - - nock(dummyConfig.get('cdnEndPoint'), { - reqheaders: { - api_key: dummyConfig.get('apikey'), - authorization: dummyConfig.get('manageToken'), - }, - }) - .get(`/v${dummyConfig.get('apiVersion')}/content_types/dummyContentType/entries`) - .query({ - include_count: true, - skip: 3, - include_publish_details: true, - }) - .replyWithError('some error') - - nock(dummyConfig.get('cdnEndPoint'), { - reqheaders: { - api_key: dummyConfig.get('apikey'), - authorization: dummyConfig.get('manageToken'), - }, - }) - .post(`/v${dummyConfig.get('apiVersion')}/bulk/publish`) - .reply(200, entryPublishResponse) - }) - - test - .stub(stack, 'contentType', () => { - return { - entry: function() { - return { - query: function() { - return { - find: function() { - return Promise.resolve(bulkentriesResponse1) - } - } - }, - publish: function() { - return Promise.resolve(entryPublishResponse) - } - } - } - } - }) - .stub(stack, 'environment', () => { - return { - fetch: function() { - return Promise.resolve(environmentResponse) - } - } - }) - .stub(cliux, 'confirm', () => async () => 'yes') - .stub(store, 'updateMissing', (key, flags) => flags) - .stderr() - .command(['cm:bulk-publish:unpublished-entries']) - .catch(error => { - expect(error.message).to.contain('Content Types, SourceEnv, Environments are required for processing this command. Please check --help for more details') - }) - .it('one') - - test - .stub(stack, 'contentType', () => { - return { - entry: function() { - return { - query: function() { - return { - find: function() { - return Promise.resolve(bulkentriesResponse1) - } - } - }, - publish: function() { - return Promise.resolve(entryPublishResponse) - } - } - } - } - }) - .stub(stack, 'environment', () => { - return { - fetch: function() { - return Promise.resolve(environmentResponse) - } - } - }) - .stub(cliux, 'confirm', () => async () => 'yes') - .stdout() - .command(['cm:bulk-publish:unpublished-entries', '-c', 'dummyContentType', '-e', 'dummyEnvironment', '-s', 'dummyEnvironment']) - .it('runs hello', ctx => { - // expect(ctx.stdout).to.contain('publish') - }) - - test - .stub(stack, 'contentType', () => { - return { - entry: function() { - return { - query: function() { - return { - find: function() { - return Promise.resolve(bulkentriesResponse1) - } - } - }, - publish: function() { - return Promise.resolve(entryPublishResponse) - } - } - } - } - }) - .stub(stack, 'environment', () => { - return { - fetch: function() { - return Promise.resolve(environmentResponse) - } - } - }) - .stub(cliux, 'confirm', () => async () => 'yes') - .stdout() - .command(['cm:bulk-publish:unpublished-entries', '-r', bulkPublishDraftsLog]) - .it('runs hello', ctx => { - // expect(ctx.stdout).to.contain('publish') - }) - - test - .stub(stack, 'contentType', () => { - return { - entry: function() { - return { - query: function() { - return { - find: function() { - return Promise.resolve(bulkentriesResponse1) - } - } - }, - publish: function() { - return Promise.resolve(entryPublishResponse) - } - } - } - } - }) - .stub(stack, 'environment', () => { - return { - fetch: function() { - return Promise.resolve(environmentResponse) - } - } - }) - .stub(cliux, 'confirm', () => async () => 'yes') - .stdout() - .command(['cm:bulk-publish:unpublished-entries', '-c', 'dummyContentType', '-e', 'dummyEnvironment', '-s', 'dummyEnvironment', '--no-bulkPublish']) - .it('runs command with --no-bulkPublish', ctx => { - // expect(ctx.stdout).to.contain('publish') - }) -}) diff --git a/packages/contentstack-bulk-publish/test/consumer/publishing.test.js b/packages/contentstack-bulk-publish/test/consumer/publishing.test.js deleted file mode 100644 index 86ce1a8810..0000000000 --- a/packages/contentstack-bulk-publish/test/consumer/publishing.test.js +++ /dev/null @@ -1,454 +0,0 @@ -/* eslint-disable new-cap */ -/* eslint-disable node/no-unsupported-features/es-syntax */ -/* eslint-disable camelcase */ -/* eslint-disable no-console */ -const nock = require('nock') -const assert = require('assert') -const { - bulkPublish, - bulkUnPublish, - initializeLogger, - publishEntry, - publishAsset, - UnpublishEntry, - UnpublishAsset, - publishUsingVersion, -} = require('../../src/consumer/publish') - -const dummyConfig = require('../dummy/config') -const bulkPublishResponse = require('../dummy/bulkPublishResponse') -const entryPublishedResponse = require('../dummy/entrypublished') -const assetPublishedResponse = require('../dummy/assetpublished') - -initializeLogger('testLog') - -describe('testing bulk entries publish', () => { - const mockedlog = () => { } - - beforeEach(() => { - console.log = mockedlog - - // for bulk publish entries - nock(dummyConfig.get('cdnEndPoint'), { - reqheaders: { - api_key: dummyConfig.get('apikey'), - authorization: dummyConfig.get('manageToken'), - 'Content-Type': 'application/json', - }, - }) - .post(`/v${dummyConfig.get('apiVersion')}/bulk/publish`) - .reply(200, bulkPublishResponse) - - // for bulk publish assets - nock(dummyConfig.get('cdnEndPoint'), { - reqheaders: { - api_key: dummyConfig.get('apikey'), - authorization: dummyConfig.get('manageToken'), - 'Content-Type': 'application/json', - }, - }) - .post(`/v${dummyConfig.get('apiVersion')}/bulk/publish`) - .reply(200, bulkPublishResponse) - - // for publishing entries - nock(dummyConfig.get('cdnEndPoint'), { - reqheaders: { - api_key: dummyConfig.get('apikey'), - authorization: dummyConfig.get('manageToken'), - 'Content-Type': 'application/json', - }, - }) - .post(`/v${dummyConfig.get('apiVersion')}/content_types/dummyContentType/entries/dummyEntryUid/publish?locale=en-us`, { - entry: { - environments: ['dummyEnvironment'], - locales: ['en-us'], - }, - }) - .reply(200, entryPublishedResponse) - - // for publishing entries with error_message - nock(dummyConfig.get('cdnEndPoint'), { - reqheaders: { - api_key: dummyConfig.get('apikey'), - authorization: dummyConfig.get('manageToken'), - 'Content-Type': 'application/json', - }, - }) - .post(`/v${dummyConfig.get('apiVersion')}/content_types/dummyContentType/entries/dummyEntryUid/publish?locale=en-error`, { - entry: { - environments: ['dummyEnvironment'], - locales: ['en-error'], - }, - }) - .reply(200, { - ...entryPublishedResponse, - error_message: 'this is a dummy error message', - }) - - // for publishing assets - nock(dummyConfig.get('cdnEndPoint'), { - reqheaders: { - api_key: dummyConfig.get('apikey'), - authorization: dummyConfig.get('manageToken'), - 'Content-Type': 'application/json', - }, - }) - .post(`/v${dummyConfig.get('apiVersion')}/assets/dummyAssetUid/publish`, { - asset: { - environments: ['dummyEnvironment'], - locales: ['en-us'], - }, - }) - .reply(200, assetPublishedResponse) - - // for publishing assets with error_message - nock(dummyConfig.get('cdnEndPoint'), { - reqheaders: { - api_key: dummyConfig.get('apikey'), - authorization: dummyConfig.get('manageToken'), - 'Content-Type': 'application/json', - }, - }) - .post(`/v${dummyConfig.get('apiVersion')}/assets/dummyAssetUid/publish`, { - asset: { - environments: ['dummyEnvironment'], - locales: ['en-error'], - }, - }) - .reply(200, { - ...assetPublishedResponse, - error_message: 'this is a dummy error message', - }) - - // for publishing entries using version - nock(dummyConfig.get('cdnEndPoint'), { - reqheaders: { - api_key: dummyConfig.get('apikey'), - authorization: dummyConfig.get('manageToken'), - 'Content-Type': 'application/json', - }, - }) - .post(`/v${dummyConfig.get('apiVersion')}/content_types/dummyContentType1/entries/dummyEntryId/publish`, { - entry: { - environments: ['dummyEnvironment'], - locales: ['en-us'], - }, - locale: 'en-us', - version: 1, - }) - .reply(200, entryPublishedResponse) - - // for publishing assets using version - nock(dummyConfig.get('cdnEndPoint'), { - reqheaders: { - api_key: dummyConfig.get('apikey'), - authorization: dummyConfig.get('manageToken'), - 'Content-Type': 'application/json', - }, - }) - .post(`/v${dummyConfig.get('apiVersion')}/assets/dummyAssetUid1/publish`, { - asset: { - environments: ['dummyEnvironment'], - locales: ['en-us'], - }, - version: 1, - }) - .reply(200, entryPublishedResponse) - - // for unpublish entries - nock(dummyConfig.get('apiEndPoint'), { - reqheaders: { - api_key: dummyConfig.get('apikey'), - authorization: dummyConfig.get('manageToken'), - 'Content-Type': 'application/json', - }, - }) - .post(`/v${dummyConfig.get('apiVersion')}/content_types/dummyContentType1/entries/dummyEntryId/unpublish?locale=en-us`, { - entry: { - environments: ['dummyEnvironment'], - locales: ['en-us'], - }, - }) - .reply(200, entryPublishedResponse) - - // for unpublish assets - nock(dummyConfig.get('apiEndPoint'), { - reqheaders: { - api_key: dummyConfig.get('apikey'), - authorization: dummyConfig.get('manageToken'), - 'Content-Type': 'application/json', - }, - }) - .post(`/v${dummyConfig.get('apiVersion')}/assets/dummyAssetUid/unpublish?`, { - asset: { - environments: ['dummyEnvironment'], - locales: ['en-us'], - }, - }) - .reply(200, entryPublishedResponse) - - // for bulk unpublish - nock(dummyConfig.get('cdnEndPoint'), { - reqheaders: { - api_key: dummyConfig.get('apikey'), - authorization: dummyConfig.get('manageToken'), - 'Content-Type': 'application/json', - }, - }) - .post(`/v${dummyConfig.get('apiVersion')}/bulk/unpublish`, { - entries: [{ - uid: 'dummyEntryId', - content_type: 'dummyContentType1', - locale: 'en-us', - }, { - uid: 'dummyEntryId2', - content_type: 'dummyContentType2', - locale: 'en-us', - }], - locales: ['en-us'], - environments: ['dummyEnvironment'], - }) - .reply(200, entryPublishedResponse) - }) - - it('testing bulk publish entries function', async () => { - const bulkPublishObject = { - locale: 'en-us', - entries: [{ - uid: 'dummyEntryId', - content_type: 'dummyContentType1', - locale: 'en-us', - }, { - uid: 'dummyEntryId2', - content_type: 'dummyContentType2', - locale: 'en-us', - }], - Type: 'entry', - environments: ['dummyEnvironment'], - } - - return bulkPublish(bulkPublishObject, dummyConfig, 'bulkpublish').then(result => { - assert.strictEqual(result, undefined) - }) - }) - - it('testing bulk publish assets function', async () => { - const bulkPublishObject = { - locale: 'en-us', - assets: [{ - uid: 'dummyAssetUid1', - }, { - uid: 'dummyAssetUid1', - }], - Type: 'asset', - environments: ['dummyEnvironment'], - } - - return bulkPublish(bulkPublishObject, dummyConfig, 'bulkpublish') - // expect(await bulkPublish(bulkPublishObject, dummyConfig, 'bulkpublish')).toBeUndefined() - }) - - it('testing bulk publish assets function with error', async () => { - return bulkPublish({Type: 'asset', assets: []}, dummyConfig, 'bulkpublish') - // expect(await bulkPublish({Type: 'asset', assets: []}, dummyConfig, 'bulkpublish')).toBeUndefined() - }) - - it('testing bulk publish entries function with error', async () => { - return bulkPublish({Type: 'entry', entries: []}, dummyConfig, 'bulkpublish') - // expect(await bulkPublish({Type: 'entry', entries: []}, dummyConfig, 'bulkpublish')).toBeUndefined() - }) - - it('testing bulk publish function with wrong type', async () => { - return bulkPublish({Type: 'foo'}, dummyConfig, 'bulkpublish') - // expect(await bulkPublish({Type: 'foo'}, dummyConfig, 'bulkpublish')).toBeUndefined() - }) - - it('testing publishEntry', async () => { - const entryObj = { - locale: 'en-us', - content_type: 'dummyContentType', - entryUid: 'dummyEntryUid', - environments: ['dummyEnvironment'], - } - return publishEntry(entryObj, dummyConfig) - // expect(await publishEntry(entryObj, dummyConfig)).toBeUndefined() - }) - - it('testing publishEntry with error', async () => { - const entryObj = { - locale: 'en-us', - entryUid: 'dummyEntryUid', - } - return publishEntry(entryObj, dummyConfig).then(result => { - console.log(result) - }) - // expect(await publishEntry(entryObj, dummyConfig)).toBeUndefined() - }) - - it('testing publishEntry with error message', async () => { - const entryObj = { - locale: 'en-error', - content_type: 'dummyContentType', - entryUid: 'dummyEntryUid', - environments: ['dummyEnvironment'], - } - return publishEntry(entryObj, dummyConfig) - // expect(await publishEntry(entryObj, dummyConfig)).toBeUndefined() - }) - - it('testing publishAsset', async () => { - const assetObj = { - locale: 'en-us', - assetUid: 'dummyAssetUid', - environments: ['dummyEnvironment'], - } - return publishAsset(assetObj, dummyConfig) - // expect(await publishAsset(assetObj, dummyConfig)).toBeUndefined() - }) - - it('testing publishAsset with error', async () => { - const assetObj = { - locale: 'en-us', - assetUid: 'dummyAssetUid', - } - return publishAsset(assetObj, dummyConfig) - // expect(await publishAsset(assetObj, dummyConfig)).toBeUndefined() - }) - - it('testing publishAsset', async () => { - const assetObj = { - locale: 'en-error', - assetUid: 'dummyAssetUid', - environments: ['dummyEnvironment'], - } - return publishAsset(assetObj, dummyConfig) - // expect(await publishAsset(assetObj, dummyConfig)).toBeUndefined() - }) - - it('testing publishUsingVersion for entries', async () => { - const bulkPublishObject = { - Type: 'entry', - entries: [{ - uid: 'dummyEntryId', - content_type: 'dummyContentType1', - locale: 'en-us', - version: 1, - }, { - uid: 'dummyEntryId2', - content_type: 'dummyContentType2', - locale: 'en-us', - version: 1, - }], - environments: ['dummyEnvironment'], - locale: 'en-us', - } - return publishUsingVersion(bulkPublishObject, dummyConfig) - // expect(await publishUsingVersion(bulkPublishObject, dummyConfig)).toBeUndefined() - }) - - it('testing publishUsingVersion for entries', async () => { - const bulkPublishObject = { - Type: 'entry', - entries: [{ - uid: 'dummyEntryId2', - content_type: 'dummyContentType1', - locale: 'en-us', - version: 1, - }, { - uid: 'dummyEntryId3', - content_type: 'dummyContentType2', - locale: 'en-us', - version: 1, - }], - environments: ['dummyEnvironment'], - locale: 'en-us', - } - return publishUsingVersion(bulkPublishObject, dummyConfig) - // expect(await publishUsingVersion(bulkPublishObject, dummyConfig)).toBeUndefined() - }) - - it('testing publishUsingVersion for assets', async () => { - const bulkPublishObject = { - Type: 'asset', - assets: [{ - uid: 'dummyAssetUid1', - version: 1, - }, { - uid: 'dummyAssetUid2', - version: 1, - }], - environments: ['dummyEnvironment'], - locale: 'en-us', - } - return publishUsingVersion(bulkPublishObject, dummyConfig) - // expect(await publishUsingVersion(bulkPublishObject, dummyConfig)).toBeUndefined() - }) - - it('testing unpublish for entries', async () => { - const entryObj = { - locale: 'en-us', - content_type: 'dummyContentType1', - entryUid: 'dummyEntryId', - environments: ['dummyEnvironment'], - } - return UnpublishEntry(entryObj, dummyConfig) - // expect(await UnpublishEntry(entryObj, dummyConfig)).toBeUndefined() - }) - - it('testing unpublish for entries with error', async () => { - const entryObj = { - locale: 'en-us', - content_type: 'dummyContentType1', - entryUid: 'dummyEntryId', - } - return UnpublishEntry(entryObj, dummyConfig) - // expect(await UnpublishEntry(entryObj, dummyConfig)).toBeUndefined() - }) - - it('testing unpublish for assets', async () => { - const assetObj = { - locale: 'en-us', - assetUid: 'dummyAssetUid', - environments: ['dummyEnvironment'], - } - return UnpublishAsset(assetObj, dummyConfig) - // expect(await UnpublishAsset(assetObj, dummyConfig)).toBeUndefined() - }) - - it('testing unpublish for assets with error', async () => { - const assetObj = { - locale: 'en-us', - assetUid: 'dummyAssetUid', - } - return UnpublishAsset(assetObj, dummyConfig) - // expect(await UnpublishAsset(assetObj, dummyConfig)).toBeUndefined() - }) - - it('testing bulkUnpublish for entries with error', async () => { - const entryObj = { - entries: [{ - uid: 'dummyEntryId', - content_type: 'dummyContentType1', - locale: 'en-us', - }, { - uid: 'dummyEntryId2', - content_type: 'dummyContentType2', - locale: 'en-us', - }], - locales: 'en-as', - environments: ['dummyEnvironment'], - Type: 'entry', - } - return bulkUnPublish(entryObj, dummyConfig) - // expect(await bulkUnPublish(entryObj, dummyConfig)).toBeUndefined() - }) - // it('logging testing', async () => { - // const data = { - // case: 'dummyCase', - // uid: 'dummy', - // } - - // const loggingResponse = await addlogs(data) - // }) -}) - diff --git a/packages/contentstack-bulk-publish/test/dummy/1587758242717.Bulk_publish_draft.error b/packages/contentstack-bulk-publish/test/dummy/1587758242717.Bulk_publish_draft.error deleted file mode 100644 index 12235a2edb..0000000000 --- a/packages/contentstack-bulk-publish/test/dummy/1587758242717.Bulk_publish_draft.error +++ /dev/null @@ -1,2 +0,0 @@ -{"message":{"options":{"entries":[{"uid":"dummyEntryId","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId2","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId3","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId4","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId5","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId6","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId7","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId8","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId9","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId10","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]}],"locale":"en-us","Type":"entry","environments":["dummyEnvironment"]},"api_key":"tt"},"level":"error"} -{"message":{"options":{"entries":[{"uid":"dummyEntryId11","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId12","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId13","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]}],"locale":"en-us","Type":"entry","environments":["dummyEnvironment"]},"api_key":"tt"},"level":"error"} diff --git a/packages/contentstack-bulk-publish/test/dummy/1587758242717.PublishEntries b/packages/contentstack-bulk-publish/test/dummy/1587758242717.PublishEntries deleted file mode 100644 index 26ccc8634d..0000000000 --- a/packages/contentstack-bulk-publish/test/dummy/1587758242717.PublishEntries +++ /dev/null @@ -1,15 +0,0 @@ -{"message":{"options":{"content_type":"dummyContentType","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}],"environments":["dummyEnvironment"],"entryUid":"dummyEntryId","locale":"en-us","Type":"entry"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"content_type":"dummyContentType","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}],"environments":["dummyEnvironment"],"entryUid":"dummyEntryId2","locale":"en-us","Type":"entry"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"content_type":"dummyContentType","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}],"environments":["dummyEnvironment"],"entryUid":"dummyEntryId3","locale":"en-us","Type":"entry"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"content_type":"dummyContentType","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}],"environments":["dummyEnvironment"],"entryUid":"dummyEntryId4","locale":"en-us","Type":"entry"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"content_type":"dummyContentType","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}],"environments":["dummyEnvironment"],"entryUid":"dummyEntryId5","locale":"en-us","Type":"entry"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"content_type":"dummyContentType","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}],"environments":["dummyEnvironment"],"entryUid":"dummyEntryId6","locale":"en-us","Type":"entry"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"content_type":"dummyContentType","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}],"environments":["dummyEnvironment"],"entryUid":"dummyEntryId7","locale":"en-us","Type":"entry"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"content_type":"dummyContentType","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}],"environments":["dummyEnvironment"],"entryUid":"dummyEntryId8","locale":"en-us","Type":"entry"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"content_type":"dummyContentType","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}],"environments":["dummyEnvironment"],"entryUid":"dummyEntryId9","locale":"en-us","Type":"entry"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"content_type":"dummyContentType","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}],"environments":["dummyEnvironment"],"entryUid":"dummyEntryId10","locale":"en-us","Type":"entry"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"content_type":"dummyContentType","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}],"environments":["dummyEnvironment"],"entryUid":"dummyEntryId11","locale":"en-us","Type":"entry"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"content_type":"dummyContentType","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}],"environments":["dummyEnvironment"],"entryUid":"dummyEntryId12","locale":"en-us","Type":"entry"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"content_type":"dummyContentType","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}],"environments":["dummyEnvironment"],"entryUid":"dummyEntryId13","locale":"en-us","Type":"entry"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"entries":[{"uid":"dummyEntryId","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId2","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId3","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId4","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId5","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId6","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId7","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId8","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId9","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId10","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]}],"locale":"en-us","Type":"entry","environments":["dummyEnvironment"]},"api_key":"tt"},"level":"error"} -{"message":{"options":{"entries":[{"uid":"dummyEntryId11","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId12","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId13","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]}],"locale":"en-us","Type":"entry","environments":["dummyEnvironment"]},"api_key":"tt"},"level":"error"} diff --git a/packages/contentstack-bulk-publish/test/dummy/1587758242717.PublishEntries.txt b/packages/contentstack-bulk-publish/test/dummy/1587758242717.PublishEntries.txt deleted file mode 100644 index 26ccc8634d..0000000000 --- a/packages/contentstack-bulk-publish/test/dummy/1587758242717.PublishEntries.txt +++ /dev/null @@ -1,15 +0,0 @@ -{"message":{"options":{"content_type":"dummyContentType","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}],"environments":["dummyEnvironment"],"entryUid":"dummyEntryId","locale":"en-us","Type":"entry"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"content_type":"dummyContentType","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}],"environments":["dummyEnvironment"],"entryUid":"dummyEntryId2","locale":"en-us","Type":"entry"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"content_type":"dummyContentType","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}],"environments":["dummyEnvironment"],"entryUid":"dummyEntryId3","locale":"en-us","Type":"entry"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"content_type":"dummyContentType","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}],"environments":["dummyEnvironment"],"entryUid":"dummyEntryId4","locale":"en-us","Type":"entry"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"content_type":"dummyContentType","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}],"environments":["dummyEnvironment"],"entryUid":"dummyEntryId5","locale":"en-us","Type":"entry"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"content_type":"dummyContentType","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}],"environments":["dummyEnvironment"],"entryUid":"dummyEntryId6","locale":"en-us","Type":"entry"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"content_type":"dummyContentType","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}],"environments":["dummyEnvironment"],"entryUid":"dummyEntryId7","locale":"en-us","Type":"entry"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"content_type":"dummyContentType","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}],"environments":["dummyEnvironment"],"entryUid":"dummyEntryId8","locale":"en-us","Type":"entry"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"content_type":"dummyContentType","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}],"environments":["dummyEnvironment"],"entryUid":"dummyEntryId9","locale":"en-us","Type":"entry"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"content_type":"dummyContentType","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}],"environments":["dummyEnvironment"],"entryUid":"dummyEntryId10","locale":"en-us","Type":"entry"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"content_type":"dummyContentType","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}],"environments":["dummyEnvironment"],"entryUid":"dummyEntryId11","locale":"en-us","Type":"entry"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"content_type":"dummyContentType","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}],"environments":["dummyEnvironment"],"entryUid":"dummyEntryId12","locale":"en-us","Type":"entry"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"content_type":"dummyContentType","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}],"environments":["dummyEnvironment"],"entryUid":"dummyEntryId13","locale":"en-us","Type":"entry"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"entries":[{"uid":"dummyEntryId","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId2","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId3","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId4","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId5","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId6","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId7","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId8","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId9","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId10","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]}],"locale":"en-us","Type":"entry","environments":["dummyEnvironment"]},"api_key":"tt"},"level":"error"} -{"message":{"options":{"entries":[{"uid":"dummyEntryId11","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId12","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId13","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]}],"locale":"en-us","Type":"entry","environments":["dummyEnvironment"]},"api_key":"tt"},"level":"error"} diff --git a/packages/contentstack-bulk-publish/test/dummy/1587758242717.bulkPublishAssets.error b/packages/contentstack-bulk-publish/test/dummy/1587758242717.bulkPublishAssets.error deleted file mode 100644 index db3efef9b3..0000000000 --- a/packages/contentstack-bulk-publish/test/dummy/1587758242717.bulkPublishAssets.error +++ /dev/null @@ -1,2 +0,0 @@ -{"message":{"options":{"assetUid":"bltmockdata42069007","publish_details":[{"environment":"bltmockdata42069007","locale":"de-de","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"es-es","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"es-es","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"de-de","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"fr-fr","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"fr-fr","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1}],"environments":["dummyEnvironment"],"Type":"asset"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"assetUid":"bltmockdata42069007","publish_details":[{"environment":"bltmockdata42069007","locale":"de-de","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"es-es","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"de-de","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"fr-fr","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"es-es","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"fr-fr","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1}],"environments":["dummyEnvironment"],"Type":"asset"},"api_key":"tt"},"level":"error"} \ No newline at end of file diff --git a/packages/contentstack-bulk-publish/test/dummy/1587758242717.bulkPublishEntries.error b/packages/contentstack-bulk-publish/test/dummy/1587758242717.bulkPublishEntries.error deleted file mode 100644 index 12235a2edb..0000000000 --- a/packages/contentstack-bulk-publish/test/dummy/1587758242717.bulkPublishEntries.error +++ /dev/null @@ -1,2 +0,0 @@ -{"message":{"options":{"entries":[{"uid":"dummyEntryId","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId2","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId3","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId4","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId5","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId6","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId7","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId8","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId9","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId10","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]}],"locale":"en-us","Type":"entry","environments":["dummyEnvironment"]},"api_key":"tt"},"level":"error"} -{"message":{"options":{"entries":[{"uid":"dummyEntryId11","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId12","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId13","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]}],"locale":"en-us","Type":"entry","environments":["dummyEnvironment"]},"api_key":"tt"},"level":"error"} diff --git a/packages/contentstack-bulk-publish/test/dummy/1587758242717.bulkPublishEntries.success b/packages/contentstack-bulk-publish/test/dummy/1587758242717.bulkPublishEntries.success deleted file mode 100644 index 12235a2edb..0000000000 --- a/packages/contentstack-bulk-publish/test/dummy/1587758242717.bulkPublishEntries.success +++ /dev/null @@ -1,2 +0,0 @@ -{"message":{"options":{"entries":[{"uid":"dummyEntryId","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId2","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId3","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId4","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId5","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId6","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId7","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId8","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId9","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId10","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]}],"locale":"en-us","Type":"entry","environments":["dummyEnvironment"]},"api_key":"tt"},"level":"error"} -{"message":{"options":{"entries":[{"uid":"dummyEntryId11","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId12","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId13","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]}],"locale":"en-us","Type":"entry","environments":["dummyEnvironment"]},"api_key":"tt"},"level":"error"} diff --git a/packages/contentstack-bulk-publish/test/dummy/1587758242717.bulkUnpublish.error b/packages/contentstack-bulk-publish/test/dummy/1587758242717.bulkUnpublish.error deleted file mode 100644 index 12235a2edb..0000000000 --- a/packages/contentstack-bulk-publish/test/dummy/1587758242717.bulkUnpublish.error +++ /dev/null @@ -1,2 +0,0 @@ -{"message":{"options":{"entries":[{"uid":"dummyEntryId","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId2","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId3","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId4","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId5","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId6","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId7","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId8","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId9","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId10","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]}],"locale":"en-us","Type":"entry","environments":["dummyEnvironment"]},"api_key":"tt"},"level":"error"} -{"message":{"options":{"entries":[{"uid":"dummyEntryId11","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId12","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId13","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]}],"locale":"en-us","Type":"entry","environments":["dummyEnvironment"]},"api_key":"tt"},"level":"error"} diff --git a/packages/contentstack-bulk-publish/test/dummy/1587758242717.bulk_add_fields.error b/packages/contentstack-bulk-publish/test/dummy/1587758242717.bulk_add_fields.error deleted file mode 100644 index 12235a2edb..0000000000 --- a/packages/contentstack-bulk-publish/test/dummy/1587758242717.bulk_add_fields.error +++ /dev/null @@ -1,2 +0,0 @@ -{"message":{"options":{"entries":[{"uid":"dummyEntryId","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId2","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId3","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId4","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId5","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId6","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId7","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId8","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId9","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId10","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]}],"locale":"en-us","Type":"entry","environments":["dummyEnvironment"]},"api_key":"tt"},"level":"error"} -{"message":{"options":{"entries":[{"uid":"dummyEntryId11","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId12","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId13","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]}],"locale":"en-us","Type":"entry","environments":["dummyEnvironment"]},"api_key":"tt"},"level":"error"} diff --git a/packages/contentstack-bulk-publish/test/dummy/1587758242717.bulk_cross_publish.error b/packages/contentstack-bulk-publish/test/dummy/1587758242717.bulk_cross_publish.error deleted file mode 100644 index 12235a2edb..0000000000 --- a/packages/contentstack-bulk-publish/test/dummy/1587758242717.bulk_cross_publish.error +++ /dev/null @@ -1,2 +0,0 @@ -{"message":{"options":{"entries":[{"uid":"dummyEntryId","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId2","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId3","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId4","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId5","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId6","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId7","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId8","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId9","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId10","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]}],"locale":"en-us","Type":"entry","environments":["dummyEnvironment"]},"api_key":"tt"},"level":"error"} -{"message":{"options":{"entries":[{"uid":"dummyEntryId11","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId12","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId13","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]}],"locale":"en-us","Type":"entry","environments":["dummyEnvironment"]},"api_key":"tt"},"level":"error"} diff --git a/packages/contentstack-bulk-publish/test/dummy/1587758242717.bulk_nonlocalized_field_changes.error b/packages/contentstack-bulk-publish/test/dummy/1587758242717.bulk_nonlocalized_field_changes.error deleted file mode 100644 index 12235a2edb..0000000000 --- a/packages/contentstack-bulk-publish/test/dummy/1587758242717.bulk_nonlocalized_field_changes.error +++ /dev/null @@ -1,2 +0,0 @@ -{"message":{"options":{"entries":[{"uid":"dummyEntryId","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId2","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId3","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId4","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId5","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId6","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId7","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId8","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId9","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId10","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]}],"locale":"en-us","Type":"entry","environments":["dummyEnvironment"]},"api_key":"tt"},"level":"error"} -{"message":{"options":{"entries":[{"uid":"dummyEntryId11","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId12","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId13","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]}],"locale":"en-us","Type":"entry","environments":["dummyEnvironment"]},"api_key":"tt"},"level":"error"} diff --git a/packages/contentstack-bulk-publish/test/dummy/1587758242717.bulk_publish_edits.error b/packages/contentstack-bulk-publish/test/dummy/1587758242717.bulk_publish_edits.error deleted file mode 100644 index 12235a2edb..0000000000 --- a/packages/contentstack-bulk-publish/test/dummy/1587758242717.bulk_publish_edits.error +++ /dev/null @@ -1,2 +0,0 @@ -{"message":{"options":{"entries":[{"uid":"dummyEntryId","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId2","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId3","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId4","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId5","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId6","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId7","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId8","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId9","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId10","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]}],"locale":"en-us","Type":"entry","environments":["dummyEnvironment"]},"api_key":"tt"},"level":"error"} -{"message":{"options":{"entries":[{"uid":"dummyEntryId11","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId12","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId13","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]}],"locale":"en-us","Type":"entry","environments":["dummyEnvironment"]},"api_key":"tt"},"level":"error"} diff --git a/packages/contentstack-bulk-publish/test/dummy/1587758242717.publishentries.success b/packages/contentstack-bulk-publish/test/dummy/1587758242717.publishentries.success deleted file mode 100644 index 26ccc8634d..0000000000 --- a/packages/contentstack-bulk-publish/test/dummy/1587758242717.publishentries.success +++ /dev/null @@ -1,15 +0,0 @@ -{"message":{"options":{"content_type":"dummyContentType","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}],"environments":["dummyEnvironment"],"entryUid":"dummyEntryId","locale":"en-us","Type":"entry"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"content_type":"dummyContentType","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}],"environments":["dummyEnvironment"],"entryUid":"dummyEntryId2","locale":"en-us","Type":"entry"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"content_type":"dummyContentType","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}],"environments":["dummyEnvironment"],"entryUid":"dummyEntryId3","locale":"en-us","Type":"entry"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"content_type":"dummyContentType","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}],"environments":["dummyEnvironment"],"entryUid":"dummyEntryId4","locale":"en-us","Type":"entry"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"content_type":"dummyContentType","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}],"environments":["dummyEnvironment"],"entryUid":"dummyEntryId5","locale":"en-us","Type":"entry"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"content_type":"dummyContentType","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}],"environments":["dummyEnvironment"],"entryUid":"dummyEntryId6","locale":"en-us","Type":"entry"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"content_type":"dummyContentType","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}],"environments":["dummyEnvironment"],"entryUid":"dummyEntryId7","locale":"en-us","Type":"entry"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"content_type":"dummyContentType","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}],"environments":["dummyEnvironment"],"entryUid":"dummyEntryId8","locale":"en-us","Type":"entry"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"content_type":"dummyContentType","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}],"environments":["dummyEnvironment"],"entryUid":"dummyEntryId9","locale":"en-us","Type":"entry"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"content_type":"dummyContentType","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}],"environments":["dummyEnvironment"],"entryUid":"dummyEntryId10","locale":"en-us","Type":"entry"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"content_type":"dummyContentType","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}],"environments":["dummyEnvironment"],"entryUid":"dummyEntryId11","locale":"en-us","Type":"entry"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"content_type":"dummyContentType","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}],"environments":["dummyEnvironment"],"entryUid":"dummyEntryId12","locale":"en-us","Type":"entry"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"content_type":"dummyContentType","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}],"environments":["dummyEnvironment"],"entryUid":"dummyEntryId13","locale":"en-us","Type":"entry"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"entries":[{"uid":"dummyEntryId","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId2","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId3","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId4","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId5","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId6","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId7","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId8","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId9","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId10","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]}],"locale":"en-us","Type":"entry","environments":["dummyEnvironment"]},"api_key":"tt"},"level":"error"} -{"message":{"options":{"entries":[{"uid":"dummyEntryId11","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId12","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId13","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]}],"locale":"en-us","Type":"entry","environments":["dummyEnvironment"]},"api_key":"tt"},"level":"error"} diff --git a/packages/contentstack-bulk-publish/test/dummy/1587758242717.revert.error b/packages/contentstack-bulk-publish/test/dummy/1587758242717.revert.error deleted file mode 100644 index 12235a2edb..0000000000 --- a/packages/contentstack-bulk-publish/test/dummy/1587758242717.revert.error +++ /dev/null @@ -1,2 +0,0 @@ -{"message":{"options":{"entries":[{"uid":"dummyEntryId","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId2","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId3","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId4","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId5","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId6","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId7","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId8","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId9","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId10","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]}],"locale":"en-us","Type":"entry","environments":["dummyEnvironment"]},"api_key":"tt"},"level":"error"} -{"message":{"options":{"entries":[{"uid":"dummyEntryId11","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId12","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]},{"uid":"dummyEntryId13","content_type":"dummyContentType","locale":"en-us","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}]}],"locale":"en-us","Type":"entry","environments":["dummyEnvironment"]},"api_key":"tt"},"level":"error"} diff --git a/packages/contentstack-bulk-publish/test/dummy/1587758242718.PublishEntries.success b/packages/contentstack-bulk-publish/test/dummy/1587758242718.PublishEntries.success deleted file mode 100644 index 2b3280c68d..0000000000 --- a/packages/contentstack-bulk-publish/test/dummy/1587758242718.PublishEntries.success +++ /dev/null @@ -1,13 +0,0 @@ -{"message":{"options":{"content_type":"dummyContentType","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}],"environments":["dummyEnvironment"],"entryUid":"dummyEntryId","locale":"en-us","Type":"entry"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"content_type":"dummyContentType","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}],"environments":["dummyEnvironment"],"entryUid":"dummyEntryId2","locale":"en-us","Type":"entry"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"content_type":"dummyContentType","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}],"environments":["dummyEnvironment"],"entryUid":"dummyEntryId3","locale":"en-us","Type":"entry"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"content_type":"dummyContentType","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}],"environments":["dummyEnvironment"],"entryUid":"dummyEntryId4","locale":"en-us","Type":"entry"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"content_type":"dummyContentType","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}],"environments":["dummyEnvironment"],"entryUid":"dummyEntryId5","locale":"en-us","Type":"entry"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"content_type":"dummyContentType","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}],"environments":["dummyEnvironment"],"entryUid":"dummyEntryId6","locale":"en-us","Type":"entry"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"content_type":"dummyContentType","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}],"environments":["dummyEnvironment"],"entryUid":"dummyEntryId7","locale":"en-us","Type":"entry"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"content_type":"dummyContentType","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}],"environments":["dummyEnvironment"],"entryUid":"dummyEntryId8","locale":"en-us","Type":"entry"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"content_type":"dummyContentType","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}],"environments":["dummyEnvironment"],"entryUid":"dummyEntryId9","locale":"en-us","Type":"entry"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"content_type":"dummyContentType","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}],"environments":["dummyEnvironment"],"entryUid":"dummyEntryId10","locale":"en-us","Type":"entry"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"content_type":"dummyContentType","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}],"environments":["dummyEnvironment"],"entryUid":"dummyEntryId11","locale":"en-us","Type":"entry"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"content_type":"dummyContentType","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}],"environments":["dummyEnvironment"],"entryUid":"dummyEntryId12","locale":"en-us","Type":"entry"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"content_type":"dummyContentType","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}],"environments":["dummyEnvironment"],"entryUid":"dummyEntryId13","locale":"en-us","Type":"entry"},"api_key":"tt"},"level":"error"} diff --git a/packages/contentstack-bulk-publish/test/dummy/1587758242718.bulkPublishEntries.success b/packages/contentstack-bulk-publish/test/dummy/1587758242718.bulkPublishEntries.success deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/packages/contentstack-bulk-publish/test/dummy/1587758242719.PublishEntries.success b/packages/contentstack-bulk-publish/test/dummy/1587758242719.PublishEntries.success deleted file mode 100644 index dcbfda6051..0000000000 --- a/packages/contentstack-bulk-publish/test/dummy/1587758242719.PublishEntries.success +++ /dev/null @@ -1,13 +0,0 @@ -{"options":{"content_type":"dummyContentType","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}],"environments":["dummyEnvironment"],"entryUid":"dummyEntryId","locale":"en-us","Type":"entry"},"api_key":"tt"},"level":"error", -{"message":{"options":{"content_type":"dummyContentType","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}],"environments":["dummyEnvironment"],"entryUid":"dummyEntryId2","locale":"en-us","Type":"entry"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"content_type":"dummyContentType","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}],"environments":["dummyEnvironment"],"entryUid":"dummyEntryId3","locale":"en-us","Type":"entry"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"content_type":"dummyContentType","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}],"environments":["dummyEnvironment"],"entryUid":"dummyEntryId4","locale":"en-us","Type":"entry"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"content_type":"dummyContentType","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}],"environments":["dummyEnvironment"],"entryUid":"dummyEntryId5","locale":"en-us","Type":"entry"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"content_type":"dummyContentType","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}],"environments":["dummyEnvironment"],"entryUid":"dummyEntryId6","locale":"en-us","Type":"entry"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"content_type":"dummyContentType","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}],"environments":["dummyEnvironment"],"entryUid":"dummyEntryId7","locale":"en-us","Type":"entry"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"content_type":"dummyContentType","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}],"environments":["dummyEnvironment"],"entryUid":"dummyEntryId8","locale":"en-us","Type":"entry"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"content_type":"dummyContentType","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}],"environments":["dummyEnvironment"],"entryUid":"dummyEntryId9","locale":"en-us","Type":"entry"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"content_type":"dummyContentType","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}],"environments":["dummyEnvironment"],"entryUid":"dummyEntryId10","locale":"en-us","Type":"entry"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"content_type":"dummyContentType","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}],"environments":["dummyEnvironment"],"entryUid":"dummyEntryId11","locale":"en-us","Type":"entry"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"content_type":"dummyContentType","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}],"environments":["dummyEnvironment"],"entryUid":"dummyEntryId12","locale":"en-us","Type":"entry"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"content_type":"dummyContentType","publish_details":[{"environment":"dummyEnvironment","locale":"en-us"}],"environments":["dummyEnvironment"],"entryUid":"dummyEntryId13","locale":"en-us","Type":"entry"},"api_key":"tt"},"level":"error"} diff --git a/packages/contentstack-bulk-publish/test/dummy/1587956283100.PublishAssets.success b/packages/contentstack-bulk-publish/test/dummy/1587956283100.PublishAssets.success deleted file mode 100644 index 2e5ddb040c..0000000000 --- a/packages/contentstack-bulk-publish/test/dummy/1587956283100.PublishAssets.success +++ /dev/null @@ -1,24 +0,0 @@ -{"message":{"options":{"assetUid":"bltmockdata42069007","publish_details":[{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":4},{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":4},{"environment":"bltmockdata42069007","locale":"fr-fr","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":3},{"environment":"bltmockdata42069007","locale":"fr-fr","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":3}],"environments":["dummyEnvironment"],"Type":"asset"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"assetUid":"bltmockdata42069007","publish_details":[{"environment":"bltmockdata42069007","locale":"de-de","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"es-es","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"es-es","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"fr-fr","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"fr-fr","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"de-de","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1}],"environments":["dummyEnvironment"],"Type":"asset"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"assetUid":"bltmockdata42069007","publish_details":[{"environment":"bltmockdata42069007","locale":"fr-fr","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"de-de","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"de-de","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"fr-fr","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"es-es","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"es-es","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1}],"environments":["dummyEnvironment"],"Type":"asset"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"assetUid":"bltmockdata42069007","publish_details":[{"environment":"bltmockdata42069007","locale":"fr-fr","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"fr-fr","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1}],"environments":["dummyEnvironment"],"Type":"asset"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"assetUid":"bltmockdata42069007","publish_details":[{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1}],"environments":["dummyEnvironment"],"Type":"asset"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"assetUid":"bltmockdata42069007","publish_details":[{"environment":"bltmockdata42069007","locale":"de-de","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"es-es","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"fr-fr","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"de-de","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"es-es","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"fr-fr","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1}],"environments":["dummyEnvironment"],"Type":"asset"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"assetUid":"bltmockdata42069007","publish_details":[{"environment":"bltmockdata42069007","locale":"fr-fr","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"fr-fr","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1}],"environments":["dummyEnvironment"],"Type":"asset"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"assetUid":"bltmockdata42069007","publish_details":[{"environment":"bltmockdata42069007","locale":"fr-fr","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"fr-fr","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1}],"environments":["dummyEnvironment"],"Type":"asset"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"assetUid":"bltmockdata42069007","publish_details":[{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1}],"environments":["dummyEnvironment"],"Type":"asset"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"assetUid":"bltmockdata42069007","publish_details":[{"environment":"bltmockdata42069007","locale":"de-de","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"es-es","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"es-es","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"de-de","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"fr-fr","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"fr-fr","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1}],"environments":["dummyEnvironment"],"Type":"asset"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"assetUid":"bltmockdata42069007","publish_details":[{"environment":"bltmockdata42069007","locale":"de-de","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"es-es","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"de-de","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"fr-fr","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"es-es","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"fr-fr","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1}],"environments":["dummyEnvironment"],"Type":"asset"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"assetUid":"bltmockdata42069007","publish_details":[{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1}],"environments":["dummyEnvironment"],"Type":"asset"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"assetUid":"bltmockdata42069007","publish_details":[{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1}],"environments":["dummyEnvironment"],"Type":"asset"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"assetUid":"bltmockdata42069007","publish_details":[{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1}],"environments":["dummyEnvironment"],"Type":"asset"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"assetUid":"bltmockdata42069007","publish_details":[{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1}],"environments":["dummyEnvironment"],"Type":"asset"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"assetUid":"bltmockdata42069007","publish_details":[{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1}],"environments":["dummyEnvironment"],"Type":"asset"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"assetUid":"bltmockdata42069007","publish_details":[{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1}],"environments":["dummyEnvironment"],"Type":"asset"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"assetUid":"bltmockdata42069007","publish_details":[{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1}],"environments":["dummyEnvironment"],"Type":"asset"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"assetUid":"bltmockdata42069007","publish_details":[{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1}],"environments":["dummyEnvironment"],"Type":"asset"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"assetUid":"bltmockdata42069007","publish_details":[{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1}],"environments":["dummyEnvironment"],"Type":"asset"},"api_key":"tt"},"level":"error"} -{"message":{"options":{"assets":[{"uid":"bltmockdata42069007","publish_details":[{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":4},{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":4},{"environment":"bltmockdata42069007","locale":"fr-fr","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":3},{"environment":"bltmockdata42069007","locale":"fr-fr","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":3}]},{"uid":"bltmockdata42069007","publish_details":[{"environment":"bltmockdata42069007","locale":"de-de","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"es-es","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"es-es","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"fr-fr","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"fr-fr","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"de-de","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1}]},{"uid":"bltmockdata42069007","publish_details":[{"environment":"bltmockdata42069007","locale":"fr-fr","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"de-de","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"de-de","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"fr-fr","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"es-es","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"es-es","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1}]},{"uid":"bltmockdata42069007","publish_details":[{"environment":"bltmockdata42069007","locale":"fr-fr","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"fr-fr","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1}]},{"uid":"bltmockdata42069007","publish_details":[{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1}]},{"uid":"bltmockdata42069007","publish_details":[{"environment":"bltmockdata42069007","locale":"de-de","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"es-es","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"fr-fr","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"de-de","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"es-es","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"fr-fr","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1}]},{"uid":"bltmockdata42069007","publish_details":[{"environment":"bltmockdata42069007","locale":"fr-fr","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"fr-fr","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1}]},{"uid":"bltmockdata42069007","publish_details":[{"environment":"bltmockdata42069007","locale":"fr-fr","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"fr-fr","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1}]},{"uid":"bltmockdata42069007","publish_details":[{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1}]},{"uid":"bltmockdata42069007","publish_details":[{"environment":"bltmockdata42069007","locale":"de-de","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"es-es","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"es-es","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"de-de","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"fr-fr","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"fr-fr","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1}]}],"Type":"asset","environments":["dummyEnvironment"]},"api_key":"tt"},"level":"info"} -{"message":{"options":{"assets":[{"uid":"bltmockdata42069007","publish_details":[{"environment":"bltmockdata42069007","locale":"de-de","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"es-es","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"de-de","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"fr-fr","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"es-es","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"fr-fr","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1}]},{"uid":"bltmockdata42069007","publish_details":[{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1}]},{"uid":"bltmockdata42069007","publish_details":[{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1}]},{"uid":"bltmockdata42069007","publish_details":[{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1}]},{"uid":"bltmockdata42069007","publish_details":[{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1}]},{"uid":"bltmockdata42069007","publish_details":[{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1}]},{"uid":"bltmockdata42069007","publish_details":[{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1}]},{"uid":"bltmockdata42069007","publish_details":[{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1}]},{"uid":"bltmockdata42069007","publish_details":[{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1}]},{"uid":"bltmockdata42069007","publish_details":[{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1},{"environment":"bltmockdata42069007","locale":"en-us","time":"1970-01-01T00:00:00.000Z","user":"bltmockdata42069007","version":1}]}],"Type":"asset","environments":["dummyEnvironment"]},"api_key":"tt"},"level":"info"} -{"message":{"options":{"assets":[{"uid":"dummyAssetId11","publish_details":[]},{"uid":"dummyAssetId1s2","publish_details":[]},{"uid":"dummyAssetId13","publish_details":[]},{"uid":"dummyAssetId14","publish_details":[]}],"Type":"asset","environments":["dummyEnvironment"]},"api_key":"tt"},"level":"error"} -{"message":{"options":{"assets":[{"uid":"dummyAssetId","publish_details":[]},{"uid":"dummyAssetId2","publish_details":[]},{"uid":"dummyAssetId3","publish_details":[]},{"uid":"dummyAssetId4","publish_details":[]},{"uid":"dummyAssetId5","publish_details":[]},{"uid":"dummyAssetId6","publish_details":[]},{"uid":"dummyAssetId7","publish_details":[]},{"uid":"dummyAssetId8","publish_details":[]},{"uid":"dummyAssetId9","publish_details":[]},{"uid":"dummyAssetId10","publish_details":[]}],"Type":"asset","environments":["dummyEnvironment"]},"api_key":"tt"},"level":"info"} diff --git a/packages/contentstack-bulk-publish/test/dummy/addFieldResponse.js b/packages/contentstack-bulk-publish/test/dummy/addFieldResponse.js deleted file mode 100644 index 4778128f38..0000000000 --- a/packages/contentstack-bulk-publish/test/dummy/addFieldResponse.js +++ /dev/null @@ -1,36 +0,0 @@ -module.exports = { - title: '', - url: '', - uid: 'dummyEntryId', - multi_line: '', - markdown: '', - group: { - multi_line: '233', - single_line: '', - }, - boolean: false, - single_line: 'Dinesh gowda', - numberggj: null, - number: null, - rich_text_editor: '', - date: [], - hhhhgroup: { - link: { - title: 'j', - url: 'jjj', - }, - }, - azhar: '', - dinesh: 'this is us', - groupjj: { - single_line: '', - group: { - rich_text_editor: '', - }, - hgroup: { - groupj: { - multi_line: '', - }, - }, - }, -}; diff --git a/packages/contentstack-bulk-publish/test/dummy/assetpublished.js b/packages/contentstack-bulk-publish/test/dummy/assetpublished.js deleted file mode 100644 index a733c1140d..0000000000 --- a/packages/contentstack-bulk-publish/test/dummy/assetpublished.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - notice: 'Asset sent for publishing.', -}; diff --git a/packages/contentstack-bulk-publish/test/dummy/bulkContentTypeResponse.js b/packages/contentstack-bulk-publish/test/dummy/bulkContentTypeResponse.js deleted file mode 100644 index 2fa177e149..0000000000 --- a/packages/contentstack-bulk-publish/test/dummy/bulkContentTypeResponse.js +++ /dev/null @@ -1,602 +0,0 @@ -module.exports = { - content_types: [ - { - created_at: '2019-08-16T08:18:56.914Z', - updated_at: '2019-08-16T08:18:58.736Z', - title: 'Product', - uid: 'product', - _version: 2, - inbuilt_class: false, - schema: [ - { - display_name: 'Title', - uid: 'title', - data_type: 'text', - mandatory: false, - unique: false, - field_metadata: { - _default: true, - instruction: 'Product Name', - version: 3, - }, - multiple: false, - non_localizable: false, - }, - { - display_name: 'URL', - uid: 'url', - data_type: 'text', - mandatory: false, - field_metadata: { - _default: true, - version: 3, - }, - multiple: false, - unique: false, - non_localizable: false, - }, - { - data_type: 'text', - display_name: 'Description', - uid: 'description', - field_metadata: { - allow_rich_text: true, - description: '', - multiline: false, - rich_text_type: 'advanced', - version: 3, - }, - multiple: false, - mandatory: false, - unique: false, - non_localizable: false, - }, - { - data_type: 'number', - display_name: 'Size (in GB)', - uid: 'size', - field_metadata: { - description: '', - default_value: '', - }, - multiple: false, - mandatory: false, - unique: false, - non_localizable: false, - }, - { - data_type: 'text', - display_name: 'Color', - uid: 'color', - field_metadata: { - description: '', - default_value: '', - version: 3, - }, - format: '', - multiple: false, - mandatory: false, - unique: false, - non_localizable: false, - }, - { - data_type: 'file', - display_name: 'Images', - uid: 'images', - field_metadata: { - description: '', - rich_text_type: 'standard', - image: true, - }, - multiple: true, - mandatory: false, - unique: false, - non_localizable: false, - }, - { - data_type: 'reference', - display_name: 'Categories', - reference_to: [ - 'category', - ], - field_metadata: { - ref_multiple: true, - ref_multiple_content_types: true, - }, - uid: 'categories', - multiple: false, - mandatory: false, - unique: false, - non_localizable: false, - }, - { - data_type: 'number', - display_name: 'Price in USD', - uid: 'price_in_usd', - field_metadata: { - description: '', - default_value: '', - }, - multiple: false, - mandatory: false, - unique: false, - non_localizable: false, - }, - { - data_type: 'reference', - display_name: 'Brand', - reference_to: [ - 'brand', - ], - field_metadata: { - ref_multiple: false, - ref_multiple_content_types: true, - }, - uid: 'brand', - multiple: false, - mandatory: false, - unique: false, - non_localizable: false, - }, - { - data_type: 'isodate', - display_name: 'Launch Date', - uid: 'launch_date', - field_metadata: { - description: '', - default_value: '', - }, - multiple: false, - mandatory: false, - unique: false, - endDate: null, - startDate: null, - non_localizable: false, - }, - { - data_type: 'boolean', - display_name: 'instock', - uid: 'instock', - field_metadata: { - description: '', - default_value: '', - }, - multiple: false, - mandatory: false, - unique: false, - non_localizable: false, - }, - { - data_type: 'blocks', - display_name: 'Additional Info', - blocks: [ - { - title: 'Related Products', - uid: 'related_products', - schema: [ - { - data_type: 'reference', - display_name: 'Products', - reference_to: [ - 'product', - ], - field_metadata: { - ref_multiple: true, - ref_multiple_content_types: true, - }, - uid: 'products', - mandatory: false, - multiple: false, - unique: false, - non_localizable: false, - }, - ], - }, - { - title: 'Rating', - uid: 'rating', - schema: [ - { - data_type: 'number', - display_name: 'Stars', - display_type: 'dropdown', - enum: { - advanced: false, - choices: [ - { - value: 1, - }, - { - value: 2, - }, - { - value: 3, - }, - { - value: 4, - }, - { - value: 5, - }, - ], - }, - multiple: false, - uid: 'stars', - field_metadata: { - description: '', - default_value: '', - }, - min_instance: null, - max_instance: null, - mandatory: false, - unique: false, - non_localizable: false, - }, - ], - }, - { - title: 'Deals', - uid: 'deals', - schema: [ - { - data_type: 'text', - display_name: 'Deal Name', - display_type: 'dropdown', - enum: { - advanced: false, - choices: [ - { - value: 'Summer Deal', - }, - { - value: 'Independence Day Deal', - }, - { - value: 'Black Friday Deal', - }, - { - value: 'Christmas Deal', - }, - { - value: 'Deals of the Day', - }, - ], - }, - multiple: false, - uid: 'deal_name', - field_metadata: { - description: '', - default_value: '', - version: 3, - }, - min_instance: null, - max_instance: null, - mandatory: false, - unique: false, - non_localizable: false, - }, - { - data_type: 'text', - display_name: 'Deal Details', - uid: 'deal_details', - field_metadata: { - description: '', - default_value: '', - multiline: true, - version: 3, - }, - format: '', - error_messages: { - format: '', - }, - multiple: false, - mandatory: false, - unique: false, - non_localizable: false, - }, - ], - }, - ], - multiple: true, - uid: 'additional_info', - field_metadata: {}, - mandatory: false, - unique: false, - non_localizable: false, - }, - { - data_type: 'group', - display_name: 'Bank Offers', - field_metadata: {}, - schema: [ - { - data_type: 'reference', - display_name: 'Bank', - reference_to: [ - 'bank', - ], - field_metadata: { - ref_multiple: false, - ref_multiple_content_types: true, - }, - uid: 'bank', - multiple: false, - mandatory: false, - unique: false, - non_localizable: false, - }, - { - data_type: 'text', - display_name: 'Card Type', - display_type: 'dropdown', - enum: { - advanced: false, - choices: [ - { - value: 'Credit Card', - }, - { - value: 'Debit Card', - }, - ], - }, - multiple: true, - uid: 'card_type', - field_metadata: { - description: '', - default_value: '', - version: 3, - }, - mandatory: false, - unique: false, - non_localizable: false, - }, - { - data_type: 'number', - display_name: 'Discount In Percentage', - uid: 'discount_in_percentage', - field_metadata: { - description: '', - default_value: '', - }, - multiple: false, - mandatory: false, - unique: false, - non_localizable: false, - }, - ], - uid: 'bank_offers', - multiple: true, - mandatory: false, - unique: false, - non_localizable: false, - }, - ], - last_activity: { - environments: [ - { - uid: 'bltmockdata42069007', - details: [ - { - locale: 'en-us', - time: '2019-08-23T13:02:25.439Z', - }, - ], - }, - ], - }, - maintain_revisions: true, - description: '', - DEFAULT_ACL: { - others: { - read: false, - create: false, - }, - users: [ - { - uid: 'bltmockdata42069007', - read: true, - sub_acl: { - read: true, - }, - }, - ], - }, - SYS_ACL: { - roles: [ - { - uid: 'bltmockdata42069007', - read: true, - sub_acl: { - create: true, - read: true, - update: true, - delete: true, - publish: true, - }, - update: true, - delete: true, - }, - { - uid: 'bltmockdata42069007', - read: true, - sub_acl: { - create: true, - read: true, - update: true, - delete: true, - publish: true, - }, - update: true, - delete: true, - }, - { - uid: 'bltmockdata42069007', - read: true, - sub_acl: { - create: true, - read: true, - update: true, - delete: true, - publish: true, - }, - }, - ], - others: { - read: false, - create: false, - update: false, - delete: false, - sub_acl: { - read: false, - create: false, - update: false, - delete: false, - publish: false, - }, - }, - }, - options: { - is_page: true, - singleton: false, - title: 'title', - sub_title: [], - url_pattern: '/:title', - url_prefix: '/mobiles/', - }, - abilities: { - get_one_object: true, - get_all_objects: true, - create_object: true, - update_object: true, - delete_object: true, - delete_all_objects: true, - }, - }, - - { - created_at: '2019-08-16T08:18:55.164Z', - updated_at: '2019-08-16T08:18:58.691Z', - title: 'Bank', - uid: 'bank', - _version: 2, - inbuilt_class: false, - schema: [ - { - display_name: 'Title', - uid: 'title', - data_type: 'text', - mandatory: false, - unique: false, - field_metadata: { - _default: true, - version: 3, - }, - multiple: false, - non_localizable: false, - }, - { - data_type: 'file', - display_name: 'Logo', - uid: 'logo', - extensions: [], - field_metadata: { - description: '', - rich_text_type: 'standard', - }, - multiple: false, - mandatory: false, - unique: false, - non_localizable: false, - }, - ], - last_activity: {}, - maintain_revisions: true, - description: '', - DEFAULT_ACL: { - others: { - read: false, - create: false, - }, - users: [ - { - uid: 'bltmockdata42069007', - read: true, - sub_acl: { - read: true, - }, - }, - ], - }, - SYS_ACL: { - roles: [ - { - uid: 'bltmockdata42069007', - read: true, - sub_acl: { - create: true, - read: true, - update: true, - delete: true, - publish: true, - }, - update: true, - delete: true, - }, - { - uid: 'bltmockdata42069007', - read: true, - sub_acl: { - create: true, - read: true, - update: true, - delete: true, - publish: true, - }, - update: true, - delete: true, - }, - { - uid: 'bltmockdata42069007', - read: true, - sub_acl: { - create: true, - read: true, - update: true, - delete: true, - publish: true, - }, - }, - ], - others: { - read: false, - create: false, - update: false, - delete: false, - sub_acl: { - read: false, - create: false, - update: false, - delete: false, - publish: false, - }, - }, - }, - options: { - is_page: false, - singleton: false, - title: 'title', - sub_title: [], - }, - abilities: { - get_one_object: true, - get_all_objects: true, - create_object: true, - update_object: true, - delete_object: true, - delete_all_objects: true, - }, - }, - ], - count: 2, -}; diff --git a/packages/contentstack-bulk-publish/test/dummy/bulkPublishResponse.js b/packages/contentstack-bulk-publish/test/dummy/bulkPublishResponse.js deleted file mode 100644 index 2009593642..0000000000 --- a/packages/contentstack-bulk-publish/test/dummy/bulkPublishResponse.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - notice: 'Your bulk publish request is in progress. Please check publish queue for more details.', -}; diff --git a/packages/contentstack-bulk-publish/test/dummy/bulkUnpublishResponse.js b/packages/contentstack-bulk-publish/test/dummy/bulkUnpublishResponse.js deleted file mode 100644 index 299274558f..0000000000 --- a/packages/contentstack-bulk-publish/test/dummy/bulkUnpublishResponse.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - notice: 'Your bulk unpublish request is in progress. Please check publish queue for more details.', -}; diff --git a/packages/contentstack-bulk-publish/test/dummy/bulkasset1.js b/packages/contentstack-bulk-publish/test/dummy/bulkasset1.js deleted file mode 100644 index 0426988bd3..0000000000 --- a/packages/contentstack-bulk-publish/test/dummy/bulkasset1.js +++ /dev/null @@ -1,1212 +0,0 @@ -module.exports = { - items: [ - { - uid: 'bltmockdata42069007', - created_at: '1970-01-01T00:00:00.000Z', - updated_at: '1970-01-01T00:00:00.000Z', - created_by: 'bltmockdata42069007', - updated_by: 'bltmockdata42069007', - content_type: 'image/png', - file_size: '971', - tags: [], - filename: '14.png', - url: 'https://images.contentstack.io/v3/assets/bltmockdata42069007/bltmockdata42069007/5e9bf95af2c57d398b39e5c5/14.png', - ACL: { - roles: [], - others: { - read: false, - create: false, - update: false, - delete: false, - sub_acl: { - read: false, - create: false, - update: false, - delete: false, - publish: false, - }, - }, - }, - is_dir: false, - _version: 4, - title: '14.png', - description: 'vfdvf', - publish_details: [ - { - environment: 'bltmockdata42069007', - locale: 'en-us', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 4, - }, - { - environment: 'bltmockdata42069007', - locale: 'en-us', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 4, - }, - { - environment: 'bltmockdata42069007', - locale: 'fr-fr', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 3, - }, - { - environment: 'bltmockdata42069007', - locale: 'fr-fr', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 3, - }, - ], - }, - { - uid: 'bltmockdata42069007', - created_at: '1970-01-01T00:00:00.000Z', - updated_at: '1970-01-01T00:00:00.000Z', - created_by: 'bltmockdata42069007', - updated_by: 'bltmockdata42069007', - content_type: 'image/png', - file_size: '2044', - tags: [], - filename: '12.png', - url: 'https://images.contentstack.io/v3/assets/bltmockdata42069007/bltmockdata42069007/5e9bf95b8b9d64140de02a76/12.png', - ACL: { - roles: [], - others: { - read: false, - create: false, - update: false, - delete: false, - sub_acl: { - read: false, - create: false, - update: false, - delete: false, - publish: false, - }, - }, - }, - is_dir: false, - _version: 1, - title: '12.png', - publish_details: [ - { - environment: 'bltmockdata42069007', - locale: 'de-de', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - { - environment: 'bltmockdata42069007', - locale: 'es-es', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - { - environment: 'bltmockdata42069007', - locale: 'es-es', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - { - environment: 'bltmockdata42069007', - locale: 'fr-fr', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - { - environment: 'bltmockdata42069007', - locale: 'fr-fr', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - { - environment: 'bltmockdata42069007', - locale: 'de-de', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - { - environment: 'bltmockdata42069007', - locale: 'en-us', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - { - environment: 'bltmockdata42069007', - locale: 'en-us', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - ], - }, - { - uid: 'bltmockdata42069007', - created_at: '1970-01-01T00:00:00.000Z', - updated_at: '1970-01-01T00:00:00.000Z', - created_by: 'bltmockdata42069007', - updated_by: 'bltmockdata42069007', - content_type: 'image/png', - file_size: '2199', - tags: [], - filename: '11.png', - url: 'https://images.contentstack.io/v3/assets/bltmockdata42069007/bltmockdata42069007/5e9bf95a07e1e553eb611b44/11.png', - ACL: { - roles: [], - others: { - read: false, - create: false, - update: false, - delete: false, - sub_acl: { - read: false, - create: false, - update: false, - delete: false, - publish: false, - }, - }, - }, - is_dir: false, - _version: 1, - title: '11.png', - publish_details: [ - { - environment: 'bltmockdata42069007', - locale: 'fr-fr', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - { - environment: 'bltmockdata42069007', - locale: 'de-de', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - { - environment: 'bltmockdata42069007', - locale: 'de-de', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - { - environment: 'bltmockdata42069007', - locale: 'fr-fr', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - { - environment: 'bltmockdata42069007', - locale: 'es-es', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - { - environment: 'bltmockdata42069007', - locale: 'es-es', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - { - environment: 'bltmockdata42069007', - locale: 'en-us', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - { - environment: 'bltmockdata42069007', - locale: 'en-us', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - ], - }, - { - uid: 'bltmockdata42069007', - created_at: '1970-01-01T00:00:00.000Z', - updated_at: '1970-01-01T00:00:00.000Z', - created_by: 'bltmockdata42069007', - updated_by: 'bltmockdata42069007', - content_type: 'image/png', - file_size: '1738', - tags: [], - filename: '17.png', - url: 'https://images.contentstack.io/v3/assets/bltmockdata42069007/bltmockdata42069007/5e9bf959bbd02622beb71b6a/17.png', - ACL: { - roles: [], - others: { - read: false, - create: false, - update: false, - delete: false, - sub_acl: { - read: false, - create: false, - update: false, - delete: false, - publish: false, - }, - }, - }, - is_dir: false, - _version: 1, - title: '17.png', - publish_details: [ - { - environment: 'bltmockdata42069007', - locale: 'fr-fr', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - { - environment: 'bltmockdata42069007', - locale: 'fr-fr', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - { - environment: 'bltmockdata42069007', - locale: 'en-us', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - { - environment: 'bltmockdata42069007', - locale: 'en-us', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - ], - }, - { - uid: 'bltmockdata42069007', - created_at: '1970-01-01T00:00:00.000Z', - updated_at: '1970-01-01T00:00:00.000Z', - created_by: 'bltmockdata42069007', - updated_by: 'bltmockdata42069007', - content_type: 'image/png', - file_size: '1403', - tags: [], - filename: '13.png', - url: 'https://images.contentstack.io/v3/assets/bltmockdata42069007/bltmockdata42069007/5e9bf959a527cd7fcb579816/13.png', - ACL: { - roles: [], - others: { - read: false, - create: false, - update: false, - delete: false, - sub_acl: { - read: false, - create: false, - update: false, - delete: false, - publish: false, - }, - }, - }, - is_dir: false, - _version: 1, - title: '13.png', - publish_details: [ - { - environment: 'bltmockdata42069007', - locale: 'en-us', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - { - environment: 'bltmockdata42069007', - locale: 'en-us', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - ], - }, - { - uid: 'bltmockdata42069007', - created_at: '1970-01-01T00:00:00.000Z', - updated_at: '1970-01-01T00:00:00.000Z', - created_by: 'bltmockdata42069007', - updated_by: 'bltmockdata42069007', - content_type: 'image/png', - file_size: '2673', - tags: [], - filename: '16.png', - url: 'https://images.contentstack.io/v3/assets/bltmockdata42069007/bltmockdata42069007/5e9bf958575fe97edf22b225/16.png', - ACL: { - roles: [], - others: { - read: false, - create: false, - update: false, - delete: false, - sub_acl: { - read: false, - create: false, - update: false, - delete: false, - publish: false, - }, - }, - }, - is_dir: false, - _version: 1, - title: '16.png', - publish_details: [ - { - environment: 'bltmockdata42069007', - locale: 'de-de', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - { - environment: 'bltmockdata42069007', - locale: 'es-es', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - { - environment: 'bltmockdata42069007', - locale: 'fr-fr', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - { - environment: 'bltmockdata42069007', - locale: 'de-de', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - { - environment: 'bltmockdata42069007', - locale: 'es-es', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - { - environment: 'bltmockdata42069007', - locale: 'fr-fr', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - { - environment: 'bltmockdata42069007', - locale: 'en-us', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - { - environment: 'bltmockdata42069007', - locale: 'en-us', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - ], - }, - { - uid: 'bltmockdata42069007', - created_at: '1970-01-01T00:00:00.000Z', - updated_at: '1970-01-01T00:00:00.000Z', - created_by: 'bltmockdata42069007', - updated_by: 'bltmockdata42069007', - content_type: 'image/png', - file_size: '2481', - tags: [], - filename: '20.png', - url: 'https://images.contentstack.io/v3/assets/bltmockdata42069007/bltmockdata42069007/5e9bf9587f716e6177ddf379/20.png', - ACL: { - roles: [], - others: { - read: false, - create: false, - update: false, - delete: false, - sub_acl: { - read: false, - create: false, - update: false, - delete: false, - publish: false, - }, - }, - }, - is_dir: false, - _version: 1, - title: '20.png', - publish_details: [ - { - environment: 'bltmockdata42069007', - locale: 'fr-fr', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - { - environment: 'bltmockdata42069007', - locale: 'fr-fr', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - { - environment: 'bltmockdata42069007', - locale: 'en-us', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - { - environment: 'bltmockdata42069007', - locale: 'en-us', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - ], - }, - { - uid: 'bltmockdata42069007', - created_at: '1970-01-01T00:00:00.000Z', - updated_at: '1970-01-01T00:00:00.000Z', - created_by: 'bltmockdata42069007', - updated_by: 'bltmockdata42069007', - content_type: 'image/png', - file_size: '2754', - tags: [], - filename: '18.png', - url: 'https://images.contentstack.io/v3/assets/bltmockdata42069007/bltmockdata42069007/5e9bf9574fa64263387e38c6/18.png', - ACL: { - roles: [], - others: { - read: false, - create: false, - update: false, - delete: false, - sub_acl: { - read: false, - create: false, - update: false, - delete: false, - publish: false, - }, - }, - }, - is_dir: false, - _version: 1, - title: '18.png', - publish_details: [ - { - environment: 'bltmockdata42069007', - locale: 'fr-fr', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - { - environment: 'bltmockdata42069007', - locale: 'fr-fr', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - { - environment: 'bltmockdata42069007', - locale: 'en-us', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - { - environment: 'bltmockdata42069007', - locale: 'en-us', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - ], - }, - { - uid: 'bltmockdata42069007', - created_at: '1970-01-01T00:00:00.000Z', - updated_at: '1970-01-01T00:00:00.000Z', - created_by: 'bltmockdata42069007', - updated_by: 'bltmockdata42069007', - content_type: 'image/png', - file_size: '2255', - tags: [], - filename: '15.png', - url: 'https://images.contentstack.io/v3/assets/bltmockdata42069007/bltmockdata42069007/5e9bf957dbaef17ed999e524/15.png', - ACL: { - roles: [], - others: { - read: false, - create: false, - update: false, - delete: false, - sub_acl: { - read: false, - create: false, - update: false, - delete: false, - publish: false, - }, - }, - }, - is_dir: false, - _version: 1, - title: '15.png', - publish_details: [ - { - environment: 'bltmockdata42069007', - locale: 'en-us', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - { - environment: 'bltmockdata42069007', - locale: 'en-us', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - ], - }, - { - uid: 'bltmockdata42069007', - created_at: '1970-01-01T00:00:00.000Z', - updated_at: '1970-01-01T00:00:00.000Z', - created_by: 'bltmockdata42069007', - updated_by: 'bltmockdata42069007', - content_type: 'image/png', - file_size: '1993', - tags: [], - filename: '19.png', - url: 'https://images.contentstack.io/v3/assets/bltmockdata42069007/bltmockdata42069007/5e9bf955954d095591dd831b/19.png', - ACL: { - roles: [], - others: { - read: false, - create: false, - update: false, - delete: false, - sub_acl: { - read: false, - create: false, - update: false, - delete: false, - publish: false, - }, - }, - }, - is_dir: false, - _version: 1, - title: '19.png', - publish_details: [ - { - environment: 'bltmockdata42069007', - locale: 'de-de', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - { - environment: 'bltmockdata42069007', - locale: 'es-es', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - { - environment: 'bltmockdata42069007', - locale: 'es-es', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - { - environment: 'bltmockdata42069007', - locale: 'de-de', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - { - environment: 'bltmockdata42069007', - locale: 'fr-fr', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - { - environment: 'bltmockdata42069007', - locale: 'fr-fr', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - { - environment: 'bltmockdata42069007', - locale: 'en-us', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - { - environment: 'bltmockdata42069007', - locale: 'en-us', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - ], - }, - { - uid: 'bltmockdata42069007', - created_at: '1970-01-01T00:00:00.000Z', - updated_at: '1970-01-01T00:00:00.000Z', - created_by: 'bltmockdata42069007', - updated_by: 'bltmockdata42069007', - content_type: 'image/png', - file_size: '2507', - tags: [], - filename: '6.png', - url: 'https://images.contentstack.io/v3/assets/bltmockdata42069007/bltmockdata42069007/5e9bf9514a102c13ee2bce51/6.png', - ACL: { - roles: [], - others: { - read: false, - create: false, - update: false, - delete: false, - sub_acl: { - read: false, - create: false, - update: false, - delete: false, - publish: false, - }, - }, - }, - is_dir: false, - _version: 1, - title: '6.png', - publish_details: [ - { - environment: 'bltmockdata42069007', - locale: 'de-de', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - { - environment: 'bltmockdata42069007', - locale: 'es-es', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - { - environment: 'bltmockdata42069007', - locale: 'de-de', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - { - environment: 'bltmockdata42069007', - locale: 'fr-fr', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - { - environment: 'bltmockdata42069007', - locale: 'es-es', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - { - environment: 'bltmockdata42069007', - locale: 'fr-fr', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - { - environment: 'bltmockdata42069007', - locale: 'en-us', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - { - environment: 'bltmockdata42069007', - locale: 'en-us', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - ], - }, - { - uid: 'bltmockdata42069007', - created_at: '1970-01-01T00:00:00.000Z', - updated_at: '1970-01-01T00:00:00.000Z', - created_by: 'bltmockdata42069007', - updated_by: 'bltmockdata42069007', - content_type: 'image/png', - file_size: '1683', - tags: [], - filename: '10.png', - url: 'https://images.contentstack.io/v3/assets/bltmockdata42069007/bltmockdata42069007/5e9bf95179ada922b30ec666/10.png', - ACL: { - roles: [], - others: { - read: false, - create: false, - update: false, - delete: false, - sub_acl: { - read: false, - create: false, - update: false, - delete: false, - publish: false, - }, - }, - }, - is_dir: false, - _version: 1, - title: '10.png', - publish_details: [ - { - environment: 'bltmockdata42069007', - locale: 'en-us', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - { - environment: 'bltmockdata42069007', - locale: 'en-us', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - ], - }, - { - uid: 'bltmockdata42069007', - created_at: '1970-01-01T00:00:00.000Z', - updated_at: '1970-01-01T00:00:00.000Z', - created_by: 'bltmockdata42069007', - updated_by: 'bltmockdata42069007', - content_type: 'image/png', - file_size: '932', - tags: [], - filename: '9.png', - url: 'https://images.contentstack.io/v3/assets/bltmockdata42069007/bltmockdata42069007/5e9bf950ccc87e3a984deb43/9.png', - ACL: { - roles: [], - others: { - read: false, - create: false, - update: false, - delete: false, - sub_acl: { - read: false, - create: false, - update: false, - delete: false, - publish: false, - }, - }, - }, - is_dir: false, - _version: 1, - title: '9.png', - publish_details: [ - { - environment: 'bltmockdata42069007', - locale: 'en-us', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - { - environment: 'bltmockdata42069007', - locale: 'en-us', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - ], - }, - { - uid: 'bltmockdata42069007', - created_at: '1970-01-01T00:00:00.000Z', - updated_at: '1970-01-01T00:00:00.000Z', - created_by: 'bltmockdata42069007', - updated_by: 'bltmockdata42069007', - content_type: 'image/png', - file_size: '2668', - tags: [], - filename: '7.png', - url: 'https://images.contentstack.io/v3/assets/bltmockdata42069007/bltmockdata42069007/5e9bf950642dd73b7f9d9b67/7.png', - ACL: { - roles: [], - others: { - read: false, - create: false, - update: false, - delete: false, - sub_acl: { - read: false, - create: false, - update: false, - delete: false, - publish: false, - }, - }, - }, - is_dir: false, - _version: 1, - title: '7.png', - publish_details: [ - { - environment: 'bltmockdata42069007', - locale: 'en-us', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - { - environment: 'bltmockdata42069007', - locale: 'en-us', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - ], - }, - { - uid: 'bltmockdata42069007', - created_at: '1970-01-01T00:00:00.000Z', - updated_at: '1970-01-01T00:00:00.000Z', - created_by: 'bltmockdata42069007', - updated_by: 'bltmockdata42069007', - content_type: 'image/png', - file_size: '2127', - tags: [], - filename: '3.png', - url: 'https://images.contentstack.io/v3/assets/bltmockdata42069007/bltmockdata42069007/5e9bf94f954d095591dd830f/3.png', - ACL: { - roles: [], - others: { - read: false, - create: false, - update: false, - delete: false, - sub_acl: { - read: false, - create: false, - update: false, - delete: false, - publish: false, - }, - }, - }, - is_dir: false, - _version: 1, - title: '3.png', - publish_details: [ - { - environment: 'bltmockdata42069007', - locale: 'en-us', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - { - environment: 'bltmockdata42069007', - locale: 'en-us', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - ], - }, - { - uid: 'bltmockdata42069007', - created_at: '1970-01-01T00:00:00.000Z', - updated_at: '1970-01-01T00:00:00.000Z', - created_by: 'bltmockdata42069007', - updated_by: 'bltmockdata42069007', - content_type: 'image/png', - file_size: '1791', - tags: [], - filename: '8.png', - url: 'https://images.contentstack.io/v3/assets/bltmockdata42069007/bltmockdata42069007/5e9bf94f3b64a2567aefb88c/8.png', - ACL: { - roles: [], - others: { - read: false, - create: false, - update: false, - delete: false, - sub_acl: { - read: false, - create: false, - update: false, - delete: false, - publish: false, - }, - }, - }, - is_dir: false, - _version: 1, - title: '8.png', - publish_details: [ - { - environment: 'bltmockdata42069007', - locale: 'en-us', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - { - environment: 'bltmockdata42069007', - locale: 'en-us', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - ], - }, - { - uid: 'bltmockdata42069007', - created_at: '1970-01-01T00:00:00.000Z', - updated_at: '1970-01-01T00:00:00.000Z', - created_by: 'bltmockdata42069007', - updated_by: 'bltmockdata42069007', - content_type: 'image/png', - file_size: '2100', - tags: [], - filename: '5.png', - url: 'https://images.contentstack.io/v3/assets/bltmockdata42069007/bltmockdata42069007/5e9bf94e07e1e553eb611b3c/5.png', - ACL: { - roles: [], - others: { - read: false, - create: false, - update: false, - delete: false, - sub_acl: { - read: false, - create: false, - update: false, - delete: false, - publish: false, - }, - }, - }, - is_dir: false, - _version: 1, - title: '5.png', - publish_details: [ - { - environment: 'bltmockdata42069007', - locale: 'en-us', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - { - environment: 'bltmockdata42069007', - locale: 'en-us', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - ], - }, - { - uid: 'bltmockdata42069007', - created_at: '1970-01-01T00:00:00.000Z', - updated_at: '1970-01-01T00:00:00.000Z', - created_by: 'bltmockdata42069007', - updated_by: 'bltmockdata42069007', - content_type: 'image/png', - file_size: '2081', - tags: [], - filename: '2.png', - url: 'https://images.contentstack.io/v3/assets/bltmockdata42069007/bltmockdata42069007/5e9bf94dd14a8f20f4be14e4/2.png', - ACL: { - roles: [], - others: { - read: false, - create: false, - update: false, - delete: false, - sub_acl: { - read: false, - create: false, - update: false, - delete: false, - publish: false, - }, - }, - }, - is_dir: false, - _version: 1, - title: '2.png', - publish_details: [ - { - environment: 'bltmockdata42069007', - locale: 'en-us', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - { - environment: 'bltmockdata42069007', - locale: 'en-us', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - ], - }, - { - uid: 'bltmockdata42069007', - created_at: '1970-01-01T00:00:00.000Z', - updated_at: '1970-01-01T00:00:00.000Z', - created_by: 'bltmockdata42069007', - updated_by: 'bltmockdata42069007', - content_type: 'image/png', - file_size: '2416', - tags: [], - filename: '4.png', - url: 'https://images.contentstack.io/v3/assets/bltmockdata42069007/bltmockdata42069007/5e9bf94dcf99fc55a237df82/4.png', - ACL: { - roles: [], - others: { - read: false, - create: false, - update: false, - delete: false, - sub_acl: { - read: false, - create: false, - update: false, - delete: false, - publish: false, - }, - }, - }, - is_dir: false, - _version: 1, - title: '4.png', - publish_details: [ - { - environment: 'bltmockdata42069007', - locale: 'en-us', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - { - environment: 'bltmockdata42069007', - locale: 'en-us', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - ], - }, - { - uid: 'bltmockdata42069007', - created_at: '1970-01-01T00:00:00.000Z', - updated_at: '1970-01-01T00:00:00.000Z', - created_by: 'bltmockdata42069007', - updated_by: 'bltmockdata42069007', - content_type: 'image/png', - file_size: '1642', - tags: [], - filename: '1.png', - url: 'https://images.contentstack.io/v3/assets/bltmockdata42069007/bltmockdata42069007/5e9bf94dbbd02622beb71b4c/1.png', - ACL: { - roles: [], - others: { - read: false, - create: false, - update: false, - delete: false, - sub_acl: { - read: false, - create: false, - update: false, - delete: false, - publish: false, - }, - }, - }, - is_dir: false, - _version: 1, - title: '1.png', - publish_details: [ - { - environment: 'bltmockdata42069007', - locale: 'en-us', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - { - environment: 'bltmockdata42069007', - locale: 'en-us', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 1, - }, - ], - }, - ], - count: 20, -}; diff --git a/packages/contentstack-bulk-publish/test/dummy/bulkasset2.js b/packages/contentstack-bulk-publish/test/dummy/bulkasset2.js deleted file mode 100644 index 642086fa1a..0000000000 --- a/packages/contentstack-bulk-publish/test/dummy/bulkasset2.js +++ /dev/null @@ -1,441 +0,0 @@ -module.exports = { - assets: [ - { - uid: 'dummyAssetId', - created_at: '2019-11-04T08:40:41.341Z', - updated_at: '1970-01-01T00:00:00.000Z', - created_by: 'bltmockdata42069007', - updated_by: 'bltmockdata42069007', - content_type: 'image/svg+xml', - file_size: '2676', - tags: [], - filename: 'Content_manager.svg', - url: 'https://images.contentstack.io/v3/assets/bltmockdata42069007/bltmockdata42069007/5dbfe409a0b3fd4bbae67e30/Content_manager.svg', - ACL: { - roles: [], - others: { - read: false, - create: false, - update: false, - delete: false, - sub_acl: { - read: false, - create: false, - update: false, - delete: false, - publish: false, - }, - }, - }, - is_dir: false, - parent_uid: 'bltmockdata42069007', - _version: 2, - title: 'Content_manager.svg', - description: '', - }, - { - uid: 'dummyAssetId2', - created_at: '2019-11-04T08:41:12.341Z', - updated_at: '2019-11-04T08:41:12.341Z', - created_by: 'bltmockdata42069007', - updated_by: 'bltmockdata42069007', - content_type: 'image/png', - file_size: '344825', - tags: [], - filename: 'Snap.PNG', - url: 'https://images.contentstack.io/v3/assets/bltmockdata42069007/bltmockdata42069007/5dbfe4280eebac1e86b541b3/Snap.PNG', - ACL: { - roles: [], - others: { - read: false, - create: false, - update: false, - delete: false, - sub_acl: { - read: false, - create: false, - update: false, - delete: false, - publish: false, - }, - }, - }, - is_dir: false, - _version: 1, - title: 'Snap.PNG', - }, - { - uid: 'dummyAssetId3', - created_at: '2019-11-04T08:41:12.341Z', - updated_at: '2019-11-04T08:41:12.341Z', - created_by: 'bltmockdata42069007', - updated_by: 'bltmockdata42069007', - content_type: 'image/png', - file_size: '344825', - tags: [], - filename: 'Snap.PNG', - url: 'https://images.contentstack.io/v3/assets/bltmockdata42069007/bltmockdata42069007/5dbfe4280eebac1e86b541b3/Snap.PNG', - ACL: { - roles: [], - others: { - read: false, - create: false, - update: false, - delete: false, - sub_acl: { - read: false, - create: false, - update: false, - delete: false, - publish: false, - }, - }, - }, - is_dir: false, - _version: 1, - title: 'Snap.PNG', - }, - { - uid: 'dummyAssetId4', - created_at: '2019-11-04T08:41:12.341Z', - updated_at: '2019-11-04T08:41:12.341Z', - created_by: 'bltmockdata42069007', - updated_by: 'bltmockdata42069007', - content_type: 'image/png', - file_size: '344825', - tags: [], - filename: 'Snap.PNG', - url: 'https://images.contentstack.io/v3/assets/bltmockdata42069007/bltmockdata42069007/5dbfe4280eebac1e86b541b3/Snap.PNG', - ACL: { - roles: [], - others: { - read: false, - create: false, - update: false, - delete: false, - sub_acl: { - read: false, - create: false, - update: false, - delete: false, - publish: false, - }, - }, - }, - is_dir: false, - _version: 1, - title: 'Snap.PNG', - }, - { - uid: 'dummyAssetId5', - created_at: '2019-11-04T08:41:12.341Z', - updated_at: '2019-11-04T08:41:12.341Z', - created_by: 'bltmockdata42069007', - updated_by: 'bltmockdata42069007', - content_type: 'image/png', - file_size: '344825', - tags: [], - filename: 'Snap.PNG', - url: 'https://images.contentstack.io/v3/assets/bltmockdata42069007/bltmockdata42069007/5dbfe4280eebac1e86b541b3/Snap.PNG', - ACL: { - roles: [], - others: { - read: false, - create: false, - update: false, - delete: false, - sub_acl: { - read: false, - create: false, - update: false, - delete: false, - publish: false, - }, - }, - }, - is_dir: false, - _version: 1, - title: 'Snap.PNG', - }, - { - uid: 'dummyAssetId6', - created_at: '2019-11-04T08:41:12.341Z', - updated_at: '2019-11-04T08:41:12.341Z', - created_by: 'bltmockdata42069007', - updated_by: 'bltmockdata42069007', - content_type: 'image/png', - file_size: '344825', - tags: [], - filename: 'Snap.PNG', - url: 'https://images.contentstack.io/v3/assets/bltmockdata42069007/bltmockdata42069007/5dbfe4280eebac1e86b541b3/Snap.PNG', - ACL: { - roles: [], - others: { - read: false, - create: false, - update: false, - delete: false, - sub_acl: { - read: false, - create: false, - update: false, - delete: false, - publish: false, - }, - }, - }, - is_dir: false, - _version: 1, - title: 'Snap.PNG', - }, - { - uid: 'dummyAssetId7', - created_at: '2019-11-04T08:41:12.341Z', - updated_at: '2019-11-04T08:41:12.341Z', - created_by: 'bltmockdata42069007', - updated_by: 'bltmockdata42069007', - content_type: 'image/png', - file_size: '344825', - tags: [], - filename: 'Snap.PNG', - url: 'https://images.contentstack.io/v3/assets/bltmockdata42069007/bltmockdata42069007/5dbfe4280eebac1e86b541b3/Snap.PNG', - ACL: { - roles: [], - others: { - read: false, - create: false, - update: false, - delete: false, - sub_acl: { - read: false, - create: false, - update: false, - delete: false, - publish: false, - }, - }, - }, - is_dir: false, - _version: 1, - title: 'Snap.PNG', - }, - { - uid: 'dummyAssetId8', - created_at: '2019-11-04T08:41:12.341Z', - updated_at: '2019-11-04T08:41:12.341Z', - created_by: 'bltmockdata42069007', - updated_by: 'bltmockdata42069007', - content_type: 'image/png', - file_size: '344825', - tags: [], - filename: 'Snap.PNG', - url: 'https://images.contentstack.io/v3/assets/bltmockdata42069007/bltmockdata42069007/5dbfe4280eebac1e86b541b3/Snap.PNG', - ACL: { - roles: [], - others: { - read: false, - create: false, - update: false, - delete: false, - sub_acl: { - read: false, - create: false, - update: false, - delete: false, - publish: false, - }, - }, - }, - is_dir: false, - _version: 1, - title: 'Snap.PNG', - }, - { - uid: 'dummyAssetId9', - created_at: '2019-11-04T08:41:12.341Z', - updated_at: '2019-11-04T08:41:12.341Z', - created_by: 'bltmockdata42069007', - updated_by: 'bltmockdata42069007', - content_type: 'image/png', - file_size: '344825', - tags: [], - filename: 'Snap.PNG', - url: 'https://images.contentstack.io/v3/assets/bltmockdata42069007/bltmockdata42069007/5dbfe4280eebac1e86b541b3/Snap.PNG', - ACL: { - roles: [], - others: { - read: false, - create: false, - update: false, - delete: false, - sub_acl: { - read: false, - create: false, - update: false, - delete: false, - publish: false, - }, - }, - }, - is_dir: false, - _version: 1, - title: 'Snap.PNG', - }, - { - uid: 'dummyAssetId10', - created_at: '2019-11-04T08:41:12.341Z', - updated_at: '2019-11-04T08:41:12.341Z', - created_by: 'bltmockdata42069007', - updated_by: 'bltmockdata42069007', - content_type: 'image/png', - file_size: '344825', - tags: [], - filename: 'Snap.PNG', - url: 'https://images.contentstack.io/v3/assets/bltmockdata42069007/bltmockdata42069007/5dbfe4280eebac1e86b541b3/Snap.PNG', - ACL: { - roles: [], - others: { - read: false, - create: false, - update: false, - delete: false, - sub_acl: { - read: false, - create: false, - update: false, - delete: false, - publish: false, - }, - }, - }, - is_dir: false, - _version: 1, - title: 'Snap.PNG', - }, - { - uid: 'dummyAssetId11', - created_at: '2019-11-04T08:41:12.341Z', - updated_at: '2019-11-04T08:41:12.341Z', - created_by: 'bltmockdata42069007', - updated_by: 'bltmockdata42069007', - content_type: 'image/png', - file_size: '344825', - tags: [], - filename: 'Snap.PNG', - url: 'https://images.contentstack.io/v3/assets/bltmockdata42069007/bltmockdata42069007/5dbfe4280eebac1e86b541b3/Snap.PNG', - ACL: { - roles: [], - others: { - read: false, - create: false, - update: false, - delete: false, - sub_acl: { - read: false, - create: false, - update: false, - delete: false, - publish: false, - }, - }, - }, - is_dir: false, - _version: 1, - title: 'Snap.PNG', - }, - { - uid: 'dummyAssetId1s2', - created_at: '2019-11-04T08:41:12.341Z', - updated_at: '2019-11-04T08:41:12.341Z', - created_by: 'bltmockdata42069007', - updated_by: 'bltmockdata42069007', - content_type: 'image/png', - file_size: '344825', - tags: [], - filename: 'Snap.PNG', - url: 'https://images.contentstack.io/v3/assets/bltmockdata42069007/bltmockdata42069007/5dbfe4280eebac1e86b541b3/Snap.PNG', - ACL: { - roles: [], - others: { - read: false, - create: false, - update: false, - delete: false, - sub_acl: { - read: false, - create: false, - update: false, - delete: false, - publish: false, - }, - }, - }, - is_dir: false, - _version: 1, - title: 'Snap.PNG', - }, - { - uid: 'dummyAssetId13', - created_at: '2019-11-04T08:41:12.341Z', - updated_at: '2019-11-04T08:41:12.341Z', - created_by: 'bltmockdata42069007', - updated_by: 'bltmockdata42069007', - content_type: 'image/png', - file_size: '344825', - tags: [], - filename: 'Snap.PNG', - url: 'https://images.contentstack.io/v3/assets/bltmockdata42069007/bltmockdata42069007/5dbfe4280eebac1e86b541b3/Snap.PNG', - ACL: { - roles: [], - others: { - read: false, - create: false, - update: false, - delete: false, - sub_acl: { - read: false, - create: false, - update: false, - delete: false, - publish: false, - }, - }, - }, - is_dir: false, - _version: 1, - title: 'Snap.PNG', - }, - { - uid: 'dummyAssetId14', - created_at: '2019-11-04T08:41:12.341Z', - updated_at: '2019-11-04T08:41:12.341Z', - created_by: 'bltmockdata42069007', - updated_by: 'bltmockdata42069007', - content_type: 'image/png', - file_size: '344825', - tags: [], - filename: 'Snap.PNG', - url: 'https://images.contentstack.io/v3/assets/bltmockdata42069007/bltmockdata42069007/5dbfe4280eebac1e86b541b3/Snap.PNG', - ACL: { - roles: [], - others: { - read: false, - create: false, - update: false, - delete: false, - sub_acl: { - read: false, - create: false, - update: false, - delete: false, - publish: false, - }, - }, - }, - is_dir: false, - _version: 1, - title: 'Snap.PNG', - }, - ], - count: 14, -}; diff --git a/packages/contentstack-bulk-publish/test/dummy/bulkentries1.js b/packages/contentstack-bulk-publish/test/dummy/bulkentries1.js deleted file mode 100644 index 343672da9f..0000000000 --- a/packages/contentstack-bulk-publish/test/dummy/bulkentries1.js +++ /dev/null @@ -1,117 +0,0 @@ -module.exports = { - items: [{ - uid: 'dummyEntryId', - title: 'my title', - publish_details: [{ - environment: 'dummyEnvironment', - locale: 'en-us', - version: 1, - }], - _version: 2, - }, { - uid: 'dummyEntryId2', - title: 'my title 2', - publish_details: [{ - environment: 'dummyEnvironment', - locale: 'en-us', - version: 1, - }], - _version: 2, - }, { - uid: 'dummyEntryId3', - title: 'my title 3', - publish_details: [{ - environment: 'dummyEnvironment', - locale: 'en-us', - version: 1, - }], - _version: 2, - }, { - uid: 'dummyEntryId4', - title: 'my title 4', - publish_details: [{ - environment: 'dummyEnvironment', - locale: 'en-us', - version: 1, - }], - _version: 2, - }, { - uid: 'dummyEntryId5', - title: 'my title 5', - publish_details: [{ - environment: 'dummyEnvironment', - locale: 'en-us', - version: 1, - }], - _version: 2, - }, { - uid: 'dummyEntryId6', - title: 'my title 6', - publish_details: [{ - environment: 'dummyEnvironment', - locale: 'en-us', - version: 1, - }], - _version: 2, - }, { - uid: 'dummyEntryId7', - title: 'my title 7', - publish_details: [{ - environment: 'dummyEnvironment', - locale: 'en-us', - version: 1, - }], - _version: 2, - }, { - uid: 'dummyEntryId8', - title: 'my title 8', - publish_details: [{ - environment: 'dummyEnvironment', - locale: 'en-us', - version: 1, - }], - _version: 2, - }, { - uid: 'dummyEntryId9', - title: 'my title 9', - publish_details: [{ - environment: 'dummyEnvironment', - locale: 'en-us', - version: 1, - }], - _version: 2, - }, { - uid: 'dummyEntryId10', - title: 'my title 10', - publish_details: [{ - environment: 'dummyEnvironment', - locale: 'en-us', - version: 1, - }], - _version: 2, - }, { - uid: 'dummyEntryId11', - title: 'my title 11', - publish_details: [{ - environment: 'dummyEnvironment', - locale: 'en-us', - version: 1, - }], - _version: 2, - }, { - uid: 'dummyEntryId12', - title: 'my title 12', - publish_details: [{ - environment: 'dummyEnvironment', - locale: 'en-us', - }], - }, { - uid: 'dummyEntryId13', - title: 'my title 13', - publish_details: [{ - environment: 'dummyEnv', - locale: 'en-us', - }], - }], - count: 13, -}; diff --git a/packages/contentstack-bulk-publish/test/dummy/bulkentries2.js b/packages/contentstack-bulk-publish/test/dummy/bulkentries2.js deleted file mode 100644 index d6cdc10a33..0000000000 --- a/packages/contentstack-bulk-publish/test/dummy/bulkentries2.js +++ /dev/null @@ -1,81 +0,0 @@ -module.exports = { - entries: [{ - uid: 'dummyEntryId', - title: 'my title', - publish_details: [{ - environment: 'dummyEnv', - locale: 'en-us', - }], - }, { - uid: 'dummyEntryId2', - title: 'my title 2', - publish_details: [{ - environment: 'dummyEnv', - locale: 'en-us', - }], - }, { - uid: 'dummyEntryId3', - title: 'my title 3', - publish_details: [{ - environment: 'dummyEnv', - locale: 'en-us', - }], - }, { - uid: 'dummyEntryId4', - title: 'my title 4', - publish_details: [{ - environment: 'dummyEnv', - locale: 'en-us', - }], - }, { - uid: 'dummyEntryId5', - title: 'my title 5', - publish_details: [{ - environment: 'dummyEnv', - locale: 'en-us', - }], - }, { - uid: 'dummyEntryId6', - title: 'my title 6', - publish_details: [{ - environment: 'dummyEnv', - locale: 'en-us', - }], - }, { - uid: 'dummyEntryId7', - title: 'my title 7', - publish_details: [{ - environment: 'dummyEnv', - locale: 'en-us', - }], - }, { - uid: 'dummyEntryId8', - title: 'my title 8', - publish_details: [{ - environment: 'dummyEnv', - locale: 'en-us', - }], - }, { - uid: 'dummyEntryId9', - title: 'my title 9', - publish_details: [{ - environment: 'dummyEnv', - locale: 'en-us', - }], - }, { - uid: 'dummyEntryId10', - title: 'my title 10', - publish_details: [{ - environment: 'dummyEnv', - locale: 'en-us', - }], - }, { - uid: 'dummyEntryId11', - title: 'my title 11', - publish_details: [{ - environment: 'dummyEnv', - locale: 'en-us', - }], - }], - count: 11, -}; diff --git a/packages/contentstack-bulk-publish/test/dummy/config.js b/packages/contentstack-bulk-publish/test/dummy/config.js deleted file mode 100644 index b00b182bbb..0000000000 --- a/packages/contentstack-bulk-publish/test/dummy/config.js +++ /dev/null @@ -1,76 +0,0 @@ -module.exports = { - apikey: 'tt', - contentTypes: ['test'], - apiEndPoint: 'https://api.localhost.com', - manageToken: 'dummyManageToken', - cdnEndPoint: 'https://cdn.localhost.com', - deliveryToken: 'dummydeliveryToken', - apiVersion: 3, - publish_unpublished_env: { - contentTypes: ['dummyContentType'], - sourceEnv: 'dummyEnvironment', - locale: 'en-us', - environments: ['dummyEnvironment'], - bulkPublish: true, - }, - publish_assets: { - environments: ['dummyEnvironment'], - folderUid: 'cs_root', // uid of the folder whose contents needs to be published, cs_root for every asset of the stack - bulkPublish: false, - }, - publish_entries: { - contentTypes: ['dummyContentType'], - locales: ['en-us'], - environments: ['dummyEnvironment'], - publishAllContentTypes: true, - bulkPublish: false, - }, - cross_env_publish: { - filter: { - environment: 'dummyEnvironment', // source environment - content_type_uid: 'dummyContentType', // contentType filters - locale: 'en-us', // locale filters - type: 'asset_published,entry_published', - }, - deliveryToken: 'dummyDeliveryToken', // deliveryToken of the source environment - destEnv: ['dummyEnvironment1'], // environment where it needs to be published - bulkPublish: true, - }, - publish_edits_on_env: { - contentTypes: ['dummyContentType'], - sourceEnv: 'dummyEnvironment', - environments: ['dummyEnvironment'], - locales: ['en-us'], - bulkPublish: false, - }, - nonlocalized_field_changes: { - sourceEnv: 'dummyEnvironment', // source Environment - contentTypes: ['helloworld'], - environments: ['dummyEnvironment'], // publishing Environments - bulkPublish: false, - }, - addFields: { - deleteFields: ['updated_by', 'created_by', 'created_at', 'updated_at', '_version', 'ACL'], - locales: ['en-us'], - contentTypes: ['helloworld'], - environments: ['dummyEnvironment'], - defaults: { - number: null, - boolean: false, - isodate: [], - file: null, - reference: [], - }, - bulkPublish: true, - }, - Unpublish: { - filter: { - environment: 'dummyEnvironment', // source environment - content_type_uid: 'dummyContentType', // contentType filters - locale: 'en-us', // locale filters - type: 'asset_published,entry_published', - }, - deliveryToken: 'dummyDeliveryToken', // deliveryToken of the environment - bulkUnpublish: true, - }, -}; diff --git a/packages/contentstack-bulk-publish/test/dummy/contentTypeResponse.js b/packages/contentstack-bulk-publish/test/dummy/contentTypeResponse.js deleted file mode 100644 index f1260e3763..0000000000 --- a/packages/contentstack-bulk-publish/test/dummy/contentTypeResponse.js +++ /dev/null @@ -1,1044 +0,0 @@ -module.exports = { - created_at: '1970-01-01T00:00:00.000Z', - updated_at: '1970-01-01T00:00:00.000Z', - title: 'helloworld', - uid: 'dummyContentType', - _version: 59, - inbuilt_class: false, - schema: [ - { - display_name: 'Title', - uid: 'title', - data_type: 'text', - mandatory: true, - unique: true, - field_metadata: { - _default: true, - version: 3, - }, - multiple: false, - non_localizable: false, - }, - { - display_name: 'URL', - uid: 'url', - data_type: 'text', - mandatory: true, - field_metadata: { - _default: true, - version: 3, - }, - multiple: false, - unique: false, - non_localizable: false, - }, - { - data_type: 'text', - display_name: 'Multi line textbox', - uid: 'multi_line', - field_metadata: { - description: '', - default_value: '', - multiline: true, - version: 3, - }, - format: '', - error_messages: { - format: '', - }, - non_localizable: true, - multiple: false, - mandatory: false, - unique: false, - }, - { - data_type: 'text', - display_name: 'Markdown', - uid: 'markdown', - field_metadata: { - description: '', - markdown: true, - version: 3, - }, - multiple: false, - mandatory: false, - unique: false, - non_localizable: false, - }, - { - data_type: 'group', - display_name: 'Group', - field_metadata: {}, - schema: [ - { - data_type: 'text', - display_name: 'Multi line textbox', - uid: 'multi_line', - field_metadata: { - description: '', - default_value: '233', - multiline: true, - version: 3, - }, - format: '', - error_messages: { - format: '', - }, - multiple: false, - mandatory: false, - unique: false, - non_localizable: false, - }, - { - data_type: 'text', - display_name: 'Single line textbox', - uid: 'single_line', - field_metadata: { - description: '', - default_value: '', - version: 3, - }, - format: '', - error_messages: { - format: '', - }, - multiple: false, - mandatory: false, - unique: false, - non_localizable: false, - }, - ], - uid: 'group', - multiple: false, - mandatory: false, - unique: false, - non_localizable: false, - }, - { - data_type: 'boolean', - display_name: 'Boolean', - uid: 'boolean', - field_metadata: { - description: '', - default_value: '', - }, - multiple: false, - mandatory: false, - unique: false, - non_localizable: false, - }, - { - data_type: 'text', - display_name: 'Single line textbox', - uid: 'single_line', - field_metadata: { - description: '', - default_value: 'Dinesh gowda', - version: 3, - }, - format: '', - error_messages: { - format: '', - }, - multiple: false, - mandatory: false, - unique: false, - non_localizable: false, - }, - { - data_type: 'number', - display_name: 'Numberggj', - uid: 'numberggj', - field_metadata: { - description: '', - default_value: '', - }, - multiple: false, - mandatory: false, - unique: false, - non_localizable: false, - }, - { - data_type: 'number', - display_name: 'Number', - uid: 'number', - field_metadata: { - description: '', - default_value: '', - }, - multiple: false, - mandatory: false, - unique: false, - non_localizable: false, - }, - { - data_type: 'text', - display_name: 'Rich text editor', - uid: 'rich_text_editor', - field_metadata: { - allow_rich_text: true, - description: '', - multiline: false, - rich_text_type: 'advanced', - options: [], - version: 3, - }, - multiple: false, - mandatory: false, - unique: false, - non_localizable: false, - }, - { - data_type: 'isodate', - display_name: 'Date', - uid: 'date', - startDate: null, - endDate: null, - field_metadata: { - description: '', - default_value: '', - }, - multiple: false, - mandatory: false, - unique: false, - non_localizable: false, - }, - { - data_type: 'group', - display_name: 'Group', - field_metadata: {}, - schema: [ - { - data_type: 'link', - display_name: 'Link', - uid: 'link', - field_metadata: { - description: '', - default_value: { - title: 'j', - url: 'jjj', - }, - }, - multiple: false, - mandatory: false, - unique: false, - non_localizable: false, - }, - ], - uid: 'hhhhgroup', - multiple: false, - mandatory: false, - unique: false, - non_localizable: false, - }, - { - data_type: 'text', - display_name: 'azhar', - uid: 'azhar', - field_metadata: { - description: '', - markdown: true, - version: 3, - }, - multiple: false, - mandatory: false, - unique: false, - non_localizable: false, - }, - { - data_type: 'text', - display_name: 'dinesh', - uid: 'dinesh', - field_metadata: { - description: '', - default_value: 'this is us', - multiline: true, - version: 3, - }, - format: '', - error_messages: { - format: '', - }, - multiple: false, - mandatory: false, - unique: false, - non_localizable: true, - }, - { - data_type: 'group', - display_name: 'Group', - field_metadata: {}, - schema: [ - { - data_type: 'text', - display_name: 'Single line textbox', - uid: 'single_line', - field_metadata: { - description: '', - default_value: '', - version: 3, - }, - format: '', - error_messages: { - format: '', - }, - multiple: false, - mandatory: false, - unique: false, - non_localizable: false, - }, - { - data_type: 'group', - display_name: 'Group', - field_metadata: {}, - schema: [ - { - data_type: 'text', - display_name: 'Rich text editor', - uid: 'rich_text_editor', - field_metadata: { - allow_rich_text: true, - description: '', - multiline: false, - rich_text_type: 'advanced', - options: [], - version: 3, - }, - non_localizable: true, - multiple: false, - mandatory: false, - unique: false, - }, - ], - uid: 'group', - multiple: false, - mandatory: false, - unique: false, - non_localizable: false, - }, - { - data_type: 'group', - display_name: 'Group', - field_metadata: {}, - schema: [ - { - data_type: 'group', - display_name: 'Group', - field_metadata: {}, - schema: [ - { - data_type: 'text', - display_name: 'Multi line textbox', - uid: 'multi_line', - field_metadata: { - description: '', - default_value: '', - multiline: true, - version: 3, - }, - format: '', - error_messages: { - format: '', - }, - non_localizable: true, - multiple: false, - mandatory: false, - unique: false, - }, - ], - uid: 'groupj', - multiple: false, - mandatory: false, - unique: false, - non_localizable: false, - }, - ], - uid: 'hgroup', - multiple: false, - mandatory: false, - unique: false, - non_localizable: false, - }, - ], - uid: 'groupjj', - multiple: false, - mandatory: false, - unique: false, - non_localizable: false, - }, - { - data_type: 'text', - display_name: 'dinya', - uid: 'dinya', - field_metadata: { - description: '', - default_value: 'ewdfefe', - multiline: true, - version: 3, - }, - format: '', - error_messages: { - format: '', - }, - multiple: false, - mandatory: false, - unique: false, - non_localizable: false, - }, - { - data_type: 'blocks', - display_name: 'Modular Blocks', - blocks: [ - { - title: 'modular1', - uid: 'modular1', - schema: [ - { - data_type: 'text', - display_name: 'please', - uid: 'please', - field_metadata: { - description: '', - default_value: 'go corona', - multiline: true, - version: 3, - }, - format: '', - error_messages: { - format: '', - }, - non_localizable: false, - multiple: false, - mandatory: false, - unique: false, - }, - { - data_type: 'text', - display_name: 'Markdown', - uid: 'markdown', - field_metadata: { - description: '', - markdown: true, - version: 3, - }, - non_localizable: false, - multiple: true, - mandatory: false, - unique: false, - }, - ], - }, - { - title: 'modular2', - uid: 'modular2', - schema: [ - { - data_type: 'text', - display_name: 'dinesh_gowda', - uid: 'dinesh_gowda', - field_metadata: { - allow_rich_text: true, - description: '', - multiline: false, - rich_text_type: 'advanced', - options: [], - version: 3, - }, - non_localizable: false, - multiple: true, - mandatory: false, - unique: false, - }, - { - data_type: 'text', - display_name: 'Multi line textbox', - uid: 'multi_line', - field_metadata: { - description: '', - default_value: '', - multiline: true, - version: 3, - }, - format: '', - error_messages: { - format: '', - }, - non_localizable: false, - multiple: false, - mandatory: false, - unique: false, - }, - ], - }, - { - title: 'dinesh', - uid: 'dinesh', - schema: [ - { - data_type: 'text', - display_name: 'Single line textbox', - uid: 'single_line', - field_metadata: { - description: '', - default_value: '', - version: 3, - }, - format: '', - error_messages: { - format: '', - }, - non_localizable: false, - multiple: false, - mandatory: false, - unique: false, - }, - { - data_type: 'text', - display_name: 'Rich text editor', - uid: 'rich_text_editor', - field_metadata: { - allow_rich_text: true, - description: '', - multiline: false, - rich_text_type: 'advanced', - options: [], - version: 3, - }, - non_localizable: false, - multiple: false, - mandatory: false, - unique: false, - }, - ], - }, - { - title: 'SHIBHA', - uid: 'shibha', - schema: [ - { - data_type: 'text', - display_name: 'Single line textbox', - uid: 'single_line', - field_metadata: { - description: '', - default_value: '', - version: 3, - }, - format: '', - error_messages: { - format: '', - }, - non_localizable: false, - multiple: false, - mandatory: false, - unique: false, - }, - { - data_type: 'group', - display_name: 'Group', - field_metadata: {}, - schema: [ - { - data_type: 'text', - display_name: 'Rich text editor', - uid: 'rich_text_editor', - field_metadata: { - allow_rich_text: true, - description: '', - multiline: false, - rich_text_type: 'advanced', - options: [], - version: 3, - }, - non_localizable: false, - multiple: false, - mandatory: false, - unique: false, - }, - ], - uid: 'group', - non_localizable: false, - multiple: true, - mandatory: false, - unique: false, - }, - { - data_type: 'text', - display_name: 'Multi line textbox', - uid: 'multi_line', - field_metadata: { - description: '', - default_value: '', - multiline: true, - version: 3, - }, - format: '', - error_messages: { - format: '', - }, - non_localizable: false, - multiple: false, - mandatory: false, - unique: false, - }, - { - data_type: 'text', - display_name: 'Rich text editor', - uid: 'rich_text_editor', - field_metadata: { - allow_rich_text: true, - description: '', - multiline: false, - rich_text_type: 'advanced', - options: [], - version: 3, - }, - non_localizable: false, - multiple: false, - mandatory: false, - unique: false, - }, - ], - }, - ], - multiple: true, - uid: 'modular_blocks', - field_metadata: {}, - mandatory: false, - unique: false, - non_localizable: true, - }, - { - data_type: 'blocks', - display_name: 'checks', - blocks: [ - { - title: 'd1', - uid: 'd1', - schema: [ - { - data_type: 'blocks', - display_name: 'Modular Blocks', - blocks: [ - { - title: 'asd', - uid: 'asd', - schema: [ - { - data_type: 'text', - display_name: 'Single line textbox', - uid: 'single_line', - field_metadata: { - description: '', - default_value: 'qdedcew', - version: 3, - }, - format: '', - error_messages: { - format: '', - }, - non_localizable: false, - multiple: true, - mandatory: false, - unique: false, - }, - { - data_type: 'text', - display_name: 'Markdown', - uid: 'markdown', - field_metadata: { - description: '', - markdown: true, - version: 3, - }, - non_localizable: false, - multiple: false, - mandatory: false, - unique: false, - }, - ], - }, - ], - multiple: true, - uid: 'modular_blocks', - field_metadata: {}, - non_localizable: false, - mandatory: false, - unique: false, - }, - ], - }, - ], - multiple: true, - uid: 'dinu', - field_metadata: {}, - mandatory: false, - unique: false, - non_localizable: true, - }, - { - data_type: 'group', - display_name: 'sinehs', - field_metadata: {}, - schema: [ - { - data_type: 'text', - display_name: 'Markdown', - uid: 'markdown', - field_metadata: { - description: '', - markdown: true, - version: 3, - }, - multiple: false, - mandatory: false, - unique: false, - non_localizable: false, - }, - { - data_type: 'text', - display_name: 'Rich text editor', - uid: 'rich_text_editor', - field_metadata: { - allow_rich_text: true, - description: '', - multiline: false, - rich_text_type: 'advanced', - options: [], - version: 3, - }, - multiple: true, - mandatory: false, - unique: false, - non_localizable: false, - }, - ], - uid: 'sinehs', - multiple: false, - mandatory: false, - unique: false, - non_localizable: false, - }, - { - data_type: 'global_field', - display_name: 'edw', - reference_to: 'dineu', - field_metadata: { - description: '', - }, - uid: 'edw', - multiple: false, - mandatory: false, - unique: false, - non_localizable: false, - schema: [ - { - data_type: 'text', - display_name: 'Single line textbox', - uid: 'single_line', - field_metadata: { - description: '', - default_value: '', - version: 3, - }, - format: '', - error_messages: { - format: '', - }, - multiple: false, - mandatory: false, - unique: false, - non_localizable: true, - indexed: false, - inbuilt_model: false, - }, - { - data_type: 'text', - display_name: 'Multi line textbox', - uid: 'multi_line_din', - field_metadata: { - description: '', - default_value: '', - multiline: true, - version: 3, - }, - format: '', - error_messages: { - format: '', - }, - multiple: false, - mandatory: false, - unique: false, - non_localizable: true, - indexed: false, - inbuilt_model: false, - }, - ], - }, - { - data_type: 'group', - display_name: 'Group', - field_metadata: {}, - schema: [ - { - data_type: 'text', - display_name: 'Multi line textbox', - uid: 'multi_line', - field_metadata: { - description: '', - default_value: 'working test', - multiline: true, - version: 3, - }, - format: '', - error_messages: { - format: '', - }, - multiple: false, - mandatory: false, - unique: false, - non_localizable: false, - }, - ], - uid: 'group_tes', - multiple: false, - mandatory: false, - unique: false, - non_localizable: false, - }, - { - data_type: 'blocks', - display_name: 'tetsyp', - blocks: [ - { - title: 'testing', - uid: 'testing', - schema: [ - { - data_type: 'text', - display_name: 'Multi line textbox', - uid: 'multi_line', - field_metadata: { - description: '', - default_value: '', - multiline: true, - version: 3, - }, - format: '', - error_messages: { - format: '', - }, - non_localizable: false, - multiple: false, - mandatory: false, - unique: false, - }, - { - data_type: 'text', - display_name: 'Single line textbox', - uid: 'single_line', - field_metadata: { - description: '', - default_value: '', - version: 3, - }, - format: '', - error_messages: { - format: '', - }, - non_localizable: false, - multiple: false, - mandatory: false, - unique: false, - }, - ], - }, - ], - multiple: true, - uid: 'tetsyp', - field_metadata: {}, - mandatory: false, - unique: false, - non_localizable: false, - }, - { - data_type: 'group', - display_name: 'Group_din', - field_metadata: {}, - schema: [ - { - data_type: 'text', - display_name: 'Rich text editorwde', - uid: 'rich_text_editorwde', - field_metadata: { - allow_rich_text: true, - description: '', - multiline: false, - rich_text_type: 'advanced', - options: [], - version: 3, - }, - non_localizable: false, - multiple: false, - mandatory: false, - unique: false, - }, - ], - uid: 'group_din', - multiple: true, - non_localizable: false, - mandatory: false, - unique: false, - }, - ], - last_activity: { - environments: [ - { - uid: 'bltmockdata42069007', - details: [ - { - locale: 'en-us', - time: '1970-01-01T00:00:00.000Z', - }, - ], - }, - { - uid: 'bltmockdata42069007', - details: [ - { - locale: 'en-us', - time: '1970-01-01T00:00:00.000Z', - }, - ], - }, - { - uid: 'bltmockdata42069007', - details: [ - { - locale: 'es', - time: '1970-01-01T00:00:00.000Z', - }, - { - locale: 'fr-fr', - time: '1970-01-01T00:00:00.000Z', - }, - { - locale: 'en-us', - time: '1970-01-01T00:00:00.000Z', - }, - { - locale: 'ar-eg', - time: '1970-01-01T00:00:00.000Z', - }, - ], - }, - { - uid: 'bltmockdata42069007', - details: [ - { - locale: 'en-us', - time: '1970-01-01T00:00:00.000Z', - }, - { - locale: 'es', - time: '1970-01-01T00:00:00.000Z', - }, - { - locale: 'ar-eg', - time: '1970-01-01T00:00:00.000Z', - }, - { - locale: 'fr-fr', - time: '1970-01-01T00:00:00.000Z', - }, - ], - }, - ], - }, - maintain_revisions: true, - description: '', - DEFAULT_ACL: { - others: { - read: false, - create: false, - }, - users: [ - { - uid: 'bltmockdata42069007', - read: true, - sub_acl: { - read: true, - }, - }, - ], - }, - SYS_ACL: { - roles: [ - { - uid: 'bltmockdata42069007', - read: true, - sub_acl: { - create: true, - read: true, - update: true, - delete: true, - publish: true, - }, - update: true, - delete: true, - }, - { - uid: 'bltmockdata42069007', - read: true, - sub_acl: { - create: true, - read: true, - update: true, - delete: true, - publish: true, - }, - }, - { - uid: 'bltmockdata42069007', - read: true, - sub_acl: { - create: true, - read: true, - update: true, - delete: true, - publish: true, - }, - update: true, - delete: true, - }, - ], - others: { - read: false, - create: false, - update: false, - delete: false, - sub_acl: { - read: false, - create: false, - update: false, - delete: false, - publish: false, - }, - }, - }, - options: { - is_page: true, - singleton: true, - title: 'title', - sub_title: [], - }, - abilities: { - get_one_object: true, - get_all_objects: true, - create_object: true, - update_object: true, - delete_object: true, - delete_all_objects: true, - }, - extension_uids: [], -}; diff --git a/packages/contentstack-bulk-publish/test/dummy/entriesResponse.js b/packages/contentstack-bulk-publish/test/dummy/entriesResponse.js deleted file mode 100644 index e8ddeea514..0000000000 --- a/packages/contentstack-bulk-publish/test/dummy/entriesResponse.js +++ /dev/null @@ -1,54 +0,0 @@ -module.exports = { - entries: [ - { - title: 'dce', - url: '/dce', - single_line: 'dcd', - multi_line: '', - markdown: 'dcfd', - markdownsssss: [], - group: { - multi_line: 'dcd', - markdown: [], - rich_text_editor: [], - single_line: '', - group: { - rich_text_editor: '', - checking: [], - groupffff: { - multi_line: '', - group: { - single_linede: '', - }, - }, - }, - }, - drich_text_editor_1997: '', - jjjj: { - single_line: '', - multi_line_din: '', - }, - modular_blocks: [], - tags: [], - locale: 'en-us', - uid: 'dummyEntryId', - created_by: 'bltmockdata42069007', - updated_by: 'bltmockdata42069007', - created_at: '1970-01-01T00:00:00.000Z', - updated_at: '1970-01-01T00:00:00.000Z', - ACL: {}, - _version: 10, - _in_progress: false, - publish_details: [ - { - environment: 'bltmockdata42069007', - locale: 'en-us', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 7, - }, - ], - }], - - count: 1, -}; diff --git a/packages/contentstack-bulk-publish/test/dummy/entry.js b/packages/contentstack-bulk-publish/test/dummy/entry.js deleted file mode 100644 index ddcc6d700f..0000000000 --- a/packages/contentstack-bulk-publish/test/dummy/entry.js +++ /dev/null @@ -1,171 +0,0 @@ -module.exports = { - entry: { - title: 'teststs', - url: 'test', - multi_line: 'testedewd its 10 53 feerde', - tags: [], - locale: 'ar-eg', - uid: 'dummyEntryId', - created_by: 'bltmockdata42069007', - updated_by: 'bltmockdata42069007', - created_at: '1970-01-01T00:00:00.000Z', - updated_at: '1970-01-01T00:00:00.000Z', - ACL: {}, - _version: 78, - _in_progress: false, - markdown: '', - group: { - multi_line: '233', - single_line: '', - }, - number: 123, - boolean: false, - date: null, - hhhhgroup: { - link: { - title: 'j', - href: 'undefined', - }, - }, - numberggj: null, - rich_text_editor: '', - single_line: 'Dinesh gowda', - azhar: '', - dinesh: 'this is usweffewfe dcdwcedass', - groupjj: { - single_line: '', - group: { - rich_text_editor: '

jlllllllllllllllllllllllllllllllllllll

', - }, - hgroup: { - groupj: { - multi_line: 'sdcedwcewc', - }, - }, - }, - dinya: 'ewdfefe', - modular_blocks: [ - { - modular1: { - please: 'go corona', - markdown: [ - 'aajtak', - 'aajtka 2', - ], - }, - }, - { - modular1: { - please: 'go corona', - markdown: [ - 'wdefewcefe', - ], - }, - }, - ], - dinu: [], - sinehs: { - markdown: '', - rich_text_editor: [], - }, - edw: { - multi_line_din: 'emergency', - single_line: 'lockdown', - }, - group_tes: { - multi_line: 'working test', - }, - tetsyp: [ - { - testing: { - multi_line: 'edee', - single_line: 'dcd', - }, - }, - ], - group_din: [ - { - rich_text_editorwde: '

wdcedcre

', - }, - ], - publish_details: [ - { - environment: 'bltmockdata42069007', - locale: 'en-us', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 78, - }, - { - environment: 'bltmockdata42069007', - locale: 'ar-eg', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 17, - }, - { - environment: 'bltmockdata42069007', - locale: 'fr-fr', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 6, - }, - { - environment: 'bltmockdata42069007', - locale: 'es', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 5, - }, - { - environment: 'bltmockdata42069007', - locale: 'fr-fr', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 2, - }, - { - environment: 'bltmockdata42069007', - locale: 'es', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 2, - }, - { - environment: 'bltmockdata42069007', - locale: 'ar-eg', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 12, - }, - { - environment: 'bltmockdata42069007', - locale: 'en-us', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 63, - }, - { - environment: 'bltmockdata42069007', - locale: 'en-us', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 62, - }, - { - environment: 'bltmockdata42069007', - locale: 'en-us', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 62, - }, - { - environment: 'bltmockdata42069007', - locale: 'en-us', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 62, - }, - ], - }, -}; diff --git a/packages/contentstack-bulk-publish/test/dummy/entryUpdated.js b/packages/contentstack-bulk-publish/test/dummy/entryUpdated.js deleted file mode 100644 index 74755bf1f4..0000000000 --- a/packages/contentstack-bulk-publish/test/dummy/entryUpdated.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - notice: 'The requested action has been performed', -}; diff --git a/packages/contentstack-bulk-publish/test/dummy/entrypublished.js b/packages/contentstack-bulk-publish/test/dummy/entrypublished.js deleted file mode 100644 index 7eac687a4c..0000000000 --- a/packages/contentstack-bulk-publish/test/dummy/entrypublished.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - notice: 'The requested action has been performed.', -}; diff --git a/packages/contentstack-bulk-publish/test/dummy/environment.js b/packages/contentstack-bulk-publish/test/dummy/environment.js deleted file mode 100644 index 3da3aebebf..0000000000 --- a/packages/contentstack-bulk-publish/test/dummy/environment.js +++ /dev/null @@ -1,16 +0,0 @@ -module.exports = { - name: 'production', - servers: [ - { - name: 'default', - }, - ], - urls: [ - { - locale: 'en-us', - url: 'http://example.com/', - }, - ], - deploy_content: 'true', - uid: 'dummyEnvironment', -}; diff --git a/packages/contentstack-bulk-publish/test/dummy/environments.js b/packages/contentstack-bulk-publish/test/dummy/environments.js deleted file mode 100644 index 79b22ee3b4..0000000000 --- a/packages/contentstack-bulk-publish/test/dummy/environments.js +++ /dev/null @@ -1,33 +0,0 @@ -module.exports = { - items: [{ - name: 'production', - servers: [ - { - name: 'default', - }, - ], - urls: [ - { - locale: 'en-us', - url: 'http://example.com/', - }, - ], - deploy_content: 'true', - uid: 'production', - }, { - name: 'dummyEnvironment', - servers: [ - { - name: 'default', - }, - ], - urls: [ - { - locale: 'en-us', - url: 'http://example.com/', - }, - ], - deploy_content: 'true', - uid: 'dummyEnvironment', - }], -}; diff --git a/packages/contentstack-bulk-publish/test/dummy/languages.js b/packages/contentstack-bulk-publish/test/dummy/languages.js deleted file mode 100644 index 5a7f63eb35..0000000000 --- a/packages/contentstack-bulk-publish/test/dummy/languages.js +++ /dev/null @@ -1,52 +0,0 @@ -module.exports = { - items: [ - { - code: 'es', - fallback_locale: 'en-us', - uid: 'bltmockdata42069007', - created_by: 'bltmockdata42069007', - updated_by: 'bltmockdata42069007', - created_at: '1970-01-01T00:00:00.000Z', - updated_at: '1970-01-01T00:00:00.000Z', - name: 'Spanish (Latin America)', - ACL: [], - _version: 1, - }, - { - code: 'ar-eg', - fallback_locale: 'en-us', - uid: 'bltmockdata42069007', - created_by: 'bltmockdata42069007', - updated_by: 'bltmockdata42069007', - created_at: '1970-01-01T00:00:00.000Z', - updated_at: '1970-01-01T00:00:00.000Z', - name: 'Arabic - Egypt', - ACL: [], - _version: 1, - }, - { - code: 'fr-fr', - name: 'French - France', - uid: 'bltmockdata42069007', - created_by: 'bltmockdata42069007', - updated_by: 'bltmockdata42069007', - created_at: '2019-11-04T08:41:14.237Z', - updated_at: '2019-11-04T08:41:14.237Z', - fallback_locale: 'en-us', - ACL: [], - _version: 1, - }, - { - code: 'en-us', - fallback_locale: null, - uid: 'bltmockdata42069007', - created_by: 'bltmockdata42069007', - updated_by: 'bltmockdata42069007', - created_at: '2019-11-04T07:54:05.850Z', - updated_at: '2019-11-04T07:54:05.850Z', - name: 'English - United States', - ACL: [], - _version: 1, - }, - ], -}; diff --git a/packages/contentstack-bulk-publish/test/dummy/masterEntry.js b/packages/contentstack-bulk-publish/test/dummy/masterEntry.js deleted file mode 100644 index 39daeb91ca..0000000000 --- a/packages/contentstack-bulk-publish/test/dummy/masterEntry.js +++ /dev/null @@ -1,172 +0,0 @@ -module.exports = { - entries: [{ - title: 'teststs', - url: 'test', - multi_line: 'testedewd its 10 53 here feerde', - tags: [], - locale: 'en-us', - uid: 'dummyEntryId', - created_by: 'bltmockdata42069007', - updated_by: 'bltmockdata42069007', - created_at: '1970-01-01T00:00:00.000Z', - updated_at: '1970-01-01T00:00:00.000Z', - ACL: {}, - _version: 78, - _in_progress: false, - markdown: '', - group: { - multi_line: '233', - single_line: '990', - }, - number: 123, - boolean: false, - date: null, - hhhhgroup: { - link: { - title: 'j', - href: 'undefined', - }, - }, - numberggj: null, - rich_text_editor: '', - single_line: 'Dinesh gowda', - azhar: '', - dinesh: 'this is usweffewfe dcdwcedass', - groupjj: { - single_line: '', - group: { - rich_text_editor: '

jlllllllllllllllllllllllllllllllllllll

', - }, - hgroup: { - groupj: { - multi_line: 'sdcedwcewc', - }, - }, - }, - dinya: 'ewdfefe', - modular_blocks: [ - { - modular1: { - please: 'go corona', - markdown: [ - 'aajtak', - 'aajtka 2', - ], - }, - }, - { - modular1: { - please: 'go corona', - markdown: [ - 'wdefewcefe', - ], - }, - }, - ], - dinu: [], - sinehs: { - markdown: '', - rich_text_editor: [], - }, - edw: { - multi_line_din: 'emergency', - single_line: 'lockdown', - }, - group_tes: { - multi_line: 'working test', - }, - tetsyp: [ - { - testing: { - multi_line: 'edee', - single_line: 'dcd', - }, - }, - ], - group_din: [ - { - rich_text_editorwde: '

wdcedcre

', - }, - ], - publish_details: [ - { - environment: 'bltmockdata42069007', - locale: 'en-us', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 78, - }, - { - environment: 'bltmockdata42069007', - locale: 'ar-eg', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 17, - }, - { - environment: 'bltmockdata42069007', - locale: 'fr-fr', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 6, - }, - { - environment: 'bltmockdata42069007', - locale: 'es', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 5, - }, - { - environment: 'bltmockdata42069007', - locale: 'fr-fr', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 2, - }, - { - environment: 'bltmockdata42069007', - locale: 'es', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 2, - }, - { - environment: 'bltmockdata42069007', - locale: 'ar-eg', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 12, - }, - { - environment: 'bltmockdata42069007', - locale: 'en-us', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 63, - }, - { - environment: 'bltmockdata42069007', - locale: 'en-us', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 62, - }, - { - environment: 'bltmockdata42069007', - locale: 'en-us', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 62, - }, - { - environment: 'bltmockdata42069007', - locale: 'en-us', - time: '1970-01-01T00:00:00.000Z', - user: 'bltmockdata42069007', - version: 62, - }, - ], - }], - count: 1, -}; diff --git a/packages/contentstack-bulk-publish/test/dummy/paginatedEntry1.js b/packages/contentstack-bulk-publish/test/dummy/paginatedEntry1.js deleted file mode 100644 index b856a77402..0000000000 --- a/packages/contentstack-bulk-publish/test/dummy/paginatedEntry1.js +++ /dev/null @@ -1,11 +0,0 @@ -module.exports = { - entries: [{ - title: 'dummytitle', - uid: 'dummyEntry', - publish_details: [{ - environment: 'dummyEnvironment', - locale: 'en-us', - }], - }], - count: 2, -}; diff --git a/packages/contentstack-bulk-publish/test/dummy/paginatedEntry2.js b/packages/contentstack-bulk-publish/test/dummy/paginatedEntry2.js deleted file mode 100644 index b856a77402..0000000000 --- a/packages/contentstack-bulk-publish/test/dummy/paginatedEntry2.js +++ /dev/null @@ -1,11 +0,0 @@ -module.exports = { - entries: [{ - title: 'dummytitle', - uid: 'dummyEntry', - publish_details: [{ - environment: 'dummyEnvironment', - locale: 'en-us', - }], - }], - count: 2, -}; diff --git a/packages/contentstack-bulk-publish/test/dummy/sdk/stack.js b/packages/contentstack-bulk-publish/test/dummy/sdk/stack.js deleted file mode 100644 index f675d1682c..0000000000 --- a/packages/contentstack-bulk-publish/test/dummy/sdk/stack.js +++ /dev/null @@ -1,22 +0,0 @@ -module.exports = { - "urlPath": '/stacks', - "api_key": 'bltmockdata42069007', - "stackHeaders": { api_key: 'bltmockdata42069007' }, - // update: [Function], - // delete: [Function], - // fetch: [Function], - // contentType: [Function], - // locale: [Function], - // asset: [Function], - // globalField: [Function], - // environment: [Function], - // deliveryToken: [Function] - // users: [Function], - // transferOwnership: [Function], - // settings: [Function], - // resetSettings: [Function], - // addSettings: [Function], - // share: [Function], - // unShare: [Function], - // role: [Function] -} \ No newline at end of file diff --git a/packages/contentstack-bulk-publish/test/dummy/stackResponse.js b/packages/contentstack-bulk-publish/test/dummy/stackResponse.js deleted file mode 100644 index 4e6b4022c6..0000000000 --- a/packages/contentstack-bulk-publish/test/dummy/stackResponse.js +++ /dev/null @@ -1,60 +0,0 @@ -module.exports = { - stack: { - created_at: '2019-11-04T07:54:05.013Z', - updated_at: '2019-11-04T07:54:05.877Z', - uid: 'bltmockdata42069007', - name: 'cross-publishing-test', - description: 'stack for cross environment publishing test', - org_uid: 'bltmockdata42069007', - api_key: 'bltmockdata42069007', - master_locale: 'en-us', - is_asset_download_public: true, - owner_uid: 'bltmockdata42069007', - user_uids: [ - 'bltmockdata42069007', - ], - settings: { - version: '2019-04-30', - rte_version: 3, - webhook_enabled: true, - language_fallback: false, - }, - master_key: 'bltmockdata42069007', - SYS_ACL: { - others: { - invite: false, - sub_acl: { - create: false, - read: false, - update: false, - delete: false, - }, - }, - roles: [ - { - uid: 'bltmockdata42069007', - name: 'Developer', - invite: true, - sub_acl: { - create: true, - read: true, - update: true, - delete: true, - }, - }, - { - uid: 'bltmockdata42069007', - name: 'Admin', - invite: true, - sub_acl: { - create: true, - read: true, - update: true, - delete: true, - }, - }, - ], - }, - global_search: true, - }, -}; diff --git a/packages/contentstack-bulk-publish/test/dummy/unpublish_response.js b/packages/contentstack-bulk-publish/test/dummy/unpublish_response.js deleted file mode 100644 index dc95414012..0000000000 --- a/packages/contentstack-bulk-publish/test/dummy/unpublish_response.js +++ /dev/null @@ -1,232 +0,0 @@ -module.exports = { - items: [{ - content_type_uid: 'sys_assets', - event_at: '1970-01-01T00:00:00.000Z', - type: 'asset_published', - data: { - uid: 'dummyAssetId', - _version: 1, - }, - }, { - content_type_uid: 'sys_assets', - event_at: '1970-01-01T00:00:00.000Z', - type: 'asset_published', - data: { - uid: 'dummyAssetId2', - _version: 1, - }, - }, { - content_type_uid: 'dummyContentType', - event_at: '1970-01-01T00:00:00.000Z', - type: 'entry_published', - data: { - uid: 'dummyEntryId', - _version: 1, - publish_details: [{ - version: '1', - }], - }, - }, { - content_type_uid: 'dummyContentType', - event_at: '1970-01-01T00:00:00.000Z', - type: 'entry_published', - data: { - uid: 'dummyEntryId2', - _version: 1, - publish_details: [{ - version: '1', - }], - }, - }, { - content_type_uid: 'sys_assets', - event_at: '1970-01-01T00:00:00.000Z', - type: 'asset_published', - data: { - uid: 'dummyAssetId3', - _version: 1, - }, - }, { - content_type_uid: 'sys_assets', - event_at: '1970-01-01T00:00:00.000Z', - type: 'asset_published', - data: { - uid: 'dummyAssetId4', - _version: 1, - }, - }, { - content_type_uid: 'sys_assets', - event_at: '1970-01-01T00:00:00.000Z', - type: 'asset_published', - data: { - uid: 'dummyAssetId5', - _version: 1, - }, - }, { - content_type_uid: 'sys_assets', - event_at: '1970-01-01T00:00:00.000Z', - type: 'asset_published', - data: { - uid: 'dummyAssetId6', - _version: 1, - }, - }, { - content_type_uid: 'sys_assets', - event_at: '1970-01-01T00:00:00.000Z', - type: 'asset_published', - data: { - uid: 'dummyAssetId7', - _version: 1, - }, - }, { - content_type_uid: 'sys_assets', - event_at: '1970-01-01T00:00:00.000Z', - type: 'asset_published', - data: { - uid: 'dummyAssetId8', - _version: 1, - }, - }, { - content_type_uid: 'sys_assets', - event_at: '1970-01-01T00:00:00.000Z', - type: 'asset_published', - data: { - uid: 'dummyAssetId9', - _version: 1, - }, - }, { - content_type_uid: 'sys_assets', - event_at: '1970-01-01T00:00:00.000Z', - type: 'asset_published', - data: { - uid: 'dummyAssetId10', - _version: 1, - }, - }, { - content_type_uid: 'sys_assets', - event_at: '1970-01-01T00:00:00.000Z', - type: 'asset_published', - data: { - uid: 'dummyAssetId11', - _version: 1, - }, - }, { - content_type_uid: 'sys_assets', - event_at: '1970-01-01T00:00:00.000Z', - type: 'asset_published', - data: { - uid: 'dummyAssetId12', - _version: 1, - }, - }, { - content_type_uid: 'dummyContentType', - event_at: '1970-01-01T00:00:00.000Z', - type: 'entry_published', - data: { - uid: 'dummyEntryId3', - _version: 1, - publish_details: [{ - version: '1', - }], - }, - }, { - content_type_uid: 'dummyContentType', - event_at: '1970-01-01T00:00:00.000Z', - type: 'entry_published', - data: { - uid: 'dummyEntryId4', - _version: 1, - publish_details: [{ - version: '1', - }], - }, - }, { - content_type_uid: 'dummyContentType', - event_at: '1970-01-01T00:00:00.000Z', - type: 'entry_published', - data: { - uid: 'dummyEntryId5', - _version: 1, - publish_details: [{ - version: '1', - }], - }, - }, { - content_type_uid: 'dummyContentType', - event_at: '1970-01-01T00:00:00.000Z', - type: 'entry_published', - data: { - uid: 'dummyEntryId6', - _version: 1, - publish_details: [{ - version: '1', - }], - }, - }, { - content_type_uid: 'dummyContentType', - event_at: '1970-01-01T00:00:00.000Z', - type: 'entry_published', - data: { - uid: 'dummyEntryId7', - _version: 1, - publish_details: [{ - version: '1', - }], - }, - }, { - content_type_uid: 'dummyContentType', - event_at: '1970-01-01T00:00:00.000Z', - type: 'entry_published', - data: { - uid: 'dummyEntryId8', - _version: 1, - publish_details: [{ - version: '1', - }], - }, - }, { - content_type_uid: 'dummyContentType', - event_at: '1970-01-01T00:00:00.000Z', - type: 'entry_published', - data: { - uid: 'dummyEntryId9', - _version: 1, - publish_details: [{ - version: '1', - }], - }, - }, { - content_type_uid: 'dummyContentType', - event_at: '1970-01-01T00:00:00.000Z', - type: 'entry_published', - data: { - uid: 'dummyEntryId10', - _version: 1, - publish_details: [{ - version: '1', - }], - }, - }, { - content_type_uid: 'dummyContentType', - event_at: '1970-01-01T00:00:00.000Z', - type: 'entry_published', - data: { - uid: 'dummyEntryId11', - _version: 1, - publish_details: [{ - version: '1', - }], - }, - }, { - content_type_uid: 'dummyContentType', - event_at: '1970-01-01T00:00:00.000Z', - type: 'entry_published', - data: { - uid: 'dummyEntryId12', - _version: 1, - publish_details: [{ - version: '1', - }], - }, - }], - sync_token: 'dummySyncToken', -}; diff --git a/packages/contentstack-bulk-publish/test/helpers/init.js b/packages/contentstack-bulk-publish/test/helpers/init.js new file mode 100644 index 0000000000..d6fb5cb82c --- /dev/null +++ b/packages/contentstack-bulk-publish/test/helpers/init.js @@ -0,0 +1,4 @@ +process.env.NODE_ENV = 'development'; + +global.oclif = global.oclif || {}; +global.oclif.columns = 80; \ No newline at end of file diff --git a/packages/contentstack-bulk-publish/test/unit/commands/assets/publish.test.js b/packages/contentstack-bulk-publish/test/unit/commands/assets/publish.test.js new file mode 100644 index 0000000000..487d19e8b3 --- /dev/null +++ b/packages/contentstack-bulk-publish/test/unit/commands/assets/publish.test.js @@ -0,0 +1,43 @@ +const { describe, it } = require('mocha'); +const sinon = require('sinon'); +const { expect } = require('chai'); +const { config } = require('dotenv'); + +const AssetsPublish = require('../../../../src/commands/cm/assets/publish'); + +config(); + +const environments = process.env.ENVIRONMENTS.split(','); +const locales = process.env.LOCALES.split(','); + +describe('AssetsPublish', () => { + it('Should run the command when all the flags are passed', async () => { + const args = ['--environments', environments[0], '--locales', locales[0], '--alias', process.env.MANAGEMENT_ALIAS, '--yes']; + const assetPublishSpy = sinon.spy(AssetsPublish.prototype, 'run'); + await AssetsPublish.run(args); + expect(assetPublishSpy.calledOnce).to.be.true; + assetPublishSpy.restore(); + }); + + it('Should fail when alias and stack api key flags are not passed', async () => { + const args = ['--environments', environments[0], '--locales', locales[0], '--yes']; + const assetPublishSpy = sinon.spy(AssetsPublish.prototype, 'run'); + const expectedError = 'Please use `--alias` or `--stack-api-key` to proceed.'; + try { + await AssetsPublish.run(args); + } catch (error) { + expect(error).to.be.an.instanceOf(Error); + expect(error.message).to.equal(expectedError); + expect(assetPublishSpy.calledOnce).to.be.true; + } + assetPublishSpy.restore(); + }); + + it('Should run successfully when user is logged in and stack api key is passed', async () => { + const args = ['--environments', environments[0], '--locales', locales[0], '--stack-api-key', process.env.STACK_API_KEY, '--yes']; + const assetPublishSpy = sinon.spy(AssetsPublish.prototype, 'run'); + await AssetsPublish.run(args); + expect(assetPublishSpy.calledOnce).to.be.true; + assetPublishSpy.restore(); + }); +}); \ No newline at end of file diff --git a/packages/contentstack-bulk-publish/test/unit/commands/assets/unpublish.test.js b/packages/contentstack-bulk-publish/test/unit/commands/assets/unpublish.test.js new file mode 100644 index 0000000000..1aae15ca7d --- /dev/null +++ b/packages/contentstack-bulk-publish/test/unit/commands/assets/unpublish.test.js @@ -0,0 +1,57 @@ +const { describe, it } = require('mocha'); +const { cliux } = require('@contentstack/cli-utilities'); +const sinon = require('sinon'); +const { config } = require('dotenv'); +const { expect } = require('chai'); + +const AssetsUnpublish = require('../../../../src/commands/cm/assets/unpublish'); + +const { stub } = sinon; + +config(); + +const environments = process.env.ENVIRONMENTS.split(','); +const locales = process.env.LOCALES.split(','); + +describe('AssetsUnpublish', () => { + it('Should run successfully when all the flags are passed', async () => { + const args = ['--environment', environments[0], '--locale', locales[0], '--alias', process.env.MANAGEMENT_ALIAS, '--delivery-token', process.env.DELIVERY_TOKEN, '--yes']; + const inquireStub = stub(cliux, 'prompt'); + await AssetsUnpublish.run(args); + sinon.assert.notCalled(inquireStub); + inquireStub.restore(); + }); + + it('Should ask for delivery token when the flag is not passed', async () => { + const args = ['--environment', environments[0], '--locale', locales[0], '--alias', process.env.MANAGEMENT_ALIAS, '--yes']; + const inquireStub = stub(cliux, 'prompt').resolves(process.env.DELIVERY_TOKEN); + await AssetsUnpublish.run(args); + sinon.assert.calledOnce(inquireStub); + inquireStub.restore(); + }); + + it('Should fail when alias and stack api key flags are not passed', async () => { + const args = ['--environment', environments[0], '--locale', locales[0], '--yes']; + const inquireStub = stub(cliux, 'prompt'); + const assetUnpublishSpy = sinon.spy(AssetsUnpublish.prototype, 'run'); + const expectedError = 'Please use `--alias` or `--stack-api-key` to proceed.'; + try { + await AssetsUnpublish.run(args); + } catch (error) { + expect(error).to.be.an.instanceOf(Error); + expect(error.message).to.equal(expectedError); + expect(assetUnpublishSpy.calledOnce).to.be.true; + } + sinon.assert.notCalled(inquireStub); + inquireStub.restore(); + assetUnpublishSpy.restore(); + }); + + it('Should run successfully when user is logged in and stack api key is passed', async () => { + const args = ['--environment', environments[0], '--locale', locales[0], '--stack-api-key', process.env.STACK_API_KEY, '--delivery-token', process.env.DELIVERY_TOKEN, '--yes']; + const inquireStub = stub(cliux, 'prompt'); + await AssetsUnpublish.run(args); + sinon.assert.notCalled(inquireStub); + inquireStub.restore(); + }); +}); \ No newline at end of file diff --git a/packages/contentstack-bulk-publish/test/unit/commands/bulk-publish/cross-publish.test.js b/packages/contentstack-bulk-publish/test/unit/commands/bulk-publish/cross-publish.test.js new file mode 100644 index 0000000000..d8831a1990 --- /dev/null +++ b/packages/contentstack-bulk-publish/test/unit/commands/bulk-publish/cross-publish.test.js @@ -0,0 +1,73 @@ +const { describe, it } = require('mocha'); +const CrossPublish = require('../../../../src/commands/cm/bulk-publish/cross-publish'); +const { cliux } = require('@contentstack/cli-utilities'); +const sinon = require('sinon'); +const { config } = require('dotenv'); +const { expect } = require('chai'); + +const { stub } = sinon; + +config(); + +const environments = process.env.ENVIRONMENTS.split(','); +const locales = process.env.LOCALES.split(','); + +describe('CrossPublish', () => { + it('Should run the command when all the flags are passed', async function () { + const args = ['--source-env', environments[0], '--environments', process.env.DESTINATION_ENV, '--locale', locales[0], '--alias', process.env.MANAGEMENT_ALIAS, '--delivery-token', process.env.DELIVERY_TOKEN, '--onlyAssets', '--yes']; + const inquireStub = stub(cliux, 'prompt'); + await CrossPublish.run(args); + sinon.assert.notCalled(inquireStub); + inquireStub.restore(); + }); + + it('Should ask for delivery token when the flag is not passed', async () => { + const args = ['--source-env', environments[0], '--environments', process.env.DESTINATION_ENV, '--locale', locales[0], '--alias', process.env.MANAGEMENT_ALIAS, '--onlyAssets', '--yes']; + const inquireStub = stub(cliux, 'prompt').resolves(process.env.DELIVERY_TOKEN); + await CrossPublish.run(args); + sinon.assert.calledOnce(inquireStub); + inquireStub.restore(); + }); + + it('Should fail when alias and stack api key flags are not passed', async () => { + const args = ['--source-env', environments[0], '--environments', process.env.DESTINATION_ENV, '--locale', locales[0], '--delivery-token', process.env.DELIVERY_TOKEN, '--onlyAssets', '--yes']; + const inquireStub = stub(cliux, 'prompt'); + const crossPublishSpy = sinon.spy(CrossPublish.prototype, 'run'); + const expectedError = 'Please use `--alias` or `--stack-api-key` to proceed.'; + try { + await CrossPublish.run(args); + } catch (error) { + expect(error).to.be.instanceOf(Error); + expect(error.message).to.equal(expectedError); + expect(crossPublishSpy.calledOnce).to.be.true; + } + sinon.assert.notCalled(inquireStub); + inquireStub.restore(); + crossPublishSpy.restore(); + }); + + it('Should run successfully when user is logged in and stack api key is passed', async () => { + const args = ['--source-env', environments[0], '--environments', process.env.DESTINATION_ENV, '--locale', locales[0], '--stack-api-key', process.env.STACK_API_KEY, '--delivery-token', process.env.DELIVERY_TOKEN, '--onlyAssets', '--yes']; + const inquireStub = stub(cliux, 'prompt'); + await CrossPublish.run(args); + sinon.assert.notCalled(inquireStub); + inquireStub.restore(); + }); + + it('Should fail when onlyAssets and onlyEntries flags are passed together', async () => { + const args = ['--source-env', environments[0], '--environments', process.env.DESTINATION_ENV, '--locale', locales[0], '--stack-api-key', process.env.STACK_API_KEY, '--delivery-token', process.env.DELIVERY_TOKEN, '--onlyAssets', '--onlyEntries', '--yes']; + const inquireStub = stub(cliux, 'prompt'); + const crossPublishSpy = sinon.spy(CrossPublish.prototype, 'run'); + const expectedError = 'The flags onlyAssets and onlyEntries need not be used at the same time. Unpublish command unpublishes entries and assts at the same time by default'; + try { + await CrossPublish.run(args); + } catch (error) { + expect(error).to.be.instanceOf(Error); + expect(error.message).to.equal(expectedError); + expect(crossPublishSpy.calledOnce).to.be.true; + } + sinon.assert.notCalled(inquireStub); + inquireStub.restore(); + crossPublishSpy.restore(); + }); +}); \ No newline at end of file diff --git a/packages/contentstack-bulk-publish/test/unit/commands/entries/publish-modified.test.js b/packages/contentstack-bulk-publish/test/unit/commands/entries/publish-modified.test.js new file mode 100644 index 0000000000..906d2f2c6e --- /dev/null +++ b/packages/contentstack-bulk-publish/test/unit/commands/entries/publish-modified.test.js @@ -0,0 +1,44 @@ +const { describe, it } = require('mocha'); +const sinon = require('sinon'); +const { expect } = require('chai'); +const { config } = require('dotenv'); + +const EntriesPublishModified = require('../../../../src/commands/cm/entries/publish-modified'); + +config(); + +const environments = process.env.ENVIRONMENTS.split(','); +const locales = process.env.LOCALES.split(','); +const contentTypes = process.env.CONTENT_TYPES.split(','); + +describe('EntriesPublishModified', () => { + it('Should run the command when all the flags are passed', async () => { + const args = ['--content-types', contentTypes[0], '--source-env', environments[0], '-e', process.env.DESTINATION_ENV, '--locales', locales[0], '--alias', process.env.MANAGEMENT_ALIAS, '--yes']; + const entriesPublishedModifiedSpy = sinon.spy(EntriesPublishModified.prototype, 'run'); + await EntriesPublishModified.run(args); + expect(entriesPublishedModifiedSpy.calledOnce).to.be.true; + entriesPublishedModifiedSpy.restore(); + }); + + it('Should fail when alias and stack api key flags are not passed', async () => { + const args = ['--content-types', contentTypes[0], '--source-env', environments[0], '-e', process.env.DESTINATION_ENV, '--locales', locales[0], '--yes']; + const entriesPublishedModifiedSpy = sinon.spy(EntriesPublishModified.prototype, 'run'); + const expectedError = 'Please use `--alias` or `--stack-api-key` to proceed.'; + try { + await EntriesPublishModified.run(args); + } catch (error) { + expect(error).to.be.an.instanceOf(Error); + expect(error.message).to.equal(expectedError); + expect(entriesPublishedModifiedSpy.calledOnce).to.be.true; + } + entriesPublishedModifiedSpy.restore(); + }); + + it('Should run successfully when user is logged in and stack api key is passed', async () => { + const args = ['--content-types', contentTypes[0], '--source-env', environments[0], '-e', process.env.DESTINATION_ENV, '--locales', locales[0], '--stack-api-key', process.env.STACK_API_KEY, '--yes']; + const entriesPublishedModifiedSpy = sinon.spy(EntriesPublishModified.prototype, 'run'); + await EntriesPublishModified.run(args); + expect(entriesPublishedModifiedSpy.calledOnce).to.be.true; + entriesPublishedModifiedSpy.restore(); + }); +}); \ No newline at end of file diff --git a/packages/contentstack-bulk-publish/test/unit/commands/entries/publish-non-localized-fields.test.js b/packages/contentstack-bulk-publish/test/unit/commands/entries/publish-non-localized-fields.test.js new file mode 100644 index 0000000000..b78cf7b654 --- /dev/null +++ b/packages/contentstack-bulk-publish/test/unit/commands/entries/publish-non-localized-fields.test.js @@ -0,0 +1,44 @@ +const { describe, it } = require('mocha'); +const sinon = require('sinon'); +const { expect } = require('chai'); +const { config } = require('dotenv'); + +const EntriesPublishNonLocalizedFields = require('../../../../src/commands/cm/entries/publish-non-localized-fields'); + +config(); + +const environments = process.env.ENVIRONMENTS.split(','); +// const locales = process.env.LOCALES.split(','); +const contentTypes = process.env.CONTENT_TYPES.split(','); + +describe('EntriesPublishNonLocalizedFields', () => { + it('Should run the command when all the flags are passed', async () => { + const args = ['--content-types', contentTypes[0], '--source-env', environments[0], '--environments', process.env.DESTINATION_ENV, '--alias', process.env.MANAGEMENT_ALIAS, '--yes']; + const entriesPublishNonLocalizedFieldsSpy = sinon.spy(EntriesPublishNonLocalizedFields.prototype, 'run'); + await EntriesPublishNonLocalizedFields.run(args); + expect(entriesPublishNonLocalizedFieldsSpy.calledOnce).to.be.true; + entriesPublishNonLocalizedFieldsSpy.restore(); + }); + + it('Should fail when alias and stack api key flags are not passed', async () => { + const args = ['--content-types', contentTypes[0], '--source-env', environments[0], '--environments', process.env.DESTINATION_ENV, '--yes']; + const entriesPublishNonLocalizedFieldsSpy = sinon.spy(EntriesPublishNonLocalizedFields.prototype, 'run'); + const expectedError = 'Please use `--alias` or `--stack-api-key` to proceed.'; + try { + await EntriesPublishNonLocalizedFields.run(args); + } catch (error) { + expect(error).to.be.an.instanceOf(Error); + expect(error.message).to.equal(expectedError); + expect(entriesPublishNonLocalizedFieldsSpy.calledOnce).to.be.true; + } + entriesPublishNonLocalizedFieldsSpy.restore(); + }); + + it('Should run successfully when user is logged in and stack api key is passed', async () => { + const args = ['--content-types', contentTypes[0], '--source-env', environments[0], '--environments', process.env.DESTINATION_ENV, '--stack-api-key', process.env.STACK_API_KEY, '--yes']; + const entriesPublishNonLocalizedFieldsSpy = sinon.spy(EntriesPublishNonLocalizedFields.prototype, 'run'); + await EntriesPublishNonLocalizedFields.run(args); + expect(entriesPublishNonLocalizedFieldsSpy.calledOnce).to.be.true; + entriesPublishNonLocalizedFieldsSpy.restore(); + }); +}); \ No newline at end of file diff --git a/packages/contentstack-bulk-publish/test/unit/commands/entries/publish-only-unpublished.js b/packages/contentstack-bulk-publish/test/unit/commands/entries/publish-only-unpublished.js new file mode 100644 index 0000000000..2f2e881c5c --- /dev/null +++ b/packages/contentstack-bulk-publish/test/unit/commands/entries/publish-only-unpublished.js @@ -0,0 +1,46 @@ +const { describe, it } = require('mocha'); +const EntriesPublishOnlyUnpublished = require('../../../../src/commands/cm/entries/publish-only-unpublished'); +const { cliux } = require('@contentstack/cli-utilities'); +const sinon = require('sinon'); +const { config } = require('dotenv'); +const { expect } = require('chai'); + +const { stub } = sinon; + +config(); + +const environments = process.env.ENVIRONMENTS.split(','); +const locales = process.env.LOCALES.split(','); +const contentTypes = process.env.CONTENT_TYPES.split(','); + +describe('EntriesPublishOnlyUnpublished', () => { + it('Should run the command when all the flags are passed', async () => { + const args = ['-b', '--content-types', contentTypes[0], '--locales', locales[0], '--source-env', environments[0], '-a', process.env.MANAGEMENT_ALIAS, '--yes']; + const entriesPublishOnlyUnpublishedSpy = sinon.spy(EntriesPublishOnlyUnpublished.prototype, 'run'); + await EntriesPublishOnlyUnpublished.run(args); + expect(entriesPublishOnlyUnpublishedSpy.calledOnce).to.be.true; + entriesPublishOnlyUnpublishedSpy.restore(); + }); + + it('Should fail when alias and stack api key flags are not passed', async () => { + const args = ['-b', '--content-types', contentTypes[0],'--locales', locales[0], '--environments', environments[0], '--yes']; + const entriesPublishOnlyUnpublishedSpy = sinon.spy(EntriesPublishOnlyUnpublished.prototype, 'run'); + const expectedError = 'Please use `--alias` or `--stack-api-key` to proceed.'; + try { + await EntriesPublishOnlyUnpublished.run(args); + } catch (error) { + expect(error).to.be.an.instanceOf(Error); + expect(error.message).to.equal(expectedError); + expect(entriesPublishOnlyUnpublishedSpy.calledOnce).to.be.true; + } + entriesPublishOnlyUnpublishedSpy.restore(); + }); + + it('Should run successfully when user is logged in and stack api key is passed', async () => { + const args = ['-b', '--content-types', contentTypes[0],'--locales', locales[0], '--environments', environments[0], '--stack-api-key', process.env.STACK_API_KEY, '--yes']; + const entriesPublishOnlyUnpublishedSpy = sinon.spy(EntriesPublishOnlyUnpublished.prototype, 'run'); + await EntriesPublishOnlyUnpublished.run(args); + expect(entriesPublishOnlyUnpublishedSpy.calledOnce).to.be.true; + entriesPublishOnlyUnpublishedSpy.restore(); + }); +}); \ No newline at end of file diff --git a/packages/contentstack-bulk-publish/test/unit/commands/entries/publish.test.js b/packages/contentstack-bulk-publish/test/unit/commands/entries/publish.test.js new file mode 100644 index 0000000000..3d9640b568 --- /dev/null +++ b/packages/contentstack-bulk-publish/test/unit/commands/entries/publish.test.js @@ -0,0 +1,44 @@ +const { describe, it } = require('mocha'); +const sinon = require('sinon'); +const { expect } = require('chai'); +const { config } = require('dotenv'); + +const EntriesPublish = require('../../../../src/commands/cm/entries/publish'); + +config(); + +const environments = process.env.ENVIRONMENTS.split(','); +const locales = process.env.LOCALES.split(','); +const contentTypes = process.env.CONTENT_TYPES.split(','); + +describe('EntriesPublish', () => { + it('Should run the command when all the flags are passed', async () => { + const args = ['--content-types', contentTypes[0], '--environments', environments[0], '--locales', locales[0], '--alias', process.env.MANAGEMENT_ALIAS, '--yes']; + const entriesPublishSpy = sinon.spy(EntriesPublish.prototype, 'run'); + await EntriesPublish.run(args); + expect(entriesPublishSpy.calledOnce).to.be.true; + entriesPublishSpy.restore(); + }); + + it('Should fail when alias and stack api key flags are not passed', async () => { + const args = ['--content-types', contentTypes[0], '--environments', environments[0], '--locales', locales[0], '--yes']; + const entriesPublishSpy = sinon.spy(EntriesPublish.prototype, 'run'); + const expectedError = 'Please use `--alias` or `--stack-api-key` to proceed.'; + try { + await EntriesPublish.run(args); + } catch (error) { + expect(error).to.be.an.instanceOf(Error); + expect(error.message).to.equal(expectedError); + expect(entriesPublishSpy.calledOnce).to.be.true; + } + entriesPublishSpy.restore(); + }); + + it('Should run successfully when user is logged in and stack api key is passed', async () => { + const args = ['--content-types', contentTypes[0], '--environments', environments[0], '--locales', locales[0], '--stack-api-key', process.env.STACK_API_KEY, '--yes']; + const entriesPublishSpy = sinon.spy(EntriesPublish.prototype, 'run'); + await EntriesPublish.run(args); + expect(entriesPublishSpy.calledOnce).to.be.true; + entriesPublishSpy.restore(); + }); +}); \ No newline at end of file diff --git a/packages/contentstack-bulk-publish/test/unit/commands/entries/unpublish.test.js b/packages/contentstack-bulk-publish/test/unit/commands/entries/unpublish.test.js new file mode 100644 index 0000000000..d8232874e9 --- /dev/null +++ b/packages/contentstack-bulk-publish/test/unit/commands/entries/unpublish.test.js @@ -0,0 +1,57 @@ +const { describe, it } = require('mocha'); +const EntriesUnpublish = require('../../../../src/commands/cm/entries/unpublish'); +const { cliux } = require('@contentstack/cli-utilities'); +const sinon = require('sinon'); +const { config } = require('dotenv'); +const { expect } = require('chai'); + +const { stub } = sinon; + +config(); + +const environments = process.env.ENVIRONMENTS.split(','); +const locales = process.env.LOCALES.split(','); +const contentTypes = process.env.CONTENT_TYPES.split(','); + +describe('EntriesUnpublish', () => { + it('Should run the command when all the flags are passed', async function () { + const args = ['--content-type', contentTypes[0], '--environment', environments[0], '--locale', locales[0], '--alias', process.env.MANAGEMENT_ALIAS, '--delivery-token', process.env.DELIVERY_TOKEN, '--yes']; + const inquireStub = stub(cliux, 'prompt'); + await EntriesUnpublish.run(args); + sinon.assert.notCalled(inquireStub); + inquireStub.restore(); + }); + + it('Should ask for delivery token when the flag is not passed', async () => { + const args = ['--content-type', contentTypes[0], '--environment', environments[0], '--locale', locales[0], '--alias', process.env.MANAGEMENT_ALIAS, '--yes']; + const inquireStub = stub(cliux, 'prompt').resolves(process.env.DELIVERY_TOKEN); + await EntriesUnpublish.run(args); + sinon.assert.calledOnce(inquireStub); + inquireStub.restore(); + }); + + it('Should fail when alias and stack api key flags are not passed', async () => { + const args = ['--content-type', contentTypes[0], '--environment', environments[0], '--locale', locales[0], '--delivery-token', process.env.DELIVERY_TOKEN, '--yes']; + const inquireStub = stub(cliux, 'prompt'); + const entriesUnpublishSpy = sinon.spy(EntriesUnpublish.prototype, 'run'); + const expectedError = 'Please use `--alias` or `--stack-api-key` to proceed.'; + try { + await EntriesUnpublish.run(args); + } catch (error) { + expect(error).to.be.an.instanceOf(Error); + expect(error.message).to.equal(expectedError); + expect(entriesUnpublishSpy.calledOnce).to.be.true; + } + sinon.assert.notCalled(inquireStub); + inquireStub.restore(); + entriesUnpublishSpy.restore(); + }); + + it('Should run successfully when user is logged in and stack api key is passed', async () => { + const args = ['--content-type', contentTypes[0], '--environment', environments[0], '--locale', locales[0], '--stack-api-key', process.env.STACK_API_KEY, '--delivery-token', process.env.DELIVERY_TOKEN, '--yes']; + const inquireStub = stub(cliux, 'prompt'); + await EntriesUnpublish.run(args); + sinon.assert.notCalled(inquireStub); + inquireStub.restore(); + }); +}); \ No newline at end of file diff --git a/packages/contentstack-bulk-publish/test/unit/commands/entries/update-and-publish.test.js b/packages/contentstack-bulk-publish/test/unit/commands/entries/update-and-publish.test.js new file mode 100644 index 0000000000..7a02410f49 --- /dev/null +++ b/packages/contentstack-bulk-publish/test/unit/commands/entries/update-and-publish.test.js @@ -0,0 +1,45 @@ +const { describe, it } = require('mocha'); +const sinon = require('sinon'); +const { expect } = require('chai'); +const { config } = require('dotenv'); + +const EntriesUpdateAndPublish = require('../../../../src/commands/cm/entries/update-and-publish'); + +config(); + + +const environments = process.env.ENVIRONMENTS.split(','); +const locales = process.env.LOCALES.split(','); +const contentTypes = process.env.CONTENT_TYPES.split(','); + +describe('EntriesUpdateAndPublish', () => { + it('Should run the command when all the flags are passed', async () => { + const args = ['--content-types', contentTypes[0], '-e', environments[0], '--locales', locales[0], '-a', process.env.MANAGEMENT_ALIAS, '--yes']; + const entriesUpdateAndPublishSpy = sinon.spy(EntriesUpdateAndPublish.prototype, 'run'); + await EntriesUpdateAndPublish.run(args); + expect(entriesUpdateAndPublishSpy.calledOnce).to.be.true; + entriesUpdateAndPublishSpy.restore(); + }); + + it('Should fail when alias and stack api key flags are not passed', async () => { + const args = ['--content-types', contentTypes[0], '-e', environments[0], '--locales', locales[0], '--yes']; + const entriesUpdateAndPublishSpy = sinon.spy(EntriesUpdateAndPublish.prototype, 'run'); + const expectedError = 'Please use `--alias` or `--stack-api-key` to proceed.'; + try { + await EntriesUpdateAndPublish.run(args); + } catch (error) { + expect(error).to.be.an.instanceOf(Error); + expect(error.message).to.equal(expectedError); + expect(entriesUpdateAndPublishSpy.calledOnce).to.be.true; + } + entriesUpdateAndPublishSpy.restore(); + }); + + it('Should run successfully when user is logged in and stack api key is passed', async () => { + const args = ['--content-types', contentTypes[0], '-e', environments[0], '--locales', locales[0], '--stack-api-key', process.env.STACK_API_KEY, '--yes']; + const entriesUpdateAndPublishSpy = sinon.spy(EntriesUpdateAndPublish.prototype, 'run'); + await EntriesUpdateAndPublish.run(args); + expect(entriesUpdateAndPublishSpy.calledOnce).to.be.true; + entriesUpdateAndPublishSpy.restore(); + }); +}); \ No newline at end of file diff --git a/packages/contentstack-bulk-publish/test/unit/commands/stacks/publish.test.js b/packages/contentstack-bulk-publish/test/unit/commands/stacks/publish.test.js new file mode 100644 index 0000000000..7162c82f54 --- /dev/null +++ b/packages/contentstack-bulk-publish/test/unit/commands/stacks/publish.test.js @@ -0,0 +1,52 @@ +const { describe, it } = require('mocha'); +const inquirer = require('inquirer'); +const sinon = require('sinon'); +const { expect } = require('chai'); +const { config } = require('dotenv'); +const StackPublish = require('../../../../src/commands/cm/stacks/publish'); +const { stub } = sinon; + +config(); + +const environments = process.env.ENVIRONMENTS.split(','); +const locales = process.env.LOCALES.split(','); +const contentTypes = process.env.CONTENT_TYPES.split(','); + +describe('StackPublish', () => { + it('Should run the command when all the flags are passed', async () => { + const args = ['--content-types', contentTypes[0], '--environments', environments[0], '--locales', locales[0], '--alias', process.env.MANAGEMENT_ALIAS, '--yes']; + const stackPublishSpy = sinon.spy(StackPublish.prototype, 'run'); + const inquireStub = stub(inquirer, 'prompt').resolves(process.env.STACK_PUBLISH_PROMPT_ANSWER.trim() || 'Publish Entries and Assets'); + await StackPublish.run(args); + expect(stackPublishSpy.calledOnce).to.be.true; + sinon.assert.calledOnce(inquireStub); + stackPublishSpy.restore(); + inquireStub.restore(); + }); + + it('Should fail when alias and stack api key flags are not passed', async () => { + const args = ['--content-types', contentTypes[0], '--environments', environments[0], '--locales', locales[0], '--yes']; + const stackPublishSpy = sinon.spy(StackPublish.prototype, 'run'); + const inquireStub = stub(inquirer, 'prompt').resolves(process.env.STACK_PUBLISH_PROMPT_ANSWER.trim() || 'Publish Entries and Assets'); + const expectedError = 'Please use `--alias` or `--stack-api-key` to proceed.'; + try { + await StackPublish.run(args); + } catch (error) { + expect(error).to.be.an.instanceOf(Error); + expect(error.message).to.equal(expectedError); + expect(stackPublishSpy.calledOnce).to.be.true; + } + stackPublishSpy.restore(); + inquireStub.restore(); + }); + + it('Should run successfully when user is logged in and stack api key is passed', async () => { + const args = ['--content-types', contentTypes[0], '--environments', environments[0], '--locales', locales[0], '--stack-api-key', process.env.STACK_API_KEY, '--yes']; + const stackPublishSpy = sinon.spy(StackPublish.prototype, 'run'); + const inquireStub = stub(inquirer, 'prompt').resolves(process.env.STACK_PUBLISH_PROMPT_ANSWER.trim() || 'Publish Entries and Assets'); + await StackPublish.run(args); + expect(stackPublishSpy.calledOnce).to.be.true; + stackPublishSpy.restore(); + inquireStub.restore(); + }); +}); \ No newline at end of file diff --git a/packages/contentstack-bulk-publish/test/unit/commands/stacks/unpublish.test.js b/packages/contentstack-bulk-publish/test/unit/commands/stacks/unpublish.test.js new file mode 100644 index 0000000000..e1f41aa019 --- /dev/null +++ b/packages/contentstack-bulk-publish/test/unit/commands/stacks/unpublish.test.js @@ -0,0 +1,57 @@ +const { describe, it } = require('mocha'); +const StackUnpublish = require('../../../../src/commands/cm/stacks/unpublish'); +const { cliux } = require('@contentstack/cli-utilities') +const sinon = require('sinon'); +const { config } = require('dotenv'); +const { expect } = require('chai'); + +const { stub } = sinon; + +config(); + +const environments = process.env.ENVIRONMENTS.split(','); +const locales = process.env.LOCALES.split(','); +const contentTypes = process.env.CONTENT_TYPES.split(','); + +describe('StackUnpublish', () => { + it('Should run the command when all the flags are passed', async function () { + const args = ['--content-type', contentTypes[0], '--environment', environments[0], '--locale', locales[0], '--alias', process.env.MANAGEMENT_ALIAS, '--delivery-token', process.env.DELIVERY_TOKEN, '--yes']; + const inquireStub = stub(cliux, 'prompt'); + await StackUnpublish.run(args); + sinon.assert.notCalled(inquireStub); + inquireStub.restore(); + }); + + it('Should ask for delivery token when the flag is not passed', async () => { + const args = ['--content-type', contentTypes[0], '--environment', environments[0], '--locale', locales[0], '--alias', process.env.MANAGEMENT_ALIAS, '--yes']; + const inquireStub = stub(cliux, 'prompt').resolves(process.env.DELIVERY_TOKEN); + await StackUnpublish.run(args); + sinon.assert.calledOnce(inquireStub); + inquireStub.restore(); + }); + + it('Should fail when alias and stack api key flags are not passed', async () => { + const args = ['--content-type', contentTypes[0], '--environment', environments[0], '--locale', locales[0], '--delivery-token', process.env.DELIVERY_TOKEN, '--yes']; + const inquireStub = stub(cliux, 'prompt'); + const stacksUnpublishSpy = sinon.spy(StackUnpublish.prototype, 'run'); + const expectedError = 'Please use `--alias` or `--stack-api-key` to proceed.'; + try { + await StackUnpublish.run(args); + } catch (error) { + expect(error).to.be.an.instanceOf(Error); + expect(error.message).to.equal(expectedError); + expect(stacksUnpublishSpy.calledOnce).to.be.true; + } + sinon.assert.notCalled(inquireStub); + inquireStub.restore(); + stacksUnpublishSpy.restore(); + }); + + it('Should run successfully when user is logged in and stack api key is passed', async () => { + const args = ['--content-type', contentTypes[0], '--environment', environments[0], '--locale', locales[0], '--stack-api-key', process.env.STACK_API_KEY, '--delivery-token', process.env.DELIVERY_TOKEN, '--yes']; + const inquireStub = stub(cliux, 'prompt'); + await StackUnpublish.run(args); + sinon.assert.notCalled(inquireStub); + inquireStub.restore(); + }); +}); \ No newline at end of file diff --git a/packages/contentstack-bulk-publish/test/util/logger.test.js b/packages/contentstack-bulk-publish/test/util/logger.test.js deleted file mode 100644 index 82d7f3c682..0000000000 --- a/packages/contentstack-bulk-publish/test/util/logger.test.js +++ /dev/null @@ -1,11 +0,0 @@ -const { getAllLogs, addLogs } = require('../../src/util/logger'); - -describe('testing for logger error cases', () => { - it('error while getting logs', () => { - getAllLogs('12719.PublishEntries.success'); - }); - - it('unknown logging level while adding logs', () => { - addLogs({}, {}, 'faketype'); - }); -}); diff --git a/packages/contentstack-bulk-publish/test/util/queue.test.js b/packages/contentstack-bulk-publish/test/util/queue.test.js deleted file mode 100644 index b0d26e6ca9..0000000000 --- a/packages/contentstack-bulk-publish/test/util/queue.test.js +++ /dev/null @@ -1,22 +0,0 @@ -const Queue = require('../../src/util/queue'); - -const queue = getQueue(); - - -function sampleConsumerFunction(data) { - console.log(data); -} - -queue.consumer = sampleConsumerFunction; - -describe('testing queue operations', () => { - const mockedlog = () => {}; - console.log = mockedlog; - it('enqueing operation', () => { - expect(queue.Enqueue({ api_key: 'apiKey', access_token: 'access_token' })).toBeUndefined(); - }); - - it('dequeue operations', () => { - expect(queue.Dequeue()).toBeUndefined(); - }); -}); diff --git a/packages/contentstack-bulk-publish/test/util/retryFailed.test.js b/packages/contentstack-bulk-publish/test/util/retryFailed.test.js deleted file mode 100644 index c990b85c05..0000000000 --- a/packages/contentstack-bulk-publish/test/util/retryFailed.test.js +++ /dev/null @@ -1,33 +0,0 @@ -const retryFailed = require('../../src/util/retryfailed'); -const dummyConfig = require('../dummy/config'); -const Queue = require('../../src/util/queue'); - -const mockedLog = () => { }; -console.log = mockedLog; - -const queue = getQueue(); -queue.config = dummyConfig; -queue.consumer = mockedLog; - -const bulkPublishEntriesLog = '1587758242717.bulkPublishEntries.success'; -const publishEntriesLog = '1587758242718.PublishEntries.success'; -const publishAssetLog = '1587956283100.PublishAssets.success'; -const emptyLog = '1587758242718.bulkPublishEntries.success'; - -describe('testing retryFailed', () => { - it('testing with bulkpublish log', async () => { - expect(await retryFailed(bulkPublishEntriesLog, queue, 'bulk')).toBeUndefined(); - }); - - it('testing with regular publish log', async () => { - expect(await retryFailed(publishEntriesLog, { entryQueue: queue }, 'publish')).toBeUndefined(); - }); - - it('testing with asset publish log', async () => { - expect(await retryFailed(publishAssetLog, { assetQueue: queue }, 'publish')).toBeUndefined(); - }); - - it('testing with empty publish log', async () => { - expect(await retryFailed(emptyLog, { entryQueue: queue }, 'publish')).toBeUndefined(); - }); -}); diff --git a/packages/contentstack-clone/README.md b/packages/contentstack-clone/README.md index a14302ee14..f270ae94b7 100644 --- a/packages/contentstack-clone/README.md +++ b/packages/contentstack-clone/README.md @@ -1,27 +1,29 @@ -@contentstack/cli-cm-clone -========================== +# @contentstack/cli-cm-clone It is Contentstack’s CLI plugin to clone a stack. Using this command, you can export a stack’s content/schema to a new or existing stack. Refer to the [Clone a Stack](https://www.contentstack.com/docs/developers/cli/clone-a-stack/) documentation to learn more. - +* [@contentstack/cli-cm-clone](#contentstackcli-cm-clone) * [Usage](#usage) * [Commands](#commands) + # Usage + ```sh-session $ npm install -g @contentstack/cli-cm-clone $ csdx COMMAND running command... $ csdx (--version) -@contentstack/cli-cm-clone/1.4.10 darwin-arm64 node-v18.16.0 +@contentstack/cli-cm-clone/1.4.15 darwin-arm64 node-v20.3.1 $ csdx --help [COMMAND] USAGE $ csdx COMMAND ... ``` + ```sh-session $ npm install -g @contentstack/cli-cm-clone $ csdx COMMAND @@ -31,7 +33,9 @@ USAGE $ csdx COMMAND ... ``` + # Commands + * [`csdx cm:stacks:clone [--source-branch ] [--target-branch ] [--source-management-token-alias ] [--destination-management-token-alias ] [-n ] [--type a|b] [--source-stack-api-key ] [--destination-stack-api-key ] [--import-webhook-status disable|current]`](#csdx-cmstacksclone---source-branch-value---target-branch-value---source-management-token-alias-value---destination-management-token-alias-value--n-value---type-ab---source-stack-api-key-value---destination-stack-api-key-value---import-webhook-status-disablecurrent) * [`csdx cm:stacks:clone [--source-branch ] [--target-branch ] [--source-management-token-alias ] [--destination-management-token-alias ] [-n ] [--type a|b] [--source-stack-api-key ] [--destination-stack-api-key ] [--import-webhook-status disable|current]`](#csdx-cmstacksclone---source-branch-value---target-branch-value---source-management-token-alias-value---destination-management-token-alias-value--n-value---type-ab---source-stack-api-key-value---destination-stack-api-key-value---import-webhook-status-disablecurrent-1) diff --git a/packages/contentstack-clone/package.json b/packages/contentstack-clone/package.json index b96f826ef3..77ff385980 100644 --- a/packages/contentstack-clone/package.json +++ b/packages/contentstack-clone/package.json @@ -1,15 +1,15 @@ { "name": "@contentstack/cli-cm-clone", "description": "Contentstack stack clone plugin", - "version": "1.4.11", + "version": "1.4.15", "author": "Contentstack", "bugs": "https://github.com/rohitmishra209/cli-cm-clone/issues", "dependencies": { + "@contentstack/cli-cm-export": "~1.8.0", + "@contentstack/cli-cm-import": "~1.8.0", + "@contentstack/cli-command": "~1.2.11", + "@contentstack/cli-utilities": "~1.5.1", "@colors/colors": "^1.5.0", - "@contentstack/cli-cm-export": "^1.5.9", - "@contentstack/cli-cm-import": "^1.5.11", - "@contentstack/cli-command": "^1.2.9", - "@contentstack/cli-utilities": "^1.4.5", "async": "^3.2.4", "chalk": "^4.1.0", "child_process": "^1.0.2", @@ -70,4 +70,4 @@ "cm:stack-clone": "O-CLN" } } -} +} \ No newline at end of file diff --git a/packages/contentstack-clone/src/commands/cm/stacks/clone.js b/packages/contentstack-clone/src/commands/cm/stacks/clone.js index 41e7d228d7..12542e2cf8 100644 --- a/packages/contentstack-clone/src/commands/cm/stacks/clone.js +++ b/packages/contentstack-clone/src/commands/cm/stacks/clone.js @@ -1,11 +1,11 @@ const { Command } = require('@contentstack/cli-command'); const { configHandler, flags, isAuthenticated, managementSDKClient } = require('@contentstack/cli-utilities'); const { CloneHandler } = require('../../../lib/util/clone-handler'); -let config = require('../../../lib/util/dummyConfig.json'); const path = require('path'); const rimraf = require('rimraf'); let pathdir = path.join(__dirname.split('src')[0], 'contents'); const { readdirSync } = require('fs'); +let config = {}; class StackCloneCommand extends Command { async run() { @@ -76,7 +76,7 @@ class StackCloneCommand extends Command { const cloneHandler = new CloneHandler(config); const managementAPIClient = await managementSDKClient(config); cloneHandler.setClient(managementAPIClient); - cloneHandler.execute().catch((error)=>{ + cloneHandler.execute().catch((error) => { console.log(error); }); }; diff --git a/packages/contentstack-clone/src/lib/util/clone-handler.js b/packages/contentstack-clone/src/lib/util/clone-handler.js index 7ea2057fda..c594827c46 100644 --- a/packages/contentstack-clone/src/lib/util/clone-handler.js +++ b/packages/contentstack-clone/src/lib/util/clone-handler.js @@ -2,12 +2,13 @@ const ora = require('ora'); const path = require('path'); const inquirer = require('inquirer'); const chalk = require('chalk'); +const fs = require('fs'); +let { default: exportCmd } = require('@contentstack/cli-cm-export'); +let { default: importCmd } = require('@contentstack/cli-cm-import'); +const { CustomAbortController } = require('./abort-controller'); const prompt = require('prompt'); const colors = require('@colors/colors/safe'); -let exportCmd = require('@contentstack/cli-cm-export'); -let importCmd = require('@contentstack/cli-cm-import'); - const { HandleOrgCommand, HandleStackCommand, @@ -19,6 +20,7 @@ const { Clone, HandleBranchCommand, } = require('../helpers/command-helpers'); +const { configHandler } = require('@contentstack/cli-utilities') let client = {}; let config; @@ -60,7 +62,7 @@ let master_locale; // Overrides prompt's stop method prompt.stop = function () { if (prompt.stopped) { - return; + return; } prompt.emit('stop'); prompt.stopped = true; @@ -301,7 +303,13 @@ class CloneHandler { async executeBranchPrompt(parentParams) { try { this.setExectingCommand(2); - await cloneCommand.execute(new HandleBranchCommand({ api_key: config.source_stack }, this, this.executeStackPrompt.bind(this, parentParams))); + await cloneCommand.execute( + new HandleBranchCommand( + { api_key: config.source_stack }, + this, + this.executeStackPrompt.bind(this, parentParams), + ), + ); await this.executeExport(); } catch (error) { throw error; @@ -314,7 +322,9 @@ class CloneHandler { await cloneCommand.execute(new SetBranchCommand(null, this)); if (exportRes) { - this.executeDestination().catch(() => { throw ''; }); + this.executeDestination().catch(() => { + throw ''; + }); } } catch (error) { throw error; @@ -340,9 +350,14 @@ class CloneHandler { let org; if (!config.target_stack) { - org = await cloneCommand.execute(new HandleOrgCommand({ - msg: !canCreateStack.stackCreate ? orgMsgExistingStack : orgMsgNewStack - }, this)); + org = await cloneCommand.execute( + new HandleOrgCommand( + { + msg: !canCreateStack.stackCreate ? orgMsgExistingStack : orgMsgNewStack, + }, + this, + ), + ); } const params = { org, canCreateStack }; @@ -402,7 +417,13 @@ class CloneHandler { async executeBranchDestinationPrompt(parentParams) { try { this.setExectingCommand(2); - await cloneCommand.execute(new HandleBranchCommand({ isSource: false, api_key: config.target_stack }, this, this.executeStackDestinationPrompt.bind(this, parentParams))); + await cloneCommand.execute( + new HandleBranchCommand( + { isSource: false, api_key: config.target_stack }, + this, + this.executeStackDestinationPrompt.bind(this, parentParams), + ), + ); this.removeBackKeyPressHandler(); await cloneCommand.execute(new CloneTypeSelectionCommand(null, this)); } catch (error) { @@ -441,9 +462,17 @@ class CloneHandler { return new Promise(async (resolve, reject) => { const spinner = ora('Fetching Organization').start(); try { - let organizations = await client.organization().fetchAll({ limit: 100 }); + let organizations; + const configOrgUid = configHandler.get('oauthOrgUid'); + + if (configOrgUid) { + organizations = await client.organization(configOrgUid).fetch(); + } else { + organizations = await client.organization().fetchAll({ limit: 100 }); + } + spinner.succeed('Fetched Organization'); - for (const element of organizations.items) { + for (const element of organizations.items || [organizations]) { orgUidList[element.name] = element.uid; orgChoice.choices.push(element.name); } @@ -529,7 +558,12 @@ class CloneHandler { getNewStackPromptResult() { return new Promise((resolve) => { - prompt.get({ properties: { name: { description: colors.white(stackName.message), default: colors.grey(stackName.default), } } }, + prompt.get( + { + properties: { + name: { description: colors.white(stackName.message), default: colors.grey(stackName.default) }, + }, + }, function (_, result) { if (prompt.stopped) { prompt.stopped = false; @@ -539,7 +573,8 @@ class CloneHandler { _name = _name.replace(//g, ''); resolve({ stack: _name }); } - }); + }, + ); }); } @@ -597,6 +632,7 @@ class CloneHandler { if (config.forceStopMarketplaceAppsPrompt) cmd.push('-y'); + fs.writeFileSync(path.join(__dirname, 'dummyConfig.json'), JSON.stringify(config)); let exportData = exportCmd.run(cmd); exportData.then(() => resolve(true)).catch(reject); }); @@ -609,8 +645,8 @@ class CloneHandler { if (config.destination_alias) { cmd.push('-a', config.destination_alias); } - if (config.sourceStackBranch) { - cmd.push('-d', path.join(__dirname, config.sourceStackBranch)); + if (!config.data && config.sourceStackBranch) { + cmd.push('-d', path.join(config.pathDir, config.sourceStackBranch)); } if (config.targetStackBranch) { cmd.push('--branch', config.targetStackBranch); @@ -621,6 +657,7 @@ class CloneHandler { if (config.forceStopMarketplaceAppsPrompt) cmd.push('-y'); + fs.writeFileSync(path.join(__dirname, 'dummyConfig.json'), JSON.stringify(config)); await importCmd.run(cmd); return resolve(); }); diff --git a/packages/contentstack-command/package.json b/packages/contentstack-command/package.json index 3c19d1fbf0..d9788f9e50 100644 --- a/packages/contentstack-command/package.json +++ b/packages/contentstack-command/package.json @@ -1,7 +1,7 @@ { "name": "@contentstack/cli-command", "description": "Contentstack CLI plugin for configuration", - "version": "1.2.9", + "version": "1.2.11", "author": "Contentstack", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -17,7 +17,7 @@ "format": "eslint src/**/*.ts --fix" }, "dependencies": { - "@contentstack/cli-utilities": "^1.4.5", + "@contentstack/cli-utilities": "~1.5.1", "contentstack": "^3.10.1" }, "devDependencies": { @@ -65,4 +65,4 @@ "repositoryPrefix": "<%- repo %>/blob/main/packages/contentstack-command/<%- commandPath %>" }, "repository": "contentstack/cli" -} +} \ No newline at end of file diff --git a/packages/contentstack-config/README.md b/packages/contentstack-config/README.md index 40bfe0e89d..831a9ddd87 100644 --- a/packages/contentstack-config/README.md +++ b/packages/contentstack-config/README.md @@ -18,7 +18,7 @@ $ npm install -g @contentstack/cli-config $ csdx COMMAND running command... $ csdx (--version) -@contentstack/cli-config/1.4.8 darwin-arm64 node-v18.16.0 +@contentstack/cli-config/1.4.10 darwin-arm64 node-v20.3.1 $ csdx --help [COMMAND] USAGE $ csdx COMMAND diff --git a/packages/contentstack-config/package.json b/packages/contentstack-config/package.json index ca152def53..c97ab376da 100644 --- a/packages/contentstack-config/package.json +++ b/packages/contentstack-config/package.json @@ -1,7 +1,7 @@ { "name": "@contentstack/cli-config", "description": "Contentstack CLI plugin for configuration", - "version": "1.4.8", + "version": "1.4.10", "author": "Contentstack", "scripts": { "build": "npm run clean && npm run compile", @@ -21,10 +21,11 @@ "test:unit:report": "nyc --extension .ts mocha --forbid-only \"test/unit/**/*.test.ts\"" }, "dependencies": { - "@contentstack/cli-command": "^1.2.9", - "@contentstack/cli-utilities": "^1.4.5", + "@contentstack/cli-command": "~1.2.11", + "@contentstack/cli-utilities": "~1.5.1", "chalk": "^4.0.0", "debug": "^4.1.1", + "mkdirp": "^1.0.4", "inquirer": "8.2.4", "winston": "^3.7.2", "lodash": "^4.17.20" diff --git a/packages/contentstack-dev-dependencies/package.json b/packages/contentstack-dev-dependencies/package.json index 8448cc3a67..01d6aebeb6 100644 --- a/packages/contentstack-dev-dependencies/package.json +++ b/packages/contentstack-dev-dependencies/package.json @@ -21,14 +21,14 @@ "author": "contentstack", "license": "MIT", "dependencies": { - "@oclif/core": "^2.8.5", + "@oclif/core": "^2.9.3", "lodash": "^4.17.21" }, "devDependencies": { "@types/node": "^14.14.32", - "eslint": "^8.18.0", + "eslint": "^7.32.0", "fancy-test": "^2.0.0", - "mocha": "^10.0.0", + "mocha": "10.1.0", "ts-node": "^10.9.1", "tslib": "^2.5.0", "typescript": "^4.9.3" @@ -36,4 +36,4 @@ "files": [ "/lib" ] -} +} \ No newline at end of file diff --git a/packages/contentstack-dev-dependencies/src/index.ts b/packages/contentstack-dev-dependencies/src/index.ts index a74de8e3b6..0cd8746e83 100644 --- a/packages/contentstack-dev-dependencies/src/index.ts +++ b/packages/contentstack-dev-dependencies/src/index.ts @@ -1 +1 @@ -export * from './csdx-test-suite' \ No newline at end of file +export * from './csdx-test-suite'; diff --git a/packages/contentstack-dev-dependencies/types/contentstack-management-sdk.d.ts b/packages/contentstack-dev-dependencies/types/contentstack-management-sdk.d.ts new file mode 100644 index 0000000000..de19848faa --- /dev/null +++ b/packages/contentstack-dev-dependencies/types/contentstack-management-sdk.d.ts @@ -0,0 +1,28 @@ +import { AnyProperty } from '@contentstack/management/types/utility/fields'; +import { Pagination } from '@contentstack/management/types/utility/pagination'; +type QueryType = { + find: () => Promise | Promise; + count: () => Promise | Promise; + findOne: () => Promise | Promise; +}; +type AssetType = { + query: (param?: Pagination & AnyProperty) => QueryType; + download: () => Promise | Promise; + replace: (data: any) => Promise | Promise; + publish: (data: any) => Promise | Promise; + fetch: (param?: AnyProperty) => Promise | Promise; + folder: () => { + create: (param?: AnyProperty) => Promise | Promise; + }; +}; +type StackType = { + query: (param?: Pagination & AnyProperty) => QueryType; + asset: (uid?: string) => AssetType; + fetch: (param?: AnyProperty) => Promise | Promise; +}; +type SdkType = { + stack: () => StackType; +}; +export declare function sdk(mocData?: any): SdkType; +export declare function client(mocData?: any): StackType; +export {}; diff --git a/packages/contentstack-dev-dependencies/types/csdx-test-suite/index.d.ts b/packages/contentstack-dev-dependencies/types/csdx-test-suite/index.d.ts new file mode 100644 index 0000000000..8e0efc622b --- /dev/null +++ b/packages/contentstack-dev-dependencies/types/csdx-test-suite/index.d.ts @@ -0,0 +1,114 @@ +import { Config } from '@oclif/core'; +import { expect, FancyTypes } from 'fancy-test'; +import { command } from './command'; +import { loadConfig } from './load-config'; +export declare const test: FancyTypes.Base any), opts?: { + raiseIfNotThrown?: boolean; + }]; + }; +} & { + env: { + output: unknown; + args: [env: { + [k: string]: string; + }, opts?: FancyTypes.EnvOptions]; + }; +} & { + stub: { + output: { + stubs: any[]; + }; + args: [object: any, path: any, value: () => any]; + }; +} & { + stdin: { + output: unknown; + args: [input: string, delay?: number]; + }; +} & { + stderr: { + output: { + readonly stderr: string; + }; + args: [opts?: { + print?: boolean; + stripColor?: boolean; + }]; + }; +} & { + stdout: { + output: { + readonly stdout: string; + }; + args: [opts?: { + print?: boolean; + stripColor?: boolean; + }]; + }; +} & { + nock: { + output: { + nock: number; + }; + args: [host: string, options: FancyTypes.NockOptions | FancyTypes.NockCallback, cb?: FancyTypes.NockCallback]; + }; +} & { + timeout: { + output: { + timeout: number; + }; + args: [timeout?: number]; + }; +} & { + loadConfig: { + output: { + config: import("@oclif/core/lib/interfaces").Config; + }; + args: [opts?: loadConfig.Options]; + }; +} & { + command: { + output: { + config: import("@oclif/core/lib/interfaces").Config; + expectation: string; + }; + args: [commandInstance: import("@oclif/core/lib/interfaces").Command.Class, args: string | string[], opts?: loadConfig.Options]; + }; +} & { + exit: { + output: { + error: any; + }; + args: [code?: number]; + }; +} & { + hook: { + output: { + config: import("@oclif/core/lib/interfaces").Config; + expectation: string; + }; + args: [event: string, hookOpts?: Record, options?: loadConfig.Options]; + }; +}>; +export default test; +export { expect, FancyTypes, Config, command }; diff --git a/packages/contentstack-dev-dependencies/types/csdx-unit-test-utilities/contentstack-management-sdk.d.ts b/packages/contentstack-dev-dependencies/types/csdx-unit-test-utilities/contentstack-management-sdk.d.ts new file mode 100644 index 0000000000..372d6f0d63 --- /dev/null +++ b/packages/contentstack-dev-dependencies/types/csdx-unit-test-utilities/contentstack-management-sdk.d.ts @@ -0,0 +1,29 @@ +import { AnyProperty } from '@contentstack/management/types/utility/fields'; +import { Pagination } from '@contentstack/management/types/utility/pagination'; +type QueryType = { + find: () => Promise | Promise; + count: () => Promise | Promise; + findOne: () => Promise | Promise; +}; +type AssetType = { + query: (param?: Pagination & AnyProperty) => QueryType; + download: () => Promise | Promise; + replace: (data: any) => Promise | Promise; + publish: (data: any) => Promise | Promise; + fetch: (param?: AnyProperty) => Promise | Promise; + create: (param?: AnyProperty) => Promise | Promise; + folder: () => { + create: (param?: AnyProperty) => Promise | Promise; + }; +}; +type StackType = { + query: (param?: Pagination & AnyProperty) => QueryType; + asset: (uid?: string) => AssetType; + fetch: (param?: AnyProperty) => Promise | Promise; +}; +type SdkType = { + stack: () => StackType; +}; +export declare function sdk(mocData?: any): SdkType; +export declare function client(mocData?: any): StackType; +export {}; diff --git a/packages/contentstack-dev-dependencies/types/csdx-unit-test-utilities/fs.d.ts b/packages/contentstack-dev-dependencies/types/csdx-unit-test-utilities/fs.d.ts new file mode 100644 index 0000000000..4faaec95cb --- /dev/null +++ b/packages/contentstack-dev-dependencies/types/csdx-unit-test-utilities/fs.d.ts @@ -0,0 +1,2 @@ +declare function overrideFsMethods(): void; +export { overrideFsMethods }; diff --git a/packages/contentstack-dev-dependencies/types/csdx-unit-test-utilities/index.d.ts b/packages/contentstack-dev-dependencies/types/csdx-unit-test-utilities/index.d.ts new file mode 100644 index 0000000000..b8a3c27aef --- /dev/null +++ b/packages/contentstack-dev-dependencies/types/csdx-unit-test-utilities/index.d.ts @@ -0,0 +1,2 @@ +export * from './fs'; +export * from './contentstack-management-sdk'; diff --git a/packages/contentstack-dev-dependencies/types/index.d.ts b/packages/contentstack-dev-dependencies/types/index.d.ts new file mode 100644 index 0000000000..0cd8746e83 --- /dev/null +++ b/packages/contentstack-dev-dependencies/types/index.d.ts @@ -0,0 +1 @@ +export * from './csdx-test-suite'; diff --git a/packages/contentstack-export-to-csv/package.json b/packages/contentstack-export-to-csv/package.json index d475a42dda..9dc88e6f2e 100644 --- a/packages/contentstack-export-to-csv/package.json +++ b/packages/contentstack-export-to-csv/package.json @@ -1,12 +1,12 @@ { "name": "@contentstack/cli-cm-export-to-csv", "description": "Export entities to csv", - "version": "1.3.10", + "version": "1.4.0", "author": "Abhinav Gupta @abhinav-from-contentstack", "bugs": "https://github.com/contentstack/cli/issues", "dependencies": { - "@contentstack/cli-command": "^1.2.9", - "@contentstack/cli-utilities": "^1.4.5", + "@contentstack/cli-command": "~1.2.11", + "@contentstack/cli-utilities": "~1.5.1", "chalk": "^4.1.0", "fast-csv": "^4.3.6", "inquirer": "8.2.4", @@ -17,7 +17,7 @@ "@oclif/test": "^2.2.10", "chai": "^4.2.0", "debug": "^4.3.1", - "eslint": "^8.18.0", + "eslint": "^7.32.0", "eslint-config-oclif": "^4.0.0", "globby": "^10.0.2", "mocha": "^10.0.0", @@ -61,4 +61,4 @@ } }, "repository": "https://github.com/contentstack/cli" -} +} \ No newline at end of file diff --git a/packages/contentstack-export-to-csv/src/util/index.js b/packages/contentstack-export-to-csv/src/util/index.js index a22b91e14c..cefdf6cb4f 100644 --- a/packages/contentstack-export-to-csv/src/util/index.js +++ b/packages/contentstack-export-to-csv/src/util/index.js @@ -8,7 +8,7 @@ const debug = require('debug')('export-to-csv'); const checkboxPlus = require('inquirer-checkbox-plus-prompt'); const config = require('./config.js'); -const { cliux } = require('@contentstack/cli-utilities'); +const { cliux, configHandler } = require('@contentstack/cli-utilities'); const directory = './data'; const delimeter = os.platform() === 'win32' ? '\\' : '/'; @@ -59,8 +59,16 @@ async function getOrganizations(managementAPIClient) { } async function getOrganizationList(managementAPIClient, params, result = []) { - const organizations = await managementAPIClient.organization().fetchAll(params); - result = result.concat(organizations.items); + let organizations; + const configOrgUid = configHandler.get('oauthOrgUid'); + + if (configOrgUid) { + organizations = await managementAPIClient.organization(configOrgUid).fetch(); + result = result.concat([organizations]); + } else { + organizations = await managementAPIClient.organization().fetchAll({ limit: 100 }); + result = result.concat(organizations.items); + } if (!organizations.items || (organizations.items && organizations.items.length < params.limit)) { const orgMap = {}; @@ -76,26 +84,33 @@ async function getOrganizationList(managementAPIClient, params, result = []) { } } -function getOrganizationsWhereUserIsAdmin(managementAPIClient) { - return new Promise((resolve, reject) => { +async function getOrganizationsWhereUserIsAdmin(managementAPIClient) { + try { let result = {}; - managementAPIClient - .getUser({ include_orgs_roles: true }) - .then((response) => { - let organizations = response.organizations.filter((org) => { - if (org.org_roles) { - const org_role = org.org_roles.shift(); - return org_role.admin; - } - return org.is_owner === true; - }); - organizations.forEach((org) => { - result[org.name] = org.uid; - }); - resolve(result); - }) - .catch((error) => reject(error)); - }); + const configOrgUid = configHandler.get('oauthOrgUid'); + + if (configOrgUid) { + const response = await managementAPIClient.organization(configOrgUid).fetch(); + result[response.name] = response.uid; + } else { + const response = await managementAPIClient.getUser({ include_orgs_roles: true }); + const organizations = response.organizations.filter((org) => { + if (org.org_roles) { + const org_role = org.org_roles.shift(); + return org_role.admin; + } + return org.is_owner === true; + }); + + organizations.forEach((org) => { + result[org.name] = org.uid; + }); + } + + return result; + } catch (error) { + throw error; + } } function chooseStack(managementAPIClient, orgUid, stackApiKey) { @@ -365,7 +380,7 @@ function cleanEntries(entries, language, environments, contentTypeUid) { let workflow = ''; const envArr = []; entry.publish_details.forEach((env) => { - envArr.push(JSON.stringify([environments[env['environment']], env['locale']])); + envArr.push(JSON.stringify([environments[env['environment']], env['locale'], env['time']])); }); delete entry.publish_details; if ('_workflow' in entry) { diff --git a/packages/contentstack-export/.editorconfig b/packages/contentstack-export/.editorconfig deleted file mode 100644 index beffa3084e..0000000000 --- a/packages/contentstack-export/.editorconfig +++ /dev/null @@ -1,11 +0,0 @@ -root = true - -[*] -indent_style = space -indent_size = 2 -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true - -[*.md] -trim_trailing_whitespace = false diff --git a/packages/contentstack-export/.env b/packages/contentstack-export/.env deleted file mode 100644 index dd1cd8b85f..0000000000 --- a/packages/contentstack-export/.env +++ /dev/null @@ -1,29 +0,0 @@ -APP_ENV=DEV -# PROD, STAGE -# not using APP_ENV in the test cases right now, will be used later - -NA_PASSWORD=NA_PASSWORD -NA_USERNAME=NA_USERNAME - -EU_PASSWORD=EU_PASSWORD -EU_USERNAME=EU_USERNAME - -# Similarly, added credentials for other regions - -# Config package specific -ENCRYPT_CONF=true -ENC_KEY = testEncryptionKey -CONFIG_NAME = test_contentstack_cli -ENC_CONFIG_NAME = test_contentstack_cli_obfuscate -ENABLE_PREREQUISITES=true -PRINT_LOGS=true - -# Stack related keys -# Delimiter symboles 🔥 - -#stacks are processed based on their region_name -#branch key is situational, specify the branch if a stack has branches enabled -DELIMITER=✓ -KEY_VAL_DELIMITER=⚡ -STACK1=STACK_API_KEY${KEY_VAL_DELIMITER}${DELIMITER}MANAGEMENT_TOKEN${KEY_VAL_DELIMITER}${DELIMITER}REGION_NAME${KEY_VAL_DELIMITER}${DELIMITER}ALIAS_NAME${KEY_VAL_DELIMITER}${DELIMITER}BRANCH${KEY_VAL_DELIMITER} -STACK2=STACK_API_KEY${KEY_VAL_DELIMITER}${DELIMITER}MANAGEMENT_TOKEN${KEY_VAL_DELIMITER}${DELIMITER}REGION_NAME${KEY_VAL_DELIMITER}${DELIMITER}ALIAS_NAME${KEY_VAL_DELIMITER}${DELIMITER} \ No newline at end of file diff --git a/packages/contentstack-export/.eslintignore b/packages/contentstack-export/.eslintignore new file mode 100644 index 0000000000..7f0bb8ff2e --- /dev/null +++ b/packages/contentstack-export/.eslintignore @@ -0,0 +1,4 @@ +# Build files +/lib +/test +/types \ No newline at end of file diff --git a/packages/contentstack-export/.eslintrc b/packages/contentstack-export/.eslintrc index e56091ba65..cb46553b01 100644 --- a/packages/contentstack-export/.eslintrc +++ b/packages/contentstack-export/.eslintrc @@ -1,3 +1,55 @@ { - "extends": "oclif" -} + "env": { + "node": true + }, + "parser": "@typescript-eslint/parser", + "parserOptions": { + "project": "tsconfig.json", + "sourceType": "module" + }, + "extends": [ + // "oclif", + "oclif-typescript", + "plugin:@typescript-eslint/recommended" + ], + "rules": { + "@typescript-eslint/no-unused-vars": [ + "error", + { + "args": "none" + } + ], + "@typescript-eslint/prefer-namespace-keyword": "error", + "@typescript-eslint/quotes": [ + "error", + "single", + { + "avoidEscape": true, + "allowTemplateLiterals": true + } + ], + "semi": "off", + "@typescript-eslint/type-annotation-spacing": "error", + "@typescript-eslint/no-redeclare": "off", + "eqeqeq": [ + "error", + "smart" + ], + "id-match": "error", + "no-eval": "error", + "no-var": "error", + "quotes": "off", + "indent": "off", + "camelcase": "off", + "comma-dangle": "off", + "arrow-parens": "off", + "operator-linebreak": "off", + "object-curly-spacing": "off", + "node/no-missing-import": "off", + "padding-line-between-statements": "off", + "@typescript-eslint/ban-ts-ignore": "off", + "unicorn/no-abusive-eslint-disable": "off", + "unicorn/consistent-function-scoping": "off", + "@typescript-eslint/no-use-before-define": "off" + } +} \ No newline at end of file diff --git a/packages/contentstack-export/.gitignore b/packages/contentstack-export/.gitignore index 6018eae427..e162b4e9e6 100644 --- a/packages/contentstack-export/.gitignore +++ b/packages/contentstack-export/.gitignore @@ -2,12 +2,13 @@ *-error.log /.nyc_output /dist +/lib /tmp /yarn.lock node_modules -logs +.DS_Store coverage ./contents .vscode/ /lib -.env \ No newline at end of file +.env diff --git a/packages/contentstack-export/.mocharc.json b/packages/contentstack-export/.mocharc.json new file mode 100644 index 0000000000..b90d7f028c --- /dev/null +++ b/packages/contentstack-export/.mocharc.json @@ -0,0 +1,12 @@ +{ + "require": [ + "test/helpers/init.js", + "ts-node/register", + "source-map-support/register" + ], + "watch-extensions": [ + "ts" + ], + "recursive": true, + "timeout": 5000 +} \ No newline at end of file diff --git a/packages/contentstack-export/.nycrc.json b/packages/contentstack-export/.nycrc.json new file mode 100644 index 0000000000..ec0b32b29f --- /dev/null +++ b/packages/contentstack-export/.nycrc.json @@ -0,0 +1,5 @@ +{ + "inlcude": [ + "lib/**/*.js" + ] +} \ No newline at end of file diff --git a/packages/contentstack-export/.prettierrc b/packages/contentstack-export/.prettierrc new file mode 100644 index 0000000000..ba93fc77d9 --- /dev/null +++ b/packages/contentstack-export/.prettierrc @@ -0,0 +1,7 @@ +{ + "semi": true, + "trailingComma": "all", + "singleQuote": true, + "printWidth": 120, + "tabWidth": 2 +} \ No newline at end of file diff --git a/packages/contentstack-export/README.md b/packages/contentstack-export/README.md index c574d77132..7d803b6478 100755 --- a/packages/contentstack-export/README.md +++ b/packages/contentstack-export/README.md @@ -48,7 +48,7 @@ $ npm install -g @contentstack/cli-cm-export $ csdx COMMAND running command... $ csdx (--version) -@contentstack/cli-cm-export/1.5.9 darwin-arm64 node-v18.16.0 +@contentstack/cli-cm-export/1.8.0 darwin-arm64 node-v20.3.1 $ csdx --help [COMMAND] USAGE $ csdx COMMAND @@ -145,9 +145,6 @@ EXAMPLES $ csdx cm:stacks:export --branch [optional] branch name ``` -_Mangement token and config file: [example_config/management_config.json](https://github.com/contentstack/cli/blob/main/packages/contentstack-export/example_config/management_config.json)_ -_Auth token and config file: [example_config/auth_config.json](https://github.com/contentstack/cli/blob/main/packages/contentstack-export/example_config/auth_config.json)_ - -_See code: [src/commands/cm/stacks/export.js](https://github.com/contentstack/cli/blob/main/packages/contentstack-export/src/commands/cm/stacks/export.js)_ +_See code: [src/commands/cm/stacks/export.ts](https://github.com/contentstack/cli/blob/main/packages/contentstack-export/src/commands/cm/stacks/export.ts)_ diff --git a/packages/contentstack-export/bin/dev b/packages/contentstack-export/bin/dev new file mode 100755 index 0000000000..74555287cd --- /dev/null +++ b/packages/contentstack-export/bin/dev @@ -0,0 +1,5 @@ +#!/usr/bin/env node +(async () => { + const oclif = require('@oclif/core'); + await oclif.execute({ type: 'cjs', development: true, dir: __dirname }); +})(); diff --git a/packages/contentstack-export/bin/dev.cmd b/packages/contentstack-export/bin/dev.cmd new file mode 100644 index 0000000000..077b57ae75 --- /dev/null +++ b/packages/contentstack-export/bin/dev.cmd @@ -0,0 +1,3 @@ +@echo off + +node "%~dp0\dev" %* \ No newline at end of file diff --git a/packages/contentstack-export/bin/run b/packages/contentstack-export/bin/run index 1fe6e50a4b..fce422f7ef 100755 --- a/packages/contentstack-export/bin/run +++ b/packages/contentstack-export/bin/run @@ -3,4 +3,4 @@ (async () => { const { execute } = require('@contentstack/cli-utilities'); await execute({ type: 'cjs', dir: __dirname }); -})(); \ No newline at end of file +})(); diff --git a/packages/contentstack-export/example_config/auth_config.json b/packages/contentstack-export/example_config/auth_config.json index bfc4679440..4e4743f721 100644 --- a/packages/contentstack-export/example_config/auth_config.json +++ b/packages/contentstack-export/example_config/auth_config.json @@ -5,9 +5,14 @@ }, "source_stack": "bltXXXXXXXXXX", "data": "file path", - "branchName":"example1", + "branchName": "example1", "moduleName": "content-types", "fetchConcurrency": 5, "writeConcurrency": 5, - "securedAssets":false -} + "updatedModules": [ + "assets", + "locales" + ], + "useNewModuleStructure": true, + "securedAssets": false +} \ No newline at end of file diff --git a/packages/contentstack-export/example_config/index.json b/packages/contentstack-export/example_config/index.json deleted file mode 100644 index 32fc487c04..0000000000 --- a/packages/contentstack-export/example_config/index.json +++ /dev/null @@ -1,7 +0,0 @@ -{"master_locale": { - "name": "English - United States", - "code": "en-us" - }, -"source_stack": "dummy_value", -"data": "Path" -} \ No newline at end of file diff --git a/packages/contentstack-export/example_config/management_config.json b/packages/contentstack-export/example_config/management_config.json index 8d5ff4ea3b..d2dd367007 100644 --- a/packages/contentstack-export/example_config/management_config.json +++ b/packages/contentstack-export/example_config/management_config.json @@ -4,9 +4,15 @@ "code": "en-us" }, "data": "file path", - "branchName":"example1", + "branchName": "example1", "moduleName": "content-types", "fetchConcurrency": 5, "writeConcurrency": 5, - "securedAssets":false -} + "updatedModules": [ + "assets", + "locales" + ], + "useNewModuleStructure": true, + "securedAssets": false, + "createBackupDir": "./temp" +} \ No newline at end of file diff --git a/packages/contentstack-export/messages/index.json b/packages/contentstack-export/messages/index.json index 2fdfb0bd37..9e26dfeeb6 100644 --- a/packages/contentstack-export/messages/index.json +++ b/packages/contentstack-export/messages/index.json @@ -1,7 +1 @@ -{ - "promptMessageList": { - "promptMasterLocale": "Provide the master locale of the source stack", - "promptSourceStack": "Provide the API Key of the source stack", - "promptPathStoredData": "Provide the path to store the content" - } -} \ No newline at end of file +{} \ No newline at end of file diff --git a/packages/contentstack-export/package.json b/packages/contentstack-export/package.json index 2f20b7e4ad..45aac8ab41 100644 --- a/packages/contentstack-export/package.json +++ b/packages/contentstack-export/package.json @@ -1,33 +1,39 @@ { "name": "@contentstack/cli-cm-export", "description": "Contentstack CLI plugin to export content from stack", - "version": "1.5.9", + "version": "1.8.0", "author": "Contentstack", "bugs": "https://github.com/contentstack/cli/issues", "dependencies": { - "@contentstack/cli-command": "^1.2.9", - "@contentstack/cli-utilities": "^1.4.5", + "@contentstack/cli-command": "~1.2.11", + "@contentstack/cli-utilities": "~1.5.1", "@oclif/command": "^1.8.16", "@oclif/config": "^1.18.3", + "@oclif/core": "^2.9.3", "async": "^3.2.4", "big-json": "^3.2.0", "bluebird": "^3.7.2", "chalk": "^4.1.2", "is-valid-path": "^0.1.1", "lodash": "^4.17.20", - "mkdirp": "^2.1.3", + "merge": "^2.1.1", + "mkdirp": "^1.0.4", "path": "^0.12.7", "progress-stream": "^2.0.0", "promise-limit": "^2.7.0", "proxyquire": "^2.1.3", + "tslib": "^2.4.1", "winston": "^3.7.2" }, "devDependencies": { - "@contentstack/cli-auth": "^1.3.8", - "@contentstack/cli-config": "^1.4.6", - "@contentstack/cli-dev-dependencies": "^1.2.3", + "@contentstack/cli-auth": "~1.3.11", + "@contentstack/cli-config": "~1.4.9", + "@contentstack/cli-dev-dependencies": "~1.2.3", "@oclif/plugin-help": "^5.1.19", "@oclif/test": "^1.2.6", + "@types/mkdirp": "^1.0.2", + "@types/progress-stream": "^2.0.2", + "@types/mkdirp": "^1.0.2", "assert": "^2.0.0", "chai": "^4.2.0", "dotenv": "^16.0.1", @@ -37,17 +43,36 @@ "globby": "^10.0.2", "mocha": "10.1.0", "nyc": "^15.1.0", + "oclif": "^3.8.1", "sinon": "^15.0.1", - "oclif": "^3.8.1" + "ts-node": "^10.9.1", + "typescript": "^4.9.3" + }, + "scripts": { + "build": "npm run clean && npm run compile", + "clean": "rm -rf ./lib ./node_modules tsconfig.build.tsbuildinfo", + "compile": "tsc -b tsconfig.json", + "postpack": "rm -f oclif.manifest.json", + "prepack": "pnpm compile && oclif manifest && oclif readme", + "version": "oclif readme && git add README.md", + "test:report": "tsc -p test && nyc --reporter=lcov --extension .ts mocha --forbid-only \"test/**/*.test.ts\"", + "pretest": "tsc -p test", + "test": "nyc --extension .ts mocha --forbid-only \"test/**/*.test.ts\"", + "posttest": "npm run lint", + "lint": "eslint src/**/*.ts", + "format": "eslint src/**/*.ts --fix", + "test:integration": "INTEGRATION_TEST=true mocha --config ./test/.mocharc.js --forbid-only \"test/run.test.js\"", + "test:integration:report": "INTEGRATION_TEST=true nyc --extension .js mocha --forbid-only \"test/run.test.js\"", + "test:unit": "mocha --forbid-only \"test/unit/*.test.ts\"" }, "engines": { "node": ">=14.0.0" }, "files": [ + "/lib", + "/messages", "/npm-shrinkwrap.json", - "/oclif.manifest.json", - "/src", - "/messages" + "/oclif.manifest.json" ], "homepage": "https://github.com/contentstack/cli", "keywords": [ @@ -56,17 +81,9 @@ "plugin" ], "license": "MIT", - "scripts": { - "postpack": "rm -f oclif.manifest.json", - "prepack": "oclif manifest && oclif readme", - "test": "nyc mocha --forbid-only \"test/**/*.test.js\"", - "version": "oclif readme && git add README.md", - "clean": "rm -rf ./node_modules tsconfig.build.tsbuildinfo", - "test:integration": "INTEGRATION_TEST=true mocha --config ./test/.mocharc.js --forbid-only \"test/run.test.js\"", - "test:unit": "mocha --forbid-only \"test/unit/*.test.js\" --unit-test" - }, + "main": "./lib/commands/cm/stacks/export.js", "oclif": { - "commands": "./src/commands", + "commands": "./lib/commands", "bin": "csdx", "devPlugins": [ "@oclif/plugin-help" @@ -79,9 +96,8 @@ }, "shortCommandName": { "cm:stacks:export": "EXPRT", - "cm:export": "O-EXPRT" + "cm:export": "EXPRT" } }, - "main": "./src/commands/cm/stacks/export.js", "repository": "https://github.com/contentstack/cli" -} +} \ No newline at end of file diff --git a/packages/contentstack-export/src/app.js b/packages/contentstack-export/src/app.js deleted file mode 100755 index 25bc410042..0000000000 --- a/packages/contentstack-export/src/app.js +++ /dev/null @@ -1,156 +0,0 @@ -/* eslint-disable no-redeclare */ -const _ = require('lodash'); -const path = require('path'); -const chalk = require('chalk'); -const util = require('./lib/util'); -const login = require('./lib/util/login'); -const setupBranches = require('./lib/util/setup-branches'); -const { addlogs, unlinkFileLogger } = require('./lib/util/log'); -const { managementSDKClient, isAuthenticated } = require('@contentstack/cli-utilities'); - -exports.initial = async (config) => { - return new Promise(async (resolve, reject) => { - config = util.buildAppConfig(config); - util.validateConfig(config); - exports.getConfig = () => { - return config; - }; - - const APIClient = await managementSDKClient(config); - const stackAPIClient = APIClient.stack({ - api_key: config.source_stack, - management_token: config.management_token, - }); - - const fetchBranchAndExport = async (APIClient, stackAPIClient) => { - await setupBranches(config, config.branchName, stackAPIClient); - let types = config.modules.types; - - if (Array.isArray(config.branches) && config.branches.length > 0) { - for (let branch of config.branches) { - config.branchName = branch.uid; - try { - if (config.moduleName) { - await singleExport(APIClient, stackAPIClient, config.moduleName, types, config, branch.uid); - } else { - await allExport(APIClient, stackAPIClient, config, types, branch.uid); - } - } catch (error) { - addlogs(config, `failed export contents '${branch.uid}' ${util.formatError(error)}`, 'error'); - } - } - } else { - try { - if (config.moduleName) { - await singleExport(APIClient, stackAPIClient, config.moduleName, types, config); - } else { - await allExport(APIClient, stackAPIClient, config, types); - } - } catch (error) { - addlogs(config, `failed export contents. ${util.formatError(error)}`, 'error'); - } - } - }; - - if (config.management_token || config.isAuthenticated) { - try { - await fetchBranchAndExport(APIClient, stackAPIClient); - } catch (error) { - addlogs(config, `${util.formatError(error)}`, 'error'); - } - resolve(); - } else if ( - (config.email && config.password) || - (!config.email && !config.password && config.source_stack && config.access_token) || - (isAuthenticated() && !config.management_token) - ) { - login - .login(config, APIClient, stackAPIClient) - .then(async function () { - // setup branches - try { - await fetchBranchAndExport(APIClient, stackAPIClient); - unlinkFileLogger(); - } catch (error) { - addlogs(config, `${util.formatError(error)}`, 'error'); - } - resolve(); - }) - .catch((error) => { - if (error && error.errors && error.errors.api_key) { - addlogs(config, `Stack Api key '${error.errors.api_key[0]}', Please enter valid Key`, 'error'); - addlogs(config, 'The log for this is stored at ' + config.data + '/export/logs', 'success'); - } else { - addlogs(config, `${util.formatError(error)}`, 'error'); - } - }); - } else { - reject('Kindly login or provide management_token'); - } - }); -}; - -const singleExport = async (APIClient, stackAPIClient, moduleName, types, config, branchName) => { - try { - if (types.indexOf(moduleName) > -1) { - let iterateList; - if (config.modules.dependency && config.modules.dependency[moduleName]) { - iterateList = config.modules.dependency[moduleName]; - } else { - iterateList = ['stack']; - } - iterateList.push(moduleName); - - for (let element of iterateList) { - const ExportModule = require('./lib/export/' + element); - const result = await new ExportModule(config, stackAPIClient, APIClient).start(config, branchName); - if (result && element === 'stack') { - let master_locale = { - master_locale: { code: result.code }, - }; - config = _.merge(config, master_locale); - } - } - addlogs(config, `Module '${moduleName}' was exported successfully!`, 'success'); - addlogs(config, 'The log for this is stored at ' + path.join(config.data, 'logs', 'export'), 'success'); - } else { - addlogs(config, 'Please provide valid module name.', 'error'); - } - return true; - } catch (error) { - addlogs(config, `${util.formatError(error)}`, 'error'); - addlogs(config, `Failed to migrate module '${moduleName}'`, 'error'); - addlogs(config, `The log for this is stored at '${path.join(config.data, 'logs', 'export')}'`, 'error'); - } -}; - -const allExport = async (APIClient, stackAPIClient, config, types, branchName) => { - try { - for (let type of types) { - const ExportModule = require('./lib/export/' + type); - const result = await new ExportModule(config, stackAPIClient, APIClient).start(config, branchName); - - if (result && type === 'stack') { - let master_locale = { master_locale: { code: result.code } }; - config = _.merge(config, master_locale); - } - } - addlogs( - config, - chalk.green( - 'The content of stack ' + (config.sourceStackName || config.source_stack) + ' has been exported successfully!', - ), - 'success', - ); - addlogs(config, 'The log for this is stored at ' + path.join(config.data, 'logs', 'export'), 'success'); - return true; - } catch (error) { - addlogs(config, util.formatError(error), 'error'); - addlogs( - config, - `Failed to migrate stack '${config.sourceStackName || config.source_stack}'. Please check error logs for more info.`, - 'error', - ); - addlogs(config, `The log for this is stored at '${path.join(config.data, 'logs', 'export')}'`, 'error'); - } -}; diff --git a/packages/contentstack-export/src/commands/cm/stacks/export.js b/packages/contentstack-export/src/commands/cm/stacks/export.js deleted file mode 100644 index a9882a32f9..0000000000 --- a/packages/contentstack-export/src/commands/cm/stacks/export.js +++ /dev/null @@ -1,202 +0,0 @@ -/* eslint-disable complexity */ -const { Command } = require('@contentstack/cli-command'); -const { printFlagDeprecation, configHandler, flags, isAuthenticated, cliux } = require('@contentstack/cli-utilities'); -const { - configWithMToken, - parameterWithMToken, - withoutParameterMToken, - configWithAuthToken, - parametersWithAuthToken, - withoutParametersWithAuthToken, -} = require('../../../lib/util/export-flags'); -const config = require('../../../config/default'); - -class ExportCommand extends Command { - async run() { - const { flags: exportCommandFlags } = await this.parse(ExportCommand); - const extConfig = exportCommandFlags.config; - const sourceStack = exportCommandFlags['stack-uid'] || exportCommandFlags['stack-api-key']; - const alias = exportCommandFlags['alias'] || exportCommandFlags['management-token-alias']; - const securedAssets = exportCommandFlags['secured-assets']; - const data = exportCommandFlags.data || exportCommandFlags['data-dir']; - const moduleName = exportCommandFlags.module; - const contentTypes = exportCommandFlags['content-types']; - const branchName = exportCommandFlags.branch; - let host = this.region; - let cmaHost = host.cma.split('//'); - let cdaHost = host.cda.split('//'); - host.cma = cmaHost[1]; - host.cda = cdaHost[1]; - exportCommandFlags['isAuthenticated'] = isAuthenticated(); - - config.forceStopMarketplaceAppsPrompt = exportCommandFlags.yes; - - if (alias) { - const managementTokens = this.getToken(alias); - const listOfTokens = configHandler.get('tokens'); - config.management_token_data = listOfTokens[alias]; - - if (managementTokens) { - if (extConfig) { - await configWithMToken( - extConfig, - managementTokens, - host, - contentTypes, - branchName, - securedAssets, - moduleName, - data, - exportCommandFlags, - ); - } else if (data) { - await parameterWithMToken( - managementTokens, - data, - moduleName, - host, - contentTypes, - branchName, - securedAssets, - exportCommandFlags, - ); - } else if (data === undefined && sourceStack === undefined) { - await withoutParameterMToken( - managementTokens, - moduleName, - host, - contentTypes, - branchName, - securedAssets, - exportCommandFlags, - ); - } else { - cliux.print(`error: Please provide a valid command. Run "csdx cm:export --help" command to view the command usage`, {color: 'red'}); - } - } else { - cliux.print(`error: ${alias} management token is not present, please add managment token first`, {color: 'red'}); - } - } else if (isAuthenticated()) { - if (extConfig) { - await configWithAuthToken( - extConfig, - moduleName, - host, - contentTypes, - branchName, - securedAssets, - exportCommandFlags, - ); - } else if (sourceStack && data) { - return await parametersWithAuthToken( - sourceStack, - data, - moduleName, - host, - contentTypes, - branchName, - securedAssets, - exportCommandFlags, - ); - } else if (data === undefined && sourceStack === undefined) { - await withoutParametersWithAuthToken( - moduleName, - host, - contentTypes, - branchName, - securedAssets, - exportCommandFlags, - ); - } else { - cliux.print(`error: Please provide a valid command. Run "csdx cm:export --help" command to view the command usage`, {color: 'red'}); - } - } else { - cliux.print(`error: Login or provide the alias for management token`, {color: 'red'}); - } - } -} - -ExportCommand.description = `Export content from a stack`; -ExportCommand.examples = [ - 'csdx cm:stacks:export --stack-api-key --data-dir ', - 'csdx cm:stacks:export --config ', - 'csdx cm:stacks:export --alias ', - 'csdx cm:stacks:export --alias --data-dir ', - 'csdx cm:stacks:export --alias --config ', - 'csdx cm:stacks:export --module ', - 'csdx cm:stacks:export --branch [optional] branch name', -]; -ExportCommand.usage = - 'cm:stacks:export [-c ] [-k ] [-d ] [-a ] [--module ] [--content-types ] [--branch ] [--secured-assets]'; - -ExportCommand.flags = { - config: flags.string({ - char: 'c', - description: '[optional] path of the config', - }), - 'stack-uid': flags.string({ - char: 's', - description: 'API key of the source stack', - hidden: true, - parse: printFlagDeprecation(['-s', '--stack-uid'], ['-k', '--stack-api-key']), - }), - 'stack-api-key': flags.string({ - char: 'k', - description: 'API key of the source stack', - }), - data: flags.string({ - description: 'path or location to store the data', - hidden: true, - parse: printFlagDeprecation(['--data'], ['--data-dir']), - }), - 'data-dir': flags.string({ - char: 'd', - description: 'path or location to store the data', - }), - alias: flags.string({ - char: 'a', - description: 'alias of the management token', - }), - 'management-token-alias': flags.string({ - description: 'alias of the management token', - hidden: true, - parse: printFlagDeprecation(['--management-token-alias'], ['-a', '--alias']), - }), - 'auth-token': flags.boolean({ - char: 'A', - description: 'to use auth token', - hidden: true, - parse: printFlagDeprecation(['-A', '--auth-token']), - }), - module: flags.string({ - char: 'm', - description: '[optional] specific module name', - exclusive: ['content-types'], - parse: printFlagDeprecation(['-m'], ['--module']), - }), - 'content-types': flags.string({ - char: 't', - description: '[optional] content type', - multiple: true, - exclusive: ['module'], - parse: printFlagDeprecation(['-t'], ['--content-types']), - }), - branch: flags.string({ - char: 'B', - // default: 'main', - description: '[optional] branch name', - parse: printFlagDeprecation(['-B'], ['--branch']), - }), - 'secured-assets': flags.boolean({ - description: '[optional] use when assets are secured', - }), - yes: flags.boolean({ - char: 'y', - required: false, - description: '[optional] Override marketplace apps related prompts', - }), -}; - -ExportCommand.aliases = ['cm:export']; - -module.exports = ExportCommand; diff --git a/packages/contentstack-export/src/commands/cm/stacks/export.ts b/packages/contentstack-export/src/commands/cm/stacks/export.ts new file mode 100644 index 0000000000..02fe134816 --- /dev/null +++ b/packages/contentstack-export/src/commands/cm/stacks/export.ts @@ -0,0 +1,125 @@ +import path from 'path'; +import { Command } from '@contentstack/cli-command'; +import { + cliux, + messageHandler, + printFlagDeprecation, + managementSDKClient, + flags, + ContentstackClient, + FlagInput, +} from '@contentstack/cli-utilities'; +import { ModuleExporter } from '../../../export'; +import { setupExportConfig, log, formatError } from '../../../utils'; +import { ExportConfig } from '../../../types'; + +export default class ExportCommand extends Command { + static description: string = messageHandler.parse('Export content from a stack'); + + static examples: string[] = [ + 'csdx cm:stacks:export --stack-api-key --data-dir ', + 'csdx cm:stacks:export --config ', + 'csdx cm:stacks:export --alias ', + 'csdx cm:stacks:export --alias --data-dir ', + 'csdx cm:stacks:export --alias --config ', + 'csdx cm:stacks:export --module ', + 'csdx cm:stacks:export --branch [optional] branch name', + ]; + + static usage: string = + 'cm:stacks:export [-c ] [-k ] [-d ] [-a ] [--module ] [--content-types ] [--branch ] [--secured-assets]'; + + static flags: FlagInput = { + config: flags.string({ + char: 'c', + description: '[optional] path of the config', + }), + 'stack-uid': flags.string({ + char: 's', + description: 'API key of the source stack', + hidden: true, + parse: printFlagDeprecation(['-s', '--stack-uid'], ['-k', '--stack-api-key']), + }), + 'stack-api-key': flags.string({ + char: 'k', + description: 'API key of the source stack', + }), + data: flags.string({ + description: 'path or location to store the data', + hidden: true, + parse: printFlagDeprecation(['--data'], ['--data-dir']), + }), + 'data-dir': flags.string({ + char: 'd', + description: 'path or location to store the data', + }), + alias: flags.string({ + char: 'a', + description: 'alias of the management token', + }), + 'management-token-alias': flags.string({ + description: 'alias of the management token', + hidden: true, + parse: printFlagDeprecation(['--management-token-alias'], ['-a', '--alias']), + }), + 'auth-token': flags.boolean({ + char: 'A', + description: 'to use auth token', + hidden: true, + parse: printFlagDeprecation(['-A', '--auth-token']), + }), + module: flags.string({ + char: 'm', + description: '[optional] specific module name', + exclusive: ['content-types'], + parse: printFlagDeprecation(['-m'], ['--module']), + }), + 'content-types': flags.string({ + char: 't', + description: '[optional] content type', + multiple: true, + exclusive: ['module'], + parse: printFlagDeprecation(['-t'], ['--content-types']), + }), + branch: flags.string({ + char: 'B', + // default: 'main', + description: '[optional] branch name', + parse: printFlagDeprecation(['-B'], ['--branch']), + }), + 'secured-assets': flags.boolean({ + description: '[optional] use when assets are secured', + }), + yes: flags.boolean({ + char: 'y', + required: false, + description: '[optional] Override marketplace apps related prompts', + }), + }; + + static aliases: string[] = ['cm:export']; + + async run(): Promise { + let exportDir: string; + try { + const { flags } = await this.parse(ExportCommand); + let exportConfig = await setupExportConfig(flags); + // Note setting host to create cma client + exportConfig.host = this.cmaHost; + exportDir = exportConfig.data || exportConfig.exportDir; + const managementAPIClient: ContentstackClient = await managementSDKClient(exportConfig); + const moduleExporter = new ModuleExporter(managementAPIClient, exportConfig); + await moduleExporter.start(); + log(exportConfig, `The content of the stack ${exportConfig.apiKey} has been exported successfully!`, 'success'); + } catch (error) { + log({ data: exportDir } as ExportConfig, `Failed to export stack content - ${formatError(error)}`, 'error'); + log( + { data: exportDir } as ExportConfig, + `The log has been stored at ${ + exportDir ? path.join(exportDir, 'logs', 'export') : path.join(__dirname, 'logs') + }`, + 'info', + ); + } + } +} diff --git a/packages/contentstack-export/src/config/default.js b/packages/contentstack-export/src/config/index.ts similarity index 81% rename from packages/contentstack-export/src/config/default.js rename to packages/contentstack-export/src/config/index.ts index f16d98fe5f..52a0bd214b 100644 --- a/packages/contentstack-export/src/config/default.js +++ b/packages/contentstack-export/src/config/index.ts @@ -1,4 +1,6 @@ -module.exports = { +import { DefaultConfig } from '../types'; + +const config: DefaultConfig = { versioning: false, host: 'https://api.contentstack.io/v3', developerHubUrls: { @@ -46,6 +48,11 @@ module.exports = { fileName: 'custom-roles.json', customRolesLocalesFileName: 'custom-roles-locales.json', }, + 'custom-roles': { + dirName: 'custom-roles', + fileName: 'custom-roles.json', + customRolesLocalesFileName: 'custom-roles-locales.json', + }, environments: { dirName: 'environments', fileName: 'environments.json', @@ -53,7 +60,7 @@ module.exports = { labels: { dirName: 'labels', fileName: 'labels.json', - invalidKeys: ['stackHeaders', 'uid', 'urlPath', 'created_at', 'updated_at', 'created_by', 'updated_by'], + invalidKeys: ['stackHeaders', 'urlPath', 'created_at', 'updated_at', 'created_by', 'updated_by'], }, webhooks: { dirName: 'webhooks', @@ -75,6 +82,11 @@ module.exports = { fileName: 'globalfields.json', validKeys: ['title', 'uid', 'schema', 'options', 'singleton', 'description'], }, + 'global-fields': { + dirName: 'global_fields', + fileName: 'globalfields.json', + validKeys: ['title', 'uid', 'schema', 'options', 'singleton', 'description'], + }, assets: { dirName: 'assets', fileName: 'assets.json', @@ -82,9 +94,15 @@ module.exports = { batchLimit: 20, host: 'https://images.contentstack.io', invalidKeys: ['created_at', 'updated_at', 'created_by', 'updated_by', '_metadata', 'published'], - // no of asset version files (of a single asset) that'll be downloaded parallelly - downloadLimit: 3, + // no of asset version files (of a single asset) that'll be downloaded parallel + chunkFileSize: 1, // measured on Megabits (5mb) + downloadLimit: 10, + fetchConcurrency: 10, + assetsMetaKeys: [], // Default keys ['uid', 'url', 'filename'] + securedAssets: false, + displayExecutionTime: false, enableDownloadStatus: false, + includeVersionedAssets: false, }, content_types: { dirName: 'content_types', @@ -93,6 +111,13 @@ module.exports = { // total no of content types fetched in each 'get content types' call limit: 100, }, + 'content-types': { + dirName: 'content_types', + fileName: 'content_types.json', + validKeys: ['title', 'uid', 'field_rules', 'schema', 'options', 'singleton', 'description'], + // total no of content types fetched in each 'get content types' call + limit: 100, + }, entries: { dirName: 'entries', fileName: 'entries.json', @@ -111,6 +136,8 @@ module.exports = { downloadLimit: 5, // total no of entries fetched in each content type in a single call limit: 100, + dependencies: ['locales', 'content-types'], + exportVersions: false, }, extensions: { dirName: 'extensions', @@ -127,6 +154,10 @@ module.exports = { dirName: 'marketplace_apps', fileName: 'marketplace_apps.json', }, + 'marketplace-apps': { + dirName: 'marketplace_apps', + fileName: 'marketplace_apps.json', + }, }, languagesCode: [ 'af-za', @@ -338,6 +369,20 @@ module.exports = { 'xh', 'zu', ], + updatedModules: [ + 'assets', + 'locales', + 'extensions', + 'marketplace-apps', + 'labels', + 'webhooks', + 'custom-roles', + 'global-fields', + 'content-types', + 'entries', + 'workflows', + 'stack', + ], apis: { userSession: '/user-session/', globalfields: '/global_fields/', @@ -357,4 +402,7 @@ module.exports = { writeConcurrency: 5, developerHubBaseUrl: '', marketplaceAppEncryptionKey: 'nF2ejRQcTv', + useNewModuleStructure: false, }; + +export default config; diff --git a/packages/contentstack-export/src/export/index.ts b/packages/contentstack-export/src/export/index.ts new file mode 100644 index 0000000000..8b3418f6de --- /dev/null +++ b/packages/contentstack-export/src/export/index.ts @@ -0,0 +1 @@ +export { default as ModuleExporter } from './module-exporter'; diff --git a/packages/contentstack-export/src/export/module-exporter.ts b/packages/contentstack-export/src/export/module-exporter.ts new file mode 100644 index 0000000000..a404af4570 --- /dev/null +++ b/packages/contentstack-export/src/export/module-exporter.ts @@ -0,0 +1,107 @@ +import * as path from 'path'; +import { ContentstackClient } from '@contentstack/cli-utilities'; +import { setupBranches, setupExportDir, log, formatError } from '../utils'; +import startModuleExport from './modules'; +import startJSModuleExport from './modules-js'; +import { ExportConfig, Modules } from '../types'; + +class ModuleExporter { + private managementAPIClient: ContentstackClient; + private exportConfig: ExportConfig; + private stackAPIClient: ReturnType; + + constructor(managementAPIClient: ContentstackClient, exportConfig: ExportConfig) { + this.managementAPIClient = managementAPIClient; + this.stackAPIClient = this.managementAPIClient.stack({ + api_key: exportConfig.apiKey, + management_token: exportConfig.management_token, + }); + this.exportConfig = exportConfig; + } + + async start(): Promise { + // setup the branches + await setupBranches(this.exportConfig, this.stackAPIClient); + await setupExportDir(this.exportConfig); + // if branches available run it export by branches + if (this.exportConfig.branches) { + this.exportConfig.branchEnabled = true; + return this.exportByBranches(); + } + return this.export(); + } + + async exportByBranches(): Promise { + // loop through the branches and export it parallel + for (const branch of this.exportConfig.branches) { + try { + this.exportConfig.branchName = branch.uid; + this.exportConfig.branchDir = path.join(this.exportConfig.exportDir, branch.uid); + await this.export(); + log(this.exportConfig, `The content of branch ${branch.uid} has been exported successfully!`, 'success'); + } catch (error) { + log(this.exportConfig, formatError(error), 'error'); + throw new Error(`Failed to export contents from branch ${branch.uid}`); + } + } + } + + async export() { + // checks for single module or all modules + if (this.exportConfig.singleModuleExport) { + return this.exportSingleModule(this.exportConfig.moduleName); + } + return this.exportAllModules(); + } + + async exportByModuleByName(moduleName: Modules) { + log(this.exportConfig, `Starting export of ${moduleName} module`, 'info'); + // export the modules by name + // calls the module runner which inturn calls the module itself + let exportedModuleResponse; + if (this.exportConfig.useNewModuleStructure && this.exportConfig.updatedModules.indexOf(moduleName) !== -1) { + exportedModuleResponse = await startModuleExport({ + stackAPIClient: this.stackAPIClient, + exportConfig: this.exportConfig, + moduleName, + }); + } else { + exportedModuleResponse = await startJSModuleExport({ + stackAPIClient: this.stackAPIClient, + exportConfig: this.exportConfig, + moduleName, + }); + } + + // set master locale to config + if (moduleName === 'stack' && exportedModuleResponse?.code) { + this.exportConfig.master_locale = { code: exportedModuleResponse.code }; + } + } + + async exportSingleModule(moduleName: Modules): Promise { + // Note stack is always exported + let exportModules: Modules[] = ['stack']; + const { + modules: { [moduleName]: { dependencies = [] } = {} }, + } = this.exportConfig; + + if (dependencies.length > 0) { + exportModules = exportModules.concat(dependencies); + } + exportModules.push(moduleName); + + for (const moduleName of exportModules) { + await this.exportByModuleByName(moduleName); + } + } + + async exportAllModules(): Promise { + // use the algorithm to determine the parallel and sequential execution of modules + for (const moduleName of this.exportConfig.modules.types) { + await this.exportByModuleByName(moduleName); + } + } +} + +export default ModuleExporter; diff --git a/packages/contentstack-export/src/lib/export/assets.js b/packages/contentstack-export/src/export/modules-js/assets.js similarity index 77% rename from packages/contentstack-export/src/lib/export/assets.js rename to packages/contentstack-export/src/export/modules-js/assets.js index 9f06dd77d3..e8c3fd4e7f 100644 --- a/packages/contentstack-export/src/lib/export/assets.js +++ b/packages/contentstack-export/src/export/modules-js/assets.js @@ -12,12 +12,8 @@ const _ = require('lodash'); const chalk = require('chalk'); const progress = require('progress-stream'); const { HttpClient, configHandler } = require('@contentstack/cli-utilities'); - -const helper = require('../util/helper'); -const { addlogs } = require('../util/log'); - -let config = require('../../config/default'); -const { formatError } = require('../util'); +const { fileHelper, log, formatError } = require('../../utils'); +let { default: config } = require('../../config'); module.exports = class ExportAssets { config; @@ -49,7 +45,7 @@ module.exports = class ExportAssets { this.assetContentsFile = path.resolve(this.assetsFolderPath, 'assets.json'); this.folderJSONPath = path.resolve(this.assetsFolderPath, 'folders.json'); - addlogs(this.config, 'Starting assets export', 'success'); + log(this.config, 'Starting assets export', 'success'); // Create asset folder mkdirp.sync(this.assetsFolderPath); @@ -62,7 +58,7 @@ module.exports = class ExportAssets { const assetBatches = []; if (typeof count !== 'number' || count === 0) { - addlogs(self.config, 'No assets found', 'success'); + log(self.config, 'No assets found', 'success'); return resolve(); } for (let i = 0; i <= count; i += self.bLimit) { @@ -85,12 +81,12 @@ module.exports = class ExportAssets { self.assetContents[assetJSON.uid] = assetJSON; }) .catch((error) => { - addlogs( + log( self.config, `Asset '${assetJSON.uid}' failed to download.\n ${formatError(error)}`, - 'error' + 'error', ); - addlogs(self.config, error, 'error'); + log(self.config, error, 'error'); }); } else { return self @@ -99,11 +95,7 @@ module.exports = class ExportAssets { self.assetContents[assetJSON.uid] = assetJSON; }) .catch((err) => { - addlogs( - self.config, - `Asset '${assetJSON.uid}' download failed. ${formatError(err)}`, - 'error', - ); + log(self.config, `Asset '${assetJSON.uid}' download failed. ${formatError(err)}`, 'error'); return err; }); } @@ -111,49 +103,45 @@ module.exports = class ExportAssets { { concurrency: self.vLimit }, ) .then(() => { - addlogs(self.config, 'Batch no ' + (batch + 1) + ' of assets is complete', 'success'); - // helper.writeFileSync(this.assetContentsFile, self.assetContents) + log(self.config, 'Batch no ' + (batch + 1) + ' of assets is complete', 'success'); + // fileHelper.writeFileSync(this.assetContentsFile, self.assetContents) }) .catch((error) => { - addlogs(self.config, `Asset batch ${batch + 1} failed to download`, 'error'); - addlogs(self.config, formatError(error), 'error'); - addlogs(self.config, error, 'error'); + log(self.config, `Asset batch ${batch + 1} failed to download`, 'error'); + log(self.config, formatError(error), 'error'); + log(self.config, error, 'error'); }); }) .catch((error) => { - addlogs(self.config, error, 'error'); + log(self.config, error, 'error'); reject(error); }); }, { concurrency: self.assetConfig.concurrencyLimit || 1 }, ) .then(() => { - helper.writeFileSync(self.assetContentsFile, self.assetContents); + fileHelper.writeFileSync(self.assetContentsFile, self.assetContents); return self .exportFolders() .then(() => { - addlogs(self.config, chalk.green('Asset export completed successfully'), 'success'); + log(self.config, chalk.green('Asset export completed successfully'), 'success'); return resolve(); }) .catch((error) => { - addlogs(self.config, error, 'error'); + log(self.config, error, 'error'); reject(error); }); }) .catch((error) => { - helper.writeFileSync(self.assetContentsFile, self.assetContents); - addlogs( - self.config, - `Asset export failed. ${formatError(error)}`, - 'error' - ); - addlogs(self.config, error, 'error'); + fileHelper.writeFileSync(self.assetContentsFile, self.assetContents); + log(self.config, `Asset export failed. ${formatError(error)}`, 'error'); + log(self.config, error, 'error'); reject(error); }); }) .catch((error) => { - addlogs(self.config, error, 'error'); + log(self.config, error, 'error'); reject(error); }); }); @@ -166,7 +154,7 @@ module.exports = class ExportAssets { .getAssetCount(true) .then((fCount) => { if (fCount === 0) { - addlogs(self.config, 'No folders were found in the stack!', 'success'); + log(self.config, 'No folders were found in the stack!', 'success'); return resolve(); } @@ -174,16 +162,16 @@ module.exports = class ExportAssets { .getFolderJSON(0, fCount) .then(() => { // asset folders have been successfully exported - addlogs(self.config, 'Asset-folders have been successfully exported!', 'success'); + log(self.config, 'Asset-folders have been successfully exported!', 'success'); return resolve(); }) .catch((error) => { - addlogs(self.config, `Error while exporting asset-folders!\n ${formatError(error)}`, 'error'); + log(self.config, `Error while exporting asset-folders!\n ${formatError(error)}`, 'error'); return reject(error); }); }) .catch((error) => { - addlogs(self.config, error, 'error'); + log(self.config, error, 'error'); // error while fetching asset folder count return reject(error); }); @@ -198,7 +186,7 @@ module.exports = class ExportAssets { } if (skip >= fCount) { - helper.writeFileSync(self.folderJSONPath, self.folderData); + fileHelper.writeFileSync(self.folderJSONPath, self.folderData); return resolve(); } @@ -239,7 +227,7 @@ module.exports = class ExportAssets { return resolve(asset.count); }) .catch((error) => { - addlogs(self.config, error, 'error'); + log(self.config, error, 'error'); }); } else { const queryOptions = { skip: 99999990, include_count: true }; @@ -249,7 +237,7 @@ module.exports = class ExportAssets { .find() .then(({ count }) => resolve(count)) .catch((error) => { - addlogs(self.config, error, 'error'); + log(self.config, error, 'error'); reject(error); }); } @@ -277,7 +265,7 @@ module.exports = class ExportAssets { .find() .then(({ items }) => resolve(items)) .catch((error) => { - addlogs(self.config, error, 'error'); + log(self.config, error, 'error'); return reject(); }); }); @@ -295,7 +283,7 @@ module.exports = class ExportAssets { if (version <= 0) { const assetVersionInfoFile = path.resolve(self.assetsFolderPath, uid, '_contentstack_' + uid + '.json'); - helper.writeFileSync(assetVersionInfoFile, assetVersionInfo); + fileHelper.writeFileSync(assetVersionInfoFile, assetVersionInfo); return resolve(); } const queryrequestOption = { @@ -321,7 +309,7 @@ module.exports = class ExportAssets { .catch(reject); }) .catch((error) => { - addlogs(self.config, error, 'error'); + log(self.config, error, 'error'); if (error.status === 408) { console.log('retrying', uid); @@ -343,7 +331,7 @@ module.exports = class ExportAssets { const assetFilePath = path.resolve(assetFolderPath, asset.filename); if (fs.existsSync(assetFilePath)) { - addlogs( + log( self.config, 'Skipping download of { title: ' + asset.filename + ', uid: ' + asset.uid + ' }, as they already exist', 'success', @@ -351,12 +339,10 @@ module.exports = class ExportAssets { return resolve(); } self.assetStream = { - url: self.config.securedAssets - ? `${asset.url}?authtoken=${configHandler.get('authtoken')}` - : asset.url, + url: self.config.securedAssets ? `${asset.url}?authtoken=${configHandler.get('authtoken')}` : asset.url, }; - mkdirp.sync(assetFolderPath); + fileHelper.makeDirectory(assetFolderPath); const assetFileStream = fs.createWriteStream(assetFilePath); self.assetStream.url = encodeURI(self.assetStream.url); self.httpClient @@ -376,17 +362,17 @@ module.exports = class ExportAssets { assetStreamRequest.pipe(assetFileStream); }) .catch((error) => { - addlogs(self.config, error, 'error'); + log(self.config, error, 'error'); reject(error); }); assetFileStream - .on('close', () => { - addlogs(self.config, 'Downloaded ' + asset.filename + ': ' + asset.uid + ' successfully!', 'success'); + .on('close', function () { + log(self.config, 'Downloaded ' + asset.filename + ': ' + asset.uid + ' successfully!', 'success'); return resolve(); }) .on('error', (error) => { - addlogs(self.config, `Download ${asset.filename}: ${asset.uid} failed!`, 'error'); - addlogs(self.config, error, 'error'); + log(self.config, `Download ${asset.filename}: ${asset.uid} failed!`, 'error'); + log(self.config, error, 'error'); reject(error); }); }); @@ -399,22 +385,22 @@ module.exports = class ExportAssets { .getAssetCount(true) .then((count) => { if (count === 0) { - addlogs(self.config, 'No folders were found in the stack', 'success'); + log(self.config, 'No folders were found in the stack', 'success'); return resolve(); } return self .getFolderDetails(0, count) - .then(() => { - addlogs(self.config, chalk.green('Exported asset-folders successfully!'), 'success'); + .then(function () { + log(self.config, chalk.green('Exported asset-folders successfully!'), 'success'); return resolve(); }) - .catch((error) => { - addlogs(self.config, error, 'error'); + .catch(function (error) { + log(self.config, error, 'error'); reject(error); }); }) - .catch((error) => { - addlogs(self.config, error, 'error'); + .catch(function (error) { + log(self.config, error, 'error'); reject(error); }); }); @@ -427,7 +413,7 @@ module.exports = class ExportAssets { skip = 0; } if (skip > tCount) { - helper.writeFileSync(self.folderJSONPath, self.folderContents); + fileHelper.writeFileSync(self.folderJSONPath, self.folderContents); return resolve(); } const queryRequestObj = { @@ -447,7 +433,7 @@ module.exports = class ExportAssets { return self.getFolderDetails(skip, tCount).then(resolve).catch(reject); }) .catch((error) => { - addlogs(self.config, error, 'error'); + log(self.config, error, 'error'); }); }); } diff --git a/packages/contentstack-export/src/lib/export/content-types.js b/packages/contentstack-export/src/export/modules-js/content-types.js similarity index 80% rename from packages/contentstack-export/src/lib/export/content-types.js rename to packages/contentstack-export/src/export/modules-js/content-types.js index fd0e0947b9..72affabb9f 100644 --- a/packages/contentstack-export/src/lib/export/content-types.js +++ b/packages/contentstack-export/src/export/modules-js/content-types.js @@ -1,8 +1,6 @@ const path = require('path'); -const fileHelper = require('../util/helper'); const chalk = require('chalk'); -const { executeTask, formatError } = require('../util'); -const { addlogs } = require('../util/log'); +const { fileHelper, executeTask, formatError, log } = require('../../utils'); class ContentTypesExport { constructor(exportConfig, stackAPIClient) { @@ -31,13 +29,13 @@ class ContentTypesExport { async start() { try { - addlogs(this.exportConfig, 'Starting content type export', 'success'); + log(this.exportConfig, 'Starting content type export', 'success'); await fileHelper.makeDirectory(this.contentTypesPath); await this.getContentTypes(); await this.writeContentTypes(this.contentTypes); - addlogs(this.exportConfig, chalk.green('Content type(s) exported successfully'), 'success'); + log(this.exportConfig, chalk.green('Content type(s) exported successfully'), 'success'); } catch (error) { - addlogs(this.exportConfig, `Failed to export content types ${formatError(error)}`, 'error'); + log(this.exportConfig, `Failed to export content types ${formatError(error)}`, 'error'); throw new Error('Failed to export content types'); } } @@ -58,7 +56,7 @@ class ContentTypesExport { } return await this.getContentTypes(skip); } else { - addlogs(this.exportConfig, 'No content types returned for the given query', 'info'); + log(this.exportConfig, 'No content types returned for the given query', 'info'); } } @@ -78,9 +76,9 @@ class ContentTypesExport { async writeContentTypes(contentTypes) { function write(contentType) { return fileHelper.writeFile( - path.join(this.contentTypesPath, - `${contentType.uid === 'schema' ? 'schema|1' : contentType.uid}.json`), - contentType); + path.join(this.contentTypesPath, `${contentType.uid === 'schema' ? 'schema|1' : contentType.uid}.json`), + contentType, + ); } await executeTask(contentTypes, write.bind(this), { concurrency: this.writeConcurrency }); return fileHelper.writeFile(path.join(this.contentTypesPath, 'schema.json'), contentTypes); diff --git a/packages/contentstack-export/src/lib/export/custom-roles.js b/packages/contentstack-export/src/export/modules-js/custom-roles.js similarity index 73% rename from packages/contentstack-export/src/lib/export/custom-roles.js rename to packages/contentstack-export/src/export/modules-js/custom-roles.js index cd786f274f..b75681c9bd 100644 --- a/packages/contentstack-export/src/lib/export/custom-roles.js +++ b/packages/contentstack-export/src/export/modules-js/custom-roles.js @@ -4,10 +4,8 @@ const path = require('path'); const chalk = require('chalk'); const mkdirp = require('mkdirp'); const { merge } = require('lodash'); -const helper = require('../util/helper'); -const { addlogs } = require('../util/log'); -const { formatError } = require('../util'); -const config = require('../../config/default'); +const { fileHelper, log, formatError } = require('../../utils'); +const { default: config } = require('../../config'); module.exports = class ExportCustomRoles { roles = {}; @@ -28,13 +26,14 @@ module.exports = class ExportCustomRoles { const self = this; try { - addlogs(this.config, 'Starting roles export', 'success'); + log(this.config, 'Starting roles export', 'success'); + const rolesFolderPath = path.resolve(this.config.data, this.config.branchName || '', this.rolesConfig.dirName); mkdirp.sync(rolesFolderPath); const roles = await self.stackAPIClient.role().fetchAll({ include_rules: true, include_permissions: true }); const customRoles = roles.items.filter((role) => !self.EXISTING_ROLES[role.name]); if (!customRoles.length) { - addlogs(self.config, 'No custom roles were found in the Stack', 'success'); + log(self.config, 'No custom roles were found in the Stack', 'success'); return; } await self.getCustomRolesLocales( @@ -45,21 +44,21 @@ module.exports = class ExportCustomRoles { ); self.customRoles = {}; customRoles.forEach((role) => { - addlogs(self.config, `'${role.name}' role was exported successfully`, 'success'); + log(self.config, `'${role.name}' role was exported successfully`, 'success'); self.customRoles[role.uid] = role; }); - helper.writeFileSync(path.join(rolesFolderPath, self.rolesConfig.fileName), self.customRoles); - addlogs(self.config, chalk.green('All the custom roles have been exported successfully'), 'success'); + fileHelper.writeFileSync(path.join(rolesFolderPath, self.rolesConfig.fileName), self.customRoles); + log(self.config, chalk.green('All the custom roles have been exported successfully'), 'success'); } catch (error) { if (error.statusCode === 401) { - addlogs( + log( self.config, 'You are not allowed to export roles, Unless you provide email and password in config', 'error', ); return; } - addlogs(self.config, `Error occurred in exporting roles. ${formatError(error)}`, 'error'); + log(self.config, `Error occurred in exporting roles. ${formatError(error)}`, 'error'); throw error; } } @@ -81,12 +80,12 @@ module.exports = class ExportCustomRoles { sourceLocalesMap[locale.uid] = locale; } for (const locale in localesMap) { - if(sourceLocalesMap[locale]!==undefined) { + if (sourceLocalesMap[locale] !== undefined) { delete sourceLocalesMap[locale]['stackHeaders']; } localesMap[locale] = sourceLocalesMap[locale]; } - helper.writeFileSync(customRolesLocalesFilepath, localesMap); + fileHelper.writeFileSync(customRolesLocalesFilepath, localesMap); } } }; diff --git a/packages/contentstack-export/src/lib/export/entries.js b/packages/contentstack-export/src/export/modules-js/entries.js similarity index 91% rename from packages/contentstack-export/src/lib/export/entries.js rename to packages/contentstack-export/src/export/modules-js/entries.js index 3091436cb7..e3aaf126e0 100644 --- a/packages/contentstack-export/src/lib/export/entries.js +++ b/packages/contentstack-export/src/export/modules-js/entries.js @@ -1,8 +1,7 @@ const path = require('path'); const chalk = require('chalk'); -const { addlogs } = require('../util/log'); -const fileHelper = require('../util/helper'); -const { executeTask, formatError } = require('../util'); +const { values } = require('lodash'); +const { executeTask, formatError, fileHelper, log } = require('../../utils'); class EntriesExport { constructor(exportConfig, stackAPIClient) { @@ -28,16 +27,16 @@ class EntriesExport { async start() { try { - addlogs(this.exportConfig, 'Starting entries export', 'info'); + log(this.exportConfig, 'Starting entries export', 'info'); const locales = await fileHelper.readFile(this.localesFilePath); const contentTypes = await fileHelper.readFile(this.schemaFilePath); if (contentTypes.length === 0) { - addlogs(this.exportConfig, 'No content types found to export entries', 'info'); + log(this.exportConfig, 'No content types found to export entries', 'info'); return; } const entryRequestOptions = this.createRequestObjects(locales, contentTypes); for (let requestOption of entryRequestOptions) { - addlogs( + log( this.exportConfig, `Starting export of entries of content_type - ${requestOption.content_type} locale - ${requestOption.locale}`, 'info', @@ -50,18 +49,18 @@ class EntriesExport { requestOption.locale + '.json', ); await fileHelper.writeLargeFile(entriesFilePath, entries); - addlogs( + log( this.exportConfig, `Exported entries of type '${requestOption.content_type}' locale '${requestOption.locale}'`, 'success', ); if (this.exportConfig.versioning) { - addlogs( + log( this.exportConfig, `Started export versioned entries of type '${requestOption.content_type}' locale '${requestOption.locale}'`, 'info', ); - for (let entry of entries) { + for (let entry of values(entries)) { const versionedEntries = await this.getEntryByVersion( { ...requestOption, @@ -83,7 +82,7 @@ class EntriesExport { versionedEntry, ); await executeTask(versionedEntries, write.bind(this), { concurrency: this.writeConcurrency }); - addlogs( + log( this.exportConfig, `Exported versioned entries of type '${requestOption.content_type}' locale '${requestOption.locale}'`, 'success', @@ -92,9 +91,9 @@ class EntriesExport { } } } - addlogs(this.exportConfig, chalk.green('Entries exported successfully'), 'success'); + log(this.exportConfig, chalk.green('Entries exported successfully'), 'success'); } catch (error) { - addlogs(this.exportConfig, `Failed to export entries ${formatError(error)}`, 'error'); + log(this.exportConfig, `Failed to export entries ${formatError(error)}`, 'error'); throw new Error('Failed to export entries'); } } diff --git a/packages/contentstack-export/src/lib/export/environments.js b/packages/contentstack-export/src/export/modules-js/environments.js similarity index 70% rename from packages/contentstack-export/src/lib/export/environments.js rename to packages/contentstack-export/src/export/modules-js/environments.js index 52255cf0f1..685e0a7aba 100644 --- a/packages/contentstack-export/src/lib/export/environments.js +++ b/packages/contentstack-export/src/export/modules-js/environments.js @@ -7,11 +7,7 @@ const path = require('path'); const chalk = require('chalk'); const mkdirp = require('mkdirp'); const { merge } = require('lodash'); - -const helper = require('../util/helper'); -const { addlogs } = require('../util/log'); -const { formatError } = require('../util'); - +const { fileHelper, log, formatError } = require('../../utils'); module.exports = class ExportEnvironments { config = {}; master = {}; @@ -39,10 +35,9 @@ module.exports = class ExportEnvironments { ); // Create folder for environments - mkdirp.sync(environmentsFolderPath); - addlogs(self.config, 'Starting environment export', 'success'); - - return new Promise((resolve, reject) => { + fileHelper.makeDirectory(environmentsFolderPath); + log(this.config, 'Starting environment export', 'success'); + return new Promise(function (resolve, reject) { self.stackAPIClient .environment() .query(self.requestOptions.qs) @@ -56,17 +51,17 @@ module.exports = class ExportEnvironments { delete self.environments[envUid].uid; delete self.environments[envUid]['ACL']; } - helper.writeFileSync(path.join(environmentsFolderPath, environmentConfig.fileName), self.environments); - addlogs(self.config, chalk.green('All the environments have been exported successfully'), 'success'); + fileHelper.writeFileSync(path.join(environmentsFolderPath, environmentConfig.fileName), self.environments); + log(self.config, chalk.green('All the environments have been exported successfully'), 'success'); return resolve(); } if (environmentResponse.items.length === 0) { - addlogs(self.config, 'No environments found', 'success'); + log(self.config, 'No environments found', 'success'); resolve(); } }) .catch((error) => { - addlogs(self.config, `Environments export failed. ${formatError(error)}`, 'error'); + log(self.config, `Environments export failed. ${formatError(error)}`, 'error'); reject(error); }); }); diff --git a/packages/contentstack-export/src/lib/export/extensions.js b/packages/contentstack-export/src/export/modules-js/extensions.js similarity index 71% rename from packages/contentstack-export/src/lib/export/extensions.js rename to packages/contentstack-export/src/export/modules-js/extensions.js index e96df98c56..8dced426b5 100644 --- a/packages/contentstack-export/src/lib/export/extensions.js +++ b/packages/contentstack-export/src/export/modules-js/extensions.js @@ -8,11 +8,8 @@ const mkdirp = require('mkdirp'); const path = require('path'); const chalk = require('chalk'); const { merge } = require('lodash'); - -const helper = require('../util/helper'); -const { addlogs } = require('../util/log'); -const { formatError } = require('../util'); -let config = require('../../config/default'); +const { formatError, log, fileHelper } = require('../../utils'); +const { default: config } = require('../../config'); module.exports = class ExportExtensions { master = {}; @@ -29,7 +26,7 @@ module.exports = class ExportExtensions { } start() { - addlogs(this.config, 'Starting extension export', 'success'); + log(this.config, 'Starting extension export', 'success'); const self = this; const extensionsFolderPath = path.resolve( @@ -53,15 +50,15 @@ module.exports = class ExportExtensions { delete self.extensions[extUid].uid; delete self.extensions[extUid].SYS_ACL; } - helper.writeFileSync(path.join(extensionsFolderPath, self.extensionConfig.fileName), self.extensions); - addlogs(self.config, chalk.green('All the extensions have been exported successfully'), 'success'); + fileHelper.writeFileSync(path.join(extensionsFolderPath, self.extensionConfig.fileName), self.extensions); + log(self.config, chalk.green('All the extensions have been exported successfully'), 'success'); return resolve(); } - addlogs(self.config, 'No extensions found', 'success'); + log(self.config, 'No extensions found', 'success'); resolve(); }) .catch((error) => { - addlogs(self.config, `Failed to export extensions. ${formatError(error)}`, 'error'); + log(self.config, `Failed to export extensions. ${formatError(error)}`, 'error'); reject(); }); }); diff --git a/packages/contentstack-export/src/lib/export/global-fields.js b/packages/contentstack-export/src/export/modules-js/global-fields.js similarity index 81% rename from packages/contentstack-export/src/lib/export/global-fields.js rename to packages/contentstack-export/src/export/modules-js/global-fields.js index b2f4dae4e4..7b2ee936c3 100644 --- a/packages/contentstack-export/src/lib/export/global-fields.js +++ b/packages/contentstack-export/src/export/modules-js/global-fields.js @@ -8,11 +8,8 @@ const path = require('path'); const chalk = require('chalk'); const mkdirp = require('mkdirp'); const { merge } = require('lodash'); - -const helper = require('../util/helper'); -const { addlogs } = require('../util/log'); -const { formatError } = require('../util'); -let config = require('../../config/default'); +const { formatError, log, fileHelper } = require('../../utils'); +const { default: config } = require('../../config'); module.exports = class ExportGlobalFields { limit = 100; @@ -47,7 +44,7 @@ module.exports = class ExportGlobalFields { const self = this; // Create folder for Global Fields mkdirp.sync(self.globalfieldsFolderPath); - addlogs(self.config, 'Starting Global Fields export', 'success'); + log(self.config, 'Starting Global Fields export', 'success'); return new Promise(function (resolve, reject) { try { @@ -61,7 +58,7 @@ module.exports = class ExportGlobalFields { }) .catch(reject); } catch (error) { - addlogs(self.config, error, 'error'); + log(self.config, error, 'error'); return reject(error); } }); @@ -78,7 +75,7 @@ module.exports = class ExportGlobalFields { .then((globalFieldResponse) => { try { if (globalFieldResponse.items.length === 0) { - addlogs(globalFieldConfig, 'No global fields found', 'success'); + log(globalFieldConfig, 'No global fields found', 'success'); return resolve('No Global Fields'); } globalFieldResponse.items.forEach(function (globalField) { @@ -95,7 +92,7 @@ module.exports = class ExportGlobalFields { } return self.getGlobalFields(skip, globalFieldConfig).then(resolve).catch(reject); } catch (error) { - addlogs(globalFieldConfig, `Failed to export global-fields. ${formatError(error)}`, 'error'); + log(globalFieldConfig, `Failed to export global-fields. ${formatError(error)}`, 'error'); reject(error); } }) @@ -107,14 +104,15 @@ module.exports = class ExportGlobalFields { const self = this; return new Promise(function (resolve, reject) { try { - helper.writeFileSync( + fileHelper.writeFileSync( path.join(self.globalfieldsFolderPath, self.globalfieldsConfig.fileName), self.global_fields, ); - addlogs(self.config, chalk.green('Global Fields export completed successfully'), 'success'); + log(self.config, chalk.green('Global Fields export completed successfully'), 'success'); + resolve(); } catch (error) { - addlogs(self.config, error, 'error'); + log(self.config, error, 'error'); reject(error); } }); diff --git a/packages/contentstack-export/src/export/modules-js/index.js b/packages/contentstack-export/src/export/modules-js/index.js new file mode 100644 index 0000000000..23233448ad --- /dev/null +++ b/packages/contentstack-export/src/export/modules-js/index.js @@ -0,0 +1,8 @@ +async function startModuleExport(modulePayload) { + const { moduleName, exportConfig, stackAPIClient } = modulePayload; + const { default: ModuleRunner } = await import(`./${moduleName}.js`); + const moduleRunner = new ModuleRunner(exportConfig, stackAPIClient); + return moduleRunner.start(); +} + +module.exports = startModuleExport; diff --git a/packages/contentstack-export/src/lib/export/labels.js b/packages/contentstack-export/src/export/modules-js/labels.js similarity index 66% rename from packages/contentstack-export/src/lib/export/labels.js rename to packages/contentstack-export/src/export/modules-js/labels.js index 19a5142bfd..03e19ef4d9 100644 --- a/packages/contentstack-export/src/lib/export/labels.js +++ b/packages/contentstack-export/src/export/modules-js/labels.js @@ -8,11 +8,8 @@ const path = require('path'); const chalk = require('chalk'); const mkdirp = require('mkdirp'); const { merge } = require('lodash'); - -const helper = require('../util/helper'); -const { addlogs } = require('../util/log'); -const { formatError } = require('../util'); -const config = require('../../config/default'); +const { formatError, log, fileHelper } = require('../../utils'); +const { default: config } = require('../../config'); module.exports = class ExportLabels { labels = {}; @@ -24,7 +21,7 @@ module.exports = class ExportLabels { } start() { - addlogs(this.config, 'Starting labels export', 'success'); + log(this.config, 'Starting labels export', 'success'); const self = this; const labelsFolderPath = path.resolve(config.data, this.config.branchName || '', self.labelConfig.dirName); // Create locale folder @@ -37,29 +34,28 @@ module.exports = class ExportLabels { .then((response) => { if (response.items.length !== 0) { response.items.forEach(function (label) { - addlogs(self.config, `'${label.name}' label was exported successfully`, 'success'); + log(self.config, `'${label.name}' label was exported successfully`, 'success'); self.labels[label.uid] = label; const deleteItems = self.config.modules.labels.invalidKeys; deleteItems.forEach((e) => delete label[e]); }); - addlogs(self.config, chalk.green('All the labels have been exported successfully'), 'success'); + log(self.config, chalk.green('All the labels have been exported successfully'), 'success'); } else { - addlogs(self.config, 'No labels found', 'success'); + log(self.config, 'No labels found', 'success'); } - helper.writeFileSync(path.join(labelsFolderPath, self.labelConfig.fileName), self.labels); + fileHelper.writeFileSync(path.join(labelsFolderPath, self.labelConfig.fileName), self.labels); resolve(); }) .catch(function (error) { if (error.statusCode === 401) { - addlogs( + log( self.config, 'You are not allowed to export label, Unless you provide email and password in config', - 'error' + 'error', ); return resolve(); } - - addlogs(self.config, `Failed to export labels. ${formatError(error)}`, 'error'); + log(self.config, `Failed to export labels. ${formatError(error)}`, 'error'); reject(); }); }); diff --git a/packages/contentstack-export/src/lib/export/locales.js b/packages/contentstack-export/src/export/modules-js/locales.js similarity index 80% rename from packages/contentstack-export/src/lib/export/locales.js rename to packages/contentstack-export/src/export/modules-js/locales.js index 0d7ec8fe23..9aac775951 100644 --- a/packages/contentstack-export/src/lib/export/locales.js +++ b/packages/contentstack-export/src/export/modules-js/locales.js @@ -1,8 +1,6 @@ const path = require('path'); const chalk = require('chalk'); -const fileHelper = require('../util/helper'); -const { addlogs } = require('../util/log'); -const { formatError } = require('../util'); +const { formatError, log, fileHelper } = require('../../utils'); class LocaleExport { constructor(exportConfig, stackAPIClient) { this.stackAPIClient = stackAPIClient; @@ -26,14 +24,14 @@ class LocaleExport { async start() { try { - addlogs(this.exportConfig, 'Starting locale export', 'success'); - await fileHelper.makeDirectory(this.localesPath); + log(this.exportConfig, 'Starting locale export', 'success'); + fileHelper.makeDirectory(this.localesPath); await this.getLocales(); await fileHelper.writeFile(path.join(this.localesPath, this.localeConfig.fileName), this.locales); await fileHelper.writeFile(path.join(this.localesPath, this.masterLocaleConfig.fileName), this.masterLocale); - addlogs(this.exportConfig, 'Completed locale export', 'success'); + log(this.exportConfig, 'Completed locale export', 'success'); } catch (error) { - addlogs(this.exportConfig, `Failed to export locales. ${formatError(error)}`, 'error'); + log(this.exportConfig, `Failed to export locales. ${formatError(error)}`, 'error'); throw new Error('Failed to export locales'); } } @@ -60,9 +58,9 @@ class LocaleExport { delete locale[key]; } } - if(locale.code === this.exportConfig.master_locale.code){ + if (locale.code === this.exportConfig.master_locale.code) { this.masterLocale[locale.uid] = locale; - }else{ + } else { this.locales[locale.uid] = locale; } }); diff --git a/packages/contentstack-export/src/lib/export/marketplace-apps.js b/packages/contentstack-export/src/export/modules-js/marketplace-apps.js similarity index 67% rename from packages/contentstack-export/src/lib/export/marketplace-apps.js rename to packages/contentstack-export/src/export/modules-js/marketplace-apps.js index 0165bfe0a7..a9b94e09d7 100644 --- a/packages/contentstack-export/src/lib/export/marketplace-apps.js +++ b/packages/contentstack-export/src/export/modules-js/marketplace-apps.js @@ -7,6 +7,7 @@ const _ = require('lodash'); const path = require('path'); const chalk = require('chalk'); const mkdirp = require('mkdirp'); +const eachOf = require('async/eachOf'); const { cliux, HttpClient, @@ -16,12 +17,9 @@ const { OauthDecorator, isAuthenticated, } = require('@contentstack/cli-utilities'); - -const { formatError } = require('../util'); -const config = require('../../config/default'); -const { addlogs: log } = require('../util/log'); -const { writeFileSync } = require('../util/helper'); -const { getDeveloperHubUrl } = require('../util/marketplace-app-helper'); +const { default: config } = require('../../config'); +const { formatError, log, fileHelper } = require('../../utils'); +const { getDeveloperHubUrl, createNodeCryptoInstance } = require('../../utils'); module.exports = class ExportMarketplaceApps { client; @@ -45,7 +43,7 @@ module.exports = class ExportMarketplaceApps { return Promise.resolve(); } - this.developerHubBaseUrl = this.config.developerHubBaseUrl || (await getDeveloperHubUrl()); + this.developerHubBaseUrl = this.config.developerHubBaseUrl || (await getDeveloperHubUrl(this.config)); await this.getOrgUid(); @@ -67,6 +65,8 @@ module.exports = class ExportMarketplaceApps { ); mkdirp.sync(this.marketplaceAppPath); + this.nodeCrypto= await createNodeCryptoInstance(config); + return this.exportInstalledExtensions(); } @@ -76,6 +76,7 @@ module.exports = class ExportMarketplaceApps { .stack({ api_key: this.config.source_stack }) .fetch() .catch((error) => { + log(this.config, formatError(error), 'error'); console.log(error); }); @@ -84,30 +85,8 @@ module.exports = class ExportMarketplaceApps { } } - async createNodeCryptoInstance() { - const cryptoArgs = {}; - - if (this.config.forceStopMarketplaceAppsPrompt) { - cryptoArgs['encryptionKey'] = this.config.marketplaceAppEncryptionKey; - } else { - cryptoArgs['encryptionKey'] = await cliux.inquire({ - type: 'input', - name: 'name', - default: this.config.marketplaceAppEncryptionKey, - validate: (url) => { - if (!url) return "Encryption key can't be empty."; - - return true; - }, - message: 'Enter marketplace app configurations encryption key', - }); - } - - this.nodeCrypto = new NodeCrypto(cryptoArgs); - } - async exportInstalledExtensions() { - const client = await managementSDKClient({ host: this.developerHubBaseUrl.split("://").pop() }) + const client = await managementSDKClient({ host: this.developerHubBaseUrl.split('://').pop() }); const installedApps = (await this.getAllStackSpecificApps()) || []; if (!_.isEmpty(installedApps)) { @@ -115,7 +94,10 @@ module.exports = class ExportMarketplaceApps { await this.getAppConfigurations(client, installedApps, [+index, app]); } - await writeFileSync(path.join(this.marketplaceAppPath, this.marketplaceAppConfig.fileName), installedApps); + await fileHelper.writeFileSync( + path.join(this.marketplaceAppPath, this.marketplaceAppConfig.fileName), + installedApps, + ); log(this.config, chalk.green('All the marketplace apps have been exported successfully'), 'success'); } else { @@ -159,26 +141,26 @@ module.exports = class ExportMarketplaceApps { log(this.config, `Exporting ${appName} app and it's config.`, 'success'); await sdkClient - .organization(this.config.org_uid) - .app(appInstallation.manifest.uid) - .installation(appInstallation.uid) - .installationData() - .then(async result => { - const {data, error} = result; - if (_.has(data, 'server_configuration')) { - if (!this.nodeCrypto && _.has(data, 'server_configuration')) { - await this.createNodeCryptoInstance(); + .organization(this.config.org_uid) + .app(appInstallation.manifest.uid) + .installation(appInstallation.uid) + .installationData() + .then(async (result) => { + const { data, error } = result; + if (_.has(data, 'server_configuration')) { + if (!this.nodeCrypto && _.has(data, 'server_configuration')) { + await this.createNodeCryptoInstance(); + } + + if (!_.isEmpty(data.server_configuration)) { + installedApps[index]['server_configuration'] = this.nodeCrypto.encrypt(data.server_configuration); + log(this.config, `Exported ${appName} app and it's config.`, 'success'); + } else { + log(this.config, `Exported ${appName} app`, 'success'); + } + } else if (error) { + log(this.config, `Error on exporting ${appName} app and it's config.`, 'error'); } - - if (!_.isEmpty(data.server_configuration)) { - installedApps[index]['server_configuration'] = this.nodeCrypto.encrypt(data.server_configuration); - log(this.config, `Exported ${appName} app and it's config.`, 'success'); - } else { - log(this.config, `Exported ${appName} app`, 'success'); - } - } else if (error) { - log(this.config, `Error on exporting ${appName} app and it's config.`, 'error'); - } }) .catch(err => { log(this.config, `Failed to export ${appName} app config ${formatError(err)}`, 'error'); diff --git a/packages/contentstack-export/src/lib/export/stack.js b/packages/contentstack-export/src/export/modules-js/stack.js similarity index 75% rename from packages/contentstack-export/src/lib/export/stack.js rename to packages/contentstack-export/src/export/modules-js/stack.js index db70375153..4f4e8329c4 100644 --- a/packages/contentstack-export/src/lib/export/stack.js +++ b/packages/contentstack-export/src/export/modules-js/stack.js @@ -6,18 +6,17 @@ const path = require('path'); const mkdirp = require('mkdirp'); -const { merge } = require('lodash'); -const helper = require('../util/helper'); -const { addlogs } = require('../util/log'); -const config = require('../../config/default'); +const merge = require('lodash/merge'); +const { default: config } = require('../../config'); const { managementSDKClient, isAuthenticated } = require('@contentstack/cli-utilities'); -module.exports = class ExportStack { +const { log, fileHelper, formatError } = require('../../utils'); + +class ExportStack { stackConfig = config.modules.stack; - constructor(exportConfig, stackAPIClient, APIClient) { + constructor(exportConfig, stackAPIClient) { this.config = merge(config, exportConfig); this.stackAPIClient = stackAPIClient; - this.APIClient = APIClient; this.requestOption = { uri: this.config.host + this.config.apis.stacks, headers: this.config.headers, @@ -49,18 +48,18 @@ module.exports = class ExportStack { }; return self.getLocales(apiDetails); } else if (self.config.preserveStackVersion) { - addlogs(self.config, 'Exporting stack details', 'success'); - let stackFolderPath = path.resolve(self.config.data, stackConfig.dirName); - let stackContentsFile = path.resolve(stackFolderPath, stackConfig.fileName); + log(self.config, 'Exporting stack details', 'success'); + let stackFolderPath = path.resolve(self.config.data, this.stackConfig.dirName); + let stackContentsFile = path.resolve(stackFolderPath, this.stackConfig.fileName); mkdirp.sync(stackFolderPath); return new Promise((resolve, reject) => { - return self.APIClient.stack({ api_key: self.config.source_stack }) + return self.stackAPIClient .fetch() .then((response) => { - helper.writeFile(stackContentsFile, response); - addlogs(self.config, 'Exported stack details successfully!', 'success'); + fileHelper.writeFile(stackContentsFile, response); + log(self.config, 'Exported stack details successfully!', 'success'); return resolve(response); }) .catch(reject); @@ -95,4 +94,6 @@ module.exports = class ExportStack { }); }); } -}; +} + +module.exports = ExportStack; diff --git a/packages/contentstack-export/src/lib/export/webhooks.js b/packages/contentstack-export/src/export/modules-js/webhooks.js similarity index 73% rename from packages/contentstack-export/src/lib/export/webhooks.js rename to packages/contentstack-export/src/export/modules-js/webhooks.js index 6c053d97b6..32c5d5c02e 100644 --- a/packages/contentstack-export/src/lib/export/webhooks.js +++ b/packages/contentstack-export/src/export/modules-js/webhooks.js @@ -8,11 +8,8 @@ const path = require('path'); const chalk = require('chalk'); const mkdirp = require('mkdirp'); const { merge } = require('lodash'); - -const helper = require('../util/helper'); -const { formatError } = require('../util'); -const { addlogs } = require('../util/log'); -const config = require('../../config/default'); +const { default: config } = require('../../config'); +const { formatError, log, fileHelper } = require('../../utils'); // Create folder for environments module.exports = class ExportWebhooks { @@ -31,7 +28,7 @@ module.exports = class ExportWebhooks { } start() { - addlogs(this.config, 'Starting webhooks export', 'success'); + log(this.config, 'Starting webhooks export', 'success'); const self = this; const webhooksFolderPath = path.resolve( this.config.data, @@ -52,23 +49,23 @@ module.exports = class ExportWebhooks { delete self.webhooks[webUid].uid; delete self.webhooks[webUid].SYS_ACL; } - helper.writeFileSync(path.join(webhooksFolderPath, self.webhooksConfig.fileName), self.webhooks); - addlogs(self.config, chalk.green('All the webhooks have been exported successfully'), 'success'); + fileHelper.writeFileSync(path.join(webhooksFolderPath, self.webhooksConfig.fileName), self.webhooks); + log(self.config, chalk.green('All the webhooks have been exported successfully'), 'success'); return resolve(); } - addlogs(self.config, 'No webhooks found', 'success'); + log(self.config, 'No webhooks found', 'success'); resolve(); }) .catch(function (error) { if (error.statusCode === 401) { - addlogs( + log( self.config, 'You are not allowed to export webhooks, Unless you provide email and password in config', 'error', ); return resolve(); } - addlogs(self.config, `Failed to export webhooks. ${formatError(error)}`, 'error'); + log(self.config, `Failed to export webhooks. ${formatError(error)}`, 'error'); reject('Failed to export webhooks'); }); }); diff --git a/packages/contentstack-export/src/lib/export/workflows.js b/packages/contentstack-export/src/export/modules-js/workflows.js similarity index 71% rename from packages/contentstack-export/src/lib/export/workflows.js rename to packages/contentstack-export/src/export/modules-js/workflows.js index 4ae13d3137..ec9460850c 100644 --- a/packages/contentstack-export/src/lib/export/workflows.js +++ b/packages/contentstack-export/src/export/modules-js/workflows.js @@ -8,12 +8,8 @@ const path = require('path'); const chalk = require('chalk'); const mkdirp = require('mkdirp'); const { merge } = require('lodash'); - -const helper = require('../util/helper'); -const { addlogs } = require('../util/log'); -const { formatError } = require('../util'); -const config = require('../../config/default'); - +const { formatError, log, fileHelper } = require('../../utils'); +const { default: config } = require('../../config'); module.exports = class ExportWorkFlows { config; workflows = {}; @@ -25,7 +21,7 @@ module.exports = class ExportWorkFlows { } start() { - addlogs(this.config, 'Starting workflow export', 'success'); + log(this.config, 'Starting workflow export', 'success'); const self = this; const workflowsFolderPath = path.resolve( @@ -43,28 +39,28 @@ module.exports = class ExportWorkFlows { try { if (response.items.length) { await self.getWorkflowsData(self, response.items); - addlogs(self.config, chalk.green('All the workflow have been exported successfully'), 'success'); + log(self.config, chalk.green('All the workflow have been exported successfully'), 'success'); } if (!response.items.length) { - addlogs(self.config, 'No workflow were found in the Stack', 'success'); + log(self.config, 'No workflow were found in the Stack', 'success'); } - helper.writeFileSync(path.join(workflowsFolderPath, self.workFlowConfig.fileName), self.workflows); + fileHelper.writeFileSync(path.join(workflowsFolderPath, self.workFlowConfig.fileName), self.workflows); resolve(); } catch (error) { - addlogs(self.config, formatError(error), 'error'); + log(self.config, formatError(error), 'error'); reject(error); } }) .catch(function (error) { if (error.statusCode === 401) { - addlogs( + log( self.config, 'You are not allowed to export workflow, Unless you provide email and password in config', 'error', ); return resolve(); } - addlogs(self.config, formatError(error), 'error'); + log(self.config, formatError(error), 'error'); resolve(); }); }); @@ -84,7 +80,7 @@ module.exports = class ExportWorkFlows { } } } catch (error) { - addlogs(self.config, `Error fetching roles in export workflows task. ${formatError(error)}`, 'error'); + log(self.config, `Error fetching roles in export workflows task. ${formatError(error)}`, 'error'); throw new Error({ message: 'Error fetching roles in export workflows task.' }); } } @@ -92,14 +88,14 @@ module.exports = class ExportWorkFlows { async getWorkflowsData(self, workflows) { try { for (const workflow of workflows) { - addlogs(self.config, workflow.name + ' workflow was exported successfully', 'success'); + log(self.config, workflow.name + ' workflow was exported successfully', 'success'); await self.getWorkflowRoles(self, workflow); self.workflows[workflow.uid] = workflow; const deleteItems = config.modules.workflows.invalidKeys; deleteItems.forEach((e) => delete workflow[e]); } } catch (error) { - addlogs(self.config, `Error fetching workflow data in export workflows task. ${formatError(error)}`, 'error'); + log(self.config, `Error fetching workflow data in export workflows task. ${formatError(error)}`, 'error'); throw error; } } diff --git a/packages/contentstack-export/src/export/modules/assets.ts b/packages/contentstack-export/src/export/modules/assets.ts new file mode 100644 index 0000000000..429c7f82a3 --- /dev/null +++ b/packages/contentstack-export/src/export/modules/assets.ts @@ -0,0 +1,370 @@ +import map from 'lodash/map'; +import chunk from 'lodash/chunk'; +import first from 'lodash/first'; +import merge from 'lodash/merge'; +import filter from 'lodash/filter'; +import uniqBy from 'lodash/uniqBy'; +import values from 'lodash/values'; +import entries from 'lodash/entries'; +import isEmpty from 'lodash/isEmpty'; +import includes from 'lodash/includes'; +import progress from 'progress-stream'; +import { createWriteStream } from 'node:fs'; +import { resolve as pResolve } from 'node:path'; +import { FsUtility, getDirectories, configHandler } from '@contentstack/cli-utilities'; + +import { ModuleClassParams } from '../../types'; +import config from '../../config'; +import { log } from '../../utils'; +import BaseClass, { CustomPromiseHandler, CustomPromiseHandlerInput } from './base-class'; + +export default class ExportAssets extends BaseClass { + private assetsRootPath: string; + public assetConfig = config.modules.assets; + private assetsFolder: Record[] = []; + public versionedAssets: Record[] = []; + + constructor({ exportConfig, stackAPIClient }: ModuleClassParams) { + super({ exportConfig, stackAPIClient }); + } + + get commonQueryParam(): Record { + return { + skip: 0, + asc: 'created_at', + include_count: false, + }; + } + + async start(): Promise { + this.assetsRootPath = pResolve( + this.exportConfig.data, + this.exportConfig.branchName || '', + this.assetConfig.dirName, + ); + + // NOTE step 1: Get assets and it's folder count in parallel + const [assetsCount, assetsFolderCount] = await Promise.all([this.getAssetsCount(), this.getAssetsCount(true)]); + + // NOTE step 2: Get assets and it's folder data in parallel + await Promise.all([this.getAssetsFolders(assetsFolderCount), this.getAssets(assetsCount)]); + + // NOTE step 3: Get versioned assets + if (!isEmpty(this.versionedAssets) && this.assetConfig.includeVersionedAssets) { + await this.getVersionedAssets(); + } + + // NOTE step 4: Download all assets + await this.downloadAssets(); + + log(this.exportConfig, 'Assets exported successfully.!', 'info'); + } + + /** + * @method getAssetsFolders + * @param {number} totalCount number + * @returns Promise + */ + getAssetsFolders(totalCount: number | void): Promise | void> { + if (!totalCount) return Promise.resolve(); + + const queryParam = { + ...this.commonQueryParam, + query: { is_dir: true }, + }; + + const onSuccess = ({ response: { items } }: any) => { + if (!isEmpty(items)) this.assetsFolder.push(...items); + }; + const onReject = ({ error }: any) => { + log(this.exportConfig, 'Export asset folder query failed', 'error'); + log(this.exportConfig, error, 'error'); + }; + + return this.makeConcurrentCall({ + totalCount, + apiParams: { + queryParam, + module: 'assets', + reject: onReject, + resolve: onSuccess, + }, + module: 'assets folders', + concurrencyLimit: this.assetConfig.fetchConcurrency, + }).then(() => { + if (!isEmpty(this.assetsFolder)) { + new FsUtility({ basePath: this.assetsRootPath }).writeFile( + pResolve(this.assetsRootPath, 'folders.json'), + this.assetsFolder, + ); + } + log(this.exportConfig, 'Assets folder Exported successfully.!', 'info'); + }); + } + + /** + * @method getAssets + * @param totalCount number + * @returns Promise + */ + getAssets(totalCount: number | void): Promise { + if (!totalCount) return Promise.resolve(); + + let fs: FsUtility; + let metaHandler: ((array: any) => any) | undefined; + const queryParam = { + ...this.commonQueryParam, + include_publish_details: true, + except: { BASE: this.assetConfig.invalidKeys }, + }; + + if (this.assetConfig.includeVersionedAssets) { + const customHandler = (array: Array) => { + const versionAssets: Array = filter(array, ({ _version }: any) => _version > 1); + if (!isEmpty(versionAssets)) { + this.versionedAssets.push( + ...map(versionAssets, ({ uid, _version }: any) => ({ + [uid]: _version, + })), + ); + } + }; + metaHandler = customHandler; + } + + const onReject = ({ error }: any) => { + log(this.exportConfig, 'Export asset query failed', 'error'); + log(this.exportConfig, error.message, 'error'); + }; + + const onSuccess = ({ response: { items } }: any) => { + if (!fs && !isEmpty(items)) { + fs = new FsUtility({ + metaHandler, + moduleName: 'assets', + indexFileName: 'assets.json', + basePath: this.assetsRootPath, + chunkFileSize: this.assetConfig.chunkFileSize, + metaPickKeys: merge(['uid', 'url', 'filename'], this.assetConfig.assetsMetaKeys), + }); + } + if (!isEmpty(items)) fs?.writeIntoFile(items, { mapKeyVal: true }); + }; + + return this.makeConcurrentCall({ + module: 'assets', + totalCount, + apiParams: { + queryParam, + module: 'assets', + reject: onReject, + resolve: onSuccess, + }, + concurrencyLimit: this.assetConfig.fetchConcurrency, + }).then(() => { + fs?.completeFile(true); + log(this.exportConfig, 'Assets metadata exported successfully.!', 'info'); + }); + } + + /** + * @method getVersionedAssets + * @returns Promise + */ + getVersionedAssets(): Promise { + let fs: FsUtility; + const queryParam = { + ...this.commonQueryParam, + include_publish_details: true, + except: { BASE: this.assetConfig.invalidKeys }, + }; + const versionedAssets = map(this.versionedAssets, (element) => { + const batch = []; + const [uid, version]: any = first(entries(element)); + + for (let index = 1; index < version; index++) { + batch.push({ [uid]: index }); + } + + return batch; + }).flat(); + const apiBatches: Array = chunk(versionedAssets, this.assetConfig.fetchConcurrency); + + const promisifyHandler: CustomPromiseHandler = (input: CustomPromiseHandlerInput) => { + const { index, batchIndex, apiParams, isLastRequest } = input; + const batch: Record = apiBatches[batchIndex][index]; + const [uid, version]: any = first(entries(batch)); + + if (apiParams?.queryParam) { + apiParams.uid = uid; + apiParams.queryParam.version = version; + + return this.makeAPICall(apiParams, isLastRequest); + } + + return Promise.resolve(); + }; + const onSuccess = ({ response }: any) => { + if (!fs && !isEmpty(response)) { + fs = new FsUtility({ + moduleName: 'assets', + indexFileName: 'versioned-assets.json', + chunkFileSize: this.assetConfig.chunkFileSize, + basePath: pResolve(this.assetsRootPath, 'versions'), + metaPickKeys: merge(['uid', 'url', 'filename', '_version'], this.assetConfig.assetsMetaKeys), + }); + } + if (!isEmpty(response)) + fs?.writeIntoFile([response], { + mapKeyVal: true, + keyName: ['uid', '_version'], + }); + }; + const onReject = ({ error }: any) => { + log(this.exportConfig, 'Export versioned asset query failed', 'error'); + log(this.exportConfig, error, 'error'); + }; + + return this.makeConcurrentCall( + { + apiBatches, + apiParams: { + queryParam, + module: 'asset', + reject: onReject, + resolve: onSuccess, + }, + module: 'versioned assets', + totalCount: versionedAssets.length, + concurrencyLimit: this.assetConfig.fetchConcurrency, + }, + promisifyHandler, + ).then(() => { + fs?.completeFile(true); + log(this.exportConfig, 'Assets folder Exported successfully.!', 'info'); + }); + } + + /** + * @method getAssetsCount + * @param isDir boolean + * @returns Promise + */ + getAssetsCount(isDir = false): Promise { + const queryParam: any = { + limit: 1, + ...this.commonQueryParam, + skip: 10 ** 100, + }; + + if (isDir) queryParam.query = { is_dir: true }; + + return this.stack + .asset() + .query(queryParam) + .count() + .then(({ assets }: any) => assets) + .catch((error: Error) => { + log(this.exportConfig, 'Get count query failed', 'error'); + log(this.exportConfig, error, 'error'); + }); + } + + /** + * @method downloadAssets + * @returns Promise + */ + async downloadAssets(): Promise { + const fs: FsUtility = new FsUtility({ + fileExt: 'json', + createDirIfNotExist: false, + basePath: this.assetsRootPath, + }); + const assetsMetaData = fs.getPlainMeta(); + + let listOfAssets = values(assetsMetaData).flat(); + + if (this.assetConfig.includeVersionedAssets) { + const versionedAssetsMetaData = fs.getPlainMeta(pResolve(this.assetsRootPath, 'versions', 'metadata.json')); + + listOfAssets.push(...values(versionedAssetsMetaData).flat()); + } + + listOfAssets = uniqBy(listOfAssets, 'url'); + + const apiBatches: Array = chunk(listOfAssets, this.assetConfig.downloadLimit); + const downloadedAssetsDirs = await getDirectories(pResolve(this.assetsRootPath, 'files')); + + const onSuccess = ({ response: { data }, additionalInfo }: any) => { + const { asset } = additionalInfo; + const assetFolderPath = pResolve(this.assetsRootPath, 'files', asset.uid); + const assetFilePath = pResolve(assetFolderPath, asset.filename); + + if (!includes(downloadedAssetsDirs, asset.uid)) { + fs.createFolderIfNotExist(assetFolderPath); + } + + const assetWriterStream = createWriteStream(assetFilePath); + assetWriterStream.on('error', (error) => { + log(this.exportConfig, `Downloaded failed ${asset.filename}: ${asset.uid}!`, 'error'); + log(this.exportConfig, error, 'error'); + }); + /** + * NOTE if pipe not working as expected add the following code below to fix the issue + * https://oramind.com/using-streams-efficiently-in-nodejs/ + * import * as stream from "stream"; + * import { promisify } from "util"; + * const finished = promisify(stream.finished); + * await finished(assetWriterStream); + */ + if (this.assetConfig.enableDownloadStatus) { + const str = progress({ + time: 5000, + length: data.headers['content-length'], + }); + str.on('progress', function (progressData) { + console.log(`${asset.filename}: ${Math.round(progressData.percentage)}%`); + }); + data.pipe(str).pipe(assetWriterStream); + } else { + data.pipe(assetWriterStream); + } + + log(this.exportConfig, `Downloaded ${asset.filename}: ${asset.uid} successfully!`, 'success'); + }; + + const onReject = ({ error, additionalInfo }: any) => { + const { asset } = additionalInfo; + log(this.exportConfig, `Downloaded failed ${asset.filename}: ${asset.uid}!`, 'error'); + log(this.exportConfig, error, 'error'); + }; + + const promisifyHandler: CustomPromiseHandler = (input: CustomPromiseHandlerInput) => { + const { index, batchIndex } = input; + const asset: any = apiBatches[batchIndex][index]; + const url = this.assetConfig.securedAssets + ? `${asset.url}?authtoken=${configHandler.get('authtoken')}` + : asset.url; + + return this.makeAPICall({ + reject: onReject, + resolve: onSuccess, + url: encodeURI(url), + module: 'download-asset', + additionalInfo: { asset }, + }); + }; + + return this.makeConcurrentCall( + { + apiBatches, + module: 'assets download', + totalCount: listOfAssets.length, + concurrencyLimit: this.assetConfig.downloadLimit, + }, + promisifyHandler, + ).then(() => { + log(this.exportConfig, 'Assets download completed successfully.!', 'info'); + }); + } +} diff --git a/packages/contentstack-export/src/export/modules/base-class.ts b/packages/contentstack-export/src/export/modules/base-class.ts new file mode 100644 index 0000000000..90cb015942 --- /dev/null +++ b/packages/contentstack-export/src/export/modules/base-class.ts @@ -0,0 +1,183 @@ +import map from 'lodash/map'; +import fill from 'lodash/fill'; +import last from 'lodash/last'; +import chunk from 'lodash/chunk'; +import isEmpty from 'lodash/isEmpty'; +import entries from 'lodash/entries'; +import isEqual from 'lodash/isEqual'; + +import { log } from '../../utils'; +import { ExportConfig, ModuleClassParams } from '../../types'; + +export type ApiOptions = { + uid?: string; + url?: string; + module: ApiModuleType; + queryParam?: Record; + resolve: (value: any) => void; + reject: (error: any) => void; + additionalInfo?: Record; +}; + +export type EnvType = { + module: string; + totalCount: number; + apiBatches?: number[]; + concurrencyLimit: number; + apiParams?: ApiOptions; +}; + +export type CustomPromiseHandlerInput = { + index: number; + batchIndex: number; + element?: Record; + apiParams?: ApiOptions; + isLastRequest: boolean; +}; + +export type CustomPromiseHandler = (input: CustomPromiseHandlerInput) => Promise; + +export type ApiModuleType = + | 'stack' + | 'asset' + | 'assets' + | 'entry' + | 'entries' + | 'content-type' + | 'content-types' + | 'stacks' + | 'versioned-entries' + | 'download-asset'; + +export default abstract class BaseClass { + readonly client: any; + public exportConfig: ExportConfig; + + constructor({ exportConfig, stackAPIClient }: Omit) { + this.client = stackAPIClient; + this.exportConfig = exportConfig; + } + + get stack(): any { + return this.client; + } + + delay(ms: number): Promise { + /* eslint-disable no-promise-executor-return */ + return new Promise((resolve) => setTimeout(resolve, ms <= 0 ? 0 : ms)); + } + + makeConcurrentCall(env: EnvType, promisifyHandler?: CustomPromiseHandler): Promise { + const { module, apiBatches, totalCount, apiParams, concurrencyLimit } = env; + + /* eslint-disable no-async-promise-executor */ + return new Promise(async (resolve) => { + let batchNo = 0; + let isLastRequest = false; + const batch = fill(Array.from({ length: Number.parseInt(String(totalCount / 100), 10) }), 100); + + if (totalCount % 100) batch.push(100); + + const batches: Array = + apiBatches || + chunk( + map(batch, (skip: number, i: number) => skip * i), + concurrencyLimit, + ); + + /* eslint-disable no-promise-executor-return */ + if (isEmpty(batches)) return resolve(); + + for (const [batchIndex, batch] of entries(batches)) { + batchNo += 1; + const allPromise = []; + const start = Date.now(); + + for (const [index, element] of entries(batch)) { + let promise; + isLastRequest = isEqual(last(batch), element) && isEqual(last(batches), batch); + + if (promisifyHandler instanceof Function) { + promise = promisifyHandler({ + apiParams, + element, + isLastRequest, + index: Number(index), + batchIndex: Number(batchIndex), + }); + } else if (apiParams?.queryParam) { + apiParams.queryParam.skip = element; + promise = this.makeAPICall(apiParams, isLastRequest); + } + + allPromise.push(promise); + } + + /* eslint-disable no-await-in-loop */ + await Promise.allSettled(allPromise); + /* eslint-disable no-await-in-loop */ + await this.logMsgAndWaitIfRequired(module, start, batchNo); + + if (isLastRequest) resolve(); + } + }); + } + + /** + * @method logMsgAndWaitIfRequired + * @param module string + * @param start number + * @param batchNo number + * @returns Promise + */ + async logMsgAndWaitIfRequired(module: string, start: number, batchNo: number): Promise { + const end = Date.now(); + const exeTime = end - start; + log(this.exportConfig, `Batch No. ${batchNo} of ${module} is complete.`, 'success'); + + if (this.exportConfig.modules.assets.displayExecutionTime) { + console.log( + `Time taken to execute: ${exeTime} milliseconds; wait time: ${ + exeTime < 1000 ? 1000 - exeTime : 0 + } milliseconds`, + ); + } + + if (exeTime < 1000) await this.delay(1000 - exeTime); + } + + /** + * @method makeAPICall + * @param {Record} options - Api related params + * @param {Record} isLastRequest - Boolean + * @returns Promise + */ + makeAPICall( + { module: moduleName, reject, resolve, url = '', uid = '', additionalInfo, queryParam = {} }: ApiOptions, + isLastRequest = false, + ): Promise { + switch (moduleName) { + case 'asset': + return this.stack + .asset(uid) + .fetch(queryParam) + .then((response: any) => resolve({ response, isLastRequest, additionalInfo })) + .catch((error: Error) => reject({ error, isLastRequest, additionalInfo })); + case 'assets': + return this.stack + .asset() + .query(queryParam) + .find() + .then((response: any) => resolve({ response, isLastRequest, additionalInfo })) + .catch((error: Error) => reject({ error, isLastRequest, additionalInfo })); + case 'download-asset': + return this.stack + .asset() + .download({ url, responseType: 'stream' }) + .then((response: any) => resolve({ response, isLastRequest, additionalInfo })) + .catch((error: any) => reject({ error, isLastRequest, additionalInfo })); + default: + return Promise.resolve(); + } + } +} diff --git a/packages/contentstack-export/src/export/modules/content-types.ts b/packages/contentstack-export/src/export/modules/content-types.ts new file mode 100644 index 0000000000..7b2ba3fbf9 --- /dev/null +++ b/packages/contentstack-export/src/export/modules/content-types.ts @@ -0,0 +1,101 @@ +import * as path from 'path'; +import { ContentstackClient } from '@contentstack/cli-utilities'; +import { log, formatError, fsUtil, executeTask } from '../../utils'; +import { ExportConfig, ModuleClassParams } from '../../types'; +import BaseClass from './base-class'; + +export default class ContentTypesExport extends BaseClass { + private stackAPIClient: ReturnType; + public exportConfig: ExportConfig; + private qs: { + include_count: boolean; + asc: string; + skip?: number; + limit?: number; + include_global_field_schema: boolean; + }; + private contentTypesConfig: { + dirName?: string; + fileName?: string; + validKeys?: string[]; + fetchConcurrency?: number; + writeConcurrency?: number; + limit?: number; + }; + private contentTypesDirPath: string; + private contentTypes: Record[]; + + constructor({ exportConfig, stackAPIClient }: ModuleClassParams) { + super({ exportConfig, stackAPIClient }); + this.stackAPIClient = stackAPIClient; + this.contentTypesConfig = exportConfig.modules['content-types']; + this.qs = { + include_count: true, + asc: 'updated_at', + limit: this.contentTypesConfig.limit, + include_global_field_schema: true, + }; + this.contentTypesDirPath = path.resolve( + exportConfig.data, + exportConfig.branchName || '', + this.contentTypesConfig.dirName, + ); + this.contentTypes = []; + } + + async start() { + try { + log(this.exportConfig, 'Starting content type export', 'success'); + await fsUtil.makeDirectory(this.contentTypesDirPath); + await this.getContentTypes(); + await this.writeContentTypes(this.contentTypes); + log(this.exportConfig, 'Content type(s) exported successfully', 'success'); + } catch (error) { + log(this.exportConfig, `Failed to export content types ${formatError(error)}`, 'error'); + throw new Error('Failed to export content types'); + } + } + + async getContentTypes(skip = 0): Promise { + if (skip) { + this.qs.skip = skip; + } + const contentTypeSearchResponse = await this.stackAPIClient.contentType().query(this.qs).find(); + if (Array.isArray(contentTypeSearchResponse.items) && contentTypeSearchResponse.items.length > 0) { + let updatedContentTypes = this.sanitizeAttribs(contentTypeSearchResponse.items); + this.contentTypes.push(...updatedContentTypes); + + skip += this.contentTypesConfig.limit || 100; + if (skip >= contentTypeSearchResponse.count) { + return; + } + return await this.getContentTypes(skip); + } else { + log(this.exportConfig, 'No content types returned for the given query', 'info'); + } + } + + sanitizeAttribs(contentTypes: Record[]): Record[] { + let updatedContentTypes: Record[] = []; + contentTypes.forEach((contentType) => { + for (let key in contentType) { + if (this.contentTypesConfig.validKeys.indexOf(key) === -1) { + delete contentType[key]; + } + } + updatedContentTypes.push(contentType); + }); + return updatedContentTypes; + } + + async writeContentTypes(contentTypes: Record[]) { + function write(contentType: Record) { + return fsUtil.writeFile( + path.join(this.contentTypesDirPath, `${contentType.uid === 'schema' ? 'schema|1' : contentType.uid}.json`), + contentType, + ); + } + await executeTask(contentTypes, write.bind(this), { concurrency: this.exportConfig.writeConcurrency }); + return fsUtil.writeFile(path.join(this.contentTypesDirPath, 'schema.json'), contentTypes); + } +} diff --git a/packages/contentstack-export/src/export/modules/custom-roles.ts b/packages/contentstack-export/src/export/modules/custom-roles.ts new file mode 100644 index 0000000000..4ad66dd7f4 --- /dev/null +++ b/packages/contentstack-export/src/export/modules/custom-roles.ts @@ -0,0 +1,99 @@ +import keys from 'lodash/keys'; +import find from 'lodash/find'; +import forEach from 'lodash/forEach'; +import values from 'lodash/values'; +import { resolve as pResolve } from 'node:path'; + +import config from '../../config'; +import BaseClass from './base-class'; +import { log, formatError, fsUtil } from '../../utils'; +import { CustomRoleConfig, ModuleClassParams } from '../../types'; + +export default class ExportCustomRoles extends BaseClass { + private customRoles: Record; + private existingRoles: Record; + private customRolesConfig: CustomRoleConfig; + private sourceLocalesMap: Record; + private localesMap: Record; + public rolesFolderPath: string; + public customRolesLocalesFilepath: string; + + constructor({ exportConfig, stackAPIClient }: ModuleClassParams) { + super({ exportConfig, stackAPIClient }); + this.customRoles = {}; + this.customRolesConfig = config.modules.customRoles; + this.existingRoles = { Admin: 1, Developer: 1, 'Content Manager': 1 }; + this.localesMap = {}; + this.sourceLocalesMap = {}; + } + + async start(): Promise { + log(this.exportConfig, 'Starting custom roles export', 'info'); + + this.rolesFolderPath = pResolve( + this.exportConfig.data, + this.exportConfig.branchName || '', + this.customRolesConfig.dirName, + ); + await fsUtil.makeDirectory(this.rolesFolderPath); + this.customRolesLocalesFilepath = pResolve(this.rolesFolderPath, this.customRolesConfig.customRolesLocalesFileName); + await this.getCustomRoles(); + await this.getLocales(); + await this.getCustomRolesLocales(); + } + + async getCustomRoles(): Promise { + const roles = await this.stack + .role() + .fetchAll({ include_rules: true, include_permissions: true }) + .then((data: any) => data) + .catch((err: any) => log(this.exportConfig, `Failed to fetch roles. ${formatError(err)}`, 'error')); + const customRoles = roles.items.filter((role: any) => !this.existingRoles[role.name]); + + if (!customRoles.length) { + log(this.exportConfig, 'No custom roles were found in the Stack', 'info'); + return; + } + + customRoles.forEach((role: any) => { + log(this.exportConfig, `'${role?.name}' role was exported successfully`, 'info'); + this.customRoles[role.uid] = role; + }); + fsUtil.writeFile(pResolve(this.rolesFolderPath, this.customRolesConfig.fileName), this.customRoles); + } + + async getLocales() { + const locales = await this.stack + .locale() + .query({}) + .find() + .then((data: any) => data) + .catch((err: any) => log(this.exportConfig, `Failed to fetch locales. ${formatError(err)}`, 'error')); + for (const locale of locales.items) { + this.sourceLocalesMap[locale.uid] = locale; + } + } + + async getCustomRolesLocales() { + for (const role of values(this.customRoles)) { + const customRole = role as Record; + const rulesLocales = find(customRole.rules, (rule: any) => rule.module === 'locale'); + if (rulesLocales?.locales?.length) { + forEach(rulesLocales.locales, (locale: any) => { + this.localesMap[locale] = 1; + }) + } + } + + if (keys(this.localesMap)?.length) { + for (const locale in this.localesMap) { + if (this.sourceLocalesMap[locale] !== undefined) { + const sourceLocale = this.sourceLocalesMap[locale] as Record; + delete sourceLocale?.stackHeaders; + } + this.localesMap[locale] = this.sourceLocalesMap[locale]; + } + fsUtil.writeFile(this.customRolesLocalesFilepath, this.localesMap); + } + } +} diff --git a/packages/contentstack-export/src/export/modules/entries.ts b/packages/contentstack-export/src/export/modules/entries.ts new file mode 100644 index 0000000000..f795cee78c --- /dev/null +++ b/packages/contentstack-export/src/export/modules/entries.ts @@ -0,0 +1,233 @@ +import * as path from 'path'; +import { ContentstackClient, FsUtility } from '@contentstack/cli-utilities'; +import { log, formatError, fsUtil } from '../../utils'; +import { ExportConfig, ModuleClassParams } from '../../types'; +import BaseClass, { ApiOptions } from './base-class'; + +export default class EntriesExport extends BaseClass { + private stackAPIClient: ReturnType; + public exportConfig: ExportConfig; + private entriesConfig: { + dirName?: string; + fileName?: string; + invalidKeys?: string[]; + fetchConcurrency?: number; + writeConcurrency?: number; + limit?: number; + chunkFileSize?: number; + batchLimit?: number; + exportVersions: boolean; + }; + private entriesDirPath: string; + private localesFilePath: string; + private schemaFilePath: string; + private entriesFileHelper: FsUtility; + + constructor({ exportConfig, stackAPIClient }: ModuleClassParams) { + super({ exportConfig, stackAPIClient }); + this.stackAPIClient = stackAPIClient; + this.exportConfig = exportConfig; + this.entriesConfig = exportConfig.modules.entries; + this.entriesDirPath = path.resolve(exportConfig.data, exportConfig.branchName || '', this.entriesConfig.dirName); + this.localesFilePath = path.resolve( + exportConfig.data, + exportConfig.branchName || '', + exportConfig.modules.locales.dirName, + exportConfig.modules.locales.fileName, + ); + this.schemaFilePath = path.resolve( + exportConfig.data, + exportConfig.branchName || '', + exportConfig.modules.content_types.dirName, + 'schema.json', + ); + } + + async start() { + try { + log(this.exportConfig, 'Starting entries export', 'info'); + const locales = fsUtil.readFile(this.localesFilePath) as Array>; + const contentTypes = fsUtil.readFile(this.schemaFilePath) as Array>; + if (contentTypes.length === 0) { + log(this.exportConfig, 'No content types found to export entries', 'info'); + return; + } + const entryRequestOptions = this.createRequestObjects(locales, contentTypes); + for (let entryRequestOption of entryRequestOptions) { + log( + this.exportConfig, + `Starting export of entries of content type - ${entryRequestOption.contentType} locale - ${entryRequestOption.locale}`, + 'info', + ); + await this.getEntries(entryRequestOption); + this.entriesFileHelper?.completeFile(true); + log( + this.exportConfig, + `Exported entries of type '${entryRequestOption.contentType}' locale '${entryRequestOption.locale}'`, + 'success', + ); + } + log(this.exportConfig, 'Entries exported successfully', 'success'); + } catch (error) { + log(this.exportConfig, `Failed to export entries ${formatError(error)}`, 'error'); + throw new Error('Failed to export entries'); + } + } + + createRequestObjects( + locales: Array>, + contentTypes: Array>, + ): Array> { + let requestObjects: Array> = []; + contentTypes.forEach((contentType) => { + if (Object.keys(locales).length !== 0) { + for (let locale in locales) { + requestObjects.push({ + contentType: contentType.uid, + locale: locales[locale].code, + }); + } + } + requestObjects.push({ + contentType: contentType.uid, + locale: this.exportConfig.master_locale.code, + }); + }); + + return requestObjects; + } + + async getEntries(options: Record): Promise { + options.skip = options.skip || 0; + let requestObject = { + locale: options.locale, + skip: options.skip, + limit: this.entriesConfig.limit, + include_count: true, + include_publish_details: true, + query: { + locale: options.locale, + }, + }; + + const entriesSearchResponse = await this.stackAPIClient + .contentType(options.contentType) + .entry() + .query(requestObject) + .find(); + + if (Array.isArray(entriesSearchResponse.items) && entriesSearchResponse.items.length > 0) { + if (options.skip === 0) { + const entryBasePath = path.join(this.entriesDirPath, options.contentType, options.locale); + await fsUtil.makeDirectory(entryBasePath); + this.entriesFileHelper = new FsUtility({ + moduleName: 'entries', + indexFileName: 'index.json', + basePath: entryBasePath, + chunkFileSize: this.entriesConfig.chunkFileSize, + keepMetadata: false, + omitKeys: this.entriesConfig.invalidKeys, + }); + } + this.entriesFileHelper.writeIntoFile(entriesSearchResponse.items, { mapKeyVal: true }); + if (this.entriesConfig.exportVersions) { + let versionedEntryPath = path.join(this.entriesDirPath, options.contentType, options.locale, 'versions'); + fsUtil.makeDirectory(versionedEntryPath); + await this.fetchEntriesVersions(entriesSearchResponse.items, { + locale: options.locale, + contentType: options.contentType, + versionedEntryPath, + }); + } + options.skip += this.entriesConfig.limit || 100; + if (options.skip >= entriesSearchResponse.count) { + return Promise.resolve(true); + } + return await this.getEntries(options); + } + } + + async fetchEntriesVersions( + entries: any, + options: { locale: string; contentType: string; versionedEntryPath: string }, + ): Promise { + const onSuccess = ({ response, apiData: entry }: any) => { + fsUtil.writeFile(path.join(options.versionedEntryPath, `${entry.uid}.json`), response); + log( + this.exportConfig, + `Exported versioned entries of type '${options.contentType}' locale '${options.locale}'`, + 'success', + ); + }; + const onReject = ({ error, apiData: { uid } = undefined }: any) => { + log(this.exportConfig, `failed to export versions of entry ${uid}`, 'error'); + log(this.exportConfig, formatError(error), 'error'); + }; + + return await this.makeConcurrentCall( + { + apiBatches: [entries], + module: 'versioned-entries', + totalCount: entries.length, + concurrencyLimit: this.entriesConfig.batchLimit, + apiParams: { + module: 'versioned-entries', + queryParam: options, + resolve: onSuccess, + reject: onReject, + }, + }, + this.entryVersionHandler.bind(this), + ); + } + + async entryVersionHandler({ + apiParams, + element: entry, + }: { + apiParams: ApiOptions; + element: Record; + isLastRequest: boolean; + }) { + return new Promise(async (resolve, reject) => { + return await this.getEntryByVersion(apiParams.queryParam, entry) + .then((response) => { + apiParams.resolve({ + response, + apiData: entry, + }); + resolve(true); + }) + .catch((error) => { + apiParams.reject({ + error, + apiData: entry, + }); + reject(true); + }); + }); + } + + async getEntryByVersion( + options: any, + entry: Record, + entries: Array> = [], + ): Promise { + const queryRequestObject = { + locale: options.locale, + except: { + BASE: this.entriesConfig.invalidKeys, + }, + version: entry._version, + }; + const entryResponse = await this.stackAPIClient + .contentType(options.contentType) + .entry(entry.uid) + .fetch(queryRequestObject); + entries.push(entryResponse); + if (--entry._version > 0) { + return await this.getEntryByVersion(options, entry, entries); + } + return entries; + } +} diff --git a/packages/contentstack-export/src/export/modules/environments.ts b/packages/contentstack-export/src/export/modules/environments.ts new file mode 100644 index 0000000000..980b18c1ac --- /dev/null +++ b/packages/contentstack-export/src/export/modules/environments.ts @@ -0,0 +1,80 @@ +import { resolve as pResolve } from 'node:path'; +import omit from 'lodash/omit'; +import isEmpty from 'lodash/isEmpty'; + +import config from '../../config'; +import BaseClass from './base-class'; +import { log, formatError, fsUtil } from '../../utils'; +import { EnvironmentConfig, ModuleClassParams } from '../../types'; + +export default class ExportEnvironments extends BaseClass { + private environments: Record; + private environmentConfig: EnvironmentConfig; + public environmentsFolderPath: string; + private qs: { + include_count: boolean; + skip?: number; + }; + + constructor({ exportConfig, stackAPIClient }: ModuleClassParams) { + super({ exportConfig, stackAPIClient }); + this.environments = {}; + this.environmentConfig = config.modules.environments; + this.qs = { include_count: true }; + } + + + async start(): Promise { + log(this.exportConfig, 'Starting environment export', 'info'); + + this.environmentsFolderPath = pResolve( + this.exportConfig.data, + this.exportConfig.branchName || '', + this.environmentConfig.dirName, + ); + + await fsUtil.makeDirectory(this.environmentsFolderPath); + await this.getEnvironments(); + + if (this.environments === undefined || isEmpty(this.environments)) { + log(this.exportConfig, 'No environments found', 'info'); + } else { + fsUtil.writeFile(pResolve(this.environmentsFolderPath, this.environmentConfig.fileName), this.environments); + log(this.exportConfig, 'All the environments have been exported successfully!', 'success'); + } + } + + async getEnvironments(skip = 0): Promise { + if (skip) { + this.qs.skip = skip; + } + await this.stack + .environment() + .query(this.qs) + .find() + .then(async (data: any) => { + const { items, count } = data; + if (items?.length) { + this.sanitizeAttribs(items); + skip += this.environmentConfig.limit || 100; + if (skip >= count) { + return; + } + return await this.getEnvironments(skip); + } + }) + .catch((error: any) => { + log(this.exportConfig, `Failed to export environments. ${formatError(error)}`, 'error'); + log(this.exportConfig, error, 'error'); + }); + } + + sanitizeAttribs(environments: Record[]) { + for (let index = 0; index < environments?.length; index++) { + const extUid = environments[index].uid; + const envName = environments[index]?.name; + this.environments[extUid] = omit(environments[index], ['ACL']); + log(this.exportConfig, `'${envName}' environment was exported successfully`, 'success'); + } + } +} diff --git a/packages/contentstack-export/src/export/modules/extensions.ts b/packages/contentstack-export/src/export/modules/extensions.ts new file mode 100644 index 0000000000..4b1ecd514e --- /dev/null +++ b/packages/contentstack-export/src/export/modules/extensions.ts @@ -0,0 +1,79 @@ +import omit from 'lodash/omit'; +import isEmpty from 'lodash/isEmpty'; +import { resolve as pResolve } from 'node:path'; + +import config from '../../config'; +import BaseClass from './base-class'; +import { log, formatError, fsUtil } from '../../utils'; +import { ExtensionsConfig, ModuleClassParams } from '../../types'; + +export default class ExportExtensions extends BaseClass { + private extensionsFolderPath: string; + private extensions: Record; + public extensionConfig: ExtensionsConfig; + private qs: { + include_count: boolean; + skip?: number; + }; + + constructor({ exportConfig, stackAPIClient }: ModuleClassParams) { + super({ exportConfig, stackAPIClient }); + this.extensions = {}; + this.extensionConfig = config.modules.extensions; + this.qs = { include_count: true }; + } + + async start(): Promise { + log(this.exportConfig, 'Starting extension export', 'info'); + + this.extensionsFolderPath = pResolve( + this.exportConfig.data, + this.exportConfig.branchName || '', + this.extensionConfig.dirName, + ); + + await fsUtil.makeDirectory(this.extensionsFolderPath); + await this.getExtensions(); + + if (this.extensions === undefined || isEmpty(this.extensions)) { + log(this.exportConfig, 'No extensions found', 'info'); + } else { + fsUtil.writeFile(pResolve(this.extensionsFolderPath, this.extensionConfig.fileName), this.extensions); + log(this.exportConfig, 'All the extensions have been exported successfully!', 'success'); + } + } + + async getExtensions(skip = 0): Promise { + if (skip) { + this.qs.skip = skip; + } + await this.stack + .extension() + .query(this.qs) + .find() + .then(async (data: any) => { + const { items, count } = data; + if (items?.length) { + this.sanitizeAttribs(items); + skip += this.extensionConfig.limit || 100; + if (skip >= count) { + return; + } + return await this.getExtensions(skip); + } + }) + .catch((error: any) => { + log(this.exportConfig, `Failed to export extensions. ${formatError(error)}`, 'error'); + log(this.exportConfig, error, 'error'); + }); + } + + sanitizeAttribs(extensions: Record[]) { + for (let index = 0; index < extensions?.length; index++) { + const extUid = extensions[index].uid; + const extTitle = extensions[index]?.title; + this.extensions[extUid] = omit(extensions[index], ['SYS_ACL']); + log(this.exportConfig, `'${extTitle}' extension was exported successfully`, 'success'); + } + } +} diff --git a/packages/contentstack-export/src/export/modules/global-fields.ts b/packages/contentstack-export/src/export/modules/global-fields.ts new file mode 100644 index 0000000000..6a364a7656 --- /dev/null +++ b/packages/contentstack-export/src/export/modules/global-fields.ts @@ -0,0 +1,83 @@ +import * as path from 'path'; +import { ContentstackClient } from '@contentstack/cli-utilities'; +import { log, formatError, fsUtil } from '../../utils'; +import { ExportConfig, ModuleClassParams } from '../../types'; +import BaseClass from './base-class'; + +export default class GlobalFieldsExport extends BaseClass { + private stackAPIClient: ReturnType; + public exportConfig: ExportConfig; + private qs: { + include_count: boolean; + asc: string; + skip?: number; + limit?: number; + }; + private globalFieldsConfig: { + dirName?: string; + fileName?: string; + validKeys?: string[]; + fetchConcurrency?: number; + writeConcurrency?: number; + limit?: number; + }; + private globalFieldsDirPath: string; + private globalFields: Record[]; + + constructor({ exportConfig, stackAPIClient }: ModuleClassParams) { + super({ exportConfig, stackAPIClient }); + this.stackAPIClient = stackAPIClient; + this.globalFieldsConfig = exportConfig.modules['global-fields']; + this.qs = { + skip: 0, + asc: 'updated_at', + include_count: true, + limit: this.globalFieldsConfig.limit, + }; + this.globalFieldsDirPath = path.resolve( + exportConfig.data, + exportConfig.branchName || '', + this.globalFieldsConfig.dirName, + ); + this.globalFields = []; + } + + async start() { + try { + log(this.exportConfig, 'Starting global fields export', 'success'); + await fsUtil.makeDirectory(this.globalFieldsDirPath); + await this.getGlobalFields(); + fsUtil.writeFile(path.join(this.globalFieldsDirPath, this.globalFieldsConfig.fileName), this.globalFields); + log(this.exportConfig, 'Completed global fields export', 'success'); + } catch (error) { + log(this.exportConfig, `Failed to export global fields. ${formatError(error)}`, 'error'); + throw new Error('Failed to export global fields'); + } + } + + async getGlobalFields(skip: number = 0): Promise { + if (skip) { + this.qs.skip = skip; + } + let globalFieldsFetchResponse = await this.stackAPIClient.globalField().query(this.qs).find(); + if (Array.isArray(globalFieldsFetchResponse.items) && globalFieldsFetchResponse.items.length > 0) { + this.sanitizeAttribs(globalFieldsFetchResponse.items); + skip += this.globalFieldsConfig.limit || 100; + if (skip >= globalFieldsFetchResponse.count) { + return; + } + return await this.getGlobalFields(skip); + } + } + + sanitizeAttribs(globalFields: Record[]) { + globalFields.forEach((globalField: Record) => { + for (let key in globalField) { + if (this.globalFieldsConfig.validKeys.indexOf(key) === -1) { + delete globalField[key]; + } + } + this.globalFields.push(globalField); + }); + } +} diff --git a/packages/contentstack-export/src/export/modules/index.ts b/packages/contentstack-export/src/export/modules/index.ts new file mode 100644 index 0000000000..361339b1fc --- /dev/null +++ b/packages/contentstack-export/src/export/modules/index.ts @@ -0,0 +1,9 @@ +import { ModuleClassParams } from '../../types'; + +export default async function startModuleExport(modulePayload: ModuleClassParams) { + const { default: ModuleRunner } = await import(`./${modulePayload.moduleName}`); + const moduleRunner = new ModuleRunner(modulePayload); + return moduleRunner.start(); +} + +export { default as ExportAssets } from './assets'; diff --git a/packages/contentstack-export/src/export/modules/labels.ts b/packages/contentstack-export/src/export/modules/labels.ts new file mode 100644 index 0000000000..ce9c320240 --- /dev/null +++ b/packages/contentstack-export/src/export/modules/labels.ts @@ -0,0 +1,78 @@ +import omit from 'lodash/omit'; +import isEmpty from 'lodash/isEmpty'; +import { resolve as pResolve } from 'node:path'; + +import config from '../../config'; +import BaseClass from './base-class'; +import { log, formatError, fsUtil } from '../../utils'; +import { LabelConfig, ModuleClassParams } from '../../types'; + +export default class ExportLabels extends BaseClass { + private labels: Record>; + private labelConfig: LabelConfig; + public labelsFolderPath: string; + private qs: { + include_count: boolean; + skip?: number; + }; + + constructor({ exportConfig, stackAPIClient }: ModuleClassParams) { + super({ exportConfig, stackAPIClient }); + this.labels = {}; + this.labelConfig = config.modules.labels; + this.qs = { include_count: true }; + } + + async start(): Promise { + log(this.exportConfig, 'Starting labels export', 'info'); + + this.labelsFolderPath = pResolve( + this.exportConfig.data, + this.exportConfig.branchName || '', + this.labelConfig.dirName, + ); + + await fsUtil.makeDirectory(this.labelsFolderPath); + await this.getLabels(); + if (this.labels === undefined || isEmpty(this.labels)) { + log(this.exportConfig, 'No labels found', 'info'); + } else { + fsUtil.writeFile(pResolve(this.labelsFolderPath, this.labelConfig.fileName), this.labels); + log(this.exportConfig, 'All the labels have been exported successfully!', 'success'); + } + } + + async getLabels(skip = 0): Promise { + if (skip) { + this.qs.skip = skip; + } + await this.stack + .label() + .query(this.qs) + .find() + .then(async (data: any) => { + const { items, count } = data; + if (items?.length) { + this.sanitizeAttribs(items); + skip += this.labelConfig.limit || 100; + if (skip >= count) { + return; + } + return await this.getLabels(skip); + } + }) + .catch((error: any) => { + log(this.exportConfig, `Failed to export labels. ${formatError(error)}`, 'error'); + log(this.exportConfig, error, 'error'); + }); + } + + sanitizeAttribs(labels: Record[]) { + for (let index = 0; index < labels?.length; index++) { + const labelUid = labels[index].uid; + const labelName = labels[index]?.name; + this.labels[labelUid] = omit(labels[index], this.labelConfig.invalidKeys); + log(this.exportConfig, `'${labelName}' label was exported successfully`, 'success'); + } + } +} diff --git a/packages/contentstack-export/src/export/modules/locales.ts b/packages/contentstack-export/src/export/modules/locales.ts new file mode 100644 index 0000000000..5043882215 --- /dev/null +++ b/packages/contentstack-export/src/export/modules/locales.ts @@ -0,0 +1,92 @@ +import * as path from 'path'; +import { ContentstackClient } from '@contentstack/cli-utilities'; +import { log, formatError, fsUtil } from '../../utils'; +import { ExportConfig, ModuleClassParams } from '../../types'; +import BaseClass from './base-class'; + +export default class LocaleExport extends BaseClass { + private stackAPIClient: ReturnType; + public exportConfig: ExportConfig; + private masterLocaleConfig: { dirName: string; fileName: string; requiredKeys: string[] }; + private qs: { + include_count: boolean; + asc: string; + only: { + BASE: string[]; + }; + skip?: number; + }; + private localeConfig: { + dirName?: string; + fileName?: string; + requiredKeys?: string[]; + fetchConcurrency?: number; + writeConcurrency?: number; + limit?: number; + }; + private localesPath: string; + private masterLocale: Record>; + private locales: Record>; + + constructor({ exportConfig, stackAPIClient }: ModuleClassParams) { + super({ exportConfig, stackAPIClient }); + this.stackAPIClient = stackAPIClient; + this.localeConfig = exportConfig.modules.locales; + this.masterLocaleConfig = exportConfig.modules.masterLocale; + this.qs = { + include_count: true, + asc: 'updated_at', + only: { + BASE: this.localeConfig.requiredKeys, + }, + }; + this.localesPath = path.resolve(exportConfig.data, exportConfig.branchName || '', this.localeConfig.dirName); + this.locales = {}; + this.masterLocale = {}; + } + + async start() { + try { + log(this.exportConfig, 'Starting locale export', 'success'); + await fsUtil.makeDirectory(this.localesPath); + await this.getLocales(); + fsUtil.writeFile(path.join(this.localesPath, this.localeConfig.fileName), this.locales); + fsUtil.writeFile(path.join(this.localesPath, this.masterLocaleConfig.fileName), this.masterLocale); + log(this.exportConfig, 'Completed locale export', 'success'); + } catch (error) { + log(this.exportConfig, `Failed to export locales. ${formatError(error)}`, 'error'); + throw new Error('Failed to export locales'); + } + } + + async getLocales(skip: number = 0): Promise { + if (skip) { + this.qs.skip = skip; + } + let localesFetchResponse = await this.stackAPIClient.locale().query(this.qs).find(); + if (Array.isArray(localesFetchResponse.items) && localesFetchResponse.items.length > 0) { + this.sanitizeAttribs(localesFetchResponse.items); + skip += this.localeConfig.limit || 100; + if (skip > localesFetchResponse.count) { + return; + } + return await this.getLocales(skip); + } + } + + sanitizeAttribs(locales: Record[]) { + locales.forEach((locale: Record) => { + for (let key in locale) { + if (this.localeConfig.requiredKeys.indexOf(key) === -1) { + delete locale[key]; + } + } + + if (locale?.code === this.exportConfig?.master_locale?.code) { + this.masterLocale[locale.uid] = locale; + } else { + this.locales[locale.uid] = locale; + } + }); + } +} diff --git a/packages/contentstack-export/src/export/modules/marketplace-apps.ts b/packages/contentstack-export/src/export/modules/marketplace-apps.ts new file mode 100644 index 0000000000..0f2fa18815 --- /dev/null +++ b/packages/contentstack-export/src/export/modules/marketplace-apps.ts @@ -0,0 +1,162 @@ +import map from 'lodash/map'; +import has from 'lodash/has'; +import find from 'lodash/find'; +import entries from 'lodash/entries'; +import isEmpty from 'lodash/isEmpty'; +import { resolve as pResolve } from 'node:path'; +import { + managementSDKClient, + isAuthenticated, + cliux, + NodeCrypto, + HttpClientDecorator, + OauthDecorator, + HttpClient, + ContentstackClient, +} from '@contentstack/cli-utilities'; + +import config from '../../config'; +import { + log, + getDeveloperHubUrl, + getOrgUid, + createNodeCryptoInstance, + formatError, + getStackSpecificApps, + fsUtil, +} from '../../utils'; +import BaseClass from './base-class'; +import { ModuleClassParams, MarketplaceAppsConfig } from '../../types'; + +export default class ExportMarketplaceApps extends BaseClass { + private httpClient: OauthDecorator | HttpClientDecorator | HttpClient; + private marketplaceAppConfig: MarketplaceAppsConfig; + private listOfApps: Record[]; + private installedApps: Record[]; + public developerHubBaseUrl: string; + public marketplaceAppPath: string; + public nodeCrypto: NodeCrypto; + + constructor({ exportConfig, stackAPIClient }: ModuleClassParams) { + super({ exportConfig, stackAPIClient }); + this.httpClient = new HttpClient(); + this.marketplaceAppConfig = config.modules.marketplace_apps; + this.listOfApps = []; + this.installedApps = []; + } + + async start(): Promise { + if (!isAuthenticated()) { + cliux.print( + 'WARNING!!! To export Marketplace apps, you must be logged in. Please check csdx auth:login --help to log in', + { color: 'yellow' }, + ); + return Promise.resolve(); + } + + log(this.exportConfig, 'Starting marketplace app export', 'info'); + + this.marketplaceAppPath = pResolve( + this.exportConfig.data, + this.exportConfig.branchName || '', + this.marketplaceAppConfig.dirName, + ); + await fsUtil.makeDirectory(this.marketplaceAppPath); + this.developerHubBaseUrl = this.exportConfig.developerHubBaseUrl || (await getDeveloperHubUrl(this.exportConfig)); + this.exportConfig.org_uid = await getOrgUid(this.exportConfig); + + await this.setHttpClient(); + await this.getAllStackSpecificApps(); + this.installedApps = this.listOfApps; + await this.exportInstalledExtensions(); + } + + async setHttpClient(): Promise { + if (!this.exportConfig.auth_token) { + this.httpClient = new OauthDecorator(this.httpClient); + const headers = await this.httpClient.preHeadersCheck(this.exportConfig); + this.httpClient = this.httpClient.headers(headers); + } else { + this.httpClient = new HttpClientDecorator(this.httpClient); + this.httpClient.headers(this.exportConfig); + } + } + + async getAllStackSpecificApps(skip = 0): Promise { + const data = await getStackSpecificApps({ + developerHubBaseUrl: this.developerHubBaseUrl, + httpClient: this.httpClient as HttpClient, + config: this.exportConfig, + skip, + }); + + const { data: apps, count } = data; + + if (!this.nodeCrypto && find(apps, (app) => isEmpty(app.configuration))) { + this.nodeCrypto = await createNodeCryptoInstance(this.exportConfig); + } + + const stackApps = map(apps, (app) => { + if (has(app, 'configuration')) { + app['configuration'] = this.nodeCrypto.encrypt(app.configuration); + } + return app; + }); + + this.listOfApps = [...this.listOfApps, ...stackApps]; + + if (count - (skip + 50) > 0) { + return await this.getAllStackSpecificApps(skip + 50); + } + } + + async exportInstalledExtensions(): Promise { + if (isEmpty(this.installedApps)) { + log(this.exportConfig, 'No marketplace apps found', 'info'); + } else { + for (const [index, app] of entries(this.installedApps)) { + await this.getAppConfigurations(+index, app); + } + + fsUtil.writeFile(pResolve(this.marketplaceAppPath, this.marketplaceAppConfig.fileName), this.installedApps); + + log(this.exportConfig, 'All the marketplace apps have been exported successfully', 'info'); + } + } + + async getAppConfigurations(index: number, appInstallation: any) { + const sdkClient: ContentstackClient = await managementSDKClient({ + host: this.developerHubBaseUrl.split('://').pop(), + }); + const appName = appInstallation?.manifest?.name; + log(this.exportConfig, `Exporting ${appName} app and it's config.`, 'info'); + + await sdkClient + .organization(this.exportConfig.org_uid) + .app(appInstallation?.manifest?.uid) + .installation(appInstallation?.uid) + .installationData() + .then(async (result: any) => { + const { data, error } = result; + if (has(data, 'server_configuration')) { + if (!this.nodeCrypto && has(data, 'server_configuration')) { + this.nodeCrypto = await createNodeCryptoInstance(this.exportConfig); + } + + if (!isEmpty(data?.server_configuration)) { + this.installedApps[index]['server_configuration'] = this.nodeCrypto.encrypt(data.server_configuration); + log(this.exportConfig, `Exported ${appName} app and it's config.`, 'success'); + } else { + log(this.exportConfig, `Exported ${appName} app`, 'success'); + } + } else if (error) { + log(this.exportConfig, `Error on exporting ${appName} app and it's config.`, 'error'); + log(this.exportConfig, error, 'error'); + } + }) + .catch((error: any) => { + log(this.exportConfig, `Failed to export ${appName} app config ${formatError(error)}`, 'error'); + log(this.exportConfig, error, 'error'); + }); + } +} diff --git a/packages/contentstack-export/src/export/modules/stack.ts b/packages/contentstack-export/src/export/modules/stack.ts new file mode 100644 index 0000000000..e05ddffcee --- /dev/null +++ b/packages/contentstack-export/src/export/modules/stack.ts @@ -0,0 +1,98 @@ +import find from 'lodash/find'; +import { resolve as pResolve } from 'node:path'; +import { isAuthenticated, managementSDKClient } from '@contentstack/cli-utilities'; + +import config from '../../config'; +import BaseClass from './base-class'; +import { log, formatError, fsUtil } from '../../utils'; +import { StackConfig, ModuleClassParams } from '../../types'; + +export default class ExportStack extends BaseClass { + private stackConfig: StackConfig; + private stackFolderPath: string; + private qs: { + include_count: boolean; + skip?: number; + }; + + constructor({ exportConfig, stackAPIClient }: ModuleClassParams) { + super({ exportConfig, stackAPIClient }); + this.stackConfig = config.modules.stack; + this.qs = { include_count: true }; + this.stackFolderPath = pResolve(this.exportConfig.data, this.stackConfig.dirName); + } + + async start(): Promise { + if (isAuthenticated()) { + const stackData = await this.getStack(); + if (stackData?.org_uid) { + this.exportConfig.org_uid = stackData.org_uid; + this.exportConfig.sourceStackName = stackData.name; + } + } + if (!this.exportConfig.preserveStackVersion && !this.exportConfig.hasOwnProperty('master_locale')) { + //fetch master locale details + return this.getLocales(); + } else if (this.exportConfig.preserveStackVersion) { + return this.exportStack(); + } + } + + async getStack(): Promise { + const tempAPIClient = await managementSDKClient({ host: this.exportConfig.host }); + return await tempAPIClient + .stack({ api_key: this.exportConfig.source_stack }) + .fetch() + .catch((error: any) => { + log(this.exportConfig, `Failed to export stack. ${formatError(error)}`, 'error'); + }); + } + + async getLocales(skip: number = 0) { + if (skip) { + this.qs.skip = skip; + } + return await this.stack + .locale() + .query(this.qs) + .find() + .then(async (data: any) => { + const { items, count } = data; + if (items?.length) { + skip += this.stackConfig.limit || 100; + const masterLocalObj = find(items, (locale: any) => { + if (locale.fallback_locale === null) { + return locale; + } + }); + if (masterLocalObj) { + return masterLocalObj; + } else if (skip >= count) { + log(this.exportConfig, 'Master locale not found', 'error'); + return; + } else { + return await this.getLocales(skip); + } + } + }) + .catch((error: any) => { + log(this.exportConfig, `Failed to export locales. ${formatError(error)}`, 'error'); + log(this.exportConfig, error, 'error'); + }); + } + + async exportStack(): Promise { + log(this.exportConfig, 'Exporting stack details', 'success'); + await fsUtil.makeDirectory(this.stackFolderPath); + return this.stack + .fetch() + .then((resp: any) => { + fsUtil.writeFile(pResolve(this.stackFolderPath, this.stackConfig.fileName), resp); + log(this.exportConfig, 'Exported stack details successfully!', 'success'); + return resp; + }) + .catch((error: any) => { + log(this.exportConfig, `Failed to export stack. ${formatError(error)}`, 'error'); + }); + } +} diff --git a/packages/contentstack-export/src/export/modules/webhooks.ts b/packages/contentstack-export/src/export/modules/webhooks.ts new file mode 100644 index 0000000000..77b7b99e4f --- /dev/null +++ b/packages/contentstack-export/src/export/modules/webhooks.ts @@ -0,0 +1,79 @@ +import omit from 'lodash/omit'; +import isEmpty from 'lodash/isEmpty'; +import { resolve as pResolve } from 'node:path'; + +import config from '../../config'; +import BaseClass from './base-class'; +import { log, formatError, fsUtil } from '../../utils'; +import { WebhookConfig, ModuleClassParams } from '../../types'; + +export default class ExportWebhooks extends BaseClass { + private webhooks: Record>; + private webhookConfig: WebhookConfig; + public webhooksFolderPath: string; + private qs: { + include_count: boolean; + skip?: number; + asc: string; + }; + + constructor({ exportConfig, stackAPIClient }: ModuleClassParams) { + super({ exportConfig, stackAPIClient }); + this.webhooks = {}; + this.webhookConfig = config.modules.webhooks; + this.qs = { include_count: true, asc: 'updated_at' }; + } + + async start(): Promise { + log(this.exportConfig, 'Starting webhooks export', 'info'); + + this.webhooksFolderPath = pResolve( + this.exportConfig.data, + this.exportConfig.branchName || '', + this.webhookConfig.dirName, + ); + + await fsUtil.makeDirectory(this.webhooksFolderPath); + await this.getWebhooks(); + if (this.webhooks === undefined || isEmpty(this.webhooks)) { + log(this.exportConfig, 'No webhooks found', 'info'); + } else { + fsUtil.writeFile(pResolve(this.webhooksFolderPath, this.webhookConfig.fileName), this.webhooks); + log(this.exportConfig, 'All the webhooks have been exported successfully!', 'success'); + } + } + + async getWebhooks(skip = 0): Promise { + if (skip) { + this.qs.skip = skip; + } + + await this.stack + .webhook() + .fetchAll(this.qs) + .then(async (data: any) => { + const { items, count } = data; + if (items?.length) { + this.sanitizeAttribs(items); + skip += this.webhookConfig.limit || 100; + if (skip >= count) { + return; + } + return await this.getWebhooks(skip); + } + }) + .catch((error: any) => { + log(this.exportConfig, `Failed to export webhooks.${formatError(error)}`, 'error'); + log(this.exportConfig, error, 'error'); + }); + } + + sanitizeAttribs(webhooks: Record[]) { + for (let index = 0; index < webhooks?.length; index++) { + const webhookUid = webhooks[index].uid; + const webhookName = webhooks[index]?.name; + this.webhooks[webhookUid] = omit(webhooks[index], ['SYS_ACL']); + log(this.exportConfig, `'${webhookName}' webhook was exported successfully`, 'success'); + } + } +} diff --git a/packages/contentstack-export/src/export/modules/workflows.ts b/packages/contentstack-export/src/export/modules/workflows.ts new file mode 100644 index 0000000000..cdce55e359 --- /dev/null +++ b/packages/contentstack-export/src/export/modules/workflows.ts @@ -0,0 +1,100 @@ +import omit from 'lodash/omit'; +import isEmpty from 'lodash/isEmpty'; +import { resolve as pResolve } from 'node:path'; + +import config from '../../config'; +import BaseClass from './base-class'; +import { log, formatError, fsUtil } from '../../utils'; +import { WorkflowConfig, ModuleClassParams } from '../../types'; + +export default class ExportWorkFlows extends BaseClass { + private workflows: Record>; + private workflowConfig: WorkflowConfig; + public webhooksFolderPath: string; + private qs: { + include_count: boolean; + skip?: number; + }; + + constructor({ exportConfig, stackAPIClient }: ModuleClassParams) { + super({ exportConfig, stackAPIClient }); + this.workflows = {}; + this.workflowConfig = config.modules.workflows; + this.qs = { include_count: true }; + } + + async start(): Promise { + log(this.exportConfig, 'Starting workflows export', 'info'); + + this.webhooksFolderPath = pResolve( + this.exportConfig.data, + this.exportConfig.branchName || '', + this.workflowConfig.dirName, + ); + + await fsUtil.makeDirectory(this.webhooksFolderPath); + await this.getWorkflows(); + + if (this.workflows === undefined || isEmpty(this.workflows)) { + log(this.exportConfig, 'No workflows found', 'info'); + } else { + fsUtil.writeFile(pResolve(this.webhooksFolderPath, this.workflowConfig.fileName), this.workflows); + log(this.exportConfig, 'All the workflows have been exported successfully!', 'success'); + } + } + + async getWorkflows(skip = 0): Promise { + if (skip) { + this.qs.skip = skip; + } + + await this.stack + .workflow() + .fetchAll(this.qs) + .then(async (data: any) => { + const { items, count } = data; + if (items?.length) { + await this.sanitizeAttribs(items); + skip += this.workflowConfig.limit || 100; + if (skip >= count) { + return; + } + return await this.getWorkflows(skip); + } + }) + .catch((error: any) => { + log(this.exportConfig, `Failed to export workflows.${formatError(error)}`, 'error'); + log(this.exportConfig, error, 'error'); + }); + } + + async sanitizeAttribs(workflows: Record[]) { + for (let index = 0; index < workflows?.length; index++) { + await this.getWorkflowRoles(workflows[index]); + const workflowUid = workflows[index].uid; + const workflowName = workflows[index]?.name || ''; + this.workflows[workflowUid] = omit(workflows[index], this.workflowConfig.invalidKeys); + log(this.exportConfig, `'${workflowName}' workflow was exported successfully`, 'success'); + } + } + + async getWorkflowRoles(workflow: Record) { + for (const stage of workflow?.workflow_stages) { + for (let i = 0; i < stage?.SYS_ACL?.roles?.uids?.length; i++) { + const roleUid = stage.SYS_ACL.roles.uids[i]; + const roleData = await this.getRoles(roleUid); + stage.SYS_ACL.roles.uids[i] = roleData; + } + } + } + + async getRoles(roleUid: number): Promise { + return await this.stack + .role(roleUid) + .fetch({ include_rules: true, include_permissions: true }) + .then((data: any) => data) + .catch((err: any) => + log(this.exportConfig, `Failed to fetch roles.${formatError(err)}`, 'error'), + ); + } +} diff --git a/packages/contentstack-export/src/lib/util/export-flags.js b/packages/contentstack-export/src/lib/util/export-flags.js deleted file mode 100644 index 33a7439567..0000000000 --- a/packages/contentstack-export/src/lib/util/export-flags.js +++ /dev/null @@ -1,193 +0,0 @@ -/*! - * Contentstack Export - * Copyright (c) 2019 Contentstack LLC - * MIT Licensed - */ -let defaultConfig = require('../../config/default'); -let message = require('../../../messages/index.json'); -let { initial } = require('../../app'); -let path = require('path'); -const helper = require('../util/helper'); -let _ = require('lodash'); -const { cliux } = require('@contentstack/cli-utilities'); - -exports.configWithMToken = async ( - config, - managementTokens, - host, - contentTypes, - branchName, - securedAssets, - moduleName, - data, - exportCommandFlags, -) => { - let externalConfig = require(config); - const modules = externalConfig.filteredModules; - - defaultConfig.securedAssets = securedAssets; - defaultConfig.management_token = managementTokens.token; - defaultConfig.host = host.cma; - defaultConfig.cdn = host.cda; - defaultConfig.branchName = branchName; - defaultConfig.source_stack = managementTokens.apiKey; - defaultConfig.isAuthenticated = exportCommandFlags.isAuthenticated; - if (moduleName) { - defaultConfig.moduleName = moduleName; - // Specfic content type setting is only for entries module - if (moduleName === 'entries' && Array.isArray(contentTypes) && contentTypes.length > 0) { - defaultConfig.contentTypes = contentTypes; - } - } - defaultConfig = _.merge(defaultConfig, externalConfig); - - if(!defaultConfig.data) { - defaultConfig.data = data - } - - if (_.isArray(modules)) { - defaultConfig.modules.types = _.filter(defaultConfig.modules.types, (module) => _.includes(modules, module)); - } - - await initial(defaultConfig); -}; - -exports.parameterWithMToken = async ( - managementTokens, - data, - moduleName, - host, - contentTypes, - branchName, - securedAssets, - exportCommandFlags, -) => { - defaultConfig.management_token = managementTokens.token; - defaultConfig.host = host.cma; - defaultConfig.cdn = host.cda; - defaultConfig.branchName = branchName; - defaultConfig.securedAssets = securedAssets; - defaultConfig.isAuthenticated = exportCommandFlags.isAuthenticated; - if (!moduleName) { - defaultConfig.contentTypes = contentTypes; - } else { - defaultConfig.moduleName = moduleName; - // Specfic content type setting is only for entries module - if (moduleName === 'entries' && Array.isArray(contentTypes) && contentTypes.length > 0) { - defaultConfig.contentTypes = contentTypes; - } - } - defaultConfig.source_stack = managementTokens.apiKey; - defaultConfig.data = data; - await initial(defaultConfig); -}; - -// using ManagementToken -exports.withoutParameterMToken = async ( - managementTokens, - moduleName, - host, - contentTypes, - branchName, - securedAssets, - exportCommandFlags, -) => { - const stackUid = managementTokens.apiKey; - const pathOfExport = await cliux.prompt(message.promptMessageList.promptPathStoredData); - defaultConfig.management_token = managementTokens.token; - defaultConfig.host = host.cma; - defaultConfig.cdn = host.cda; - defaultConfig.branchName = branchName; - defaultConfig.securedAssets = securedAssets; - defaultConfig.isAuthenticated = exportCommandFlags.isAuthenticated; - if (moduleName) { - defaultConfig.moduleName = moduleName; - // Specfic content type setting is only for entries module - if (moduleName === 'entries' && Array.isArray(contentTypes) && contentTypes.length > 0) { - defaultConfig.contentTypes = contentTypes; - } - } - defaultConfig.source_stack = stackUid; - defaultConfig.data = pathOfExport; - await initial(defaultConfig); -}; - -exports.configWithAuthToken = async function ( - config, - moduleName, - host, - contentTypes, - branchName, - securedAssets, - exportCommandFlags, -) { - let externalConfig = helper.readFileSync(path.resolve(config)); - defaultConfig.host = host.cma; - defaultConfig.cdn = host.cda; - defaultConfig.branchName = branchName; - defaultConfig.securedAssets = securedAssets; - defaultConfig.isAuthenticated = exportCommandFlags.isAuthenticated; - if (moduleName) { - defaultConfig.moduleName = moduleName; - // Specfic content type setting is only for entries module - if (moduleName === 'entries' && Array.isArray(contentTypes) && contentTypes.length > 0) { - defaultConfig.contentTypes = contentTypes; - } - } - defaultConfig = _.merge(defaultConfig, externalConfig); - await initial(defaultConfig); -}; - -exports.parametersWithAuthToken = async ( - sourceStack, - data, - moduleName, - host, - contentTypes, - branchName, - securedAssets, - exportCommandFlags, -) => { - defaultConfig.source_stack = sourceStack; - defaultConfig.isAuthenticated = exportCommandFlags.isAuthenticated; - if (moduleName) { - defaultConfig.moduleName = moduleName; - // Specfic content type setting is only for entries module - if (moduleName === 'entries' && Array.isArray(contentTypes) && contentTypes.length > 0) { - defaultConfig.contentTypes = contentTypes; - } - } - defaultConfig.branchName = branchName; - defaultConfig.host = host.cma; - defaultConfig.cdn = host.cda; - defaultConfig.data = data; - defaultConfig.securedAssets = securedAssets; - await initial(defaultConfig); -}; - -exports.withoutParametersWithAuthToken = async ( - moduleName, - host, - contentTypes, - branchName, - securedAssets, - exportCommandFlags, -) => { - const stackUid = await cliux.prompt(message.promptMessageList.promptSourceStack); - const pathOfExport = await cliux.prompt(message.promptMessageList.promptPathStoredData); - defaultConfig.source_stack = stackUid; - defaultConfig.securedAssets = securedAssets; - defaultConfig.isAuthenticated = exportCommandFlags.isAuthenticated; - if (moduleName) { - defaultConfig.moduleName = moduleName; - // Specfic content type setting is only for entries module - if (moduleName === 'entries' && Array.isArray(contentTypes) && contentTypes.length > 0) { - defaultConfig.contentTypes = contentTypes; - } - } - defaultConfig.branchName = branchName; - defaultConfig.data = pathOfExport; - defaultConfig.host = host.cma; - defaultConfig.cdn = host.cda; - await initial(defaultConfig); -}; diff --git a/packages/contentstack-export/src/lib/util/helper.js b/packages/contentstack-export/src/lib/util/helper.js deleted file mode 100755 index 4a22090290..0000000000 --- a/packages/contentstack-export/src/lib/util/helper.js +++ /dev/null @@ -1,113 +0,0 @@ -/*! - * Contentstack Export - * Copyright (c) 2019 Contentstack LLC - * MIT Licensed - */ - -const fs = require('fs'); -const path = require('path'); -const mkdirp = require('mkdirp'); -const bigJSON = require('big-json'); - -exports.readFileSync = (filePath, parse) => { - let data; - parse = typeof parse === 'undefined' ? true : parse; - filePath = path.resolve(filePath); - if (fs.existsSync(filePath)) { - data = parse ? JSON.parse(fs.readFileSync(filePath, 'utf8')) : data; - } - return data; -}; - -// by default file type is json -exports.readFile = async (filePath, options = { type: 'json' }) => { - return new Promise((resolve, reject) => { - filePath = path.resolve(filePath); - fs.readFile(filePath, 'utf-8', (error, data) => { - if (error) { - reject(error); - } else { - if (options.type !== 'json') { - return resolve(data); - } - resolve(JSON.parse(data)); - } - }); - }); -}; - -exports.makeDirectory = async (path) => { - if (!path) { - throw new Error('Invalid path to create directory'); - } - return mkdirp(path); -}; - -exports.readLargeFile = (filePath, opts = {}) => { - if (typeof filePath !== 'string') { - return; - } - filePath = path.resolve(filePath); - if (fs.existsSync(filePath)) { - return new Promise((resolve, reject) => { - const readStream = fs.createReadStream(filePath, { encoding: 'utf-8' }); - const parseStream = bigJSON.createParseStream(); - parseStream.on('data', (data) => { - if (opts.type === 'array') { - return resolve(Object.values(data)); - } - resolve(data); - }); - parseStream.on('error', (error) => { - console.log('error', error); - reject(error); - }); - readStream.pipe(parseStream); - }); - } -}; - -exports.writeLargeFile = (filePath, data) => { - if (typeof filePath !== 'string' || typeof data !== 'object') { - return; - } - filePath = path.resolve(filePath); - return new Promise((resolve, reject) => { - const stringifyStream = bigJSON.createStringifyStream({ - body: data, - }); - const writeStream = fs.createWriteStream(filePath, 'utf-8'); - stringifyStream.pipe(writeStream); - writeStream.on('finish', () => { - resolve(); - }); - writeStream.on('error', (error) => { - reject(error); - }); - }); -}; - -exports.writeFileSync = (filePath, data) => { - data = typeof data === 'object' ? JSON.stringify(data) : data || '{}'; - fs.writeFileSync(filePath, data); -}; - -exports.writeFile = (filePath, data) => { - return new Promise((resolve, reject) => { - data = typeof data === 'object' ? JSON.stringify(data) : data || '{}'; - fs.writeFile(filePath, data, (error) => { - if (error) { - return reject(error); - } - resolve('done'); - }); - }); -}; - -exports.readdir = (dirPath) => { - if (fs.existsSync(path)) { - return fs.readdirSync(dirPath); - } else { - return []; - } -}; diff --git a/packages/contentstack-export/src/lib/util/login.js b/packages/contentstack-export/src/lib/util/login.js deleted file mode 100644 index a124227b1c..0000000000 --- a/packages/contentstack-export/src/lib/util/login.js +++ /dev/null @@ -1,79 +0,0 @@ -/* eslint-disable max-statements-per-line */ -/* eslint-disable no-console */ -/* eslint-disable no-empty */ -/*! - * Contentstack Import - * Copyright (c) 2019 Contentstack LLC - * MIT Licensed - */ - -const chalk = require('chalk'); -const { addlogs } = require('../util/log'); -const { managementSDKClient, isAuthenticated } = require('@contentstack/cli-utilities'); - -module.exports.login = (config) => { - return new Promise((resolve, reject) => { - managementSDKClient(config) - .then((APIClient) => { - if (config.email && config.password) { - // eslint-disable-next-line no-console - console.log('Logging into Contentstack'); - APIClient.login({ email: config.email, password: config.password }) - .then((response) => { - // eslint-disable-next-line no-console - console.log(chalk.green('Contentstack account authenticated successfully!')); - config.headers = { - api_key: config.source_stack, - access_token: config.access_token, - authtoken: response.user.authtoken, - 'X-User-Agent': 'contentstack-export/v', - }; - resolve(config); - }) - .catch((error) => { - reject(error); - }); - } else if (isAuthenticated() && !config.management_token) { - const stackAPIClient = APIClient.stack({ - api_key: config.source_stack, - management_token: config.management_token, - }); - stackAPIClient - .users() - .then(() => { - resolve(); - }) - .catch((error) => { - if (error.errors.api_key) { - return reject(error); - } - addlogs(config, error.errorMessage, 'error'); - reject(error); - }); - } else if (!config.email && !config.password && config.source_stack && config.access_token) { - addlogs( - config, - chalk.yellow('Content types, entries, assets, labels, global fields, extensions modules will be exported'), - 'success', - ); - addlogs( - config, - chalk.yellow( - 'Email, password, or management token is not set in the config, cannot export Webhook and label modules', - ), - 'success', - ); - config.headers = { - api_key: config.source_stack, - access_token: config.access_token, - 'X-User-Agent': 'contentstack-export/v', - }; - resolve(config); - // eslint-disable-next-line no-else-return - } else if (config.management_token) { - resolve(); - } - }) - .catch((error) => reject(error)); - }); -}; diff --git a/packages/contentstack-export/src/lib/util/marketplace-app-helper.js b/packages/contentstack-export/src/lib/util/marketplace-app-helper.js deleted file mode 100644 index b37696a01a..0000000000 --- a/packages/contentstack-export/src/lib/util/marketplace-app-helper.js +++ /dev/null @@ -1,24 +0,0 @@ -let config = require('../../config/default'); -const { cliux, configHandler } = require('@contentstack/cli-utilities'); - -const getDeveloperHubUrl = async () => { - const { cma, name } = configHandler.get('region') || {}; - let developerHubBaseUrl = config.developerHubUrls[cma]; - - if (!developerHubBaseUrl) { - developerHubBaseUrl = await cliux.inquire({ - type: 'input', - name: 'name', - validate: (url) => { - if (!url) return "Developer-hub URL can't be empty."; - - return true; - }, - message: `Enter the developer-hub base URL for the ${name} region - `, - }); - } - - return developerHubBaseUrl.startsWith('http') ? developerHubBaseUrl : `https://${developerHubBaseUrl}`; -}; - -module.exports = { getDeveloperHubUrl }; diff --git a/packages/contentstack-export/src/lib/util/setup-branches.js b/packages/contentstack-export/src/lib/util/setup-branches.js deleted file mode 100644 index 39400aa34e..0000000000 --- a/packages/contentstack-export/src/lib/util/setup-branches.js +++ /dev/null @@ -1,56 +0,0 @@ -const mkdirp = require('mkdirp'); -const path = require('path'); -const helper = require('./helper'); -const {isAuthenticated, configHandler} = require('@contentstack/cli-utilities') - -const setupBranches = async (config, branch, stackAPIClient) => { - if (typeof config !== 'object') { - throw new Error('Invalid config to setup the branch'); - } - - let branches = []; - - const headers = { api_key: config.source_stack }; - - if (isAuthenticated()) { - headers['authtoken'] = configHandler.get('authtoken'); - } else if (config.management_token) { - headers['authorization'] = config.management_token; - } - - if (typeof branch === 'string') { - // check branch exists - const result = await stackAPIClient - .branch(branch) - .fetch() - .catch((_err) => {}); - if (result && typeof result === 'object') { - branches.push(result); - } else { - throw new Error('No branch found with the name ' + branch); - } - } else { - try { - const result = await stackAPIClient - .branch() - .query() - .find() - .catch((_err) => {}); - if (result && result.items && Array.isArray(result.items) && result.items.length > 0) { - branches = result.items; - } else { - return; - } - } catch (error) { - return; - } - } - - mkdirp.sync(config.data); - // create branch info file - helper.writeFile(path.join(config.data, 'branches.json'), branches); - // add branches list in the - config.branches = branches; -}; - -module.exports = setupBranches; diff --git a/packages/contentstack-export/src/types/default-config.ts b/packages/contentstack-export/src/types/default-config.ts new file mode 100644 index 0000000000..918786bdac --- /dev/null +++ b/packages/contentstack-export/src/types/default-config.ts @@ -0,0 +1,169 @@ +import { Modules } from '.'; + +export default interface DefaultConfig { + versioning: boolean; + host: string; + cdn?: string; + developerHubUrls: any; + // use below hosts for eu region + // host:'https://eu-api.contentstack.com/v3', + // use below hosts for azure-na region + // host:'https://azure-na-api.contentstack.com/v3', + modules: { + types: Modules[]; + locales: { + dirName: string; + fileName: string; + requiredKeys: string[]; + dependencies?: Modules[]; + }; + customRoles: { + dirName: string; + fileName: string; + customRolesLocalesFileName: string; + dependencies?: Modules[]; + }; + 'custom-roles': { + dirName: string; + fileName: string; + customRolesLocalesFileName: string; + dependencies?: Modules[]; + }; + environments: { + dirName: string; + fileName: string; + dependencies?: Modules[]; + }; + labels: { + dirName: string; + fileName: string; + invalidKeys: string[]; + dependencies?: Modules[]; + }; + webhooks: { + dirName: string; + fileName: string; + dependencies?: Modules[]; + }; + releases: { + dirName: string; + fileName: string; + releasesList: string; + invalidKeys: string[]; + dependencies?: Modules[]; + }; + workflows: { + dirName: string; + fileName: string; + invalidKeys: string[]; + dependencies?: Modules[]; + }; + globalfields: { + dirName: string; + fileName: string; + validKeys: string[]; + dependencies?: Modules[]; + }; + 'global-fields': { + dirName: string; + fileName: string; + validKeys: string[]; + dependencies?: Modules[]; + }; + assets: { + dirName: string; + fileName: string; + // This is the total no. of asset objects fetched in each 'get assets' call + batchLimit: number; + host: string; + invalidKeys: string[]; + // no of asset version files (of a single asset) that'll be downloaded parallel + chunkFileSize: number; // measured on Megabits (5mb) + downloadLimit: number; + fetchConcurrency: number; + assetsMetaKeys: string[]; // Default keys ['uid', 'url', 'filename'] + securedAssets: boolean; + displayExecutionTime: boolean; + enableDownloadStatus: boolean; + includeVersionedAssets: boolean; + dependencies?: Modules[]; + }; + content_types: { + dirName: string; + fileName: string; + validKeys: string[]; + // total no of content types fetched in each 'get content types' call + limit: number; + dependencies?: Modules[]; + }; + 'content-types': { + dirName: string; + fileName: string; + validKeys: string[]; + // total no of content types fetched in each 'get content types' call + limit: number; + dependencies?: Modules[]; + }; + entries: { + dirName: string; + fileName: string; + invalidKeys: string[]; + batchLimit: number; + downloadLimit: number; + // total no of entries fetched in each content type in a single call + limit: number; + dependencies?: Modules[]; + exportVersions: boolean; + }; + extensions: { + dirName: string; + fileName: string; + dependencies?: Modules[]; + }; + stack: { + dirName: string; + fileName: string; + dependencies?: Modules[]; + }; + dependency: { + entries: string[]; + }; + marketplace_apps: { + dirName: string; + fileName: string; + dependencies?: Modules[]; + }; + 'marketplace-apps': { + dirName: string; + fileName: string; + dependencies?: Modules[]; + }; + masterLocale: { + dirName: string; + fileName: string; + requiredKeys: string[]; + }; + }; + languagesCode: string[]; + updatedModules: string[]; + apis: { + userSession: string; + globalfields: string; + locales: string; + labels: string; + environments: string; + assets: string; + content_types: string; + entries: string; + users: string; + extension: string; + webhooks: string; + stacks: string; + }; + preserveStackVersion: boolean; + fetchConcurrency: number; + writeConcurrency: number; + developerHubBaseUrl: string; + marketplaceAppEncryptionKey: string; + useNewModuleStructure: boolean; +} diff --git a/packages/contentstack-export/src/types/export-config.ts b/packages/contentstack-export/src/types/export-config.ts new file mode 100644 index 0000000000..a56db980e6 --- /dev/null +++ b/packages/contentstack-export/src/types/export-config.ts @@ -0,0 +1,40 @@ +import { Modules } from '.'; +import DefaultConfig from './default-config'; + +export default interface ExportConfig extends DefaultConfig { + exportDir: string; + data: string; + management_token?: string; + apiKey: string; + forceStopMarketplaceAppsPrompt: boolean; + auth_token?: string; + branchName?: string; + securedAssets?: boolean; + contentTypes?: string[]; + branches?: branch[]; + branchEnabled?: boolean; + branchDir?: string; + singleModuleExport?: boolean; + moduleName?: Modules; + master_locale: masterLocale; + + headers?: { + api_key: string; + access_token?: string; + authtoken?: string; + 'X-User-Agent': string; + }; + access_token?: string; + org_uid?: string; + source_stack?: string; + sourceStackName?:string; +} + +type branch = { + uid: string; + source: string; +}; + +type masterLocale = { + code: string; +}; diff --git a/packages/contentstack-export/src/types/index.ts b/packages/contentstack-export/src/types/index.ts new file mode 100644 index 0000000000..ccf95c0918 --- /dev/null +++ b/packages/contentstack-export/src/types/index.ts @@ -0,0 +1,125 @@ +import { ContentstackClient } from '@contentstack/cli-utilities'; +import ExportConfig from './export-config'; + +// eslint-disable-next-line @typescript-eslint/no-redeclare +export interface AuthOptions { + contentstackClient: any; +} + +export interface ContentStackManagementClient { + contentstackClient: object; +} + +export interface PrintOptions { + color?: string; +} + +export interface InquirePayload { + type: string; + name: string; + message: string; + choices?: Array; + transformer?: Function; +} + +export interface User { + email: string; + authtoken: string; +} + +export type Modules = + | 'stack' + | 'assets' + | 'locales' + | 'environments' + | 'extensions' + | 'webhooks' + | 'global-fields' + | 'entries' + | 'content-types' + | 'custom-roles' + | 'workflows' + | 'labels' + | 'marketplace-apps'; + +export type ModuleClassParams = { + stackAPIClient: ReturnType; + exportConfig: ExportConfig; + moduleName: Modules; +}; + +export interface ExternalConfig extends ExportConfig { + master_locale: { + name: string; + code: string; + }; + source_stack?: string; + data: string; + branchName: string; + moduleName: Modules; + fetchConcurrency: number; + writeConcurrency: number; + securedAssets: boolean; + email?: string; + password?: string; +} + +export interface ExtensionsConfig { + dirName: string; + fileName: string; + dependencies?: Modules[]; + limit?: number; +} + +export interface MarketplaceAppsConfig { + dirName: string; + fileName: string; + dependencies?: Modules[]; +} + +export interface EnvironmentConfig { + dirName: string; + fileName: string; + dependencies?: Modules[]; + limit?: number; +} + +export interface LabelConfig { + dirName: string; + fileName: string; + invalidKeys: string[]; + dependencies?: Modules[]; + limit?: number; +} + +export interface WebhookConfig { + dirName: string; + fileName: string; + dependencies?: Modules[]; + limit?: number; +} + +export interface WorkflowConfig{ + dirName: string; + fileName: string; + invalidKeys: string[]; + dependencies?: Modules[]; + limit?: number; +} + +export interface CustomRoleConfig{ + dirName: string; + fileName: string; + customRolesLocalesFileName: string; + dependencies?: Modules[]; +} + +export interface StackConfig{ + dirName: string; + fileName: string; + dependencies?: Modules[]; + limit?: number; +} + +export { default as DefaultConfig } from './default-config'; +export { default as ExportConfig } from './export-config'; diff --git a/packages/contentstack-export/src/utils/basic-login.ts b/packages/contentstack-export/src/utils/basic-login.ts new file mode 100644 index 0000000000..e324c70f97 --- /dev/null +++ b/packages/contentstack-export/src/utils/basic-login.ts @@ -0,0 +1,58 @@ +/* eslint-disable max-statements-per-line */ +/* eslint-disable no-console */ +/* eslint-disable no-empty */ +/*! + * Contentstack Import + * Copyright (c) 2019 Contentstack LLC + * MIT Licensed + */ + +import { ExportConfig, ExternalConfig } from '../types'; +import { log } from './logger'; +const { + managementSDKClient, + isAuthenticated, + cliux, + configHandler, + authHandler, +} = require('@contentstack/cli-utilities'); + +const login = async (config: ExternalConfig): Promise => { + const client = await managementSDKClient(config); + if (config.email && config.password) { + const response = await client.login({ email: config.email, password: config.password }).catch(Promise.reject); + if (response?.user?.authtoken) { + config.headers = { + api_key: config.source_stack, + access_token: config.access_token, + authtoken: response.user.authtoken, + 'X-User-Agent': 'contentstack-export/v', + }; + await authHandler.setConfigData('basicAuth', response.user); + log(config, 'Contentstack account authenticated successfully!', 'success'); + return config; + } else { + log(config, 'Failed to login, Invalid credentials', 'error'); + process.exit(1); + } + } else if (!config.email && !config.password && config.source_stack && config.access_token) { + log( + config, + 'Content types, entries, assets, labels, global fields, extensions modules will be exported', + 'success', + ); + log( + config, + 'Email, password, or management token is not set in the config, cannot export Webhook and label modules', + 'success', + ); + config.headers = { + api_key: config.source_stack, + access_token: config.access_token, + 'X-User-Agent': 'contentstack-export/v', + }; + return config; + } +}; + +export default login; diff --git a/packages/contentstack-export/src/lib/util/index.js b/packages/contentstack-export/src/utils/common-helper.ts old mode 100755 new mode 100644 similarity index 81% rename from packages/contentstack-export/src/lib/util/index.js rename to packages/contentstack-export/src/utils/common-helper.ts index 8b54e9bc39..fc5327d070 --- a/packages/contentstack-export/src/lib/util/index.js +++ b/packages/contentstack-export/src/utils/common-helper.ts @@ -4,12 +4,12 @@ * MIT Licensed */ -const _ = require('lodash'); -const defaultConfig = require('../../config/default'); -const promiseLimit = require('promise-limit'); -const { isAuthenticated } = require('@contentstack/cli-utilities'); +import promiseLimit from 'promise-limit'; +import { isAuthenticated } from '@contentstack/cli-utilities'; -exports.validateConfig = (config) => { +import { ExternalConfig } from '../types'; + +export const validateConfig = function (config: ExternalConfig) { if (!config.host || !config.cdn) { throw new Error('Host/CDN end point is missing from config'); } @@ -39,12 +39,7 @@ exports.validateConfig = (config) => { } }; -exports.buildAppConfig = function (config) { - config = _.merge(defaultConfig, config); - return config; -}; - -exports.formatError = function (error) { +export const formatError = function (error: any) { try { if (typeof error === 'string') { error = JSON.parse(error); @@ -66,7 +61,11 @@ exports.formatError = function (error) { return message; }; -exports.executeTask = function (tasks = [], handler, options) { +export const executeTask = function ( + tasks: unknown[] = [], + handler: (task: unknown) => Promise, + options: { concurrency: number }, +) { if (typeof handler !== 'function') { throw new Error('Invalid handler'); } diff --git a/packages/contentstack-export/src/utils/export-config-handler.ts b/packages/contentstack-export/src/utils/export-config-handler.ts new file mode 100644 index 0000000000..0f7a107048 --- /dev/null +++ b/packages/contentstack-export/src/utils/export-config-handler.ts @@ -0,0 +1,78 @@ +import merge from 'merge'; +import * as path from 'path'; +import { configHandler, isAuthenticated, FlagInput } from '@contentstack/cli-utilities'; +import defaultConfig from '../config'; +import { readFile } from './file-helper'; +import { askExportDir, askAPIKey } from './interactive'; +import login from './basic-login'; +import { filter, includes } from 'lodash'; +import { ExportConfig } from '../types'; + +const setupConfig = async (exportCmdFlags: any): Promise => { + let config = merge({}, defaultConfig); + // setup the config + if (exportCmdFlags['config']) { + const externalConfig = await readFile(exportCmdFlags['config']); + config = merge.recursive(config, externalConfig); + } + config.exportDir = exportCmdFlags['data'] || exportCmdFlags['data-dir'] || config.data || (await askExportDir()); + config.exportDir = path.resolve(config.exportDir); + //Note to support the old key + config.data = config.exportDir; + + const managementTokenAlias = exportCmdFlags['management-token-alias'] || exportCmdFlags['alias']; + + if (managementTokenAlias) { + const { token, apiKey } = configHandler.get(`tokens.${managementTokenAlias}`); + config.management_token = token; + config.apiKey = apiKey; + if (!config.management_token) { + throw new Error(`No management token found on given alias ${managementTokenAlias}`); + } + } + + if (!config.management_token) { + if (!isAuthenticated()) { + if (config.username && config.password) { + await login(config); + } else { + throw new Error('Please login or provide an alias for the management token'); + } + } else { + config.apiKey = + exportCmdFlags['stack-uid'] || exportCmdFlags['stack-api-key'] || config.source_stack || (await askAPIKey()); + if (typeof config.apiKey !== 'string') { + throw new Error('Invalid API key received'); + } + } + } + + // Note support old config + config.source_stack = config.apiKey; + + config.forceStopMarketplaceAppsPrompt = exportCmdFlags.yes; + config.auth_token = configHandler.get('authtoken'); // TBD remove once dependent modules are updated + config.isAuthenticated = isAuthenticated(); + + if (exportCmdFlags['branch']) { + config.branchName = exportCmdFlags['branch']; + } + if (exportCmdFlags['module']) { + config.moduleName = exportCmdFlags['module']; + config.singleModuleExport = true; + } + if (exportCmdFlags['secured-assets']) { + config.securedAssets = true; + } + if (Array.isArray(exportCmdFlags['content-types']) && exportCmdFlags['content-types'].length > 0) { + config.contentTypes = exportCmdFlags['content-types']; + } + + if (Array.isArray(config.filteredModules) && config.filteredModules.length > 0) { + config.modules.types = filter(defaultConfig.modules.types, (module) => includes(config.filteredModules, module)); + } + + return config; +}; + +export default setupConfig; diff --git a/packages/contentstack-import/src/lib/util/fs.js b/packages/contentstack-export/src/utils/file-helper.ts old mode 100755 new mode 100644 similarity index 61% rename from packages/contentstack-import/src/lib/util/fs.js rename to packages/contentstack-export/src/utils/file-helper.ts index 0176b775ad..cc9863c843 --- a/packages/contentstack-import/src/lib/util/fs.js +++ b/packages/contentstack-export/src/utils/file-helper.ts @@ -1,37 +1,25 @@ -/*! - * Contentstack Import - * Copyright (c) 2019 Contentstack LLC - * MIT Licensed - */ +import * as fs from 'fs'; +import * as path from 'path'; +import mkdirp from 'mkdirp'; +import bigJSON from 'big-json'; +import { FsUtility } from '@contentstack/cli-utilities'; -var fs = require('fs'); -var path = require('path'); -var mkdirp = require('mkdirp'); -const bigJSON = require('big-json'); - -exports.readFileSync = function (filePath, parse) { +export const readFileSync = function (filePath: string, parse: boolean): unknown { let data; parse = typeof parse === 'undefined' ? true : parse; filePath = path.resolve(filePath); if (fs.existsSync(filePath)) { - try { - data = parse ? JSON.parse(fs.readFileSync(filePath, 'utf-8')) : data; - } catch (error) { - return data; - } + data = parse ? JSON.parse(fs.readFileSync(filePath, 'utf8')) : data; } return data; }; // by default file type is json -exports.readFile = async (filePath, options = { type: 'json' }) => { +export const readFile = async (filePath: string, options = { type: 'json' }): Promise => { return new Promise((resolve, reject) => { filePath = path.resolve(filePath); fs.readFile(filePath, 'utf-8', (error, data) => { if (error) { - if (error.code === 'ENOENT') { - return resolve(); - } reject(error); } else { if (options.type !== 'json') { @@ -43,31 +31,7 @@ exports.readFile = async (filePath, options = { type: 'json' }) => { }); }; -exports.writeFileSync = function (filePath, data) { - data = typeof data === 'object' ? JSON.stringify(data) : data || '{}'; - fs.writeFileSync(filePath, data); -}; - -exports.writeFile = function (filePath, data) { - return new Promise((resolve, reject) => { - data = typeof data === 'object' ? JSON.stringify(data) : data || '{}'; - fs.writeFile(filePath, data, (error) => { - if (error) { - return reject(error); - } - resolve('done'); - }); - }); -}; - -exports.makeDirectory = async function (path) { - if (!path) { - throw new Error('Invalid path to create directory'); - } - return mkdirp(path); -}; - -exports.readLargeFile = function (filePath, opts = {}) { +export const readLargeFile = function (filePath: string, options: { type?: string } = {}): Promise { if (typeof filePath !== 'string') { return; } @@ -76,13 +40,13 @@ exports.readLargeFile = function (filePath, opts = {}) { return new Promise((resolve, reject) => { const readStream = fs.createReadStream(filePath, { encoding: 'utf-8' }); const parseStream = bigJSON.createParseStream(); - parseStream.on('data', function (data) { - if (opts.type === 'array') { + parseStream.on('data', function (data: unknown) { + if (options.type === 'array') { return resolve(Object.values(data)); } resolve(data); }); - parseStream.on('error', function (error) { + parseStream.on('error', (error: Error) => { console.log('error', error); reject(error); }); @@ -91,7 +55,24 @@ exports.readLargeFile = function (filePath, opts = {}) { } }; -exports.writeLargeFile = function (filePath, data) { +export const writeFileSync = function (filePath: string, data: any): void { + data = typeof data === 'object' ? JSON.stringify(data) : data || '{}'; + fs.writeFileSync(filePath, data); +}; + +export const writeFile = function (filePath: string, data: any): Promise { + return new Promise((resolve, reject) => { + data = typeof data === 'object' ? JSON.stringify(data) : data || '{}'; + fs.writeFile(filePath, data, (error) => { + if (error) { + return reject(error); + } + resolve('done'); + }); + }); +}; + +export const writeLargeFile = function (filePath: string, data: any): Promise { if (typeof filePath !== 'string' || typeof data !== 'object') { return; } @@ -103,7 +84,7 @@ exports.writeLargeFile = function (filePath, data) { var writeStream = fs.createWriteStream(filePath, 'utf-8'); stringifyStream.pipe(writeStream); writeStream.on('finish', () => { - resolve(); + resolve(''); }); writeStream.on('error', (error) => { reject(error); @@ -111,7 +92,16 @@ exports.writeLargeFile = function (filePath, data) { }); }; -exports.readdirSync = function (dirPath) { +export const makeDirectory = function (dir: string): void { + for (const key in arguments) { + const dirname = path.resolve(arguments[key]); + if (!fs.existsSync(dirname)) { + mkdirp.sync(dirname); + } + } +}; + +export const readdir = function (dirPath: string): any { if (fs.existsSync(dirPath)) { return fs.readdirSync(dirPath); } else { @@ -119,6 +109,8 @@ exports.readdirSync = function (dirPath) { } }; -exports.fileExistsSync = function (path) { +exports.fileExistsSync = function (path: string) { return fs.existsSync(path); -}; \ No newline at end of file +}; + +export const fsUtil = new FsUtility(); diff --git a/packages/contentstack-export/src/utils/index.ts b/packages/contentstack-export/src/utils/index.ts new file mode 100644 index 0000000000..3ab3476518 --- /dev/null +++ b/packages/contentstack-export/src/utils/index.ts @@ -0,0 +1,10 @@ +export * as interactive from './interactive'; +export { default as setupExportConfig } from './export-config-handler'; +export * as fileHelper from './file-helper'; +export { fsUtil } from './file-helper'; +export { default as setupBranches } from './setup-branches'; +export { default as setupExportDir } from './setup-export-dir'; +export { log, unlinkFileLogger } from './logger'; +export { default as login } from './basic-login'; +export * from './common-helper'; +export * from './marketplace-app-helper'; diff --git a/packages/contentstack-export/src/utils/interactive.ts b/packages/contentstack-export/src/utils/interactive.ts new file mode 100644 index 0000000000..3004901136 --- /dev/null +++ b/packages/contentstack-export/src/utils/interactive.ts @@ -0,0 +1,79 @@ +import { cliux } from '@contentstack/cli-utilities'; +import * as path from 'path'; + +export const askPassword = async () => { + return cliux.inquire({ + type: 'input', + message: 'CLI_AUTH_LOGIN_ENTER_PASSWORD', + name: 'password', + transformer: (pswd: string) => { + let pswdMasked = ''; + for (let i = 0; i < pswd.length; i++) { + pswdMasked += '*'; + } + return pswdMasked; + }, + }); +}; + +export const askOTPChannel = async (): Promise => { + return cliux.inquire({ + type: 'list', + name: 'otpChannel', + message: 'CLI_AUTH_LOGIN_ASK_CHANNEL_FOR_OTP', + choices: [ + { name: 'Authy App', value: 'authy' }, + { name: 'SMS', value: 'sms' }, + ], + }); +}; + +export const askOTP = async (): Promise => { + return cliux.inquire({ + type: 'input', + message: 'CLI_AUTH_LOGIN_ENTER_SECURITY_CODE', + name: 'tfaToken', + }); +}; + +export const askUsername = async (): Promise => { + return cliux.inquire({ + type: 'input', + message: 'CLI_AUTH_LOGIN_ENTER_EMAIL_ADDRESS', + name: 'username', + }); +}; + +export const askExportDir = async (): Promise => { + const result = await cliux.inquire({ + type: 'input', + message: 'Enter the path for storing the content: (current folder)', + name: 'dir', + }); + if (!result) { + return process.cwd(); + } else { + return path.resolve(result); + } +}; + +export const askAPIKey = async (): Promise => { + return await cliux.inquire({ + type: 'input', + message: 'Enter the stack api key', + name: 'apiKey', + }); +}; + +export const askDeveloperHub = async(regionName: string): Promise =>{ + return await cliux.inquire({ + type: 'input', + name: 'name', + validate: (url: string) => { + if (!url) return "Developer-hub URL can't be empty."; + + return true; + }, + message: `Enter the developer-hub base URL for the ${regionName} region - `, + }); +} diff --git a/packages/contentstack-import/src/lib/util/log.js b/packages/contentstack-export/src/utils/logger.ts old mode 100755 new mode 100644 similarity index 54% rename from packages/contentstack-import/src/lib/util/log.js rename to packages/contentstack-export/src/utils/logger.ts index 7108132545..e808f2dbdf --- a/packages/contentstack-import/src/lib/util/log.js +++ b/packages/contentstack-export/src/utils/logger.ts @@ -1,30 +1,31 @@ /*! - * Contentstack Import + * Contentstack Export * Copyright (c) 2019 Contentstack LLC * MIT Licensed */ -var winston = require('winston'); -var path = require('path'); -var mkdirp = require('mkdirp'); -var slice = Array.prototype.slice; +import * as winston from 'winston'; +import * as path from 'path'; +import mkdirp from 'mkdirp'; +import { ExportConfig } from '../types'; + +const slice = Array.prototype.slice; const ansiRegexPattern = [ '[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)', '(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))', ].join('|'); -function returnString(args) { - var returnStr = ''; +function returnString(args: unknown[]) { + let returnStr = ''; if (args && args.length) { returnStr = args .map(function (item) { if (item && typeof item === 'object') { try { - return JSON.stringify(item).replace(/authtoken\":\"blt................/g, 'authtoken":"blt....'); - } catch (error) { - return item.message; - } + return JSON.stringify(item).replace(/authtoken\":\d"blt................/g, 'authtoken":"blt....'); + } catch (error) {} + return item; } return item; }) @@ -34,14 +35,14 @@ function returnString(args) { returnStr = returnStr.replace(new RegExp(ansiRegexPattern, 'g'), '').trim(); return returnStr; } - -var myCustomLevels = { +const myCustomLevels = { levels: { warn: 1, info: 2, debug: 3, }, colors: { + //colors aren't being used anywhere as of now, we're using chalk to add colors while logging info: 'blue', debug: 'green', warn: 'yellow', @@ -49,16 +50,15 @@ var myCustomLevels = { }, }; -let logger; -let errorLogger; +let logger: winston.Logger; +let errorLogger: winston.Logger; let successTransport; let errorTransport; -// removed logfileName from arguments -function init(_logPath) { +function init(_logPath: string) { if (!logger || !errorLogger) { - var logsDir = path.resolve(_logPath, 'logs', 'import'); + const logsDir = path.resolve(_logPath, 'logs', 'export'); // Create dir if doesn't already exist mkdirp.sync(logsDir); @@ -67,7 +67,6 @@ function init(_logPath) { maxFiles: 20, maxsize: 1000000, tailable: true, - json: true, level: 'info', }; @@ -76,7 +75,6 @@ function init(_logPath) { maxFiles: 20, maxsize: 1000000, tailable: true, - json: true, level: 'error', }; @@ -93,7 +91,10 @@ function init(_logPath) { new winston.transports.File(errorTransport), new winston.transports.Console({ level: 'error', - format: winston.format.combine(winston.format.colorize({ all: true, colors:{ error: 'red'} }), winston.format.simple()), + format: winston.format.combine( + winston.format.colorize({ all: true, colors: { error: 'red' } }), + winston.format.simple(), + ), }), ], levels: { error: 0 }, @@ -101,30 +102,30 @@ function init(_logPath) { } return { - log: function () { - var args = slice.call(arguments); - var logString = returnString(args); + log: function (message: any) { + const args = slice.call(arguments); + const logString = returnString(args); if (logString) { logger.log('info', logString); } }, warn: function () { - var args = slice.call(arguments); - var logString = returnString(args); + const args = slice.call(arguments); + const logString = returnString(args); if (logString) { logger.log('warn', logString); } }, - error: function () { - var args = slice.call(arguments); - var logString = returnString(args); + error: function (message: any) { + const args = slice.call(arguments); + const logString = returnString(args); if (logString) { errorLogger.log('error', logString); } }, debug: function () { - var args = slice.call(arguments); - var logString = returnString(args); + const args = slice.call(arguments); + const logString = returnString(args); if (logString) { logger.log('debug', logString); } @@ -132,13 +133,33 @@ function init(_logPath) { }; } -exports.addlogs = async (config, message, type) => { - var configLogPath = config.source_stack && config.target_stack ? config.data : config.oldPath; +export const log = async (config: ExportConfig, message: any, type: string) => { + config.data = config.data || path.join(__dirname, 'logs'); // ignoring the type argument, as we are not using it to create a logfile anymore if (type !== 'error') { // removed type argument from init method - init(configLogPath).log(message); + init(config.data).log(message); } else { - init(configLogPath).error(message); + init(config.data).error(message); + } +}; + +export const unlinkFileLogger = () => { + if (logger) { + const transports = logger.transports; + transports.forEach((transport: any) => { + if (transport.name === 'file') { + logger.remove(transport); + } + }); + } + + if (errorLogger) { + const transports = errorLogger.transports; + transports.forEach((transport: any) => { + if (transport.name === 'file') { + errorLogger.remove(transport); + } + }); } }; diff --git a/packages/contentstack-export/src/utils/marketplace-app-helper.ts b/packages/contentstack-export/src/utils/marketplace-app-helper.ts new file mode 100644 index 0000000000..5ade083077 --- /dev/null +++ b/packages/contentstack-export/src/utils/marketplace-app-helper.ts @@ -0,0 +1,63 @@ +import { cliux, configHandler, NodeCrypto, HttpClient, managementSDKClient } from '@contentstack/cli-utilities'; + +import { formatError, log } from '../utils'; +import { ExportConfig } from '../types'; +import { askDeveloperHub } from './interactive'; + +export const getDeveloperHubUrl = async (exportConfig: ExportConfig) => { + const { cma, name } = configHandler.get('region') || {}; + let developerHubBaseUrl = exportConfig?.developerHubUrls[cma]; + + if (!developerHubBaseUrl) { + developerHubBaseUrl = await askDeveloperHub(name); + } + + return developerHubBaseUrl.startsWith('http') ? developerHubBaseUrl : `https://${developerHubBaseUrl}`; +}; + +export async function getOrgUid(config: ExportConfig): Promise { + const tempAPIClient = await managementSDKClient({ host: config.host }); + const tempStackData = await tempAPIClient + .stack({ api_key: config.source_stack }) + .fetch() + .catch((error: any) => { + log(this.config, formatError(error), 'error'); + }); + + return tempStackData?.org_uid; +} + +export async function createNodeCryptoInstance(config: ExportConfig): Promise { + const cryptoArgs = { encryptionKey: '' }; + + if (config.forceStopMarketplaceAppsPrompt) { + cryptoArgs['encryptionKey'] = config.marketplaceAppEncryptionKey; + } else { + cryptoArgs['encryptionKey'] = await cliux.inquire({ + type: 'input', + name: 'name', + default: config.marketplaceAppEncryptionKey, + validate: (url) => { + if (!url) return "Encryption key can't be empty."; + + return true; + }, + message: 'Enter marketplace app configurations encryption key', + }); + } + + return new NodeCrypto(cryptoArgs); +} + +export const getStackSpecificApps = async (params: { + developerHubBaseUrl: string; + httpClient: HttpClient; + config: ExportConfig; + skip: number; +}) => { + const { developerHubBaseUrl, httpClient, config, skip } = params; + return httpClient + .get(`${developerHubBaseUrl}/installations?target_uids=${config.source_stack}&skip=${skip}`) + .then((data: any) => data.data) + .catch((error: any) => log(config, `Failed to export marketplace-apps ${formatError(error)}`, 'error')); +}; diff --git a/packages/contentstack-export/src/utils/setup-branches.ts b/packages/contentstack-export/src/utils/setup-branches.ts new file mode 100644 index 0000000000..d2051f003f --- /dev/null +++ b/packages/contentstack-export/src/utils/setup-branches.ts @@ -0,0 +1,48 @@ +import * as path from 'path'; +import { writeFileSync, makeDirectory } from './file-helper'; +import { isAuthenticated, configHandler } from '@contentstack/cli-utilities'; +import { ExportConfig } from '../types'; + +const setupBranches = async (config: ExportConfig, stackAPIClient: any) => { + if (typeof config !== 'object') { + throw new Error('Invalid config to setup the branch'); + } + + let branches = []; + if (config.branchName) { + // check branch exists + const result = await stackAPIClient + .branch(config.branchName) + .fetch() + .catch((_err: Error) => {}); + if (result && typeof result === 'object') { + branches.push(result); + } else { + throw new Error('No branch found with the given name ' + config.branchName); + } + } else { + try { + const result = await stackAPIClient + .branch() + .query() + .find() + .catch((_err: Error) => {}); + if (result && result.items && Array.isArray(result.items) && result.items.length > 0) { + branches = result.items; + } else { + return; + } + } catch (error) { + // Note skips the error + return; + } + } + + makeDirectory(config.exportDir); + // create branch info file + writeFileSync(path.join(config.exportDir, 'branches.json'), branches); + // add branches list in the + config.branches = branches; +}; + +export default setupBranches; diff --git a/packages/contentstack-export/src/utils/setup-export-dir.ts b/packages/contentstack-export/src/utils/setup-export-dir.ts new file mode 100644 index 0000000000..26cc3737b6 --- /dev/null +++ b/packages/contentstack-export/src/utils/setup-export-dir.ts @@ -0,0 +1,12 @@ +import path from 'path'; +import { ExportConfig } from '../types'; +import { makeDirectory } from './file-helper'; + +export default async function setupExportDir(exportConfig: ExportConfig) { + makeDirectory(exportConfig.exportDir); + if (exportConfig.branches) { + return Promise.all( + exportConfig.branches.map((branch) => makeDirectory(path.join(exportConfig.exportDir, branch.uid))), + ); + } +} diff --git a/packages/contentstack-export/test/helpers/init.js b/packages/contentstack-export/test/helpers/init.js new file mode 100644 index 0000000000..338e715a27 --- /dev/null +++ b/packages/contentstack-export/test/helpers/init.js @@ -0,0 +1,6 @@ +const path = require('path') +process.env.TS_NODE_PROJECT = path.resolve('test/tsconfig.json') +process.env.NODE_ENV = 'development' + +global.oclif = global.oclif || {} +global.oclif.columns = 80 diff --git a/packages/contentstack-export/test/integration/assets.test.js b/packages/contentstack-export/test/integration/assets.test.js index 66678f585b..9359718e81 100644 --- a/packages/contentstack-export/test/integration/assets.test.js +++ b/packages/contentstack-export/test/integration/assets.test.js @@ -1,123 +1,113 @@ -let defaultConfig = require('../../src/config/default'); -const fs = require('fs') -const path = require("path") -const uniqBy = require('lodash/uniqBy') -const { test } = require("@oclif/test") -const { cliux: cliUX, messageHandler } = require("@contentstack/cli-utilities") +const fs = require('fs'); +const path = require('path'); +const uniqBy = require('lodash/uniqBy'); +const { test } = require('@oclif/test'); +const { cliux: cliUX, messageHandler } = require('@contentstack/cli-utilities'); -const { modules } = require('../../src/config/default') -const { getStackDetailsByRegion, getAssetAndFolderCount, cleanUp, checkCounts } = require('./utils/helper') -const { EXPORT_PATH, DEFAULT_TIMEOUT } = require("./config.json") -const { PRINT_LOGS, DELIMITER, KEY_VAL_DELIMITER } = process.env +const { default: config } = require('../../lib/config'); +const modules = config.modules; +const { getStackDetailsByRegion, getAssetAndFolderCount, cleanUp, checkCounts } = require('./utils/helper'); +const { EXPORT_PATH, DEFAULT_TIMEOUT } = require('./config.json'); +const { PRINT_LOGS, DELIMITER, KEY_VAL_DELIMITER } = process.env; module.exports = (region) => { - const stackDetails = getStackDetailsByRegion(region, DELIMITER, KEY_VAL_DELIMITER) + const stackDetails = getStackDetailsByRegion(region, DELIMITER, KEY_VAL_DELIMITER); for (let stack of Object.keys(stackDetails)) { - const exportBasePath = (stackDetails[stack].BRANCH) ? path.join( - __dirname, - "..", - "..", - `${EXPORT_PATH}_${stack}`, - stackDetails[stack].BRANCH, - ) : path.join( - __dirname, - "..", - "..", - `${EXPORT_PATH}_${stack}` - ) - const assetsBasePath = path.join( - exportBasePath, - modules.assets.dirName - ) - const assetsFolderPath = path.join( - assetsBasePath, - 'folders.json' - ) - const assetsJson = path.join( - assetsBasePath, - modules.assets.fileName - ) - const messageFilePath = path.join( - __dirname, - "..", - "..", - "messages/index.json" - ) + const exportBasePath = stackDetails[stack].BRANCH + ? path.join(__dirname, '..', '..', `${EXPORT_PATH}_${stack}`, stackDetails[stack].BRANCH) + : path.join(__dirname, '..', '..', `${EXPORT_PATH}_${stack}`); + const assetsBasePath = path.join(exportBasePath, modules.assets.dirName); + const assetsFolderPath = path.join(assetsBasePath, 'folders.json'); + const assetsJson = path.join(assetsBasePath, modules.assets.fileName); + const messageFilePath = path.join(__dirname, '..', '..', 'messages/index.json'); - messageHandler.init({ messageFilePath }) - const { promptMessageList } = require(messageFilePath) + messageHandler.init({ messageFilePath }); + const { promptMessageList } = require(messageFilePath); - describe("ContentStack-Export assets", () => { - describe("cm:stacks:export assets [auth-token]", () => { + describe('ContentStack-Export assets', () => { + describe('cm:stacks:export assets [auth-token]', () => { test .timeout(DEFAULT_TIMEOUT || 600000) // NOTE setting default timeout as 10 minutes - .stub(cliUX, "prompt", async (name) => { + .stub(cliUX, 'inquire', async (input) => { + const { name } = input; switch (name) { - case promptMessageList.promptSourceStack: - return stackDetails[stack].STACK_API_KEY - case promptMessageList.promptPathStoredData: - return `${EXPORT_PATH}_${stack}` + case 'apiKey': + return stackDetails[stack].STACK_API_KEY; + case 'dir': + return `${EXPORT_PATH}_${stack}`; } }) .stdout({ print: PRINT_LOGS || false }) - .command(["cm:stacks:export", "--module", "assets"]) - .it("Check assets and folders counts", async () => { - let exportedAssetsCount = 0 - let exportedAssetsFolderCount = 0 - const { assetCount, folderCount } = await getAssetAndFolderCount(stackDetails[stack]) + .command(['cm:stacks:export', '--module', 'assets']) + .it('Check assets and folders counts', async () => { + let exportedAssetsCount = 0; + let exportedAssetsFolderCount = 0; + const { assetCount, folderCount } = await getAssetAndFolderCount(stackDetails[stack]); try { if (fs.existsSync(assetsFolderPath)) { - exportedAssetsFolderCount = uniqBy(JSON.parse(fs.readFileSync(assetsFolderPath, 'utf-8')), 'uid').length + exportedAssetsFolderCount = uniqBy( + JSON.parse(fs.readFileSync(assetsFolderPath, 'utf-8')), + 'uid', + ).length; } if (fs.existsSync(assetsJson)) { - exportedAssetsCount = Object.keys(JSON.parse(fs.readFileSync(assetsJson, 'utf-8'))).length + exportedAssetsCount = Object.keys(JSON.parse(fs.readFileSync(assetsJson, 'utf-8'))).length; } } catch (error) { - console.trace(error) + console.trace(error); } - checkCounts(assetCount, exportedAssetsCount) - checkCounts(folderCount, exportedAssetsFolderCount) - }) - }) + checkCounts(assetCount, exportedAssetsCount); + checkCounts(folderCount, exportedAssetsFolderCount); + }); + }); - describe("cm:stacks:export assets [management-token]", () => { + describe('cm:stacks:export assets [management-token]', () => { test .timeout(DEFAULT_TIMEOUT || 600000) // NOTE setting default timeout as 10 minutes .stdout({ print: PRINT_LOGS || false }) - .command(["cm:stacks:export", "--stack-api-key", stackDetails[stack].STACK_API_KEY, "--data-dir", `${EXPORT_PATH}_${stack}`, "--alias", stackDetails[stack].ALIAS_NAME, "--module", "assets"]) - .it("Check assets and folder counts", async () => { - let exportedAssetsCount = 0 - let exportedAssetsFolderCount = 0 + .command([ + 'cm:stacks:export', + '--stack-api-key', + stackDetails[stack].STACK_API_KEY, + '--data-dir', + `${EXPORT_PATH}_${stack}`, + '--alias', + stackDetails[stack].ALIAS_NAME, + '--module', + 'assets', + ]) + .it('Check assets and folder counts', async () => { + let exportedAssetsCount = 0; + let exportedAssetsFolderCount = 0; const { assetCount, folderCount } = await getAssetAndFolderCount(stackDetails[stack]); try { if (fs.existsSync(assetsFolderPath)) { - exportedAssetsFolderCount = uniqBy(JSON.parse(fs.readFileSync(assetsFolderPath, 'utf-8')), 'uid').length + exportedAssetsFolderCount = uniqBy( + JSON.parse(fs.readFileSync(assetsFolderPath, 'utf-8')), + 'uid', + ).length; } if (fs.existsSync(assetsJson)) { - exportedAssetsCount = Object.keys(JSON.parse(fs.readFileSync(assetsJson, 'utf-8'))).length + exportedAssetsCount = Object.keys(JSON.parse(fs.readFileSync(assetsJson, 'utf-8'))).length; } } catch (error) { - console.trace(error) + console.trace(error); } - checkCounts(assetCount, exportedAssetsCount) - checkCounts(folderCount, exportedAssetsFolderCount) - }) - }) - }) - + checkCounts(assetCount, exportedAssetsCount); + checkCounts(folderCount, exportedAssetsFolderCount); + }); + }); + }); + afterEach(async () => { - await cleanUp(path.join( - __dirname, - "..", - "..", - `${EXPORT_PATH}_${stack}`)); - defaultConfig.management_token = undefined - defaultConfig.branch = undefined - defaultConfig.branches = [] - }) + await cleanUp(path.join(__dirname, '..', '..', `${EXPORT_PATH}_${stack}`)); + config.management_token = undefined; + config.branch = undefined; + config.branches = []; + }); } -} +}; diff --git a/packages/contentstack-export/test/integration/content-types.test.js b/packages/contentstack-export/test/integration/content-types.test.js index f09a38cd58..20524d8394 100644 --- a/packages/contentstack-export/test/integration/content-types.test.js +++ b/packages/contentstack-export/test/integration/content-types.test.js @@ -1,115 +1,100 @@ -let defaultConfig = require('../../src/config/default'); -const fs = require('fs') -const {promises: fsPromises} = fs -const path = require("path") -const { test } = require("@oclif/test") -const { cliux: cliUX, messageHandler } = require("@contentstack/cli-utilities") +const fs = require('fs'); +const { promises: fsPromises } = fs; +const path = require('path'); +const { test } = require('@oclif/test'); +const { cliux: cliUX, messageHandler } = require('@contentstack/cli-utilities'); -const { modules } = require('../../src/config/default') -const { getStackDetailsByRegion, getContentTypesCount, cleanUp, checkCounts } = require('./utils/helper') -const { EXPORT_PATH, DEFAULT_TIMEOUT } = require("./config.json") -const { PRINT_LOGS, DELIMITER, KEY_VAL_DELIMITER } = process.env +const { default: config } = require('../../lib/config'); +const modules = config.modules; +const { getStackDetailsByRegion, getContentTypesCount, cleanUp, checkCounts } = require('./utils/helper'); +const { EXPORT_PATH, DEFAULT_TIMEOUT } = require('./config.json'); +const { PRINT_LOGS, DELIMITER, KEY_VAL_DELIMITER } = process.env; module.exports = (region) => { - const stackDetails = getStackDetailsByRegion(region, DELIMITER, KEY_VAL_DELIMITER) + const stackDetails = getStackDetailsByRegion(region, DELIMITER, KEY_VAL_DELIMITER); for (let stack of Object.keys(stackDetails)) { + const exportBasePath = stackDetails[stack].BRANCH + ? path.join(__dirname, '..', '..', `${EXPORT_PATH}_${stack}`, stackDetails[stack].BRANCH) + : path.join(__dirname, '..', '..', `${EXPORT_PATH}_${stack}`); + const contentTypesBasePath = path.join(exportBasePath, modules.content_types.dirName); + const contentTypesJson = path.join(contentTypesBasePath, modules.content_types.fileName); + const messageFilePath = path.join(__dirname, '..', '..', 'messages/index.json'); - const exportBasePath = (stackDetails[stack].BRANCH) ? path.join( - __dirname, - "..", - "..", - `${EXPORT_PATH}_${stack}`, - stackDetails[stack].BRANCH, - ) : path.join( - __dirname, - "..", - "..", - `${EXPORT_PATH}_${stack}` - ) - const contentTypesBasePath = path.join( - exportBasePath, - modules.content_types.dirName - ) - const contentTypesJson = path.join( - contentTypesBasePath, - modules.content_types.fileName - ) - const messageFilePath = path.join( - __dirname, - "..", - "..", - "messages/index.json" - ) + messageHandler.init({ messageFilePath }); + const { promptMessageList } = require(messageFilePath); - messageHandler.init({ messageFilePath }) - const { promptMessageList } = require(messageFilePath) - - describe("ContentStack-Export content-types", () => { - describe("cm:stacks:export content-types [auth-token]", () => { + describe('ContentStack-Export content-types', () => { + describe('cm:stacks:export content-types [auth-token]', () => { test .timeout(DEFAULT_TIMEOUT || 600000) // NOTE setting default timeout as 10 minutes - .stub(cliUX, "prompt", async (name) => { + .stub(cliUX, 'inquire', async (input) => { + const { name } = input; switch (name) { - case promptMessageList.promptSourceStack: - return stackDetails[stack].STACK_API_KEY - case promptMessageList.promptPathStoredData: - return `${EXPORT_PATH}_${stack}` + case 'apiKey': + return stackDetails[stack].STACK_API_KEY; + case 'dir': + return `${EXPORT_PATH}_${stack}`; } }) .stdout({ print: PRINT_LOGS || false }) - .command(["cm:stacks:export", "--module", "content-types"]) - .it("Check content-types count", async (_, done) => { - let exportedContentTypesCount = 0 - const contentTypesCount = await getContentTypesCount(stackDetails[stack]) + .command(['cm:stacks:export', '--module', 'content-types']) + .it('Check content-types count', async (_, done) => { + let exportedContentTypesCount = 0; + const contentTypesCount = await getContentTypesCount(stackDetails[stack]); try { if (fs.existsSync(contentTypesBasePath)) { - let contentTypes = await fsPromises.readdir(contentTypesBasePath) - exportedContentTypesCount = contentTypes.filter(ct => !ct.includes('schema.json')).length + let contentTypes = await fsPromises.readdir(contentTypesBasePath); + exportedContentTypesCount = contentTypes.filter((ct) => !ct.includes('schema.json')).length; } } catch (error) { - console.trace(error) + console.trace(error); } - checkCounts(contentTypesCount, exportedContentTypesCount) + checkCounts(contentTypesCount, exportedContentTypesCount); done(); - }) - }) + }); + }); - describe("cm:stacks:export content-types [management-token]", () => { + describe('cm:stacks:export content-types [management-token]', () => { test .timeout(DEFAULT_TIMEOUT || 600000) // NOTE setting default timeout as 10 minutes .stdout({ print: PRINT_LOGS || false }) - .command(["cm:stacks:export", "--stack-api-key", stackDetails[stack].STACK_API_KEY, "--data-dir", `${EXPORT_PATH}_${stack}`, "--alias", stackDetails[stack].ALIAS_NAME, "--module", "content-types"]) - .it("Check content-types counts", async (_, done) => { - let exportedContentTypesCount = 0 + .command([ + 'cm:stacks:export', + '--stack-api-key', + stackDetails[stack].STACK_API_KEY, + '--data-dir', + `${EXPORT_PATH}_${stack}`, + '--alias', + stackDetails[stack].ALIAS_NAME, + '--module', + 'content-types', + ]) + .it('Check content-types counts', async (_, done) => { + let exportedContentTypesCount = 0; const contentTypesCount = await getContentTypesCount(stackDetails[stack]); try { if (fs.existsSync(contentTypesBasePath)) { - let contentTypes = await fsPromises.readdir(contentTypesBasePath) - exportedContentTypesCount = contentTypes.filter(ct => !ct.includes('schema.json')).length + let contentTypes = await fsPromises.readdir(contentTypesBasePath); + exportedContentTypesCount = contentTypes.filter((ct) => !ct.includes('schema.json')).length; } } catch (error) { - console.trace(error) + console.trace(error); } - checkCounts(contentTypesCount, exportedContentTypesCount) + checkCounts(contentTypesCount, exportedContentTypesCount); done(); - }) - }) - }) + }); + }); + }); afterEach(async () => { - await cleanUp(path.join( - __dirname, - "..", - "..", - `${EXPORT_PATH}_${stack}`)); - defaultConfig.management_token = undefined - defaultConfig.branch = undefined - defaultConfig.branches = [] - }) + await cleanUp(path.join(__dirname, '..', '..', `${EXPORT_PATH}_${stack}`)); + config.management_token = undefined; + config.branch = undefined; + config.branches = []; + }); } -} - +}; diff --git a/packages/contentstack-export/test/integration/custom-roles.test.js b/packages/contentstack-export/test/integration/custom-roles.test.js index 1f9ed056f3..eab4871ebc 100644 --- a/packages/contentstack-export/test/integration/custom-roles.test.js +++ b/packages/contentstack-export/test/integration/custom-roles.test.js @@ -1,109 +1,90 @@ -let defaultConfig = require('../../src/config/default'); -const fs = require('fs') -const path = require("path") -const { test } = require("@oclif/test") -const { cliux: cliUX, messageHandler } = require("@contentstack/cli-utilities") +const fs = require('fs'); +const path = require('path'); +const { test } = require('@oclif/test'); +const { cliux: cliUX, messageHandler } = require('@contentstack/cli-utilities'); -const { modules } = require('../../src/config/default') -const { getStackDetailsByRegion, getCustomRolesCount, cleanUp, checkCounts } = require('./utils/helper') -const { EXPORT_PATH, DEFAULT_TIMEOUT } = require("./config.json") -const { PRINT_LOGS, DELIMITER, KEY_VAL_DELIMITER } = process.env +const { default: config } = require('../../lib/config'); +const modules = config.modules; +const { getStackDetailsByRegion, getCustomRolesCount, cleanUp, checkCounts } = require('./utils/helper'); +const { EXPORT_PATH, DEFAULT_TIMEOUT } = require('./config.json'); +const { PRINT_LOGS, DELIMITER, KEY_VAL_DELIMITER } = process.env; module.exports = (region) => { - const stackDetails = getStackDetailsByRegion(region, DELIMITER, KEY_VAL_DELIMITER) + const stackDetails = getStackDetailsByRegion(region, DELIMITER, KEY_VAL_DELIMITER); for (let stack of Object.keys(stackDetails)) { + const exportBasePath = stackDetails[stack].BRANCH + ? path.join(__dirname, '..', '..', `${EXPORT_PATH}_${stack}`, stackDetails[stack].BRANCH) + : path.join(__dirname, '..', '..', `${EXPORT_PATH}_${stack}`); + const customRolesBasePath = path.join(exportBasePath, modules.customRoles.dirName); + const customRolesJson = path.join(customRolesBasePath, modules.customRoles.fileName); - const exportBasePath = (stackDetails[stack].BRANCH) ? path.join( - __dirname, - "..", - "..", - `${EXPORT_PATH}_${stack}`, - stackDetails[stack].BRANCH, - ) : path.join( - __dirname, - "..", - "..", - `${EXPORT_PATH}_${stack}` - ) - const customRolesBasePath = path.join( - exportBasePath, - modules.customRoles.dirName - ) - const customRolesJson = path.join( - customRolesBasePath, - modules.customRoles.fileName - ) - const messageFilePath = path.join( - __dirname, - "..", - "..", - "messages/index.json" - ) - - messageHandler.init({ messageFilePath }) - const { promptMessageList } = require(messageFilePath) - - describe("ContentStack-Export custom-roles", () => { - describe("cm:stacks:export custom-roles [auth-token]", () => { + describe('ContentStack-Export custom-roles', () => { + describe('cm:stacks:export custom-roles [auth-token]', () => { test .timeout(DEFAULT_TIMEOUT || 600000) // NOTE setting default timeout as 10 minutes - .stub(cliUX, "prompt", async (name) => { + .stub(cliUX, 'inquire', async (input) => { + const { name } = input; switch (name) { - case promptMessageList.promptSourceStack: - return stackDetails[stack].STACK_API_KEY - case promptMessageList.promptPathStoredData: - return `${EXPORT_PATH}_${stack}` + case 'apiKey': + return stackDetails[stack].STACK_API_KEY; + case 'dir': + return `${EXPORT_PATH}_${stack}`; } }) .stdout({ print: PRINT_LOGS || false }) - .command(["cm:stacks:export", "--module", "custom-roles"]) - .it("Check custom-roles count", async () => { - let exportedCustomRolesCount = 0 - const customRolesCount = await getCustomRolesCount(stackDetails[stack]) + .command(['cm:stacks:export', '--module', 'custom-roles']) + .it('Check custom-roles count', async () => { + let exportedCustomRolesCount = 0; + const customRolesCount = await getCustomRolesCount(stackDetails[stack]); try { if (fs.existsSync(customRolesJson)) { - exportedCustomRolesCount = Object.keys(JSON.parse(fs.readFileSync(customRolesJson, 'utf-8'))).length + exportedCustomRolesCount = Object.keys(JSON.parse(fs.readFileSync(customRolesJson, 'utf-8'))).length; } } catch (error) { - console.trace(error) + console.trace(error); } - checkCounts(customRolesCount, exportedCustomRolesCount) - }) - }) + checkCounts(customRolesCount, exportedCustomRolesCount); + }); + }); - describe("cm:stacks:export custom-roles [management-token]", () => { + describe('cm:stacks:export custom-roles [management-token]', () => { test .timeout(DEFAULT_TIMEOUT || 600000) // NOTE setting default timeout as 10 minutes .stdout({ print: PRINT_LOGS || false }) - .command(["cm:stacks:export", "--stack-api-key", stackDetails[stack].STACK_API_KEY, "--data-dir", `${EXPORT_PATH}_${stack}`, "--alias", stackDetails[stack].ALIAS_NAME, "--module", "custom-roles"]) - .it("Check custom-roles counts", async () => { - let exportedCustomRolesCount = 0 + .command([ + 'cm:stacks:export', + '--stack-api-key', + stackDetails[stack].STACK_API_KEY, + '--data-dir', + `${EXPORT_PATH}_${stack}`, + '--alias', + stackDetails[stack].ALIAS_NAME, + '--module', + 'custom-roles', + ]) + .it('Check custom-roles counts', async () => { + let exportedCustomRolesCount = 0; const customRolesCount = await getCustomRolesCount(stackDetails[stack]); try { if (fs.existsSync(customRolesJson)) { - exportedCustomRolesCount = Object.keys(JSON.parse(fs.readFileSync(customRolesJson, 'utf-8'))).length + exportedCustomRolesCount = Object.keys(JSON.parse(fs.readFileSync(customRolesJson, 'utf-8'))).length; } } catch (error) { - console.trace(error) + console.trace(error); } - checkCounts(customRolesCount, exportedCustomRolesCount) - }) - }) - }) + checkCounts(customRolesCount, exportedCustomRolesCount); + }); + }); + }); afterEach(async () => { - await cleanUp(path.join( - __dirname, - "..", - "..", - `${EXPORT_PATH}_${stack}`)); - defaultConfig.management_token = undefined - defaultConfig.branch = undefined - defaultConfig.branches = [] - }) + await cleanUp(path.join(__dirname, '..', '..', `${EXPORT_PATH}_${stack}`)); + config.management_token = undefined; + config.branch = undefined; + config.branches = []; + }); } -} - +}; diff --git a/packages/contentstack-export/test/integration/entries.test.js b/packages/contentstack-export/test/integration/entries.test.js index 2dfdd4c61e..ff1143505f 100644 --- a/packages/contentstack-export/test/integration/entries.test.js +++ b/packages/contentstack-export/test/integration/entries.test.js @@ -1,127 +1,112 @@ let defaultConfig = require('../../src/config/default'); -const fs = require('fs') -const { promises: fsPromises } = fs -const path = require("path") -const { test } = require("@oclif/test") -const { cliux: cliUX, messageHandler } = require("@contentstack/cli-utilities") +const fs = require('fs'); +const { promises: fsPromises } = fs; +const path = require('path'); +const { test } = require('@oclif/test'); +const { cliux: cliUX, messageHandler } = require('@contentstack/cli-utilities'); -const { modules } = require('../../src/config/default') -const { getStackDetailsByRegion, getEntriesCount, cleanUp, checkCounts } = require('./utils/helper') -const { EXPORT_PATH, DEFAULT_TIMEOUT } = require("./config.json") -const { PRINT_LOGS, DELIMITER, KEY_VAL_DELIMITER } = process.env +const { default: config } = require('../../src/config'); +const modules = config.modules; +const { getStackDetailsByRegion, getEntriesCount, cleanUp, checkCounts } = require('./utils/helper'); +const { EXPORT_PATH, DEFAULT_TIMEOUT } = require('./config.json'); +const { PRINT_LOGS, DELIMITER, KEY_VAL_DELIMITER } = process.env; module.exports = (region) => { - const stackDetails = getStackDetailsByRegion(region, DELIMITER, KEY_VAL_DELIMITER) + const stackDetails = getStackDetailsByRegion(region, DELIMITER, KEY_VAL_DELIMITER); for (let stack of Object.keys(stackDetails)) { + const exportBasePath = stackDetails[stack].BRANCH + ? path.join(__dirname, '..', '..', `${EXPORT_PATH}_${stack}`, stackDetails[stack].BRANCH) + : path.join(__dirname, '..', '..', `${EXPORT_PATH}_${stack}`); + const entriesBasePath = path.join(exportBasePath, modules.entries.dirName); + const entriesJson = path.join(entriesBasePath, modules.entries.fileName); + const messageFilePath = path.join(__dirname, '..', '..', 'messages/index.json'); - const exportBasePath = (stackDetails[stack].BRANCH) ? path.join( - __dirname, - "..", - "..", - `${EXPORT_PATH}_${stack}`, - stackDetails[stack].BRANCH, - ) : path.join( - __dirname, - "..", - "..", - `${EXPORT_PATH}_${stack}` - ) - const entriesBasePath = path.join( - exportBasePath, - modules.entries.dirName - ) - const entriesJson = path.join( - entriesBasePath, - modules.entries.fileName - ) - const messageFilePath = path.join( - __dirname, - "..", - "..", - "messages/index.json" - ) + messageHandler.init({ messageFilePath }); + const { promptMessageList } = require(messageFilePath); - messageHandler.init({ messageFilePath }) - const { promptMessageList } = require(messageFilePath) - - describe("ContentStack-Export entries", () => { - describe("cm:stacks:export entries [auth-token]", () => { + describe('ContentStack-Export entries', () => { + describe('cm:stacks:export entries [auth-token]', () => { test .timeout(DEFAULT_TIMEOUT || 600000) // NOTE setting default timeout as 10 minutes - .stub(cliUX, "prompt", async (name) => { + .stub(cliUX, 'prompt', async (name) => { switch (name) { case promptMessageList.promptSourceStack: - return stackDetails[stack].STACK_API_KEY + return stackDetails[stack].STACK_API_KEY; case promptMessageList.promptPathStoredData: - return `${EXPORT_PATH}_${stack}` + return `${EXPORT_PATH}_${stack}`; } }) .stdout({ print: PRINT_LOGS || false }) - .command(["cm:stacks:export", "--module", "entries"]) - .it("Check entries count", async () => { - let exportedEntriesCount = 0 - let entriesCount - + .command(['cm:stacks:export', '--module', 'entries']) + .it('Check entries count', async () => { + let exportedEntriesCount = 0; + let entriesCount; + try { - entriesCount = await getEntriesCount(stackDetails[stack]) + entriesCount = await getEntriesCount(stackDetails[stack]); if (fs.existsSync(entriesBasePath)) { - let contentTypes = await fsPromises.readdir(entriesBasePath) + let contentTypes = await fsPromises.readdir(entriesBasePath); for (let contentType of contentTypes) { - let ctPath = path.join(entriesBasePath, contentType) - let locales = await fsPromises.readdir(ctPath) + let ctPath = path.join(entriesBasePath, contentType); + let locales = await fsPromises.readdir(ctPath); for (let locale of locales) { - let entries = await fsPromises.readFile(path.join(ctPath, locale), 'utf-8') - exportedEntriesCount += Object.keys(JSON.parse(entries)).length + let entries = await fsPromises.readFile(path.join(ctPath, locale), 'utf-8'); + exportedEntriesCount += Object.keys(JSON.parse(entries)).length; } } } } catch (error) { - console.trace(error) + console.trace(error); } - checkCounts(entriesCount, exportedEntriesCount) - }) - }) + checkCounts(entriesCount, exportedEntriesCount); + }); + }); - describe("cm:stacks:export entries [management-token]", () => { + describe('cm:stacks:export entries [management-token]', () => { test .timeout(DEFAULT_TIMEOUT || 600000) // NOTE setting default timeout as 10 minutes .stdout({ print: PRINT_LOGS || false }) - .command(["cm:stacks:export", "--stack-api-key", stackDetails[stack].STACK_API_KEY, "--data-dir", `${EXPORT_PATH}_${stack}`, "--alias", stackDetails[stack].ALIAS_NAME, "--module", "entries"]) - .it("Check entries counts", async () => { - let exportedEntriesCount = 0 + .command([ + 'cm:stacks:export', + '--stack-api-key', + stackDetails[stack].STACK_API_KEY, + '--data-dir', + `${EXPORT_PATH}_${stack}`, + '--alias', + stackDetails[stack].ALIAS_NAME, + '--module', + 'entries', + ]) + .it('Check entries counts', async () => { + let exportedEntriesCount = 0; const entriesCount = await getEntriesCount(stackDetails[stack]); try { if (fs.existsSync(entriesBasePath)) { - let contentTypes = await fsPromises.readdir(entriesBasePath) + let contentTypes = await fsPromises.readdir(entriesBasePath); for (let contentType of contentTypes) { - let ctPath = path.join(entriesBasePath, contentType) - let locales = await fsPromises.readdir(ctPath) + let ctPath = path.join(entriesBasePath, contentType); + let locales = await fsPromises.readdir(ctPath); for (let locale of locales) { - let entries = await fsPromises.readFile(path.join(ctPath, locale), 'utf-8') - exportedEntriesCount += Object.keys(JSON.parse(entries)).length + let entries = await fsPromises.readFile(path.join(ctPath, locale), 'utf-8'); + exportedEntriesCount += Object.keys(JSON.parse(entries)).length; } } } } catch (error) { - console.trace(error) + console.trace(error); } - checkCounts(entriesCount, exportedEntriesCount) - }) - }) - }) + checkCounts(entriesCount, exportedEntriesCount); + }); + }); + }); afterEach(async () => { - await cleanUp(path.join( - __dirname, - "..", - "..", - `${EXPORT_PATH}_${stack}`)); - defaultConfig.management_token = undefined - defaultConfig.branch = undefined - defaultConfig.branches = [] - }) + await cleanUp(path.join(__dirname, '..', '..', `${EXPORT_PATH}_${stack}`)); + defaultConfig.management_token = undefined; + defaultConfig.branch = undefined; + defaultConfig.branches = []; + }); } -} - +}; diff --git a/packages/contentstack-export/test/integration/environments.test.js b/packages/contentstack-export/test/integration/environments.test.js index 2842cd4d32..47a5cbde67 100644 --- a/packages/contentstack-export/test/integration/environments.test.js +++ b/packages/contentstack-export/test/integration/environments.test.js @@ -1,109 +1,92 @@ -let defaultConfig = require('../../src/config/default'); -const fs = require('fs') -const path = require("path") -const { test } = require("@oclif/test") -const { cliux: cliUX, messageHandler } = require("@contentstack/cli-utilities") +const fs = require('fs'); +const path = require('path'); +const { test } = require('@oclif/test'); +const { cliux: cliUX, messageHandler } = require('@contentstack/cli-utilities'); -const { modules } = require('../../src/config/default') -const { getStackDetailsByRegion, getEnvironmentsCount, cleanUp, checkCounts } = require('./utils/helper') -const { EXPORT_PATH, DEFAULT_TIMEOUT } = require("./config.json") -const { PRINT_LOGS, DELIMITER, KEY_VAL_DELIMITER } = process.env +const { default: config } = require('../../lib/config'); +const modules = config.modules; +const { getStackDetailsByRegion, getEnvironmentsCount, cleanUp, checkCounts } = require('./utils/helper'); +const { EXPORT_PATH, DEFAULT_TIMEOUT } = require('./config.json'); +const { PRINT_LOGS, DELIMITER, KEY_VAL_DELIMITER } = process.env; module.exports = (region) => { - const stackDetails = getStackDetailsByRegion(region, DELIMITER, KEY_VAL_DELIMITER) + const stackDetails = getStackDetailsByRegion(region, DELIMITER, KEY_VAL_DELIMITER); for (let stack of Object.keys(stackDetails)) { - const exportBasePath = (stackDetails[stack].BRANCH) ? path.join( - __dirname, - "..", - "..", - `${EXPORT_PATH}_${stack}`, - stackDetails[stack].BRANCH - ) : path.join( - __dirname, - "..", - "..", - `${EXPORT_PATH}_${stack}` - ) - const environmentsBasePath = path.join( - exportBasePath, - modules.environments.dirName - ) - const environmentsJson = path.join( - environmentsBasePath, - modules.environments.fileName - ) - const messageFilePath = path.join( - __dirname, - "..", - "..", - "messages/index.json" - ) - - messageHandler.init({ messageFilePath }) - const { promptMessageList } = require(messageFilePath) + const exportBasePath = stackDetails[stack].BRANCH + ? path.join(__dirname, '..', '..', `${EXPORT_PATH}_${stack}`, stackDetails[stack].BRANCH) + : path.join(__dirname, '..', '..', `${EXPORT_PATH}_${stack}`); + const environmentsBasePath = path.join(exportBasePath, modules.environments.dirName); + const environmentsJson = path.join(environmentsBasePath, modules.environments.fileName); describe('ContentStack-Export environments', () => { describe('cm:stacks:export environments [auth-token]', () => { test .timeout(DEFAULT_TIMEOUT || 600000) // NOTE setting default timeout as 10 minutes - .stub(cliUX, "prompt", async (name) => { + .stub(cliUX, 'inquire', async (input) => { + const { name } = input; switch (name) { - case promptMessageList.promptSourceStack: - return stackDetails[stack].STACK_API_KEY - case promptMessageList.promptPathStoredData: - return `${EXPORT_PATH}_${stack}` + case 'apiKey': + return stackDetails[stack].STACK_API_KEY; + case 'dir': + return `${EXPORT_PATH}_${stack}`; } }) .stdout({ print: PRINT_LOGS || false }) - .command(["cm:stacks:export", "--module", "environments"]) - .it("Check environments count", async () => { - let exportedEnvironmentsCount = 0 + .command(['cm:stacks:export', '--module', 'environments']) + .it('Check environments count', async () => { + let exportedEnvironmentsCount = 0; // change to environment - const environmentsCount = await getEnvironmentsCount(stackDetails[stack]) + const environmentsCount = await getEnvironmentsCount(stackDetails[stack]); try { if (fs.existsSync(environmentsJson)) { - exportedEnvironmentsCount = Object.keys(JSON.parse(fs.readFileSync(environmentsJson, 'utf-8'))).length + exportedEnvironmentsCount = Object.keys(JSON.parse(fs.readFileSync(environmentsJson, 'utf-8'))).length; } } catch (error) { - console.trace(error) + console.trace(error); } - checkCounts(environmentsCount, exportedEnvironmentsCount) - }) - }) + checkCounts(environmentsCount, exportedEnvironmentsCount); + }); + }); describe('cm:stacks:export environments [management-token]', () => { test .timeout(DEFAULT_TIMEOUT || 600000) // NOTE setting default timeout as 10 minutes .stdout({ print: PRINT_LOGS || false }) - .command(["cm:stacks:export", "--stack-api-key", stackDetails[stack].STACK_API_KEY, "--data-dir", `${EXPORT_PATH}_${stack}`, "--alias", stackDetails[stack].ALIAS_NAME, "--module", "environments"]) - .it("Check environments count", async () => { - let exportedEnvironmentsCount = 0 + .command([ + 'cm:stacks:export', + '--stack-api-key', + stackDetails[stack].STACK_API_KEY, + '--data-dir', + `${EXPORT_PATH}_${stack}`, + '--alias', + stackDetails[stack].ALIAS_NAME, + '--module', + 'environments', + ]) + .it('Check environments count', async () => { + let exportedEnvironmentsCount = 0; const environmentsCount = await getEnvironmentsCount(stackDetails[stack]); try { if (fs.existsSync(environmentsJson)) { - exportedEnvironmentsCount = Object.keys(JSON.parse(fs.readFileSync(environmentsJson, 'utf-8'))).length + exportedEnvironmentsCount = Object.keys(JSON.parse(fs.readFileSync(environmentsJson, 'utf-8'))).length; } } catch (error) { - console.trace(error) + console.trace(error); } - checkCounts(environmentsCount, exportedEnvironmentsCount) - }) - }) + checkCounts(environmentsCount, exportedEnvironmentsCount); + }); + }); afterEach(async () => { - await cleanUp(path.join( - __dirname, - "..", - "..", - `${EXPORT_PATH}_${stack}`)); - defaultConfig.management_token = undefined - defaultConfig.branch = undefined - defaultConfig.branches = [] - }) - }) + await cleanUp(path.join(__dirname, '..', '..', `${EXPORT_PATH}_${stack}`)); + config.management_token = undefined; + config.branch = undefined; + config.branches = []; + }); + }); } -} +}; diff --git a/packages/contentstack-export/test/integration/extensions.test.js b/packages/contentstack-export/test/integration/extensions.test.js index 6cb2034d9d..de2527c625 100644 --- a/packages/contentstack-export/test/integration/extensions.test.js +++ b/packages/contentstack-export/test/integration/extensions.test.js @@ -1,109 +1,90 @@ -let defaultConfig = require('../../src/config/default'); -const fs = require('fs') -const path = require("path") -const { test } = require("@oclif/test") -const { cliux: cliUX, messageHandler } = require("@contentstack/cli-utilities") +const fs = require('fs'); +const path = require('path'); +const { test } = require('@oclif/test'); +const { cliux: cliUX, messageHandler } = require('@contentstack/cli-utilities'); -const { modules } = require('../../src/config/default') -const { getStackDetailsByRegion, getExtensionsCount, cleanUp, checkCounts } = require('./utils/helper') -const { EXPORT_PATH, DEFAULT_TIMEOUT } = require("./config.json") -const { PRINT_LOGS, DELIMITER, KEY_VAL_DELIMITER } = process.env +const { default: config } = require('../../lib/config'); +const modules = config.modules; +const { getStackDetailsByRegion, getExtensionsCount, cleanUp, checkCounts } = require('./utils/helper'); +const { EXPORT_PATH, DEFAULT_TIMEOUT } = require('./config.json'); +const { PRINT_LOGS, DELIMITER, KEY_VAL_DELIMITER } = process.env; module.exports = (region) => { - const stackDetails = getStackDetailsByRegion(region, DELIMITER, KEY_VAL_DELIMITER) + const stackDetails = getStackDetailsByRegion(region, DELIMITER, KEY_VAL_DELIMITER); for (let stack of Object.keys(stackDetails)) { + const exportBasePath = stackDetails[stack].BRANCH + ? path.join(__dirname, '..', '..', `${EXPORT_PATH}_${stack}`, stackDetails[stack].BRANCH) + : path.join(__dirname, '..', '..', `${EXPORT_PATH}_${stack}`); + const extensionsBasePath = path.join(exportBasePath, modules.extensions.dirName); + const extensionsJson = path.join(extensionsBasePath, modules.extensions.fileName); - const exportBasePath = (stackDetails[stack].BRANCH) ? path.join( - __dirname, - "..", - "..", - `${EXPORT_PATH}_${stack}`, - stackDetails[stack].BRANCH, - ) : path.join( - __dirname, - "..", - "..", - `${EXPORT_PATH}_${stack}` - ) - const extensionsBasePath = path.join( - exportBasePath, - modules.extensions.dirName - ) - const extensionsJson = path.join( - extensionsBasePath, - modules.extensions.fileName - ) - const messageFilePath = path.join( - __dirname, - "..", - "..", - "messages/index.json" - ) - - messageHandler.init({ messageFilePath }) - const { promptMessageList } = require(messageFilePath) - - describe("ContentStack-Export extensions", () => { - describe("cm:stacks:export extensions [auth-token]", () => { + describe('ContentStack-Export extensions', () => { + describe('cm:stacks:export extensions [auth-token]', () => { test .timeout(DEFAULT_TIMEOUT || 600000) // NOTE setting default timeout as 10 minutes - .stub(cliUX, "prompt", async (name) => { + .stub(cliUX, 'inquire', async (input) => { + const { name } = input; switch (name) { - case promptMessageList.promptSourceStack: - return stackDetails[stack].STACK_API_KEY - case promptMessageList.promptPathStoredData: - return `${EXPORT_PATH}_${stack}` + case 'apiKey': + return stackDetails[stack].STACK_API_KEY; + case 'dir': + return `${EXPORT_PATH}_${stack}`; } }) .stdout({ print: PRINT_LOGS || false }) - .command(["cm:stacks:export", "--module", "extensions"]) - .it("Check extensions count", async () => { - let exportedExtensionsCount = 0 - const extensionsCount = await getExtensionsCount(stackDetails[stack]) + .command(['cm:stacks:export', '--module', 'extensions']) + .it('Check extensions count', async () => { + let exportedExtensionsCount = 0; + const extensionsCount = await getExtensionsCount(stackDetails[stack]); try { if (fs.existsSync(extensionsJson)) { - exportedExtensionsCount = Object.keys(JSON.parse(fs.readFileSync(extensionsJson, 'utf-8'))).length + exportedExtensionsCount = Object.keys(JSON.parse(fs.readFileSync(extensionsJson, 'utf-8'))).length; } } catch (error) { - console.trace(error) + console.trace(error); } - checkCounts(extensionsCount, exportedExtensionsCount) - }) - }) + checkCounts(extensionsCount, exportedExtensionsCount); + }); + }); - describe("cm:stacks:export extensions [management-token]", () => { + describe('cm:stacks:export extensions [management-token]', () => { test .timeout(DEFAULT_TIMEOUT || 600000) // NOTE setting default timeout as 10 minutes .stdout({ print: PRINT_LOGS || false }) - .command(["cm:stacks:export", "--stack-api-key", stackDetails[stack].STACK_API_KEY, "--data-dir", `${EXPORT_PATH}_${stack}`, "--alias", stackDetails[stack].ALIAS_NAME, "--module", "extensions"]) - .it("Check extensions counts", async () => { - let exportedExtensionsCount = 0 + .command([ + 'cm:stacks:export', + '--stack-api-key', + stackDetails[stack].STACK_API_KEY, + '--data-dir', + `${EXPORT_PATH}_${stack}`, + '--alias', + stackDetails[stack].ALIAS_NAME, + '--module', + 'extensions', + ]) + .it('Check extensions counts', async () => { + let exportedExtensionsCount = 0; const extensionsCount = await getExtensionsCount(stackDetails[stack]); try { if (fs.existsSync(extensionsJson)) { - exportedExtensionsCount = Object.keys(JSON.parse(fs.readFileSync(extensionsJson, 'utf-8'))).length + exportedExtensionsCount = Object.keys(JSON.parse(fs.readFileSync(extensionsJson, 'utf-8'))).length; } } catch (error) { - console.trace(error) + console.trace(error); } - checkCounts(extensionsCount, exportedExtensionsCount) - }) - }) - }) + checkCounts(extensionsCount, exportedExtensionsCount); + }); + }); + }); afterEach(async () => { - await cleanUp(path.join( - __dirname, - "..", - "..", - `${EXPORT_PATH}_${stack}`)); - defaultConfig.management_token = undefined - defaultConfig.branch = undefined - defaultConfig.branches = [] - }) + await cleanUp(path.join(__dirname, '..', '..', `${EXPORT_PATH}_${stack}`)); + config.management_token = undefined; + config.branch = undefined; + config.branches = []; + }); } -} - +}; diff --git a/packages/contentstack-export/test/integration/global-fields.test.js b/packages/contentstack-export/test/integration/global-fields.test.js index 6cf4b8c7f5..a6a0fa3323 100644 --- a/packages/contentstack-export/test/integration/global-fields.test.js +++ b/packages/contentstack-export/test/integration/global-fields.test.js @@ -1,108 +1,89 @@ -let defaultConfig = require('../../src/config/default'); -const fs = require('fs') -const path = require("path") -const { test } = require("@oclif/test") -const { cliux: cliUX, messageHandler } = require("@contentstack/cli-utilities") +const fs = require('fs'); +const path = require('path'); +const { test } = require('@oclif/test'); +const { cliux: cliUX, messageHandler } = require('@contentstack/cli-utilities'); -const { modules } = require('../../src/config/default') -const { getStackDetailsByRegion, getGlobalFieldsCount, cleanUp, checkCounts } = require('./utils/helper') -const { EXPORT_PATH, DEFAULT_TIMEOUT } = require("./config.json") -const { PRINT_LOGS, DELIMITER, KEY_VAL_DELIMITER } = process.env +const { default: config } = require('../../lib/config'); +const modules = config.modules; +const { getStackDetailsByRegion, getGlobalFieldsCount, cleanUp, checkCounts } = require('./utils/helper'); +const { EXPORT_PATH, DEFAULT_TIMEOUT } = require('./config.json'); +const { PRINT_LOGS, DELIMITER, KEY_VAL_DELIMITER } = process.env; module.exports = (region) => { - const stackDetails = getStackDetailsByRegion(region, DELIMITER, KEY_VAL_DELIMITER) + const stackDetails = getStackDetailsByRegion(region, DELIMITER, KEY_VAL_DELIMITER); for (let stack of Object.keys(stackDetails)) { + const exportBasePath = stackDetails[stack].BRANCH + ? path.join(__dirname, '..', '..', `${EXPORT_PATH}_${stack}`, stackDetails[stack].BRANCH) + : path.join(__dirname, '..', '..', `${EXPORT_PATH}_${stack}`); + const globalFieldsBasePath = path.join(exportBasePath, modules.globalfields.dirName); + const globalFieldsJson = path.join(globalFieldsBasePath, modules.globalfields.fileName); - const exportBasePath = (stackDetails[stack].BRANCH) ? path.join( - __dirname, - "..", - "..", - `${EXPORT_PATH}_${stack}`, - stackDetails[stack].BRANCH, - ) : path.join( - __dirname, - "..", - "..", - `${EXPORT_PATH}_${stack}` - ) - const globalFieldsBasePath = path.join( - exportBasePath, - modules.globalfields.dirName - ) - const globalFieldsJson = path.join( - globalFieldsBasePath, - modules.globalfields.fileName - ) - const messageFilePath = path.join( - __dirname, - "..", - "..", - "messages/index.json" - ) - - messageHandler.init({ messageFilePath }) - const { promptMessageList } = require(messageFilePath) - - describe("ContentStack-Export global-fields", () => { - describe("cm:stacks:export global-fields [auth-token]", () => { + describe('ContentStack-Export global-fields', () => { + describe('cm:stacks:export global-fields [auth-token]', () => { test .timeout(DEFAULT_TIMEOUT || 600000) // NOTE setting default timeout as 10 minutes - .stub(cliUX, "prompt", async (name) => { + .stub(cliUX, 'inquire', async (input) => { + const { name } = input; switch (name) { - case promptMessageList.promptSourceStack: - return stackDetails[stack].STACK_API_KEY - case promptMessageList.promptPathStoredData: - return `${EXPORT_PATH}_${stack}` + case 'apiKey': + return stackDetails[stack].STACK_API_KEY; + case 'dir': + return `${EXPORT_PATH}_${stack}`; } }) .stdout({ print: PRINT_LOGS || false }) - .command(["cm:stacks:export", "--module", "global-fields"]) - .it("Check global-fields count", async () => { - let exportedGlobalFieldsCount = 0 - const globalFieldsCount = await getGlobalFieldsCount(stackDetails[stack]) + .command(['cm:stacks:export', '--module', 'global-fields']) + .it('Check global-fields count', async () => { + let exportedGlobalFieldsCount = 0; + const globalFieldsCount = await getGlobalFieldsCount(stackDetails[stack]); try { if (fs.existsSync(globalFieldsJson)) { - exportedGlobalFieldsCount = Object.keys(JSON.parse(fs.readFileSync(globalFieldsJson, 'utf-8'))).length + exportedGlobalFieldsCount = Object.keys(JSON.parse(fs.readFileSync(globalFieldsJson, 'utf-8'))).length; } } catch (error) { - console.trace(error) + console.trace(error); } - checkCounts(globalFieldsCount, exportedGlobalFieldsCount) - }) - }) + checkCounts(globalFieldsCount, exportedGlobalFieldsCount); + }); + }); - describe("cm:stacks:export global-fields [management-token]", () => { + describe('cm:stacks:export global-fields [management-token]', () => { test .timeout(DEFAULT_TIMEOUT || 600000) // NOTE setting default timeout as 10 minutes .stdout({ print: PRINT_LOGS || false }) - .command(["cm:stacks:export", "--stack-api-key", stackDetails[stack].STACK_API_KEY, "--data-dir", `${EXPORT_PATH}_${stack}`, "--alias", stackDetails[stack].ALIAS_NAME, "--module", "global-fields"]) - .it("Check global-fields counts", async () => { - let exportedGlobalFieldsCount = 0 + .command([ + 'cm:stacks:export', + '--stack-api-key', + stackDetails[stack].STACK_API_KEY, + '--data-dir', + `${EXPORT_PATH}_${stack}`, + '--alias', + stackDetails[stack].ALIAS_NAME, + '--module', + 'global-fields', + ]) + .it('Check global-fields counts', async () => { + let exportedGlobalFieldsCount = 0; const globalFieldsCount = await getGlobalFieldsCount(stackDetails[stack]); try { if (fs.existsSync(globalFieldsJson)) { - exportedGlobalFieldsCount = Object.keys(JSON.parse(fs.readFileSync(globalFieldsJson, 'utf-8'))).length + exportedGlobalFieldsCount = Object.keys(JSON.parse(fs.readFileSync(globalFieldsJson, 'utf-8'))).length; } } catch (error) { - console.trace(error) + console.trace(error); } - checkCounts(globalFieldsCount, exportedGlobalFieldsCount) - }) - }) - }) + checkCounts(globalFieldsCount, exportedGlobalFieldsCount); + }); + }); + }); afterEach(async () => { - await cleanUp(path.join( - __dirname, - "..", - "..", - `${EXPORT_PATH}_${stack}`)); - defaultConfig.management_token = undefined - defaultConfig.branch = undefined - defaultConfig.branches = [] - }) + await cleanUp(path.join(__dirname, '..', '..', `${EXPORT_PATH}_${stack}`)); + config.management_token = undefined; + config.branch = undefined; + config.branches = []; + }); } -} - +}; diff --git a/packages/contentstack-export/test/integration/labels.test.js b/packages/contentstack-export/test/integration/labels.test.js index 1c69ad0b3b..907667de58 100644 --- a/packages/contentstack-export/test/integration/labels.test.js +++ b/packages/contentstack-export/test/integration/labels.test.js @@ -1,106 +1,93 @@ -let defaultConfig = require('../../src/config/default'); -const fs = require('fs') -const path = require("path") -const { test } = require("@oclif/test") -const { cliux: cliUX, messageHandler } = require("@contentstack/cli-utilities") +const fs = require('fs'); +const path = require('path'); +const { test } = require('@oclif/test'); +const { cliux: cliUX, messageHandler } = require('@contentstack/cli-utilities'); -const { modules } = require('../../src/config/default') -const { getStackDetailsByRegion, getLabelsCount, cleanUp, checkCounts } = require('./utils/helper') -const { EXPORT_PATH, DEFAULT_TIMEOUT } = require("./config.json") -const { PRINT_LOGS, DELIMITER, KEY_VAL_DELIMITER } = process.env +const { default: config } = require('../../lib/config'); +const modules = config.modules; +const { getStackDetailsByRegion, getLabelsCount, cleanUp, checkCounts } = require('./utils/helper'); +const { EXPORT_PATH, DEFAULT_TIMEOUT } = require('./config.json'); +const { PRINT_LOGS, DELIMITER, KEY_VAL_DELIMITER } = process.env; module.exports = (region) => { - const stackDetails = getStackDetailsByRegion(region, DELIMITER, KEY_VAL_DELIMITER) + const stackDetails = getStackDetailsByRegion(region, DELIMITER, KEY_VAL_DELIMITER); for (let stack of Object.keys(stackDetails)) { - const exportBasePath = (stackDetails[stack].BRANCH) ? path.join( - __dirname, - "..", - "..", - `${EXPORT_PATH}_${stack}`, - stackDetails[stack].BRANCH, - ) : path.join( - __dirname, - "..", - "..", - `${EXPORT_PATH}_${stack}` - ) + const exportBasePath = stackDetails[stack].BRANCH + ? path.join(__dirname, '..', '..', `${EXPORT_PATH}_${stack}`, stackDetails[stack].BRANCH) + : path.join(__dirname, '..', '..', `${EXPORT_PATH}_${stack}`); - const labelBasePath = path.join( - exportBasePath, - modules.labels.dirName - ) - const labelJson = path.join( - labelBasePath, - modules.labels.fileName - ) - const messageFilePath = path.join( - __dirname, - "..", - "..", - "messages/index.json" - ) - messageHandler.init({ messageFilePath }) - const { promptMessageList } = require(messageFilePath) + const labelBasePath = path.join(exportBasePath, modules.labels.dirName); + const labelJson = path.join(labelBasePath, modules.labels.fileName); + const messageFilePath = path.join(__dirname, '..', '..', 'messages/index.json'); + messageHandler.init({ messageFilePath }); + const { promptMessageList } = require(messageFilePath); - describe("ContentStack-Export labels", () => { - describe("cm:stacks:export labels [auth-token]", () => { + describe('ContentStack-Export labels', () => { + describe('cm:stacks:export labels [auth-token]', () => { test .timeout(DEFAULT_TIMEOUT || 600000) // NOTE setting default timeout as 10 minutes - .stub(cliUX, "prompt", async (name) => { + .stub(cliUX, 'inquire', async (input) => { + const { name } = input; switch (name) { - case promptMessageList.promptSourceStack: - return stackDetails[stack].STACK_API_KEY - case promptMessageList.promptPathStoredData: - return `${EXPORT_PATH}_${stack}` + case 'apiKey': + return stackDetails[stack].STACK_API_KEY; + case 'dir': + return `${EXPORT_PATH}_${stack}`; } }) .stdout({ print: PRINT_LOGS || false }) - .command(["cm:stacks:export", "--module", "labels"]) - .it("Check label counts", async () => { - let exportedLabelsCount = 0 - const labelsCount = await getLabelsCount(stackDetails[stack]) + .command(['cm:stacks:export', '--module', 'labels']) + .it('Check label counts', async () => { + let exportedLabelsCount = 0; + const labelsCount = await getLabelsCount(stackDetails[stack]); try { if (fs.existsSync(labelJson)) { - exportedLabelsCount = Object.keys(JSON.parse(fs.readFileSync(labelJson, 'utf-8'))).length + exportedLabelsCount = Object.keys(JSON.parse(fs.readFileSync(labelJson, 'utf-8'))).length; } } catch (error) { - console.trace(error) + console.trace(error); } - checkCounts(labelsCount, exportedLabelsCount) - }) - }) + checkCounts(labelsCount, exportedLabelsCount); + }); + }); - describe("cm:stacks:export labels [management-token]", () => { + describe('cm:stacks:export labels [management-token]', () => { test .timeout(DEFAULT_TIMEOUT || 600000) // NOTE setting default timeout as 10 minutes .stdout({ print: PRINT_LOGS || false }) - .command(["cm:stacks:export", "--stack-api-key", stackDetails[stack].STACK_API_KEY, "--data-dir", `${EXPORT_PATH}_${stack}`, "--alias", stackDetails[stack].ALIAS_NAME, "--module", "labels"]) - .it("Check label counts", async () => { - let exportedLabelsCount = 0 - const labelsCount = await getLabelsCount(stackDetails[stack]) + .command([ + 'cm:stacks:export', + '--stack-api-key', + stackDetails[stack].STACK_API_KEY, + '--data-dir', + `${EXPORT_PATH}_${stack}`, + '--alias', + stackDetails[stack].ALIAS_NAME, + '--module', + 'labels', + ]) + .it('Check label counts', async () => { + let exportedLabelsCount = 0; + const labelsCount = await getLabelsCount(stackDetails[stack]); try { if (fs.existsSync(labelJson)) { - exportedLabelsCount = Object.keys(JSON.parse(fs.readFileSync(labelJson, 'utf-8'))).length + exportedLabelsCount = Object.keys(JSON.parse(fs.readFileSync(labelJson, 'utf-8'))).length; } } catch (error) { - console.trace(error) + console.trace(error); } - checkCounts(labelsCount, exportedLabelsCount) - }) - }) - }) + checkCounts(labelsCount, exportedLabelsCount); + }); + }); + }); afterEach(async () => { - await cleanUp(path.join( - __dirname, - "..", - "..", - `${EXPORT_PATH}_${stack}`)); - defaultConfig.management_token = undefined - defaultConfig.branch = undefined - defaultConfig.branches = [] - }) + await cleanUp(path.join(__dirname, '..', '..', `${EXPORT_PATH}_${stack}`)); + config.management_token = undefined; + config.branch = undefined; + config.branches = []; + }); } -} +}; diff --git a/packages/contentstack-export/test/integration/locales.test.js b/packages/contentstack-export/test/integration/locales.test.js index 1b32dad486..d0e95fd217 100644 --- a/packages/contentstack-export/test/integration/locales.test.js +++ b/packages/contentstack-export/test/integration/locales.test.js @@ -1,108 +1,92 @@ -let defaultConfig = require('../../src/config/default'); -const fs = require('fs') -const path = require("path") -const { test } = require("@oclif/test") -const { cliux: cliUX, messageHandler } = require("@contentstack/cli-utilities") +const fs = require('fs'); +const path = require('path'); +const { test } = require('@oclif/test'); +const { cliux: cliUX, messageHandler } = require('@contentstack/cli-utilities'); -const { modules } = require('../../src/config/default') -const { getStackDetailsByRegion, getLocalesCount, cleanUp, checkCounts } = require('./utils/helper') -const { EXPORT_PATH, DEFAULT_TIMEOUT } = require("./config.json") -const { PRINT_LOGS, DELIMITER, KEY_VAL_DELIMITER } = process.env +const { default: config } = require('../../lib/config'); +const modules = config.modules; +const { getStackDetailsByRegion, getLocalesCount, cleanUp, checkCounts } = require('./utils/helper'); +const { EXPORT_PATH, DEFAULT_TIMEOUT } = require('./config.json'); +const { PRINT_LOGS, DELIMITER, KEY_VAL_DELIMITER } = process.env; module.exports = (region) => { - const stackDetails = getStackDetailsByRegion(region, DELIMITER, KEY_VAL_DELIMITER) + const stackDetails = getStackDetailsByRegion(region, DELIMITER, KEY_VAL_DELIMITER); for (let stack of Object.keys(stackDetails)) { - const exportBasePath = (stackDetails[stack].BRANCH) ? path.join( - __dirname, - "..", - "..", - `${EXPORT_PATH}_${stack}`, - stackDetails[stack].BRANCH, - ) : path.join( - __dirname, - "..", - "..", - `${EXPORT_PATH}_${stack}` - ) + const exportBasePath = stackDetails[stack].BRANCH + ? path.join(__dirname, '..', '..', `${EXPORT_PATH}_${stack}`, stackDetails[stack].BRANCH) + : path.join(__dirname, '..', '..', `${EXPORT_PATH}_${stack}`); - const localeBasePath = path.join( - exportBasePath, - modules.locales.dirName - ) - const localeJson = path.join( - localeBasePath, - modules.locales.fileName - ) - const messageFilePath = path.join( - __dirname, - "..", - "..", - "messages/index.json" - ) - messageHandler.init({ messageFilePath }) - const { promptMessageList } = require(messageFilePath) + const localeBasePath = path.join(exportBasePath, modules.locales.dirName); + const localeJson = path.join(localeBasePath, modules.locales.fileName); - describe("ContentStack-Export locales", () => { - describe("cm:stacks:export locales [auth-token]", () => { + describe('ContentStack-Export locales', () => { + describe('cm:stacks:export locales [auth-token]', () => { test .timeout(DEFAULT_TIMEOUT || 600000) // NOTE setting default timeout as 10 minutes - .stub(cliUX, "prompt", async (name) => { + .stub(cliUX, 'inquire', async (input) => { + const { name } = input; switch (name) { - case promptMessageList.promptSourceStack: - return stackDetails[stack].STACK_API_KEY - case promptMessageList.promptPathStoredData: - return `${EXPORT_PATH}_${stack}` + case 'apiKey': + return stackDetails[stack].STACK_API_KEY; + case 'dir': + return `${EXPORT_PATH}_${stack}`; } }) .stdout({ print: PRINT_LOGS || false }) - .command(["cm:stacks:export", "--module", "locales"]) - .it("Check locale count is done", async () => { - let exportedLocaleCount = 0 - const localeCount = await getLocalesCount(stackDetails[stack]) + .command(['cm:stacks:export', '--module', 'locales']) + .it('Check locale count is done', async () => { + let exportedLocaleCount = 0; + const localeCount = await getLocalesCount(stackDetails[stack]); try { if (fs.existsSync(localeJson)) { - exportedLocaleCount = Object.keys(JSON.parse(fs.readFileSync(localeJson, 'utf-8'))).length + exportedLocaleCount = Object.keys(JSON.parse(fs.readFileSync(localeJson, 'utf-8'))).length; } } catch (error) { - console.trace(error) + console.trace(error); } - checkCounts(localeCount, exportedLocaleCount) - }) - }) + checkCounts(localeCount, exportedLocaleCount); + }); + }); - describe("cm:stacks:export locales [management-token]", () => { + describe('cm:stacks:export locales [management-token]', () => { test .timeout(DEFAULT_TIMEOUT || 600000) // NOTE setting default timeout as 10 minutes .stdout({ print: PRINT_LOGS || false }) - .command(["cm:stacks:export", "--stack-api-key", stackDetails[stack].STACK_API_KEY, "--data-dir", `${EXPORT_PATH}_${stack}`, "--alias", stackDetails[stack].ALIAS_NAME, "--module", "locales"]) - .it("Check locale count is done", async () => { - let exportedLocaleCount = 0 - const localeCount = await getLocalesCount(stackDetails[stack]) + .command([ + 'cm:stacks:export', + '--stack-api-key', + stackDetails[stack].STACK_API_KEY, + '--data-dir', + `${EXPORT_PATH}_${stack}`, + '--alias', + stackDetails[stack].ALIAS_NAME, + '--module', + 'locales', + ]) + .it('Check locale count is done', async () => { + let exportedLocaleCount = 0; + const localeCount = await getLocalesCount(stackDetails[stack]); try { if (fs.existsSync(localeJson)) { - exportedLocaleCount = Object.keys(JSON.parse(fs.readFileSync(localeJson, 'utf-8'))).length + exportedLocaleCount = Object.keys(JSON.parse(fs.readFileSync(localeJson, 'utf-8'))).length; } } catch (error) { - console.trace(error) + console.trace(error); } - checkCounts(localeCount, exportedLocaleCount) - }) - }) - }) + checkCounts(localeCount, exportedLocaleCount); + }); + }); + }); afterEach(async () => { - await cleanUp(path.join( - __dirname, - "..", - "..", - `${EXPORT_PATH}_${stack}`)); - defaultConfig.management_token = undefined - defaultConfig.branch = undefined - defaultConfig.branches = [] - }) + await cleanUp(path.join(__dirname, '..', '..', `${EXPORT_PATH}_${stack}`)); + config.management_token = undefined; + config.branch = undefined; + config.branches = []; + }); } -} +}; diff --git a/packages/contentstack-export/test/integration/marketplace-apps.test.js b/packages/contentstack-export/test/integration/marketplace-apps.test.js index 68dba1141b..2c224d9d1e 100644 --- a/packages/contentstack-export/test/integration/marketplace-apps.test.js +++ b/packages/contentstack-export/test/integration/marketplace-apps.test.js @@ -1,106 +1,94 @@ -let defaultConfig = require('../../src/config/default'); -const fs = require('fs') -const path = require("path") -const { test } = require("@oclif/test") -const { cliux: cliUX, messageHandler } = require("@contentstack/cli-utilities") +const fs = require('fs'); +const path = require('path'); +const { test } = require('@oclif/test'); +const { cliux: cliUX } = require('@contentstack/cli-utilities'); -const { modules } = require('../../src/config/default') -const { getStackDetailsByRegion, getMarketplaceAppsCount, cleanUp, checkCounts } = require('./utils/helper') -const { EXPORT_PATH, DEFAULT_TIMEOUT } = require("./config.json") -const { PRINT_LOGS, DELIMITER, KEY_VAL_DELIMITER } = process.env +const { default: config } = require('../../lib/config'); +const modules = config.modules; +const { getStackDetailsByRegion, getMarketplaceAppsCount, cleanUp, checkCounts } = require('./utils/helper'); +const { EXPORT_PATH, DEFAULT_TIMEOUT } = require('./config.json'); +const { PRINT_LOGS, DELIMITER, KEY_VAL_DELIMITER } = process.env; module.exports = (region) => { - const stackDetails = getStackDetailsByRegion(region, DELIMITER, KEY_VAL_DELIMITER) + const stackDetails = getStackDetailsByRegion(region, DELIMITER, KEY_VAL_DELIMITER); for (let stack of Object.keys(stackDetails)) { - const exportBasePath = (stackDetails[stack].BRANCH) ? path.join( - __dirname, - "..", - "..", - `${EXPORT_PATH}_${stack}`, - stackDetails[stack].BRANCH, - ) : path.join( - __dirname, - "..", - "..", - `${EXPORT_PATH}_${stack}` - ) - const marketplaceAppsBasePath = path.join( - exportBasePath, - modules.marketplace_apps.dirName - ) - const marketplaceAppsJson = path.join( - marketplaceAppsBasePath, - modules.marketplace_apps.fileName - ) - const messageFilePath = path.join( - __dirname, - "..", - "..", - "messages/index.json" - ) + const exportBasePath = stackDetails[stack].BRANCH + ? path.join(__dirname, '..', '..', `${EXPORT_PATH}_${stack}`, stackDetails[stack].BRANCH) + : path.join(__dirname, '..', '..', `${EXPORT_PATH}_${stack}`); + const marketplaceAppsBasePath = path.join(exportBasePath, modules.marketplace_apps.dirName); + const marketplaceAppsJson = path.join(marketplaceAppsBasePath, modules.marketplace_apps.fileName); - messageHandler.init({ messageFilePath }) - const { promptMessageList } = require(messageFilePath) - - describe("ContentStack-Export marketplace-apps", () => { - describe("cm:stacks:export marketplace-apps [auth-token]", () => { + describe('ContentStack-Export marketplace-apps', () => { + describe('cm:stacks:export marketplace-apps [auth-token]', () => { test .timeout(DEFAULT_TIMEOUT || 600000) // NOTE setting default timeout as 10 minutes - .stub(cliUX, "prompt", async (name) => { + .stub(cliUX, 'inquire', async (input) => { + const { name } = input; switch (name) { - case promptMessageList.promptSourceStack: - return stackDetails[stack].STACK_API_KEY - case promptMessageList.promptPathStoredData: - return `${EXPORT_PATH}_${stack}` + case 'apiKey': + return stackDetails[stack].STACK_API_KEY; + case 'dir': + return `${EXPORT_PATH}_${stack}`; } }) .stdout({ print: PRINT_LOGS || false }) - .command(["cm:stacks:export", "--module", "marketplace-apps", "--yes"]) - .it("Check marketplace-apps count", async () => { - let exportedMarketplaceAppsCount = 0 - const marketplaceAppsCount = await getMarketplaceAppsCount(stackDetails[stack]) + .command(['cm:stacks:export', '--module', 'marketplace-apps', '--yes']) + .it('Check marketplace-apps count', async () => { + let exportedMarketplaceAppsCount = 0; + const marketplaceAppsCount = await getMarketplaceAppsCount(stackDetails[stack]); try { if (fs.existsSync(marketplaceAppsJson)) { - exportedMarketplaceAppsCount = Object.keys(JSON.parse(fs.readFileSync(marketplaceAppsJson, 'utf-8'))).length + exportedMarketplaceAppsCount = Object.keys( + JSON.parse(fs.readFileSync(marketplaceAppsJson, 'utf-8')), + ).length; } } catch (error) { - console.trace(error) + console.trace(error); } - checkCounts(marketplaceAppsCount, exportedMarketplaceAppsCount) - }) - }) + checkCounts(marketplaceAppsCount, exportedMarketplaceAppsCount); + }); + }); - describe("cm:stacks:export marketplace-apps [management-token]", () => { + describe('cm:stacks:export marketplace-apps [management-token]', () => { test .timeout(DEFAULT_TIMEOUT || 600000) // NOTE setting default timeout as 10 minutes .stdout({ print: PRINT_LOGS || false }) - .command(["cm:stacks:export", "--stack-api-key", stackDetails[stack].STACK_API_KEY, "--data-dir", `${EXPORT_PATH}_${stack}`, "--alias", stackDetails[stack].ALIAS_NAME, "--module", "marketplace-apps", "--yes"]) - .it("Check MarketplaceApps counts", async () => { - let exportedMarketplaceAppsCount = 0 + .command([ + 'cm:stacks:export', + '--stack-api-key', + stackDetails[stack].STACK_API_KEY, + '--data-dir', + `${EXPORT_PATH}_${stack}`, + '--alias', + stackDetails[stack].ALIAS_NAME, + '--module', + 'marketplace-apps', + '--yes', + ]) + .it('Check MarketplaceApps counts', async () => { + let exportedMarketplaceAppsCount = 0; const marketplaceAppsCount = await getMarketplaceAppsCount(stackDetails[stack]); try { if (fs.existsSync(marketplaceAppsJson)) { - exportedMarketplaceAppsCount = Object.keys(JSON.parse(fs.readFileSync(marketplaceAppsJson, 'utf-8'))).length + exportedMarketplaceAppsCount = Object.keys( + JSON.parse(fs.readFileSync(marketplaceAppsJson, 'utf-8')), + ).length; } } catch (error) { - console.trace(error) + console.trace(error); } - checkCounts(marketplaceAppsCount, exportedMarketplaceAppsCount) - }) - }) - }) + checkCounts(marketplaceAppsCount, exportedMarketplaceAppsCount); + }); + }); + }); afterEach(async () => { - await cleanUp(path.join( - __dirname, - "..", - "..", - `${EXPORT_PATH}_${stack}`)); - defaultConfig.management_token = undefined - defaultConfig.branch = undefined - defaultConfig.branches = [] - }) + await cleanUp(path.join(__dirname, '..', '..', `${EXPORT_PATH}_${stack}`)); + config.management_token = undefined; + config.branch = undefined; + config.branches = []; + }); } -} \ No newline at end of file +}; diff --git a/packages/contentstack-export/test/integration/utils/helper.js b/packages/contentstack-export/test/integration/utils/helper.js index d2f1719985..0e8dbd427b 100644 --- a/packages/contentstack-export/test/integration/utils/helper.js +++ b/packages/contentstack-export/test/integration/utils/helper.js @@ -1,9 +1,9 @@ const fs = require('fs'); const _ = require('lodash'); -const config = require('../../../src/config/default'); +const { default: config } = require('../../../lib/config'); const { Command } = require('@contentstack/cli-command'); const { managementSDKClient, HttpClient } = require('@contentstack/cli-utilities'); -const { getDeveloperHubUrl } = require('../../../src/lib/util/marketplace-app-helper'); +const { getDeveloperHubUrl } = require('../../../lib/utils/marketplace-app-helper'); const pjson = require('../../../package.json'); const { REGIONS } = require('../../config.json'); const { expect } = require('@oclif/test'); @@ -179,19 +179,19 @@ const getExtensionsCount = async (data) => { return extensionCount; }; -const getMarketplaceAppsCount = async () => { - const count = await getAllStackSpecificApps(); +const getMarketplaceAppsCount = async (stack) => { + const count = await getAllStackSpecificApps(stack); return count; }; -const getAllStackSpecificApps = async (skip = 0) => { - const developerHubBaseUrl = await getDeveloperHubUrl(); +const getAllStackSpecificApps = async (stack, skip = 0) => { + const developerHubBaseUrl = await getDeveloperHubUrl(config); const httpClient = new HttpClient().headers({ authtoken: config.auth_token, organization_uid: config.org_uid, }); return httpClient - .get(`${developerHubBaseUrl}/installations?target_uids=${config.source_stack}&skip=${skip}`) + .get(`${developerHubBaseUrl}/installations?target_uids=${stack.STACK_API_KEY}&skip=${skip}`) .then(async ({ data }) => { const { count } = data; diff --git a/packages/contentstack-export/test/integration/webhooks.test.js b/packages/contentstack-export/test/integration/webhooks.test.js index 7fb09c2a32..14fc5ccac3 100644 --- a/packages/contentstack-export/test/integration/webhooks.test.js +++ b/packages/contentstack-export/test/integration/webhooks.test.js @@ -1,107 +1,89 @@ -let defaultConfig = require('../../src/config/default'); -const fs = require('fs') -const path = require("path") -const { test } = require("@oclif/test") -const { cliux: cliUX, messageHandler } = require("@contentstack/cli-utilities") +const fs = require('fs'); +const path = require('path'); +const { test } = require('@oclif/test'); +const { cliux: cliUX, messageHandler } = require('@contentstack/cli-utilities'); -const { modules } = require('../../src/config/default') -const { getStackDetailsByRegion, getWebhooksCount, cleanUp, checkCounts } = require('./utils/helper') -const { EXPORT_PATH, DEFAULT_TIMEOUT } = require("./config.json") -const { PRINT_LOGS, DELIMITER, KEY_VAL_DELIMITER } = process.env +const { default: config } = require('../../lib/config'); +const modules = config.modules; +const { getStackDetailsByRegion, getWebhooksCount, cleanUp, checkCounts } = require('./utils/helper'); +const { EXPORT_PATH, DEFAULT_TIMEOUT } = require('./config.json'); +const { PRINT_LOGS, DELIMITER, KEY_VAL_DELIMITER } = process.env; module.exports = (region) => { - const stackDetails = getStackDetailsByRegion(region, DELIMITER, KEY_VAL_DELIMITER) + const stackDetails = getStackDetailsByRegion(region, DELIMITER, KEY_VAL_DELIMITER); for (let stack of Object.keys(stackDetails)) { - const exportBasePath = (stackDetails[stack].BRANCH) ? path.join( - __dirname, - "..", - "..", - `${EXPORT_PATH}_${stack}`, - stackDetails.BRANCH, - ) : path.join( - __dirname, - "..", - "..", - `${EXPORT_PATH}_${stack}` - ) - const webhooksBasePath = path.join( - exportBasePath, - modules.webhooks.dirName - ) - const webhooksJson = path.join( - webhooksBasePath, - modules.webhooks.fileName - ) - const messageFilePath = path.join( - __dirname, - "..", - "..", - "messages/index.json" - ) + const exportBasePath = stackDetails[stack].BRANCH + ? path.join(__dirname, '..', '..', `${EXPORT_PATH}_${stack}`, stackDetails.BRANCH) + : path.join(__dirname, '..', '..', `${EXPORT_PATH}_${stack}`); + const webhooksBasePath = path.join(exportBasePath, modules.webhooks.dirName); + const webhooksJson = path.join(webhooksBasePath, modules.webhooks.fileName); - messageHandler.init({ messageFilePath }) - const { promptMessageList } = require(messageFilePath) - - describe("ContentStack-Export webhooks", () => { - describe("cm:stacks:export webhooks [auth-token]", () => { + describe('ContentStack-Export webhooks', () => { + describe('cm:stacks:export webhooks [auth-token]', () => { test .timeout(DEFAULT_TIMEOUT || 600000) // NOTE setting default timeout as 10 minutes - .stub(cliUX, "prompt", async (name) => { + .stub(cliUX, 'inquire', async (input) => { + const { name } = input; switch (name) { - case promptMessageList.promptSourceStack: - return stackDetails[stack].STACK_API_KEY - case promptMessageList.promptPathStoredData: - return `${EXPORT_PATH}_${stack}` + case 'apiKey': + return stackDetails[stack].STACK_API_KEY; + case 'dir': + return `${EXPORT_PATH}_${stack}`; } }) .stdout({ print: PRINT_LOGS || false }) - .command(["cm:stacks:export", "--module", "webhooks"]) - .it("Check webhooks count", async () => { - let exportedWebhooksCount = 0 - const webhooksCount = await getWebhooksCount(stackDetails[stack]) + .command(['cm:stacks:export', '--module', 'webhooks']) + .it('Check webhooks count', async () => { + let exportedWebhooksCount = 0; + const webhooksCount = await getWebhooksCount(stackDetails[stack]); try { if (fs.existsSync(webhooksJson)) { - exportedWebhooksCount = Object.keys(JSON.parse(fs.readFileSync(webhooksJson, 'utf-8'))).length + exportedWebhooksCount = Object.keys(JSON.parse(fs.readFileSync(webhooksJson, 'utf-8'))).length; } } catch (error) { - console.trace(error) + console.trace(error); } - checkCounts(webhooksCount, exportedWebhooksCount) - }) - }) + checkCounts(webhooksCount, exportedWebhooksCount); + }); + }); - describe("cm:stacks:export webhooks [management-token]", () => { + describe('cm:stacks:export webhooks [management-token]', () => { test .timeout(DEFAULT_TIMEOUT || 600000) // NOTE setting default timeout as 10 minutes .stdout({ print: PRINT_LOGS || false }) - .command(["cm:stacks:export", "--stack-api-key", stackDetails[stack].STACK_API_KEY, "--data-dir", `${EXPORT_PATH}_${stack}`, "--alias", stackDetails[stack].ALIAS_NAME, "--module", "webhooks"]) - .it("Check Webhooks counts", async () => { - let exportedWebhooksCount = 0 + .command([ + 'cm:stacks:export', + '--stack-api-key', + stackDetails[stack].STACK_API_KEY, + '--data-dir', + `${EXPORT_PATH}_${stack}`, + '--alias', + stackDetails[stack].ALIAS_NAME, + '--module', + 'webhooks', + ]) + .it('Check Webhooks counts', async () => { + let exportedWebhooksCount = 0; const webhooksCount = await getWebhooksCount(stackDetails[stack]); try { if (fs.existsSync(webhooksJson)) { - exportedWebhooksCount = Object.keys(JSON.parse(fs.readFileSync(webhooksJson, 'utf-8'))).length + exportedWebhooksCount = Object.keys(JSON.parse(fs.readFileSync(webhooksJson, 'utf-8'))).length; } } catch (error) { - console.trace(error) + console.trace(error); } - checkCounts(webhooksCount, exportedWebhooksCount) - }) - }) - }) + checkCounts(webhooksCount, exportedWebhooksCount); + }); + }); + }); afterEach(async () => { - await cleanUp(path.join( - __dirname, - "..", - "..", - `${EXPORT_PATH}_${stack}`)); - defaultConfig.management_token = undefined - defaultConfig.branch = undefined - defaultConfig.branches = [] - }) + await cleanUp(path.join(__dirname, '..', '..', `${EXPORT_PATH}_${stack}`)); + config.management_token = undefined; + config.branch = undefined; + config.branches = []; + }); } -} - +}; diff --git a/packages/contentstack-export/test/integration/workflows.test.js b/packages/contentstack-export/test/integration/workflows.test.js index 9ecf469d5c..f9e40564e3 100644 --- a/packages/contentstack-export/test/integration/workflows.test.js +++ b/packages/contentstack-export/test/integration/workflows.test.js @@ -1,107 +1,89 @@ -let defaultConfig = require('../../src/config/default'); -const fs = require('fs') -const path = require("path") -const { test } = require("@oclif/test") -const { cliux: cliUX, messageHandler } = require("@contentstack/cli-utilities") +const fs = require('fs'); +const path = require('path'); +const { test } = require('@oclif/test'); +const { cliux: cliUX, messageHandler } = require('@contentstack/cli-utilities'); -const { modules } = require('../../src/config/default') -const { getStackDetailsByRegion, getWorkflowsCount, cleanUp, checkCounts } = require('./utils/helper') -const { EXPORT_PATH, DEFAULT_TIMEOUT } = require("./config.json") -const { PRINT_LOGS, DELIMITER, KEY_VAL_DELIMITER } = process.env +const { default: config } = require('../../lib/config'); +const modules = config.modules; +const { getStackDetailsByRegion, getWorkflowsCount, cleanUp, checkCounts } = require('./utils/helper'); +const { EXPORT_PATH, DEFAULT_TIMEOUT } = require('./config.json'); +const { PRINT_LOGS, DELIMITER, KEY_VAL_DELIMITER } = process.env; module.exports = (region) => { - const stackDetails = getStackDetailsByRegion(region, DELIMITER, KEY_VAL_DELIMITER) + const stackDetails = getStackDetailsByRegion(region, DELIMITER, KEY_VAL_DELIMITER); for (let stack of Object.keys(stackDetails)) { - const exportBasePath = (stackDetails[stack].BRANCH) ? path.join( - __dirname, - "..", - "..", - `${EXPORT_PATH}_${stack}`, - stackDetails[stack].BRANCH, - ) : path.join( - __dirname, - "..", - "..", - `${EXPORT_PATH}_${stack}` - ) - const workflowsBasePath = path.join( - exportBasePath, - modules.workflows.dirName - ) - const workflowsJson = path.join( - workflowsBasePath, - modules.workflows.fileName - ) - const messageFilePath = path.join( - __dirname, - "..", - "..", - "messages/index.json" - ) + const exportBasePath = stackDetails[stack].BRANCH + ? path.join(__dirname, '..', '..', `${EXPORT_PATH}_${stack}`, stackDetails[stack].BRANCH) + : path.join(__dirname, '..', '..', `${EXPORT_PATH}_${stack}`); + const workflowsBasePath = path.join(exportBasePath, modules.workflows.dirName); + const workflowsJson = path.join(workflowsBasePath, modules.workflows.fileName); - messageHandler.init({ messageFilePath }) - const { promptMessageList } = require(messageFilePath) - - describe("ContentStack-Export workflows", () => { - describe("cm:stacks:export workfows [auth-token]", () => { + describe('ContentStack-Export workflows', () => { + describe('cm:stacks:export workfows [auth-token]', () => { test .timeout(DEFAULT_TIMEOUT || 600000) // NOTE setting default timeout as 10 minutes - .stub(cliUX, "prompt", async (name) => { + .stub(cliUX, 'inquire', async (input) => { + const { name } = input; switch (name) { - case promptMessageList.promptSourceStack: - return stackDetails[stack].STACK_API_KEY - case promptMessageList.promptPathStoredData: - return `${EXPORT_PATH}_${stack}` + case 'apiKey': + return stackDetails[stack].STACK_API_KEY; + case 'dir': + return `${EXPORT_PATH}_${stack}`; } }) .stdout({ print: PRINT_LOGS || false }) - .command(["cm:stacks:export", "--module", "workflows"]) - .it("Check workflows count", async () => { - let exportedWorkflowsCount = 0 - const workflowsCount = await getWorkflowsCount(stackDetails[stack]) + .command(['cm:stacks:export', '--module', 'workflows']) + .it('Check workflows count', async () => { + let exportedWorkflowsCount = 0; + const workflowsCount = await getWorkflowsCount(stackDetails[stack]); try { if (fs.existsSync(workflowsJson)) { - exportedWorkflowsCount = Object.keys(JSON.parse(fs.readFileSync(workflowsJson, 'utf-8'))).length + exportedWorkflowsCount = Object.keys(JSON.parse(fs.readFileSync(workflowsJson, 'utf-8'))).length; } } catch (error) { - console.trace(error) + console.trace(error); } - checkCounts(workflowsCount, exportedWorkflowsCount) - }) - }) + checkCounts(workflowsCount, exportedWorkflowsCount); + }); + }); - describe("cm:stacks:export workflows [management-token]", () => { + describe('cm:stacks:export workflows [management-token]', () => { test .timeout(DEFAULT_TIMEOUT || 600000) // NOTE setting default timeout as 10 minutes .stdout({ print: PRINT_LOGS || false }) - .command(["cm:stacks:export", "--stack-api-key", stackDetails[stack].STACK_API_KEY, "--data-dir", `${EXPORT_PATH}_${stack}`, "--alias", stackDetails[stack].ALIAS_NAME, "--module", "workflows"]) - .it("Check workflows counts", async () => { - let exportedWorkflowsCount = 0 + .command([ + 'cm:stacks:export', + '--stack-api-key', + stackDetails[stack].STACK_API_KEY, + '--data-dir', + `${EXPORT_PATH}_${stack}`, + '--alias', + stackDetails[stack].ALIAS_NAME, + '--module', + 'workflows', + ]) + .it('Check workflows counts', async () => { + let exportedWorkflowsCount = 0; const workflowsCount = await getWorkflowsCount(stackDetails[stack]); try { if (fs.existsSync(workflowsJson)) { - exportedWorkflowsCount = Object.keys(JSON.parse(fs.readFileSync(workflowsJson, 'utf-8'))).length + exportedWorkflowsCount = Object.keys(JSON.parse(fs.readFileSync(workflowsJson, 'utf-8'))).length; } } catch (error) { - console.trace(error) + console.trace(error); } - checkCounts(workflowsCount, exportedWorkflowsCount) - }) - }) - }) + checkCounts(workflowsCount, exportedWorkflowsCount); + }); + }); + }); afterEach(async () => { - await cleanUp(path.join( - __dirname, - "..", - "..", - `${EXPORT_PATH}_${stack}`)); - defaultConfig.management_token = undefined - defaultConfig.branch = undefined - defaultConfig.branches = [] - }) + await cleanUp(path.join(__dirname, '..', '..', `${EXPORT_PATH}_${stack}`)); + config.management_token = undefined; + config.branch = undefined; + config.branches = []; + }); } -} - +}; diff --git a/packages/contentstack-bulk-publish/test/mocha.opts b/packages/contentstack-export/test/mocha.opts similarity index 100% rename from packages/contentstack-bulk-publish/test/mocha.opts rename to packages/contentstack-export/test/mocha.opts diff --git a/packages/contentstack-export/test/tsconfig.json b/packages/contentstack-export/test/tsconfig.json new file mode 100644 index 0000000000..5de9d8e61a --- /dev/null +++ b/packages/contentstack-export/test/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "../tsconfig.json", + "include": ["./unit/**/*"] +} \ No newline at end of file diff --git a/packages/contentstack-export/test/unit/commands/export.test.js b/packages/contentstack-export/test/unit/commands/export.test.js deleted file mode 100644 index 998bcd64be..0000000000 --- a/packages/contentstack-export/test/unit/commands/export.test.js +++ /dev/null @@ -1,382 +0,0 @@ -const {expect, test, it} = require('@oclif/test') -const { cliux } = require('@contentstack/cli-utilities'); -const {Client} = require('../../../src/lib/util/contentstack-management-sdk') -let defaultConfig = require('../../../src/config/default') -let _ = require('lodash') -var environmentsMock = require('../mock/environment') -var extensionsMock = require('../mock/extensions') -var localeMock = require('../mock/locales') -var workflowMock = require('../mock/workflow') -var globalFieldsMock = require('../mock/globalFields') -var webhooksMock = require('../mock/webhook') -var assetsMock = require('../mock/assets') -var assetFetchMock = require('../mock/assetFetch') -var entriesMock = require('../mock/entries') -var entriesFetchMock = require('../mock/entryFetch') -var contentTypeMock = require('../mock/content-types') -let message = require('../../../messages/index.json') - -// test -// .stub(require('../../src/lib/util/contentstack-management-sdk'), 'Client', (e) => { -// return { -// stack: function() { -// return { -// environment: function() { -// return { -// query: function() { -// return { -// find: function() { -// return Promise.resolve(environmentsMock) -// } -// } -// } -// } -// } -// } -// } -// } -// }) -// .stub(cli, 'prompt', (name) => async (name) => { -// if (name === 'Please provide master locale ?') return 'en-us' -// if (name === 'Please provide source Stack') return 'newstackUid' -// if (name === 'Please provide path were you want to store') return '../contents' -// }) -// .command(['cm:export', '--auth-token', '-m', 'environments']) -// .it('runs method of environment', ctx => { -// }) - -// //global-fields -// test -// .stub(require('../../src/lib/util/contentstack-management-sdk'), 'Client', (e) => { -// return { -// stack: function() { -// return { -// globalField: function() { -// return { -// query: function() { -// return { -// find: function() { -// return Promise.resolve(globalFieldsMock) -// } -// } -// } -// } -// } -// } -// } -// } -// }) -// .stub(cli, 'prompt', (name) => async (name) => { -// if (name === 'Please provide master locale ?') return 'en-us' -// if (name === 'Please provide source Stack') return 'newstackUid' -// if (name === 'Please provide path were you want to store') return '../contents' -// }) -// .command(['cm:export', '--auth-token', '-m', 'global-fields']) -// .it('runs method of Global Fields', ctx => { -// }) - -test -.stub(require('../../../src/lib/util/contentstack-management-sdk'), 'Client', e => { - return { - stack: function () { - return { - locale: function () { - return { - query: function () { - return { - find: function () { - return Promise.resolve(workflowMock) - }, - } - }, - } - }, - } - }, - } -}) -.stub(cliux, 'prompt', _name => async name => { - if (name === message.promptMessageList.promptMasterLocale) return 'en-us' - if (name === message.promptMessageList.promptSourceStack) return 'newstackUid' - if (name === message.promptMessageList.promptPathStoredData) return '../contents' -}) -.command(['cm:export', '--auth-token', '-m', 'locales']) -.it('runs method of Locales', ctx => { -}) - -test -.stub(require('../../../src/lib/util/contentstack-management-sdk'), 'Client', e => { - return { - stack: function () { - return { - workflow: function () { - // return { - // query: function () { - return { - findAll: function () { - return Promise.resolve(localeMock) - }, - } - // }, - // } - }, - } - }, - } -}) -.stub(cliux, 'prompt', _name => async name => { - if (name === message.promptMessageList.promptMasterLocale) return 'en-us' - if (name === message.promptMessageList.promptSourceStack) return 'newstackUid' - if (name === message.promptMessageList.promptPathStoredData) return '../contents' -}) -.command(['cm:export', '--auth-token', '-m', 'workflows']) -.it('runs method of workflows', ctx => { -}) - - -// test -// .stub(require('../../src/lib/util/contentstack-management-sdk'), 'Client', (e) => { -// return { -// stack: function() { -// return { -// extension: function() { -// return { -// query: function() { -// return { -// find: function() { -// return Promise.resolve(extensionsMock) -// } -// } -// } -// } -// } -// } -// } -// } -// }) -// .stub(cli, 'prompt', (name) => async (name) => { -// if (name === 'Please provide master locale ?') return 'en-us' -// if (name === 'Please provide source Stack') return 'newstackUid' -// if (name === 'Please provide path were you want to store') return '../contents' -// }) -// .command(['cm:export', '--auth-token', '-m', 'extensions']) -// .it('runs method of environment', ctx => { -// }) - -// test -// .stub(require('../../src/lib/util/contentstack-management-sdk'), 'Client', (e) => { -// return { -// stack: function() { -// return { -// webhook: function() { -// return { -// fetchAll: function() { -// return Promise.resolve(webhooksMock) -// } -// } -// } -// } -// } -// } -// }) -// .stub(cli, 'prompt', (name) => async (name) => { -// if (name === 'Please provide master locale ?') return 'en-us' -// if (name === 'Please provide source Stack') return 'newstackUid' -// if (name === 'Please provide path were you want to store') return '../contents' -// }) -// .command(['cm:export', '--auth-token', '-m', 'webhooks']) -// .it('runs method of webooks', ctx => { -// }) - -// test -// .stub(require('../../src/lib/util/contentstack-management-sdk'), 'Client', (e) => { -// return { -// stack: function() { -// return { -// asset: function() { -// return { -// query: function() { -// return { -// find: function() { -// return Promise.resolve(assetsMock) -// } -// } -// }, -// fetch: function() { -// return Promise.resolve(assetFetchMock) -// } -// } -// } -// } -// } -// } -// }) -// .stub(cli, 'prompt', (name) => async (name) => { -// if (name === 'Please provide master locale ?') return 'en-us' -// if (name === 'Please provide source Stack') return 'newstackUid' -// if (name === 'Please provide path were you want to store') return '../contents' -// }) -// .command(['cm:export', '--auth-token', '-m', 'assets']) -// .it('runs method of Assets', ctx => { -// }) - -// test -// .stub(require('../../src/lib/util/contentstack-management-sdk'), 'Client', (e) => { -// return { -// stack: function() { -// return { -// asset: function() { -// return { -// query: function() { -// return { -// find: function() { -// return Promise.reject() -// } -// } -// }, -// fetch: function() { -// return Promise.reject() -// } -// } -// } -// } -// } -// } -// }) -// .stub(cli, 'prompt', (name) => async (name) => { -// if (name === 'Please provide master locale ?') return 'en-us' -// if (name === 'Please provide source Stack') return 'newstackUid' -// if (name === 'Please provide path were you want to store') return '../contentsTest' -// }) -// .command(['cm:export', '--auth-token', '-m', 'assets']) -// .it('runs method of Assets for rejection', ctx => { -// }) - -test -.stub(require('../../../src/lib/util/contentstack-management-sdk'), 'Client', e => { - return { - stack: function () { - return { - contentType: function () { - return { - query: function () { - return { - find: function () { - return Promise.resolve(contentTypeMock) - }, - } - }, - } - }, - } - }, - } -}) -.stub(cliux, 'prompt', _name => async name => { - if (name === message.promptMessageList.promptMasterLocale) return 'en-us' - if (name === message.promptMessageList.promptSourceStack) return 'newstackUid' - if (name === message.promptMessageList.promptPathStoredData) return '../contents' -}) -.command(['cm:export', '--auth-token', '-m', 'content-types']) -.it('runs method of ContentTypes', ctx => { -}) - -test -.stub(require('../../../src/lib/util/contentstack-management-sdk'), 'Client', e => { - return { - stack: function () { - return { - contentType: function () { - return { - entry: function () { - return { - query: function () { - return { - find: function () { - return Promise.resolve(entriesMock) - }, - } - }, - fetch: function () { - return Promise.resolve(entriesFetchMock) - }, - } - }, - } - }, - } - }, - } -}) -.stub(cliux, 'prompt', _name => async name => { - if (name === message.promptMessageList.promptSourceStack) return 'newstackUid' - if (name === message.promptMessageList.promptPathStoredData) return '../contents-test' -}) -.command(['cm:export', '--auth-token', '-m', 'entries']) -.it('runs method of environment', ctx => { -}) - - -test -.stub(require('../../../src/lib/util/contentstack-management-sdk'), 'Client', e => { - return { - stack: function () { - return { - contentType: function () { - return { - entry: function () { - return { - query: function () { - return { - find: function () { - return Promise.resolve(entriesMock) - }, - } - }, - fetch: function () { - return Promise.resolve(entriesFetchMock) - }, - } - }, - } - }, - } - }, - } -}) -.stub(cliux, 'prompt', _name => async name => { - if (name === message.promptMessageList.promptMasterLocale) return 'en-us' - if (name === message.promptMessageList.promptSourceStack) return 'newstackUid' - if (name === message.promptMessageList.promptPathStoredData) return '../contents' -}) -.command(['cm:export', '--auth-token', '-m', 'entries', '-t', 'author']) -.it('Export entry of a specific type') - -// test -// .stub(require('../../src/lib/util/contentstack-management-sdk'), 'Client', (e) => { -// return { -// stack: function() { -// return { -// asset: function() { -// // return { -// // query: function() { -// return { -// fetch: function() { -// return Promise.resolve(assetFetchMock) -// } -// } -// //} -// //} -// } -// } -// } -// } -// }) -// .stub(cli, 'prompt', (name) => async (name) => { -// if (name === 'Please provide master locale ?') return 'en-us' -// if (name === 'Please provide source Stack') return 'newstackUid' -// if (name === 'Please provide path were you want to store') return '../contents' -// }) -// .command(['cm:export', '--auth-token', '-m', 'assets']) -// .it('runs method of webooks', ctx => { -// }) diff --git a/packages/contentstack-export/test/unit/dummyConfig/index.js b/packages/contentstack-export/test/unit/dummyConfig/index.js deleted file mode 100644 index c2f86b09bf..0000000000 --- a/packages/contentstack-export/test/unit/dummyConfig/index.js +++ /dev/null @@ -1,95 +0,0 @@ -module.exports = { - versioning: false, - host: 'https://api.contentstack.io/v3', - cdn: 'https://cdn.contentstack.io/v3', - modules: { - types: [ - 'stack', - 'assets', - 'locales', - 'environments', - 'extensions', - 'webhooks', - 'global-fields', - 'content-types', - 'entries', - 'labels', - ], - locales: { - dirName: 'locales', - fileName: 'locales.json', - requiredKeys: ['code', 'uid', 'name', 'fallback_locale'], - }, - environments: { - dirName: 'environments', - fileName: 'environments.json', - }, - labels: { - dirName: 'labels', - fileName: 'labels.json', - }, - webhooks: { - dirName: 'webhooks', - fileName: 'webhooks.json', - }, - globalfields: { - dirName: 'global_fields', - fileName: 'globalfields.json', - validKeys: ['title', 'uid', 'schema', 'options', 'singleton', 'description'], - }, - assets: { - dirName: 'assets', - fileName: 'assets.json', - // This is the total no. of asset objects fetched in each 'get assets' call - batchLimit: 20, - host: 'https://images.contentstack.io', - invalidKeys: ['created_at', 'updated_at', 'created_by', 'updated_by', '_metadata', 'published'], - // no of asset version files (of a single asset) that'll be downloaded parallelly - downloadLimit: 5, - }, - content_types: { - dirName: 'content_types', - fileName: 'content_types.json', - validKeys: ['title', 'uid', 'field_rules', 'schema', 'options', 'singleton', 'description'], - // total no of content types fetched in each 'get content types' call - limit: 100, - }, - entries: { - dirName: 'entries', - fileName: 'entries.json', - invalidKeys: ['created_at', 'updated_at', 'created_by', 'updated_by', '_metadata', 'published'], - batchLimit: 20, - downloadLimit: 5, - // total no of entries fetched in each content type in a single call - limit: 100, - }, - extensions: { - dirName: 'extensions', - fileName: 'extensions.json', - }, - stack: { - dirName: 'stack', - fileName: 'stack.json', - }, - }, - apis: { - userSession: '/user-session/', - globalfields: '/global_fields/', - locales: '/locales/', - labels: '/labels/', - environments: '/environments/', - assets: '/assets/', - content_types: '/content_types/', - entries: '/entries/', - users: '/stacks', - extension: '/extensions', - webhooks: '/webhooks/', - stacks: '/stacks/', - }, - preserveStackVersion: false, - headers: { - api_key: '', - authorization: '', - 'X-User-Agent': 'contentstack-export/v', - }, -}; diff --git a/packages/contentstack-export/test/unit/mock/assetFetch.js b/packages/contentstack-export/test/unit/mock/assetFetch.js deleted file mode 100644 index cda4179e83..0000000000 --- a/packages/contentstack-export/test/unit/mock/assetFetch.js +++ /dev/null @@ -1,20 +0,0 @@ -module.exports = { - stackHeaders: { api_key: 'dummyApiKey' }, - urlPath: 'assets/dummyUrl', - uid: 'dummyUid', - update: [Function], - delete: [Function], - fetch: [Function], - replace: [Function], - publish: [Function], - content_type: 'image/svg+xml', - file_size: '19743', - tags: [], - filename: 'HCA_Logo_White_RGB.svg', - url: 'https://images.contentstack.io/v3/assets/blt5ab3970669dfa578/bltbef70dca0df17a5d/5f0f12da2da906106a5caeca/HCA_Logo_White_RGB.svg', - ACL: {}, - is_dir: false, - _version: 1, - title: 'HCA_Logo_White_RGB.svg', - publish_details: [] - } \ No newline at end of file diff --git a/packages/contentstack-export/test/unit/mock/assets.js b/packages/contentstack-export/test/unit/mock/assets.js deleted file mode 100644 index ca745bf98f..0000000000 --- a/packages/contentstack-export/test/unit/mock/assets.js +++ /dev/null @@ -1,412 +0,0 @@ -module.exports = { - items: [ - { - stackHeaders: [Object], - urlPath: 'assets/dummyPath', - uid: 'dummyUid', - content_type: 'application/pdf', - file_size: '667698', - tags: [], - filename: 'Release_Notes_Int.pdf', - url: 'https://assets.contentstack.io/v3/assets/blt5ab3970669dfa578/blt5b39cbd17663b1fe/5f0f12e13a25531362dd6835/Release_Notes_Int.pdf', - ACL: [Object], - is_dir: false, - _version: 1, - title: 'Release_Notes_Int.pdf', - publish_details: [], - update: [Function], - delete: [Function], - fetch: [Function], - replace: [Function], - publish: [Function] - }, - { - stackHeaders: [Object], - urlPath: 'assets/dummyPath', - uid: 'dummyUid', - content_type: 'image/svg+xml', - file_size: '19743', - tags: [], - filename: 'HCA_Logo_White_RGB.svg', - url: 'https://images.contentstack.io/v3/assets/blt5ab3970669dfa578/bltbef70dca0df17a5d/5f0f12da2da906106a5caeca/HCA_Logo_White_RGB.svg', - ACL: [Object], - is_dir: false, - _version: 1, - title: 'HCA_Logo_White_RGB.svg', - publish_details: [], - update: [Function], - delete: [Function], - fetch: [Function], - replace: [Function], - publish: [Function] - }, - { - stackHeaders: [Object], - urlPath: 'assets/dummyPath', - uid: 'dummyUid', - content_type: 'application/pdf', - file_size: '667698', - tags: [], - filename: 'Release_Notes_Int.pdf', - url: 'https://assets.contentstack.io/v3/assets/blt5ab3970669dfa578/blt589528b0adcccd26/5f0f12d397b6246d32522687/Release_Notes_Int.pdf', - ACL: [Object], - is_dir: false, - parent_uid: 'blt76b1fc444e926aee', - _version: 1, - title: 'Release_Notes.pdf', - publish_details: [], - update: [Function], - delete: [Function], - fetch: [Function], - replace: [Function], - publish: [Function] - }, - { - stackHeaders: [Object], - urlPath: 'assets/dummyPath', - uid: 'dummyUid', - content_type: 'image/png', - file_size: '14267', - tags: [], - filename: 'spiros_segalas.png', - url: 'https://images.contentstack.io/v3/assets/blt5ab3970669dfa578/bltaa114f177699254f/5f0f12d014e45135d4535e62/spiros_segalas.png', - ACL: [Object], - is_dir: false, - parent_uid: 'bltae064058c8b10fac', - _version: 1, - title: 'spiros_segalas.png', - publish_details: [], - update: [Function], - delete: [Function], - fetch: [Function], - replace: [Function], - publish: [Function] - }, - { - stackHeaders: [Object], - urlPath: 'assets/dummyPath', - uid: 'dummyUid', - content_type: 'application/pdf', - file_size: '498523', - tags: [], - filename: 'capital_appreciation_fund_fact_sheet.pdf', - url: 'https://assets.contentstack.io/v3/assets/blt5ab3970669dfa578/blt2fc4e8d876d15e2f/5f0f12c924b5d9107d6a1886/capital_appreciation_fund_fact_sheet.pdf', - ACL: [Object], - is_dir: false, - parent_uid: null, - _version: 1, - title: 'capital_appreciation_fund_fact_sheet.pdf', - publish_details: [], - update: [Function], - delete: [Function], - fetch: [Function], - replace: [Function], - publish: [Function] - }, - { - stackHeaders: [Object], - urlPath: 'assets/dummyPath', - uid: 'dummyUid', - content_type: 'image/jpeg', - file_size: '258029', - tags: [], - filename: '4.7ss.jpg', - url: 'https://images.contentstack.io/v3/assets/blt5ab3970669dfa578/bltb12aab18b2b88f3c/5f0f12c914e45135d4535e5e/4.7ss.jpg', - ACL: [Object], - is_dir: false, - _version: 1, - title: '4.7ss.jpg', - publish_details: [], - update: [Function], - delete: [Function], - fetch: [Function], - replace: [Function], - publish: [Function] - }, - { - stackHeaders: [Object], - urlPath: 'assets/dummyPath', - uid: 'dummyUid', - content_type: 'application/pdf', - file_size: '667698', - tags: [], - filename: 'Release_Notes_Int.pdf', - url: 'https://assets.contentstack.io/v3/assets/blt5ab3970669dfa578/bltb58f63a6198eb699/5f0f12c0dfa8af6d4aee75ab/Release_Notes_Int.pdf', - ACL: [Object], - is_dir: false, - parent_uid: 'blt8d91774cbf8288c5', - _version: 1, - title: 'Release_Notes.pdf', - publish_details: [], - update: [Function], - delete: [Function], - fetch: [Function], - replace: [Function], - publish: [Function] - }, - { - stackHeaders: [Object], - urlPath: 'assets/dummyPath', - uid: 'dummyUid', - content_type: 'application/pdf', - file_size: '667698', - tags: [], - filename: 'Release_Notes.pdf', - url: 'https://assets.contentstack.io/v3/assets/blt5ab3970669dfa578/blt6c07eec439df9643/5f0f12c01d123c5014d372c3/Release_Notes.pdf', - ACL: [Object], - is_dir: false, - _version: 1, - title: 'Release_Notes.pdf', - publish_details: [], - update: [Function], - delete: [Function], - fetch: [Function], - replace: [Function], - publish: [Function] - }, - { - stackHeaders: [Object], - urlPath: 'assets/dummyPath', - uid: 'dummyUid', - content_type: 'application/pdf', - file_size: '667698', - tags: [], - filename: 'Release_Notes.pdf', - url: 'https://assets.contentstack.io/v3/assets/blt5ab3970669dfa578/blt026e57b5153ec7e4/5f0f12b776779b6e2221d5f6/Release_Notes.pdf', - ACL: [Object], - is_dir: false, - parent_uid: 'blt8d91774cbf8288c5', - _version: 1, - title: 'Release_Notes.pdf', - publish_details: [], - update: [Function], - delete: [Function], - fetch: [Function], - replace: [Function], - publish: [Function] - }, - { - stackHeaders: [Object], - urlPath: 'assets/dummyPath', - uid: 'dummyUid', - content_type: 'application/json', - file_size: '2351', - tags: [], - filename: 'fund_types.json', - url: 'https://assets.contentstack.io/v3/assets/blt5ab3970669dfa578/blt33222aa963a982fd/5f0f12b3a7db8f1275059828/fund_types.json', - ACL: [Object], - is_dir: false, - _version: 1, - title: 'fund_types.json', - publish_details: [], - update: [Function], - delete: [Function], - fetch: [Function], - replace: [Function], - publish: [Function] - }, - { - stackHeaders: [Object], - urlPath: 'assets/dummyPath', - uid: 'dummyUid', - content_type: 'application/pdf', - file_size: '667698', - tags: [], - filename: 'Release_Notes_Int.pdf', - url: 'https://assets.contentstack.io/v3/assets/blt5ab3970669dfa578/blt10af749494c7f6ab/5f0f12ac3a25531362dd6831/Release_Notes_Int.pdf', - ACL: [Object], - is_dir: false, - _version: 1, - title: 'Release_Notes_Int.pdf', - publish_details: [], - update: [Function], - delete: [Function], - fetch: [Function], - replace: [Function], - publish: [Function] - }, - { - stackHeaders: [Object], - urlPath: 'assets/dummyPath', - uid: 'dummyUid', - content_type: 'image/png', - file_size: '36713', - tags: [], - filename: 'Video_HF_Intro_1_Thumb.png', - url: 'https://images.contentstack.io/v3/assets/blt5ab3970669dfa578/blt2593f7a7a3ea4609/5f0f12aa7f758d1075a75174/Video_HF_Intro_1_Thumb.png', - ACL: [Object], - is_dir: false, - _version: 1, - title: 'Video_HF_Intro_1_Thumb.png', - publish_details: [], - update: [Function], - delete: [Function], - fetch: [Function], - replace: [Function], - publish: [Function] - }, - { - stackHeaders: [Object], - urlPath: 'assets/dummyPath', - uid: 'dummyUid', - content_type: 'image/jpeg', - file_size: '258029', - tags: [], - filename: '4.7ss.jpg', - url: 'https://images.contentstack.io/v3/assets/blt5ab3970669dfa578/bltfedcf80fd488b077/5f0f12a4b748cf0eaa60ca66/4.7ss.jpg', - ACL: [Object], - is_dir: false, - _version: 1, - title: '4.7ss.jpg', - publish_details: [], - update: [Function], - delete: [Function], - fetch: [Function], - replace: [Function], - publish: [Function] - }, - { - stackHeaders: [Object], - urlPath: 'assets/dummyPath', - uid: 'dummyUid', - content_type: 'image/svg+xml', - file_size: '19743', - tags: [], - filename: 'HCA_Logo_White_RGB.svg', - url: 'https://images.contentstack.io/v3/assets/blt5ab3970669dfa578/blt8f1dc0e19bcba390/5f0f12a2b0b27d11516f7a0c/HCA_Logo_White_RGB.svg', - ACL: [Object], - is_dir: false, - _version: 1, - title: 'HCA_Logo_White_RGB.svg', - publish_details: [], - update: [Function], - delete: [Function], - fetch: [Function], - replace: [Function], - publish: [Function] - }, - { - stackHeaders: [Object], - urlPath: 'assets/dummyPath', - uid: 'dummyUid', - content_type: 'application/pdf', - file_size: '498523', - tags: [], - filename: 'capital_appreciation_fund_fact_sheet.pdf', - url: 'https://assets.contentstack.io/v3/assets/blt5ab3970669dfa578/blt151af7a22becd6ad/5f0f129c3a25531362dd682d/capital_appreciation_fund_fact_sheet.pdf', - ACL: [Object], - is_dir: false, - _version: 1, - title: 'capital_appreciation_fund_fact_sheet.pdf', - publish_details: [], - update: [Function], - delete: [Function], - fetch: [Function], - replace: [Function], - publish: [Function] - }, - { - stackHeaders: [Object], - urlPath: 'assets/dummyPath', - uid: 'dummyUid', - content_type: 'image/png', - file_size: '14267', - tags: [], - filename: 'spiros_segalas.png', - url: 'https://images.contentstack.io/v3/assets/blt5ab3970669dfa578/blt50783c73329c4a8f/5f0f1299ae7b536e32664186/spiros_segalas.png', - ACL: [Object], - is_dir: false, - parent_uid: 'blt83137794c5a8335b', - _version: 1, - title: 'spiros_segalas.png', - publish_details: [], - update: [Function], - delete: [Function], - fetch: [Function], - replace: [Function], - publish: [Function] - }, - { - stackHeaders: [Object], - urlPath: 'assets/dummyPath', - uid: 'dummyUid', - content_type: 'application/pdf', - file_size: '667698', - tags: [], - filename: 'Release_Notes.pdf', - url: 'https://assets.contentstack.io/v3/assets/blt5ab3970669dfa578/bltdede6d9491b4ec8d/5f0f1292ae7b536e32664182/Release_Notes.pdf', - ACL: [Object], - is_dir: false, - _version: 1, - title: 'Release_Notes.pdf', - publish_details: [], - update: [Function], - delete: [Function], - fetch: [Function], - replace: [Function], - publish: [Function] - }, - { - stackHeaders: [Object], - urlPath: 'assets/dummyPath', - uid: 'dummyUid', - content_type: 'application/pdf', - file_size: '667698', - tags: [], - filename: 'Release_Notes.pdf', - url: 'https://assets.contentstack.io/v3/assets/blt5ab3970669dfa578/bltcfbd7d07295b9673/5f0f12905dc1b81146a0c8e9/Release_Notes.pdf', - ACL: [Object], - is_dir: false, - parent_uid: 'blt76b1fc444e926aee', - _version: 1, - title: 'Release_Notes.pdf', - publish_details: [], - update: [Function], - delete: [Function], - fetch: [Function], - replace: [Function], - publish: [Function] - }, - { - stackHeaders: [Object], - urlPath: 'assets/dummyPath', - uid: 'dummyUid', - content_type: 'application/json', - file_size: '2351', - tags: [], - filename: 'fund_types.json', - url: 'https://assets.contentstack.io/v3/assets/blt5ab3970669dfa578/blt5e6f778da792c175/5f0f12874c7c031175481e77/fund_types.json', - ACL: [Object], - is_dir: false, - _version: 1, - title: 'fund_types.json', - publish_details: [], - update: [Function], - delete: [Function], - fetch: [Function], - replace: [Function], - publish: [Function] - }, - { - stackHeaders: [Object], - urlPath: 'assets/dummyPath', - uid: 'dummyUid', - content_type: 'image/png', - file_size: '36713', - tags: [], - filename: 'Video_HF_Intro_1_Thumb.png', - url: 'https://images.contentstack.io/v3/assets/blt5ab3970669dfa578/blta64151c9bdf01bb3/5f0f127df4522b327eb1cab3/Video_HF_Intro_1_Thumb.png', - ACL: [Object], - is_dir: false, - _version: 1, - title: 'Video_HF_Intro_1_Thumb.png', - publish_details: [], - update: [Function], - delete: [Function], - fetch: [Function], - replace: [Function], - publish: [Function] - } - ], - count: 20 - } \ No newline at end of file diff --git a/packages/contentstack-export/test/unit/mock/assets.ts b/packages/contentstack-export/test/unit/mock/assets.ts new file mode 100644 index 0000000000..a6a62ce69e --- /dev/null +++ b/packages/contentstack-export/test/unit/mock/assets.ts @@ -0,0 +1,86 @@ +const mockData = { + findOneData: {}, + countData: { assets: 5 }, + findData: { + items: [ + { + stackHeaders: { api_key: 'jdgfhcbjx' }, + urlPath: '/assets/scd', + uid: 'hbjdjcy83kjxc', + content_type: 'image/jpeg', + file_size: '4278651', + tags: [], + filename: 'pexels-arthouse-studio-4534200.jpeg', + url: 'test-url-1', + _version: 1, + }, + { + stackHeaders: { api_key: 'jdgfhcbjx' }, + urlPath: '/assets/scd', + uid: 'hbjdjcy83kjxc', + content_type: 'image/jpeg', + file_size: '4278651', + tags: [], + filename: 'pexels-arthouse-studio-4534200.jpeg', + url: 'test-url-1', + _version: 2, + }, + { + stackHeaders: { api_key: 'jdgfhcbjx' }, + urlPath: '/assets/scd', + uid: 'hbjdjcy83kjxc', + content_type: 'image/jpeg', + file_size: '4278651', + tags: [], + filename: 'pexels-arthouse-studio-4534200.jpeg', + url: 'test-url-1', + _version: 3, + }, + { + stackHeaders: { api_key: '3242e' }, + urlPath: '/assets/scd', + uid: 'hbjdjcy83kjxc', + content_type: 'image/jpeg', + file_size: '4278651', + tags: [], + filename: 'pexels-arthouse-studio-4534200.jpeg', + url: 'test-url-2', + _version: 1, + }, + { + stackHeaders: { api_key: 'ert' }, + urlPath: '/assets/scd', + uid: 'hbjdjcy83kjxc', + content_type: 'image/jpeg', + file_size: '427fg435f8651', + tags: [], + filename: 'pexels-arthouse-studio-4534200.jpeg', + url: 'test-url-3', + _version: 1, + }, + ], + }, +}; + +const versionedAssets = [{ 'ABC-1': 2 }, { 'ABC-2': 3 }, { 'ABC-3': 4 }, { 'ABC-4': 2 }]; +const assetsMetaData = { + 'file-1': [ + { + uid: 'yhuj3', + url: 'https://test.io/assets/efsf/pexels-andy-vu-3244513.jpeg', + filename: 'pexels-andy-vu-3244513.jpeg', + }, + { + uid: '4234', + filename: 'pexels-jonas-kakaroto-736230.jpeg', + url: 'https://test.io/assets/efsf/pexels-jonas-kakaroto-736230.jpeg', + }, + { + uid: 'fwer', + url: 'https://test.io/assets/efsf/pexels-dominika-roseclay-1166869.jpeg', + filename: 'pexels-dominika-roseclay-1166869.jpeg', + }, + ], +}; + +export { mockData, versionedAssets, assetsMetaData }; diff --git a/packages/contentstack-export/test/unit/mock/content-types.js b/packages/contentstack-export/test/unit/mock/content-types.js deleted file mode 100644 index 32a39d8409..0000000000 --- a/packages/contentstack-export/test/unit/mock/content-types.js +++ /dev/null @@ -1,93 +0,0 @@ -module.exports = { - items: [ - { - stackHeaders: [Object], - urlPath: '/content_types/MajorFields_2', - created_at: '2020-07-15T08:53:04.194Z', - updated_at: '2020-07-15T14:30:35.528Z', - title: 'MajorFields_2', - uid: 'MajorFields_2', - _version: 3, - inbuilt_class: false, - schema: [Array], - last_activity: {}, - maintain_revisions: true, - description: '', - DEFAULT_ACL: [Object], - SYS_ACL: [Object], - options: [Object], - abilities: [Object], - update: [Function], - delete: [Function], - fetch: [Function], - entry: [Function] - }, - { - stackHeaders: [Object], - urlPath: '/content_types/ex_check', - created_at: '2020-07-15T08:53:10.958Z', - updated_at: '2020-07-15T14:30:35.531Z', - title: 'ex_check', - uid: 'ex_check', - _version: 3, - inbuilt_class: false, - schema: [Array], - last_activity: {}, - maintain_revisions: true, - description: '', - DEFAULT_ACL: [Object], - SYS_ACL: [Object], - options: [Object], - abilities: [Object], - update: [Function], - delete: [Function], - fetch: [Function], - entry: [Function] - }, - { - stackHeaders: [Object], - urlPath: '/content_types/group_check', - created_at: '2020-07-15T08:53:08.951Z', - updated_at: '2020-07-15T14:30:40.448Z', - title: 'group_check', - uid: 'group_check', - _version: 3, - inbuilt_class: false, - schema: [Array], - last_activity: {}, - maintain_revisions: true, - description: '', - DEFAULT_ACL: [Object], - SYS_ACL: [Object], - options: [Object], - abilities: [Object], - update: [Function], - delete: [Function], - fetch: [Function], - entry: [Function] - }, - { - stackHeaders: [Object], - urlPath: '/content_types/superman', - created_at: '2020-07-15T08:53:06.858Z', - updated_at: '2020-07-15T14:30:40.458Z', - title: 'superman', - uid: 'superman', - _version: 3, - inbuilt_class: false, - schema: [Array], - last_activity: {}, - maintain_revisions: true, - description: '', - DEFAULT_ACL: [Object], - SYS_ACL: [Object], - options: [Object], - abilities: [Object], - update: [Function], - delete: [Function], - fetch: [Function], - entry: [Function] - } - ], - count: 4 - } \ No newline at end of file diff --git a/packages/contentstack-export/test/unit/mock/entries.js b/packages/contentstack-export/test/unit/mock/entries.js deleted file mode 100644 index 09207d390c..0000000000 --- a/packages/contentstack-export/test/unit/mock/entries.js +++ /dev/null @@ -1,29 +0,0 @@ -module.exports = { - items: [ - { - stackHeaders: [Object], - content_type_uid: 'uid', - urlPath: 'content_types/uid/entries/dummyURL', - title: 'bsasxh', - url: '/shxjshxjks', - reference: [Array], - tags: [], - locale: 'en-us', - ACL: {}, - uid: 'dummyuid', - created_by: 'dummy', - updated_by: 'dummy', - created_at: '2020-07-15T08:53:16.001Z', - updated_at: '2020-07-15T08:53:20.171Z', - _version: 2, - _in_progress: false, - publish_details: [], - update: [Function], - delete: [Function], - fetch: [Function], - publish: [Function], - export: [Function] - } - ], - count: 1 - } \ No newline at end of file diff --git a/packages/contentstack-export/test/unit/mock/entryFetch.js b/packages/contentstack-export/test/unit/mock/entryFetch.js deleted file mode 100644 index 75e6cf4c40..0000000000 --- a/packages/contentstack-export/test/unit/mock/entryFetch.js +++ /dev/null @@ -1,24 +0,0 @@ -module.exports = { - stackHeaders: [Object], - content_type_uid: 'uid', - urlPath: 'content_types/uid/entries/blta4fc59475cc1d203', - title: 'bsasxh', - url: '/shxjshxjks', - reference: [Array], - tags: [], - locale: 'en-us', - ACL: {}, - uid: 'blta4fc59475cc1d203', - created_by: 'bltcd82b2c6bf913241', - updated_by: 'bltcd82b2c6bf913241', - created_at: '2020-07-15T08:53:16.001Z', - updated_at: '2020-07-15T08:53:20.171Z', - _version: 2, - _in_progress: false, - publish_details: [], - update: [Function], - delete: [Function], - fetch: [Function], - publish: [Function], - export: [Function] - } \ No newline at end of file diff --git a/packages/contentstack-export/test/unit/mock/environment.js b/packages/contentstack-export/test/unit/mock/environment.js deleted file mode 100644 index 453b99d327..0000000000 --- a/packages/contentstack-export/test/unit/mock/environment.js +++ /dev/null @@ -1,95 +0,0 @@ -module.exports = { - items: [ - { - stackHeaders: [Object], - urlPath: '/environments/blt0d9e179deb12cbf2', - deploy_content: false, - servers: [], - urls: [Array], - name: 'demo', - _version: 1, - uid: 'blt0d9e179deb12cbf2', - created_by: 'bltcd82b2c6bf913241', - updated_by: 'bltcd82b2c6bf913241', - created_at: '2020-07-05T18:16:03.597Z', - updated_at: '2020-07-05T18:16:03.597Z', - ACL: [], - update: [Function], - delete: [Function], - fetch: [Function], - }, - { - stackHeaders: [Object], - urlPath: '/environments/blt6d20cfd59cd417f8', - deploy_content: false, - servers: [], - urls: [Array], - name: 'uat', - _version: 1, - uid: 'blt6d20cfd59cd417f8', - created_by: 'bltcd82b2c6bf913241', - updated_by: 'bltcd82b2c6bf913241', - created_at: '2020-07-05T18:16:03.607Z', - updated_at: '2020-07-05T18:16:03.607Z', - ACL: [], - update: [Function], - delete: [Function], - fetch: [Function], - }, - { - stackHeaders: [Object], - urlPath: '/environments/blt4fa95a21c973cdce', - deploy_content: false, - servers: [], - urls: [Array], - name: 'staging', - _version: 1, - uid: 'blt4fa95a21c973cdce', - created_by: 'bltcd82b2c6bf913241', - updated_by: 'bltcd82b2c6bf913241', - created_at: '2020-07-05T18:16:03.608Z', - updated_at: '2020-07-05T18:16:03.608Z', - ACL: [], - update: [Function], - delete: [Function], - fetch: [Function], - }, - { - stackHeaders: [Object], - urlPath: '/environments/blt6675dc1a4fbf77db', - deploy_content: false, - servers: [], - urls: [Array], - name: 'qa', - _version: 1, - uid: 'blt6675dc1a4fbf77db', - created_by: 'bltcd82b2c6bf913241', - updated_by: 'bltcd82b2c6bf913241', - created_at: '2020-07-05T18:16:05.850Z', - updated_at: '2020-07-05T18:16:05.850Z', - ACL: [], - update: [Function], - delete: [Function], - fetch: [Function], - }, - { - stackHeaders: [Object], - urlPath: '/environments/blt2105db4c39522258', - deploy_content: false, - servers: [], - urls: [Array], - name: 'development', - _version: 1, - uid: 'blt2105db4c39522258', - created_by: 'bltcd82b2c6bf913241', - updated_by: 'bltcd82b2c6bf913241', - created_at: '2020-07-05T18:16:05.866Z', - updated_at: '2020-07-05T18:16:05.866Z', - ACL: [], - update: [Function], - delete: [Function], - fetch: [Function], - }, - ], - count: 5, -} \ No newline at end of file diff --git a/packages/contentstack-export/test/unit/mock/extensions.js b/packages/contentstack-export/test/unit/mock/extensions.js deleted file mode 100644 index 2728dac1f9..0000000000 --- a/packages/contentstack-export/test/unit/mock/extensions.js +++ /dev/null @@ -1,26 +0,0 @@ -module.exports = { - items: [ - { - stackHeaders: [Object], - urlPath: '/extensions/bltf32e02a72d59e1a4', - uid: 'bltf32e02a72d59e1a4', - created_at: '2020-07-09T20:02:42.798Z', - updated_at: '2020-07-09T20:02:42.798Z', - created_by: 'bltcd82b2c6bf913241', - updated_by: 'bltcd82b2c6bf913241', - tags: [], - ACL: [], - _version: 1, - title: 'test', - config: {}, - type: 'field', - data_type: 'text', - multiple: false, - src: 'https://www.google.com/search?', - update: [Function], - delete: [Function], - fetch: [Function] - } - ], - count: 1 -} \ No newline at end of file diff --git a/packages/contentstack-export/test/unit/mock/globalFields.js b/packages/contentstack-export/test/unit/mock/globalFields.js deleted file mode 100644 index e58b13c809..0000000000 --- a/packages/contentstack-export/test/unit/mock/globalFields.js +++ /dev/null @@ -1,73 +0,0 @@ -module.exports = { - items: [ - { - stackHeaders: [Object], - urlPath: '/global_fields/author', - created_at: '2020-07-15T08:53:04.202Z', - updated_at: '2020-07-15T08:53:04.202Z', - title: 'Author', - uid: 'author', - _version: 1, - inbuilt_class: false, - schema: [Array], - last_activity: {}, - maintain_revisions: true, - description: '', - update: [Function], - delete: [Function], - fetch: [Function] - }, - { - stackHeaders: [Object], - urlPath: '/global_fields/address', - created_at: '2020-07-15T08:53:04.206Z', - updated_at: '2020-07-15T08:53:04.206Z', - title: 'Address', - uid: 'address', - _version: 1, - inbuilt_class: false, - schema: [Array], - last_activity: {}, - maintain_revisions: true, - description: 'This contains address', - update: [Function], - delete: [Function], - fetch: [Function] - }, - { - stackHeaders: [Object], - urlPath: '/global_fields/connections', - created_at: '2020-07-15T08:53:04.211Z', - updated_at: '2020-07-15T08:53:04.211Z', - title: 'Connections', - uid: 'connections', - _version: 1, - inbuilt_class: false, - schema: [Array], - last_activity: {}, - maintain_revisions: true, - description: 'this GF is used for connections systems', - update: [Function], - delete: [Function], - fetch: [Function] - }, - { - stackHeaders: [Object], - urlPath: '/global_fields/links', - created_at: '2020-07-15T08:53:06.855Z', - updated_at: '2020-07-15T08:53:06.855Z', - title: 'Links', - uid: 'links', - _version: 1, - inbuilt_class: false, - schema: [Array], - last_activity: {}, - maintain_revisions: true, - description: '', - update: [Function], - delete: [Function], - fetch: [Function] - } - ], - count: 4 - } \ No newline at end of file diff --git a/packages/contentstack-export/test/unit/mock/locales.js b/packages/contentstack-export/test/unit/mock/locales.js deleted file mode 100644 index 8894400ad6..0000000000 --- a/packages/contentstack-export/test/unit/mock/locales.js +++ /dev/null @@ -1,49 +0,0 @@ -module.exports = { - items: [ - { - stackHeaders: [Object], - urlPath: '/locales/en-it', - code: 'en-it', - name: 'English - Italy', - uid: 'bltc7f2c9ce88bee9ec', - fallback_locale: 'en-cn', - update: [Function], - delete: [Function], - fetch: [Function] - }, - { - stackHeaders: [Object], - urlPath: '/locales/en-cn', - code: 'en-cn', - name: 'English - China', - uid: 'bltcc19bf9a588a0610', - fallback_locale: 'en-us', - update: [Function], - delete: [Function], - fetch: [Function] - }, - { - stackHeaders: [Object], - urlPath: '/locales/fr-fr', - code: 'fr-fr', - name: 'French - France', - uid: 'blt4d6d3a49fd586eaf', - fallback_locale: 'en-us', - update: [Function], - delete: [Function], - fetch: [Function] - }, - { - stackHeaders: [Object], - urlPath: '/locales/es-es', - code: 'es-es', - name: 'Spanish - Spain', - uid: 'bltf97bb7376bc573d7', - fallback_locale: 'fr-fr', - update: [Function], - delete: [Function], - fetch: [Function] - } - ], - count: 4 -} \ No newline at end of file diff --git a/packages/contentstack-export/test/unit/mock/webhook.js b/packages/contentstack-export/test/unit/mock/webhook.js deleted file mode 100644 index a3dbf413f1..0000000000 --- a/packages/contentstack-export/test/unit/mock/webhook.js +++ /dev/null @@ -1,25 +0,0 @@ -module.exports = { - items: [ - { - stackHeaders: undefined, - urlPath: '/webhooks/bltca2447dc1844cb88', - uid: 'bltca2447dc1844cb88', - channels: [Array], - disabled: false, - name: 'test', - destinations: [Array], - retry_policy: 'manual', - org_uid: 'blt2b4991176c6c1d25', - updated_by: 'bltcd82b2c6bf913241', - created_by: 'bltcd82b2c6bf913241', - created_at: '2020-07-20T10:42:26.317Z', - updated_at: '2020-07-20T10:42:26.317Z', - update: [Function], - delete: [Function], - fetch: [Function], - executions: [Function], - retry: [Function], - import: [Function] - } - ] - } \ No newline at end of file diff --git a/packages/contentstack-export/test/unit/mock/workflow.js b/packages/contentstack-export/test/unit/mock/workflow.js deleted file mode 100644 index 330c054eb7..0000000000 --- a/packages/contentstack-export/test/unit/mock/workflow.js +++ /dev/null @@ -1,74 +0,0 @@ -module.exports = { - items: [ - { - Dummyworkflow: { - name: 'test', - description: 'cdbhchcd', - uid: 'dummyUid', - org_uid: 'dummyOrgId', - api_key: 'dummyApiKey', - content_types: ['$all'], - workflow_stages: [ - { - name: 'test', - uid: 'dummyUid2', - color: '#2196f3', - description: 'dcbhdchdcvhd', - SYS_ACL: { - others: { - read: true, - write: true, - transit: false, - }, - users: { - uids: ['$all'], - read: true, - write: true, - transit: true, - }, - roles: { - uids: [], - read: true, - write: true, - transit: true, - }, - }, - next_available_stages: ['$all'], - }, - { - name: 'test2', - uid: 'bltd9fc966528b4b72f', - color: '#ec407a', - description: 'testdnckjdchjkdchdc', - SYS_ACL: { - others: { - read: true, - write: true, - transit: false, - }, - users: { - uids: ['$all'], - read: true, - write: true, - transit: true, - }, - roles: { - uids: [], - read: true, - write: true, - transit: true, - }, - }, - next_available_stages: ['$all'], - }, - ], - admin_users: { - users: ['bltcd82b2c6bf913241'], - roles: ['blt9f8e79c6269e5a14'], - }, - enabled: true, - deleted_at: false, - }, - }, - ], -}; diff --git a/packages/contentstack-export/tsconfig.json b/packages/contentstack-export/tsconfig.json new file mode 100644 index 0000000000..5136623392 --- /dev/null +++ b/packages/contentstack-export/tsconfig.json @@ -0,0 +1,31 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "declaration": true, + "importHelpers": true, + "module": "commonjs", + "outDir": "lib", + "rootDir": "src", + "strict": false, + "target": "es2017", + "allowJs": true, + "skipLibCheck": true, + "sourceMap": false, + "esModuleInterop": true, + "noImplicitAny": true, + "lib": [ + "ES2019", + "es2020.promise" + ], + "strictPropertyInitialization": false, + "forceConsistentCasingInFileNames": true + }, + "include": [ + "src/**/*", + "types/*" + ], + "exclude": [ + "node_modules", + "lib" + ] +} \ No newline at end of file diff --git a/packages/contentstack-export/types/index.d.ts b/packages/contentstack-export/types/index.d.ts new file mode 100644 index 0000000000..68a9e13535 --- /dev/null +++ b/packages/contentstack-export/types/index.d.ts @@ -0,0 +1 @@ +declare module 'big-json'; diff --git a/packages/contentstack-import/.editorconfig b/packages/contentstack-import/.editorconfig deleted file mode 100644 index beffa3084e..0000000000 --- a/packages/contentstack-import/.editorconfig +++ /dev/null @@ -1,11 +0,0 @@ -root = true - -[*] -indent_style = space -indent_size = 2 -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true - -[*.md] -trim_trailing_whitespace = false diff --git a/packages/contentstack-import/.eslintignore b/packages/contentstack-import/.eslintignore new file mode 100644 index 0000000000..72d230bac9 --- /dev/null +++ b/packages/contentstack-import/.eslintignore @@ -0,0 +1,2 @@ +# Build files +./lib \ No newline at end of file diff --git a/packages/contentstack-import/.eslintrc b/packages/contentstack-import/.eslintrc index e56091ba65..55a92e2b63 100644 --- a/packages/contentstack-import/.eslintrc +++ b/packages/contentstack-import/.eslintrc @@ -1,3 +1,56 @@ { - "extends": "oclif" -} + "env": { + "node": true + }, + "parser": "@typescript-eslint/parser", + "parserOptions": { + "project": "tsconfig.json", + "sourceType": "module" + }, + "extends": [ + "oclif-typescript", + "plugin:@typescript-eslint/recommended" + ], + "rules": { + "@typescript-eslint/no-unused-vars": [ + "error", + { + "args": "none" + } + ], + "@typescript-eslint/prefer-namespace-keyword": "error", + "@typescript-eslint/quotes": [ + "error", + "single", + { + "avoidEscape": true, + "allowTemplateLiterals": true + } + ], + "semi": "off", + "@typescript-eslint/type-annotation-spacing": "error", + "@typescript-eslint/no-redeclare": "off", + "eqeqeq": [ + "error", + "smart" + ], + "id-match": "error", + "no-eval": "error", + "no-var": "error", + "quotes": "off", + "indent": "off", + "camelcase": "off", + "comma-dangle": "off", + "arrow-parens": "off", + "operator-linebreak": "off", + "object-curly-spacing": "off", + "node/no-missing-import": "off", + "lines-between-class-members": "off", + "padding-line-between-statements": "off", + "@typescript-eslint/ban-ts-ignore": "off", + "unicorn/no-abusive-eslint-disable": "off", + "@typescript-eslint/no-explicit-any": "off", + "unicorn/consistent-function-scoping": "off", + "@typescript-eslint/no-use-before-define": "off" + } +} \ No newline at end of file diff --git a/packages/contentstack-import/.gitignore b/packages/contentstack-import/.gitignore index 22f3a9d4d3..91669fe532 100644 --- a/packages/contentstack-import/.gitignore +++ b/packages/contentstack-import/.gitignore @@ -2,12 +2,13 @@ *-error.log /.nyc_output /dist +/lib /tmp /yarn.lock node_modules -logs +.DS_Store coverage .vscode/ /lib -.env \ No newline at end of file +.env diff --git a/packages/contentstack-import/.mocharc.json b/packages/contentstack-import/.mocharc.json new file mode 100644 index 0000000000..18fcb173fa --- /dev/null +++ b/packages/contentstack-import/.mocharc.json @@ -0,0 +1,8 @@ +{ + "require": ["test/helpers/init.js", "ts-node/register", "source-map-support/register"], + "watch-extensions": [ + "ts" + ], + "recursive": true, + "timeout": 5000 +} \ No newline at end of file diff --git a/packages/contentstack-import/.nycrc.json b/packages/contentstack-import/.nycrc.json new file mode 100644 index 0000000000..ec0b32b29f --- /dev/null +++ b/packages/contentstack-import/.nycrc.json @@ -0,0 +1,5 @@ +{ + "inlcude": [ + "lib/**/*.js" + ] +} \ No newline at end of file diff --git a/packages/contentstack-import/.prettierrc b/packages/contentstack-import/.prettierrc new file mode 100644 index 0000000000..ba93fc77d9 --- /dev/null +++ b/packages/contentstack-import/.prettierrc @@ -0,0 +1,7 @@ +{ + "semi": true, + "trailingComma": "all", + "singleQuote": true, + "printWidth": 120, + "tabWidth": 2 +} \ No newline at end of file diff --git a/packages/contentstack-import/README.md b/packages/contentstack-import/README.md index 76b3a28fca..20b53af987 100644 --- a/packages/contentstack-import/README.md +++ b/packages/contentstack-import/README.md @@ -47,7 +47,7 @@ $ npm install -g @contentstack/cli-cm-import $ csdx COMMAND running command... $ csdx (--version) -@contentstack/cli-cm-import/1.5.10 darwin-arm64 node-v18.16.0 +@contentstack/cli-cm-import/1.8.2 darwin-arm64 node-v20.3.1 $ csdx --help [COMMAND] USAGE $ csdx COMMAND @@ -63,7 +63,7 @@ USAGE ## `csdx cm:stacks:import [-c ] [-k ] [-d ] [-a ] [--module ] [--backup-dir ] [--branch ] [--import-webhook-status disable|current]` -Import script for importing the content into the new stack +Import content from a stack ``` USAGE @@ -83,11 +83,7 @@ FLAGS DESCRIPTION - Import script for importing the content into the new stack - ... - Once you export content from the source stack, import it to your destination stack by using the cm:stacks:import - command. - + Import content from a stack ALIASES $ csdx cm:import @@ -112,7 +108,7 @@ EXAMPLES ## `csdx cm:stacks:import [-c ] [-k ] [-d ] [-a ] [--module ] [--backup-dir ] [--branch ] [--import-webhook-status disable|current]` -Import script for importing the content into the new stack +Import content from a stack ``` USAGE @@ -132,11 +128,7 @@ FLAGS DESCRIPTION - Import script for importing the content into the new stack - ... - Once you export content from the source stack, import it to your destination stack by using the cm:stacks:import - command. - + Import content from a stack ALIASES $ csdx cm:import @@ -158,9 +150,6 @@ EXAMPLES $ csdx cm:stacks:import --branch --yes ``` -_Mangement token and config file: [example_config/management_config.json](https://github.com/contentstack/cli/blob/main/packages/contentstack-import/example_config/management_config.json)_ - -_Auth token and config file: [example_config/auth_config.json](https://github.com/contentstack/cli/blob/main/packages/contentstack-import/example_config/auth_config.json)_ -_See code: [src/commands/cm/stacks/import.js](https://github.com/contentstack/cli/blob/main/packages/contentstack-import/src/commands/cm/stacks/import.js)_ +_See code: [src/commands/cm/stacks/import.ts](https://github.com/contentstack/cli/blob/main/packages/contentstack-import/src/commands/cm/stacks/import.ts)_ diff --git a/packages/contentstack-import/bin/dev b/packages/contentstack-import/bin/dev new file mode 100644 index 0000000000..02b50d62ab --- /dev/null +++ b/packages/contentstack-import/bin/dev @@ -0,0 +1,17 @@ +#!/usr/bin/env node + +const oclif = require('@oclif/core'); + +const path = require('path'); +const project = path.join(__dirname, '..', 'tsconfig.json'); + +// In dev mode -> use ts-node and dev plugins +process.env.NODE_ENV = 'development'; + +require('ts-node').register({ project }); + +// In dev mode, always show stack traces +oclif.settings.debug = true; + +// Start the CLI +oclif.run().then(oclif.flush).catch(oclif.Errors.handle); diff --git a/packages/contentstack-import/bin/dev.cmd b/packages/contentstack-import/bin/dev.cmd new file mode 100644 index 0000000000..077b57ae75 --- /dev/null +++ b/packages/contentstack-import/bin/dev.cmd @@ -0,0 +1,3 @@ +@echo off + +node "%~dp0\dev" %* \ No newline at end of file diff --git a/packages/contentstack-import/example_config/auth_config.json b/packages/contentstack-import/example_config/auth_config.json index 8a595ff0d3..fb329ee1f2 100644 --- a/packages/contentstack-import/example_config/auth_config.json +++ b/packages/contentstack-import/example_config/auth_config.json @@ -12,5 +12,6 @@ "fetchConcurrency": 5, "writeConcurrency": 5, "securedAssets":false, - "developerHubBaseUrl": "" + "developerHubBaseUrl": "", + "createBackupDir": "./temp" } diff --git a/packages/contentstack-import/example_config/index.json b/packages/contentstack-import/example_config/index.json deleted file mode 100644 index c2410a8614..0000000000 --- a/packages/contentstack-import/example_config/index.json +++ /dev/null @@ -1,7 +0,0 @@ -{"master_locale": { - "name": "English - United States", - "code": "en-us" - }, - "target_stack": "dummy_value", - "data": "Path" -} \ No newline at end of file diff --git a/packages/contentstack-import/messages/index.json b/packages/contentstack-import/messages/index.json index 48aaa298a9..9e26dfeeb6 100644 --- a/packages/contentstack-import/messages/index.json +++ b/packages/contentstack-import/messages/index.json @@ -1,7 +1 @@ -{ - "promptMessageList": { - "promptMasterLocale": "Provide the master locale of the destination stack", - "promptTargetStack": "Provide the API Key of the destination stack", - "promptPathStoredData": "Provide the path of the stored content" - } -} \ No newline at end of file +{} \ No newline at end of file diff --git a/packages/contentstack-import/package.json b/packages/contentstack-import/package.json index d0fa8c020a..0712d83cdc 100644 --- a/packages/contentstack-import/package.json +++ b/packages/contentstack-import/package.json @@ -1,42 +1,77 @@ { "name": "@contentstack/cli-cm-import", "description": "Contentstack CLI plugin to import content into stack", - "version": "1.5.11", + "version": "1.8.2", "author": "Contentstack", "bugs": "https://github.com/contentstack/cli/issues", "dependencies": { - "@contentstack/cli-command": "^1.2.9", - "@contentstack/cli-utilities": "^1.4.5", + "@contentstack/cli-command": "~1.2.11", + "@contentstack/cli-utilities": "~1.5.1", + "@contentstack/management": "~1.10.0", "@oclif/config": "^1.18.3", + "@oclif/core": "^2.9.3", "big-json": "^3.2.0", "bluebird": "^3.7.2", "chalk": "^4.1.2", "debug": "^4.1.0", - "fs-extra": "^11.1.1", "lodash": "^4.17.20", "marked": "^4.0.17", + "merge": "^2.1.1", "mkdirp": "^1.0.4", + "ncp": "^2.0.0", "promise-limit": "^2.7.0", + "tslib": "^2.4.1", "winston": "^3.7.2" }, "devDependencies": { "@oclif/test": "^1.2.6", + "@types/bluebird": "^3.5.38", + "@types/chai": "^4.2.18", + "@types/mkdirp": "^1.0.2", + "@types/mocha": "^8.2.2", + "@types/ncp": "^2.0.5", + "@types/node": "^14.14.32", + "@types/sinon": "^10.0.2", + "@types/tar": "^4.0.3", + "@typescript-eslint/eslint-plugin": "^5.48.2", "chai": "^4.2.0", "eslint": "^8.18.0", "eslint-config-oclif": "^4.0.0", "globby": "^10.0.2", "mocha": "^10.0.0", "nyc": "^15.1.0", - "oclif": "^3.8.1" + "oclif": "^3.8.1", + "rimraf": "^2.7.1", + "sinon": "^11.1.1", + "tmp": "^0.2.1", + "ts-node": "^10.9.1", + "typescript": "^4.9.3" + }, + "scripts": { + "build": "npm run clean && npm run compile", + "clean": "rm -rf ./lib ./node_modules tsconfig.build.tsbuildinfo", + "compile": "tsc -b tsconfig.json", + "postpack": "rm -f oclif.manifest.json", + "prepack": "pnpm compile && oclif manifest && oclif readme", + "version": "oclif readme && git add README.md", + "test:report": "tsc -p test && nyc --reporter=lcov --extension .ts mocha --forbid-only \"test/**/*.test.ts\"", + "pretest": "tsc -p test", + "test": "nyc --extension .ts mocha --forbid-only \"test/**/*.test.ts\"", + "posttest": "npm run lint", + "lint": "eslint src/**/*.ts", + "format": "eslint src/**/*.ts --fix", + "test:integration": "mocha --forbid-only \"test/run.test.js\" --integration-test --timeout 60000", + "test:unit": "mocha --forbid-only \"test/unit/*.test.ts\"" }, "engines": { "node": ">=14.0.0" }, "files": [ + "/bin", + "/lib", + "/messages", "/npm-shrinkwrap.json", - "/oclif.manifest.json", - "/src", - "/messages" + "/oclif.manifest.json" ], "homepage": "https://github.com/contentstack/cli", "keywords": [ @@ -44,19 +79,10 @@ "cli", "plugin" ], - "scripts": { - "pack": "npm pack && mv *.tgz ../../build", - "postpack": "rm -f oclif.manifest.json", - "prepack": "oclif manifest && oclif readme", - "test": "nyc mocha --forbid-only \"test/**/*.test.js\"", - "version": "oclif readme && git add README.md", - "test:integration": "mocha --forbid-only \"test/run.test.js\" --integration-test --timeout 60000", - "clean": "rm -rf ./node_modules tsconfig.build.tsbuildinfo" - }, - "main": "./src/commands/cm/stacks/import.js", + "main": "./lib/commands/cm/stacks/import.js", "license": "MIT", "oclif": { - "commands": "./src/commands", + "commands": "./lib/commands", "bin": "csdx", "repositoryPrefix": "<%- repo %>/blob/main/packages/contentstack-import/<%- commandPath %>" }, @@ -66,8 +92,8 @@ }, "shortCommandName": { "cm:stacks:import": "IMPRT", - "cm:import": "O-IMPRT" + "cm:import": "IMPRT" } }, "repository": "https://github.com/contentstack/cli" -} +} \ No newline at end of file diff --git a/packages/contentstack-import/src/app.js b/packages/contentstack-import/src/app.js deleted file mode 100755 index e32d3b0408..0000000000 --- a/packages/contentstack-import/src/app.js +++ /dev/null @@ -1,217 +0,0 @@ -/*! - * Contentstack Import - * Copyright (c) 2019 Contentstack LLC - * MIT Licensed - */ - -const fs = require('fs'); -const os = require('os'); -const path = require('path'); -const chalk = require('chalk'); -const { copy, copySync, removeSync } = require('fs-extra'); -const util = require('./lib/util/index'); -const login = require('./lib/util/login'); -const { addlogs } = require('./lib/util/log'); -const { managementSDKClient, isAuthenticated } = require('@contentstack/cli-utilities'); -const { camelCase } = require('lodash') - -exports.initial = (configData) => { - return new Promise(async (resolve, reject) => { - const config = util.initialization(configData); - config.oldPath = config.data; - const APIClient = await managementSDKClient(config); - const stackAPIClient = APIClient.stack({ api_key: config.target_stack, management_token: config.management_token }); - - if (configData.branchName) { - await validateIfBranchExist(stackAPIClient, configData, configData.branchName).catch(() => { - process.exit(); - }); - } - - const backupAndImportData = async (APIClient, stackAPIClient) => { - if (fs.existsSync(config.data)) { - let migrationBackupDirPath = path.join(process.cwd(), '_backup_' + Math.floor(Math.random() * 1000)); - return createBackup(migrationBackupDirPath, config) - .then((basePath) => { - config.data = basePath; - return util.sanitizeStack(config); - }) - .then(() => { - let importRes; - const types = config.modules.types; - - if (config.moduleName) { - importRes = singleImport(APIClient, stackAPIClient, config.moduleName, types, config); - } else { - importRes = allImport(APIClient, stackAPIClient, config, types); - } - - importRes.then(resolve).catch(reject); - }) - .catch((error) => { - addlogs(config, `Failed to import contents. ${util.formatError(error)}`, 'error'); - reject(error); - process.exit(1); - }); - } else { - let filename = path.basename(config.data); - addlogs(config, chalk.red(`'${filename}' Folder does not exist'`), 'error'); - } - }; - - if (config) { - if (config.management_token || config.isAuthenticated) { - await backupAndImportData(APIClient, stackAPIClient); - } else if ((config.email && config.password) || isAuthenticated()) { - login(config).then(backupAndImportData(APIClient, stackAPIClient)).catch(reject); - } else if (config.email && config.password) { - login(config) - .then(backupAndImportData.apply(null, [APIClient, stackAPIClient])) - .catch(reject); - } else { - reject('Kindly login or provide management_token'); - } - } - }); -}; - -let singleImport = async (APIClient, stackAPIClient, moduleName, types, config) => { - try { - if (types.indexOf(moduleName) > -1) { - if (!config.master_locale) { - try { - let masterLocalResponse = await util.masterLocalDetails(stackAPIClient); - let master_locale = { code: masterLocalResponse.code }; - config['master_locale'] = master_locale; - } catch (error) { - addlogs(config, `Failed to get master locale detail from the stack ${util.formatError(error)}`, 'error'); - } - } - let ImportModule = require('./lib/import/' + moduleName); - const importResponse = await new ImportModule(config, stackAPIClient, APIClient).start(); - if (moduleName === 'content-types') { - let ctPath = path.resolve(config.data, config.modules.content_types.dirName); - let fieldPath = path.join(ctPath + '/field_rules_uid.json'); - if (fieldPath) { - await util.field_rules_update(config, ctPath); - } - } - if (!(importResponse && importResponse.empty)) { - addlogs(config, `Module '${moduleName}' imported successfully!`, 'success'); - } - addlogs(config, 'The log for this is stored at ' + path.join(config.oldPath, 'logs', 'import'), 'success'); - return true; - } else { - addlogs(config, 'Please provide valid module name.', 'error'); - } - } catch (error) { - addlogs(config, `Failed to migrate '${moduleName}'`, 'error'); - addlogs(config, util.formatError(error), 'error'); - addlogs(config, `The log for this is stored at '${path.join(config.oldPath, 'logs', 'import')}'`, 'error'); - } -}; - -let allImport = async (APIClient, stackAPIClient, config, types) => { - try { - for (let i = 0; i < types.length; i++) { - let type = types[i]; - if (i === 0 && !config.master_locale) { - let masterLocalResponse = await util.masterLocalDetails(stackAPIClient); - let master_locale = { code: masterLocalResponse.code }; - config['master_locale'] = master_locale; - } - let ImportModule = require('./lib/import/' + type); - await new ImportModule(config, stackAPIClient, APIClient).start(config); - } - if (config.target_stack && config.source_stack) { - addlogs( - config, - chalk.green( - 'The data of the ' + - (config.sourceStackName || config.source_stack) + - ' stack has been imported into ' + - (config.destinationStackName || config.target_stack) + - ' stack successfully!', - ), - 'success', - ); - addlogs(config, 'The log for this is stored at ' + path.join(config.data, 'logs', 'import'), 'success'); - } else { - addlogs( - config, - chalk.green( - 'Data has been imported to stack ' + (config.destinationStackName || config.target_stack) + ' succesfully!', - ), - 'success', - ); - addlogs(config, 'The log for this is stored at ' + path.join(config.oldPath, 'logs', 'import'), 'success'); - } - return true; - } catch (error) { - addlogs( - config, - `Failed to migrate stack '${(config.destinationStackName || config.target_stack)}'. Please check error logs for more info`, - 'error', - ); - addlogs(config, util.formatError(error), 'error'); - addlogs(config, `The log for this is stored at '${path.join(config.oldPath, 'logs', 'import')}'`, 'error'); - } -}; - -const createBackup = (backupDirPath, config) => { - return new Promise((resolve, reject) => { - if (config.hasOwnProperty('useBackedupDir') && fs.existsSync(config.useBackedupDir)) { - return resolve(config.useBackedupDir); - } - - if (path.isAbsolute(config.data)) { - copy(config.data, backupDirPath, (error) => { - if (error) { - return reject(error); - } - return resolve(backupDirPath); - }); - } else { - //handle mac error :- Cannot copy to a subdirectory of itself - if (config.data === "." || config.data === "./") { - const tempDestination = `${os.platform() === 'darwin' ? '/private/tmp' : '/tmp'}/${camelCase(backupDirPath)}`; - copySync(config.data, tempDestination); - copySync(tempDestination, backupDirPath); - removeSync(tempDestination); - return resolve(backupDirPath); - } else { - copy(config.data, backupDirPath,(error) => { - if (error) { - return reject(error); - } - return resolve(backupDirPath); - }); - } - } - }); -}; - -const validateIfBranchExist = async (stackAPIClient, config, branch) => { - return new Promise(async (resolve, reject) => { - try { - const data = await stackAPIClient - .branch(branch) - .fetch() - .catch((_err) => {}); - if (data && typeof data === 'object') { - if (data.error_message) { - addlogs(config, data.error_message, 'error'); - addlogs(config, `No branch found with the name '${branch}`, 'error'); - reject({ message: 'No branch found with the name ' + branch, error: error_message }); - } else { - resolve(data); - } - } else { - reject({ message: 'No branch found with the name ' + branch, error: {} }); - } - } catch (error) { - addlogs(config, `No branch found with the name '${branch}`, 'error'); - reject({ message: 'No branch found with the name ' + branch, error }); - } - }); -}; diff --git a/packages/contentstack-import/src/commands/cm/stacks/import.js b/packages/contentstack-import/src/commands/cm/stacks/import.js deleted file mode 100644 index 575dc0e16a..0000000000 --- a/packages/contentstack-import/src/commands/cm/stacks/import.js +++ /dev/null @@ -1,161 +0,0 @@ -const _ = require('lodash'); -const defaultConfig = require('../../../config/default'); -const { Command } = require('@contentstack/cli-command'); -const { flags, printFlagDeprecation, isAuthenticated, cliux } = require('@contentstack/cli-utilities'); -const { - configWithMToken, - parameterWithMToken, - withoutParameterMToken, - configWithAuthToken, - parametersWithAuthToken, - withoutParametersWithAuthToken, -} = require('../../../lib/util/import-flags'); - -class ImportCommand extends Command { - async run() { - let self = this; - const { flags: importCommandFlags } = await self.parse(ImportCommand); - const extConfig = importCommandFlags.config; - let targetStack = importCommandFlags['stack-uid'] || importCommandFlags['stack-api-key']; - const data = importCommandFlags.data || importCommandFlags['data-dir']; - const moduleName = importCommandFlags.module; - const backupdir = importCommandFlags['backup-dir']; - const alias = importCommandFlags['alias'] || importCommandFlags['management-token-alias']; - importCommandFlags.branchName = importCommandFlags.branch; - importCommandFlags.importWebhookStatus = importCommandFlags['import-webhook-status']; - delete importCommandFlags.branch; - delete importCommandFlags['import-webhook-status']; - let host = self.cmaHost; - importCommandFlags['isAuthenticated'] = isAuthenticated(); - - return new Promise((resolve, reject) => { - if (data) { - defaultConfig.data = data; - } - - defaultConfig.forceStopMarketplaceAppsPrompt = importCommandFlags.yes; - - if (alias) { - let managementTokens = self.getToken(alias); - - if (managementTokens) { - let result; - - if ((extConfig && isAuthenticated()) || alias) { - result = configWithMToken(extConfig, managementTokens, moduleName, host, backupdir, importCommandFlags); - } else if (data) { - result = parameterWithMToken(managementTokens, data, moduleName, host, backupdir, importCommandFlags); - } else { - result = withoutParameterMToken(managementTokens, moduleName, host, backupdir, importCommandFlags); - } - - result.then(resolve).catch(reject); - } else { - cliux.print(`error: management Token is not present please add managment token first`, {color: 'red'}); - } - } else if (isAuthenticated()) { - let result; - - if (extConfig) { - result = configWithAuthToken(extConfig, moduleName, host, backupdir, importCommandFlags); - } else if (targetStack && data) { - result = parametersWithAuthToken(targetStack, data, moduleName, host, backupdir, importCommandFlags); - } else { - result = withoutParametersWithAuthToken(moduleName, host, backupdir, importCommandFlags); - } - - result.then(resolve).catch(reject); - } else { - cliux.print(`error: Login or provide the alias for management token`, {color: 'red'}); - } - }); - } -} - -ImportCommand.description = `Import script for importing the content into the new stack -... -Once you export content from the source stack, import it to your destination stack by using the cm:stacks:import command. -`; -ImportCommand.examples = [ - `csdx cm:stacks:import --stack-api-key --data-dir `, - `csdx cm:stacks:import --config `, - `csdx cm:stacks:import --module `, - `csdx cm:stacks:import --module --backup-dir `, - `csdx cm:stacks:import --alias `, - `csdx cm:stacks:import --alias --data-dir `, - `csdx cm:stacks:import --alias --config `, - `csdx cm:stacks:import --branch --yes`, -]; -ImportCommand.flags = { - config: flags.string({ - char: 'c', - description: '[optional] path of config file', - }), - 'stack-uid': flags.string({ - char: 's', - description: 'API key of the target stack', - hidden: true, - parse: printFlagDeprecation(['-s', '--stack-uid'], ['-k', '--stack-api-key']), - }), - 'stack-api-key': flags.string({ - char: 'k', - description: 'API key of the target stack', - }), - data: flags.string({ - description: 'path and location where data is stored', - hidden: true, - parse: printFlagDeprecation(['--data'], ['--data-dir']), - }), - 'data-dir': flags.string({ - char: 'd', - description: 'path and location where data is stored', - }), - alias: flags.string({ - char: 'a', - description: 'alias of the management token', - }), - 'management-token-alias': flags.string({ - description: 'alias of the management token', - hidden: true, - parse: printFlagDeprecation(['--management-token-alias'], ['-a', '--alias']), - }), - 'auth-token': flags.boolean({ - char: 'A', - description: 'to use auth token', - hidden: true, - parse: printFlagDeprecation(['-A', '--auth-token']), - }), - module: flags.string({ - char: 'm', - description: '[optional] specific module name', - parse: printFlagDeprecation(['-m'], ['--module']), - }), - 'backup-dir': flags.string({ - char: 'b', - description: '[optional] backup directory name when using specific module', - parse: printFlagDeprecation(['-b'], ['--backup-dir']), - }), - branch: flags.string({ - char: 'B', - description: '[optional] branch name', - parse: printFlagDeprecation(['-B'], ['--branch']), - }), - 'import-webhook-status': flags.string({ - description: '[optional] Webhook state', - options: ['disable', 'current'], - required: false, - default: 'disable', - }), - yes: flags.boolean({ - char: 'y', - required: false, - description: '[optional] Override marketplace prompts', - }), -}; - -ImportCommand.aliases = ['cm:import']; - -ImportCommand.usage = - 'cm:stacks:import [-c ] [-k ] [-d ] [-a ] [--module ] [--backup-dir ] [--branch ] [--import-webhook-status disable|current]'; - -module.exports = ImportCommand; diff --git a/packages/contentstack-import/src/commands/cm/stacks/import.ts b/packages/contentstack-import/src/commands/cm/stacks/import.ts new file mode 100644 index 0000000000..d3cc5650ed --- /dev/null +++ b/packages/contentstack-import/src/commands/cm/stacks/import.ts @@ -0,0 +1,127 @@ +import path from 'node:path'; +import { Command } from '@contentstack/cli-command'; +import { + messageHandler, + printFlagDeprecation, + managementSDKClient, + flags, + FlagInput, + ContentstackClient, +} from '@contentstack/cli-utilities'; +import { ModuleImporter } from '../../../import'; +import { setupImportConfig, formatError, log } from '../../../utils'; +import { ImportConfig } from '../../../types'; + +export default class ImportCommand extends Command { + static description = messageHandler.parse('Import content from a stack'); + + static examples: string[] = [ + `csdx cm:stacks:import --stack-api-key --data-dir `, + `csdx cm:stacks:import --config `, + `csdx cm:stacks:import --module `, + `csdx cm:stacks:import --module --backup-dir `, + `csdx cm:stacks:import --alias `, + `csdx cm:stacks:import --alias --data-dir `, + `csdx cm:stacks:import --alias --config `, + `csdx cm:stacks:import --branch --yes`, + ]; + + static flags: FlagInput = { + config: flags.string({ + char: 'c', + description: '[optional] path of config file', + }), + 'stack-uid': flags.string({ + char: 's', + description: 'API key of the target stack', + hidden: true, + parse: printFlagDeprecation(['-s', '--stack-uid'], ['-k', '--stack-api-key']), + }), + 'stack-api-key': flags.string({ + char: 'k', + description: 'API key of the target stack', + }), + data: flags.string({ + description: 'path and location where data is stored', + hidden: true, + parse: printFlagDeprecation(['--data'], ['--data-dir']), + }), + 'data-dir': flags.string({ + char: 'd', + description: 'path and location where data is stored', + }), + alias: flags.string({ + char: 'a', + description: 'alias of the management token', + }), + 'management-token-alias': flags.string({ + description: 'alias of the management token', + hidden: true, + parse: printFlagDeprecation(['--management-token-alias'], ['-a', '--alias']), + }), + 'auth-token': flags.boolean({ + char: 'A', + description: 'to use auth token', + hidden: true, + parse: printFlagDeprecation(['-A', '--auth-token']), + }), + module: flags.string({ + char: 'm', + description: '[optional] specific module name', + parse: printFlagDeprecation(['-m'], ['--module']), + }), + 'backup-dir': flags.string({ + char: 'b', + description: '[optional] backup directory name when using specific module', + parse: printFlagDeprecation(['-b'], ['--backup-dir']), + }), + branch: flags.string({ + char: 'B', + description: '[optional] branch name', + parse: printFlagDeprecation(['-B'], ['--branch']), + }), + 'import-webhook-status': flags.string({ + description: '[optional] Webhook state', + options: ['disable', 'current'], + required: false, + default: 'disable', + }), + yes: flags.boolean({ + char: 'y', + required: false, + description: '[optional] Override marketplace prompts', + }), + }; + + static aliases: string[] = ['cm:import']; + + static usage: string = + 'cm:stacks:import [-c ] [-k ] [-d ] [-a ] [--module ] [--backup-dir ] [--branch ] [--import-webhook-status disable|current]'; + + async run(): Promise { + // setup import config + // initialize the importer + // start import + let contentDir: string; + try { + const { flags } = await this.parse(ImportCommand); + let importConfig = await setupImportConfig(flags); + // Note setting host to create cma client + importConfig.host = this.cmaHost; + contentDir = importConfig.contentDir; + const managementAPIClient: ContentstackClient = await managementSDKClient(importConfig); + const moduleImporter = new ModuleImporter(managementAPIClient, importConfig); + await moduleImporter.start(); + log(importConfig, `The content has been imported to the stack ${importConfig.apiKey} successfully!`, 'success'); + } catch (error) { + log({ data: contentDir } as ImportConfig, `Failed to import stack content - ${formatError(error)}`, 'error'); + log( + { data: contentDir } as ImportConfig, + `The log has been stored at ${ + { data: contentDir } ? path.join(contentDir || __dirname, 'logs', 'import') : path.join(__dirname, 'logs') + }`, + 'info', + ); + } + } +} diff --git a/packages/contentstack-import/src/config/default.js b/packages/contentstack-import/src/config/index.ts similarity index 84% rename from packages/contentstack-import/src/config/default.js rename to packages/contentstack-import/src/config/index.ts index cbdc9544ef..63fb403e5f 100644 --- a/packages/contentstack-import/src/config/default.js +++ b/packages/contentstack-import/src/config/index.ts @@ -1,4 +1,6 @@ -module.exports = { +import { DefaultConfig } from '../types'; + +const config: DefaultConfig = { versioning: false, // use below hosts for eu region // host:'https://eu-api.contentstack.com/v3', @@ -19,6 +21,7 @@ module.exports = { 'https://stag-api.csnonprod.com': 'https://stag-developerhub-api.csnonprod.com', }, modules: { + apiConcurrency: 5, types: [ 'locales', 'environments', @@ -59,6 +62,7 @@ module.exports = { extensions: { dirName: 'extensions', fileName: 'extensions.json', + validKeys: ['data_type', 'srcdoc', 'title', 'type', 'mutiple', 'config'], }, webhooks: { dirName: 'webhooks', @@ -75,6 +79,20 @@ module.exports = { invalidKeys: ['stackHeaders', 'urlPath', 'created_at', 'updated_at', 'created_by', 'updated_by'], }, assets: { + dirName: 'assets', + assetBatchLimit: 1, + publishAssets: true, + fileName: 'assets.json', + importSameStructure: true, + uploadAssetsConcurrency: 10, + displayExecutionTime: false, + importFoldersConcurrency: 10, + includeVersionedAssets: false, + host: 'https://api.contentstack.io', + folderValidKeys: ['name', 'parent_uid'], + validKeys: ['title', 'parent_uid', 'description', 'tags'], + }, + 'assets-old': { dirName: 'assets', fileName: 'assets.json', // This is the total no. of asset objects fetched in each 'get assets' call @@ -91,6 +109,12 @@ module.exports = { validKeys: ['title', 'uid', 'schema', 'options', 'singleton', 'description'], limit: 100, }, + 'content-types': { + dirName: 'content_types', + fileName: 'content_types.json', + validKeys: ['title', 'uid', 'schema', 'options', 'singleton', 'description'], + limit: 100, + }, entries: { dirName: 'entries', fileName: 'entries.json', @@ -104,6 +128,12 @@ module.exports = { validKeys: ['title', 'uid', 'schema', 'options', 'singleton', 'description'], limit: 100, }, + 'global-fields': { + dirName: 'global_fields', + fileName: 'globalfields.json', + validKeys: ['title', 'uid', 'schema', 'options', 'singleton', 'description'], + limit: 100, + }, stack: { dirName: 'stack', fileName: 'stack.json', @@ -337,6 +367,19 @@ module.exports = { stacks: '/stacks/', labels: '/labels/', }, + updatedModules: [ + 'assets', + 'extensions', + 'locales', + 'marketplace-apps', + 'labels', + 'global-fields', + 'content-types', + 'webhooks', + 'custom-roles', + 'workflows', + 'entries', + ], rateLimit: 5, preserveStackVersion: false, entriesPublish: true, @@ -347,6 +390,9 @@ module.exports = { developerHubBaseUrl: '', marketplaceAppEncryptionKey: 'nF2ejRQcTv', getEncryptionKeyMaxRetry: 3, + useNewModuleStructure: false, // useBackedupDir: '', // backupConcurrency: 10, }; + +export default config; diff --git a/packages/contentstack-import/src/import/index.ts b/packages/contentstack-import/src/import/index.ts new file mode 100644 index 0000000000..c65773bbdb --- /dev/null +++ b/packages/contentstack-import/src/import/index.ts @@ -0,0 +1 @@ +export { default as ModuleImporter } from './module-importer'; diff --git a/packages/contentstack-import/src/import/module-importer.ts b/packages/contentstack-import/src/import/module-importer.ts new file mode 100755 index 0000000000..1ce2c624ca --- /dev/null +++ b/packages/contentstack-import/src/import/module-importer.ts @@ -0,0 +1,102 @@ +import { ContentstackClient, HttpClient } from '@contentstack/cli-utilities'; +import { ImportConfig, Modules } from '../types'; +import { backupHandler, log, validateBranch, masterLocalDetails, sanitizeStack } from '../utils'; +import startModuleImport from './modules'; +import startJSModuleImport from './modules-js'; + +class ModuleImporter { + private managementAPIClient: ContentstackClient; + private importConfig: ImportConfig; + private stackAPIClient: any; + + constructor(managementAPIClient: ContentstackClient, importConfig: ImportConfig) { + this.managementAPIClient = managementAPIClient; + this.stackAPIClient = this.managementAPIClient.stack({ + api_key: importConfig.apiKey, + management_token: importConfig.management_token, + }); + this.importConfig = importConfig; + } + + async start(): Promise { + if (this.importConfig.branchName) { + await validateBranch(this.stackAPIClient, this.importConfig, this.importConfig.branchName); + } + + // Temporarily adding this api call to verify management token has read and write permissions + // TODO: CS-40354 - CLI | import rewrite | Migrate HTTP call to SDK call once fix is ready from SDK side + + const httpClient = new HttpClient({ + headers: { api_key: this.importConfig.apiKey, authorization: this.importConfig.management_token }, + }); + + const { data } = await httpClient.post('https://api.contentstack.io/v3/locales', { + locale: { + name: 'English', + code: 'en-us', + }, + }); + + if (data.error_code === 161) { + throw new Error(data.error_message); + } + + if (!this.importConfig.master_locale) { + let masterLocalResponse = await masterLocalDetails(this.stackAPIClient); + this.importConfig['master_locale'] = { code: masterLocalResponse.code }; + this.importConfig.masterLocale = { code: masterLocalResponse.code }; + } + const backupDir = await backupHandler(this.importConfig); + if (backupDir) { + this.importConfig.backupDir = backupDir; + // To support the old config + this.importConfig.data = backupDir; + } + + await sanitizeStack(this.stackAPIClient); + + return this.import(); + } + + async import() { + // checks for single module or all modules + if (this.importConfig.singleModuleImport) { + return this.importByModuleByName(this.importConfig.moduleName); + } + return this.importAllModules(); + } + + async importByModuleByName(moduleName: Modules) { + log(this.importConfig, `Starting import of ${moduleName} module`, 'info'); + + const basePath = `${this.importConfig.backupDir}/${moduleName}`; + // import the modules by name + // calls the module runner which inturn calls the module itself + // Todo: Implement a mechanism to determine whether module is new or old + if ( + this.importConfig.useNewModuleStructure && + this.importConfig.updatedModules.indexOf(moduleName) !== -1 + //&& new FsUtility({ basePath }).isNewFsStructure + ) { + return startModuleImport({ + stackAPIClient: this.stackAPIClient, + importConfig: this.importConfig, + moduleName, + }); + } + return startJSModuleImport({ + stackAPIClient: this.stackAPIClient, + importConfig: this.importConfig, + moduleName, + }); + } + + async importAllModules(): Promise { + // use the algorithm to determine the parallel and sequential execution of modules + for (let moduleName of this.importConfig.modules.types) { + await this.importByModuleByName(moduleName); + } + } +} + +export default ModuleImporter; diff --git a/packages/contentstack-import/src/lib/import/assets.js b/packages/contentstack-import/src/import/modules-js/assets.js similarity index 82% rename from packages/contentstack-import/src/lib/import/assets.js rename to packages/contentstack-import/src/import/modules-js/assets.js index e76fc7bb88..3ed612cd7c 100755 --- a/packages/contentstack-import/src/lib/import/assets.js +++ b/packages/contentstack-import/src/import/modules-js/assets.js @@ -9,11 +9,8 @@ const path = require('path'); const chalk = require('chalk'); const mkdirp = require('mkdirp'); const Promise = require('bluebird'); - -const helper = require('../util/fs'); -let upload = require('../util/upload'); -const { addlogs } = require('../util/log'); -let config = require('../../config/default'); +let { default: config } = require('../../config'); +const { fileHelper, log, uploadAssetHelper } = require('../../utils'); module.exports = class ImportAssets { assets; @@ -33,7 +30,7 @@ module.exports = class ImportAssets { constructor(importConfig, stackAPIClient) { this.config = _.merge(config, importConfig); this.stackAPIClient = stackAPIClient; - this.assetConfig = config.modules.assets; + this.assetConfig = config.modules['assets-old']; this.assetBatchLimit = this.assetConfig.hasOwnProperty('assetBatchLimit') && typeof this.assetConfig.assetBatchLimit === 'number' ? this.assetConfig.assetBatchLimit @@ -42,27 +39,27 @@ module.exports = class ImportAssets { start() { let self = this; - addlogs(self.config, 'Migrating assets', 'success'); - this.assetsFolderPath = path.join(this.config.data, this.config.modules.assets.dirName); + log(self.config, 'Migrating assets', 'success'); + this.assetsFolderPath = path.join(this.config.data, this.assetConfig.dirName); this.mapperDirPath = path.resolve(this.config.data, 'mapper', 'assets'); this.environmentPath = path.resolve(this.config.data, 'environments', 'environments.json'); this.uidMapperPath = path.join(this.mapperDirPath, 'uid-mapping.json'); this.urlMapperPath = path.join(this.mapperDirPath, 'url-mapping.json'); this.failsPath = path.join(this.mapperDirPath, 'fail.json'); - this.assets = helper.readFileSync(path.join(this.assetsFolderPath, this.assetConfig.fileName)); - this.environment = helper.readFileSync(this.environmentPath); + this.assets = fileHelper.readFileSync(path.join(this.assetsFolderPath, this.assetConfig.fileName)); + this.environment = fileHelper.readFileSync(this.environmentPath); if (fs.existsSync(this.uidMapperPath)) { - this.uidMapping = helper.readFileSync(this.uidMapperPath); + this.uidMapping = fileHelper.readFileSync(this.uidMapperPath); } if (fs.existsSync(this.urlMapperPath)) { - this.urlMapping = helper.readFileSync(this.urlMapperPath); + this.urlMapping = fileHelper.readFileSync(this.urlMapperPath); } mkdirp.sync(this.mapperDirPath); return new Promise(function (resolve, reject) { if (self.assets === undefined || _.isEmpty(self.assets)) { - addlogs(self.config, 'No Assets Found', 'success'); + log(self.config, 'No Assets Found', 'success'); return resolve({ empty: true }); } @@ -83,7 +80,7 @@ module.exports = class ImportAssets { batch, function (assetUid) { if (self.uidMapping.hasOwnProperty(assetUid)) { - addlogs( + log( self.config, 'Skipping upload of asset: ' + assetUid + '. Its mapped to: ' + self.uidMapping[assetUid], 'success', @@ -97,7 +94,7 @@ module.exports = class ImportAssets { // hence, upload each asset with its version if (self.config.versioning) { return self.uploadVersionedAssets(assetUid, currentAssetFolderPath).catch(function (error) { - addlogs(self.config, `Asset upload failed.\n ${error}`, 'error'); + log(self.config, 'Asset upload failed \n' + error, 'error'); }); } @@ -109,7 +106,7 @@ module.exports = class ImportAssets { if (self.mappedFolderUids.hasOwnProperty(self.assets[assetUid].parent_uid)) { self.assets[assetUid].parent_uid = self.mappedFolderUids[self.assets[assetUid].parent_uid]; } else { - addlogs( + log( self.config, `'${self.assets[assetUid].parent_uid}' parent_uid was not found! Thus, setting it as 'null'`, 'error', @@ -135,20 +132,20 @@ module.exports = class ImportAssets { // log them onto /mapper/assets/success.json }) .catch(function (error) { - addlogs(self.config, `Asset upload failed.\n ${error}`, 'error'); + log(self.config, 'Asset upload failed \n' + error, 'error'); return error; // asset failed to upload // log them onto /mapper/assets/fail.json }); } - addlogs(self.config, `'${currentAssetFolderPath}' does not exist!`, 'error'); + log(self.config, `'${currentAssetFolderPath}' does not exist!`, 'error'); }, { concurrency: self.assetConfig.assetBatchLimit }, ).then(function () { - helper.writeFileSync(self.uidMapperPath, self.uidMapping); - helper.writeFileSync(self.urlMapperPath, self.urlMapping); + fileHelper.writeFileSync(self.uidMapperPath, self.uidMapping); + fileHelper.writeFileSync(self.urlMapperPath, self.urlMapping); // completed uploading assets - addlogs(self.config, 'Completed asset import of batch no: ' + (index + 1), 'success'); + log(self.config, 'Completed asset import of batch no: ' + (index + 1), 'success'); return index + 1; // TODO: if there are failures, retry }); @@ -158,7 +155,7 @@ module.exports = class ImportAssets { .then(function () { let numberOfSuccessfulAssetUploads = Object.keys(self.uidMapping).length; if (numberOfSuccessfulAssetUploads > 0) { - addlogs( + log( self.config, chalk.green(numberOfSuccessfulAssetUploads + ' assets uploaded successfully!'), 'success', @@ -168,12 +165,12 @@ module.exports = class ImportAssets { return resolve(); }) .catch(function (error) { - addlogs(self.config, error, 'error'); + log(self.config, error, 'error'); return reject(error); }); }) .catch(function (error) { - addlogs(self.config, error, 'error'); + log(self.config, error, 'error'); return reject(error); }); }); @@ -182,7 +179,9 @@ module.exports = class ImportAssets { uploadVersionedAssets(uid, assetFolderPath) { let self = this; return new Promise(function (resolve, reject) { - let versionedAssetMetadata = helper.readFileSync(path.join(assetFolderPath, '_contentstack_' + uid + '.json')); + let versionedAssetMetadata = fileHelper.readFileSync( + path.join(assetFolderPath, '_contentstack_' + uid + '.json'), + ); // using last version, find asset's parent let lastVersion = versionedAssetMetadata[versionedAssetMetadata.length - 1]; @@ -193,11 +192,7 @@ module.exports = class ImportAssets { assetMetadata.parent_uid = self.mappedFolderUids[lastVersion.parent_uid]; }); } else { - addlogs( - self.config, - `'${lastVersion.parent_uid}' parent_uid was not found! Thus, setting it as 'null'`, - 'error' - ); + log(self.config, (lastVersion.parent_uid + " parent_uid was not found! Thus, setting it as 'null'", 'error')); versionedAssetMetadata.forEach(function (assetMetadata) { assetMetadata.parent_uid = null; }); @@ -221,7 +216,7 @@ module.exports = class ImportAssets { filesStreamed.push(assetMetadata.filename); }) .catch((error) => { - addlogs(self.config, error, 'error'); + log(self.config, error, 'error'); reject(error); }); } @@ -232,7 +227,7 @@ module.exports = class ImportAssets { filesStreamed.push(assetMetadata.filename); }) .catch((error) => { - addlogs(self.config, error, 'error'); + log(self.config, error, 'error'); }); }, { concurrency: self.assetConfig.uploadAssetsConcurrency }, @@ -248,7 +243,7 @@ module.exports = class ImportAssets { .catch(function (error) { // failed to upload asset // write it on fail logs, but do not stop the process - addlogs(self.config, `Failed to upload asset\n ${error}`, 'error'); + log(self.config, 'Failed to upload asset\n' + error, 'error'); return resolve(); }); }); @@ -259,12 +254,12 @@ module.exports = class ImportAssets { return new Promise(function (resolve, reject) { let requestOption = {}; if (filesStreamed && filesStreamed.indexOf(metadata.filename) !== -1) { - addlogs(self.config, 'Skipping re-upload/streaming of ' + metadata.uid + '/' + metadata.filename, 'success'); + log(self.config, 'Skipping re-upload/streaming of ' + metadata.uid + '/' + metadata.filename, 'success'); requestOption.formData = {}; return resolve(); } - addlogs(self.config, 'Streaming: ' + metadata.uid + '/' + metadata.filename, 'success'); + log(self.config, 'Streaming: ' + metadata.uid + '/' + metadata.filename, 'success'); requestOption.formData = {}; if (metadata.hasOwnProperty('parent_uid') && typeof metadata.parent_uid === 'string') { @@ -283,13 +278,13 @@ module.exports = class ImportAssets { requestOption.formData['asset[title]'] = metadata.title; } - return upload(requestOption, assetPath) + return uploadAssetHelper(self.config, requestOption, assetPath) .then(function (response) { urlContainer[metadata.url] = response.url; return resolve(); }) .catch(function (error) { - addlogs(self.config, error, 'error'); + log(self.config, error, 'error'); return reject(error); }); }); @@ -316,14 +311,14 @@ module.exports = class ImportAssets { if (metadata.hasOwnProperty('title') && typeof metadata.title === 'string') { requestOption.title = metadata.title; } - return upload(requestOption, assetPath) + return uploadAssetHelper(self.config, requestOption, assetPath) .then(function (response) { uidContainer[metadata.uid] = response.uid; urlContainer[metadata.url] = response.url; return resolve(); }) .catch(function (error) { - addlogs(self.config, error, 'error'); + log(self.config, error, 'error'); return reject(error); }); }); @@ -333,14 +328,10 @@ module.exports = class ImportAssets { let self = this; return new Promise(function (resolve, reject) { let mappedFolderPath = path.resolve(self.config.data, 'mapper', 'assets', 'folder-mapping.json'); - self.folderDetails = helper.readFileSync(path.resolve(self.assetsFolderPath, 'folders.json')); + self.folderDetails = fileHelper.readFileSync(path.resolve(self.assetsFolderPath, 'folders.json')); if (_.isEmpty(self.folderDetails)) { - addlogs( - self.config, - 'No folders were found at: ' + path.join(self.assetsFolderPath, 'folders.json'), - 'success', - ); + log(self.config, 'No folders were found at: ' + path.join(self.assetsFolderPath, 'folders.json'), 'success'); return resolve(); } let tree = self.buildTree(_.cloneDeep(self.folderDetails)); @@ -348,7 +339,7 @@ module.exports = class ImportAssets { let createdFolderUids = []; // if a few folders have already been created, skip re-creating them if (fs.existsSync(mappedFolderPath)) { - createdFolders = helper.readFileSync(mappedFolderPath); + createdFolders = fileHelper.readFileSync(mappedFolderPath); // check if the read file has mapped objects if (_.isPlainObject(createdFolders)) { createdFolderUids = Object.keys(createdFolders); @@ -369,32 +360,32 @@ module.exports = class ImportAssets { .folder() .create(folder.json) .then((response) => { - addlogs(self.config, "Created folder: '" + folder.json.asset.name + "'", 'success'); + log(self.config, "Created folder: '" + folder.json.asset.name + "'", 'success'); // assigning newUid to oldUid createdFolders[folder.oldUid] = response.uid; - helper.writeFileSync(mappedFolderPath, createdFolders); + fileHelper.writeFileSync(mappedFolderPath, createdFolders); idx++; }) .catch(function (err) { let error = JSON.parse(err.message); if (error.errors.authorization || error.errors.api_key) { - addlogs(self.config, 'Api_key or management_token is not valid', 'error'); + log(self.config, 'Api_key or management_token is not valid', 'error'); return reject(error); } - addlogs(self.config, err, 'error'); + log(self.config, err, 'error'); return error; }); }, { concurrency: self.assetConfig.importFoldersConcurrency }, ) .then(function () { - self.mappedFolderUids = helper.readFileSync(mappedFolderPath); + self.mappedFolderUids = fileHelper.readFileSync(mappedFolderPath); // completed creating folders return resolve(); }) .catch(function (error) { - addlogs(self.config, error, 'error'); + log(self.config, error, 'error'); return reject(error); }); }); @@ -472,7 +463,7 @@ module.exports = class ImportAssets { .asset(assetUid) .publish({ publishDetails: requestObject.json.asset }) .then(function () { - addlogs(self.config, 'Asset ' + assetUid + ' published successfully', 'success'); + log(self.config, 'Asset ' + assetUid + ' published successfully', 'success'); return resolve(); }) .catch(function (err) { @@ -483,8 +474,7 @@ module.exports = class ImportAssets { } catch (cError) { error = { errorMessage: err.message }; } - - addlogs(self.config, `Asset '${assetUid}' not published, ${error.errorMessage}`, 'error'); + log(self.config, 'Asset ' + assetUid + ' not published, ' + error.errorMessage, 'error'); return reject(err); } diff --git a/packages/contentstack-import/src/lib/import/content-types.js b/packages/contentstack-import/src/import/modules-js/content-types.js similarity index 73% rename from packages/contentstack-import/src/lib/import/content-types.js rename to packages/contentstack-import/src/import/modules-js/content-types.js index 94bb42c044..d252b826de 100755 --- a/packages/contentstack-import/src/lib/import/content-types.js +++ b/packages/contentstack-import/src/import/modules-js/content-types.js @@ -2,12 +2,7 @@ const fs = require('fs'); const path = require('path'); const chalk = require('chalk'); const { cloneDeep, find, findIndex } = require('lodash'); - -const fileHelper = require('../util/fs'); -const { addlogs } = require('../util/log'); -const supress = require('../util/extensionsUidReplace'); -const { executeTask, formatError } = require('../util'); -const schemaTemplate = require('../util/schemaTemplate'); +const { fileHelper, log, executeTask, formatError, schemaTemplate, lookupExtension } = require('../../utils'); class ContentTypesImport { constructor(importConfig, stackAPIClient) { @@ -67,13 +62,13 @@ class ContentTypesImport { } // seed content type - addlogs(this.importConfig, 'Started to seed content types', 'info'); - await executeTask(this.seedContentType.bind(this), { concurrency: this.importConcurrency }, this.contentTypes); - addlogs(this.importConfig, 'Created content types', 'success'); + log(this.importConfig, 'Started to seed content types', 'info'); + await executeTask(this.contentTypes, this.seedContentType.bind(this), { concurrency: this.importConcurrency }); + log(this.importConfig, 'Created content types', 'success'); - addlogs(this.importConfig, 'Started to update content types with references', 'info'); - await executeTask(this.updateContentType.bind(this), { concurrency: this.importConcurrency }, this.contentTypes); - addlogs(this.importConfig, 'Updated content types with references', 'success'); + log(this.importConfig, 'Started to update content types with references', 'info'); + await executeTask(this.contentTypes, this.updateContentType.bind(this), { concurrency: this.importConcurrency }); + log(this.importConfig, 'Updated content types with references', 'success'); // global field update this.pendingGlobalFields = fileHelper.readFileSync(this.globalFieldPendingPath); @@ -83,17 +78,13 @@ class ContentTypesImport { ); this.existingGlobalFields = fileHelper.readFileSync(this.globalFieldMapperFolderPath); try { - addlogs(this.importConfig, 'Started to update pending global field with content type references', 'info'); - await executeTask( - this.updateGlobalFields.bind(this), - { - concurrency: this.importConcurrency, - }, - this.pendingGlobalFields, - ); - addlogs(this.importConfig, 'Updated pending global fields with content type with references', 'success'); + log(this.importConfig, 'Started to update pending global field with content type references', 'info'); + await executeTask(this.pendingGlobalFields, this.updateGlobalFields.bind(this), { + concurrency: this.importConcurrency, + }); + log(this.importConfig, 'Updated pending global fields with content type with references', 'success'); } catch (error) { - addlogs( + log( this.importConfig, `Failed to updates global fields with content type reference ${formatError(error)}`, 'error', @@ -106,11 +97,11 @@ class ContentTypesImport { try { await fileHelper.writeFile(path.join(this.contentTypesFolderPath, 'field_rules_uid.json'), this.fieldRules); } catch (error) { - addlogs(this.importConfig, `Failed to write field rules ${formatError(error)}`, 'error'); + log(this.importConfig, `Failed to write field rules ${formatError(error)}`, 'success'); } } - addlogs(this.importConfig, chalk.green('Content types imported successfully'), 'success'); + log(this.importConfig, chalk.green('Content types imported successfully'), 'success'); } catch (error) { let message_content_type = ""; if (error.request !== undefined && JSON.parse(error.request.data).content_type !== undefined) { @@ -121,10 +112,10 @@ class ContentTypesImport { message_content_type = ' Update the content type with content_type_title - ' + JSON.parse(error.request.data).content_type.title; } - error.errorMessage = error.errorMessage + message_content_type; + error.errorMessage = error.errorMessage + message_content_type; } - addlogs(this.importConfig, formatError(error.errorMessage), 'error'); - addlogs(this.importConfig, formatError(error), 'error'); + log(this.importConfig, formatError(error.errorMessage), 'error'); + log(this.importConfig, formatError(error), 'error'); throw new Error('Failed to import content types'); } } @@ -156,18 +147,28 @@ class ContentTypesImport { delete contentType.field_rules; } - supress(contentType.schema, this.importConfig.preserveStackVersion, this.installedExtensions); + lookupExtension( + this.importConfig, + contentType.schema, + this.importConfig.preserveStackVersion, + this.installedExtensions, + ); requestObject.json.content_type = contentType; const contentTypeResponse = this.stackAPIClient.contentType(contentType.uid); Object.assign(contentTypeResponse, cloneDeep(contentType)); await contentTypeResponse.update(); - addlogs(this.importConfig, `'${contentType.uid}' updated with references`, 'success'); + log(this.importConfig, contentType.uid + ' updated with references', 'success'); } async updateGlobalFields(uid) { const globalField = find(this.globalFields, { uid }); if (globalField) { - supress(globalField.schema, this.importConfig.preserveStackVersion, this.installedExtensions); + lookupExtension( + this.importConfig, + globalField.schema, + this.importConfig.preserveStackVersion, + this.installedExtensions, + ); let globalFieldObj = this.stackAPIClient.globalField(globalField.uid); Object.assign(globalFieldObj, cloneDeep(globalField)); try { @@ -179,15 +180,15 @@ class ContentTypesImport { // Improve write the updated global fields once all updates are completed this.existingGlobalFields.splice(existingGlobalField, 1, globalField); await fileHelper.writeFile(this.globalFieldMapperFolderPath, this.existingGlobalFields).catch((error) => { - addlogs(this.importConfig, `failed to write updated the global field '${uid}'. ${formatError(error)}`); + log(this.importConfig, `failed to write updated the global field ${uid} ${formatError(error)}`); }); - addlogs(this.importConfig, `Updated the global field '${uid}' with content type references `); + log(this.importConfig, `Updated the global field ${uid} with content type references `); return true; } catch (error) { - addlogs(this.importConfig, `failed to update the global field '${uid}'. ${formatError(error)}`); + log(this.importConfig, `failed to update the global field ${uid} ${formatError(error)}`); } } else { - addlogs(this.importConfig, `Global field '${uid}' does not exist, and hence failed to update.`); + log(this.importConfig, `Global field ${uid} does not exist, and hence failed to update.`); } } diff --git a/packages/contentstack-import/src/lib/import/custom-roles.js b/packages/contentstack-import/src/import/modules-js/custom-roles.js similarity index 75% rename from packages/contentstack-import/src/lib/import/custom-roles.js rename to packages/contentstack-import/src/import/modules-js/custom-roles.js index b05c734042..c5a1c768e9 100644 --- a/packages/contentstack-import/src/lib/import/custom-roles.js +++ b/packages/contentstack-import/src/import/modules-js/custom-roles.js @@ -5,11 +5,8 @@ const fs = require('fs'); const path = require('path'); const chalk = require('chalk'); const { merge } = require('lodash'); - -const helper = require('../util/fs'); -const { addlogs } = require('../util/log'); -const { formatError } = require('../util'); -let config = require('../../config/default'); +const { fileHelper, log, formatError } = require('../../utils'); +let { default: config } = require('../../config'); module.exports = class ImportCustomRoles { fails = []; @@ -24,7 +21,7 @@ module.exports = class ImportCustomRoles { async start() { const self = this; - addlogs(this.config, chalk.white('Migrating custom-roles'), 'success'); + log(this.config, chalk.white('Migrating custom-roles'), 'success'); let customRolesFolderPath = path.resolve(this.config.data, this.customRolesConfig.dirName); let customRolesMapperPath = path.resolve(this.config.data, 'mapper', 'custom-roles'); @@ -38,38 +35,40 @@ module.exports = class ImportCustomRoles { ); try { - self.customRoles = helper.readFileSync(path.resolve(customRolesFolderPath, this.customRolesConfig.fileName)); - self.customRolesLocales = helper.readFileSync(customRolesLocalesFilePath); + self.customRoles = fileHelper.readFileSync(path.resolve(customRolesFolderPath, this.customRolesConfig.fileName)); + self.customRolesLocales = fileHelper.readFileSync(customRolesLocalesFilePath); // Mapper file paths. if (fs.existsSync(customRolesMapperPath)) { - this.customRolesUidMapper = helper.readFileSync(customRolesUidMapperPath) || {}; + this.customRolesUidMapper = fileHelper.readFileSync(customRolesUidMapperPath) || {}; } mkdirp.sync(customRolesMapperPath); if (!self.customRoles) { - addlogs(self.config, chalk.white('No custom-roles found'), 'info'); + log(self.config, chalk.white('No custom-roles found'), 'info'); return; } self.customRolesUids = Object.keys(self.customRoles); self.localesUidMap = await getLocalesUidMap(self.stackAPIClient, self.config, self.customRolesLocales); + self.environmentsUidMap={} if (fs.existsSync(environmentsUidMapperFolderPath)) { - self.environmentsUidMap = helper.readFileSync( + self.environmentsUidMap = fileHelper.readFileSync( path.resolve(environmentsUidMapperFolderPath, 'uid-mapping.json'), ); } + self.entriesUidMap={} if (fs.existsSync(entriesUidMapperFolderPath)) { - self.entriesUidMap = helper.readFileSync(path.resolve(entriesUidMapperFolderPath, 'uid-mapping.json')); + self.entriesUidMap = fileHelper.readFileSync(path.resolve(entriesUidMapperFolderPath, 'uid-mapping.json')); } for (const uid of self.customRolesUids) { const customRole = self.customRoles[uid]; if (uid in self.customRolesUidMapper) { - addlogs( + log( self.config, chalk.white(`The custom-role '${customRole.name}' already exists. Skipping it to avoid duplicates!`), 'success', @@ -93,28 +92,28 @@ module.exports = class ImportCustomRoles { } const role = await self.stackAPIClient.role().create({ role: customRole }); self.customRolesUidMapper[uid] = role; - helper.writeFileSync(customRolesUidMapperPath, self.customRolesUidMapper); + fileHelper.writeFileSync(customRolesUidMapperPath, self.customRolesUidMapper); } catch (error) { self.fails.push(customRole); if (((error && error.errors && error.errors.name) || '').includes('is not a unique.')) { - addlogs(self.config, `custom-role '${customRole.name}' already exists`, 'error'); + log(self.config, `custom-role '${customRole.name}' already exists`, 'info'); } else { if (!(error && error.errors && error.errors.name)) { - addlogs(self.config, `custom-role '${customRole.name}' already exists`, 'error'); + log(self.config, `custom-role: ${customRole.name} already exists`, 'error'); } else { - addlogs(self.config, `custom-role '${customRole.name}' failed`, 'error'); + log(self.config, `custom-role: ${customRole.name} failed`, 'error'); } - addlogs(self.config, formatError(error), 'error'); + + log(self.config, formatError(error), 'error'); } } } - addlogs(self.config, chalk.green('Custom-roles have been imported successfully!'), 'success'); + log(self.config, chalk.green('Custom-roles have been imported successfully!'), 'success'); } catch (error) { - helper.writeFileSync(customRolesFailsPath, self.fails); - addlogs(self.config, 'Custom-roles import failed', 'error'); - addlogs(self.config, formatError(error), 'error'); - + fileHelper.writeFileSync(customRolesFailsPath, self.fails); + log(self.config, 'Custom-roles import failed', 'error'); + log(self.config, formatError(error), 'error'); throw error; } } diff --git a/packages/contentstack-import/src/lib/import/entries.js b/packages/contentstack-import/src/import/modules-js/entries.js similarity index 82% rename from packages/contentstack-import/src/lib/import/entries.js rename to packages/contentstack-import/src/import/modules-js/entries.js index 807066f9ad..a9dce59a43 100755 --- a/packages/contentstack-import/src/lib/import/entries.js +++ b/packages/contentstack-import/src/import/modules-js/entries.js @@ -10,16 +10,17 @@ const path = require('path'); const _ = require('lodash'); const mkdirp = require('mkdirp'); const chalk = require('chalk'); - -const util = require('../util'); -const helper = require('../util/fs'); -const { addlogs } = require('../util/log'); -const suppress = require('../util/supress-mandatory-fields'); -const extension_suppress = require('../util/extensionsUidReplace'); -const lookupReplaceAssets = require('../util/lookupReplaceAssets'); -const lookupReplaceEntries = require('../util/lookupReplaceEntries'); -const config = require('../../config/default'); - +const { + fileHelper, + log, + formatError, + lookupExtension, + suppressSchemaReference, + lookupAssets, + lookupEntries, +} = require('../../utils'); +const { default: config } = require('../../config'); +const addlogs = log; module.exports = class ImportEntries { mappedAssetUidPath; mappedAssetUrlPath; @@ -92,7 +93,7 @@ module.exports = class ImportEntries { this.installedExtensions = []; let files = fs.readdirSync(this.ctPath); - this.environment = helper.readFileSync(this.environmentPath); + this.environment = fileHelper.readFileSync(this.environmentPath); for (let index in files) { if (index) { try { @@ -103,11 +104,7 @@ module.exports = class ImportEntries { } } } catch (error) { - addlogs( - this.config, - `Failed to read the content types to import entries ${util.formatError(error)}`, - 'error', - ); + addlogs(this.config, `Failed to read the content types to import entries ${formatError(error)}`, 'error'); process.exit(0); } } @@ -117,10 +114,10 @@ module.exports = class ImportEntries { async start() { let self = this; this.masterLanguage = this.config.master_locale; - addlogs(this.config, 'Migrating entries', 'success'); - let languages = helper.readFileSync(this.lPath); + log(this.config, 'Migrating entries', 'success'); + let languages = fileHelper.readFileSync(this.lPath); const appMapperPath = path.join(this.config.data, 'mapper', 'marketplace_apps', 'uid-mapping.json'); - this.installedExtensions = ((await helper.readFileSync(appMapperPath)) || { extension_uid: {} }).extension_uid; + this.installedExtensions = ((await fileHelper.readFileSync(appMapperPath)) || { extension_uid: {} }).extension_uid; return new Promise((resolve, reject) => { let langs = [self.masterLanguage.code]; @@ -137,10 +134,9 @@ module.exports = class ImportEntries { return self .supressFields() .then(async () => { - addlogs(self.config, 'Completed suppressing content type reference fields', 'success'); - - let mappedAssetUids = helper.readFileSync(self.mappedAssetUidPath) || {}; - let mappedAssetUrls = helper.readFileSync(self.mappedAssetUrlPath) || {}; + log(this.config, 'Completed suppressing content type reference fields', 'success'); + let mappedAssetUids = fileHelper.readFileSync(this.mappedAssetUidPath) || {}; + let mappedAssetUrls = fileHelper.readFileSync(this.mappedAssetUrlPath) || {}; // Step 2: Iterate over available languages to create entries in each. let counter = 0; @@ -152,21 +148,20 @@ module.exports = class ImportEntries { (self.config.hasOwnProperty('onlylocales') && self.config.onlylocales.indexOf(lang) !== -1) || !self.config.hasOwnProperty('onlylocales') ) { - addlogs(self.config, `Starting to create entries '${lang}' locale`, 'info'); + addlogs(self.config, `Starting to create entries ${lang} locale`, 'info'); await self.createEntries(lang, mappedAssetUids, mappedAssetUrls); - addlogs(self.config, 'Entries created successfully', 'info'); + log(this.config, 'Entries created successfully', 'info'); try { await self.getCreatedEntriesWOUid(); } catch (error) { addlogs( self.config, - `Failed get the existing entries to update the mapper ${util.formatError(error)}`, - 'error', + `Failed get the existing entries to update the mapper ${formatError(error)}, 'error`, ); } - addlogs(self.config, 'Starting to update entries with references', 'info'); + log(this.config, 'Starting to update entries with references', 'info'); await self.repostEntries(lang); - addlogs(self.config, "Successfully imported '" + lang + "' entries!", 'success'); + log(this.config, "Successfully imported '" + lang + "' entries!", 'success'); counter++; } else { addlogs(self.config, `'${lang}' has not been configured for import, thus skipping it`, 'success'); @@ -178,47 +173,47 @@ module.exports = class ImportEntries { }, ).then(async () => { // Step 3: Revert all the changes done in content type in step 1 - addlogs(self.config, 'Restoring content type changes', 'info'); + log(this.config, 'Restoring content type changes', 'info'); await self.unSuppressFields(); - addlogs(self.config, 'Removing entries from master language which got created by default', 'info'); + log(this.config, 'Removing entries from master language which got created by default', 'info'); await self.removeBuggedEntries(); - addlogs(self.config, 'Updating the field rules of content type', 'info'); - let ct_field_visibility_uid = helper.readFileSync(path.join(self.ctPath + '/field_rules_uid.json')); - let ct_files = fs.readdirSync(self.ctPath); + log(this.config, 'Updating the field rules of content type', 'info'); + let ct_field_visibility_uid = fileHelper.readFileSync(path.join(this.ctPath + '/field_rules_uid.json')); + let ct_files = fs.readdirSync(this.ctPath); if (ct_field_visibility_uid && ct_field_visibility_uid != 'undefined') { for (const element of ct_field_visibility_uid) { if (ct_files.indexOf(element + '.json') > -1) { - let schema = require(path.resolve(self.ctPath, element)); + let schema = require(path.resolve(this.ctPath, element)); try { await self.field_rules_update(schema); } catch (error) { addlogs( self.config, - `Failed to update the field rules for content type '${schema.uid}' ${util.formatError(error)}`, + `Failed to update the field rules for content type '${schema.uid}' ${formatError(error)}`, 'error', ); } } } } - addlogs(self.config, chalk.green('Entries have been imported successfully!'), 'success'); - if (self.config.entriesPublish) { - addlogs(self.config, chalk.green('Publishing entries'), 'success'); + log(this.config, chalk.green('Entries have been imported successfully!'), 'success'); + if (this.config.entriesPublish) { + log(this.config, chalk.green('Publishing entries'), 'success'); return self .publish(langs) .then(() => { - addlogs(self.config, chalk.green('All the entries have been published successfully'), 'success'); + log(this.config, chalk.green('All the entries have been published successfully'), 'success'); return resolve(); }) .catch((error) => { - addlogs(self.config, `Error in publishing entries ${util.formatError(error)}`, 'error'); + log(this.config, `Error in publishing entries ${formatError(error)}`, 'error'); }); } return resolve(); }); }) .catch((error) => { - addlogs(self.config, util.formatError(error), 'error'); + log(self.config, formatError(error), 'error'); reject('Failed import entries'); }); }); @@ -229,7 +224,7 @@ module.exports = class ImportEntries { return new Promise(async (resolve, reject) => { let contentTypeUids = Object.keys(self.ctSchemas); if (fs.existsSync(this.entryUidMapperPath)) { - self.mappedUids = await helper.readLargeFile(this.entryUidMapperPath); + self.mappedUids = await fileHelper.readLargeFile(this.entryUidMapperPath); } self.mappedUids = self.mappedUids || {}; return Promise.map( @@ -248,19 +243,19 @@ module.exports = class ImportEntries { let createdEntries = {}; if (fs.existsSync(createdEntriesPath)) { - createdEntries = await helper.readLargeFile(createdEntriesPath); + createdEntries = await fileHelper.readLargeFile(createdEntriesPath); createdEntries = createdEntries || {}; } if (fs.existsSync(eFilePath)) { - let entries = await helper.readLargeFile(eFilePath); + let entries = await fileHelper.readLargeFile(eFilePath); if (!_.isPlainObject(entries) || _.isEmpty(entries)) { - addlogs( + log( this.config, chalk.white("No entries were found for Content type:'" + ctUid + "' in '" + lang + "' language!"), 'success', ); } else { - addlogs(this.config, `Creating entries for content type '${ctUid}' in language '${lang}' ...`, 'success'); + addlogs(this.config, `Creating entries for content type ${ctUid} in language ${lang} ...`, 'success'); for (let eUid in entries) { if (eUid) { try { @@ -276,7 +271,7 @@ module.exports = class ImportEntries { entries[eUid] = self.removeEntryRefsFromJSONRTE(entries[eUid], self.ctSchemas[ctUid].schema); } // will replace all old asset uid/urls with new ones - entries[eUid] = lookupReplaceAssets( + entries[eUid] = lookupAssets( { content_type: self.ctSchemas[ctUid], entry: entries[eUid], @@ -287,8 +282,8 @@ module.exports = class ImportEntries { self.installedExtensions, ); } catch (error) { - addlogs(this.config, `Failed to update entry while creating entry id '${eUid}'`, 'error'); - addlogs(this.config, util.formatError(error), 'error'); + addlogs(this.config, 'Failed to update entry while creating entry id ' + eUid); + addlogs(this.config, formatError(error), 'error'); } } } @@ -310,7 +305,7 @@ module.exports = class ImportEntries { async (eUid, batchIndex) => { // if entry is already created if (createdEntries.hasOwnProperty(eUid)) { - addlogs( + log( this.config, 'Skipping ' + JSON.stringify({ @@ -367,16 +362,12 @@ module.exports = class ImportEntries { } }) .catch((error) => { - addlogs( - this.config, - `Failed to update an entry ${eUid} ${util.formatError(error)}`, - 'error', - ); + log(this.config, `Failed to update an entry ${eUid} ${formatError(error)}`, 'error'); self.fails.push({ content_type: ctUid, locale: lang, entry: entries[eUid], - error: util.formatError(error), + error: formatError(error), }); return error; }); @@ -405,17 +396,19 @@ module.exports = class ImportEntries { } }) .catch((error) => { - if (error.hasOwnProperty('error_code') && error.error_code === 119) { + if (error.hasOwnProperty('errorCode') && error.errorCode === 119) { if (error.errors.title) { - addlogs( + log( this.config, 'Entry ' + eUid + ' already exist, skip to avoid creating a duplicate entry', 'error', ); } else { - addlogs( + log( this.config, - `Failed to create an entry ${eUid} ${util.formatError(error)}`, + `Failed to create an entry '${eUid}' ${formatError( + error, + )} Title of the failed entry: '${entries[eUid].title}'`, 'error', ); } @@ -425,12 +418,18 @@ module.exports = class ImportEntries { entry: entries[eUid], error: error, }); - helper.writeFileSync(this.createdEntriesWOUidPath, self.createdEntriesWOUid); + fileHelper.writeFileSync(this.createdEntriesWOUidPath, self.createdEntriesWOUid); return; } // TODO: if status code: 422, check the reason // 429 for rate limit - addlogs(this.config, `Failed to create an entry ${eUid} ${util.formatError(error)}`, 'error'); + log( + this.config, + `Failed to create an entry '${eUid}' ${formatError(error)}. Title of the failed entry: '${ + entries[eUid].title + }'`, + 'error', + ); self.fails.push({ content_type: ctUid, locale: lang, @@ -444,11 +443,11 @@ module.exports = class ImportEntries { concurrency: this.importConcurrency, }, ).then(() => { - helper.writeFileSync(successEntryLogPath, self.success[ctUid]); - helper.writeFileSync(failedEntryLogPath, self.fails[ctUid]); - helper.writeFileSync(this.entryUidMapperPath, self.mappedUids); - helper.writeFileSync(this.uniqueUidMapperPath, self.uniqueUids); - helper.writeFileSync(createdEntriesPath, createdEntries); + fileHelper.writeFileSync(successEntryLogPath, self.success[ctUid]); + fileHelper.writeFileSync(failedEntryLogPath, self.fails[ctUid]); + fileHelper.writeFileSync(this.entryUidMapperPath, self.mappedUids); + fileHelper.writeFileSync(this.uniqueUidMapperPath, self.uniqueUids); + fileHelper.writeFileSync(createdEntriesPath, createdEntries); }); // process one batch at a time }, @@ -457,7 +456,7 @@ module.exports = class ImportEntries { }, ).then(() => { if (self.success && self.success[ctUid] && self.success[ctUid].length > 0) - addlogs( + log( this.config, self.success[ctUid].length + ' entries created successfully in ' + @@ -468,7 +467,7 @@ module.exports = class ImportEntries { 'success', ); if (self.fails && self.fails[ctUid] && self.fails[ctUid].length > 0) - addlogs( + log( this.config, self.fails[ctUid].length + ' entries failed to create in ' + @@ -483,7 +482,7 @@ module.exports = class ImportEntries { }); } } else { - addlogs( + log( this.config, `Unable to find entry file path for '${ctUid}' content type!\nThe file '${eFilePath}' does not exist!`, 'error', @@ -495,11 +494,22 @@ module.exports = class ImportEntries { }, ) .then(() => { - addlogs(this.config, chalk.green("Entries created successfully in '" + lang + "' language"), 'success'); + log(this.config, chalk.green("Entries created successfully in '" + lang + "' language"), 'success'); return resolve(); }) .catch((error) => { - addlogs(this.config, `Failed to create entries in '${lang}' language`, 'error'); + let title = JSON.parse(error?.request?.data || '{}').entry?.title; + addlogs( + this.config, + chalk.red( + "Failed to create entries in '" + + lang + + "' language. " + + 'Title of the failed entry: ' + + `'${title || ''}'`, + ), + 'error', + ); return reject(error); }); }); @@ -507,7 +517,7 @@ module.exports = class ImportEntries { getCreatedEntriesWOUid() { let self = this; return new Promise((resolve) => { - self.createdEntriesWOUid = helper.readFileSync(this.createdEntriesWOUidPath); + self.createdEntriesWOUid = fileHelper.readFileSync(this.createdEntriesWOUidPath); self.failedWO = []; if (_.isArray(self.createdEntriesWOUid) && self.createdEntriesWOUid.length > 0) { return Promise.map( @@ -519,19 +529,19 @@ module.exports = class ImportEntries { concurrency: this.importConcurrency, }, ).then(() => { - helper.writeFileSync(this.failedWOPath, self.failedWO); - addlogs(this.config, 'Mapped entries without mapped uid successfully!', 'success'); + fileHelper.writeFileSync(this.failedWOPath, self.failedWO); + log(this.config, 'Mapped entries without mapped uid successfully!', 'success'); return resolve(); }); } - addlogs(this.config, 'No entries without mapped uid found!', 'success'); + log(this.config, 'No entries without mapped uid found!', 'success'); return resolve(); }); } repostEntries(lang) { let self = this; return new Promise(async (resolve, reject) => { - let _mapped_ = await helper.readLargeFile(path.join(this.entryMapperPath, 'uid-mapping.json')); + let _mapped_ = await fileHelper.readLargeFile(path.join(this.entryMapperPath, 'uid-mapping.json')); if (_.isPlainObject(_mapped_)) { self.mappedUids = _.merge(_mapped_, self.mappedUids); } @@ -541,23 +551,23 @@ module.exports = class ImportEntries { let eFolderPath = path.join(this.entryMapperPath, lang, ctUid); let eSuccessFilePath = path.join(eFolderPath, 'success.json'); let eFilePath = path.resolve(this.ePath, ctUid, lang + '.json'); - let sourceStackEntries = await helper.readLargeFile(eFilePath); + let sourceStackEntries = await fileHelper.readLargeFile(eFilePath); if (!fs.existsSync(eSuccessFilePath)) { - addlogs(this.config, 'Success file was not found at: ' + eSuccessFilePath, 'success'); + log(this.config, 'Success file was not found at: ' + eSuccessFilePath, 'success'); return; } - let entries = await helper.readLargeFile(eSuccessFilePath, { type: 'array' }); // TBD LARGE + let entries = await fileHelper.readLargeFile(eSuccessFilePath, { type: 'array' }); // TBD LARGE entries = entries || []; if (entries.length === 0) { - addlogs(this.config, "No entries were created to be updated in '" + lang + "' language!", 'success'); + log(this.config, "No entries were created to be updated in '" + lang + "' language!", 'success'); return; } // Keep track of entries that have their references updated - let refsUpdatedUids = helper.readFileSync(path.join(eFolderPath, 'refsUpdatedUids.json')); - let refsUpdateFailed = helper.readFileSync(path.join(eFolderPath, 'refsUpdateFailed.json')); + let refsUpdatedUids = fileHelper.readFileSync(path.join(eFolderPath, 'refsUpdatedUids.json')); + let refsUpdateFailed = fileHelper.readFileSync(path.join(eFolderPath, 'refsUpdateFailed.json')); let schema = self.ctSchemas[ctUid]; let batches = []; @@ -568,7 +578,7 @@ module.exports = class ImportEntries { // map failed reference uids @mapper/language/unmapped-uids.json let refUidMapperPath = path.join(this.entryMapperPath, lang); - addlogs(this.config, 'Starting to update the entry for reposting'); + addlogs(this.config, 'staring to update the entry for reposting'); entries = _.map(entries, (entry) => { try { @@ -583,7 +593,7 @@ module.exports = class ImportEntries { updatedEntry = entry; } - let _entry = lookupReplaceEntries( + let _entry = lookupEntries( { content_type: schema, entry: updatedEntry, @@ -597,13 +607,13 @@ module.exports = class ImportEntries { } catch (error) { addlogs( this.config, - `Failed to update the entry ${uid} references while reposting ${util.formatError(error)}`, + `Failed to update the entry '${uid}' references while reposting ${formatError(error)}`, 'error', ); } }); - addlogs(this.config, 'Starting the reposting process for entries'); + log(this.config, 'Starting the reposting process for entries'); const entryBatchLimit = this.eConfig.batchLimit || 10; const batchSize = Math.round(entryBatchLimit / 3); @@ -619,7 +629,7 @@ module.exports = class ImportEntries { async (entry) => { entry.uid = self.mappedUids[entry.uid]; if (refsUpdatedUids.indexOf(entry.uid) !== -1) { - addlogs( + log( this.config, 'Entry: ' + entry.uid + @@ -644,13 +654,13 @@ module.exports = class ImportEntries { return resolveUpdatedUids(); }) .catch((error) => { - addlogs( + log( this.config, `Entry Uid '${entry.uid}' of Content Type '${ctUid}' failed to update in locale '${lang}'`, 'error', ); - addlogs(this.config, util.formatError(error), 'error'); + log(this.config, formatError(error), 'error'); refsUpdateFailed.push({ content_type: ctUid, entry: entry, @@ -668,19 +678,15 @@ module.exports = class ImportEntries { ) .then(() => { // batch completed successfully - helper.writeFileSync(path.join(eFolderPath, 'success.json'), entries); - helper.writeFileSync(path.join(eFolderPath, 'refsUpdatedUids.json'), refsUpdatedUids); - helper.writeFileSync(path.join(eFolderPath, 'refsUpdateFailed.json'), refsUpdateFailed); - addlogs( - this.config, - 'Completed re-post entries batch no: ' + (index + 1) + ' successfully!', - 'success', - ); + fileHelper.writeFileSync(path.join(eFolderPath, 'success.json'), entries); + fileHelper.writeFileSync(path.join(eFolderPath, 'refsUpdatedUids.json'), refsUpdatedUids); + fileHelper.writeFileSync(path.join(eFolderPath, 'refsUpdateFailed.json'), refsUpdateFailed); + log(this.config, 'Completed re-post entries batch no: ' + (index + 1) + ' successfully!', 'success'); }) .catch((error) => { // error while executing entry in batch addlogs(this.config, `Failed re-post entries at batch no: '${index + 1}`, 'error'); - addlogs(this.config, util.formatError(error), 'error'); + addlogs(this.config, formatError(error), 'error'); // throw error; }); }, @@ -690,7 +696,7 @@ module.exports = class ImportEntries { ) .then(() => { // finished updating entries with references - addlogs( + log( this.config, "Imported entries of Content Type: '" + ctUid + "' in language: '" + lang + "' successfully!", 'success', @@ -698,8 +704,8 @@ module.exports = class ImportEntries { }) .catch((error) => { // error while updating entries with references - addlogs(this.config, `Failed re-post entries of content type ${ctUid} locale ${lang}`, 'error'); - addlogs(this.config, util.formatError(error), 'error'); + addlogs(this.config, `Failed re-post entries of content type '${ctUid}' locale '${lang}'`, 'error'); + addlogs(this.config, formatError(error), 'error'); // throw error; }); }, @@ -709,19 +715,19 @@ module.exports = class ImportEntries { ) .then(() => { // completed updating entry references - addlogs(this.config, chalk.green("Imported entries in '" + lang + "' language successfully!"), 'success'); + log(this.config, chalk.green("Imported entries in '" + lang + "' language successfully!"), 'success'); return resolve(); }) .catch((error) => { // error while updating entry references - addlogs(this.config, `Failed to re post entries in '${lang}' language`, 'error'); + addlogs(this.config, chalk.red('Failed to re post entries in ' + lang + ' language'), 'error'); return reject(error); }); }); } supressFields() { // it should be spelled as suppressFields - addlogs(this.config, 'Suppressing content type reference fields', 'success'); + log(this.config, 'Suppressing content type reference fields', 'success'); let self = this; return new Promise(async (resolve, reject) => { let modifiedSchemas = []; @@ -741,7 +747,7 @@ module.exports = class ImportEntries { } // Set mandatory or unique flag to false - suppress(contentTypeSchema.schema, flag); + suppressSchemaReference(contentTypeSchema.schema, flag); // Check if suppress modified flag if (flag.suppressed) { suppressedSchemas.push(contentTypeSchema); @@ -766,12 +772,17 @@ module.exports = class ImportEntries { } // Replace extensions with new UID - extension_suppress(contentTypeSchema.schema, this.config.preserveStackVersion, self.installedExtensions); + lookupExtension( + this.config, + contentTypeSchema.schema, + this.config.preserveStackVersion, + self.installedExtensions, + ); } } // write modified schema in backup file - helper.writeFileSync(this.modifiedSchemaPath, modifiedSchemas); + fileHelper.writeFileSync(this.modifiedSchemaPath, modifiedSchemas); return Promise.map( suppressedSchemas, @@ -783,8 +794,8 @@ module.exports = class ImportEntries { .then((_updatedcontentType) => { // empty function }) - .catch((error) => { - addlogs(this.config, util.formatError(error), 'error'); + .catch((_error) => { + addlogs(this.config, formatError(_error), 'error'); reject(`Failed suppress content type '${schema.uid}' reference fields`); }); // update 5 content types at a time @@ -798,7 +809,7 @@ module.exports = class ImportEntries { return resolve(); }) .catch((error) => { - addlogs(this.config, util.formatError(error), 'error'); + log(this.config, formatError(error), 'error'); return reject('Failed to suppress reference fields in content type'); }); }); @@ -822,16 +833,16 @@ module.exports = class ImportEntries { .find() .then((response) => { if (response.body.entries.length <= 0) { - addlogs(this.config, 'Unable to map entry WO uid: ' + query.entry.uid, 'error'); + log(this.config, 'Unable to map entry WO uid: ' + query.entry.uid, 'error'); self.failedWO.push(query); return resolve(); } self.mappedUids[query.entry.uid] = response.body.entries[0].uid; let _ePath = path.join(this.entryMapperPath, query.locale, query.content_type, 'success.json'); - let entries = helper.readFileSync(_ePath); + let entries = fileHelper.readFileSync(_ePath); entries.push(query.entry); - helper.writeFileSync(_ePath, entries); - addlogs( + fileHelper.writeFileSync(_ePath, entries); + log( this.config, 'Completed mapping entry wo uid: ' + query.entry.uid + ': ' + response.body.entries[0].uid, 'clientsuccess', @@ -846,7 +857,7 @@ module.exports = class ImportEntries { unSuppressFields() { let self = this; return new Promise(async (resolve, reject) => { - let modifiedSchemas = helper.readFileSync(this.modifiedSchemaPath); + let modifiedSchemas = fileHelper.readFileSync(this.modifiedSchemaPath); let modifiedSchemasUids = []; let updatedExtensionUidsSchemas = []; for (let uid in modifiedSchemas) { @@ -856,7 +867,12 @@ module.exports = class ImportEntries { delete _contentTypeSchema.field_rules; } - extension_suppress(_contentTypeSchema.schema, this.config.preserveStackVersion, self.installedExtensions); + lookupExtension( + this.config, + _contentTypeSchema.schema, + this.config.preserveStackVersion, + self.installedExtensions, + ); updatedExtensionUidsSchemas.push(_contentTypeSchema); } } @@ -874,20 +890,20 @@ module.exports = class ImportEntries { .update() .then((_updatedcontentType) => { modifiedSchemasUids.push(schema.uid); - addlogs( + log( this.config, chalk.white("Content type: '" + schema.uid + "' has been restored to its previous glory!"), ); return resolveContentType(); }) .catch((error) => { - addlogs(this.config, `Failed to re-update '${schema.uid}`, 'error'); + addlogs(this.config, chalk.red('Failed to re-update ' + schema.uid), 'error'); addlogs(this.config, error, 'error'); return rejectContentType(error); }); }) .catch((error) => { - addlogs(this.config, error, 'error'); + log(this.config, error, 'error'); return rejectContentType(error); }); }); @@ -905,8 +921,8 @@ module.exports = class ImportEntries { } } // re-write, in case some schemas failed to update - helper.writeFileSync(this.modifiedSchemaPath, _.compact(modifiedSchemas)); - addlogs(this.config, 'Re-modified content type schemas to their original form!', 'success'); + fileHelper.writeFileSync(this.modifiedSchemaPath, _.compact(modifiedSchemas)); + log(this.config, 'Re-modified content type schemas to their original form!', 'success'); return resolve(); }) .catch((error) => { @@ -918,7 +934,7 @@ module.exports = class ImportEntries { removeBuggedEntries() { let self = this; return new Promise((resolve, reject) => { - let entries = helper.readFileSync(this.uniqueUidMapperPath); + let entries = fileHelper.readFileSync(this.uniqueUidMapperPath); let bugged = []; let removed = []; for (let uid in entries) { @@ -939,11 +955,11 @@ module.exports = class ImportEntries { .delete({ locale: this.masterLanguage.code }) .then(() => { removed.push(self.mappedUids[entry.uid]); - addlogs(this.config, 'Removed bugged entry from master ' + JSON.stringify(entry), 'success'); + log(this.config, 'Removed bugged entry from master ' + JSON.stringify(entry), 'success'); }) .catch((error) => { - addlogs(this.config, 'Failed to remove bugged entry from master language', 'error'); - addlogs(this.config, util.formatError(error), 'error'); + addlogs(this.config, chalk.red('Failed to remove bugged entry from master language'), 'error'); + addlogs(this.config, formatError(error), 'error'); }); }, { @@ -958,16 +974,15 @@ module.exports = class ImportEntries { } } - helper.writeFileSync(path.join(this.entryMapperPath, 'removed-uids.json'), removed); - helper.writeFileSync(path.join(this.entryMapperPath, 'pending-uids.json'), bugged); + fileHelper.writeFileSync(path.join(this.entryMapperPath, 'removed-uids.json'), removed); + fileHelper.writeFileSync(path.join(this.entryMapperPath, 'pending-uids.json'), bugged); - addlogs(this.config, chalk.green('The stack has been eradicated from bugged entries!'), 'success'); + log(this.config, chalk.green('The stack has been eradicated from bugged entries!'), 'success'); return resolve(); }) .catch((error) => { // error while removing bugged entries from stack - addlogs(this.config, util.formatError(error), 'error'); - addlogs(this.config, error, 'error'); + addlogs(this.config, formatError(error), 'error'); }); }); } @@ -975,16 +990,21 @@ module.exports = class ImportEntries { return new Promise((resolve, reject) => { if (schema.field_rules) { let fieldRuleLength = schema.field_rules.length; + const fieldDatatypeMap = {}; + for (let i = 0; i < schema.schema.length; i++) { + const field = schema.schema[i].uid; + fieldDatatypeMap[field] = schema.schema[i].data_type; + } for (let k = 0; k < fieldRuleLength; k++) { let fieldRuleConditionLength = schema.field_rules[k].conditions.length; for (let i = 0; i < fieldRuleConditionLength; i++) { - if (schema.field_rules[k].conditions[i].operand_field === 'reference') { + if (fieldDatatypeMap[schema.field_rules[k].conditions[i].operand_field] === 'reference') { let fieldRulesValue = schema.field_rules[k].conditions[i].value; let fieldRulesArray = fieldRulesValue.split('.'); let updatedValue = []; for (const element of fieldRulesArray) { let splitedFieldRulesValue = element; - let oldUid = helper.readFileSync(path.join(this.entryUidMapperPath)); + let oldUid = fileHelper.readFileSync(path.join(this.entryUidMapperPath)); if (oldUid.hasOwnProperty(splitedFieldRulesValue)) { updatedValue.push(oldUid[splitedFieldRulesValue]); } else { @@ -996,7 +1016,7 @@ module.exports = class ImportEntries { } } } else { - addlogs(this.config, 'field_rules is not available', 'error'); + log(this.config, 'field_rules is not available', 'error'); } this.stackAPIClient @@ -1011,7 +1031,8 @@ module.exports = class ImportEntries { return resolve(); }) .catch((error) => { - addlogs(this.config, `failed to update the field rules ${util.formatError(error)}`); + log(this.config, `failed to update the field rules ${formatError(error)}`); + return reject(error); }); }); } @@ -1022,7 +1043,7 @@ module.exports = class ImportEntries { }; let contentTypeUids = Object.keys(self.ctSchemas); - let entryMapper = helper.readFileSync(this.entryUidMapperPath); + let entryMapper = fileHelper.readFileSync(this.entryUidMapperPath); return new Promise((resolve, reject) => { return Promise.map( @@ -1033,13 +1054,9 @@ module.exports = class ImportEntries { contentTypeUids, async (ctUid) => { let eFilePath = path.resolve(this.ePath, ctUid, lang + '.json'); - let entries = await helper.readLargeFile(eFilePath); + let entries = await fileHelper.readLargeFile(eFilePath); if (entries === undefined) { - addlogs( - this.config, - `No entries were found for Content type: ${ctUid} in language: ${lang}`, - 'info', - ); + addlogs(this.config, `No entries were found for Content type: ${ctUid} in language: ${lang}`, 'info'); } else { let eUids = Object.keys(entries); let batches = []; @@ -1104,9 +1121,7 @@ module.exports = class ImportEntries { .catch((err) => { addlogs( this.config, - `failed to publish entry '${eUid}' content type '${ctUid}' ${util.formatError( - err, - )}`, + `failed to publish entry '${eUid}' content type '${ctUid}' ${formatError(err)}`, 'error', ); return resolveEntryPublished(''); @@ -1126,7 +1141,7 @@ module.exports = class ImportEntries { }) .catch((error) => { // error while executing entry in batch - addlogs(this.config, util.formatError(error), 'error'); + addlogs(this.config, formatError(error), 'error'); addlogs(this.config, error, 'error'); }); }, @@ -1142,7 +1157,7 @@ module.exports = class ImportEntries { console.log(error); addlogs( this.config, - `failed to publish entry in content type '${ctUid}' ${util.formatError(error)}`, + `failed to publish entry in content type '${ctUid}' ${formatError(error)}`, 'error', ); }); @@ -1154,11 +1169,10 @@ module.exports = class ImportEntries { ) .then(() => { // empty function - // addlogs('Published entries successfully in ' +); + // log('Published entries successfully in ' +); }) .catch((error) => { - console.log(error); - addlogs(this.config, `Failed to publish few entries in '${lang}' ${util.formatError(error)}`, 'error'); + addlogs(this.config, `Failed to publish few entries in ${lang} ${formatError(error)}`, 'error'); }); }, { @@ -1169,7 +1183,7 @@ module.exports = class ImportEntries { return resolve(); }) .catch((error) => { - addlogs(this.config, `Failed to publish entries. ${util.formatError(error)}`, 'error'); + addlogs(this.config, `Failed to publish entries ${formatError(error)}`, 'error'); }); }); } @@ -1204,6 +1218,7 @@ module.exports = class ImportEntries { break; } case 'json': { + const structuredPTag = '{"type":"p","attrs":{},"children":[{"text":""}]}'; if (entry[element.uid] && element.field_metadata.rich_text_type) { if (element.multiple) { entry[element.uid] = entry[element.uid].map((jsonRteData) => { @@ -1211,6 +1226,9 @@ module.exports = class ImportEntries { let entryReferences = jsonRteData.children.filter((e) => this.doEntryReferencesExist(e)); if (entryReferences.length > 0) { jsonRteData.children = jsonRteData.children.filter((e) => !this.doEntryReferencesExist(e)); + if (jsonRteData.children.length === 0) { + jsonRteData.children.push(JSON.parse(structuredPTag)); + } return jsonRteData; // return jsonRteData without entry references } else { return jsonRteData; // return jsonRteData as it is, because there are no entry references @@ -1222,6 +1240,9 @@ module.exports = class ImportEntries { entry[element.uid].children = entry[element.uid].children.filter( (e) => !this.doEntryReferencesExist(e), ); + if (entry[element.uid].children.length === 0) { + entry[element.uid].children.push(JSON.parse(structuredPTag)); + } } } } @@ -1255,8 +1276,8 @@ module.exports = class ImportEntries { return false; } restoreJsonRteEntryRefs(entry, sourceStackEntry, ctSchema) { - let mappedAssetUids = helper.readFileSync(this.mappedAssetUidPath) || {}; - let mappedAssetUrls = helper.readFileSync(this.mappedAssetUrlPath) || {}; + let mappedAssetUids = fileHelper.readFileSync(this.mappedAssetUidPath) || {}; + let mappedAssetUrls = fileHelper.readFileSync(this.mappedAssetUrlPath) || {}; for (const element of ctSchema) { switch (element.data_type) { case 'blocks': { diff --git a/packages/contentstack-import/src/lib/import/environments.js b/packages/contentstack-import/src/import/modules-js/environments.js similarity index 67% rename from packages/contentstack-import/src/lib/import/environments.js rename to packages/contentstack-import/src/import/modules-js/environments.js index 8a648f9302..d56650fe4e 100755 --- a/packages/contentstack-import/src/lib/import/environments.js +++ b/packages/contentstack-import/src/import/modules-js/environments.js @@ -11,10 +11,10 @@ const mkdirp = require('mkdirp'); const Promise = require('bluebird'); const { isEmpty, merge } = require('lodash'); -const helper = require('../util/fs'); -let { addlogs } = require('../util/log'); -const { formatError } = require('../util'); -const config = require('../../config/default'); +const { readFileSync, writeFileSync } = require('../../utils/file-helper'); +const { log } = require('../../utils/logger'); +const { formatError } = require('../../utils'); +const config = require('../../config').default; module.exports = class ImportEnvironments { fails = []; @@ -23,12 +23,12 @@ module.exports = class ImportEnvironments { fetchConcurrency = config.modules.environments.concurrency || config.fetchConcurrency || 2; constructor(importConfig, stackAPIClient) { - this.config = merge(config, importConfig); + this.config = importConfig; this.stackAPIClient = stackAPIClient; } start() { - addlogs(this.config, 'Migrating environment', 'success'); + log(this.config, 'Migrating environment', 'success'); const self = this; let environmentConfig = config.modules.environments; @@ -37,17 +37,17 @@ module.exports = class ImportEnvironments { let envUidMapperPath = path.resolve(this.config.data, 'mapper', 'environments', 'uid-mapping.json'); let envSuccessPath = path.resolve(this.config.data, 'environments', 'success.json'); let envFailsPath = path.resolve(this.config.data, 'environments', 'fails.json'); - self.environments = helper.readFileSync(path.resolve(environmentsFolderPath, environmentConfig.fileName)); + self.environments = readFileSync(path.resolve(environmentsFolderPath, environmentConfig.fileName)); if (fs.existsSync(envUidMapperPath)) { - self.envUidMapper = helper.readFileSync(envUidMapperPath); + self.envUidMapper = readFileSync(envUidMapperPath); self.envUidMapper = self.envUidMapper || {}; } mkdirp.sync(envMapperPath); return new Promise(function (resolve, reject) { if (self.environments === undefined || isEmpty(self.environments)) { - addlogs(self.config, chalk.yellow('No Environment Found'), 'success'); + log(self.config, chalk.yellow('No Environment Found'), 'success'); return resolve({ empty: true }); } @@ -65,15 +65,15 @@ module.exports = class ImportEnvironments { .then((environment) => { self.success.push(environment.items); self.envUidMapper[envUid] = environment.uid; - helper.writeFileSync(envUidMapperPath, self.envUidMapper); + writeFileSync(envUidMapperPath, self.envUidMapper); }) .catch(function (err) { let error = JSON.parse(err.message); if (error.errors.name) { - addlogs(self.config, `Environment '${env.name}' already exists`, 'error'); + log(self.config, `Environment '${env.name}' already exists`, 'error'); } else { - addlogs( + log( config, `Environment '${env.name}' failed to be import\n ${JSON.stringify(error.errors)}`, 'error', @@ -82,23 +82,19 @@ module.exports = class ImportEnvironments { }); } else { // the environment has already been created - addlogs( - config, - `The environment ${env.name} already exists. Skipping it to avoid duplicates!`, - 'success', - ); + log(config, `The environment '${env.name}' already exists. Skipping it to avoid duplicates!`, 'success'); } }, { concurrency: self.fetchConcurrency }, ) .then(function () { - helper.writeFileSync(envSuccessPath, self.success); - addlogs(self.config, chalk.green('Environments have been imported successfully!'), 'success'); - resolve(); + writeFileSync(envSuccessPath, self.success); + log(self.config, chalk.green('Environments have been imported successfully!'), 'success'); + resolve(''); }) .catch(function (error) { - helper.writeFileSync(envFailsPath, self.fails); - addlogs(self.config, `Failed to import environment, ${formatError(error)}`, 'error'); + writeFileSync(envFailsPath, self.fails); + log(self.config, `Failed to import environment ${formatError(error)}`, 'error'); reject(error); }); }); diff --git a/packages/contentstack-import/src/lib/import/extensions.js b/packages/contentstack-import/src/import/modules-js/extensions.js similarity index 69% rename from packages/contentstack-import/src/lib/import/extensions.js rename to packages/contentstack-import/src/import/modules-js/extensions.js index 2431346962..42145aec2d 100644 --- a/packages/contentstack-import/src/lib/import/extensions.js +++ b/packages/contentstack-import/src/import/modules-js/extensions.js @@ -10,12 +10,8 @@ const path = require('path'); const Promise = require('bluebird'); const chalk = require('chalk'); const { isEmpty, merge } = require('lodash'); - -const util = require('../util'); -const helper = require('../util/fs'); -const { addlogs } = require('../util/log'); - -let config = util.getConfig(); +const { default: config } = require('../../config'); +const { fileHelper, log, formatError } = require('../../utils'); module.exports = class ImportExtensions { fails = []; @@ -30,7 +26,7 @@ module.exports = class ImportExtensions { } start() { - addlogs(this.config, chalk.white('Migrating extensions'), 'success'); + log(this.config, chalk.white('Migrating extensions'), 'success'); const self = this; let extensionsFolderPath = path.resolve(this.config.data, this.extensionsConfig.dirName); @@ -38,9 +34,9 @@ module.exports = class ImportExtensions { let extUidMapperPath = path.resolve(this.config.data, 'mapper/extensions', 'uid-mapping.json'); let extSuccessPath = path.resolve(this.config.data, 'extensions', 'success.json'); let extFailsPath = path.resolve(this.config.data, 'extensions', 'fails.json'); - this.extensions = helper.readFileSync(path.resolve(extensionsFolderPath, this.extensionsConfig.fileName)); + this.extensions = fileHelper.readFileSync(path.resolve(extensionsFolderPath, this.extensionsConfig.fileName)); if (fs.existsSync(extUidMapperPath)) { - self.extUidMapper = helper.readFileSync(extUidMapperPath); + self.extUidMapper = fileHelper.readFileSync(extUidMapperPath); self.extUidMapper = self.extUidMapper || {}; } @@ -48,7 +44,7 @@ module.exports = class ImportExtensions { return new Promise(function (resolve, reject) { if (self.extensions === undefined || isEmpty(self.extensions)) { - addlogs(self.config, chalk.white('No Extensions Found'), 'success'); + log(self.config, chalk.white('No Extensions Found'), 'success'); return resolve({ empty: true }); } let extUids = Object.keys(self.extensions); @@ -63,24 +59,20 @@ module.exports = class ImportExtensions { .then((response) => { self.success.push(response); self.extUidMapper[extUid] = response.uid; - helper.writeFileSync(extUidMapperPath, self.extUidMapper); + fileHelper.writeFileSync(extUidMapperPath, self.extUidMapper); }) .catch(function (err) { let error = JSON.parse(err.message); self.fails.push(ext); if (error.errors.title) { - addlogs(self.config, `Extension '${ext.title}' already exists`, 'error'); + log(self.config, `Extension '${ext.title}' already exists`, 'error'); } else { - addlogs( - config, - chalk.white(`Extension '${ext.title}' failed to be import\n ${JSON.stringify(error.errors)}`), - 'error', - ); + log(self.config, "Extension: '" + ext.title + "' failed to import" + formatError(error), 'error'); } }); } // the extensions has already been created - addlogs( + log( config, chalk.white("The extension: '" + ext.title + "' already exists. Skipping it to avoid duplicates!"), 'success', @@ -93,14 +85,14 @@ module.exports = class ImportExtensions { ) .then(function () { // extensions have imported successfully - helper.writeFileSync(extSuccessPath, self.success); - addlogs(self.config, chalk.green('Extensions have been imported successfully!'), 'success'); + fileHelper.writeFileSync(extSuccessPath, self.success); + log(self.config, chalk.green('Extensions have been imported successfully!'), 'success'); resolve(); }) .catch(function (error) { // error while importing extensions - helper.writeFileSync(extFailsPath, self.fails); - addlogs(self.config, `Extension import failed ${util.formatError(error)}`, 'error'); + fileHelper.writeFileSync(extFailsPath, self.fails); + log(self.config, `Extension import failed ${formatError(error)}`, 'error'); reject(error); }); }); diff --git a/packages/contentstack-import/src/lib/import/global-fields.js b/packages/contentstack-import/src/import/modules-js/global-fields.js similarity index 65% rename from packages/contentstack-import/src/lib/import/global-fields.js rename to packages/contentstack-import/src/import/modules-js/global-fields.js index 6d3c2456ca..e830271aa2 100644 --- a/packages/contentstack-import/src/lib/import/global-fields.js +++ b/packages/contentstack-import/src/import/modules-js/global-fields.js @@ -10,13 +10,8 @@ let chalk = require('chalk'); let mkdirp = require('mkdirp'); let Promise = require('bluebird'); const { isEmpty, merge } = require('lodash'); - -let helper = require('../util/fs'); -let { addlogs } = require('../util/log'); -const { formatError } = require('../util'); -let config = require('../../config/default'); -let extension_supress = require('../util/extensionsUidReplace'); -let removeReferenceFields = require('../util/removeReferenceFields'); +let { default: config } = require('../../config'); +const { fileHelper, log, formatError, lookupExtension, removeReferenceFields } = require('../../utils'); global._globalField_pending = []; @@ -33,7 +28,7 @@ module.exports = class ImportGlobalFields { } async start() { - addlogs(this.config, chalk.white('Migrating global-fields'), 'success'); + log(this.config, chalk.white('Migrating global-fields'), 'success'); let self = this; let globalfieldsConfig = config.modules.globalfields; @@ -43,12 +38,11 @@ module.exports = class ImportGlobalFields { let globalfieldsSuccessPath = path.resolve(this.config.data, 'mapper', 'global_fields', 'success.json'); let globalFieldsPending = path.resolve(this.config.data, 'mapper', 'global_fields', 'pending_global_fields.js'); let globalfieldsFailsPath = path.resolve(this.config.data, 'mapper', 'global_fields', 'fails.json'); - self.globalfields = helper.readFileSync(path.resolve(globalfieldsFolderPath, globalfieldsConfig.fileName)); + self.globalfields = fileHelper.readFileSync(path.resolve(globalfieldsFolderPath, globalfieldsConfig.fileName)); const appMapperPath = path.join(this.config.data, 'mapper', 'marketplace_apps', 'uid-mapping.json'); - this.installedExtensions = ((await helper.readFileSync(appMapperPath)) || { extension_uid: {} }).extension_uid; - + this.installedExtensions = ((await fileHelper.readFileSync(appMapperPath)) || { extension_uid: {} }).extension_uid; if (fs.existsSync(globalfieldsUidMapperPath)) { - self.snipUidMapper = helper.readFileSync(globalfieldsUidMapperPath); + self.snipUidMapper = fileHelper.readFileSync(globalfieldsUidMapperPath); self.snipUidMapper = self.snipUidMapper || {}; } @@ -58,8 +52,8 @@ module.exports = class ImportGlobalFields { return new Promise(function (resolve, reject) { if (self.globalfields === undefined || isEmpty(self.globalfields)) { - addlogs(self.config, chalk.white('No globalfields Found'), 'success'); - helper.writeFileSync(globalFieldsPending, _globalField_pending); + log(self.config, chalk.white('No globalfields Found'), 'success'); + fileHelper.writeFileSync(globalFieldsPending, _globalField_pending); return resolve({ empty: true }); } let snipUids = Object.keys(self.globalfields); @@ -68,7 +62,7 @@ module.exports = class ImportGlobalFields { async function (snipUid) { let flag = { supressed: false }; let snip = self.globalfields[snipUid]; - extension_supress(snip.schema, self.config.preserveStackVersion, self.installedExtensions); + lookupExtension(self.config, snip.schema, self.config.preserveStackVersion, self.installedExtensions); await removeReferenceFields(snip.schema, flag, self.stackAPIClient); if (flag.supressed) { @@ -85,27 +79,23 @@ module.exports = class ImportGlobalFields { self.success.push(globalField.items); let global_field_uid = globalField.uid; self.snipUidMapper[snipUid] = globalField.items; - helper.writeFileSync(globalfieldsUidMapperPath, self.snipUidMapper); - addlogs( - self.config, - chalk.green('Global field ' + global_field_uid + ' created successfully'), - 'success', - ); + fileHelper.writeFileSync(globalfieldsUidMapperPath, self.snipUidMapper); + log(self.config, chalk.green('Global field ' + global_field_uid + ' created successfully'), 'success'); }) .catch(function (err) { let error = JSON.parse(err.message); if (error.errors.title) { // eslint-disable-next-line no-undef - addlogs(self.config, `Globalfield '${snip.uid} already exists'`, 'error'); + log(self.config, `Globalfield '${snip.uid} already exists'`, 'error'); } else { - addlogs(self.config, `Globalfield failed to import ${formatError(error)}`, 'error'); + log(self.config, chalk.red(`Globalfield '${snip.title}' failed to import. ${formatError(error)}`), 'error'); } self.fails.push(snip); }); } else { // globalfields has already been created - addlogs( + log( self.config, chalk.white('The globalfields already exists. Skipping it to avoid duplicates!'), 'success', @@ -117,17 +107,15 @@ module.exports = class ImportGlobalFields { ) .then(function () { // globalfields have imported successfully - helper.writeFileSync(globalfieldsSuccessPath, self.success); - helper.writeFileSync(globalFieldsPending, _globalField_pending); - addlogs(self.config, chalk.green('Globalfields have been imported successfully!'), 'success'); + fileHelper.writeFileSync(globalfieldsSuccessPath, self.success); + fileHelper.writeFileSync(globalFieldsPending, _globalField_pending); + log(self.config, chalk.green('globalfields have been imported successfully!'), 'success'); return resolve(); }) .catch(function (err) { let error = JSON.parse(err); - // error while importing globalfields - addlogs(self.config, err, 'error'); - helper.writeFileSync(globalfieldsFailsPath, self.fails); - addlogs(self.config, `Globalfields import failed. ${formatError(err)}`, 'error'); + fileHelper.writeFileSync(globalfieldsFailsPath, self.fails); + log(self.config, `Globalfields import failed. ${formatError(err)}`, 'error'); return reject(error); }); }); diff --git a/packages/contentstack-import/src/import/modules-js/index.js b/packages/contentstack-import/src/import/modules-js/index.js new file mode 100644 index 0000000000..e652960fa3 --- /dev/null +++ b/packages/contentstack-import/src/import/modules-js/index.js @@ -0,0 +1,6 @@ +export default async function startModuleImport(modulePayload) { + const { moduleName, importConfig, stackAPIClient } = modulePayload; + const { default: ModuleRunner } = await import(`./${moduleName}`); + const moduleRunner = new ModuleRunner(importConfig, stackAPIClient); + return moduleRunner.start(); +} diff --git a/packages/contentstack-import/src/lib/import/labels.js b/packages/contentstack-import/src/import/modules-js/labels.js similarity index 76% rename from packages/contentstack-import/src/lib/import/labels.js rename to packages/contentstack-import/src/import/modules-js/labels.js index 108048b195..32dc585cd7 100644 --- a/packages/contentstack-import/src/lib/import/labels.js +++ b/packages/contentstack-import/src/import/modules-js/labels.js @@ -10,11 +10,8 @@ const mkdirp = require('mkdirp'); const Promise = require('bluebird'); const { existsSync } = require('fs'); const { isEmpty, merge } = require('lodash'); - -const helper = require('../util/fs'); -const { formatError } = require('../util'); -const { addlogs } = require('../util/log'); -const config = require('../../config/default'); +let { default: config } = require('../../config'); +const { fileHelper, log, formatError } = require('../../utils'); module.exports = class ImportLabels { config; @@ -33,7 +30,7 @@ module.exports = class ImportLabels { start() { const self = this; - addlogs(this.config, chalk.white('Migrating labels'), 'success'); + log(this.config, chalk.white('Migrating labels'), 'success'); let labelMapperPath = path.resolve(this.config.data, 'mapper', 'labels'); let labelFailsPath = path.resolve(this.config.data, 'labels', 'fails.json'); let labelSuccessPath = path.resolve(this.config.data, 'labels', 'success.json'); @@ -41,17 +38,17 @@ module.exports = class ImportLabels { let labelUidMapperPath = path.resolve(this.config.data, 'mapper', 'labels', 'uid-mapping.json'); if (existsSync(labelUidMapperPath)) { - this.labelUidMapper = helper.readFileSync(labelUidMapperPath); + this.labelUidMapper = fileHelper.readFileSync(labelUidMapperPath); this.labelUidMapper = this.labelUidMapper || {}; } - self.labels = helper.readFileSync(path.resolve(this.labelsFolderPath, this.labelConfig.fileName)); + self.labels = fileHelper.readFileSync(path.resolve(this.labelsFolderPath, this.labelConfig.fileName)); mkdirp.sync(labelMapperPath); return new Promise(function (resolve, reject) { if (self.labels == undefined || isEmpty(self.labels)) { - addlogs(self.config, chalk.white('No Label Found'), 'success'); + log(self.config, chalk.white('No Label Found'), 'success'); return resolve({ empty: true }); } self.labelUids = Object.keys(self.labels); @@ -76,14 +73,14 @@ module.exports = class ImportLabels { .catch(function (error) { self.fails.push(label); if (error.errors.name) { - addlogs(self.config,`Label '${label.name}' already exist`, 'error'); + log(self.config, `Label '${label.name}' already exist`, 'error'); } else { - addlogs(self.config,`Label '${label.name}' failed to be imported\n`, 'error'); + log(self.config, `Label '${label.name}' failed to be imported\n`, 'error'); } }); } else { // the label has already been created - addlogs( + log( self.config, chalk.white(`The label '${label.name}' already exists. Skipping it to avoid duplicates!'`), 'success', @@ -94,26 +91,26 @@ module.exports = class ImportLabels { { concurrency: self.reqConcurrency }, ) .then(function () { - helper.writeFileSync(labelUidMapperPath, self.labelUidMapper); + fileHelper.writeFileSync(labelUidMapperPath, self.labelUidMapper); // eslint-disable-next-line no-undef return self .updateLabels() .then(function () { - helper.writeFileSync(labelSuccessPath, self.success); - addlogs(self.config, chalk.green('Labels have been imported successfully!'), 'success'); + fileHelper.writeFileSync(labelSuccessPath, self.success); + log(self.config, chalk.green('Labels have been imported successfully!'), 'success'); return resolve(); }) .catch(function (error) { - addlogs(self.config, `Failed to import label, ${formatError(error)}`, 'error'); + log(self.config, self.config, `Failed to import label, ${formatError(error)}`, 'error'); // eslint-disable-next-line no-console return reject(error); }); }) .catch(function (error) { // error while importing labels - helper.writeFileSync(labelUidMapperPath, self.labelUidMapper); - helper.writeFileSync(labelFailsPath, self.fails); - addlogs(self.config, `Failed to import label, ${formatError(error)}`, 'error'); + fileHelper.writeFileSync(labelUidMapperPath, self.labelUidMapper); + fileHelper.writeFileSync(labelFailsPath, self.fails); + log(self.config, `Failed to import label, ${formatError(error)}`, 'error'); return reject(error); }); }); @@ -122,7 +119,7 @@ module.exports = class ImportLabels { updateLabels() { const self = this; return new Promise(function (resolve, reject) { - let labelsObj = helper.readFileSync(path.resolve(self.labelsFolderPath, self.labelConfig.fileName)); + let labelsObj = fileHelper.readFileSync(path.resolve(self.labelsFolderPath, self.labelConfig.fileName)); return Promise.map( self.labelUids, function (labelUid) { @@ -148,12 +145,12 @@ module.exports = class ImportLabels { self.success.push(result); }) .catch((error) => { - addlogs(self.config, formatError(error), 'error'); + log(self.config, formatError(error), 'error'); return reject(error); }); }) .catch(function (error) { - addlogs(self.config, formatError(error), 'error'); + log(self.config, formatError(error), 'error'); return reject(error); }); } diff --git a/packages/contentstack-import/src/lib/import/locales.js b/packages/contentstack-import/src/import/modules-js/locales.js similarity index 60% rename from packages/contentstack-import/src/lib/import/locales.js rename to packages/contentstack-import/src/import/modules-js/locales.js index c8ea01f4b0..fd8eba0cf4 100755 --- a/packages/contentstack-import/src/lib/import/locales.js +++ b/packages/contentstack-import/src/import/modules-js/locales.js @@ -12,28 +12,23 @@ let mkdirp = require('mkdirp'); let Promise = require('bluebird'); let { isEmpty, merge, cloneDeep } = require('lodash'); const { cliux } = require('@contentstack/cli-utilities'); - -let helper = require('../util/fs'); -let { addlogs } = require('../util/log'); -const { formatError } = require('../util'); -let config = require('../../config/default'); - +let { default: config } = require('../../config'); +const { fileHelper, log, formatError } = require('../../utils'); module.exports = class ImportLanguages { - fails = []; - success = []; - langUidMapper = {}; - masterLanguage = config.master_locale; - langConfig = config.modules.locales; - sourceMasterLangConfig = config.modules.masterLocale; - reqConcurrency = config.concurrency || config.fetchConcurrency || 1; - constructor(importConfig, stackAPIClient) { this.config = merge(config, importConfig); this.stackAPIClient = stackAPIClient; + this.fails = []; + this.success = []; + this.langUidMapper = {}; + this.masterLanguage = importConfig.master_locale?.code; + this.langConfig = importConfig.modules.locales; + this.sourceMasterLangConfig = config.modules.masterLocale; + this.reqConcurrency = importConfig.concurrency || importConfig.fetchConcurrency || 1; } start() { - addlogs(this.config, 'Migrating languages', 'success'); + log(this.config, 'Migrating languages', 'success'); const self = this; let langMapperPath = path.resolve(this.config.data, 'mapper', 'languages'); @@ -41,30 +36,33 @@ module.exports = class ImportLanguages { let langFailsPath = path.resolve(this.config.data, 'mapper', 'languages', 'fails.json'); let langUidMapperPath = path.resolve(this.config.data, 'mapper', 'languages', 'uid-mapper.json'); self.langSuccessPath = path.resolve(this.config.data, 'mapper', 'languages', 'success.json'); - self.languages = helper.readFileSync(path.resolve(langFolderPath, this.langConfig.fileName)); - self.sourceMasterLanguages = helper.readFileSync(path.resolve(langFolderPath, this.sourceMasterLangConfig.fileName)); - + self.languages = fileHelper.readFileSync(path.resolve(langFolderPath, this.langConfig.fileName)); + self.sourceMasterLanguages = fileHelper.readFileSync( + path.resolve(langFolderPath, this.sourceMasterLangConfig.fileName), + ); mkdirp.sync(langMapperPath); if (fs.existsSync(langUidMapperPath)) { - self.langUidMapper = helper.readFileSync(langUidMapperPath); + self.langUidMapper = fileHelper.readFileSync(langUidMapperPath); self.langUidMapper = self.langUidMapper || {}; } return new Promise(async function (resolve, reject) { if (self.languages === undefined || isEmpty(self.languages)) { - addlogs(self.config, chalk.white('No Languages Found'), 'success'); + log(self.config, chalk.white('No Languages Found'), 'success'); return resolve({ empty: true }); } let sourceMasterLangDetails = self.sourceMasterLanguages && Object.values(self.sourceMasterLanguages); - if (sourceMasterLangDetails && + if ( + sourceMasterLangDetails && sourceMasterLangDetails[0] && - sourceMasterLangDetails[0]["code"] && - self.masterLanguage["code"] === sourceMasterLangDetails[0]["code"]) { + sourceMasterLangDetails[0]['code'] && + self.masterLanguage['code'] === sourceMasterLangDetails[0]['code'] + ) { await self.checkAndUpdateMasterLocaleName(sourceMasterLangDetails).catch((error) => { - addlogs(self.config, formatError(error), 'warn'); - }) + log(self.config, formatError(error), 'warn'); + }); } let langUids = Object.keys(self.languages); @@ -86,49 +84,50 @@ module.exports = class ImportLanguages { .then((locale) => { self.success.push(locale.items); self.langUidMapper[langUid] = locale.uid; - helper.writeFileSync(langUidMapperPath, self.langUidMapper); + fileHelper.writeFileSync(langUidMapperPath, self.langUidMapper); }) .catch(function (err) { let error = JSON.parse(err.message); if (error.hasOwnProperty('errorCode') && error.errorCode === 247) { - if(error.errors.code){ - addlogs(self.config, error.errors.code[0], 'error'); + if(error?.errors?.code){ + log(self.config, error.errors.code[0], 'error'); }else{ - addlogs(self.config, err, 'error'); + log(self.config, err, 'error'); } return err; } self.fails.push(lang); - addlogs(self.config, `Language '${lang.code}' failed to import\n`, 'error'); - addlogs(self.config, formatError(err), 'error'); + log(self.config, `Language '${lang.code}' failed to import\n`, 'error'); + log(self.config, formatError(err), 'error'); }); } else { // the language has already been created - addlogs(self.config, `The language '${lang.code}' already exists.`, 'error'); + log(self.config, `The language '${lang.code}' already exists.`, 'error'); } + return Promise.resolve(); // import 2 languages at a time }, { concurrency: self.reqConcurrency }, ) .then(function () { // languages have imported successfully - self + return self .updateLocales(langUids) .then(() => { - helper.writeFileSync(self.langSuccessPath, self.success); - addlogs(self.config, chalk.green('Languages have been imported successfully!'), 'success'); + fileHelper.writeFileSync(self.langSuccessPath, self.success); + log(self.config, chalk.green('Languages have been imported successfully!'), 'success'); resolve(); }) .catch(function (error) { - addlogs(self.config, formatError(error), 'error'); + log(self.config, formatError(error), 'error'); reject(error); }); }) .catch(function (error) { // error while importing languages - helper.writeFileSync(langFailsPath, self.fails); - addlogs(self.config, `Language import failed. ${formatError(error)}`, 'error'); + fileHelper.writeFileSync(langFailsPath, self.fails); + log(self.config, `Language import failed. ${formatError(error)}`, 'error'); reject('failed to import Languages'); }); }); @@ -154,7 +153,7 @@ module.exports = class ImportLanguages { ) .then(resolve) .catch((error) => { - addlogs(self.config, formatError(error), 'error'); + log(self.config, formatError(error), 'error'); reject(error); }); }); @@ -163,43 +162,41 @@ module.exports = class ImportLanguages { checkAndUpdateMasterLocaleName(sourceMasterLangDetails) { let self = this; return new Promise(async function (resolve, reject) { - let masterLangDetails = await self.stackAPIClient.locale(self.masterLanguage["code"]).fetch() + let masterLangDetails = await self.stackAPIClient + .locale(self.masterLanguage['code']) + .fetch() .catch((error) => { - addlogs(self.config, formatError(error), 'warn'); - }) - if (masterLangDetails && - masterLangDetails["name"] && - sourceMasterLangDetails[0]["name"] && - masterLangDetails["name"].toString().toUpperCase() !== sourceMasterLangDetails[0]["name"].toString().toUpperCase() + log(self.config, formatError(error), 'warn'); + }); + if ( + masterLangDetails && + masterLangDetails['name'] && + sourceMasterLangDetails[0]['name'] && + masterLangDetails['name'].toString().toUpperCase() !== + sourceMasterLangDetails[0]['name'].toString().toUpperCase() ) { - cliux.print( - 'WARNING!!! The master language name for the source and destination is different.', - { color: 'yellow' }, - ); - cliux.print( - `Old Master language name: ${masterLangDetails["name"]}`, - { color: 'red' }, - ); - cliux.print( - `New Master language name: ${sourceMasterLangDetails[0]["name"]}`, - { color: 'green' }, - ); + cliux.print('WARNING!!! The master language name for the source and destination is different.', { + color: 'yellow', + }); + cliux.print(`Old Master language name: ${masterLangDetails['name']}`, { color: 'red' }); + cliux.print(`New Master language name: ${sourceMasterLangDetails[0]['name']}`, { color: 'green' }); let confirm = await cliux.inquire({ type: 'confirm', message: 'Are you sure you want to update name of master language?', name: 'confirmation', - }) + }); if (confirm) { - let languid = sourceMasterLangDetails[0] && sourceMasterLangDetails[0]["uid"]; + let languid = sourceMasterLangDetails[0] && sourceMasterLangDetails[0]['uid']; let lang = self.sourceMasterLanguages[languid]; if (!lang) return reject('Locale not found.!'); const langObj = self.stackAPIClient.locale(lang.code); Object.assign(langObj, { name: lang.name }); - langObj.update() + langObj + .update() .then(() => { - helper.writeFileSync(self.langSuccessPath, self.success); - addlogs(self.config, chalk.green('Master Languages name have been updated successfully!'), 'success'); + fileHelper.writeFileSync(self.langSuccessPath, self.success); + log(self.config, chalk.green('Master Languages name have been updated successfully!'), 'success'); resolve(); }) .catch(function (error) { diff --git a/packages/contentstack-import/src/lib/import/marketplace-apps.js b/packages/contentstack-import/src/import/modules-js/marketplace-apps.js similarity index 89% rename from packages/contentstack-import/src/lib/import/marketplace-apps.js rename to packages/contentstack-import/src/import/modules-js/marketplace-apps.js index 06dabe6e47..0537576c01 100644 --- a/packages/contentstack-import/src/lib/import/marketplace-apps.js +++ b/packages/contentstack-import/src/import/modules-js/marketplace-apps.js @@ -17,17 +17,17 @@ const { HttpClientDecorator, OauthDecorator, } = require('@contentstack/cli-utilities'); - -const { formatError } = require('../util'); -let config = require('../../config/default'); -const { addlogs: log } = require('../util/log'); -const { readFileSync, writeFile } = require('../util/fs'); -const { getDeveloperHubUrl, getAllStackSpecificApps } = require('../util/marketplace-app-helper'); - +const { + log, + fileHelper: { readFileSync, writeFile }, + formatError, +} = require('../../utils'); +let { default: config } = require('../../config'); +const { getDeveloperHubUrl, getAllStackSpecificApps } = require('../../utils/marketplace-app-helper'); module.exports = class ImportMarketplaceApps { client; httpClient; - appOrginalName; + appOriginalName; appUidMapping = {}; appNameMapping = {}; marketplaceApps = []; @@ -90,7 +90,7 @@ module.exports = class ImportMarketplaceApps { console.log(error); }); - if (tempStackData && tempStackData.org_uid) { + if (tempStackData?.org_uid) { this.config.org_uid = tempStackData.org_uid; } } @@ -180,25 +180,28 @@ module.exports = class ImportMarketplaceApps { async generateUidMapper() { const listOfNewMeta = []; const listOfOldMeta = []; - const extensionUidMapp = {}; - const allInstalledApps = await getAllStackSpecificApps(this.developerHubBaseUrl, this.httpClient, this.config); + const extensionUidMap = {}; + const allInstalledApps = + (await getAllStackSpecificApps(this.developerHubBaseUrl, this.httpClient, this.config)) || []; for (const app of this.marketplaceApps) { - listOfOldMeta.push(..._.map(app.ui_location && app.ui_location.locations, 'meta').flat()); + listOfOldMeta.push(..._.map(app?.ui_location?.locations, 'meta').flat()); } for (const app of allInstalledApps) { - listOfNewMeta.push(..._.map(app.ui_location && app.ui_location.locations, 'meta').flat()); + listOfNewMeta.push(..._.map(app?.ui_location?.locations, 'meta').flat()); } - for (const { extension_uid, name, path } of _.filter(listOfOldMeta, 'name')) { + for (const { extension_uid, name, path, uid, data_type } of _.filter(listOfOldMeta, 'name')) { const meta = - _.find(listOfNewMeta, { name, path }) || _.find(listOfNewMeta, { name: this.appNameMapping[name], path }); + _.find(listOfNewMeta, { name, path }) || + _.find(listOfNewMeta, { name: this.appNameMapping[name], path }) || + _.find(listOfNewMeta, { name, uid, data_type }); if (meta) { - extensionUidMapp[extension_uid] = meta.extension_uid; + extensionUidMap[extension_uid] = meta.extension_uid; } } - return extensionUidMapp; + return extensionUidMap; } /** @@ -220,7 +223,7 @@ module.exports = class ImportMarketplaceApps { for (let app of privateApps) { // NOTE keys can be passed to install new app in the developer hub app.manifest = _.pick(app.manifest, ['uid', 'name', 'description', 'icon', 'target_type', 'webhook', 'oauth']); - this.appOrginalName = app.manifest.name; + this.appOriginalName = app.manifest.name; await this.createPrivateApps({ oauth: app.oauth, webhook: app.webhook, @@ -229,7 +232,7 @@ module.exports = class ImportMarketplaceApps { }); } - this.appOrginalName = undefined; + this.appOriginalName = undefined; } async getConfirmationToCreateApps(privateApps) { @@ -266,7 +269,7 @@ module.exports = class ImportMarketplaceApps { } async createPrivateApps(app, uidCleaned = false, appSuffix = 1) { - let locations = app.ui_location && app.ui_location.locations; + let locations = app?.ui_location?.locations; if (!uidCleaned && !_.isEmpty(locations)) { app.ui_location.locations = this.updateManifestUILocations(locations, 'uid'); @@ -314,7 +317,7 @@ module.exports = class ImportMarketplaceApps { // NOTE new app installation log(this.config, `${response.name} app created successfully.!`, 'success'); this.appUidMapping[app.uid] = response.uid; - this.appNameMapping[this.appOrginalName] = response.name; + this.appNameMapping[this.appOriginalName] = response.name; } } @@ -350,8 +353,8 @@ module.exports = class ImportMarketplaceApps { if (meta.name) { const name = `${_.first(_.split(meta.name, '◈'))}◈${appSuffix}`; - if (!this.appNameMapping[this.appOrginalName]) { - this.appNameMapping[this.appOrginalName] = name; + if (!this.appNameMapping[this.appOriginalName]) { + this.appNameMapping[this.appOriginalName] = name; } meta.name = name; @@ -376,8 +379,10 @@ module.exports = class ImportMarketplaceApps { /** * @method installApps - * @param {Object} options - * @returns {Void} + * + * @param {Record} app + * @param {Record[]} installedApps + * @returns {Promise} */ async installApps(app, installedApps) { let updateParam; @@ -515,21 +520,16 @@ module.exports = class ImportMarketplaceApps { return Promise.resolve(); } - let installation = this.client - .organization(this.config.org_uid) - .app(app.manifest.uid) - .installation(uid) - - installation = Object.assign(installation, payload) - - return installation - .update() - .then(async data => { - if (data) { - log(this.config, `${app.manifest.name} app config updated successfully.!`, 'success'); - } - }) - .catch((error) => log(this.config, formatError(error), 'error')) + return this.httpClient + .put(`${this.developerHubBaseUrl}/installations/${uid}`, payload) + .then(({ data }) => { + if (data.message) { + log(this.config, formatError(data.message), 'success'); + } else { + log(this.config, `${app.manifest.name} app config updated successfully.!`, 'success'); + } + }) + .catch((error) => log(this.config, formatError(error), 'error')); } validateAppName(name) { diff --git a/packages/contentstack-import/src/lib/import/webhooks.js b/packages/contentstack-import/src/import/modules-js/webhooks.js similarity index 72% rename from packages/contentstack-import/src/lib/import/webhooks.js rename to packages/contentstack-import/src/import/modules-js/webhooks.js index 558ad6718c..5d89090631 100644 --- a/packages/contentstack-import/src/lib/import/webhooks.js +++ b/packages/contentstack-import/src/import/modules-js/webhooks.js @@ -10,11 +10,8 @@ const path = require('path'); const Promise = require('bluebird'); const chalk = require('chalk'); const { isEmpty, merge } = require('lodash'); - -const helper = require('../util/fs'); -const { formatError } = require('../util'); -const { addlogs } = require('../util/log'); -const config = require('../../config/default'); +let { default: config } = require('../../config'); +const { fileHelper, log, formatError } = require('../../utils'); module.exports = class ImportWebhooks { config; @@ -30,7 +27,7 @@ module.exports = class ImportWebhooks { } start() { - addlogs(this.config, chalk.white('Migrating webhooks'), 'success'); + log(this.config, chalk.white('Migrating webhooks'), 'success'); const self = this; @@ -40,10 +37,10 @@ module.exports = class ImportWebhooks { let webUidMapperPath = path.resolve(this.config.data, 'mapper', 'webhooks', 'uid-mapping.json'); let webhooksFolderPath = path.resolve(this.config.data, this.webhooksConfig.dirName); - this.webhooks = helper.readFileSync(path.resolve(webhooksFolderPath, this.webhooksConfig.fileName)); + this.webhooks = fileHelper.readFileSync(path.resolve(webhooksFolderPath, this.webhooksConfig.fileName)); if (fs.existsSync(webUidMapperPath)) { - self.webUidMapper = helper.readFileSync(webUidMapperPath); + self.webUidMapper = fileHelper.readFileSync(webUidMapperPath); self.webUidMapper = self.webUidMapper || {}; } @@ -51,7 +48,7 @@ module.exports = class ImportWebhooks { return new Promise(function (resolve, reject) { if (self.webhooks == undefined || isEmpty(self.webhooks)) { - addlogs(self.config, chalk.white('No Webhooks Found'), 'success'); + log(self.config, chalk.white('No Webhooks Found'), 'success'); return resolve({ empty: true }); } @@ -73,20 +70,16 @@ module.exports = class ImportWebhooks { .then(function (response) { self.success.push(response); self.webUidMapper[webUid] = response.uid; - helper.writeFileSync(webUidMapperPath, self.webUidMapper); + fileHelper.writeFileSync(webUidMapperPath, self.webUidMapper); }) .catch(function (err) { let error = JSON.parse(err.message); self.fails.push(web); - addlogs( - self.config, - `Webhooks '${web.name}' failed to be import.\n ${formatError(error)}`, - 'error', - ); + log(self.config, `Webhooks '${web.name}' failed to be import.\n ${formatError(error)}`, 'error'); }); } else { // the webhooks has already been created - addlogs( + log( self.config, chalk.white("The Webhooks: '" + web.name + "' already exists. Skipping it to avoid duplicates!"), 'success', @@ -98,14 +91,14 @@ module.exports = class ImportWebhooks { ) .then(function () { // webhooks have imported successfully - helper.writeFileSync(webSuccessPath, self.success); - addlogs(self.config, chalk.green('Webhooks have been imported successfully!'), 'success'); + fileHelper.writeFileSync(webSuccessPath, self.success); + log(self.config, chalk.green('Webhooks have been imported successfully!'), 'success'); return resolve(); }) .catch(function (error) { // error while importing environments - helper.writeFileSync(webFailsPath, self.fails); - addlogs(self.config, `Webhooks import failed. ${formatError(error)}`, 'error'); + fileHelper.writeFileSync(webFailsPath, self.fails); + log(self.config, `Webhooks import failed. ${formatError(error)}`, 'error'); return reject(error); }); }); diff --git a/packages/contentstack-import/src/lib/import/workflows.js b/packages/contentstack-import/src/import/modules-js/workflows.js similarity index 60% rename from packages/contentstack-import/src/lib/import/workflows.js rename to packages/contentstack-import/src/import/modules-js/workflows.js index 0da82ee37c..ca5dcadaea 100644 --- a/packages/contentstack-import/src/lib/import/workflows.js +++ b/packages/contentstack-import/src/import/modules-js/workflows.js @@ -4,17 +4,15 @@ * MIT Licensed */ -const mkdirp = require('mkdirp'); const fs = require('fs'); const path = require('path'); -const Promise = require('bluebird'); const chalk = require('chalk'); -const { isEmpty, merge } = require('lodash'); +const mkdirp = require('mkdirp'); +const Promise = require('bluebird'); +const { isEmpty, merge, filter, map, cloneDeep, find } = require('lodash'); -const helper = require('../util/fs'); -const { formatError } = require('../util'); -const { addlogs } = require('../util/log'); -let config = require('../../config/default'); +let { default: config } = require('../../config'); +const { fileHelper, log, formatError } = require('../../utils'); module.exports = class importWorkflows { fails = []; @@ -29,7 +27,7 @@ module.exports = class importWorkflows { } start() { - addlogs(this.config, chalk.white('Migrating workflows'), 'success'); + log(this.config, chalk.white('Migrating workflows'), 'success'); let self = this; let workflowMapperPath = path.resolve(this.config.data, 'mapper', 'workflows'); @@ -38,10 +36,10 @@ module.exports = class importWorkflows { let workflowUidMapperPath = path.resolve(this.config.data, 'mapper', 'workflows', 'uid-mapping.json'); let workflowFolderPath = path.resolve(this.config.data, this.workflowConfig.dirName); - self.workflows = helper.readFileSync(path.resolve(workflowFolderPath, this.workflowConfig.fileName)); + self.workflows = fileHelper.readFileSync(path.resolve(workflowFolderPath, this.workflowConfig.fileName)); if (fs.existsSync(workflowUidMapperPath)) { - this.workflowUidMapper = helper.readFileSync(workflowUidMapperPath); + this.workflowUidMapper = fileHelper.readFileSync(workflowUidMapperPath); this.workflowUidMapper = this.workflowUidMapper || {}; } @@ -49,7 +47,7 @@ module.exports = class importWorkflows { return new Promise(function (resolve, reject) { if (self.workflows == undefined || isEmpty(self.workflows)) { - addlogs(self.config, chalk.white('No workflow Found'), 'success'); + log(self.config, chalk.white('No workflow Found'), 'success'); return resolve({ empty: true }); } self.workflowsUids = Object.keys(self.workflows); @@ -61,6 +59,7 @@ module.exports = class importWorkflows { if (!self.workflowUidMapper.hasOwnProperty(workflowUid)) { const roleNameMap = {}; const workflowStages = workflow.workflow_stages; + const oldWorkflowStages = cloneDeep(workflow.workflow_stages); const roles = await self.stackAPIClient.role().fetchAll(); for (const role of roles.items) { @@ -68,6 +67,12 @@ module.exports = class importWorkflows { } for (const stage of workflowStages) { + delete stage.uid; + + if (!isEmpty(stage.next_available_stages)) { + stage.next_available_stages = ['$all']; + } + if (stage.SYS_ACL.users.uids.length && stage.SYS_ACL.users.uids[0] !== '$all') { stage.SYS_ACL.users.uids = ['$all']; } @@ -95,22 +100,14 @@ module.exports = class importWorkflows { } } } catch (error) { - addlogs( - self.config, - `Error while importing workflows roles. ${formatError(error)}`, - 'error', - ); + log(self.config, `Error while importing workflows roles. ${formatError(error)}`, 'error'); reject({ message: 'Error while importing workflows roles' }); } } } if (workflow.admin_users !== undefined) { - addlogs( - self.config, - chalk.yellow('We are skipping import of `Workflow superuser(s)` from workflow'), - 'info', - ); + log(self.config, chalk.yellow('We are skipping import of `Workflow superuser(s)` from workflow'), 'info'); delete workflow.admin_users; } // One branch is required to create workflow. @@ -121,29 +118,42 @@ module.exports = class importWorkflows { return self.stackAPIClient .workflow() .create({ workflow }) - .then(function (response) { + .then(async function (response) { + if ( + !isEmpty(filter(oldWorkflowStages, ({ next_available_stages }) => !isEmpty(next_available_stages))) + ) { + let updateRresponse = await self + .updateNextAvailableStagesUid(response, response.workflow_stages, oldWorkflowStages) + .catch((error) => { + log(self.config, `Workflow '${workflow.name}' update failed.`, 'error'); + log(self.config, error, 'error'); + }); + + if (updateRresponse) response = updateRresponse; + } + self.workflowUidMapper[workflowUid] = response; - helper.writeFileSync(workflowUidMapperPath, self.workflowUidMapper); + fileHelper.writeFileSync(workflowUidMapperPath, self.workflowUidMapper); }) .catch(function (error) { self.fails.push(workflow); if (error.errors.name) { - addlogs(self.config, `workflow ${workflow.name} already exist`, 'error'); + log(self.config, `workflow '${workflow.name}' already exist`, 'error'); } else if (error.errors['workflow_stages.0.users']) { - addlogs( + log( self.config, "Failed to import Workflows as you've specified certain roles in the Stage transition and access rules section. We currently don't import roles to the stack.", 'error', ); } else { - addlogs(self.config, `workflow ${workflow.name} failed.`, 'error'); + log(self.config, `Workflow '${workflow.name}' failed.`, 'error'); } }); } else { // the workflow has already been created - addlogs( + log( self.config, - chalk.white( `The Workflows ${workflow.name} already exists. Skipping it to avoid duplicates!`), + chalk.white(`The Workflows ${workflow.name} already exists. Skipping it to avoid duplicates!`), 'success', ); } @@ -152,15 +162,36 @@ module.exports = class importWorkflows { { concurrency: self.reqConcurrency }, ) .then(function () { - helper.writeFileSync(workflowSuccessPath, self.success); - addlogs(self.config, chalk.green('Workflows have been imported successfully!'), 'success'); + fileHelper.writeFileSync(workflowSuccessPath, self.success); + log(self.config, chalk.green('Workflows have been imported successfully!'), 'success'); resolve(); }) .catch(function (error) { - helper.writeFileSync(workflowFailsPath, self.fails); - addlogs(self.config, `Workflows import failed. ${formatError(error)}`, 'error'); + fileHelper.writeFileSync(workflowFailsPath, self.fails); + log(self.config, `Workflows import failed. ${formatError(error)}`, 'error'); return reject(error); }); }); } + + updateNextAvailableStagesUid(workflow, newWorkflowStages, oldWorkflowStages) { + newWorkflowStages = map(newWorkflowStages, (newStage, index) => { + const oldStage = oldWorkflowStages[index]; + if (!isEmpty(oldStage.next_available_stages)) { + newStage.next_available_stages = map(oldStage.next_available_stages, (stageUid) => { + if (stageUid === '$all') return stageUid; + const stageName = find(oldWorkflowStages, { uid: stageUid })?.name; + return find(newWorkflowStages, { name: stageName })?.uid; + }).filter((val) => val); + } + + return newStage; + }); + + workflow.workflow_stages = newWorkflowStages; + + const updateWorkflow = this.stackAPIClient.workflow(workflow.uid); + Object.assign(updateWorkflow, workflow); + return updateWorkflow.update(); + } }; diff --git a/packages/contentstack-import/src/import/modules/assets.ts b/packages/contentstack-import/src/import/modules/assets.ts new file mode 100644 index 0000000000..1863bed5a8 --- /dev/null +++ b/packages/contentstack-import/src/import/modules/assets.ts @@ -0,0 +1,323 @@ +import map from 'lodash/map'; +import values from 'lodash/values'; +import filter from 'lodash/filter'; +import unionBy from 'lodash/unionBy'; +import orderBy from 'lodash/orderBy'; +import isEmpty from 'lodash/isEmpty'; +import { existsSync } from 'node:fs'; +import includes from 'lodash/includes'; +import { resolve as pResolve, join } from 'node:path'; +import { FsUtility } from '@contentstack/cli-utilities'; + +import config from '../../config'; +import { log, formatError } from '../../utils'; +import BaseClass, { ApiOptions } from './base-class'; +import { ModuleClassParams } from '../../types'; + +export default class ImportAssets extends BaseClass { + private fs: FsUtility; + private assetsPath: string; + private mapperDirPath: string; + private assetsRootPath: string; + private assetUidMapperPath: string; + private assetUrlMapperPath: string; + private assetFolderUidMapperPath: string; + public assetConfig = config.modules.assets; + private environments: Record = {}; + private assetsUidMap: Record = {}; + private assetsUrlMap: Record = {}; + private assetsFolderMap: Record = {}; + + constructor({ importConfig, stackAPIClient }: ModuleClassParams) { + super({ importConfig, stackAPIClient }); + + this.assetsPath = join(this.importConfig.backupDir, 'assets'); + this.mapperDirPath = join(this.importConfig.backupDir, 'mapper', 'assets'); + this.assetUidMapperPath = join(this.mapperDirPath, 'uid-mapping.json'); + this.assetUrlMapperPath = join(this.mapperDirPath, 'url-mapping.json'); + this.assetFolderUidMapperPath = join(this.mapperDirPath, 'folder-mapping.json'); + this.assetsRootPath = join(this.importConfig.backupDir, this.assetConfig.dirName); + this.fs = new FsUtility({ basePath: this.mapperDirPath }); + this.environments = this.fs.readFile( + join(this.importConfig.backupDir, 'environments', 'environments.json'), + true, + ) as Record; + } + + /** + * @method start + * @returns {Promise} Promise + */ + async start(): Promise { + // NOTE Step 1: Import folders and create uid mapping file + await this.importFolders(); + + // NOTE Step 2: Import versioned assets and create it mapping files (uid, url) + if (this.assetConfig.includeVersionedAssets) { + if (existsSync(`${this.assetsPath}/versions`)) await this.importAssets(true); + else log(this.importConfig, 'No Versioned assets found to import', 'info'); + } + + // NOTE Step 3: Import Assets and create it mapping files (uid, url) + await this.importAssets(); + + // NOTE Step 4: Publish assets + if (this.assetConfig.publishAssets) await this.publish(); + } + + /** + * @method importFolders + * @returns {Promise} Promise + */ + async importFolders(): Promise { + const folders = this.fs.readFile(pResolve(this.assetsRootPath, 'folders.json')); + if (isEmpty(folders)) { + log(this.importConfig, 'No folders found to import', 'info'); + return; + } + const batches = this.constructFolderImportOrder(folders); + const onSuccess = ({ response, apiData: { uid, name } = { uid: null, name: '' } }: any) => { + this.assetsFolderMap[uid] = response.uid; + log(this.importConfig, `Created folder: '${name}'`, 'success'); + }; + const onReject = ({ error, apiData: { name } = { name: '' } }: any) => { + log(this.importConfig, `${name} folder creation failed.!`, 'error'); + log(this.importConfig, formatError(error), 'error'); + }; + const serializeData = (apiOptions: ApiOptions) => { + if (apiOptions.apiData.parent_uid) { + apiOptions.apiData.parent_uid = this.assetsFolderMap[apiOptions.apiData.parent_uid]; + } + + return apiOptions; + }; + + const batch = map(unionBy(batches, 'parent_uid'), 'parent_uid'); + + for (const parent_uid of batch) { + // NOTE create parent folders + /* eslint-disable no-await-in-loop */ + await this.makeConcurrentCall( + { + apiContent: orderBy(filter(batches, { parent_uid }), 'created_at'), + processName: 'import assets folders', + apiParams: { + serializeData, + reject: onReject, + resolve: onSuccess, + entity: 'create-assets-folder', + includeParamOnCompletion: true, + }, + concurrencyLimit: this.assetConfig.importFoldersConcurrency, + }, + undefined, + false, + ); + } + + if (!isEmpty(this.assetsFolderMap)) { + this.fs.writeFile(this.assetFolderUidMapperPath, this.assetsFolderMap); + } + } + + /** + * @method importAssets + * @param {boolean} isVersion boolean + * @returns {Promise} Promise + */ + async importAssets(isVersion = false): Promise { + const processName = isVersion ? 'import versioned assets' : 'import assets'; + const indexFileName = isVersion ? 'versioned-assets.json' : 'assets.json'; + const basePath = isVersion ? join(this.assetsPath, 'versions') : this.assetsPath; + const fs = new FsUtility({ basePath, indexFileName }); + const indexer = fs.indexFileContent; + const indexerCount = values(indexer).length; + + const onSuccess = ({ response = {}, apiData: { uid, url, title } = undefined }: any) => { + this.assetsUidMap[uid] = response.uid; + this.assetsUrlMap[url] = response.url; + log(this.importConfig, `Created asset: '${title}'`, 'info'); + }; + const onReject = ({ error, apiData: { title } = undefined }: any) => { + log(this.importConfig, `${title} asset upload failed.!`, 'error'); + log(this.importConfig, formatError(error), 'error'); + }; + + /* eslint-disable @typescript-eslint/no-unused-vars, guard-for-in */ + for (const index in indexer) { + const chunk = await fs.readChunkFiles.next().catch((error) => { + log(this.importConfig, error, 'error'); + }); + + if (chunk) { + let apiContent = orderBy(values(chunk as Record[]), '_version'); + + if (isVersion && this.assetConfig.importSameStructure) { + // NOTE to create same structure it must have seed assets/version 1 asset to be created first + await this.makeConcurrentCall({ + processName, + indexerCount, + currentIndexer: +index, + apiContent: filter(apiContent, ({ _version }) => _version === 1), + apiParams: { + reject: onReject, + resolve: onSuccess, + entity: 'create-assets', + includeParamOnCompletion: true, + serializeData: this.serializeAssets.bind(this), + }, + concurrencyLimit: this.assetConfig.uploadAssetsConcurrency, + }); + + apiContent = filter(apiContent, ({ _version }) => _version > 1); + } + + await this.makeConcurrentCall( + { + apiContent, + processName, + indexerCount, + currentIndexer: +index, + apiParams: { + reject: onReject, + resolve: onSuccess, + entity: 'create-assets', + includeParamOnCompletion: true, + serializeData: this.serializeAssets.bind(this), + }, + concurrencyLimit: this.assetConfig.uploadAssetsConcurrency, + }, + undefined, + !isVersion, + ); + } + } + + if (!isVersion && (!isEmpty(this.assetsUidMap) || !isEmpty(this.assetsUrlMap))) { + this.fs.writeFile(this.assetUidMapperPath, this.assetsUidMap); + this.fs.writeFile(this.assetUrlMapperPath, this.assetsUrlMap); + } + } + + /** + * @method serializeAssets + * @param {ApiOptions} apiOptions ApiOptions + * @returns {ApiOptions} ApiOptions + */ + serializeAssets(apiOptions: ApiOptions): ApiOptions { + const { apiData: asset } = apiOptions; + + if ( + !this.assetConfig.importSameStructure && + !this.assetConfig.includeVersionedAssets && + /* eslint-disable @typescript-eslint/no-unused-vars, no-prototype-builtins */ + this.assetsUidMap.hasOwnProperty(asset.uid) + ) { + log( + this.importConfig, + `Skipping upload of asset: ${asset.uid}. Its mapped to: ${this.assetsUidMap[asset.uid]}`, + 'success', + ); + apiOptions.entity = undefined; + return apiOptions; + } + + asset.upload = join(this.assetsPath, 'files', asset.uid, asset.filename); + + if (asset.parent_uid) { + asset.parent_uid = this.assetsFolderMap[asset.parent_uid]; + } + + apiOptions.apiData = asset; + + if (this.assetsUidMap[asset.uid] && this.assetConfig.importSameStructure) { + apiOptions.entity = 'replace-assets'; + apiOptions.uid = this.assetsUidMap[asset.uid] as string; + } + + return apiOptions; + } + + /** + * @method publish + * @returns {Promise} Promise + */ + async publish() { + const fs = new FsUtility({ basePath: this.assetsPath, indexFileName: 'assets.json' }); + if (isEmpty(this.assetsUidMap)) { + this.assetsUidMap = fs.readFile(this.assetUidMapperPath, true) as any; + } + const indexer = fs.indexFileContent; + const indexerCount = values(indexer).length; + const onSuccess = ({ apiData: { uid, title } = undefined }: any) => { + log(this.importConfig, `Asset '${uid}: ${title}' published successfully`, 'success'); + }; + const onReject = ({ error, apiData: { uid, title } = undefined }: any) => { + log(this.importConfig, `Asset '${uid}: ${title}' not published`, 'error'); + log(this.importConfig, formatError(error), 'error'); + }; + const serializeData = (apiOptions: ApiOptions) => { + const { apiData: asset } = apiOptions; + const publishDetails = filter(asset.publish_details, 'environment'); + const locales = map(publishDetails, 'locale'); + const environments = map(publishDetails, ({ environment }) => this.environments[environment].name); + + asset.locales = locales; + asset.environments = environments; + apiOptions.uid = this.assetsUidMap[asset.uid] as string; + apiOptions.apiData.publishDetails = { locales, environments }; + + if (!apiOptions.uid) apiOptions.entity = undefined; + + return apiOptions; + }; + + /* eslint-disable @typescript-eslint/no-unused-vars */ + for (const index in indexer) { + const apiContent = filter( + values(await fs.readChunkFiles.next()), + ({ publish_details }) => !isEmpty(publish_details), + ); + await this.makeConcurrentCall({ + apiContent, + indexerCount, + currentIndexer: +index, + processName: 'assets publish', + apiParams: { + serializeData, + reject: onReject, + resolve: onSuccess, + entity: 'publish-assets', + includeParamOnCompletion: true, + }, + concurrencyLimit: this.assetConfig.uploadAssetsConcurrency, + }); + } + } + + /** + * @method constructFolderImportOrder + * @param {Record[]} folders object + * @returns {Array>} Array> + */ + constructFolderImportOrder(folders: any): Array> { + let parentUid: unknown[] = []; + // NOTE: Read root folder + const importOrder = filter(folders, { parent_uid: null }).map(({ uid, name, parent_uid, created_at }) => { + parentUid.push(uid); + return { uid, name, parent_uid, created_at }; + }); + + while (!isEmpty(parentUid)) { + // NOTE: Read nested folders every iteration until we find empty folders + parentUid = filter(folders, ({ parent_uid }) => includes(parentUid, parent_uid)).map( + ({ uid, name, parent_uid, created_at }) => { + importOrder.push({ uid, name, parent_uid, created_at }); + return uid; + }, + ); + } + + return importOrder; + } +} diff --git a/packages/contentstack-import/src/import/modules/base-class.ts b/packages/contentstack-import/src/import/modules/base-class.ts new file mode 100644 index 0000000000..932e375235 --- /dev/null +++ b/packages/contentstack-import/src/import/modules/base-class.ts @@ -0,0 +1,377 @@ +import pick from 'lodash/pick'; +import last from 'lodash/last'; +import chunk from 'lodash/chunk'; +import isEmpty from 'lodash/isEmpty'; +import entries from 'lodash/entries'; +import isEqual from 'lodash/isEqual'; +import omit from 'lodash/omit'; +import { Stack } from '@contentstack/management/types/stack'; +import { AssetData } from '@contentstack/management/types/stack/asset'; +import { LocaleData } from '@contentstack/management/types/stack/locale'; +import { PublishConfig } from '@contentstack/management/types/utility/publish'; +import { FolderData } from '@contentstack/management/types/stack/asset/folder'; +import { ExtensionData } from '@contentstack/management/types/stack/extension'; +import { GlobalFieldData } from '@contentstack/management/types/stack/globalField'; +import { ContentTypeData } from '@contentstack/management/types/stack/contentType'; +// import { EnvironmentData } from '@contentstack/management/types/stack/environment'; +import { LabelData } from '@contentstack/management/types/stack/label'; +import { WebhookData } from '@contentstack/management/types/stack/webhook'; +import { WorkflowData } from '@contentstack/management/types/stack/workflow'; +import { RoleData } from '@contentstack/management/types/stack/role'; + +import { log } from '../../utils'; +import { ImportConfig, ModuleClassParams } from '../../types'; + +export type AdditionalKeys = { + backupDir: string; +}; + +export type ApiModuleType = + | 'create-assets' + | 'replace-assets' + | 'publish-assets' + | 'create-assets-folder' + | 'create-extensions' + | 'create-locale' + | 'update-locale' + | 'create-gfs' + | 'create-cts' + | 'update-cts' + | 'update-gfs' + | 'create-environments' + | 'create-labels' + | 'update-labels' + | 'create-webhooks' + | 'create-workflows' + | 'create-custom-role' + | 'create-entries' + | 'update-entries' + | 'publish-entries' + | 'delete-entries'; + +export type ApiOptions = { + uid?: string; + url?: string; + entity: ApiModuleType; + apiData?: Record | any; + resolve: (value: any) => Promise | void; + reject: (error: any) => Promise | void; + additionalInfo?: Record; + includeParamOnCompletion?: boolean; + serializeData?: (input: ApiOptions) => any; +}; + +export type EnvType = { + processName: string; + totalCount?: number; + indexerCount?: number; + currentIndexer?: number; + apiParams?: ApiOptions; + concurrencyLimit?: number; + apiContent: Record[]; +}; + +export type CustomPromiseHandlerInput = { + index: number; + batchIndex: number; + element?: Record; + apiParams?: ApiOptions; + isLastRequest: boolean; +}; + +export type CustomPromiseHandler = (input: CustomPromiseHandlerInput) => Promise; + +export default abstract class BaseClass { + readonly client: Stack; + + public importConfig: ImportConfig; + + public modulesConfig: any; + + constructor({ importConfig, stackAPIClient }: Omit) { + this.client = stackAPIClient; + this.importConfig = importConfig; + this.modulesConfig = importConfig.modules; + } + + get stack(): Stack { + return this.client; + } + + /** + * @method delay + * @param {number} ms number + * @returns {Promise} Promise + */ + delay(ms: number): Promise { + /* eslint-disable no-promise-executor-return */ + return new Promise((resolve) => setTimeout(resolve, ms <= 0 ? 0 : ms)); + } + + /** + * @method makeConcurrentCall + * @param {Record} env EnvType + * @param {CustomPromiseHandler} promisifyHandler CustomPromiseHandler + * @param {boolean} logBatchCompletionMsg boolean + * @returns {Promise} Promise + */ + makeConcurrentCall( + env: EnvType, + promisifyHandler?: CustomPromiseHandler, + logBatchCompletionMsg = true, + ): Promise { + const { + apiParams, + apiContent, + processName, + indexerCount, + currentIndexer, + concurrencyLimit = this.importConfig.modules.apiConcurrency, + } = env; + + /* eslint-disable no-async-promise-executor */ + return new Promise(async (resolve) => { + let batchNo = 0; + let isLastRequest = false; + const batches: Array> = chunk(apiContent, concurrencyLimit); + + /* eslint-disable no-promise-executor-return */ + if (isEmpty(batches)) return resolve(); + + for (const [batchIndex, batch] of entries(batches)) { + batchNo += 1; + const allPromise = []; + const start = Date.now(); + + for (const [index, element] of entries(batch)) { + let promise = Promise.resolve(); + isLastRequest = isEqual(last(batch as ArrayLike), element) && isEqual(last(batches), batch); + + if (promisifyHandler instanceof Function) { + promise = promisifyHandler({ + apiParams, + isLastRequest, + element, + index: Number(index), + batchIndex: Number(batchIndex), + }); + } else if (apiParams) { + apiParams.apiData = element; + promise = this.makeAPICall(apiParams, isLastRequest); + } + + allPromise.push(promise); + } + + /* eslint-disable no-await-in-loop */ + await Promise.allSettled(allPromise); + + /* eslint-disable no-await-in-loop */ + await this.logMsgAndWaitIfRequired( + processName, + start, + batches.length, + batchNo, + logBatchCompletionMsg, + indexerCount, + currentIndexer, + ); + + if (isLastRequest) resolve(); + } + }); + } + + /** + * @method logMsgAndWaitIfRequired + * @param {string} processName string + * @param {number} start number + * @param {number} batchNo - number + * @returns {Promise} Promise + */ + async logMsgAndWaitIfRequired( + processName: string, + start: number, + totelBatches: number, + batchNo: number, + logBatchCompletionMsg = true, + indexerCount?: number, + currentIndexer?: number, + ): Promise { + const end = Date.now(); + const exeTime = end - start; + + if (logBatchCompletionMsg) { + let batchMsg = ''; + // info: Batch No. 20 of import assets is complete + if (currentIndexer) batchMsg += `Current chunk processing is (${currentIndexer}/${indexerCount})`; + + log( + this.importConfig, + `Batch No. (${batchNo}/${totelBatches}) of ${processName} is complete. ${batchMsg}`, + 'success', + ); + } + + if (this.importConfig.modules.assets.displayExecutionTime) { + console.log( + `Time taken to execute: ${exeTime} milliseconds; wait time: ${ + exeTime < 1000 ? 1000 - exeTime : 0 + } milliseconds`, + ); + } + + if (exeTime < 1000) await this.delay(1000 - exeTime); + } + + /** + * @method makeAPICall + * @param {Record} apiOptions - Api related params + * @param {Record} isLastRequest - Boolean + * @return {Promise} Promise + */ + makeAPICall(apiOptions: ApiOptions, isLastRequest = false): Promise { + if (apiOptions.serializeData instanceof Function) { + apiOptions = apiOptions.serializeData(apiOptions); + } + + const { uid, entity, reject, resolve, apiData, additionalInfo = {}, includeParamOnCompletion } = apiOptions; + + const onSuccess = (response: any) => + resolve({ + response, + isLastRequest, + additionalInfo, + apiData: includeParamOnCompletion ? apiData : undefined, + }); + const onReject = (error: Error) => + reject({ + error, + isLastRequest, + additionalInfo, + apiData: includeParamOnCompletion ? apiData : undefined, + }); + + switch (entity) { + case 'create-assets-folder': + return this.stack + .asset() + .folder() + .create({ asset: pick(apiData, this.modulesConfig.assets.folderValidKeys) as FolderData }) + .then(onSuccess) + .catch(onReject); + case 'create-assets': + return this.stack + .asset() + .create(pick(apiData, [...this.modulesConfig.assets.validKeys, 'upload']) as AssetData) + .then(onSuccess) + .catch(onReject); + case 'replace-assets': + return this.stack + .asset(uid) + .replace(pick(apiData, [...this.modulesConfig.assets.validKeys, 'upload']) as AssetData) + .then(onSuccess) + .catch(onReject); + case 'publish-assets': + return this.stack + .asset(uid) + .publish(pick(apiData, ['publishDetails']) as PublishConfig) + .then(onSuccess) + .catch(onReject); + case 'create-extensions': + return this.stack + .extension() + .create({ extension: omit(apiData, ['uid']) as ExtensionData }) + .then(onSuccess) + .catch(onReject); + case 'create-locale': + return this.stack + .locale() + .create({ locale: pick(apiData, ['name', 'code']) as LocaleData }) + .then(onSuccess) + .catch(onReject); + case 'update-locale': + return this.stack + .locale(apiData.code) + .update({ locale: pick(apiData, [...this.modulesConfig.locales.requiredKeys]) as LocaleData }) + .then(onSuccess) + .catch(onReject); + case 'create-cts': + return this.stack.contentType().create(apiData).then(onSuccess).catch(onReject); + case 'update-cts': + if (additionalInfo.skip) { + return Promise.resolve(onSuccess(apiData)); + } + return apiData.update().then(onSuccess).catch(onReject); + case 'update-gfs': + return apiData.update().then(onSuccess).catch(onReject); + case 'create-environments': + // return this.stack + // .environment() + // .create({ environment: omit(apiData, ['uid']) as EnvironmentData }) + // .then(onSuccess) + // .catch(onReject); + case 'create-labels': + return this.stack + .label() + .create({ label: omit(apiData, ['uid']) as LabelData }) + .then(onSuccess) + .catch(onReject); + case 'update-labels': + return this.stack + .label(apiData.uid) + .fetch() + .then(async (response) => { + response.parent = apiData.parent; + await response.update().then(onSuccess).catch(onReject); + }) + .catch(onReject); + case 'create-webhooks': + return this.stack + .webhook() + .create({ webhook: omit(apiData, ['uid']) as WebhookData }) + .then(onSuccess) + .catch(onReject); + case 'create-workflows': + return this.stack + .workflow() + .create({ workflow: apiData as WorkflowData }) + .then(onSuccess) + .catch(onReject); + case 'create-custom-role': + return this.stack + .role() + .create({ role: apiData as RoleData }) + .then(onSuccess) + .catch(onReject); + case 'create-entries': + return this.stack + .contentType(additionalInfo.cTUid) + .entry() + .create({ entry: apiData }, { locale: additionalInfo.locale }) + .then(onSuccess) + .catch(onReject); + case 'update-entries': + return apiData.update({ locale: additionalInfo.locale }).then(onSuccess).catch(onReject); + case 'publish-entries': + if (additionalInfo.skip) { + return Promise.resolve(onSuccess(apiData)); + } + return this.stack + .contentType(additionalInfo.cTUid) + .entry(additionalInfo.entryUid) + .publish({ publishDetails: apiData, locale: additionalInfo.locale }) + .then(onSuccess) + .catch(onReject); + case 'delete-entries': + return this.stack + .contentType(apiData.cTUid) + .entry(apiData.entryUid) + .delete({ locale: this.importConfig?.master_locale?.code }) + .then(onSuccess) + .catch(onReject); + default: + return Promise.resolve(); + } + } +} diff --git a/packages/contentstack-import/src/import/modules/content-types.ts b/packages/contentstack-import/src/import/modules/content-types.ts new file mode 100644 index 0000000000..850c638376 --- /dev/null +++ b/packages/contentstack-import/src/import/modules/content-types.ts @@ -0,0 +1,244 @@ +/* eslint-disable no-prototype-builtins */ +/*! + * Contentstack Import + * Copyright (c) 2019 Contentstack LLC + * MIT Licensed + */ + +import * as path from 'path'; +import { isEmpty, find, cloneDeep, map } from 'lodash'; +import { fsUtil, log, formatError, schemaTemplate, lookupExtension } from '../../utils'; +import { ImportConfig, ModuleClassParams } from '../../types'; +import BaseClass, { ApiOptions } from './base-class'; + +export default class ContentTypesImport extends BaseClass { + private cTsMapperPath: string; + private cTsFolderPath: string; + private cTsFailsPath: string; + private cTsSuccessPath: string; + private gFsPendingPath: string; + private pendingGFs: string[]; + private createdGFs: Record[]; + private gFsFolderPath: string; + private gFsMapperFolderPath: string; + private gFs: Record[]; + private failedCTs: Record[]; + private createdCTs: Record[]; + private cTs: Record[]; + private cTsUidMapper: Record; + private config: ImportConfig; + private stackAPIClient: any; + private marketplaceAppMapperPath: string; + private reqConcurrency: number; + private ignoredFilesInContentTypesFolder: Map; + private titleToUIdMap: Map; + private fieldRules: Array>; + private installedExtensions: Record; + private cTsConfig: { + dirName: string; + fileName: string; + validKeys: string[]; + limit: number; + writeConcurrency?: number; + }; + private gFsConfig: { + dirName: string; + fileName: string; + validKeys: string[]; + limit: number; + writeConcurrency?: number; + }; + + constructor({ importConfig, stackAPIClient }: ModuleClassParams) { + super({ importConfig, stackAPIClient }); + this.cTsConfig = importConfig.modules['content-types']; + this.gFsConfig = importConfig.modules['global-fields']; + this.reqConcurrency = this.cTsConfig.writeConcurrency || this.importConfig.writeConcurrency; + this.cTsFolderPath = path.join(this.importConfig.data, this.cTsConfig.dirName); + this.cTsMapperPath = path.join(this.importConfig.data, 'mapper', 'content_types'); + this.cTsSuccessPath = path.join(this.cTsMapperPath, 'success.json'); + this.gFsFolderPath = path.resolve(this.importConfig.data, this.gFsConfig.dirName); + this.gFsMapperFolderPath = path.join(importConfig.data, 'mapper', 'global_fields', 'success.json'); + this.gFsPendingPath = path.join(importConfig.data, 'mapper', 'global_fields', 'pending_global_fields.js'); + this.marketplaceAppMapperPath = path.join(this.importConfig.data, 'mapper', 'marketplace_apps', 'uid-mapping.json'); + this.ignoredFilesInContentTypesFolder = new Map([ + ['__master.json', 'true'], + ['__priority.json', 'true'], + ['schema.json', 'true'], + ['.DS_Store', 'true'], + ]); + this.cTs = []; + this.createdCTs = []; + this.titleToUIdMap = new Map(); + this.fieldRules = []; + this.gFs = []; + this.createdGFs = []; + this.pendingGFs = []; + } + + async start(): Promise { + /** + * read content type, check if it is necessary to read the entire dir + * Seed content types + * Update content types, lookup extension. + * Update pending global fields + * write field rules + */ + + this.cTs = fsUtil.readFile(path.join(this.cTsFolderPath, 'schema.json')) as Record[]; + if (!this.cTs || isEmpty(this.cTs)) { + log(this.importConfig, 'No content type found to import', 'info'); + return; + } + await fsUtil.makeDirectory(this.cTsMapperPath); + this.installedExtensions = ( + ((await fsUtil.readFile(this.marketplaceAppMapperPath)) as any) || { extension_uid: {} } + ).extension_uid; + + await this.seedCTs(); + log(this.importConfig, 'Created content types', 'success'); + await this.updateCTs(); + log(this.importConfig, 'Updated content types with references', 'success'); + if (this.fieldRules.length > 0) { + await fsUtil.writeFile(path.join(this.cTsFolderPath, 'field_rules_uid.json'), this.fieldRules); + } + await this.updatePendingGFs().catch((error) => { + log(this.importConfig, `Error while updating pending global field ${formatError(error)}`, 'error'); + }); + log(this.importConfig, 'Updated pending global fields with content type with references', 'success'); + log(this.importConfig, 'Content types have been imported successfully!', 'success'); + } + + async seedCTs(): Promise { + const onSuccess = ({ response: globalField, apiData: { content_type: { uid = null } = {} } = {} }: any) => { + log(this.importConfig, `${uid} content type seeded`, 'info'); + }; + const onReject = ({ error, apiData: { content_type: { uid = null } = {} } = {} }: any) => { + if (error.errorCode === 115 && (error.errors.uid || error.errors.title)) { + log(this.importConfig, `${uid} content type already exist`, 'info'); + } else { + log(this.importConfig, formatError(error), 'error'); + process.exit(1); + } + }; + return await this.makeConcurrentCall({ + processName: 'Import content types', + apiContent: this.cTs, + apiParams: { + serializeData: this.serializeCTs.bind(this), + reject: onReject.bind(this), + resolve: onSuccess.bind(this), + entity: 'create-cts', + includeParamOnCompletion: true, + }, + concurrencyLimit: this.reqConcurrency, + }); + } + + /** + * @method serializeCTs + * @param {ApiOptions} apiOptions ApiOptions + * @returns {ApiOptions} ApiOptions + */ + serializeCTs(apiOptions: ApiOptions): ApiOptions { + const { apiData: contentType } = apiOptions; + const updatedCT = cloneDeep(schemaTemplate); + updatedCT.content_type.uid = contentType.uid; + updatedCT.content_type.title = contentType.title; + apiOptions.apiData = updatedCT; + return apiOptions; + } + + async updateCTs(): Promise { + const onSuccess = ({ response: contentType, apiData: { uid } }: any) => { + log(this.importConfig, `${uid} updated with references`, 'success'); + }; + const onReject = ({ error, apiData: { uid } }: any) => { + log(this.importConfig, formatError(error), 'error'); + throw new Error(`Content type '${uid}' update error`); + }; + return await this.makeConcurrentCall({ + processName: 'Update content types', + apiContent: this.cTs, + apiParams: { + serializeData: this.serializeUpdateCTs.bind(this), + reject: onReject.bind(this), + resolve: onSuccess.bind(this), + entity: 'update-cts', + includeParamOnCompletion: true, + }, + concurrencyLimit: this.reqConcurrency, + }); + } + + /** + * @method serializeUpdateCTs + * @param {ApiOptions} apiOptions ApiOptions + * @returns {ApiOptions} ApiOptions + */ + serializeUpdateCTs(apiOptions: ApiOptions): ApiOptions { + const { apiData: contentType } = apiOptions; + if (contentType.field_rules) { + this.fieldRules.push(contentType.uid); + delete contentType.field_rules; + } + lookupExtension( + this.importConfig, + contentType.schema, + this.importConfig.preserveStackVersion, + this.installedExtensions, + ); + const contentTypePayload = this.stack.contentType(contentType.uid); + Object.assign(contentTypePayload, cloneDeep(contentType)); + apiOptions.apiData = contentTypePayload; + return apiOptions; + } + + async updatePendingGFs(): Promise { + this.pendingGFs = fsUtil.readFile(this.gFsPendingPath) as any; + this.gFs = fsUtil.readFile(path.resolve(this.gFsFolderPath, this.gFsConfig.fileName)) as Record[]; + const onSuccess = ({ response: globalField, apiData: { uid } = undefined }: any) => { + log(this.importConfig, `Updated the global field ${uid} with content type references`, 'info'); + }; + const onReject = ({ error, apiData: { uid } = undefined }: any) => { + log(this.importConfig, `failed to update the global field '${uid}' ${formatError(error)}`, 'error'); + }; + return await this.makeConcurrentCall({ + processName: 'Update pending global fields', + apiContent: map(this.pendingGFs, (uid: string) => { + return { uid }; + }), + apiParams: { + serializeData: this.serializeUpdateGFs.bind(this), + reject: onReject.bind(this), + resolve: onSuccess.bind(this), + entity: 'update-gfs', + includeParamOnCompletion: true, + }, + concurrencyLimit: this.reqConcurrency, + }); + } + + /** + * @method serializeUpdateGFs + * @param {ApiOptions} apiOptions ApiOptions + * @returns {ApiOptions} ApiOptions + */ + serializeUpdateGFs(apiOptions: ApiOptions): ApiOptions { + const { + apiData: { uid }, + } = apiOptions; + const globalField = find(this.gFs, { uid }); + lookupExtension( + this.importConfig, + globalField.schema, + this.importConfig.preserveStackVersion, + this.installedExtensions, + ); + apiOptions.apiData = globalField; + const globalFieldPayload = this.stack.globalField(uid); + Object.assign(globalFieldPayload, cloneDeep(globalField)); + apiOptions.apiData = globalFieldPayload; + return apiOptions; + } +} diff --git a/packages/contentstack-import/src/import/modules/custom-roles.ts b/packages/contentstack-import/src/import/modules/custom-roles.ts new file mode 100644 index 0000000000..643812a8dd --- /dev/null +++ b/packages/contentstack-import/src/import/modules/custom-roles.ts @@ -0,0 +1,209 @@ +import isEmpty from 'lodash/isEmpty'; +import values from 'lodash/values'; +import { join, resolve } from 'node:path'; + +import config from '../../config'; +import { log, formatError, fsUtil, fileHelper } from '../../utils'; +import BaseClass, { ApiOptions } from './base-class'; +import { ModuleClassParams, CustomRoleConfig } from '../../types'; +import { forEach, map } from 'lodash'; + +export default class ImportCustomRoles extends BaseClass { + private customRolesMapperPath: string; + private customRolesFolderPath: string; + private customRolesUidMapperPath: string; + private envUidMapperFolderPath: string; + private entriesUidMapperFolderPath: string; + private createdCustomRolesPath: string; + private customRolesFailsPath: string; + private customRolesConfig: CustomRoleConfig; + private customRoles: Record; + private customRolesLocales: Record; + private customRolesUidMapper: Record; + private createdCustomRoles: Record[]; + private failedCustomRoles: Record[]; + private environmentsUidMap: Record; + private entriesUidMap: Record; + private localesUidMap: Record; + public targetLocalesMap: Record; + public sourceLocalesMap: Record; + + constructor({ importConfig, stackAPIClient }: ModuleClassParams) { + super({ importConfig, stackAPIClient }); + this.customRolesConfig = config.modules.customRoles; + this.customRolesMapperPath = join(this.importConfig.backupDir, 'mapper', 'custom-roles'); + this.customRolesFolderPath = join(this.importConfig.backupDir, this.customRolesConfig.dirName); + this.customRolesUidMapperPath = join(this.customRolesMapperPath, 'uid-mapping.json'); + this.envUidMapperFolderPath = join(this.importConfig.backupDir, 'mapper', 'environments'); + this.entriesUidMapperFolderPath = join(this.importConfig.backupDir, 'mapper', 'entries'); + this.createdCustomRolesPath = join(this.customRolesMapperPath, 'success.json'); + this.customRolesFailsPath = join(this.customRolesMapperPath, 'fails.json'); + this.customRoles = {}; + this.failedCustomRoles = []; + this.createdCustomRoles = []; + this.customRolesUidMapper = {}; + this.customRolesLocales = {}; + this.environmentsUidMap = {}; + this.entriesUidMap = {}; + this.localesUidMap = {}; + } + + /** + * @method start + * @returns {Promise} Promise + */ + async start(): Promise { + log(this.importConfig, 'Migrating custom-roles', 'info'); + + //Step1 check folder exists or not + if (fileHelper.fileExistsSync(this.customRolesFolderPath)) { + this.customRoles = fsUtil.readFile(join(this.customRolesFolderPath, this.customRolesConfig.fileName),true) as Record; + this.customRolesLocales = fsUtil.readFile(join(this.customRolesFolderPath, this.customRolesConfig.customRolesLocalesFileName),true) as Record; + } else { + log(this.importConfig, `No such file or directory - '${this.customRolesFolderPath}'`, 'error'); + return; + } + + //create webhooks in mapper directory + await fsUtil.makeDirectory(this.customRolesMapperPath); + this.customRolesUidMapper = fileHelper.fileExistsSync(this.customRolesUidMapperPath) + ? (fsUtil.readFile(join(this.customRolesUidMapperPath), true) as Record) + : {}; + this.environmentsUidMap = fileHelper.fileExistsSync(this.envUidMapperFolderPath) + ? (fsUtil.readFile(join(this.envUidMapperFolderPath, 'uid-mapping.json'), true) as Record) + : {}; + this.entriesUidMap = fileHelper.fileExistsSync(this.entriesUidMapperFolderPath) + ? (fsUtil.readFile(join(this.entriesUidMapperFolderPath, 'uid-mapping.json'), true) as Record) + : {}; + + //source and target stack locale map + await this.getLocalesUidMap(); + await this.importCustomRoles(); + + if (this.createdCustomRoles?.length) { + fsUtil.writeFile(this.createdCustomRolesPath, this.createdCustomRoles); + } + + if (this.failedCustomRoles?.length) { + fsUtil.writeFile(this.customRolesFailsPath, this.failedCustomRoles); + } + + log(this.importConfig, 'Custom roles have been imported successfully!', 'success'); + } + + async getLocalesUidMap(): Promise { + const { items } = await this.stack + .locale() + .query() + .find() + .then((data: any) => data) + .catch((error) => log(this.importConfig, `Failed to fetch locale.${formatError(error)}`, 'error')); + this.targetLocalesMap = {}; + this.sourceLocalesMap = {}; + + forEach(items, (locale: any) => { + this.targetLocalesMap[locale.code] = locale.uid; + }); + + for (const key in this.customRolesLocales) { + const sourceLocales = this.customRolesLocales[key] as Record; + this.sourceLocalesMap[sourceLocales.code] = key; + } + + for (const key in this.sourceLocalesMap) { + const sourceLocaleKey = this.sourceLocalesMap[key] as string; + this.localesUidMap[sourceLocaleKey] = this.targetLocalesMap[key]; + } + } + + async importCustomRoles() { + if (this.customRoles === undefined || isEmpty(this.customRoles)) { + log(this.importConfig, 'No custom-roles found', 'info'); + return resolve(); + } + + const apiContent = values(this.customRoles); + + const onSuccess = ({ response, apiData: { uid, name } = { uid: null, name: '' } }: any) => { + this.createdCustomRoles.push(response); + this.customRolesUidMapper[uid] = response.uid; + log(this.importConfig, `custom-role '${name}' imported successfully`, 'success'); + fsUtil.writeFile(this.customRolesUidMapperPath, this.customRolesUidMapper); + }; + + const onReject = ({ error, apiData }: any) => { + const err = error?.message ? JSON.parse(error.message) : error; + const { name } = apiData; + + if (err?.errors?.name) { + log(this.importConfig, `custom-role '${name}' already exists`, 'info'); + } else { + this.failedCustomRoles.push(apiData); + log(this.importConfig, `custom-role '${name}' failed to be import.${formatError(error)}`, 'error'); + log(this.importConfig, formatError(error), 'error'); + } + }; + + await this.makeConcurrentCall( + { + apiContent, + processName: 'create custom role', + apiParams: { + serializeData: this.serializeWebhooks.bind(this), + reject: onReject.bind(this), + resolve: onSuccess.bind(this), + entity: 'create-custom-role', + includeParamOnCompletion: true, + }, + concurrencyLimit: config.fetchConcurrency || 1, + }, + undefined, + false, + ); + } + + /** + * @method serializeWebhooks + * @param {ApiOptions} apiOptions ApiOptions + * @returns {ApiOptions} ApiOptions + */ + serializeWebhooks(apiOptions: ApiOptions): ApiOptions { + const { apiData: customRole } = apiOptions; + + if (this.customRolesUidMapper.hasOwnProperty(customRole.uid)) { + log( + this.importConfig, + `custom-role '${customRole.name}' already exists. Skipping it to avoid duplicates!`, + 'info', + ); + apiOptions.entity = undefined; + } else { + let branchRuleExists: boolean = false; + forEach(customRole.rules, (rule: Record) => { + rule = this.getTransformUidsFactory(rule); + // rules.branch is required to create custom roles. + if (rule.module === 'branch') branchRuleExists = true; + }); + if (!branchRuleExists) { + customRole.rules.push({ + module: 'branch', + branches: ['main'], + acl: { read: true }, + }); + } + apiOptions.apiData = customRole; + } + return apiOptions; + } + + getTransformUidsFactory = (rule: Record) => { + if (rule.module === 'environment') { + rule.environments = map(rule.environments, (env: any) => this.environmentsUidMap[env]); + } else if (rule.module === 'locale') { + rule.locales = map(rule.locales, (locale: any) => this.localesUidMap[locale]); + } else if (rule.module === 'entry') { + rule.entries = map(rule.entries, (entry: any) => this.entriesUidMap[entry]); + } + return rule; + }; +} diff --git a/packages/contentstack-import/src/import/modules/entries.ts b/packages/contentstack-import/src/import/modules/entries.ts new file mode 100644 index 0000000000..cf84edfe08 --- /dev/null +++ b/packages/contentstack-import/src/import/modules/entries.ts @@ -0,0 +1,674 @@ +/* eslint-disable no-prototype-builtins */ +/*! + * Contentstack Import + * Copyright (c) 2019 Contentstack LLC + * MIT Licensed + */ + +import * as path from 'path'; +import { isEmpty, values, cloneDeep, find, indexOf, forEach } from 'lodash'; +import { ContentType, FsUtility } from '@contentstack/cli-utilities'; +import { + fsUtil, + log, + formatError, + lookupExtension, + suppressSchemaReference, + removeUidsFromJsonRteFields, + removeEntryRefsFromJSONRTE, + restoreJsonRteEntryRefs, + lookupEntries, + lookupAssets, + fileHelper, +} from '../../utils'; +import { ModuleClassParams } from '../../types'; +import BaseClass, { ApiOptions } from './base-class'; + +export default class EntriesImport extends BaseClass { + private assetUidMapperPath: string; + private assetUidMapper: Record; + private assetUrlMapper: Record; + private assetUrlMapperPath: string; + private entriesMapperPath: string; + private envPath: string; + private entriesUIDMapperPath: string; + private uniqueUidMapperPath: string; + private modifiedCTsPath: string; + private marketplaceAppMapperPath: string; + private entriesConfig: Record; + private cTsPath: string; + private localesPath: string; + private importConcurrency: number; + private entriesPath: string; + private cTs: Record[]; + private modifiedCTs: Record[]; + private refCTs: string[]; + private jsonRteCTs: Record; + private jsonRteCTsWithRef: Record; + private jsonRteEntries: Record; + private installedExtensions: Record[]; + private createdEntries: Record[]; + private failedEntries: Record[]; + private locales: Record[]; + private entriesUidMapper: Record; + private envs: Record; + private autoCreatedEntries: Record[]; + + constructor({ importConfig, stackAPIClient }: ModuleClassParams) { + super({ importConfig, stackAPIClient }); + this.assetUidMapperPath = path.resolve(importConfig.data, 'mapper', 'assets', 'uid-mapping.json'); + this.assetUrlMapperPath = path.resolve(importConfig.data, 'mapper', 'assets', 'url-mapping.json'); + this.entriesMapperPath = path.resolve(importConfig.data, 'mapper', 'entries'); + this.envPath = path.resolve(importConfig.data, 'environments', 'environments.json'); + this.entriesUIDMapperPath = path.join(this.entriesMapperPath, 'uid-mapping.json'); + this.uniqueUidMapperPath = path.join(this.entriesMapperPath, 'unique-mapping.json'); + this.modifiedCTsPath = path.join(this.entriesMapperPath, 'modified-schemas.json'); + this.marketplaceAppMapperPath = path.join(this.importConfig.data, 'mapper', 'marketplace_apps', 'uid-mapping.json'); + this.entriesConfig = importConfig.modules.entries; + this.entriesPath = path.resolve(importConfig.data, this.entriesConfig.dirName); + this.cTsPath = path.resolve(importConfig.data, importConfig.modules['content-types'].dirName); + this.localesPath = path.resolve( + importConfig.data, + importConfig.modules.locales.dirName, + importConfig.modules.locales.fileName, + ); + this.importConcurrency = this.entriesConfig.importConcurrency || importConfig.importConcurrency; + this.entriesUidMapper = {}; + this.modifiedCTs = []; + this.refCTs = []; + this.jsonRteCTs = []; + this.jsonRteCTsWithRef = []; + this.envs = {}; + this.autoCreatedEntries = []; + } + + async start(): Promise { + try { + this.cTs = fsUtil.readFile(path.join(this.cTsPath, 'schema.json')) as Record[]; + if (!this.cTs || isEmpty(this.cTs)) { + log(this.importConfig, 'No content type found', 'info'); + return; + } + this.installedExtensions = ( + ((await fsUtil.readFile(this.marketplaceAppMapperPath)) as any) || { extension_uid: {} } + ).extension_uid; + + this.assetUidMapper = (fsUtil.readFile(this.assetUidMapperPath) as Record) || {}; + this.assetUrlMapper = (fsUtil.readFile(this.assetUrlMapperPath) as Record) || {}; + + fsUtil.makeDirectory(this.entriesMapperPath); + await this.disableMandatoryCTReferences(); + this.locales = values(fsUtil.readFile(this.localesPath) as Record[]); + this.locales.unshift(this.importConfig.master_locale); // adds master locale to the list + + //Create Entries + const entryRequestOptions = this.populateEntryCreatePayload(); + for (let entryRequestOption of entryRequestOptions) { + await this.createEntries(entryRequestOption); + } + await fileHelper.writeLargeFile(path.join(this.entriesMapperPath, 'uid-mapping.json'), this.entriesUidMapper); // TBD: manages mapper in one file, should find an alternative + fsUtil.writeFile(path.join(this.entriesMapperPath, 'failed-entries.json'), this.failedEntries); + + // Update entries with references + const entryUpdateRequestOptions = this.populateEntryUpdatePayload(); + for (let entryUpdateRequestOption of entryUpdateRequestOptions) { + await this.updateEntriesWithReferences(entryUpdateRequestOption).catch((error) => { + log( + this.importConfig, + `Error while updating entries references of ${entryUpdateRequestOption.cTUid} in locale ${entryUpdateRequestOption.locale}`, + 'error', + ); + log(this.importConfig, formatError(error), 'error'); + }); + } + fsUtil.writeFile(path.join(this.entriesMapperPath, 'failed-entries.json'), this.failedEntries); + + log(this.importConfig, 'Restoring content type changes', 'info'); + await this.enableMandatoryCTReferences().catch((error) => { + log(this.importConfig, `Error while updating content type references ${formatError(error)}`, 'error'); + }); + + if (this.autoCreatedEntries.length > 0) { + log(this.importConfig, 'Removing entries from master language which got created by default', 'info'); + await this.removeAutoCreatedEntries().catch((error) => { + log( + this.importConfig, + `Error while removing auto created entries in master locale ${formatError(error)}`, + 'error', + ); + }); + } + // Update field rule of content types which are got removed earlier + log(this.importConfig, 'Updating the field rules of content type', 'info'); + await this.updateFieldRules().catch((error) => { + log(this.importConfig, `Error while updating field rules of content type ${formatError(error)}`, 'error'); + }); + log(this.importConfig, 'Entries imported successfully', 'success'); + + // Publishing entries + if (this.importConfig.entriesPublish) { + log(this.importConfig, 'Publishing entries', 'info'); + this.envs = fileHelper.readFileSync(this.envPath); + for (let entryRequestOption of entryRequestOptions) { + await this.publishEntries(entryRequestOption).catch((error) => { + log( + this.importConfig, + `Error in publishing entries of ${entryRequestOption.cTUid} in locale ${ + entryRequestOption.locale + } ${formatError(error)}`, + 'error', + ); + }); + } + log(this.importConfig, 'All the entries have been published successfully', 'success'); + } + } catch (error) { + log(this.importConfig, formatError(error), 'error'); + throw new Error('Error while importing entries'); + } + } + + async disableMandatoryCTReferences() { + const onSuccess = ({ response: contentType, apiData: { uid } }: any) => { + log(this.importConfig, `${uid} content type references removed temporarily`, 'success'); + }; + const onReject = ({ error, apiData: { uid } }: any) => { + log(this.importConfig, formatError(error), 'error'); + throw new Error(`${uid} content type references removal failed`); + }; + return await this.makeConcurrentCall({ + processName: 'Update content types (removing mandatory references temporarily)', + apiContent: this.cTs, + apiParams: { + serializeData: this.serializeUpdateCTs.bind(this), + reject: onReject.bind(this), + resolve: onSuccess.bind(this), + entity: 'update-cts', + includeParamOnCompletion: true, + }, + concurrencyLimit: this.importConcurrency, + }).then(() => { + fsUtil.writeFile(this.modifiedCTsPath, this.modifiedCTs); + }); + } + + /** + * @method serializeUpdateCTs + * @param {ApiOptions} apiOptions ApiOptions + * @returns {ApiOptions} ApiOptions + */ + serializeUpdateCTs(apiOptions: ApiOptions): ApiOptions { + const { apiData: contentType } = apiOptions; + if (contentType.field_rules) { + delete contentType.field_rules; + } + const flag = { + suppressed: false, + references: false, + jsonRte: false, + jsonRteEmbeddedEntries: false, + }; + suppressSchemaReference(contentType.schema, flag); + // Check if suppress modified flag + if (flag.suppressed) { + this.modifiedCTs.push(find(this.cTs, { uid: contentType.uid })); + } else { + // Note: Skips the content type from update if no reference found + apiOptions.additionalInfo = { skip: true }; + return apiOptions; + } + + if (flag.references) { + this.refCTs.push(contentType.uid); + } + + if (flag.jsonRte) { + this.jsonRteCTs.push(contentType.uid); + if (flag.jsonRteEmbeddedEntries) { + this.jsonRteCTsWithRef.push(contentType.uid); + if (this.refCTs.indexOf(contentType.uid) === -1) { + this.refCTs.push(contentType.uid); + } + } + } + lookupExtension( + this.importConfig, + contentType.schema, + this.importConfig.preserveStackVersion, + this.installedExtensions, + ); + const contentTypePayload = this.stack.contentType(contentType.uid); + Object.assign(contentTypePayload, cloneDeep(contentType)); + apiOptions.apiData = contentTypePayload; + return apiOptions; + } + + populateEntryCreatePayload(): { cTUid: string; locale: string }[] { + const requestOptions: { cTUid: string; locale: string }[] = []; + for (let locale of this.locales) { + for (let contentType of this.cTs) { + requestOptions.push({ + cTUid: contentType.uid, + locale: locale.code, + }); + } + } + return requestOptions; + } + + async createEntries({ cTUid, locale }: { cTUid: string; locale: string }): Promise { + const processName = 'Create Entries'; + const indexFileName = 'index.json'; + const basePath = path.join(this.entriesPath, cTUid, locale); + const fs = new FsUtility({ basePath, indexFileName }); + const indexer = fs.indexFileContent; + const indexerCount = values(indexer).length; + if (indexerCount === 0) { + return Promise.resolve(); + } + log(this.importConfig, `Starting to create entries for ${cTUid} in locale ${locale}`, 'info'); + const isMasterLocale = locale === this.importConfig?.master_locale?.code; + // Write created entries + const entriesCreateFileHelper = new FsUtility({ + moduleName: 'created-entries', + indexFileName: 'index.json', + basePath: path.join(this.entriesMapperPath, cTUid, locale), + chunkFileSize: this.entriesConfig.chunkFileSize, + keepMetadata: false, + omitKeys: this.entriesConfig.invalidKeys, + }); + const contentType = find(this.cTs, { uid: cTUid }); + + const onSuccess = ({ response, apiData: entry, additionalInfo: { entryFileName } }: any) => { + log(this.importConfig, `Created entry: '${entry.title}' of content type ${cTUid} in locale ${locale}`, 'info'); + this.entriesUidMapper[entry.uid] = response.uid; + entry.sourceEntryFilePath = path.join(basePath, entryFileName); // stores source file path temporarily + entry.entryOldUid = entry.uid; // stores old uid temporarily + if (!isMasterLocale) { + this.autoCreatedEntries.push({ cTUid, locale, entryUid: response.uid }); + } + entriesCreateFileHelper.writeIntoFile({ [response.uid]: entry } as any, { mapKeyVal: true }); + }; + const onReject = ({ error, apiData: { uid, title } }: any) => { + log(this.importConfig, `${title} entry of content type ${cTUid} in locale ${locale} failed to create`, 'error'); + log(this.importConfig, formatError(error), 'error'); + this.failedEntries.push({ content_type: cTUid, locale, entry: { uid, title } }); + }; + + for (const index in indexer) { + const chunk = await fs.readChunkFiles.next().catch((error) => { + log(this.importConfig, formatError(error), 'error'); + }); + + if (chunk) { + let apiContent = values(chunk as Record[]); + await this.makeConcurrentCall({ + apiContent, + processName, + indexerCount, + currentIndexer: +index, + apiParams: { + reject: onReject, + resolve: onSuccess, + entity: 'create-entries', + includeParamOnCompletion: true, + serializeData: this.serializeEntries.bind(this), + additionalInfo: { contentType, locale, cTUid, entryFileName: indexer[index] }, + }, + concurrencyLimit: this.importConcurrency, + }).then(() => { + entriesCreateFileHelper?.completeFile(true); + log(this.importConfig, `Created entries for content type ${cTUid} in locale ${locale}`, 'success'); + }); + } + } + } + + /** + * @method serializeEntries + * @param {ApiOptions} apiOptions ApiOptions + * @returns {ApiOptions} ApiOptions + */ + serializeEntries(apiOptions: ApiOptions): ApiOptions { + let { + apiData: entry, + additionalInfo: { cTUid, locale, contentType }, + } = apiOptions; + + if (this.jsonRteCTs.indexOf(cTUid) > -1) { + entry = removeUidsFromJsonRteFields(entry, contentType.schema); + } + // remove entry references from json-rte fields + if (this.jsonRteCTsWithRef.indexOf(cTUid) > -1) { + entry = removeEntryRefsFromJSONRTE(entry, contentType.schema); + } + // will replace all old asset uid/urls with new ones + entry = lookupAssets( + { + content_type: contentType, + entry: entry, + }, + this.assetUidMapper, + this.assetUrlMapper, + path.join(this.entriesPath, cTUid), + this.installedExtensions, + ); + delete entry.publish_details; + apiOptions.apiData = entry; + return apiOptions; + } + + populateEntryUpdatePayload(): { cTUid: string; locale: string }[] { + const requestOptions: { cTUid: string; locale: string }[] = []; + for (let locale of this.locales) { + for (let cTUid of this.refCTs) { + requestOptions.push({ + cTUid, + locale: locale.code, + }); + } + } + return requestOptions; + } + + async updateEntriesWithReferences({ cTUid, locale }: { cTUid: string; locale: string }): Promise { + const processName = 'Update Entries'; + const indexFileName = 'index.json'; + const basePath = path.join(this.entriesMapperPath, cTUid, locale); + const fs = new FsUtility({ basePath, indexFileName }); + const indexer = fs.indexFileContent; + const indexerCount = values(indexer).length; + if (indexerCount === 0) { + return Promise.resolve(); + } + log(this.importConfig, `Starting to update entries with references for ${cTUid} in locale ${locale}`, 'info'); + + const contentType = find(this.cTs, { uid: cTUid }); + + const onSuccess = ({ response, apiData: { uid, url, title } }: any) => { + log(this.importConfig, `Updated entry: '${title}' of content type ${cTUid} in locale ${locale}`, 'info'); + }; + const onReject = ({ error, apiData: { uid, title } }: any) => { + log(this.importConfig, `${title} entry of content type ${cTUid} in locale ${locale} failed to update`, 'error'); + log(this.importConfig, formatError(error), 'error'); + this.failedEntries.push({ content_type: cTUid, locale, entry: { uid: this.entriesUidMapper[uid], title } }); + }; + + for (const index in indexer) { + const chunk = await fs.readChunkFiles.next().catch((error) => { + log(this.importConfig, formatError(error), 'error'); + }); + + if (chunk) { + let apiContent = values(chunk as Record[]); + await this.makeConcurrentCall({ + apiContent, + processName, + indexerCount, + currentIndexer: +index, + apiParams: { + reject: onReject, + resolve: onSuccess, + entity: 'update-entries', + includeParamOnCompletion: true, + serializeData: this.serializeUpdateEntries.bind(this), + additionalInfo: { contentType, locale, cTUid }, + }, + concurrencyLimit: this.importConcurrency, + }).then(() => { + log(this.importConfig, `Updated entries for content type ${cTUid} in locale ${locale}`, 'success'); + }); + } + } + } + + /** + * @method serializeUpdateEntries + * @param {ApiOptions} apiOptions ApiOptions + * @returns {ApiOptions} ApiOptions + */ + serializeUpdateEntries(apiOptions: ApiOptions): ApiOptions { + let { + apiData: entry, + additionalInfo: { cTUid, locale, contentType }, + } = apiOptions; + + const sourceEntryFilePath = entry.sourceEntryFilePath; + const sourceEntry = ((fsUtil.readFile(sourceEntryFilePath) || {}) as Record)[entry.entryOldUid]; + // Removing temp values + delete entry.sourceEntryFilePath; + delete entry.entryOldUid; + if (this.jsonRteCTs.indexOf(cTUid) > -1) { + // the entries stored in eSuccessFilePath, have the same uids as the entries from source data + entry = restoreJsonRteEntryRefs(entry, sourceEntry, contentType.schema, { + mappedAssetUids: this.assetUidMapper, + mappedAssetUrls: this.assetUrlMapper, + }); + } + + entry = lookupEntries( + { + content_type: contentType, + entry, + }, + this.entriesUidMapper, + path.join(this.entriesMapperPath, cTUid, locale), + ); + + const entryResponse = this.stack.contentType(contentType.uid).entry(this.entriesUidMapper[entry.uid]); + Object.assign(entryResponse, cloneDeep(entry)); + delete entryResponse.publish_details; + apiOptions.apiData = entryResponse; + return apiOptions; + } + + async enableMandatoryCTReferences(): Promise { + const onSuccess = ({ response: contentType, apiData: { uid } }: any) => { + log(this.importConfig, `${uid} content type references updated`, 'success'); + }; + const onReject = ({ error, apiData: { uid } }: any) => { + log(this.importConfig, formatError(error), 'error'); + throw new Error(`Failed to update references of content type ${uid}`); + }; + return await this.makeConcurrentCall({ + processName: 'Update content type references', + apiContent: this.modifiedCTs, + apiParams: { + serializeData: this.serializeUpdateCTsWithRef.bind(this), + reject: onReject.bind(this), + resolve: onSuccess.bind(this), + entity: 'update-cts', + includeParamOnCompletion: true, + }, + concurrencyLimit: this.importConcurrency, + }); + } + + /** + * @method serializeUpdateCTsWithRef + * @param {ApiOptions} apiOptions ApiOptions + * @returns {ApiOptions} ApiOptions + */ + serializeUpdateCTsWithRef(apiOptions: ApiOptions): ApiOptions { + const { apiData: contentType } = apiOptions; + if (contentType.field_rules) { + delete contentType.field_rules; + } + lookupExtension( + this.importConfig, + contentType.schema, + this.importConfig.preserveStackVersion, + this.installedExtensions, + ); + const contentTypePayload = this.stack.contentType(contentType.uid); + Object.assign(contentTypePayload, cloneDeep(contentType)); + apiOptions.apiData = contentTypePayload; + return apiOptions; + } + + async removeAutoCreatedEntries(): Promise { + const onSuccess = ({ response, apiData: { entryUid } }: any) => { + log(this.importConfig, `Auto created entry in master locale removed - entry uid ${entryUid} `, 'success'); + }; + const onReject = ({ error, apiData: { entryUid } }: any) => { + log( + this.importConfig, + `Failed to remove auto created entry in master locale - entry uid ${entryUid} \n ${formatError(error)}`, + 'error', + ); + }; + return await this.makeConcurrentCall({ + processName: 'Remove auto created entry in master locale', + apiContent: this.autoCreatedEntries, + apiParams: { + reject: onReject.bind(this), + resolve: onSuccess.bind(this), + entity: 'delete-entries', + includeParamOnCompletion: true, + }, + concurrencyLimit: this.importConcurrency, + }); + } + + async updateFieldRules(): Promise { + let cTsWithFieldRules = fsUtil.readFile(path.join(this.cTsPath + '/field_rules_uid.json')) as Record[]; + if (!cTsWithFieldRules || cTsWithFieldRules?.length === 0) { + return; + } + for (let cTUid of cTsWithFieldRules) { + const contentType = find(this.cTs, { uid: cTUid }); + if (contentType.field_rules) { + let fieldRuleLength = contentType.field_rules.length; + for (let k = 0; k < fieldRuleLength; k++) { + let fieldRuleConditionLength = contentType.field_rules[k].conditions.length; + for (let i = 0; i < fieldRuleConditionLength; i++) { + if (contentType.field_rules[k].conditions[i].operand_field === 'reference') { + let fieldRulesValue = contentType.field_rules[k].conditions[i].value; + let fieldRulesArray = fieldRulesValue.split('.'); + let updatedValue = []; + for (const element of fieldRulesArray) { + let splittedFieldRulesValue = element; + if (this.entriesUidMapper.hasOwnProperty(splittedFieldRulesValue)) { + updatedValue.push(this.entriesUidMapper[splittedFieldRulesValue]); + } else { + updatedValue.push(element); + } + } + contentType.field_rules[k].conditions[i].value = updatedValue.join('.'); + } + } + } + const contentTypeResponse: any = await this.stack + .contentType(contentType.uid) + .fetch() + .catch((error) => { + log(this.importConfig, `failed to update the field rules of ${cTUid} ${formatError(error)}`, 'error'); + }); + if (!contentTypeResponse) { + continue; + } + contentTypeResponse.field_rules = contentType.field_rules; + await contentTypeResponse.update().catch((error: Error) => { + log(this.importConfig, `failed to update the field rules of ${cTUid} ${formatError(error)}`, 'error'); + }); + log(this.importConfig, `Updated the field rules of ${cTUid}`, 'info'); + } else { + log(this.importConfig, `No field rules found in content type ${cTUid} to update`, 'error'); + } + } + } + + async publishEntries({ cTUid, locale }: { cTUid: string; locale: string }): Promise { + const processName = 'Publish Entries'; + const indexFileName = 'index.json'; + const basePath = path.join(this.entriesPath, cTUid, locale); + const fs = new FsUtility({ basePath, indexFileName }); + const indexer = fs.indexFileContent; + const indexerCount = values(indexer).length; + const contentType = find(this.cTs, { uid: cTUid }); + + if (indexerCount === 0) { + return Promise.resolve(); + } + log(this.importConfig, `Starting publish entries for ${cTUid} in locale ${locale}`, 'info'); + + const onSuccess = ({ response, apiData: { environments }, additionalInfo: { entryUid } }: any) => { + log( + this.importConfig, + `Published entry: '${entryUid}' of content type ${cTUid} and locale ${locale} in ${environments?.join( + ',', + )} environments`, + 'info', + ); + }; + const onReject = ({ error, apiData, additionalInfo: { entryUid } }: any) => { + log( + this.importConfig, + `${entryUid} entry of content type ${cTUid} in locale ${locale} failed to publish`, + 'error', + ); + log(this.importConfig, formatError(error), 'error'); + }; + + for (const index in indexer) { + const chunk = await fs.readChunkFiles.next().catch((error) => { + log(this.importConfig, formatError(error), 'error'); + }); + + if (chunk) { + let apiContent = values(chunk as Record[]); + await this.makeConcurrentCall({ + apiContent, + processName, + indexerCount, + currentIndexer: +index, + apiParams: { + reject: onReject, + resolve: onSuccess, + entity: 'publish-entries', + includeParamOnCompletion: true, + serializeData: this.serializePublishEntries.bind(this), + additionalInfo: { contentType, locale, cTUid }, + }, + concurrencyLimit: this.importConcurrency, + }).then(() => { + log(this.importConfig, `Published entries for content type ${cTUid} in locale ${locale}`, 'success'); + }); + } + } + } + + /** + * @method serializeEntries + * @param {ApiOptions} apiOptions ApiOptions + * @returns {ApiOptions} ApiOptions + */ + serializePublishEntries(apiOptions: ApiOptions): ApiOptions { + let { apiData: entry, additionalInfo } = apiOptions; + additionalInfo.entryUid = this.entriesUidMapper[entry.uid]; + const requestObject: { + environments: Array; + locales: Array; + } = { + environments: [], + locales: [], + }; + if (entry.publish_details && entry.publish_details.length > 0) { + forEach(entry.publish_details, (pubObject) => { + if ( + this.envs.hasOwnProperty(pubObject.environment) && + indexOf(requestObject.environments, this.envs[pubObject.environment].name) === -1 + ) { + requestObject.environments.push(this.envs[pubObject.environment].name); + } + if (pubObject.locale && indexOf(requestObject.locales, pubObject.locale) === -1) { + requestObject.locales.push(pubObject.locale); + } + }); + } else { + additionalInfo.skip = true; + } + apiOptions.apiData = requestObject; + return apiOptions; + } +} diff --git a/packages/contentstack-import/src/import/modules/environments.ts b/packages/contentstack-import/src/import/modules/environments.ts new file mode 100644 index 0000000000..a5c7ce4446 --- /dev/null +++ b/packages/contentstack-import/src/import/modules/environments.ts @@ -0,0 +1,132 @@ +import isEmpty from 'lodash/isEmpty'; +import values from 'lodash/values'; +import { join, resolve } from 'node:path'; + +import config from '../../config'; +import { log, formatError, fsUtil, fileHelper } from '../../utils'; +import BaseClass, { ApiOptions } from './base-class'; +import { ModuleClassParams, EnvironmentConfig } from '../../types'; + +export default class ImportEnvironments extends BaseClass { + private mapperDirPath: string; + private environmentsFolderPath: string; + private envUidMapperPath: string; + private envSuccessPath: string; + private envFailsPath: string; + private environmentsConfig: EnvironmentConfig; + private environments: Record; + private envUidMapper: Record; + private envSuccess: Record[]; + private envFailed: Record[]; + + constructor({ importConfig, stackAPIClient }: ModuleClassParams) { + super({ importConfig, stackAPIClient }); + this.environmentsConfig = config.modules.environments; + this.mapperDirPath = join(this.importConfig.backupDir, 'mapper', 'environments'); + this.environmentsFolderPath = join(this.importConfig.backupDir, this.environmentsConfig.dirName); + this.envUidMapperPath = join(this.mapperDirPath, 'uid-mapping.json'); + this.envSuccessPath = join(this.mapperDirPath, 'success.json'); + this.envFailsPath = join(this.mapperDirPath, 'fails.json'); + this.envFailed = []; + this.envSuccess = []; + this.envUidMapper = {}; + } + + /** + * @method start + * @returns {Promise} Promise + */ + async start(): Promise { + log(this.importConfig, 'Migrating environments', 'info'); + + //Step1 check folder exists or not + if (fileHelper.fileExistsSync(this.environmentsFolderPath)) { + this.environments = fsUtil.readFile(join(this.environmentsFolderPath, 'environments.json'), true) as Record; + } else { + log(this.importConfig, `No such file or directory - '${this.environmentsFolderPath}'`, 'error'); + return; + } + + await fsUtil.makeDirectory(this.mapperDirPath); + this.envUidMapper = fileHelper.fileExistsSync(this.envUidMapperPath) + ? (fsUtil.readFile(join(this.envUidMapperPath), true) as Record) + : {}; + + await this.importEnvironments(); + + if (this.envSuccess?.length) { + fsUtil.writeFile(this.envSuccessPath, this.envSuccess); + } + + if (this.envFailed?.length) { + fsUtil.writeFile(this.envFailsPath, this.envFailed); + } + + log(this.importConfig, 'Environments have been imported successfully!', 'success'); + } + + async importEnvironments() { + if (this.environments === undefined || isEmpty(this.environments)) { + log(this.importConfig, 'No Environment Found', 'info'); + return resolve(); + } + + const apiContent = values(this.environments); + + const onSuccess = ({ response, apiData: { uid, name } = { uid: null, name: '' } }: any) => { + this.envSuccess.push(response); + this.envUidMapper[uid] = response.uid; + log(this.importConfig, `Environment '${name}' imported successfully`, 'success'); + fsUtil.writeFile(this.envUidMapperPath, this.envUidMapper); + }; + + const onReject = ({ error, apiData }: any) => { + const err = error?.message ? JSON.parse(error.message) : error; + const { name } = apiData; + if (err?.errors?.name) { + log(this.importConfig, `Environment '${name}' already exists`, 'info'); + } else { + this.envFailed.push(apiData); + log(this.importConfig, `Environment '${name}' failed to be import. ${formatError(error)}`, 'error'); + log(this.importConfig, error, 'error'); + } + }; + + await this.makeConcurrentCall( + { + apiContent, + processName: 'import environments', + apiParams: { + serializeData: this.serializeEnvironments.bind(this), + reject: onReject.bind(this), + resolve: onSuccess.bind(this), + entity: 'create-environments', + includeParamOnCompletion: true, + }, + concurrencyLimit: config.fetchConcurrency || 2, + }, + undefined, + false, + ); + } + + /** + * @method serializeEnvironments + * @param {ApiOptions} apiOptions ApiOptions + * @returns {ApiOptions} ApiOptions + */ + serializeEnvironments(apiOptions: ApiOptions): ApiOptions { + const { apiData: environment } = apiOptions; + if (this.envUidMapper.hasOwnProperty(environment.uid)) { + log( + this.importConfig, + `Environment '${environment.name}' already exists. Skipping it to avoid duplicates!`, + 'info', + ); + apiOptions.entity = undefined; + } else { + apiOptions.apiData = environment; + } + return apiOptions; + } +} diff --git a/packages/contentstack-import/src/import/modules/extensions.ts b/packages/contentstack-import/src/import/modules/extensions.ts new file mode 100644 index 0000000000..6798d69b84 --- /dev/null +++ b/packages/contentstack-import/src/import/modules/extensions.ts @@ -0,0 +1,128 @@ +import isEmpty from 'lodash/isEmpty'; +import values from 'lodash/values'; +import { join, resolve } from 'node:path'; + +import config from '../../config'; +import { log, formatError, fsUtil, fileHelper } from '../../utils'; +import BaseClass, { ApiOptions } from './base-class'; +import { ModuleClassParams, Extensions } from '../../types'; + +export default class ImportExtensions extends BaseClass { + private mapperDirPath: string; + private extensionsFolderPath: string; + private extUidMapperPath: string; + private extSuccessPath: string; + private extFailsPath: string; + private extensionsConfig: Extensions; + private extensions: Record; + private extUidMapper: Record; + private extSuccess: Record[]; + private extFailed: Record[]; + + constructor({ importConfig, stackAPIClient }: ModuleClassParams) { + super({ importConfig, stackAPIClient }); + this.extensionsConfig = config.modules.extensions; + this.mapperDirPath = join(this.importConfig.backupDir, 'mapper', 'extensions'); + this.extensionsFolderPath = join(this.importConfig.backupDir, this.extensionsConfig.dirName); + this.extUidMapperPath = join(this.mapperDirPath, 'uid-mapping.json'); + this.extSuccessPath = join(this.mapperDirPath, 'success.json'); + this.extFailsPath = join(this.mapperDirPath, 'fails.json'); + this.extFailed = []; + this.extSuccess = []; + this.extUidMapper = {}; + } + + /** + * @method start + * @returns {Promise} Promise + */ + async start(): Promise { + log(this.importConfig, 'Migrating extensions', 'info'); + + //Step1 check folder exists or not + if (fileHelper.fileExistsSync(this.extensionsFolderPath)) { + this.extensions = fsUtil.readFile(join(this.extensionsFolderPath, 'extensions.json'), true) as Record; + } else { + log(this.importConfig, `No such file or directory - '${this.extensionsFolderPath}'`, 'error'); + return; + } + + await fsUtil.makeDirectory(this.mapperDirPath); + this.extUidMapper = fileHelper.fileExistsSync(this.extUidMapperPath) + ? (fsUtil.readFile(join(this.extUidMapperPath), true) as Record) + : {}; + + await this.importExtensions(); + + if (this.extSuccess?.length) { + fsUtil.writeFile(this.extSuccessPath, this.extSuccess); + } + + if (this.extFailed?.length) { + fsUtil.writeFile(this.extFailsPath, this.extFailed); + } + + log(this.importConfig, 'Extensions have been imported successfully!', 'success'); + } + + async importExtensions(): Promise { + if (this.extensions === undefined || isEmpty(this.extensions)) { + log(this.importConfig, 'No Extensions Found', 'info'); + return resolve(); + } + + const apiContent = values(this.extensions); + + const onSuccess = ({ response, apiData: { uid, title } = { uid: null, title: '' } }: any) => { + this.extSuccess.push(response); + this.extUidMapper[uid] = response.uid; + log(this.importConfig, `Extension '${title}' imported successfully`, 'success'); + fsUtil.writeFile(this.extUidMapperPath, this.extUidMapper); + }; + + const onReject = ({ error, apiData }: any) => { + const err = error?.message ? JSON.parse(error.message) : error; + const { title } = apiData; + if (err?.errors?.title) { + log(this.importConfig, `Extension '${title}' already exists`, 'info'); + } else { + this.extFailed.push(apiData); + log(this.importConfig, `Extension '${title}' failed to be import ${formatError(error)}`, 'error'); + log(this.importConfig, error, 'error'); + } + }; + + await this.makeConcurrentCall( + { + apiContent, + processName: 'import extensions', + apiParams: { + serializeData: this.serializeExtensions.bind(this), + reject: onReject.bind(this), + resolve: onSuccess.bind(this), + entity: 'create-extensions', + includeParamOnCompletion: true, + }, + concurrencyLimit: config.concurrency || config.fetchConcurrency || 1, + }, + undefined, + false, + ); + } + + /** + * @method serializeExtensions + * @param {ApiOptions} apiOptions ApiOptions + * @returns {ApiOptions} ApiOptions + */ + serializeExtensions(apiOptions: ApiOptions): ApiOptions { + const { apiData: extension } = apiOptions; + if (this.extUidMapper.hasOwnProperty(extension.uid)) { + log(this.importConfig, `Extension '${extension.title}' already exists. Skipping it to avoid duplicates!`, 'info'); + apiOptions.entity = undefined; + } else { + apiOptions.apiData = extension; + } + return apiOptions; + } +} diff --git a/packages/contentstack-import/src/import/modules/global-fields.ts b/packages/contentstack-import/src/import/modules/global-fields.ts new file mode 100644 index 0000000000..c0fe880c30 --- /dev/null +++ b/packages/contentstack-import/src/import/modules/global-fields.ts @@ -0,0 +1,142 @@ +/* eslint-disable no-prototype-builtins */ +/*! + * Contentstack Import + * Copyright (c) 2019 Contentstack LLC + * MIT Licensed + */ + +import * as path from 'path'; +import { values, isEmpty, filter, pick } from 'lodash'; +import { cliux } from '@contentstack/cli-utilities'; +import { GlobalFieldData } from '@contentstack/management/types/stack/globalField'; +import { fsUtil, log, formatError, fileHelper, lookupExtension, removeReferenceFields } from '../../utils'; +import { ImportConfig, ModuleClassParams } from '../../types'; +import BaseClass, { ApiOptions } from './base-class'; + +export default class ImportGlobalFields extends BaseClass { + private gFsMapperPath: string; + private gFsFolderPath: string; + private gFsFailsPath: string; + private gFsSuccessPath: string; + private gFsUidMapperPath: string; + private gFsPendingPath: string; + private pendingGFs: string[]; + private failedGFs: Record[]; + private createdGFs: Record[]; + private gFs: Record[]; + private gFsUidMapper: Record; + private config: ImportConfig; + private stackAPIClient: any; + private marketplaceAppMapperPath: string; + private reqConcurrency: number; + private installedExtensions: Record; + private gFsConfig: { + dirName: string; + fileName: string; + validKeys: string[]; + limit: number; + writeConcurrency?: number; + }; + + constructor({ importConfig, stackAPIClient }: ModuleClassParams) { + super({ importConfig, stackAPIClient }); + this.config = importConfig; + this.gFsConfig = importConfig.modules['global-fields']; + this.gFs = []; + this.gFsUidMapper = {}; + this.createdGFs = []; + this.failedGFs = []; + this.pendingGFs = []; + this.reqConcurrency = this.gFsConfig.writeConcurrency || this.config.writeConcurrency; + this.gFsMapperPath = path.resolve(this.config.data, 'mapper', 'global_fields'); + this.gFsFolderPath = path.resolve(this.config.data, this.gFsConfig.dirName); + this.gFsFailsPath = path.resolve(this.config.data, 'mapper', 'global_fields', 'fails.json'); + this.gFsSuccessPath = path.resolve(this.config.data, 'mapper', 'global_fields', 'success.json'); + this.gFsUidMapperPath = path.resolve(this.config.data, 'mapper', 'global_fields', 'uid-mapping.json'); + this.gFsPendingPath = path.resolve(this.config.data, 'mapper', 'global_fields', 'pending_global_fields.js'); + this.marketplaceAppMapperPath = path.join(this.config.data, 'mapper', 'marketplace_apps', 'uid-mapping.json'); + } + + async start(): Promise { + this.gFs = fsUtil.readFile(path.join(this.gFsFolderPath, this.gFsConfig.fileName)) as Record[]; + if (!this.gFs || isEmpty(this.gFs)) { + log(this.config, 'No global fields found to import', 'info'); + return; + } + await fsUtil.makeDirectory(this.gFsMapperPath); + if (fileHelper.fileExistsSync(this.gFsUidMapperPath)) { + this.gFsUidMapper = (fsUtil.readFile(this.gFsUidMapperPath) || {}) as Record; + } + this.installedExtensions = ( + ((await fsUtil.readFile(this.marketplaceAppMapperPath)) as any) || { extension_uid: {} } + ).extension_uid; + + await this.importGFs(); + fsUtil.writeFile(this.gFsPendingPath, this.pendingGFs); + log(this.config, 'Global fields import has been completed!', 'info'); + } + + async importGFs() { + const onSuccess = ({ response: globalField, apiData: { uid } = undefined }: any) => { + this.createdGFs.push(globalField); + this.gFsUidMapper[uid] = globalField; + fsUtil.writeFile(this.gFsUidMapperPath, this.gFsUidMapper); + log(this.config, 'Global field ' + uid + ' created successfully', 'success'); + }; + const onReject = ({ error, apiData: { uid } = undefined }: any) => { + log(this.importConfig, `Global fields '${uid}' failed to import`, 'error'); + log(this.importConfig, formatError(error), 'error'); + this.failedGFs.push({ uid }); + }; + + return await this.makeConcurrentCall( + { + processName: 'Import global fields', + apiContent: this.gFs, + apiParams: { + reject: onReject.bind(this), + resolve: onSuccess.bind(this), + entity: 'create-gfs', + includeParamOnCompletion: true, + }, + concurrencyLimit: this.reqConcurrency, + }, + this.createGFs.bind(this), + ); + } + + async createGFs({ + apiParams, + element: globalField, + isLastRequest, + }: { + apiParams: ApiOptions; + element: Record; + isLastRequest: boolean; + }) { + return new Promise(async (resolve, reject) => { + lookupExtension(this.config, globalField.schema, this.config.preserveStackVersion, this.installedExtensions); + const isReferenceFieldRemoved = await removeReferenceFields(globalField.schema, undefined, this.stackAPIClient); + if (isReferenceFieldRemoved) { + this.pendingGFs.push(globalField.uid); + } + return this.stack + .globalField() + .create({ global_field: globalField as GlobalFieldData }) + .then((response) => { + apiParams.resolve({ + response, + apiData: globalField, + }); + resolve(true); + }) + .catch((error) => { + apiParams.reject({ + error, + apiData: globalField, + }); + reject(true); + }); + }); + } +} diff --git a/packages/contentstack-import/src/import/modules/index.ts b/packages/contentstack-import/src/import/modules/index.ts new file mode 100644 index 0000000000..377537fd51 --- /dev/null +++ b/packages/contentstack-import/src/import/modules/index.ts @@ -0,0 +1,17 @@ +import { FsUtility } from '@contentstack/cli-utilities'; +import { join } from 'node:path'; +import { ModuleClassParams } from '../../types'; +import startJSModuleImport from '../modules-js'; + +export default async function startModuleImport(modulePayload: ModuleClassParams) { + // Todo: Remove below code when auto detect mechanism implemented for old and new module + if ( + modulePayload.moduleName === 'assets' && + !new FsUtility({ basePath: join(modulePayload.importConfig?.backupDir, 'assets') }).isNewFsStructure + ) { + return startJSModuleImport(modulePayload); + } + const { default: ModuleRunner } = await import(`./${modulePayload.moduleName}`); + const moduleRunner = new ModuleRunner(modulePayload); + return moduleRunner.start(); +} diff --git a/packages/contentstack-import/src/import/modules/labels.ts b/packages/contentstack-import/src/import/modules/labels.ts new file mode 100644 index 0000000000..8db99db9ce --- /dev/null +++ b/packages/contentstack-import/src/import/modules/labels.ts @@ -0,0 +1,199 @@ +import isEmpty from 'lodash/isEmpty'; +import values from 'lodash/values'; +import omit from 'lodash/omit'; +import { join, resolve } from 'node:path'; + +import config from '../../config'; +import { log, formatError, fsUtil, fileHelper } from '../../utils'; +import BaseClass, { ApiOptions } from './base-class'; +import { ModuleClassParams, LabelConfig } from '../../types'; + +export default class Importlabels extends BaseClass { + private mapperDirPath: string; + private labelsFolderPath: string; + private labelUidMapperPath: string; + private createdLabelPath: string; + private labelFailsPath: string; + private labelsConfig: LabelConfig; + private labels: Record; + private labelUidMapper: Record; + private createdLabel: Record[]; + private failedLabel: Record[]; + + constructor({ importConfig, stackAPIClient }: ModuleClassParams) { + super({ importConfig, stackAPIClient }); + this.labelsConfig = config.modules.labels; + this.mapperDirPath = join(this.importConfig.backupDir, 'mapper', 'labels'); + this.labelsFolderPath = join(this.importConfig.backupDir, this.labelsConfig.dirName); + this.labelUidMapperPath = join(this.mapperDirPath, 'uid-mapping.json'); + this.createdLabelPath = join(this.mapperDirPath, 'success.json'); + this.labelFailsPath = join(this.mapperDirPath, 'fails.json'); + this.labels = {}; + this.failedLabel = []; + this.createdLabel = []; + this.labelUidMapper = {}; + } + + /** + * @method start + * @returns {Promise} Promise + */ + async start(): Promise { + log(this.importConfig, 'Migrating labels', 'info'); + + //Step1 check folder exists or not + if (fileHelper.fileExistsSync(this.labelsFolderPath)) { + this.labels = fsUtil.readFile(join(this.labelsFolderPath, 'labels.json'), true) as Record; + } else { + log(this.importConfig, `No such file or directory - '${this.labelsFolderPath}'`, 'error'); + return; + } + + //create labels in mapper directory + await fsUtil.makeDirectory(this.mapperDirPath); + this.labelUidMapper = fileHelper.fileExistsSync(this.labelUidMapperPath) + ? (fsUtil.readFile(join(this.labelUidMapperPath), true) as Record) + : {}; + + await this.importlabels(); + //update parent in created label + await this.updateLabels(); + + if (this.createdLabel?.length) { + fsUtil.writeFile(this.createdLabelPath, this.createdLabel); + } + + if (this.failedLabel?.length) { + fsUtil.writeFile(this.labelFailsPath, this.failedLabel); + } + + log(this.importConfig, 'Labels have been imported successfully!', 'success'); + } + + async importlabels() { + if (this.labels === undefined || isEmpty(this.labels)) { + log(this.importConfig, 'No Label Found', 'info'); + return resolve(); + } + + const apiContent = values(this.labels); + + const onSuccess = ({ response, apiData: { uid, name } = { uid: null, name: '' } }: any) => { + this.labelUidMapper[uid] = response; + log(this.importConfig, `Label '${name}' imported successfully`, 'success'); + fsUtil.writeFile(this.labelUidMapperPath, this.labelUidMapper); + }; + + const onReject = ({ error, apiData }: any) => { + const err = error?.message ? JSON.parse(error.message) : error; + const { name } = apiData; + if (err?.errors?.name) { + log(this.importConfig, `Label '${name}' already exists`, 'info'); + } else { + this.failedLabel.push(apiData); + log(this.importConfig, `Label '${name}' failed to be import. ${formatError(error)}`, 'error'); + } + }; + + await this.makeConcurrentCall( + { + apiContent, + processName: 'create labels', + apiParams: { + serializeData: this.serializelabels.bind(this), + reject: onReject.bind(this), + resolve: onSuccess.bind(this), + entity: 'create-labels', + includeParamOnCompletion: true, + }, + concurrencyLimit: config.fetchConcurrency || 1, + }, + undefined, + false, + ); + } + + /** + * @method serializelabels + * @param {ApiOptions} apiOptions ApiOptions + * @returns {ApiOptions} ApiOptions + */ + serializelabels(apiOptions: ApiOptions): ApiOptions { + const { apiData: label } = apiOptions; + + if (this.labelUidMapper.hasOwnProperty(label.uid)) { + log(this.importConfig, `Label '${label.name}' already exists. Skipping it to avoid duplicates!`, 'info'); + apiOptions.entity = undefined; + } else { + let labelReq = label; + if (label?.parent?.length != 0) { + labelReq = omit(label, ['parent']); + } + apiOptions.apiData = labelReq; + } + return apiOptions; + } + + async updateLabels() { + if (!isEmpty(this.labels)) { + const apiContent = values(this.labels); + + const onSuccess = ({ response, apiData: { uid, name } = { uid: null, name: '' } }: any) => { + this.createdLabel.push(response); + log(this.importConfig, `Label '${name}' updated successfully`, 'success'); + }; + + const onReject = ({ error, apiData }: any) => { + log(this.importConfig, `Failed to update label '${apiData?.name}'. ${formatError(error)}`, 'error'); + }; + + await this.makeConcurrentCall( + { + apiContent, + processName: 'update labels', + apiParams: { + serializeData: this.serializeUpdatelabels.bind(this), + reject: onReject.bind(this), + resolve: onSuccess.bind(this), + entity: 'update-labels', + includeParamOnCompletion: true, + }, + concurrencyLimit: config.fetchConcurrency || 1, + }, + undefined, + false, + ); + } + } + + /** + * @method serializeUpdatelabels + * @param {ApiOptions} apiOptions ApiOptions + * @returns {ApiOptions} ApiOptions + */ + serializeUpdatelabels(apiOptions: ApiOptions): ApiOptions { + const { apiData: label } = apiOptions; + const labelUid = label.uid; + if (this.labelUidMapper.hasOwnProperty(labelUid)) { + const newLabel = this.labelUidMapper[labelUid] as Record; + if (label?.parent?.length > 0) { + for (let i = 0; i < label?.parent?.length; i++) { + const parentUid = label.parent[i]; + if (this.labelUidMapper.hasOwnProperty(parentUid)) { + const mappedLabel = this.labelUidMapper[parentUid] as Record; + label.parent[i] = mappedLabel.uid; + } + } + const createdLabelRes = this.labelUidMapper[labelUid] as Record; + createdLabelRes.parent = label.parent; + apiOptions.apiData = createdLabelRes; + } else { + apiOptions.entity = undefined; + this.createdLabel.push(newLabel); + } + } else { + apiOptions.entity = undefined; + } + return apiOptions; + } +} diff --git a/packages/contentstack-import/src/import/modules/locales.ts b/packages/contentstack-import/src/import/modules/locales.ts new file mode 100644 index 0000000000..68bf574ae9 --- /dev/null +++ b/packages/contentstack-import/src/import/modules/locales.ts @@ -0,0 +1,182 @@ +/* eslint-disable no-prototype-builtins */ +/*! + * Contentstack Import + * Copyright (c) 2019 Contentstack LLC + * MIT Licensed + */ + +import * as path from 'path'; +import { values, isEmpty, filter, pick } from 'lodash'; +import { cliux } from '@contentstack/cli-utilities'; +import { fsUtil, log, formatError, fileHelper } from '../../utils'; +import { ImportConfig, ModuleClassParams } from '../../types'; +import BaseClass from './base-class'; + +export default class ImportLocales extends BaseClass { + private langMapperPath: string; + private langFolderPath: string; + private langFailsPath: string; + private langSuccessPath: string; + private langUidMapperPath: string; + private languages: Record[]; + private config: ImportConfig; + private stackAPIClient: any; + private failedLocales: Record[]; + private createdLocales: Record[]; + private langUidMapper: any; + private localeConfig: any; + public client: any; + private reqConcurrency: number; + private masterLanguage: { + code: string; + }; + private masterLanguageConfig: { + dirName: string; + fileName: string; + requiredKeys: string[]; + }; + private sourceMasterLanguage: Record; + + constructor({ importConfig, stackAPIClient }: ModuleClassParams) { + super({ importConfig, stackAPIClient }); + this.config = importConfig; + this.localeConfig = importConfig.modules.locales; + this.masterLanguage = importConfig.masterLocale; + this.masterLanguageConfig = importConfig.modules.masterLocale; + this.stackAPIClient = stackAPIClient; + this.languages = []; + this.langUidMapper = {}; + this.createdLocales = []; + this.failedLocales = []; + this.reqConcurrency = this.localeConfig.writeConcurrency || this.config.writeConcurrency; + this.langMapperPath = path.resolve(this.config.data, 'mapper', 'languages'); + this.langFolderPath = path.resolve(this.config.data, this.localeConfig.dirName); + this.langFailsPath = path.resolve(this.config.data, 'mapper', 'languages', 'fails.json'); + this.langSuccessPath = path.resolve(this.config.data, 'mapper', 'languages', 'success.json'); + this.langUidMapperPath = path.resolve(this.config.data, 'mapper', 'languages', 'uid-mapper.json'); + } + + async start(): Promise { + this.languages = fsUtil.readFile(path.join(this.langFolderPath, this.localeConfig.fileName)) as Record< + string, + unknown + >[]; + if (!this.languages || isEmpty(this.languages)) { + log(this.config, 'No languages found to import', 'info'); + return; + } + this.sourceMasterLanguage = fsUtil.readFile( + path.join(this.langFolderPath, this.masterLanguageConfig.fileName), + ) as Record; + await fileHelper.makeDirectory(this.langMapperPath); + if (fileHelper.fileExistsSync(this.langUidMapperPath)) { + this.langUidMapper = fsUtil.readFile(this.langUidMapperPath) || {}; + } + await this.checkAndUpdateMasterLocale().catch((error) => { + log(this.config, formatError(error), 'error'); + }); + await this.createLocales().catch((error) => { + log(this.config, formatError(error), 'error'); + Promise.reject('Failed to import locales'); + }); + fsUtil.writeFile(this.langFailsPath, this.failedLocales); + await this.updateLocales().catch((error) => { + log(this.config, formatError(error), 'error'); + Promise.reject('Failed to update locales'); + }); + + log(this.config, 'Languages have been imported successfully!', 'success'); + } + + async checkAndUpdateMasterLocale(): Promise { + let sourceMasterLangDetails = (this.sourceMasterLanguage && Object.values(this.sourceMasterLanguage)) || []; + if (sourceMasterLangDetails?.[0]?.code === this.masterLanguage?.code) { + let masterLangDetails = await this.stackAPIClient + .locale(this.masterLanguage['code']) + .fetch() + .catch((error: Error) => { + log(this.config, formatError(error), 'error'); + }); + if ( + masterLangDetails?.name?.toString().toUpperCase() !== + sourceMasterLangDetails[0]['name']?.toString().toUpperCase() + ) { + cliux.print('WARNING!!! The master language name for the source and destination is different.', { + color: 'yellow', + }); + cliux.print(`Old Master language name: ${masterLangDetails['name']}`, { color: 'red' }); + cliux.print(`New Master language name: ${sourceMasterLangDetails[0]['name']}`, { color: 'green' }); + const langUpdateConfirmation: boolean = await cliux.inquire({ + type: 'confirm', + message: 'Are you sure you want to update name of master language?', + name: 'confirmation', + }); + + if (langUpdateConfirmation) { + let langUid = sourceMasterLangDetails[0] && sourceMasterLangDetails[0]['uid']; + let sourceMasterLanguage = this.sourceMasterLanguage[langUid]; + if (!sourceMasterLanguage) { + log(this.config, `Master language details not found with id ${langUid} to update`, 'warn'); + } + const langUpdateRequest = this.stackAPIClient.locale(sourceMasterLanguage.code); + langUpdateRequest.name = sourceMasterLanguage.name; + await langUpdateRequest.update().catch(function (error: Error) { + log(this.config, formatError(error), 'error'); + }); + log(this.config, 'Master Languages name have been updated successfully!', 'success'); + } + } + } + } + + async createLocales(): Promise { + const onSuccess = ({ response = {}, apiData: { uid, code } = undefined }: any) => { + this.langUidMapper[uid] = response.uid; + this.createdLocales.push(pick(response, [...this.localeConfig.requiredKeys])); + log(this.importConfig, `Created locale: '${code}'`, 'info'); + fsUtil.writeFile(this.langUidMapperPath, this.langUidMapper); + }; + const onReject = ({ error, apiData: { uid, code } = undefined }: any) => { + log(this.importConfig, `Language '${code}' failed to import`, 'error'); + log(this.importConfig, formatError(error), 'error'); + this.failedLocales.push({ uid, code }); + }; + return await this.makeConcurrentCall({ + processName: 'Import locales', + apiContent: filter(values(this.languages), (lang) => lang.code !== this.masterLanguage.code) as Record< + string, + any + >[], + apiParams: { + reject: onReject.bind(this), + resolve: onSuccess.bind(this), + entity: 'create-locale', + includeParamOnCompletion: true, + }, + concurrencyLimit: this.reqConcurrency, + }); + } + + async updateLocales(): Promise { + const onSuccess = ({ response = {}, apiData: { uid, code } = undefined }: any) => { + log(this.importConfig, `Updated locale: '${code}'`, 'info'); + fsUtil.writeFile(this.langSuccessPath, this.createdLocales); + }; + const onReject = ({ error, apiData: { uid, code } = undefined }: any) => { + log(this.importConfig, `Language '${code}' failed to update`, 'error'); + log(this.importConfig, formatError(error), 'error'); + fsUtil.writeFile(this.langFailsPath, this.failedLocales); + }; + return await this.makeConcurrentCall({ + processName: 'Update locales', + apiContent: values(this.languages), + apiParams: { + reject: onReject.bind(this), + resolve: onSuccess.bind(this), + entity: 'update-locale', + includeParamOnCompletion: true, + }, + concurrencyLimit: this.reqConcurrency, + }); + } +} diff --git a/packages/contentstack-import/src/import/modules/marketplace-apps.ts b/packages/contentstack-import/src/import/modules/marketplace-apps.ts new file mode 100644 index 0000000000..0e9ad0cb43 --- /dev/null +++ b/packages/contentstack-import/src/import/modules/marketplace-apps.ts @@ -0,0 +1,418 @@ +import chalk from 'chalk'; +import map from 'lodash/map'; +import find from 'lodash/find'; +import omit from 'lodash/omit'; +import pick from 'lodash/pick'; +import first from 'lodash/first'; +import split from 'lodash/split'; +import { join } from 'node:path'; +import filter from 'lodash/filter'; +import isEmpty from 'lodash/isEmpty'; +import toLower from 'lodash/toLower'; +import { + isAuthenticated, + cliux, + HttpClient, + OauthDecorator, + HttpClientDecorator, + managementSDKClient, + NodeCrypto, + ContentstackClient, +} from '@contentstack/cli-utilities'; + +import config from '../../config'; +import BaseClass from './base-class'; +import { askEncryptionKey } from '../../utils/interactive'; +import { ModuleClassParams, MarketplaceAppsConfig } from '../../types'; +import { + log, + formatError, + getDeveloperHubUrl, + getOrgUid, + createPrivateApp, + handleNameConflict, + installApp, + makeRedirectUrlCall, + confirmToCloseProcess, + getAllStackSpecificApps, + ifAppAlreadyExist, + getConfirmationToCreateApps, + fsUtil, + fileHelper, +} from '../../utils'; + +export default class ImportMarketplaceApps extends BaseClass { + private mapperDirPath: string; + private marketPlaceFolderPath: string; + private marketPlaceUidMapperPath: string; + private marketPlaceAppConfig: MarketplaceAppsConfig; + private marketplaceApps: Record[]; + private httpClient: HttpClient | OauthDecorator | HttpClientDecorator; + private appNameMapping: Record; + private appUidMapping: Record; + private installationUidMapping: Record; + private installedApps: Record[]; + private appOriginalName: string; + public developerHubBaseUrl: string; + public sdkClient: ContentstackClient; + public nodeCrypto: NodeCrypto; + + constructor({ importConfig, stackAPIClient }: ModuleClassParams) { + super({ importConfig, stackAPIClient }); + + this.marketPlaceAppConfig = config.modules.marketplace_apps; + this.mapperDirPath = join(this.importConfig.backupDir, 'mapper', 'marketplace_apps'); + this.marketPlaceFolderPath = join(this.importConfig.backupDir, this.marketPlaceAppConfig.dirName); + this.marketPlaceUidMapperPath = join(this.mapperDirPath, 'uid-mapping.json'); + this.httpClient = new HttpClient(); + this.appNameMapping = {}; + this.appUidMapping = {}; + this.appOriginalName = undefined; + this.installedApps = []; + this.installationUidMapping = {}; + } + + /** + * @method start + * @returns {Promise} Promise + */ + async start(): Promise { + log(this.importConfig, 'Migrating marketplace apps', 'info'); + + if (fileHelper.fileExistsSync(this.marketPlaceFolderPath)) { + this.marketplaceApps = fsUtil.readFile( + join(this.marketPlaceFolderPath, this.marketPlaceAppConfig.fileName), + true, + ) as Record[]; + } else { + log(this.importConfig, `No such file or directory - '${this.marketPlaceFolderPath}'`, 'error'); + return; + } + + if (isEmpty(this.marketplaceApps)) { + return Promise.resolve(); + } else if (!isAuthenticated()) { + cliux.print( + '\nWARNING!!! To import Marketplace apps, you must be logged in. Please check csdx auth:login --help to log in\n', + { color: 'yellow' }, + ); + return Promise.resolve(); + } + await fsUtil.makeDirectory(this.mapperDirPath); + this.developerHubBaseUrl = this.importConfig.developerHubBaseUrl || (await getDeveloperHubUrl(this.importConfig)); + this.sdkClient = await managementSDKClient({ endpoint: this.developerHubBaseUrl }); + this.importConfig.org_uid = await getOrgUid(this.importConfig); + await this.setHttpClient(); + await this.startInstallation(); + + log(this.importConfig, 'Marketplace apps have been imported successfully!', 'success'); + } + + async setHttpClient(): Promise { + if (!this.importConfig.auth_token) { + this.httpClient = new OauthDecorator(this.httpClient); + const headers = await this.httpClient.preHeadersCheck(this.importConfig); + this.httpClient = this.httpClient.headers(headers); + } else { + this.httpClient = new HttpClientDecorator(this.httpClient); + this.httpClient.headers(this.importConfig); + } + } + + /** + * @method startInstallation + * @returns {Promise} + */ + async startInstallation(): Promise { + const cryptoArgs = { encryptionKey: '' }; + if (this.importConfig.marketplaceAppEncryptionKey) { + cryptoArgs['encryptionKey'] = this.importConfig.marketplaceAppEncryptionKey; + } + + if (this.importConfig.forceStopMarketplaceAppsPrompt) { + cryptoArgs['encryptionKey'] = this.importConfig.marketplaceAppEncryptionKey; + this.nodeCrypto = new NodeCrypto(cryptoArgs); + } else { + await this.getAndValidateEncryptionKey(this.importConfig.marketplaceAppEncryptionKey); + } + + // NOTE install all private apps which is not available for stack. + await this.handleAllPrivateAppsCreationProcess(); + this.installedApps = await getAllStackSpecificApps( + this.developerHubBaseUrl, + this.httpClient as HttpClient, + this.importConfig, + ); + + log(this.importConfig, 'Starting marketplace app installation', 'success'); + + for (let app of this.marketplaceApps) { + await this.installApps(app); + } + + const uidMapper = await this.generateUidMapper(); + fsUtil.writeFile(this.marketPlaceUidMapperPath, { + app_uid: this.appUidMapping, + extension_uid: uidMapper || {}, + installation_uid: this.installationUidMapping, + }); + } + + async generateUidMapper(): Promise> { + const listOfNewMeta = []; + const listOfOldMeta = []; + const extensionUidMap: Record = {}; + this.installedApps = + (await getAllStackSpecificApps(this.developerHubBaseUrl, this.httpClient as HttpClient, this.importConfig)) || []; + + for (const app of this.marketplaceApps) { + listOfOldMeta.push(...map(app?.ui_location?.locations, 'meta').flat()); + } + for (const app of this.installedApps) { + listOfNewMeta.push(...map(app?.ui_location?.locations, 'meta').flat()); + } + for (const { extension_uid, name, path, uid, data_type } of filter(listOfOldMeta, 'name')) { + const meta = + find(listOfNewMeta, { name, path }) || + find(listOfNewMeta, { name: this.appNameMapping[name], path }) || + find(listOfNewMeta, { name, uid, data_type }); + + if (meta) { + extensionUidMap[extension_uid] = meta.extension_uid; + } + } + + return extensionUidMap; + } + + async getAndValidateEncryptionKey(defaultValue: string, retry = 1): Promise { + let appConfig = find( + this.marketplaceApps, + ({ configuration, server_configuration }) => !isEmpty(configuration) || !isEmpty(server_configuration), + ); + + if (!appConfig) { + return defaultValue; + } + + const encryptionKey = await askEncryptionKey(defaultValue); + + try { + appConfig = !isEmpty(appConfig.configuration) ? appConfig.configuration : appConfig.server_configuration; + this.nodeCrypto = new NodeCrypto({ encryptionKey }); + this.nodeCrypto.decrypt(appConfig); + } catch (error) { + if (retry < this.importConfig.getEncryptionKeyMaxRetry && error.code === 'ERR_OSSL_EVP_BAD_DECRYPT') { + cliux.print( + `Provided encryption key is not valid or your data might be corrupted.! attempt(${retry}/${this.importConfig.getEncryptionKeyMaxRetry})`, + { color: 'red' }, + ); + // NOTE max retry limit is 3 + return this.getAndValidateEncryptionKey(encryptionKey, retry + 1); + } else { + cliux.print( + `Maximum retry limit exceeded. Closing the process, please try again.! attempt(${retry}/${this.importConfig.getEncryptionKeyMaxRetry})`, + { color: 'red' }, + ); + process.exit(1); + } + } + + return encryptionKey; + } + + /** + * @method handleAllPrivateAppsCreationProcess + * @returns {Promise} + */ + async handleAllPrivateAppsCreationProcess(): Promise { + const privateApps = filter(this.marketplaceApps, { manifest: { visibility: 'private' } }); + + if (isEmpty(privateApps)) { + return Promise.resolve(); + } + + await getConfirmationToCreateApps(privateApps, this.importConfig); + + log(this.importConfig, 'Starting developer hub private apps re-creation', 'success'); + + for (let app of privateApps) { + // NOTE keys can be passed to install new app in the developer hub + app.manifest = pick(app.manifest, ['uid', 'name', 'description', 'icon', 'target_type', 'webhook', 'oauth']); + this.appOriginalName = app.manifest.name; + const obj = { + oauth: app.oauth, + webhook: app.webhook, + ui_location: app.ui_location, + }; + await this.createPrivateApps({ + ...obj, + ...app.manifest, + }); + } + + this.appOriginalName = undefined; + } + + async createPrivateApps(app: any, uidCleaned = false, appSuffix = 1) { + let locations = app?.ui_location?.locations; + + if (!uidCleaned && !isEmpty(locations)) { + app.ui_location.locations = await this.updateManifestUILocations(locations, 'uid'); + } else if (uidCleaned && !isEmpty(locations)) { + app.ui_location.locations = await this.updateManifestUILocations(locations, 'name', appSuffix); + } + + if (app.name > 20) { + app.name = app.name.slice(0, 20); + } + const response = await createPrivateApp(this.sdkClient, this.importConfig, app); + return this.appCreationCallback(app, response, appSuffix); + } + + async updateManifestUILocations(locations: any, type = 'uid', appSuffix = 1) { + switch (type) { + case 'uid': + return map(locations, (location) => { + if (location.meta) { + location.meta = map(location.meta, (meta) => omit(meta, ['uid'])); + } + + return location; + }); + case 'name': + return map(locations, (location) => { + if (location.meta) { + location.meta = map(location.meta, (meta) => { + if (meta.name) { + const name = `${first(split(meta.name, '◈'))}◈${appSuffix}`; + + if (!this.appNameMapping[this.appOriginalName]) { + this.appNameMapping[this.appOriginalName] = name; + } + + meta.name = name; + } + + return meta; + }); + } + + return location; + }); + } + } + + async appCreationCallback(app: any, response: any, appSuffix: number): Promise { + const { statusText, message } = response || {}; + + if (message) { + if (toLower(statusText) === 'conflict') { + const updatedApp = await handleNameConflict(app, appSuffix, this.importConfig); + return this.createPrivateApps(updatedApp, true, appSuffix + 1); + } else { + log(this.importConfig, formatError(message), 'error'); + + if (this.importConfig.forceStopMarketplaceAppsPrompt) return Promise.resolve(); + + if ( + await cliux.confirm( + chalk.yellow( + 'WARNING!!! The above error may have an impact if the failed app is referenced in entries/content type. Would you like to proceed? (y/n)', + ), + ) + ) { + Promise.resolve(); + } else { + process.exit(); + } + } + } else if (response.uid) { + // NOTE new app installation + log(this.importConfig, `${response.name} app created successfully.!`, 'success'); + this.appUidMapping[app.uid] = response.uid; + this.appNameMapping[this.appOriginalName] = response.name; + } + } + + /** + * @method installApps + * + * @param {Record} app + * @param {Record[]} installedApps + * @returns {Promise} + */ + async installApps(app: any): Promise { + let updateParam; + const { configuration, server_configuration } = app; + const currentStackApp = find(this.installedApps, { manifest: { uid: app?.manifest?.uid } }); + + if (!currentStackApp) { + // NOTE install new app + const mappedUid = this.appUidMapping[app?.manifest?.uid] as string; + const installation = await installApp(this.sdkClient, this.importConfig, app?.manifest?.uid, mappedUid); + + if (installation.installation_uid) { + const appManifestName = app?.manifest?.name; + const appName = this.appNameMapping[appManifestName] ? this.appNameMapping[appManifestName] : appManifestName; + + log(this.importConfig, `${appName} app installed successfully.!`, 'success'); + await makeRedirectUrlCall(installation, appManifestName, this.importConfig); + this.installationUidMapping[app.uid] = installation.installation_uid; + updateParam = { manifest: app.manifest, ...installation, configuration, server_configuration }; + } else if (installation.message) { + log(this.importConfig, formatError(installation.message), 'success'); + await confirmToCloseProcess(installation, this.importConfig); + } + } else if (!isEmpty(configuration) || !isEmpty(server_configuration)) { + log(this.importConfig, `${app.manifest.name} is already installed`, 'success'); + updateParam = await ifAppAlreadyExist(app, currentStackApp, this.importConfig); + } + + if (!this.appUidMapping[app.manifest.uid]) { + this.appUidMapping[app.manifest.uid] = currentStackApp ? currentStackApp.manifest.uid : app.manifest.uid; + } + + // NOTE update configurations + if (updateParam && (!isEmpty(updateParam.configuration) || !isEmpty(updateParam.server_configuration))) { + await this.updateAppsConfig(updateParam); + } + } + + /** + * @method updateAppsConfig + * @returns {Promise} + */ + async updateAppsConfig(app: any): Promise { + type payloadConfig = { + configuration: Record; + server_configuration: Record; + }; + const payload: payloadConfig = { configuration: {}, server_configuration: {} }; + const { uid, configuration, server_configuration } = app; + + if (!isEmpty(configuration)) { + payload['configuration'] = this.nodeCrypto.decrypt(configuration); + } + if (!isEmpty(server_configuration)) { + payload['server_configuration'] = this.nodeCrypto.decrypt(server_configuration); + } + + if (isEmpty(app) || isEmpty(payload) || !uid) { + return Promise.resolve(); + } + + // TODO migrate this HTTP API call into SDK + // NOTE Use updateAppConfig(this.sdkClient, this.importConfig, app, payload) utility when migrating to SDK call; + return this.httpClient + .put(`${this.developerHubBaseUrl}/installations/${uid}`, payload) + .then(({ data }) => { + if (data.message) { + log(this.importConfig, formatError(data.message), 'success'); + } else { + log(this.importConfig, `${app.manifest.name} app config updated successfully.!`, 'success'); + } + }) + .catch((error) => log(this.importConfig, formatError(error), 'error')); + } +} diff --git a/packages/contentstack-import/src/import/modules/webhooks.ts b/packages/contentstack-import/src/import/modules/webhooks.ts new file mode 100644 index 0000000000..10f28c5894 --- /dev/null +++ b/packages/contentstack-import/src/import/modules/webhooks.ts @@ -0,0 +1,133 @@ +import isEmpty from 'lodash/isEmpty'; +import values from 'lodash/values'; +import { join, resolve } from 'node:path'; + +import config from '../../config'; +import { log, formatError, fsUtil, fileHelper } from '../../utils'; +import BaseClass, { ApiOptions } from './base-class'; +import { ModuleClassParams, WebhookConfig } from '../../types'; + +export default class ImportWebhooks extends BaseClass { + private mapperDirPath: string; + private webhooksFolderPath: string; + private webhookUidMapperPath: string; + private createdWebhooksPath: string; + private failedWebhooksPath: string; + private webhooksConfig: WebhookConfig; + private webhooks: Record; + private webhookUidMapper: Record; + private createdWebhooks: Record[]; + private failedWebhooks: Record[]; + + constructor({ importConfig, stackAPIClient }: ModuleClassParams) { + super({ importConfig, stackAPIClient }); + this.webhooksConfig = config.modules.webhooks; + this.mapperDirPath = join(this.importConfig.backupDir, 'mapper', 'webhooks'); + this.webhooksFolderPath = join(this.importConfig.backupDir, this.webhooksConfig.dirName); + this.webhookUidMapperPath = join(this.mapperDirPath, 'uid-mapping.json'); + this.createdWebhooksPath = join(this.mapperDirPath, 'success.json'); + this.failedWebhooksPath = join(this.mapperDirPath, 'fails.json'); + this.webhooks = {}; + this.failedWebhooks = []; + this.createdWebhooks = []; + this.webhookUidMapper = {}; + } + + /** + * @method start + * @returns {Promise} Promise + */ + async start(): Promise { + log(this.importConfig, 'Migrating webhooks', 'info'); + + //Step1 check folder exists or not + if (fileHelper.fileExistsSync(this.webhooksFolderPath)) { + this.webhooks = fsUtil.readFile(join(this.webhooksFolderPath, 'webhooks.json'), true) as Record; + } else { + log(this.importConfig, `No such file or directory - '${this.webhooksFolderPath}'`, 'error'); + return; + } + + //create webhooks in mapper directory + await fsUtil.makeDirectory(this.mapperDirPath); + this.webhookUidMapper = fileHelper.fileExistsSync(this.webhookUidMapperPath) + ? (fsUtil.readFile(join(this.webhookUidMapperPath), true) as Record) + : {}; + + await this.importWebhooks(); + + if (this.createdWebhooks?.length) { + fsUtil.writeFile(this.createdWebhooksPath, this.createdWebhooks); + } + + if (this.failedWebhooks?.length) { + fsUtil.writeFile(this.failedWebhooksPath, this.failedWebhooks); + } + + log(this.importConfig, 'Webhooks have been imported successfully!', 'success'); + } + + async importWebhooks() { + if (this.webhooks === undefined || isEmpty(this.webhooks)) { + log(this.importConfig, 'No Webhook Found', 'info'); + return resolve(); + } + + const apiContent = values(this.webhooks); + + const onSuccess = ({ response, apiData: { uid, name } = { uid: null, name: '' } }: any) => { + this.createdWebhooks.push(response); + this.webhookUidMapper[uid] = response.uid; + log(this.importConfig, `Webhook '${name}' imported successfully`, 'success'); + fsUtil.writeFile(this.webhookUidMapperPath, this.webhookUidMapper); + }; + + const onReject = ({ error, apiData }: any) => { + const err = error?.message ? JSON.parse(error.message) : error; + const { name } = apiData; + if (err?.errors?.name) { + log(this.importConfig, `Webhook '${name}' already exists`, 'info'); + } else { + this.failedWebhooks.push(apiData); + log(this.importConfig, `Webhook '${name}' failed to be import. ${formatError(error)}`, 'error'); + } + }; + + await this.makeConcurrentCall( + { + apiContent, + processName: 'create webhooks', + apiParams: { + serializeData: this.serializeWebhooks.bind(this), + reject: onReject.bind(this), + resolve: onSuccess.bind(this), + entity: 'create-webhooks', + includeParamOnCompletion: true, + }, + concurrencyLimit: config.fetchConcurrency || 1, + }, + undefined, + false, + ); + } + + /** + * @method serializeWebhooks + * @param {ApiOptions} apiOptions ApiOptions + * @returns {ApiOptions} ApiOptions + */ + serializeWebhooks(apiOptions: ApiOptions): ApiOptions { + const { apiData: webhook } = apiOptions; + + if (this.webhookUidMapper.hasOwnProperty(webhook.uid)) { + log(this.importConfig, `Webhook '${webhook.name}' already exists. Skipping it to avoid duplicates!`, 'info'); + apiOptions.entity = undefined; + } else { + if (this.importConfig.importWebhookStatus === 'disable' || this.importConfig.importWebhookStatus !== 'current') { + webhook.disabled = true; + } + apiOptions.apiData = webhook; + } + return apiOptions; + } +} \ No newline at end of file diff --git a/packages/contentstack-import/src/import/modules/workflows.ts b/packages/contentstack-import/src/import/modules/workflows.ts new file mode 100644 index 0000000000..c1ab96975a --- /dev/null +++ b/packages/contentstack-import/src/import/modules/workflows.ts @@ -0,0 +1,303 @@ +import chalk from 'chalk'; +import map from 'lodash/map'; +import find from 'lodash/find'; +import { join } from 'node:path'; +import values from 'lodash/values'; +import filter from 'lodash/filter'; +import isEmpty from 'lodash/isEmpty'; +import cloneDeep from 'lodash/cloneDeep'; +import findIndex from 'lodash/findIndex'; + +import config from '../../config'; +import BaseClass, { ApiOptions } from './base-class'; +import { log, formatError, fsUtil, fileHelper } from '../../utils'; +import { ModuleClassParams, WorkflowConfig } from '../../types'; + +export default class ImportWorkflows extends BaseClass { + private mapperDirPath: string; + private workflowsFolderPath: string; + private workflowUidMapperPath: string; + private createdWorkflowsPath: string; + private failedWorkflowsPath: string; + private workflowsConfig: WorkflowConfig; + private workflows: Record; + private workflowUidMapper: Record; + private createdWorkflows: Record[]; + private failedWebhooks: Record[]; + private roleNameMap: Record; + + constructor({ importConfig, stackAPIClient }: ModuleClassParams) { + super({ importConfig, stackAPIClient }); + this.workflowsConfig = config.modules.workflows; + this.mapperDirPath = join(this.importConfig.backupDir, 'mapper', 'workflows'); + this.workflowsFolderPath = join(this.importConfig.backupDir, this.workflowsConfig.dirName); + this.workflowUidMapperPath = join(this.mapperDirPath, 'uid-mapping.json'); + this.createdWorkflowsPath = join(this.mapperDirPath, 'success.json'); + this.failedWorkflowsPath = join(this.mapperDirPath, 'fails.json'); + this.workflows = {}; + this.failedWebhooks = []; + this.createdWorkflows = []; + this.workflowUidMapper = {}; + this.roleNameMap = {}; + } + + /** + * @method start + * @returns {Promise} Promise + */ + async start(): Promise { + log(this.importConfig, 'Migrating workflows', 'info'); + + //Step1 check folder exists or not + if (fileHelper.fileExistsSync(this.workflowsFolderPath)) { + this.workflows = fsUtil.readFile(join(this.workflowsFolderPath, this.workflowsConfig.fileName), true) as Record< + string, + unknown + >; + } else { + log(this.importConfig, `No such file or directory - '${this.workflowsFolderPath}'`, 'error'); + return; + } + + //create workflows in mapper directory + await fsUtil.makeDirectory(this.mapperDirPath); + this.workflowUidMapper = fileHelper.fileExistsSync(this.workflowUidMapperPath) + ? (fsUtil.readFile(join(this.workflowUidMapperPath), true) as Record) + : {}; + + if (this.workflows === undefined || isEmpty(this.workflows)) { + log(this.importConfig, 'No Workflow Found', 'info'); + return; + } + + //fetch all roles + await this.getRoles(); + await this.importWorkflows(); + + if (this.createdWorkflows?.length) { + fsUtil.writeFile(this.createdWorkflowsPath, this.createdWorkflows); + } + + if (this.failedWebhooks?.length) { + fsUtil.writeFile(this.failedWorkflowsPath, this.failedWebhooks); + } + + log(this.importConfig, 'Workflows have been imported successfully!', 'success'); + } + + async getRoles(): Promise { + const roles = await this.stack + .role() + .fetchAll() + .then((data: any) => data) + .catch((err: any) => log(this.importConfig, `Failed to fetch roles. ${formatError(err)}`, 'error')); + + for (const role of roles?.items || []) { + this.roleNameMap[role.name] = role.uid; + } + } + + async importWorkflows() { + const apiContent = values(this.workflows); + const oldWorkflows = cloneDeep(values(this.workflows)); + + //check and create custom roles if not exists + for (const workflow of values(this.workflows)) { + if (!this.workflowUidMapper.hasOwnProperty(workflow.uid)) { + await this.createCustomRoleIfNotExists(workflow); + } + } + + const onSuccess = async ({ response, apiData: { uid, name } = { uid: null, name: '' } }: any) => { + const oldWorkflowStages = find(oldWorkflows, { uid })?.workflow_stages; + if (!isEmpty(filter(oldWorkflowStages, ({ next_available_stages }) => !isEmpty(next_available_stages)))) { + let updateRresponse = await this.updateNextAvailableStagesUid( + response, + response.workflow_stages, + oldWorkflowStages, + ).catch((error) => { + log(this.importConfig, `Workflow '${name}' update failed.`, 'error'); + log(this.importConfig, error, 'error'); + }); + + if (updateRresponse) response = updateRresponse; + } + + this.createdWorkflows.push(response); + this.workflowUidMapper[uid] = response.uid; + log(this.importConfig, `Workflow '${name}' imported successfully`, 'success'); + fsUtil.writeFile(this.workflowUidMapperPath, this.workflowUidMapper); + }; + + const onReject = ({ error, apiData }: any) => { + const err = error?.message ? JSON.parse(error.message) : error; + const { name } = apiData; + if (err?.errors?.name) { + log(this.importConfig, `Workflow '${name}' already exists`, 'info'); + } else { + this.failedWebhooks.push(apiData); + if (error.errors['workflow_stages.0.users']) { + log( + this.importConfig, + "Failed to import Workflows as you've specified certain roles in the Stage transition and access rules section. We currently don't import roles to the stack.", + 'error', + ); + } else { + log(this.importConfig, `Workflow '${name}' failed to be import. ${formatError(error)}`, 'error'); + } + } + }; + + await this.makeConcurrentCall( + { + apiContent, + processName: 'create workflows', + apiParams: { + serializeData: this.serializeWorkflows.bind(this), + reject: onReject, + resolve: onSuccess, + entity: 'create-workflows', + includeParamOnCompletion: true, + }, + concurrencyLimit: config.fetchConcurrency || 1, + }, + undefined, + false, + ); + } + + updateNextAvailableStagesUid( + workflow: Record, + newWorkflowStages: Record[], + oldWorkflowStages: Record[], + ) { + newWorkflowStages = map(newWorkflowStages, (newStage, index) => { + const oldStage = oldWorkflowStages[index]; + if (!isEmpty(oldStage.next_available_stages)) { + newStage.next_available_stages = map(oldStage.next_available_stages, (stageUid) => { + if (stageUid === '$all') return stageUid; + const stageName = find(oldWorkflowStages, { uid: stageUid })?.name; + return find(newWorkflowStages, { name: stageName })?.uid; + }).filter((val) => val); + } + + return newStage; + }); + + workflow.workflow_stages = newWorkflowStages; + + const updateWorkflow = this.stack.workflow(workflow.uid); + Object.assign(updateWorkflow, workflow); + return updateWorkflow.update(); + } + + /** + * @method serializeWorkflows + * @param {ApiOptions} apiOptions ApiOptions + * @returns {ApiOptions} ApiOptions + */ + serializeWorkflows(apiOptions: ApiOptions): ApiOptions { + let { apiData: workflow } = apiOptions; + + if (this.workflowUidMapper.hasOwnProperty(workflow.uid)) { + log(this.importConfig, `Workflow '${workflow.name}' already exists. Skipping it to avoid duplicates!`, 'info'); + apiOptions.entity = undefined; + } else { + if (workflow.admin_users !== undefined) { + log(this.importConfig, chalk.yellow('We are skipping import of `Workflow superuser(s)` from workflow'), 'info'); + delete workflow.admin_users; + } + // One branch is required to create workflow. + if (!workflow.branches) { + workflow.branches = ['main']; + } + for (const stage of workflow.workflow_stages) { + delete stage.uid; + + if (!isEmpty(stage.next_available_stages)) { + stage.next_available_stages = ['$all']; + } + } + + apiOptions.apiData = workflow; + } + return apiOptions; + } + + async createCustomRoleIfNotExists(workflow: Record) { + const onSuccess = ({ response, apiData, additionalInfo: { workflowUid, stageIndex } }: any) => { + const { name } = apiData; + this.updateRoleData({ workflowUid, stageIndex, roleData: apiData }); + this.roleNameMap[name] = response?.uid; + }; + + const onReject = ({ error, apiData: { name } = { name: '' } }: any) => { + log(this.importConfig, `Failed to create custom roles '${name}'.${formatError(error)}`, 'error'); + }; + + const workflowStages = workflow.workflow_stages; + let stageIndex = 0; + for (const stage of workflowStages) { + if (stage?.SYS_ACL?.users?.uids?.length && stage?.SYS_ACL?.users?.uids[0] !== '$all') { + stage.SYS_ACL.users.uids = ['$all']; + } + if (stage?.SYS_ACL?.roles?.uids?.length) { + const apiContent = stage.SYS_ACL.roles.uids; + await this.makeConcurrentCall( + { + apiContent, + processName: 'create custom role', + apiParams: { + serializeData: this.serializeCustomRoles.bind(this), + reject: onReject, + resolve: onSuccess, + entity: 'create-custom-role', + includeParamOnCompletion: true, + additionalInfo: { workflowUid: workflow.uid, stageIndex }, + }, + concurrencyLimit: config.fetchConcurrency || 1, + }, + undefined, + false, + ); + } + stageIndex++; + } + } + + /** + * @method serializeCustomRoles + * @param {ApiOptions} apiOptions ApiOptions + * @returns {ApiOptions} ApiOptions + */ + serializeCustomRoles(apiOptions: ApiOptions): ApiOptions { + let { + apiData: roleData, + additionalInfo: { workflowUid, stageIndex }, + } = apiOptions; + if (!this.roleNameMap[roleData.name]) { + // rules.branch is required to create custom roles. + const branchRuleExists = find(roleData.rules, (rule: any) => rule.module === 'branch'); + if (!branchRuleExists) { + roleData.rules.push({ + module: 'branch', + branches: ['main'], + acl: { read: true }, + }); + } + apiOptions = roleData; + } else { + apiOptions.entity = undefined; + this.updateRoleData({ workflowUid, stageIndex, roleData }); + } + return apiOptions; + } + + updateRoleData(params: { workflowUid: string; stageIndex: number; roleData: any }) { + const { workflowUid, stageIndex, roleData } = params; + const workflowStage = this.workflows[workflowUid].workflow_stages; + const roles = workflowStage[stageIndex].SYS_ACL.roles.uids; + const index = findIndex(roles, ['uid', roleData.uid]); + roles[index >= 0 ? index : roles.length] = this.roleNameMap[roleData.name]; + } +} diff --git a/packages/contentstack-import/src/lib/util/import-flags.js b/packages/contentstack-import/src/lib/util/import-flags.js deleted file mode 100644 index aa5d8fb348..0000000000 --- a/packages/contentstack-import/src/lib/util/import-flags.js +++ /dev/null @@ -1,187 +0,0 @@ -/*! - * Contentstack Export - * Copyright (c) 2019 Contentstack LLC - * MIT Licensed - */ -let defaultConfig = require('../../config/default'); -let { initial } = require('../../app'); -let _ = require('lodash'); -const { cliux } = require('@contentstack/cli-utilities'); -let message = require('../../../messages/index.json'); - -exports.configWithMToken = function ( - config, - managementTokens, - moduleName, - host, - backupdir, - importCommandFlags, -) { - return new Promise(async function (resolve, reject) { - let externalConfig = config ? require(config) : {}; - const modules = externalConfig.modules; - - if (_.isArray(externalConfig['modules'])) { - externalConfig = _.omit(externalConfig, ['modules']); - } - - defaultConfig.host = host; - defaultConfig.branchName = importCommandFlags.branchName; - defaultConfig.target_stack = managementTokens.apiKey; - defaultConfig.management_token = managementTokens.token; - defaultConfig.importWebhookStatus = importCommandFlags.importWebhookStatus; - defaultConfig.isAuthenticated = importCommandFlags.isAuthenticated; - - if (moduleName && moduleName !== undefined) { - defaultConfig.moduleName = moduleName; - } - - if (backupdir) { - defaultConfig.useBackedupDir = backupdir; - } - - defaultConfig = _.merge(defaultConfig, externalConfig); - - if (!defaultConfig.data) { - const exporteddata = await cliux.prompt(message.promptMessageList.promptPathStoredData); - defaultConfig.data = exporteddata; - } - - if (_.isArray(modules)) { - defaultConfig.modules.types = _.filter(defaultConfig.modules.types, (module) => _.includes(modules, module)); - } - - initial(defaultConfig).then(resolve).catch(reject); - }); -}; - -exports.parameterWithMToken = function ( - managementTokens, - data, - moduleName, - host, - backupdir, - importCommandFlags, -) { - return new Promise(async function (resolve, reject) { - defaultConfig.management_token = managementTokens.token; - defaultConfig.target_stack = managementTokens.apiKey; - defaultConfig.branchName = importCommandFlags.branchName; - defaultConfig.importWebhookStatus = importCommandFlags.importWebhookStatus; - defaultConfig.isAuthenticated = importCommandFlags.isAuthenticated; - if (moduleName && moduleName !== undefined) { - defaultConfig.moduleName = moduleName; - } - defaultConfig.data = data; - defaultConfig.host = host; - if (backupdir) { - defaultConfig.useBackedupDir = backupdir; - } - initial(defaultConfig).then(resolve).catch(reject); - }); -}; - -// using ManagemetToken -exports.withoutParameterMToken = async ( - managementTokens, - moduleName, - host, - backupdir, - importCommandFlags, -) => { - return new Promise(async function (resolve, reject) { - const exporteddata = await cliux.prompt(message.promptMessageList.promptPathStoredData); - defaultConfig.management_token = managementTokens.token; - defaultConfig.target_stack = managementTokens.apiKey; - defaultConfig.branchName = importCommandFlags.branchName; - defaultConfig.importWebhookStatus = importCommandFlags.importWebhookStatus; - defaultConfig.isAuthenticated = importCommandFlags.isAuthenticated; - if (moduleName && moduleName !== undefined) { - defaultConfig.moduleName = moduleName; - } - defaultConfig.data = exporteddata; - defaultConfig.host = host; - if (backupdir) { - defaultConfig.useBackedupDir = backupdir; - } - initial(defaultConfig).then(resolve).catch(reject); - }); -}; - -exports.configWithAuthToken = function (config, moduleName, host, backupdir, importCommandFlags) { - return new Promise(async function (resolve, reject) { - let externalConfig = require(config); - defaultConfig.branchName = importCommandFlags.branchName; - defaultConfig.importWebhookStatus = importCommandFlags.importWebhookStatus; - defaultConfig.isAuthenticated = importCommandFlags.isAuthenticated; - if (moduleName && moduleName !== undefined) { - defaultConfig.moduleName = moduleName; - } - defaultConfig.host = host; - - if (externalConfig.modules) { - defaultConfig.modules.types = externalConfig.modules; - delete externalConfig.modules; - } - - if (backupdir) { - defaultConfig.useBackedupDir = backupdir; - } - defaultConfig = _.merge(defaultConfig, externalConfig); - if (!defaultConfig.data) { - const exporteddata = await cliux.prompt(message.promptMessageList.promptPathStoredData); - defaultConfig.data = exporteddata; - } - initial(defaultConfig).then(resolve).catch(reject); - }); -}; - -exports.parametersWithAuthToken = function ( - targetStack, - data, - moduleName, - host, - backupdir, - importCommandFlags, -) { - return new Promise(async function (resolve, reject) { - defaultConfig.target_stack = targetStack; - defaultConfig.branchName = importCommandFlags.branchName; - defaultConfig.importWebhookStatus = importCommandFlags.importWebhookStatus; - defaultConfig.isAuthenticated = importCommandFlags.isAuthenticated; - if (moduleName && moduleName !== undefined && backupdir === undefined) { - defaultConfig.moduleName = moduleName; - } else if (moduleName && moduleName !== undefined && backupdir !== undefined) { - defaultConfig.moduleName = moduleName; - defaultConfig.useBackedupDir = backupdir; - } else if (backupdir) { - defaultConfig.useBackedupDir = backupdir; - } - defaultConfig.data = data; - defaultConfig.host = host; - - initial(defaultConfig).then(resolve).catch(reject); - }); -}; - -exports.withoutParametersWithAuthToken = async (moduleName, host, backupdir, importCommandFlags) => { - return new Promise(async function (resolve, reject) { - const stackUid = await cliux.prompt(message.promptMessageList.promptTargetStack); - const exporteddata = await cliux.prompt(message.promptMessageList.promptPathStoredData); - defaultConfig.target_stack = stackUid; - defaultConfig.data = exporteddata; - defaultConfig.branchName = importCommandFlags.branchName; - defaultConfig.importWebhookStatus = importCommandFlags.importWebhookStatus; - defaultConfig.isAuthenticated = importCommandFlags.isAuthenticated; - if (moduleName && moduleName !== undefined && backupdir === undefined) { - defaultConfig.moduleName = moduleName; - } else if (moduleName && moduleName !== undefined && backupdir !== undefined) { - defaultConfig.moduleName = moduleName; - defaultConfig.useBackedupDir = backupdir; - } - - defaultConfig.host = host; - - initial(defaultConfig).then(resolve).catch(reject); - }); -}; diff --git a/packages/contentstack-import/src/lib/util/index.js b/packages/contentstack-import/src/lib/util/index.js deleted file mode 100644 index 4bc45d749a..0000000000 --- a/packages/contentstack-import/src/lib/util/index.js +++ /dev/null @@ -1,222 +0,0 @@ -/* eslint-disable no-console */ -/*! - * Contentstack Import - * Copyright (c) 2019 Contentstack LLC - * MIT Licensed - */ - -const _ = require('lodash'); -const { HttpClient, managementSDKClient, isAuthenticated } = require('@contentstack/cli-utilities'); -const fs = require('./fs'); -const path = require('path'); -const chalk = require('chalk'); -const { addlogs } = require('./log'); -const defaultConfig = require('../../config/default'); -const promiseLimit = require('promise-limit'); -let config; - -exports.initialization = (configData) => { - config = this.buildAppConfig(configData); - const res = this.validateConfig(config); - - if ((res && res !== 'error') || res === undefined) { - return config; - } -}; - -exports.validateConfig = (importConfig) => { - if (importConfig.email && importConfig.password && !importConfig.target_stack) { - addlogs(importConfig, chalk.red('Kindly provide api_token'), 'error'); - return 'error'; - } else if ( - !importConfig.email && - !importConfig.password && - !importConfig.management_token && - importConfig.target_stack && - !isAuthenticated() - ) { - addlogs(importConfig, chalk.red('Kindly provide management_token or email and password'), 'error'); - return 'error'; - } else if (!importConfig.email && !importConfig.password && importConfig.preserveStackVersion) { - addlogs(importConfig, chalk.red('Kindly provide Email and password for old version stack'), 'error'); - return 'error'; - } else if ((importConfig.email && !importConfig.password) || (!importConfig.email && importConfig.password)) { - addlogs(importConfig, chalk.red('Kindly provide Email and password'), 'error'); - return 'error'; - } -}; - -exports.buildAppConfig = (importConfig) => { - importConfig = _.merge(defaultConfig, importConfig); - return importConfig; -}; - -exports.sanitizeStack = (importConfig) => { - if (typeof importConfig.preserveStackVersion !== 'boolean' || !importConfig.preserveStackVersion) { - return Promise.resolve(); - } - addlogs(importConfig, 'Running script to maintain stack version.', 'success'); - try { - const httpClient = HttpClient.create(); - httpClient.headers(importConfig.headers); - return httpClient.get(`https://${importConfig.host}/v3${importConfig.apis.stacks}`).then((stackDetails) => { - if (stackDetails.data && stackDetails.data.stack && stackDetails.data.stack.settings) { - const newStackVersion = stackDetails.data.stack.settings.version; - const newStackDate = new Date(newStackVersion).toString(); - const stackFilePath = path.join( - importConfig.data, - importConfig.modules.stack.dirName, - importConfig.modules.stack.fileName, - ); - - const oldStackDetails = fs.readFileSync(stackFilePath); - if (!oldStackDetails || !oldStackDetails.settings || !oldStackDetails.settings.hasOwnProperty('version')) { - throw new Error(`${JSON.stringify(oldStackDetails)} is invalid!`); - } - const oldStackDate = new Date(oldStackDetails.settings.version).toString(); - - if (oldStackDate > newStackDate) { - throw new Error( - 'Migration Error. You cannot migrate data from new stack onto old. Kindly contact support@contentstack.com for more details.', - ); - } else if (oldStackDate === newStackDate) { - addlogs(importConfig, 'The version of both the stacks are same.', 'success'); - return Promise.resolve(); - } - addlogs(importConfig, 'Updating stack version.', 'success'); - - return httpClient - .put(`https://${importConfig.host}/v3${importConfig.apis.stacks}settings/set-version`, { - stack_settings: { - version: '2017-10-14', // This can be used as a variable - }, - }) - .then((response) => { - addlogs(importConfig, `Stack version preserved successfully!\n${JSON.stringify(response.data)}`, 'success'); - }); - } - throw new Error(`Unexpected stack details ${stackDetails && JSON.stringify(stackDetails.data)}`); - }); - } catch (error) { - console.log(error); - } -}; - -exports.masterLocalDetails = (stackAPIClient) => { - return new Promise((resolve, reject) => { - const result = stackAPIClient.locale().query(); - result - .find() - .then((response) => { - const masterLocalObj = response.items.filter((obj) => { - if (obj.fallback_locale === null) { - return obj; - } - }); - return resolve(masterLocalObj[0]); - }) - .catch((error) => { - return reject(error); - }); - }); -}; - -exports.field_rules_update = (importConfig, ctPath) => { - return new Promise((resolve, reject) => { - managementSDKClient(config) - .then((APIClient) => { - fs.readFileSync(path.join(ctPath + '/field_rules_uid.json'), async (err, data) => { - if (err) { - throw err; - } - const ct_field_visibility_uid = JSON.parse(data); - let ct_files = fs.readdirSync(ctPath); - if (ct_field_visibility_uid && ct_field_visibility_uid != 'undefined') { - for (const ele of ct_field_visibility_uid) { - if (ct_files.indexOf(ele + '.json') > -1) { - let schema = require(path.resolve(ctPath, ele)); - // await field_rules_update(schema) - let fieldRuleLength = schema.field_rules.length; - for (let k = 0; k < fieldRuleLength; k++) { - let fieldRuleConditionLength = schema.field_rules[k].conditions.length; - for (let i = 0; i < fieldRuleConditionLength; i++) { - if (schema.field_rules[k].conditions[i].operand_field === 'reference') { - let entryMapperPath = path.resolve(importConfig.data, 'mapper', 'entries'); - let entryUidMapperPath = path.join(entryMapperPath, 'uid-mapping.json'); - let fieldRulesValue = schema.field_rules[k].conditions[i].value; - let fieldRulesArray = fieldRulesValue.split('.'); - let updatedValue = []; - for (const element of fieldRulesArray) { - let splitedFieldRulesValue = element; - let oldUid = helper.readFileSync(path.join(entryUidMapperPath)); - if (oldUid.hasOwnProperty(splitedFieldRulesValue)) { - updatedValue.push(oldUid[splitedFieldRulesValue]); - } else { - updatedValue.push(element); - } - } - schema.field_rules[k].conditions[i].value = updatedValue.join('.'); - } - } - } - const stackAPIClient = APIClient.stack({ - api_key: importConfig.target_stack, - management_token: importConfig.management_token, - }); - let ctObj = stackAPIClient.contentType(schema.uid); - Object.assign(ctObj, _.cloneDeep(schema)); - ctObj - .update() - .then(() => { - return resolve(); - }) - .catch((error) => { - return reject(error); - }); - } - } - } - }); - }) - .catch(reject); - }); -}; - -exports.getConfig = () => { - return config; -}; - -exports.formatError = (error) => { - try { - if (typeof error === 'string') { - error = JSON.parse(error); - } else { - error = JSON.parse(error.message); - } - } catch (e) {} - let message = error.errorMessage || error.error_message || error.message || error; - if (error.errors && Object.keys(error.errors).length > 0) { - Object.keys(error.errors).forEach((e) => { - let entity = e; - if (e === 'authorization') entity = 'Management Token'; - if (e === 'api_key') entity = 'Stack API key'; - if (e === 'uid') entity = 'Content Type'; - if (e === 'access_token') entity = 'Delivery Token'; - message += ' ' + [entity, error.errors[e]].join(' '); - }); - } - return message; -}; - -exports.executeTask = (handler, options, tasks = []) => { - if (typeof handler !== 'function') { - throw new Error('Invalid handler'); - } - const { concurrency = 1 } = options; - const limit = promiseLimit(concurrency); - return Promise.all( - tasks.map((task) => { - return limit(() => handler(task)); - }), - ); -}; diff --git a/packages/contentstack-import/src/lib/util/login.js b/packages/contentstack-import/src/lib/util/login.js deleted file mode 100755 index af4bff99a5..0000000000 --- a/packages/contentstack-import/src/lib/util/login.js +++ /dev/null @@ -1,58 +0,0 @@ -/* eslint-disable no-console */ -/*! - * Contentstack Import - * Copyright (c) 2019 Contentstack LLC - * MIT Licensed - */ - -const chalk = require('chalk'); - -const { addlogs } = require('../util/log'); -const { managementSDKClient, isAuthenticated } = require('@contentstack/cli-utilities'); - -module.exports = (config) => { - return new Promise((resolve, reject) => { - managementSDKClient(config) - .then((APIClient) => { - // eslint-disable-next-line no-console - if (config.email && config.password) { - console.log('Logging into Contentstack'); - return APIClient.login({ email: config.email, password: config.password }) - .then((response) => { - // eslint-disable-next-line no-console - console.log(chalk.green('Contentstack account authenticated successfully!')); - config.headers = { - api_key: config.target_stack, - authtoken: response.user.authtoken, - 'X-User-Agent': 'contentstack-import/v', - }; - return resolve(config); - }) - .catch(reject); - } else if (config.management_token) { - return resolve(); - } else if (isAuthenticated()) { - const stackAPIClient = APIClient.stack({ - api_key: config.target_stack, - management_token: config.management_token, - }); - stackAPIClient - .fetch() - .then((stack) => { - config.destinationStackName = stack.name; - return resolve(); - }) - .catch((error) => { - let errorstack_key = error.errors.api_key; - if (error.errors.api_key) { - addlogs(config, chalk.red('Stack Api key ' + errorstack_key[0], 'Please enter valid Key'), 'error'); - return reject(error); - } - addlogs(config, error.errorMessage, 'error'); - return reject(error); - }); - } - }) - .catch((error) => reject(error)); - }); -}; diff --git a/packages/contentstack-import/src/lib/util/lookupReplaceEntries.js b/packages/contentstack-import/src/lib/util/lookupReplaceEntries.js deleted file mode 100644 index 44a4b79770..0000000000 --- a/packages/contentstack-import/src/lib/util/lookupReplaceEntries.js +++ /dev/null @@ -1,250 +0,0 @@ -/*! - * Contentstack Import - * Copyright (c) 2019 Contentstack LLC - * MIT Licensed - */ - -// eslint-disable-next-line unicorn/filename-case -const path = require('path'); -const _ = require('lodash'); - -const util = require('.'); -const helper = require('./fs'); -const config = util.getConfig(); -// update references in entry object -module.exports = function (data, mappedUids, uidMapperPath) { - let parent = []; - let uids = []; - let unmapped = []; - let mapped = []; - - let isNewRefFields = false; - let preserveStackVersion = config.preserveStackVersion; - - function gatherJsonRteEntryIds(jsonRteData) { - jsonRteData.children.forEach((element) => { - if (element.type) { - switch (element.type) { - case 'a': - case 'p': { - if (element.children && element.children.length > 0) { - gatherJsonRteEntryIds(element); - } - break; - } - case 'reference': { - if (Object.keys(element.attrs).length > 0 && element.attrs.type === 'entry') { - if (uids.indexOf(element.attrs['entry-uid']) === -1) { - uids.push(element.attrs['entry-uid']); - } - } - if (element.children && element.children.length > 0) { - gatherJsonRteEntryIds(element); - } - break; - } - } - } - }); - } - - const update = function (_parent, form_id, updateEntry) { - let _entry = updateEntry; - let len = _parent.length; - - for (let j = 0; j < len; j++) { - if (_entry && _parent[j]) { - if (j === len - 1 && _entry[_parent[j]]) { - if (form_id !== '_assets') { - if (_entry[_parent[j]].length) { - _entry[_parent[j]].forEach((item, idx) => { - if (typeof item.uid === 'string' && item._content_type_uid) { - uids.push(item.uid); - } else if (typeof item === 'string' && preserveStackVersion === true) { - uids.push(item); - } else { - uids.push(item); - _entry[_parent[j]][idx] = { - uid: item, - _content_type_uid: form_id, - }; - } - }); - } - } else if (Array.isArray(_entry[_parent[j]])) { - for (const element of _entry[_parent[j]]) { - if (element.uid.length) { - uids.push(element.uid); - } - } - } else if (_entry[_parent[j]].uid.length) { - uids.push(_entry[_parent[j]].uid); - } - } else { - _entry = _entry[_parent[j]]; - let _keys = _.clone(_parent).splice(j + 1, len); - if (Array.isArray(_entry)) { - for (let i = 0, _i = _entry.length; i < _i; i++) { - update(_keys, form_id, _entry[i]); - } - } else if (!(_entry instanceof Object)) { - break; - } - } - } - } - }; - const find = function (schema, _entry) { - for (let i = 0, _i = schema.length; i < _i; i++) { - switch (schema[i].data_type) { - case 'reference': - if (Array.isArray(schema[i].reference_to)) { - isNewRefFields = true; - schema[i].reference_to.forEach((reference) => { - parent.push(schema[i].uid); - update(parent, reference, _entry); - parent.pop(); - }); - } else { - parent.push(schema[i].uid); - update(parent, schema[i].reference_to, _entry); - parent.pop(); - } - break; - case 'global_field': - case 'group': - parent.push(schema[i].uid); - find(schema[i].schema, _entry); - parent.pop(); - break; - case 'blocks': - for (let j = 0, _j = schema[i].blocks.length; j < _j; j++) { - parent.push(schema[i].uid); - parent.push(schema[i].blocks[j].uid); - find(schema[i].blocks[j].schema, _entry); - parent.pop(); - parent.pop(); - } - break; - case 'json': - if (schema[i].field_metadata.rich_text_type) { - findEntryIdsFromJsonRte(data.entry, data.content_type.schema); - } - break; - } - } - }; - - function findEntryIdsFromJsonRte(entry, ctSchema) { - for (const element of ctSchema) { - switch (element.data_type) { - case 'blocks': { - if (entry[element.uid]) { - if (element.multiple) { - entry[element.uid].forEach((e) => { - let key = Object.keys(e).pop(); - let subBlock = element.blocks.filter((e) => e.uid === key).pop(); - findEntryIdsFromJsonRte(e[key], subBlock.schema); - }); - } - } - break; - } - case 'global_field': - case 'group': { - if (entry[element.uid]) { - if (element.multiple) { - entry[element.uid].forEach((e) => { - findEntryIdsFromJsonRte(e, element.schema); - }); - } else { - findEntryIdsFromJsonRte(entry[element.uid], element.schema); - } - } - break; - } - case 'json': { - if (entry[element.uid] && element.field_metadata.rich_text_type) { - if (element.multiple) { - entry[element.uid].forEach((jsonRteData) => { - gatherJsonRteEntryIds(jsonRteData); - }); - } else { - gatherJsonRteEntryIds(entry[element.uid]); - } - } - break; - } - } - } - } - - find(data.content_type.schema, data.entry); - if (isNewRefFields) { - findUidsInNewRefFields(data.entry, uids); - } - uids = _.flattenDeep(uids); - // if no references are found, return - if (uids.length === 0) { - return data.entry; - } - - uids = _.uniq(uids); - let entry = JSON.stringify(data.entry); - uids.forEach(function (uid) { - if (mappedUids.hasOwnProperty(uid)) { - entry = entry.replace(new RegExp(uid, 'img'), mappedUids[uid]); - mapped.push(uid); - } else { - unmapped.push(uid); - } - }); - - if (unmapped.length > 0) { - let unmappedUids = helper.readFileSync(path.join(uidMapperPath, 'unmapped-uids.json')); - unmappedUids = unmappedUids || {}; - if (unmappedUids.hasOwnProperty(data.content_type.uid)) { - unmappedUids[data.content_type.uid][data.entry.uid] = unmapped; - } else { - unmappedUids[data.content_type.uid] = { - [data.entry.uid]: unmapped, - }; - } - // write the unmapped contents to ./mapper/language/unmapped-uids.json - helper.writeFile(path.join(uidMapperPath, 'unmapped-uids.json'), unmappedUids); - } - - if (mapped.length > 0) { - let _mappedUids = helper.readFileSync(path.join(uidMapperPath, 'mapped-uids.json')); - _mappedUids = _mappedUids || {}; - if (_mappedUids.hasOwnProperty(data.content_type.uid)) { - _mappedUids[data.content_type.uid][data.entry.uid] = mapped; - } else { - _mappedUids[data.content_type.uid] = { - [data.entry.uid]: mapped, - }; - } - // write the mapped contents to ./mapper/language/mapped-uids.json - helper.writeFile(path.join(uidMapperPath, 'mapped-uids.json'), _mappedUids); - } - - return JSON.parse(entry); -}; - -function findUidsInNewRefFields(entry, uids) { - if (entry && typeof entry === 'object') { - if (entry.uid && entry._content_type_uid) { - uids.push(entry.uid); - } else if (Array.isArray(entry) && entry.length) { - entry.forEach(function (elem) { - findUidsInNewRefFields(elem, uids); - }); - } else if (Object.keys(entry).length) { - for (let key in entry) { - if (key) { - findUidsInNewRefFields(entry[key], uids); - } - } - } - } -} diff --git a/packages/contentstack-import/src/lib/util/marketplace-app-helper.js b/packages/contentstack-import/src/lib/util/marketplace-app-helper.js deleted file mode 100644 index 251d78050b..0000000000 --- a/packages/contentstack-import/src/lib/util/marketplace-app-helper.js +++ /dev/null @@ -1,31 +0,0 @@ -const { formatError } = require('.'); -const { cliux, configHandler } = require('@contentstack/cli-utilities'); - -const getAllStackSpecificApps = (developerHubBaseUrl, httpClient, config) => { - return httpClient - .get(`${developerHubBaseUrl}/installations?target_uids=${config.target_stack}`) - .then(({ data }) => data.data) - .catch((error) => log(config, `Failed to export marketplace-apps ${formatError(error)}`, 'error')); -}; - -const getDeveloperHubUrl = async (config) => { - const { cma, name } = configHandler.get('region') || {}; - let developerHubBaseUrl = config.developerHubUrls[cma]; - - if (!developerHubBaseUrl) { - developerHubBaseUrl = await cliux.inquire({ - type: 'input', - name: 'name', - validate: (url) => { - if (!url) return "Developer-hub URL can't be empty."; - - return true; - }, - message: `Enter the developer-hub base URL for the ${name} region -`, - }); - } - - return developerHubBaseUrl.startsWith('http') ? developerHubBaseUrl : `https://${developerHubBaseUrl}`; -}; - -module.exports = { getAllStackSpecificApps, getDeveloperHubUrl }; diff --git a/packages/contentstack-import/src/lib/util/removeReferenceFields.js b/packages/contentstack-import/src/lib/util/removeReferenceFields.js deleted file mode 100644 index a4ee243b96..0000000000 --- a/packages/contentstack-import/src/lib/util/removeReferenceFields.js +++ /dev/null @@ -1,59 +0,0 @@ -const _ = require('lodash'); - -/* eslint-disable no-empty */ -const removeReferenceFields = (module.exports = async function (schema, flag, stackAPIClient) { - for (let i = 0; i < schema.length; i++) { - if (schema[i].data_type === 'group') { - removeReferenceFields(schema[i].schema, flag); - } else if (schema[i].data_type === 'blocks') { - for (var block in schema[i].blocks) { - removeReferenceFields(schema[i].blocks[block].schema, flag); - } - } else if (schema[i].data_type === 'reference' || schema[i].reference_to ) { - flag.supressed = true; - // Check if content-type exists - // If exists, then no change should be required. - let isContentTypeError = false; - for (let j = 0; j < schema[i].reference_to.length; j++) { - try { - await stackAPIClient.contentType(schema[i].reference_to[j]).fetch(); - } catch (error) { - // Else warn and modify the schema object. - isContentTypeError = true; - console.warn(`Content-type ${schema[i].reference_to[j]} does not exist. Removing the field from schema`); - } - } - if (isContentTypeError) { - schema.splice(i, 1); - --i; - if (schema.length < 1) { - schema.push({ - data_type: 'text', - display_name: 'dummyTest', - uid: 'dummy_test', - field_metadata: { - description: '', - default_value: '', - version: 3, - }, - format: '', - error_messages: { - format: '', - }, - multiple: false, - mandatory: false, - unique: false, - non_localizable: false, - }); - } - } - } else if( // handling entry references in json rte - schema[i].data_type === 'json' - && schema[i].field_metadata.rich_text_type - && schema[i].field_metadata.embed_entry - && schema[i].reference_to.length > 1) { - flag.supressed = true; - schema[i].reference_to = ["sys_assets"] - } - } -}); diff --git a/packages/contentstack-import/src/lib/util/schemaTemplate.js b/packages/contentstack-import/src/lib/util/schemaTemplate.js deleted file mode 100644 index d1e46c0735..0000000000 --- a/packages/contentstack-import/src/lib/util/schemaTemplate.js +++ /dev/null @@ -1,38 +0,0 @@ -module.exports = { - content_type: { - title: 'Seed', - uid: '', - schema: [ - { - display_name: 'Title', - uid: 'title', - data_type: 'text', - field_metadata: { - _default: true, - }, - unique: false, - mandatory: true, - multiple: false, - }, - { - display_name: 'URL', - uid: 'url', - data_type: 'text', - field_metadata: { - _default: true, - }, - unique: false, - multiple: false, - }, - ], - options: { - title: 'title', - publishable: true, - is_page: true, - singleton: false, - sub_title: ['url'], - url_pattern: '/:title', - url_prefix: '/', - }, - }, -}; diff --git a/packages/contentstack-import/src/lib/util/supress-mandatory-fields.js b/packages/contentstack-import/src/lib/util/supress-mandatory-fields.js deleted file mode 100644 index 308eaff256..0000000000 --- a/packages/contentstack-import/src/lib/util/supress-mandatory-fields.js +++ /dev/null @@ -1,34 +0,0 @@ -/*! - * Contentstack Import - * Copyright (c) 2019 Contentstack LLC - * MIT Licensed - */ - -var supress = (module.exports = function (schema, flag) { - for (var i in schema) { - if (schema[i].data_type === 'group' || schema[i].data_type === 'global_field') { - supress(schema[i].schema, flag); - } else if (schema[i].data_type === 'blocks') { - for (var block in schema[i].blocks) { - supress(schema[i].blocks[block].schema, flag); - } - } else if (schema[i].data_type === 'reference') { - flag.references = true; - } else if (schema[i].data_type === 'json' && schema[i].field_metadata.rich_text_type) { - flag.jsonRte = true - if (schema[i].field_metadata.embed_entry === true) - flag.jsonRteEmbeddedEntries = true; - } - - if ( - (schema[i].hasOwnProperty('mandatory') && schema[i].mandatory) || - (schema[i].hasOwnProperty('unique') && schema[i].unique) - ) { - if (schema[i].uid !== 'title') { - schema[i].unique = false; - schema[i].mandatory = false; - flag.suppressed = true; - } - } - } -}); diff --git a/packages/contentstack-import/src/lib/util/upload.js b/packages/contentstack-import/src/lib/util/upload.js deleted file mode 100644 index 08cba12b26..0000000000 --- a/packages/contentstack-import/src/lib/util/upload.js +++ /dev/null @@ -1,56 +0,0 @@ -/*! - * Contentstack Import - * Copyright (c) 2019 Contentstack LLC - * MIT Licensed - */ - -'use strict'; - -const debug = require('debug')('util:requests'); -const MAX_RETRY_LIMIT = 5; -const Bluebird = require('bluebird'); - -const util = require('./index'); -const config = util.getConfig(); -const { managementSDKClient } = require('@contentstack/cli-utilities'); - -function validate(req) { - if (typeof req !== 'object') { - throw new Error(`Invalid params passed for request\n${JSON.stringify(arguments)}`); - } -} - -const upload = (module.exports = function (req, fsPath, RETRY) { - return new Bluebird(function (resolve, reject) { - try { - managementSDKClient(config) - .then((APIClient) => { - validate(req); - if (typeof RETRY !== 'number') { - RETRY = 1; - } else if (RETRY > MAX_RETRY_LIMIT) { - return reject(new Error('Max retry limit exceeded!')); - } - - req.upload = fsPath; - const stackAPIClient = APIClient.stack({ - api_key: config.target_stack, - management_token: config.management_token, - }); - stackAPIClient - .asset() - .create(req) - .then((response) => { - return resolve(response); - }) - .catch((error) => { - return reject(error); - }); - }) - .catch(reject); - } catch (error) { - debug(error); - return reject(error); - } - }); -}); diff --git a/packages/contentstack-import/src/types/default-config.ts b/packages/contentstack-import/src/types/default-config.ts new file mode 100644 index 0000000000..b833ed90fa --- /dev/null +++ b/packages/contentstack-import/src/types/default-config.ts @@ -0,0 +1,145 @@ +import { Modules } from '.'; + +export default interface DefaultConfig { + versioning: boolean; + host: string; + extensionHost: string; + developerHubUrls: Record; + modules: { + apiConcurrency: number; + types: Modules[]; + locales: { + dirName: string; + fileName: string; + requiredKeys: string[]; + }; + customRoles: { + dirName: string; + fileName: string; + customRolesLocalesFileName: string; + }; + environments: { + dirName: string; + fileName: string; + }; + labels: { + dirName: string; + fileName: string; + }; + extensions: { + dirName: string; + fileName: string; + validKeys: string[]; + }; + webhooks: { + dirName: string; + fileName: string; + }; + releases: { + dirName: string; + fileName: string; + invalidKeys: string[]; + }; + workflows: { + dirName: string; + fileName: string; + invalidKeys: string[]; + }; + assets: { + dirName: string; + assetBatchLimit: number; + publishAssets: boolean; + fileName: string; + importSameStructure: boolean; + uploadAssetsConcurrency: number; + displayExecutionTime: boolean; + importFoldersConcurrency: number; + includeVersionedAssets: boolean; + host: string; + folderValidKeys: string[]; + validKeys: string[]; + }; + 'assets-old': { + dirName: string; + fileName: string; + limit: number; + host: string; + validKeys: string[]; + assetBatchLimit: number; + uploadAssetsConcurrency: number; + importFoldersConcurrency: number; + }; + content_types: { + dirName: string; + fileName: string; + validKeys: string[]; + limit: number; + }; + 'content-types': { + dirName: string; + fileName: string; + validKeys: string[]; + limit: number; + }; + entries: { + dirName: string; + fileName: string; + invalidKeys: string[]; + limit: number; + assetBatchLimit: number; + }; + globalfields: { + dirName: string; + fileName: string; + validKeys: string[]; + limit: number; + }; + 'global-fields': { + dirName: string; + fileName: string; + validKeys: string[]; + limit: number; + }; + stack: { + dirName: string; + fileName: string; + }; + marketplace_apps: { + dirName: string; + fileName: string; + }; + masterLocale: { + dirName: string; + fileName: string; + requiredKeys: string[]; + }; + }; + languagesCode: string[]; + apis: { + userSession: string; + locales: string; + environments: string; + assets: string; + content_types: string; + entries: string; + extensions: string; + webhooks: string; + globalfields: string; + folders: string; + stacks: string; + labels: string; + }; + updatedModules: string[]; + rateLimit: number; + preserveStackVersion: boolean; + entriesPublish: boolean; + concurrency: number; + importConcurrency: number; + fetchConcurrency: number; + writeConcurrency: number; + developerHubBaseUrl: string; + marketplaceAppEncryptionKey: string; + getEncryptionKeyMaxRetry: number; + useNewModuleStructure: boolean; + createBackupDir?: string; +} diff --git a/packages/contentstack-import/src/types/import-config.ts b/packages/contentstack-import/src/types/import-config.ts new file mode 100644 index 0000000000..d857551fac --- /dev/null +++ b/packages/contentstack-import/src/types/import-config.ts @@ -0,0 +1,55 @@ +import { Modules } from '.'; +import DefaultConfig from './default-config'; + +export interface ExternalConfig { + source_stack?: string; + data: string; + fetchConcurrency: number; + writeConcurrency: number; + email?: string; + password?: string; +} + +export default interface ImportConfig extends DefaultConfig, ExternalConfig { + contentDir: string; + data: string; + management_token?: string; + apiKey: string; + forceStopMarketplaceAppsPrompt: boolean; + auth_token?: string; + branchName?: string; + securedAssets?: boolean; + contentTypes?: string[]; + branches?: branch[]; + branchEnabled?: boolean; + branchDir?: string; + moduleName?: Modules; + master_locale: masterLocale; + headers?: { + api_key: string; + access_token?: string; + authtoken?: string; + 'X-User-Agent': string; + }; + access_token?: string; + isAuthenticated?: boolean; + importWebhookStatus?: string; + target_stack?: string; + singleModuleImport?: boolean; + useBackedupDir?: string; + masterLocale: masterLocale; + backupDir: string; + backupConcurrency?: number; + authtoken?: string; + destinationStackName?: string; + org_uid?:string; +} + +type branch = { + uid: string; + source: string; +}; + +type masterLocale = { + code: string; +}; diff --git a/packages/contentstack-import/src/types/index.ts b/packages/contentstack-import/src/types/index.ts new file mode 100644 index 0000000000..104328215f --- /dev/null +++ b/packages/contentstack-import/src/types/index.ts @@ -0,0 +1,92 @@ +import { ContentstackClient } from '@contentstack/cli-utilities'; +import ImportConfig from './import-config'; + +// eslint-disable-next-line @typescript-eslint/no-redeclare +export interface AuthOptions { + contentstackClient: ContentstackClient; +} + +export interface ContentStackManagementClient { + contentstackClient: object; +} + +export interface PrintOptions { + color?: string; +} + +export interface InquirePayload { + type: string; + name: string; + message: string; + choices?: Array; + transformer?: Function; +} + +export interface User { + email: string; + authtoken: string; +} + +export type Modules = + | 'stack' + | 'assets' + | 'locales' + | 'environments' + | 'extensions' + | 'webhooks' + | 'global-fields' + | 'entries' + | 'content-types' + | 'custom-roles' + | 'workflows' + | 'labels' + | 'marketplace-apps'; + +export type ModuleClassParams = { + stackAPIClient: ReturnType; + importConfig: ImportConfig; + moduleName: Modules; +}; + +export interface Extensions{ + dirName: string; + fileName: string; + dependencies?: Modules[]; +}; + +export interface MarketplaceAppsConfig{ + dirName: string; + fileName: string; + dependencies?: Modules[]; +}; + +export interface EnvironmentConfig { + dirName: string; + fileName: string; + dependencies?: Modules[]; +} + +export interface LabelConfig{ + dirName: string; + fileName: string; +} + +export interface WebhookConfig{ + dirName: string; + fileName: string; +} + +export interface WorkflowConfig{ + dirName: string; + fileName: string; + invalidKeys: string[]; +} + +export interface CustomRoleConfig{ + dirName: string; + fileName: string; + customRolesLocalesFileName: string; +} + +export { default as DefaultConfig } from './default-config'; +export { default as ImportConfig } from './import-config'; diff --git a/packages/contentstack-import/src/lib/util/lookupReplaceAssets.js b/packages/contentstack-import/src/utils/asset-helper.ts similarity index 77% rename from packages/contentstack-import/src/lib/util/lookupReplaceAssets.js rename to packages/contentstack-import/src/utils/asset-helper.ts index 93d2da01dc..6b46050c42 100644 --- a/packages/contentstack-import/src/lib/util/lookupReplaceAssets.js +++ b/packages/contentstack-import/src/utils/asset-helper.ts @@ -1,18 +1,64 @@ -/*! - * Contentstack Import - * Copyright (c) 2019 Contentstack LLC - * MIT Licensed - */ - -let url = require('url'); -let path = require('path'); +import Bluebird from 'bluebird'; +import * as url from 'url'; +import * as path from 'path'; +import { ContentstackClient, managementSDKClient } from '@contentstack/cli-utilities'; +import { ImportConfig } from 'src/types'; +const debug = require('debug')('util:requests'); let _ = require('lodash'); let { marked } = require('marked'); +let helper = require('./file-helper'); + +const MAX_RETRY_LIMIT = 5; + +function validate(req: any) { + if (typeof req !== 'object') { + throw new Error(`Invalid params passed for request\n${JSON.stringify(arguments)}`); + } +} + +export const uploadAssetHelper = function (config: ImportConfig, req: any, fsPath: string, RETRY?: number) { + return new Bluebird(function (resolve, reject) { + try { + managementSDKClient(config) + .then((APIClient: ContentstackClient) => { + validate(req); + if (typeof RETRY !== 'number') { + RETRY = 1; + } else if (RETRY > MAX_RETRY_LIMIT) { + return reject(new Error('Max retry limit exceeded!')); + } -let helper = require('./fs'); + req.upload = fsPath; + const stackAPIClient = APIClient.stack({ + api_key: config.target_stack, + management_token: config.management_token, + }); + stackAPIClient + .asset() + .create(req) + .then((response) => { + return resolve(response); + }) + .catch((error) => { + return reject(error); + }); + }) + .catch(reject); + } catch (error) { + debug(error); + return reject(error); + } + }); +}; // get assets object -module.exports = function (data, mappedAssetUids, mappedAssetUrls, assetUidMapperPath, installedExtensions) { +export const lookupAssets = function ( + data: Record, + mappedAssetUids: Record, + mappedAssetUrls: Record, + assetUidMapperPath: string, + installedExtensions: Record[], +) { if ( !_.has(data, 'entry') || !_.has(data, 'content_type') || @@ -22,15 +68,15 @@ module.exports = function (data, mappedAssetUids, mappedAssetUrls, assetUidMappe ) { throw new Error('Invalid inputs for lookupAssets!'); } - let parent = []; - let assetUids = []; - let assetUrls = []; - let unmatchedUids = []; - let unmatchedUrls = []; - let matchedUids = []; - let matchedUrls = []; + let parent: string[] = []; + let assetUids: string[] = []; + let assetUrls: string[] = []; + let unmatchedUids: string[] = []; + let unmatchedUrls: string[] = []; + let matchedUids: string[] = []; + let matchedUrls: string[] = []; - let find = function (schema, entryToFind) { + let find = function (schema: any, entryToFind: any) { for (let i = 0, _i = schema.length; i < _i; i++) { if ( schema[i].data_type === 'text' && @@ -39,6 +85,9 @@ module.exports = function (data, mappedAssetUids, mappedAssetUrls, assetUidMappe ) { parent.push(schema[i].uid); findFileUrls(schema[i], entryToFind, assetUrls); + if (schema[i].field_metadata.rich_text_type) { + findAssetIdsFromHtmlRte(entryToFind, schema[i]); + } parent.pop(); } if (schema[i].data_type === 'group' || schema[i].data_type === 'global_field') { @@ -79,8 +128,8 @@ module.exports = function (data, mappedAssetUids, mappedAssetUrls, assetUidMappe } }; - function findAssetIdsFromJsonCustomFields(entryObj, ctSchema) { - ctSchema.map((row) => { + function findAssetIdsFromJsonCustomFields(entryObj: any, ctSchema: any) { + ctSchema.map((row: any) => { if (row.data_type === 'json') { if (entryObj[row.uid] && row.field_metadata.extension && row.field_metadata.is_asset) { if (installedExtensions && installedExtensions[row.extension_uid]) { @@ -99,15 +148,24 @@ module.exports = function (data, mappedAssetUids, mappedAssetUrls, assetUidMappe }); } - function findAssetIdsFromJsonRte(entryObj, ctSchema) { + function findAssetIdsFromHtmlRte(entryObj: any, ctSchema: any) { + const regex = / { + entryObj[element.uid].forEach((e: any) => { let key = Object.keys(e).pop(); - let subBlock = element.blocks.filter((block) => block.uid === key).pop(); + let subBlock = element.blocks.filter((block: any) => block.uid === key).pop(); findAssetIdsFromJsonRte(e[key], subBlock.schema); }); } @@ -118,7 +176,7 @@ module.exports = function (data, mappedAssetUids, mappedAssetUrls, assetUidMappe case 'group': { if (entryObj[element.uid]) { if (element.multiple) { - entryObj[element.uid].forEach((e) => { + entryObj[element.uid].forEach((e: any) => { findAssetIdsFromJsonRte(e, element.schema); }); } else { @@ -130,7 +188,7 @@ module.exports = function (data, mappedAssetUids, mappedAssetUrls, assetUidMappe case 'json': { if (entryObj[element.uid] && element.field_metadata.rich_text_type) { if (element.multiple) { - entryObj[element.uid].forEach((jsonRteData) => { + entryObj[element.uid].forEach((jsonRteData: any) => { gatherJsonRteAssetIds(jsonRteData); }); } else { @@ -143,8 +201,8 @@ module.exports = function (data, mappedAssetUids, mappedAssetUrls, assetUidMappe } } - function gatherJsonRteAssetIds(jsonRteData) { - jsonRteData.children.forEach((element) => { + function gatherJsonRteAssetIds(jsonRteData: any) { + jsonRteData.children.forEach((element: any) => { if (element.type) { switch (element.type) { case 'a': @@ -189,7 +247,7 @@ module.exports = function (data, mappedAssetUids, mappedAssetUrls, assetUidMappe assetUrls = _.uniq(assetUrls); let entry = JSON.stringify(data.entry); - assetUrls.forEach(function (assetUrl) { + assetUrls.forEach(function (assetUrl: any) { let mappedAssetUrl = mappedAssetUrls[assetUrl]; if (typeof mappedAssetUrl !== 'undefined') { entry = entry.replace(new RegExp(assetUrl, 'img'), mappedAssetUrl); @@ -199,7 +257,7 @@ module.exports = function (data, mappedAssetUids, mappedAssetUrls, assetUidMappe } }); - assetUids.forEach(function (assetUid) { + assetUids.forEach(function (assetUid: any) { let uid = mappedAssetUids[assetUid]; if (typeof uid !== 'undefined') { entry = entry.replace(new RegExp(assetUid, 'img'), uid); @@ -266,7 +324,7 @@ module.exports = function (data, mappedAssetUids, mappedAssetUrls, assetUidMappe return JSON.parse(entry); }; -function findFileUrls(schema, _entry, assetUrls) { +function findFileUrls(schema: any, _entry: any, assetUrls: any) { let markdownRegEx; let markdownMatch; @@ -304,12 +362,21 @@ function findFileUrls(schema, _entry, assetUrls) { ); while ((markdownMatch = markdownRegEx.exec(text)) !== null) { if (markdownMatch && typeof markdownMatch[0] === 'string') { - assetUrls.push(markdownMatch[0]); + let assetUrl = markdownMatch[0].replace(/\\/g, ''); + assetUrls.push(assetUrl); } } } -function updateFileFields(objekt, parent, pos, mappedAssetUids, matchedUids, unmatchedUids, mappedAssetUrls) { +function updateFileFields( + objekt: any, + parent: any, + pos: any, + mappedAssetUids: any, + matchedUids: any, + unmatchedUids: any, + mappedAssetUrls?: any, +) { if (_.isPlainObject(objekt) && _.has(objekt, 'filename') && _.has(objekt, 'uid')) { if (typeof pos !== 'undefined') { if (typeof pos === 'number' || typeof pos === 'string') { diff --git a/packages/contentstack-import/src/utils/backup-handler.ts b/packages/contentstack-import/src/utils/backup-handler.ts new file mode 100755 index 0000000000..bc87f1b5bf --- /dev/null +++ b/packages/contentstack-import/src/utils/backup-handler.ts @@ -0,0 +1,40 @@ +import * as path from 'path'; +import ncp from 'ncp'; + +import { ImportConfig } from '../types'; +import { fileHelper } from './index'; + +export default function setupBackupDir(importConfig: ImportConfig): Promise { + return new Promise(async (resolve, reject) => { + if (importConfig.hasOwnProperty('useBackedupDir')) { + return resolve(importConfig.useBackedupDir); + } + + //NOTE: If the backup folder's directory is provided, create it at that location; otherwise, the default path (working directory). + let backupDirPath = path.join(process.cwd(), '_backup_' + Math.floor(Math.random() * 1000)); + if (importConfig.createBackupDir) { + if (fileHelper.fileExistsSync(importConfig.createBackupDir)) { + fileHelper.removeDirSync(importConfig.createBackupDir); + } + fileHelper.makeDirectory(importConfig.createBackupDir); + backupDirPath = importConfig.createBackupDir; + } + + const limit = importConfig.backupConcurrency || 16; + if (path.isAbsolute(importConfig.contentDir)) { + return ncp(importConfig.contentDir, backupDirPath, { limit }, (error) => { + if (error) { + return reject(error); + } + return resolve(backupDirPath); + }); + } else { + ncp(importConfig.contentDir, backupDirPath, (error) => { + if (error) { + return reject(error); + } + return resolve(backupDirPath); + }); + } + }); +} diff --git a/packages/contentstack-import/src/utils/common-helper.ts b/packages/contentstack-import/src/utils/common-helper.ts new file mode 100644 index 0000000000..b8c3683240 --- /dev/null +++ b/packages/contentstack-import/src/utils/common-helper.ts @@ -0,0 +1,246 @@ +/* eslint-disable no-console */ +/*! + * Contentstack Import + * Copyright (c) 2019 Contentstack LLC + * MIT Licensed + */ + +import * as _ from 'lodash'; +import * as path from 'path'; +import { HttpClient, managementSDKClient, isAuthenticated } from '@contentstack/cli-utilities'; +import { readFileSync, readdirSync, readFile } from './file-helper'; +import chalk from 'chalk'; +import { log } from './logger'; +import defaultConfig from '../config'; +import promiseLimit from 'promise-limit'; +import { ImportConfig } from '../types'; + +let config: ImportConfig; +export const initialization = (configData: ImportConfig) => { + config = buildAppConfig(configData); + const res = validateConfig(config); + + if ((res && res !== 'error') || res === undefined) { + return config; + } +}; + +export const validateConfig = (importConfig: ImportConfig) => { + if (importConfig.email && importConfig.password && !importConfig.target_stack) { + log(importConfig, chalk.red('Kindly provide api_token'), 'error'); + return 'error'; + } else if ( + !importConfig.email && + !importConfig.password && + !importConfig.management_token && + importConfig.target_stack && + !isAuthenticated() + ) { + log(importConfig, chalk.red('Kindly provide management_token or email and password'), 'error'); + return 'error'; + } else if (!importConfig.email && !importConfig.password && importConfig.preserveStackVersion) { + log(importConfig, chalk.red('Kindly provide Email and password for old version stack'), 'error'); + return 'error'; + } else if ((importConfig.email && !importConfig.password) || (!importConfig.email && importConfig.password)) { + log(importConfig, chalk.red('Kindly provide Email and password'), 'error'); + return 'error'; + } +}; + +export const buildAppConfig = (importConfig: ImportConfig) => { + importConfig = _.merge(defaultConfig, importConfig); + return importConfig; +}; + +export const sanitizeStack = (importConfig: ImportConfig) => { + if (typeof importConfig.preserveStackVersion !== 'boolean' || !importConfig.preserveStackVersion) { + return Promise.resolve(); + } + log(importConfig, 'Running script to maintain stack version.', 'success'); + try { + const httpClient = HttpClient.create(); + httpClient.headers(importConfig.headers); + return httpClient.get(`https://${importConfig.host}/v3${importConfig.apis.stacks}`).then((stackDetails) => { + if (stackDetails.data && stackDetails.data.stack && stackDetails.data.stack.settings) { + const newStackVersion = stackDetails.data.stack.settings.version; + const newStackDate = new Date(newStackVersion).toString(); + const stackFilePath = path.join( + importConfig.data, + importConfig.modules.stack.dirName, + importConfig.modules.stack.fileName, + ); + + const oldStackDetails = readFileSync(stackFilePath); + if (!oldStackDetails || !oldStackDetails.settings || !oldStackDetails.settings.hasOwnProperty('version')) { + throw new Error(`${JSON.stringify(oldStackDetails)} is invalid!`); + } + const oldStackDate = new Date(oldStackDetails.settings.version).toString(); + + if (oldStackDate > newStackDate) { + throw new Error( + 'Migration Error. You cannot migrate data from new stack onto old. Kindly contact support@contentstack.com for more details.', + ); + } else if (oldStackDate === newStackDate) { + log(importConfig, 'The version of both the stacks are same.', 'success'); + return Promise.resolve(); + } + log(importConfig, 'Updating stack version.', 'success'); + + return httpClient + .put(`https://${importConfig.host}/v3${importConfig.apis.stacks}settings/set-version`, { + stack_settings: { + version: '2017-10-14', // This can be used as a variable + }, + }) + .then((response) => { + log(importConfig, `Stack version preserved successfully!\n${JSON.stringify(response.data)}`, 'success'); + }); + } + throw new Error(`Unexpected stack details ${stackDetails && JSON.stringify(stackDetails.data)}`); + }); + } catch (error) { + console.log(error); + } +}; + +export const masterLocalDetails = (stackAPIClient: any): Promise<{ code: string }> => { + return new Promise((resolve, reject) => { + const result = stackAPIClient.locale().query(); + result + .find() + .then((response: any) => { + const masterLocalObj = response.items.filter((obj: any) => { + if (obj.fallback_locale === null) { + return obj; + } + }); + return resolve(masterLocalObj[0]); + }) + .catch((error: Error) => { + return reject(error); + }); + }); +}; + +export const field_rules_update = (importConfig: ImportConfig, ctPath: string) => { + return new Promise(async (resolve, reject) => { + let client = await managementSDKClient(config); + + readFile(path.join(ctPath + '/field_rules_uid.json')) + .then(async (data) => { + const ct_field_visibility_uid = JSON.parse(data); + let ct_files = readdirSync(ctPath); + if (ct_field_visibility_uid && ct_field_visibility_uid != 'undefined') { + for (const ele of ct_field_visibility_uid) { + if (ct_files.indexOf(ele + '.json') > -1) { + let schema = require(path.resolve(ctPath, ele)); + // await field_rules_update(schema) + let fieldRuleLength = schema.field_rules.length; + for (let k = 0; k < fieldRuleLength; k++) { + let fieldRuleConditionLength = schema.field_rules[k].conditions.length; + for (let i = 0; i < fieldRuleConditionLength; i++) { + if (schema.field_rules[k].conditions[i].operand_field === 'reference') { + let entryMapperPath = path.resolve(importConfig.data, 'mapper', 'entries'); + let entryUidMapperPath = path.join(entryMapperPath, 'uid-mapping.json'); + let fieldRulesValue = schema.field_rules[k].conditions[i].value; + let fieldRulesArray = fieldRulesValue.split('.'); + let updatedValue = []; + for (const element of fieldRulesArray) { + let splitedFieldRulesValue = element; + let oldUid = readFileSync(path.join(entryUidMapperPath)); + if (oldUid.hasOwnProperty(splitedFieldRulesValue)) { + updatedValue.push(oldUid[splitedFieldRulesValue]); + } else { + updatedValue.push(element); + } + } + schema.field_rules[k].conditions[i].value = updatedValue.join('.'); + } + } + const stackAPIClient = client.stack({ + api_key: importConfig.target_stack, + management_token: importConfig.management_token, + }); + let ctObj = stackAPIClient.contentType(schema.uid); + Object.assign(ctObj, _.cloneDeep(schema)); + ctObj + .update() + .then(() => { + return resolve(''); + }) + .catch((error: Error) => { + return reject(error); + }); + } + } + } + } + }) + .catch(reject); + }); +}; + +export const getConfig = () => { + return config; +}; + +export const formatError = (error: any) => { + try { + if (typeof error === 'string') { + error = JSON.parse(error); + } else { + error = JSON.parse(error.message); + } + } catch (e) {} + let message = error?.errorMessage || error?.error_message || error?.message || error; + if (error && error.errors && Object.keys(error.errors).length > 0) { + Object.keys(error.errors).forEach((e) => { + let entity = e; + if (e === 'authorization') entity = 'Management Token'; + if (e === 'api_key') entity = 'Stack API key'; + if (e === 'uid') entity = 'Content Type'; + if (e === 'access_token') entity = 'Delivery Token'; + message += ' ' + [entity, error.errors[e]].join(' '); + }); + } + return message; +}; + +export const executeTask = ( + tasks: unknown[] = [], + handler: (task: unknown) => Promise, + options: { concurrency: number }, +) => { + if (typeof handler !== 'function') { + throw new Error('Invalid handler'); + } + const { concurrency = 1 } = options; + const limit = promiseLimit(concurrency); + return Promise.all( + tasks.map((task) => { + return limit(() => handler(task)); + }), + ); +}; + +export const validateBranch = async (stackAPIClient: any, config: ImportConfig, branch: any) => { + return new Promise(async (resolve, reject) => { + try { + const data = await stackAPIClient.branch(branch).fetch(); + if (data && typeof data === 'object') { + if (data.error_message) { + log(config, chalk.red(data.error_message), 'error'); + log(config, chalk.red('No branch found with the name ' + branch), 'error'); + reject({ message: 'No branch found with the name ' + branch, error: data.error_message }); + } else { + resolve(data); + } + } else { + reject({ message: 'No branch found with the name ' + branch, error: {} }); + } + } catch (error) { + log(config, chalk.red('No branch found with the name ' + branch), 'error'); + reject({ message: 'No branch found with the name ' + branch, error }); + } + }); +}; diff --git a/packages/contentstack-import/src/utils/content-type-helper.ts b/packages/contentstack-import/src/utils/content-type-helper.ts new file mode 100644 index 0000000000..140576af8f --- /dev/null +++ b/packages/contentstack-import/src/utils/content-type-helper.ts @@ -0,0 +1,151 @@ +/** + * Content type utiles + * schema template + * remove reference fields + * suppress mandatory fields + */ + +export const schemaTemplate = { + content_type: { + title: 'Seed', + uid: '', + schema: [ + { + display_name: 'Title', + uid: 'title', + data_type: 'text', + field_metadata: { + _default: true, + }, + unique: false, + mandatory: true, + multiple: false, + }, + { + display_name: 'URL', + uid: 'url', + data_type: 'text', + field_metadata: { + _default: true, + }, + unique: false, + multiple: false, + }, + ], + options: { + title: 'title', + publishable: true, + is_page: true, + singleton: false, + sub_title: ['url'], + url_pattern: '/:title', + url_prefix: '/', + }, + }, +}; + +/*! + * Contentstack Import + * Copyright (c) 2019 Contentstack LLC + * MIT Licensed + */ + +export const suppressSchemaReference = function (schema: any, flag: any) { + for (var i in schema) { + if (schema[i].data_type === 'group' || schema[i].data_type === 'global_field') { + suppressSchemaReference(schema[i].schema, flag); + } else if (schema[i].data_type === 'blocks') { + for (var block in schema[i].blocks) { + suppressSchemaReference(schema[i].blocks[block].schema, flag); + } + } else if (schema[i].data_type === 'reference') { + flag.references = true; + } else if (schema[i].data_type === 'json' && schema[i].field_metadata.rich_text_type) { + flag.jsonRte = true; + if (schema[i].field_metadata.embed_entry === true) flag.jsonRteEmbeddedEntries = true; + } + + if ( + (schema[i].hasOwnProperty('mandatory') && schema[i].mandatory) || + (schema[i].hasOwnProperty('unique') && schema[i].unique) + ) { + if (schema[i].uid !== 'title') { + schema[i].unique = false; + schema[i].mandatory = false; + flag.suppressed = true; + } + } + } +}; + +export const removeReferenceFields = async function ( + schema: any, + flag = { supressed: false }, + stackAPIClient: any, +): Promise { + for (let i = 0; i < schema.length; i++) { + if (schema[i].data_type === 'group') { + await removeReferenceFields(schema[i].schema, flag, stackAPIClient); + } else if (schema[i].data_type === 'blocks') { + for (var block in schema[i].blocks) { + await removeReferenceFields(schema[i].blocks[block].schema, flag, stackAPIClient); + } + } else if (schema[i].data_type === 'reference') { + flag.supressed = true; + // Check if content-type exists + // If exists, then no change should be required. + let isContentTypeError = false; + for (let j = 0; j < schema[i].reference_to.length; j++) { + try { + await stackAPIClient.contentType(schema[i].reference_to[j]).fetch(); + } catch (error) { + // Else warn and modify the schema object. + isContentTypeError = true; + console.warn(`Content-type ${schema[i].reference_to[j]} does not exist. Removing the field from schema`); + } + } + if (isContentTypeError) { + schema.splice(i, 1); + --i; + if (schema.length < 1) { + schema.push({ + data_type: 'text', + display_name: 'dummyTest', + uid: 'dummy_test', + field_metadata: { + description: '', + default_value: '', + version: 3, + }, + format: '', + error_messages: { + format: '', + }, + multiple: false, + mandatory: false, + unique: false, + non_localizable: false, + }); + } + } + } else if ( + // handling entry references in json rte + schema[i].data_type === 'json' && + schema[i].field_metadata.allow_json_rte && + schema[i].field_metadata.embed_entry && + schema[i].reference_to.length > 1 + ) { + flag.supressed = true; + schema[i].reference_to = ['sys_assets']; + } else if ( + // handling entry references in json rte + schema[i].data_type === 'json' && + schema[i].field_metadata.rich_text_type && + schema[i].field_metadata.embed_entry && + schema[i].reference_to.length > 1 + ) { + flag.supressed = true; + schema[i].reference_to = ['sys_assets']; + } + } +}; diff --git a/packages/contentstack-import/src/utils/entries-helper.ts b/packages/contentstack-import/src/utils/entries-helper.ts new file mode 100644 index 0000000000..bdbbf473a1 --- /dev/null +++ b/packages/contentstack-import/src/utils/entries-helper.ts @@ -0,0 +1,592 @@ +/** + * Entries lookup + */ + +import * as path from 'path'; +import * as _ from 'lodash'; +import config from '../config'; +import * as fileHelper from './file-helper'; + +// update references in entry object +export const lookupEntries = function (data: any, mappedUids: Record, uidMapperPath: string) { + let parent: string[] = []; + let uids: string[] = []; + let unmapped: string[] = []; + let mapped: string[] = []; + + let isNewRefFields = false; + let preserveStackVersion = config.preserveStackVersion; + + function gatherJsonRteEntryIds(jsonRteData: any) { + jsonRteData.children.forEach((element: any) => { + if (element.type) { + switch (element.type) { + case 'a': + case 'p': { + if (element.children && element.children.length > 0) { + gatherJsonRteEntryIds(element); + } + break; + } + case 'reference': { + if (Object.keys(element.attrs).length > 0 && element.attrs.type === 'entry') { + if (uids.indexOf(element.attrs['entry-uid']) === -1) { + uids.push(element.attrs['entry-uid']); + } + } + if (element.children && element.children.length > 0) { + gatherJsonRteEntryIds(element); + } + break; + } + } + } + }); + } + + const update = function (_parent: any, form_id: string, updateEntry: any) { + let _entry = updateEntry; + let len = _parent.length; + + for (let j = 0; j < len; j++) { + if (_entry && _parent[j]) { + if (j === len - 1 && _entry[_parent[j]]) { + if (form_id !== '_assets') { + if (_entry[_parent[j]].length) { + _entry[_parent[j]].forEach((item: any, idx: any) => { + if (typeof item.uid === 'string' && item._content_type_uid) { + uids.push(item.uid); + } else if (typeof item === 'string' && preserveStackVersion === true) { + uids.push(item); + } else { + uids.push(item); + _entry[_parent[j]][idx] = { + uid: item, + _content_type_uid: form_id, + }; + } + }); + } + } else if (Array.isArray(_entry[_parent[j]])) { + for (const element of _entry[_parent[j]]) { + if (element.uid.length) { + uids.push(element.uid); + } + } + } else if (_entry[_parent[j]].uid.length) { + uids.push(_entry[_parent[j]].uid); + } + } else { + _entry = _entry[_parent[j]]; + let _keys = _.clone(_parent).splice(j + 1, len); + if (Array.isArray(_entry)) { + for (let i = 0, _i = _entry.length; i < _i; i++) { + update(_keys, form_id, _entry[i]); + } + } else if (!(_entry instanceof Object)) { + break; + } + } + } + } + }; + const find = function (schema: any = [], _entry: any) { + for (let i = 0, _i = schema.length; i < _i; i++) { + switch (schema[i].data_type) { + case 'reference': + if (Array.isArray(schema[i].reference_to)) { + isNewRefFields = true; + schema[i].reference_to.forEach((reference: any) => { + parent.push(schema[i].uid); + update(parent, reference, _entry); + parent.pop(); + }); + } else { + parent.push(schema[i].uid); + update(parent, schema[i].reference_to, _entry); + parent.pop(); + } + break; + case 'global_field': + case 'group': + parent.push(schema[i].uid); + find(schema[i].schema, _entry); + parent.pop(); + break; + case 'blocks': + for (let j = 0, _j = schema[i].blocks.length; j < _j; j++) { + parent.push(schema[i].uid); + parent.push(schema[i].blocks[j].uid); + find(schema[i].blocks[j].schema, _entry); + parent.pop(); + parent.pop(); + } + break; + case 'json': + if (schema[i].field_metadata.rich_text_type) { + findEntryIdsFromJsonRte(data.entry, data.content_type.schema); + } + break; + } + } + }; + + function findEntryIdsFromJsonRte(entry: any, ctSchema: any) { + for (const element of ctSchema) { + switch (element.data_type) { + case 'blocks': { + if (entry[element.uid]) { + if (element.multiple) { + entry[element.uid].forEach((e: any) => { + let key = Object.keys(e).pop(); + let subBlock = element.blocks.filter((e: any) => e.uid === key).pop(); + findEntryIdsFromJsonRte(e[key], subBlock.schema); + }); + } + } + break; + } + case 'global_field': + case 'group': { + if (entry[element.uid]) { + if (element.multiple) { + entry[element.uid].forEach((e: any) => { + findEntryIdsFromJsonRte(e, element.schema); + }); + } else { + findEntryIdsFromJsonRte(entry[element.uid], element.schema); + } + } + break; + } + case 'json': { + if (entry[element.uid] && element.field_metadata.rich_text_type) { + if (element.multiple) { + entry[element.uid].forEach((jsonRteData: any) => { + gatherJsonRteEntryIds(jsonRteData); + }); + } else { + gatherJsonRteEntryIds(entry[element.uid]); + } + } + break; + } + } + } + } + + find(data.content_type.schema, data.entry); + if (isNewRefFields) { + findUidsInNewRefFields(data.entry, uids); + } + uids = _.flattenDeep(uids); + // if no references are found, return + if (uids.length === 0) { + return data.entry; + } + + uids = _.uniq(uids); + let entry = JSON.stringify(data.entry); + uids.forEach(function (uid: any) { + if (mappedUids.hasOwnProperty(uid)) { + entry = entry.replace(new RegExp(uid, 'img'), mappedUids[uid]); + mapped.push(uid); + } else { + unmapped.push(uid); + } + }); + + if (unmapped.length > 0) { + let unmappedUids = fileHelper.readFileSync(path.join(uidMapperPath, 'unmapped-uids.json')); + unmappedUids = unmappedUids || {}; + if (unmappedUids.hasOwnProperty(data.content_type.uid)) { + unmappedUids[data.content_type.uid][data.entry.uid] = unmapped; + } else { + unmappedUids[data.content_type.uid] = { + [data.entry.uid]: unmapped, + }; + } + // write the unmapped contents to ./mapper/language/unmapped-uids.json + fileHelper.writeFile(path.join(uidMapperPath, 'unmapped-uids.json'), unmappedUids); + } + + if (mapped.length > 0) { + let _mappedUids = fileHelper.readFileSync(path.join(uidMapperPath, 'mapped-uids.json')); + _mappedUids = _mappedUids || {}; + if (_mappedUids.hasOwnProperty(data.content_type.uid)) { + _mappedUids[data.content_type.uid][data.entry.uid] = mapped; + } else { + _mappedUids[data.content_type.uid] = { + [data.entry.uid]: mapped, + }; + } + // write the mapped contents to ./mapper/language/mapped-uids.json + fileHelper.writeFile(path.join(uidMapperPath, 'mapped-uids.json'), _mappedUids); + } + + return JSON.parse(entry); +}; + +function findUidsInNewRefFields(entry: any, uids: string[]) { + if (entry && typeof entry === 'object') { + if (entry.uid && entry._content_type_uid) { + uids.push(entry.uid); + } else if (Array.isArray(entry) && entry.length) { + entry.forEach(function (elem) { + findUidsInNewRefFields(elem, uids); + }); + } else if (Object.keys(entry).length) { + for (let key in entry) { + if (key) { + findUidsInNewRefFields(entry[key], uids); + } + } + } + } +} + +export const removeUidsFromJsonRteFields = ( + entry: Record, + ctSchema: Record[], +): Record => { + for (const element of ctSchema) { + switch (element.data_type) { + case 'blocks': { + if (entry[element.uid]) { + if (element.multiple) { + entry[element.uid] = entry[element.uid].map((e: any) => { + let key = Object.keys(e).pop(); + let subBlock = element.blocks.filter((block: any) => block.uid === key).pop(); + e[key] = removeUidsFromJsonRteFields(e[key], subBlock.schema); + return e; + }); + } + } + break; + } + case 'global_field': + case 'group': { + if (entry[element.uid]) { + if (element.multiple) { + entry[element.uid] = entry[element.uid].map((e: any) => { + e = removeUidsFromJsonRteFields(e, element.schema); + return e; + }); + } else { + entry[element.uid] = removeUidsFromJsonRteFields(entry[element.uid], element.schema); + } + } + break; + } + case 'json': { + if (entry[element.uid] && element.field_metadata.rich_text_type) { + if (element.multiple) { + entry[element.uid] = entry[element.uid].map((jsonRteData: any) => { + delete jsonRteData.uid; // remove uid + + if (_.isObject(jsonRteData.attrs)) { + jsonRteData.attrs.dirty = true; + } + + if (!_.isEmpty(jsonRteData.children)) { + jsonRteData.children = _.map(jsonRteData.children, (child) => removeUidsFromChildren(child)); + } + + return jsonRteData; + }); + } else { + delete entry[element.uid].uid; // remove uid + if (entry[element.uid] && _.isObject(entry[element.uid].attrs)) { + entry[element.uid].attrs.dirty = true; + } + if (entry[element.uid] && !_.isEmpty(entry[element.uid].children)) { + entry[element.uid].children = _.map(entry[element.uid].children, (child) => + removeUidsFromChildren(child), + ); + } + } + } + break; + } + } + } + return entry; +}; + +function removeUidsFromChildren(children: Record[] | any) { + if (children.length && children.length > 0) { + return children.map((child: any) => { + if (child.type && child.type.length > 0) { + delete child.uid; // remove uid + + if (_.isObject(child.attrs)) { + child.attrs.dirty = true; + } + } + if (child.children && child.children.length > 0) { + child.children = removeUidsFromChildren(child.children); + } + return child; + }); + } else { + if (children.type && children.type.length > 0) { + delete children.uid; // remove uid + if (_.isObject(children.attrs)) { + children.attrs.dirty = true; + } + } + if (children.children && children.children.length > 0) { + children.children = removeUidsFromChildren(children.children); + } + return children; + } +} + +export const removeEntryRefsFromJSONRTE = (entry: Record, ctSchema: Record[]) => { + for (const element of ctSchema) { + switch (element.data_type) { + case 'blocks': { + if (entry[element.uid]) { + if (element.multiple) { + entry[element.uid] = entry[element.uid].map((e: any) => { + let key = Object.keys(e).pop(); + let subBlock = element.blocks.filter((block: any) => block.uid === key).pop(); + e[key] = removeEntryRefsFromJSONRTE(e[key], subBlock.schema); + return e; + }); + } + } + break; + } + case 'global_field': + case 'group': { + if (entry[element.uid]) { + if (element.multiple) { + entry[element.uid] = entry[element.uid].map((e: any) => { + e = removeEntryRefsFromJSONRTE(e, element.schema); + return e; + }); + } else { + entry[element.uid] = removeEntryRefsFromJSONRTE(entry[element.uid], element.schema); + } + } + break; + } + case 'json': { + const structuredPTag = '{"type":"p","attrs":{},"children":[{"text":""}]}'; + if (entry[element.uid] && element.field_metadata.rich_text_type) { + if (element.multiple) { + entry[element.uid] = entry[element.uid].map((jsonRteData: any) => { + // repeated code from else block, will abstract later + let entryReferences = jsonRteData.children.filter((e: any) => doEntryReferencesExist(e)); + if (entryReferences.length > 0) { + jsonRteData.children = jsonRteData.children.filter((e: any) => !doEntryReferencesExist(e)); + if (jsonRteData.children.length === 0) { // empty children array are no longer acceptable by the API, a default structure must be there + jsonRteData.children.push(JSON.parse(structuredPTag)); + } + return jsonRteData; // return jsonRteData without entry references + } else { + return jsonRteData; // return jsonRteData as it is, because there are no entry references + } + }); + } else { + let entryReferences = entry[element.uid].children.filter((e: any) => doEntryReferencesExist(e)); + if (entryReferences.length > 0) { + entry[element.uid].children = entry[element.uid].children.filter((e: any) => !doEntryReferencesExist(e)); + if (entry[element.uid].children.length === 0) { + entry[element.uid].children.push(JSON.parse(structuredPTag)); + } + } + } + } + break; + } + } + } + return entry; +}; + +function doEntryReferencesExist(element: Record[] | any): boolean { + // checks if the children of p element contain any references + // only checking one level deep, not recursive + + if (element.length) { + for (const item of element) { + if ((item.type === 'p' || item.type === 'a') && item.children && item.children.length > 0) { + return doEntryReferencesExist(item.children); + } else if (isEntryRef(item)) { + return true; + } + } + } else { + if (isEntryRef(element)) { + return true; + } + + if ((element.type === 'p' || element.type === 'a') && element.children && element.children.length > 0) { + return doEntryReferencesExist(element.children); + } + } + return false; +} + +function isEntryRef(element: any) { + return element.type === 'reference' && element.attrs.type === 'entry'; +} + +export const restoreJsonRteEntryRefs = ( + entry: Record, + sourceStackEntry: any, + ctSchema: any, + { mappedAssetUids, mappedAssetUrls }: any, +) => { + // let mappedAssetUids = fileHelper.readFileSync(this.mappedAssetUidPath) || {}; + // let mappedAssetUrls = fileHelper.readFileSync(this.mappedAssetUrlPath) || {}; + for (const element of ctSchema) { + switch (element.data_type) { + case 'blocks': { + if (entry[element.uid]) { + if (element.multiple) { + entry[element.uid] = entry[element.uid].map((e: any, eIndex: number) => { + let key = Object.keys(e).pop(); + let subBlock = element.blocks.filter((block: any) => block.uid === key).pop(); + let sourceStackElement = sourceStackEntry[element.uid][eIndex][key]; + e[key] = restoreJsonRteEntryRefs(e[key], sourceStackElement, subBlock.schema, { + mappedAssetUids, + mappedAssetUrls, + }); + return e; + }); + } + } + break; + } + case 'global_field': + case 'group': { + if (entry[element.uid]) { + if (element.multiple) { + entry[element.uid] = entry[element.uid].map((e: any, eIndex: number) => { + let sourceStackElement = sourceStackEntry[element.uid][eIndex]; + e = restoreJsonRteEntryRefs(e, sourceStackElement, element.schema, { mappedAssetUids, mappedAssetUrls }); + return e; + }); + } else { + let sourceStackElement = sourceStackEntry[element.uid]; + entry[element.uid] = restoreJsonRteEntryRefs(entry[element.uid], sourceStackElement, element.schema, { + mappedAssetUids, + mappedAssetUrls, + }); + } + } + break; + } + case 'json': { + if (entry[element.uid] && element.field_metadata.rich_text_type) { + if (element.multiple) { + entry[element.uid] = entry[element.uid].map((field: any, index: number) => { + // i am facing a Maximum call stack exceeded issue, + // probably because of this loop operation + + let entryRefs = sourceStackEntry[element.uid][index].children + .map((e: any, i: number) => { + return { index: i, value: e }; + }) + .filter((e: any) => doEntryReferencesExist(e.value)) + .map((e: any) => { + // commenting the line below resolved the maximum call stack exceeded issue + // e.value = this.setDirtyTrue(e.value) + setDirtyTrue(e.value); + return e; + }) + .map((e: any) => { + // commenting the line below resolved the maximum call stack exceeded issue + // e.value = this.resolveAssetRefsInEntryRefsForJsonRte(e, mappedAssetUids, mappedAssetUrls) + resolveAssetRefsInEntryRefsForJsonRte(e.value, mappedAssetUids, mappedAssetUrls); + return e; + }); + + if (entryRefs.length > 0) { + entryRefs.forEach((entryRef: any) => { + field.children.splice(entryRef.index, 0, entryRef.value); + }); + } + return field; + }); + } else { + let entryRefs = sourceStackEntry[element.uid].children + .map((e: any, index: number) => { + return { index: index, value: e }; + }) + .filter((e: any) => doEntryReferencesExist(e.value)) + .map((e: any) => { + setDirtyTrue(e.value); + return e; + }) + .map((e: any) => { + resolveAssetRefsInEntryRefsForJsonRte(e.value, mappedAssetUids, mappedAssetUrls); + return e; + }); + + if (entryRefs.length > 0) { + entryRefs.forEach((entryRef: any) => { + if (!_.isEmpty(entry[element.uid]) && entry[element.uid].children) { + entry[element.uid].children.splice(entryRef.index, 0, entryRef.value); + } + }); + } + } + } + break; + } + } + } + return entry; +}; + +function setDirtyTrue(jsonRteChild: any) { + // also removing uids in this function + if (jsonRteChild.type) { + if (_.isObject(jsonRteChild.attrs)) { + jsonRteChild.attrs['dirty'] = true; + } + delete jsonRteChild.uid; + + if (jsonRteChild.children && jsonRteChild.children.length > 0) { + jsonRteChild.children = jsonRteChild.children.map((subElement: any) => this.setDirtyTrue(subElement)); + } + } + return jsonRteChild; +} + +function resolveAssetRefsInEntryRefsForJsonRte(jsonRteChild: any, mappedAssetUids: any, mappedAssetUrls: any) { + if (jsonRteChild.type) { + if (jsonRteChild.attrs.type === 'asset') { + let assetUrl; + if (mappedAssetUids[jsonRteChild.attrs['asset-uid']]) { + jsonRteChild.attrs['asset-uid'] = mappedAssetUids[jsonRteChild.attrs['asset-uid']]; + } + + if (jsonRteChild.attrs['display-type'] !== 'link') { + assetUrl = jsonRteChild.attrs['asset-link']; + } else { + assetUrl = jsonRteChild.attrs['href']; + } + + if (mappedAssetUrls[assetUrl]) { + if (jsonRteChild.attrs['display-type'] !== 'link') { + jsonRteChild.attrs['asset-link'] = mappedAssetUrls[assetUrl]; + } else { + jsonRteChild.attrs['href'] = mappedAssetUrls[assetUrl]; + } + } + } + + if (jsonRteChild.children && jsonRteChild.children.length > 0) { + jsonRteChild.children = jsonRteChild.children.map((subElement: any) => + resolveAssetRefsInEntryRefsForJsonRte(subElement, mappedAssetUids, mappedAssetUrls), + ); + } + } + + return jsonRteChild; +} diff --git a/packages/contentstack-import/src/lib/util/extensionsUidReplace.js b/packages/contentstack-import/src/utils/extension-helper.ts similarity index 53% rename from packages/contentstack-import/src/lib/util/extensionsUidReplace.js rename to packages/contentstack-import/src/utils/extension-helper.ts index 1535b5ee73..976d1b326a 100644 --- a/packages/contentstack-import/src/lib/util/extensionsUidReplace.js +++ b/packages/contentstack-import/src/utils/extension-helper.ts @@ -1,29 +1,36 @@ +/** + * extension lookup + */ + /*! * Contentstack Import * Copyright (c) 2019 Contentstack LLC * MIT Licensed */ - -// eslint-disable-next-line unicorn/filename-case -let path = require('path'); -const _ = require('lodash'); -let helper = require('./fs'); -let util = require('../util'); -let config = util.getConfig(); -let extensionPath = path.resolve(config.data, 'mapper/extensions', 'uid-mapping.json'); -let globalfieldsPath = path.resolve(config.data, 'mapper/globalfields', 'uid-mapping.json'); +import { join } from 'node:path'; +import { FsUtility } from '@contentstack/cli-utilities'; +import { ImportConfig } from '../types'; // eslint-disable-next-line camelcase -let extension_uid_Replace = (module.exports = function (schema, preserveStackVersion, installedExtensions) { +export const lookupExtension = function ( + config: ImportConfig, + schema: any, + preserveStackVersion: any, + installedExtensions: any, +) { + const fs = new FsUtility({ basePath: config.backupDir }); + const extensionPath = join(config.backupDir, 'mapper/extensions', 'uid-mapping.json'); + const globalfieldsPath = join(config.backupDir, 'mapper/globalfields', 'uid-mapping.json'); + for (let i in schema) { if (schema[i].data_type === 'group') { - extension_uid_Replace(schema[i].schema, preserveStackVersion, installedExtensions); + lookupExtension(config, schema[i].schema, preserveStackVersion, installedExtensions); } else if (schema[i].data_type === 'blocks') { for (let block in schema[i].blocks) { if (schema[i].blocks[block].hasOwnProperty('reference_to')) { delete schema[i].blocks[block].schema; } else { - extension_uid_Replace(schema[i].blocks[block].schema, preserveStackVersion, installedExtensions); + lookupExtension(config, schema[i].blocks[block].schema, preserveStackVersion, installedExtensions); } } } else if ( @@ -36,15 +43,24 @@ let extension_uid_Replace = (module.exports = function (schema, preserveStackVer schema[i].reference_to = [schema[i].reference_to]; schema[i].field_metadata.ref_multiple_content_types = true; } + } else if ( + schema[i].data_type === 'reference' && + schema[i].field_metadata.hasOwnProperty('ref_multiple_content_types') && + installedExtensions && + installedExtensions[schema[i].extension_uid] + ) { + schema[i].extension_uid = installedExtensions[schema[i].extension_uid]; + } else if (schema[i].data_type === 'text' && installedExtensions && installedExtensions[schema[i].extension_uid]) { + schema[i].extension_uid = installedExtensions[schema[i].extension_uid]; } else if (schema[i].data_type === 'global_field') { - let global_fields_key_value = schema[i].reference_to; - let global_fields_data = helper.readFileSync(path.join(globalfieldsPath)); + const global_fields_key_value = schema[i].reference_to; + const global_fields_data = fs.readFile(globalfieldsPath) as Record; if (global_fields_data && global_fields_data.hasOwnProperty(global_fields_key_value)) { schema[i].reference_to = global_fields_data[global_fields_key_value]; } } else if (schema[i].hasOwnProperty('extension_uid')) { const extension_key_value = schema[i].extension_uid; - const data = helper.readFileSync(path.join(extensionPath)); + const data = fs.readFile(extensionPath) as Record; if (data && data.hasOwnProperty(extension_key_value)) { // eslint-disable-next-line camelcase schema[i].extension_uid = data[extension_key_value]; @@ -54,9 +70,9 @@ let extension_uid_Replace = (module.exports = function (schema, preserveStackVer } } } else if (schema[i].data_type === 'json' && schema[i].hasOwnProperty('plugins') && schema[i].plugins.length > 0) { - const newPluginUidsArray = []; - const data = helper.readFileSync(path.join(extensionPath)); - schema[i].plugins.forEach((extension_key_value) => { + const newPluginUidsArray: any[] = []; + const data = fs.readFile(extensionPath) as Record; + schema[i].plugins.forEach((extension_key_value: string) => { if (data && data.hasOwnProperty(extension_key_value)) { newPluginUidsArray.push(data[extension_key_value]); } @@ -64,4 +80,4 @@ let extension_uid_Replace = (module.exports = function (schema, preserveStackVer schema[i].plugins = newPluginUidsArray; } } -}); +}; diff --git a/packages/contentstack-import/src/utils/file-helper.ts b/packages/contentstack-import/src/utils/file-helper.ts new file mode 100644 index 0000000000..dd97ea0dc4 --- /dev/null +++ b/packages/contentstack-import/src/utils/file-helper.ts @@ -0,0 +1,138 @@ +import * as fs from 'fs'; +import * as path from 'path'; +import mkdirp from 'mkdirp'; +import * as bigJSON from 'big-json'; +import { FsUtility } from '@contentstack/cli-utilities'; + +export const readFileSync = function (filePath: string, parse: boolean = true): any { + let data; + filePath = path.resolve(filePath); + if (fs.existsSync(filePath)) { + try { + data = parse ? JSON.parse(fs.readFileSync(filePath, 'utf-8')) : data; + } catch (error) { + return data; + } + } + return data; +}; + +// by default file type is json +export const readFile = async (filePath: string, options = { type: 'json' }): Promise => { + return new Promise((resolve, reject) => { + filePath = path.resolve(filePath); + fs.readFile(filePath, 'utf-8', (error, data) => { + if (error) { + if (error.code === 'ENOENT') { + return resolve(''); + } + reject(error); + } else { + if (options.type !== 'json') { + return resolve(data); + } + resolve(JSON.parse(data)); + } + }); + }); +}; + +export const readLargeFile = function (filePath: string, opts?: any): Promise { + if (typeof filePath !== 'string') { + return; + } + filePath = path.resolve(filePath); + if (fs.existsSync(filePath)) { + return new Promise((resolve, reject) => { + const readStream = fs.createReadStream(filePath, { encoding: 'utf-8' }); + const parseStream = bigJSON.createParseStream(); + parseStream.on('data', function (data: any) { + if (opts?.type === 'array') { + return resolve(Object.values(data)); + } + resolve(data); + }); + parseStream.on('error', function (error: Error) { + console.log('error', error); + reject(error); + }); + readStream.pipe(parseStream); + }); + } +}; + +export const writeFileSync = function (filePath: string, data: any): void { + data = typeof data === 'object' ? JSON.stringify(data) : data || '{}'; + fs.writeFileSync(filePath, data); +}; + +export const writeFile = function (filePath: string, data: any): Promise { + return new Promise((resolve, reject) => { + data = typeof data === 'object' ? JSON.stringify(data) : data || '{}'; + fs.writeFile(filePath, data, (error) => { + if (error) { + return reject(error); + } + resolve('done'); + }); + }); +}; + +export const writeLargeFile = function (filePath: string, data: any): Promise { + if (typeof filePath !== 'string' || typeof data !== 'object') { + return; + } + filePath = path.resolve(filePath); + return new Promise((resolve, reject) => { + const stringifyStream = bigJSON.createStringifyStream({ + body: data, + }); + var writeStream = fs.createWriteStream(filePath, 'utf-8'); + stringifyStream.pipe(writeStream); + writeStream.on('finish', () => { + resolve(''); + }); + writeStream.on('error', (error) => { + reject(error); + }); + }); +}; + +export const makeDirectory = function (dir: string): void { + for (let key in arguments) { + const dirname = path.resolve(arguments[key]); + if (!fs.existsSync(dirname)) { + mkdirp.sync(dirname); + } + } +}; + +export const readdirSync = function (dirPath: string): any { + if (fs.existsSync(dirPath)) { + return fs.readdirSync(dirPath); + } else { + return []; + } +}; + +export const isFolderExist = async (folderPath: string): Promise => { + return new Promise((resolve, reject) => { + folderPath = path.resolve(folderPath); + fs.access(folderPath, (error) => { + if (error) { + return resolve(false); + } + resolve(true); + }); + }); +}; + +export const fileExistsSync = function (path: string) { + return fs.existsSync(path); +}; + +export const removeDirSync = function(path: string){ + fs.rmdirSync(path, { recursive: true}); +} + +export const fsUtil = new FsUtility(); diff --git a/packages/contentstack-import/src/utils/import-config-handler.ts b/packages/contentstack-import/src/utils/import-config-handler.ts new file mode 100644 index 0000000000..f02681ce4b --- /dev/null +++ b/packages/contentstack-import/src/utils/import-config-handler.ts @@ -0,0 +1,81 @@ +import merge from 'merge'; +import * as path from 'path'; +import { omit, filter, includes, isArray } from 'lodash'; +import { configHandler, isAuthenticated } from '@contentstack/cli-utilities'; +import defaultConfig from '../config'; +import { readFile } from './file-helper'; +import { askContentDir, askAPIKey } from './interactive'; +import login from './login-handler'; +import { ImportConfig } from '../types'; + +const setupConfig = async (importCmdFlags: any): Promise => { + let config: ImportConfig = merge({}, defaultConfig); + // setup the config + if (importCmdFlags['config']) { + let externalConfig = await readFile(importCmdFlags['config']); + if (isArray(externalConfig['modules'])) { + config.modules.types = filter(config.modules.types, (module) => includes(externalConfig['modules'], module)); + externalConfig = omit(externalConfig, ['modules']); + } + config = merge.recursive(config, externalConfig); + } + config.contentDir = importCmdFlags['data'] || importCmdFlags['data-dir'] || config.data || (await askContentDir()); + config.contentDir = path.resolve(config.contentDir); + //Note to support the old key + config.data = config.contentDir; + + const managementTokenAlias = importCmdFlags['management-token-alias'] || importCmdFlags['alias']; + + if (managementTokenAlias) { + const { token, apiKey } = configHandler.get(`tokens.${managementTokenAlias}`); + config.management_token = token; + config.apiKey = apiKey; + if (!config.management_token) { + throw new Error(`No management token found on given alias ${managementTokenAlias}`); + } + } + + if (!config.management_token) { + if (!isAuthenticated()) { + if (config.email && config.password) { + await login(config); + } else { + throw new Error('Please login or provide an alias for the management token'); + } + } else { + config.apiKey = + importCmdFlags['stack-uid'] || importCmdFlags['stack-api-key'] || config.target_stack || (await askAPIKey()); + if (typeof config.apiKey !== 'string') { + throw new Error('Invalid API key received'); + } + } + } + + config.isAuthenticated = isAuthenticated(); + + //Note to support the old key + config.source_stack = config.apiKey; + + config.importWebhookStatus = importCmdFlags['import-webhook-status']; + config.forceStopMarketplaceAppsPrompt = importCmdFlags.yes; + + if (importCmdFlags['branch']) { + config.branchName = importCmdFlags['branch']; + config.branchDir = path.join(config.contentDir, config.branchName); + } + if (importCmdFlags['module']) { + config.moduleName = importCmdFlags['module']; + config.singleModuleImport = true; + } + + if (importCmdFlags['backup-dir']) { + config.useBackedupDir = importCmdFlags['backup-dir']; + } + + // Note to support old modules + config.target_stack = config.apiKey; + + return config; +}; + +export default setupConfig; diff --git a/packages/contentstack-import/src/utils/index.ts b/packages/contentstack-import/src/utils/index.ts new file mode 100644 index 0000000000..19cfca611e --- /dev/null +++ b/packages/contentstack-import/src/utils/index.ts @@ -0,0 +1,29 @@ +export * as interactive from './interactive'; +export { default as setupImportConfig } from './import-config-handler'; +export * as fileHelper from './file-helper'; +export { fsUtil } from './file-helper'; +export { default as backupHandler } from './backup-handler'; +export { log, unlinkFileLogger } from './logger'; +export { uploadAssetHelper, lookupAssets } from './asset-helper'; +export { + getDeveloperHubUrl, + getOrgUid, + getConfirmationToCreateApps, + createPrivateApp, + handleNameConflict, + installApp, + makeRedirectUrlCall, + confirmToCloseProcess, + getAllStackSpecificApps, + ifAppAlreadyExist, + updateAppConfig, +} from './marketplace-app-helper'; +export { schemaTemplate, suppressSchemaReference, removeReferenceFields } from './content-type-helper'; +export { lookupExtension } from './extension-helper'; +export { + lookupEntries, + removeUidsFromJsonRteFields, + removeEntryRefsFromJSONRTE, + restoreJsonRteEntryRefs, +} from './entries-helper'; +export * from './common-helper'; diff --git a/packages/contentstack-import/src/utils/interactive.ts b/packages/contentstack-import/src/utils/interactive.ts new file mode 100644 index 0000000000..c949030275 --- /dev/null +++ b/packages/contentstack-import/src/utils/interactive.ts @@ -0,0 +1,84 @@ +import { cliux } from '@contentstack/cli-utilities'; +import * as path from 'path'; +import first from 'lodash/first'; +import split from 'lodash/split'; + +export const askContentDir = async (): Promise => { + const result = await cliux.inquire({ + type: 'input', + message: 'Enter the path for the content', + name: 'dir', + }); + return path.resolve(result); +}; + +export const askAPIKey = async (): Promise => { + return cliux.inquire({ + type: 'input', + message: 'Enter the stack api key', + name: 'apiKey', + }); +}; + +export const askDeveloperHubUrl = async (regionName: string): Promise => { + return await cliux.inquire({ + type: 'input', + name: 'name', + validate: (url) => { + if (!url) return "Developer-hub URL can't be empty."; + return true; + }, + message: `Enter the developer-hub base URL for the ${regionName} region -`, + }); +}; + +export const askEncryptionKey = async(defaultValue: unknown): Promise => { + return await cliux.inquire({ + type: 'input', + name: 'name', + default: defaultValue, + validate: (key) => { + if (!key) return "Encryption key can't be empty."; + + return true; + }, + message: 'Enter marketplace app configurations encryption key', + }); +} + +export const askAppName = async(app: any, appSuffix: number):Promise =>{ + return await cliux.inquire({ + type: 'input', + name: 'name', + validate: validateAppName, + default: getAppName(app.name, appSuffix), + message: `${app.name} app already exist. Enter a new name to create an app.?`, + }); +} + +export const getAppName= (name: string, appSuffix = 1) => { + if (name.length >= 19) name = name.slice(0, 18); + name = `${first(split(name, '◈'))}◈${appSuffix}`; + return name; +} + +const validateAppName =(name: string ) =>{ + if (name.length < 3 || name.length > 20) { + return 'The app name should be within 3-20 characters long.'; + } + + return true; +} + +export const selectConfiguration = async():Promise =>{ + return await cliux.inquire({ + choices: [ + 'Update it with the new configuration.', + 'Do not update the configuration (WARNING!!! If you do not update the configuration, there may be some issues with the content which you import).', + 'Exit', + ], + type: 'list', + name: 'value', + message: 'Choose the option to proceed', + }); +} \ No newline at end of file diff --git a/packages/contentstack-export/src/lib/util/log.js b/packages/contentstack-import/src/utils/logger.ts old mode 100755 new mode 100644 similarity index 78% rename from packages/contentstack-export/src/lib/util/log.js rename to packages/contentstack-import/src/utils/logger.ts index d61ab39026..2b7ce63c3f --- a/packages/contentstack-export/src/lib/util/log.js +++ b/packages/contentstack-import/src/utils/logger.ts @@ -4,24 +4,26 @@ * MIT Licensed */ -var winston = require('winston'); -var path = require('path'); -var mkdirp = require('mkdirp'); -var slice = Array.prototype.slice; +import * as winston from 'winston'; +import * as path from 'path'; +import mkdirp from 'mkdirp'; +import { ImportConfig } from '../types'; + +const slice = Array.prototype.slice; const ansiRegexPattern = [ '[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)', '(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))', ].join('|'); -function returnString(args) { +function returnString(args: any[]) { var returnStr = ''; if (args && args.length) { returnStr = args .map(function (item) { if (item && typeof item === 'object') { try { - return JSON.stringify(item).replace(/authtoken\":\"blt................/g, 'authtoken":"blt....'); + return JSON.stringify(item).replace(/authtoken\":\d"blt................/g, 'authtoken":"blt....'); } catch (error) {} return item; } @@ -48,13 +50,13 @@ var myCustomLevels = { }, }; -let logger; -let errorLogger; +let logger: winston.Logger; +let errorLogger: winston.Logger; let successTransport; let errorTransport; -function init(_logPath) { +function init(_logPath: string) { if (!logger || !errorLogger) { var logsDir = path.resolve(_logPath, 'logs', 'export'); // Create dir if doesn't already exist @@ -65,7 +67,6 @@ function init(_logPath) { maxFiles: 20, maxsize: 1000000, tailable: true, - json: true, level: 'info', }; @@ -74,7 +75,6 @@ function init(_logPath) { maxFiles: 20, maxsize: 1000000, tailable: true, - json: true, level: 'error', }; @@ -91,7 +91,10 @@ function init(_logPath) { new winston.transports.File(errorTransport), new winston.transports.Console({ level: 'error', - format: winston.format.combine(winston.format.colorize({ all: true,colors:{ error: 'red'} }), winston.format.simple()), + format: winston.format.combine( + winston.format.colorize({ all: true, colors: { error: 'red' } }), + winston.format.simple(), + ), }), ], levels: { error: 0 }, @@ -99,7 +102,7 @@ function init(_logPath) { } return { - log: function () { + log: function (message: any) { let args = slice.call(arguments); let logString = returnString(args); if (logString) { @@ -113,7 +116,7 @@ function init(_logPath) { logger.log('warn', logString); } }, - error: function () { + error: function (message: any) { let args = slice.call(arguments); let logString = returnString(args); if (logString) { @@ -130,7 +133,8 @@ function init(_logPath) { }; } -exports.addlogs = async (config, message, type) => { +export const log = async (config: ImportConfig, message: any, type: string) => { + config.data = config.data || path.join(__dirname, 'logs'); // ignoring the type argument, as we are not using it to create a logfile anymore if (type !== 'error') { // removed type argument from init method @@ -140,10 +144,10 @@ exports.addlogs = async (config, message, type) => { } }; -exports.unlinkFileLogger = () => { +export const unlinkFileLogger = () => { if (logger) { const transports = logger.transports; - transports.forEach((transport) => { + transports.forEach((transport: any) => { if (transport.name === 'file') { logger.remove(transport); } @@ -152,7 +156,7 @@ exports.unlinkFileLogger = () => { if (errorLogger) { const transports = errorLogger.transports; - transports.forEach((transport) => { + transports.forEach((transport: any) => { if (transport.name === 'file') { errorLogger.remove(transport); } diff --git a/packages/contentstack-import/src/utils/login-handler.ts b/packages/contentstack-import/src/utils/login-handler.ts new file mode 100644 index 0000000000..e908417619 --- /dev/null +++ b/packages/contentstack-import/src/utils/login-handler.ts @@ -0,0 +1,51 @@ +/* eslint-disable max-statements-per-line */ +/* eslint-disable no-console */ +/* eslint-disable no-empty */ +/*! + * Contentstack Import + * Copyright (c) 2019 Contentstack LLC + * MIT Licensed + */ + +import { log } from './logger'; +import { managementSDKClient, isAuthenticated } from '@contentstack/cli-utilities'; +import { ImportConfig } from '../types'; + +const login = async (config: ImportConfig): Promise => { + const client = await managementSDKClient(config); + if (config.email && config.password) { + const { user: { authtoken = null } = {} } = await client.login({ email: config.email, password: config.password }); + if (authtoken) { + config.headers = { + api_key: config.source_stack, + access_token: config.access_token, + authtoken: config.authtoken, + 'X-User-Agent': 'contentstack-export/v', + }; + log(config, 'Contentstack account authenticated successfully!', 'success'); + return config; + } else { + throw new Error('Invalid auth token received after login'); + } + } else if (config.management_token) { + return config; + } else if (isAuthenticated()) { + const stackAPIClient = client.stack({ + api_key: config.target_stack, + management_token: config.management_token, + }); + const stack = await stackAPIClient.fetch().catch((error: any) => { + let errorstack_key = error?.errors?.api_key; + if (errorstack_key) { + log(config, 'Stack Api key ' + errorstack_key[0] + 'Please enter valid Key', 'error'); + throw error; + } + log(config, error?.errorMessage, 'error'); + throw error; + }); + config.destinationStackName = stack.name; + return config; + } +}; + +export default login; diff --git a/packages/contentstack-import/src/utils/marketplace-app-helper.ts b/packages/contentstack-import/src/utils/marketplace-app-helper.ts new file mode 100644 index 0000000000..5e14ddd69b --- /dev/null +++ b/packages/contentstack-import/src/utils/marketplace-app-helper.ts @@ -0,0 +1,193 @@ +import isEmpty from 'lodash/isEmpty'; +import map from 'lodash/map'; +import omit from 'lodash/omit'; +import includes from 'lodash/includes'; +import chalk from 'chalk'; +import { cliux, configHandler, HttpClient, ContentstackClient, managementSDKClient } from '@contentstack/cli-utilities'; + +import { ImportConfig } from '../types'; +import { log } from './logger'; +import { askDeveloperHubUrl } from './interactive'; +import { formatError } from '../utils'; +import { getAppName, askAppName, selectConfiguration } from '../utils/interactive'; + +export const getAllStackSpecificApps = async ( + developerHubBaseUrl: string, + httpClient: HttpClient, + config: ImportConfig, +) => { + return await httpClient + .get(`${developerHubBaseUrl}/installations?target_uids=${config.target_stack}`) + .then(({ data }) => data.data) + .catch((error) => log(config, `Failed to export marketplace-apps ${formatError(error)}`, 'error')); +}; + +export const getDeveloperHubUrl = async (config: ImportConfig): Promise => { + const { cma, name } = configHandler.get('region') || {}; + let developerHubBaseUrl = config.developerHubUrls[cma]; + + if (!developerHubBaseUrl) { + developerHubBaseUrl = await askDeveloperHubUrl(name); + } + + return developerHubBaseUrl.startsWith('http') ? developerHubBaseUrl : `https://${developerHubBaseUrl}`; +}; + +export const getOrgUid = async (config: ImportConfig): Promise => { + const tempAPIClient = await managementSDKClient({ host: config.host }); + const tempStackData = await tempAPIClient + .stack({ api_key: config.target_stack }) + .fetch() + .catch((error: any) => { + log(config, formatError(error), 'error'); + }); + + return tempStackData?.org_uid || ''; +}; + +export const getConfirmationToCreateApps = async (privateApps: any, config: ImportConfig): Promise => { + if (!config.forceStopMarketplaceAppsPrompt) { + if ( + !(await cliux.confirm( + chalk.yellow( + `WARNING!!! The listed apps are private apps that are not available in the destination stack: \n\n${map( + privateApps, + ({ manifest: { name } }, index) => `${String(index + 1)}) ${name}`, + ).join('\n')}\n\nWould you like to re-create the private app and then proceed with the installation? (y/n)`, + ), + )) + ) { + if ( + await cliux.confirm( + chalk.yellow( + `\nWARNING!!! Canceling the app re-creation may break the content type and entry import. Would you like to proceed without re-create the private app? (y/n)`, + ), + ) + ) { + return Promise.resolve(true); + } + + if ( + !(await cliux.confirm( + chalk.yellow('\nWould you like to re-create the private app and then proceed with the installation? (y/n)'), + )) + ) { + process.exit(); + } + } + } +}; + +export const createPrivateApp = async (client: ContentstackClient, config: ImportConfig, app: any): Promise => { + const privateApp = omit(app, ['uid']) as any; + return await client + .organization(config.org_uid) + .app() + .create(privateApp) + .catch((error: any) => error); +}; + +export const installApp = async ( + client: ContentstackClient, + config: ImportConfig, + appManifestUid?: string, + mappedUid?: string, +): Promise => { + const appUid = mappedUid || appManifestUid; + return await client + .organization(config.org_uid) + .app(appUid) + .install({ targetUid: config.target_stack, targetType: 'stack' }) + .catch((error: any) => error); +}; + +export const handleNameConflict = async (app: any, appSuffix: number, config: ImportConfig) => { + const appName = config.forceStopMarketplaceAppsPrompt + ? getAppName(app.name, appSuffix) + : await askAppName(app, appSuffix); + app.name = appName; + + return app; +}; + +export const makeRedirectUrlCall = async (response: any, appName: string, config: ImportConfig): Promise => { + if (response.redirect_url) { + log(config, `${appName} - OAuth api call started.!`, 'info'); + await new HttpClient({ maxRedirects: 20, maxBodyLength: Infinity }) + .get(response.redirect_url) + .then(async ({ response }: any) => { + if (includes([501, 403], response.status)) { + log(config, `${appName} - ${response.statusText}, OAuth api call failed.!`, 'error'); + log(config, formatError(response), 'error'); + await confirmToCloseProcess(response.data, config); + } else { + log(config, `${appName} - OAuth api call completed.!`, 'success'); + } + }) + .catch((error) => { + if (includes([501, 403], error.status)) { + log(config, formatError(error), 'error'); + } + }); + } +}; + +export const confirmToCloseProcess = async (installation: any, config: ImportConfig) => { + cliux.print(`\nWARNING!!! ${formatError(installation.message)}\n`, { color: 'yellow' }); + + if (!config.forceStopMarketplaceAppsPrompt) { + if ( + !(await cliux.confirm( + chalk.yellow( + 'WARNING!!! The above error may have an impact if the failed app is referenced in entries/content type. Would you like to proceed? (y/n)', + ), + )) + ) { + process.exit(); + } + } +}; + +export const ifAppAlreadyExist = async (app: any, currentStackApp: any, config: ImportConfig) => { + let updateParam = {}; + const { + manifest: { name }, + configuration, + server_configuration, + } = app; + + if (!isEmpty(configuration) || !isEmpty(server_configuration)) { + cliux.print( + `\nWARNING!!! The ${name} app already exists and it may have its own configuration. But the current app you install has its own configuration which is used internally to manage content.\n`, + { color: 'yellow' }, + ); + + const configOption = config.forceStopMarketplaceAppsPrompt + ? 'Update it with the new configuration.' + : await selectConfiguration(); + if (configOption === 'Exit') { + process.exit(); + } else if (configOption === 'Update it with the new configuration.') { + updateParam = { manifest: app.manifest, ...currentStackApp, configuration, server_configuration }; + } + } + + return updateParam; +}; + +export const updateAppConfig = async ( + client: ContentstackClient, + config: ImportConfig, + app: any, + payload: { configuration: Record; server_configuration: Record }, +): Promise => { + let installation = client.organization(config.org_uid).app(app?.manifest?.uid).installation(app?.uid); + + installation = Object.assign(installation, payload); + return await installation + .update() + .then((data: any) => { + log(config, `${app?.manifest?.name} app config updated successfully.!`, 'success'); + }) + .catch((error: any) => log(config, `Failed to update app config.${formatError(error)}`, 'error')); +}; diff --git a/packages/contentstack-import/test/commands/import.test.js b/packages/contentstack-import/test/commands/import.test.js deleted file mode 100644 index 47397c0fda..0000000000 --- a/packages/contentstack-import/test/commands/import.test.js +++ /dev/null @@ -1,31 +0,0 @@ -const { test } = require('@oclif/test'); -const { cliux, managementSDKClient } = require('@contentstack/cli-utilities'); -const _ = require('lodash'); - -test - .stub(managementSDKClient(), 'Client', (e) => { - return { - stack: function () { - return { - locale: function () { - return { - create: function () { - return new Promise.resolve('ncjkdncjdncjd'); - }, - }; - }, - }; - }, - users: function () { - return new Promise.resolve(); - }, - }; - }) - .stub(cliux, 'prompt', (_name) => async (name) => { - if (name === 'Please provide master locale ?') return 'en-us'; - if (name === 'Please provide target Stack') return 'newstackUid'; - if (name === 'Please provide path were you have stored the data') - return '/home/rohit/Import-Export-script/contentstack-export/SYNcontents/'; - }) - .command(['cm:import', '--auth-token', '-m', 'locales']) - .it('runs method of Locales', (ctx) => {}); diff --git a/packages/contentstack-import/test/integration/assets.test.js b/packages/contentstack-import/test/integration/assets.test.js index 01b0864001..e01b4b693a 100644 --- a/packages/contentstack-import/test/integration/assets.test.js +++ b/packages/contentstack-import/test/integration/assets.test.js @@ -9,8 +9,8 @@ const AddTokenCommand = require('@contentstack/cli-auth/lib/commands/auth/tokens const RegionSetCommand = require('@contentstack/cli-config/lib/commands/config/set/region').default; const ExportCommand = require('@contentstack/cli-cm-export/src/commands/cm/stacks/export'); -const defaultConfig = require('../../src/config/default'); -const { modules } = require('../../src/config/default'); +const { default: defaultConfig } = require('../../src/config'); +const modules = defaultConfig.modules; const { getStackDetailsByRegion, getAssetAndFolderCount, cleanUp, deleteStack, getEnvData } = require('./utils/helper'); const { PRINT_LOGS, IMPORT_PATH } = require('./config.json'); const { DELIMITER, KEY_VAL_DELIMITER } = process.env; @@ -23,7 +23,7 @@ const REGION_MAP = { EU: 'EU', }; -module.exports = region => { +module.exports = (region) => { const stackDetails = getStackDetailsByRegion(region.REGION, DELIMITER, KEY_VAL_DELIMITER); for (const stack of Object.keys(stackDetails)) { const basePath = path.join(__dirname, '..', '..', `${IMPORT_PATH}_${stack}`); @@ -44,22 +44,47 @@ module.exports = region => { .it('should work without any errors', (_, done) => { done(); }); - + customTest - .command(AddTokenCommand, ['-a', stackDetails[stack].EXPORT_ALIAS_NAME, '-k', stackDetails[stack].EXPORT_STACK_API_KEY, '--management', '--token', stackDetails[stack].EXPORT_MANAGEMENT_TOKEN, '-y']) + .command(AddTokenCommand, [ + '-a', + stackDetails[stack].EXPORT_ALIAS_NAME, + '-k', + stackDetails[stack].EXPORT_STACK_API_KEY, + '--management', + '--token', + stackDetails[stack].EXPORT_MANAGEMENT_TOKEN, + '-y', + ]) .it(`Adding token for ${stack}`, (_, done) => { done(); }); customTest - .command(AddTokenCommand, ['-a', stackDetails[stack].ALIAS_NAME, '-k', stackDetails[stack].STACK_API_KEY, '--management', '--token', stackDetails[stack].MANAGEMENT_TOKEN, '-y']) + .command(AddTokenCommand, [ + '-a', + stackDetails[stack].ALIAS_NAME, + '-k', + stackDetails[stack].STACK_API_KEY, + '--management', + '--token', + stackDetails[stack].MANAGEMENT_TOKEN, + '-y', + ]) .it(`Adding token for ${stack}`, (_, done) => { done(); }); - + customTest .stdout({ print: PRINT_LOGS || false }) - .command(ExportCommand, ['--alias', stackDetails[stack].EXPORT_ALIAS_NAME, '--data-dir', basePath, '--module', 'assets']) + .command(ExportCommand, [ + '--alias', + stackDetails[stack].EXPORT_ALIAS_NAME, + '--data-dir', + basePath, + '--module', + 'assets', + ]) .it('should work without any errors', (_, done) => { done(); }); @@ -67,14 +92,25 @@ module.exports = region => { describe('Import assets using cm:stacks:import command', () => { test .stdout({ print: PRINT_LOGS || false }) - .command(['cm:stacks:import', '--alias', stackDetails[stack].ALIAS_NAME, '--data-dir', importBasePath, '--module', 'assets']) + .command([ + 'cm:stacks:import', + '--alias', + stackDetails[stack].ALIAS_NAME, + '--data-dir', + importBasePath, + '--module', + 'assets', + ]) .it('should work without any errors', async (_, done) => { let importedAssetsCount = 0; let importedAssetsFolderCount = 0; const { assetCount, folderCount } = await getAssetAndFolderCount(stackDetails[stack]); try { if (fs.existsSync(assetsFolderPath)) { - importedAssetsFolderCount = uniqBy(JSON.parse(fs.readFileSync(assetsFolderPath, 'utf-8')), 'uid').length; + importedAssetsFolderCount = uniqBy( + JSON.parse(fs.readFileSync(assetsFolderPath, 'utf-8')), + 'uid', + ).length; } if (fs.existsSync(assetsJson)) { importedAssetsCount = Object.keys(JSON.parse(fs.readFileSync(assetsJson, 'utf-8'))).length; diff --git a/packages/contentstack-import/test/integration/auth-token-modules/assets.test.js b/packages/contentstack-import/test/integration/auth-token-modules/assets.test.js index 0afc1f91b8..69427a30a7 100644 --- a/packages/contentstack-import/test/integration/auth-token-modules/assets.test.js +++ b/packages/contentstack-import/test/integration/auth-token-modules/assets.test.js @@ -8,8 +8,8 @@ const LoginCommand = require('@contentstack/cli-auth/lib/commands/auth/login').d const RegionSetCommand = require('@contentstack/cli-config/lib/commands/config/set/region').default; const ExportCommand = require('@contentstack/cli-cm-export/src/commands/cm/stacks/export'); -const defaultConfig = require('../../../src/config/default'); -const { modules } = require('../../../src/config/default'); +const { default: defaultConfig } = require('../../../src/config'); +const modules = defaultConfig.modules; const { getStackDetailsByRegion, getAssetAndFolderCount, cleanUp, getEnvData } = require('../utils/helper'); const { PRINT_LOGS, IMPORT_PATH } = require('../config.json'); const { DELIMITER, KEY_VAL_DELIMITER } = process.env; @@ -22,7 +22,7 @@ const REGION_MAP = { EU: 'EU', }; -module.exports = region => { +module.exports = (region) => { const stackDetails = getStackDetailsByRegion(region.REGION, DELIMITER, KEY_VAL_DELIMITER); for (const stack of Object.keys(stackDetails)) { const basePath = path.join(__dirname, '..', '..', `${IMPORT_PATH}_${stack}`); @@ -46,7 +46,14 @@ module.exports = region => { customTest .stdout({ print: PRINT_LOGS || false }) - .command(ExportCommand, ['--stack-api-key', stackDetails[stack].EXPORT_STACK_API_KEY, '--data-dir', basePath, '--module', 'assets']) + .command(ExportCommand, [ + '--stack-api-key', + stackDetails[stack].EXPORT_STACK_API_KEY, + '--data-dir', + basePath, + '--module', + 'assets', + ]) .it('should work without any errors', (_, done) => { done(); }); @@ -54,14 +61,25 @@ module.exports = region => { describe('Import assets using cm:stacks:import command', () => { test .stdout({ print: PRINT_LOGS || false }) - .command(['cm:stacks:import', '--stack-api-key', stackDetails[stack].STACK_API_KEY, '--data-dir', importBasePath, '--module', 'assets']) + .command([ + 'cm:stacks:import', + '--stack-api-key', + stackDetails[stack].STACK_API_KEY, + '--data-dir', + importBasePath, + '--module', + 'assets', + ]) .it('should work without any errors', async (_, done) => { let importedAssetsCount = 0; let importedAssetsFolderCount = 0; const { assetCount, folderCount } = await getAssetAndFolderCount(stackDetails[stack]); try { if (fs.existsSync(assetsFolderPath)) { - importedAssetsFolderCount = uniqBy(JSON.parse(fs.readFileSync(assetsFolderPath, 'utf-8')), 'uid').length; + importedAssetsFolderCount = uniqBy( + JSON.parse(fs.readFileSync(assetsFolderPath, 'utf-8')), + 'uid', + ).length; } if (fs.existsSync(assetsJson)) { importedAssetsCount = Object.keys(JSON.parse(fs.readFileSync(assetsJson, 'utf-8'))).length; diff --git a/packages/contentstack-import/test/integration/auth-token-modules/content-types.test.js b/packages/contentstack-import/test/integration/auth-token-modules/content-types.test.js index 70887fca3d..7d7e35311d 100644 --- a/packages/contentstack-import/test/integration/auth-token-modules/content-types.test.js +++ b/packages/contentstack-import/test/integration/auth-token-modules/content-types.test.js @@ -8,8 +8,8 @@ const LoginCommand = require('@contentstack/cli-auth/lib/commands/auth/login').d const RegionSetCommand = require('@contentstack/cli-config/lib/commands/config/set/region').default; const ExportCommand = require('@contentstack/cli-cm-export/src/commands/cm/stacks/export'); -const defaultConfig = require('../../../src/config/default'); -const { modules } = require('../../../src/config/default'); +const { default: defaultConfig } = require('../../../src/config'); +const modules = defaultConfig.modules; const { getStackDetailsByRegion, cleanUp, getEnvData, getContentTypesCount } = require('../utils/helper'); const { PRINT_LOGS, IMPORT_PATH } = require('../config.json'); const { DELIMITER, KEY_VAL_DELIMITER } = process.env; @@ -22,7 +22,7 @@ const REGION_MAP = { EU: 'EU', }; -module.exports = region => { +module.exports = (region) => { const stackDetails = getStackDetailsByRegion(region.REGION, DELIMITER, KEY_VAL_DELIMITER); for (const stack of Object.keys(stackDetails)) { const basePath = path.join(__dirname, '..', '..', `${IMPORT_PATH}_${stack}`); @@ -41,10 +41,17 @@ module.exports = region => { .it('should work without any errors', (_, done) => { done(); }); - + customTest .stdout({ print: PRINT_LOGS || false }) - .command(ExportCommand, ['--stack-api-key', stackDetails[stack].EXPORT_STACK_API_KEY, '--data-dir', basePath, '--module', 'content-types']) + .command(ExportCommand, [ + '--stack-api-key', + stackDetails[stack].EXPORT_STACK_API_KEY, + '--data-dir', + basePath, + '--module', + 'content-types', + ]) .it('should work without any errors', (_, done) => { done(); }); @@ -52,20 +59,28 @@ module.exports = region => { describe('Import assets using cm:stacks:import command', () => { test .stdout({ print: PRINT_LOGS || false }) - .command(['cm:stacks:import', '--stack-api-key', stackDetails[stack].STACK_API_KEY, '--data-dir', importBasePath, '--module', 'content-types']) + .command([ + 'cm:stacks:import', + '--stack-api-key', + stackDetails[stack].STACK_API_KEY, + '--data-dir', + importBasePath, + '--module', + 'content-types', + ]) .it('should work without any errors', async (_, done) => { let importedContentTypesCount = 0; const contentTypesCount = await getContentTypesCount(stackDetails[stack]); try { if (fs.existsSync(contentTypesBasePath)) { - let contentTypes = await fsPromises.readdir(contentTypesBasePath) - importedContentTypesCount = contentTypes.filter(ct => !ct.includes('schema.json')).length + let contentTypes = await fsPromises.readdir(contentTypesBasePath); + importedContentTypesCount = contentTypes.filter((ct) => !ct.includes('schema.json')).length; } } catch (error) { - console.trace(error) + console.trace(error); } - expect(contentTypesCount).to.be.an('number').eq(importedContentTypesCount) + expect(contentTypesCount).to.be.an('number').eq(importedContentTypesCount); done(); }); }); diff --git a/packages/contentstack-import/test/integration/auth-token-modules/custom-roles.test.js b/packages/contentstack-import/test/integration/auth-token-modules/custom-roles.test.js index 6f97e409ef..d925d22723 100644 --- a/packages/contentstack-import/test/integration/auth-token-modules/custom-roles.test.js +++ b/packages/contentstack-import/test/integration/auth-token-modules/custom-roles.test.js @@ -7,8 +7,8 @@ const LoginCommand = require('@contentstack/cli-auth/lib/commands/auth/login').d const RegionSetCommand = require('@contentstack/cli-config/lib/commands/config/set/region').default; const ExportCommand = require('@contentstack/cli-cm-export/src/commands/cm/stacks/export'); -const defaultConfig = require('../../../src/config/default'); -const { modules } = require('../../../src/config/default'); +const { default: defaultConfig } = require('../../../src/config'); +const modules = defaultConfig.modules; const { getStackDetailsByRegion, cleanUp, getEnvData, getCustomRolesCount } = require('../utils/helper'); const { PRINT_LOGS, IMPORT_PATH } = require('../config.json'); const { DELIMITER, KEY_VAL_DELIMITER } = process.env; @@ -21,7 +21,7 @@ const REGION_MAP = { EU: 'EU', }; -module.exports = region => { +module.exports = (region) => { const stackDetails = getStackDetailsByRegion(region.REGION, DELIMITER, KEY_VAL_DELIMITER); for (const stack of Object.keys(stackDetails)) { const basePath = path.join(__dirname, '..', '..', `${IMPORT_PATH}_${stack}`); @@ -41,10 +41,17 @@ module.exports = region => { .it('should work without any errors', (_, done) => { done(); }); - + customTest .stdout({ print: PRINT_LOGS || false }) - .command(ExportCommand, ['--stack-api-key', stackDetails[stack].EXPORT_STACK_API_KEY, '--data-dir', basePath, '--module', 'custom-roles']) + .command(ExportCommand, [ + '--stack-api-key', + stackDetails[stack].EXPORT_STACK_API_KEY, + '--data-dir', + basePath, + '--module', + 'custom-roles', + ]) .it('should work without any errors', (_, done) => { done(); }); @@ -52,7 +59,15 @@ module.exports = region => { describe('Import assets using cm:stacks:import command', () => { test .stdout({ print: PRINT_LOGS || false }) - .command(['cm:stacks:import', '--stack-api-key', stackDetails[stack].STACK_API_KEY, '--data-dir', importBasePath, '--module', 'custom-roles']) + .command([ + 'cm:stacks:import', + '--stack-api-key', + stackDetails[stack].STACK_API_KEY, + '--data-dir', + importBasePath, + '--module', + 'custom-roles', + ]) .it('should work without any errors', async (_, done) => { let importedCustomRolesCount = 0; const customRolesCount = await getCustomRolesCount(stackDetails[stack]); diff --git a/packages/contentstack-import/test/integration/auth-token-modules/entries.test.js b/packages/contentstack-import/test/integration/auth-token-modules/entries.test.js index 83933fabd5..5e7257cedf 100644 --- a/packages/contentstack-import/test/integration/auth-token-modules/entries.test.js +++ b/packages/contentstack-import/test/integration/auth-token-modules/entries.test.js @@ -8,8 +8,8 @@ const LoginCommand = require('@contentstack/cli-auth/lib/commands/auth/login').d const RegionSetCommand = require('@contentstack/cli-config/lib/commands/config/set/region').default; const ExportCommand = require('@contentstack/cli-cm-export/src/commands/cm/stacks/export'); -const defaultConfig = require('../../../src/config/default'); -const { modules } = require('../../../src/config/default'); +const { default: defaultConfig } = require('../../../src/config'); +const modules = defaultConfig.modules; const { getStackDetailsByRegion, cleanUp, getEnvData, getEntriesCount } = require('../utils/helper'); const { PRINT_LOGS, IMPORT_PATH } = require('../config.json'); const { DELIMITER, KEY_VAL_DELIMITER } = process.env; @@ -22,7 +22,7 @@ const REGION_MAP = { EU: 'EU', }; -module.exports = region => { +module.exports = (region) => { const stackDetails = getStackDetailsByRegion(region.REGION, DELIMITER, KEY_VAL_DELIMITER); for (const stack of Object.keys(stackDetails)) { const basePath = path.join(__dirname, '..', '..', `${IMPORT_PATH}_${stack}`); @@ -44,7 +44,14 @@ module.exports = region => { customTest .stdout({ print: PRINT_LOGS || false }) - .command(ExportCommand, ['--stack-api-key', stackDetails[stack].EXPORT_STACK_API_KEY, '--data-dir', basePath, '--module', 'entries']) + .command(ExportCommand, [ + '--stack-api-key', + stackDetails[stack].EXPORT_STACK_API_KEY, + '--data-dir', + basePath, + '--module', + 'entries', + ]) .it('should work without any errors', (_, done) => { done(); }); @@ -52,14 +59,22 @@ module.exports = region => { describe('Import assets using cm:stacks:import command', () => { test .stdout({ print: PRINT_LOGS || false }) - .command(['cm:stacks:import', '--stack-api-key', stackDetails[stack].STACK_API_KEY, '--data-dir', importBasePath, '--module', 'entries']) + .command([ + 'cm:stacks:import', + '--stack-api-key', + stackDetails[stack].STACK_API_KEY, + '--data-dir', + importBasePath, + '--module', + 'entries', + ]) .it('should work without any errors', async (_, done) => { - let importedEntriesCount = 0 + let importedEntriesCount = 0; const entriesCount = await getEntriesCount(stackDetails[stack]); try { if (fs.existsSync(entriesBasePath)) { - let contentTypes = await fsPromises.readdir(entriesBasePath) + let contentTypes = await fsPromises.readdir(entriesBasePath); for (let contentType of contentTypes) { let ctPath = path.join(entriesBasePath, contentType); let locales = await fsPromises.readdir(ctPath); @@ -70,7 +85,7 @@ module.exports = region => { } } } catch (error) { - console.trace(error) + console.trace(error); } expect(entriesCount).to.be.an('number').eq(importedEntriesCount); diff --git a/packages/contentstack-import/test/integration/auth-token-modules/environments.test.js b/packages/contentstack-import/test/integration/auth-token-modules/environments.test.js index 846f0a81fa..3554bef627 100644 --- a/packages/contentstack-import/test/integration/auth-token-modules/environments.test.js +++ b/packages/contentstack-import/test/integration/auth-token-modules/environments.test.js @@ -7,8 +7,8 @@ const LoginCommand = require('@contentstack/cli-auth/lib/commands/auth/login').d const RegionSetCommand = require('@contentstack/cli-config/lib/commands/config/set/region').default; const ExportCommand = require('@contentstack/cli-cm-export/src/commands/cm/stacks/export'); -const defaultConfig = require('../../../src/config/default'); -const { modules } = require('../../../src/config/default'); +const { default: defaultConfig } = require('../../../src/config'); +const modules = defaultConfig.modules; const { getStackDetailsByRegion, cleanUp, getEnvData, getEnvironmentsCount } = require('../utils/helper'); const { PRINT_LOGS, IMPORT_PATH } = require('../config.json'); const { DELIMITER, KEY_VAL_DELIMITER } = process.env; @@ -21,7 +21,7 @@ const REGION_MAP = { EU: 'EU', }; -module.exports = region => { +module.exports = (region) => { const stackDetails = getStackDetailsByRegion(region.REGION, DELIMITER, KEY_VAL_DELIMITER); for (const stack of Object.keys(stackDetails)) { const basePath = path.join(__dirname, '..', '..', `${IMPORT_PATH}_${stack}`); @@ -44,7 +44,14 @@ module.exports = region => { customTest .stdout({ print: PRINT_LOGS || false }) - .command(ExportCommand, ['--stack-api-key', stackDetails[stack].EXPORT_STACK_API_KEY, '--data-dir', basePath, '--module', 'environments']) + .command(ExportCommand, [ + '--stack-api-key', + stackDetails[stack].EXPORT_STACK_API_KEY, + '--data-dir', + basePath, + '--module', + 'environments', + ]) .it('should work without any errors', (_, done) => { done(); }); @@ -52,9 +59,17 @@ module.exports = region => { describe('Import assets using cm:stacks:import command', () => { test .stdout({ print: PRINT_LOGS || false }) - .command(['cm:stacks:import', '--stack-api-key', stackDetails[stack].STACK_API_KEY, '--data-dir', importBasePath, '--module', 'environments']) + .command([ + 'cm:stacks:import', + '--stack-api-key', + stackDetails[stack].STACK_API_KEY, + '--data-dir', + importBasePath, + '--module', + 'environments', + ]) .it('should work without any errors', async (_, done) => { - let importedEnvironmentsCount = 0 + let importedEnvironmentsCount = 0; const environmentsCount = await getEnvironmentsCount(stackDetails[stack]); try { diff --git a/packages/contentstack-import/test/integration/auth-token-modules/extensions.test.js b/packages/contentstack-import/test/integration/auth-token-modules/extensions.test.js index 7e29119b49..194af63826 100644 --- a/packages/contentstack-import/test/integration/auth-token-modules/extensions.test.js +++ b/packages/contentstack-import/test/integration/auth-token-modules/extensions.test.js @@ -7,8 +7,8 @@ const LoginCommand = require('@contentstack/cli-auth/lib/commands/auth/login').d const RegionSetCommand = require('@contentstack/cli-config/lib/commands/config/set/region').default; const ExportCommand = require('@contentstack/cli-cm-export/src/commands/cm/stacks/export'); -const defaultConfig = require('../../../src/config/default'); -const { modules } = require('../../../src/config/default'); +const { default: defaultConfig } = require('../../../src/config'); +const modules = defaultConfig.modules; const { getStackDetailsByRegion, cleanUp, getEnvData, getExtensionsCount } = require('../utils/helper'); const { PRINT_LOGS, IMPORT_PATH } = require('../config.json'); const { DELIMITER, KEY_VAL_DELIMITER } = process.env; @@ -21,7 +21,7 @@ const REGION_MAP = { EU: 'EU', }; -module.exports = region => { +module.exports = (region) => { const stackDetails = getStackDetailsByRegion(region.REGION, DELIMITER, KEY_VAL_DELIMITER); for (const stack of Object.keys(stackDetails)) { const basePath = path.join(__dirname, '..', '..', `${IMPORT_PATH}_${stack}`); @@ -44,7 +44,14 @@ module.exports = region => { customTest .stdout({ print: PRINT_LOGS || false }) - .command(ExportCommand, ['--stack-api-key', stackDetails[stack].EXPORT_STACK_API_KEY, '--data-dir', basePath, '--module', 'extensions']) + .command(ExportCommand, [ + '--stack-api-key', + stackDetails[stack].EXPORT_STACK_API_KEY, + '--data-dir', + basePath, + '--module', + 'extensions', + ]) .it('should work without any errors', (_, done) => { done(); }); @@ -52,9 +59,17 @@ module.exports = region => { describe('Import assets using cm:stacks:import command', () => { test .stdout({ print: PRINT_LOGS || false }) - .command(['cm:stacks:import', '--stack-api-key', stackDetails[stack].STACK_API_KEY, '--data-dir', importBasePath, '--module', 'extensions']) + .command([ + 'cm:stacks:import', + '--stack-api-key', + stackDetails[stack].STACK_API_KEY, + '--data-dir', + importBasePath, + '--module', + 'extensions', + ]) .it('should work without any errors', async (_, done) => { - let importedExtensionsCount = 0 + let importedExtensionsCount = 0; const extensionsCount = await getExtensionsCount(stackDetails[stack]); try { diff --git a/packages/contentstack-import/test/integration/auth-token-modules/global-fields.test.js b/packages/contentstack-import/test/integration/auth-token-modules/global-fields.test.js index 8478387ede..f84ead613b 100644 --- a/packages/contentstack-import/test/integration/auth-token-modules/global-fields.test.js +++ b/packages/contentstack-import/test/integration/auth-token-modules/global-fields.test.js @@ -7,8 +7,8 @@ const LoginCommand = require('@contentstack/cli-auth/lib/commands/auth/login').d const RegionSetCommand = require('@contentstack/cli-config/lib/commands/config/set/region').default; const ExportCommand = require('@contentstack/cli-cm-export/src/commands/cm/stacks/export'); -const defaultConfig = require('../../../src/config/default'); -const { modules } = require('../../../src/config/default'); +const { default: defaultConfig } = require('../../../src/config'); +const modules = defaultConfig.modules; const { getStackDetailsByRegion, cleanUp, getEnvData, getGlobalFieldsCount } = require('../utils/helper'); const { PRINT_LOGS, IMPORT_PATH } = require('../config.json'); const { DELIMITER, KEY_VAL_DELIMITER } = process.env; @@ -21,7 +21,7 @@ const REGION_MAP = { EU: 'EU', }; -module.exports = region => { +module.exports = (region) => { const stackDetails = getStackDetailsByRegion(region.REGION, DELIMITER, KEY_VAL_DELIMITER); for (const stack of Object.keys(stackDetails)) { const basePath = path.join(__dirname, '..', '..', `${IMPORT_PATH}_${stack}`); @@ -44,7 +44,15 @@ module.exports = region => { customTest .stdout({ print: PRINT_LOGS || false }) - .command(ExportCommand, ['--alias', '--stack-api-key', stackDetails[stack].EXPORT_STACK_API_KEY, '--data-dir', basePath, '--module', 'global-fields']) + .command(ExportCommand, [ + '--alias', + '--stack-api-key', + stackDetails[stack].EXPORT_STACK_API_KEY, + '--data-dir', + basePath, + '--module', + 'global-fields', + ]) .it('should work without any errors', (_, done) => { done(); }); @@ -52,7 +60,15 @@ module.exports = region => { describe('Import assets using cm:stacks:import command', () => { test .stdout({ print: PRINT_LOGS || false }) - .command(['cm:stacks:import', '--stack-api-key', stackDetails[stack].STACK_API_KEY, '--data-dir', importBasePath, '--module', 'global-fields']) + .command([ + 'cm:stacks:import', + '--stack-api-key', + stackDetails[stack].STACK_API_KEY, + '--data-dir', + importBasePath, + '--module', + 'global-fields', + ]) .it('should work without any errors', async (_, done) => { let importedGlobalFieldsCount = 0; const globalFieldsCount = await getGlobalFieldsCount(stackDetails[stack]); diff --git a/packages/contentstack-import/test/integration/auth-token-modules/locales.test.js b/packages/contentstack-import/test/integration/auth-token-modules/locales.test.js index 9751c60ebb..5cb993e725 100644 --- a/packages/contentstack-import/test/integration/auth-token-modules/locales.test.js +++ b/packages/contentstack-import/test/integration/auth-token-modules/locales.test.js @@ -7,8 +7,8 @@ const LoginCommand = require('@contentstack/cli-auth/lib/commands/auth/login').d const RegionSetCommand = require('@contentstack/cli-config/lib/commands/config/set/region').default; const ExportCommand = require('@contentstack/cli-cm-export/src/commands/cm/stacks/export'); -const defaultConfig = require('../../../src/config/default'); -const { modules } = require('../../../src/config/default'); +const { default: defaultConfig } = require('../../../src/config'); +const modules = defaultConfig.modules; const { getStackDetailsByRegion, cleanUp, getEnvData, getLocalesCount } = require('../utils/helper'); const { PRINT_LOGS, IMPORT_PATH } = require('../config.json'); const { DELIMITER, KEY_VAL_DELIMITER } = process.env; @@ -21,7 +21,7 @@ const REGION_MAP = { EU: 'EU', }; -module.exports = region => { +module.exports = (region) => { const stackDetails = getStackDetailsByRegion(region.REGION, DELIMITER, KEY_VAL_DELIMITER); for (const stack of Object.keys(stackDetails)) { const basePath = path.join(__dirname, '..', '..', `${IMPORT_PATH}_${stack}`); @@ -44,7 +44,14 @@ module.exports = region => { customTest .stdout({ print: PRINT_LOGS || false }) - .command(ExportCommand, ['--stack-api-key', stackDetails[stack].EXPORT_STACK_API_KEY, '--data-dir', basePath, '--module', 'locales']) + .command(ExportCommand, [ + '--stack-api-key', + stackDetails[stack].EXPORT_STACK_API_KEY, + '--data-dir', + basePath, + '--module', + 'locales', + ]) .it('should work without any errors', (_, done) => { done(); }); @@ -52,7 +59,15 @@ module.exports = region => { describe('Import assets using cm:stacks:import command', () => { test .stdout({ print: PRINT_LOGS || false }) - .command(['cm:stacks:import', '--stack-api-key', stackDetails[stack].STACK_API_KEY, '--data-dir', importBasePath, '--module', 'locales']) + .command([ + 'cm:stacks:import', + '--stack-api-key', + stackDetails[stack].STACK_API_KEY, + '--data-dir', + importBasePath, + '--module', + 'locales', + ]) .it('should work without any errors', async (_, done) => { let importedLocaleCount = 0; const localeCount = await getLocalesCount(stackDetails[stack]); diff --git a/packages/contentstack-import/test/integration/auth-token-modules/webhooks.test.js b/packages/contentstack-import/test/integration/auth-token-modules/webhooks.test.js index 75ba391ed9..aa0e294bd8 100644 --- a/packages/contentstack-import/test/integration/auth-token-modules/webhooks.test.js +++ b/packages/contentstack-import/test/integration/auth-token-modules/webhooks.test.js @@ -7,8 +7,8 @@ const LoginCommand = require('@contentstack/cli-auth/lib/commands/auth/login').d const RegionSetCommand = require('@contentstack/cli-config/lib/commands/config/set/region').default; const ExportCommand = require('@contentstack/cli-cm-export/src/commands/cm/stacks/export'); -const defaultConfig = require('../../../src/config/default'); -const { modules } = require('../../../src/config/default'); +const { default: defaultConfig } = require('../../../src/config'); +const modules = defaultConfig.modules; const { getStackDetailsByRegion, cleanUp, getEnvData, getWebhooksCount } = require('../utils/helper'); const { PRINT_LOGS, IMPORT_PATH } = require('../config.json'); const { DELIMITER, KEY_VAL_DELIMITER } = process.env; @@ -21,7 +21,7 @@ const REGION_MAP = { EU: 'EU', }; -module.exports = region => { +module.exports = (region) => { const stackDetails = getStackDetailsByRegion(region.REGION, DELIMITER, KEY_VAL_DELIMITER); for (const stack of Object.keys(stackDetails)) { const basePath = path.join(__dirname, '..', '..', `${IMPORT_PATH}_${stack}`); @@ -44,7 +44,14 @@ module.exports = region => { customTest .stdout({ print: PRINT_LOGS || false }) - .command(ExportCommand, ['--stack-api-key', stackDetails[stack].STACK_API_KEY, '--data-dir', basePath, '--module', 'webhooks']) + .command(ExportCommand, [ + '--stack-api-key', + stackDetails[stack].STACK_API_KEY, + '--data-dir', + basePath, + '--module', + 'webhooks', + ]) .it('should work without any errors', (_, done) => { done(); }); @@ -52,7 +59,15 @@ module.exports = region => { describe('Import assets using cm:stacks:import command', () => { test .stdout({ print: PRINT_LOGS || false }) - .command(['cm:stacks:import', '--stack-api-key', stackDetails[stack].STACK_API_KEY, '--data-dir', importBasePath, '--module', 'webhooks']) + .command([ + 'cm:stacks:import', + '--stack-api-key', + stackDetails[stack].STACK_API_KEY, + '--data-dir', + importBasePath, + '--module', + 'webhooks', + ]) .it('should work without any errors', async (_, done) => { let importedWebhooksCount = 0; const webhooksCount = await getWebhooksCount(stackDetails[stack]); diff --git a/packages/contentstack-import/test/integration/auth-token-modules/workflows.test.js b/packages/contentstack-import/test/integration/auth-token-modules/workflows.test.js index 6c4303fa7f..97f2a41d4d 100644 --- a/packages/contentstack-import/test/integration/auth-token-modules/workflows.test.js +++ b/packages/contentstack-import/test/integration/auth-token-modules/workflows.test.js @@ -7,8 +7,8 @@ const LoginCommand = require('@contentstack/cli-auth/lib/commands/auth/login').d const RegionSetCommand = require('@contentstack/cli-config/lib/commands/config/set/region').default; const ExportCommand = require('@contentstack/cli-cm-export/src/commands/cm/stacks/export'); -const defaultConfig = require('../../../src/config/default'); -const { modules } = require('../../../src/config/default'); +const { default: defaultConfig } = require('../../../src/config'); +const modules = defaultConfig.modules; const { getStackDetailsByRegion, cleanUp, getEnvData, getWorkflowsCount } = require('../utils/helper'); const { PRINT_LOGS, IMPORT_PATH } = require('../config.json'); const { DELIMITER, KEY_VAL_DELIMITER } = process.env; @@ -21,7 +21,7 @@ const REGION_MAP = { EU: 'EU', }; -module.exports = region => { +module.exports = (region) => { const stackDetails = getStackDetailsByRegion(region.REGION, DELIMITER, KEY_VAL_DELIMITER); for (const stack of Object.keys(stackDetails)) { const basePath = path.join(__dirname, '..', '..', `${IMPORT_PATH}_${stack}`); @@ -44,7 +44,14 @@ module.exports = region => { customTest .stdout({ print: PRINT_LOGS || false }) - .command(ExportCommand, ['--stack-api-key', stackDetails[stack].EXPORT_STACK_API_KEY, '--data-dir', basePath, '--module', 'workflows']) + .command(ExportCommand, [ + '--stack-api-key', + stackDetails[stack].EXPORT_STACK_API_KEY, + '--data-dir', + basePath, + '--module', + 'workflows', + ]) .it('should work without any errors', (_, done) => { done(); }); @@ -52,7 +59,15 @@ module.exports = region => { describe('Import assets using cm:stacks:import command', () => { test .stdout({ print: PRINT_LOGS || false }) - .command(['cm:stacks:import', '--stack-api-key', stackDetails[stack].STACK_API_KEY, '--data-dir', importBasePath, '--module', 'workflows']) + .command([ + 'cm:stacks:import', + '--stack-api-key', + stackDetails[stack].STACK_API_KEY, + '--data-dir', + importBasePath, + '--module', + 'workflows', + ]) .it('should work without any errors', async (_, done) => { let importedWorkflowsCount = 0; const workflowsCount = await getWorkflowsCount(stackDetails[stack]); diff --git a/packages/contentstack-import/test/integration/auth-token.test.js b/packages/contentstack-import/test/integration/auth-token.test.js index 75b4a070fc..c7070520e7 100644 --- a/packages/contentstack-import/test/integration/auth-token.test.js +++ b/packages/contentstack-import/test/integration/auth-token.test.js @@ -8,10 +8,16 @@ const LoginCommand = require('@contentstack/cli-auth/lib/commands/auth/login').d const RegionSetCommand = require('@contentstack/cli-config/lib/commands/config/set/region').default; const ExportCommand = require('@contentstack/cli-cm-export/src/commands/cm/stacks/export'); -const { getStackDetailsByRegion, getContentTypesCount, cleanUp, getEnvData, getEntriesCount } = require('./utils/helper'); +const { + getStackDetailsByRegion, + getContentTypesCount, + cleanUp, + getEnvData, + getEntriesCount, +} = require('./utils/helper'); const { PRINT_LOGS, IMPORT_PATH } = require('./config.json'); -const defaultConfig = require('../../src/config/default'); -const { modules } = require('../../src/config/default'); +const { default: defaultConfig } = require('../../src/config'); +const modules = defaultConfig.modules; const { DELIMITER, KEY_VAL_DELIMITER } = process.env; const { ENCRYPTION_KEY } = getEnvData(); @@ -28,8 +34,16 @@ module.exports = (region) => { for (let stack of Object.keys(stackDetails)) { const basePath = path.join(__dirname, '..', '..', `${IMPORT_PATH}_${stack}`); const importBasePath = path.join(basePath, stackDetails[stack].BRANCH ? stackDetails[stack].BRANCH : 'main'); - const contentTypesBasePath = path.join(basePath, stackDetails[stack].BRANCH ? stackDetails[stack].BRANCH : 'main', modules.content_types.dirName); - const entriesBasePath = path.join(basePath, stackDetails[stack].BRANCH ? stackDetails[stack].BRANCH : 'main', modules.entries.dirName); + const contentTypesBasePath = path.join( + basePath, + stackDetails[stack].BRANCH ? stackDetails[stack].BRANCH : 'main', + modules.content_types.dirName, + ); + const entriesBasePath = path.join( + basePath, + stackDetails[stack].BRANCH ? stackDetails[stack].BRANCH : 'main', + modules.entries.dirName, + ); const messageFilePath = path.join(__dirname, '..', '..', 'messages/index.json'); messageHandler.init({ messageFilePath }); const username = ENCRYPTION_KEY ? crypto.decrypt(region.USERNAME) : region.USERNAME; @@ -54,7 +68,13 @@ module.exports = (region) => { describe('Import stack using cm:stacks:import command', () => { test .stdout({ print: PRINT_LOGS || false }) - .command(['cm:stacks:import', '--stack-api-key', stackDetails[stack].STACK_API_KEY, '--data-dir', importBasePath]) + .command([ + 'cm:stacks:import', + '--stack-api-key', + stackDetails[stack].STACK_API_KEY, + '--data-dir', + importBasePath, + ]) .it('should work without any errors', (_, done) => { done(); }); @@ -70,7 +90,7 @@ module.exports = (region) => { try { if (fs.existsSync(contentTypesBasePath)) { let contentTypes = await fsPromises.readdir(contentTypesBasePath); - importedContentTypesCount = contentTypes.filter(ct => !ct.includes('schema.json')).length; + importedContentTypesCount = contentTypes.filter((ct) => !ct.includes('schema.json')).length; } } catch (error) { console.trace(error); @@ -82,31 +102,29 @@ module.exports = (region) => { }); describe('Check if all entries are imported correctly', () => { - test - .stdout({ print: PRINT_LOGS || false }) - .it('should check all entries are imported', async (_, done) => { - let importedEntriesCount = 0; - const entriesCount = await getEntriesCount(stackDetails); + test.stdout({ print: PRINT_LOGS || false }).it('should check all entries are imported', async (_, done) => { + let importedEntriesCount = 0; + const entriesCount = await getEntriesCount(stackDetails); - try { - if (fs.existsSync(entriesBasePath)) { - let contentTypes = await fsPromises.readdir(entriesBasePath); - for (let contentType of contentTypes) { - let ctPath = path.join(entriesBasePath, contentType); - let locales = await fsPromises.readdir(ctPath); - for (let locale of locales) { - let entries = await fsPromises.readFile(path.join(ctPath, locale), 'utf-8'); - importedEntriesCount += Object.keys(JSON.parse(entries)).length; - } + try { + if (fs.existsSync(entriesBasePath)) { + let contentTypes = await fsPromises.readdir(entriesBasePath); + for (let contentType of contentTypes) { + let ctPath = path.join(entriesBasePath, contentType); + let locales = await fsPromises.readdir(ctPath); + for (let locale of locales) { + let entries = await fsPromises.readFile(path.join(ctPath, locale), 'utf-8'); + importedEntriesCount += Object.keys(JSON.parse(entries)).length; } } - } catch (error) { - console.trace(error); } + } catch (error) { + console.trace(error); + } - expect(entriesCount).to.be.an('number').eq(importedEntriesCount); - done(); - }); + expect(entriesCount).to.be.an('number').eq(importedEntriesCount); + done(); + }); }); after(async () => { diff --git a/packages/contentstack-import/test/integration/content-types.test.js b/packages/contentstack-import/test/integration/content-types.test.js index c0b7776377..f772dc8ad1 100644 --- a/packages/contentstack-import/test/integration/content-types.test.js +++ b/packages/contentstack-import/test/integration/content-types.test.js @@ -9,8 +9,8 @@ const AddTokenCommand = require('@contentstack/cli-auth/lib/commands/auth/tokens const RegionSetCommand = require('@contentstack/cli-config/lib/commands/config/set/region').default; const ExportCommand = require('@contentstack/cli-cm-export/src/commands/cm/stacks/export'); -const defaultConfig = require('../../src/config/default'); -const { modules } = require('../../src/config/default'); +const { default: defaultConfig } = require('../../src/config'); +const modules = defaultConfig.modules; const { getStackDetailsByRegion, cleanUp, deleteStack, getEnvData, getContentTypesCount } = require('./utils/helper'); const { PRINT_LOGS, IMPORT_PATH } = require('./config.json'); const { DELIMITER, KEY_VAL_DELIMITER } = process.env; @@ -23,7 +23,7 @@ const REGION_MAP = { EU: 'EU', }; -module.exports = region => { +module.exports = (region) => { const stackDetails = getStackDetailsByRegion(region.REGION, DELIMITER, KEY_VAL_DELIMITER); for (const stack of Object.keys(stackDetails)) { const basePath = path.join(__dirname, '..', '..', `${IMPORT_PATH}_${stack}`); @@ -42,22 +42,47 @@ module.exports = region => { .it('should work without any errors', (_, done) => { done(); }); - + customTest - .command(AddTokenCommand, ['-a', stackDetails[stack].EXPORT_ALIAS_NAME, '-k', stackDetails[stack].EXPORT_STACK_API_KEY, '--management', '--token', stackDetails[stack].EXPORT_MANAGEMENT_TOKEN, '-y']) + .command(AddTokenCommand, [ + '-a', + stackDetails[stack].EXPORT_ALIAS_NAME, + '-k', + stackDetails[stack].EXPORT_STACK_API_KEY, + '--management', + '--token', + stackDetails[stack].EXPORT_MANAGEMENT_TOKEN, + '-y', + ]) .it(`Adding token for ${stack}`, (_, done) => { done(); }); customTest - .command(AddTokenCommand, ['-a', stackDetails[stack].ALIAS_NAME, '-k', stackDetails[stack].STACK_API_KEY, '--management', '--token', stackDetails[stack].MANAGEMENT_TOKEN, '-y']) + .command(AddTokenCommand, [ + '-a', + stackDetails[stack].ALIAS_NAME, + '-k', + stackDetails[stack].STACK_API_KEY, + '--management', + '--token', + stackDetails[stack].MANAGEMENT_TOKEN, + '-y', + ]) .it(`Adding token for ${stack}`, (_, done) => { done(); }); - + customTest .stdout({ print: PRINT_LOGS || false }) - .command(ExportCommand, ['--alias', stackDetails[stack].EXPORT_ALIAS_NAME, '--data-dir', basePath, '--module', 'content-types']) + .command(ExportCommand, [ + '--alias', + stackDetails[stack].EXPORT_ALIAS_NAME, + '--data-dir', + basePath, + '--module', + 'content-types', + ]) .it('should work without any errors', (_, done) => { done(); }); @@ -65,20 +90,28 @@ module.exports = region => { describe('Import assets using cm:stacks:import command', () => { test .stdout({ print: PRINT_LOGS || false }) - .command(['cm:stacks:import', '--alias', stackDetails[stack].ALIAS_NAME, '--data-dir', importBasePath, '--module', 'content-types']) + .command([ + 'cm:stacks:import', + '--alias', + stackDetails[stack].ALIAS_NAME, + '--data-dir', + importBasePath, + '--module', + 'content-types', + ]) .it('should work without any errors', async (_, done) => { let importedContentTypesCount = 0; const contentTypesCount = await getContentTypesCount(stackDetails[stack]); try { if (fs.existsSync(contentTypesBasePath)) { - let contentTypes = await fsPromises.readdir(contentTypesBasePath) - importedContentTypesCount = contentTypes.filter(ct => !ct.includes('schema.json')).length + let contentTypes = await fsPromises.readdir(contentTypesBasePath); + importedContentTypesCount = contentTypes.filter((ct) => !ct.includes('schema.json')).length; } } catch (error) { - console.trace(error) + console.trace(error); } - expect(contentTypesCount).to.be.an('number').eq(importedContentTypesCount) + expect(contentTypesCount).to.be.an('number').eq(importedContentTypesCount); done(); }); }); diff --git a/packages/contentstack-import/test/integration/custom-roles.test.js b/packages/contentstack-import/test/integration/custom-roles.test.js index 51b89fad7c..84469eb422 100644 --- a/packages/contentstack-import/test/integration/custom-roles.test.js +++ b/packages/contentstack-import/test/integration/custom-roles.test.js @@ -7,9 +7,8 @@ const LoginCommand = require('@contentstack/cli-auth/lib/commands/auth/login').d const AddTokenCommand = require('@contentstack/cli-auth/lib/commands/auth/tokens/add').default; const RegionSetCommand = require('@contentstack/cli-config/lib/commands/config/set/region').default; const ExportCommand = require('@contentstack/cli-cm-export/src/commands/cm/stacks/export'); - -const defaultConfig = require('../../src/config/default'); -const { modules } = require('../../src/config/default'); +const { default: defaultConfig } = require('../../src/config'); +const modules = defaultConfig.modules; const { getStackDetailsByRegion, cleanUp, deleteStack, getEnvData, getCustomRolesCount } = require('./utils/helper'); const { PRINT_LOGS, IMPORT_PATH } = require('./config.json'); const { DELIMITER, KEY_VAL_DELIMITER } = process.env; @@ -22,7 +21,7 @@ const REGION_MAP = { EU: 'EU', }; -module.exports = region => { +module.exports = (region) => { const stackDetails = getStackDetailsByRegion(region.REGION, DELIMITER, KEY_VAL_DELIMITER); for (const stack of Object.keys(stackDetails)) { const basePath = path.join(__dirname, '..', '..', `${IMPORT_PATH}_${stack}`); @@ -42,22 +41,47 @@ module.exports = region => { .it('should work without any errors', (_, done) => { done(); }); - + customTest - .command(AddTokenCommand, ['-a', stackDetails[stack].EXPORT_ALIAS_NAME, '-k', stackDetails[stack].EXPORT_STACK_API_KEY, '--management', '--token', stackDetails[stack].EXPORT_MANAGEMENT_TOKEN, '-y']) + .command(AddTokenCommand, [ + '-a', + stackDetails[stack].EXPORT_ALIAS_NAME, + '-k', + stackDetails[stack].EXPORT_STACK_API_KEY, + '--management', + '--token', + stackDetails[stack].EXPORT_MANAGEMENT_TOKEN, + '-y', + ]) .it(`Adding token for ${stack}`, (_, done) => { done(); }); customTest - .command(AddTokenCommand, ['-a', stackDetails[stack].ALIAS_NAME, '-k', stackDetails[stack].STACK_API_KEY, '--management', '--token', stackDetails[stack].MANAGEMENT_TOKEN, '-y']) + .command(AddTokenCommand, [ + '-a', + stackDetails[stack].ALIAS_NAME, + '-k', + stackDetails[stack].STACK_API_KEY, + '--management', + '--token', + stackDetails[stack].MANAGEMENT_TOKEN, + '-y', + ]) .it(`Adding token for ${stack}`, (_, done) => { done(); }); - + customTest .stdout({ print: PRINT_LOGS || false }) - .command(ExportCommand, ['--alias', stackDetails[stack].EXPORT_ALIAS_NAME, '--data-dir', basePath, '--module', 'custom-roles']) + .command(ExportCommand, [ + '--alias', + stackDetails[stack].EXPORT_ALIAS_NAME, + '--data-dir', + basePath, + '--module', + 'custom-roles', + ]) .it('should work without any errors', (_, done) => { done(); }); @@ -65,7 +89,15 @@ module.exports = region => { describe('Import assets using cm:stacks:import command', () => { test .stdout({ print: PRINT_LOGS || false }) - .command(['cm:stacks:import', '--alias', stackDetails[stack].ALIAS_NAME, '--data-dir', importBasePath, '--module', 'custom-roles']) + .command([ + 'cm:stacks:import', + '--alias', + stackDetails[stack].ALIAS_NAME, + '--data-dir', + importBasePath, + '--module', + 'custom-roles', + ]) .it('should work without any errors', async (_, done) => { let importedCustomRolesCount = 0; const customRolesCount = await getCustomRolesCount(stackDetails[stack]); diff --git a/packages/contentstack-import/test/integration/entries.test.js b/packages/contentstack-import/test/integration/entries.test.js index e2dec6ad9b..4114cc3079 100644 --- a/packages/contentstack-import/test/integration/entries.test.js +++ b/packages/contentstack-import/test/integration/entries.test.js @@ -9,8 +9,8 @@ const AddTokenCommand = require('@contentstack/cli-auth/lib/commands/auth/tokens const RegionSetCommand = require('@contentstack/cli-config/lib/commands/config/set/region').default; const ExportCommand = require('@contentstack/cli-cm-export/src/commands/cm/stacks/export'); -const defaultConfig = require('../../src/config/default'); -const { modules } = require('../../src/config/default'); +const { default: defaultConfig } = require('../../src/config'); +const modules = defaultConfig.modules; const { getStackDetailsByRegion, cleanUp, deleteStack, getEnvData, getEntriesCount } = require('./utils/helper'); const { PRINT_LOGS, IMPORT_PATH } = require('./config.json'); const { DELIMITER, KEY_VAL_DELIMITER } = process.env; @@ -23,7 +23,7 @@ const REGION_MAP = { EU: 'EU', }; -module.exports = region => { +module.exports = (region) => { const stackDetails = getStackDetailsByRegion(region.REGION, DELIMITER, KEY_VAL_DELIMITER); for (const stack of Object.keys(stackDetails)) { const basePath = path.join(__dirname, '..', '..', `${IMPORT_PATH}_${stack}`); @@ -42,22 +42,47 @@ module.exports = region => { .it('should work without any errors', (_, done) => { done(); }); - + customTest - .command(AddTokenCommand, ['-a', stackDetails[stack].EXPORT_ALIAS_NAME, '-k', stackDetails[stack].EXPORT_STACK_API_KEY, '--management', '--token', stackDetails[stack].EXPORT_MANAGEMENT_TOKEN, '-y']) + .command(AddTokenCommand, [ + '-a', + stackDetails[stack].EXPORT_ALIAS_NAME, + '-k', + stackDetails[stack].EXPORT_STACK_API_KEY, + '--management', + '--token', + stackDetails[stack].EXPORT_MANAGEMENT_TOKEN, + '-y', + ]) .it(`Adding token for ${stack}`, (_, done) => { done(); }); customTest - .command(AddTokenCommand, ['-a', stackDetails[stack].ALIAS_NAME, '-k', stackDetails[stack].STACK_API_KEY, '--management', '--token', stackDetails[stack].MANAGEMENT_TOKEN, '-y']) + .command(AddTokenCommand, [ + '-a', + stackDetails[stack].ALIAS_NAME, + '-k', + stackDetails[stack].STACK_API_KEY, + '--management', + '--token', + stackDetails[stack].MANAGEMENT_TOKEN, + '-y', + ]) .it(`Adding token for ${stack}`, (_, done) => { done(); }); - + customTest .stdout({ print: PRINT_LOGS || false }) - .command(ExportCommand, ['--alias', stackDetails[stack].EXPORT_ALIAS_NAME, '--data-dir', basePath, '--module', 'entries']) + .command(ExportCommand, [ + '--alias', + stackDetails[stack].EXPORT_ALIAS_NAME, + '--data-dir', + basePath, + '--module', + 'entries', + ]) .it('should work without any errors', (_, done) => { done(); }); @@ -65,14 +90,22 @@ module.exports = region => { describe('Import assets using cm:stacks:import command', () => { test .stdout({ print: PRINT_LOGS || false }) - .command(['cm:stacks:import', '--alias', stackDetails[stack].ALIAS_NAME, '--data-dir', importBasePath, '--module', 'entries']) + .command([ + 'cm:stacks:import', + '--alias', + stackDetails[stack].ALIAS_NAME, + '--data-dir', + importBasePath, + '--module', + 'entries', + ]) .it('should work without any errors', async (_, done) => { - let importedEntriesCount = 0 + let importedEntriesCount = 0; const entriesCount = await getEntriesCount(stackDetails[stack]); try { if (fs.existsSync(entriesBasePath)) { - let contentTypes = await fsPromises.readdir(entriesBasePath) + let contentTypes = await fsPromises.readdir(entriesBasePath); for (let contentType of contentTypes) { let ctPath = path.join(entriesBasePath, contentType); let locales = await fsPromises.readdir(ctPath); @@ -83,7 +116,7 @@ module.exports = region => { } } } catch (error) { - console.trace(error) + console.trace(error); } expect(entriesCount).to.be.an('number').eq(importedEntriesCount); diff --git a/packages/contentstack-import/test/integration/environments.test.js b/packages/contentstack-import/test/integration/environments.test.js index f28b4bb11d..8e509327ec 100644 --- a/packages/contentstack-import/test/integration/environments.test.js +++ b/packages/contentstack-import/test/integration/environments.test.js @@ -8,8 +8,8 @@ const AddTokenCommand = require('@contentstack/cli-auth/lib/commands/auth/tokens const RegionSetCommand = require('@contentstack/cli-config/lib/commands/config/set/region').default; const ExportCommand = require('@contentstack/cli-cm-export/src/commands/cm/stacks/export'); -const defaultConfig = require('../../src/config/default'); -const { modules } = require('../../src/config/default'); +const { default: defaultConfig } = require('../../src/config'); +const modules = defaultConfig.modules; const { getStackDetailsByRegion, cleanUp, deleteStack, getEnvData, getEnvironmentsCount } = require('./utils/helper'); const { PRINT_LOGS, IMPORT_PATH } = require('./config.json'); const { DELIMITER, KEY_VAL_DELIMITER } = process.env; @@ -22,7 +22,7 @@ const REGION_MAP = { EU: 'EU', }; -module.exports = region => { +module.exports = (region) => { const stackDetails = getStackDetailsByRegion(region.REGION, DELIMITER, KEY_VAL_DELIMITER); for (const stack of Object.keys(stackDetails)) { const basePath = path.join(__dirname, '..', '..', `${IMPORT_PATH}_${stack}`); @@ -42,22 +42,47 @@ module.exports = region => { .it('should work without any errors', (_, done) => { done(); }); - + customTest - .command(AddTokenCommand, ['-a', stackDetails[stack].EXPORT_ALIAS_NAME, '-k', stackDetails[stack].EXPORT_STACK_API_KEY, '--management', '--token', stackDetails[stack].EXPORT_MANAGEMENT_TOKEN, '-y']) + .command(AddTokenCommand, [ + '-a', + stackDetails[stack].EXPORT_ALIAS_NAME, + '-k', + stackDetails[stack].EXPORT_STACK_API_KEY, + '--management', + '--token', + stackDetails[stack].EXPORT_MANAGEMENT_TOKEN, + '-y', + ]) .it(`Adding token for ${stack}`, (_, done) => { done(); }); customTest - .command(AddTokenCommand, ['-a', stackDetails[stack].ALIAS_NAME, '-k', stackDetails[stack].STACK_API_KEY, '--management', '--token', stackDetails[stack].MANAGEMENT_TOKEN, '-y']) + .command(AddTokenCommand, [ + '-a', + stackDetails[stack].ALIAS_NAME, + '-k', + stackDetails[stack].STACK_API_KEY, + '--management', + '--token', + stackDetails[stack].MANAGEMENT_TOKEN, + '-y', + ]) .it(`Adding token for ${stack}`, (_, done) => { done(); }); customTest .stdout({ print: PRINT_LOGS || false }) - .command(ExportCommand, ['--alias', stackDetails[stack].EXPORT_ALIAS_NAME, '--data-dir', basePath, '--module', 'environments']) + .command(ExportCommand, [ + '--alias', + stackDetails[stack].EXPORT_ALIAS_NAME, + '--data-dir', + basePath, + '--module', + 'environments', + ]) .it('should work without any errors', (_, done) => { done(); }); @@ -65,9 +90,17 @@ module.exports = region => { describe('Import assets using cm:stacks:import command', () => { test .stdout({ print: PRINT_LOGS || false }) - .command(['cm:stacks:import', '--alias', stackDetails[stack].ALIAS_NAME, '--data-dir', importBasePath, '--module', 'environments']) + .command([ + 'cm:stacks:import', + '--alias', + stackDetails[stack].ALIAS_NAME, + '--data-dir', + importBasePath, + '--module', + 'environments', + ]) .it('should work without any errors', async (_, done) => { - let importedEnvironmentsCount = 0 + let importedEnvironmentsCount = 0; const environmentsCount = await getEnvironmentsCount(stackDetails[stack]); try { diff --git a/packages/contentstack-import/test/integration/extensions.test.js b/packages/contentstack-import/test/integration/extensions.test.js index 22f2ae45cb..24c93d40d2 100644 --- a/packages/contentstack-import/test/integration/extensions.test.js +++ b/packages/contentstack-import/test/integration/extensions.test.js @@ -8,8 +8,8 @@ const AddTokenCommand = require('@contentstack/cli-auth/lib/commands/auth/tokens const RegionSetCommand = require('@contentstack/cli-config/lib/commands/config/set/region').default; const ExportCommand = require('@contentstack/cli-cm-export/src/commands/cm/stacks/export'); -const defaultConfig = require('../../src/config/default'); -const { modules } = require('../../src/config/default'); +const { default: defaultConfig } = require('../../src/config'); +const modules = defaultConfig.modules; const { getStackDetailsByRegion, cleanUp, deleteStack, getEnvData, getExtensionsCount } = require('./utils/helper'); const { PRINT_LOGS, IMPORT_PATH } = require('./config.json'); const { DELIMITER, KEY_VAL_DELIMITER } = process.env; @@ -22,7 +22,7 @@ const REGION_MAP = { EU: 'EU', }; -module.exports = region => { +module.exports = (region) => { const stackDetails = getStackDetailsByRegion(region.REGION, DELIMITER, KEY_VAL_DELIMITER); for (const stack of Object.keys(stackDetails)) { const basePath = path.join(__dirname, '..', '..', `${IMPORT_PATH}_${stack}`); @@ -42,22 +42,47 @@ module.exports = region => { .it('should work without any errors', (_, done) => { done(); }); - + customTest - .command(AddTokenCommand, ['-a', stackDetails[stack].EXPORT_ALIAS_NAME, '-k', stackDetails[stack].EXPORT_STACK_API_KEY, '--management', '--token', stackDetails[stack].EXPORT_MANAGEMENT_TOKEN, '-y']) + .command(AddTokenCommand, [ + '-a', + stackDetails[stack].EXPORT_ALIAS_NAME, + '-k', + stackDetails[stack].EXPORT_STACK_API_KEY, + '--management', + '--token', + stackDetails[stack].EXPORT_MANAGEMENT_TOKEN, + '-y', + ]) .it(`Adding token for ${stack}`, (_, done) => { done(); }); customTest - .command(AddTokenCommand, ['-a', stackDetails[stack].ALIAS_NAME, '-k', stackDetails[stack].STACK_API_KEY, '--management', '--token', stackDetails[stack].MANAGEMENT_TOKEN, '-y']) + .command(AddTokenCommand, [ + '-a', + stackDetails[stack].ALIAS_NAME, + '-k', + stackDetails[stack].STACK_API_KEY, + '--management', + '--token', + stackDetails[stack].MANAGEMENT_TOKEN, + '-y', + ]) .it(`Adding token for ${stack}`, (_, done) => { done(); }); customTest .stdout({ print: PRINT_LOGS || false }) - .command(ExportCommand, ['--alias', stackDetails[stack].EXPORT_ALIAS_NAME, '--data-dir', basePath, '--module', 'extensions']) + .command(ExportCommand, [ + '--alias', + stackDetails[stack].EXPORT_ALIAS_NAME, + '--data-dir', + basePath, + '--module', + 'extensions', + ]) .it('should work without any errors', (_, done) => { done(); }); @@ -65,9 +90,17 @@ module.exports = region => { describe('Import assets using cm:stacks:import command', () => { test .stdout({ print: PRINT_LOGS || false }) - .command(['cm:stacks:import', '--alias', stackDetails[stack].ALIAS_NAME, '--data-dir', importBasePath, '--module', 'extensions']) + .command([ + 'cm:stacks:import', + '--alias', + stackDetails[stack].ALIAS_NAME, + '--data-dir', + importBasePath, + '--module', + 'extensions', + ]) .it('should work without any errors', async (_, done) => { - let importedExtensionsCount = 0 + let importedExtensionsCount = 0; const extensionsCount = await getExtensionsCount(stackDetails[stack]); try { diff --git a/packages/contentstack-import/test/integration/global-fields.test.js b/packages/contentstack-import/test/integration/global-fields.test.js index c8ccd4018e..e9a1186ad4 100644 --- a/packages/contentstack-import/test/integration/global-fields.test.js +++ b/packages/contentstack-import/test/integration/global-fields.test.js @@ -8,8 +8,8 @@ const AddTokenCommand = require('@contentstack/cli-auth/lib/commands/auth/tokens const RegionSetCommand = require('@contentstack/cli-config/lib/commands/config/set/region').default; const ExportCommand = require('@contentstack/cli-cm-export/src/commands/cm/stacks/export'); -const defaultConfig = require('../../src/config/default'); -const { modules } = require('../../src/config/default'); +const { default: defaultConfig } = require('../../src/config'); +const modules = defaultConfig.modules; const { getStackDetailsByRegion, cleanUp, deleteStack, getEnvData, getGlobalFieldsCount } = require('./utils/helper'); const { PRINT_LOGS, IMPORT_PATH } = require('./config.json'); const { DELIMITER, KEY_VAL_DELIMITER } = process.env; @@ -22,7 +22,7 @@ const REGION_MAP = { EU: 'EU', }; -module.exports = region => { +module.exports = (region) => { const stackDetails = getStackDetailsByRegion(region.REGION, DELIMITER, KEY_VAL_DELIMITER); for (const stack of Object.keys(stackDetails)) { const basePath = path.join(__dirname, '..', '..', `${IMPORT_PATH}_${stack}`); @@ -42,22 +42,47 @@ module.exports = region => { .it('should work without any errors', (_, done) => { done(); }); - + customTest - .command(AddTokenCommand, ['-a', stackDetails[stack].EXPORT_ALIAS_NAME, '-k', stackDetails[stack].EXPORT_STACK_API_KEY, '--management', '--token', stackDetails[stack].EXPORT_MANAGEMENT_TOKEN, '-y']) + .command(AddTokenCommand, [ + '-a', + stackDetails[stack].EXPORT_ALIAS_NAME, + '-k', + stackDetails[stack].EXPORT_STACK_API_KEY, + '--management', + '--token', + stackDetails[stack].EXPORT_MANAGEMENT_TOKEN, + '-y', + ]) .it(`Adding token for ${stack}`, (_, done) => { done(); }); customTest - .command(AddTokenCommand, ['-a', stackDetails[stack].ALIAS_NAME, '-k', stackDetails[stack].STACK_API_KEY, '--management', '--token', stackDetails[stack].MANAGEMENT_TOKEN, '-y']) + .command(AddTokenCommand, [ + '-a', + stackDetails[stack].ALIAS_NAME, + '-k', + stackDetails[stack].STACK_API_KEY, + '--management', + '--token', + stackDetails[stack].MANAGEMENT_TOKEN, + '-y', + ]) .it(`Adding token for ${stack}`, (_, done) => { done(); }); customTest .stdout({ print: PRINT_LOGS || false }) - .command(ExportCommand, ['--alias', stackDetails[stack].EXPORT_ALIAS_NAME, '--data-dir', basePath, '--module', 'global-fields']) + .command(ExportCommand, [ + '--alias', + stackDetails[stack].EXPORT_ALIAS_NAME, + '--data-dir', + basePath, + '--module', + 'global-fields', + ]) .it('should work without any errors', (_, done) => { done(); }); @@ -65,7 +90,15 @@ module.exports = region => { describe('Import assets using cm:stacks:import command', () => { test .stdout({ print: PRINT_LOGS || false }) - .command(['cm:stacks:import', '--alias', stackDetails[stack].ALIAS_NAME, '--data-dir', importBasePath, '--module', 'global-fields']) + .command([ + 'cm:stacks:import', + '--alias', + stackDetails[stack].ALIAS_NAME, + '--data-dir', + importBasePath, + '--module', + 'global-fields', + ]) .it('should work without any errors', async (_, done) => { let importedGlobalFieldsCount = 0; const globalFieldsCount = await getGlobalFieldsCount(stackDetails[stack]); diff --git a/packages/contentstack-import/test/integration/locales.test.js b/packages/contentstack-import/test/integration/locales.test.js index 1f5a489cca..e0181b5c26 100644 --- a/packages/contentstack-import/test/integration/locales.test.js +++ b/packages/contentstack-import/test/integration/locales.test.js @@ -8,8 +8,8 @@ const AddTokenCommand = require('@contentstack/cli-auth/lib/commands/auth/tokens const RegionSetCommand = require('@contentstack/cli-config/lib/commands/config/set/region').default; const ExportCommand = require('@contentstack/cli-cm-export/src/commands/cm/stacks/export'); -const defaultConfig = require('../../src/config/default'); -const { modules } = require('../../src/config/default'); +const { default: defaultConfig } = require('../../src/config'); +const modules = defaultConfig.modules; const { getStackDetailsByRegion, cleanUp, deleteStack, getEnvData, getLocalesCount } = require('./utils/helper'); const { PRINT_LOGS, IMPORT_PATH } = require('./config.json'); const { DELIMITER, KEY_VAL_DELIMITER } = process.env; @@ -22,7 +22,7 @@ const REGION_MAP = { EU: 'EU', }; -module.exports = region => { +module.exports = (region) => { const stackDetails = getStackDetailsByRegion(region.REGION, DELIMITER, KEY_VAL_DELIMITER); for (const stack of Object.keys(stackDetails)) { const basePath = path.join(__dirname, '..', '..', `${IMPORT_PATH}_${stack}`); @@ -42,22 +42,47 @@ module.exports = region => { .it('should work without any errors', (_, done) => { done(); }); - + customTest - .command(AddTokenCommand, ['-a', stackDetails[stack].EXPORT_ALIAS_NAME, '-k', stackDetails[stack].EXPORT_STACK_API_KEY, '--management', '--token', stackDetails[stack].EXPORT_MANAGEMENT_TOKEN, '-y']) + .command(AddTokenCommand, [ + '-a', + stackDetails[stack].EXPORT_ALIAS_NAME, + '-k', + stackDetails[stack].EXPORT_STACK_API_KEY, + '--management', + '--token', + stackDetails[stack].EXPORT_MANAGEMENT_TOKEN, + '-y', + ]) .it(`Adding token for ${stack}`, (_, done) => { done(); }); customTest - .command(AddTokenCommand, ['-a', stackDetails[stack].ALIAS_NAME, '-k', stackDetails[stack].STACK_API_KEY, '--management', '--token', stackDetails[stack].MANAGEMENT_TOKEN, '-y']) + .command(AddTokenCommand, [ + '-a', + stackDetails[stack].ALIAS_NAME, + '-k', + stackDetails[stack].STACK_API_KEY, + '--management', + '--token', + stackDetails[stack].MANAGEMENT_TOKEN, + '-y', + ]) .it(`Adding token for ${stack}`, (_, done) => { done(); }); customTest .stdout({ print: PRINT_LOGS || false }) - .command(ExportCommand, ['--alias', stackDetails[stack].EXPORT_ALIAS_NAME, '--data-dir', basePath, '--module', 'locales']) + .command(ExportCommand, [ + '--alias', + stackDetails[stack].EXPORT_ALIAS_NAME, + '--data-dir', + basePath, + '--module', + 'locales', + ]) .it('should work without any errors', (_, done) => { done(); }); @@ -65,7 +90,15 @@ module.exports = region => { describe('Import assets using cm:stacks:import command', () => { test .stdout({ print: PRINT_LOGS || false }) - .command(['cm:stacks:import', '--alias', stackDetails[stack].ALIAS_NAME, '--data-dir', importBasePath, '--module', 'locales']) + .command([ + 'cm:stacks:import', + '--alias', + stackDetails[stack].ALIAS_NAME, + '--data-dir', + importBasePath, + '--module', + 'locales', + ]) .it('should work without any errors', async (_, done) => { let importedLocaleCount = 0; const localeCount = await getLocalesCount(stackDetails[stack]); diff --git a/packages/contentstack-import/test/integration/management-token.test.js b/packages/contentstack-import/test/integration/management-token.test.js index da89b6d25c..6c6ac4b415 100644 --- a/packages/contentstack-import/test/integration/management-token.test.js +++ b/packages/contentstack-import/test/integration/management-token.test.js @@ -9,10 +9,17 @@ const AddTokenCommand = require('@contentstack/cli-auth/lib/commands/auth/tokens const RegionSetCommand = require('@contentstack/cli-config/lib/commands/config/set/region').default; const ExportCommand = require('@contentstack/cli-cm-export/src/commands/cm/stacks/export'); -const { getStackDetailsByRegion, getContentTypesCount, cleanUp, getEnvData, getEntriesCount, deleteStack } = require('./utils/helper'); +const { + getStackDetailsByRegion, + getContentTypesCount, + cleanUp, + getEnvData, + getEntriesCount, + deleteStack, +} = require('./utils/helper'); const { PRINT_LOGS, IMPORT_PATH } = require('./config.json'); -const defaultConfig = require('../../src/config/default'); -const { modules } = require('../../src/config/default'); +const { default: defaultConfig } = require('../../src/config'); +const modules = defaultConfig.modules; const { DELIMITER, KEY_VAL_DELIMITER } = process.env; const { ENCRYPTION_KEY } = getEnvData(); @@ -29,8 +36,16 @@ module.exports = (region) => { for (let stack of Object.keys(stackDetails)) { const basePath = path.join(__dirname, '..', '..', `${IMPORT_PATH}_${stack}`); const importBasePath = path.join(basePath, stackDetails[stack].BRANCH ? stackDetails[stack].BRANCH : 'main'); - const contentTypesBasePath = path.join(basePath, stackDetails[stack].BRANCH ? stackDetails[stack].BRANCH : 'main', modules.content_types.dirName); - const entriesBasePath = path.join(basePath, stackDetails[stack].BRANCH ? stackDetails[stack].BRANCH : 'main', modules.entries.dirName); + const contentTypesBasePath = path.join( + basePath, + stackDetails[stack].BRANCH ? stackDetails[stack].BRANCH : 'main', + modules.content_types.dirName, + ); + const entriesBasePath = path.join( + basePath, + stackDetails[stack].BRANCH ? stackDetails[stack].BRANCH : 'main', + modules.entries.dirName, + ); const messageFilePath = path.join(__dirname, '..', '..', 'messages/index.json'); messageHandler.init({ messageFilePath }); const username = ENCRYPTION_KEY ? crypto.decrypt(region.USERNAME) : region.USERNAME; @@ -46,13 +61,31 @@ module.exports = (region) => { }); customTest - .command(AddTokenCommand, ['-a', stackDetails[stack].EXPORT_ALIAS_NAME, '-k', stackDetails[stack].EXPORT_STACK_API_KEY, '--management', '--token', stackDetails[stack].EXPORT_MANAGEMENT_TOKEN, '-y']) + .command(AddTokenCommand, [ + '-a', + stackDetails[stack].EXPORT_ALIAS_NAME, + '-k', + stackDetails[stack].EXPORT_STACK_API_KEY, + '--management', + '--token', + stackDetails[stack].EXPORT_MANAGEMENT_TOKEN, + '-y', + ]) .it(`Adding token for ${stack}`, (_, done) => { done(); }); customTest - .command(AddTokenCommand, ['-a', stackDetails[stack].ALIAS_NAME, '-k', stackDetails[stack].STACK_API_KEY, '--management', '--token', stackDetails[stack].MANAGEMENT_TOKEN, '-y']) + .command(AddTokenCommand, [ + '-a', + stackDetails[stack].ALIAS_NAME, + '-k', + stackDetails[stack].STACK_API_KEY, + '--management', + '--token', + stackDetails[stack].MANAGEMENT_TOKEN, + '-y', + ]) .it(`Adding token for ${stack}`, (_, done) => { done(); }); @@ -83,7 +116,7 @@ module.exports = (region) => { try { if (fs.existsSync(contentTypesBasePath)) { let contentTypes = await fsPromises.readdir(contentTypesBasePath); - importedContentTypesCount = contentTypes.filter(ct => !ct.includes('schema.json')).length; + importedContentTypesCount = contentTypes.filter((ct) => !ct.includes('schema.json')).length; } } catch (error) { console.trace(error); @@ -95,31 +128,29 @@ module.exports = (region) => { }); describe('Check if all entries are imported correctly', () => { - test - .stdout({ print: PRINT_LOGS || false }) - .it('should check all entries are imported', async (_, done) => { - let importedEntriesCount = 0; - const entriesCount = await getEntriesCount(stackDetails); - - try { - if (fs.existsSync(entriesBasePath)) { - let contentTypes = await fsPromises.readdir(entriesBasePath); - for (let contentType of contentTypes) { - let ctPath = path.join(entriesBasePath, contentType); - let locales = await fsPromises.readdir(ctPath); - for (let locale of locales) { - let entries = await fsPromises.readFile(path.join(ctPath, locale), 'utf-8'); - importedEntriesCount += Object.keys(JSON.parse(entries)).length; - } + test.stdout({ print: PRINT_LOGS || false }).it('should check all entries are imported', async (_, done) => { + let importedEntriesCount = 0; + const entriesCount = await getEntriesCount(stackDetails); + + try { + if (fs.existsSync(entriesBasePath)) { + let contentTypes = await fsPromises.readdir(entriesBasePath); + for (let contentType of contentTypes) { + let ctPath = path.join(entriesBasePath, contentType); + let locales = await fsPromises.readdir(ctPath); + for (let locale of locales) { + let entries = await fsPromises.readFile(path.join(ctPath, locale), 'utf-8'); + importedEntriesCount += Object.keys(JSON.parse(entries)).length; } } - } catch (error) { - console.trace(error); } + } catch (error) { + console.trace(error); + } - expect(entriesCount).to.be.an('number').eq(importedEntriesCount); - done(); - }); + expect(entriesCount).to.be.an('number').eq(importedEntriesCount); + done(); + }); }); after(async () => { diff --git a/packages/contentstack-import/test/integration/webhooks.test.js b/packages/contentstack-import/test/integration/webhooks.test.js index 97b13105a2..e07f416d8b 100644 --- a/packages/contentstack-import/test/integration/webhooks.test.js +++ b/packages/contentstack-import/test/integration/webhooks.test.js @@ -8,8 +8,8 @@ const AddTokenCommand = require('@contentstack/cli-auth/lib/commands/auth/tokens const RegionSetCommand = require('@contentstack/cli-config/lib/commands/config/set/region').default; const ExportCommand = require('@contentstack/cli-cm-export/src/commands/cm/stacks/export'); -const defaultConfig = require('../../src/config/default'); -const { modules } = require('../../src/config/default'); +const { default: defaultConfig } = require('../../src/config'); +const modules = defaultConfig.modules; const { getStackDetailsByRegion, cleanUp, deleteStack, getEnvData, getWebhooksCount } = require('./utils/helper'); const { PRINT_LOGS, IMPORT_PATH } = require('./config.json'); const { DELIMITER, KEY_VAL_DELIMITER } = process.env; @@ -22,7 +22,7 @@ const REGION_MAP = { EU: 'EU', }; -module.exports = region => { +module.exports = (region) => { const stackDetails = getStackDetailsByRegion(region.REGION, DELIMITER, KEY_VAL_DELIMITER); for (const stack of Object.keys(stackDetails)) { const basePath = path.join(__dirname, '..', '..', `${IMPORT_PATH}_${stack}`); @@ -42,22 +42,47 @@ module.exports = region => { .it('should work without any errors', (_, done) => { done(); }); - + customTest - .command(AddTokenCommand, ['-a', stackDetails[stack].EXPORT_ALIAS_NAME, '-k', stackDetails[stack].EXPORT_STACK_API_KEY, '--management', '--token', stackDetails[stack].EXPORT_MANAGEMENT_TOKEN, '-y']) + .command(AddTokenCommand, [ + '-a', + stackDetails[stack].EXPORT_ALIAS_NAME, + '-k', + stackDetails[stack].EXPORT_STACK_API_KEY, + '--management', + '--token', + stackDetails[stack].EXPORT_MANAGEMENT_TOKEN, + '-y', + ]) .it(`Adding token for ${stack}`, (_, done) => { done(); }); customTest - .command(AddTokenCommand, ['-a', stackDetails[stack].ALIAS_NAME, '-k', stackDetails[stack].STACK_API_KEY, '--management', '--token', stackDetails[stack].MANAGEMENT_TOKEN, '-y']) + .command(AddTokenCommand, [ + '-a', + stackDetails[stack].ALIAS_NAME, + '-k', + stackDetails[stack].STACK_API_KEY, + '--management', + '--token', + stackDetails[stack].MANAGEMENT_TOKEN, + '-y', + ]) .it(`Adding token for ${stack}`, (_, done) => { done(); }); customTest .stdout({ print: PRINT_LOGS || false }) - .command(ExportCommand, ['--alias', stackDetails[stack].EXPORT_ALIAS_NAME, '--data-dir', basePath, '--module', 'webhooks']) + .command(ExportCommand, [ + '--alias', + stackDetails[stack].EXPORT_ALIAS_NAME, + '--data-dir', + basePath, + '--module', + 'webhooks', + ]) .it('should work without any errors', (_, done) => { done(); }); @@ -65,7 +90,15 @@ module.exports = region => { describe('Import assets using cm:stacks:import command', () => { test .stdout({ print: PRINT_LOGS || false }) - .command(['cm:stacks:import', '--alias', stackDetails[stack].ALIAS_NAME, '--data-dir', importBasePath, '--module', 'webhooks']) + .command([ + 'cm:stacks:import', + '--alias', + stackDetails[stack].ALIAS_NAME, + '--data-dir', + importBasePath, + '--module', + 'webhooks', + ]) .it('should work without any errors', async (_, done) => { let importedWebhooksCount = 0; const webhooksCount = await getWebhooksCount(stackDetails[stack]); diff --git a/packages/contentstack-import/test/integration/workflows.test.js b/packages/contentstack-import/test/integration/workflows.test.js index 1acc7b18cb..57b9ef09bd 100644 --- a/packages/contentstack-import/test/integration/workflows.test.js +++ b/packages/contentstack-import/test/integration/workflows.test.js @@ -8,8 +8,8 @@ const AddTokenCommand = require('@contentstack/cli-auth/lib/commands/auth/tokens const RegionSetCommand = require('@contentstack/cli-config/lib/commands/config/set/region').default; const ExportCommand = require('@contentstack/cli-cm-export/src/commands/cm/stacks/export'); -const defaultConfig = require('../../src/config/default'); -const { modules } = require('../../src/config/default'); +const { default: defaultConfig } = require('../../src/config'); +const modules = defaultConfig.modules; const { getStackDetailsByRegion, cleanUp, deleteStack, getEnvData, getWorkflowsCount } = require('./utils/helper'); const { PRINT_LOGS, IMPORT_PATH } = require('./config.json'); const { DELIMITER, KEY_VAL_DELIMITER } = process.env; @@ -22,7 +22,7 @@ const REGION_MAP = { EU: 'EU', }; -module.exports = region => { +module.exports = (region) => { const stackDetails = getStackDetailsByRegion(region.REGION, DELIMITER, KEY_VAL_DELIMITER); for (const stack of Object.keys(stackDetails)) { const basePath = path.join(__dirname, '..', '..', `${IMPORT_PATH}_${stack}`); @@ -42,22 +42,47 @@ module.exports = region => { .it('should work without any errors', (_, done) => { done(); }); - + customTest - .command(AddTokenCommand, ['-a', stackDetails[stack].EXPORT_ALIAS_NAME, '-k', stackDetails[stack].EXPORT_STACK_API_KEY, '--management', '--token', stackDetails[stack].EXPORT_MANAGEMENT_TOKEN, '-y']) + .command(AddTokenCommand, [ + '-a', + stackDetails[stack].EXPORT_ALIAS_NAME, + '-k', + stackDetails[stack].EXPORT_STACK_API_KEY, + '--management', + '--token', + stackDetails[stack].EXPORT_MANAGEMENT_TOKEN, + '-y', + ]) .it(`Adding token for ${stack}`, (_, done) => { done(); }); customTest - .command(AddTokenCommand, ['-a', stackDetails[stack].ALIAS_NAME, '-k', stackDetails[stack].STACK_API_KEY, '--management', '--token', stackDetails[stack].MANAGEMENT_TOKEN, '-y']) + .command(AddTokenCommand, [ + '-a', + stackDetails[stack].ALIAS_NAME, + '-k', + stackDetails[stack].STACK_API_KEY, + '--management', + '--token', + stackDetails[stack].MANAGEMENT_TOKEN, + '-y', + ]) .it(`Adding token for ${stack}`, (_, done) => { done(); }); customTest .stdout({ print: PRINT_LOGS || false }) - .command(ExportCommand, ['--alias', stackDetails[stack].EXPORT_ALIAS_NAME, '--data-dir', basePath, '--module', 'workflows']) + .command(ExportCommand, [ + '--alias', + stackDetails[stack].EXPORT_ALIAS_NAME, + '--data-dir', + basePath, + '--module', + 'workflows', + ]) .it('should work without any errors', (_, done) => { done(); }); @@ -65,7 +90,15 @@ module.exports = region => { describe('Import assets using cm:stacks:import command', () => { test .stdout({ print: PRINT_LOGS || false }) - .command(['cm:stacks:import', '--alias', stackDetails[stack].ALIAS_NAME, '--data-dir', importBasePath, '--module', 'workflows']) + .command([ + 'cm:stacks:import', + '--alias', + stackDetails[stack].ALIAS_NAME, + '--data-dir', + importBasePath, + '--module', + 'workflows', + ]) .it('should work without any errors', async (_, done) => { let importedWorkflowsCount = 0; const workflowsCount = await getWorkflowsCount(stackDetails[stack]); diff --git a/packages/contentstack-import/test/mock/assetFetch.js b/packages/contentstack-import/test/mock/assetFetch.js deleted file mode 100644 index 219b972181..0000000000 --- a/packages/contentstack-import/test/mock/assetFetch.js +++ /dev/null @@ -1,20 +0,0 @@ -module.exports = { - stackHeaders: { api_key: 'dummyApiKey' }, - urlPath: 'assets/dummyUrl', - uid: 'dummyUid', - update: [Function], - delete: [Function], - fetch: [Function], - replace: [Function], - publish: [Function], - content_type: 'image/svg+xml', - file_size: '19743', - tags: [], - filename: 'HCA_Logo_White_RGB.svg', - url: 'https://images.contentstack.io/v3/assets/blt5ab3970669dfa578/bltbef70dca0df17a5d/5f0f12da2da906106a5caeca/HCA_Logo_White_RGB.svg', - ACL: {}, - is_dir: false, - _version: 1, - title: 'HCA_Logo_White_RGB.svg', - publish_details: [], -}; diff --git a/packages/contentstack-import/test/mock/assets.js b/packages/contentstack-import/test/mock/assets.js deleted file mode 100644 index 405d1e41d4..0000000000 --- a/packages/contentstack-import/test/mock/assets.js +++ /dev/null @@ -1,412 +0,0 @@ -module.exports = { - items: [ - { - stackHeaders: [Object], - urlPath: 'assets/dummyPath', - uid: 'dummyUid', - content_type: 'application/pdf', - file_size: '667698', - tags: [], - filename: 'Release_Notes_Int.pdf', - url: 'https://assets.contentstack.io/v3/assets/blt5ab3970669dfa578/blt5b39cbd17663b1fe/5f0f12e13a25531362dd6835/Release_Notes_Int.pdf', - ACL: [Object], - is_dir: false, - _version: 1, - title: 'Release_Notes_Int.pdf', - publish_details: [], - update: [Function], - delete: [Function], - fetch: [Function], - replace: [Function], - publish: [Function], - }, - { - stackHeaders: [Object], - urlPath: 'assets/dummyPath', - uid: 'dummyUid', - content_type: 'image/svg+xml', - file_size: '19743', - tags: [], - filename: 'HCA_Logo_White_RGB.svg', - url: 'https://images.contentstack.io/v3/assets/blt5ab3970669dfa578/bltbef70dca0df17a5d/5f0f12da2da906106a5caeca/HCA_Logo_White_RGB.svg', - ACL: [Object], - is_dir: false, - _version: 1, - title: 'HCA_Logo_White_RGB.svg', - publish_details: [], - update: [Function], - delete: [Function], - fetch: [Function], - replace: [Function], - publish: [Function], - }, - { - stackHeaders: [Object], - urlPath: 'assets/dummyPath', - uid: 'dummyUid', - content_type: 'application/pdf', - file_size: '667698', - tags: [], - filename: 'Release_Notes_Int.pdf', - url: 'https://assets.contentstack.io/v3/assets/blt5ab3970669dfa578/blt589528b0adcccd26/5f0f12d397b6246d32522687/Release_Notes_Int.pdf', - ACL: [Object], - is_dir: false, - parent_uid: 'blt76b1fc444e926aee', - _version: 1, - title: 'Release_Notes.pdf', - publish_details: [], - update: [Function], - delete: [Function], - fetch: [Function], - replace: [Function], - publish: [Function], - }, - { - stackHeaders: [Object], - urlPath: 'assets/dummyPath', - uid: 'dummyUid', - content_type: 'image/png', - file_size: '14267', - tags: [], - filename: 'spiros_segalas.png', - url: 'https://images.contentstack.io/v3/assets/blt5ab3970669dfa578/bltaa114f177699254f/5f0f12d014e45135d4535e62/spiros_segalas.png', - ACL: [Object], - is_dir: false, - parent_uid: 'bltae064058c8b10fac', - _version: 1, - title: 'spiros_segalas.png', - publish_details: [], - update: [Function], - delete: [Function], - fetch: [Function], - replace: [Function], - publish: [Function], - }, - { - stackHeaders: [Object], - urlPath: 'assets/dummyPath', - uid: 'dummyUid', - content_type: 'application/pdf', - file_size: '498523', - tags: [], - filename: 'capital_appreciation_fund_fact_sheet.pdf', - url: 'https://assets.contentstack.io/v3/assets/blt5ab3970669dfa578/blt2fc4e8d876d15e2f/5f0f12c924b5d9107d6a1886/capital_appreciation_fund_fact_sheet.pdf', - ACL: [Object], - is_dir: false, - parent_uid: null, - _version: 1, - title: 'capital_appreciation_fund_fact_sheet.pdf', - publish_details: [], - update: [Function], - delete: [Function], - fetch: [Function], - replace: [Function], - publish: [Function], - }, - { - stackHeaders: [Object], - urlPath: 'assets/dummyPath', - uid: 'dummyUid', - content_type: 'image/jpeg', - file_size: '258029', - tags: [], - filename: '4.7ss.jpg', - url: 'https://images.contentstack.io/v3/assets/blt5ab3970669dfa578/bltb12aab18b2b88f3c/5f0f12c914e45135d4535e5e/4.7ss.jpg', - ACL: [Object], - is_dir: false, - _version: 1, - title: '4.7ss.jpg', - publish_details: [], - update: [Function], - delete: [Function], - fetch: [Function], - replace: [Function], - publish: [Function], - }, - { - stackHeaders: [Object], - urlPath: 'assets/dummyPath', - uid: 'dummyUid', - content_type: 'application/pdf', - file_size: '667698', - tags: [], - filename: 'Release_Notes_Int.pdf', - url: 'https://assets.contentstack.io/v3/assets/blt5ab3970669dfa578/bltb58f63a6198eb699/5f0f12c0dfa8af6d4aee75ab/Release_Notes_Int.pdf', - ACL: [Object], - is_dir: false, - parent_uid: 'blt8d91774cbf8288c5', - _version: 1, - title: 'Release_Notes.pdf', - publish_details: [], - update: [Function], - delete: [Function], - fetch: [Function], - replace: [Function], - publish: [Function], - }, - { - stackHeaders: [Object], - urlPath: 'assets/dummyPath', - uid: 'dummyUid', - content_type: 'application/pdf', - file_size: '667698', - tags: [], - filename: 'Release_Notes.pdf', - url: 'https://assets.contentstack.io/v3/assets/blt5ab3970669dfa578/blt6c07eec439df9643/5f0f12c01d123c5014d372c3/Release_Notes.pdf', - ACL: [Object], - is_dir: false, - _version: 1, - title: 'Release_Notes.pdf', - publish_details: [], - update: [Function], - delete: [Function], - fetch: [Function], - replace: [Function], - publish: [Function], - }, - { - stackHeaders: [Object], - urlPath: 'assets/dummyPath', - uid: 'dummyUid', - content_type: 'application/pdf', - file_size: '667698', - tags: [], - filename: 'Release_Notes.pdf', - url: 'https://assets.contentstack.io/v3/assets/blt5ab3970669dfa578/blt026e57b5153ec7e4/5f0f12b776779b6e2221d5f6/Release_Notes.pdf', - ACL: [Object], - is_dir: false, - parent_uid: 'blt8d91774cbf8288c5', - _version: 1, - title: 'Release_Notes.pdf', - publish_details: [], - update: [Function], - delete: [Function], - fetch: [Function], - replace: [Function], - publish: [Function], - }, - { - stackHeaders: [Object], - urlPath: 'assets/dummyPath', - uid: 'dummyUid', - content_type: 'application/json', - file_size: '2351', - tags: [], - filename: 'fund_types.json', - url: 'https://assets.contentstack.io/v3/assets/blt5ab3970669dfa578/blt33222aa963a982fd/5f0f12b3a7db8f1275059828/fund_types.json', - ACL: [Object], - is_dir: false, - _version: 1, - title: 'fund_types.json', - publish_details: [], - update: [Function], - delete: [Function], - fetch: [Function], - replace: [Function], - publish: [Function], - }, - { - stackHeaders: [Object], - urlPath: 'assets/dummyPath', - uid: 'dummyUid', - content_type: 'application/pdf', - file_size: '667698', - tags: [], - filename: 'Release_Notes_Int.pdf', - url: 'https://assets.contentstack.io/v3/assets/blt5ab3970669dfa578/blt10af749494c7f6ab/5f0f12ac3a25531362dd6831/Release_Notes_Int.pdf', - ACL: [Object], - is_dir: false, - _version: 1, - title: 'Release_Notes_Int.pdf', - publish_details: [], - update: [Function], - delete: [Function], - fetch: [Function], - replace: [Function], - publish: [Function], - }, - { - stackHeaders: [Object], - urlPath: 'assets/dummyPath', - uid: 'dummyUid', - content_type: 'image/png', - file_size: '36713', - tags: [], - filename: 'Video_HF_Intro_1_Thumb.png', - url: 'https://images.contentstack.io/v3/assets/blt5ab3970669dfa578/blt2593f7a7a3ea4609/5f0f12aa7f758d1075a75174/Video_HF_Intro_1_Thumb.png', - ACL: [Object], - is_dir: false, - _version: 1, - title: 'Video_HF_Intro_1_Thumb.png', - publish_details: [], - update: [Function], - delete: [Function], - fetch: [Function], - replace: [Function], - publish: [Function], - }, - { - stackHeaders: [Object], - urlPath: 'assets/dummyPath', - uid: 'dummyUid', - content_type: 'image/jpeg', - file_size: '258029', - tags: [], - filename: '4.7ss.jpg', - url: 'https://images.contentstack.io/v3/assets/blt5ab3970669dfa578/bltfedcf80fd488b077/5f0f12a4b748cf0eaa60ca66/4.7ss.jpg', - ACL: [Object], - is_dir: false, - _version: 1, - title: '4.7ss.jpg', - publish_details: [], - update: [Function], - delete: [Function], - fetch: [Function], - replace: [Function], - publish: [Function], - }, - { - stackHeaders: [Object], - urlPath: 'assets/dummyPath', - uid: 'dummyUid', - content_type: 'image/svg+xml', - file_size: '19743', - tags: [], - filename: 'HCA_Logo_White_RGB.svg', - url: 'https://images.contentstack.io/v3/assets/blt5ab3970669dfa578/blt8f1dc0e19bcba390/5f0f12a2b0b27d11516f7a0c/HCA_Logo_White_RGB.svg', - ACL: [Object], - is_dir: false, - _version: 1, - title: 'HCA_Logo_White_RGB.svg', - publish_details: [], - update: [Function], - delete: [Function], - fetch: [Function], - replace: [Function], - publish: [Function], - }, - { - stackHeaders: [Object], - urlPath: 'assets/dummyPath', - uid: 'dummyUid', - content_type: 'application/pdf', - file_size: '498523', - tags: [], - filename: 'capital_appreciation_fund_fact_sheet.pdf', - url: 'https://assets.contentstack.io/v3/assets/blt5ab3970669dfa578/blt151af7a22becd6ad/5f0f129c3a25531362dd682d/capital_appreciation_fund_fact_sheet.pdf', - ACL: [Object], - is_dir: false, - _version: 1, - title: 'capital_appreciation_fund_fact_sheet.pdf', - publish_details: [], - update: [Function], - delete: [Function], - fetch: [Function], - replace: [Function], - publish: [Function], - }, - { - stackHeaders: [Object], - urlPath: 'assets/dummyPath', - uid: 'dummyUid', - content_type: 'image/png', - file_size: '14267', - tags: [], - filename: 'spiros_segalas.png', - url: 'https://images.contentstack.io/v3/assets/blt5ab3970669dfa578/blt50783c73329c4a8f/5f0f1299ae7b536e32664186/spiros_segalas.png', - ACL: [Object], - is_dir: false, - parent_uid: 'blt83137794c5a8335b', - _version: 1, - title: 'spiros_segalas.png', - publish_details: [], - update: [Function], - delete: [Function], - fetch: [Function], - replace: [Function], - publish: [Function], - }, - { - stackHeaders: [Object], - urlPath: 'assets/dummyPath', - uid: 'dummyUid', - content_type: 'application/pdf', - file_size: '667698', - tags: [], - filename: 'Release_Notes.pdf', - url: 'https://assets.contentstack.io/v3/assets/blt5ab3970669dfa578/bltdede6d9491b4ec8d/5f0f1292ae7b536e32664182/Release_Notes.pdf', - ACL: [Object], - is_dir: false, - _version: 1, - title: 'Release_Notes.pdf', - publish_details: [], - update: [Function], - delete: [Function], - fetch: [Function], - replace: [Function], - publish: [Function], - }, - { - stackHeaders: [Object], - urlPath: 'assets/dummyPath', - uid: 'dummyUid', - content_type: 'application/pdf', - file_size: '667698', - tags: [], - filename: 'Release_Notes.pdf', - url: 'https://assets.contentstack.io/v3/assets/blt5ab3970669dfa578/bltcfbd7d07295b9673/5f0f12905dc1b81146a0c8e9/Release_Notes.pdf', - ACL: [Object], - is_dir: false, - parent_uid: 'blt76b1fc444e926aee', - _version: 1, - title: 'Release_Notes.pdf', - publish_details: [], - update: [Function], - delete: [Function], - fetch: [Function], - replace: [Function], - publish: [Function], - }, - { - stackHeaders: [Object], - urlPath: 'assets/dummyPath', - uid: 'dummyUid', - content_type: 'application/json', - file_size: '2351', - tags: [], - filename: 'fund_types.json', - url: 'https://assets.contentstack.io/v3/assets/blt5ab3970669dfa578/blt5e6f778da792c175/5f0f12874c7c031175481e77/fund_types.json', - ACL: [Object], - is_dir: false, - _version: 1, - title: 'fund_types.json', - publish_details: [], - update: [Function], - delete: [Function], - fetch: [Function], - replace: [Function], - publish: [Function], - }, - { - stackHeaders: [Object], - urlPath: 'assets/dummyPath', - uid: 'dummyUid', - content_type: 'image/png', - file_size: '36713', - tags: [], - filename: 'Video_HF_Intro_1_Thumb.png', - url: 'https://images.contentstack.io/v3/assets/blt5ab3970669dfa578/blta64151c9bdf01bb3/5f0f127df4522b327eb1cab3/Video_HF_Intro_1_Thumb.png', - ACL: [Object], - is_dir: false, - _version: 1, - title: 'Video_HF_Intro_1_Thumb.png', - publish_details: [], - update: [Function], - delete: [Function], - fetch: [Function], - replace: [Function], - publish: [Function], - }, - ], - count: 20, -}; diff --git a/packages/contentstack-import/test/mock/content-types.js b/packages/contentstack-import/test/mock/content-types.js deleted file mode 100644 index 9580d7a9eb..0000000000 --- a/packages/contentstack-import/test/mock/content-types.js +++ /dev/null @@ -1,93 +0,0 @@ -module.exports = { - items: [ - { - stackHeaders: [Object], - urlPath: '/content_types/MajorFields_2', - created_at: '2020-07-15T08:53:04.194Z', - updated_at: '2020-07-15T14:30:35.528Z', - title: 'MajorFields_2', - uid: 'MajorFields_2', - _version: 3, - inbuilt_class: false, - schema: [Array], - last_activity: {}, - maintain_revisions: true, - description: '', - DEFAULT_ACL: [Object], - SYS_ACL: [Object], - options: [Object], - abilities: [Object], - update: [Function], - delete: [Function], - fetch: [Function], - entry: [Function], - }, - { - stackHeaders: [Object], - urlPath: '/content_types/ex_check', - created_at: '2020-07-15T08:53:10.958Z', - updated_at: '2020-07-15T14:30:35.531Z', - title: 'ex_check', - uid: 'ex_check', - _version: 3, - inbuilt_class: false, - schema: [Array], - last_activity: {}, - maintain_revisions: true, - description: '', - DEFAULT_ACL: [Object], - SYS_ACL: [Object], - options: [Object], - abilities: [Object], - update: [Function], - delete: [Function], - fetch: [Function], - entry: [Function], - }, - { - stackHeaders: [Object], - urlPath: '/content_types/group_check', - created_at: '2020-07-15T08:53:08.951Z', - updated_at: '2020-07-15T14:30:40.448Z', - title: 'group_check', - uid: 'group_check', - _version: 3, - inbuilt_class: false, - schema: [Array], - last_activity: {}, - maintain_revisions: true, - description: '', - DEFAULT_ACL: [Object], - SYS_ACL: [Object], - options: [Object], - abilities: [Object], - update: [Function], - delete: [Function], - fetch: [Function], - entry: [Function], - }, - { - stackHeaders: [Object], - urlPath: '/content_types/superman', - created_at: '2020-07-15T08:53:06.858Z', - updated_at: '2020-07-15T14:30:40.458Z', - title: 'superman', - uid: 'superman', - _version: 3, - inbuilt_class: false, - schema: [Array], - last_activity: {}, - maintain_revisions: true, - description: '', - DEFAULT_ACL: [Object], - SYS_ACL: [Object], - options: [Object], - abilities: [Object], - update: [Function], - delete: [Function], - fetch: [Function], - entry: [Function], - }, - ], - count: 4, -}; diff --git a/packages/contentstack-import/test/mock/entries.js b/packages/contentstack-import/test/mock/entries.js deleted file mode 100644 index 8f1216afc7..0000000000 --- a/packages/contentstack-import/test/mock/entries.js +++ /dev/null @@ -1,29 +0,0 @@ -module.exports = { - items: [ - { - stackHeaders: [Object], - content_type_uid: 'uid', - urlPath: 'content_types/uid/entries/blta4fc59475cc1d203', - title: 'bsasxh', - url: '/shxjshxjks', - reference: [Array], - tags: [], - locale: 'en-us', - ACL: {}, - uid: 'blta4fc59475cc1d203', - created_by: 'bltcd82b2c6bf913241', - updated_by: 'bltcd82b2c6bf913241', - created_at: '2020-07-15T08:53:16.001Z', - updated_at: '2020-07-15T08:53:20.171Z', - _version: 2, - _in_progress: false, - publish_details: [], - update: [Function], - delete: [Function], - fetch: [Function], - publish: [Function], - export: [Function] - } - ], - count: 1 - } \ No newline at end of file diff --git a/packages/contentstack-import/test/mock/entryFetch.js b/packages/contentstack-import/test/mock/entryFetch.js deleted file mode 100644 index 75e6cf4c40..0000000000 --- a/packages/contentstack-import/test/mock/entryFetch.js +++ /dev/null @@ -1,24 +0,0 @@ -module.exports = { - stackHeaders: [Object], - content_type_uid: 'uid', - urlPath: 'content_types/uid/entries/blta4fc59475cc1d203', - title: 'bsasxh', - url: '/shxjshxjks', - reference: [Array], - tags: [], - locale: 'en-us', - ACL: {}, - uid: 'blta4fc59475cc1d203', - created_by: 'bltcd82b2c6bf913241', - updated_by: 'bltcd82b2c6bf913241', - created_at: '2020-07-15T08:53:16.001Z', - updated_at: '2020-07-15T08:53:20.171Z', - _version: 2, - _in_progress: false, - publish_details: [], - update: [Function], - delete: [Function], - fetch: [Function], - publish: [Function], - export: [Function] - } \ No newline at end of file diff --git a/packages/contentstack-import/test/mock/environment.js b/packages/contentstack-import/test/mock/environment.js deleted file mode 100644 index 617100774b..0000000000 --- a/packages/contentstack-import/test/mock/environment.js +++ /dev/null @@ -1,21 +0,0 @@ -module.exports = { - stackHeaders: { - api_key: 'dummyAPIKey', - authorization: 'dummyAuthorization' - }, - urlPath: '/environments/dummyuid', - deploy_content: false, - servers: [], - urls: [Array], - name: 'demo', - _version: 1, - uid: 'dummyuid', - created_by: 'dummyuid', - updated_by: 'dummyuid', - created_at: '2020-07-05T18:16:03.597Z', - updated_at: '2020-07-05T18:16:03.597Z', - ACL: [], - update: [Function], - delete: [Function], - fetch: [Function], - } \ No newline at end of file diff --git a/packages/contentstack-import/test/mock/extensions.js b/packages/contentstack-import/test/mock/extensions.js deleted file mode 100644 index b656292261..0000000000 --- a/packages/contentstack-import/test/mock/extensions.js +++ /dev/null @@ -1,24 +0,0 @@ -module.exports = { - stackHeaders: { - api_key: 'dummyAPIKey', - authorization: 'dummyAuthorization' - }, - urlPath: '/extensions/dummyuid', - uid: 'dummyuid', - created_at: '2020-07-30T12:39:17.588Z', - updated_at: '2020-07-30T12:39:17.588Z', - created_by: 'dummyuid', - updated_by: 'dummyuid', - tags: [], - ACL: {}, - _version: 1, - title: 'test', - config: {}, - type: 'field', - data_type: 'text', - multiple: false, - src: 'https://www.google.com/search?', - update: [Function], - delete: [Function], - fetch: [Function] - } \ No newline at end of file diff --git a/packages/contentstack-import/test/mock/fetchLocale.js b/packages/contentstack-import/test/mock/fetchLocale.js deleted file mode 100644 index 861918c01c..0000000000 --- a/packages/contentstack-import/test/mock/fetchLocale.js +++ /dev/null @@ -1,20 +0,0 @@ -module.exports = { - stackHeaders: { - api_key: 'dummyApi_key', - authorization: 'dummyUid', - }, - urlPath: '/locales/fr-fr', - code: 'fr-fr', - update: [Function], - delete: [Function], - fetch: [Function], - name: 'French - France', - uid: 'blt5419f58893fd437d', - created_by: 'blt2cc9b2fa3d4c0ba4', - updated_by: 'blt2cc9b2fa3d4c0ba4', - created_at: '2020-07-30T06:35:39.927Z', - updated_at: '2020-07-30T06:35:39.927Z', - fallback_locale: 'en-us', - ACL: {}, - _version: 1, -}; diff --git a/packages/contentstack-import/test/mock/globalFields.js b/packages/contentstack-import/test/mock/globalFields.js deleted file mode 100644 index b4c5f48fc6..0000000000 --- a/packages/contentstack-import/test/mock/globalFields.js +++ /dev/null @@ -1,81 +0,0 @@ -module.exports = { - stackHeaders: { - api_key: 'dummyAPIKey', - authorization: 'dummyAuthorization' - }, - urlPath: '/global_fields/address', - created_at: '2020-07-30T11:27:20.445Z', - updated_at: '2020-07-30T11:27:20.445Z', - title: 'Address', - uid: 'address', - _version: 1, - inbuilt_class: false, - schema: [ - { - data_type: 'text', - display_name: 'House Number', - uid: 'house_number', - field_metadata: [Object], - format: '', - error_messages: [Object], - multiple: false, - mandatory: false, - unique: false, - non_localizable: false - }, - { - data_type: 'text', - display_name: 'Apartment Name', - uid: 'apartment_name', - field_metadata: [Object], - format: '', - error_messages: [Object], - multiple: false, - mandatory: false, - unique: false, - non_localizable: false - }, - { - data_type: 'text', - display_name: 'Street Name', - uid: 'street_name', - field_metadata: [Object], - format: '', - error_messages: [Object], - multiple: false, - mandatory: false, - unique: false, - non_localizable: false - }, - { - data_type: 'text', - display_name: 'City', - uid: 'city', - field_metadata: [Object], - format: '', - error_messages: [Object], - multiple: false, - mandatory: false, - unique: false, - non_localizable: false - }, - { - data_type: 'text', - display_name: 'Postal Code', - uid: 'postal_code', - field_metadata: [Object], - format: '', - error_messages: [Object], - multiple: false, - mandatory: false, - unique: false, - non_localizable: false - } - ], - last_activity: {}, - maintain_revisions: true, - description: 'This contains address', - update: [Function], - delete: [Function], - fetch: [Function] - } \ No newline at end of file diff --git a/packages/contentstack-import/test/mock/locales.js b/packages/contentstack-import/test/mock/locales.js deleted file mode 100644 index 56e600a7f1..0000000000 --- a/packages/contentstack-import/test/mock/locales.js +++ /dev/null @@ -1,21 +0,0 @@ -module.exports = { - stackHeaders: { - api_key: '', - authorization: '' - }, - urlPath: '/locales/en-it', - code: 'en-it', - name: 'English - Italy', - uid: 'blt7ccba1bc80bd862e', - created_by: 'blt2cc9b2fa3d4c0ba4', - updated_by: 'blt2cc9b2fa3d4c0ba4', - created_at: '2020-07-29T19:07:13.261Z', - updated_at: '2020-07-29T19:07:13.261Z', - fallback_locale: 'en-us', - ACL: {}, - _version: 1, - isLanguage: true, - update: [Function], - delete: [Function], - fetch: [Function] -} \ No newline at end of file diff --git a/packages/contentstack-import/test/mock/webhook.js b/packages/contentstack-import/test/mock/webhook.js deleted file mode 100644 index a3dbf413f1..0000000000 --- a/packages/contentstack-import/test/mock/webhook.js +++ /dev/null @@ -1,25 +0,0 @@ -module.exports = { - items: [ - { - stackHeaders: undefined, - urlPath: '/webhooks/bltca2447dc1844cb88', - uid: 'bltca2447dc1844cb88', - channels: [Array], - disabled: false, - name: 'test', - destinations: [Array], - retry_policy: 'manual', - org_uid: 'blt2b4991176c6c1d25', - updated_by: 'bltcd82b2c6bf913241', - created_by: 'bltcd82b2c6bf913241', - created_at: '2020-07-20T10:42:26.317Z', - updated_at: '2020-07-20T10:42:26.317Z', - update: [Function], - delete: [Function], - fetch: [Function], - executions: [Function], - retry: [Function], - import: [Function] - } - ] - } \ No newline at end of file diff --git a/packages/contentstack-import/tsconfig.json b/packages/contentstack-import/tsconfig.json new file mode 100644 index 0000000000..679afbeaf5 --- /dev/null +++ b/packages/contentstack-import/tsconfig.json @@ -0,0 +1,30 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "declaration": true, + "importHelpers": true, + "module": "commonjs", + "outDir": "lib", + "strict": false, + "target": "es2017", + "allowJs": true, + "skipLibCheck": true, + "sourceMap": false, + "esModuleInterop": true, + "noImplicitAny": true, + "lib": [ + "es2019", + "es2020.promise", + ], + "strictPropertyInitialization": false, + "forceConsistentCasingInFileNames": true + }, + "include": [ + "src/**/*", + "types/*" + ], + "exclude": [ + "node_modules", + "lib" + ] +} \ No newline at end of file diff --git a/packages/contentstack-import/types/index.d.ts b/packages/contentstack-import/types/index.d.ts new file mode 100644 index 0000000000..68a9e13535 --- /dev/null +++ b/packages/contentstack-import/types/index.d.ts @@ -0,0 +1 @@ +declare module 'big-json'; diff --git a/packages/contentstack-launch/README.md b/packages/contentstack-launch/README.md index b5ae58eff7..02c7a6cc48 100755 --- a/packages/contentstack-launch/README.md +++ b/packages/contentstack-launch/README.md @@ -19,7 +19,7 @@ $ npm install -g @contentstack/cli-launch $ csdx COMMAND running command... $ csdx (--version|-v) -@contentstack/cli-launch/1.0.7 darwin-arm64 node-v18.16.0 +@contentstack/cli-launch/1.0.10 darwin-arm64 node-v20.3.1 $ csdx --help [COMMAND] USAGE $ csdx COMMAND diff --git a/packages/contentstack-launch/oclif.manifest.json b/packages/contentstack-launch/oclif.manifest.json index 2a368556ab..205659098b 100644 --- a/packages/contentstack-launch/oclif.manifest.json +++ b/packages/contentstack-launch/oclif.manifest.json @@ -1,5 +1,5 @@ { - "version": "1.0.7", + "version": "1.0.10", "commands": { "launch:base-command": { "id": "launch:base-command", diff --git a/packages/contentstack-launch/package.json b/packages/contentstack-launch/package.json index a05c3d5ff3..d4858f0546 100755 --- a/packages/contentstack-launch/package.json +++ b/packages/contentstack-launch/package.json @@ -1,6 +1,6 @@ { "name": "@contentstack/cli-launch", - "version": "1.0.7", + "version": "1.0.10", "description": "Launch related operations", "author": "Contentstack CLI", "bin": { @@ -18,11 +18,11 @@ ], "dependencies": { "@apollo/client": "^3.7.9", - "@contentstack/cli-command": "^1.2.9", - "@contentstack/cli-utilities": "^1.4.5", + "@contentstack/cli-command": "~1.2.11", + "@contentstack/cli-utilities": "~1.5.1", "@oclif/plugin-help": "^5", "@oclif/plugin-plugins": "^2.3.2", - "@oclif/core": "^2.8.2", + "@oclif/core": "^2.9.3", "@types/express": "^4.17.17", "@types/express-serve-static-core": "^4.17.34", "adm-zip": "^0.5.10", @@ -105,4 +105,4 @@ "launch:deployments": "LNCH-DPLMNT" } } -} \ No newline at end of file +} diff --git a/packages/contentstack-launch/src/adapters/file-upload.ts b/packages/contentstack-launch/src/adapters/file-upload.ts index dc6a4a9896..c8969b733c 100755 --- a/packages/contentstack-launch/src/adapters/file-upload.ts +++ b/packages/contentstack-launch/src/adapters/file-upload.ts @@ -4,24 +4,19 @@ import omit from 'lodash/omit'; import find from 'lodash/find'; import FormData from 'form-data'; import filter from 'lodash/filter'; -import { basename, join } from 'path'; import includes from 'lodash/includes'; +import { basename, resolve } from 'path'; import { cliux, ux } from '@contentstack/cli-utilities'; import { createReadStream, existsSync, PathLike, statSync } from 'fs'; import { print } from '../util'; import BaseClass from './base-class'; import { getFileList } from '../util/fs'; -import { AdapterConstructorInputs } from '../types'; import { createSignedUploadUrlMutation, importProjectMutation } from '../graphql'; export default class FileUpload extends BaseClass { private signedUploadUrlData!: Record; - constructor(options: AdapterConstructorInputs) { - super(options); - } - /** * @method run * @@ -181,7 +176,7 @@ export default class FileUpload extends BaseClass { */ fileValidation() { const basePath = this.config.projectBasePath; - const packageJsonPath = join(basePath, 'package.json'); + const packageJsonPath = resolve(basePath, 'package.json'); if (!existsSync(packageJsonPath)) { this.log('Package.json file not found.', 'info'); @@ -199,7 +194,7 @@ export default class FileUpload extends BaseClass { ux.action.start('Preparing zip file'); const projectName = basename(this.config.projectBasePath); const zipName = `${Date.now()}_${projectName}.zip`; - const zipPath = join(this.config.projectBasePath, zipName); + const zipPath = resolve(this.config.projectBasePath, zipName); const zip = new AdmZip(); const zipEntries = filter( await getFileList(this.config.projectBasePath, true, true), diff --git a/packages/contentstack-launch/src/adapters/github.ts b/packages/contentstack-launch/src/adapters/github.ts index 8db1b6823b..d140932e2f 100755 --- a/packages/contentstack-launch/src/adapters/github.ts +++ b/packages/contentstack-launch/src/adapters/github.ts @@ -1,5 +1,5 @@ -import { join } from "path"; import map from "lodash/map"; +import { resolve } from "path"; import omit from "lodash/omit"; import find from "lodash/find"; import split from "lodash/split"; @@ -10,7 +10,6 @@ import { cliux as ux } from "@contentstack/cli-utilities"; import { print } from "../util"; import BaseClass from "./base-class"; -import { AdapterConstructorInputs } from "../types"; import { getRemoteUrls } from "../util/create-git-meta"; import { repositoriesQuery, @@ -19,10 +18,6 @@ import { } from "../graphql"; export default class GitHub extends BaseClass { - constructor(options: AdapterConstructorInputs) { - super(options); - } - /** * @method run - initialization function * @@ -230,9 +225,7 @@ export default class GitHub extends BaseClass { * @memberof GitHub */ async checkGitRemoteAvailableAndValid(): Promise { - const localRemoteUrl = - (await getRemoteUrls(join(this.config.projectBasePath, ".git/config"))) - ?.origin || ""; + const localRemoteUrl = (await getRemoteUrls(resolve(this.config.projectBasePath, '.git/config')))?.origin || ''; if (!localRemoteUrl) { this.log("GitHub project not identified!", "error"); diff --git a/packages/contentstack-launch/src/adapters/pre-check.ts b/packages/contentstack-launch/src/adapters/pre-check.ts index c02409b568..bccb069ed2 100755 --- a/packages/contentstack-launch/src/adapters/pre-check.ts +++ b/packages/contentstack-launch/src/adapters/pre-check.ts @@ -1,5 +1,5 @@ -import { join } from "path"; import find from "lodash/find"; +import { resolve } from "path"; import { existsSync } from "fs"; import isEmpty from "lodash/isEmpty"; import includes from "lodash/includes"; @@ -7,15 +7,9 @@ import { cliux as ux } from "@contentstack/cli-utilities"; import BaseClass from "./base-class"; import { getRemoteUrls } from "../util"; -import { AdapterConstructorInputs } from "../types"; export default class PreCheck extends BaseClass { public projectBasePath: string = process.cwd(); - - constructor(options: AdapterConstructorInputs) { - super(options); - } - /** * @method run * @@ -140,7 +134,7 @@ export default class PreCheck extends BaseClass { */ async identifyWhatProjectItIs(): Promise { const localRemoteUrl = - (await getRemoteUrls(join(this.config.projectBasePath, ".git/config"))) + (await getRemoteUrls(resolve(this.config.projectBasePath, ".git/config"))) ?.origin || ""; switch (true) { @@ -149,9 +143,9 @@ export default class PreCheck extends BaseClass { this.log('Git project identified', 'info'); break; default: - if (existsSync(join(this.config.projectBasePath, '.git'))) { - this.log('Git config found but remote URL not found in the config!', { - color: 'yellow', + if (existsSync(resolve(this.config.projectBasePath, ".git"))) { + this.log("Git config found but remote URL not found in the config!", { + color: "yellow", bold: true, }); } diff --git a/packages/contentstack-launch/src/commands/launch/base-command.ts b/packages/contentstack-launch/src/commands/launch/base-command.ts index 6f9f8a56c3..b9c5875639 100755 --- a/packages/contentstack-launch/src/commands/launch/base-command.ts +++ b/packages/contentstack-launch/src/commands/launch/base-command.ts @@ -1,7 +1,7 @@ import keys from 'lodash/keys'; import { existsSync } from 'fs'; import EventEmitter from 'events'; -import { dirname, join } from 'path'; +import { dirname, resolve } from 'path'; import includes from 'lodash/includes'; import { ApolloClient } from '@apollo/client/core'; import { Command } from '@contentstack/cli-command'; @@ -69,7 +69,7 @@ export abstract class BaseCommand extends Command { this.$event = new EventEmitter(); await this.prepareConfig(); - this.initCmaSDK(); + await this.initCmaSDK(); // Init logger const logger = new Logger(this.sharedConfig); @@ -108,8 +108,8 @@ export abstract class BaseCommand extends Command { async prepareConfig(): Promise { let configPath = this.flags['data-dir'] || this.flags.config - ? this.flags.config || join(this.flags['data-dir'], config.configName) - : join(process.cwd(), config.configName); + ? this.flags.config || resolve(this.flags['data-dir'], config.configName) + : resolve(process.cwd(), config.configName); const baseUrl = (config.launchHubUrls as Record)[this.cmaAPIUrl]; this.sharedConfig = { ...require('../../config').default, diff --git a/packages/contentstack-launch/src/util/common-utility.ts b/packages/contentstack-launch/src/util/common-utility.ts index 134dbe33e2..08c4d18a40 100644 --- a/packages/contentstack-launch/src/util/common-utility.ts +++ b/packages/contentstack-launch/src/util/common-utility.ts @@ -2,7 +2,7 @@ import map from 'lodash/map'; import find from 'lodash/find'; import isEmpty from 'lodash/isEmpty'; import { ApolloClient } from '@apollo/client/core'; -import { cliux as ux, ContentstackClient, FlagInput } from '@contentstack/cli-utilities'; +import { cliux as ux, ContentstackClient, FlagInput, configHandler } from '@contentstack/cli-utilities'; import { projectsQuery } from '../graphql'; import { ConfigType, LogFn } from '../types'; @@ -18,20 +18,26 @@ async function getOrganizations( organizations: Record[] = [], ): Promise[]> { const { log, managementSdk } = options; - const response = await managementSdk - .organization() - .fetchAll({ limit: 100, asc: 'name', include_count: true, skip: skip }) - .catch((error) => { - log('Unable to fetch organizations.', 'warn'); - log(error, 'error'); - process.exit(1); - }); + const configOrgUid = configHandler.get('oauthOrgUid'); + + try { + if (configOrgUid) { + const response = await managementSdk.organization(configOrgUid).fetch(); + organizations.push(...[response]); + } else { + const response = await managementSdk + .organization() + .fetchAll({ limit: 100, asc: 'name', include_count: true, skip }); + organizations.push(...response.items); - if (response) { - organizations = organizations.concat(response.items as any); - if (organizations.length < response.count) { - organizations = await getOrganizations(options, skip + 100); + if (organizations.length < response.count) { + organizations = await getOrganizations(options, skip + 100, organizations); + } } + } catch (error) { + log('Unable to fetch organizations.', 'warn'); + log(error, 'error'); + process.exit(1); } return organizations; diff --git a/packages/contentstack-launch/src/util/log.ts b/packages/contentstack-launch/src/util/log.ts index 72c0f46df1..eded6c15f3 100755 --- a/packages/contentstack-launch/src/util/log.ts +++ b/packages/contentstack-launch/src/util/log.ts @@ -3,7 +3,7 @@ import winston from "winston"; import { existsSync } from "fs"; import chalk, { Chalk } from "chalk"; import replace from "lodash/replace"; -import { join, normalize } from "path"; +import { normalize, resolve } from "path"; import isObject from "lodash/isObject"; import { cliux as ux, PrintOptions } from '@contentstack/cli-utilities'; @@ -62,9 +62,10 @@ export default class Logger { } if (existsSync(this.config.projectBasePath)) { - const filename = normalize( - join(this.config.projectBasePath, "logs", `${logType}.log`) - ).replace(/^(\.\.(\/|\\|$))+/, ""); + const filename = normalize(resolve(this.config.projectBasePath, "logs", `${logType}.log`)).replace( + /^(\.\.(\/|\\|$))+/, + "", + ); const loggerOptions: winston.LoggerOptions = { transports: [ new winston.transports.File({ diff --git a/packages/contentstack-migrate-rte/README.md b/packages/contentstack-migrate-rte/README.md index 73c96f7943..77f51af25e 100644 --- a/packages/contentstack-migrate-rte/README.md +++ b/packages/contentstack-migrate-rte/README.md @@ -16,7 +16,7 @@ $ npm install -g @contentstack/cli-cm-migrate-rte $ csdx COMMAND running command... $ csdx (--version) -@contentstack/cli-cm-migrate-rte/1.4.8 darwin-arm64 node-v18.16.0 +@contentstack/cli-cm-migrate-rte/1.4.10 darwin-arm64 node-v20.3.1 $ csdx --help [COMMAND] USAGE $ csdx COMMAND diff --git a/packages/contentstack-migrate-rte/package.json b/packages/contentstack-migrate-rte/package.json index a2f778acbb..6420093053 100644 --- a/packages/contentstack-migrate-rte/package.json +++ b/packages/contentstack-migrate-rte/package.json @@ -1,13 +1,13 @@ { "name": "@contentstack/cli-cm-migrate-rte", "description": "Contentstack CLI plugin to migrate HTML RTE to JSON RTE", - "version": "1.4.8", + "version": "1.4.10", "author": "contentstack", "bugs": "https://github.com/contentstack/cli/issues", "dependencies": { - "@contentstack/cli-command": "^1.2.9", - "@contentstack/cli-utilities": "^1.4.5", - "@contentstack/json-rte-serializer": "^2.0.2", + "@contentstack/cli-command": "~1.2.11", + "@contentstack/cli-utilities": "~1.5.1", + "@contentstack/json-rte-serializer": "~2.0.2", "collapse-whitespace": "^1.1.7", "chalk": "^4.1.2", "jsdom": "^20.0.3", diff --git a/packages/contentstack-migration/README.md b/packages/contentstack-migration/README.md index 7bbad360af..23933f2703 100644 --- a/packages/contentstack-migration/README.md +++ b/packages/contentstack-migration/README.md @@ -21,7 +21,7 @@ $ npm install -g @contentstack/cli-migration $ csdx COMMAND running command... $ csdx (--version) -@contentstack/cli-migration/1.3.8 darwin-arm64 node-v18.16.0 +@contentstack/cli-migration/1.3.11 darwin-arm64 node-v20.3.1 $ csdx --help [COMMAND] USAGE $ csdx COMMAND diff --git a/packages/contentstack-migration/package.json b/packages/contentstack-migration/package.json index 4d6f4b3b16..606e4204b8 100644 --- a/packages/contentstack-migration/package.json +++ b/packages/contentstack-migration/package.json @@ -1,11 +1,11 @@ { "name": "@contentstack/cli-migration", - "version": "1.3.8", + "version": "1.3.11", "author": "@contentstack", "bugs": "https://github.com/contentstack/cli/issues", "dependencies": { - "@contentstack/cli-command": "^1.2.9", - "@contentstack/cli-utilities": "^1.4.5", + "@contentstack/cli-command": "~1.2.11", + "@contentstack/cli-utilities": "~1.5.1", "@oclif/command": "^1.8.16", "@oclif/config": "^1.18.3", "async": "^3.2.4", @@ -26,7 +26,6 @@ "jsdoc": "^4.0.0", "jsdoc-to-markdown": "^7.0.1", "mkdirp": "^1.0.4", - "mocha": "^10.0.0", "nock": "^13.1.1", "nyc": "^15.1.0", "oclif": "^3.8.1" diff --git a/packages/contentstack-migration/src/commands/cm/stacks/migration.js b/packages/contentstack-migration/src/commands/cm/stacks/migration.js index 0b7482817c..631245743c 100644 --- a/packages/contentstack-migration/src/commands/cm/stacks/migration.js +++ b/packages/contentstack-migration/src/commands/cm/stacks/migration.js @@ -160,7 +160,13 @@ class MigrationCommand extends Command { requests.splice(0, requests.length); } catch (error) { // errorHandler(null, null, null, error) - this.log(error); + if (error.message) { + this.log(error.message); + } else if (error.errorMessage) { + this.log(error.errorMessage); + }else{ + this.log(error) + } } } diff --git a/packages/contentstack-seed/README.md b/packages/contentstack-seed/README.md index a82db56bed..87c01dc7b9 100644 --- a/packages/contentstack-seed/README.md +++ b/packages/contentstack-seed/README.md @@ -22,6 +22,7 @@ USAGE $ csdx cm:stacks:seed [--repo ] [--org ] [-k ] [-n ] [-y ] [-s ] FLAGS + -a, --alias= Alias of the management token -k, --stack-api-key= Provide stack api key to seed content to -n, --stack-name= Name of a new stack that needs to be created. -o, --org= Provide Organization UID to create a new stack @@ -56,6 +57,7 @@ USAGE $ csdx cm:stacks:seed [--repo ] [--org ] [-k ] [-n ] [-y ] [-s ] FLAGS + -a, --alias= Alias of the management token -k, --stack-api-key= Provide stack api key to seed content to -n, --stack-name= Name of a new stack that needs to be created. -o, --org= Provide Organization UID to create a new stack diff --git a/packages/contentstack-seed/package.json b/packages/contentstack-seed/package.json index 4d6c0885fb..5a3af51d0b 100644 --- a/packages/contentstack-seed/package.json +++ b/packages/contentstack-seed/package.json @@ -1,13 +1,13 @@ { "name": "@contentstack/cli-cm-seed", "description": "create a Stack from existing content types, entries, assets, etc.", - "version": "1.4.11", + "version": "1.4.14", "author": "Contentstack", "bugs": "https://github.com/contentstack/cli/issues", "dependencies": { - "@contentstack/cli-cm-import": "^1.5.11", - "@contentstack/cli-command": "^1.2.9", - "@contentstack/cli-utilities": "^1.4.5", + "@contentstack/cli-cm-import": "~1.8.0", + "@contentstack/cli-command": "~1.2.11", + "@contentstack/cli-utilities": "~1.5.1", "axios": "1.3.4", "inquirer": "8.2.4", "mkdirp": "^1.0.4", @@ -41,6 +41,7 @@ "/npm-shrinkwrap.json", "/oclif.manifest.json" ], + "types": "./types/index.d.ts", "homepage": "https://github.com/contentstack/cli", "keywords": [ "contentstack", @@ -72,4 +73,4 @@ "version": "oclif readme && git add README.md", "clean": "rm -rf ./node_modules tsconfig.build.tsbuildinfo" } -} +} \ No newline at end of file diff --git a/packages/contentstack-seed/src/commands/cm/stacks/seed.ts b/packages/contentstack-seed/src/commands/cm/stacks/seed.ts index 0a85da215f..13da29d801 100644 --- a/packages/contentstack-seed/src/commands/cm/stacks/seed.ts +++ b/packages/contentstack-seed/src/commands/cm/stacks/seed.ts @@ -1,5 +1,12 @@ import { Command } from '@contentstack/cli-command'; -import { printFlagDeprecation, flags, isAuthenticated, FlagInput } from '@contentstack/cli-utilities'; +import { + printFlagDeprecation, + flags, + isAuthenticated, + FlagInput, + cliux, + configHandler, +} from '@contentstack/cli-utilities'; import ContentModelSeeder, { ContentModelSeederOptions } from '../../../seed'; export default class SeedCommand extends Command { @@ -67,6 +74,10 @@ export default class SeedCommand extends Command { exclusive: ['org', 'name'], parse: printFlagDeprecation(['s', 'stack'], ['-k', 'stack-api-key']), }), + alias: flags.string({ + char: 'a', + description: 'Alias of the management token', + }), }; static aliases = ['cm:seed']; @@ -74,14 +85,14 @@ export default class SeedCommand extends Command { async run() { try { const { flags: seedFlags } = await this.parse(SeedCommand); + const managementTokenAlias = seedFlags.alias; - if (!isAuthenticated()) { - this.error('You need to login, first. See: auth:login --help', { + if (!isAuthenticated() && !managementTokenAlias) { + this.error('You need to login or provide an alias for the management token. See: auth:login --help', { exit: 2, suggestions: ['https://www.contentstack.com/docs/developers/cli/authentication/'], }); } - const options: ContentModelSeederOptions = { parent: this, cdaHost: this.cdaHost, @@ -93,13 +104,26 @@ export default class SeedCommand extends Command { fetchLimit: seedFlags['fetch-limit'], skipStackConfirmation: seedFlags['yes'], isAuthenticated: isAuthenticated(), + alias: managementTokenAlias, }; + const listOfTokens = configHandler.get('tokens'); + + if (managementTokenAlias && listOfTokens[managementTokenAlias]) { + options.managementToken = listOfTokens[managementTokenAlias].token; + options.stackUid = listOfTokens[managementTokenAlias].apiKey; + } + const seeder = new ContentModelSeeder(options); const result = await seeder.run(); return result; } catch (error) { let errorObj: any = error; + if (errorObj.message !== undefined) { + cliux.loader(); + cliux.print(`Error: ${errorObj.message}`, { color: 'red' }); + this.exit(1); + } this.error(errorObj, { exit: 1, suggestions: errorObj.suggestions }); } } diff --git a/packages/contentstack-seed/src/seed/contentstack/client.ts b/packages/contentstack-seed/src/seed/contentstack/client.ts index 9f777410f5..178e8aa30f 100644 --- a/packages/contentstack-seed/src/seed/contentstack/client.ts +++ b/packages/contentstack-seed/src/seed/contentstack/client.ts @@ -1,6 +1,6 @@ import ContentstackError from './error'; -import { managementSDKClient } from '@contentstack/cli-utilities'; -import * as ContentstackManagementSDK from '@contentstack/management' +import { managementSDKClient, configHandler } from '@contentstack/cli-utilities'; +import * as ContentstackManagementSDK from '@contentstack/management'; export interface Organization { uid: string; @@ -29,14 +29,14 @@ export default class ContentstackClient { limit: number; constructor(cmaHost: string, limit: number) { - this.instance = managementSDKClient({host: cmaHost}) + this.instance = managementSDKClient({ host: cmaHost }); this.limit = limit || 100; } async getOrganization(org_uid: string): Promise { try { const client = await this.instance; - const response = await client.organization(org_uid).fetch() + const response = await client.organization(org_uid).fetch(); return { uid: response.uid, name: response.name, @@ -47,30 +47,44 @@ export default class ContentstackClient { } } - async getOrganizations(skip=0, organizations: Organization[]=[]): Promise { + async getOrganizations(skip = 0, organizations: Organization[] = []): Promise { try { const client = await this.instance; - const response = await client.organization().fetchAll({limit: this.limit, asc: 'name', include_count: true, skip: skip}) - organizations = organizations.concat(response.items.map((o: any) => { - return { - uid: o.uid, - name: o.name, - enabled: o.enabled, - }; - }) as Organization[]); - if (organizations.length < response.count) { - organizations = await this.getOrganizations(skip+this.limit) + const configOrgUid = configHandler.get('oauthOrgUid'); + + if (configOrgUid) { + const response = await client.organization(configOrgUid).fetch(); + const mappedOrganization = this.mapOrganization(response); + organizations.push(mappedOrganization); + } else { + const response = await client + .organization() + .fetchAll({ limit: this.limit, asc: 'name', include_count: true, skip }); + organizations.push(...response.items.map(this.mapOrganization)); + + if (organizations.length < response.count) { + organizations = await this.getOrganizations(skip + this.limit, organizations); + } } + return organizations; } catch (error) { throw this.buildError(error); } } + private mapOrganization(o: any): Organization { + return { + uid: o.uid, + name: o.name, + enabled: o.enabled, + }; + } + async getStack(stackUID: string): Promise { try { const client = await this.instance; - const response = await client.stack({api_key: stackUID}).fetch() + const response = await client.stack({ api_key: stackUID }).fetch(); return { uid: response.uid, name: response.name, @@ -83,29 +97,31 @@ export default class ContentstackClient { } } - async getStacks(org_uid: string, skip=0, stacks: Stack[]=[]): Promise { + async getStacks(org_uid: string, skip = 0, stacks: Stack[] = []): Promise { try { - const client = await this.instance + const client = await this.instance; const response = await client - .stack({ organization_uid: org_uid }) - .query({ - limit: this.limit, - include_count: true, - skip: skip, - query: {} - }) - .find() - stacks = stacks.concat(response.items.map((s: any) => { - return { - uid: s.uid, - name: s.name, - master_locale: s.master_locale, - api_key: s.api_key, - org_uid: s.org_uid, - }; - }) as Stack[]); + .stack({ organization_uid: org_uid }) + .query({ + limit: this.limit, + include_count: true, + skip: skip, + query: {}, + }) + .find(); + stacks = stacks.concat( + response.items.map((s: any) => { + return { + uid: s.uid, + name: s.name, + master_locale: s.master_locale, + api_key: s.api_key, + org_uid: s.org_uid, + }; + }) as Stack[], + ); if (stacks.length < response.count) { - stacks = await this.getStacks(org_uid, skip+this.limit, stacks) + stacks = await this.getStacks(org_uid, skip + this.limit, stacks); } return stacks; } catch (error) { @@ -113,10 +129,14 @@ export default class ContentstackClient { } } - async getContentTypeCount(api_key: string): Promise { + async getContentTypeCount(api_key: string, managementToken?: string): Promise { try { const client = await this.instance; - const response = await client.stack({api_key: api_key}).contentType().query({include_count: true}).find() + const response = await client + .stack({ api_key: api_key, management_token: managementToken }) + .contentType() + .query({ include_count: true }) + .find(); return response.count as number; } catch (error) { throw this.buildError(error); @@ -134,7 +154,7 @@ export default class ContentstackClient { }, }; - const response = await client.stack().create(body, {organization_uid: options.org_uid}) + const response = await client.stack().create(body, { organization_uid: options.org_uid }); return { uid: response.uid, api_key: response.api_key, @@ -148,8 +168,8 @@ export default class ContentstackClient { } private buildError(error: any) { - const message = error.response.data?.error_message || error.response.statusText; - const status = error.response.status; + const message = error.errorMessage || error.response.data?.errorMessage || error.response.statusText; + const status = error.status; return new ContentstackError(message, status); } } diff --git a/packages/contentstack-seed/src/seed/importer.ts b/packages/contentstack-seed/src/seed/importer.ts index 8c0a7f32de..daf507a901 100644 --- a/packages/contentstack-seed/src/seed/importer.ts +++ b/packages/contentstack-seed/src/seed/importer.ts @@ -1,5 +1,6 @@ import * as process from 'process'; import * as path from 'path'; +import ImportCommand from '@contentstack/cli-cm-import'; const STACK_FOLDER = 'stack'; @@ -10,15 +11,16 @@ export interface ImporterOptions { cmaHost: string; cdaHost: string; isAuthenticated: boolean; + alias?: string; } export async function run(options: ImporterOptions) { const importPath = path.resolve(options.tmpPath, STACK_FOLDER); - process.chdir(options.tmpPath); - - // moving here to fix jest testing bug - const { parametersWithAuthToken } = require('@contentstack/cli-cm-import/src/lib/util/import-flags'); + const args = options.alias + ? ['-k', options.api_key, '-d', importPath, '--alias', options.alias!] + : ['-k', options.api_key, '-d', importPath]; - await parametersWithAuthToken(options.api_key, importPath, '', options.cmaHost, '', {}); + process.chdir(options.tmpPath); + await ImportCommand.run(args); } diff --git a/packages/contentstack-seed/src/seed/index.ts b/packages/contentstack-seed/src/seed/index.ts index c33f8208ba..6d9a074baa 100644 --- a/packages/contentstack-seed/src/seed/index.ts +++ b/packages/contentstack-seed/src/seed/index.ts @@ -29,6 +29,8 @@ export interface ContentModelSeederOptions { fetchLimit: string | undefined; skipStackConfirmation: string | undefined; isAuthenticated: boolean | false; + managementToken?: string | undefined; + alias?: string | undefined; } export default class ContentModelSeeder { @@ -42,6 +44,7 @@ export default class ContentModelSeeder { private ghUsername: string = DEFAULT_OWNER; private ghRepo: string | undefined; + managementToken?: string | undefined; get ghPath(): string { return `${this.ghUsername}/${this.ghRepo}`; @@ -54,6 +57,7 @@ export default class ContentModelSeeder { this.ghUsername = gh.username || DEFAULT_OWNER; this.ghRepo = gh.repo; const limit = Number(this.options.fetchLimit); + this.managementToken = options.managementToken; this.csClient = new ContentstackClient(options.cmaHost, limit); this.ghClient = new GitHubClient(this.ghUsername, DEFAULT_STACK_PATTERN); @@ -78,7 +82,7 @@ export default class ContentModelSeeder { const tmpPath = await this.downloadRelease(); - cliux.print(`Importing into '${stackResponse.name}'.`); + cliux.print(`Importing into ${this.managementToken ? 'your stack' : `'${stackResponse.name}'`}.`); await importer.run({ api_key: api_key, @@ -87,6 +91,7 @@ export default class ContentModelSeeder { master_locale: ENGLISH_LOCALE, tmpPath: tmpPath, isAuthenticated: this.options.isAuthenticated, + alias: this.options.alias, }); return { api_key }; } @@ -113,14 +118,25 @@ export default class ContentModelSeeder { } if (repoExists === false) { - cliux.error(repoResponseData.status === 403 ? repoResponseData.statusMessage : `Could not find GitHub repository '${this.ghPath}'.`); + cliux.error( + repoResponseData.status === 403 + ? repoResponseData.statusMessage + : `Could not find GitHub repository '${this.ghPath}'.`, + ); if (this.parent) this.parent.exit(1); } else { let organizationResponse: Organization | undefined; let stackResponse: InquireStackResponse; - - if (this.options.stackUid) { - const stack: Stack = await this.csClient.getStack(this.options.stackUid); + let stack: Stack; + if (this.options.stackUid && this.options.managementToken) { + stackResponse = { + isNew: false, + name: 'your stack', + uid: this.options.stackUid, + api_key: this.options.stackUid, + }; + } else if (this.options.stackUid) { + stack = await this.csClient.getStack(this.options.stackUid); stackResponse = { isNew: false, name: stack.name, @@ -163,7 +179,8 @@ export default class ContentModelSeeder { } async shouldProceed(api_key: string) { - const count = await this.csClient.getContentTypeCount(api_key); + let count; + count = await this.csClient.getContentTypeCount(api_key, this.managementToken); if (count > 0 && this._options.skipStackConfirmation !== 'yes') { const proceed = await inquireProceed(); diff --git a/packages/contentstack-seed/types/index.d.ts b/packages/contentstack-seed/types/index.d.ts new file mode 100644 index 0000000000..70730759d7 --- /dev/null +++ b/packages/contentstack-seed/types/index.d.ts @@ -0,0 +1 @@ +declare module '@contentstack/cli-cm-import'; diff --git a/packages/contentstack-utilities/package.json b/packages/contentstack-utilities/package.json index 0b7c9e53a4..8b71070971 100644 --- a/packages/contentstack-utilities/package.json +++ b/packages/contentstack-utilities/package.json @@ -1,6 +1,6 @@ { "name": "@contentstack/cli-utilities", - "version": "1.4.5", + "version": "1.5.1", "description": "Utilities for contentstack projects", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -32,8 +32,8 @@ "author": "contentstack", "license": "MIT", "dependencies": { - "@contentstack/management": "^1.8.0", - "@oclif/core": "^2.8.2", + "@contentstack/management": "~1.10.0", + "@oclif/core": "^2.9.3", "axios": "1.3.4", "chalk": "^4.0.0", "cli-cursor": "^3.1.0", @@ -44,6 +44,7 @@ "inquirer": "8.2.4", "inquirer-search-checkbox": "^1.0.0", "inquirer-search-list": "^1.2.6", + "mkdirp": "^1.0.4", "lodash": "^4.17.15", "open": "^8.4.2", "ora": "^5.4.0", @@ -77,4 +78,4 @@ "tslib": "^1.13.0", "typescript": "^4.9.3" } -} \ No newline at end of file +} diff --git a/packages/contentstack-utilities/src/cli-ux.ts b/packages/contentstack-utilities/src/cli-ux.ts index bb4307f070..8cabfe16d3 100644 --- a/packages/contentstack-utilities/src/cli-ux.ts +++ b/packages/contentstack-utilities/src/cli-ux.ts @@ -102,5 +102,4 @@ class CLIInterface { } export default new CLIInterface(); - export { Flags, Args, Command }; diff --git a/packages/contentstack-utilities/src/contentstack-management-sdk.ts b/packages/contentstack-utilities/src/contentstack-management-sdk.ts index 69f4e28f4c..e26c92c036 100644 --- a/packages/contentstack-utilities/src/contentstack-management-sdk.ts +++ b/packages/contentstack-utilities/src/contentstack-management-sdk.ts @@ -38,6 +38,7 @@ class ManagementSDKInitiator { case 429: case 408: return true; + default: return false; } diff --git a/packages/contentstack-utilities/src/fs-utility/core.ts b/packages/contentstack-utilities/src/fs-utility/core.ts new file mode 100644 index 0000000000..13d796d77d --- /dev/null +++ b/packages/contentstack-utilities/src/fs-utility/core.ts @@ -0,0 +1,463 @@ +import mkdirp from 'mkdirp'; +import keys from 'lodash/keys'; +import { v4 as uidV4 } from 'uuid'; +import isEmpty from 'lodash/isEmpty'; +import { resolve as pResolve } from 'node:path'; +import { + statSync, + mkdirSync, + existsSync, + unlinkSync, + readdirSync, + WriteStream, + readFileSync, + writeFileSync, + createWriteStream, +} from 'node:fs'; + +import { getMetaData, mapKeyAndVal } from './helper'; +import { Chunk, PageInfo, FileType, WriteFileOptions, FsConstructorOptions, ChunkFilesGetterType } from './types'; + +export default class FsUtility { + private prefixKey = ''; + private basePath: string; + private fileExt: FileType; + private moduleName: string; + private currentFileName = ''; + private keepMetadata = false; + private indexFileName: string; + private chunkFileSize: number; + private omitKeys: Array; + private defaultInitContent: string; + private metaPickKeys: Array; + private currentFileRelativePath: string; + private writableStream: WriteStream | null; + private metaData: Record = {}; + private readIndexer: Record = {}; + private writeIndexer: Record = {}; + private metaHandler: ((array: any) => any) | undefined; + + public pageInfo: PageInfo = { + after: 0, + before: 0, + hasNextPage: false, + hasPreviousPage: false, + pageInfoUpdated: false, + }; + + constructor(options: FsConstructorOptions = {}) { + const { + fileExt, + omitKeys, + basePath, + moduleName, + metaHandler, + keepMetadata, + metaPickKeys, + chunkFileSize, + indexFileName, + defaultInitContent, + createDirIfNotExist = true, + } = options; + this.metaHandler = metaHandler; + this.basePath = basePath || ''; + this.omitKeys = omitKeys || []; + this.fileExt = fileExt || 'json'; + this.metaPickKeys = metaPickKeys || []; + this.moduleName = moduleName || 'chunk'; + this.chunkFileSize = chunkFileSize || 10; + this.keepMetadata = keepMetadata || (keepMetadata === undefined ?? true); + this.indexFileName = indexFileName || 'index.json'; + this.pageInfo.hasNextPage = keys(this.indexFileContent).length > 0; + this.defaultInitContent = defaultInitContent || (this.fileExt === 'json' ? '{' : ''); + + if (createDirIfNotExist) { + this.createFolderIfNotExist(this.basePath); + } + } + + get isNewFsStructure(): boolean { + return existsSync(`${this.basePath}/metadata.json`) && existsSync(`${this.basePath}/files`); + } + + get isIndexFileExist(): boolean { + return existsSync(`${this.basePath}/${this.indexFileName}`); + } + + get currentPageDetails(): PageInfo { + return this.pageInfo; + } + + get indexFileContent(): Record { + let indexData = {}; + const indexPath = `${this.basePath}/${this.indexFileName}`; + + if (existsSync(indexPath)) { + indexData = JSON.parse(readFileSync(indexPath, 'utf-8')); + } + + return indexData; + } + + /** + * @method readChunkFiles + * @returns Object + */ + get readChunkFiles(): { + next: () => ChunkFilesGetterType; + previous: () => ChunkFilesGetterType; + get: (index: number) => ChunkFilesGetterType; + } { + return { + next: this.next.bind(this), + previous: this.previous.bind(this), + get: this.getFileByIndex.bind(this), + }; + } + + // STUB old utility methods + /** + * @method readFile + * @param filePath string + * @param parse boolean | undefined + * @returns string | undefined + */ + readFile( + filePath: string, + parse: boolean | undefined = undefined, + ): string | Record | Record[] | undefined { + let data; + filePath = pResolve(filePath); + parse = typeof parse === 'undefined' ? true : parse; + + if (existsSync(filePath)) { + data = parse ? JSON.parse(readFileSync(filePath, 'utf-8')) : data; + } + + return data; + } + + /** + * @method writeFile + * @param filePath string + * @param data Object | undefined + * @return void + */ + writeFile(filePath: string, data: Chunk, mapKeyVal: boolean = false): void { + if (mapKeyVal) { + data = mapKeyAndVal(data as Record[], 'uid', this.omitKeys); // NOTE Map values as Key/value pair object + } + + data = typeof data === 'object' ? JSON.stringify(data) : data || '{}'; + writeFileSync(filePath, data); + } + + /** + * @method makeDirectory + * @param path string + * @return Promise + */ + makeDirectory(path: string): Promise { + return mkdirp(path); + } + + /** + * @method readdir + * @param dirPath string | Buffer | URL + * @returns [string] + */ + readdir(dirPath: string | Buffer | URL): string[] | [] { + return existsSync(dirPath) ? readdirSync(dirPath) : []; + } + // STUB End of old utility + + /** + * @method createFolderIfNotExist + * @param path string + * @return {void} + */ + createFolderIfNotExist(path: string): void { + if (path && !existsSync(path)) { + mkdirSync(path, { recursive: true }); + } + } + + /** + * @method writeIntoFile + * @param {String|Object|Array} chunk Record[] + * @param {WriteFileOptions} options WriteFileOptions + * @return void + */ + writeIntoFile(chunk: Record[], options?: WriteFileOptions): void { + if (!this.writableStream) { + this.createNewFile(); + } + + this.writeIntoExistingFile(chunk, options); + } + + /** + * @method createNewFile + * @return {void} + * @description creating new chunk file + */ + protected createNewFile(): void { + const fileName = `${uidV4()}-${this.moduleName || 'chunk'}.${this.fileExt}`; + this.currentFileName = fileName; + this.writeIndexer[keys(this.writeIndexer).length + 1] = fileName; + this.currentFileRelativePath = `${this.basePath}/${fileName}`; + writeFileSync(this.currentFileRelativePath, this.defaultInitContent); + this.writableStream = createWriteStream(this.currentFileRelativePath, { + flags: 'a', + }); + } + + /** + * @method writeIntoExistingFile + * @param chunk Record[] | object | Array | string; + * @param options WriteFileOptions + * @returns void + */ + protected writeIntoExistingFile(chunk: Chunk, options?: WriteFileOptions): void { + let fileContent: Chunk = chunk; + let fileSizeReachedLimit = false; + const { keyName, mapKeyVal } = options || { + keyName: 'uid', + mapKeyVal: false, + }; + + if (mapKeyVal) { + fileContent = this.handleKeyValMapAndMetaData(chunk, keyName); // NOTE Map values as Key/value pair object + } + + if (typeof fileContent === 'object') { + fileContent = JSON.stringify(fileContent).slice(1, -1); + } + + const { size } = statSync(this.currentFileRelativePath); + + if (options?.closeFile === true || size / (1024 * 1024) >= this.chunkFileSize) { + // NOTE Each chunk file size Ex. 5 (MB) + fileSizeReachedLimit = true; + } + + const suffix = fileSizeReachedLimit ? '}' : ''; + fileContent = this.fileExt === 'json' ? `${this.prefixKey}${fileContent}${suffix}` : fileContent; + this.writableStream?.write(fileContent); + + if (!this.prefixKey) this.prefixKey = ','; + if (fileSizeReachedLimit) { + this.closeFile(options?.closeFile === true); + } + } + + /** + * @method handleKeyValMapAndMetaData + * @param chunk Chunk + * @param keyName string + * @returns Chunk + */ + handleKeyValMapAndMetaData(chunk: Chunk, keyName?: string | string[] | undefined): Chunk { + const fileContent = mapKeyAndVal(chunk as Record[], keyName || 'uid', this.omitKeys); // NOTE Map values as Key/value pair object + + // NOTE update metadata + if (this.keepMetadata) { + const metadata = getMetaData(chunk as Record[], this.metaPickKeys, this.metaHandler); + + if (metadata && !isEmpty(metadata)) { + if (isEmpty(this.metaData[this.currentFileName])) this.metaData[this.currentFileName] = []; + + this.metaData[this.currentFileName].push(...metadata); + } + } + + return fileContent; + } + + /** + * @method completeFile + * @param closeIndexer boolean + * @return {void} + * @description writing chunks into existing file + */ + completeFile(closeIndexer?: boolean): void { + if (this.writableStream) { + if (this.fileExt === 'json') { + this.writableStream.write('}'); + } + this.closeFile(closeIndexer); + } + } + + /** + * @method closeFile + * @param closeIndexer boolean + * @return {void} + * @description closing current write stream + */ + protected closeFile(closeIndexer = true): void { + if (closeIndexer) { + // NOTE write file index details into a file + writeFileSync(`${this.basePath}/${this.indexFileName}`, JSON.stringify(this.writeIndexer)); + + // NOTE write metadata into a file + if (this.keepMetadata) { + writeFileSync(`${this.basePath}/metadata.json`, JSON.stringify(this.metaData)); + } + } + + if (this.writableStream instanceof WriteStream) { + this.writableStream.end(); + this.prefixKey = ''; + this.writableStream = null; + } + } + + saveMeta(meta: Chunk): void { + writeFileSync(`${this.basePath}/metadata.json`, JSON.stringify(meta)); + } + + getPlainMeta(basePath?: string): Record { + const path = basePath || pResolve(this.basePath, 'metadata.json'); + if (!existsSync(path)) return {}; + + return JSON.parse(readFileSync(path, { encoding: 'utf-8' })); + } + + /** + * @method getFileByIndex + * @param _self FsUtility + * @param index number + * @returns Promise + */ + protected getFileByIndex(index = 1): Promise | Record[]> { + return new Promise((resolve, reject) => { + if (index <= 0) { + reject(new Error('Invalid index')); + return; + } + + this.updatePageInfo(null, index); + + if (isEmpty(this.readIndexer[index])) { + reject(new Error('File not found!')); + return; + } + + const fileContent = readFileSync(pResolve(this.basePath, this.readIndexer[index]), { + encoding: 'utf-8', + }); + + resolve(this.fileExt === 'json' ? JSON.parse(fileContent) : fileContent); + }); + } + + /** + * @method next + * @returns Promise + */ + protected next(): Promise | Record[]> { + return new Promise((resolve, reject) => { + this.updatePageInfo(true); + + if (isEmpty(this.readIndexer[this.pageInfo.after])) { + reject(new Error('File not found!')); + return; + } + + const fileContent = readFileSync(pResolve(this.basePath, this.readIndexer[this.pageInfo.after]), { + encoding: 'utf-8', + }); + + resolve(this.fileExt === 'json' ? JSON.parse(fileContent) : fileContent); + }); + } + + /** + * @method previous + * @param _self FsUtility + * @returns Promise + */ + protected previous(): Promise | Record[] | Error> { + return new Promise((resolve, reject) => { + this.updatePageInfo(false); + + if (isEmpty(this.readIndexer[this.pageInfo.before])) { + reject(new Error('File not found')); + return; + } + + const fileContent = readFileSync(pResolve(this.basePath, this.readIndexer[this.pageInfo.before]), { + encoding: 'utf-8', + }); + + resolve(this.fileExt === 'json' ? JSON.parse(fileContent) : fileContent); + }); + } + + /** + * @method updatePageInfo + * @param _self FsUtility + * @param isNext boolean + * @param index number + * @returns void + */ + updatePageInfo(isNext: boolean | null = true, index: number | null = null): void { + if (!this.pageInfo.pageInfoUpdated) { + this.readIndexer = this.indexFileContent; + this.pageInfo.pageInfoUpdated = true; + } + + const { after, before } = this.pageInfo; + + if (isNext === true) { + this.pageInfo.before = 1; + this.pageInfo.after = after + 1; + } else if (isNext === false) { + this.pageInfo.after = 0; + this.pageInfo.before = before - 1; + } else { + this.pageInfo.after = index || 0; + this.pageInfo.before = 1; + } + + /* eslint-disable unicorn/consistent-destructuring */ + if (!isEmpty(this.readIndexer[this.pageInfo.after + 1])) { + this.pageInfo.hasNextPage = true; + } + + /* eslint-disable unicorn/consistent-destructuring */ + if (!isEmpty(this.readIndexer[this.pageInfo.after - 1])) { + this.pageInfo.hasPreviousPage = true; + } + } + + removeFile(path: string): void { + if (existsSync(path)) unlinkSync(path); + } +} + +export function getDirectories(source: string): string[] | [] { + if (!existsSync(source)) return []; + return readdirSync(source, { withFileTypes: true }) + .filter((dirent) => dirent.isDirectory()) + .map((dirent) => dirent.name); +} + +export async function getFileList(dirName: string, onlyName = true): Promise { + if (!existsSync(dirName)) return []; + + let files: any = []; + const items = readdirSync(dirName, { withFileTypes: true }); + + for (const item of items) { + if (item.isDirectory()) { + /* eslint-disable no-await-in-loop */ + files = [...files, ...(await getFileList(`${dirName}/${item.name}`))]; + } else { + files.push(onlyName ? item.name : `${dirName}/${item.name}`); + } + } + + return files; +} diff --git a/packages/contentstack-utilities/src/fs-utility/helper.ts b/packages/contentstack-utilities/src/fs-utility/helper.ts new file mode 100644 index 0000000000..30fb1667fc --- /dev/null +++ b/packages/contentstack-utilities/src/fs-utility/helper.ts @@ -0,0 +1,43 @@ +import map from "lodash/map"; +import omit from "lodash/omit"; +import pick from "lodash/pick"; +import assign from "lodash/assign"; +import isEmpty from "lodash/isEmpty"; +import forEach from "lodash/forEach"; + +function getKeysFromArray(keys: string[], obj: any): string { + let keyName = ""; + forEach(keys, (key: string) => { + keyName += keyName ? `_${obj[key]}` : obj[key]; + }); + + return keyName; +} + +function mapKeyAndVal( + array: Array>, + keyName: string | string[], + omitKeys: Array = [] +): Record { + return assign( + {}, + ...map(array, (row) => { + if (Array.isArray(keyName)) + return { [getKeysFromArray(keyName, row)]: omit(row, omitKeys) }; + return { [row[keyName]]: omit(row, omitKeys) }; + }) + ); +} + +function getMetaData( + array: Array>, + pickKeys: Array, + handler?: (array: Array>) => void +): Array> | undefined { + if (handler instanceof Function) handler(array); + if (isEmpty(array) || isEmpty(pickKeys)) return; + + return map(array, (row: any) => pick(row, pickKeys)); +} + +export { mapKeyAndVal, getMetaData }; diff --git a/packages/contentstack-utilities/src/fs-utility/index.ts b/packages/contentstack-utilities/src/fs-utility/index.ts new file mode 100644 index 0000000000..aa540b1ba9 --- /dev/null +++ b/packages/contentstack-utilities/src/fs-utility/index.ts @@ -0,0 +1,5 @@ +import FsUtility, { getDirectories, getFileList } from './core'; + +export * from './types'; +export { mapKeyAndVal } from './helper'; +export { FsUtility, getDirectories, getFileList }; diff --git a/packages/contentstack-utilities/src/fs-utility/types.ts b/packages/contentstack-utilities/src/fs-utility/types.ts new file mode 100644 index 0000000000..5525fc998e --- /dev/null +++ b/packages/contentstack-utilities/src/fs-utility/types.ts @@ -0,0 +1,81 @@ +type FileType = "json" | "txt"; + +type Chunk = + | Record[] + | Record + | Array + | string; + +type PageInfo = { + after: number; + before: number; + hasNextPage: boolean; + hasPreviousPage: boolean; + pageInfoUpdated?: boolean; +}; + +type WriteFileOptions = { + keyName?: string | string[]; + closeFile?: boolean; + mapKeyVal?: boolean; + closeIndexer?: boolean; +}; + +type FsConstructorOptions = { + createDirIfNotExist?: boolean; + /** + * basePath is used to pass base paths of an content to be written to + * + * Example: ```./contents/data``` + */ + basePath?: string; + /** + * chunk file extension + * + * Ex: ```fileExt: 'json' | 'txt'``` + */ + fileExt?: FileType; + /** + * Name of the module data which is going to be written to drive + * + * Ex: ```moduleName: 'assets' | 'entries' | 'content-type'``` + */ + moduleName?: string; + /** + * Name of the index manager file name. Which will have all chunk file details + * + * ```defaultValue: index.json``` + * + * Ex: ```indexFileName: 'assets.json' | 'index.json'``` + */ + indexFileName?: string; + /** + * Chunk file size in megabytes + * + * ```chunkFileSize: 5``` => 5Mb + */ + chunkFileSize?: number; + omitKeys?: Array; + /** + * on initialization if any content needs to be put in the file which can be passed through this key + * + * Ex: ```defaultInitContent: '{ title: "test" }'``` + */ + defaultInitContent?: string; + /** + * metaPickKeys is to pik list of key to keep like an index key of entity + * + * Ex. ```['title'] | handler: () => {}``` + * + * Result will be in metadata file: ```{ title: ['title1', 'title2'], versionedAssets: [{ 89987iu89434: 4 }] }``` + */ + metaPickKeys?: Array; + + keepMetadata?: boolean; + + metaHandler?: (array: any) => any; +}; + +type ChunkFilesGetterType = Promise | Record[] | Error>; + +export { Chunk, FileType, PageInfo, WriteFileOptions, FsConstructorOptions, ChunkFilesGetterType }; diff --git a/packages/contentstack-utilities/src/index.ts b/packages/contentstack-utilities/src/index.ts index d7030acb73..c67dd71941 100644 --- a/packages/contentstack-utilities/src/index.ts +++ b/packages/contentstack-utilities/src/index.ts @@ -12,6 +12,7 @@ export { } from './contentstack-management-sdk'; export { default as printFlagDeprecation } from './flag-deprecation-check'; export * from './http-client'; +export * from './fs-utility'; export { default as NodeCrypto } from './encrypter'; export { Args as args, Flags as flags, Command } from './cli-ux'; export * from './helpers'; diff --git a/packages/contentstack-utilities/src/interfaces/index.ts b/packages/contentstack-utilities/src/interfaces/index.ts index e0b657d2ff..8a2405fb5e 100644 --- a/packages/contentstack-utilities/src/interfaces/index.ts +++ b/packages/contentstack-utilities/src/interfaces/index.ts @@ -1,4 +1,4 @@ -import { IPromptOptions } from "@oclif/core/lib/cli-ux"; +import { IPromptOptions } from '@oclif/core/lib/cli-ux'; export interface PrintOptions { bold?: boolean; @@ -31,33 +31,33 @@ export interface Token { } export interface Organization { - uid: string, - name: string, + uid: string; + name: string; } export interface selectedOrganization { - orgUid: string, - orgName: string, + orgUid: string; + orgName: string; } export interface Stack { - name: string, - api_key: string, + name: string; + api_key: string; } export interface ContentType { - uid: string, - title: string, + uid: string; + title: string; } export interface Environment { - name: string, - uid: string, + name: string; + uid: string; } export interface Entry { - uid: string, - title: string, + uid: string; + title: string; } export interface Locale { @@ -65,4 +65,4 @@ export interface Locale { code: string; } -export interface CliUXPromptOptions extends IPromptOptions {} \ No newline at end of file +export interface CliUXPromptOptions extends IPromptOptions {} diff --git a/packages/contentstack/README.md b/packages/contentstack/README.md index 402dcf6663..71f2806b2b 100644 --- a/packages/contentstack/README.md +++ b/packages/contentstack/README.md @@ -18,7 +18,7 @@ $ npm install -g @contentstack/cli $ csdx COMMAND running command... $ csdx (--version|-v) -@contentstack/cli/1.7.8 darwin-x64 node-v18.16.0 +@contentstack/cli/1.8.2 darwin-arm64 node-v20.3.1 $ csdx --help [COMMAND] USAGE $ csdx COMMAND @@ -301,6 +301,7 @@ FLAGS -a, --alias= Alias(name) for the management token -c, --config= Path to the config file -e, --environments=... Environments where assets will be published + -k, --stack-api-key= Stack api key to be used -l, --locales=... Locales to where assets will be published -y, --yes Agree to process the command with the current configuration --api-version= API Version to be used. Values [Default: 3, Nested Reference Publishing: 3.2]. @@ -355,6 +356,12 @@ EXAMPLES Using --source-env $ csdx cm:assets:publish --environments [ENVIRONMENT 1] [ENVIRONMENT 2] --locales [LOCALE] --alias [MANAGEMENT TOKEN ALIAS] --source-env [SOURCE ENVIRONMENT] --delivery-token [DELIVERY TOKEN] + + + + Using --stack-api-key flag + + $ csdx cm:assets:publish --environments [ENVIRONMENT 1] [ENVIRONMENT 2] --locales [LOCALE] --stack-api-key [STACK API KEY] ``` _See code: [@contentstack/cli-cm-bulk-publish](https://github.com/contentstack/cli/blob/main/packages/contentstack-bulk-publish/src/commands/cm/assets/publish.js)_ @@ -365,22 +372,23 @@ Unpublish assets from given environment ``` USAGE - $ csdx cm:assets:unpublish [-a ] [-e ] [-c ] [-y] [--locale ] [--branch ] - [--retry-failed ] [--bulk-unpublish ] [--api-version ] [--delivery-token ] + $ csdx cm:assets:unpublish [-a ] [-k ] [-e ] [-c ] [-y] [--locale ] [--branch + ] [--retry-failed ] [--bulk-unpublish ] [--api-version ] [--delivery-token ] FLAGS - -a, --alias= Alias(name) for the management token - -c, --config= Path to the config file - -e, --environment= Source Environment - -y, --yes Agree to process the command with the current configuration - --api-version= API Version to be used. Values [Default: 3, Nested Reference Publishing: 3.2]. - --branch= [default: main] Specify the branch to fetch the content (by default the main branch is - selected) - --bulk-unpublish= [default: true] By default this flag is set as true. It indicates that contentstack's - bulkpublish API will be used to unpublish the assets - --delivery-token= Delivery Token for source environment - --locale= Locale filter - --retry-failed= Retry unpublishing failed assets from the logfile + -a, --alias= Alias(name) for the management token + -c, --config= Path to the config file + -e, --environment= Source Environment + -k, --stack-api-key= Stack api key to be used + -y, --yes Agree to process the command with the current configuration + --api-version= API Version to be used. Values [Default: 3, Nested Reference Publishing: 3.2]. + --branch= [default: main] Specify the branch to fetch the content (by default the main branch is + selected) + --bulk-unpublish= [default: true] By default this flag is set as true. It indicates that contentstack's + bulkpublish API will be used to unpublish the assets + --delivery-token= Delivery Token for source environment + --locale= Locale filter + --retry-failed= Retry unpublishing failed assets from the logfile DESCRIPTION Unpublish assets from given environment @@ -415,6 +423,12 @@ EXAMPLES Using --branch flag $ csdx cm:assets:unpublish --bulk-unpublish --environment [SOURCE ENV] --locale [LOCALE] --alias [MANAGEMENT TOKEN ALIAS] --delivery-token [DELIVERY TOKEN] --branch [BRANCH NAME] + + + + Using --stack-api-key flag + + $ csdx cm:assets:unpublish --bulk-unpublish --environment [SOURCE ENV] --locale [LOCALE] --stack-api-key [STACK API KEY] --delivery-token [DELIVERY TOKEN] ``` _See code: [@contentstack/cli-cm-bulk-publish](https://github.com/contentstack/cli/blob/main/packages/contentstack-bulk-publish/src/commands/cm/assets/unpublish.js)_ @@ -426,9 +440,10 @@ Bootstrap contentstack apps ``` USAGE $ csdx cm:bootstrap [--app-name ] [--project-dir ] [-k | --org | -n ] [-y - ] + ] [-a ] FLAGS + -a, --alias= Alias of the management token -k, --stack-api-key= Provide stack API key to seed content -n, --stack-name= Name of a new stack that will be created. -y, --yes= [Optional] Skip stack confirmation @@ -653,6 +668,7 @@ FLAGS -a, --alias= Alias(name) for the management token -c, --config= Path to the config file -e, --environments=... Environments where entries will be published + -k, --stack-api-key= Stack api key to be used -l, --locales=... Locales where entries will be published -t, --contentTypes=... The Contenttypes from which entries will be published -y, --yes Agree to process the command with the current configuration @@ -678,7 +694,7 @@ ALIASES EXAMPLES General Usage - $ csdx cm:entries:update-and-publish --content-types [CONTENT TYPE 1] [CONTENT TYPE 2] -e [ENVIRONMENT 1] [ENVIRONMENT 2] --locale [LOCALE 1] [LOCALE 2] -a [MANAGEMENT TOKEN ALIAS] + $ csdx cm:entries:update-and-publish --content-types [CONTENT TYPE 1] [CONTENT TYPE 2] -e [ENVIRONMENT 1] [ENVIRONMENT 2] --locales [LOCALE 1] [LOCALE 2] -a [MANAGEMENT TOKEN ALIAS] @@ -700,7 +716,13 @@ EXAMPLES Using --branch - $ csdx cm:entries:update-and-publish --content-types [CONTENT TYPE 1] [CONTENT TYPE 2] -e [ENVIRONMENT 1] [ENVIRONMENT 2] --locale [LOCALE 1] [LOCALE 2] -a [MANAGEMENT TOKEN ALIAS] --branch [BRANCH NAME] + $ csdx cm:entries:update-and-publish --content-types [CONTENT TYPE 1] [CONTENT TYPE 2] -e [ENVIRONMENT 1] [ENVIRONMENT 2] --locales [LOCALE 1] [LOCALE 2] -a [MANAGEMENT TOKEN ALIAS] --branch [BRANCH NAME] + + + + Using --stack-api-key + + $ csdx cm:entries:update-and-publish --content-types [CONTENT TYPE 1] [CONTENT TYPE 2] -e [ENVIRONMENT 1] [ENVIRONMENT 2] --locales [LOCALE 1] [LOCALE 2] --stack-api-key [STACK API KEY] ``` ## `csdx cm:assets:publish [-a ] [--retry-failed ] [-e ] [--folder-uid ] [--bulk-publish ] [-c ] [-y] [--locales ] [--branch ] [--delivery-token ] [--source-env ]` @@ -718,6 +740,7 @@ FLAGS -a, --alias= Alias(name) for the management token -c, --config= Path to the config file -e, --environments=... Environments where assets will be published + -k, --stack-api-key= Stack api key to be used -l, --locales=... Locales to where assets will be published -y, --yes Agree to process the command with the current configuration --api-version= API Version to be used. Values [Default: 3, Nested Reference Publishing: 3.2]. @@ -772,6 +795,12 @@ EXAMPLES Using --source-env $ csdx cm:assets:publish --environments [ENVIRONMENT 1] [ENVIRONMENT 2] --locales [LOCALE] --alias [MANAGEMENT TOKEN ALIAS] --source-env [SOURCE ENVIRONMENT] --delivery-token [DELIVERY TOKEN] + + + + Using --stack-api-key flag + + $ csdx cm:assets:publish --environments [ENVIRONMENT 1] [ENVIRONMENT 2] --locales [LOCALE] --stack-api-key [STACK API KEY] ``` ## `csdx cm:bulk-publish:clear` @@ -808,10 +837,11 @@ The configure command is used to generate a configuration file for publish scrip ``` USAGE - $ csdx cm:bulk-publish:configure [-a ] + $ csdx cm:bulk-publish:configure [-a ] [-k ] FLAGS - -a, --alias= Alias(name) for the management token + -a, --alias= Alias(name) for the management token + -k, --stack-api-key= Stack api key to be used DESCRIPTION The configure command is used to generate a configuration file for publish scripts. @@ -825,6 +855,8 @@ EXAMPLES $ csdx cm:stacks:publish-configure -a $ csdx cm:stacks:publish-configure --alias + + $ csdx cm:stacks:publish-configure --stack-api-key ``` ## `csdx cm:bulk-publish:cross-publish [-a ] [--retry-failed ] [--bulk-publish ] [--content-type ] [--locales ] [--source-env ] [--environments ] [--delivery-token ] [-c ] [-y] [--branch ] [--onlyAssets] [--onlyEntries]` @@ -838,23 +870,24 @@ USAGE [-y] [--branch ] [--onlyAssets] [--onlyEntries] FLAGS - -B, --branch= [default: main] Specify the branch to fetch the content (by default the main branch is - selected) - -a, --alias= Alias(name) for the management token - -c, --config= Path to the config file - -y, --yes Agree to process the command with the current configuration - --api-version= API Version to be used. Values [Default: 3, Nested Reference Publishing: 3.2]. - --bulk-publish= [default: true] This flag is set to true by default. It indicates that contentstack's - bulkpublish API will be used to publish the entries - --content-type=... The Contenttypes from which entries will be published - --delivery-token= Delivery token for source environment - --environments=... Destination Environments - --locales= Source locale - --onlyAssets Unpublish only assets - --onlyEntries Unpublish only entries - --retry-failed= (optional) Retry publishing failed entries from the logfile (this flag overrides all other - flags) - --source-env= Source Env + -B, --branch= [default: main] Specify the branch to fetch the content (by default the main branch is + selected) + -a, --alias= Alias(name) for the management token + -c, --config= Path to the config file + -k, --stack-api-key= Stack api key to be used + -y, --yes Agree to process the command with the current configuration + --api-version= API Version to be used. Values [Default: 3, Nested Reference Publishing: 3.2]. + --bulk-publish= [default: true] This flag is set to true by default. It indicates that contentstack's + bulkpublish API will be used to publish the entries + --content-type=... The Contenttypes from which entries will be published + --delivery-token= Delivery token for source environment + --environments=... Destination Environments + --locales= Source locale + --onlyAssets Unpublish only assets + --onlyEntries Unpublish only entries + --retry-failed= (optional) Retry publishing failed entries from the logfile (this flag overrides all + other flags) + --source-env= Source Env DESCRIPTION Publish entries and assets from one environment to other environments @@ -893,6 +926,12 @@ EXAMPLES Using --branch flag $ csdx cm:bulk-publish:cross-publish --content-type [CONTENT TYPE] --source-env [SOURCE ENV] --environments [DESTINATION ENVIRONMENT] --locales [LOCALE] -a [MANAGEMENT TOKEN ALIAS] --delivery-token [DELIVERY TOKEN] --branch [BRANCH NAME] + + + + Using --stack-api-key flag + + $ csdx cm:bulk-publish:cross-publish --content-type [CONTENT TYPE] --source-env [SOURCE ENV] --environments [DESTINATION ENVIRONMENT] --locales [LOCALE] --stack-api-key [STACK API KEY] --delivery-token [DELIVERY TOKEN] ``` _See code: [@contentstack/cli-cm-bulk-publish](https://github.com/contentstack/cli/blob/main/packages/contentstack-bulk-publish/src/commands/cm/bulk-publish/cross-publish.js)_ @@ -914,6 +953,7 @@ FLAGS -c, --config= Path for the external config file (A new config file can be generated at the current working directory using `csdx cm:bulk-publish:configure -a [ALIAS]`) -e, --environments=... Environments where entries will be published + -k, --stack-api-key= Stack api key to be used -l, --locales=... Locales where entries will be published -y, --yes Agree to process the command with the current configuration --api-version= API Version to be used. Values [Default: 3, Nested Reference Publishing: 3.2]. @@ -973,6 +1013,12 @@ EXAMPLES Using --source-env $ csdx cm:entries:publish --content-types [CONTENT TYPE 1] [CONTENT TYPE 2] -e [ENVIRONMENT 1] [ENVIRONMENT 2] --locales [LOCALE 1] [LOCALE 2] -a [MANAGEMENT TOKEN ALIAS] --source-env [SOURCE ENVIRONMENT] --delivery-token [DELIVERY TOKEN] + + + + Using --stack-api-key + + $ csdx cm:entries:publish -e [ENVIRONMENT 1] [ENVIRONMENT 2] --locales [LOCALE 1] [LOCALE 2] --stack-api-key [STACK API KEY] --source-env [SOURCE ENVIRONMENT] --delivery-token [DELIVERY TOKEN] ``` ## `csdx cm:entries:publish-modified [-a ] [--retry-failed ] [--bulk-publish ] [--source-env ] [--content-types ] [--locales ] [-e ] [-c ] [-y] [--branch ]` @@ -990,6 +1036,7 @@ FLAGS -a, --alias= Alias(name) for the management token -c, --config= Path to the config file -e, --environments=... Destination environments + -k, --stack-api-key= Stack api key to be used -l, --locales=... Locales where edited entries will be published -y, --yes Agree to process the command with the current configuration --api-version= API Version to be used. Values [Default: 3, Nested Reference Publishing: 3.2]. @@ -1040,6 +1087,12 @@ EXAMPLES Using --branch $ csdx cm:entries:publish-modified --content-types [CONTENT TYPE 1] [CONTENT TYPE 2] --source-env [SOURCE_ENV] -e [ENVIRONMENT 1] [ENVIRONMENT 2] --locales [LOCALE 1] [LOCALE 2] -a [MANAGEMENT TOKEN ALIAS] --branch [BRANCH NAME] + + + + Using --stack-api-key + + $ csdx cm:entries:publish-modified --content-types [CONTENT TYPE 1] [CONTENT TYPE 2] --source-env [SOURCE_ENV] -e [ENVIRONMENT 1] [ENVIRONMENT 2] --locales [LOCALE 1] [LOCALE 2] -stack-api-key [STACK API KEY] ``` ## `csdx cm:entries:publish-non-localized-fields [-a ] [--retry-failed ] [--bulk-publish ] [--source-env ] [--content-types ] [-e ] [-c ] [-y] [--branch ]` @@ -1057,6 +1110,7 @@ FLAGS -a, --alias= Alias(name) for the management token -c, --config= Path to the config file -e, --environments=... Destination environments + -k, --stack-api-key= Stack api key to be used -y, --yes Agree to process the command with the current configuration --api-version= API Version to be used. Values [Default: 3, Nested Reference Publishing: 3.2]. --bulk-publish= [default: true] This flag is set to true by default. It indicates that contentstack's @@ -1103,6 +1157,12 @@ EXAMPLES Using --branch flag $ csdx cm:entries:publish-non-localized-fields --content-types [CONTENT TYPE 1] [CONTENT TYPE 2] --environments [ENVIRONMENT 1] [ENVIRONMENT 2] --alias [MANAGEMENT TOKEN ALIAS] --source-env [SOURCE ENV] --branch [BRANCH NAME] + + + + Using --stack-api-key flag + + $ csdx cm:entries:publish-non-localized-fields --content-types [CONTENT TYPE 1] [CONTENT TYPE 2] --environments [ENVIRONMENT 1] [ENVIRONMENT 2] --stack-api-key [STACK API KEY] --source-env [SOURCE ENV] ``` ## `csdx cm:bulk-publish:revert` @@ -1149,18 +1209,19 @@ USAGE [--only-assets] [--only-entries] FLAGS - -B, --branch= [default: main] Specify the branch to fetch the content from (default is main branch) - -a, --alias= Alias(name) for the management token - -c, --config= Path to the config file - -e, --environment= Source Environment - -l, --locale= Locale filter - -y, --yes Agree to process the command with the current configuration - --api-version= API Version to be used. Values [Default: 3, Nested Reference Publishing: 3.2]. - --bulk-unpublish= [default: true] This flag is set to true by default. It indicates that contentstack's - bulkpublish API will be used to unpublish the entries and assets - --content-type= Content type filter - --delivery-token= Delivery token for source environment - --retry-failed= Retry publishing failed entries from the logfile (optional, overrides all other flags) + -B, --branch= [default: main] Specify the branch to fetch the content from (default is main branch) + -a, --alias= Alias(name) for the management token + -c, --config= Path to the config file + -e, --environment= Source Environment + -k, --stack-api-key= Stack api key to be used + -l, --locale= Locale filter + -y, --yes Agree to process the command with the current configuration + --api-version= API Version to be used. Values [Default: 3, Nested Reference Publishing: 3.2]. + --bulk-unpublish= [default: true] This flag is set to true by default. It indicates that contentstack's + bulkpublish API will be used to unpublish the entries and assets + --content-type= Content type filter + --delivery-token= Delivery token for source environment + --retry-failed= Retry publishing failed entries from the logfile (optional, overrides all other flags) DESCRIPTION Unpublish entries or assets of given content types from the specified environment @@ -1226,6 +1287,12 @@ EXAMPLES Using --branch flag $ csdx cm:stacks:unpublish --bulk-unpublish --content-type [CONTENT TYPE] --environment [SOURCE ENV] --locale [LOCALE] --alias [MANAGEMENT TOKEN ALIAS] --delivery-token [DELIVERY TOKEN] --branch [BRANCH NAME] + + + + Using --stack-api-key flag + + $ csdx cm:stacks:unpublish --bulk-unpublish --content-type [CONTENT TYPE] --environment [SOURCE ENV] --locale [LOCALE] --stack-api-key [STACK API KEY] --delivery-token [DELIVERY TOKEN] ``` ## `csdx cm:entries:publish-only-unpublished [-a ] [--retry-failed ] [--bulk-publish ] [--source-env ] [--content-types ] [--locales ] [-e ] [-c ] [-y] [--branch ]` @@ -1246,6 +1313,7 @@ FLAGS bulkpublish API will be used to publish the entries -c, --config= Path to the config file -e, --environments=... Destination environments + -k, --stack-api-key= Stack api key to be used -y, --yes Agree to process the command with the current configuration --api-version= API Version to be used. Values [Default: 3, Nested Reference Publishing: 3.2]. --content-types=... The Contenttypes from which entries will be published @@ -1292,6 +1360,12 @@ EXAMPLES Using --branch $ csdx cm:entries:publish-only-unpublished -b --content-types [CONTENT TYPES] -e [ENVIRONMENTS] --locales LOCALE -a [MANAGEMENT TOKEN ALIAS] --branch [BRANCH NAME] -source-env [SOURCE ENV] + + + + Using --stack-api-key + + $ csdx cm:entries:publish-only-unpublished -b --content-types [CONTENT TYPES] -e [ENVIRONMENTS] --locales LOCALE -a [MANAGEMENT TOKEN ALIAS] --stack-api-key [STACK API KEY] -source-env [SOURCE ENV] ``` ## `csdx cm:entries:migrate-html-rte` @@ -1372,6 +1446,7 @@ FLAGS -c, --config= Path for the external config file (A new config file can be generated at the current working directory using `csdx cm:bulk-publish:configure -a [ALIAS]`) -e, --environments=... Environments where entries will be published + -k, --stack-api-key= Stack api key to be used -l, --locales=... Locales where entries will be published -y, --yes Agree to process the command with the current configuration --api-version= API Version to be used. Values [Default: 3, Nested Reference Publishing: 3.2]. @@ -1431,6 +1506,12 @@ EXAMPLES Using --source-env $ csdx cm:entries:publish --content-types [CONTENT TYPE 1] [CONTENT TYPE 2] -e [ENVIRONMENT 1] [ENVIRONMENT 2] --locales [LOCALE 1] [LOCALE 2] -a [MANAGEMENT TOKEN ALIAS] --source-env [SOURCE ENVIRONMENT] --delivery-token [DELIVERY TOKEN] + + + + Using --stack-api-key + + $ csdx cm:entries:publish -e [ENVIRONMENT 1] [ENVIRONMENT 2] --locales [LOCALE 1] [LOCALE 2] --stack-api-key [STACK API KEY] --source-env [SOURCE ENVIRONMENT] --delivery-token [DELIVERY TOKEN] ``` _See code: [@contentstack/cli-cm-bulk-publish](https://github.com/contentstack/cli/blob/main/packages/contentstack-bulk-publish/src/commands/cm/entries/publish.js)_ @@ -1450,6 +1531,7 @@ FLAGS -a, --alias= Alias(name) for the management token -c, --config= Path to the config file -e, --environments=... Destination environments + -k, --stack-api-key= Stack api key to be used -l, --locales=... Locales where edited entries will be published -y, --yes Agree to process the command with the current configuration --api-version= API Version to be used. Values [Default: 3, Nested Reference Publishing: 3.2]. @@ -1500,6 +1582,12 @@ EXAMPLES Using --branch $ csdx cm:entries:publish-modified --content-types [CONTENT TYPE 1] [CONTENT TYPE 2] --source-env [SOURCE_ENV] -e [ENVIRONMENT 1] [ENVIRONMENT 2] --locales [LOCALE 1] [LOCALE 2] -a [MANAGEMENT TOKEN ALIAS] --branch [BRANCH NAME] + + + + Using --stack-api-key + + $ csdx cm:entries:publish-modified --content-types [CONTENT TYPE 1] [CONTENT TYPE 2] --source-env [SOURCE_ENV] -e [ENVIRONMENT 1] [ENVIRONMENT 2] --locales [LOCALE 1] [LOCALE 2] -stack-api-key [STACK API KEY] ``` _See code: [@contentstack/cli-cm-bulk-publish](https://github.com/contentstack/cli/blob/main/packages/contentstack-bulk-publish/src/commands/cm/entries/publish-modified.js)_ @@ -1519,6 +1607,7 @@ FLAGS -a, --alias= Alias(name) for the management token -c, --config= Path to the config file -e, --environments=... Destination environments + -k, --stack-api-key= Stack api key to be used -y, --yes Agree to process the command with the current configuration --api-version= API Version to be used. Values [Default: 3, Nested Reference Publishing: 3.2]. --bulk-publish= [default: true] This flag is set to true by default. It indicates that contentstack's @@ -1565,6 +1654,12 @@ EXAMPLES Using --branch flag $ csdx cm:entries:publish-non-localized-fields --content-types [CONTENT TYPE 1] [CONTENT TYPE 2] --environments [ENVIRONMENT 1] [ENVIRONMENT 2] --alias [MANAGEMENT TOKEN ALIAS] --source-env [SOURCE ENV] --branch [BRANCH NAME] + + + + Using --stack-api-key flag + + $ csdx cm:entries:publish-non-localized-fields --content-types [CONTENT TYPE 1] [CONTENT TYPE 2] --environments [ENVIRONMENT 1] [ENVIRONMENT 2] --stack-api-key [STACK API KEY] --source-env [SOURCE ENV] ``` _See code: [@contentstack/cli-cm-bulk-publish](https://github.com/contentstack/cli/blob/main/packages/contentstack-bulk-publish/src/commands/cm/entries/publish-non-localized-fields.js)_ @@ -1587,6 +1682,7 @@ FLAGS bulkpublish API will be used to publish the entries -c, --config= Path to the config file -e, --environments=... Destination environments + -k, --stack-api-key= Stack api key to be used -y, --yes Agree to process the command with the current configuration --api-version= API Version to be used. Values [Default: 3, Nested Reference Publishing: 3.2]. --content-types=... The Contenttypes from which entries will be published @@ -1633,6 +1729,12 @@ EXAMPLES Using --branch $ csdx cm:entries:publish-only-unpublished -b --content-types [CONTENT TYPES] -e [ENVIRONMENTS] --locales LOCALE -a [MANAGEMENT TOKEN ALIAS] --branch [BRANCH NAME] -source-env [SOURCE ENV] + + + + Using --stack-api-key + + $ csdx cm:entries:publish-only-unpublished -b --content-types [CONTENT TYPES] -e [ENVIRONMENTS] --locales LOCALE -a [MANAGEMENT TOKEN ALIAS] --stack-api-key [STACK API KEY] -source-env [SOURCE ENV] ``` _See code: [@contentstack/cli-cm-bulk-publish](https://github.com/contentstack/cli/blob/main/packages/contentstack-bulk-publish/src/commands/cm/entries/publish-only-unpublished.js)_ @@ -1643,24 +1745,25 @@ Unpublish entries from the given environment ``` USAGE - $ csdx cm:entries:unpublish [-a ] [-e ] [-c ] [-y] [--locale ] [--branch ] - [--retry-failed ] [--bulk-unpublish ] [--api-version ] [--content-type ] + $ csdx cm:entries:unpublish [-a ] [-k ] [-e ] [-c ] [-y] [--locale ] [--branch + ] [--retry-failed ] [--bulk-unpublish ] [--api-version ] [--content-type ] [--delivery-token ] FLAGS - -a, --alias= Alias(name) for the management token - -c, --config= Path to the config file - -e, --environment= Source Environment - -y, --yes Agree to process the command with the current configuration - --api-version= API Version to be used. Values [Default: 3, Nested Reference Publishing: 3.2]. - --branch= [default: main] Specify the branch to fetch the content (by default the main branch is - selected) - --bulk-unpublish= [default: true] This flag is set to true by default. It indicates that contentstack's - bulkpublish API will be used to unpublish the entries - --content-type= Content type filter - --delivery-token= Delivery token for source environment - --locale= Locale filter - --retry-failed= Retry publishing failed entries from the logfile + -a, --alias= Alias(name) for the management token + -c, --config= Path to the config file + -e, --environment= Source Environment + -k, --stack-api-key= Stack api key to be used + -y, --yes Agree to process the command with the current configuration + --api-version= API Version to be used. Values [Default: 3, Nested Reference Publishing: 3.2]. + --branch= [default: main] Specify the branch to fetch the content (by default the main branch is + selected) + --bulk-unpublish= [default: true] This flag is set to true by default. It indicates that contentstack's + bulkpublish API will be used to unpublish the entries + --content-type= Content type filter + --delivery-token= Delivery token for source environment + --locale= Locale filter + --retry-failed= Retry publishing failed entries from the logfile DESCRIPTION Unpublish entries from the given environment @@ -1692,11 +1795,15 @@ EXAMPLES - - Using --branch flag $ csdx cm:stacks:unpublish --bulk-unpublish --content-type [CONTENT TYPE] --environment [SOURCE ENV] --locale [LOCALE] --alias [MANAGEMENT TOKEN ALIAS] --delivery-token [DELIVERY TOKEN] --branch [BRANCH NAME] + + + + Using --stack-api-key flag + + $ csdx cm:stacks:unpublish --bulk-unpublish --content-type [CONTENT TYPE] --environment [SOURCE ENV] --locale [LOCALE] --stack-api-key [STACK API KEY] --delivery-token [DELIVERY TOKEN] ``` _See code: [@contentstack/cli-cm-bulk-publish](https://github.com/contentstack/cli/blob/main/packages/contentstack-bulk-publish/src/commands/cm/entries/unpublish.js)_ @@ -1716,6 +1823,7 @@ FLAGS -a, --alias= Alias(name) for the management token -c, --config= Path to the config file -e, --environments=... Environments where entries will be published + -k, --stack-api-key= Stack api key to be used -l, --locales=... Locales where entries will be published -t, --contentTypes=... The Contenttypes from which entries will be published -y, --yes Agree to process the command with the current configuration @@ -1741,7 +1849,7 @@ ALIASES EXAMPLES General Usage - $ csdx cm:entries:update-and-publish --content-types [CONTENT TYPE 1] [CONTENT TYPE 2] -e [ENVIRONMENT 1] [ENVIRONMENT 2] --locale [LOCALE 1] [LOCALE 2] -a [MANAGEMENT TOKEN ALIAS] + $ csdx cm:entries:update-and-publish --content-types [CONTENT TYPE 1] [CONTENT TYPE 2] -e [ENVIRONMENT 1] [ENVIRONMENT 2] --locales [LOCALE 1] [LOCALE 2] -a [MANAGEMENT TOKEN ALIAS] @@ -1763,7 +1871,13 @@ EXAMPLES Using --branch - $ csdx cm:entries:update-and-publish --content-types [CONTENT TYPE 1] [CONTENT TYPE 2] -e [ENVIRONMENT 1] [ENVIRONMENT 2] --locale [LOCALE 1] [LOCALE 2] -a [MANAGEMENT TOKEN ALIAS] --branch [BRANCH NAME] + $ csdx cm:entries:update-and-publish --content-types [CONTENT TYPE 1] [CONTENT TYPE 2] -e [ENVIRONMENT 1] [ENVIRONMENT 2] --locales [LOCALE 1] [LOCALE 2] -a [MANAGEMENT TOKEN ALIAS] --branch [BRANCH NAME] + + + + Using --stack-api-key + + $ csdx cm:entries:update-and-publish --content-types [CONTENT TYPE 1] [CONTENT TYPE 2] -e [ENVIRONMENT 1] [ENVIRONMENT 2] --locales [LOCALE 1] [LOCALE 2] --stack-api-key [STACK API KEY] ``` _See code: [@contentstack/cli-cm-bulk-publish](https://github.com/contentstack/cli/blob/main/packages/contentstack-bulk-publish/src/commands/cm/entries/update-and-publish.js)_ @@ -1866,7 +1980,7 @@ _See code: [@contentstack/cli-cm-export-to-csv](https://github.com/contentstack/ ## `csdx cm:stacks:import [-c ] [-k ] [-d ] [-a ] [--module ] [--backup-dir ] [--branch ] [--import-webhook-status disable|current]` -Import script for importing the content into the new stack +Import content from a stack ``` USAGE @@ -1886,11 +2000,7 @@ FLAGS DESCRIPTION - Import script for importing the content into the new stack - ... - Once you export content from the source stack, import it to your destination stack by using the cm:stacks:import - command. - + Import content from a stack ALIASES $ csdx cm:import @@ -2020,6 +2130,7 @@ USAGE $ csdx cm:stacks:seed [--repo ] [--org ] [-k ] [-n ] [-y ] [-s ] FLAGS + -a, --alias= Alias of the management token -k, --stack-api-key= Provide stack api key to seed content to -n, --stack-name= Name of a new stack that needs to be created. -o, --org= Provide Organization UID to create a new stack @@ -2187,11 +2298,11 @@ EXAMPLES $ csdx cm:stacks:export --branch [optional] branch name ``` -_See code: [@contentstack/cli-cm-export](https://github.com/contentstack/cli/blob/main/packages/contentstack-export/src/commands/cm/stacks/export.js)_ +_See code: [@contentstack/cli-cm-export](https://github.com/contentstack/cli/blob/main/packages/contentstack-export/src/commands/cm/stacks/export.ts)_ ## `csdx cm:stacks:import [-c ] [-k ] [-d ] [-a ] [--module ] [--backup-dir ] [--branch ] [--import-webhook-status disable|current]` -Import script for importing the content into the new stack +Import content from a stack ``` USAGE @@ -2211,11 +2322,7 @@ FLAGS DESCRIPTION - Import script for importing the content into the new stack - ... - Once you export content from the source stack, import it to your destination stack by using the cm:stacks:import - command. - + Import content from a stack ALIASES $ csdx cm:import @@ -2238,7 +2345,7 @@ EXAMPLES $ csdx cm:stacks:import --branch --yes ``` -_See code: [@contentstack/cli-cm-import](https://github.com/contentstack/cli/blob/main/packages/contentstack-import/src/commands/cm/stacks/import.js)_ +_See code: [@contentstack/cli-cm-import](https://github.com/contentstack/cli/blob/main/packages/contentstack-import/src/commands/cm/stacks/import.ts)_ ## `csdx cm:stacks:migration [-k ] [-a ] [--file-path ] [--branch ] [--config-file ] [--config ] [--multiple]` @@ -2369,10 +2476,11 @@ The configure command is used to generate a configuration file for publish scrip ``` USAGE - $ csdx cm:stacks:publish-configure [-a ] + $ csdx cm:stacks:publish-configure [-a ] [-k ] FLAGS - -a, --alias= Alias(name) for the management token + -a, --alias= Alias(name) for the management token + -k, --stack-api-key= Stack api key to be used DESCRIPTION The configure command is used to generate a configuration file for publish scripts. @@ -2386,6 +2494,8 @@ EXAMPLES $ csdx cm:stacks:publish-configure -a $ csdx cm:stacks:publish-configure --alias + + $ csdx cm:stacks:publish-configure --stack-api-key ``` _See code: [@contentstack/cli-cm-bulk-publish](https://github.com/contentstack/cli/blob/main/packages/contentstack-bulk-publish/src/commands/cm/stacks/publish-configure.js)_ @@ -2434,6 +2544,7 @@ USAGE $ csdx cm:stacks:seed [--repo ] [--org ] [-k ] [-n ] [-y ] [-s ] FLAGS + -a, --alias= Alias of the management token -k, --stack-api-key= Provide stack api key to seed content to -n, --stack-name= Name of a new stack that needs to be created. -o, --org= Provide Organization UID to create a new stack @@ -2472,18 +2583,19 @@ USAGE [--only-assets] [--only-entries] FLAGS - -B, --branch= [default: main] Specify the branch to fetch the content from (default is main branch) - -a, --alias= Alias(name) for the management token - -c, --config= Path to the config file - -e, --environment= Source Environment - -l, --locale= Locale filter - -y, --yes Agree to process the command with the current configuration - --api-version= API Version to be used. Values [Default: 3, Nested Reference Publishing: 3.2]. - --bulk-unpublish= [default: true] This flag is set to true by default. It indicates that contentstack's - bulkpublish API will be used to unpublish the entries and assets - --content-type= Content type filter - --delivery-token= Delivery token for source environment - --retry-failed= Retry publishing failed entries from the logfile (optional, overrides all other flags) + -B, --branch= [default: main] Specify the branch to fetch the content from (default is main branch) + -a, --alias= Alias(name) for the management token + -c, --config= Path to the config file + -e, --environment= Source Environment + -k, --stack-api-key= Stack api key to be used + -l, --locale= Locale filter + -y, --yes Agree to process the command with the current configuration + --api-version= API Version to be used. Values [Default: 3, Nested Reference Publishing: 3.2]. + --bulk-unpublish= [default: true] This flag is set to true by default. It indicates that contentstack's + bulkpublish API will be used to unpublish the entries and assets + --content-type= Content type filter + --delivery-token= Delivery token for source environment + --retry-failed= Retry publishing failed entries from the logfile (optional, overrides all other flags) DESCRIPTION Unpublish entries or assets of given content types from the specified environment @@ -2549,6 +2661,12 @@ EXAMPLES Using --branch flag $ csdx cm:stacks:unpublish --bulk-unpublish --content-type [CONTENT TYPE] --environment [SOURCE ENV] --locale [LOCALE] --alias [MANAGEMENT TOKEN ALIAS] --delivery-token [DELIVERY TOKEN] --branch [BRANCH NAME] + + + + Using --stack-api-key flag + + $ csdx cm:stacks:unpublish --bulk-unpublish --content-type [CONTENT TYPE] --environment [SOURCE ENV] --locale [LOCALE] --stack-api-key [STACK API KEY] --delivery-token [DELIVERY TOKEN] ``` _See code: [@contentstack/cli-cm-bulk-publish](https://github.com/contentstack/cli/blob/main/packages/contentstack-bulk-publish/src/commands/cm/stacks/unpublish.js)_ @@ -2689,7 +2807,7 @@ DESCRIPTION Display help for csdx. ``` -_See code: [@oclif/plugin-help](https://github.com/oclif/plugin-help/blob/v5.2.9/src/commands/help.ts)_ +_See code: [@oclif/plugin-help](https://github.com/oclif/plugin-help/blob/v5.2.14/src/commands/help.ts)_ ## `csdx launch` diff --git a/packages/contentstack/package.json b/packages/contentstack/package.json index f565c6da45..397f8d18b3 100755 --- a/packages/contentstack/package.json +++ b/packages/contentstack/package.json @@ -1,7 +1,7 @@ { "name": "@contentstack/cli", "description": "Command-line tool (CLI) to interact with Contentstack", - "version": "1.7.9", + "version": "1.8.3", "author": "Contentstack", "bin": { "csdx": "./bin/run" @@ -22,26 +22,26 @@ "prepack": "pnpm compile && oclif manifest && oclif readme" }, "dependencies": { - "@contentstack/cli-auth": "^1.3.10", - "@contentstack/cli-cm-bootstrap": "^1.4.11", - "@contentstack/cli-cm-bulk-publish": "^1.3.8", - "@contentstack/cli-cm-clone": "^1.4.11", - "@contentstack/cli-cm-export": "^1.5.9", - "@contentstack/cli-cm-export-to-csv": "^1.3.10", - "@contentstack/cli-cm-import": "^1.5.11", - "@contentstack/cli-cm-migrate-rte": "^1.4.8", - "@contentstack/cli-cm-seed": "^1.4.11", - "@contentstack/cli-command": "^1.2.9", - "@contentstack/cli-config": "^1.4.8", - "@contentstack/cli-launch": "^1.0.7", - "@contentstack/cli-migration": "^1.3.8", - "@contentstack/cli-utilities": "^1.4.5", - "@contentstack/management": "^1.8.0", - "@contentstack/cli-cm-branches": "^1.0.8", + "@contentstack/cli-auth": "~1.3.12", + "@contentstack/cli-cm-bootstrap": "~1.4.14", + "@contentstack/cli-cm-bulk-publish": "~1.3.10", + "@contentstack/cli-cm-clone": "~1.4.15", + "@contentstack/cli-cm-export": "~1.8.0", + "@contentstack/cli-cm-export-to-csv": "~1.4.0", + "@contentstack/cli-cm-import": "~1.8.2", + "@contentstack/cli-cm-migrate-rte": "~1.4.10", + "@contentstack/cli-cm-seed": "~1.4.14", + "@contentstack/cli-command": "~1.2.11", + "@contentstack/cli-config": "~1.4.10", + "@contentstack/cli-launch": "~1.0.10", + "@contentstack/cli-migration": "~1.3.11", + "@contentstack/cli-utilities": "~1.5.1", + "@contentstack/management": "~1.10.0", + "@contentstack/cli-cm-branches": "~1.0.11", "@oclif/plugin-help": "^5", "@oclif/plugin-not-found": "^2.3.9", "@oclif/plugin-plugins": "^2.1.7", - "@oclif/core": "^2.8.2", + "@oclif/core": "^2.9.3", "chalk": "^4.1.2", "debug": "^4.1.1", "figlet": "^1.5.2", @@ -65,7 +65,7 @@ "eslint-config-oclif": "^4.0.0", "eslint-config-oclif-typescript": "^0.1.0", "globby": "^10.0.2", - "mocha": "^10.0.0", + "mocha": "10.1.0", "nock": "^13.1.0", "nyc": "^15.1.0", "oclif": "^3.8.1", @@ -74,6 +74,7 @@ "sinon": "^15.0.1", "tmp": "^0.2.1", "ts-node": "^10.9.1", + "tslib": "^2.4.1", "typescript": "^4.9.3" }, "engines": { @@ -157,4 +158,4 @@ } }, "repository": "https://github.com/contentstack/cli" -} +} \ No newline at end of file diff --git a/packages/contentstack/src/help.ts b/packages/contentstack/src/help.ts index dab8815b06..38a158b044 100644 --- a/packages/contentstack/src/help.ts +++ b/packages/contentstack/src/help.ts @@ -1,7 +1,5 @@ -import { Help } from '@oclif/core'; import * as figlet from 'figlet'; -import { cliux } from '@contentstack/cli-utilities'; - +import { cliux, Help } from '@contentstack/cli-utilities'; export default class MyHelpClass extends Help { constructor(config, opts) { super(config, opts); diff --git a/packages/contentstack/src/interfaces/index.ts b/packages/contentstack/src/interfaces/index.ts index 1a9aa8da1e..ec662c6733 100644 --- a/packages/contentstack/src/interfaces/index.ts +++ b/packages/contentstack/src/interfaces/index.ts @@ -1,4 +1,4 @@ -import { Config, Plugin } from '@oclif/core'; +import { Config, Plugin } from '@contentstack/cli-utilities'; export interface PrintOptions { color?: string; diff --git a/packages/contentstack/src/utils/context-handler.ts b/packages/contentstack/src/utils/context-handler.ts index a49177d15e..f2edeb6f0c 100644 --- a/packages/contentstack/src/utils/context-handler.ts +++ b/packages/contentstack/src/utils/context-handler.ts @@ -1,3 +1,4 @@ + import * as shortUUID from 'short-uuid'; import * as path from 'path'; import { configHandler } from '@contentstack/cli-utilities'; @@ -15,6 +16,7 @@ export default class CsdxContext { readonly messageFilePath: string; readonly analyticsInfo: string; public flagWarningPrintState: any; + public flags: any; constructor(cliOpts: any, cliConfig: any) { const analyticsInfo = []; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3a0ab09eaf..e2237033dc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,27 +6,27 @@ importers: specifiers: pnpm: ^7.23.0 devDependencies: - pnpm: 7.32.5 + pnpm: 7.33.5 packages/contentstack: specifiers: - '@contentstack/cli-auth': ^1.3.10 - '@contentstack/cli-cm-bootstrap': ^1.4.11 - '@contentstack/cli-cm-branches': ^1.0.8 - '@contentstack/cli-cm-bulk-publish': ^1.3.8 - '@contentstack/cli-cm-clone': ^1.4.11 - '@contentstack/cli-cm-export': ^1.5.9 - '@contentstack/cli-cm-export-to-csv': ^1.3.10 - '@contentstack/cli-cm-import': ^1.5.11 - '@contentstack/cli-cm-migrate-rte': ^1.4.8 - '@contentstack/cli-cm-seed': ^1.4.11 - '@contentstack/cli-command': ^1.2.9 - '@contentstack/cli-config': ^1.4.8 - '@contentstack/cli-launch': ^1.0.7 - '@contentstack/cli-migration': ^1.3.8 - '@contentstack/cli-utilities': ^1.4.5 - '@contentstack/management': ^1.8.0 - '@oclif/core': ^2.8.2 + '@contentstack/cli-auth': ~1.3.12 + '@contentstack/cli-cm-bootstrap': ~1.4.14 + '@contentstack/cli-cm-branches': ~1.0.11 + '@contentstack/cli-cm-bulk-publish': ~1.3.10 + '@contentstack/cli-cm-clone': ~1.4.15 + '@contentstack/cli-cm-export': ~1.8.0 + '@contentstack/cli-cm-export-to-csv': ~1.4.0 + '@contentstack/cli-cm-import': ~1.8.2 + '@contentstack/cli-cm-migrate-rte': ~1.4.10 + '@contentstack/cli-cm-seed': ~1.4.14 + '@contentstack/cli-command': ~1.2.11 + '@contentstack/cli-config': ~1.4.10 + '@contentstack/cli-launch': ~1.0.10 + '@contentstack/cli-migration': ~1.3.11 + '@contentstack/cli-utilities': ~1.5.1 + '@contentstack/management': ~1.10.0 + '@oclif/core': ^2.9.3 '@oclif/plugin-help': ^5 '@oclif/plugin-not-found': ^2.3.9 '@oclif/plugin-plugins': ^2.1.7 @@ -46,7 +46,7 @@ importers: figlet: ^1.5.2 globby: ^10.0.2 inquirer: 8.2.4 - mocha: ^10.0.0 + mocha: 10.1.0 nock: ^13.1.0 node-machine-id: ^1.1.12 nyc: ^15.1.0 @@ -58,6 +58,7 @@ importers: sinon: ^15.0.1 tmp: ^0.2.1 ts-node: ^10.9.1 + tslib: ^2.4.1 typescript: ^4.9.3 uuid: ^9.0.0 winston: ^3.7.2 @@ -77,11 +78,11 @@ importers: '@contentstack/cli-launch': link:../contentstack-launch '@contentstack/cli-migration': link:../contentstack-migration '@contentstack/cli-utilities': link:../contentstack-utilities - '@contentstack/management': 1.8.0_debug@4.3.4 - '@oclif/core': 2.8.5_5vebceyeyrbj46wx3onulzfguy - '@oclif/plugin-help': 5.2.9_5vebceyeyrbj46wx3onulzfguy - '@oclif/plugin-not-found': 2.3.23_5vebceyeyrbj46wx3onulzfguy - '@oclif/plugin-plugins': 2.4.7_5vebceyeyrbj46wx3onulzfguy + '@contentstack/management': 1.10.0_debug@4.3.4 + '@oclif/core': 2.9.4_4qcp7qp4jxxdgb4qbxgwox4hwq + '@oclif/plugin-help': 5.2.14_4qcp7qp4jxxdgb4qbxgwox4hwq + '@oclif/plugin-not-found': 2.3.32_4qcp7qp4jxxdgb4qbxgwox4hwq + '@oclif/plugin-plugins': 2.4.7_4qcp7qp4jxxdgb4qbxgwox4hwq chalk: 4.1.2 debug: 4.3.4 figlet: 1.6.0 @@ -90,35 +91,36 @@ importers: open: 8.4.2 short-uuid: 4.2.2 uuid: 9.0.0 - winston: 3.8.2 + winston: 3.10.0 devDependencies: - '@oclif/test': 2.3.21_5vebceyeyrbj46wx3onulzfguy + '@oclif/test': 2.3.31_4qcp7qp4jxxdgb4qbxgwox4hwq '@types/chai': 4.3.5 '@types/inquirer': 9.0.3 '@types/mkdirp': 1.0.2 '@types/mocha': 8.2.3 - '@types/node': 14.18.47 + '@types/node': 14.18.53 '@types/sinon': 10.0.15 chai: 4.3.7 - eslint: 8.41.0 - eslint-config-oclif: 4.0.0_eslint@8.41.0 - eslint-config-oclif-typescript: 0.1.0_5ujgynla27k2qkzlnkldjwsutm + eslint: 8.45.0 + eslint-config-oclif: 4.0.0_eslint@8.45.0 + eslint-config-oclif-typescript: 0.1.0_mhvizudgavq6jzvqzwcqcv4nnm globby: 10.0.2 mocha: 10.1.0 - nock: 13.3.1 + nock: 13.3.2 nyc: 15.1.0 - oclif: 3.9.0_5vebceyeyrbj46wx3onulzfguy + oclif: 3.9.1_4qcp7qp4jxxdgb4qbxgwox4hwq rimraf: 2.7.1 shelljs: 0.8.5 - sinon: 15.1.0 + sinon: 15.2.0 tmp: 0.2.1 - ts-node: 10.9.1_5vebceyeyrbj46wx3onulzfguy + ts-node: 10.9.1_4qcp7qp4jxxdgb4qbxgwox4hwq + tslib: 2.6.0 typescript: 4.9.5 packages/contentstack-auth: specifiers: - '@contentstack/cli-command': ^1.2.9 - '@contentstack/cli-utilities': ^1.4.5 + '@contentstack/cli-command': ~1.2.11 + '@contentstack/cli-utilities': ~1.5.1 '@fancy-test/nock': ^0.1.1 '@oclif/plugin-help': ^5.1.19 '@oclif/test': ^2.2.10 @@ -152,37 +154,37 @@ importers: chalk: 4.1.2 debug: 4.3.4 inquirer: 8.2.4 - winston: 3.8.2 + winston: 3.10.0 devDependencies: '@fancy-test/nock': 0.1.1 - '@oclif/plugin-help': 5.2.9_5vebceyeyrbj46wx3onulzfguy - '@oclif/test': 2.3.21_5vebceyeyrbj46wx3onulzfguy + '@oclif/plugin-help': 5.2.14_4qcp7qp4jxxdgb4qbxgwox4hwq + '@oclif/test': 2.3.31_4qcp7qp4jxxdgb4qbxgwox4hwq '@types/chai': 4.3.5 '@types/inquirer': 9.0.3 '@types/mkdirp': 1.0.2 '@types/mocha': 8.2.3 - '@types/node': 14.18.47 + '@types/node': 14.18.53 '@types/sinon': 10.0.15 chai: 4.3.7 - dotenv: 16.0.3 - eslint: 8.41.0 - eslint-config-oclif: 4.0.0_eslint@8.41.0 - eslint-config-oclif-typescript: 0.1.0_5ujgynla27k2qkzlnkldjwsutm + dotenv: 16.3.1 + eslint: 8.45.0 + eslint-config-oclif: 4.0.0_eslint@8.45.0 + eslint-config-oclif-typescript: 0.1.0_mhvizudgavq6jzvqzwcqcv4nnm globby: 10.0.2 mocha: 10.1.0 nyc: 15.1.0 - oclif: 3.9.0_5vebceyeyrbj46wx3onulzfguy + oclif: 3.9.1_4qcp7qp4jxxdgb4qbxgwox4hwq rimraf: 2.7.1 - sinon: 15.1.0 + sinon: 15.2.0 tmp: 0.2.1 - ts-node: 10.9.1_5vebceyeyrbj46wx3onulzfguy + ts-node: 10.9.1_4qcp7qp4jxxdgb4qbxgwox4hwq typescript: 4.9.5 packages/contentstack-bootstrap: specifiers: - '@contentstack/cli-cm-seed': ^1.4.11 - '@contentstack/cli-command': ^1.2.9 - '@contentstack/cli-utilities': ^1.4.5 + '@contentstack/cli-cm-seed': ~1.4.14 + '@contentstack/cli-command': ~1.2.11 + '@contentstack/cli-utilities': ~1.5.1 '@oclif/test': ^2.2.10 '@types/inquirer': ^9.0.3 '@types/mkdirp': ^1.0.1 @@ -195,7 +197,7 @@ importers: globby: ^10.0.2 inquirer: 8.2.4 mkdirp: ^1.0.4 - mocha: ^10.0.0 + mocha: 10.1.0 nyc: ^15.1.0 oclif: ^3.8.1 rimraf: ^2.7.1 @@ -211,19 +213,19 @@ importers: mkdirp: 1.0.4 tar: 6.1.15 devDependencies: - '@oclif/test': 2.3.21_5vebceyeyrbj46wx3onulzfguy + '@oclif/test': 2.3.31_4qcp7qp4jxxdgb4qbxgwox4hwq '@types/inquirer': 9.0.3 '@types/mkdirp': 1.0.2 - '@types/node': 14.18.47 + '@types/node': 14.18.53 '@types/tar': 6.1.5 chai: 4.3.7 - eslint: 8.41.0 - eslint-config-oclif: 4.0.0_eslint@8.41.0 - eslint-config-oclif-typescript: 0.1.0_5ujgynla27k2qkzlnkldjwsutm + eslint: 8.45.0 + eslint-config-oclif: 4.0.0_eslint@8.45.0 + eslint-config-oclif-typescript: 0.1.0_mhvizudgavq6jzvqzwcqcv4nnm globby: 10.0.2 mocha: 10.1.0 nyc: 15.1.0 - oclif: 3.9.0_5vebceyeyrbj46wx3onulzfguy + oclif: 3.9.1_4qcp7qp4jxxdgb4qbxgwox4hwq rimraf: 2.7.1 tmp: 0.2.1 ts-node: 8.10.2_typescript@4.9.5 @@ -231,14 +233,14 @@ importers: packages/contentstack-branches: specifiers: - '@contentstack/cli-auth': ^1.3.8 - '@contentstack/cli-command': ^1.2.9 - '@contentstack/cli-config': ^1.4.6 - '@contentstack/cli-dev-dependencies': ^1.2.3 - '@contentstack/cli-utilities': ^1.4.5 + '@contentstack/cli-auth': ~1.3.11 + '@contentstack/cli-command': ~1.2.11 + '@contentstack/cli-config': ~1.4.9 + '@contentstack/cli-dev-dependencies': ~1.2.3 + '@contentstack/cli-utilities': ~1.5.1 '@oclif/command': ^1.8.16 '@oclif/config': ^1.18.3 - '@oclif/core': ^2.3.0 + '@oclif/core': ^2.9.3 '@oclif/plugin-help': ^5.1.19 '@oclif/test': ^1.2.6 '@types/flat': ^5.0.2 @@ -273,9 +275,9 @@ importers: dependencies: '@contentstack/cli-command': link:../contentstack-command '@contentstack/cli-utilities': link:../contentstack-utilities - '@oclif/command': 1.8.26_@oclif+config@1.18.9 - '@oclif/config': 1.18.9 - '@oclif/core': 2.8.5_typescript@4.9.5 + '@oclif/command': 1.8.33_@oclif+config@1.18.14 + '@oclif/config': 1.18.14 + '@oclif/core': 2.9.4_typescript@4.9.5 async: 3.2.4 big-json: 3.2.0 bluebird: 3.7.2 @@ -289,42 +291,44 @@ importers: progress-stream: 2.0.0 promise-limit: 2.7.0 proxyquire: 2.1.3 - tslib: 2.5.2 - winston: 3.8.2 + tslib: 2.6.0 + winston: 3.10.0 devDependencies: '@contentstack/cli-auth': link:../contentstack-auth '@contentstack/cli-config': link:../contentstack-config '@contentstack/cli-dev-dependencies': link:../contentstack-dev-dependencies - '@oclif/plugin-help': 5.2.9_typescript@4.9.5 + '@oclif/plugin-help': 5.2.14_typescript@4.9.5 '@oclif/test': 1.2.9 '@types/flat': 5.0.2 assert: 2.0.0 chai: 4.3.7 - dotenv: 16.0.3 + dotenv: 16.3.1 dotenv-expand: 9.0.0 - eslint: 8.41.0 - eslint-config-oclif: 4.0.0_eslint@8.41.0 + eslint: 8.45.0 + eslint-config-oclif: 4.0.0_eslint@8.45.0 globby: 10.0.2 mocha: 10.1.0 nyc: 15.1.0 - oclif: 3.9.0_fxnscsehfcewpnie2ltbcrhxa4 - sinon: 15.1.0 + oclif: 3.9.1_fxnscsehfcewpnie2ltbcrhxa4 + sinon: 15.2.0 ts-node: 10.9.1_typescript@4.9.5 typescript: 4.9.5 packages/contentstack-bulk-publish: specifiers: - '@contentstack/cli-command': ^1.2.9 - '@contentstack/cli-utilities': ^1.4.5 + '@contentstack/cli-command': ~1.2.11 + '@contentstack/cli-utilities': ~1.5.1 '@oclif/test': ^1.2.6 bluebird: ^3.7.2 chai: ^4.2.0 chalk: ^4.1.2 + dotenv: ^16.1.4 eslint: ^8.18.0 eslint-config-oclif: ^4.0.0 globby: ^10.0.2 inquirer: 8.2.4 lodash: ^4.17.15 + mkdirp: ^1.0.4 mocha: ^10.0.0 nock: ^13.0.2 nyc: ^15.1.0 @@ -336,28 +340,30 @@ importers: '@contentstack/cli-utilities': link:../contentstack-utilities bluebird: 3.7.2 chalk: 4.1.2 + dotenv: 16.3.1 inquirer: 8.2.4 lodash: 4.17.21 - nock: 13.3.1 - winston: 3.8.2 + mkdirp: 1.0.4 + nock: 13.3.2 + winston: 3.10.0 devDependencies: '@oclif/test': 1.2.9 chai: 4.3.7 - eslint: 8.41.0 - eslint-config-oclif: 4.0.0_eslint@8.41.0 + eslint: 8.45.0 + eslint-config-oclif: 4.0.0_eslint@8.45.0 globby: 10.0.2 mocha: 10.1.0 nyc: 15.1.0 - oclif: 3.9.0_bluebird@3.7.2 + oclif: 3.9.1_bluebird@3.7.2 tslib: 1.14.1 packages/contentstack-clone: specifiers: '@colors/colors': ^1.5.0 - '@contentstack/cli-cm-export': ^1.5.9 - '@contentstack/cli-cm-import': ^1.5.11 - '@contentstack/cli-command': ^1.2.9 - '@contentstack/cli-utilities': ^1.4.5 + '@contentstack/cli-cm-export': ~1.8.0 + '@contentstack/cli-cm-import': ~1.8.0 + '@contentstack/cli-command': ~1.2.11 + '@contentstack/cli-utilities': ~1.5.1 '@oclif/test': ^1.2.7 async: ^3.2.4 chai: ^4.2.0 @@ -378,7 +384,7 @@ importers: sinon: ^15.0.1 winston: ^3.7.2 dependencies: - '@colors/colors': 1.5.0 + '@colors/colors': 1.6.0 '@contentstack/cli-cm-export': link:../contentstack-export '@contentstack/cli-cm-import': link:../contentstack-import '@contentstack/cli-command': link:../contentstack-command @@ -391,22 +397,22 @@ importers: ora: 5.4.1 prompt: 1.3.0 rimraf: 3.0.2 - winston: 3.8.2 + winston: 3.10.0 devDependencies: '@oclif/test': 1.2.9 chai: 4.3.7 - eslint: 8.41.0 - eslint-config-oclif: 4.0.0_eslint@8.41.0 + eslint: 8.45.0 + eslint-config-oclif: 4.0.0_eslint@8.45.0 globby: 10.0.2 - jest: 29.5.0 + jest: 29.6.1 mocha: 10.1.0 nyc: 15.1.0 - oclif: 3.9.0 - sinon: 15.1.0 + oclif: 3.9.1 + sinon: 15.2.0 packages/contentstack-command: specifiers: - '@contentstack/cli-utilities': ^1.4.5 + '@contentstack/cli-utilities': ~1.5.1 '@oclif/test': ^2.2.10 '@types/chai': ^4.2.18 '@types/mkdirp': ^1.0.1 @@ -428,27 +434,27 @@ importers: '@contentstack/cli-utilities': link:../contentstack-utilities contentstack: 3.17.1 devDependencies: - '@oclif/test': 2.3.21_5vebceyeyrbj46wx3onulzfguy + '@oclif/test': 2.3.31_4qcp7qp4jxxdgb4qbxgwox4hwq '@types/chai': 4.3.5 '@types/mkdirp': 1.0.2 '@types/mocha': 8.2.3 - '@types/node': 14.18.47 + '@types/node': 14.18.53 '@types/sinon': 10.0.15 chai: 4.3.7 - eslint: 8.41.0 - eslint-config-oclif: 4.0.0_eslint@8.41.0 - eslint-config-oclif-typescript: 0.1.0_5ujgynla27k2qkzlnkldjwsutm + eslint: 8.45.0 + eslint-config-oclif: 4.0.0_eslint@8.45.0 + eslint-config-oclif-typescript: 0.1.0_mhvizudgavq6jzvqzwcqcv4nnm mocha: 10.1.0 nyc: 15.1.0 rimraf: 2.7.1 - sinon: 15.1.0 + sinon: 15.2.0 ts-node: 8.10.2_typescript@4.9.5 typescript: 4.9.5 packages/contentstack-config: specifiers: - '@contentstack/cli-command': ^1.2.9 - '@contentstack/cli-utilities': ^1.4.5 + '@contentstack/cli-command': ~1.2.11 + '@contentstack/cli-utilities': ~1.5.1 '@oclif/test': ^2.2.10 '@types/chai': ^4.2.18 '@types/inquirer': ^9.0.3 @@ -465,6 +471,7 @@ importers: globby: ^10.0.2 inquirer: 8.2.4 lodash: ^4.17.20 + mkdirp: ^1.0.4 mocha: 10.1.0 nyc: ^15.1.0 oclif: ^3.8.1 @@ -481,63 +488,67 @@ importers: debug: 4.3.4 inquirer: 8.2.4 lodash: 4.17.21 - winston: 3.8.2 + mkdirp: 1.0.4 + winston: 3.10.0 devDependencies: - '@oclif/test': 2.3.21_5vebceyeyrbj46wx3onulzfguy + '@oclif/test': 2.3.31_4qcp7qp4jxxdgb4qbxgwox4hwq '@types/chai': 4.3.5 '@types/inquirer': 9.0.3 '@types/mkdirp': 1.0.2 '@types/mocha': 8.2.3 - '@types/node': 14.18.47 + '@types/node': 14.18.53 '@types/sinon': 10.0.15 chai: 4.3.7 - eslint: 8.41.0 - eslint-config-oclif: 4.0.0_eslint@8.41.0 - eslint-config-oclif-typescript: 0.1.0_5ujgynla27k2qkzlnkldjwsutm + eslint: 8.45.0 + eslint-config-oclif: 4.0.0_eslint@8.45.0 + eslint-config-oclif-typescript: 0.1.0_mhvizudgavq6jzvqzwcqcv4nnm globby: 10.0.2 mocha: 10.1.0 nyc: 15.1.0 - oclif: 3.9.0_5vebceyeyrbj46wx3onulzfguy + oclif: 3.9.1_4qcp7qp4jxxdgb4qbxgwox4hwq rimraf: 2.7.1 - sinon: 15.1.0 + sinon: 15.2.0 tmp: 0.2.1 - ts-node: 10.9.1_5vebceyeyrbj46wx3onulzfguy + ts-node: 10.9.1_4qcp7qp4jxxdgb4qbxgwox4hwq typescript: 4.9.5 packages/contentstack-dev-dependencies: specifiers: - '@oclif/core': ^2.8.5 + '@oclif/core': ^2.9.3 '@types/node': ^14.14.32 - eslint: ^8.18.0 + eslint: ^7.32.0 fancy-test: ^2.0.0 lodash: ^4.17.21 - mocha: ^10.0.0 + mocha: 10.1.0 ts-node: ^10.9.1 tslib: ^2.5.0 typescript: ^4.9.3 dependencies: - '@oclif/core': 2.8.5_5vebceyeyrbj46wx3onulzfguy + '@oclif/core': 2.9.4_4qcp7qp4jxxdgb4qbxgwox4hwq lodash: 4.17.21 devDependencies: - '@types/node': 14.18.47 - eslint: 8.41.0 - fancy-test: 2.0.23 + '@types/node': 14.18.53 + eslint: 7.32.0 + fancy-test: 2.0.31 mocha: 10.1.0 - ts-node: 10.9.1_5vebceyeyrbj46wx3onulzfguy - tslib: 2.5.2 + ts-node: 10.9.1_4qcp7qp4jxxdgb4qbxgwox4hwq + tslib: 2.6.0 typescript: 4.9.5 packages/contentstack-export: specifiers: - '@contentstack/cli-auth': ^1.3.8 - '@contentstack/cli-command': ^1.2.9 - '@contentstack/cli-config': ^1.4.6 - '@contentstack/cli-dev-dependencies': ^1.2.3 - '@contentstack/cli-utilities': ^1.4.5 + '@contentstack/cli-auth': ~1.3.11 + '@contentstack/cli-command': ~1.2.11 + '@contentstack/cli-config': ~1.4.9 + '@contentstack/cli-dev-dependencies': ~1.2.3 + '@contentstack/cli-utilities': ~1.5.1 '@oclif/command': ^1.8.16 '@oclif/config': ^1.18.3 + '@oclif/core': ^2.9.3 '@oclif/plugin-help': ^5.1.19 '@oclif/test': ^1.2.6 + '@types/mkdirp': ^1.0.2 + '@types/progress-stream': ^2.0.2 assert: ^2.0.0 async: ^3.2.4 big-json: ^3.2.0 @@ -551,7 +562,8 @@ importers: globby: ^10.0.2 is-valid-path: ^0.1.1 lodash: ^4.17.20 - mkdirp: ^2.1.3 + merge: ^2.1.1 + mkdirp: ^1.0.4 mocha: 10.1.0 nyc: ^15.1.0 oclif: ^3.8.1 @@ -560,51 +572,61 @@ importers: promise-limit: ^2.7.0 proxyquire: ^2.1.3 sinon: ^15.0.1 + ts-node: ^10.9.1 + tslib: ^2.4.1 + typescript: ^4.9.3 winston: ^3.7.2 dependencies: '@contentstack/cli-command': link:../contentstack-command '@contentstack/cli-utilities': link:../contentstack-utilities - '@oclif/command': 1.8.26_@oclif+config@1.18.9 - '@oclif/config': 1.18.9 + '@oclif/command': 1.8.33_@oclif+config@1.18.14 + '@oclif/config': 1.18.14 + '@oclif/core': 2.9.4_typescript@4.9.5 async: 3.2.4 big-json: 3.2.0 bluebird: 3.7.2 chalk: 4.1.2 is-valid-path: 0.1.1 lodash: 4.17.21 - mkdirp: 2.1.6 + merge: 2.1.1 + mkdirp: 1.0.4 path: 0.12.7 progress-stream: 2.0.0 promise-limit: 2.7.0 proxyquire: 2.1.3 - winston: 3.8.2 + tslib: 2.6.0 + winston: 3.10.0 devDependencies: '@contentstack/cli-auth': link:../contentstack-auth '@contentstack/cli-config': link:../contentstack-config '@contentstack/cli-dev-dependencies': link:../contentstack-dev-dependencies - '@oclif/plugin-help': 5.2.9 + '@oclif/plugin-help': 5.2.14_typescript@4.9.5 '@oclif/test': 1.2.9 + '@types/mkdirp': 1.0.2 + '@types/progress-stream': 2.0.2 assert: 2.0.0 chai: 4.3.7 - dotenv: 16.0.3 + dotenv: 16.3.1 dotenv-expand: 9.0.0 - eslint: 8.41.0 - eslint-config-oclif: 4.0.0_eslint@8.41.0 + eslint: 8.45.0 + eslint-config-oclif: 4.0.0_eslint@8.45.0 globby: 10.0.2 mocha: 10.1.0 nyc: 15.1.0 - oclif: 3.9.0_bluebird@3.7.2 - sinon: 15.1.0 + oclif: 3.9.1_fxnscsehfcewpnie2ltbcrhxa4 + sinon: 15.2.0 + ts-node: 10.9.1_typescript@4.9.5 + typescript: 4.9.5 packages/contentstack-export-to-csv: specifiers: - '@contentstack/cli-command': ^1.2.9 - '@contentstack/cli-utilities': ^1.4.5 + '@contentstack/cli-command': ~1.2.11 + '@contentstack/cli-utilities': ~1.5.1 '@oclif/test': ^2.2.10 chai: ^4.2.0 chalk: ^4.1.0 debug: ^4.3.1 - eslint: ^8.18.0 + eslint: ^7.32.0 eslint-config-oclif: ^4.0.0 fast-csv: ^4.3.6 globby: ^10.0.2 @@ -623,22 +645,33 @@ importers: inquirer-checkbox-plus-prompt: 1.0.1 mkdirp: 1.0.4 devDependencies: - '@oclif/test': 2.3.21 + '@oclif/test': 2.3.31 chai: 4.3.7 debug: 4.3.4 - eslint: 8.41.0 - eslint-config-oclif: 4.0.0_eslint@8.41.0 + eslint: 7.32.0 + eslint-config-oclif: 4.0.0_eslint@7.32.0 globby: 10.0.2 mocha: 10.1.0 nyc: 15.1.0 - oclif: 3.9.0 + oclif: 3.9.1 packages/contentstack-import: specifiers: - '@contentstack/cli-command': ^1.2.9 - '@contentstack/cli-utilities': ^1.4.5 + '@contentstack/cli-command': ~1.2.11 + '@contentstack/cli-utilities': ~1.5.1 + '@contentstack/management': ~1.10.0 '@oclif/config': ^1.18.3 + '@oclif/core': ^2.9.3 '@oclif/test': ^1.2.6 + '@types/bluebird': ^3.5.38 + '@types/chai': ^4.2.18 + '@types/mkdirp': ^1.0.2 + '@types/mocha': ^8.2.2 + '@types/ncp': ^2.0.5 + '@types/node': ^14.14.32 + '@types/sinon': ^10.0.2 + '@types/tar': ^4.0.3 + '@typescript-eslint/eslint-plugin': ^5.48.2 big-json: ^3.2.0 bluebird: ^3.7.2 chai: ^4.2.0 @@ -646,46 +679,71 @@ importers: debug: ^4.1.0 eslint: ^8.18.0 eslint-config-oclif: ^4.0.0 - fs-extra: ^11.1.1 globby: ^10.0.2 lodash: ^4.17.20 marked: ^4.0.17 + merge: ^2.1.1 mkdirp: ^1.0.4 mocha: ^10.0.0 + ncp: ^2.0.0 nyc: ^15.1.0 oclif: ^3.8.1 promise-limit: ^2.7.0 + rimraf: ^2.7.1 + sinon: ^11.1.1 + tmp: ^0.2.1 + ts-node: ^10.9.1 + tslib: ^2.4.1 + typescript: ^4.9.3 winston: ^3.7.2 dependencies: '@contentstack/cli-command': link:../contentstack-command '@contentstack/cli-utilities': link:../contentstack-utilities - '@oclif/config': 1.18.9 + '@contentstack/management': 1.10.0_debug@4.3.4 + '@oclif/config': 1.18.14 + '@oclif/core': 2.9.4_4qcp7qp4jxxdgb4qbxgwox4hwq big-json: 3.2.0 bluebird: 3.7.2 chalk: 4.1.2 debug: 4.3.4 - fs-extra: 11.1.1 lodash: 4.17.21 marked: 4.3.0 + merge: 2.1.1 mkdirp: 1.0.4 + ncp: 2.0.0 promise-limit: 2.7.0 - winston: 3.8.2 + tslib: 2.6.0 + winston: 3.10.0 devDependencies: '@oclif/test': 1.2.9 + '@types/bluebird': 3.5.38 + '@types/chai': 4.3.5 + '@types/mkdirp': 1.0.2 + '@types/mocha': 8.2.3 + '@types/ncp': 2.0.5 + '@types/node': 14.18.53 + '@types/sinon': 10.0.15 + '@types/tar': 4.0.5 + '@typescript-eslint/eslint-plugin': 5.62.0_mhvizudgavq6jzvqzwcqcv4nnm chai: 4.3.7 - eslint: 8.41.0 - eslint-config-oclif: 4.0.0_eslint@8.41.0 + eslint: 8.45.0 + eslint-config-oclif: 4.0.0_eslint@8.45.0 globby: 10.0.2 mocha: 10.1.0 nyc: 15.1.0 - oclif: 3.9.0_bluebird@3.7.2 + oclif: 3.9.1_ui2ktwjrqrvevaryls3virrjnm + rimraf: 2.7.1 + sinon: 11.1.2 + tmp: 0.2.1 + ts-node: 10.9.1_4qcp7qp4jxxdgb4qbxgwox4hwq + typescript: 4.9.5 packages/contentstack-launch: specifiers: '@apollo/client': ^3.7.9 - '@contentstack/cli-command': ^1.2.9 - '@contentstack/cli-utilities': ^1.4.5 - '@oclif/core': ^2.8.2 + '@contentstack/cli-command': ~1.2.11 + '@contentstack/cli-utilities': ~1.5.1 + '@oclif/core': ^2.9.3 '@oclif/plugin-help': ^5 '@oclif/plugin-plugins': ^2.3.2 '@oclif/test': ^2.3.6 @@ -719,49 +777,49 @@ importers: typescript: ^4.9.5 winston: ^3.8.2 dependencies: - '@apollo/client': 3.7.14_graphql@16.6.0 + '@apollo/client': 3.7.17_graphql@16.7.1 '@contentstack/cli-command': link:../contentstack-command '@contentstack/cli-utilities': link:../contentstack-utilities - '@oclif/core': 2.8.5_2unbv6mhrq4prucamkttzlebiq - '@oclif/plugin-help': 5.2.9_2unbv6mhrq4prucamkttzlebiq - '@oclif/plugin-plugins': 2.4.7_2unbv6mhrq4prucamkttzlebiq + '@oclif/core': 2.9.4_npeoqfxwgl5njwqojmpesqhar4 + '@oclif/plugin-help': 5.2.14_npeoqfxwgl5njwqojmpesqhar4 + '@oclif/plugin-plugins': 2.4.7_npeoqfxwgl5njwqojmpesqhar4 '@types/express': 4.17.17 '@types/express-serve-static-core': 4.17.35 adm-zip: 0.5.10 chalk: 4.1.2 - cross-fetch: 3.1.6 - dotenv: 16.0.3 + cross-fetch: 3.1.8 + dotenv: 16.3.1 esm: 3.2.25 express: 4.18.2 form-data: 4.0.0 - graphql: 16.6.0 + graphql: 16.7.1 ini: 3.0.1 lodash: 4.17.21 open: 8.4.2 - winston: 3.8.2 + winston: 3.10.0 devDependencies: - '@oclif/test': 2.3.21_2unbv6mhrq4prucamkttzlebiq + '@oclif/test': 2.3.31_npeoqfxwgl5njwqojmpesqhar4 '@types/adm-zip': 0.5.0 '@types/chai': 4.3.5 '@types/esm': 3.2.0 '@types/ini': 1.3.31 '@types/lodash': 4.14.195 - '@types/node': 16.18.32 + '@types/node': 16.18.38 chai: 4.3.7 eslint: 7.32.0 eslint-config-oclif: 4.0.0_eslint@7.32.0 eslint-config-oclif-typescript: 1.0.3_jofidmxrjzhj7l6vknpw5ecvfe - oclif: 3.9.0_2unbv6mhrq4prucamkttzlebiq + oclif: 3.9.1_npeoqfxwgl5njwqojmpesqhar4 shx: 0.3.4 - ts-node: 10.9.1_2unbv6mhrq4prucamkttzlebiq - tslib: 2.5.2 + ts-node: 10.9.1_npeoqfxwgl5njwqojmpesqhar4 + tslib: 2.6.0 typescript: 4.9.5 packages/contentstack-migrate-rte: specifiers: - '@contentstack/cli-command': ^1.2.9 - '@contentstack/cli-utilities': ^1.4.5 - '@contentstack/json-rte-serializer': ^2.0.2 + '@contentstack/cli-command': ~1.2.11 + '@contentstack/cli-utilities': ~1.5.1 + '@contentstack/json-rte-serializer': ~2.0.2 '@oclif/test': ^2.2.10 chai: ^4.3.4 chalk: ^4.1.2 @@ -789,25 +847,25 @@ importers: jsdom: 20.0.3 jsonschema: 1.4.1 lodash: 4.17.21 - nock: 13.3.1 + nock: 13.3.2 omit-deep-lodash: 1.1.7 - sinon: 15.1.0 + sinon: 15.2.0 uuid: 9.0.0 devDependencies: - '@oclif/test': 2.3.21 + '@oclif/test': 2.3.31 chai: 4.3.7 - eslint: 8.41.0 - eslint-config-oclif: 4.0.0_eslint@8.41.0 + eslint: 8.45.0 + eslint-config-oclif: 4.0.0_eslint@8.45.0 globby: 10.0.2 mocha: 10.1.0 nyc: 15.1.0 - oclif: 3.9.0 + oclif: 3.9.1 tslib: 1.14.1 packages/contentstack-migration: specifiers: - '@contentstack/cli-command': ^1.2.9 - '@contentstack/cli-utilities': ^1.4.5 + '@contentstack/cli-command': ~1.2.11 + '@contentstack/cli-utilities': ~1.5.1 '@oclif/command': ^1.8.16 '@oclif/config': ^1.18.3 '@oclif/test': ^2.2.10 @@ -825,7 +883,6 @@ importers: jsdoc-to-markdown: ^7.0.1 listr: ^0.14.3 mkdirp: ^1.0.4 - mocha: ^10.0.0 nock: ^13.1.1 nyc: ^15.1.0 oclif: ^3.8.1 @@ -833,35 +890,34 @@ importers: dependencies: '@contentstack/cli-command': link:../contentstack-command '@contentstack/cli-utilities': link:../contentstack-utilities - '@oclif/command': 1.8.26_@oclif+config@1.18.9 - '@oclif/config': 1.18.9 + '@oclif/command': 1.8.33_@oclif+config@1.18.14 + '@oclif/config': 1.18.14 async: 3.2.4 callsites: 3.1.0 cardinal: 2.1.1 chalk: 4.1.2 dot-object: 2.1.4 - dotenv: 16.0.3 + dotenv: 16.3.1 listr: 0.14.3 - winston: 3.8.2 + winston: 3.10.0 devDependencies: - '@oclif/test': 2.3.21 + '@oclif/test': 2.3.31 chai: 4.3.7 - eslint: 8.41.0 + eslint: 8.45.0 globby: 10.0.2 husky: 8.0.3 jsdoc: 4.0.2 jsdoc-to-markdown: 7.1.1 mkdirp: 1.0.4 - mocha: 10.1.0 - nock: 13.3.1 + nock: 13.3.2 nyc: 15.1.0 - oclif: 3.9.0 + oclif: 3.9.1 packages/contentstack-seed: specifiers: - '@contentstack/cli-cm-import': ^1.5.11 - '@contentstack/cli-command': ^1.2.9 - '@contentstack/cli-utilities': ^1.4.5 + '@contentstack/cli-cm-import': ~1.8.0 + '@contentstack/cli-command': ~1.2.11 + '@contentstack/cli-utilities': ~1.5.1 '@oclif/plugin-help': ^5.1.19 '@types/inquirer': ^9.0.3 '@types/jest': ^26.0.15 @@ -893,29 +949,29 @@ importers: mkdirp: 1.0.4 tar: 6.1.15 tmp: 0.2.1 - tslib: 2.5.2 + tslib: 2.6.0 devDependencies: - '@oclif/plugin-help': 5.2.9_5vebceyeyrbj46wx3onulzfguy + '@oclif/plugin-help': 5.2.14_4qcp7qp4jxxdgb4qbxgwox4hwq '@types/inquirer': 9.0.3 '@types/jest': 26.0.24 '@types/mkdirp': 1.0.2 - '@types/node': 14.18.47 + '@types/node': 14.18.53 '@types/tar': 6.1.5 '@types/tmp': 0.2.3 - eslint: 8.41.0 - eslint-config-oclif: 4.0.0_eslint@8.41.0 - eslint-config-oclif-typescript: 0.1.0_5ujgynla27k2qkzlnkldjwsutm + eslint: 8.45.0 + eslint-config-oclif: 4.0.0_eslint@8.45.0 + eslint-config-oclif-typescript: 0.1.0_mhvizudgavq6jzvqzwcqcv4nnm globby: 10.0.2 - jest: 29.5.0_iyzkm66nwd6ibglzwx45thyqle - oclif: 3.9.0_5vebceyeyrbj46wx3onulzfguy - ts-jest: 29.1.0_doipufordlnvh5g4adbwayvyvy + jest: 29.6.1_wfb4agvwth77yq3yn67m4qmzdm + oclif: 3.9.1_4qcp7qp4jxxdgb4qbxgwox4hwq + ts-jest: 29.1.1_dqjx4clx5uib3whf4y4dxwq3by ts-node: 8.10.2_typescript@4.9.5 typescript: 4.9.5 packages/contentstack-utilities: specifiers: - '@contentstack/management': ^1.8.0 - '@oclif/core': ^2.8.2 + '@contentstack/management': ~1.10.0 + '@oclif/core': ^2.9.3 '@oclif/test': ^2.2.10 '@types/chai': ^4.2.18 '@types/inquirer': ^9.0.3 @@ -940,6 +996,7 @@ importers: inquirer-search-checkbox: ^1.0.0 inquirer-search-list: ^1.2.6 lodash: ^4.17.15 + mkdirp: ^1.0.4 mocha: 10.1.0 nock: ^13.1.0 nyc: ^15.1.0 @@ -957,8 +1014,8 @@ importers: winston: ^3.7.2 xdg-basedir: ^4.0.0 dependencies: - '@contentstack/management': 1.8.0_debug@4.3.4 - '@oclif/core': 2.8.5_5vebceyeyrbj46wx3onulzfguy + '@contentstack/management': 1.10.0_debug@4.3.4 + '@oclif/core': 2.9.4_4qcp7qp4jxxdgb4qbxgwox4hwq axios: 1.3.4_debug@4.3.4 chalk: 4.1.2 cli-cursor: 3.1.0 @@ -970,39 +1027,45 @@ importers: inquirer-search-checkbox: 1.0.0 inquirer-search-list: 1.2.6 lodash: 4.17.21 + mkdirp: 1.0.4 open: 8.4.2 ora: 5.4.1 rxjs: 6.6.7 unique-string: 2.0.0 uuid: 9.0.0 - winston: 3.8.2 + winston: 3.10.0 xdg-basedir: 4.0.0 devDependencies: - '@oclif/test': 2.3.21_5vebceyeyrbj46wx3onulzfguy + '@oclif/test': 2.3.31_4qcp7qp4jxxdgb4qbxgwox4hwq '@types/chai': 4.3.5 '@types/inquirer': 9.0.3 '@types/mkdirp': 1.0.2 '@types/mocha': 8.2.3 - '@types/node': 14.18.47 + '@types/node': 14.18.53 '@types/sinon': 10.0.15 chai: 4.3.7 - eslint: 8.41.0 - eslint-config-oclif: 4.0.0_eslint@8.41.0 - eslint-config-oclif-typescript: 0.2.0_5ujgynla27k2qkzlnkldjwsutm - fancy-test: 2.0.23 + eslint: 8.45.0 + eslint-config-oclif: 4.0.0_eslint@8.45.0 + eslint-config-oclif-typescript: 0.2.0_mhvizudgavq6jzvqzwcqcv4nnm + fancy-test: 2.0.31 globby: 10.0.2 mocha: 10.1.0 - nock: 13.3.1 + nock: 13.3.2 nyc: 15.1.0 rimraf: 2.7.1 - sinon: 15.1.0 + sinon: 15.2.0 tmp: 0.2.1 - ts-node: 10.9.1_5vebceyeyrbj46wx3onulzfguy + ts-node: 10.9.1_4qcp7qp4jxxdgb4qbxgwox4hwq tslib: 1.14.1 typescript: 4.9.5 packages: + /@aashutoshrathi/word-wrap/1.2.6: + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + dev: true + /@ampproject/remapping/2.2.1: resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} engines: {node: '>=6.0.0'} @@ -1011,8 +1074,8 @@ packages: '@jridgewell/trace-mapping': 0.3.18 dev: true - /@apollo/client/3.7.14_graphql@16.6.0: - resolution: {integrity: sha512-BRvdkwq5PAXBkjXjboO12uksDm3nrZEqDi4xF97Fk3Mnaa0zDOEfJa7hoKTY9b9KA1EkeWv9BL3i7hSd4SfGBg==} + /@apollo/client/3.7.17_graphql@16.7.1: + resolution: {integrity: sha512-0EErSHEtKPNl5wgWikHJbKFAzJ/k11O0WO2QyqZSHpdxdAnw7UWHY4YiLbHCFG7lhrD+NTQ3Z/H9Jn4rcikoJA==} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 graphql-ws: ^5.5.5 @@ -1029,389 +1092,387 @@ packages: subscriptions-transport-ws: optional: true dependencies: - '@graphql-typed-document-node/core': 3.2.0_graphql@16.6.0 + '@graphql-typed-document-node/core': 3.2.0_graphql@16.7.1 '@wry/context': 0.7.3 '@wry/equality': 0.5.6 - '@wry/trie': 0.3.2 - graphql: 16.6.0 - graphql-tag: 2.12.6_graphql@16.6.0 + '@wry/trie': 0.4.3 + graphql: 16.7.1 + graphql-tag: 2.12.6_graphql@16.7.1 hoist-non-react-statics: 3.3.2 optimism: 0.16.2 prop-types: 15.8.1 response-iterator: 0.2.6 symbol-observable: 4.0.0 ts-invariant: 0.10.3 - tslib: 2.5.2 + tslib: 2.6.0 zen-observable-ts: 1.2.5 dev: false /@babel/code-frame/7.12.11: resolution: {integrity: sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==} dependencies: - '@babel/highlight': 7.18.6 + '@babel/highlight': 7.22.5 dev: true - /@babel/code-frame/7.21.4: - resolution: {integrity: sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==} + /@babel/code-frame/7.22.5: + resolution: {integrity: sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/highlight': 7.18.6 + '@babel/highlight': 7.22.5 dev: true - /@babel/compat-data/7.21.9: - resolution: {integrity: sha512-FUGed8kfhyWvbYug/Un/VPJD41rDIgoVVcR+FuzhzOYyRz5uED+Gd3SLZml0Uw2l2aHFb7ZgdW5mGA3G2cCCnQ==} + /@babel/compat-data/7.22.9: + resolution: {integrity: sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==} engines: {node: '>=6.9.0'} dev: true - /@babel/core/7.21.8: - resolution: {integrity: sha512-YeM22Sondbo523Sz0+CirSPnbj9bG3P0CdHcBZdqUuaeOaYEFbOLoGU7lebvGP6P5J/WE9wOn7u7C4J9HvS1xQ==} + /@babel/core/7.22.9: + resolution: {integrity: sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==} engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.21.4 - '@babel/generator': 7.21.9 - '@babel/helper-compilation-targets': 7.21.5_@babel+core@7.21.8 - '@babel/helper-module-transforms': 7.21.5 - '@babel/helpers': 7.21.5 - '@babel/parser': 7.21.9 - '@babel/template': 7.21.9 - '@babel/traverse': 7.21.5 - '@babel/types': 7.21.5 + '@babel/code-frame': 7.22.5 + '@babel/generator': 7.22.9 + '@babel/helper-compilation-targets': 7.22.9_@babel+core@7.22.9 + '@babel/helper-module-transforms': 7.22.9_@babel+core@7.22.9 + '@babel/helpers': 7.22.6 + '@babel/parser': 7.22.7 + '@babel/template': 7.22.5 + '@babel/traverse': 7.22.8 + '@babel/types': 7.22.5 convert-source-map: 1.9.0 debug: 4.3.4 gensync: 1.0.0-beta.2 json5: 2.2.3 - semver: 6.3.0 + semver: 6.3.1 transitivePeerDependencies: - supports-color dev: true - /@babel/eslint-parser/7.21.8_btda5vh3j4tohbqgrkgx3qt2km: - resolution: {integrity: sha512-HLhI+2q+BP3sf78mFUZNCGc10KEmoUqtUT1OCdMZsN+qr4qFeLUod62/zAnF3jNQstwyasDkZnVXwfK2Bml7MQ==} + /@babel/eslint-parser/7.22.9_mxva3tvsh22zo7fr2tqrirzrru: + resolution: {integrity: sha512-xdMkt39/nviO/4vpVdrEYPwXCsYIXSSAr6mC7WQsNIlGnuxKyKE7GZjalcnbSWiC4OXGNNN3UQPeHfjSC6sTDA==} engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} peerDependencies: '@babel/core': '>=7.11.0' eslint: ^7.5.0 || ^8.0.0 dependencies: - '@babel/core': 7.21.8 + '@babel/core': 7.22.9 '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 - eslint: 7.32.0 + eslint: 8.45.0 eslint-visitor-keys: 2.1.0 - semver: 6.3.0 + semver: 6.3.1 dev: true - /@babel/eslint-parser/7.21.8_fnsrarlmvgqcaofxh5pcbbd6rm: - resolution: {integrity: sha512-HLhI+2q+BP3sf78mFUZNCGc10KEmoUqtUT1OCdMZsN+qr4qFeLUod62/zAnF3jNQstwyasDkZnVXwfK2Bml7MQ==} + /@babel/eslint-parser/7.22.9_obubolzgl5d4rtlk2lhkmaaisu: + resolution: {integrity: sha512-xdMkt39/nviO/4vpVdrEYPwXCsYIXSSAr6mC7WQsNIlGnuxKyKE7GZjalcnbSWiC4OXGNNN3UQPeHfjSC6sTDA==} engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} peerDependencies: '@babel/core': '>=7.11.0' eslint: ^7.5.0 || ^8.0.0 dependencies: - '@babel/core': 7.21.8 + '@babel/core': 7.22.9 '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 - eslint: 8.41.0 + eslint: 7.32.0 eslint-visitor-keys: 2.1.0 - semver: 6.3.0 + semver: 6.3.1 dev: true - /@babel/generator/7.21.9: - resolution: {integrity: sha512-F3fZga2uv09wFdEjEQIJxXALXfz0+JaOb7SabvVMmjHxeVTuGW8wgE8Vp1Hd7O+zMTYtcfEISGRzPkeiaPPsvg==} + /@babel/generator/7.22.9: + resolution: {integrity: sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.21.5 + '@babel/types': 7.22.5 '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.18 jsesc: 2.5.2 dev: true - /@babel/helper-compilation-targets/7.21.5_@babel+core@7.21.8: - resolution: {integrity: sha512-1RkbFGUKex4lvsB9yhIfWltJM5cZKUftB2eNajaDv3dCMEp49iBG0K14uH8NnX9IPux2+mK7JGEOB0jn48/J6w==} + /@babel/helper-compilation-targets/7.22.9_@babel+core@7.22.9: + resolution: {integrity: sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/compat-data': 7.21.9 - '@babel/core': 7.21.8 - '@babel/helper-validator-option': 7.21.0 - browserslist: 4.21.5 + '@babel/compat-data': 7.22.9 + '@babel/core': 7.22.9 + '@babel/helper-validator-option': 7.22.5 + browserslist: 4.21.9 lru-cache: 5.1.1 - semver: 6.3.0 + semver: 6.3.1 dev: true - /@babel/helper-environment-visitor/7.21.5: - resolution: {integrity: sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ==} + /@babel/helper-environment-visitor/7.22.5: + resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-function-name/7.21.0: - resolution: {integrity: sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==} + /@babel/helper-function-name/7.22.5: + resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.21.9 - '@babel/types': 7.21.5 + '@babel/template': 7.22.5 + '@babel/types': 7.22.5 dev: true - /@babel/helper-hoist-variables/7.18.6: - resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} + /@babel/helper-hoist-variables/7.22.5: + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.21.5 + '@babel/types': 7.22.5 dev: true - /@babel/helper-module-imports/7.21.4: - resolution: {integrity: sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==} + /@babel/helper-module-imports/7.22.5: + resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.21.5 + '@babel/types': 7.22.5 dev: true - /@babel/helper-module-transforms/7.21.5: - resolution: {integrity: sha512-bI2Z9zBGY2q5yMHoBvJ2a9iX3ZOAzJPm7Q8Yz6YeoUjU/Cvhmi2G4QyTNyPBqqXSgTjUxRg3L0xV45HvkNWWBw==} + /@babel/helper-module-transforms/7.22.9_@babel+core@7.22.9: + resolution: {integrity: sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 dependencies: - '@babel/helper-environment-visitor': 7.21.5 - '@babel/helper-module-imports': 7.21.4 - '@babel/helper-simple-access': 7.21.5 - '@babel/helper-split-export-declaration': 7.18.6 - '@babel/helper-validator-identifier': 7.19.1 - '@babel/template': 7.21.9 - '@babel/traverse': 7.21.5 - '@babel/types': 7.21.5 - transitivePeerDependencies: - - supports-color + '@babel/core': 7.22.9 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-module-imports': 7.22.5 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.5 dev: true - /@babel/helper-plugin-utils/7.21.5: - resolution: {integrity: sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg==} + /@babel/helper-plugin-utils/7.22.5: + resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-simple-access/7.21.5: - resolution: {integrity: sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg==} + /@babel/helper-simple-access/7.22.5: + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.21.5 + '@babel/types': 7.22.5 dev: true - /@babel/helper-split-export-declaration/7.18.6: - resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} + /@babel/helper-split-export-declaration/7.22.6: + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.21.5 + '@babel/types': 7.22.5 dev: true - /@babel/helper-string-parser/7.21.5: - resolution: {integrity: sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==} + /@babel/helper-string-parser/7.22.5: + resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-validator-identifier/7.19.1: - resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} + /@babel/helper-validator-identifier/7.22.5: + resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-validator-option/7.21.0: - resolution: {integrity: sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==} + /@babel/helper-validator-option/7.22.5: + resolution: {integrity: sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==} engines: {node: '>=6.9.0'} dev: true - /@babel/helpers/7.21.5: - resolution: {integrity: sha512-BSY+JSlHxOmGsPTydUkPf1MdMQ3M81x5xGCOVgWM3G8XH77sJ292Y2oqcp0CbbgxhqBuI46iUz1tT7hqP7EfgA==} + /@babel/helpers/7.22.6: + resolution: {integrity: sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.21.9 - '@babel/traverse': 7.21.5 - '@babel/types': 7.21.5 + '@babel/template': 7.22.5 + '@babel/traverse': 7.22.8 + '@babel/types': 7.22.5 transitivePeerDependencies: - supports-color dev: true - /@babel/highlight/7.18.6: - resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} + /@babel/highlight/7.22.5: + resolution: {integrity: sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-validator-identifier': 7.19.1 + '@babel/helper-validator-identifier': 7.22.5 chalk: 2.4.2 js-tokens: 4.0.0 dev: true - /@babel/parser/7.21.9: - resolution: {integrity: sha512-q5PNg/Bi1OpGgx5jYlvWZwAorZepEudDMCLtj967aeS7WMont7dUZI46M2XwcIQqvUlMxWfdLFu4S/qSxeUu5g==} + /@babel/parser/7.22.7: + resolution: {integrity: sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==} engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.21.5 + '@babel/types': 7.22.5 dev: true - /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.21.8: + /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.22.9: resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.8 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-bigint/7.8.3_@babel+core@7.21.8: + /@babel/plugin-syntax-bigint/7.8.3_@babel+core@7.22.9: resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.8 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.21.8: + /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.22.9: resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.8 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.21.8: + /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.22.9: resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.8 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.21.8: + /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.22.9: resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.8 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-jsx/7.21.4_@babel+core@7.21.8: - resolution: {integrity: sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==} + /@babel/plugin-syntax-jsx/7.22.5_@babel+core@7.22.9: + resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.8 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.21.8: + /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.22.9: resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.8 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.21.8: + /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.22.9: resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.8 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.21.8: + /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.22.9: resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.8 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.21.8: + /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.22.9: resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.8 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.21.8: + /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.22.9: resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.8 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.21.8: + /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.22.9: resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.8 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.21.8: + /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.22.9: resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.8 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-typescript/7.21.4_@babel+core@7.21.8: - resolution: {integrity: sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==} + /@babel/plugin-syntax-typescript/7.22.5_@babel+core@7.22.9: + resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.8 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/core': 7.22.9 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/runtime/7.21.5: - resolution: {integrity: sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q==} + /@babel/runtime/7.22.6: + resolution: {integrity: sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==} engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.13.11 dev: true - /@babel/template/7.21.9: - resolution: {integrity: sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ==} + /@babel/template/7.22.5: + resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.21.4 - '@babel/parser': 7.21.9 - '@babel/types': 7.21.5 + '@babel/code-frame': 7.22.5 + '@babel/parser': 7.22.7 + '@babel/types': 7.22.5 dev: true - /@babel/traverse/7.21.5: - resolution: {integrity: sha512-AhQoI3YjWi6u/y/ntv7k48mcrCXmus0t79J9qPNlk/lAsFlCiJ047RmbfMOawySTHtywXhbXgpx/8nXMYd+oFw==} + /@babel/traverse/7.22.8: + resolution: {integrity: sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.21.4 - '@babel/generator': 7.21.9 - '@babel/helper-environment-visitor': 7.21.5 - '@babel/helper-function-name': 7.21.0 - '@babel/helper-hoist-variables': 7.18.6 - '@babel/helper-split-export-declaration': 7.18.6 - '@babel/parser': 7.21.9 - '@babel/types': 7.21.5 + '@babel/code-frame': 7.22.5 + '@babel/generator': 7.22.9 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-function-name': 7.22.5 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.22.7 + '@babel/types': 7.22.5 debug: 4.3.4 globals: 11.12.0 transitivePeerDependencies: - supports-color dev: true - /@babel/types/7.21.5: - resolution: {integrity: sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q==} + /@babel/types/7.22.5: + resolution: {integrity: sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-string-parser': 7.21.5 - '@babel/helper-validator-identifier': 7.19.1 + '@babel/helper-string-parser': 7.22.5 + '@babel/helper-validator-identifier': 7.22.5 to-fast-properties: 2.0.0 dev: true @@ -1424,6 +1485,11 @@ packages: engines: {node: '>=0.1.90'} dev: false + /@colors/colors/1.6.0: + resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} + engines: {node: '>=0.1.90'} + dev: false + /@contentstack/json-rte-serializer/2.0.2: resolution: {integrity: sha512-mGRuXXYY4Ao0MTWUV/1aNwk5DCcNtbJA2uOA1v7t/IzSqSF4jKuz+RFZLYtSPz8vqBtPT2AgKwfs5mVB4cnYRA==} dependencies: @@ -1431,12 +1497,12 @@ packages: lodash: 4.17.21 slate: 0.72.8 slate-hyperscript: 0.62.0_slate@0.72.8 - tslib: 2.5.2 + tslib: 2.6.0 uuid: 8.3.2 dev: false - /@contentstack/management/1.8.0_debug@4.3.4: - resolution: {integrity: sha512-rKI9CEwwmh8L0f5OaicjBlty0O77BT3KiHkPj23rJ2lLWlas7RlWaVhbavXJASSpS0w1FWx8+BmGwkaAoRVyRg==} + /@contentstack/management/1.10.0_debug@4.3.4: + resolution: {integrity: sha512-wnmVS19n3cZeh6T2PbBXGCr4irktunVmuECTyPF5++Rsc6GDO+FoQGCZdvzHpRZE0GLiPFIID50z2TZuNArEOg==} engines: {node: '>=8.0.0'} dependencies: axios: 0.27.2_debug@4.3.4 @@ -1465,13 +1531,13 @@ packages: kuler: 2.0.0 dev: false - /@eslint-community/eslint-utils/4.4.0_eslint@8.41.0: + /@eslint-community/eslint-utils/4.4.0_eslint@8.45.0: resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 8.41.0 + eslint: 8.45.0 eslint-visitor-keys: 3.4.1 dev: true @@ -1497,13 +1563,13 @@ packages: - supports-color dev: true - /@eslint/eslintrc/2.0.3: - resolution: {integrity: sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==} + /@eslint/eslintrc/2.1.0: + resolution: {integrity: sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 debug: 4.3.4 - espree: 9.5.2 + espree: 9.6.1 globals: 13.20.0 ignore: 5.2.4 import-fresh: 3.3.0 @@ -1514,8 +1580,8 @@ packages: - supports-color dev: true - /@eslint/js/8.41.0: - resolution: {integrity: sha512-LxcyMGxwmTh2lY9FwHPGWOHmYFCZvbrFCBZL4FzSSsxsRPuhrYUg/49/0KDfW8tnIEaEHtfmn6+NPN+1DqaNmA==} + /@eslint/js/8.44.0: + resolution: {integrity: sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true @@ -1527,7 +1593,7 @@ packages: /@fast-csv/format/4.3.5: resolution: {integrity: sha512-8iRn6QF3I8Ak78lNAa+Gdl5MJJBM5vRHivFtMRUWINdevNo00K7OXxS2PshawLKTejVwieIlPmK5YlLu6w4u8A==} dependencies: - '@types/node': 14.18.47 + '@types/node': 14.18.53 lodash.escaperegexp: 4.1.2 lodash.isboolean: 3.0.3 lodash.isequal: 4.5.0 @@ -1538,7 +1604,7 @@ packages: /@fast-csv/parse/4.3.6: resolution: {integrity: sha512-uRsLYksqpbDmWaSmzvJcuApSEe38+6NQZBUsuAyMZKqHxH0g1wcJgsKUvN3WC8tewaqFjBMMGrkHmC+T7k8LvA==} dependencies: - '@types/node': 14.18.47 + '@types/node': 14.18.53 lodash.escaperegexp: 4.1.2 lodash.groupby: 4.6.0 lodash.isfunction: 3.0.9 @@ -1551,16 +1617,16 @@ packages: resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} dev: true - /@graphql-typed-document-node/core/3.2.0_graphql@16.6.0: + /@graphql-typed-document-node/core/3.2.0_graphql@16.7.1: resolution: {integrity: sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==} peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - graphql: 16.6.0 + graphql: 16.7.1 dev: false - /@humanwhocodes/config-array/0.11.8: - resolution: {integrity: sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==} + /@humanwhocodes/config-array/0.11.10: + resolution: {integrity: sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==} engines: {node: '>=10.10.0'} dependencies: '@humanwhocodes/object-schema': 1.2.1 @@ -1596,7 +1662,7 @@ packages: dependencies: string-width: 5.1.2 string-width-cjs: /string-width/4.2.3 - strip-ansi: 7.0.1 + strip-ansi: 7.1.0 strip-ansi-cjs: /strip-ansi/6.0.1 wrap-ansi: 8.1.0 wrap-ansi-cjs: /wrap-ansi/7.0.0 @@ -1622,20 +1688,20 @@ packages: engines: {node: '>=8'} dev: true - /@jest/console/29.5.0: - resolution: {integrity: sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ==} + /@jest/console/29.6.1: + resolution: {integrity: sha512-Aj772AYgwTSr5w8qnyoJ0eDYvN6bMsH3ORH1ivMotrInHLKdUz6BDlaEXHdM6kODaBIkNIyQGzsMvRdOv7VG7Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.5.0 - '@types/node': 16.18.32 + '@jest/types': 29.6.1 + '@types/node': 16.18.38 chalk: 4.1.2 - jest-message-util: 29.5.0 - jest-util: 29.5.0 + jest-message-util: 29.6.1 + jest-util: 29.6.1 slash: 3.0.0 dev: true - /@jest/core/29.5.0: - resolution: {integrity: sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ==} + /@jest/core/29.6.1: + resolution: {integrity: sha512-CcowHypRSm5oYQ1obz1wfvkjZZ2qoQlrKKvlfPwh5jUXVU12TWr2qMeH8chLMuTFzHh5a1g2yaqlqDICbr+ukQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -1643,32 +1709,32 @@ packages: node-notifier: optional: true dependencies: - '@jest/console': 29.5.0 - '@jest/reporters': 29.5.0 - '@jest/test-result': 29.5.0 - '@jest/transform': 29.5.0 - '@jest/types': 29.5.0 - '@types/node': 16.18.32 + '@jest/console': 29.6.1 + '@jest/reporters': 29.6.1 + '@jest/test-result': 29.6.1 + '@jest/transform': 29.6.1 + '@jest/types': 29.6.1 + '@types/node': 16.18.38 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.8.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.5.0 - jest-config: 29.5.0_@types+node@16.18.32 - jest-haste-map: 29.5.0 - jest-message-util: 29.5.0 + jest-config: 29.6.1_@types+node@16.18.38 + jest-haste-map: 29.6.1 + jest-message-util: 29.6.1 jest-regex-util: 29.4.3 - jest-resolve: 29.5.0 - jest-resolve-dependencies: 29.5.0 - jest-runner: 29.5.0 - jest-runtime: 29.5.0 - jest-snapshot: 29.5.0 - jest-util: 29.5.0 - jest-validate: 29.5.0 - jest-watcher: 29.5.0 + jest-resolve: 29.6.1 + jest-resolve-dependencies: 29.6.1 + jest-runner: 29.6.1 + jest-runtime: 29.6.1 + jest-snapshot: 29.6.1 + jest-util: 29.6.1 + jest-validate: 29.6.1 + jest-watcher: 29.6.1 micromatch: 4.0.5 - pretty-format: 29.5.0 + pretty-format: 29.6.1 slash: 3.0.0 strip-ansi: 6.0.1 transitivePeerDependencies: @@ -1676,8 +1742,8 @@ packages: - ts-node dev: true - /@jest/core/29.5.0_ts-node@8.10.2: - resolution: {integrity: sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ==} + /@jest/core/29.6.1_ts-node@8.10.2: + resolution: {integrity: sha512-CcowHypRSm5oYQ1obz1wfvkjZZ2qoQlrKKvlfPwh5jUXVU12TWr2qMeH8chLMuTFzHh5a1g2yaqlqDICbr+ukQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -1685,32 +1751,32 @@ packages: node-notifier: optional: true dependencies: - '@jest/console': 29.5.0 - '@jest/reporters': 29.5.0 - '@jest/test-result': 29.5.0 - '@jest/transform': 29.5.0 - '@jest/types': 29.5.0 - '@types/node': 16.18.32 + '@jest/console': 29.6.1 + '@jest/reporters': 29.6.1 + '@jest/test-result': 29.6.1 + '@jest/transform': 29.6.1 + '@jest/types': 29.6.1 + '@types/node': 16.18.38 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.8.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.5.0 - jest-config: 29.5.0_twhdbbjemi47nc2cbdu4ucg3o4 - jest-haste-map: 29.5.0 - jest-message-util: 29.5.0 + jest-config: 29.6.1_3rpyy5m6ecptevocbfxnh4t3uq + jest-haste-map: 29.6.1 + jest-message-util: 29.6.1 jest-regex-util: 29.4.3 - jest-resolve: 29.5.0 - jest-resolve-dependencies: 29.5.0 - jest-runner: 29.5.0 - jest-runtime: 29.5.0 - jest-snapshot: 29.5.0 - jest-util: 29.5.0 - jest-validate: 29.5.0 - jest-watcher: 29.5.0 + jest-resolve: 29.6.1 + jest-resolve-dependencies: 29.6.1 + jest-runner: 29.6.1 + jest-runtime: 29.6.1 + jest-snapshot: 29.6.1 + jest-util: 29.6.1 + jest-validate: 29.6.1 + jest-watcher: 29.6.1 micromatch: 4.0.5 - pretty-format: 29.5.0 + pretty-format: 29.6.1 slash: 3.0.0 strip-ansi: 6.0.1 transitivePeerDependencies: @@ -1718,59 +1784,59 @@ packages: - ts-node dev: true - /@jest/environment/29.5.0: - resolution: {integrity: sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ==} + /@jest/environment/29.6.1: + resolution: {integrity: sha512-RMMXx4ws+Gbvw3DfLSuo2cfQlK7IwGbpuEWXCqyYDcqYTI+9Ju3a5hDnXaxjNsa6uKh9PQF2v+qg+RLe63tz5A==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/fake-timers': 29.5.0 - '@jest/types': 29.5.0 - '@types/node': 16.18.32 - jest-mock: 29.5.0 + '@jest/fake-timers': 29.6.1 + '@jest/types': 29.6.1 + '@types/node': 16.18.38 + jest-mock: 29.6.1 dev: true - /@jest/expect-utils/29.5.0: - resolution: {integrity: sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg==} + /@jest/expect-utils/29.6.1: + resolution: {integrity: sha512-o319vIf5pEMx0LmzSxxkYYxo4wrRLKHq9dP1yJU7FoPTB0LfAKSz8SWD6D/6U3v/O52t9cF5t+MeJiRsfk7zMw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: jest-get-type: 29.4.3 dev: true - /@jest/expect/29.5.0: - resolution: {integrity: sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g==} + /@jest/expect/29.6.1: + resolution: {integrity: sha512-N5xlPrAYaRNyFgVf2s9Uyyvr795jnB6rObuPx4QFvNJz8aAjpZUDfO4bh5G/xuplMID8PrnuF1+SfSyDxhsgYg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - expect: 29.5.0 - jest-snapshot: 29.5.0 + expect: 29.6.1 + jest-snapshot: 29.6.1 transitivePeerDependencies: - supports-color dev: true - /@jest/fake-timers/29.5.0: - resolution: {integrity: sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg==} + /@jest/fake-timers/29.6.1: + resolution: {integrity: sha512-RdgHgbXyosCDMVYmj7lLpUwXA4c69vcNzhrt69dJJdf8azUrpRh3ckFCaTPNjsEeRi27Cig0oKDGxy5j7hOgHg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.5.0 - '@sinonjs/fake-timers': 10.2.0 - '@types/node': 16.18.32 - jest-message-util: 29.5.0 - jest-mock: 29.5.0 - jest-util: 29.5.0 + '@jest/types': 29.6.1 + '@sinonjs/fake-timers': 10.3.0 + '@types/node': 16.18.38 + jest-message-util: 29.6.1 + jest-mock: 29.6.1 + jest-util: 29.6.1 dev: true - /@jest/globals/29.5.0: - resolution: {integrity: sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ==} + /@jest/globals/29.6.1: + resolution: {integrity: sha512-2VjpaGy78JY9n9370H8zGRCFbYVWwjY6RdDMhoJHa1sYfwe6XM/azGN0SjY8kk7BOZApIejQ1BFPyH7FPG0w3A==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/environment': 29.5.0 - '@jest/expect': 29.5.0 - '@jest/types': 29.5.0 - jest-mock: 29.5.0 + '@jest/environment': 29.6.1 + '@jest/expect': 29.6.1 + '@jest/types': 29.6.1 + jest-mock: 29.6.1 transitivePeerDependencies: - supports-color dev: true - /@jest/reporters/29.5.0: - resolution: {integrity: sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA==} + /@jest/reporters/29.6.1: + resolution: {integrity: sha512-9zuaI9QKr9JnoZtFQlw4GREQbxgmNYXU6QuWtmuODvk5nvPUeBYapVR/VYMyi2WSx3jXTLJTJji8rN6+Cm4+FA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -1779,14 +1845,14 @@ packages: optional: true dependencies: '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 29.5.0 - '@jest/test-result': 29.5.0 - '@jest/transform': 29.5.0 - '@jest/types': 29.5.0 + '@jest/console': 29.6.1 + '@jest/test-result': 29.6.1 + '@jest/transform': 29.6.1 + '@jest/types': 29.6.1 '@jridgewell/trace-mapping': 0.3.18 - '@types/node': 16.18.32 + '@types/node': 16.18.38 chalk: 4.1.2 - collect-v8-coverage: 1.0.1 + collect-v8-coverage: 1.0.2 exit: 0.1.2 glob: 7.2.3 graceful-fs: 4.2.11 @@ -1795,9 +1861,9 @@ packages: istanbul-lib-report: 3.0.0 istanbul-lib-source-maps: 4.0.1 istanbul-reports: 3.1.5 - jest-message-util: 29.5.0 - jest-util: 29.5.0 - jest-worker: 29.5.0 + jest-message-util: 29.6.1 + jest-util: 29.6.1 + jest-worker: 29.6.1 slash: 3.0.0 string-length: 4.0.2 strip-ansi: 6.0.1 @@ -1806,15 +1872,15 @@ packages: - supports-color dev: true - /@jest/schemas/29.4.3: - resolution: {integrity: sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==} + /@jest/schemas/29.6.0: + resolution: {integrity: sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@sinclair/typebox': 0.25.24 + '@sinclair/typebox': 0.27.8 dev: true - /@jest/source-map/29.4.3: - resolution: {integrity: sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w==} + /@jest/source-map/29.6.0: + resolution: {integrity: sha512-oA+I2SHHQGxDCZpbrsCQSoMLb3Bz547JnM+jUr9qEbuw0vQlWZfpPS7CO9J7XiwKicEz9OFn/IYoLkkiUD7bzA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jridgewell/trace-mapping': 0.3.18 @@ -1822,43 +1888,43 @@ packages: graceful-fs: 4.2.11 dev: true - /@jest/test-result/29.5.0: - resolution: {integrity: sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ==} + /@jest/test-result/29.6.1: + resolution: {integrity: sha512-Ynr13ZRcpX6INak0TPUukU8GWRfm/vAytE3JbJNGAvINySWYdfE7dGZMbk36oVuK4CigpbhMn8eg1dixZ7ZJOw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/console': 29.5.0 - '@jest/types': 29.5.0 + '@jest/console': 29.6.1 + '@jest/types': 29.6.1 '@types/istanbul-lib-coverage': 2.0.4 - collect-v8-coverage: 1.0.1 + collect-v8-coverage: 1.0.2 dev: true - /@jest/test-sequencer/29.5.0: - resolution: {integrity: sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ==} + /@jest/test-sequencer/29.6.1: + resolution: {integrity: sha512-oBkC36PCDf/wb6dWeQIhaviU0l5u6VCsXa119yqdUosYAt7/FbQU2M2UoziO3igj/HBDEgp57ONQ3fm0v9uyyg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/test-result': 29.5.0 + '@jest/test-result': 29.6.1 graceful-fs: 4.2.11 - jest-haste-map: 29.5.0 + jest-haste-map: 29.6.1 slash: 3.0.0 dev: true - /@jest/transform/29.5.0: - resolution: {integrity: sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==} + /@jest/transform/29.6.1: + resolution: {integrity: sha512-URnTneIU3ZjRSaf906cvf6Hpox3hIeJXRnz3VDSw5/X93gR8ycdfSIEy19FlVx8NFmpN7fe3Gb1xF+NjXaQLWg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/core': 7.21.8 - '@jest/types': 29.5.0 + '@babel/core': 7.22.9 + '@jest/types': 29.6.1 '@jridgewell/trace-mapping': 0.3.18 babel-plugin-istanbul: 6.1.1 chalk: 4.1.2 convert-source-map: 2.0.0 fast-json-stable-stringify: 2.1.0 graceful-fs: 4.2.11 - jest-haste-map: 29.5.0 + jest-haste-map: 29.6.1 jest-regex-util: 29.4.3 - jest-util: 29.5.0 + jest-util: 29.6.1 micromatch: 4.0.5 - pirates: 4.0.5 + pirates: 4.0.6 slash: 3.0.0 write-file-atomic: 4.0.2 transitivePeerDependencies: @@ -1871,19 +1937,19 @@ packages: dependencies: '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 16.18.32 + '@types/node': 16.18.38 '@types/yargs': 15.0.15 chalk: 4.1.2 dev: true - /@jest/types/29.5.0: - resolution: {integrity: sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==} + /@jest/types/29.6.1: + resolution: {integrity: sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/schemas': 29.4.3 + '@jest/schemas': 29.6.0 '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 16.18.32 + '@types/node': 16.18.38 '@types/yargs': 17.0.24 chalk: 4.1.2 dev: true @@ -1995,7 +2061,7 @@ packages: read-package-json-fast: 2.0.3 readdir-scoped-modules: 1.1.0 rimraf: 3.0.2 - semver: 7.5.1 + semver: 7.5.4 ssri: 8.0.1 treeverse: 1.0.4 walk-up-path: 1.0.0 @@ -2037,7 +2103,7 @@ packages: read-package-json-fast: 2.0.3 readdir-scoped-modules: 1.1.0 rimraf: 3.0.2 - semver: 7.5.1 + semver: 7.5.4 ssri: 8.0.1 treeverse: 1.0.4 walk-up-path: 1.0.0 @@ -2050,7 +2116,7 @@ packages: resolution: {integrity: sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==} dependencies: '@gar/promisify': 1.1.3 - semver: 7.5.1 + semver: 7.5.4 dev: true /@npmcli/fs/2.1.2: @@ -2058,14 +2124,14 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} dependencies: '@gar/promisify': 1.1.3 - semver: 7.5.1 + semver: 7.5.4 dev: true /@npmcli/fs/3.1.0: resolution: {integrity: sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: - semver: 7.5.1 + semver: 7.5.4 dev: true /@npmcli/git/2.1.0: @@ -2077,7 +2143,7 @@ packages: npm-pick-manifest: 6.1.1 promise-inflight: 1.0.1 promise-retry: 2.0.1 - semver: 7.5.1 + semver: 7.5.4 which: 2.0.2 transitivePeerDependencies: - bluebird @@ -2092,14 +2158,14 @@ packages: npm-pick-manifest: 6.1.1 promise-inflight: 1.0.1_bluebird@3.7.2 promise-retry: 2.0.1 - semver: 7.5.1 + semver: 7.5.4 which: 2.0.2 transitivePeerDependencies: - bluebird dev: true - /@npmcli/git/4.0.4: - resolution: {integrity: sha512-5yZghx+u5M47LghaybLCkdSyFzV/w4OuH12d96HO389Ik9CDsLaDZJVynSGGVJOLn6gy/k7Dz5XYcplM3uxXRg==} + /@npmcli/git/4.1.0: + resolution: {integrity: sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: '@npmcli/promise-spawn': 6.0.2 @@ -2108,14 +2174,14 @@ packages: proc-log: 3.0.0 promise-inflight: 1.0.1 promise-retry: 2.0.1 - semver: 7.5.1 + semver: 7.5.4 which: 3.0.1 transitivePeerDependencies: - bluebird dev: true - /@npmcli/git/4.0.4_bluebird@3.7.2: - resolution: {integrity: sha512-5yZghx+u5M47LghaybLCkdSyFzV/w4OuH12d96HO389Ik9CDsLaDZJVynSGGVJOLn6gy/k7Dz5XYcplM3uxXRg==} + /@npmcli/git/4.1.0_bluebird@3.7.2: + resolution: {integrity: sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: '@npmcli/promise-spawn': 6.0.2 @@ -2124,7 +2190,7 @@ packages: proc-log: 3.0.0 promise-inflight: 1.0.1_bluebird@3.7.2 promise-retry: 2.0.1 - semver: 7.5.1 + semver: 7.5.4 which: 3.0.1 transitivePeerDependencies: - bluebird @@ -2165,7 +2231,7 @@ packages: cacache: 15.3.0 json-parse-even-better-errors: 2.3.1 pacote: 12.0.3 - semver: 7.5.1 + semver: 7.5.4 transitivePeerDependencies: - bluebird - supports-color @@ -2178,7 +2244,7 @@ packages: cacache: 15.3.0_bluebird@3.7.2 json-parse-even-better-errors: 2.3.1 pacote: 12.0.3_bluebird@3.7.2 - semver: 7.5.1 + semver: 7.5.4 transitivePeerDependencies: - bluebird - supports-color @@ -2264,84 +2330,69 @@ packages: dependencies: '@npmcli/node-gyp': 3.0.0 '@npmcli/promise-spawn': 6.0.2 - node-gyp: 9.3.1 + node-gyp: 9.4.0 read-package-json-fast: 3.0.2 which: 3.0.1 transitivePeerDependencies: - - bluebird - supports-color dev: true - /@npmcli/run-script/6.0.2_bluebird@3.7.2: - resolution: {integrity: sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - '@npmcli/node-gyp': 3.0.0 - '@npmcli/promise-spawn': 6.0.2 - node-gyp: 9.3.1_bluebird@3.7.2 - read-package-json-fast: 3.0.2 - which: 3.0.1 - transitivePeerDependencies: - - bluebird - - supports-color - dev: true - - /@oclif/color/1.0.5: - resolution: {integrity: sha512-CeUDnzGOt3G7k6KJolTueTMYfJnU/zc6MouwF3sgL+7lnrwTiLaLwQ384EVFtUaIlRHNA0WifGh6FHKc8jqw2g==} + /@oclif/color/1.0.9: + resolution: {integrity: sha512-ntc/fZwuf4NRfYbXVoUNFyMB9IxVx/ls/WbSLKbkD9UpsmwY1I3J4DJKKRFRpenmTuxGQW8Lyzm7X3vhzHpDQA==} engines: {node: '>=12.0.0'} dependencies: ansi-styles: 4.3.0 chalk: 4.1.2 strip-ansi: 6.0.1 supports-color: 8.1.1 - tslib: 2.5.2 + tslib: 2.6.0 - /@oclif/command/1.8.26_@oclif+config@1.18.9: - resolution: {integrity: sha512-IT9kOLFRMc3s6KJ1FymsNjbHShI211eVgAg+JMiDVl8LXwOJxYe8ybesgL1kpV9IUFByOBwZKNG2mmrVeNBHPg==} + /@oclif/command/1.8.33_@oclif+config@1.18.14: + resolution: {integrity: sha512-7ZPvThrZaICX1hoZ/S82DaGgjI3UGG2rveBfxCE9JlgvrDQQiHLA6a/N7Hf3jq6t51AkXbBMhaMOBzXtSd73QA==} engines: {node: '>=12.0.0'} peerDependencies: '@oclif/config': ^1 dependencies: - '@oclif/config': 1.18.9 + '@oclif/config': 1.18.14 '@oclif/errors': 1.3.6 - '@oclif/help': 1.0.5 - '@oclif/parser': 3.8.11 + '@oclif/help': 1.0.12 + '@oclif/parser': 3.8.15 debug: 4.3.4 - semver: 7.5.1 + semver: 7.5.4 transitivePeerDependencies: - supports-color dev: false - /@oclif/config/1.18.6: - resolution: {integrity: sha512-OWhCpdu4QqggOPX1YPZ4XVmLLRX+lhGjXV6RNA7sogOwLqlEmSslnN/lhR5dkhcWZbKWBQH29YCrB3LDPRu/IA==} + /@oclif/config/1.18.12: + resolution: {integrity: sha512-hbZv4N3J9pE4yzQIqrklJFgXhqYiQTN3uV5uBC8VaIZ1qEPzZv6lN9rDmcYIuEOBPzQvvSIBuaH/IDzo3F71PQ==} engines: {node: '>=8.0.0'} dependencies: '@oclif/errors': 1.3.6 - '@oclif/parser': 3.8.11 + '@oclif/parser': 3.8.15 debug: 4.3.4 globby: 11.1.0 is-wsl: 2.2.0 - tslib: 2.5.2 + tslib: 2.6.0 transitivePeerDependencies: - supports-color dev: false - /@oclif/config/1.18.9: - resolution: {integrity: sha512-CGABvY60IbzK3kecDekCQS4T7fvpraBHV3nvYDtehrqljbMxtTeeJkFJVLbBnZnwzD2u1ApQX/Zggja3lyCoJA==} + /@oclif/config/1.18.14: + resolution: {integrity: sha512-cLT/deFDm6A69LjAfV5ZZMMvMDlPt7sjMHYBrsOgQ5Upq5kDMgbaZM3hEbw74DmYIsuhq2E2wYrPD+Ax2qAfkA==} engines: {node: '>=8.0.0'} dependencies: '@oclif/errors': 1.3.6 - '@oclif/parser': 3.8.11 + '@oclif/parser': 3.8.15 debug: 4.3.4 globby: 11.1.0 is-wsl: 2.2.0 - tslib: 2.5.2 + tslib: 2.6.0 transitivePeerDependencies: - supports-color dev: false - /@oclif/core/2.8.5: - resolution: {integrity: sha512-316DLfrHQDYmWDriI4Woxk9y1wVUrPN1sZdbQLHdOdlTA9v/twe7TdHpWOriEypfl6C85NWEJKc1870yuLtjrQ==} + /@oclif/core/2.9.4: + resolution: {integrity: sha512-eFRRpV+tJ6nMkhay2M9IppjSF3atRrgj6Qo83qUslaFSAW3NAl4mIhx1mKmTwQx5rgSrar03xICtSAWJ6gZtag==} engines: {node: '>=14.0.0'} dependencies: '@types/cli-progress': 3.11.0 @@ -2363,13 +2414,14 @@ packages: natural-orderby: 2.0.3 object-treeify: 1.1.33 password-prompt: 1.1.2 - semver: 7.5.1 + semver: 7.5.4 + slice-ansi: 4.0.0 string-width: 4.2.3 strip-ansi: 6.0.1 supports-color: 8.1.1 supports-hyperlinks: 2.3.0 ts-node: 10.9.1 - tslib: 2.5.2 + tslib: 2.6.0 widest-line: 3.1.0 wordwrap: 1.0.0 wrap-ansi: 7.0.0 @@ -2380,8 +2432,8 @@ packages: - typescript dev: true - /@oclif/core/2.8.5_2unbv6mhrq4prucamkttzlebiq: - resolution: {integrity: sha512-316DLfrHQDYmWDriI4Woxk9y1wVUrPN1sZdbQLHdOdlTA9v/twe7TdHpWOriEypfl6C85NWEJKc1870yuLtjrQ==} + /@oclif/core/2.9.4_4qcp7qp4jxxdgb4qbxgwox4hwq: + resolution: {integrity: sha512-eFRRpV+tJ6nMkhay2M9IppjSF3atRrgj6Qo83qUslaFSAW3NAl4mIhx1mKmTwQx5rgSrar03xICtSAWJ6gZtag==} engines: {node: '>=14.0.0'} dependencies: '@types/cli-progress': 3.11.0 @@ -2403,13 +2455,14 @@ packages: natural-orderby: 2.0.3 object-treeify: 1.1.33 password-prompt: 1.1.2 - semver: 7.5.1 + semver: 7.5.4 + slice-ansi: 4.0.0 string-width: 4.2.3 strip-ansi: 6.0.1 supports-color: 8.1.1 supports-hyperlinks: 2.3.0 - ts-node: 10.9.1_2unbv6mhrq4prucamkttzlebiq - tslib: 2.5.2 + ts-node: 10.9.1_4qcp7qp4jxxdgb4qbxgwox4hwq + tslib: 2.6.0 widest-line: 3.1.0 wordwrap: 1.0.0 wrap-ansi: 7.0.0 @@ -2419,8 +2472,8 @@ packages: - '@types/node' - typescript - /@oclif/core/2.8.5_5vebceyeyrbj46wx3onulzfguy: - resolution: {integrity: sha512-316DLfrHQDYmWDriI4Woxk9y1wVUrPN1sZdbQLHdOdlTA9v/twe7TdHpWOriEypfl6C85NWEJKc1870yuLtjrQ==} + /@oclif/core/2.9.4_npeoqfxwgl5njwqojmpesqhar4: + resolution: {integrity: sha512-eFRRpV+tJ6nMkhay2M9IppjSF3atRrgj6Qo83qUslaFSAW3NAl4mIhx1mKmTwQx5rgSrar03xICtSAWJ6gZtag==} engines: {node: '>=14.0.0'} dependencies: '@types/cli-progress': 3.11.0 @@ -2442,13 +2495,14 @@ packages: natural-orderby: 2.0.3 object-treeify: 1.1.33 password-prompt: 1.1.2 - semver: 7.5.1 + semver: 7.5.4 + slice-ansi: 4.0.0 string-width: 4.2.3 strip-ansi: 6.0.1 supports-color: 8.1.1 supports-hyperlinks: 2.3.0 - ts-node: 10.9.1_5vebceyeyrbj46wx3onulzfguy - tslib: 2.5.2 + ts-node: 10.9.1_npeoqfxwgl5njwqojmpesqhar4 + tslib: 2.6.0 widest-line: 3.1.0 wordwrap: 1.0.0 wrap-ansi: 7.0.0 @@ -2458,8 +2512,8 @@ packages: - '@types/node' - typescript - /@oclif/core/2.8.5_typescript@4.9.5: - resolution: {integrity: sha512-316DLfrHQDYmWDriI4Woxk9y1wVUrPN1sZdbQLHdOdlTA9v/twe7TdHpWOriEypfl6C85NWEJKc1870yuLtjrQ==} + /@oclif/core/2.9.4_typescript@4.9.5: + resolution: {integrity: sha512-eFRRpV+tJ6nMkhay2M9IppjSF3atRrgj6Qo83qUslaFSAW3NAl4mIhx1mKmTwQx5rgSrar03xICtSAWJ6gZtag==} engines: {node: '>=14.0.0'} dependencies: '@types/cli-progress': 3.11.0 @@ -2481,13 +2535,14 @@ packages: natural-orderby: 2.0.3 object-treeify: 1.1.33 password-prompt: 1.1.2 - semver: 7.5.1 + semver: 7.5.4 + slice-ansi: 4.0.0 string-width: 4.2.3 strip-ansi: 6.0.1 supports-color: 8.1.1 supports-hyperlinks: 2.3.0 ts-node: 10.9.1_typescript@4.9.5 - tslib: 2.5.2 + tslib: 2.6.0 widest-line: 3.1.0 wordwrap: 1.0.0 wrap-ansi: 7.0.0 @@ -2508,11 +2563,11 @@ packages: wrap-ansi: 7.0.0 dev: false - /@oclif/help/1.0.5: - resolution: {integrity: sha512-77ZXqVXcd+bQ6EafN56KbL4PbNtZM/Lq4GQElekNav+CPIgPNKT3AtMTQrc0fWke6bb/BTLB+1Fu1gWgx643jQ==} + /@oclif/help/1.0.12: + resolution: {integrity: sha512-nvjgcZm2HsIEXEDYqo0+lXMSNe6Bx9vxZnJ9HqxMdSX6CNxr9ovvm5EilNGc9IxbtNXYlct+DE1le6urGmrlrw==} engines: {node: '>=8.0.0'} dependencies: - '@oclif/config': 1.18.6 + '@oclif/config': 1.18.12 '@oclif/errors': 1.3.6 chalk: 4.1.2 indent-string: 4.0.0 @@ -2529,21 +2584,21 @@ packages: resolution: {integrity: sha512-Ups2dShK52xXa8w6iBWLgcjPJWjais6KPJQq3gQ/88AY6BXoTX+MIGFPrWQO1KLMiQfoTpcLnUwloN4brrVUHw==} dev: false - /@oclif/parser/3.8.11: - resolution: {integrity: sha512-B3NweRn1yZw2g7xaF10Zh/zwlqTJJINfU+CRkqll+LaTisSNvZbW0RR9WGan26EqqLp4qzNjzX/e90Ew8l9NLw==} + /@oclif/parser/3.8.15: + resolution: {integrity: sha512-M7ljUexkyJkR2efqG+PL31fAWyWDW1dczaMKoY+sOVqk78sm23iDMOJj/1vkfUrhO+W8dhseoPFnpSB6Hewfyw==} engines: {node: '>=8.0.0'} dependencies: '@oclif/errors': 1.3.6 '@oclif/linewrap': 1.0.0 chalk: 4.1.2 - tslib: 2.5.2 + tslib: 2.6.0 dev: false - /@oclif/plugin-help/5.2.9: - resolution: {integrity: sha512-0J3oowPURZJ4Dn1p1WpQ46E4+CoV20KTn1cvsNiDl6Hmbw+qoljKQnArJJzNFeZQxWo4R7/S42PrzKJTVYh68Q==} + /@oclif/plugin-help/5.2.14: + resolution: {integrity: sha512-7hMLc6zqxeRfG4nvHHQPpbaBj60efM3ULFkCpHZkdLms/ezIkNo40F661QuraIjMP/NN+U6VSfBCGuPkRyxVkA==} engines: {node: '>=12.0.0'} dependencies: - '@oclif/core': 2.8.5 + '@oclif/core': 2.9.4 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' @@ -2551,33 +2606,33 @@ packages: - typescript dev: true - /@oclif/plugin-help/5.2.9_2unbv6mhrq4prucamkttzlebiq: - resolution: {integrity: sha512-0J3oowPURZJ4Dn1p1WpQ46E4+CoV20KTn1cvsNiDl6Hmbw+qoljKQnArJJzNFeZQxWo4R7/S42PrzKJTVYh68Q==} + /@oclif/plugin-help/5.2.14_4qcp7qp4jxxdgb4qbxgwox4hwq: + resolution: {integrity: sha512-7hMLc6zqxeRfG4nvHHQPpbaBj60efM3ULFkCpHZkdLms/ezIkNo40F661QuraIjMP/NN+U6VSfBCGuPkRyxVkA==} engines: {node: '>=12.0.0'} dependencies: - '@oclif/core': 2.8.5_2unbv6mhrq4prucamkttzlebiq + '@oclif/core': 2.9.4_4qcp7qp4jxxdgb4qbxgwox4hwq transitivePeerDependencies: - '@swc/core' - '@swc/wasm' - '@types/node' - typescript - /@oclif/plugin-help/5.2.9_5vebceyeyrbj46wx3onulzfguy: - resolution: {integrity: sha512-0J3oowPURZJ4Dn1p1WpQ46E4+CoV20KTn1cvsNiDl6Hmbw+qoljKQnArJJzNFeZQxWo4R7/S42PrzKJTVYh68Q==} + /@oclif/plugin-help/5.2.14_npeoqfxwgl5njwqojmpesqhar4: + resolution: {integrity: sha512-7hMLc6zqxeRfG4nvHHQPpbaBj60efM3ULFkCpHZkdLms/ezIkNo40F661QuraIjMP/NN+U6VSfBCGuPkRyxVkA==} engines: {node: '>=12.0.0'} dependencies: - '@oclif/core': 2.8.5_5vebceyeyrbj46wx3onulzfguy + '@oclif/core': 2.9.4_npeoqfxwgl5njwqojmpesqhar4 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' - '@types/node' - typescript - /@oclif/plugin-help/5.2.9_typescript@4.9.5: - resolution: {integrity: sha512-0J3oowPURZJ4Dn1p1WpQ46E4+CoV20KTn1cvsNiDl6Hmbw+qoljKQnArJJzNFeZQxWo4R7/S42PrzKJTVYh68Q==} + /@oclif/plugin-help/5.2.14_typescript@4.9.5: + resolution: {integrity: sha512-7hMLc6zqxeRfG4nvHHQPpbaBj60efM3ULFkCpHZkdLms/ezIkNo40F661QuraIjMP/NN+U6VSfBCGuPkRyxVkA==} engines: {node: '>=12.0.0'} dependencies: - '@oclif/core': 2.8.5_typescript@4.9.5 + '@oclif/core': 2.9.4_typescript@4.9.5 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' @@ -2585,14 +2640,13 @@ packages: - typescript dev: true - /@oclif/plugin-not-found/2.3.23: - resolution: {integrity: sha512-UZM8aolxXvqwH8WcmJxRNASDWgMoSQm/pgCdkc1AGCRevYc8+LBSO+U6nLWq+Dx8H/dn9RyIv5oiUIOGkKDlZA==} + /@oclif/plugin-not-found/2.3.32: + resolution: {integrity: sha512-tVFHfR9XRUWrcxBugHjFr7HUmbLheDX05IaFr7fMF2hcvcqDs3DBjy42WKEoXSaBVTcST6KKhoSy2UVX8pk9Fg==} engines: {node: '>=12.0.0'} dependencies: - '@oclif/color': 1.0.5 - '@oclif/core': 2.8.5 + '@oclif/color': 1.0.9 + '@oclif/core': 2.9.4 fast-levenshtein: 3.0.0 - lodash: 4.17.21 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' @@ -2600,43 +2654,40 @@ packages: - typescript dev: true - /@oclif/plugin-not-found/2.3.23_2unbv6mhrq4prucamkttzlebiq: - resolution: {integrity: sha512-UZM8aolxXvqwH8WcmJxRNASDWgMoSQm/pgCdkc1AGCRevYc8+LBSO+U6nLWq+Dx8H/dn9RyIv5oiUIOGkKDlZA==} + /@oclif/plugin-not-found/2.3.32_4qcp7qp4jxxdgb4qbxgwox4hwq: + resolution: {integrity: sha512-tVFHfR9XRUWrcxBugHjFr7HUmbLheDX05IaFr7fMF2hcvcqDs3DBjy42WKEoXSaBVTcST6KKhoSy2UVX8pk9Fg==} engines: {node: '>=12.0.0'} dependencies: - '@oclif/color': 1.0.5 - '@oclif/core': 2.8.5_2unbv6mhrq4prucamkttzlebiq + '@oclif/color': 1.0.9 + '@oclif/core': 2.9.4_4qcp7qp4jxxdgb4qbxgwox4hwq fast-levenshtein: 3.0.0 - lodash: 4.17.21 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' - '@types/node' - typescript - dev: true - /@oclif/plugin-not-found/2.3.23_5vebceyeyrbj46wx3onulzfguy: - resolution: {integrity: sha512-UZM8aolxXvqwH8WcmJxRNASDWgMoSQm/pgCdkc1AGCRevYc8+LBSO+U6nLWq+Dx8H/dn9RyIv5oiUIOGkKDlZA==} + /@oclif/plugin-not-found/2.3.32_npeoqfxwgl5njwqojmpesqhar4: + resolution: {integrity: sha512-tVFHfR9XRUWrcxBugHjFr7HUmbLheDX05IaFr7fMF2hcvcqDs3DBjy42WKEoXSaBVTcST6KKhoSy2UVX8pk9Fg==} engines: {node: '>=12.0.0'} dependencies: - '@oclif/color': 1.0.5 - '@oclif/core': 2.8.5_5vebceyeyrbj46wx3onulzfguy + '@oclif/color': 1.0.9 + '@oclif/core': 2.9.4_npeoqfxwgl5njwqojmpesqhar4 fast-levenshtein: 3.0.0 - lodash: 4.17.21 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' - '@types/node' - typescript + dev: true - /@oclif/plugin-not-found/2.3.23_typescript@4.9.5: - resolution: {integrity: sha512-UZM8aolxXvqwH8WcmJxRNASDWgMoSQm/pgCdkc1AGCRevYc8+LBSO+U6nLWq+Dx8H/dn9RyIv5oiUIOGkKDlZA==} + /@oclif/plugin-not-found/2.3.32_typescript@4.9.5: + resolution: {integrity: sha512-tVFHfR9XRUWrcxBugHjFr7HUmbLheDX05IaFr7fMF2hcvcqDs3DBjy42WKEoXSaBVTcST6KKhoSy2UVX8pk9Fg==} engines: {node: '>=12.0.0'} dependencies: - '@oclif/color': 1.0.5 - '@oclif/core': 2.8.5_typescript@4.9.5 + '@oclif/color': 1.0.9 + '@oclif/core': 2.9.4_typescript@4.9.5 fast-levenshtein: 3.0.0 - lodash: 4.17.21 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' @@ -2644,20 +2695,20 @@ packages: - typescript dev: true - /@oclif/plugin-plugins/2.4.7_2unbv6mhrq4prucamkttzlebiq: + /@oclif/plugin-plugins/2.4.7_4qcp7qp4jxxdgb4qbxgwox4hwq: resolution: {integrity: sha512-6fzUDLWrSK7n6+EBrEekEEYrYTCneRoOF9TzojkjuFn1+ailvUlr98G90bblxKOyy8fqMe7QjvqwTgIDQ9ZIzg==} engines: {node: '>=12.0.0'} dependencies: - '@oclif/color': 1.0.5 - '@oclif/core': 2.8.5_2unbv6mhrq4prucamkttzlebiq + '@oclif/color': 1.0.9 + '@oclif/core': 2.9.4_4qcp7qp4jxxdgb4qbxgwox4hwq chalk: 4.1.2 debug: 4.3.4 fs-extra: 9.1.0 http-call: 5.3.0 load-json-file: 5.3.0 npm-run-path: 4.0.1 - semver: 7.5.1 - tslib: 2.5.2 + semver: 7.5.4 + tslib: 2.6.0 yarn: 1.22.19 transitivePeerDependencies: - '@swc/core' @@ -2667,20 +2718,20 @@ packages: - typescript dev: false - /@oclif/plugin-plugins/2.4.7_5vebceyeyrbj46wx3onulzfguy: + /@oclif/plugin-plugins/2.4.7_npeoqfxwgl5njwqojmpesqhar4: resolution: {integrity: sha512-6fzUDLWrSK7n6+EBrEekEEYrYTCneRoOF9TzojkjuFn1+ailvUlr98G90bblxKOyy8fqMe7QjvqwTgIDQ9ZIzg==} engines: {node: '>=12.0.0'} dependencies: - '@oclif/color': 1.0.5 - '@oclif/core': 2.8.5_5vebceyeyrbj46wx3onulzfguy + '@oclif/color': 1.0.9 + '@oclif/core': 2.9.4_npeoqfxwgl5njwqojmpesqhar4 chalk: 4.1.2 debug: 4.3.4 fs-extra: 9.1.0 http-call: 5.3.0 load-json-file: 5.3.0 npm-run-path: 4.0.1 - semver: 7.5.1 - tslib: 2.5.2 + semver: 7.5.4 + tslib: 2.6.0 yarn: 1.22.19 transitivePeerDependencies: - '@swc/core' @@ -2690,17 +2741,17 @@ packages: - typescript dev: false - /@oclif/plugin-warn-if-update-available/2.0.37: - resolution: {integrity: sha512-rfDNvplwgiwV+QSV4JU96ypmWgNJ6Hk5FEAEAKzqF0v0J8AHwZGpwwYO/MCZSkbc7bfYpkqLx/sxjpMO6j6PmQ==} + /@oclif/plugin-warn-if-update-available/2.0.44: + resolution: {integrity: sha512-52Ww0B4F1tMhwjw2fe73lhmfDI/F4ynf3ur7/xnpnVBEvj5JG4sqolbEJV/0lV85+4dJNsYJRxubbPYjxcbCcA==} engines: {node: '>=12.0.0'} dependencies: - '@oclif/core': 2.8.5 + '@oclif/core': 2.9.4 chalk: 4.1.2 debug: 4.3.4 fs-extra: 9.1.0 http-call: 5.3.0 lodash: 4.17.21 - semver: 7.5.1 + semver: 7.5.4 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' @@ -2709,17 +2760,17 @@ packages: - typescript dev: true - /@oclif/plugin-warn-if-update-available/2.0.37_2unbv6mhrq4prucamkttzlebiq: - resolution: {integrity: sha512-rfDNvplwgiwV+QSV4JU96ypmWgNJ6Hk5FEAEAKzqF0v0J8AHwZGpwwYO/MCZSkbc7bfYpkqLx/sxjpMO6j6PmQ==} + /@oclif/plugin-warn-if-update-available/2.0.44_4qcp7qp4jxxdgb4qbxgwox4hwq: + resolution: {integrity: sha512-52Ww0B4F1tMhwjw2fe73lhmfDI/F4ynf3ur7/xnpnVBEvj5JG4sqolbEJV/0lV85+4dJNsYJRxubbPYjxcbCcA==} engines: {node: '>=12.0.0'} dependencies: - '@oclif/core': 2.8.5_2unbv6mhrq4prucamkttzlebiq + '@oclif/core': 2.9.4_4qcp7qp4jxxdgb4qbxgwox4hwq chalk: 4.1.2 debug: 4.3.4 fs-extra: 9.1.0 http-call: 5.3.0 lodash: 4.17.21 - semver: 7.5.1 + semver: 7.5.4 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' @@ -2728,17 +2779,17 @@ packages: - typescript dev: true - /@oclif/plugin-warn-if-update-available/2.0.37_5vebceyeyrbj46wx3onulzfguy: - resolution: {integrity: sha512-rfDNvplwgiwV+QSV4JU96ypmWgNJ6Hk5FEAEAKzqF0v0J8AHwZGpwwYO/MCZSkbc7bfYpkqLx/sxjpMO6j6PmQ==} + /@oclif/plugin-warn-if-update-available/2.0.44_npeoqfxwgl5njwqojmpesqhar4: + resolution: {integrity: sha512-52Ww0B4F1tMhwjw2fe73lhmfDI/F4ynf3ur7/xnpnVBEvj5JG4sqolbEJV/0lV85+4dJNsYJRxubbPYjxcbCcA==} engines: {node: '>=12.0.0'} dependencies: - '@oclif/core': 2.8.5_5vebceyeyrbj46wx3onulzfguy + '@oclif/core': 2.9.4_npeoqfxwgl5njwqojmpesqhar4 chalk: 4.1.2 debug: 4.3.4 fs-extra: 9.1.0 http-call: 5.3.0 lodash: 4.17.21 - semver: 7.5.1 + semver: 7.5.4 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' @@ -2747,17 +2798,17 @@ packages: - typescript dev: true - /@oclif/plugin-warn-if-update-available/2.0.37_typescript@4.9.5: - resolution: {integrity: sha512-rfDNvplwgiwV+QSV4JU96ypmWgNJ6Hk5FEAEAKzqF0v0J8AHwZGpwwYO/MCZSkbc7bfYpkqLx/sxjpMO6j6PmQ==} + /@oclif/plugin-warn-if-update-available/2.0.44_typescript@4.9.5: + resolution: {integrity: sha512-52Ww0B4F1tMhwjw2fe73lhmfDI/F4ynf3ur7/xnpnVBEvj5JG4sqolbEJV/0lV85+4dJNsYJRxubbPYjxcbCcA==} engines: {node: '>=12.0.0'} dependencies: - '@oclif/core': 2.8.5_typescript@4.9.5 + '@oclif/core': 2.9.4_typescript@4.9.5 chalk: 4.1.2 debug: 4.3.4 fs-extra: 9.1.0 http-call: 5.3.0 lodash: 4.17.21 - semver: 7.5.1 + semver: 7.5.4 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' @@ -2775,12 +2826,12 @@ packages: - supports-color dev: true - /@oclif/test/2.3.21: - resolution: {integrity: sha512-RaFNf3/PMwBLrL9yu8aFsONsUSpyI16AGC6HiAabDyu534Rh+jBtqy/dPZ53/SOCBOholhZmVs7jT0UE5Utwew==} + /@oclif/test/2.3.31: + resolution: {integrity: sha512-dTWCni+Zv9aSuzyamS95+GJaIub6EAI+CT+pA1MP10RZF54mF7CKaas7t8dvNvDp1Y194hi64cqe+cNwZlR5ng==} engines: {node: '>=12.0.0'} dependencies: - '@oclif/core': 2.8.5 - fancy-test: 2.0.23 + '@oclif/core': 2.9.4 + fancy-test: 2.0.31 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' @@ -2789,12 +2840,12 @@ packages: - typescript dev: true - /@oclif/test/2.3.21_2unbv6mhrq4prucamkttzlebiq: - resolution: {integrity: sha512-RaFNf3/PMwBLrL9yu8aFsONsUSpyI16AGC6HiAabDyu534Rh+jBtqy/dPZ53/SOCBOholhZmVs7jT0UE5Utwew==} + /@oclif/test/2.3.31_4qcp7qp4jxxdgb4qbxgwox4hwq: + resolution: {integrity: sha512-dTWCni+Zv9aSuzyamS95+GJaIub6EAI+CT+pA1MP10RZF54mF7CKaas7t8dvNvDp1Y194hi64cqe+cNwZlR5ng==} engines: {node: '>=12.0.0'} dependencies: - '@oclif/core': 2.8.5_2unbv6mhrq4prucamkttzlebiq - fancy-test: 2.0.23 + '@oclif/core': 2.9.4_4qcp7qp4jxxdgb4qbxgwox4hwq + fancy-test: 2.0.31 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' @@ -2803,12 +2854,12 @@ packages: - typescript dev: true - /@oclif/test/2.3.21_5vebceyeyrbj46wx3onulzfguy: - resolution: {integrity: sha512-RaFNf3/PMwBLrL9yu8aFsONsUSpyI16AGC6HiAabDyu534Rh+jBtqy/dPZ53/SOCBOholhZmVs7jT0UE5Utwew==} + /@oclif/test/2.3.31_npeoqfxwgl5njwqojmpesqhar4: + resolution: {integrity: sha512-dTWCni+Zv9aSuzyamS95+GJaIub6EAI+CT+pA1MP10RZF54mF7CKaas7t8dvNvDp1Y194hi64cqe+cNwZlR5ng==} engines: {node: '>=12.0.0'} dependencies: - '@oclif/core': 2.8.5_5vebceyeyrbj46wx3onulzfguy - fancy-test: 2.0.23 + '@oclif/core': 2.9.4_npeoqfxwgl5njwqojmpesqhar4 + fancy-test: 2.0.31 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' @@ -2901,7 +2952,7 @@ packages: '@octokit/request-error': 2.1.0 '@octokit/types': 6.41.0 is-plain-object: 5.0.0 - node-fetch: 2.6.11 + node-fetch: 2.6.12 universal-user-agent: 6.0.0 transitivePeerDependencies: - encoding @@ -2949,13 +3000,30 @@ packages: - zenObservable dev: false - /@sigstore/protobuf-specs/0.1.0: - resolution: {integrity: sha512-a31EnjuIDSX8IXBUib3cYLDRlPMU36AWX4xS8ysLaNu4ZzUesDiPt83pgrW2X1YLMe5L2HbDyaKK5BrL4cNKaQ==} + /@sigstore/bundle/1.0.0: + resolution: {integrity: sha512-yLvrWDOh6uMOUlFCTJIZEnwOT9Xte7NPXUqVexEKGSF5XtBAuSg5du0kn3dRR0p47a4ah10Y0mNt8+uyeQXrBQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + '@sigstore/protobuf-specs': 0.2.0 dev: true - /@sinclair/typebox/0.25.24: - resolution: {integrity: sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==} + /@sigstore/protobuf-specs/0.2.0: + resolution: {integrity: sha512-8ZhZKAVfXjIspDWwm3D3Kvj0ddbJ0HqDZ/pOs5cx88HpT8mVsotFrg7H1UMnXOuDHz6Zykwxn4mxG3QLuN+RUg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + + /@sigstore/tuf/1.0.3: + resolution: {integrity: sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + '@sigstore/protobuf-specs': 0.2.0 + tuf-js: 1.1.7 + transitivePeerDependencies: + - supports-color + dev: true + + /@sinclair/typebox/0.27.8: + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} dev: true /@sindresorhus/is/4.6.0: @@ -2963,6 +3031,12 @@ packages: engines: {node: '>=10'} dev: true + /@sinonjs/commons/1.8.6: + resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} + dependencies: + type-detect: 4.0.8 + dev: true + /@sinonjs/commons/2.0.0: resolution: {integrity: sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==} dependencies: @@ -2973,11 +3047,25 @@ packages: dependencies: type-detect: 4.0.8 - /@sinonjs/fake-timers/10.2.0: - resolution: {integrity: sha512-OPwQlEdg40HAj5KNF8WW6q2KG4Z+cBCZb3m4ninfTZKaBmbIJodviQsDBoYMPHkOyJJMHnOJo5j2+LKDOhOACg==} + /@sinonjs/fake-timers/10.3.0: + resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} dependencies: '@sinonjs/commons': 3.0.0 + /@sinonjs/fake-timers/7.1.2: + resolution: {integrity: sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==} + dependencies: + '@sinonjs/commons': 1.8.6 + dev: true + + /@sinonjs/samsam/6.1.3: + resolution: {integrity: sha512-nhOb2dWPeb1sd3IQXL/dVPnKHDOAFfvichtBf4xV00/rU1QbPCQqKMbvIheIjqwVjh7qIgf2AHTHi391yMOMpQ==} + dependencies: + '@sinonjs/commons': 1.8.6 + lodash.get: 4.4.2 + type-detect: 4.0.8 + dev: true + /@sinonjs/samsam/8.0.0: resolution: {integrity: sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew==} dependencies: @@ -3026,49 +3114,53 @@ packages: engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: '@tufjs/canonical-json': 1.0.0 - minimatch: 9.0.1 + minimatch: 9.0.3 dev: true /@types/adm-zip/0.5.0: resolution: {integrity: sha512-FCJBJq9ODsQZUNURo5ILAQueuA8WJhRvuihS3ke2iI25mJlfV2LK8jG2Qj2z2AWg8U0FtWWqBHVRetceLskSaw==} dependencies: - '@types/node': 16.18.32 + '@types/node': 16.18.38 dev: true - /@types/babel__core/7.20.0: - resolution: {integrity: sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==} + /@types/babel__core/7.20.1: + resolution: {integrity: sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==} dependencies: - '@babel/parser': 7.21.9 - '@babel/types': 7.21.5 + '@babel/parser': 7.22.7 + '@babel/types': 7.22.5 '@types/babel__generator': 7.6.4 '@types/babel__template': 7.4.1 - '@types/babel__traverse': 7.18.5 + '@types/babel__traverse': 7.20.1 dev: true /@types/babel__generator/7.6.4: resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} dependencies: - '@babel/types': 7.21.5 + '@babel/types': 7.22.5 dev: true /@types/babel__template/7.4.1: resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} dependencies: - '@babel/parser': 7.21.9 - '@babel/types': 7.21.5 + '@babel/parser': 7.22.7 + '@babel/types': 7.22.5 dev: true - /@types/babel__traverse/7.18.5: - resolution: {integrity: sha512-enCvTL8m/EHS/zIvJno9nE+ndYPh1/oNFzRYRmtUqJICG2VnCSBzMLW5VN2KCQU91f23tsNKR8v7VJJQMatl7Q==} + /@types/babel__traverse/7.20.1: + resolution: {integrity: sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==} dependencies: - '@babel/types': 7.21.5 + '@babel/types': 7.22.5 + dev: true + + /@types/bluebird/3.5.38: + resolution: {integrity: sha512-yR/Kxc0dd4FfwtEoLZMoqJbM/VE/W7hXn/MIjb+axcwag0iFmSPK7OBUZq1YWLynJUoWQkfUrI7T0HDqGApNSg==} dev: true /@types/body-parser/1.19.2: resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} dependencies: '@types/connect': 3.4.35 - '@types/node': 16.18.32 + '@types/node': 16.18.38 dev: false /@types/cacheable-request/6.0.3: @@ -3076,7 +3168,7 @@ packages: dependencies: '@types/http-cache-semantics': 4.0.1 '@types/keyv': 3.1.4 - '@types/node': 16.18.32 + '@types/node': 16.18.38 '@types/responselike': 1.0.0 dev: true @@ -3086,12 +3178,12 @@ packages: /@types/cli-progress/3.11.0: resolution: {integrity: sha512-XhXhBv1R/q2ahF3BM7qT5HLzJNlIL0wbcGyZVjqOTqAybAnsLisd7gy1UCyIqpL+5Iv6XhlSyzjLCnI2sIdbCg==} dependencies: - '@types/node': 16.18.32 + '@types/node': 16.18.38 /@types/connect/3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: - '@types/node': 16.18.32 + '@types/node': 16.18.38 dev: false /@types/eslint-visitor-keys/1.0.0: @@ -3101,7 +3193,7 @@ packages: /@types/esm/3.2.0: resolution: {integrity: sha512-aXemgVPnF1s0PQin04Ei8zTWaNwUdc4pmhZDg8LBW6QEl9kBWVItAUOLGUY5H5xduAmbL1pLGH1X/PN0+4R9tg==} dependencies: - '@types/node': 16.18.32 + '@types/node': 16.18.38 dev: true /@types/expect/1.20.4: @@ -3111,7 +3203,7 @@ packages: /@types/express-serve-static-core/4.17.35: resolution: {integrity: sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==} dependencies: - '@types/node': 16.18.32 + '@types/node': 16.18.38 '@types/qs': 6.9.7 '@types/range-parser': 1.2.4 '@types/send': 0.17.1 @@ -3123,7 +3215,7 @@ packages: '@types/body-parser': 1.19.2 '@types/express-serve-static-core': 4.17.35 '@types/qs': 6.9.7 - '@types/serve-static': 1.15.1 + '@types/serve-static': 1.15.2 dev: false /@types/flat/5.0.2: @@ -3134,19 +3226,23 @@ packages: resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} dependencies: '@types/minimatch': 5.1.2 - '@types/node': 16.18.32 + '@types/node': 16.18.38 dev: true /@types/graceful-fs/4.1.6: resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==} dependencies: - '@types/node': 16.18.32 + '@types/node': 16.18.38 dev: true /@types/http-cache-semantics/4.0.1: resolution: {integrity: sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==} dev: true + /@types/http-errors/2.0.1: + resolution: {integrity: sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==} + dev: false + /@types/ini/1.3.31: resolution: {integrity: sha512-8ecxxaG4AlVEM1k9+BsziMw8UsX0qy3jYI1ad/71RrDZ+rdL6aZB0wLfAuflQiDhkD5o4yJ0uPK3OSUic3fG0w==} dev: true @@ -3181,26 +3277,22 @@ packages: pretty-format: 26.6.2 dev: true - /@types/json-schema/7.0.11: - resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} + /@types/json-schema/7.0.12: + resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} dev: true /@types/keyv/3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: - '@types/node': 16.18.32 + '@types/node': 16.18.38 dev: true /@types/linkify-it/3.0.2: resolution: {integrity: sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==} dev: true - /@types/lodash/4.14.194: - resolution: {integrity: sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g==} - /@types/lodash/4.14.195: resolution: {integrity: sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg==} - dev: true /@types/markdown-it/12.2.3: resolution: {integrity: sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==} @@ -3229,32 +3321,51 @@ packages: resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} dev: true + /@types/minipass/3.3.5: + resolution: {integrity: sha512-M2BLHQdEmDmH671h0GIlOQQJrgezd1vNqq7PVj1VOsHZ2uQQb4iPiQIl0SlMdhxZPUsLIfEklmeEHXg8DJRewA==} + deprecated: This is a stub types definition. minipass provides its own type definitions, so you do not need this installed. + dependencies: + minipass: 7.0.2 + dev: true + /@types/mkdirp/1.0.2: resolution: {integrity: sha512-o0K1tSO0Dx5X6xlU5F1D6625FawhC3dU3iqr25lluNv/+/QIVH8RLNEiVokgIZo+mz+87w/3Mkg/VvQS+J51fQ==} dependencies: - '@types/node': 14.18.47 + '@types/node': 14.18.53 dev: true /@types/mocha/8.2.3: resolution: {integrity: sha512-ekGvFhFgrc2zYQoX4JeZPmVzZxw6Dtllga7iGHzfbYIYkAMUx/sAFP2GdFpLff+vdHXu5fl7WX9AT+TtqYcsyw==} dev: true - /@types/node/14.18.47: - resolution: {integrity: sha512-OuJi8bIng4wYHHA3YpKauL58dZrPxro3d0tabPHyiNF8rKfGKuVfr83oFlPLmKri1cX+Z3cJP39GXmnqkP11Gw==} + /@types/ncp/2.0.5: + resolution: {integrity: sha512-ocK0p8JuFmX7UkMabFPjY0F7apPvQyLWt5qtdvuvQEBz9i4m2dbzV+6L1zNaUp042RfnL6pHnxDE53OH6XQ9VQ==} + dependencies: + '@types/node': 16.18.38 + dev: true + + /@types/node/14.18.53: + resolution: {integrity: sha512-soGmOpVBUq+gaBMwom1M+krC/NNbWlosh4AtGA03SyWNDiqSKtwp7OulO1M6+mg8YkHMvJ/y0AkCeO8d1hNb7A==} /@types/node/15.14.9: resolution: {integrity: sha512-qjd88DrCxupx/kJD5yQgZdcYKZKSIGBVDIBE1/LTGcNm3d2Np/jxojkdePDdfnBHJc5W7vSMpbJ1aB7p/Py69A==} dev: true - /@types/node/16.18.32: - resolution: {integrity: sha512-zpnXe4dEz6PrWz9u7dqyRoq9VxwCvoXRPy/ewhmMa1CgEyVmtL1NJPQ2MX+4pf97vetquVKkpiMx0MwI8pjNOw==} + /@types/node/16.18.38: + resolution: {integrity: sha512-6sfo1qTulpVbkxECP+AVrHV9OoJqhzCsfTNp5NIG+enM4HyM3HvZCO798WShIXBN0+QtDIcutJCjsVYnQP5rIQ==} /@types/normalize-package-data/2.4.1: resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} dev: true - /@types/prettier/2.7.2: - resolution: {integrity: sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==} + /@types/prettier/2.7.3: + resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} + dev: true + + /@types/progress-stream/2.0.2: + resolution: {integrity: sha512-u9N40mYX/Nx/Pmt847+G2N72s5QL2jwgXrVKCIcxgOdMBdIzY+e/m3m1gQBNPmgvQQBO79EisLAcVJ/p0qKuvA==} + dependencies: + '@types/node': 16.18.38 dev: true /@types/qs/6.9.7: @@ -3268,21 +3379,26 @@ packages: /@types/responselike/1.0.0: resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} dependencies: - '@types/node': 16.18.32 + '@types/node': 16.18.38 + dev: true + + /@types/semver/7.5.0: + resolution: {integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==} dev: true /@types/send/0.17.1: resolution: {integrity: sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==} dependencies: '@types/mime': 1.3.2 - '@types/node': 16.18.32 + '@types/node': 16.18.38 dev: false - /@types/serve-static/1.15.1: - resolution: {integrity: sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==} + /@types/serve-static/1.15.2: + resolution: {integrity: sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==} dependencies: + '@types/http-errors': 2.0.1 '@types/mime': 3.0.1 - '@types/node': 16.18.32 + '@types/node': 16.18.38 dev: false /@types/sinon/10.0.15: @@ -3297,17 +3413,24 @@ packages: resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} dev: true + /@types/tar/4.0.5: + resolution: {integrity: sha512-cgwPhNEabHaZcYIy5xeMtux2EmYBitfqEceBUi2t5+ETy4dW6kswt6WX4+HqLeiiKOo42EXbGiDmVJ2x+vi37Q==} + dependencies: + '@types/minipass': 3.3.5 + '@types/node': 16.18.38 + dev: true + /@types/tar/6.1.5: resolution: {integrity: sha512-qm2I/RlZij5RofuY7vohTpYNaYcrSQlN2MyjucQc7ZweDwaEWkdN/EeNh6e9zjK6uEm6PwjdMXkcj05BxZdX1Q==} dependencies: - '@types/node': 14.18.47 + '@types/node': 16.18.38 minipass: 4.2.8 dev: true /@types/through/0.0.30: resolution: {integrity: sha512-FvnCJljyxhPM3gkRgWmxmDZyAQSiBQQWLI0A0VFL0K7W1oRUrPJSqNO0NvTnLkBcotdlp3lKvaT0JrnyRDkzOg==} dependencies: - '@types/node': 16.18.32 + '@types/node': 16.18.38 dev: true /@types/tmp/0.2.3: @@ -3322,7 +3445,7 @@ packages: resolution: {integrity: sha512-4UqPv+2567NhMQuMLdKAyK4yzrfCqwaTt6bLhHEs8PFcxbHILsrxaY63n4wgE/BRLDWDQeI+WcTmkXKExh9hQg==} dependencies: '@types/expect': 1.20.4 - '@types/node': 16.18.32 + '@types/node': 16.18.38 dev: true /@types/yargs-parser/21.0.0: @@ -3341,7 +3464,7 @@ packages: '@types/yargs-parser': 21.0.0 dev: true - /@typescript-eslint/eslint-plugin/2.34.0_zf6nlbvpet3ftgjxxczupn42he: + /@typescript-eslint/eslint-plugin/2.34.0_2jtrpwyxrr2247q7a3qbobjbsy: resolution: {integrity: sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ==} engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} peerDependencies: @@ -3352,9 +3475,9 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/experimental-utils': 2.34.0_5ujgynla27k2qkzlnkldjwsutm - '@typescript-eslint/parser': 2.34.0_5ujgynla27k2qkzlnkldjwsutm - eslint: 8.41.0 + '@typescript-eslint/experimental-utils': 2.34.0_mhvizudgavq6jzvqzwcqcv4nnm + '@typescript-eslint/parser': 2.34.0_mhvizudgavq6jzvqzwcqcv4nnm + eslint: 8.45.0 functional-red-black-tree: 1.0.1 regexpp: 3.2.0 tsutils: 3.21.0_typescript@4.9.5 @@ -3382,22 +3505,49 @@ packages: functional-red-black-tree: 1.0.1 ignore: 5.2.4 regexpp: 3.2.0 - semver: 7.5.1 + semver: 7.5.4 tsutils: 3.21.0_typescript@4.9.5 typescript: 4.9.5 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/experimental-utils/2.34.0_5ujgynla27k2qkzlnkldjwsutm: + /@typescript-eslint/eslint-plugin/5.62.0_mhvizudgavq6jzvqzwcqcv4nnm: + resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@eslint-community/regexpp': 4.5.1 + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/type-utils': 5.62.0_mhvizudgavq6jzvqzwcqcv4nnm + '@typescript-eslint/utils': 5.62.0_mhvizudgavq6jzvqzwcqcv4nnm + debug: 4.3.4 + eslint: 8.45.0 + graphemer: 1.4.0 + ignore: 5.2.4 + natural-compare-lite: 1.4.0 + semver: 7.5.4 + tsutils: 3.21.0_typescript@4.9.5 + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/experimental-utils/2.34.0_mhvizudgavq6jzvqzwcqcv4nnm: resolution: {integrity: sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA==} engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} peerDependencies: eslint: '*' dependencies: - '@types/json-schema': 7.0.11 + '@types/json-schema': 7.0.12 '@typescript-eslint/typescript-estree': 2.34.0_typescript@4.9.5 - eslint: 8.41.0 + eslint: 8.45.0 eslint-scope: 5.1.1 eslint-utils: 2.1.0 transitivePeerDependencies: @@ -3411,7 +3561,7 @@ packages: peerDependencies: eslint: '*' dependencies: - '@types/json-schema': 7.0.11 + '@types/json-schema': 7.0.12 '@typescript-eslint/scope-manager': 4.33.0 '@typescript-eslint/types': 4.33.0 '@typescript-eslint/typescript-estree': 4.33.0_typescript@4.9.5 @@ -3423,7 +3573,7 @@ packages: - typescript dev: true - /@typescript-eslint/parser/2.34.0_5ujgynla27k2qkzlnkldjwsutm: + /@typescript-eslint/parser/2.34.0_mhvizudgavq6jzvqzwcqcv4nnm: resolution: {integrity: sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA==} engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} peerDependencies: @@ -3434,9 +3584,9 @@ packages: optional: true dependencies: '@types/eslint-visitor-keys': 1.0.0 - '@typescript-eslint/experimental-utils': 2.34.0_5ujgynla27k2qkzlnkldjwsutm + '@typescript-eslint/experimental-utils': 2.34.0_mhvizudgavq6jzvqzwcqcv4nnm '@typescript-eslint/typescript-estree': 2.34.0_typescript@4.9.5 - eslint: 8.41.0 + eslint: 8.45.0 eslint-visitor-keys: 1.3.0 typescript: 4.9.5 transitivePeerDependencies: @@ -3471,11 +3621,44 @@ packages: '@typescript-eslint/visitor-keys': 4.33.0 dev: true + /@typescript-eslint/scope-manager/5.62.0: + resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + dev: true + + /@typescript-eslint/type-utils/5.62.0_mhvizudgavq6jzvqzwcqcv4nnm: + resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': 5.62.0_typescript@4.9.5 + '@typescript-eslint/utils': 5.62.0_mhvizudgavq6jzvqzwcqcv4nnm + debug: 4.3.4 + eslint: 8.45.0 + tsutils: 3.21.0_typescript@4.9.5 + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/types/4.33.0: resolution: {integrity: sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==} engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} dev: true + /@typescript-eslint/types/5.62.0: + resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + /@typescript-eslint/typescript-estree/2.34.0_typescript@4.9.5: resolution: {integrity: sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg==} engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} @@ -3490,7 +3673,7 @@ packages: glob: 7.2.3 is-glob: 4.0.3 lodash: 4.17.21 - semver: 7.5.1 + semver: 7.5.4 tsutils: 3.21.0_typescript@4.9.5 typescript: 4.9.5 transitivePeerDependencies: @@ -3511,13 +3694,54 @@ packages: debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 - semver: 7.5.1 + semver: 7.5.4 tsutils: 3.21.0_typescript@4.9.5 typescript: 4.9.5 transitivePeerDependencies: - supports-color dev: true + /@typescript-eslint/typescript-estree/5.62.0_typescript@4.9.5: + resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.4 + tsutils: 3.21.0_typescript@4.9.5 + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/utils/5.62.0_mhvizudgavq6jzvqzwcqcv4nnm: + resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0_eslint@8.45.0 + '@types/json-schema': 7.0.12 + '@types/semver': 7.5.0 + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0_typescript@4.9.5 + eslint: 8.45.0 + eslint-scope: 5.1.1 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + /@typescript-eslint/visitor-keys/4.33.0: resolution: {integrity: sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==} engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} @@ -3526,25 +3750,40 @@ packages: eslint-visitor-keys: 2.1.0 dev: true + /@typescript-eslint/visitor-keys/5.62.0: + resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.62.0 + eslint-visitor-keys: 3.4.1 + dev: true + /@wry/context/0.7.3: resolution: {integrity: sha512-Nl8WTesHp89RF803Se9X3IiHjdmLBrIvPMaJkl+rKVJAYyPsz1TEUbu89943HpvujtSJgDUx9W4vZw3K1Mr3sA==} engines: {node: '>=8'} dependencies: - tslib: 2.5.2 + tslib: 2.6.0 dev: false /@wry/equality/0.5.6: resolution: {integrity: sha512-D46sfMTngaYlrH+OspKf8mIJETntFnf6Hsjb0V41jAXJ7Bx2kB8Rv8RCUujuVWYttFtHkUNp7g+FwxNQAr6mXA==} engines: {node: '>=8'} dependencies: - tslib: 2.5.2 + tslib: 2.6.0 dev: false /@wry/trie/0.3.2: resolution: {integrity: sha512-yRTyhWSls2OY/pYLfwff867r8ekooZ4UI+/gxot5Wj8EFwSf2rG+n+Mo/6LoLQm1TKA4GRj2+LCpbfS937dClQ==} engines: {node: '>=8'} dependencies: - tslib: 2.5.2 + tslib: 2.6.0 + dev: false + + /@wry/trie/0.4.3: + resolution: {integrity: sha512-I6bHwH0fSf6RqQcnnXLJKhkSXG45MFral3GxPaY4uAl0LYDZM+YDVDAiU9bYwjTuysy1S0IeecWtmq1SZA3M1w==} + engines: {node: '>=8'} + dependencies: + tslib: 2.6.0 dev: false /JSONStream/1.3.5: @@ -3563,6 +3802,13 @@ packages: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} dev: true + /abort-controller/3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + dependencies: + event-target-shim: 5.0.1 + dev: true + /accepts/1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} @@ -3574,7 +3820,7 @@ packages: /acorn-globals/7.0.1: resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==} dependencies: - acorn: 8.8.2 + acorn: 8.10.0 acorn-walk: 8.2.0 dev: false @@ -3586,12 +3832,12 @@ packages: acorn: 7.4.1 dev: true - /acorn-jsx/5.3.2_acorn@8.8.2: + /acorn-jsx/5.3.2_acorn@8.10.0: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - acorn: 8.8.2 + acorn: 8.10.0 dev: true /acorn-walk/8.2.0: @@ -3604,8 +3850,8 @@ packages: hasBin: true dev: true - /acorn/8.8.2: - resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} + /acorn/8.10.0: + resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} engines: {node: '>=0.4.0'} hasBin: true @@ -3892,7 +4138,6 @@ packages: /astral-regex/2.0.0: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} engines: {node: '>=8'} - dev: true /async/2.6.4: resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} @@ -3925,8 +4170,8 @@ packages: engines: {node: '>= 0.4'} dev: true - /aws-sdk/2.1383.0: - resolution: {integrity: sha512-A8sdfcrlGYXqu5x8dpwh1lg9/o354leCx08N/irwH3U4sAwQin0vHsI9DHmaJ0PLNo/TuzeLE3s4dLpI3mWtww==} + /aws-sdk/2.1418.0: + resolution: {integrity: sha512-6WDMJQAWKwVt+44+61c/SAXKpUSwToqBMeaqizhEe3GN8TWfxMc9RfCnsYIIwS+L+5hedmKC5oc6Fg2ujs8KUQ==} engines: {node: '>= 10.0.0'} dependencies: buffer: 4.9.2 @@ -3970,17 +4215,17 @@ packages: - debug dev: false - /babel-jest/29.5.0_@babel+core@7.21.8: - resolution: {integrity: sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q==} + /babel-jest/29.6.1_@babel+core@7.22.9: + resolution: {integrity: sha512-qu+3bdPEQC6KZSPz+4Fyjbga5OODNcp49j6GKzG1EKbkfyJBxEYGVUmVGpwCSeGouG52R4EgYMLb6p9YeEEQ4A==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.8.0 dependencies: - '@babel/core': 7.21.8 - '@jest/transform': 29.5.0 - '@types/babel__core': 7.20.0 + '@babel/core': 7.22.9 + '@jest/transform': 29.6.1 + '@types/babel__core': 7.20.1 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.5.0_@babel+core@7.21.8 + babel-preset-jest: 29.5.0_@babel+core@7.22.9 chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 @@ -3992,7 +4237,7 @@ packages: resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} engines: {node: '>=8'} dependencies: - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 '@istanbuljs/load-nyc-config': 1.1.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-instrument: 5.2.1 @@ -4005,41 +4250,41 @@ packages: resolution: {integrity: sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/template': 7.21.9 - '@babel/types': 7.21.5 - '@types/babel__core': 7.20.0 - '@types/babel__traverse': 7.18.5 + '@babel/template': 7.22.5 + '@babel/types': 7.22.5 + '@types/babel__core': 7.20.1 + '@types/babel__traverse': 7.20.1 dev: true - /babel-preset-current-node-syntax/1.0.1_@babel+core@7.21.8: + /babel-preset-current-node-syntax/1.0.1_@babel+core@7.22.9: resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.21.8 - '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.21.8 - '@babel/plugin-syntax-bigint': 7.8.3_@babel+core@7.21.8 - '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.21.8 - '@babel/plugin-syntax-import-meta': 7.10.4_@babel+core@7.21.8 - '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.21.8 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.21.8 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.21.8 - '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.21.8 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.21.8 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.21.8 - '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.21.8 - '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.21.8 - dev: true - - /babel-preset-jest/29.5.0_@babel+core@7.21.8: + '@babel/core': 7.22.9 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.22.9 + '@babel/plugin-syntax-bigint': 7.8.3_@babel+core@7.22.9 + '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.22.9 + '@babel/plugin-syntax-import-meta': 7.10.4_@babel+core@7.22.9 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.22.9 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.22.9 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.22.9 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.22.9 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.22.9 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.22.9 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.22.9 + '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.22.9 + dev: true + + /babel-preset-jest/29.5.0_@babel+core@7.22.9: resolution: {integrity: sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.21.8 + '@babel/core': 7.22.9 babel-plugin-jest-hoist: 29.5.0 - babel-preset-current-node-syntax: 1.0.1_@babel+core@7.21.8 + babel-preset-current-node-syntax: 1.0.1_@babel+core@7.22.9 dev: true /balanced-match/1.0.2: @@ -4140,15 +4385,15 @@ packages: resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} dev: true - /browserslist/4.21.5: - resolution: {integrity: sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==} + /browserslist/4.21.9: + resolution: {integrity: sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001489 - electron-to-chromium: 1.4.405 - node-releases: 2.0.12 - update-browserslist-db: 1.0.11_browserslist@4.21.5 + caniuse-lite: 1.0.30001517 + electron-to-chromium: 1.4.466 + node-releases: 2.0.13 + update-browserslist-db: 1.0.11_browserslist@4.21.9 dev: true /bs-logger/0.2.6: @@ -4182,6 +4427,13 @@ packages: base64-js: 1.5.1 ieee754: 1.2.1 + /buffer/6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: true + /builtin-modules/3.3.0: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} @@ -4194,7 +4446,7 @@ packages: /builtins/5.0.1: resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} dependencies: - semver: 7.5.1 + semver: 7.5.4 dev: true /bytes/3.1.2: @@ -4312,7 +4564,7 @@ packages: dependencies: '@npmcli/fs': 3.1.0 fs-minipass: 3.0.2 - glob: 10.2.6 + glob: 10.3.3 lru-cache: 7.18.3 minipass: 5.0.0 minipass-collect: 1.0.2 @@ -4338,14 +4590,14 @@ packages: engines: {node: '>=10.6.0'} dev: true - /cacheable-request/7.0.2: - resolution: {integrity: sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==} + /cacheable-request/7.0.4: + resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} engines: {node: '>=8'} dependencies: clone-response: 1.0.3 get-stream: 5.2.0 http-cache-semantics: 4.1.1 - keyv: 4.5.2 + keyv: 4.5.3 lowercase-keys: 2.0.0 normalize-url: 6.1.0 responselike: 2.0.1 @@ -4381,8 +4633,8 @@ packages: engines: {node: '>=10'} dev: true - /caniuse-lite/1.0.30001489: - resolution: {integrity: sha512-x1mgZEXK8jHIfAxm+xgdpHpk50IN3z3q3zP261/WS+uvePxW8izXuCu6AHz0lkuYTlATDehiZ/tNyYBdSQsOUQ==} + /caniuse-lite/1.0.30001517: + resolution: {integrity: sha512-Vdhm5S11DaFVLlyiKu4hiUTkpZu+y1KA/rZZqVQfOD5YdDT/eQKlkt7NaE0WGOFgX32diqt9MiP9CAiFeRklaA==} dev: true /cardinal/2.1.1: @@ -4481,8 +4733,8 @@ packages: engines: {node: '>=8'} dev: true - /cjs-module-lexer/1.2.2: - resolution: {integrity: sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==} + /cjs-module-lexer/1.2.3: + resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} dev: true /clean-regexp/1.0.0: @@ -4641,8 +4893,8 @@ packages: stream-via: 1.0.4 dev: true - /collect-v8-coverage/1.0.1: - resolution: {integrity: sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==} + /collect-v8-coverage/1.0.2: + resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} dev: true /color-convert/1.9.3: @@ -4785,7 +5037,7 @@ packages: json-schema-typed: 7.0.3 onetime: 5.1.2 pkg-up: 3.1.0 - semver: 7.5.1 + semver: 7.5.4 dev: false /config-master/3.1.0: @@ -4849,10 +5101,10 @@ packages: /create-require/1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - /cross-fetch/3.1.6: - resolution: {integrity: sha512-riRvo06crlE8HiqOwIpQhxwdOk4fOeR7FVM/wXoxchFEqMNUjvbs3bfo4OTgMEMHzppd4DxFBDbyySj8Cv781g==} + /cross-fetch/3.1.8: + resolution: {integrity: sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==} dependencies: - node-fetch: 2.6.11 + node-fetch: 2.6.12 transitivePeerDependencies: - encoding dev: false @@ -4863,7 +5115,7 @@ packages: dependencies: nice-try: 1.0.5 path-key: 2.0.1 - semver: 5.7.1 + semver: 5.7.2 shebang-command: 1.2.0 which: 1.3.1 @@ -4923,7 +5175,7 @@ packages: resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} engines: {node: '>=0.11'} dependencies: - '@babel/runtime': 7.21.5 + '@babel/runtime': 7.22.6 dev: true /dateformat/4.6.3: @@ -4973,6 +5225,7 @@ packages: /debuglog/1.0.1: resolution: {integrity: sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. dev: true /decamelize/1.2.0: @@ -5014,6 +5267,7 @@ packages: /deep-is/0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true /deepmerge/4.3.1: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} @@ -5165,8 +5419,8 @@ packages: engines: {node: '>=12'} dev: true - /dotenv/16.0.3: - resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} + /dotenv/16.3.1: + resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} engines: {node: '>=12'} /eastasianwidth/0.2.0: @@ -5182,10 +5436,10 @@ packages: engines: {node: '>=0.10.0'} hasBin: true dependencies: - jake: 10.8.6 + jake: 10.8.7 - /electron-to-chromium/1.4.405: - resolution: {integrity: sha512-JdDgnwU69FMZURoesf9gNOej2Cms1XJFfLk24y1IBtnAdhTcJY/mXnokmpmxHN59PcykBP4bgUU98vLY44Lhuw==} + /electron-to-chromium/1.4.466: + resolution: {integrity: sha512-TSkRvbXRXD8BwhcGlZXDsbI2lRoP8dvqR7LQnqQNk9KxXBc4tG8O+rTuXgTyIpEdiqSGKEBSqrxdqEntnjNncA==} dev: true /elegant-spinner/1.0.1: @@ -5295,15 +5549,14 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - /escodegen/2.0.0: - resolution: {integrity: sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==} + /escodegen/2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} engines: {node: '>=6.0'} hasBin: true dependencies: esprima: 4.0.1 estraverse: 5.3.0 esutils: 2.0.3 - optionator: 0.8.3 optionalDependencies: source-map: 0.6.1 dev: false @@ -5316,33 +5569,33 @@ packages: lodash.zip: 4.2.0 dev: true - /eslint-config-oclif-typescript/0.1.0_5ujgynla27k2qkzlnkldjwsutm: + /eslint-config-oclif-typescript/0.1.0_mhvizudgavq6jzvqzwcqcv4nnm: resolution: {integrity: sha512-BjXNJcH2F02MdaSFml9vJskviUFVkLHbTPGM5tinIt98H6klFNKP7/lQ+fB/Goc2wB45usEuuw6+l/fwAv9i7g==} engines: {node: '>= 10.0.0'} dependencies: - '@typescript-eslint/eslint-plugin': 2.34.0_zf6nlbvpet3ftgjxxczupn42he - '@typescript-eslint/parser': 2.34.0_5ujgynla27k2qkzlnkldjwsutm - eslint-config-oclif: 3.1.0_eslint@8.41.0 - eslint-config-xo-space: 0.20.0_eslint@8.41.0 - eslint-plugin-mocha: 5.3.0_eslint@8.41.0 - eslint-plugin-node: 7.0.1_eslint@8.41.0 - eslint-plugin-unicorn: 6.0.1_eslint@8.41.0 + '@typescript-eslint/eslint-plugin': 2.34.0_2jtrpwyxrr2247q7a3qbobjbsy + '@typescript-eslint/parser': 2.34.0_mhvizudgavq6jzvqzwcqcv4nnm + eslint-config-oclif: 3.1.0_eslint@8.45.0 + eslint-config-xo-space: 0.20.0_eslint@8.45.0 + eslint-plugin-mocha: 5.3.0_eslint@8.45.0 + eslint-plugin-node: 7.0.1_eslint@8.45.0 + eslint-plugin-unicorn: 6.0.1_eslint@8.45.0 transitivePeerDependencies: - eslint - supports-color - typescript dev: true - /eslint-config-oclif-typescript/0.2.0_5ujgynla27k2qkzlnkldjwsutm: + /eslint-config-oclif-typescript/0.2.0_mhvizudgavq6jzvqzwcqcv4nnm: resolution: {integrity: sha512-BdP5FgjxwqV9LmVnfd4TaxhwdQipY7GJVVuP2AKm+EkKoupSCflSiRqnd2cj8qvVq/IXYPK2eHpRDk5ts8hP9g==} engines: {node: '>= 10.0.0'} dependencies: - '@typescript-eslint/eslint-plugin': 2.34.0_zf6nlbvpet3ftgjxxczupn42he - '@typescript-eslint/parser': 2.34.0_5ujgynla27k2qkzlnkldjwsutm - eslint-config-xo-space: 0.20.0_eslint@8.41.0 - eslint-plugin-mocha: 5.3.0_eslint@8.41.0 - eslint-plugin-node: 7.0.1_eslint@8.41.0 - eslint-plugin-unicorn: 6.0.1_eslint@8.41.0 + '@typescript-eslint/eslint-plugin': 2.34.0_2jtrpwyxrr2247q7a3qbobjbsy + '@typescript-eslint/parser': 2.34.0_mhvizudgavq6jzvqzwcqcv4nnm + eslint-config-xo-space: 0.20.0_eslint@8.45.0 + eslint-plugin-mocha: 5.3.0_eslint@8.45.0 + eslint-plugin-node: 7.0.1_eslint@8.45.0 + eslint-plugin-unicorn: 6.0.1_eslint@8.45.0 transitivePeerDependencies: - eslint - supports-color @@ -5364,14 +5617,14 @@ packages: - typescript dev: true - /eslint-config-oclif/3.1.0_eslint@8.41.0: + /eslint-config-oclif/3.1.0_eslint@8.45.0: resolution: {integrity: sha512-Tqgy43cNXsSdhTLWW4RuDYGFhV240sC4ISSv/ZiUEg/zFxExSEUpRE6J+AGnkKY9dYwIW4C9b2YSUVv8z/miMA==} engines: {node: '>= 8.0.0'} dependencies: - eslint-config-xo-space: 0.20.0_eslint@8.41.0 - eslint-plugin-mocha: 5.3.0_eslint@8.41.0 - eslint-plugin-node: 7.0.1_eslint@8.41.0 - eslint-plugin-unicorn: 6.0.1_eslint@8.41.0 + eslint-config-xo-space: 0.20.0_eslint@8.45.0 + eslint-plugin-mocha: 5.3.0_eslint@8.45.0 + eslint-plugin-node: 7.0.1_eslint@8.45.0 + eslint-plugin-unicorn: 6.0.1_eslint@8.45.0 transitivePeerDependencies: - eslint dev: true @@ -5389,27 +5642,27 @@ packages: - supports-color dev: true - /eslint-config-oclif/4.0.0_eslint@8.41.0: + /eslint-config-oclif/4.0.0_eslint@8.45.0: resolution: {integrity: sha512-5tkUQeC33rHAhJxaGeBGYIflDLumeV2qD/4XLBdXhB/6F/+Jnwdce9wYHSvkx0JUqUQShpQv8JEVkBp/zzD7hg==} engines: {node: '>=12.0.0'} dependencies: - eslint-config-xo-space: 0.27.0_eslint@8.41.0 - eslint-plugin-mocha: 9.0.0_eslint@8.41.0 - eslint-plugin-node: 11.1.0_eslint@8.41.0 - eslint-plugin-unicorn: 36.0.0_eslint@8.41.0 + eslint-config-xo-space: 0.27.0_eslint@8.45.0 + eslint-plugin-mocha: 9.0.0_eslint@8.45.0 + eslint-plugin-node: 11.1.0_eslint@8.45.0 + eslint-plugin-unicorn: 36.0.0_eslint@8.45.0 transitivePeerDependencies: - eslint - supports-color dev: true - /eslint-config-xo-space/0.20.0_eslint@8.41.0: + /eslint-config-xo-space/0.20.0_eslint@8.45.0: resolution: {integrity: sha512-bOsoZA8M6v1HviDUIGVq1fLVnSu3mMZzn85m2tqKb73tSzu4GKD4Jd2Py4ZKjCgvCbRRByEB5HPC3fTMnnJ1uw==} engines: {node: '>=6'} peerDependencies: eslint: ^5.3.0 dependencies: - eslint: 8.41.0 - eslint-config-xo: 0.24.2_eslint@8.41.0 + eslint: 8.45.0 + eslint-config-xo: 0.24.2_eslint@8.45.0 dev: true /eslint-config-xo-space/0.27.0_eslint@7.32.0: @@ -5422,14 +5675,14 @@ packages: eslint-config-xo: 0.35.0_eslint@7.32.0 dev: true - /eslint-config-xo-space/0.27.0_eslint@8.41.0: + /eslint-config-xo-space/0.27.0_eslint@8.45.0: resolution: {integrity: sha512-b8UjW+nQyOkhiANVpIptqlKPyE7XRyQ40uQ1NoBhzVfu95gxfZGrpliq8ZHBpaOF2wCLZaexTSjg7Rvm99vj4A==} engines: {node: '>=10'} peerDependencies: eslint: '>=7.20.0' dependencies: - eslint: 8.41.0 - eslint-config-xo: 0.35.0_eslint@8.41.0 + eslint: 8.45.0 + eslint-config-xo: 0.35.0_eslint@8.45.0 dev: true /eslint-config-xo-space/0.29.0_eslint@7.32.0: @@ -5442,13 +5695,13 @@ packages: eslint-config-xo: 0.38.0_eslint@7.32.0 dev: true - /eslint-config-xo/0.24.2_eslint@8.41.0: + /eslint-config-xo/0.24.2_eslint@8.45.0: resolution: {integrity: sha512-ivQ7qISScW6gfBp+p31nQntz1rg34UCybd3uvlngcxt5Utsf4PMMi9QoAluLFcPUM5Tvqk4JGraR9qu3msKPKQ==} engines: {node: '>=6'} peerDependencies: eslint: '>=5.3.0' dependencies: - eslint: 8.41.0 + eslint: 8.45.0 dev: true /eslint-config-xo/0.35.0_eslint@7.32.0: @@ -5461,14 +5714,14 @@ packages: eslint: 7.32.0 dev: true - /eslint-config-xo/0.35.0_eslint@8.41.0: + /eslint-config-xo/0.35.0_eslint@8.45.0: resolution: {integrity: sha512-+WyZTLWUJlvExFrBU/Ldw8AB/S0d3x+26JQdBWbcqig2ZaWh0zinYcHok+ET4IoPaEcRRf3FE9kjItNVjBwnAg==} engines: {node: '>=10'} peerDependencies: eslint: '>=7.20.0' dependencies: confusing-browser-globals: 1.0.10 - eslint: 8.41.0 + eslint: 8.45.0 dev: true /eslint-config-xo/0.38.0_eslint@7.32.0: @@ -5481,13 +5734,13 @@ packages: eslint: 7.32.0 dev: true - /eslint-plugin-es/1.4.1_eslint@8.41.0: + /eslint-plugin-es/1.4.1_eslint@8.45.0: resolution: {integrity: sha512-5fa/gR2yR3NxQf+UXkeLeP8FBBl6tSgdrAz1+cF84v1FMM4twGwQoqTnn+QxFLcPOrF4pdKEJKDB/q9GoyJrCA==} engines: {node: '>=6.5.0'} peerDependencies: eslint: '>=4.19.1' dependencies: - eslint: 8.41.0 + eslint: 8.45.0 eslint-utils: 1.4.3 regexpp: 2.0.1 dev: true @@ -5503,24 +5756,24 @@ packages: regexpp: 3.2.0 dev: true - /eslint-plugin-es/3.0.1_eslint@8.41.0: + /eslint-plugin-es/3.0.1_eslint@8.45.0: resolution: {integrity: sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==} engines: {node: '>=8.10.0'} peerDependencies: eslint: '>=4.19.1' dependencies: - eslint: 8.41.0 + eslint: 8.45.0 eslint-utils: 2.1.0 regexpp: 3.2.0 dev: true - /eslint-plugin-mocha/5.3.0_eslint@8.41.0: + /eslint-plugin-mocha/5.3.0_eslint@8.45.0: resolution: {integrity: sha512-3uwlJVLijjEmBeNyH60nzqgA1gacUWLUmcKV8PIGNvj1kwP/CTgAWQHn2ayyJVwziX+KETkr9opNwT1qD/RZ5A==} engines: {node: '>=6.0.0'} peerDependencies: eslint: '>= 4.0.0' dependencies: - eslint: 8.41.0 + eslint: 8.45.0 ramda: 0.26.1 dev: true @@ -5535,14 +5788,14 @@ packages: ramda: 0.27.2 dev: true - /eslint-plugin-mocha/9.0.0_eslint@8.41.0: + /eslint-plugin-mocha/9.0.0_eslint@8.45.0: resolution: {integrity: sha512-d7knAcQj1jPCzZf3caeBIn3BnW6ikcvfz0kSqQpwPYcVGLoJV5sz0l0OJB2LR8I7dvTDbqq1oV6ylhSgzA10zg==} engines: {node: '>=12.0.0'} peerDependencies: eslint: '>=7.0.0' dependencies: - eslint: 8.41.0 - eslint-utils: 3.0.0_eslint@8.41.0 + eslint: 8.45.0 + eslint-utils: 3.0.0_eslint@8.45.0 ramda: 0.27.2 dev: true @@ -5558,37 +5811,37 @@ packages: ignore: 5.2.4 minimatch: 3.1.2 resolve: 1.22.2 - semver: 6.3.0 + semver: 6.3.1 dev: true - /eslint-plugin-node/11.1.0_eslint@8.41.0: + /eslint-plugin-node/11.1.0_eslint@8.45.0: resolution: {integrity: sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==} engines: {node: '>=8.10.0'} peerDependencies: eslint: '>=5.16.0' dependencies: - eslint: 8.41.0 - eslint-plugin-es: 3.0.1_eslint@8.41.0 + eslint: 8.45.0 + eslint-plugin-es: 3.0.1_eslint@8.45.0 eslint-utils: 2.1.0 ignore: 5.2.4 minimatch: 3.1.2 resolve: 1.22.2 - semver: 6.3.0 + semver: 6.3.1 dev: true - /eslint-plugin-node/7.0.1_eslint@8.41.0: + /eslint-plugin-node/7.0.1_eslint@8.45.0: resolution: {integrity: sha512-lfVw3TEqThwq0j2Ba/Ckn2ABdwmL5dkOgAux1rvOk6CO7A6yGyPI2+zIxN6FyNkp1X1X/BSvKOceD6mBWSj4Yw==} engines: {node: '>=6'} peerDependencies: eslint: '>=4.19.1' dependencies: - eslint: 8.41.0 - eslint-plugin-es: 1.4.1_eslint@8.41.0 + eslint: 8.45.0 + eslint-plugin-es: 1.4.1_eslint@8.45.0 eslint-utils: 1.4.3 ignore: 4.0.6 minimatch: 3.1.2 resolve: 1.22.2 - semver: 5.7.1 + semver: 5.7.2 dev: true /eslint-plugin-unicorn/36.0.0_eslint@7.32.0: @@ -5597,7 +5850,7 @@ packages: peerDependencies: eslint: '>=7.32.0' dependencies: - '@babel/helper-validator-identifier': 7.19.1 + '@babel/helper-validator-identifier': 7.22.5 ci-info: 3.8.0 clean-regexp: 1.0.0 eslint: 7.32.0 @@ -5609,42 +5862,42 @@ packages: read-pkg-up: 7.0.1 regexp-tree: 0.1.27 safe-regex: 2.1.1 - semver: 7.5.1 + semver: 7.5.4 transitivePeerDependencies: - supports-color dev: true - /eslint-plugin-unicorn/36.0.0_eslint@8.41.0: + /eslint-plugin-unicorn/36.0.0_eslint@8.45.0: resolution: {integrity: sha512-xxN2vSctGWnDW6aLElm/LKIwcrmk6mdiEcW55Uv5krcrVcIFSWMmEgc/hwpemYfZacKZ5npFERGNz4aThsp1AA==} engines: {node: '>=12'} peerDependencies: eslint: '>=7.32.0' dependencies: - '@babel/helper-validator-identifier': 7.19.1 + '@babel/helper-validator-identifier': 7.22.5 ci-info: 3.8.0 clean-regexp: 1.0.0 - eslint: 8.41.0 - eslint-template-visitor: 2.3.2_eslint@8.41.0 - eslint-utils: 3.0.0_eslint@8.41.0 + eslint: 8.45.0 + eslint-template-visitor: 2.3.2_eslint@8.45.0 + eslint-utils: 3.0.0_eslint@8.45.0 is-builtin-module: 3.2.1 lodash: 4.17.21 pluralize: 8.0.0 read-pkg-up: 7.0.1 regexp-tree: 0.1.27 safe-regex: 2.1.1 - semver: 7.5.1 + semver: 7.5.4 transitivePeerDependencies: - supports-color dev: true - /eslint-plugin-unicorn/6.0.1_eslint@8.41.0: + /eslint-plugin-unicorn/6.0.1_eslint@8.45.0: resolution: {integrity: sha512-hjy9LhTdtL7pz8WTrzS0CGXRkWK3VAPLDjihofj8JC+uxQLfXm0WwZPPPB7xKmcjRyoH+jruPHOCrHNEINpG/Q==} engines: {node: '>=6'} peerDependencies: eslint: '>=5.0.0' dependencies: clean-regexp: 1.0.0 - eslint: 8.41.0 + eslint: 8.45.0 eslint-ast-utils: 1.1.0 import-modules: 1.1.0 lodash.camelcase: 4.3.0 @@ -5662,8 +5915,8 @@ packages: estraverse: 4.3.0 dev: true - /eslint-scope/7.2.0: - resolution: {integrity: sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==} + /eslint-scope/7.2.1: + resolution: {integrity: sha512-CvefSOsDdaYYvxChovdrPo/ZGt8d5lrJWleAc1diXRKhHGiTYEI26cvo8Kle/wGnsizoCJjK73FMg1/IkIwiNA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: esrecurse: 4.3.0 @@ -5675,8 +5928,8 @@ packages: peerDependencies: eslint: '>=7.0.0' dependencies: - '@babel/core': 7.21.8 - '@babel/eslint-parser': 7.21.8_btda5vh3j4tohbqgrkgx3qt2km + '@babel/core': 7.22.9 + '@babel/eslint-parser': 7.22.9_obubolzgl5d4rtlk2lhkmaaisu eslint: 7.32.0 eslint-visitor-keys: 2.1.0 esquery: 1.5.0 @@ -5685,14 +5938,14 @@ packages: - supports-color dev: true - /eslint-template-visitor/2.3.2_eslint@8.41.0: + /eslint-template-visitor/2.3.2_eslint@8.45.0: resolution: {integrity: sha512-3ydhqFpuV7x1M9EK52BPNj6V0Kwu0KKkcIAfpUhwHbR8ocRln/oUHgfxQupY8O1h4Qv/POHDumb/BwwNfxbtnA==} peerDependencies: eslint: '>=7.0.0' dependencies: - '@babel/core': 7.21.8 - '@babel/eslint-parser': 7.21.8_fnsrarlmvgqcaofxh5pcbbd6rm - eslint: 8.41.0 + '@babel/core': 7.22.9 + '@babel/eslint-parser': 7.22.9_mxva3tvsh22zo7fr2tqrirzrru + eslint: 8.45.0 eslint-visitor-keys: 2.1.0 esquery: 1.5.0 multimap: 1.1.0 @@ -5724,13 +5977,13 @@ packages: eslint-visitor-keys: 2.1.0 dev: true - /eslint-utils/3.0.0_eslint@8.41.0: + /eslint-utils/3.0.0_eslint@8.45.0: resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} peerDependencies: eslint: '>=5' dependencies: - eslint: 8.41.0 + eslint: 8.45.0 eslint-visitor-keys: 2.1.0 dev: true @@ -5785,10 +6038,10 @@ packages: lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 - optionator: 0.9.1 + optionator: 0.9.3 progress: 2.0.3 regexpp: 3.2.0 - semver: 7.5.1 + semver: 7.5.4 strip-ansi: 6.0.1 strip-json-comments: 3.1.1 table: 6.8.1 @@ -5798,16 +6051,16 @@ packages: - supports-color dev: true - /eslint/8.41.0: - resolution: {integrity: sha512-WQDQpzGBOP5IrXPo4Hc0814r4/v2rrIsB0rhT7jtunIalgg6gYXWhRMOejVO8yH21T/FGaxjmFjBMNqcIlmH1Q==} + /eslint/8.45.0: + resolution: {integrity: sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - '@eslint-community/eslint-utils': 4.4.0_eslint@8.41.0 + '@eslint-community/eslint-utils': 4.4.0_eslint@8.45.0 '@eslint-community/regexpp': 4.5.1 - '@eslint/eslintrc': 2.0.3 - '@eslint/js': 8.41.0 - '@humanwhocodes/config-array': 0.11.8 + '@eslint/eslintrc': 2.1.0 + '@eslint/js': 8.44.0 + '@humanwhocodes/config-array': 0.11.10 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 ajv: 6.12.6 @@ -5816,9 +6069,9 @@ packages: debug: 4.3.4 doctrine: 3.0.0 escape-string-regexp: 4.0.0 - eslint-scope: 7.2.0 + eslint-scope: 7.2.1 eslint-visitor-keys: 3.4.1 - espree: 9.5.2 + espree: 9.6.1 esquery: 1.5.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 @@ -5828,7 +6081,6 @@ packages: globals: 13.20.0 graphemer: 1.4.0 ignore: 5.2.4 - import-fresh: 3.3.0 imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 @@ -5838,9 +6090,8 @@ packages: lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 - optionator: 0.9.1 + optionator: 0.9.3 strip-ansi: 6.0.1 - strip-json-comments: 3.1.1 text-table: 0.2.0 transitivePeerDependencies: - supports-color @@ -5860,12 +6111,12 @@ packages: eslint-visitor-keys: 1.3.0 dev: true - /espree/9.5.2: - resolution: {integrity: sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==} + /espree/9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - acorn: 8.8.2 - acorn-jsx: 5.3.2_acorn@8.8.2 + acorn: 8.10.0 + acorn-jsx: 5.3.2_acorn@8.10.0 eslint-visitor-keys: 3.4.1 dev: true @@ -5906,6 +6157,11 @@ packages: engines: {node: '>= 0.6'} dev: false + /event-target-shim/5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + dev: true + /eventemitter3/4.0.7: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} dev: true @@ -5915,6 +6171,11 @@ packages: engines: {node: '>=0.4.x'} dev: true + /events/3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + dev: true + /execa/5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} @@ -5935,15 +6196,20 @@ packages: engines: {node: '>= 0.8.0'} dev: true - /expect/29.5.0: - resolution: {integrity: sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==} + /expect/29.6.1: + resolution: {integrity: sha512-XEdDLonERCU1n9uR56/Stx9OqojaLAQtZf9PrCHH9Hl8YXiEIka3H4NXJ3NOIBmQJTg7+j7buh34PMHfJujc8g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/expect-utils': 29.5.0 + '@jest/expect-utils': 29.6.1 + '@types/node': 16.18.38 jest-get-type: 29.4.3 - jest-matcher-utils: 29.5.0 - jest-message-util: 29.5.0 - jest-util: 29.5.0 + jest-matcher-utils: 29.6.1 + jest-message-util: 29.6.1 + jest-util: 29.6.1 + dev: true + + /exponential-backoff/3.1.1: + resolution: {integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==} dev: true /express/4.18.2: @@ -6012,27 +6278,27 @@ packages: engines: {node: '>=8.0.0'} dependencies: '@types/chai': 4.3.5 - '@types/lodash': 4.14.194 - '@types/node': 16.18.32 + '@types/lodash': 4.14.195 + '@types/node': 16.18.38 '@types/sinon': 10.0.15 lodash: 4.17.21 mock-stdin: 1.0.0 - nock: 13.3.1 + nock: 13.3.2 stdout-stderr: 0.1.13 transitivePeerDependencies: - supports-color - /fancy-test/2.0.23: - resolution: {integrity: sha512-RPX4iAzAioH9nxkqk2yrcunBLBmnMLxtIsw3Pjgj2PGPHTdT3wZ6asKv9U332+UQyZwZWWc4bP64JOa6DcVhnQ==} + /fancy-test/2.0.31: + resolution: {integrity: sha512-Ok4L7GuoVdOBKtwlHdSnBYDBSFeWazcr6+/lhcC0LWS+sJYOXgbyCPP54fTt2TM1T8QWUm4ULHKQGOHKS61pfg==} engines: {node: '>=12.0.0'} dependencies: '@types/chai': 4.3.5 - '@types/lodash': 4.14.194 - '@types/node': 16.18.32 + '@types/lodash': 4.14.195 + '@types/node': 16.18.38 '@types/sinon': 10.0.15 lodash: 4.17.21 mock-stdin: 1.0.0 - nock: 13.3.1 + nock: 13.3.2 stdout-stderr: 0.1.13 transitivePeerDependencies: - supports-color @@ -6049,8 +6315,8 @@ packages: /fast-deep-equal/3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - /fast-glob/3.2.12: - resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} + /fast-glob/3.3.0: + resolution: {integrity: sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==} engines: {node: '>=8.6.0'} dependencies: '@nodelib/fs.stat': 2.0.5 @@ -6065,6 +6331,7 @@ packages: /fast-levenshtein/2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: true /fast-levenshtein/3.0.0: resolution: {integrity: sha512-hKKNajm46uNmTlhHSyZkmToAc56uZJwYq7yrciZjqOxnlfQwERDQJmHPUp7m1m9wx8vgOe8IaCKZ5Kv2k1DdCQ==} @@ -6329,15 +6596,6 @@ packages: resolution: {integrity: sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==} dev: true - /fs-extra/11.1.1: - resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} - engines: {node: '>=14.14'} - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.0 - dev: false - /fs-extra/8.1.0: resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} engines: {node: '>=6 <7 || >=8'} @@ -6494,16 +6752,16 @@ packages: is-glob: 4.0.3 dev: true - /glob/10.2.6: - resolution: {integrity: sha512-U/rnDpXJGF414QQQZv5uVsabTVxMSwzS5CH0p3DRCIV6ownl4f7PzGnkGmvlum2wB+9RlJWJZ6ACU1INnBqiPA==} + /glob/10.3.3: + resolution: {integrity: sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==} engines: {node: '>=16 || 14 >=14.17'} hasBin: true dependencies: foreground-child: 3.1.1 jackspeak: 2.2.1 - minimatch: 9.0.1 + minimatch: 9.0.3 minipass: 5.0.0 - path-scurry: 1.9.2 + path-scurry: 1.10.1 dev: true /glob/7.2.0: @@ -6557,7 +6815,7 @@ packages: '@types/glob': 7.2.0 array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.2.12 + fast-glob: 3.3.0 glob: 7.2.3 ignore: 5.2.4 merge2: 1.4.1 @@ -6570,7 +6828,7 @@ packages: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.2.12 + fast-glob: 3.3.0 ignore: 5.2.4 merge2: 1.4.1 slash: 3.0.0 @@ -6590,7 +6848,7 @@ packages: '@types/cacheable-request': 6.0.3 '@types/responselike': 1.0.0 cacheable-lookup: 5.0.4 - cacheable-request: 7.0.2 + cacheable-request: 7.0.4 decompress-response: 6.0.0 http2-wrapper: 1.0.3 lowercase-keys: 2.0.0 @@ -6605,18 +6863,18 @@ packages: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} dev: true - /graphql-tag/2.12.6_graphql@16.6.0: + /graphql-tag/2.12.6_graphql@16.7.1: resolution: {integrity: sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==} engines: {node: '>=10'} peerDependencies: graphql: ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 dependencies: - graphql: 16.6.0 - tslib: 2.5.2 + graphql: 16.7.1 + tslib: 2.6.0 dev: false - /graphql/16.6.0: - resolution: {integrity: sha512-KPIBPDlW7NxrbT/eh4qPXz5FiFdL5UbaA0XUNz2Rp3Z3hqBSkbj0GVjwFDztsWVauZUWsbKHgMg++sk8UX0bkw==} + /graphql/16.7.1: + resolution: {integrity: sha512-DRYR9tf+UGU0KOsMcKAlXeFfX89UiiIZ0dRU3mR0yJfu6OjZqUcp68NnFLnqQU5RexygFoDy1EW+ccOYcPfmHg==} engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} dev: false @@ -6848,7 +7106,7 @@ packages: resolution: {integrity: sha512-C7FfFoTA+bI10qfeydT8aZbvr91vAEU+2W5BZUlzPec47oNb07SsOfwYrtxuvOYdUApPP/Qlh4DtAO51Ekk2QA==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: - minimatch: 9.0.1 + minimatch: 9.0.3 dev: true /ignore/4.0.6: @@ -7211,15 +7469,11 @@ packages: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} - /is-typed-array/1.1.10: - resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==} + /is-typed-array/1.1.12: + resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} engines: {node: '>= 0.4'} dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.2 - for-each: 0.3.3 - gopd: 1.0.1 - has-tostringtag: 1.0.0 + which-typed-array: 1.1.11 dev: true /is-typedarray/1.0.0: @@ -7274,8 +7528,8 @@ packages: /isomorphic-fetch/3.0.0: resolution: {integrity: sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==} dependencies: - node-fetch: 2.6.11 - whatwg-fetch: 3.6.2 + node-fetch: 2.6.12 + whatwg-fetch: 3.6.16 transitivePeerDependencies: - encoding dev: false @@ -7300,10 +7554,10 @@ packages: resolution: {integrity: sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==} engines: {node: '>=8'} dependencies: - '@babel/core': 7.21.8 + '@babel/core': 7.22.9 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.0 - semver: 6.3.0 + semver: 6.3.1 transitivePeerDependencies: - supports-color dev: true @@ -7312,11 +7566,11 @@ packages: resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} engines: {node: '>=8'} dependencies: - '@babel/core': 7.21.8 - '@babel/parser': 7.21.9 + '@babel/core': 7.22.9 + '@babel/parser': 7.22.7 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.0 - semver: 6.3.0 + semver: 6.3.1 transitivePeerDependencies: - supports-color dev: true @@ -7370,8 +7624,8 @@ packages: '@pkgjs/parseargs': 0.11.0 dev: true - /jake/10.8.6: - resolution: {integrity: sha512-G43Ub9IYEFfu72sua6rzooi8V8Gz2lkfk48rW20vEWCGizeaEPlKB1Kh8JIA84yQbiAEfqlPmSpGgCKKxH3rDA==} + /jake/10.8.7: + resolution: {integrity: sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==} engines: {node: '>=10'} hasBin: true dependencies: @@ -7388,27 +7642,27 @@ packages: p-limit: 3.1.0 dev: true - /jest-circus/29.5.0: - resolution: {integrity: sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA==} + /jest-circus/29.6.1: + resolution: {integrity: sha512-tPbYLEiBU4MYAL2XoZme/bgfUeotpDBd81lgHLCbDZZFaGmECk0b+/xejPFtmiBP87GgP/y4jplcRpbH+fgCzQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/environment': 29.5.0 - '@jest/expect': 29.5.0 - '@jest/test-result': 29.5.0 - '@jest/types': 29.5.0 - '@types/node': 16.18.32 + '@jest/environment': 29.6.1 + '@jest/expect': 29.6.1 + '@jest/test-result': 29.6.1 + '@jest/types': 29.6.1 + '@types/node': 16.18.38 chalk: 4.1.2 co: 4.6.0 dedent: 0.7.0 is-generator-fn: 2.1.0 - jest-each: 29.5.0 - jest-matcher-utils: 29.5.0 - jest-message-util: 29.5.0 - jest-runtime: 29.5.0 - jest-snapshot: 29.5.0 - jest-util: 29.5.0 + jest-each: 29.6.1 + jest-matcher-utils: 29.6.1 + jest-message-util: 29.6.1 + jest-runtime: 29.6.1 + jest-snapshot: 29.6.1 + jest-util: 29.6.1 p-limit: 3.1.0 - pretty-format: 29.5.0 + pretty-format: 29.6.1 pure-rand: 6.0.2 slash: 3.0.0 stack-utils: 2.0.6 @@ -7416,8 +7670,8 @@ packages: - supports-color dev: true - /jest-cli/29.5.0: - resolution: {integrity: sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==} + /jest-cli/29.6.1: + resolution: {integrity: sha512-607dSgTA4ODIN6go9w6xY3EYkyPFGicx51a69H7yfvt7lN53xNswEVLovq+E77VsTRi5fWprLH0yl4DJgE8Ing==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true peerDependencies: @@ -7426,16 +7680,16 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 29.5.0 - '@jest/test-result': 29.5.0 - '@jest/types': 29.5.0 + '@jest/core': 29.6.1 + '@jest/test-result': 29.6.1 + '@jest/types': 29.6.1 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 import-local: 3.1.0 - jest-config: 29.5.0 - jest-util: 29.5.0 - jest-validate: 29.5.0 + jest-config: 29.6.1 + jest-util: 29.6.1 + jest-validate: 29.6.1 prompts: 2.4.2 yargs: 17.7.2 transitivePeerDependencies: @@ -7444,8 +7698,8 @@ packages: - ts-node dev: true - /jest-cli/29.5.0_iyzkm66nwd6ibglzwx45thyqle: - resolution: {integrity: sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==} + /jest-cli/29.6.1_wfb4agvwth77yq3yn67m4qmzdm: + resolution: {integrity: sha512-607dSgTA4ODIN6go9w6xY3EYkyPFGicx51a69H7yfvt7lN53xNswEVLovq+E77VsTRi5fWprLH0yl4DJgE8Ing==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true peerDependencies: @@ -7454,16 +7708,16 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 29.5.0_ts-node@8.10.2 - '@jest/test-result': 29.5.0 - '@jest/types': 29.5.0 + '@jest/core': 29.6.1_ts-node@8.10.2 + '@jest/test-result': 29.6.1 + '@jest/types': 29.6.1 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 import-local: 3.1.0 - jest-config: 29.5.0_iyzkm66nwd6ibglzwx45thyqle - jest-util: 29.5.0 - jest-validate: 29.5.0 + jest-config: 29.6.1_wfb4agvwth77yq3yn67m4qmzdm + jest-util: 29.6.1 + jest-validate: 29.6.1 prompts: 2.4.2 yargs: 17.7.2 transitivePeerDependencies: @@ -7472,8 +7726,8 @@ packages: - ts-node dev: true - /jest-config/29.5.0: - resolution: {integrity: sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==} + /jest-config/29.6.1: + resolution: {integrity: sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@types/node': '*' @@ -7484,34 +7738,34 @@ packages: ts-node: optional: true dependencies: - '@babel/core': 7.21.8 - '@jest/test-sequencer': 29.5.0 - '@jest/types': 29.5.0 - babel-jest: 29.5.0_@babel+core@7.21.8 + '@babel/core': 7.22.9 + '@jest/test-sequencer': 29.6.1 + '@jest/types': 29.6.1 + babel-jest: 29.6.1_@babel+core@7.22.9 chalk: 4.1.2 ci-info: 3.8.0 deepmerge: 4.3.1 glob: 7.2.3 graceful-fs: 4.2.11 - jest-circus: 29.5.0 - jest-environment-node: 29.5.0 + jest-circus: 29.6.1 + jest-environment-node: 29.6.1 jest-get-type: 29.4.3 jest-regex-util: 29.4.3 - jest-resolve: 29.5.0 - jest-runner: 29.5.0 - jest-util: 29.5.0 - jest-validate: 29.5.0 + jest-resolve: 29.6.1 + jest-runner: 29.6.1 + jest-util: 29.6.1 + jest-validate: 29.6.1 micromatch: 4.0.5 parse-json: 5.2.0 - pretty-format: 29.5.0 + pretty-format: 29.6.1 slash: 3.0.0 strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color dev: true - /jest-config/29.5.0_@types+node@16.18.32: - resolution: {integrity: sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==} + /jest-config/29.6.1_3rpyy5m6ecptevocbfxnh4t3uq: + resolution: {integrity: sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@types/node': '*' @@ -7522,35 +7776,36 @@ packages: ts-node: optional: true dependencies: - '@babel/core': 7.21.8 - '@jest/test-sequencer': 29.5.0 - '@jest/types': 29.5.0 - '@types/node': 16.18.32 - babel-jest: 29.5.0_@babel+core@7.21.8 + '@babel/core': 7.22.9 + '@jest/test-sequencer': 29.6.1 + '@jest/types': 29.6.1 + '@types/node': 16.18.38 + babel-jest: 29.6.1_@babel+core@7.22.9 chalk: 4.1.2 ci-info: 3.8.0 deepmerge: 4.3.1 glob: 7.2.3 graceful-fs: 4.2.11 - jest-circus: 29.5.0 - jest-environment-node: 29.5.0 + jest-circus: 29.6.1 + jest-environment-node: 29.6.1 jest-get-type: 29.4.3 jest-regex-util: 29.4.3 - jest-resolve: 29.5.0 - jest-runner: 29.5.0 - jest-util: 29.5.0 - jest-validate: 29.5.0 + jest-resolve: 29.6.1 + jest-runner: 29.6.1 + jest-util: 29.6.1 + jest-validate: 29.6.1 micromatch: 4.0.5 parse-json: 5.2.0 - pretty-format: 29.5.0 + pretty-format: 29.6.1 slash: 3.0.0 strip-json-comments: 3.1.1 + ts-node: 8.10.2_typescript@4.9.5 transitivePeerDependencies: - supports-color dev: true - /jest-config/29.5.0_iyzkm66nwd6ibglzwx45thyqle: - resolution: {integrity: sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==} + /jest-config/29.6.1_@types+node@16.18.38: + resolution: {integrity: sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@types/node': '*' @@ -7561,36 +7816,35 @@ packages: ts-node: optional: true dependencies: - '@babel/core': 7.21.8 - '@jest/test-sequencer': 29.5.0 - '@jest/types': 29.5.0 - '@types/node': 14.18.47 - babel-jest: 29.5.0_@babel+core@7.21.8 + '@babel/core': 7.22.9 + '@jest/test-sequencer': 29.6.1 + '@jest/types': 29.6.1 + '@types/node': 16.18.38 + babel-jest: 29.6.1_@babel+core@7.22.9 chalk: 4.1.2 ci-info: 3.8.0 deepmerge: 4.3.1 glob: 7.2.3 graceful-fs: 4.2.11 - jest-circus: 29.5.0 - jest-environment-node: 29.5.0 + jest-circus: 29.6.1 + jest-environment-node: 29.6.1 jest-get-type: 29.4.3 jest-regex-util: 29.4.3 - jest-resolve: 29.5.0 - jest-runner: 29.5.0 - jest-util: 29.5.0 - jest-validate: 29.5.0 + jest-resolve: 29.6.1 + jest-runner: 29.6.1 + jest-util: 29.6.1 + jest-validate: 29.6.1 micromatch: 4.0.5 parse-json: 5.2.0 - pretty-format: 29.5.0 + pretty-format: 29.6.1 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 8.10.2_typescript@4.9.5 transitivePeerDependencies: - supports-color dev: true - /jest-config/29.5.0_twhdbbjemi47nc2cbdu4ucg3o4: - resolution: {integrity: sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==} + /jest-config/29.6.1_wfb4agvwth77yq3yn67m4qmzdm: + resolution: {integrity: sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@types/node': '*' @@ -7601,27 +7855,27 @@ packages: ts-node: optional: true dependencies: - '@babel/core': 7.21.8 - '@jest/test-sequencer': 29.5.0 - '@jest/types': 29.5.0 - '@types/node': 16.18.32 - babel-jest: 29.5.0_@babel+core@7.21.8 + '@babel/core': 7.22.9 + '@jest/test-sequencer': 29.6.1 + '@jest/types': 29.6.1 + '@types/node': 14.18.53 + babel-jest: 29.6.1_@babel+core@7.22.9 chalk: 4.1.2 ci-info: 3.8.0 deepmerge: 4.3.1 glob: 7.2.3 graceful-fs: 4.2.11 - jest-circus: 29.5.0 - jest-environment-node: 29.5.0 + jest-circus: 29.6.1 + jest-environment-node: 29.6.1 jest-get-type: 29.4.3 jest-regex-util: 29.4.3 - jest-resolve: 29.5.0 - jest-runner: 29.5.0 - jest-util: 29.5.0 - jest-validate: 29.5.0 + jest-resolve: 29.6.1 + jest-runner: 29.6.1 + jest-util: 29.6.1 + jest-validate: 29.6.1 micromatch: 4.0.5 parse-json: 5.2.0 - pretty-format: 29.5.0 + pretty-format: 29.6.1 slash: 3.0.0 strip-json-comments: 3.1.1 ts-node: 8.10.2_typescript@4.9.5 @@ -7639,14 +7893,14 @@ packages: pretty-format: 26.6.2 dev: true - /jest-diff/29.5.0: - resolution: {integrity: sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==} + /jest-diff/29.6.1: + resolution: {integrity: sha512-FsNCvinvl8oVxpNLttNQX7FAq7vR+gMDGj90tiP7siWw1UdakWUGqrylpsYrpvj908IYckm5Y0Q7azNAozU1Kg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: chalk: 4.1.2 diff-sequences: 29.4.3 jest-get-type: 29.4.3 - pretty-format: 29.5.0 + pretty-format: 29.6.1 dev: true /jest-docblock/29.4.3: @@ -7656,27 +7910,27 @@ packages: detect-newline: 3.1.0 dev: true - /jest-each/29.5.0: - resolution: {integrity: sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA==} + /jest-each/29.6.1: + resolution: {integrity: sha512-n5eoj5eiTHpKQCAVcNTT7DRqeUmJ01hsAL0Q1SMiBHcBcvTKDELixQOGMCpqhbIuTcfC4kMfSnpmDqRgRJcLNQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.5.0 + '@jest/types': 29.6.1 chalk: 4.1.2 jest-get-type: 29.4.3 - jest-util: 29.5.0 - pretty-format: 29.5.0 + jest-util: 29.6.1 + pretty-format: 29.6.1 dev: true - /jest-environment-node/29.5.0: - resolution: {integrity: sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw==} + /jest-environment-node/29.6.1: + resolution: {integrity: sha512-ZNIfAiE+foBog24W+2caIldl4Irh8Lx1PUhg/GZ0odM1d/h2qORAsejiFc7zb+SEmYPn1yDZzEDSU5PmDkmVLQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/environment': 29.5.0 - '@jest/fake-timers': 29.5.0 - '@jest/types': 29.5.0 - '@types/node': 16.18.32 - jest-mock: 29.5.0 - jest-util: 29.5.0 + '@jest/environment': 29.6.1 + '@jest/fake-timers': 29.6.1 + '@jest/types': 29.6.1 + '@types/node': 16.18.38 + jest-mock: 29.6.1 + jest-util: 29.6.1 dev: true /jest-get-type/26.3.0: @@ -7689,68 +7943,68 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true - /jest-haste-map/29.5.0: - resolution: {integrity: sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA==} + /jest-haste-map/29.6.1: + resolution: {integrity: sha512-0m7f9PZXxOCk1gRACiVgX85knUKPKLPg4oRCjLoqIm9brTHXaorMA0JpmtmVkQiT8nmXyIVoZd/nnH1cfC33ig==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.5.0 + '@jest/types': 29.6.1 '@types/graceful-fs': 4.1.6 - '@types/node': 16.18.32 + '@types/node': 16.18.38 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 jest-regex-util: 29.4.3 - jest-util: 29.5.0 - jest-worker: 29.5.0 + jest-util: 29.6.1 + jest-worker: 29.6.1 micromatch: 4.0.5 walker: 1.0.8 optionalDependencies: fsevents: 2.3.2 dev: true - /jest-leak-detector/29.5.0: - resolution: {integrity: sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow==} + /jest-leak-detector/29.6.1: + resolution: {integrity: sha512-OrxMNyZirpOEwkF3UHnIkAiZbtkBWiye+hhBweCHkVbCgyEy71Mwbb5zgeTNYWJBi1qgDVfPC1IwO9dVEeTLwQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: jest-get-type: 29.4.3 - pretty-format: 29.5.0 + pretty-format: 29.6.1 dev: true - /jest-matcher-utils/29.5.0: - resolution: {integrity: sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==} + /jest-matcher-utils/29.6.1: + resolution: {integrity: sha512-SLaztw9d2mfQQKHmJXKM0HCbl2PPVld/t9Xa6P9sgiExijviSp7TnZZpw2Fpt+OI3nwUO/slJbOfzfUMKKC5QA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: chalk: 4.1.2 - jest-diff: 29.5.0 + jest-diff: 29.6.1 jest-get-type: 29.4.3 - pretty-format: 29.5.0 + pretty-format: 29.6.1 dev: true - /jest-message-util/29.5.0: - resolution: {integrity: sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==} + /jest-message-util/29.6.1: + resolution: {integrity: sha512-KoAW2zAmNSd3Gk88uJ56qXUWbFk787QKmjjJVOjtGFmmGSZgDBrlIL4AfQw1xyMYPNVD7dNInfIbur9B2rd/wQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/code-frame': 7.21.4 - '@jest/types': 29.5.0 + '@babel/code-frame': 7.22.5 + '@jest/types': 29.6.1 '@types/stack-utils': 2.0.1 chalk: 4.1.2 graceful-fs: 4.2.11 micromatch: 4.0.5 - pretty-format: 29.5.0 + pretty-format: 29.6.1 slash: 3.0.0 stack-utils: 2.0.6 dev: true - /jest-mock/29.5.0: - resolution: {integrity: sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw==} + /jest-mock/29.6.1: + resolution: {integrity: sha512-brovyV9HBkjXAEdRooaTQK42n8usKoSRR3gihzUpYeV/vwqgSoNfrksO7UfSACnPmxasO/8TmHM3w9Hp3G1dgw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.5.0 - '@types/node': 16.18.32 - jest-util: 29.5.0 + '@jest/types': 29.6.1 + '@types/node': 16.18.38 + jest-util: 29.6.1 dev: true - /jest-pnp-resolver/1.2.3_jest-resolve@29.5.0: + /jest-pnp-resolver/1.2.3_jest-resolve@29.6.1: resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} engines: {node: '>=6'} peerDependencies: @@ -7759,7 +8013,7 @@ packages: jest-resolve: optional: true dependencies: - jest-resolve: 29.5.0 + jest-resolve: 29.6.1 dev: true /jest-regex-util/29.4.3: @@ -7767,171 +8021,169 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true - /jest-resolve-dependencies/29.5.0: - resolution: {integrity: sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg==} + /jest-resolve-dependencies/29.6.1: + resolution: {integrity: sha512-BbFvxLXtcldaFOhNMXmHRWx1nXQO5LoXiKSGQcA1LxxirYceZT6ch8KTE1bK3X31TNG/JbkI7OkS/ABexVahiw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: jest-regex-util: 29.4.3 - jest-snapshot: 29.5.0 + jest-snapshot: 29.6.1 transitivePeerDependencies: - supports-color dev: true - /jest-resolve/29.5.0: - resolution: {integrity: sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w==} + /jest-resolve/29.6.1: + resolution: {integrity: sha512-AeRkyS8g37UyJiP9w3mmI/VXU/q8l/IH52vj/cDAyScDcemRbSBhfX/NMYIGilQgSVwsjxrCHf3XJu4f+lxCMg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: chalk: 4.1.2 graceful-fs: 4.2.11 - jest-haste-map: 29.5.0 - jest-pnp-resolver: 1.2.3_jest-resolve@29.5.0 - jest-util: 29.5.0 - jest-validate: 29.5.0 + jest-haste-map: 29.6.1 + jest-pnp-resolver: 1.2.3_jest-resolve@29.6.1 + jest-util: 29.6.1 + jest-validate: 29.6.1 resolve: 1.22.2 resolve.exports: 2.0.2 slash: 3.0.0 dev: true - /jest-runner/29.5.0: - resolution: {integrity: sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ==} + /jest-runner/29.6.1: + resolution: {integrity: sha512-tw0wb2Q9yhjAQ2w8rHRDxteryyIck7gIzQE4Reu3JuOBpGp96xWgF0nY8MDdejzrLCZKDcp8JlZrBN/EtkQvPQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/console': 29.5.0 - '@jest/environment': 29.5.0 - '@jest/test-result': 29.5.0 - '@jest/transform': 29.5.0 - '@jest/types': 29.5.0 - '@types/node': 16.18.32 + '@jest/console': 29.6.1 + '@jest/environment': 29.6.1 + '@jest/test-result': 29.6.1 + '@jest/transform': 29.6.1 + '@jest/types': 29.6.1 + '@types/node': 16.18.38 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 jest-docblock: 29.4.3 - jest-environment-node: 29.5.0 - jest-haste-map: 29.5.0 - jest-leak-detector: 29.5.0 - jest-message-util: 29.5.0 - jest-resolve: 29.5.0 - jest-runtime: 29.5.0 - jest-util: 29.5.0 - jest-watcher: 29.5.0 - jest-worker: 29.5.0 + jest-environment-node: 29.6.1 + jest-haste-map: 29.6.1 + jest-leak-detector: 29.6.1 + jest-message-util: 29.6.1 + jest-resolve: 29.6.1 + jest-runtime: 29.6.1 + jest-util: 29.6.1 + jest-watcher: 29.6.1 + jest-worker: 29.6.1 p-limit: 3.1.0 source-map-support: 0.5.13 transitivePeerDependencies: - supports-color dev: true - /jest-runtime/29.5.0: - resolution: {integrity: sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw==} + /jest-runtime/29.6.1: + resolution: {integrity: sha512-D6/AYOA+Lhs5e5il8+5pSLemjtJezUr+8zx+Sn8xlmOux3XOqx4d8l/2udBea8CRPqqrzhsKUsN/gBDE/IcaPQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/environment': 29.5.0 - '@jest/fake-timers': 29.5.0 - '@jest/globals': 29.5.0 - '@jest/source-map': 29.4.3 - '@jest/test-result': 29.5.0 - '@jest/transform': 29.5.0 - '@jest/types': 29.5.0 - '@types/node': 16.18.32 + '@jest/environment': 29.6.1 + '@jest/fake-timers': 29.6.1 + '@jest/globals': 29.6.1 + '@jest/source-map': 29.6.0 + '@jest/test-result': 29.6.1 + '@jest/transform': 29.6.1 + '@jest/types': 29.6.1 + '@types/node': 16.18.38 chalk: 4.1.2 - cjs-module-lexer: 1.2.2 - collect-v8-coverage: 1.0.1 + cjs-module-lexer: 1.2.3 + collect-v8-coverage: 1.0.2 glob: 7.2.3 graceful-fs: 4.2.11 - jest-haste-map: 29.5.0 - jest-message-util: 29.5.0 - jest-mock: 29.5.0 + jest-haste-map: 29.6.1 + jest-message-util: 29.6.1 + jest-mock: 29.6.1 jest-regex-util: 29.4.3 - jest-resolve: 29.5.0 - jest-snapshot: 29.5.0 - jest-util: 29.5.0 + jest-resolve: 29.6.1 + jest-snapshot: 29.6.1 + jest-util: 29.6.1 slash: 3.0.0 strip-bom: 4.0.0 transitivePeerDependencies: - supports-color dev: true - /jest-snapshot/29.5.0: - resolution: {integrity: sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==} + /jest-snapshot/29.6.1: + resolution: {integrity: sha512-G4UQE1QQ6OaCgfY+A0uR1W2AY0tGXUPQpoUClhWHq1Xdnx1H6JOrC2nH5lqnOEqaDgbHFgIwZ7bNq24HpB180A==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/core': 7.21.8 - '@babel/generator': 7.21.9 - '@babel/plugin-syntax-jsx': 7.21.4_@babel+core@7.21.8 - '@babel/plugin-syntax-typescript': 7.21.4_@babel+core@7.21.8 - '@babel/traverse': 7.21.5 - '@babel/types': 7.21.5 - '@jest/expect-utils': 29.5.0 - '@jest/transform': 29.5.0 - '@jest/types': 29.5.0 - '@types/babel__traverse': 7.18.5 - '@types/prettier': 2.7.2 - babel-preset-current-node-syntax: 1.0.1_@babel+core@7.21.8 + '@babel/core': 7.22.9 + '@babel/generator': 7.22.9 + '@babel/plugin-syntax-jsx': 7.22.5_@babel+core@7.22.9 + '@babel/plugin-syntax-typescript': 7.22.5_@babel+core@7.22.9 + '@babel/types': 7.22.5 + '@jest/expect-utils': 29.6.1 + '@jest/transform': 29.6.1 + '@jest/types': 29.6.1 + '@types/prettier': 2.7.3 + babel-preset-current-node-syntax: 1.0.1_@babel+core@7.22.9 chalk: 4.1.2 - expect: 29.5.0 + expect: 29.6.1 graceful-fs: 4.2.11 - jest-diff: 29.5.0 + jest-diff: 29.6.1 jest-get-type: 29.4.3 - jest-matcher-utils: 29.5.0 - jest-message-util: 29.5.0 - jest-util: 29.5.0 + jest-matcher-utils: 29.6.1 + jest-message-util: 29.6.1 + jest-util: 29.6.1 natural-compare: 1.4.0 - pretty-format: 29.5.0 - semver: 7.5.1 + pretty-format: 29.6.1 + semver: 7.5.4 transitivePeerDependencies: - supports-color dev: true - /jest-util/29.5.0: - resolution: {integrity: sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==} + /jest-util/29.6.1: + resolution: {integrity: sha512-NRFCcjc+/uO3ijUVyNOQJluf8PtGCe/W6cix36+M3cTFgiYqFOOW5MgN4JOOcvbUhcKTYVd1CvHz/LWi8d16Mg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.5.0 - '@types/node': 16.18.32 + '@jest/types': 29.6.1 + '@types/node': 16.18.38 chalk: 4.1.2 ci-info: 3.8.0 graceful-fs: 4.2.11 picomatch: 2.3.1 dev: true - /jest-validate/29.5.0: - resolution: {integrity: sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ==} + /jest-validate/29.6.1: + resolution: {integrity: sha512-r3Ds69/0KCN4vx4sYAbGL1EVpZ7MSS0vLmd3gV78O+NAx3PDQQukRU5hNHPXlyqCgFY8XUk7EuTMLugh0KzahA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.5.0 + '@jest/types': 29.6.1 camelcase: 6.3.0 chalk: 4.1.2 jest-get-type: 29.4.3 leven: 3.1.0 - pretty-format: 29.5.0 + pretty-format: 29.6.1 dev: true - /jest-watcher/29.5.0: - resolution: {integrity: sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA==} + /jest-watcher/29.6.1: + resolution: {integrity: sha512-d4wpjWTS7HEZPaaj8m36QiaP856JthRZkrgcIY/7ISoUWPIillrXM23WPboZVLbiwZBt4/qn2Jke84Sla6JhFA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/test-result': 29.5.0 - '@jest/types': 29.5.0 - '@types/node': 16.18.32 + '@jest/test-result': 29.6.1 + '@jest/types': 29.6.1 + '@types/node': 16.18.38 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 - jest-util: 29.5.0 + jest-util: 29.6.1 string-length: 4.0.2 dev: true - /jest-worker/29.5.0: - resolution: {integrity: sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==} + /jest-worker/29.6.1: + resolution: {integrity: sha512-U+Wrbca7S8ZAxAe9L6nb6g8kPdia5hj32Puu5iOqBCMTMWFHXuK6dOV2IFrpedbTV8fjMFLdWNttQTBL6u2MRA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@types/node': 16.18.32 - jest-util: 29.5.0 + '@types/node': 16.18.38 + jest-util: 29.6.1 merge-stream: 2.0.0 supports-color: 8.1.1 dev: true - /jest/29.5.0: - resolution: {integrity: sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==} + /jest/29.6.1: + resolution: {integrity: sha512-Nirw5B4nn69rVUZtemCQhwxOBhm0nsp3hmtF4rzCeWD7BkjAXRIji7xWQfnTNbz9g0aVsBX6aZK3n+23LM6uDw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true peerDependencies: @@ -7940,18 +8192,18 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 29.5.0 - '@jest/types': 29.5.0 + '@jest/core': 29.6.1 + '@jest/types': 29.6.1 import-local: 3.1.0 - jest-cli: 29.5.0 + jest-cli: 29.6.1 transitivePeerDependencies: - '@types/node' - supports-color - ts-node dev: true - /jest/29.5.0_iyzkm66nwd6ibglzwx45thyqle: - resolution: {integrity: sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==} + /jest/29.6.1_wfb4agvwth77yq3yn67m4qmzdm: + resolution: {integrity: sha512-Nirw5B4nn69rVUZtemCQhwxOBhm0nsp3hmtF4rzCeWD7BkjAXRIji7xWQfnTNbz9g0aVsBX6aZK3n+23LM6uDw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true peerDependencies: @@ -7960,10 +8212,10 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 29.5.0_ts-node@8.10.2 - '@jest/types': 29.5.0 + '@jest/core': 29.6.1_ts-node@8.10.2 + '@jest/types': 29.6.1 import-local: 3.1.0 - jest-cli: 29.5.0_iyzkm66nwd6ibglzwx45thyqle + jest-cli: 29.6.1_wfb4agvwth77yq3yn67m4qmzdm transitivePeerDependencies: - '@types/node' - supports-color @@ -8044,7 +8296,7 @@ packages: engines: {node: '>=12.0.0'} hasBin: true dependencies: - '@babel/parser': 7.21.9 + '@babel/parser': 7.22.7 '@jsdoc/salty': 0.2.5 '@types/markdown-it': 12.2.3 bluebird: 3.7.2 @@ -8071,24 +8323,24 @@ packages: optional: true dependencies: abab: 2.0.6 - acorn: 8.8.2 + acorn: 8.10.0 acorn-globals: 7.0.1 cssom: 0.5.0 cssstyle: 2.3.0 data-urls: 3.0.2 decimal.js: 10.4.3 domexception: 4.0.0 - escodegen: 2.0.0 + escodegen: 2.1.0 form-data: 4.0.0 html-encoding-sniffer: 3.0.0 http-proxy-agent: 5.0.0 https-proxy-agent: 5.0.1 is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.4 + nwsapi: 2.2.7 parse5: 7.1.2 saxes: 6.0.0 symbol-tree: 3.2.4 - tough-cookie: 4.1.2 + tough-cookie: 4.1.3 w3c-xmlserializer: 4.0.0 webidl-conversions: 7.0.0 whatwg-encoding: 2.0.0 @@ -8191,8 +8443,8 @@ packages: /just-extend/4.2.1: resolution: {integrity: sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==} - /keyv/4.5.2: - resolution: {integrity: sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==} + /keyv/4.5.3: + resolution: {integrity: sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==} dependencies: json-buffer: 3.0.1 dev: true @@ -8217,14 +8469,6 @@ packages: engines: {node: '>=6'} dev: true - /levn/0.3.0: - resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.1.2 - type-check: 0.3.2 - dev: false - /levn/0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -8458,7 +8702,7 @@ packages: fecha: 4.2.3 ms: 2.1.3 safe-stable-stringify: 2.4.3 - triple-beam: 1.3.0 + triple-beam: 1.4.1 dev: false /loose-envify/1.4.0: @@ -8479,6 +8723,11 @@ packages: engines: {node: '>=8'} dev: true + /lru-cache/10.0.0: + resolution: {integrity: sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw==} + engines: {node: 14 || >=16.14} + dev: true + /lru-cache/5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} dependencies: @@ -8496,16 +8745,11 @@ packages: engines: {node: '>=12'} dev: true - /lru-cache/9.1.1: - resolution: {integrity: sha512-65/Jky17UwSb0BuB9V+MyDpsOtXKmYwzhyl+cOa9XUiI4uV2Ouy/2voFP3+al0BjZbJgMBD8FojMpAf+Z+qn4A==} - engines: {node: 14 || >=16.14} - dev: true - /make-dir/3.1.0: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} engines: {node: '>=8'} dependencies: - semver: 6.3.0 + semver: 6.3.1 dev: true /make-error/1.3.6: @@ -8823,8 +9067,8 @@ packages: brace-expansion: 2.0.1 dev: true - /minimatch/9.0.1: - resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==} + /minimatch/9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} engines: {node: '>=16 || 14 >=14.17'} dependencies: brace-expansion: 2.0.1 @@ -8917,6 +9161,11 @@ packages: resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} engines: {node: '>=8'} + /minipass/7.0.2: + resolution: {integrity: sha512-eL79dXrE1q9dBbDCLg7xfn/vl7MS4F1gvJAgjJrQli/jbQWdUttuVawphqpffoIYfRdq78LHx6GP4bU/EQ2ATA==} + engines: {node: '>=16 || 14 >=14.17'} + dev: true + /minizlib/2.1.2: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} @@ -8938,12 +9187,6 @@ packages: engines: {node: '>=10'} hasBin: true - /mkdirp/2.1.6: - resolution: {integrity: sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==} - engines: {node: '>=10'} - hasBin: true - dev: false - /mkdirp2/1.0.5: resolution: {integrity: sha512-xOE9xbICroUDmG1ye2h4bZ8WBie9EGmACaco8K8cx6RlkJJrxGIqjGqztAI+NMhexXBcdGbSEzI6N3EJPevxZw==} dev: true @@ -9021,6 +9264,10 @@ packages: hasBin: true dev: true + /natural-compare-lite/1.4.0: + resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} + dev: true + /natural-compare/1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true @@ -9028,6 +9275,11 @@ packages: /natural-orderby/2.0.3: resolution: {integrity: sha512-p7KTHxU0CUrcOXe62Zfrb5Z13nLvPhSWR/so3kFulUQU0sgUll2Z0LwpsLN351eOOD+hRGu/F1g+6xDfPeD++Q==} + /ncp/2.0.0: + resolution: {integrity: sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==} + hasBin: true + dev: false + /negotiator/0.6.3: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} @@ -9043,13 +9295,13 @@ packages: resolution: {integrity: sha512-8+Ib8rRJ4L0o3kfmyVCL7gzrohyDe0cMFTBa2d364yIrEGMEoetznKJx899YxjybU6bL9SQkYPSBBs1gyYs8Xg==} dependencies: '@sinonjs/commons': 2.0.0 - '@sinonjs/fake-timers': 10.2.0 + '@sinonjs/fake-timers': 10.3.0 '@sinonjs/text-encoding': 0.7.2 just-extend: 4.2.1 path-to-regexp: 1.8.0 - /nock/13.3.1: - resolution: {integrity: sha512-vHnopocZuI93p2ccivFyGuUfzjq2fxNyNurp7816mlT5V5HF4SzXu8lvLrVzBbNqzs+ODooZ6OksuSUNM7Njkw==} + /nock/13.3.2: + resolution: {integrity: sha512-CwbljitiWJhF1gL83NbanhoKs1l23TDlRioNraPTZrzZIEooPemrHRj5m0FZCPkB1ecdYCSWWGcHysJgX/ngnQ==} engines: {node: '>= 10.13'} dependencies: debug: 4.3.4 @@ -9059,8 +9311,8 @@ packages: transitivePeerDependencies: - supports-color - /node-fetch/2.6.11: - resolution: {integrity: sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==} + /node-fetch/2.6.12: + resolution: {integrity: sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==} engines: {node: 4.x || >=6.0.0} peerDependencies: encoding: ^0.1.0 @@ -9082,7 +9334,7 @@ packages: nopt: 5.0.0 npmlog: 6.0.2 rimraf: 3.0.2 - semver: 7.5.1 + semver: 7.5.4 tar: 6.1.15 which: 2.0.2 transitivePeerDependencies: @@ -9102,27 +9354,7 @@ packages: nopt: 5.0.0 npmlog: 6.0.2 rimraf: 3.0.2 - semver: 7.5.1 - tar: 6.1.15 - which: 2.0.2 - transitivePeerDependencies: - - bluebird - - supports-color - dev: true - - /node-gyp/9.3.1: - resolution: {integrity: sha512-4Q16ZCqq3g8awk6UplT7AuxQ35XN4R/yf/+wSAwcBUAjg7l58RTactWaP8fIDTi0FzI7YcVLujwExakZlfWkXg==} - engines: {node: ^12.13 || ^14.13 || >=16} - hasBin: true - dependencies: - env-paths: 2.2.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - make-fetch-happen: 10.2.1 - nopt: 6.0.0 - npmlog: 6.0.2 - rimraf: 3.0.2 - semver: 7.5.1 + semver: 7.5.4 tar: 6.1.15 which: 2.0.2 transitivePeerDependencies: @@ -9130,23 +9362,23 @@ packages: - supports-color dev: true - /node-gyp/9.3.1_bluebird@3.7.2: - resolution: {integrity: sha512-4Q16ZCqq3g8awk6UplT7AuxQ35XN4R/yf/+wSAwcBUAjg7l58RTactWaP8fIDTi0FzI7YcVLujwExakZlfWkXg==} + /node-gyp/9.4.0: + resolution: {integrity: sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg==} engines: {node: ^12.13 || ^14.13 || >=16} hasBin: true dependencies: env-paths: 2.2.1 + exponential-backoff: 3.1.1 glob: 7.2.3 graceful-fs: 4.2.11 - make-fetch-happen: 10.2.1_bluebird@3.7.2 + make-fetch-happen: 11.1.1 nopt: 6.0.0 npmlog: 6.0.2 rimraf: 3.0.2 - semver: 7.5.1 + semver: 7.5.4 tar: 6.1.15 which: 2.0.2 transitivePeerDependencies: - - bluebird - supports-color dev: true @@ -9165,8 +9397,8 @@ packages: process-on-spawn: 1.0.0 dev: true - /node-releases/2.0.12: - resolution: {integrity: sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==} + /node-releases/2.0.13: + resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} dev: true /nopt/5.0.0: @@ -9190,7 +9422,7 @@ packages: dependencies: hosted-git-info: 2.8.9 resolve: 1.22.2 - semver: 5.7.1 + semver: 5.7.2 validate-npm-package-license: 3.0.4 dev: true @@ -9200,7 +9432,7 @@ packages: dependencies: hosted-git-info: 4.1.0 is-core-module: 2.12.1 - semver: 7.5.1 + semver: 7.5.4 validate-npm-package-license: 3.0.4 dev: true @@ -9210,7 +9442,7 @@ packages: dependencies: hosted-git-info: 6.1.1 is-core-module: 2.12.1 - semver: 7.5.1 + semver: 7.5.4 validate-npm-package-license: 3.0.4 dev: true @@ -9241,14 +9473,14 @@ packages: resolution: {integrity: sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==} engines: {node: '>=10'} dependencies: - semver: 7.5.1 + semver: 7.5.4 dev: true /npm-install-checks/6.1.1: resolution: {integrity: sha512-dH3GmQL4vsPtld59cOn8uY0iOqRmqKvV+DLGwNXV/Q7MDgD2QfOADWd/mFXcIE5LVhYYGjA3baz6W9JneqnuCw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: - semver: 7.5.1 + semver: 7.5.4 dev: true /npm-normalize-package-bin/1.0.1: @@ -9271,7 +9503,7 @@ packages: dependencies: hosted-git-info: 6.1.1 proc-log: 3.0.0 - semver: 7.5.1 + semver: 7.5.4 validate-npm-package-name: 5.0.0 dev: true @@ -9280,7 +9512,7 @@ packages: engines: {node: '>=10'} dependencies: hosted-git-info: 4.1.0 - semver: 7.5.1 + semver: 7.5.4 validate-npm-package-name: 3.0.0 dev: true @@ -9308,7 +9540,7 @@ packages: npm-install-checks: 4.0.0 npm-normalize-package-bin: 1.0.1 npm-package-arg: 8.1.5 - semver: 7.5.1 + semver: 7.5.4 dev: true /npm-pick-manifest/8.0.1: @@ -9318,7 +9550,7 @@ packages: npm-install-checks: 6.1.1 npm-normalize-package-bin: 3.0.1 npm-package-arg: 10.1.0 - semver: 7.5.1 + semver: 7.5.4 dev: true /npm-registry-fetch/12.0.2: @@ -9395,8 +9627,8 @@ packages: resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} engines: {node: '>=0.10.0'} - /nwsapi/2.2.4: - resolution: {integrity: sha512-NHj4rzRo0tQdijE9ZqAx6kYDcoRwYwSYzCA8MY3JzfxlrvEU0jhnhJT9BhqhJs7I/dKcrDm6TyulaRqZPIhN5g==} + /nwsapi/2.2.7: + resolution: {integrity: sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==} dev: false /nyc/15.1.0: @@ -9469,16 +9701,16 @@ packages: resolution: {integrity: sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==} engines: {node: '>= 10'} - /oclif/3.9.0: - resolution: {integrity: sha512-fsFyHVQYJdE50EcKrBjwzl2WT5sZUtTiRY1vqMwykgLFUDYrQS0lj7yqy2IgcPSmAWaLQryODdfBujCWOU98Ww==} + /oclif/3.9.1: + resolution: {integrity: sha512-gJ8gJrohFY8qEeVBOw7wgAFdwPt2CTTkEFXDTkfUeXap6URIy6ngP7g/E1A2zFt2I0wH/qQHwcfuTpfBbj1+Uw==} engines: {node: '>=12.0.0'} hasBin: true dependencies: - '@oclif/core': 2.8.5 - '@oclif/plugin-help': 5.2.9 - '@oclif/plugin-not-found': 2.3.23 - '@oclif/plugin-warn-if-update-available': 2.0.37 - aws-sdk: 2.1383.0 + '@oclif/core': 2.9.4 + '@oclif/plugin-help': 5.2.14 + '@oclif/plugin-not-found': 2.3.32 + '@oclif/plugin-warn-if-update-available': 2.0.44 + aws-sdk: 2.1418.0 concurrently: 7.6.0 debug: 4.3.4 find-yarn-workspace-root: 2.0.0 @@ -9487,11 +9719,11 @@ packages: got: 11.8.6 lodash: 4.17.21 normalize-package-data: 3.0.3 - semver: 7.5.1 + semver: 7.5.4 shelljs: 0.8.5 - tslib: 2.5.2 - yeoman-environment: 3.18.3 - yeoman-generator: 5.9.0_yeoman-environment@3.18.3 + tslib: 2.6.0 + yeoman-environment: 3.19.3 + yeoman-generator: 5.9.0_yeoman-environment@3.19.3 yosay: 2.0.2 transitivePeerDependencies: - '@swc/core' @@ -9504,16 +9736,16 @@ packages: - typescript dev: true - /oclif/3.9.0_2unbv6mhrq4prucamkttzlebiq: - resolution: {integrity: sha512-fsFyHVQYJdE50EcKrBjwzl2WT5sZUtTiRY1vqMwykgLFUDYrQS0lj7yqy2IgcPSmAWaLQryODdfBujCWOU98Ww==} + /oclif/3.9.1_4qcp7qp4jxxdgb4qbxgwox4hwq: + resolution: {integrity: sha512-gJ8gJrohFY8qEeVBOw7wgAFdwPt2CTTkEFXDTkfUeXap6URIy6ngP7g/E1A2zFt2I0wH/qQHwcfuTpfBbj1+Uw==} engines: {node: '>=12.0.0'} hasBin: true dependencies: - '@oclif/core': 2.8.5_2unbv6mhrq4prucamkttzlebiq - '@oclif/plugin-help': 5.2.9_2unbv6mhrq4prucamkttzlebiq - '@oclif/plugin-not-found': 2.3.23_2unbv6mhrq4prucamkttzlebiq - '@oclif/plugin-warn-if-update-available': 2.0.37_2unbv6mhrq4prucamkttzlebiq - aws-sdk: 2.1383.0 + '@oclif/core': 2.9.4_4qcp7qp4jxxdgb4qbxgwox4hwq + '@oclif/plugin-help': 5.2.14_4qcp7qp4jxxdgb4qbxgwox4hwq + '@oclif/plugin-not-found': 2.3.32_4qcp7qp4jxxdgb4qbxgwox4hwq + '@oclif/plugin-warn-if-update-available': 2.0.44_4qcp7qp4jxxdgb4qbxgwox4hwq + aws-sdk: 2.1418.0 concurrently: 7.6.0 debug: 4.3.4 find-yarn-workspace-root: 2.0.0 @@ -9522,11 +9754,11 @@ packages: got: 11.8.6 lodash: 4.17.21 normalize-package-data: 3.0.3 - semver: 7.5.1 + semver: 7.5.4 shelljs: 0.8.5 - tslib: 2.5.2 - yeoman-environment: 3.18.3 - yeoman-generator: 5.9.0_yeoman-environment@3.18.3 + tslib: 2.6.0 + yeoman-environment: 3.19.3 + yeoman-generator: 5.9.0_yeoman-environment@3.19.3 yosay: 2.0.2 transitivePeerDependencies: - '@swc/core' @@ -9539,16 +9771,16 @@ packages: - typescript dev: true - /oclif/3.9.0_5vebceyeyrbj46wx3onulzfguy: - resolution: {integrity: sha512-fsFyHVQYJdE50EcKrBjwzl2WT5sZUtTiRY1vqMwykgLFUDYrQS0lj7yqy2IgcPSmAWaLQryODdfBujCWOU98Ww==} + /oclif/3.9.1_bluebird@3.7.2: + resolution: {integrity: sha512-gJ8gJrohFY8qEeVBOw7wgAFdwPt2CTTkEFXDTkfUeXap6URIy6ngP7g/E1A2zFt2I0wH/qQHwcfuTpfBbj1+Uw==} engines: {node: '>=12.0.0'} hasBin: true dependencies: - '@oclif/core': 2.8.5_5vebceyeyrbj46wx3onulzfguy - '@oclif/plugin-help': 5.2.9_5vebceyeyrbj46wx3onulzfguy - '@oclif/plugin-not-found': 2.3.23_5vebceyeyrbj46wx3onulzfguy - '@oclif/plugin-warn-if-update-available': 2.0.37_5vebceyeyrbj46wx3onulzfguy - aws-sdk: 2.1383.0 + '@oclif/core': 2.9.4 + '@oclif/plugin-help': 5.2.14 + '@oclif/plugin-not-found': 2.3.32 + '@oclif/plugin-warn-if-update-available': 2.0.44 + aws-sdk: 2.1418.0 concurrently: 7.6.0 debug: 4.3.4 find-yarn-workspace-root: 2.0.0 @@ -9557,11 +9789,11 @@ packages: got: 11.8.6 lodash: 4.17.21 normalize-package-data: 3.0.3 - semver: 7.5.1 + semver: 7.5.4 shelljs: 0.8.5 - tslib: 2.5.2 - yeoman-environment: 3.18.3 - yeoman-generator: 5.9.0_yeoman-environment@3.18.3 + tslib: 2.6.0 + yeoman-environment: 3.19.3_bluebird@3.7.2 + yeoman-generator: 5.9.0_nqs3lknjmcjhmksixfhcryndrq yosay: 2.0.2 transitivePeerDependencies: - '@swc/core' @@ -9574,16 +9806,16 @@ packages: - typescript dev: true - /oclif/3.9.0_bluebird@3.7.2: - resolution: {integrity: sha512-fsFyHVQYJdE50EcKrBjwzl2WT5sZUtTiRY1vqMwykgLFUDYrQS0lj7yqy2IgcPSmAWaLQryODdfBujCWOU98Ww==} + /oclif/3.9.1_fxnscsehfcewpnie2ltbcrhxa4: + resolution: {integrity: sha512-gJ8gJrohFY8qEeVBOw7wgAFdwPt2CTTkEFXDTkfUeXap6URIy6ngP7g/E1A2zFt2I0wH/qQHwcfuTpfBbj1+Uw==} engines: {node: '>=12.0.0'} hasBin: true dependencies: - '@oclif/core': 2.8.5 - '@oclif/plugin-help': 5.2.9 - '@oclif/plugin-not-found': 2.3.23 - '@oclif/plugin-warn-if-update-available': 2.0.37 - aws-sdk: 2.1383.0 + '@oclif/core': 2.9.4_typescript@4.9.5 + '@oclif/plugin-help': 5.2.14_typescript@4.9.5 + '@oclif/plugin-not-found': 2.3.32_typescript@4.9.5 + '@oclif/plugin-warn-if-update-available': 2.0.44_typescript@4.9.5 + aws-sdk: 2.1418.0 concurrently: 7.6.0 debug: 4.3.4 find-yarn-workspace-root: 2.0.0 @@ -9592,11 +9824,11 @@ packages: got: 11.8.6 lodash: 4.17.21 normalize-package-data: 3.0.3 - semver: 7.5.1 + semver: 7.5.4 shelljs: 0.8.5 - tslib: 2.5.2 - yeoman-environment: 3.18.3_bluebird@3.7.2 - yeoman-generator: 5.9.0_relnv3374w66mzl5ehclms4mvq + tslib: 2.6.0 + yeoman-environment: 3.19.3_bluebird@3.7.2 + yeoman-generator: 5.9.0_nqs3lknjmcjhmksixfhcryndrq yosay: 2.0.2 transitivePeerDependencies: - '@swc/core' @@ -9609,16 +9841,16 @@ packages: - typescript dev: true - /oclif/3.9.0_fxnscsehfcewpnie2ltbcrhxa4: - resolution: {integrity: sha512-fsFyHVQYJdE50EcKrBjwzl2WT5sZUtTiRY1vqMwykgLFUDYrQS0lj7yqy2IgcPSmAWaLQryODdfBujCWOU98Ww==} + /oclif/3.9.1_npeoqfxwgl5njwqojmpesqhar4: + resolution: {integrity: sha512-gJ8gJrohFY8qEeVBOw7wgAFdwPt2CTTkEFXDTkfUeXap6URIy6ngP7g/E1A2zFt2I0wH/qQHwcfuTpfBbj1+Uw==} engines: {node: '>=12.0.0'} hasBin: true dependencies: - '@oclif/core': 2.8.5_typescript@4.9.5 - '@oclif/plugin-help': 5.2.9_typescript@4.9.5 - '@oclif/plugin-not-found': 2.3.23_typescript@4.9.5 - '@oclif/plugin-warn-if-update-available': 2.0.37_typescript@4.9.5 - aws-sdk: 2.1383.0 + '@oclif/core': 2.9.4_npeoqfxwgl5njwqojmpesqhar4 + '@oclif/plugin-help': 5.2.14_npeoqfxwgl5njwqojmpesqhar4 + '@oclif/plugin-not-found': 2.3.32_npeoqfxwgl5njwqojmpesqhar4 + '@oclif/plugin-warn-if-update-available': 2.0.44_npeoqfxwgl5njwqojmpesqhar4 + aws-sdk: 2.1418.0 concurrently: 7.6.0 debug: 4.3.4 find-yarn-workspace-root: 2.0.0 @@ -9627,11 +9859,46 @@ packages: got: 11.8.6 lodash: 4.17.21 normalize-package-data: 3.0.3 - semver: 7.5.1 + semver: 7.5.4 shelljs: 0.8.5 - tslib: 2.5.2 - yeoman-environment: 3.18.3_bluebird@3.7.2 - yeoman-generator: 5.9.0_relnv3374w66mzl5ehclms4mvq + tslib: 2.6.0 + yeoman-environment: 3.19.3 + yeoman-generator: 5.9.0_yeoman-environment@3.19.3 + yosay: 2.0.2 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - bluebird + - encoding + - mem-fs + - supports-color + - typescript + dev: true + + /oclif/3.9.1_ui2ktwjrqrvevaryls3virrjnm: + resolution: {integrity: sha512-gJ8gJrohFY8qEeVBOw7wgAFdwPt2CTTkEFXDTkfUeXap6URIy6ngP7g/E1A2zFt2I0wH/qQHwcfuTpfBbj1+Uw==} + engines: {node: '>=12.0.0'} + hasBin: true + dependencies: + '@oclif/core': 2.9.4_4qcp7qp4jxxdgb4qbxgwox4hwq + '@oclif/plugin-help': 5.2.14_4qcp7qp4jxxdgb4qbxgwox4hwq + '@oclif/plugin-not-found': 2.3.32_4qcp7qp4jxxdgb4qbxgwox4hwq + '@oclif/plugin-warn-if-update-available': 2.0.44_4qcp7qp4jxxdgb4qbxgwox4hwq + aws-sdk: 2.1418.0 + concurrently: 7.6.0 + debug: 4.3.4 + find-yarn-workspace-root: 2.0.0 + fs-extra: 8.1.0 + github-slugger: 1.5.0 + got: 11.8.6 + lodash: 4.17.21 + normalize-package-data: 3.0.3 + semver: 7.5.4 + shelljs: 0.8.5 + tslib: 2.6.0 + yeoman-environment: 3.19.3_bluebird@3.7.2 + yeoman-generator: 5.9.0_nqs3lknjmcjhmksixfhcryndrq yosay: 2.0.2 transitivePeerDependencies: - '@swc/core' @@ -9698,28 +9965,16 @@ packages: '@wry/trie': 0.3.2 dev: false - /optionator/0.8.3: - resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} - engines: {node: '>= 0.8.0'} - dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.3.0 - prelude-ls: 1.1.2 - type-check: 0.3.2 - word-wrap: 1.2.3 - dev: false - - /optionator/0.9.1: - resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} + /optionator/0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} engines: {node: '>= 0.8.0'} dependencies: + '@aashutoshrathi/word-wrap': 1.2.6 deep-is: 0.1.4 fast-levenshtein: 2.0.6 levn: 0.4.1 prelude-ls: 1.2.1 type-check: 0.4.0 - word-wrap: 1.2.3 dev: true /ora/5.4.1: @@ -9910,7 +10165,7 @@ packages: engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} hasBin: true dependencies: - '@npmcli/git': 4.0.4 + '@npmcli/git': 4.1.0 '@npmcli/installed-package-contents': 2.0.2 '@npmcli/promise-spawn': 6.0.2 '@npmcli/run-script': 6.0.2 @@ -9923,9 +10178,9 @@ packages: npm-registry-fetch: 14.0.5 proc-log: 3.0.0 promise-retry: 2.0.1 - read-package-json: 6.0.3 + read-package-json: 6.0.4 read-package-json-fast: 3.0.2 - sigstore: 1.5.2 + sigstore: 1.8.0 ssri: 10.0.4 tar: 6.1.15 transitivePeerDependencies: @@ -9938,10 +10193,10 @@ packages: engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} hasBin: true dependencies: - '@npmcli/git': 4.0.4_bluebird@3.7.2 + '@npmcli/git': 4.1.0_bluebird@3.7.2 '@npmcli/installed-package-contents': 2.0.2 '@npmcli/promise-spawn': 6.0.2 - '@npmcli/run-script': 6.0.2_bluebird@3.7.2 + '@npmcli/run-script': 6.0.2 cacache: 17.1.3 fs-minipass: 3.0.2 minipass: 5.0.0 @@ -9951,9 +10206,9 @@ packages: npm-registry-fetch: 14.0.5 proc-log: 3.0.0 promise-retry: 2.0.1 - read-package-json: 6.0.3 + read-package-json: 6.0.4 read-package-json-fast: 3.0.2 - sigstore: 1.5.2 + sigstore: 1.8.0 ssri: 10.0.4 tar: 6.1.15 transitivePeerDependencies: @@ -9992,7 +10247,7 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: - '@babel/code-frame': 7.21.4 + '@babel/code-frame': 7.22.5 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -10040,11 +10295,11 @@ packages: /path-parse/1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - /path-scurry/1.9.2: - resolution: {integrity: sha512-qSDLy2aGFPm8i4rsbHd4MNyTcrzHFsLQykrtbuGRknZZCBBVXSv2tSCDN2Cg6Rt/GFRw8GoW9y9Ecw5rIPG1sg==} + /path-scurry/1.10.1: + resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} engines: {node: '>=16 || 14 >=14.17'} dependencies: - lru-cache: 9.1.1 + lru-cache: 10.0.0 minipass: 5.0.0 dev: true @@ -10089,8 +10344,8 @@ packages: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} - /pirates/4.0.5: - resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==} + /pirates/4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} dev: true @@ -10113,8 +10368,8 @@ packages: engines: {node: '>=4'} dev: true - /pnpm/7.32.5: - resolution: {integrity: sha512-Q5WVGhbDVTEjyGk/njUOnOGIJPYCta8Vj7F8LW7hClMlFURSLjHjAD07G5v1Qi0lyhT4bo0QBTxVJnTunjP9FQ==} + /pnpm/7.33.5: + resolution: {integrity: sha512-TkmfIv/+WEWqj5Rj4ThrLXLDE04OvvlAk2CthE/vApDoK0ebMusuwPMOVmB+GCDCIWeCn9YmVtQaj9DMSg9CZw==} engines: {node: '>=14.6'} hasBin: true dev: true @@ -10129,11 +10384,6 @@ packages: which-pm: 2.0.0 dev: true - /prelude-ls/1.1.2: - resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} - engines: {node: '>= 0.8.0'} - dev: false - /prelude-ls/1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -10154,11 +10404,11 @@ packages: react-is: 17.0.2 dev: true - /pretty-format/29.5.0: - resolution: {integrity: sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==} + /pretty-format/29.6.1: + resolution: {integrity: sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/schemas': 29.4.3 + '@jest/schemas': 29.6.0 ansi-styles: 5.2.0 react-is: 18.2.0 dev: true @@ -10185,7 +10435,6 @@ packages: /process/0.11.10: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} engines: {node: '>= 0.6.0'} - dev: false /progress-stream/2.0.0: resolution: {integrity: sha512-xJwOWR46jcXUq6EH9yYyqp+I52skPySOeHfkxOZ2IY1AiBi/sFJhbhAKHoV3OTw/omQ45KTio9215dRJ2Yxd3Q==} @@ -10407,11 +10656,11 @@ packages: npm-normalize-package-bin: 3.0.1 dev: true - /read-package-json/6.0.3: - resolution: {integrity: sha512-4QbpReW4kxFgeBQ0vPAqh2y8sXEB3D4t3jsXbJKIhBiF80KT6XRo45reqwtftju5J6ru1ax06A2Gb/wM1qCOEQ==} + /read-package-json/6.0.4: + resolution: {integrity: sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: - glob: 10.2.6 + glob: 10.3.3 json-parse-even-better-errors: 3.0.0 normalize-package-data: 5.0.0 npm-normalize-package-bin: 3.0.1 @@ -10462,6 +10711,17 @@ packages: string_decoder: 1.3.0 util-deprecate: 1.0.2 + /readable-stream/4.4.2: + resolution: {integrity: sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + string_decoder: 1.3.0 + dev: true + /readdir-scoped-modules/1.1.0: resolution: {integrity: sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==} deprecated: This functionality has been moved to @npmcli/fs @@ -10706,7 +10966,7 @@ packages: /rxjs/7.8.1: resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} dependencies: - tslib: 2.5.2 + tslib: 2.6.0 /safe-buffer/5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} @@ -10750,17 +11010,17 @@ packages: engines: {node: '>=8'} dev: true - /semver/5.7.1: - resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} + /semver/5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} hasBin: true - /semver/6.3.0: - resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} + /semver/6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true dev: true - /semver/7.5.1: - resolution: {integrity: sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==} + /semver/7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} engines: {node: '>=10'} hasBin: true dependencies: @@ -10882,14 +11142,15 @@ packages: engines: {node: '>=14'} dev: true - /sigstore/1.5.2: - resolution: {integrity: sha512-X95v6xAAooVpn7PaB94TDmFeSO5SBfCtB1R23fvzr36WTfjtkiiyOeei979nbTjc8nzh6FSLeltQZuODsm1EjQ==} + /sigstore/1.8.0: + resolution: {integrity: sha512-ogU8qtQ3VFBawRJ8wjsBEX/vIFeHuGs1fm4jZtjWQwjo8pfAt7T/rh+udlAN4+QUe0IzA8qRSc/YZ7dHP6kh+w==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} hasBin: true dependencies: - '@sigstore/protobuf-specs': 0.1.0 + '@sigstore/bundle': 1.0.0 + '@sigstore/protobuf-specs': 0.2.0 + '@sigstore/tuf': 1.0.3 make-fetch-happen: 11.1.1 - tuf-js: 1.1.6 transitivePeerDependencies: - supports-color dev: true @@ -10900,11 +11161,22 @@ packages: is-arrayish: 0.3.2 dev: false - /sinon/15.1.0: - resolution: {integrity: sha512-cS5FgpDdE9/zx7no8bxROHymSlPLZzq0ChbbLk1DrxBfc+eTeBK3y8nIL+nu/0QeYydhhbLIr7ecHJpywjQaoQ==} + /sinon/11.1.2: + resolution: {integrity: sha512-59237HChms4kg7/sXhiRcUzdSkKuydDeTiamT/jesUVHshBgL8XAmhgFo0GfK6RruMDM/iRSij1EybmMog9cJw==} + dependencies: + '@sinonjs/commons': 1.8.6 + '@sinonjs/fake-timers': 7.1.2 + '@sinonjs/samsam': 6.1.3 + diff: 5.1.0 + nise: 5.1.4 + supports-color: 7.2.0 + dev: true + + /sinon/15.2.0: + resolution: {integrity: sha512-nPS85arNqwBXaIsFCkolHjGIkFo+Oxu9vbgmBJizLAhqe6P2o3Qmj3KCUoRkfhHtvgDhZdWD3risLHAUJ8npjw==} dependencies: '@sinonjs/commons': 3.0.0 - '@sinonjs/fake-timers': 10.2.0 + '@sinonjs/fake-timers': 10.3.0 '@sinonjs/samsam': 8.0.0 diff: 5.1.0 nise: 5.1.4 @@ -10947,7 +11219,6 @@ packages: ansi-styles: 4.3.0 astral-regex: 2.0.0 is-fullwidth-code-point: 3.0.0 - dev: true /smart-buffer/4.2.0: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} @@ -11157,7 +11428,7 @@ packages: dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 - strip-ansi: 7.0.1 + strip-ansi: 7.1.0 dev: true /string_decoder/1.1.1: @@ -11188,8 +11459,8 @@ packages: dependencies: ansi-regex: 5.0.1 - /strip-ansi/7.0.1: - resolution: {integrity: sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==} + /strip-ansi/7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} engines: {node: '>=12'} dependencies: ansi-regex: 6.0.1 @@ -11431,8 +11702,8 @@ packages: engines: {node: '>=0.6'} dev: false - /tough-cookie/4.1.2: - resolution: {integrity: sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==} + /tough-cookie/4.1.3: + resolution: {integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==} engines: {node: '>=6'} dependencies: psl: 1.9.0 @@ -11460,19 +11731,20 @@ packages: resolution: {integrity: sha512-whw60l7r+8ZU8Tu/Uc2yxtc4ZTZbR/PF3u1IPNKGQ6p8EICLb3Z2lAgoqw9bqYd8IkgnsaOcLzYHFckjqNsf0g==} dev: true - /triple-beam/1.3.0: - resolution: {integrity: sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==} + /triple-beam/1.4.1: + resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} + engines: {node: '>= 14.0.0'} dev: false /ts-invariant/0.10.3: resolution: {integrity: sha512-uivwYcQaxAucv1CzRp2n/QdYPo4ILf9VXgH19zEIjFx2EJufV16P0JtJVpYHy89DItG6Kwj2oIUjrcK5au+4tQ==} engines: {node: '>=8'} dependencies: - tslib: 2.5.2 + tslib: 2.6.0 dev: false - /ts-jest/29.1.0_doipufordlnvh5g4adbwayvyvy: - resolution: {integrity: sha512-ZhNr7Z4PcYa+JjMl62ir+zPiNJfXJN6E8hSLnaUKhOgqcn8vb3e537cpkd0FuAfRK3sR1LSqM1MOhliXNgOFPA==} + /ts-jest/29.1.1_dqjx4clx5uib3whf4y4dxwq3by: + resolution: {integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true peerDependencies: @@ -11494,12 +11766,12 @@ packages: dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 - jest: 29.5.0_iyzkm66nwd6ibglzwx45thyqle - jest-util: 29.5.0 + jest: 29.6.1_wfb4agvwth77yq3yn67m4qmzdm + jest-util: 29.6.1 json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 - semver: 7.5.1 + semver: 7.5.4 typescript: 4.9.5 yargs-parser: 21.1.1 dev: true @@ -11523,7 +11795,7 @@ packages: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - acorn: 8.8.2 + acorn: 8.10.0 acorn-walk: 8.2.0 arg: 4.1.3 create-require: 1.1.1 @@ -11533,7 +11805,7 @@ packages: yn: 3.1.1 dev: true - /ts-node/10.9.1_2unbv6mhrq4prucamkttzlebiq: + /ts-node/10.9.1_4qcp7qp4jxxdgb4qbxgwox4hwq: resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -11552,8 +11824,8 @@ packages: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 16.18.32 - acorn: 8.8.2 + '@types/node': 14.18.53 + acorn: 8.10.0 acorn-walk: 8.2.0 arg: 4.1.3 create-require: 1.1.1 @@ -11563,7 +11835,7 @@ packages: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - /ts-node/10.9.1_5vebceyeyrbj46wx3onulzfguy: + /ts-node/10.9.1_npeoqfxwgl5njwqojmpesqhar4: resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -11582,8 +11854,8 @@ packages: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 14.18.47 - acorn: 8.8.2 + '@types/node': 16.18.38 + acorn: 8.10.0 acorn-walk: 8.2.0 arg: 4.1.3 create-require: 1.1.1 @@ -11612,7 +11884,7 @@ packages: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - acorn: 8.8.2 + acorn: 8.10.0 acorn-walk: 8.2.0 arg: 4.1.3 create-require: 1.1.1 @@ -11640,8 +11912,8 @@ packages: /tslib/1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - /tslib/2.5.2: - resolution: {integrity: sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA==} + /tslib/2.6.0: + resolution: {integrity: sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==} /tsutils/3.21.0_typescript@4.9.5: resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} @@ -11653,8 +11925,8 @@ packages: typescript: 4.9.5 dev: true - /tuf-js/1.1.6: - resolution: {integrity: sha512-CXwFVIsXGbVY4vFiWF7TJKWmlKJAT8TWkH4RmiohJRcDJInix++F0dznDmoVbtJNzZ8yLprKUG4YrDIhv3nBMg==} + /tuf-js/1.1.7: + resolution: {integrity: sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: '@tufjs/models': 1.0.4 @@ -11669,13 +11941,6 @@ packages: dependencies: safe-buffer: 5.2.1 - /type-check/0.3.2: - resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.1.2 - dev: false - /type-check/0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -11834,13 +12099,13 @@ packages: engines: {node: '>=8'} dev: true - /update-browserslist-db/1.0.11_browserslist@4.21.5: + /update-browserslist-db/1.0.11_browserslist@4.21.9: resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' dependencies: - browserslist: 4.21.5 + browserslist: 4.21.9 escalade: 3.1.1 picocolors: 1.0.0 dev: true @@ -11879,8 +12144,8 @@ packages: inherits: 2.0.4 is-arguments: 1.1.1 is-generator-function: 1.0.10 - is-typed-array: 1.1.10 - which-typed-array: 1.1.9 + is-typed-array: 1.1.12 + which-typed-array: 1.1.11 dev: true /utils-merge/1.0.1: @@ -12018,8 +12283,8 @@ packages: iconv-lite: 0.6.3 dev: false - /whatwg-fetch/3.6.2: - resolution: {integrity: sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==} + /whatwg-fetch/3.6.16: + resolution: {integrity: sha512-83avoGbZ0qtjtNrU3UTT3/Xd3uZ7DyfSYLuc1fL5iYs+93P+UkIVF6/6xpRVWeQcvbc7kSnVybSAVbd6QFW5Fg==} dev: false /whatwg-mimetype/3.0.0: @@ -12053,8 +12318,8 @@ packages: path-exists: 4.0.0 dev: true - /which-typed-array/1.1.9: - resolution: {integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==} + /which-typed-array/1.1.11: + resolution: {integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==} engines: {node: '>= 0.4'} dependencies: available-typed-arrays: 1.0.5 @@ -12062,7 +12327,6 @@ packages: for-each: 0.3.3 gopd: 1.0.1 has-tostringtag: 1.0.0 - is-typed-array: 1.1.10 dev: true /which/1.3.1: @@ -12105,7 +12369,7 @@ packages: dependencies: logform: 2.5.1 readable-stream: 3.6.2 - triple-beam: 1.3.0 + triple-beam: 1.4.1 dev: false /winston/2.4.7: @@ -12120,8 +12384,8 @@ packages: stack-trace: 0.0.10 dev: false - /winston/3.8.2: - resolution: {integrity: sha512-MsE1gRx1m5jdTTO9Ld/vND4krP2To+lgDoMEHGGa4HIlAUyXJtfc7CxQcGXVyz2IBpw5hbFkj2b/AtUdQwyRew==} + /winston/3.10.0: + resolution: {integrity: sha512-nT6SIDaE9B7ZRO0u3UvdrimG0HkB7dSTAgInQnNR2SOPJ4bvq5q79+pXLftKmP52lJGW15+H5MCK0nM9D3KB/g==} engines: {node: '>= 12.0.0'} dependencies: '@colors/colors': 1.5.0 @@ -12133,14 +12397,10 @@ packages: readable-stream: 3.6.2 safe-stable-stringify: 2.4.3 stack-trace: 0.0.10 - triple-beam: 1.3.0 + triple-beam: 1.4.1 winston-transport: 4.5.0 dev: false - /word-wrap/1.2.3: - resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} - engines: {node: '>=0.10.0'} - /wordwrap/1.0.0: resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} @@ -12194,7 +12454,7 @@ packages: dependencies: ansi-styles: 6.2.1 string-width: 5.1.2 - strip-ansi: 7.0.1 + strip-ansi: 7.1.0 dev: true /wrappy/1.0.2: @@ -12360,8 +12620,8 @@ packages: requiresBuild: true dev: false - /yeoman-environment/3.18.3: - resolution: {integrity: sha512-OF5C87D7QUDOe4Lo2QucPnqFz0V3dNvC7D5Up6kVxUZKrY3LtNM7JIFAb/rhfEp/lKlZ28Olrb/BYFTDHcJ2og==} + /yeoman-environment/3.19.3: + resolution: {integrity: sha512-/+ODrTUHtlDPRH9qIC0JREH8+7nsRcjDl3Bxn2Xo/rvAaVvixH5275jHwg0C85g4QsF4P6M2ojfScPPAl+pLAg==} engines: {node: '>=12.10.0'} hasBin: true dependencies: @@ -12395,7 +12655,8 @@ packages: pacote: 12.0.3 preferred-pm: 3.0.3 pretty-bytes: 5.6.0 - semver: 7.5.1 + readable-stream: 4.4.2 + semver: 7.5.4 slash: 3.0.0 strip-ansi: 6.0.1 text-table: 0.2.0 @@ -12406,8 +12667,8 @@ packages: - supports-color dev: true - /yeoman-environment/3.18.3_bluebird@3.7.2: - resolution: {integrity: sha512-OF5C87D7QUDOe4Lo2QucPnqFz0V3dNvC7D5Up6kVxUZKrY3LtNM7JIFAb/rhfEp/lKlZ28Olrb/BYFTDHcJ2og==} + /yeoman-environment/3.19.3_bluebird@3.7.2: + resolution: {integrity: sha512-/+ODrTUHtlDPRH9qIC0JREH8+7nsRcjDl3Bxn2Xo/rvAaVvixH5275jHwg0C85g4QsF4P6M2ojfScPPAl+pLAg==} engines: {node: '>=12.10.0'} hasBin: true dependencies: @@ -12441,7 +12702,8 @@ packages: pacote: 12.0.3_bluebird@3.7.2 preferred-pm: 3.0.3 pretty-bytes: 5.6.0 - semver: 7.5.1 + readable-stream: 4.4.2 + semver: 7.5.4 slash: 3.0.0 strip-ansi: 6.0.1 text-table: 0.2.0 @@ -12452,7 +12714,7 @@ packages: - supports-color dev: true - /yeoman-generator/5.9.0_relnv3374w66mzl5ehclms4mvq: + /yeoman-generator/5.9.0_nqs3lknjmcjhmksixfhcryndrq: resolution: {integrity: sha512-sN1e01Db4fdd8P/n/yYvizfy77HdbwzvXmPxps9Gwz2D24slegrkSn+qyj+0nmZhtFwGX2i/cH29QDrvAFT9Aw==} engines: {node: '>=12.10.0'} peerDependencies: @@ -12472,11 +12734,11 @@ packages: pacote: 15.2.0_bluebird@3.7.2 read-pkg-up: 7.0.1 run-async: 2.4.1 - semver: 7.5.1 + semver: 7.5.4 shelljs: 0.8.5 sort-keys: 4.2.0 text-table: 0.2.0 - yeoman-environment: 3.18.3_bluebird@3.7.2 + yeoman-environment: 3.19.3_bluebird@3.7.2 transitivePeerDependencies: - bluebird - encoding @@ -12484,7 +12746,7 @@ packages: - supports-color dev: true - /yeoman-generator/5.9.0_yeoman-environment@3.18.3: + /yeoman-generator/5.9.0_yeoman-environment@3.19.3: resolution: {integrity: sha512-sN1e01Db4fdd8P/n/yYvizfy77HdbwzvXmPxps9Gwz2D24slegrkSn+qyj+0nmZhtFwGX2i/cH29QDrvAFT9Aw==} engines: {node: '>=12.10.0'} peerDependencies: @@ -12504,11 +12766,11 @@ packages: pacote: 15.2.0 read-pkg-up: 7.0.1 run-async: 2.4.1 - semver: 7.5.1 + semver: 7.5.4 shelljs: 0.8.5 sort-keys: 4.2.0 text-table: 0.2.0 - yeoman-environment: 3.18.3 + yeoman-environment: 3.19.3 transitivePeerDependencies: - bluebird - encoding