From d98b470bb21e47082c92ce59b2629663bb506239 Mon Sep 17 00:00:00 2001 From: Abhinav Gupta Date: Tue, 12 Dec 2023 12:05:37 +0530 Subject: [PATCH 01/28] fix: fixed issue while updating entries with assets --- lib/entity.js | 24 ++++- package.json | 2 +- test/unit/entry-test.js | 191 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 215 insertions(+), 2 deletions(-) diff --git a/lib/entity.js b/lib/entity.js index 7a9246b3..268d930d 100644 --- a/lib/entity.js +++ b/lib/entity.js @@ -137,7 +137,8 @@ export const update = (http, type, params = {}) => { delete json.updated_by delete json.updated_at if (type) { - updateData[type] = json + updateData[type] = json; + if (type === "entry") updateData[type] = cleanAssets(updateData[type]); } else { updateData = json } @@ -309,3 +310,24 @@ export const move = (http, type, force = false, params = {}) => { } } } + +function isAsset (data) { + const element = (Array.isArray(data) && data.length > 0) ? data[0] : data; + return (!!element.file_size || !!element.content_type) && !!element.uid; +} + +export function cleanAssets (data) { + if (typeof data === "object" && Object.keys(data).length > 0) { + const keys = Object.keys(data); + for (const key of keys) { + if (typeof data[key] === "object" && Object.keys(data[key]).length > 0) { + if (isAsset(data[key])) { + data[key] = (Array.isArray(data[key])) ? data[key].map(element => element.uid) : data[key].uid; + } else { + cleanAssets(data[key]); + } + } + } + } + return data; +} diff --git a/package.json b/package.json index af403433..2b2ec985 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@contentstack/management", - "version": "1.13.0", + "version": "1.13.1", "description": "The Content Management API is used to manage the content of your Contentstack account", "main": "./dist/node/contentstack-management.js", "browser": "./dist/web/contentstack-management.js", diff --git a/test/unit/entry-test.js b/test/unit/entry-test.js index db87571d..5515c2e0 100644 --- a/test/unit/entry-test.js +++ b/test/unit/entry-test.js @@ -4,6 +4,7 @@ import { expect } from 'chai' import { describe, it } from 'mocha' import MockAdapter from 'axios-mock-adapter' import { Entry, EntryCollection, createFormData } from '../../lib/stack/contentType/entry' +import { cleanAssets } from '../../lib/entity' import { systemUidMock, stackHeadersMock, entryMock, noticeMock, checkSystemFields } from './mock/objects' describe('Contentstack Entry test', () => { @@ -375,6 +376,196 @@ describe('Contentstack Entry test', () => { }) .catch(done) }) + + it('Entry with asset object', done => { + const entry = { + empty_array: [], + empty_object: {}, + single_file: { + file_size: 69420, + uid: 'single_file' + }, + title: 'test entry', + property: 'test property 3', + array_file: [ + { file_size: 69420, uid: 'array_file_1' }, + { file_size: 69420, uid: 'array_file_2' }, + { file_size: 69420, uid: 'array_file_3' }, + ], + wrapper1: { + something: 'something', + something_else: 'something_else', + file_inside_wrapper : { + file_size: 69420, + uid: 'single_file' + }, + file_array_wrapper : [ + { file_size: 69420, uid: 'array_file_wrap_1' }, + { file_size: 69420, uid: 'array_file_wrap_2' }, + { file_size: 69420, uid: 'array_file_wrap_3' }, + ], + array_wrapper: [ + { + something: 'something', + single_file: { + file_size: 69420, + uid: 'single_file_1' + }, + something_else: 'something_else' + }, + { + something: 'something', + single_file: { + file_size: 69420, + uid: 'single_file_2' + }, + something_else: 'something_else' + }, + { + something: 'something', + single_file: { + file_size: 69420, + uid: 'single_file_3' + }, + something_else: 'something_else' + } + ], + wrapper2: { + array_of_array_wrapper: [ + { + something: 'something', + oneMoreWrapper : { + file_array_wrapper : [ + { file_size: 69420, uid: 'array_file_wrap_1' }, + { file_size: 69420, uid: 'array_file_wrap_2' }, + { file_size: 69420, uid: 'array_file_wrap_3' }, + ], + array_wrapper: [ + { + something: 'something', + single_file: { + file_size: 69420, + uid: 'single_file_1' + }, + something_else: 'something_else' + }, + { + something: 'something', + single_file: { + file_size: 69420, + uid: 'single_file_2' + }, + something_else: 'something_else' + }, + { + something: 'something', + single_file: { + file_size: 69420, + uid: 'single_file_3' + }, + something_else: 'something_else' + } + ], + }, + something_else: 'something_else' + }, + { + something: 'something', + file_array_wrapper : [ + { file_size: 69420, uid: 'array_file_wrap_1' }, + { file_size: 69420, uid: 'array_file_wrap_2' }, + { file_size: 69420, uid: 'array_file_wrap_3' }, + ], + something_else: 'something_else' + }, + { + something: 'something', + file_array_wrapper : [ + { file_size: 69420, uid: 'array_file_wrap_1' }, + { file_size: 69420, uid: 'array_file_wrap_2' }, + { file_size: 69420, uid: 'array_file_wrap_3' }, + ], + something_else: 'something_else' + } + ] + } + }, + ...systemUidMock + }; + const expectedResult = { + empty_array: [], + empty_object: {}, + single_file: 'single_file', + title: 'test entry', + property: 'test property 3', + array_file: ['array_file_1', 'array_file_2', 'array_file_3'], + wrapper1: { + something: 'something', + something_else: 'something_else', + file_inside_wrapper : 'single_file', + file_array_wrapper : ['array_file_wrap_1', 'array_file_wrap_2', 'array_file_wrap_3'], + array_wrapper: [ + { + something: 'something', + single_file: 'single_file_1', + something_else: 'something_else' + }, + { + something: 'something', + single_file: 'single_file_2', + something_else: 'something_else' + }, + { + something: 'something', + single_file: 'single_file_3', + something_else: 'something_else' + } + ], + wrapper2: { + array_of_array_wrapper: [ + { + something: 'something', + oneMoreWrapper : { + file_array_wrapper : ['array_file_wrap_1', 'array_file_wrap_2', 'array_file_wrap_3'], + array_wrapper: [ + { + something: 'something', + single_file: 'single_file_1', + something_else: 'something_else' + }, + { + something: 'something', + single_file: 'single_file_2', + something_else: 'something_else' + }, + { + something: 'something', + single_file: 'single_file_3', + something_else: 'something_else' + } + ], + }, + something_else: 'something_else' + }, + { + something: 'something', + file_array_wrapper : ['array_file_wrap_1', 'array_file_wrap_2', 'array_file_wrap_3'], + something_else: 'something_else' + }, + { + something: 'something', + file_array_wrapper : ['array_file_wrap_1', 'array_file_wrap_2', 'array_file_wrap_3'], + something_else: 'something_else' + } + ] + } + }, + ...systemUidMock + }; + const result = cleanAssets(entry); + expect(result).to.deep.equal(expectedResult); + done(); + }) }) function makeEntry (data) { From b17a988841ffde358174f16c8e19b5514fbc4650 Mon Sep 17 00:00:00 2001 From: Abhinav Gupta Date: Wed, 13 Dec 2023 13:41:03 +0530 Subject: [PATCH 02/28] feat: added api test --- test/api/entry-test.js | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/test/api/entry-test.js b/test/api/entry-test.js index d2a14cc2..73ed20ae 100644 --- a/test/api/entry-test.js +++ b/test/api/entry-test.js @@ -190,8 +190,45 @@ describe('Entry api Test', () => { }) .catch(done) }) + + it('Create and update an entry with asset', done => { + // get asset + let asset; + makeAsset() + .query() + .find() + .then((collection) => { + asset = collection.items[0]; + // create entry + let entry = { + ...entryFirst, + title: "uniqueTitle45", + modular_blocks: [ + { + block1: { + file: asset.uid + } + } + ] + }; + makeEntry(multiPageCT.content_type.uid) + .create({entry: entry}) + .then(entry => { + const newTitle = "updated title"; + entry.title = newTitle; + entry.update().then(updatedEntry => { + expect(updatedEntry.title).to.be.equal(newTitle); + done(); + }) + }) + }) + }); }) function makeEntry (contentType, uid = null) { return client.stack({ api_key: stack.api_key }).contentType(contentType).entry(uid) } + +function makeAsset (uid = null) { + return client.stack({ api_key: stack.api_key }).asset(uid) +} From db6b879a4856b4f96833b19d52e0fd90caf66207 Mon Sep 17 00:00:00 2001 From: Abhinav Gupta Date: Wed, 13 Dec 2023 15:24:02 +0530 Subject: [PATCH 03/28] fix: updated changelog and package lock file --- CHANGELOG.md | 3 +++ package-lock.json | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b19a1660..54b82f31 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,7 @@ # Changelog +## [v1.13.1](https://github.com/contentstack/contentstack-management-javascript/tree/v1.13.1) (2023-12-13) + - Fixes + - Fix for issue while updating entries with assets ## [v1.13.0](https://github.com/contentstack/contentstack-management-javascript/tree/v1.13.0) (2023-11-21) - Feature diff --git a/package-lock.json b/package-lock.json index aaa58d6e..1c853cc9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@contentstack/management", - "version": "1.11.0", + "version": "1.13.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@contentstack/management", - "version": "1.11.0", + "version": "1.13.1", "license": "MIT", "dependencies": { "axios": "^1.6.0", From 9ed7a91fda4f204674c9ad5698f2ea355f771c93 Mon Sep 17 00:00:00 2001 From: sunil-lakshman <104969541+sunil-lakshman@users.noreply.github.com> Date: Fri, 15 Dec 2023 13:17:11 +0530 Subject: [PATCH 04/28] Implemented Management token support (#99) * Implemented Management token support * Fixed PR Comments --- CHANGELOG.md | 3 + lib/stack/index.js | 23 +++ lib/stack/managementToken/index.js | 111 +++++++++++++++ package-lock.json | 159 ++++++++++++++++----- package.json | 4 +- test/api/managementToken-test.js | 136 ++++++++++++++++++ test/api/mock/managementToken.js | 73 ++++++++++ test/test.js | 1 + test/typescript/index.test.ts | 6 + test/typescript/managementToken.ts | 131 +++++++++++++++++ test/typescript/mock/managementToken.ts | 73 ++++++++++ test/unit/index.js | 1 + test/unit/managementToken-test.js | 180 ++++++++++++++++++++++++ test/unit/mock/objects.js | 19 ++- types/stack/index.d.ts | 4 + types/stack/managementToken/index.ts | 27 ++++ 16 files changed, 916 insertions(+), 35 deletions(-) create mode 100644 lib/stack/managementToken/index.js create mode 100644 test/api/managementToken-test.js create mode 100644 test/api/mock/managementToken.js create mode 100644 test/typescript/managementToken.ts create mode 100644 test/typescript/mock/managementToken.ts create mode 100644 test/unit/managementToken-test.js create mode 100644 types/stack/managementToken/index.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 54b82f31..23923286 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,9 @@ - Fixes - Fix for issue while updating entries with assets +## [v1.14.0](https://github.com/contentstack/contentstack-management-javascript/tree/v1.14.0) (2023-12-19) + - Feature + - Management token feature added ## [v1.13.0](https://github.com/contentstack/contentstack-management-javascript/tree/v1.13.0) (2023-11-21) - Feature - Teams API support diff --git a/lib/stack/index.js b/lib/stack/index.js index d86f72cb..f63bb264 100644 --- a/lib/stack/index.js +++ b/lib/stack/index.js @@ -19,6 +19,7 @@ import { Branch } from './branch' import { BranchAlias } from './branchAlias' import { AuditLog } from './auditlog' import { Taxonomy } from './taxonomy' +import { ManagementToken } from './managementToken' /** * A stack is a space that stores the content of a project (a web or mobile property). Within a stack, you can create content structures, content entries, users, etc. related to the project. Read more about Stacks. @@ -257,6 +258,28 @@ export function Stack (http, data) { return new DeliveryToken(http, data) } + /** + * @description Management Tokens are tokens that provide you with read-write access to the content of your stack. + * @param {String} managementTokenUid The UID of the Management Token field you want to get details. + * @returns {ManagementToken} Instance of ManagementToken. + * @example + * import * as contentstack from '@contentstack/management' + * const client = contentstack.client() + * + * client.stack({ api_key: 'api_key'}).managementToken().create() + * .then((managementToken) => console.log(managementToken)) + * + * client.stack({ api_key: 'api_key'}).managementToken('managementToken_uid').fetch() + * .then((managementToken) => console.log(managementToken)) + */ + this.managementToken = (managementTokenUid = null) => { + const data = { stackHeaders: this.stackHeaders } + if (managementTokenUid) { + data.token = { uid: managementTokenUid } + } + return new ManagementToken(http, data) + } + /** * @description Extensions let you create custom fields and custom widgets that lets you customize Contentstack's default UI and behavior. * @param {String} extensionUid The UID of the Extension you want to get details. diff --git a/lib/stack/managementToken/index.js b/lib/stack/managementToken/index.js new file mode 100644 index 00000000..d8b455e6 --- /dev/null +++ b/lib/stack/managementToken/index.js @@ -0,0 +1,111 @@ +import cloneDeep from 'lodash/cloneDeep' +import { create, update, deleteEntity, fetch, query } from '../../entity' + +/** + * Management tokens provide read-only access to the associated environments. Read more about ManagementToken. + * @namespace ManagementToken + */ +export function ManagementToken (http, data = {}) { + this.stackHeaders = data.stackHeaders + this.urlPath = `/stacks/management_tokens` + if (data.token) { + Object.assign(this, cloneDeep(data.token)) + this.urlPath = `/stacks/management_tokens/${this.uid}` + /** + * @description The Update ManagementToken call lets you update the name and description of an existing ManagementToken. + * @memberof ManagementToken + * @func update + * @returns {Promise} Promise for ManagementToken instance + * @example + * import * as contentstack from '@contentstack/management' + * const client = contentstack.client() + * + * client.stack({ api_key: 'api_key'}).managementToken('management_token_uid').fetch() + * .then((managementToken) => { + * managementToken.title = 'My New management token' + * managementToken.description = 'management token description' + * return managementToken.update() + * }) + * .then((managementToken) => console.log(managementToken)) + * + */ + this.update = update(http, 'token') + + /** + * @description The Delete ManagementToken call is used to delete an existing ManagementToken permanently from your Stack. + * @memberof ManagementToken + * @func delete + * @returns {Object} Response Object. + * @example + * import * as contentstack from '@contentstack/management' + * const client = contentstack.client() + * + * client.stack({ api_key: 'api_key'}).managementToken('management_token_uid').delete() + * .then((response) => console.log(response.notice)) + */ + this.delete = deleteEntity(http) + + /** + * @description The fetch ManagementToken call fetches ManagementToken details. + * @memberof ManagementToken + * @func fetch + * @returns {Promise} Promise for ManagementToken instance + * @example + * import * as contentstack from '@contentstack/management' + * const client = contentstack.client() + * + * client.stack({ api_key: 'api_key'}).managementToken('management_token_uid').fetch() + * .then((managementToken) => console.log(managementToken)) + * + */ + this.fetch = fetch(http, 'token') + } else { + /** + * @description The Create a ManagementToken call creates a new ManagementToken in a particular stack of your Contentstack account. + * @memberof ManagementToken + * @func create + * @returns {Promise} Promise for ManagementToken instance + * + * @example + * import * as contentstack from '@contentstack/management' + * const client = contentstack.client() + * const token = { + * name: 'Test', + * description: 'This is a demo token.', + * scope: [{ + * module: 'environment', + * environments: ['development'], + * acl: { + * read: true + * } + * }] + * } + * + * client.stack().managementToken().create({ token }) + * .then((managementToken) => console.log(managementToken)) + */ + this.create = create({ http: http }) + + /** + * @description The ‘Get all managementToken’ request returns comprehensive information about all managementToken created in a stack. + * @memberof ManagementToken + * @func query + * @returns {ContentstackCollection} Instance of ContentstackCollection. + * @example + * import * as contentstack from '@contentstack/management' + * const client = contentstack.client() + * + * client.stack().managementToken().query({ query: { name: 'token_name' } })).find() + * .then((contentstackCollection) => console.log(contentstackCollection)) + */ + this.query = query({ http: http, wrapperCollection: ManagementTokenCollection }) + } +} + +export function ManagementTokenCollection (http, data) { + const obj = cloneDeep(data.tokens) || [] + const managementTokenCollection = obj.map((managementTokenData) => { + return new ManagementToken(http, { token: managementTokenData, stackHeaders: data.stackHeaders }) + }) + return managementTokenCollection +} diff --git a/package-lock.json b/package-lock.json index 1c853cc9..f621ba2c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@contentstack/management", - "version": "1.13.1", - "lockfileVersion": 2, + "version": "1.14.0", + "lockfileVersion": 1, "requires": true, "packages": { "": { "name": "@contentstack/management", - "version": "1.13.1", + "version": "1.11.0", "license": "MIT", "dependencies": { "axios": "^1.6.0", @@ -12870,8 +12870,7 @@ "version": "7.21.0-placeholder-for-preset-env.2", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "dev": true, - "requires": {} + "dev": true }, "@babel/plugin-syntax-async-generators": { "version": "7.8.4", @@ -13691,21 +13690,112 @@ } }, "@babel/traverse": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.10.tgz", - "integrity": "sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.6.tgz", + "integrity": "sha512-czastdK1e8YByZqezMPFiZ8ahwVMh/ESl9vPgvgdB9AmFMGP5jfpFax74AQgl5zj4XHzqeYAg2l8PuUeRS1MgQ==", "dev": true, "requires": { - "@babel/code-frame": "^7.22.10", - "@babel/generator": "^7.22.10", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.10", - "@babel/types": "^7.22.10", - "debug": "^4.1.0", + "@babel/parser": "^7.23.6", + "@babel/types": "^7.23.6", + "debug": "^4.3.1", "globals": "^11.1.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + } + }, + "@babel/generator": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "dev": true, + "requires": { + "@babel/types": "^7.23.6", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + } + }, + "@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true + }, + "@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, + "requires": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + } + }, + "@babel/helper-string-parser": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true + }, + "@babel/highlight": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", + "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", + "dev": true + }, + "@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + } + }, + "@babel/types": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", + "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/types": { @@ -14592,6 +14682,12 @@ "@babel/types": "^7.20.7" } }, + "@types/chai": { + "version": "4.3.11", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.11.tgz", + "integrity": "sha512-qQR1dr2rGIHYlJulmr8Ioq3De0Le9E4MJ5AiaeAETJJpndT1uUNHsGFK3L/UIu+rbkQSdj8J/w2bCsBZc/Y5fQ==", + "dev": true + }, "@types/eslint": { "version": "8.44.2", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.2.tgz", @@ -14689,6 +14785,12 @@ "integrity": "sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==", "dev": true }, + "@types/lodash": { + "version": "4.14.202", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.202.tgz", + "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==", + "dev": true + }, "@types/markdown-it": { "version": "12.2.3", "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-12.2.3.tgz", @@ -14906,8 +15008,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", - "dev": true, - "requires": {} + "dev": true }, "@webpack-cli/info": { "version": "1.5.0", @@ -14922,8 +15023,7 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", - "dev": true, - "requires": {} + "dev": true }, "@xtuc/ieee754": { "version": "1.2.0", @@ -14947,15 +15047,13 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "dev": true, - "requires": {} + "dev": true }, "acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} + "dev": true }, "aggregate-error": { "version": "3.1.0", @@ -14983,8 +15081,7 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "requires": {} + "dev": true }, "ansi-colors": { "version": "4.1.1", @@ -16441,8 +16538,7 @@ "version": "13.0.1", "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-13.0.1.tgz", "integrity": "sha512-zLKp4QOgq6JFgRm1dDCVv1Iu0P5uZ4v5Wa4DTOkg2RFMxdCX/9Qf7lz9ezRj2dBRa955cWQF/O/LWEiYWAHbTw==", - "dev": true, - "requires": {} + "dev": true }, "eslint-import-resolver-node": { "version": "0.3.9", @@ -16565,8 +16661,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-4.1.0.tgz", "integrity": "sha512-ZL7+QRixjTR6/528YNGyDotyffm5OQst/sGxKDwGb9Uqs4In5Egi4+jbobhqJoyoCM6/7v/1A5fhQ7ScMtDjaQ==", - "dev": true, - "requires": {} + "dev": true }, "eslint-scope": { "version": "7.2.2", @@ -18310,8 +18405,7 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "requires": {} + "dev": true }, "jest-regex-util": { "version": "28.0.2", @@ -19299,8 +19393,7 @@ "version": "8.6.7", "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz", "integrity": "sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==", - "dev": true, - "requires": {} + "dev": true }, "marked": { "version": "4.3.0", diff --git a/package.json b/package.json index 2b2ec985..ee96e54e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@contentstack/management", - "version": "1.13.1", + "version": "1.14.0", "description": "The Content Management API is used to manage the content of your Contentstack account", "main": "./dist/node/contentstack-management.js", "browser": "./dist/web/contentstack-management.js", @@ -66,7 +66,9 @@ "@babel/preset-env": "^7.18.2", "@babel/register": "^7.17.7", "@babel/runtime": "^7.18.3", + "@types/chai": "^4.3.11", "@types/jest": "^28.1.0", + "@types/lodash": "^4.14.202", "@types/mocha": "^7.0.2", "axios-mock-adapter": "^1.21.1", "babel-loader": "^8.2.5", diff --git a/test/api/managementToken-test.js b/test/api/managementToken-test.js new file mode 100644 index 00000000..70aeb0df --- /dev/null +++ b/test/api/managementToken-test.js @@ -0,0 +1,136 @@ +import { expect } from 'chai' +import { describe, it, setup } from 'mocha' +import { jsonReader } from '../utility/fileOperations/readwrite' +import { createManagementToken, createManagementToken2 } from './mock/managementToken.js' +import { contentstackClient } from '../utility/ContentstackClient.js' + +var client = {} + +var stack = {} +var tokenUID = '' +describe('Management Token api Test', () => { + setup(() => { + const user = jsonReader('loggedinuser.json') + stack = jsonReader('stack.json') + client = contentstackClient(user.authtoken) + }) + + it('Add a Management Token', done => { + makeManagementToken() + .create(createManagementToken) + .then((token) => { + expect(token.name).to.be.equal(createManagementToken.token.name) + expect(token.description).to.be.equal(createManagementToken.token.description) + expect(token.scope[0].module).to.be.equal(createManagementToken.token.scope[0].module) + expect(token.uid).to.be.not.equal(null) + done() + }) + .catch(done) + }) + + it('Add a Management Token for production', done => { + makeManagementToken() + .create(createManagementToken2) + .then((token) => { + tokenUID = token.uid + expect(token.name).to.be.equal(createManagementToken2.token.name) + expect(token.description).to.be.equal(createManagementToken2.token.description) + expect(token.scope[0].module).to.be.equal(createManagementToken2.token.scope[0].module) + expect(token.uid).to.be.not.equal(null) + done() + }) + .catch(done) + }) + + it('Get a Management Token from uid', done => { + makeManagementToken(tokenUID) + .fetch() + .then((token) => { + expect(token.name).to.be.equal(createManagementToken2.token.name) + expect(token.description).to.be.equal(createManagementToken2.token.description) + expect(token.scope[0].module).to.be.equal(createManagementToken2.token.scope[0].module) + expect(token.uid).to.be.not.equal(null) + done() + }) + .catch(done) + }) + + it('Query to get all Management Token', done => { + makeManagementToken() + .query() + .find() + .then((tokens) => { + tokens.items.forEach((token) => { + expect(token.name).to.be.not.equal(null) + expect(token.description).to.be.not.equal(null) + expect(token.scope[0].module).to.be.not.equal(null) + expect(token.uid).to.be.not.equal(null) + }) + done() + }) + .catch(done) + }) + + it('Query to get a Management Token from name', done => { + makeManagementToken() + .query({ query: { name: createManagementToken.token.name } }) + .find() + .then((tokens) => { + tokens.items.forEach((token) => { + expect(token.name).to.be.equal(createManagementToken.token.name) + expect(token.description).to.be.equal(createManagementToken.token.description) + expect(token.scope[0].module).to.be.equal(createManagementToken.token.scope[0].module) + expect(token.uid).to.be.not.equal(null) + }) + done() + }) + .catch(done) + }) + + it('Fetch and update a Management Token from uid', done => { + makeManagementToken(tokenUID) + .fetch() + .then((token) => { + token.name = 'Update Production Name' + token.description = 'Update Production description' + token.scope = createManagementToken2.token.scope + return token.update() + }) + .then((token) => { + expect(token.name).to.be.equal('Update Production Name') + expect(token.description).to.be.equal('Update Production description') + expect(token.scope[0].module).to.be.equal(createManagementToken2.token.scope[0].module) + expect(token.uid).to.be.not.equal(null) + done() + }) + .catch(done) + }) + + it('Update a Management Token from uid', done => { + const token = makeManagementToken(tokenUID) + Object.assign(token, createManagementToken2.token) + token.update() + .then((token) => { + expect(token.name).to.be.equal(createManagementToken2.token.name) + expect(token.description).to.be.equal(createManagementToken2.token.description) + expect(token.scope[0].module).to.be.equal(createManagementToken2.token.scope[0].module) + expect(token.uid).to.be.not.equal(null) + done() + }) + .catch(done) + }) + + it('Delete a Management Token from uid', done => { + makeManagementToken(tokenUID) + .delete() + .then((data) => { + expect(data.notice).to.be.equal('Management Token deleted successfully.') + done() + }) + .catch(done) + }) +}) + +function makeManagementToken (uid = null) { + return client.stack({ api_key: stack.api_key }).managementToken(uid) +} diff --git a/test/api/mock/managementToken.js b/test/api/mock/managementToken.js new file mode 100644 index 00000000..bd08d49e --- /dev/null +++ b/test/api/mock/managementToken.js @@ -0,0 +1,73 @@ +const createManagementToken = { + "token":{ + "name":"Test Token", + "description":"This is a sample management token.", + "scope":[ + { + "module":"content_type", + "acl":{ + "read":true, + "write":true + } + }, + { + "module":"branch", + "branches":[ + "main" + ], + "acl":{ + "read":true + } + }, + { + "module":"branch_alias", + "branch_aliases":[ + "tst" + ], + "acl":{ + "read":true + } + } + ], + "expires_on":"2024-12-10", + "is_email_notification_enabled":true + } +} +const createManagementToken2 = { + "token":{ + "name":"Test Token", + "description":"This is a sample management token.", + "scope":[ + { + "module":"content_type", + "acl":{ + "read":true, + "write":true + } + }, + { + "module":"branch", + "branches":[ + "main" + ], + "acl":{ + "read":true + } + }, + { + "module":"branch_alias", + "branch_aliases":[ + "tst" + ], + "acl":{ + "read":true + } + } + ], + "expires_on":"2024-12-10", + "is_email_notification_enabled":true + } +} + + export { createManagementToken, createManagementToken2 } + \ No newline at end of file diff --git a/test/test.js b/test/test.js index 8b4ec6b2..a66cd167 100644 --- a/test/test.js +++ b/test/test.js @@ -30,3 +30,4 @@ require('./api/terms-test') require('./api/team-test') require('./api/team-users-test') require('./api/team-stack-role-mapping-test') +require('./api/managementToken-test') diff --git a/test/typescript/index.test.ts b/test/typescript/index.test.ts index e7546da4..e6ab2d97 100644 --- a/test/typescript/index.test.ts +++ b/test/typescript/index.test.ts @@ -12,6 +12,7 @@ import { createBranchAlias, deleteBranchAlias, queryBranchAlias } from './branch import { createLocale, deleteLocale, getLocale } from './locale'; import { createEnvironment, deleteEnvironment, getEnvironment, updateEnvironment } from './environment'; import { createDeliveryToken, deleteDeliveryToken, deliveryToken, queryDeliveryToken } from './deliveryToken'; +import { createManagementToken, deleteManagementToken, managementToken, queryManagementToken } from './managementToken'; import { createRole, findAllRole, getRole, getRoleUid, queryRole } from './role'; import { createApp, deleteApp, fetchApp, installation, updateApp, updateAuth } from './app'; import { deployment, hosting } from './hosting'; @@ -79,6 +80,11 @@ describe('Typescript API test', () => { deliveryToken(stack) deleteDeliveryToken(stack) + createManagementToken(stack.managementToken()) + queryManagementToken(stack.managementToken()) + managementToken(stack) + deleteManagementToken(stack) + findAllRole(stack.role()) createRole(stack.role()) getRole(stack) diff --git a/test/typescript/managementToken.ts b/test/typescript/managementToken.ts new file mode 100644 index 00000000..7fb2dff2 --- /dev/null +++ b/test/typescript/managementToken.ts @@ -0,0 +1,131 @@ +import { expect } from "chai" +import path from "path" +import { Stack } from "../../types/stack"; +import { ManagementToken, ManagementTokens } from "../../types/stack/managementToken"; +import { managementToken1, managementToken2 } from "./mock/managementToken"; +var tokenUID = '' +export function createManagementToken(managementToken: ManagementTokens) { + describe('Management token create', () => { + test('Create a management token', done => { + managementToken.create(managementToken1) + .then((token) => { + expect(token.name).to.be.equal(managementToken1.token.name) + expect(token.description).to.be.equal(managementToken1.token.description) + expect(token.scope[0].module).to.be.equal(managementToken1.token.scope[0].module) + expect(token.uid).to.be.not.equal(null) + done() + }) + .catch(done) + }) + + test('Create management token for production', done => { + managementToken.create(managementToken2) + .then((token) => { + tokenUID = token.uid + expect(token.name).to.be.equal(managementToken2.token.name) + expect(token.description).to.be.equal(managementToken2.token.description) + expect(token.scope[0].module).to.be.equal(managementToken2.token.scope[0].module) + expect(token.uid).to.be.not.equal(null) + done() + }) + .catch(done) + }) + }) +} + +export function queryManagementToken(managementToken: ManagementTokens) { + describe('Query management token', () => { + test('Get all management token', done => { + managementToken.query().find() + .then((tokens) => { + tokens.items.forEach((token) => { + expect(token.name).to.be.not.equal(null) + expect(token.description).to.be.not.equal(null) + expect(token.scope[0].module).to.be.not.equal(null) + expect(token.uid).to.be.not.equal(null) + }) + done() + }) + .catch(done) + }) + + test('Get management token from name', done => { + managementToken.query({query: {name: managementToken1.token.name}}) + .find() + .then((tokens) => { + tokens.items.forEach((token) => { + expect(token.name).to.be.equal(managementToken1.token.name) + expect(token.description).to.be.equal(managementToken1.token.description) + expect(token.scope[0].module).to.be.equal(managementToken1.token.scope[0].module) + expect(token.uid).to.be.not.equal(null) + }) + done() + }) + .catch(done) + }) + }) +} +export function managementToken(stack: Stack) { + describe('Management token operations', () => { + test('Fetch management token', done => { + stack.managementToken(tokenUID) + .fetch() + .then((token) => { + expect(token.name).to.be.equal(managementToken2.token.name) + expect(token.description).to.be.equal(managementToken2.token.description) + expect(token.scope[0].module).to.be.equal(managementToken2.token.scope[0].module) + expect(token.uid).to.be.not.equal(null) + done() + }) + .catch(done) + }) + + test('Fetch and update a Management Token from uid', done => { + stack.managementToken(tokenUID) + .fetch() + .then((token) => { + token.name = 'Update Production Name' + token.description = 'Update Production description' + token.scope = managementToken2.token.scope + return token.update() + }) + .then((token) => { + expect(token.name).to.be.equal('Update Production Name') + expect(token.description).to.be.equal('Update Production description') + expect(token.scope[0].module).to.be.equal(managementToken2.token.scope[0].module) + expect(token.uid).to.be.not.equal(null) + done() + }) + .catch(done) + }) + + test('Update management token from uid', done => { + const token = stack.managementToken(tokenUID) + Object.assign(token, managementToken2.token) + + token.update() + .then((token) => { + expect(token.name).to.be.equal(managementToken2.token.name) + expect(token.description).to.be.equal(managementToken2.token.description) + expect(token.scope[0].module).to.be.equal(managementToken2.token.scope[0].module) + expect(token.uid).to.be.not.equal(null) + done() + }) + .catch(done) + }) + }) +} + +export function deleteManagementToken(stack: Stack) { + describe('Delete management token', () => { + test('Delete token from uid', done => { + stack.managementToken(tokenUID) + .delete() + .then((data) => { + expect(data.notice).to.be.equal('Management Token deleted successfully.') + done() + }) + .catch(done) + }) + }) +} \ No newline at end of file diff --git a/test/typescript/mock/managementToken.ts b/test/typescript/mock/managementToken.ts new file mode 100644 index 00000000..d035c9d0 --- /dev/null +++ b/test/typescript/mock/managementToken.ts @@ -0,0 +1,73 @@ +const managementToken1 = { + "token":{ + "name":"Test Token", + "description":"This is a sample management token.", + "scope":[ + { + "module":"content_type", + "acl":{ + "read":true, + "write":true + } + }, + { + "module":"branch", + "branches":[ + "main" + ], + "acl":{ + "read":true + } + }, + { + "module":"branch_alias", + "branch_aliases":[ + "tst" + ], + "acl":{ + "read":true + } + } + ], + "expires_on":"2024-12-10", + "is_email_notification_enabled":true + } +} +const managementToken2 = { + "token":{ + "name":"Test Token", + "description":"This is a sample management token.", + "scope":[ + { + "module":"content_type", + "acl":{ + "read":true, + "write":true + } + }, + { + "module":"branch", + "branches":[ + "main" + ], + "acl":{ + "read":true + } + }, + { + "module":"branch_alias", + "branch_aliases":[ + "tst" + ], + "acl":{ + "read":true + } + } + ], + "expires_on":"2024-12-10", + "is_email_notification_enabled":true + } +} + + export { managementToken1, managementToken2 } + \ No newline at end of file diff --git a/test/unit/index.js b/test/unit/index.js index 1eccb05e..a06cb20b 100644 --- a/test/unit/index.js +++ b/test/unit/index.js @@ -38,3 +38,4 @@ require('./terms-test') require('./team-test') require('./team-users-test') require('./team-stack-role-mapping-test') +require('./managementToken-test') diff --git a/test/unit/managementToken-test.js b/test/unit/managementToken-test.js new file mode 100644 index 00000000..27f55400 --- /dev/null +++ b/test/unit/managementToken-test.js @@ -0,0 +1,180 @@ +import Axios from 'axios' +import { expect } from 'chai' +import { describe, it } from 'mocha' +import MockAdapter from 'axios-mock-adapter' +import { ManagementToken, ManagementTokenCollection } from '../../lib/stack/managementToken' +import { systemUidMock, stackHeadersMock, managementTokenMock, noticeMock, checkSystemFields } from './mock/objects' +import { checkEnvironment } from './environment-test' + +describe('Contentstack ManagementToken test', () => { + it('ManagementToken test without uid', done => { + const managementToken = makeManagementToken() + expect(managementToken.urlPath).to.be.equal('/stacks/management_tokens') + expect(managementToken.stackHeaders).to.be.equal(undefined) + expect(managementToken.update).to.be.equal(undefined) + expect(managementToken.delete).to.be.equal(undefined) + expect(managementToken.fetch).to.be.equal(undefined) + expect(managementToken.create).to.not.equal(undefined) + expect(managementToken.query).to.not.equal(undefined) + done() + }) + + it('ManagementToken test with uid', done => { + const managementToken = makeManagementToken({ + token: { + ...systemUidMock + } + }) + expect(managementToken.urlPath).to.be.equal(`/stacks/management_tokens/${systemUidMock.uid}`) + expect(managementToken.stackHeaders).to.be.equal(undefined) + expect(managementToken.update).to.not.equal(undefined) + expect(managementToken.delete).to.not.equal(undefined) + expect(managementToken.fetch).to.not.equal(undefined) + expect(managementToken.create).to.be.equal(undefined) + expect(managementToken.query).to.be.equal(undefined) + done() + }) + + it('ManagementToken test with Stack Headers', done => { + const managementToken = makeManagementToken({ + token: { + ...systemUidMock + }, + stackHeaders: stackHeadersMock + }) + expect(managementToken.urlPath).to.be.equal(`/stacks/management_tokens/${systemUidMock.uid}`) + expect(managementToken.stackHeaders).to.not.equal(undefined) + expect(managementToken.stackHeaders.api_key).to.be.equal(stackHeadersMock.api_key) + expect(managementToken.update).to.not.equal(undefined) + expect(managementToken.delete).to.not.equal(undefined) + expect(managementToken.fetch).to.not.equal(undefined) + expect(managementToken.create).to.be.equal(undefined) + expect(managementToken.query).to.be.equal(undefined) + done() + }) + + it('ManagementToken Collection test with blank data', done => { + const managementToken = new ManagementTokenCollection(Axios, {}) + expect(managementToken.length).to.be.equal(0) + done() + }) + + it('ManagementToken Collection test with data', done => { + const managementToken = new ManagementTokenCollection(Axios, { + tokens: [ + managementTokenMock + ] + }) + expect(managementToken.length).to.be.equal(1) + checkManagementToken(managementToken[0]) + done() + }) + + it('ManagementToken create test', done => { + var mock = new MockAdapter(Axios) + mock.onPost('/stacks/management_tokens').reply(200, { + token: { + ...managementTokenMock + } + }) + makeManagementToken() + .create() + .then((managementToken) => { + checkManagementToken(managementToken) + done() + }) + .catch(done) + }) + + it('ManagementToken Query test', done => { + var mock = new MockAdapter(Axios) + mock.onGet('/stacks/management_tokens').reply(200, { + tokens: [ + managementTokenMock + ] + }) + makeManagementToken() + .query() + .find() + .then((managementTokens) => { + checkManagementToken(managementTokens.items[0]) + done() + }) + .catch(done) + }) + + it('ManagementToken update test', done => { + var mock = new MockAdapter(Axios) + mock.onPut('/stacks/management_tokens/UID').reply(200, { + token: { + ...managementTokenMock + } + }) + makeManagementToken({ + token: { + ...systemUidMock + }, + stackHeaders: stackHeadersMock + }) + .update() + .then((managementToken) => { + checkManagementToken(managementToken) + done() + }) + .catch(done) + }) + + it('ManagementToken fetch test', done => { + var mock = new MockAdapter(Axios) + mock.onGet('/stacks/management_tokens/UID').reply(200, { + token: { + ...managementTokenMock + } + }) + makeManagementToken({ + token: { + ...systemUidMock + }, + stackHeaders: stackHeadersMock + }) + .fetch() + .then((managementToken) => { + checkManagementToken(managementToken) + done() + }) + .catch(done) + }) + + it('ManagementToken delete test', done => { + var mock = new MockAdapter(Axios) + mock.onDelete('/stacks/management_tokens/UID').reply(200, { + ...noticeMock + }) + makeManagementToken({ + token: { + ...systemUidMock + }, + stackHeaders: stackHeadersMock + }) + .delete() + .then((response) => { + expect(response.notice).to.be.equal(noticeMock.notice) + done() + }) + .catch(done) + }) +}) + +function makeManagementToken (data = {}) { + return new ManagementToken(Axios, data) +} + +function checkManagementToken (managementToken) { + checkSystemFields(managementToken) + expect(managementToken.name).to.be.equal('Test') + expect(managementToken.description).to.be.equal('description') + expect(managementToken.token).to.be.equal('token') + expect(managementToken.type).to.be.equal('management') + expect(managementToken.scope.length).to.be.equal(1) + checkEnvironment(managementToken.scope[0].environments[0]) +} diff --git a/test/unit/mock/objects.js b/test/unit/mock/objects.js index a8dbf9a9..85f0cc09 100644 --- a/test/unit/mock/objects.js +++ b/test/unit/mock/objects.js @@ -418,6 +418,22 @@ const deliveryTokenMock = { type: 'delivery' } +const managementTokenMock = { + ...systemFieldsMock, + ...systemFieldsUserMock, + name: 'Test', + scope: [{ + environments: [environmentMock], + module: 'environment', + acl: { + read: true + } + }], + description: 'description', + token: 'token', + type: 'management' +} + const userAssignments = { ...stackHeadersMock, content_type: 'CT_UID', @@ -873,5 +889,6 @@ export { stackRoleMappingMock, mockCollection, entryMockCollection, - checkSystemFields + checkSystemFields, + managementTokenMock } diff --git a/types/stack/index.d.ts b/types/stack/index.d.ts index a1363af3..331f036d 100644 --- a/types/stack/index.d.ts +++ b/types/stack/index.d.ts @@ -19,6 +19,7 @@ import { Role, Roles } from "./role"; import { Webhook, Webhooks } from "./webhook"; import { Workflow, Workflows } from "./workflow"; import { Taxonomy, Taxonomies } from "./taxonomy"; +import { ManagementToken, ManagementTokens } from "./managementToken"; export interface StackConfig { api_key:string @@ -96,4 +97,7 @@ export interface Stack extends SystemFields { taxonomy(): Taxonomies taxonomy(uid: string): Taxonomy + + managementToken(): ManagementTokens + managementToken(uid: string): ManagementToken } diff --git a/types/stack/managementToken/index.ts b/types/stack/managementToken/index.ts new file mode 100644 index 00000000..e8d5e34b --- /dev/null +++ b/types/stack/managementToken/index.ts @@ -0,0 +1,27 @@ +import { AnyProperty, SystemFields } from "../../utility/fields"; +import { Queryable, SystemFunction } from "../../utility/operations"; + +export interface ManagementToken extends SystemFields, SystemFunction { +} + +export interface ManagementTokens extends Queryable { +} + +export interface ManagementTokenData extends AnyProperty { + name: string + description: string + scope: Array +} + +export interface Scope { + module: string + environments?: Array + locales?: Array + acl: ACL +} +export interface ACL extends AnyProperty { + read?: boolean + write?: boolean + create?: boolean + update?: boolean +} \ No newline at end of file From 701bc1ea2ef8dbb83b3887e06f8a402007f25f2c Mon Sep 17 00:00:00 2001 From: harshithad0703 Date: Mon, 18 Dec 2023 10:30:44 +0530 Subject: [PATCH 05/28] test: added sanity tests for user and contenttype --- .gitignore | 1 + .../api/contentType-delete-test.js | 28 +++ test/sanity-check/api/contentType-test.js | 123 ++++++++++++ test/sanity-check/api/user-test.js | 77 ++++++++ test/sanity-check/mock/content-type.js | 179 ++++++++++++++++++ test/sanity-check/mock/contentType.json | 36 ++++ test/sanity-check/sanity.js | 3 + .../utility/ContentstackClient.js | 12 ++ .../utility/fileOperations/readwrite.js | 35 ++++ 9 files changed, 494 insertions(+) create mode 100644 test/sanity-check/api/contentType-delete-test.js create mode 100644 test/sanity-check/api/contentType-test.js create mode 100644 test/sanity-check/api/user-test.js create mode 100644 test/sanity-check/mock/content-type.js create mode 100644 test/sanity-check/mock/contentType.json create mode 100644 test/sanity-check/sanity.js create mode 100644 test/sanity-check/utility/ContentstackClient.js create mode 100644 test/sanity-check/utility/fileOperations/readwrite.js diff --git a/.gitignore b/.gitignore index b6a96d1c..52bba02c 100644 --- a/.gitignore +++ b/.gitignore @@ -39,6 +39,7 @@ jspm_packages/ mochawesome-report/ coverage/ test/utility/dataFiles/ +test/sanity-check/utility/dataFiles/ report.json # TypeScript v1 declaration files diff --git a/test/sanity-check/api/contentType-delete-test.js b/test/sanity-check/api/contentType-delete-test.js new file mode 100644 index 00000000..e50722c5 --- /dev/null +++ b/test/sanity-check/api/contentType-delete-test.js @@ -0,0 +1,28 @@ +import { expect } from 'chai' +import { describe, it, setup } from 'mocha' +import { jsonReader } from '../utility/fileOperations/readwrite' +import { multiPageCT, singlepageCT } from '../mock/content-type' +import { contentstackClient } from '../utility/ContentstackClient' + +var client = {} + +describe('Content Type delete api Test', () => { + setup(() => { + const user = jsonReader('loggedinuser.json') + client = contentstackClient(user.authtoken) + }) + + it('Content Type delete', done => { + makeContentType(multiPageCT.content_type.uid) + .delete().then((data) => { + expect(data.notice).to.be.equal('Content Type deleted successfully.') + done() + }) + makeContentType(singlepageCT.content_type.uid).delete() + .catch(done) + }) +}) + +function makeContentType (uid = null) { + return client.stack({ api_key: process.env.API_KEY }).contentType(uid) +} diff --git a/test/sanity-check/api/contentType-test.js b/test/sanity-check/api/contentType-test.js new file mode 100644 index 00000000..49b09e7f --- /dev/null +++ b/test/sanity-check/api/contentType-test.js @@ -0,0 +1,123 @@ +import path from 'path' +import { expect } from 'chai' +import { describe, it, setup } from 'mocha' +import { jsonReader } from '../utility/fileOperations/readwrite.js' +import { singlepageCT, multiPageCT, schema } from '../mock/content-type.js' +import { contentstackClient } from '../utility/ContentstackClient.js' + +let client = {} +let multiPageCTUid = '' +let importCTUid = '' + +describe('Content Type api Test', () => { + setup(() => { + const user = jsonReader('loggedinuser.json') + client = contentstackClient(user.authtoken) + }) + + it('Create Single page ContentType Schema', done => { + makeContentType() + .create(singlepageCT) + .then((contentType) => { + expect(contentType.uid).to.be.equal(singlepageCT.content_type.uid) + expect(contentType.title).to.be.equal(singlepageCT.content_type.title) + done() + }) + .catch(done) + }) + + it('Create Multi page ContentType Schema', done => { + makeContentType() + .create(multiPageCT) + .then((contentType) => { + multiPageCTUid = contentType.uid + expect(contentType.uid).to.be.equal(multiPageCT.content_type.uid) + expect(contentType.title).to.be.equal(multiPageCT.content_type.title) + done() + }) + .catch(done) + }) + + it('Get all ContentType', done => { + makeContentType() + .query() + .find() + .then((response) => { + response.items.forEach(contentType => { + expect(contentType.uid).to.be.not.equal(null) + expect(contentType.title).to.be.not.equal(null) + expect(contentType.schema).to.be.not.equal(null) + }) + done() + }) + .catch(done) + }) + + it('Query ContentType title', done => { + makeContentType() + .query({ query: { title: singlepageCT.content_type.title } }) + .find() + .then((response) => { + response.items.forEach(contentType => { + expect(contentType.uid).to.be.not.equal(null) + expect(contentType.title).to.be.not.equal(null) + expect(contentType.schema).to.be.not.equal(null) + expect(contentType.uid).to.be.equal(singlepageCT.content_type.uid, 'UID not mathcing') + expect(contentType.title).to.be.equal(singlepageCT.content_type.title, 'Title not mathcing') + }) + done() + }) + .catch(done) + }) + + it('Fetch ContentType from uid', done => { + makeContentType(multiPageCT.content_type.uid) + .fetch() + .then((contentType) => { + expect(contentType.uid).to.be.equal(multiPageCT.content_type.uid) + expect(contentType.title).to.be.equal(multiPageCT.content_type.title) + done() + }) + .catch(done) + }) + + it('Fetch and Update ContentType schema', done => { + makeContentType(multiPageCTUid) + .fetch() + .then((contentType) => { + contentType.schema = schema + return contentType.update() + }) + .then((contentType) => { + expect(contentType.schema.length).to.be.equal(6) + done() + }) + .catch(done) + }) + + it('Import content type', done => { + makeContentType().import({ + content_type: path.join(__dirname, '../mock/contentType.json') + }) + .then((response) => { + importCTUid = response.uid + expect(response.uid).to.be.not.equal(null) + done() + }) + .catch(done) + }) + + it('Delete ContentTypes', done => { + makeContentType(importCTUid) + .delete() + .then((contentType) => { + expect(contentType.notice).to.be.equal('Content Type deleted successfully.') + done() + }) + .catch(done) + }) +}) + +function makeContentType (uid = null) { + return client.stack({ api_key: process.env.API_KEY }).contentType(uid) +} diff --git a/test/sanity-check/api/user-test.js b/test/sanity-check/api/user-test.js new file mode 100644 index 00000000..d47bdf73 --- /dev/null +++ b/test/sanity-check/api/user-test.js @@ -0,0 +1,77 @@ +import { expect } from 'chai' +import { describe, it } from 'mocha' +import { contentstackClient } from '../../utility/ContentstackClient' +import { jsonWrite } from '../../utility/fileOperations/readwrite' +import axios from 'axios' +import dotenv from 'dotenv' + +dotenv.config() +var authtoken = '' +var loggedinUserID = '' +var client = contentstackClient() +describe('Contentstack User Session api Test', () => { + it('User login wrong credentials', done => { + contentstackClient().login({ email: process.env.EMAIL, password: process.env.PASSWORD }) + .then((response) => { + done() + }).catch((error) => { + const jsonMessage = JSON.parse(error.message) + const payload = JSON.parse(jsonMessage.request.data) + expect(jsonMessage.status).to.be.equal(422, 'Status code does not match') + expect(jsonMessage.errorMessage).to.not.equal(null, 'Error message not proper') + expect(jsonMessage.errorCode).to.be.equal(104, 'Error code does not match') + expect(payload.user.email).to.be.equal(process.env.EMAIL, 'Email id does not match') + expect(payload.user.password).to.be.equal('contentstack', 'Password does not match') + done() + }) + }) + + it('User Login test', done => { + client.login({ email: process.env.EMAIL, password: process.env.PASSWORD }, { include_orgs: true, include_orgs_roles: true, include_stack_roles: true, include_user_settings: true }).then((response) => { + jsonWrite(response.user, 'loggedinuser.json') + expect(response.notice).to.be.equal('Login Successful.', 'Login success messsage does not match.') + done() + }) + .catch(done) + }) + + it('User logout test', done => { + client.logout() + .then((response) => { + expect(axios.defaults.headers.common.authtoken).to.be.equal(undefined) + expect(response.notice).to.be.equal('You\'ve logged out successfully.') + done() + }) + .catch(done) + }) + + it('User login with credentials', done => { + client.login({ email: process.env.EMAIL, password: process.env.PASSWORD }, { include_orgs: true, include_orgs_roles: true, include_stack_roles: true, include_user_settings: true }).then((response) => { + loggedinUserID = response.user.uid + jsonWrite(response.user, 'loggedinuser.json') + expect(response.notice).to.be.equal('Login Successful.', 'Login success messsage does not match.') + done() + }) + .catch(done) + }) + + it('Get Current user info test', done => { + client.getUser().then((user) => { + authtoken = user.authtoken + expect(user.uid).to.be.equal(loggedinUserID) + done() + }) + .catch(done) + }) + + it('Get user info from authtoken', done => { + contentstackClient(authtoken) + .getUser() + .then((user) => { + expect(user.uid).to.be.equal(loggedinUserID) + expect(true).to.be.equal(true) + done() + }) + .catch(done) + }) +}) diff --git a/test/sanity-check/mock/content-type.js b/test/sanity-check/mock/content-type.js new file mode 100644 index 00000000..2e4a7713 --- /dev/null +++ b/test/sanity-check/mock/content-type.js @@ -0,0 +1,179 @@ +const singlepageCT = { + content_type: + { + options: + { + is_page: true, + singleton: true, + title: 'title', + sub_title: [] + }, + title: 'Single Page', + uid: 'single_page', + schema: [ + { + display_name: 'Title', + uid: 'title', + data_type: 'text', + mandatory: true, + unique: true, + field_metadata: + { + _default: true + } + }, + { + display_name: 'URL', + uid: 'url', + data_type: 'text', + mandatory: true, + field_metadata: { + _default: true, + instruction: '' + } + } + ] + }, + prevcreate: true +} + +const multiPageCT = { + content_type: + { + options: + { + is_page: true, + singleton: false, + title: 'title', + sub_title: [], + url_pattern: '/:title' + }, + title: 'Multi page', + uid: 'multi_page', + schema: + [ + { + display_name: 'Title', + uid: 'title', + data_type: 'text', + mandatory: true, + unique: true, + field_metadata: + { + _default: true + } + }, + { + display_name: 'URL', + uid: 'url', + data_type: 'text', + mandatory: false, + field_metadata: + { + _default: true + } + } + ] + }, + prevcreate: true +} + +const schema = [ + { + display_name: 'Title', + uid: 'title', + data_type: 'text', + mandatory: true, + unique: true, + field_metadata: + { + _default: true, + version: 3 + }, + non_localizable: false, + multiple: false, + fldUid: 'title' + }, + { + display_name: 'URL', + uid: 'url', + data_type: 'text', + mandatory: true, + field_metadata: + { + _default: true, + version: 3 + }, + non_localizable: false, + multiple: false, + unique: false, + fldUid: 'url' + }, + { + data_type: 'text', + display_name: 'Single line textbox', + abstract: 'Name, title, email address, any short text', + uid: 'single_line', + field_metadata: + { + description: '', + default_value: '' + }, + class: 'high-lighter', + format: '', + error_messages: { format: '' }, + fldUid: 'single_line' + }, + { + data_type: 'text', + display_name: 'Multi line textbox', + abstract: 'Descriptions, paragraphs, long text', + uid: 'multi_line', + field_metadata: + { + description: '', + default_value: '', + multiline: true + }, + class: 'high-lighter', + format: '', + error_messages: + { + format: '' + }, + fldUid: 'multi_line' + }, + { + data_type: 'text', + display_name: 'Markdown', + abstract: 'Input text in markdown language', + uid: 'markdown', + field_metadata: + { + description: '', + markdown: true + }, + class: 'high-lighter', + fldUid: 'markdown' + }, + { + data_type: 'blocks', + display_name: 'Modular Blocks', + abstract: 'Create content dynamically', + blocks: + [ + { + title: 'Block1', + uid: 'block1', + blockType: 'custom', + autoEdit: true, + schema: + [ + { data_type: 'file', display_name: 'File', abstract: 'Upload images, videos, docs, etc.', uid: 'file', icon_class: 'icon-file-text-alt', class: 'high-lighter', size: { min: '', max: '' }, extensions: '', field_metadata: { description: '', rich_text_type: 'standard' }, fldUid: 'modular_blocks > block1 > file' }, { data_type: 'link', display_name: 'Link', abstract: 'Add links to text', uid: 'link', icon_class: 'icon-link', class: 'high-lighter', field_metadata: { description: '', default_value: { title: '', url: '' } }, fldUid: 'modular_blocks > block1 > link' }] }], + multiple: true, + uid: 'modular_blocks', + field_metadata: {}, + class: 'high-lighter', + fldUid: 'modular_blocks' }] + +export { singlepageCT, multiPageCT, schema } diff --git a/test/sanity-check/mock/contentType.json b/test/sanity-check/mock/contentType.json new file mode 100644 index 00000000..df456dd6 --- /dev/null +++ b/test/sanity-check/mock/contentType.json @@ -0,0 +1,36 @@ +{ + "options": + { + "is_page": true, + "singleton": false, + "title": "title", + "sub_title": [], + "url_pattern": "/:title" + }, + "title": "Multi page from JSON", + "uid": "multi_page_from_json", + "schema": + [ + { + "display_name": "Title", + "uid": "title", + "data_type": "text", + "mandatory": true, + "unique": true, + "field_metadata": + { + "_default": true + } + }, + { + "display_name": "URL", + "uid": "url", + "data_type": "text", + "mandatory": false, + "field_metadata": + { + "_default": true + } + } + ] + } \ No newline at end of file diff --git a/test/sanity-check/sanity.js b/test/sanity-check/sanity.js new file mode 100644 index 00000000..8faf2378 --- /dev/null +++ b/test/sanity-check/sanity.js @@ -0,0 +1,3 @@ +require('./api/user-test') +require('./api/contentType-test') +require('./api/contentType-delete-test') diff --git a/test/sanity-check/utility/ContentstackClient.js b/test/sanity-check/utility/ContentstackClient.js new file mode 100644 index 00000000..a91c1171 --- /dev/null +++ b/test/sanity-check/utility/ContentstackClient.js @@ -0,0 +1,12 @@ +import * as contentstack from '../../../lib/contentstack.js' +import dotenv from 'dotenv' +dotenv.config() +function contentstackClient (authtoken = null) { + var params = { host: process.env.HOST, defaultHostName: process.env.DEFAULTHOST } + if (authtoken) { + params.authtoken = authtoken + } + return contentstack.client(params) +} + +export { contentstackClient } diff --git a/test/sanity-check/utility/fileOperations/readwrite.js b/test/sanity-check/utility/fileOperations/readwrite.js new file mode 100644 index 00000000..c06fe895 --- /dev/null +++ b/test/sanity-check/utility/fileOperations/readwrite.js @@ -0,0 +1,35 @@ +import fs from 'fs' +import path from 'path' +const dataFiles = './test/utility/dataFiles/' +export function jsonReader (fileName) { + if (!fs.existsSync(`${dataFiles}${fileName}`)) { + return + } + const fileContents = fs.readFileSync(`${dataFiles}${fileName}`, 'utf8') + try { + const object = JSON.parse(fileContents) + return object + } catch (err) { + return err + } +} + +export function jsonWrite (json, fileName) { + const jsonString = JSON.stringify(json) + ensureDirectoryExistence(`${dataFiles}${fileName}`) + fs.writeFileSync(`${dataFiles}${fileName}`, jsonString) +} + +function ensureDirectoryExistence (filePath) { + var dirname = path.dirname(filePath) + if (!fs.existsSync(dirname)) { + ensureDirectoryExistence(dirname) + fs.mkdirSync(dirname) + } +} + +export function writeDownloadedFile (response, fileName) { + const filePath = path.resolve(dataFiles, fileName) + ensureDirectoryExistence(`${dataFiles}${fileName}`) + response.data.pipe(fs.createWriteStream(filePath)) +} From 508aa7abb29defbd1e2d94bc41635b40c3050f9b Mon Sep 17 00:00:00 2001 From: harshithad0703 Date: Mon, 18 Dec 2023 12:41:43 +0530 Subject: [PATCH 06/28] added a script in package.json --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index af403433..d4add9d5 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ "buildnativescript": "webpack --config webpack/webpack.nativescript.js --mode production", "buildweb": "webpack --config webpack/webpack.web.js --mode production", "test": "npm run test:api && npm run test:unit", + "test:sanity": "BABEL_ENV=test nyc --reporter=html --reporter=text mocha --require @babel/register ./test/sanity-check/sanity.js -t 30000 --reporter mochawesome --require babel-polyfill", "test:api": "BABEL_ENV=test nyc --reporter=html --reporter=text mocha --require @babel/register ./test/test.js -t 30000 --reporter mochawesome --require babel-polyfill", "test:unit": "BABEL_ENV=test nyc --reporter=html --reporter=text mocha --require @babel/register ./test/unit/index.js -t 30000 --reporter mochawesome --require babel-polyfill", "test:unit:report:json": "BABEL_ENV=test nyc --reporter=clover --reporter=text mocha --require @babel/register ./test/unit/index.js -t 30000 --reporter json --reporter-options output=report.json --require babel-polyfill", From 211773e69386f832141d53e20bb79b8974478087 Mon Sep 17 00:00:00 2001 From: harshithad0703 Date: Mon, 18 Dec 2023 17:04:26 +0530 Subject: [PATCH 07/28] test: added entries, assets, organization and stack tests in sanity --- test/sanity-check/api/asset-test.js | 217 +++++++++++++++++++++ test/sanity-check/api/entry-test.js | 194 ++++++++++++++++++ test/sanity-check/api/organization-test.js | 108 ++++++++++ test/sanity-check/api/stack-test.js | 158 +++++++++++++++ test/sanity-check/mock/berries.jfif | Bin 0 -> 157612 bytes test/sanity-check/mock/customUpload.html | 28 +++ test/sanity-check/mock/entry.js | 7 + test/sanity-check/mock/entry.json | 1 + test/sanity-check/mock/upload.html | 28 +++ test/sanity-check/sanity.js | 4 + 10 files changed, 745 insertions(+) create mode 100644 test/sanity-check/api/asset-test.js create mode 100644 test/sanity-check/api/entry-test.js create mode 100644 test/sanity-check/api/organization-test.js create mode 100644 test/sanity-check/api/stack-test.js create mode 100644 test/sanity-check/mock/berries.jfif create mode 100644 test/sanity-check/mock/customUpload.html create mode 100644 test/sanity-check/mock/entry.js create mode 100644 test/sanity-check/mock/entry.json create mode 100644 test/sanity-check/mock/upload.html diff --git a/test/sanity-check/api/asset-test.js b/test/sanity-check/api/asset-test.js new file mode 100644 index 00000000..7060b843 --- /dev/null +++ b/test/sanity-check/api/asset-test.js @@ -0,0 +1,217 @@ +import path from 'path' +import { expect } from 'chai' +import { describe, it, setup } from 'mocha' +import { jsonReader, writeDownloadedFile } from '../utility/fileOperations/readwrite' +import { contentstackClient } from '../utility/ContentstackClient.js' + +var client = {} + +var folderUID = '' +var assetUID = '' +var publishAssetUID = '' +var assetURL = '' +describe('Assets api Test', () => { + setup(() => { + const user = jsonReader('loggedinuser.json') + client = contentstackClient(user.authtoken) + }) + + it('Asset Upload ', done => { + const asset = { + upload: path.join(__dirname, '../mock/customUpload.html'), + title: 'customasset', + description: 'Custom Asset Desc', + tags: ['Custom'] + } + makeAsset().create(asset) + .then((asset) => { + assetUID = asset.uid + assetURL = asset.url + expect(asset.uid).to.be.not.equal(null) + expect(asset.url).to.be.not.equal(null) + expect(asset.filename).to.be.equal('customUpload.html') + expect(asset.title).to.be.equal('customasset') + expect(asset.description).to.be.equal('Custom Asset Desc') + expect(asset.content_type).to.be.equal('text/html') + done() + }) + .catch(done) + }) + + it('Download asset from URL.', done => { + makeAsset().download({ url: assetURL, responseType: 'stream' }) + .then((response) => { + writeDownloadedFile(response, 'asset1') + done() + }).catch(done) + }) + it('Download asset from fetch details ', done => { + makeAsset(assetUID).fetch() + .then((asset) => asset.download({ responseType: 'stream' })) + .then((response) => { + writeDownloadedFile(response, 'asset2') + done() + }).catch(done) + }) + + it('Create folder ', done => { + makeAsset().folder().create({ asset: { name: 'Sample Folder' } }) + .then((asset) => { + folderUID = asset.uid + expect(asset.uid).to.be.not.equal(null) + expect(asset.name).to.be.equal('Sample Folder') + expect(asset.is_dir).to.be.equal(true) + done() + }) + .catch(done) + }) + + it('Asset Upload in folder', done => { + const asset = { + upload: path.join(__dirname, '../mock/customUpload.html'), + title: 'customasset in Folder', + description: 'Custom Asset Desc in Folder', + parent_uid: folderUID, + tags: 'folder' + } + makeAsset().create(asset) + .then((asset) => { + publishAssetUID = asset.uid + expect(asset.uid).to.be.not.equal(null) + expect(asset.url).to.be.not.equal(null) + expect(asset.filename).to.be.equal('customUpload.html') + expect(asset.title).to.be.equal('customasset in Folder') + expect(asset.description).to.be.equal('Custom Asset Desc in Folder') + expect(asset.content_type).to.be.equal('text/html') + expect(asset.parent_uid).to.be.equal(folderUID) + done() + }) + .catch(done) + }) + + it('Asset Upload in folder with contenttype', done => { + const asset = { + upload: path.join(__dirname, '../mock/berries.jfif'), + title: 'customasset2 in Folder', + description: 'Custom Asset Desc in Folder', + parent_uid: folderUID, + tags: 'folder', + content_type: 'image/jpeg' + } + makeAsset().create(asset) + .then((asset) => { + publishAssetUID = asset.uid + expect(asset.uid).to.be.not.equal(null) + expect(asset.url).to.be.not.equal(null) + expect(asset.filename).to.be.equal('berries.jfif') + expect(asset.title).to.be.equal('customasset2 in Folder') + expect(asset.description).to.be.equal('Custom Asset Desc in Folder') + expect(asset.content_type).to.be.equal('image/jpeg') + expect(asset.parent_uid).to.be.equal(folderUID) + done() + }) + .catch(done) + }) + it('Replace asset ', done => { + const asset = { + upload: path.join(__dirname, '../mock/upload.html') + } + makeAsset(assetUID) + .replace(asset) + .then((asset) => { + expect(asset.uid).to.be.equal(assetUID) + expect(asset.filename).to.be.equal('upload.html') + expect(asset.content_type).to.be.equal('text/html') + done() + }) + .catch(done) + }) + + it('Fetch and Update asset details', done => { + makeAsset(assetUID) + .fetch() + .then((asset) => { + asset.title = 'Update title' + asset.description = 'Update description' + delete asset.ACL + return asset.update() + }) + .then((asset) => { + expect(asset.uid).to.be.equal(assetUID) + expect(asset.title).to.be.equal('Update title') + expect(asset.description).to.be.equal('Update description') + done() + }) + .catch(done) + }) + + it('Publish Asset', done => { + makeAsset(publishAssetUID) + .publish({ publishDetails: { + locales: ['hi-in', 'en-us'], + environments: ['development'] + } }) + .then((data) => { + expect(data.notice).to.be.equal('Asset sent for publishing.') + done() + }) + .catch(done) + }) + + it('Unpublish Asset', done => { + makeAsset(publishAssetUID) + .unpublish({ publishDetails: { + locales: ['hi-in', 'en-us'], + environments: ['development'] + } }) + .then((data) => { + expect(data.notice).to.be.equal('Asset sent for unpublishing.') + done() + }) + .catch(done) + }) + + it('Delete asset', done => { + makeAsset(assetUID) + .delete() + .then((data) => { + expect(data.notice).to.be.equal('Asset deleted successfully.') + done() + }) + .catch(done) + }) + + it('Query to fetch all asset', done => { + makeAsset() + .query() + .find() + .then((collection) => { + collection.items.forEach((asset) => { + expect(asset.uid).to.be.not.equal(null) + expect(asset.title).to.be.not.equal(null) + expect(asset.description).to.be.not.equal(null) + }) + done() + }) + .catch(done) + }) + + it('Query to fetch title match asset', done => { + makeAsset() + .query({ query: { title: 'Update title' } }) + .find() + .then((collection) => { + collection.items.forEach((asset) => { + expect(asset.uid).to.be.not.equal(null) + expect(asset.title).to.be.equal('Update title') + expect(asset.description).to.be.equal('Update description') + }) + done() + }) + .catch(done) + }) +}) + +function makeAsset (uid = null) { + return client.stack({ api_key: process.env.API_KEY }).asset(uid) +} diff --git a/test/sanity-check/api/entry-test.js b/test/sanity-check/api/entry-test.js new file mode 100644 index 00000000..f6fed3c6 --- /dev/null +++ b/test/sanity-check/api/entry-test.js @@ -0,0 +1,194 @@ +import path from 'path' +import { expect } from 'chai' +import { describe, it, setup } from 'mocha' +import { jsonReader, jsonWrite } from '../utility/fileOperations/readwrite' +import { multiPageCT, singlepageCT } from '../mock/content-type.js' +import { entryFirst, entrySecond, entryThird } from '../mock/entry.js' +import { contentstackClient } from '../utility/ContentstackClient.js' + +var client = {} + +var entryUTD = '' +describe('Entry api Test', () => { + setup(() => { + const user = jsonReader('loggedinuser.json') + client = contentstackClient(user.authtoken) + }) + + it('Create Entry in Single ', done => { + var entry = { + title: 'Sample Entry', + url: 'sampleEntry' + } + makeEntry(singlepageCT.content_type.uid) + .create({ entry }) + .then((entryResponse) => { + entryUTD = entryResponse.uid + expect(entryResponse.title).to.be.equal(entry.title) + expect(entryResponse.url).to.be.equal(entry.url) + expect(entryResponse.uid).to.be.not.equal(null) + done() + }) + .catch(done) + }) + it('Entry fetch with Content Type', done => { + makeEntry(singlepageCT.content_type.uid, entryUTD) + .fetch({ include_content_type: true }) + .then((entryResponse) => { + expect(entryResponse.uid).to.be.not.equal(null) + expect(entryResponse.content_type).to.be.not.equal(null) + done() + }) + .catch(done) + }) + + it('Localize entry with title update', done => { + makeEntry(singlepageCT.content_type.uid, entryUTD) + .fetch() + .then((entry) => { + entry.title = 'Sample Entry in en-at' + return entry.update({ locale: 'en-at' }) + }) + .then((entryResponse) => { + entryUTD = entryResponse.uid + expect(entryResponse.title).to.be.equal('Sample Entry in en-at') + expect(entryResponse.uid).to.be.not.equal(null) + expect(entryResponse.locale).to.be.equal('en-at') + done() + }) + .catch(done) + }) + + it('Create Entries for Multiple page', done => { + makeEntry(multiPageCT.content_type.uid) + .create({ entry: entryFirst }) + .then((entry) => { + expect(entry.uid).to.be.not.equal(null) + expect(entry.title).to.be.equal(entryFirst.title) + expect(entry.single_line).to.be.equal(entryFirst.single_line) + expect(entry.url).to.be.equal(`/${entryFirst.title.toLowerCase().replace(/ /g, '-')}`) + expect(entry.multi_line).to.be.equal(entryFirst.multi_line) + expect(entry.markdown).to.be.equal(entryFirst.markdown) + done() + }) + .catch(done) + }) + + it('Create Entries 2 for Multiple page', done => { + makeEntry(multiPageCT.content_type.uid) + .create({ entry: entrySecond }) + .then((entry) => { + expect(entry.uid).to.be.not.equal(null) + expect(entry.title).to.be.equal(entrySecond.title) + expect(entry.url).to.be.equal(`/${entrySecond.title.toLowerCase().replace(/ /g, '-')}`) + expect(entry.single_line).to.be.equal(entrySecond.single_line) + expect(entry.multi_line).to.be.equal(entrySecond.multi_line) + expect(entry.markdown).to.be.equal(entrySecond.markdown) + expect(entry.tags[0]).to.be.equal(entrySecond.tags[0]) + done() + }) + .catch(done) + }) + + it('Create Entries 3 for Multiple page', done => { + makeEntry(multiPageCT.content_type.uid) + .create({ entry: entryThird }) + .then((entry) => { + expect(entry.uid).to.be.not.equal(null) + expect(entry.title).to.be.equal(entryThird.title) + expect(entry.url).to.be.equal(`/${entryThird.title.toLowerCase().replace(/ /g, '-')}`) + expect(entry.single_line).to.be.equal(entryThird.single_line) + expect(entry.multi_line).to.be.equal(entryThird.multi_line) + expect(entry.markdown).to.be.equal(entryThird.markdown) + expect(entry.tags[0]).to.be.equal(entryThird.tags[0]) + done() + }) + .catch(done) + }) + + it('Get all Entry', done => { + makeEntry(multiPageCT.content_type.uid) + .query({ include_count: true, include_content_type: true }).find() + .then((collection) => { + jsonWrite(collection.items, 'entry.json') + expect(collection.count).to.be.equal(3) + collection.items.forEach((entry) => { + expect(entry.uid).to.be.not.equal(null) + expect(entry.content_type_uid).to.be.equal(multiPageCT.content_type.uid) + }) + done() + }) + .catch(done) + }) + + it('Get all Entry from tag', done => { + makeEntry(multiPageCT.content_type.uid) + .query({ include_count: true, query: { tags: entrySecond.tags[0] } }).find() + .then((collection) => { + expect(collection.count).to.be.equal(1) + collection.items.forEach((entry) => { + expect(entry.uid).to.be.not.equal(null) + expect(entry.tags).to.have.all.keys(0) + }) + done() + }) + .catch(done) + }) + + it('Publish Entry', done => { + makeEntry(singlepageCT.content_type.uid, entryUTD) + .publish({ publishDetails: { + locales: ['en-us'], + environments: ['development'] + } }) + .then((data) => { + expect(data.notice).to.be.equal('The requested action has been performed.') + done() + }) + .catch(done) + }) + + it('Publish localized Entry to locales', done => { + makeEntry(singlepageCT.content_type.uid, entryUTD) + .publish({ publishDetails: { + locales: ['hi-in', 'en-at'], + environments: ['development'] + }, + locale: 'en-at' }) + .then((data) => { + expect(data.notice).to.be.equal('The requested action has been performed.') + done() + }) + .catch(done) + }) + + it('Unpublish localized entry', done => { + makeEntry(singlepageCT.content_type.uid, entryUTD) + .unpublish({ publishDetails: { + locales: ['hi-in', 'en-at'], + environments: ['development'] + }, + locale: 'en-at' }) + .then((data) => { + expect(data.notice).to.be.equal('The requested action has been performed.') + done() + }) + .catch(done) + }) + + it('Import Entry', done => { + makeEntry(multiPageCT.content_type.uid) + .import({ + entry: path.join(__dirname, '../mock/entry.json') + }) + .then((response) => { + expect(response.uid).to.be.not.equal(null) + done() + }) + .catch(done) + }) +}) + +function makeEntry (contentType, uid = null) { + return client.stack({ api_key: process.env.API_KEY }).contentType(contentType).entry(uid) +} diff --git a/test/sanity-check/api/organization-test.js b/test/sanity-check/api/organization-test.js new file mode 100644 index 00000000..460bad07 --- /dev/null +++ b/test/sanity-check/api/organization-test.js @@ -0,0 +1,108 @@ +import { expect } from 'chai' +import { describe, it, setup } from 'mocha' +import { jsonReader } from '../utility/fileOperations/readwrite' +import { contentstackClient } from '../utility/ContentstackClient' + +var user = {} +var client = {} +var organization = {} + +describe('Organization api test', () => { + setup(() => { + user = jsonReader('loggedinuser.json') + client = contentstackClient(user.authtoken) + }) + + it('Fetch all organizations', done => { + client.organization().fetchAll() + .then((response) => { + for (const index in response.items) { + const organizations = response.items[index] + expect(organizations.name).to.not.equal(null, 'Organization name cannot be null') + expect(organizations.uid).to.not.equal(null, 'Organization uid cannot be null') + } + done() + }) + .catch(done) + }) + + it('Get Current user info test', done => { + client.getUser({ include_orgs: true, include_orgs_roles: true, include_stack_roles: true, include_user_settings: true }).then((user) => { + for (const index in user.organizations) { + const organizations = user.organizations[index] + if (organizations.org_roles && (organizations.org_roles.filter(function (role) { return role.admin === true }).length > 0)) { + organization = organizations + break + } + } + done() + }) + .catch(done) + }) + + it('Fetch organization', done => { + organization.fetch() + .then((organizations) => { + expect(organizations.name).to.be.equal('CLI Dev and Automation', 'Organization name dose not match') + done() + }) + .catch(done) + }) + + it('Get all stacks in an Organization', done => { + organization.stacks() + .then((response) => { + for (const index in response.items) { + const stack = response.items[index] + expect(stack.name).to.not.equal(null, 'Organization name cannot be null') + expect(stack.uid).to.not.equal(null, 'Organization uid cannot be null') + } + done() + }) + .catch(done) + }) + // need to test with transfer ownership + it.skip('Transfer Organization Ownership', done => { + organization.transferOwnership('em@em.com') + .then((data) => { + expect(data.notice).to.be.equal('Email has been successfully sent to the user.', 'Message does not match') + done() + }) + .catch((error) => { + console.log(error) + expect(error).to.be.equal(null, 'Failed Transfer Organization Ownership') + done() + }) + }) + + it('Get all roles in an organization', done => { + organization.roles() + .then((roles) => { + for (const i in roles.items) { + expect(roles.items[i].uid).to.not.equal(null, 'Role uid cannot be null') + expect(roles.items[i].name).to.not.equal(null, 'Role name cannot be null') + expect(roles.items[i].org_uid).to.be.equal(organization.uid, 'Role org_uid not match') + } + done() + }) + .catch(done) + }) + + it('Get all invitations in an organization', done => { + organization.getInvitations({ include_count: true }) + .then((response) => { + expect(response.count).to.not.equal(null, 'Failed Transfer Organization Ownership') + for (const i in response.items) { + expect(response.items[i].uid).to.not.equal(null, 'User uid cannot be null') + expect(response.items[i].email).to.not.equal(null, 'User name cannot be null') + expect(response.items[i].user_uid).to.not.equal(null, 'User name cannot be null') + expect(response.items[i].org_uid).to.not.equal(null, 'User name cannot be null') + } + done() + }) + .catch(done) + }) + + // addUser + // Resend invitation +}) diff --git a/test/sanity-check/api/stack-test.js b/test/sanity-check/api/stack-test.js new file mode 100644 index 00000000..7f1f4b93 --- /dev/null +++ b/test/sanity-check/api/stack-test.js @@ -0,0 +1,158 @@ +import { expect } from 'chai' +import { describe, it, setup } from 'mocha' +import { jsonReader, jsonWrite } from '../utility/fileOperations/readwrite' +import { contentstackClient } from '../utility/ContentstackClient.js' +import dotenv from 'dotenv' +dotenv.config() + +var orgID = process.env.ORGANIZATION +var user = {} +var client = {} + +var stacks = {} +describe('Stack api Test', () => { + setup(() => { + user = jsonReader('loggedinuser.json') + client = contentstackClient(user.authtoken) + }) + const newStack = { + stack: + { + name: 'My New Stack', + description: 'My new test stack', + master_locale: 'en-us' + } + } + + it('Create Stack', done => { + client.stack() + .create(newStack, { organization_uid: orgID }) + .then((stack) => { + jsonWrite(stack, 'stack.json') + expect(stack.org_uid).to.be.equal(orgID) + expect(stack.api_key).to.not.equal(null) + expect(stack.name).to.be.equal(newStack.stack.name) + expect(stack.description).to.be.equal(newStack.stack.description) + done() + stacks = jsonReader('stack.json') + }) + .catch(done) + }) + + it('Fetch Stack details', done => { + client.stack({ api_key: stacks.api_key }) + .fetch() + .then((stack) => { + expect(stack.org_uid).to.be.equal(orgID) + expect(stack.api_key).to.not.equal(null) + expect(stack.name).to.be.equal(newStack.stack.name) + expect(stack.description).to.be.equal(newStack.stack.description) + done() + }) + .catch(done) + }) + + it('Update Stack details', done => { + const name = 'My New Stack Update Name' + const description = 'My New description stack' + client.stack({ api_key: stacks.api_key }) + .fetch().then((stack) => { + stack.name = name + stack.description = description + return stack.update() + }).then((stack) => { + expect(stack.name).to.be.equal(name) + expect(stack.description).to.be.equal(description) + done() + }) + .catch(done) + }) + + it('Get all users of stack', done => { + client.stack({ api_key: stacks.api_key }) + .users() + .then((response) => { + expect(response[0].uid).to.be.not.equal(null) + done() + }) + .catch(done) + }) + + it('Get stack settings', done => { + client.stack({ api_key: stacks.api_key }) + .settings() + .then((response) => { + expect(response.stack_variable).to.be.equal(undefined, 'Stack variable must be blank') + expect(response.discrete_variables.access_token).to.not.equal(null, 'Stack variable must not be blank') + expect(response.discrete_variables.secret_key).to.not.equal(null, 'Stack variable must not be blank') + done() + }) + .catch(done) + }) + + it('Add stack settings', done => { + client.stack({ api_key: stacks.api_key }) + .addSettings({ samplevariable: 'too' }) + .then((response) => { + expect(response.stack_variables.samplevariable).to.be.equal('too', 'samplevariable must set to \'too\' ') + done() + }) + .catch(done) + }) + + it('Reset stack settings', done => { + client.stack({ api_key: stacks.api_key }) + .resetSettings() + .then((response) => { + expect(response.stack_variable).to.be.equal(undefined, 'Stack variable must be blank') + expect(response.discrete_variables.access_token).to.not.equal(null, 'Stack variable must not be blank') + expect(response.discrete_variables.secret_key).to.not.equal(null, 'Stack variable must not be blank') + done() + }) + .catch(done) + }) + + it('Get all stack', done => { + client.stack() + .query() + .find() + .then((response) => { + for (const index in response.items) { + const stack = response.items[index] + expect(stack.name).to.not.equal(null) + expect(stack.uid).to.not.equal(null) + expect(stack.owner_uid).to.not.equal(null) + } + done() + }) + .catch(done) + }) + + it('Get query stack', done => { + client.stack() + .query({ query: { name: 'My New Stack Update Name' } }) + .find() + .then((response) => { + expect(response.items.length).to.be.equal(1) + for (const index in response.items) { + const stack = response.items[index] + expect(stack.name).to.be.equal('My New Stack Update Name') + } + done() + }) + .catch(done) + }) + + it('Find one stack', done => { + client.stack() + .query({ query: { name: 'My New Stack Update Name' } }) + .findOne() + .then((response) => { + const stack = response.items[0] + expect(response.items.length).to.be.equal(1) + expect(stack.name).to.be.equal('My New Stack Update Name') + done() + }) + .catch(done) + }) +}) diff --git a/test/sanity-check/mock/berries.jfif b/test/sanity-check/mock/berries.jfif new file mode 100644 index 0000000000000000000000000000000000000000..f0e4c1a081af3596ede3396ea0a75ee224de7ebb GIT binary patch literal 157612 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

0CJRXoE*7Wz8TA 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
&A7Y&Jwzh(uZ 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 z zJEV~q`f?c4qgE*oYo#-@b4fYHrD2lsX~w^M2tDw*}1V?`BzNK}jyS%0%dldj#JksFOO1}cHgocr((`K>{ z9IsQ*W7!Kyz~_vG=5*}eJ4g3k$EUN?fu^VdU|Pv`X*Z)k?N+zp5e!$qE6zt@oz3t< zZ>>)0`h$ho9_c^`A1`!BSk)rno=CglOK4}f=PIC@0P*2Sux~yTnim)t$JIlHf(~y4 zC?>f1a;v_-?EodJi<9*WG2petEvd+JD0blYSz3SrG#0RCb3**5dVD+N0=Y?#m+G~8 zSf_){WmLK*J)VLMx@|DJvM!c>v#D*c+OFc&I)<#Y7LF>p;bO@0_kXpFV`k0KsioH$ zB%*uyTaduXM&}yESYApN5Nu$rT|Tw!XlW#ojFhJb+BL_KJxCu?i)4q>x(CW$8Qj4} z)9+`mWR7{Xj8EMhS~j)U!t|egJBwzB8y9Rm zu6&hxI-uVX%{1_a3n118GK1D4`_7G`HUL4kp5b3kbaFAQ5)0;zDPL8mF+}H?1DH9_ z0cJb1v|U8&`W~UK1J;GRT+oQ^dvsa|^zDqvBy0|IMla|7mU|+Pr$_gVHM~#wo=F#9 z%j|{LTpA+O>Bud34q-jK{{V%gWAK9>Y9yivHq-t2MP^oBX7xPI#&m6alsTt zoT9nye8yH-{{YFSvR_e$fxzRNTO^Kl+w8MlBMq8x9E8Mj)4m=Kaxi~>$#*)KN#lzL zAzm!UL{$u%u$d;mM>i&@65!()urE3N@Q0z*ecPx$>Q9b>UFWVB<|esMV@U)8d}Cr(=;0$5f6~t-)HEN=~D>xbIkTOKqJ{lJpTS+XluH# z)V0ifk~Qsj;U@$oI$n$kWSPSN*vBXL;V>^00J-u^TE-Fp1mynx)1P>kS0iKDvL;}c z9FLdPRI#obrM%=c9)0qu3jve~rfXu1SaX5+zjmagHyp0HWSxPnt)j+nj_2#)c@MOY zt#evzmbWhcQ+dMnZ;UXE#O#6#hr~y>`^xb@XhUb~5{TVQZ^9c!oBJq_W{G@Rj^|z$ zzuBnVHSW|H_eC2^T>Gu0@UuSX<8YP>5(maxu$_(v0mldH{!;r!NV*v`cvX2O_PU1xxhtBEiy4`&h#k!oO4(tApD=8GG)h^D;QB_fjy&0FI5g&N=yWapeF^xb1oC-B4! za5x~0A!?r1vB8aN3Fd*tDCiQ0^)dtY0tn-jku8UV?Ev-N9;^uK;cJ6?UjygHct}Yt zeWcR75wywpiO+PmT+uk{Jy`PRd_tYb`XO}9Y;$@dM#mHM_mkXbKfdbHv}b#=f1O-6yuvIhsUIR$+g#8K>{^7mJJ3r=VuoF3Gu zmQOjtioU@`*I=y}-fIbg%#6Iy?aFF6+Q#H$vU z$5pB>d#`yUpPJLr$Fo+@);Do!(;SIj9Kr<-MUU^5>Nm0$OX@HN zIxWNk2qa_t6^Q1R4KZ<_PRs?_R4$XgTYoAHMekl!Dl=Anuz%>Ce7&FzW1 zvJGGF2~Mc!8U4T2>%6&1>5vWZA>m0m5Or z&2+3DgbsTSZb896^rQYpIKg0R0T~1iLYMVe<#y2}0f1|QP-V6my*2YwXPuDQ&!m14 z`}S3XqrlfZNh6*Q4i3RwC1b&Ocm}~D%@j9k#8Nu!UT*9gKyRYsrRiBU010kLe*}Nh zq}?}8*($?H;?F<7bs8;6cA|-Mnr~~IGx93ZO(P^QJ|;bbAQ5-_;RNgv>1=oe7La%X zvV|sw2tjdi1Rsb2ma1wdgxrvBjpvXu2h1z!G_p%A%WouLrczJXGZa$EQSKX!2G#

ap&SIRwz@-gIt|HaD@h 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%0Dkg2ipNI|h( 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 literal 0 HcmV?d00001 diff --git a/test/sanity-check/mock/customUpload.html b/test/sanity-check/mock/customUpload.html new file mode 100644 index 00000000..cfeb9844 --- /dev/null +++ b/test/sanity-check/mock/customUpload.html @@ -0,0 +1,28 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/test/sanity-check/mock/entry.js b/test/sanity-check/mock/entry.js new file mode 100644 index 00000000..16249e58 --- /dev/null +++ b/test/sanity-check/mock/entry.js @@ -0,0 +1,7 @@ +const entryFirst = { title: 'First page', url: '', single_line: 'First Single Line', multi_line: 'First Multi line', markdown: 'Mark Down list\n 1. List item\n 2. List item 2', modular_blocks: [], tags: [] } + +const entrySecond = { title: 'Second page', url: '', single_line: 'Second Single Line', multi_line: 'Second Multi line', markdown: 'Mark Down list\n 1. List item\n 2. List item 2', modular_blocks: [], tags: ['second'] } + +const entryThird = { title: 'Third page', url: '', single_line: 'Third Single Line', multi_line: 'Third Multi line', markdown: 'Mark Down list\n 1. List item\n 2. List item 2', modular_blocks: [], tags: ['third'] } + +export { entryFirst, entrySecond, entryThird } diff --git a/test/sanity-check/mock/entry.json b/test/sanity-check/mock/entry.json new file mode 100644 index 00000000..60515666 --- /dev/null +++ b/test/sanity-check/mock/entry.json @@ -0,0 +1 @@ +{ "title": "First page json", "url": "", "single_line": "First Single Line", "multi_line": "First Multi line", "markdown": "Mark Down list\n 1. List item\n 2. List item 2", "modular_blocks": [], "tags": [] } \ No newline at end of file diff --git a/test/sanity-check/mock/upload.html b/test/sanity-check/mock/upload.html new file mode 100644 index 00000000..cfeb9844 --- /dev/null +++ b/test/sanity-check/mock/upload.html @@ -0,0 +1,28 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/test/sanity-check/sanity.js b/test/sanity-check/sanity.js index 8faf2378..26273528 100644 --- a/test/sanity-check/sanity.js +++ b/test/sanity-check/sanity.js @@ -1,3 +1,7 @@ require('./api/user-test') +require('./api/organization-test') +require('./api/stack-test') require('./api/contentType-test') +require('./api/asset-test') +require('./api/entry-test') require('./api/contentType-delete-test') From ce0e53b6a81b4ffe9f055da09d2862615946185b Mon Sep 17 00:00:00 2001 From: harshithad0703 Date: Mon, 18 Dec 2023 17:40:53 +0530 Subject: [PATCH 08/28] changed the decription for it in testcases --- test/sanity-check/api/asset-test.js | 26 +++++++++---------- .../api/contentType-delete-test.js | 2 +- test/sanity-check/api/contentType-test.js | 16 ++++++------ test/sanity-check/api/entry-test.js | 24 ++++++++--------- test/sanity-check/api/organization-test.js | 14 +++++----- test/sanity-check/api/stack-test.js | 20 +++++++------- test/sanity-check/api/user-test.js | 12 ++++----- 7 files changed, 57 insertions(+), 57 deletions(-) diff --git a/test/sanity-check/api/asset-test.js b/test/sanity-check/api/asset-test.js index 7060b843..70d7fbe0 100644 --- a/test/sanity-check/api/asset-test.js +++ b/test/sanity-check/api/asset-test.js @@ -16,7 +16,7 @@ describe('Assets api Test', () => { client = contentstackClient(user.authtoken) }) - it('Asset Upload ', done => { + it('should asset Upload ', done => { const asset = { upload: path.join(__dirname, '../mock/customUpload.html'), title: 'customasset', @@ -38,14 +38,14 @@ describe('Assets api Test', () => { .catch(done) }) - it('Download asset from URL.', done => { + it('should download asset from URL.', done => { makeAsset().download({ url: assetURL, responseType: 'stream' }) .then((response) => { writeDownloadedFile(response, 'asset1') done() }).catch(done) }) - it('Download asset from fetch details ', done => { + it('should download asset from fetch details ', done => { makeAsset(assetUID).fetch() .then((asset) => asset.download({ responseType: 'stream' })) .then((response) => { @@ -54,7 +54,7 @@ describe('Assets api Test', () => { }).catch(done) }) - it('Create folder ', done => { + it('should create folder ', done => { makeAsset().folder().create({ asset: { name: 'Sample Folder' } }) .then((asset) => { folderUID = asset.uid @@ -66,7 +66,7 @@ describe('Assets api Test', () => { .catch(done) }) - it('Asset Upload in folder', done => { + it('should asset Upload in folder', done => { const asset = { upload: path.join(__dirname, '../mock/customUpload.html'), title: 'customasset in Folder', @@ -89,7 +89,7 @@ describe('Assets api Test', () => { .catch(done) }) - it('Asset Upload in folder with contenttype', done => { + it('should asset Upload in folder with contenttype', done => { const asset = { upload: path.join(__dirname, '../mock/berries.jfif'), title: 'customasset2 in Folder', @@ -112,7 +112,7 @@ describe('Assets api Test', () => { }) .catch(done) }) - it('Replace asset ', done => { + it('should replace asset ', done => { const asset = { upload: path.join(__dirname, '../mock/upload.html') } @@ -127,7 +127,7 @@ describe('Assets api Test', () => { .catch(done) }) - it('Fetch and Update asset details', done => { + it('should fetch and Update asset details', done => { makeAsset(assetUID) .fetch() .then((asset) => { @@ -145,7 +145,7 @@ describe('Assets api Test', () => { .catch(done) }) - it('Publish Asset', done => { + it('should publish Asset', done => { makeAsset(publishAssetUID) .publish({ publishDetails: { locales: ['hi-in', 'en-us'], @@ -158,7 +158,7 @@ describe('Assets api Test', () => { .catch(done) }) - it('Unpublish Asset', done => { + it('should unpublish Asset', done => { makeAsset(publishAssetUID) .unpublish({ publishDetails: { locales: ['hi-in', 'en-us'], @@ -171,7 +171,7 @@ describe('Assets api Test', () => { .catch(done) }) - it('Delete asset', done => { + it('should delete asset', done => { makeAsset(assetUID) .delete() .then((data) => { @@ -181,7 +181,7 @@ describe('Assets api Test', () => { .catch(done) }) - it('Query to fetch all asset', done => { + it('should query to fetch all asset', done => { makeAsset() .query() .find() @@ -196,7 +196,7 @@ describe('Assets api Test', () => { .catch(done) }) - it('Query to fetch title match asset', done => { + it('should query to fetch title match asset', done => { makeAsset() .query({ query: { title: 'Update title' } }) .find() diff --git a/test/sanity-check/api/contentType-delete-test.js b/test/sanity-check/api/contentType-delete-test.js index e50722c5..148a48ce 100644 --- a/test/sanity-check/api/contentType-delete-test.js +++ b/test/sanity-check/api/contentType-delete-test.js @@ -12,7 +12,7 @@ describe('Content Type delete api Test', () => { client = contentstackClient(user.authtoken) }) - it('Content Type delete', done => { + it('should content Type delete', done => { makeContentType(multiPageCT.content_type.uid) .delete().then((data) => { expect(data.notice).to.be.equal('Content Type deleted successfully.') diff --git a/test/sanity-check/api/contentType-test.js b/test/sanity-check/api/contentType-test.js index 49b09e7f..fbb99a0a 100644 --- a/test/sanity-check/api/contentType-test.js +++ b/test/sanity-check/api/contentType-test.js @@ -15,7 +15,7 @@ describe('Content Type api Test', () => { client = contentstackClient(user.authtoken) }) - it('Create Single page ContentType Schema', done => { + it('should create Single page ContentType Schema', done => { makeContentType() .create(singlepageCT) .then((contentType) => { @@ -26,7 +26,7 @@ describe('Content Type api Test', () => { .catch(done) }) - it('Create Multi page ContentType Schema', done => { + it('should create Multi page ContentType Schema', done => { makeContentType() .create(multiPageCT) .then((contentType) => { @@ -38,7 +38,7 @@ describe('Content Type api Test', () => { .catch(done) }) - it('Get all ContentType', done => { + it('should get all ContentType', done => { makeContentType() .query() .find() @@ -53,7 +53,7 @@ describe('Content Type api Test', () => { .catch(done) }) - it('Query ContentType title', done => { + it('should query ContentType title', done => { makeContentType() .query({ query: { title: singlepageCT.content_type.title } }) .find() @@ -70,7 +70,7 @@ describe('Content Type api Test', () => { .catch(done) }) - it('Fetch ContentType from uid', done => { + it('should fetch ContentType from uid', done => { makeContentType(multiPageCT.content_type.uid) .fetch() .then((contentType) => { @@ -81,7 +81,7 @@ describe('Content Type api Test', () => { .catch(done) }) - it('Fetch and Update ContentType schema', done => { + it('should fetch and Update ContentType schema', done => { makeContentType(multiPageCTUid) .fetch() .then((contentType) => { @@ -95,7 +95,7 @@ describe('Content Type api Test', () => { .catch(done) }) - it('Import content type', done => { + it('should import content type', done => { makeContentType().import({ content_type: path.join(__dirname, '../mock/contentType.json') }) @@ -107,7 +107,7 @@ describe('Content Type api Test', () => { .catch(done) }) - it('Delete ContentTypes', done => { + it('should delete ContentTypes', done => { makeContentType(importCTUid) .delete() .then((contentType) => { diff --git a/test/sanity-check/api/entry-test.js b/test/sanity-check/api/entry-test.js index f6fed3c6..fc2f02bd 100644 --- a/test/sanity-check/api/entry-test.js +++ b/test/sanity-check/api/entry-test.js @@ -15,7 +15,7 @@ describe('Entry api Test', () => { client = contentstackClient(user.authtoken) }) - it('Create Entry in Single ', done => { + it('should create Entry in Single ', done => { var entry = { title: 'Sample Entry', url: 'sampleEntry' @@ -31,7 +31,7 @@ describe('Entry api Test', () => { }) .catch(done) }) - it('Entry fetch with Content Type', done => { + it('should entry fetch with Content Type', done => { makeEntry(singlepageCT.content_type.uid, entryUTD) .fetch({ include_content_type: true }) .then((entryResponse) => { @@ -42,7 +42,7 @@ describe('Entry api Test', () => { .catch(done) }) - it('Localize entry with title update', done => { + it('should localize entry with title update', done => { makeEntry(singlepageCT.content_type.uid, entryUTD) .fetch() .then((entry) => { @@ -59,7 +59,7 @@ describe('Entry api Test', () => { .catch(done) }) - it('Create Entries for Multiple page', done => { + it('should create Entries for Multiple page', done => { makeEntry(multiPageCT.content_type.uid) .create({ entry: entryFirst }) .then((entry) => { @@ -74,7 +74,7 @@ describe('Entry api Test', () => { .catch(done) }) - it('Create Entries 2 for Multiple page', done => { + it('should create Entries 2 for Multiple page', done => { makeEntry(multiPageCT.content_type.uid) .create({ entry: entrySecond }) .then((entry) => { @@ -90,7 +90,7 @@ describe('Entry api Test', () => { .catch(done) }) - it('Create Entries 3 for Multiple page', done => { + it('should create Entries 3 for Multiple page', done => { makeEntry(multiPageCT.content_type.uid) .create({ entry: entryThird }) .then((entry) => { @@ -106,7 +106,7 @@ describe('Entry api Test', () => { .catch(done) }) - it('Get all Entry', done => { + it('should get all Entry', done => { makeEntry(multiPageCT.content_type.uid) .query({ include_count: true, include_content_type: true }).find() .then((collection) => { @@ -121,7 +121,7 @@ describe('Entry api Test', () => { .catch(done) }) - it('Get all Entry from tag', done => { + it('should get all Entry from tag', done => { makeEntry(multiPageCT.content_type.uid) .query({ include_count: true, query: { tags: entrySecond.tags[0] } }).find() .then((collection) => { @@ -135,7 +135,7 @@ describe('Entry api Test', () => { .catch(done) }) - it('Publish Entry', done => { + it('should publish Entry', done => { makeEntry(singlepageCT.content_type.uid, entryUTD) .publish({ publishDetails: { locales: ['en-us'], @@ -148,7 +148,7 @@ describe('Entry api Test', () => { .catch(done) }) - it('Publish localized Entry to locales', done => { + it('should publish localized Entry to locales', done => { makeEntry(singlepageCT.content_type.uid, entryUTD) .publish({ publishDetails: { locales: ['hi-in', 'en-at'], @@ -162,7 +162,7 @@ describe('Entry api Test', () => { .catch(done) }) - it('Unpublish localized entry', done => { + it('should unpublish localized entry', done => { makeEntry(singlepageCT.content_type.uid, entryUTD) .unpublish({ publishDetails: { locales: ['hi-in', 'en-at'], @@ -176,7 +176,7 @@ describe('Entry api Test', () => { .catch(done) }) - it('Import Entry', done => { + it('should import Entry', done => { makeEntry(multiPageCT.content_type.uid) .import({ entry: path.join(__dirname, '../mock/entry.json') diff --git a/test/sanity-check/api/organization-test.js b/test/sanity-check/api/organization-test.js index 460bad07..80fac458 100644 --- a/test/sanity-check/api/organization-test.js +++ b/test/sanity-check/api/organization-test.js @@ -13,7 +13,7 @@ describe('Organization api test', () => { client = contentstackClient(user.authtoken) }) - it('Fetch all organizations', done => { + it('should fetch all organizations', done => { client.organization().fetchAll() .then((response) => { for (const index in response.items) { @@ -26,7 +26,7 @@ describe('Organization api test', () => { .catch(done) }) - it('Get Current user info test', done => { + it('should get Current user info test', done => { client.getUser({ include_orgs: true, include_orgs_roles: true, include_stack_roles: true, include_user_settings: true }).then((user) => { for (const index in user.organizations) { const organizations = user.organizations[index] @@ -40,7 +40,7 @@ describe('Organization api test', () => { .catch(done) }) - it('Fetch organization', done => { + it('should fetch organization', done => { organization.fetch() .then((organizations) => { expect(organizations.name).to.be.equal('CLI Dev and Automation', 'Organization name dose not match') @@ -49,7 +49,7 @@ describe('Organization api test', () => { .catch(done) }) - it('Get all stacks in an Organization', done => { + it('should get all stacks in an Organization', done => { organization.stacks() .then((response) => { for (const index in response.items) { @@ -62,7 +62,7 @@ describe('Organization api test', () => { .catch(done) }) // need to test with transfer ownership - it.skip('Transfer Organization Ownership', done => { + it.skip('should transfer Organization Ownership', done => { organization.transferOwnership('em@em.com') .then((data) => { expect(data.notice).to.be.equal('Email has been successfully sent to the user.', 'Message does not match') @@ -75,7 +75,7 @@ describe('Organization api test', () => { }) }) - it('Get all roles in an organization', done => { + it('should get all roles in an organization', done => { organization.roles() .then((roles) => { for (const i in roles.items) { @@ -88,7 +88,7 @@ describe('Organization api test', () => { .catch(done) }) - it('Get all invitations in an organization', done => { + it('should get all invitations in an organization', done => { organization.getInvitations({ include_count: true }) .then((response) => { expect(response.count).to.not.equal(null, 'Failed Transfer Organization Ownership') diff --git a/test/sanity-check/api/stack-test.js b/test/sanity-check/api/stack-test.js index 7f1f4b93..70eb0490 100644 --- a/test/sanity-check/api/stack-test.js +++ b/test/sanity-check/api/stack-test.js @@ -24,7 +24,7 @@ describe('Stack api Test', () => { } } - it('Create Stack', done => { + it('should create Stack', done => { client.stack() .create(newStack, { organization_uid: orgID }) .then((stack) => { @@ -39,7 +39,7 @@ describe('Stack api Test', () => { .catch(done) }) - it('Fetch Stack details', done => { + it('should fetch Stack details', done => { client.stack({ api_key: stacks.api_key }) .fetch() .then((stack) => { @@ -52,7 +52,7 @@ describe('Stack api Test', () => { .catch(done) }) - it('Update Stack details', done => { + it('should update Stack details', done => { const name = 'My New Stack Update Name' const description = 'My New description stack' client.stack({ api_key: stacks.api_key }) @@ -68,7 +68,7 @@ describe('Stack api Test', () => { .catch(done) }) - it('Get all users of stack', done => { + it('should get all users of stack', done => { client.stack({ api_key: stacks.api_key }) .users() .then((response) => { @@ -78,7 +78,7 @@ describe('Stack api Test', () => { .catch(done) }) - it('Get stack settings', done => { + it('should get stack settings', done => { client.stack({ api_key: stacks.api_key }) .settings() .then((response) => { @@ -90,7 +90,7 @@ describe('Stack api Test', () => { .catch(done) }) - it('Add stack settings', done => { + it('should add stack settings', done => { client.stack({ api_key: stacks.api_key }) .addSettings({ samplevariable: 'too' }) .then((response) => { @@ -100,7 +100,7 @@ describe('Stack api Test', () => { .catch(done) }) - it('Reset stack settings', done => { + it('should reset stack settings', done => { client.stack({ api_key: stacks.api_key }) .resetSettings() .then((response) => { @@ -112,7 +112,7 @@ describe('Stack api Test', () => { .catch(done) }) - it('Get all stack', done => { + it('should get all stack', done => { client.stack() .query() .find() @@ -128,7 +128,7 @@ describe('Stack api Test', () => { .catch(done) }) - it('Get query stack', done => { + it('should get query stack', done => { client.stack() .query({ query: { name: 'My New Stack Update Name' } }) .find() @@ -143,7 +143,7 @@ describe('Stack api Test', () => { .catch(done) }) - it('Find one stack', done => { + it('should find one stack', done => { client.stack() .query({ query: { name: 'My New Stack Update Name' } }) .findOne() diff --git a/test/sanity-check/api/user-test.js b/test/sanity-check/api/user-test.js index d47bdf73..aa7e21f2 100644 --- a/test/sanity-check/api/user-test.js +++ b/test/sanity-check/api/user-test.js @@ -10,7 +10,7 @@ var authtoken = '' var loggedinUserID = '' var client = contentstackClient() describe('Contentstack User Session api Test', () => { - it('User login wrong credentials', done => { + it('should check user login with wrong credentials', done => { contentstackClient().login({ email: process.env.EMAIL, password: process.env.PASSWORD }) .then((response) => { done() @@ -26,7 +26,7 @@ describe('Contentstack User Session api Test', () => { }) }) - it('User Login test', done => { + it('should Login user', done => { client.login({ email: process.env.EMAIL, password: process.env.PASSWORD }, { include_orgs: true, include_orgs_roles: true, include_stack_roles: true, include_user_settings: true }).then((response) => { jsonWrite(response.user, 'loggedinuser.json') expect(response.notice).to.be.equal('Login Successful.', 'Login success messsage does not match.') @@ -35,7 +35,7 @@ describe('Contentstack User Session api Test', () => { .catch(done) }) - it('User logout test', done => { + it('should logout user', done => { client.logout() .then((response) => { expect(axios.defaults.headers.common.authtoken).to.be.equal(undefined) @@ -45,7 +45,7 @@ describe('Contentstack User Session api Test', () => { .catch(done) }) - it('User login with credentials', done => { + it('should login with credentials', done => { client.login({ email: process.env.EMAIL, password: process.env.PASSWORD }, { include_orgs: true, include_orgs_roles: true, include_stack_roles: true, include_user_settings: true }).then((response) => { loggedinUserID = response.user.uid jsonWrite(response.user, 'loggedinuser.json') @@ -55,7 +55,7 @@ describe('Contentstack User Session api Test', () => { .catch(done) }) - it('Get Current user info test', done => { + it('should get Current user info test', done => { client.getUser().then((user) => { authtoken = user.authtoken expect(user.uid).to.be.equal(loggedinUserID) @@ -64,7 +64,7 @@ describe('Contentstack User Session api Test', () => { .catch(done) }) - it('Get user info from authtoken', done => { + it('should get user info from authtoken', done => { contentstackClient(authtoken) .getUser() .then((user) => { From d56c5eb8fe433846e921a5846844530509f5013d Mon Sep 17 00:00:00 2001 From: harshithad0703 Date: Wed, 20 Dec 2023 15:35:40 +0530 Subject: [PATCH 09/28] test: added taxonomy and terms tests in sanity folder --- test/sanity-check/api/organization-test.js | 2 +- test/sanity-check/api/taxonomy-test.js | 86 ++++++++++ test/sanity-check/api/terms-test.js | 175 +++++++++++++++++++++ test/sanity-check/sanity.js | 2 + 4 files changed, 264 insertions(+), 1 deletion(-) create mode 100644 test/sanity-check/api/taxonomy-test.js create mode 100644 test/sanity-check/api/terms-test.js diff --git a/test/sanity-check/api/organization-test.js b/test/sanity-check/api/organization-test.js index 80fac458..96ce9852 100644 --- a/test/sanity-check/api/organization-test.js +++ b/test/sanity-check/api/organization-test.js @@ -43,7 +43,7 @@ describe('Organization api test', () => { it('should fetch organization', done => { organization.fetch() .then((organizations) => { - expect(organizations.name).to.be.equal('CLI Dev and Automation', 'Organization name dose not match') + expect(organizations.name).to.be.equal('CLI Branches', 'Organization name dose not match') done() }) .catch(done) diff --git a/test/sanity-check/api/taxonomy-test.js b/test/sanity-check/api/taxonomy-test.js new file mode 100644 index 00000000..3deb99aa --- /dev/null +++ b/test/sanity-check/api/taxonomy-test.js @@ -0,0 +1,86 @@ +import { expect } from 'chai' +import { describe, it, setup } from 'mocha' +import { jsonReader } from '../utility/fileOperations/readwrite' +import { contentstackClient } from '../utility/ContentstackClient.js' + +var client = {} +var stack = {} + +const taxonomy = { + uid: 'taxonomy_testing', + name: 'taxonomy testing', + description: 'Description for Taxonomy testing' +} + +var taxonomyUID = '' + +describe('taxonomy api Test', () => { + setup(() => { + const user = jsonReader('loggedinuser.json') + stack = jsonReader('stack.json') + client = contentstackClient(user.authtoken) + }) + + it('should create taxonomy', done => { + makeTaxonomy() + .create({ taxonomy }) + .then((taxonomyResponse) => { + taxonomyUID = taxonomyResponse.uid + expect(taxonomyResponse.name).to.be.equal(taxonomy.name) + done() + }) + .catch(done) + }) + + it('should fetch taxonomy of the uid passe', done => { + makeTaxonomy(taxonomyUID) + .fetch() + .then((taxonomyResponse) => { + expect(taxonomyResponse.uid).to.be.equal(taxonomyUID) + expect(taxonomyResponse.name).to.be.not.equal(null) + done() + }) + .catch(done) + }) + + it('should update taxonomy of the uid passed', done => { + makeTaxonomy(taxonomyUID) + .fetch() + .then((taxonomyResponse) => { + taxonomyResponse.name = 'Updated Name' + return taxonomyResponse.update() + }) + .then((taxonomyResponse) => { + expect(taxonomyResponse.uid).to.be.equal(taxonomyUID) + expect(taxonomyResponse.name).to.be.equal('Updated Name') + done() + }) + .catch(done) + }) + + it('should get all taxonomies', async () => { + makeTaxonomy() + .query() + .find() + .then((response) => { + response.items.forEach((taxonomyResponse) => { + expect(taxonomyResponse.uid).to.be.not.equal(null) + expect(taxonomyResponse.name).to.be.not.equal(null) + }) + }) + }) + + it('should delete taxonomy from uid', done => { + makeTaxonomy(taxonomyUID) + .delete() + .then((taxonomyResponse) => { + expect(taxonomyResponse.status).to.be.equal(204) + done() + }) + .catch(done) + }) +}) + +function makeTaxonomy (uid = null) { + return client.stack({ api_key: stack.api_key }).taxonomy(uid) +} diff --git a/test/sanity-check/api/terms-test.js b/test/sanity-check/api/terms-test.js new file mode 100644 index 00000000..a25afe3e --- /dev/null +++ b/test/sanity-check/api/terms-test.js @@ -0,0 +1,175 @@ +import { describe, it, beforeEach } from 'mocha' +import { expect } from 'chai' +import { jsonReader } from '../utility/fileOperations/readwrite' +import { contentstackClient } from '../utility/ContentstackClient.js' + +var client = {} + +const taxonomy = { + uid: 'taxonomy_testing', + name: 'taxonomy testing', + description: 'Description for Taxonomy testing' +} +const termString = 'term' +const term = { + term: { + uid: 'term_test', + name: 'Term test', + parent_uid: null + } +} +const childTerm1 = { + term: { + uid: 'term_test_child1', + name: 'Term test1', + parent_uid: 'term_test' + } +} +const childTerm2 = { + term: { + uid: 'term_test_child2', + name: 'Term test2', + parent_uid: 'term_test_child1' + } +} +var termUid = term.term.uid + +describe('Terms API Test', () => { + beforeEach(() => { + const user = jsonReader('loggedinuser.json') + stack = jsonReader('stack.json') + client = contentstackClient(user.authtoken) + }) + it('should create taxonomy', async () => { + await client.stack({ api_key: process.env.API_KEY }).taxonomy().create({ taxonomy }) + }) + + it('should create term', done => { + makeTerms(taxonomy.uid).create(term) + .then((response) => { + expect(response.uid).to.be.equal(term.term.uid) + done() + }) + .catch(done) + }) + + it('should create child term 1', done => { + makeTerms(taxonomy.uid).create(childTerm1) + .then((response) => { + expect(response.uid).to.be.equal(childTerm1.term.uid) + done() + }) + .catch(done) + }) + + it('should create child term 2', done => { + makeTerms(taxonomy.uid).create(childTerm2) + .then((response) => { + expect(response.uid).to.be.equal(childTerm2.term.uid) + done() + }) + .catch(done) + }) + + it('should query and get all terms', done => { + makeTerms(taxonomy.uid).query().find() + .then((response) => { + expect(response.items).to.be.an('array') + expect(response.items[0].uid).not.to.be.equal(null) + expect(response.items[0].name).not.to.be.equal(null) + done() + }) + .catch(done) + }) + + it('should fetch term of the term uid passed', done => { + makeTerms(taxonomy.uid, term.term.uid).fetch() + .then((response) => { + expect(response.uid).to.be.equal(termUid) + expect(response.name).not.to.be.equal(null) + expect(response.created_by).not.to.be.equal(null) + expect(response.updated_by).not.to.be.equal(null) + done() + }) + .catch(done) + }) + + it('should update term of the term uid passed', done => { + makeTerms(taxonomy.uid, termUid).fetch() + .then((term) => { + term.name = 'update name' + return term.update() + }) + .then((response) => { + expect(response.uid).to.be.equal(termUid) + expect(response.name).to.be.equal('update name') + expect(response.created_by).not.to.be.equal(null) + expect(response.updated_by).not.to.be.equal(null) + done() + }) + .catch(done) + }) + + it('should get the ancestors of the term uid passed', done => { + makeTerms(taxonomy.uid, childTerm1.term.uid).ancestors() + .then((response) => { + expect(response.terms[0].uid).not.to.be.equal(null) + expect(response.terms[0].name).not.to.be.equal(null) + expect(response.terms[0].created_by).not.to.be.equal(null) + expect(response.terms[0].updated_by).not.to.be.equal(null) + done() + }) + .catch(done) + }) + + it('should get the descendants of the term uid passed', done => { + makeTerms(taxonomy.uid, childTerm1.term.uid).descendants() + .then((response) => { + expect(response.terms.uid).not.to.be.equal(null) + expect(response.terms.name).not.to.be.equal(null) + expect(response.terms.created_by).not.to.be.equal(null) + expect(response.terms.updated_by).not.to.be.equal(null) + done() + }) + .catch(done) + }) + + it('should search the term with the string passed', done => { + makeTerms(taxonomy.uid).search(termString) + .then((response) => { + expect(response.terms).to.be.an('array') + done() + }) + .catch(done) + }) + + it('should move the term to parent uid passed', done => { + makeTerms(taxonomy.uid, childTerm2.term.uid).move({ force: true }) + .then(async (term) => { + term.parent_uid = null + const moveTerm = await term.move({ force: true }) + expect(moveTerm.parent_uid).to.be.equal(null) + done() + return moveTerm + }) + .catch(done) + }) + + it('should delete of the term uid passed', done => { + makeTerms(taxonomy.uid, term.term.uid).delete({ force: true }) + .then((response) => { + expect(response.status).to.be.equal(204) + done() + }) + .catch(done) + }) + + it('should delete taxonomy', async () => { + const taxonomyResponse = await client.stack({ api_key: process.env.API_KEY }).taxonomy(taxonomy.uid).delete({ force: true }) + expect(taxonomyResponse.status).to.be.equal(204) + }) +}) + +function makeTerms (taxonomyUid, termUid = null) { + return client.stack({ api_key: process.env.API_KEY }).taxonomy(taxonomyUid).terms(termUid) +} diff --git a/test/sanity-check/sanity.js b/test/sanity-check/sanity.js index 26273528..7e3581a6 100644 --- a/test/sanity-check/sanity.js +++ b/test/sanity-check/sanity.js @@ -5,3 +5,5 @@ require('./api/contentType-test') require('./api/asset-test') require('./api/entry-test') require('./api/contentType-delete-test') +require('./api/taxonomy-test') +require('./api/terms-test') From 67f2a62ebd05f3620203e6fc49faeb408add381d Mon Sep 17 00:00:00 2001 From: harshithad0703 Date: Wed, 20 Dec 2023 15:38:34 +0530 Subject: [PATCH 10/28] removed const stack as the api is read from env --- test/sanity-check/api/terms-test.js | 1 - 1 file changed, 1 deletion(-) diff --git a/test/sanity-check/api/terms-test.js b/test/sanity-check/api/terms-test.js index a25afe3e..ee2b83d2 100644 --- a/test/sanity-check/api/terms-test.js +++ b/test/sanity-check/api/terms-test.js @@ -37,7 +37,6 @@ var termUid = term.term.uid describe('Terms API Test', () => { beforeEach(() => { const user = jsonReader('loggedinuser.json') - stack = jsonReader('stack.json') client = contentstackClient(user.authtoken) }) it('should create taxonomy', async () => { From 2f32924413da13c1b16f15d32e92ced944d34e93 Mon Sep 17 00:00:00 2001 From: harshithad0703 Date: Fri, 5 Jan 2024 11:10:08 +0530 Subject: [PATCH 11/28] fix: changed the url in transferOwnership --- lib/organization/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/organization/index.js b/lib/organization/index.js index 725bd65a..98ce0f5a 100644 --- a/lib/organization/index.js +++ b/lib/organization/index.js @@ -102,7 +102,7 @@ export function Organization (http, data) { */ this.transferOwnership = async (email) => { try { - const response = await http.post(`${this.urlPath}/transfer_ownership`, { transfer_to: email }) + const response = await http.post(`${this.urlPath}/transfer-ownership`, { transfer_to: email }) if (response.data) { return response.data } else { From 2e383413bf9214ae530be28be0a7368b5023d0f7 Mon Sep 17 00:00:00 2001 From: harshithad0703 Date: Fri, 5 Jan 2024 11:52:59 +0530 Subject: [PATCH 12/28] test: removed the skipped test case from organization test suit --- test/sanity-check/api/organization-test.js | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/test/sanity-check/api/organization-test.js b/test/sanity-check/api/organization-test.js index 96ce9852..4399384c 100644 --- a/test/sanity-check/api/organization-test.js +++ b/test/sanity-check/api/organization-test.js @@ -61,19 +61,6 @@ describe('Organization api test', () => { }) .catch(done) }) - // need to test with transfer ownership - it.skip('should transfer Organization Ownership', done => { - organization.transferOwnership('em@em.com') - .then((data) => { - expect(data.notice).to.be.equal('Email has been successfully sent to the user.', 'Message does not match') - done() - }) - .catch((error) => { - console.log(error) - expect(error).to.be.equal(null, 'Failed Transfer Organization Ownership') - done() - }) - }) it('should get all roles in an organization', done => { organization.roles() From 258b3a9128c322a63c3c6e2460b8798474f755e9 Mon Sep 17 00:00:00 2001 From: harshithad0703 Date: Fri, 5 Jan 2024 11:54:27 +0530 Subject: [PATCH 13/28] test: added branches and aliases test suits to sanity folder --- test/sanity-check/api/branch-test.js | 220 ++++++++++++++++++++++ test/sanity-check/api/branchAlias-test.js | 85 +++++++++ test/sanity-check/api/taxonomy-test.js | 4 +- test/sanity-check/mock/branch.js | 20 ++ test/sanity-check/sanity.js | 2 + 5 files changed, 328 insertions(+), 3 deletions(-) create mode 100644 test/sanity-check/api/branch-test.js create mode 100644 test/sanity-check/api/branchAlias-test.js create mode 100644 test/sanity-check/mock/branch.js diff --git a/test/sanity-check/api/branch-test.js b/test/sanity-check/api/branch-test.js new file mode 100644 index 00000000..3f3759a3 --- /dev/null +++ b/test/sanity-check/api/branch-test.js @@ -0,0 +1,220 @@ +import { expect } from 'chai' +import { describe, it, setup } from 'mocha' +import { jsonReader } from '../utility/fileOperations/readwrite' +import { contentstackClient } from '../utility/ContentstackClient.js' +import { branch, stageBranch, devBranch } from '../mock/branch.js' + +var client = {} +var mergeJobUid = '' +describe('Branch api Test', () => { + setup(() => { + const user = jsonReader('loggedinuser.json') + client = contentstackClient(user.authtoken) + }) + + it('should return master branch when query is called', done => { + makeBranch() + .query() + .find() + .then((response) => { + expect(response.items.length).to.be.equal(1) + var item = response.items[0] + expect(item.urlPath).to.be.equal(`/stacks/branches/${item.uid}`) + expect(item.delete).to.not.equal(undefined) + expect(item.fetch).to.not.equal(undefined) + done() + }) + .catch(done) + }) + + it('should create staging branch', done => { + makeBranch() + .create({ branch: stageBranch }) + .then((response) => { + expect(response.uid).to.be.equal(stageBranch.uid) + expect(response.urlPath).to.be.equal(`/stacks/branches/${stageBranch.uid}`) + expect(response.source).to.be.equal(stageBranch.source) + expect(response.alias).to.not.equal(undefined) + expect(response.delete).to.not.equal(undefined) + expect(response.fetch).to.not.equal(undefined) + done() + }) + .catch(done) + }) + + it('should fetch stage branch from branch uid', done => { + makeBranch(branch.uid) + .fetch() + .then((response) => { + expect(response.uid).to.be.equal(branch.uid) + expect(response.urlPath).to.be.equal(`/stacks/branches/${branch.uid}`) + expect(response.source).to.be.equal(branch.source) + expect(response.alias).to.not.equal(undefined) + expect(response.delete).to.not.equal(undefined) + expect(response.fetch).to.not.equal(undefined) + done() + }) + .catch(done) + }) + + it('should create Branch from staging', done => { + makeBranch() + .create({ branch: devBranch }) + .then((response) => { + expect(response.uid).to.be.equal(devBranch.uid) + expect(response.urlPath).to.be.equal(`/stacks/branches/${devBranch.uid}`) + expect(response.source).to.be.equal(devBranch.source) + expect(response.alias).to.not.equal(undefined) + expect(response.delete).to.not.equal(undefined) + expect(response.fetch).to.not.equal(undefined) + done() + }) + .catch(done) + }) + + it('should query branch for specific condition', done => { + makeBranch() + .query({ query: { source: 'main' } }) + .find() + .then((response) => { + expect(response.items.length).to.be.equal(1) + response.items.forEach(item => { + expect(item.urlPath).to.be.equal(`/stacks/branches/${item.uid}`) + expect(item.source).to.be.equal(`main`) + expect(item.delete).to.not.equal(undefined) + expect(item.fetch).to.not.equal(undefined) + }) + done() + }) + .catch(done) + }) + + it('should query branch to return all branches', done => { + makeBranch() + .query() + .find() + .then((response) => { + expect(response.items.length).to.be.equal(3) + response.items.forEach(item => { + expect(item.urlPath).to.be.equal(`/stacks/branches/${item.uid}`) + expect(item.delete).to.not.equal(undefined) + expect(item.fetch).to.not.equal(undefined) + }) + done() + }) + .catch(done) + }) + + it('should delete branch from branch uid', done => { + makeBranch(devBranch.uid) + .delete() + .then((response) => { + expect(response.notice).to.be.equal('Your request to delete branch is in progress. Please check organization bulk task queue for more details.') + done() + }) + .catch(done) + }) + + it('should provide list of content types and global fields that exist in only one branch or are different between the two branches', done => { + makeBranch(branch.uid) + .compare(stageBranch.uid) + .all() + .then((response) => { + expect(response.branches.base_branch).to.be.equal(branch.uid) + expect(response.branches.compare_branch).to.be.equal(stageBranch.uid) + done() + }) + .catch(done) + }) + + it('should list differences for a content types between two branches', done => { + makeBranch(branch.uid) + .compare(stageBranch.uid) + .contentTypes() + .then((response) => { + expect(response.branches.base_branch).to.be.equal(branch.uid) + expect(response.branches.compare_branch).to.be.equal(stageBranch.uid) + done() + }) + .catch(done) + }) + + it('should list differences for a global fields between two branches', done => { + makeBranch(branch.uid) + .compare(stageBranch.uid) + .globalFields() + .then((response) => { + expect(response.branches.base_branch).to.be.equal(branch.uid) + expect(response.branches.compare_branch).to.be.equal(stageBranch.uid) + done() + }) + .catch(done) + }) + + it('should merge given two branches', done => { + const params = { + base_branch: branch.uid, + compare_branch: stageBranch.uid, + default_merge_strategy: 'ignore', + merge_comment: 'Merging staging into main' + } + const mergeObj = { + item_merge_strategies: [ + { + uid: 'global_field_uid', + type: 'global_field', + merge_strategy: 'merge_prefer_base' + }, + { + uid: 'ct5', + type: 'content_type', + merge_strategy: 'merge_prefer_compare' + }, + { + uid: 'bot_all', + type: 'content_type', + merge_strategy: 'merge_prefer_base' + } + ] + } + makeBranch() + .merge(mergeObj, params) + .then((response) => { + mergeJobUid = response.uid + expect(response.merge_details.base_branch).to.be.equal(branch.uid) + expect(response.merge_details.compare_branch).to.be.equal(stageBranch.uid) + done() + }) + .catch(done) + }) + + it('should list all recent merge jobs', done => { + makeBranch() + .mergeQueue() + .find() + .then((response) => { + expect(response.queue).to.not.equal(undefined) + expect(response.queue[0].merge_details.base_branch).to.be.equal(branch.uid) + expect(response.queue[0].merge_details.compare_branch).to.be.equal(stageBranch.uid) + done() + }) + .catch(done) + }) + + it('should list details of merge job when job uid is passed', done => { + makeBranch() + .mergeQueue(mergeJobUid) + .fetch() + .then((response) => { + expect(response.queue).to.not.equal(undefined) + expect(response.queue[0].merge_details.base_branch).to.be.equal(branch.uid) + expect(response.queue[0].merge_details.compare_branch).to.be.equal(stageBranch.uid) + done() + }) + .catch(done) + }) +}) + +function makeBranch (uid = null) { + return client.stack({ api_key: process.env.API_KEY }).branch(uid) +} diff --git a/test/sanity-check/api/branchAlias-test.js b/test/sanity-check/api/branchAlias-test.js new file mode 100644 index 00000000..41aa4b78 --- /dev/null +++ b/test/sanity-check/api/branchAlias-test.js @@ -0,0 +1,85 @@ +import { expect } from 'chai' +import { describe, it, setup } from 'mocha' +import { jsonReader } from '../utility/fileOperations/readwrite' +import { contentstackClient } from '../utility/ContentstackClient.js' +import { stageBranch } from '../mock/branch.js' + +var client = {} + +describe('Branch Alias api Test', () => { + setup(() => { + const user = jsonReader('loggedinuser.json') + client = contentstackClient(user.authtoken) + }) + + it('Should create Branch Alias', done => { + makeBranchAlias(`${stageBranch.uid}_alias`) + .createOrUpdate(stageBranch.uid) + .then((response) => { + expect(response.uid).to.be.equal(stageBranch.uid) + expect(response.urlPath).to.be.equal(`/stacks/branches/${stageBranch.uid}`) + expect(response.source).to.be.equal(stageBranch.source) + expect(response.alias).to.be.equal(`${stageBranch.uid}_alias`) + expect(response.delete).to.not.equal(undefined) + expect(response.fetch).to.not.equal(undefined) + done() + }) + .catch(done) + }) + + it('Branch query should return master branch', done => { + makeBranchAlias() + .fetchAll({ query: { uid: stageBranch.uid } }) + .then((response) => { + expect(response.items.length).to.be.equal(1) + var item = response.items[0] + expect(item.urlPath).to.be.equal(`/stacks/branches/${stageBranch.uid}`) + expect(item.delete).to.not.equal(undefined) + expect(item.fetch).to.not.equal(undefined) + done() + }) + .catch(done) + }) + + it('Should fetch Branch Alias', done => { + makeBranchAlias(`${stageBranch.uid}_alias`) + .fetch() + .then((response) => { + expect(response.uid).to.be.equal(stageBranch.uid) + expect(response.urlPath).to.be.equal(`/stacks/branches/${stageBranch.uid}`) + expect(response.source).to.be.equal(stageBranch.source) + expect(response.alias).to.be.equal(`${stageBranch.uid}_alias`) + expect(response.delete).to.not.equal(undefined) + expect(response.fetch).to.not.equal(undefined) + done() + }) + .catch(done) + }) + + it('Should delete Branch Alias', done => { + try { + makeBranchAlias(`${stageBranch.uid}_alias`) + .delete() + .then((response) => { + expect(response.notice).to.be.equal('Branch alias deleted successfully.') + done() + }) + .catch(done) + } catch (e) { + done() + } + }) + it('Should delete stage branch from uid', done => { + client.stack({ api_key: process.env.API_KEY }).branch(stageBranch.uid) + .delete() + .then((response) => { + expect(response.notice).to.be.equal('Your request to delete branch is in progress. Please check organization bulk task queue for more details.') + done() + }) + .catch(done) + }) +}) + +function makeBranchAlias (uid = null) { + return client.stack({ api_key: process.env.API_KEY }).branchAlias(uid) +} diff --git a/test/sanity-check/api/taxonomy-test.js b/test/sanity-check/api/taxonomy-test.js index 3deb99aa..fcff1f47 100644 --- a/test/sanity-check/api/taxonomy-test.js +++ b/test/sanity-check/api/taxonomy-test.js @@ -4,7 +4,6 @@ import { jsonReader } from '../utility/fileOperations/readwrite' import { contentstackClient } from '../utility/ContentstackClient.js' var client = {} -var stack = {} const taxonomy = { uid: 'taxonomy_testing', @@ -17,7 +16,6 @@ var taxonomyUID = '' describe('taxonomy api Test', () => { setup(() => { const user = jsonReader('loggedinuser.json') - stack = jsonReader('stack.json') client = contentstackClient(user.authtoken) }) @@ -82,5 +80,5 @@ describe('taxonomy api Test', () => { }) function makeTaxonomy (uid = null) { - return client.stack({ api_key: stack.api_key }).taxonomy(uid) + return client.stack({ api_key: process.env.API_KEY }).taxonomy(uid) } diff --git a/test/sanity-check/mock/branch.js b/test/sanity-check/mock/branch.js new file mode 100644 index 00000000..3016c0a3 --- /dev/null +++ b/test/sanity-check/mock/branch.js @@ -0,0 +1,20 @@ +const branch = { + uid: 'main', + source: '' +} + +const stageBranch = { + uid: 'staging', + source: 'main' +} + +const devBranch = { + uid: 'merge_test', + source: 'staging' +} + +export { + branch, + stageBranch, + devBranch +} diff --git a/test/sanity-check/sanity.js b/test/sanity-check/sanity.js index 7e3581a6..e3a67116 100644 --- a/test/sanity-check/sanity.js +++ b/test/sanity-check/sanity.js @@ -1,6 +1,8 @@ require('./api/user-test') require('./api/organization-test') require('./api/stack-test') +require('./api/branch-test') +require('./api/branchAlias-test') require('./api/contentType-test') require('./api/asset-test') require('./api/entry-test') From ca58beb3a81b7bff51bd34944c9fc42ad7f03efb Mon Sep 17 00:00:00 2001 From: harshithad0703 Date: Fri, 5 Jan 2024 12:00:13 +0530 Subject: [PATCH 14/28] test: commented out the test case instead or removing --- test/sanity-check/api/organization-test.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/test/sanity-check/api/organization-test.js b/test/sanity-check/api/organization-test.js index 4399384c..7e1f2b8f 100644 --- a/test/sanity-check/api/organization-test.js +++ b/test/sanity-check/api/organization-test.js @@ -62,6 +62,19 @@ describe('Organization api test', () => { .catch(done) }) + // it('should transfer Organization Ownership', done => { + // organization.transferOwnership('em@em.com') + // .then((data) => { + // expect(data.notice).to.be.equal('Email has been successfully sent to the user.', 'Message does not match') + // done() + // }) + // .catch((error) => { + // console.log(error) + // expect(error).to.be.equal(null, 'Failed Transfer Organization Ownership') + // done() + // }) + // }) + it('should get all roles in an organization', done => { organization.roles() .then((roles) => { From 941b9e9d1324c491129cb5f20818ffec41861274 Mon Sep 17 00:00:00 2001 From: harshithad0703 Date: Fri, 5 Jan 2024 12:06:31 +0530 Subject: [PATCH 15/28] test: updated url path in unit test case --- test/unit/organization-test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unit/organization-test.js b/test/unit/organization-test.js index be278013..f2340ffd 100644 --- a/test/unit/organization-test.js +++ b/test/unit/organization-test.js @@ -176,7 +176,7 @@ describe('Organization Test', () => { it('Organization Transfer Ownership', done => { const mock = new MockAdapter(Axios) - mock.onPost(`/organizations/${systemUidMock.uid}/transfer_ownership`).reply(200, { ...noticeMock }) + mock.onPost(`/organizations/${systemUidMock.uid}/transfer-ownership`).reply(200, { ...noticeMock }) makeOrganization({ organization: { ...systemUidMock, From 11c4d7428d764ac56eaddc443be331c289b88364 Mon Sep 17 00:00:00 2001 From: harshithad0703 Date: Fri, 5 Jan 2024 17:04:36 +0530 Subject: [PATCH 16/28] test: added 1 more test case to branch test suit --- test/sanity-check/api/branch-test.js | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/test/sanity-check/api/branch-test.js b/test/sanity-check/api/branch-test.js index 3f3759a3..74d82a89 100644 --- a/test/sanity-check/api/branch-test.js +++ b/test/sanity-check/api/branch-test.js @@ -42,7 +42,7 @@ describe('Branch api Test', () => { .catch(done) }) - it('should fetch stage branch from branch uid', done => { + it('should fetch main branch from branch uid', done => { makeBranch(branch.uid) .fetch() .then((response) => { @@ -57,6 +57,21 @@ describe('Branch api Test', () => { .catch(done) }) + it('should fetch staging branch from branch uid', done => { + makeBranch(stageBranch.uid) + .fetch() + .then((response) => { + expect(response.uid).to.be.equal(stageBranch.uid) + expect(response.urlPath).to.be.equal(`/stacks/branches/${stageBranch.uid}`) + expect(response.source).to.be.equal(stageBranch.source) + expect(response.alias).to.not.equal(undefined) + expect(response.delete).to.not.equal(undefined) + expect(response.fetch).to.not.equal(undefined) + done() + }) + .catch(done) + }) + it('should create Branch from staging', done => { makeBranch() .create({ branch: devBranch }) From 122b4db2f5f37fe65b0064e8f78936dcafa7efbc Mon Sep 17 00:00:00 2001 From: harshithad0703 Date: Tue, 9 Jan 2024 12:43:35 +0530 Subject: [PATCH 17/28] test: added create branch test after stack creation test --- test/sanity-check/api/branch-test.js | 46 +++++++++------------------- test/sanity-check/api/stack-test.js | 28 +++++++++++++++++ test/sanity-check/sanity.js | 4 +-- 3 files changed, 45 insertions(+), 33 deletions(-) diff --git a/test/sanity-check/api/branch-test.js b/test/sanity-check/api/branch-test.js index 74d82a89..3ee07faa 100644 --- a/test/sanity-check/api/branch-test.js +++ b/test/sanity-check/api/branch-test.js @@ -12,31 +12,30 @@ describe('Branch api Test', () => { client = contentstackClient(user.authtoken) }) - it('should return master branch when query is called', done => { + it('should create Branch from staging', done => { makeBranch() - .query() - .find() + .create({ branch: devBranch }) .then((response) => { - expect(response.items.length).to.be.equal(1) - var item = response.items[0] - expect(item.urlPath).to.be.equal(`/stacks/branches/${item.uid}`) - expect(item.delete).to.not.equal(undefined) - expect(item.fetch).to.not.equal(undefined) + expect(response.uid).to.be.equal(devBranch.uid) + expect(response.urlPath).to.be.equal(`/stacks/branches/${devBranch.uid}`) + expect(response.source).to.be.equal(devBranch.source) + expect(response.alias).to.not.equal(undefined) + expect(response.delete).to.not.equal(undefined) + expect(response.fetch).to.not.equal(undefined) done() }) .catch(done) }) - it('should create staging branch', done => { + it('should return master branch when query is called', done => { makeBranch() - .create({ branch: stageBranch }) + .query() + .find() .then((response) => { - expect(response.uid).to.be.equal(stageBranch.uid) - expect(response.urlPath).to.be.equal(`/stacks/branches/${stageBranch.uid}`) - expect(response.source).to.be.equal(stageBranch.source) - expect(response.alias).to.not.equal(undefined) - expect(response.delete).to.not.equal(undefined) - expect(response.fetch).to.not.equal(undefined) + var item = response.items[0] + expect(item.urlPath).to.be.equal(`/stacks/branches/${item.uid}`) + expect(item.delete).to.not.equal(undefined) + expect(item.fetch).to.not.equal(undefined) done() }) .catch(done) @@ -72,21 +71,6 @@ describe('Branch api Test', () => { .catch(done) }) - it('should create Branch from staging', done => { - makeBranch() - .create({ branch: devBranch }) - .then((response) => { - expect(response.uid).to.be.equal(devBranch.uid) - expect(response.urlPath).to.be.equal(`/stacks/branches/${devBranch.uid}`) - expect(response.source).to.be.equal(devBranch.source) - expect(response.alias).to.not.equal(undefined) - expect(response.delete).to.not.equal(undefined) - expect(response.fetch).to.not.equal(undefined) - done() - }) - .catch(done) - }) - it('should query branch for specific condition', done => { makeBranch() .query({ query: { source: 'main' } }) diff --git a/test/sanity-check/api/stack-test.js b/test/sanity-check/api/stack-test.js index 70eb0490..fa79f853 100644 --- a/test/sanity-check/api/stack-test.js +++ b/test/sanity-check/api/stack-test.js @@ -2,6 +2,8 @@ import { expect } from 'chai' import { describe, it, setup } from 'mocha' import { jsonReader, jsonWrite } from '../utility/fileOperations/readwrite' import { contentstackClient } from '../utility/ContentstackClient.js' +import { stageBranch } from '../mock/branch.js' + import dotenv from 'dotenv' dotenv.config() @@ -156,3 +158,29 @@ describe('Stack api Test', () => { .catch(done) }) }) + +describe('Branch creation api Test', () => { + setup(() => { + const user = jsonReader('loggedinuser.json') + client = contentstackClient(user.authtoken) + }) + + it('should create staging branch', done => { + makeBranch() + .create({ branch: stageBranch }) + .then((response) => { + expect(response.uid).to.be.equal(stageBranch.uid) + expect(response.urlPath).to.be.equal(`/stacks/branches/${stageBranch.uid}`) + expect(response.source).to.be.equal(stageBranch.source) + expect(response.alias).to.not.equal(undefined) + expect(response.delete).to.not.equal(undefined) + expect(response.fetch).to.not.equal(undefined) + done() + }) + .catch(done) + }) +}) + +function makeBranch (uid = null) { + return client.stack({ api_key: process.env.API_KEY }).branch(uid) +} diff --git a/test/sanity-check/sanity.js b/test/sanity-check/sanity.js index e3a67116..86fd7eaa 100644 --- a/test/sanity-check/sanity.js +++ b/test/sanity-check/sanity.js @@ -1,11 +1,11 @@ require('./api/user-test') require('./api/organization-test') require('./api/stack-test') -require('./api/branch-test') -require('./api/branchAlias-test') require('./api/contentType-test') require('./api/asset-test') require('./api/entry-test') +require('./api/branch-test') +require('./api/branchAlias-test') require('./api/contentType-delete-test') require('./api/taxonomy-test') require('./api/terms-test') From 4bfd437f91efc84c26a64b14c00584aa321fb297 Mon Sep 17 00:00:00 2001 From: Nadeem Patwekar Date: Thu, 11 Jan 2024 11:59:17 +0530 Subject: [PATCH 18/28] fix: :package: updates axios version --- .talismanrc | 2 +- lib/stack/asset/index.js | 28 +-- package-lock.json | 370 +++++++++++++++------------------------ package.json | 3 +- 4 files changed, 162 insertions(+), 241 deletions(-) diff --git a/.talismanrc b/.talismanrc index adb09795..ccaba411 100644 --- a/.talismanrc +++ b/.talismanrc @@ -1,5 +1,5 @@ threshold: medium fileignoreconfig: - filename: package-lock.json - checksum: 9a7bec9513834a0fc7db31b9a312ec35980600415c04f0d404e1370cfce1ef1b + checksum: 2a2327aabd3f6eacf41a8e8bb3dd5afdab892683cfd15aac308f43c14108b824 version: "" \ No newline at end of file diff --git a/lib/stack/asset/index.js b/lib/stack/asset/index.js index dbb06f9f..0d1a27e5 100644 --- a/lib/stack/asset/index.js +++ b/lib/stack/asset/index.js @@ -206,20 +206,20 @@ export function Asset (http, data = {}) { } } /** - * @description The Query on Asset will allow to fetch details of all or specific Asset. - * @memberof Asset - * @param {Object} params - URI parameters - * @prop {Object} params.query - Queries that you can use to fetch filtered results. - * @func query - * @returns {Array} Array of Asset. - * - * @example - * import * as contentstack from '@contentstack/management' - * const client = contentstack.client() - * - * client.stack({ api_key: 'api_key'}).asset().query({ query: { filename: 'Asset Name' } }).find() - * .then((asset) => console.log(asset)) - */ + * @description The Query on Asset will allow to fetch details of all or specific Asset. + * @memberof Asset + * @param {Object} params - URI parameters + * @prop {Object} params.query - Queries that you can use to fetch filtered results. + * @func query + * @returns {Array} Array of Asset. + * + * @example + * import * as contentstack from '@contentstack/management' + * const client = contentstack.client() + * + * client.stack({ api_key: 'api_key'}).asset().query({ query: { filename: 'Asset Name' } }).find() + * .then((asset) => console.log(asset)) + */ this.query = query({ http: http, wrapperCollection: AssetCollection }) } /** diff --git a/package-lock.json b/package-lock.json index f621ba2c..0a7a3c46 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,15 +1,15 @@ { "name": "@contentstack/management", "version": "1.14.0", - "lockfileVersion": 1, + "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@contentstack/management", - "version": "1.11.0", + "version": "1.14.0", "license": "MIT", "dependencies": { - "axios": "^1.6.0", + "axios": "^1.6.5", "form-data": "^3.0.1", "lodash": "^4.17.21", "qs": "^6.11.2" @@ -21,7 +21,9 @@ "@babel/preset-env": "^7.18.2", "@babel/register": "^7.17.7", "@babel/runtime": "^7.18.3", + "@types/chai": "^4.3.11", "@types/jest": "^28.1.0", + "@types/lodash": "^4.14.202", "@types/mocha": "^7.0.2", "axios-mock-adapter": "^1.21.1", "babel-loader": "^8.2.5", @@ -50,7 +52,6 @@ "rimraf": "^2.7.1", "sinon": "^7.3.2", "string-replace-loader": "^3.1.0", - "taffydb": "^2.7.3", "ts-jest": "^28.0.3", "typescript": "^4.7.2", "webpack": "^5.72.1", @@ -113,12 +114,12 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.10.tgz", - "integrity": "sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", "dev": true, "dependencies": { - "@babel/highlight": "^7.22.10", + "@babel/highlight": "^7.23.4", "chalk": "^2.4.2" }, "engines": { @@ -165,12 +166,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.10.tgz", - "integrity": "sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", "dev": true, "dependencies": { - "@babel/types": "^7.22.10", + "@babel/types": "^7.23.6", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -276,22 +277,22 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "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==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", - "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, "dependencies": { - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" @@ -444,18 +445,18 @@ } }, "node_modules/@babel/helper-string-parser": { - "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==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "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==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "dev": true, "engines": { "node": ">=6.9.0" @@ -499,12 +500,12 @@ } }, "node_modules/@babel/highlight": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.10.tgz", - "integrity": "sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, @@ -513,9 +514,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.10.tgz", - "integrity": "sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", + "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -1768,34 +1769,34 @@ } }, "node_modules/@babel/template": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", - "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.10.tgz", - "integrity": "sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig==", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.7.tgz", + "integrity": "sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.10", - "@babel/generator": "^7.22.10", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.10", - "@babel/types": "^7.22.10", - "debug": "^4.1.0", + "@babel/parser": "^7.23.6", + "@babel/types": "^7.23.6", + "debug": "^4.3.1", "globals": "^11.1.0" }, "engines": { @@ -1803,13 +1804,13 @@ } }, "node_modules/@babel/types": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.10.tgz", - "integrity": "sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", + "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5", + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, "engines": { @@ -2948,6 +2949,12 @@ "@babel/types": "^7.20.7" } }, + "node_modules/@types/chai": { + "version": "4.3.11", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.11.tgz", + "integrity": "sha512-qQR1dr2rGIHYlJulmr8Ioq3De0Le9E4MJ5AiaeAETJJpndT1uUNHsGFK3L/UIu+rbkQSdj8J/w2bCsBZc/Y5fQ==", + "dev": true + }, "node_modules/@types/eslint": { "version": "8.44.2", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.2.tgz", @@ -3045,6 +3052,12 @@ "integrity": "sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==", "dev": true }, + "node_modules/@types/lodash": { + "version": "4.14.202", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.202.tgz", + "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==", + "dev": true + }, "node_modules/@types/markdown-it": { "version": "12.2.3", "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-12.2.3.tgz", @@ -3617,11 +3630,11 @@ } }, "node_modules/axios": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.0.tgz", - "integrity": "sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg==", + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.5.tgz", + "integrity": "sha512-Ii012v05KEVuUoFWmMW/UQv9aRIc3ZwkWDcM+h5Il8izZCtRVpDUfwpoFf7eOtajT3QiGR4yDUx7lPqHJULgbg==", "dependencies": { - "follow-redirects": "^1.15.0", + "follow-redirects": "^1.15.4", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } @@ -5783,9 +5796,9 @@ "dev": true }, "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "version": "1.15.4", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", + "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==", "funding": [ { "type": "individual", @@ -9108,6 +9121,7 @@ "version": "2.3.6", "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "deprecated": "Please upgrade to 2.3.7 which fixes GHSA-4q6p-r6v2-jvc5", "dev": true, "dependencies": { "get-func-name": "^2.0.0" @@ -11108,6 +11122,7 @@ "version": "7.5.0", "resolved": "https://registry.npmjs.org/sinon/-/sinon-7.5.0.tgz", "integrity": "sha512-AoD0oJWerp0/rY9czP/D6hDTTUYGpObhZjMpd7Cl/A6+j0xBE+ayL/ldfggkBXUs0IkvIiM1ljM8+WkOc5k78Q==", + "deprecated": "16.1.1", "dev": true, "dependencies": { "@sinonjs/commons": "^1.4.0", @@ -11448,12 +11463,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/taffydb": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/taffydb/-/taffydb-2.7.3.tgz", - "integrity": "sha512-GQ3gtYFSOAxSMN/apGtDKKkbJf+8izz5YfbGqIsUc7AMiQOapARZ76dhilRY2h39cynYxBFdafQo5HUL5vgkrg==", - "dev": true - }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -12547,12 +12556,12 @@ } }, "@babel/code-frame": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.10.tgz", - "integrity": "sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", "dev": true, "requires": { - "@babel/highlight": "^7.22.10", + "@babel/highlight": "^7.23.4", "chalk": "^2.4.2" } }, @@ -12586,12 +12595,12 @@ } }, "@babel/generator": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.10.tgz", - "integrity": "sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", "dev": true, "requires": { - "@babel/types": "^7.22.10", + "@babel/types": "^7.23.6", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -12670,19 +12679,19 @@ } }, "@babel/helper-environment-visitor": { - "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==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "dev": true }, "@babel/helper-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", - "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, "requires": { - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" } }, "@babel/helper-hoist-variables": { @@ -12790,15 +12799,15 @@ } }, "@babel/helper-string-parser": { - "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==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", "dev": true }, "@babel/helper-validator-identifier": { - "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==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "dev": true }, "@babel/helper-validator-option": { @@ -12830,20 +12839,20 @@ } }, "@babel/highlight": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.10.tgz", - "integrity": "sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.10.tgz", - "integrity": "sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", + "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", "dev": true }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { @@ -12870,7 +12879,8 @@ "version": "7.21.0-placeholder-for-preset-env.2", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "dev": true + "dev": true, + "requires": {} }, "@babel/plugin-syntax-async-generators": { "version": "7.8.4", @@ -13679,20 +13689,20 @@ } }, "@babel/template": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", - "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, "requires": { - "@babel/code-frame": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" } }, "@babel/traverse": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.6.tgz", - "integrity": "sha512-czastdK1e8YByZqezMPFiZ8ahwVMh/ESl9vPgvgdB9AmFMGP5jfpFax74AQgl5zj4XHzqeYAg2l8PuUeRS1MgQ==", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.7.tgz", + "integrity": "sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==", "dev": true, "requires": { "@babel/code-frame": "^7.23.5", @@ -13705,107 +13715,16 @@ "@babel/types": "^7.23.6", "debug": "^4.3.1", "globals": "^11.1.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", - "dev": true, - "requires": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" - } - }, - "@babel/generator": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", - "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", - "dev": true, - "requires": { - "@babel/types": "^7.23.6", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - } - }, - "@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true - }, - "@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "requires": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - } - }, - "@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", - "dev": true - }, - "@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true - }, - "@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", - "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", - "dev": true - }, - "@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - } - }, - "@babel/types": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", - "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - } - } } }, "@babel/types": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.10.tgz", - "integrity": "sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", + "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", "dev": true, "requires": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5", + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" } }, @@ -15008,7 +14927,8 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", - "dev": true + "dev": true, + "requires": {} }, "@webpack-cli/info": { "version": "1.5.0", @@ -15023,7 +14943,8 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", - "dev": true + "dev": true, + "requires": {} }, "@xtuc/ieee754": { "version": "1.2.0", @@ -15047,13 +14968,15 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "dev": true + "dev": true, + "requires": {} }, "acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true + "dev": true, + "requires": {} }, "aggregate-error": { "version": "3.1.0", @@ -15081,7 +15004,8 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true + "dev": true, + "requires": {} }, "ansi-colors": { "version": "4.1.1", @@ -15257,11 +15181,11 @@ "dev": true }, "axios": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.0.tgz", - "integrity": "sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg==", + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.5.tgz", + "integrity": "sha512-Ii012v05KEVuUoFWmMW/UQv9aRIc3ZwkWDcM+h5Il8izZCtRVpDUfwpoFf7eOtajT3QiGR4yDUx7lPqHJULgbg==", "requires": { - "follow-redirects": "^1.15.0", + "follow-redirects": "^1.15.4", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" }, @@ -16538,7 +16462,8 @@ "version": "13.0.1", "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-13.0.1.tgz", "integrity": "sha512-zLKp4QOgq6JFgRm1dDCVv1Iu0P5uZ4v5Wa4DTOkg2RFMxdCX/9Qf7lz9ezRj2dBRa955cWQF/O/LWEiYWAHbTw==", - "dev": true + "dev": true, + "requires": {} }, "eslint-import-resolver-node": { "version": "0.3.9", @@ -16661,7 +16586,8 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-4.1.0.tgz", "integrity": "sha512-ZL7+QRixjTR6/528YNGyDotyffm5OQst/sGxKDwGb9Uqs4In5Egi4+jbobhqJoyoCM6/7v/1A5fhQ7ScMtDjaQ==", - "dev": true + "dev": true, + "requires": {} }, "eslint-scope": { "version": "7.2.2", @@ -16900,9 +16826,9 @@ "dev": true }, "follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" + "version": "1.15.4", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", + "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==" }, "for-each": { "version": "0.3.3", @@ -18405,7 +18331,8 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true + "dev": true, + "requires": {} }, "jest-regex-util": { "version": "28.0.2", @@ -19393,7 +19320,8 @@ "version": "8.6.7", "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz", "integrity": "sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==", - "dev": true + "dev": true, + "requires": {} }, "marked": { "version": "4.3.0", @@ -21089,12 +21017,6 @@ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true }, - "taffydb": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/taffydb/-/taffydb-2.7.3.tgz", - "integrity": "sha512-GQ3gtYFSOAxSMN/apGtDKKkbJf+8izz5YfbGqIsUc7AMiQOapARZ76dhilRY2h39cynYxBFdafQo5HUL5vgkrg==", - "dev": true - }, "tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", diff --git a/package.json b/package.json index 619ad9a9..bc199427 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ "author": "Contentstack", "license": "MIT", "dependencies": { - "axios": "^1.6.0", + "axios": "^1.6.5", "form-data": "^3.0.1", "lodash": "^4.17.21", "qs": "^6.11.2" @@ -98,7 +98,6 @@ "rimraf": "^2.7.1", "sinon": "^7.3.2", "string-replace-loader": "^3.1.0", - "taffydb": "^2.7.3", "ts-jest": "^28.0.3", "typescript": "^4.7.2", "webpack": "^5.72.1", From b73e856fe7ad34928a4caca2b94f86acb6c98dac Mon Sep 17 00:00:00 2001 From: Nadeem Patwekar Date: Thu, 11 Jan 2024 12:00:48 +0530 Subject: [PATCH 19/28] chore: update package version in package.json --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0a7a3c46..c6abae97 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@contentstack/management", - "version": "1.14.0", + "version": "1.14.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@contentstack/management", - "version": "1.14.0", + "version": "1.14.1", "license": "MIT", "dependencies": { "axios": "^1.6.5", diff --git a/package.json b/package.json index bc199427..b6cd95cf 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@contentstack/management", - "version": "1.14.0", + "version": "1.14.1", "description": "The Content Management API is used to manage the content of your Contentstack account", "main": "./dist/node/contentstack-management.js", "browser": "./dist/web/contentstack-management.js", From 45698d025ba16308a9598d31fd351bf34c889fad Mon Sep 17 00:00:00 2001 From: Nadeem Patwekar Date: Thu, 11 Jan 2024 12:19:50 +0530 Subject: [PATCH 20/28] chore: :hammer: updates prerelease hook script --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b6cd95cf..ab186f65 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ "test:debug": "BABEL_ENV=test mocha debug --require @babel/register ./test", "lint": "eslint lib test", "format": "eslint --fix lib test", - "prepare": "npm run build && npm run generate:docs", + "prepare": "npm run build", "pretest": "rimraf coverage && npm run lint", "precommit": "npm run lint", "prepush": "npm run test:unit", From 6b160a287e084ac3321b7eca00b7de5b0f2a7c14 Mon Sep 17 00:00:00 2001 From: harshithad0703 Date: Thu, 11 Jan 2024 13:44:35 +0530 Subject: [PATCH 21/28] chore: :package: added a package for slack message integeration and script for same --- package-lock.json | 204 ++++++++++++++++++++++++++++++++++++++++++++++ package.json | 2 + 2 files changed, 206 insertions(+) diff --git a/package-lock.json b/package-lock.json index 3fa81148..a41027fd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,6 +21,7 @@ "@babel/preset-env": "^7.18.2", "@babel/register": "^7.17.7", "@babel/runtime": "^7.18.3", + "@slack/bolt":"3.17.0", "@types/chai": "^4.3.11", "@types/jest": "^28.1.0", "@types/lodash": "^4.14.202", @@ -2908,6 +2909,209 @@ "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", "dev": true }, + "node_modules/@slack/bolt": { + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/@slack/bolt/-/bolt-3.17.0.tgz", + "integrity": "sha512-gxZygJj/wnrrSPCAlXO4D5FIYre2McPC+Vwrkq6CS74S4MI+0/gRvdUUXMHoF+oSGfsGs3ul6Fk+Bc/EE7Waig==", + "dev": true, + "dependencies": { + "@slack/logger": "^4.0.0", + "@slack/oauth": "^2.6.1", + "@slack/socket-mode": "^1.3.2", + "@slack/types": "^2.11.0", + "@slack/web-api": "^6.11.0", + "@types/express": "^4.16.1", + "@types/promise.allsettled": "^1.0.3", + "@types/tsscmp": "^1.0.0", + "axios": "^1.6.0", + "express": "^4.16.4", + "path-to-regexp": "^6.2.1", + "please-upgrade-node": "^3.2.0", + "promise.allsettled": "^1.0.2", + "raw-body": "^2.3.3", + "tsscmp": "^1.0.6" + }, + "engines": { + "node": ">=12.13.0", + "npm": ">=6.12.0" + } + }, + "node_modules/@slack/bolt/node_modules/path-to-regexp": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz", + "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==", + "dev": true + }, + "node_modules/@slack/logger": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@slack/logger/-/logger-4.0.0.tgz", + "integrity": "sha512-Wz7QYfPAlG/DR+DfABddUZeNgoeY7d1J39OCR2jR+v7VBsB8ezulDK5szTnDDPDwLH5IWhLvXIHlCFZV7MSKgA==", + "dev": true, + "dependencies": { + "@types/node": ">=18.0.0" + }, + "engines": { + "node": ">= 18", + "npm": ">= 8.6.0" + } + }, + "node_modules/@slack/oauth": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@slack/oauth/-/oauth-2.6.2.tgz", + "integrity": "sha512-2R3MyB/R63hTRXzk5J6wcui59TBxXzhk+Uh2/Xu3Wp3O4pXg/BNucQhP/DQbL/ScVhLvFtMXirLrKi0Yo5gIVw==", + "dev": true, + "dependencies": { + "@slack/logger": "^3.0.0", + "@slack/web-api": "^6.11.2", + "@types/jsonwebtoken": "^8.3.7", + "@types/node": ">=12", + "jsonwebtoken": "^9.0.0", + "lodash.isstring": "^4.0.1" + }, + "engines": { + "node": ">=12.13.0", + "npm": ">=6.12.0" + } + }, + "node_modules/@slack/oauth/node_modules/@slack/logger": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@slack/logger/-/logger-3.0.0.tgz", + "integrity": "sha512-DTuBFbqu4gGfajREEMrkq5jBhcnskinhr4+AnfJEk48zhVeEv3XnUKGIX98B74kxhYsIMfApGGySTn7V3b5yBA==", + "dev": true, + "dependencies": { + "@types/node": ">=12.0.0" + }, + "engines": { + "node": ">= 12.13.0", + "npm": ">= 6.12.0" + } + }, + "node_modules/@slack/socket-mode": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@slack/socket-mode/-/socket-mode-1.3.3.tgz", + "integrity": "sha512-vN3zG4woRtf2Ut6rZgRW6G/Oe56uLMlnz39I08Q7DOvVfB+1MmDbNv0PNOiFgujdKXJR+bXF41/F/VvryXcqlw==", + "dev": true, + "dependencies": { + "@slack/logger": "^3.0.0", + "@slack/web-api": "^6.11.2", + "@types/node": ">=12.0.0", + "@types/p-queue": "^2.3.2", + "@types/ws": "^7.4.7", + "eventemitter3": "^3.1.0", + "finity": "^0.5.4", + "p-cancelable": "^1.1.0", + "p-queue": "^2.4.2", + "ws": "^7.5.3" + }, + "engines": { + "node": ">=12.13.0", + "npm": ">=6.12.0" + } + }, + "node_modules/@slack/socket-mode/node_modules/@slack/logger": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@slack/logger/-/logger-3.0.0.tgz", + "integrity": "sha512-DTuBFbqu4gGfajREEMrkq5jBhcnskinhr4+AnfJEk48zhVeEv3XnUKGIX98B74kxhYsIMfApGGySTn7V3b5yBA==", + "dev": true, + "dependencies": { + "@types/node": ">=12.0.0" + }, + "engines": { + "node": ">= 12.13.0", + "npm": ">= 6.12.0" + } + }, + "node_modules/@slack/types": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@slack/types/-/types-2.11.0.tgz", + "integrity": "sha512-UlIrDWvuLaDly3QZhCPnwUSI/KYmV1N9LyhuH6EDKCRS1HWZhyTG3Ja46T3D0rYfqdltKYFXbJSSRPwZpwO0cQ==", + "dev": true, + "engines": { + "node": ">= 12.13.0", + "npm": ">= 6.12.0" + } + }, + "node_modules/@slack/web-api": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/@slack/web-api/-/web-api-6.11.2.tgz", + "integrity": "sha512-s4qCQGXasr8jpCf/+6+V/smq+Z2RX7EIBnJeO/xe7Luie1nyBihFMgjICNyvzWoWBdaGntSnn5CcZdFm4ItBWg==", + "dev": true, + "dependencies": { + "@slack/logger": "^3.0.0", + "@slack/types": "^2.11.0", + "@types/is-stream": "^1.1.0", + "@types/node": ">=12.0.0", + "axios": "^1.6.5", + "eventemitter3": "^3.1.0", + "form-data": "^2.5.0", + "is-electron": "2.2.2", + "is-stream": "^1.1.0", + "p-queue": "^6.6.1", + "p-retry": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0", + "npm": ">= 6.12.0" + } + }, + "node_modules/@slack/web-api/node_modules/@slack/logger": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@slack/logger/-/logger-3.0.0.tgz", + "integrity": "sha512-DTuBFbqu4gGfajREEMrkq5jBhcnskinhr4+AnfJEk48zhVeEv3XnUKGIX98B74kxhYsIMfApGGySTn7V3b5yBA==", + "dev": true, + "dependencies": { + "@types/node": ">=12.0.0" + }, + "engines": { + "node": ">= 12.13.0", + "npm": ">= 6.12.0" + } + }, + "node_modules/@slack/web-api/node_modules/form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/@slack/web-api/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@slack/web-api/node_modules/p-queue": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", + "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "dev": true, + "dependencies": { + "eventemitter3": "^4.0.4", + "p-timeout": "^3.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@slack/web-api/node_modules/p-queue/node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, "node_modules/@types/babel__core": { "version": "7.20.1", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", diff --git a/package.json b/package.json index ab186f65..3dd3f734 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,7 @@ "buildweb": "webpack --config webpack/webpack.web.js --mode production", "test": "npm run test:api && npm run test:unit", "test:sanity": "BABEL_ENV=test nyc --reporter=html --reporter=text mocha --require @babel/register ./test/sanity-check/sanity.js -t 30000 --reporter mochawesome --require babel-polyfill", + "test:sanity-report": "node sanity-report.mjs", "test:api": "BABEL_ENV=test nyc --reporter=html --reporter=text mocha --require @babel/register ./test/test.js -t 30000 --reporter mochawesome --require babel-polyfill", "test:unit": "BABEL_ENV=test nyc --reporter=html --reporter=text mocha --require @babel/register ./test/unit/index.js -t 30000 --reporter mochawesome --require babel-polyfill", "test:unit:report:json": "BABEL_ENV=test nyc --reporter=clover --reporter=text mocha --require @babel/register ./test/unit/index.js -t 30000 --reporter json --reporter-options output=report.json --require babel-polyfill", @@ -67,6 +68,7 @@ "@babel/preset-env": "^7.18.2", "@babel/register": "^7.17.7", "@babel/runtime": "^7.18.3", + "@slack/bolt": "^3.17.0", "@types/chai": "^4.3.11", "@types/jest": "^28.1.0", "@types/lodash": "^4.14.202", From a9398adc992f44ca444aee03d0c73acba0ca33de Mon Sep 17 00:00:00 2001 From: harshithad0703 Date: Thu, 11 Jan 2024 13:48:56 +0530 Subject: [PATCH 22/28] chore: slack integeration for sending test report summary on the channel --- sanity-report.mjs | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 sanity-report.mjs diff --git a/sanity-report.mjs b/sanity-report.mjs new file mode 100644 index 00000000..224457ae --- /dev/null +++ b/sanity-report.mjs @@ -0,0 +1,47 @@ +import Slack from '@slack/bolt' +import dotenv from 'dotenv' +import fs from 'fs' + +dotenv.config() + +const mochawesomeJsonOutput = fs.readFileSync('./mochawesome-report/mochawesome.json', 'utf-8') +const mochawesomeReport = JSON.parse(mochawesomeJsonOutput) + +const totalSuites = mochawesomeReport.stats.suites +const totalTests = mochawesomeReport.stats.tests +const passedTests = mochawesomeReport.stats.passes +const failedTests = mochawesomeReport.stats.failures +const pendingTests = mochawesomeReport.stats.pending +const durationInSeconds = mochawesomeReport.stats.duration / 1000 + +console.log(`Total Suites: ${totalSuites}`) +console.log(`Total Tests: ${totalTests}`) +console.log(`Passed Tests: ${passedTests}`) +console.log(`Failed Tests: ${failedTests}`) +console.log(`Pending Tests: ${pendingTests}`) +console.log(`Total Duration: ${durationInSeconds.toFixed(2)} seconds`) + +const slackMessage = ` +*Test Summary* +Total Suites: ${totalSuites} +Total Tests: ${totalTests} +Passed Tests: ${passedTests} +Failed Tests: ${failedTests} +Pending Tests: ${pendingTests} +Total Duration: ${durationInSeconds.toFixed(2)} seconds +` + +const app = new Slack.App({ + token: process.env.SLACK_BOT_TOKEN, + signingSecret: process.env.SLACK_SIGNING_SECRET +}) + +async function publishMessage (text) { + await app.client.chat.postMessage({ + token: process.env.SLACK_BOT_TOKEN, + channel: process.env.SLACK_CHANNEL, + text: text + }) +} + +publishMessage(slackMessage) From a0ed39d1241def73c90f2f2f3adf395dbfdf9048 Mon Sep 17 00:00:00 2001 From: harshithad0703 Date: Thu, 11 Jan 2024 13:53:16 +0530 Subject: [PATCH 23/28] test: added environment test to sanity and changes done in branch test --- test/sanity-check/api/branch-test.js | 34 +++--- test/sanity-check/api/environment-test.js | 136 ++++++++++++++++++++++ test/sanity-check/mock/environment.js | 32 +++++ test/sanity-check/sanity.js | 1 + 4 files changed, 184 insertions(+), 19 deletions(-) create mode 100644 test/sanity-check/api/environment-test.js create mode 100644 test/sanity-check/mock/environment.js diff --git a/test/sanity-check/api/branch-test.js b/test/sanity-check/api/branch-test.js index 3ee07faa..ce2ab8ea 100644 --- a/test/sanity-check/api/branch-test.js +++ b/test/sanity-check/api/branch-test.js @@ -12,12 +12,11 @@ describe('Branch api Test', () => { client = contentstackClient(user.authtoken) }) - it('should create Branch from staging', done => { + it('should create a dev branch from stage branch', done => { makeBranch() .create({ branch: devBranch }) .then((response) => { expect(response.uid).to.be.equal(devBranch.uid) - expect(response.urlPath).to.be.equal(`/stacks/branches/${devBranch.uid}`) expect(response.source).to.be.equal(devBranch.source) expect(response.alias).to.not.equal(undefined) expect(response.delete).to.not.equal(undefined) @@ -27,13 +26,13 @@ describe('Branch api Test', () => { .catch(done) }) - it('should return master branch when query is called', done => { + it('should return main branch when query is called', done => { makeBranch() .query() .find() .then((response) => { var item = response.items[0] - expect(item.urlPath).to.be.equal(`/stacks/branches/${item.uid}`) + expect(item.uid).to.not.equal(undefined) expect(item.delete).to.not.equal(undefined) expect(item.fetch).to.not.equal(undefined) done() @@ -46,7 +45,6 @@ describe('Branch api Test', () => { .fetch() .then((response) => { expect(response.uid).to.be.equal(branch.uid) - expect(response.urlPath).to.be.equal(`/stacks/branches/${branch.uid}`) expect(response.source).to.be.equal(branch.source) expect(response.alias).to.not.equal(undefined) expect(response.delete).to.not.equal(undefined) @@ -61,7 +59,6 @@ describe('Branch api Test', () => { .fetch() .then((response) => { expect(response.uid).to.be.equal(stageBranch.uid) - expect(response.urlPath).to.be.equal(`/stacks/branches/${stageBranch.uid}`) expect(response.source).to.be.equal(stageBranch.source) expect(response.alias).to.not.equal(undefined) expect(response.delete).to.not.equal(undefined) @@ -78,7 +75,7 @@ describe('Branch api Test', () => { .then((response) => { expect(response.items.length).to.be.equal(1) response.items.forEach(item => { - expect(item.urlPath).to.be.equal(`/stacks/branches/${item.uid}`) + expect(item.uid).to.not.equal(undefined) expect(item.source).to.be.equal(`main`) expect(item.delete).to.not.equal(undefined) expect(item.fetch).to.not.equal(undefined) @@ -93,9 +90,8 @@ describe('Branch api Test', () => { .query() .find() .then((response) => { - expect(response.items.length).to.be.equal(3) response.items.forEach(item => { - expect(item.urlPath).to.be.equal(`/stacks/branches/${item.uid}`) + expect(item.uid).to.not.equal(undefined) expect(item.delete).to.not.equal(undefined) expect(item.fetch).to.not.equal(undefined) }) @@ -104,16 +100,6 @@ describe('Branch api Test', () => { .catch(done) }) - it('should delete branch from branch uid', done => { - makeBranch(devBranch.uid) - .delete() - .then((response) => { - expect(response.notice).to.be.equal('Your request to delete branch is in progress. Please check organization bulk task queue for more details.') - done() - }) - .catch(done) - }) - it('should provide list of content types and global fields that exist in only one branch or are different between the two branches', done => { makeBranch(branch.uid) .compare(stageBranch.uid) @@ -212,6 +198,16 @@ describe('Branch api Test', () => { }) .catch(done) }) + + it('should delete dev branch from branch uid', done => { + makeBranch(devBranch.uid) + .delete() + .then((response) => { + expect(response.notice).to.be.equal('Your request to delete branch is in progress. Please check organization bulk task queue for more details.') + done() + }) + .catch(done) + }) }) function makeBranch (uid = null) { diff --git a/test/sanity-check/api/environment-test.js b/test/sanity-check/api/environment-test.js new file mode 100644 index 00000000..2ac4db9e --- /dev/null +++ b/test/sanity-check/api/environment-test.js @@ -0,0 +1,136 @@ +import { expect } from 'chai' +import { describe, it, setup } from 'mocha' +import { jsonReader, jsonWrite } from '../utility/fileOperations/readwrite' +import { environmentCreate, environmentProdCreate } from '../mock/environment.js' +import { cloneDeep } from 'lodash' +import { contentstackClient } from '../utility/ContentstackClient.js' + +var client = {} + +describe('Environment api Test', () => { + setup(() => { + const user = jsonReader('loggedinuser.json') + client = contentstackClient(user.authtoken) + }) + + it('Add a Environment development', done => { + makeEnvironment() + .create(environmentCreate) + .then((environment) => { + expect(environment.name).to.be.equal(environmentCreate.environment.name) + expect(environment.uid).to.be.not.equal(null) + done() + }) + .catch(done) + }) + + it('Add a Environment production', done => { + makeEnvironment() + .create(environmentProdCreate) + .then((environment) => { + expect(environment.name).to.be.equal(environmentProdCreate.environment.name) + expect(environment.uid).to.be.not.equal(null) + expect(environment.urls).to.be.not.equal(null) + done() + }) + .catch(done) + }) + + it('Get a Environment development', done => { + makeEnvironment(environmentCreate.environment.name) + .fetch() + .then((environment) => { + expect(environment.name).to.be.equal(environmentCreate.environment.name) + expect(environment.uid).to.be.not.equal(null) + expect(environment.urls).to.be.not.equal(null) + done() + }) + .catch(done) + }) + + it('Query a Environment development', done => { + makeEnvironment() + .query({ query: { name: environmentCreate.environment.name } }) + .find() + .then((environments) => { + environments.items.forEach((environment) => { + expect(environment.name).to.be.equal(environmentCreate.environment.name) + expect(environment.uid).to.be.not.equal(null) + expect(environment.urls).to.be.not.equal(null) + }) + done() + }) + .catch(done) + }) + + it('Fetch and Update a Environment', done => { + makeEnvironment(environmentCreate.environment.name) + .fetch() + .then((environment) => { + environment.name = 'dev' + return environment.update() + }) + .then((environment) => { + expect(environment.name).to.be.equal('dev') + expect(environment.urls).to.be.not.equal(null) + expect(environment.uid).to.be.not.equal(null) + done() + }) + .catch(done) + }) + + it('Update a Environment', done => { + var environment = makeEnvironment('dev') + Object.assign(environment, cloneDeep(environmentCreate.environment)) + environment.update() + .then((environment) => { + expect(environment.name).to.be.equal(environmentCreate.environment.name) + expect(environment.urls).to.be.not.equal(null) + expect(environment.uid).to.be.not.equal(null) + done() + }) + .catch(done) + }) + + it('delete a Environment', done => { + makeEnvironment(environmentProdCreate.environment.name) + .delete() + .then((data) => { + expect(data.notice).to.be.equal('Environment deleted successfully.') + done() + }) + .catch(done) + }) + + it('Add a Environment production', done => { + makeEnvironment() + .create(environmentProdCreate) + .then((environment) => { + expect(environment.name).to.be.equal(environmentProdCreate.environment.name) + expect(environment.uid).to.be.not.equal(null) + expect(environment.urls).to.be.not.equal(null) + done() + }) + .catch(done) + }) + + it('Query all Environments', done => { + makeEnvironment() + .query() + .find() + .then((environments) => { + jsonWrite(environments.items, 'environments.json') + environments.items.forEach((environment) => { + expect(environment.name).to.be.not.equal(null) + expect(environment.uid).to.be.not.equal(null) + expect(environment.urls).to.be.not.equal(null) + }) + done() + }) + .catch(done) + }) +}) + +function makeEnvironment (uid = null) { + return client.stack({ api_key: process.env.API_KEY }).environment(uid) +} diff --git a/test/sanity-check/mock/environment.js b/test/sanity-check/mock/environment.js new file mode 100644 index 00000000..bab8c786 --- /dev/null +++ b/test/sanity-check/mock/environment.js @@ -0,0 +1,32 @@ +const environmentCreate = { + environment: { + name: 'development', + servers: [ + { + name: 'default' + } + ], + urls: [ + { + locale: 'en-us', + url: 'http://example.com/' + } + ], + deploy_content: true + } +} +const environmentProdCreate = { + environment: { + name: 'production', + servers: [], + urls: [ + { + locale: 'en-us', + url: 'http://example.com/' + } + ], + deploy_content: true + } +} + +export { environmentCreate, environmentProdCreate } diff --git a/test/sanity-check/sanity.js b/test/sanity-check/sanity.js index 86fd7eaa..960b4567 100644 --- a/test/sanity-check/sanity.js +++ b/test/sanity-check/sanity.js @@ -1,6 +1,7 @@ require('./api/user-test') require('./api/organization-test') require('./api/stack-test') +require('./api/environment-test') require('./api/contentType-test') require('./api/asset-test') require('./api/entry-test') From 7ca19119df9b587cab344cf596588fd3aec2abbe Mon Sep 17 00:00:00 2001 From: harshithad0703 Date: Thu, 11 Jan 2024 15:52:54 +0530 Subject: [PATCH 24/28] chore: :package: updated slack/bolt package to devDependencies --- package-lock.json | 356 ++++++++++++++++++++-------------------------- 1 file changed, 153 insertions(+), 203 deletions(-) diff --git a/package-lock.json b/package-lock.json index a41027fd..7b438f72 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2909,209 +2909,6 @@ "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", "dev": true }, - "node_modules/@slack/bolt": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/@slack/bolt/-/bolt-3.17.0.tgz", - "integrity": "sha512-gxZygJj/wnrrSPCAlXO4D5FIYre2McPC+Vwrkq6CS74S4MI+0/gRvdUUXMHoF+oSGfsGs3ul6Fk+Bc/EE7Waig==", - "dev": true, - "dependencies": { - "@slack/logger": "^4.0.0", - "@slack/oauth": "^2.6.1", - "@slack/socket-mode": "^1.3.2", - "@slack/types": "^2.11.0", - "@slack/web-api": "^6.11.0", - "@types/express": "^4.16.1", - "@types/promise.allsettled": "^1.0.3", - "@types/tsscmp": "^1.0.0", - "axios": "^1.6.0", - "express": "^4.16.4", - "path-to-regexp": "^6.2.1", - "please-upgrade-node": "^3.2.0", - "promise.allsettled": "^1.0.2", - "raw-body": "^2.3.3", - "tsscmp": "^1.0.6" - }, - "engines": { - "node": ">=12.13.0", - "npm": ">=6.12.0" - } - }, - "node_modules/@slack/bolt/node_modules/path-to-regexp": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz", - "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==", - "dev": true - }, - "node_modules/@slack/logger": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@slack/logger/-/logger-4.0.0.tgz", - "integrity": "sha512-Wz7QYfPAlG/DR+DfABddUZeNgoeY7d1J39OCR2jR+v7VBsB8ezulDK5szTnDDPDwLH5IWhLvXIHlCFZV7MSKgA==", - "dev": true, - "dependencies": { - "@types/node": ">=18.0.0" - }, - "engines": { - "node": ">= 18", - "npm": ">= 8.6.0" - } - }, - "node_modules/@slack/oauth": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@slack/oauth/-/oauth-2.6.2.tgz", - "integrity": "sha512-2R3MyB/R63hTRXzk5J6wcui59TBxXzhk+Uh2/Xu3Wp3O4pXg/BNucQhP/DQbL/ScVhLvFtMXirLrKi0Yo5gIVw==", - "dev": true, - "dependencies": { - "@slack/logger": "^3.0.0", - "@slack/web-api": "^6.11.2", - "@types/jsonwebtoken": "^8.3.7", - "@types/node": ">=12", - "jsonwebtoken": "^9.0.0", - "lodash.isstring": "^4.0.1" - }, - "engines": { - "node": ">=12.13.0", - "npm": ">=6.12.0" - } - }, - "node_modules/@slack/oauth/node_modules/@slack/logger": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@slack/logger/-/logger-3.0.0.tgz", - "integrity": "sha512-DTuBFbqu4gGfajREEMrkq5jBhcnskinhr4+AnfJEk48zhVeEv3XnUKGIX98B74kxhYsIMfApGGySTn7V3b5yBA==", - "dev": true, - "dependencies": { - "@types/node": ">=12.0.0" - }, - "engines": { - "node": ">= 12.13.0", - "npm": ">= 6.12.0" - } - }, - "node_modules/@slack/socket-mode": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@slack/socket-mode/-/socket-mode-1.3.3.tgz", - "integrity": "sha512-vN3zG4woRtf2Ut6rZgRW6G/Oe56uLMlnz39I08Q7DOvVfB+1MmDbNv0PNOiFgujdKXJR+bXF41/F/VvryXcqlw==", - "dev": true, - "dependencies": { - "@slack/logger": "^3.0.0", - "@slack/web-api": "^6.11.2", - "@types/node": ">=12.0.0", - "@types/p-queue": "^2.3.2", - "@types/ws": "^7.4.7", - "eventemitter3": "^3.1.0", - "finity": "^0.5.4", - "p-cancelable": "^1.1.0", - "p-queue": "^2.4.2", - "ws": "^7.5.3" - }, - "engines": { - "node": ">=12.13.0", - "npm": ">=6.12.0" - } - }, - "node_modules/@slack/socket-mode/node_modules/@slack/logger": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@slack/logger/-/logger-3.0.0.tgz", - "integrity": "sha512-DTuBFbqu4gGfajREEMrkq5jBhcnskinhr4+AnfJEk48zhVeEv3XnUKGIX98B74kxhYsIMfApGGySTn7V3b5yBA==", - "dev": true, - "dependencies": { - "@types/node": ">=12.0.0" - }, - "engines": { - "node": ">= 12.13.0", - "npm": ">= 6.12.0" - } - }, - "node_modules/@slack/types": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/@slack/types/-/types-2.11.0.tgz", - "integrity": "sha512-UlIrDWvuLaDly3QZhCPnwUSI/KYmV1N9LyhuH6EDKCRS1HWZhyTG3Ja46T3D0rYfqdltKYFXbJSSRPwZpwO0cQ==", - "dev": true, - "engines": { - "node": ">= 12.13.0", - "npm": ">= 6.12.0" - } - }, - "node_modules/@slack/web-api": { - "version": "6.11.2", - "resolved": "https://registry.npmjs.org/@slack/web-api/-/web-api-6.11.2.tgz", - "integrity": "sha512-s4qCQGXasr8jpCf/+6+V/smq+Z2RX7EIBnJeO/xe7Luie1nyBihFMgjICNyvzWoWBdaGntSnn5CcZdFm4ItBWg==", - "dev": true, - "dependencies": { - "@slack/logger": "^3.0.0", - "@slack/types": "^2.11.0", - "@types/is-stream": "^1.1.0", - "@types/node": ">=12.0.0", - "axios": "^1.6.5", - "eventemitter3": "^3.1.0", - "form-data": "^2.5.0", - "is-electron": "2.2.2", - "is-stream": "^1.1.0", - "p-queue": "^6.6.1", - "p-retry": "^4.0.0" - }, - "engines": { - "node": ">= 12.13.0", - "npm": ">= 6.12.0" - } - }, - "node_modules/@slack/web-api/node_modules/@slack/logger": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@slack/logger/-/logger-3.0.0.tgz", - "integrity": "sha512-DTuBFbqu4gGfajREEMrkq5jBhcnskinhr4+AnfJEk48zhVeEv3XnUKGIX98B74kxhYsIMfApGGySTn7V3b5yBA==", - "dev": true, - "dependencies": { - "@types/node": ">=12.0.0" - }, - "engines": { - "node": ">= 12.13.0", - "npm": ">= 6.12.0" - } - }, - "node_modules/@slack/web-api/node_modules/form-data": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", - "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/@slack/web-api/node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@slack/web-api/node_modules/p-queue": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", - "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", - "dev": true, - "dependencies": { - "eventemitter3": "^4.0.4", - "p-timeout": "^3.2.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@slack/web-api/node_modules/p-queue/node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, "node_modules/@types/babel__core": { "version": "7.20.1", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", @@ -14854,6 +14651,159 @@ "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", "dev": true }, + "@slack/bolt": { + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/@slack/bolt/-/bolt-3.17.0.tgz", + "integrity": "sha512-gxZygJj/wnrrSPCAlXO4D5FIYre2McPC+Vwrkq6CS74S4MI+0/gRvdUUXMHoF+oSGfsGs3ul6Fk+Bc/EE7Waig==", + "dev": true, + "requires": { + "@slack/logger": "^4.0.0", + "@slack/oauth": "^2.6.1", + "@slack/socket-mode": "^1.3.2", + "@slack/types": "^2.11.0", + "@slack/web-api": "^6.11.0", + "@types/express": "^4.16.1", + "@types/promise.allsettled": "^1.0.3", + "@types/tsscmp": "^1.0.0", + "axios": "^1.6.0", + "express": "^4.16.4", + "path-to-regexp": "^6.2.1", + "please-upgrade-node": "^3.2.0", + "promise.allsettled": "^1.0.2", + "raw-body": "^2.3.3", + "tsscmp": "^1.0.6" + }, + "dependencies": { + "path-to-regexp": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz", + "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==", + "dev": true + } + } + }, + "@slack/logger": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@slack/logger/-/logger-4.0.0.tgz", + "integrity": "sha512-Wz7QYfPAlG/DR+DfABddUZeNgoeY7d1J39OCR2jR+v7VBsB8ezulDK5szTnDDPDwLH5IWhLvXIHlCFZV7MSKgA==", + "dev": true, + "requires": { + "@types/node": ">=18.0.0" + } + }, + "@slack/oauth": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@slack/oauth/-/oauth-2.6.2.tgz", + "integrity": "sha512-2R3MyB/R63hTRXzk5J6wcui59TBxXzhk+Uh2/Xu3Wp3O4pXg/BNucQhP/DQbL/ScVhLvFtMXirLrKi0Yo5gIVw==", + "dev": true, + "requires": { + "@slack/logger": "^3.0.0", + "@slack/web-api": "^6.11.2", + "@types/jsonwebtoken": "^8.3.7", + "@types/node": ">=12", + "jsonwebtoken": "^9.0.0", + "lodash.isstring": "^4.0.1" + }, + "dependencies": { + "@slack/logger": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@slack/logger/-/logger-3.0.0.tgz", + "integrity": "sha512-DTuBFbqu4gGfajREEMrkq5jBhcnskinhr4+AnfJEk48zhVeEv3XnUKGIX98B74kxhYsIMfApGGySTn7V3b5yBA==", + "dev": true, + "requires": { + "@types/node": ">=12.0.0" + } + } + } + }, + "@slack/socket-mode": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@slack/socket-mode/-/socket-mode-1.3.3.tgz", + "integrity": "sha512-vN3zG4woRtf2Ut6rZgRW6G/Oe56uLMlnz39I08Q7DOvVfB+1MmDbNv0PNOiFgujdKXJR+bXF41/F/VvryXcqlw==", + "dev": true, + "requires": { + "@slack/logger": "^3.0.0", + "@slack/web-api": "^6.11.2", + "@types/node": ">=12.0.0", + "@types/p-queue": "^2.3.2", + "@types/ws": "^7.4.7", + "eventemitter3": "^3.1.0", + "finity": "^0.5.4", + "p-cancelable": "^1.1.0", + "p-queue": "^2.4.2", + "ws": "^7.5.3" + }, + "dependencies": { + "@slack/logger": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@slack/logger/-/logger-3.0.0.tgz", + "integrity": "sha512-DTuBFbqu4gGfajREEMrkq5jBhcnskinhr4+AnfJEk48zhVeEv3XnUKGIX98B74kxhYsIMfApGGySTn7V3b5yBA==", + "dev": true, + "requires": { + "@types/node": ">=12.0.0" + } + }, + "p-queue": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-2.4.2.tgz", + "integrity": "sha512-n8/y+yDJwBjoLQe1GSJbbaYQLTI7QHNZI2+rpmCDbe++WLf9HC3gf6iqj5yfPAV71W4UF3ql5W1+UBPXoXTxng==", + "dev": true + } + } + }, + "@slack/types": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@slack/types/-/types-2.11.0.tgz", + "integrity": "sha512-UlIrDWvuLaDly3QZhCPnwUSI/KYmV1N9LyhuH6EDKCRS1HWZhyTG3Ja46T3D0rYfqdltKYFXbJSSRPwZpwO0cQ==", + "dev": true + }, + "@slack/web-api": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/@slack/web-api/-/web-api-6.11.2.tgz", + "integrity": "sha512-s4qCQGXasr8jpCf/+6+V/smq+Z2RX7EIBnJeO/xe7Luie1nyBihFMgjICNyvzWoWBdaGntSnn5CcZdFm4ItBWg==", + "dev": true, + "requires": { + "@slack/logger": "^3.0.0", + "@slack/types": "^2.11.0", + "@types/is-stream": "^1.1.0", + "@types/node": ">=12.0.0", + "axios": "^1.6.5", + "eventemitter3": "^3.1.0", + "form-data": "^2.5.0", + "is-electron": "2.2.2", + "is-stream": "^1.1.0", + "p-queue": "^6.6.1", + "p-retry": "^4.0.0" + }, + "dependencies": { + "@slack/logger": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@slack/logger/-/logger-3.0.0.tgz", + "integrity": "sha512-DTuBFbqu4gGfajREEMrkq5jBhcnskinhr4+AnfJEk48zhVeEv3XnUKGIX98B74kxhYsIMfApGGySTn7V3b5yBA==", + "dev": true, + "requires": { + "@types/node": ">=12.0.0" + } + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true + } + } + }, "@types/babel__core": { "version": "7.20.1", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", From d68ea4912348fde1e7cc93416647a1322a34fe08 Mon Sep 17 00:00:00 2001 From: harshithad0703 Date: Thu, 11 Jan 2024 16:01:09 +0530 Subject: [PATCH 25/28] Revert "chore: :package: updated slack/bolt package to devDependencies" This reverts commit 7ca19119df9b587cab344cf596588fd3aec2abbe. --- package-lock.json | 356 ++++++++++++++++++++++++++-------------------- 1 file changed, 203 insertions(+), 153 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7b438f72..a41027fd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2909,6 +2909,209 @@ "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", "dev": true }, + "node_modules/@slack/bolt": { + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/@slack/bolt/-/bolt-3.17.0.tgz", + "integrity": "sha512-gxZygJj/wnrrSPCAlXO4D5FIYre2McPC+Vwrkq6CS74S4MI+0/gRvdUUXMHoF+oSGfsGs3ul6Fk+Bc/EE7Waig==", + "dev": true, + "dependencies": { + "@slack/logger": "^4.0.0", + "@slack/oauth": "^2.6.1", + "@slack/socket-mode": "^1.3.2", + "@slack/types": "^2.11.0", + "@slack/web-api": "^6.11.0", + "@types/express": "^4.16.1", + "@types/promise.allsettled": "^1.0.3", + "@types/tsscmp": "^1.0.0", + "axios": "^1.6.0", + "express": "^4.16.4", + "path-to-regexp": "^6.2.1", + "please-upgrade-node": "^3.2.0", + "promise.allsettled": "^1.0.2", + "raw-body": "^2.3.3", + "tsscmp": "^1.0.6" + }, + "engines": { + "node": ">=12.13.0", + "npm": ">=6.12.0" + } + }, + "node_modules/@slack/bolt/node_modules/path-to-regexp": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz", + "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==", + "dev": true + }, + "node_modules/@slack/logger": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@slack/logger/-/logger-4.0.0.tgz", + "integrity": "sha512-Wz7QYfPAlG/DR+DfABddUZeNgoeY7d1J39OCR2jR+v7VBsB8ezulDK5szTnDDPDwLH5IWhLvXIHlCFZV7MSKgA==", + "dev": true, + "dependencies": { + "@types/node": ">=18.0.0" + }, + "engines": { + "node": ">= 18", + "npm": ">= 8.6.0" + } + }, + "node_modules/@slack/oauth": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@slack/oauth/-/oauth-2.6.2.tgz", + "integrity": "sha512-2R3MyB/R63hTRXzk5J6wcui59TBxXzhk+Uh2/Xu3Wp3O4pXg/BNucQhP/DQbL/ScVhLvFtMXirLrKi0Yo5gIVw==", + "dev": true, + "dependencies": { + "@slack/logger": "^3.0.0", + "@slack/web-api": "^6.11.2", + "@types/jsonwebtoken": "^8.3.7", + "@types/node": ">=12", + "jsonwebtoken": "^9.0.0", + "lodash.isstring": "^4.0.1" + }, + "engines": { + "node": ">=12.13.0", + "npm": ">=6.12.0" + } + }, + "node_modules/@slack/oauth/node_modules/@slack/logger": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@slack/logger/-/logger-3.0.0.tgz", + "integrity": "sha512-DTuBFbqu4gGfajREEMrkq5jBhcnskinhr4+AnfJEk48zhVeEv3XnUKGIX98B74kxhYsIMfApGGySTn7V3b5yBA==", + "dev": true, + "dependencies": { + "@types/node": ">=12.0.0" + }, + "engines": { + "node": ">= 12.13.0", + "npm": ">= 6.12.0" + } + }, + "node_modules/@slack/socket-mode": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@slack/socket-mode/-/socket-mode-1.3.3.tgz", + "integrity": "sha512-vN3zG4woRtf2Ut6rZgRW6G/Oe56uLMlnz39I08Q7DOvVfB+1MmDbNv0PNOiFgujdKXJR+bXF41/F/VvryXcqlw==", + "dev": true, + "dependencies": { + "@slack/logger": "^3.0.0", + "@slack/web-api": "^6.11.2", + "@types/node": ">=12.0.0", + "@types/p-queue": "^2.3.2", + "@types/ws": "^7.4.7", + "eventemitter3": "^3.1.0", + "finity": "^0.5.4", + "p-cancelable": "^1.1.0", + "p-queue": "^2.4.2", + "ws": "^7.5.3" + }, + "engines": { + "node": ">=12.13.0", + "npm": ">=6.12.0" + } + }, + "node_modules/@slack/socket-mode/node_modules/@slack/logger": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@slack/logger/-/logger-3.0.0.tgz", + "integrity": "sha512-DTuBFbqu4gGfajREEMrkq5jBhcnskinhr4+AnfJEk48zhVeEv3XnUKGIX98B74kxhYsIMfApGGySTn7V3b5yBA==", + "dev": true, + "dependencies": { + "@types/node": ">=12.0.0" + }, + "engines": { + "node": ">= 12.13.0", + "npm": ">= 6.12.0" + } + }, + "node_modules/@slack/types": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@slack/types/-/types-2.11.0.tgz", + "integrity": "sha512-UlIrDWvuLaDly3QZhCPnwUSI/KYmV1N9LyhuH6EDKCRS1HWZhyTG3Ja46T3D0rYfqdltKYFXbJSSRPwZpwO0cQ==", + "dev": true, + "engines": { + "node": ">= 12.13.0", + "npm": ">= 6.12.0" + } + }, + "node_modules/@slack/web-api": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/@slack/web-api/-/web-api-6.11.2.tgz", + "integrity": "sha512-s4qCQGXasr8jpCf/+6+V/smq+Z2RX7EIBnJeO/xe7Luie1nyBihFMgjICNyvzWoWBdaGntSnn5CcZdFm4ItBWg==", + "dev": true, + "dependencies": { + "@slack/logger": "^3.0.0", + "@slack/types": "^2.11.0", + "@types/is-stream": "^1.1.0", + "@types/node": ">=12.0.0", + "axios": "^1.6.5", + "eventemitter3": "^3.1.0", + "form-data": "^2.5.0", + "is-electron": "2.2.2", + "is-stream": "^1.1.0", + "p-queue": "^6.6.1", + "p-retry": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0", + "npm": ">= 6.12.0" + } + }, + "node_modules/@slack/web-api/node_modules/@slack/logger": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@slack/logger/-/logger-3.0.0.tgz", + "integrity": "sha512-DTuBFbqu4gGfajREEMrkq5jBhcnskinhr4+AnfJEk48zhVeEv3XnUKGIX98B74kxhYsIMfApGGySTn7V3b5yBA==", + "dev": true, + "dependencies": { + "@types/node": ">=12.0.0" + }, + "engines": { + "node": ">= 12.13.0", + "npm": ">= 6.12.0" + } + }, + "node_modules/@slack/web-api/node_modules/form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/@slack/web-api/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@slack/web-api/node_modules/p-queue": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", + "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "dev": true, + "dependencies": { + "eventemitter3": "^4.0.4", + "p-timeout": "^3.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@slack/web-api/node_modules/p-queue/node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, "node_modules/@types/babel__core": { "version": "7.20.1", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", @@ -14651,159 +14854,6 @@ "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", "dev": true }, - "@slack/bolt": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/@slack/bolt/-/bolt-3.17.0.tgz", - "integrity": "sha512-gxZygJj/wnrrSPCAlXO4D5FIYre2McPC+Vwrkq6CS74S4MI+0/gRvdUUXMHoF+oSGfsGs3ul6Fk+Bc/EE7Waig==", - "dev": true, - "requires": { - "@slack/logger": "^4.0.0", - "@slack/oauth": "^2.6.1", - "@slack/socket-mode": "^1.3.2", - "@slack/types": "^2.11.0", - "@slack/web-api": "^6.11.0", - "@types/express": "^4.16.1", - "@types/promise.allsettled": "^1.0.3", - "@types/tsscmp": "^1.0.0", - "axios": "^1.6.0", - "express": "^4.16.4", - "path-to-regexp": "^6.2.1", - "please-upgrade-node": "^3.2.0", - "promise.allsettled": "^1.0.2", - "raw-body": "^2.3.3", - "tsscmp": "^1.0.6" - }, - "dependencies": { - "path-to-regexp": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz", - "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==", - "dev": true - } - } - }, - "@slack/logger": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@slack/logger/-/logger-4.0.0.tgz", - "integrity": "sha512-Wz7QYfPAlG/DR+DfABddUZeNgoeY7d1J39OCR2jR+v7VBsB8ezulDK5szTnDDPDwLH5IWhLvXIHlCFZV7MSKgA==", - "dev": true, - "requires": { - "@types/node": ">=18.0.0" - } - }, - "@slack/oauth": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@slack/oauth/-/oauth-2.6.2.tgz", - "integrity": "sha512-2R3MyB/R63hTRXzk5J6wcui59TBxXzhk+Uh2/Xu3Wp3O4pXg/BNucQhP/DQbL/ScVhLvFtMXirLrKi0Yo5gIVw==", - "dev": true, - "requires": { - "@slack/logger": "^3.0.0", - "@slack/web-api": "^6.11.2", - "@types/jsonwebtoken": "^8.3.7", - "@types/node": ">=12", - "jsonwebtoken": "^9.0.0", - "lodash.isstring": "^4.0.1" - }, - "dependencies": { - "@slack/logger": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@slack/logger/-/logger-3.0.0.tgz", - "integrity": "sha512-DTuBFbqu4gGfajREEMrkq5jBhcnskinhr4+AnfJEk48zhVeEv3XnUKGIX98B74kxhYsIMfApGGySTn7V3b5yBA==", - "dev": true, - "requires": { - "@types/node": ">=12.0.0" - } - } - } - }, - "@slack/socket-mode": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@slack/socket-mode/-/socket-mode-1.3.3.tgz", - "integrity": "sha512-vN3zG4woRtf2Ut6rZgRW6G/Oe56uLMlnz39I08Q7DOvVfB+1MmDbNv0PNOiFgujdKXJR+bXF41/F/VvryXcqlw==", - "dev": true, - "requires": { - "@slack/logger": "^3.0.0", - "@slack/web-api": "^6.11.2", - "@types/node": ">=12.0.0", - "@types/p-queue": "^2.3.2", - "@types/ws": "^7.4.7", - "eventemitter3": "^3.1.0", - "finity": "^0.5.4", - "p-cancelable": "^1.1.0", - "p-queue": "^2.4.2", - "ws": "^7.5.3" - }, - "dependencies": { - "@slack/logger": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@slack/logger/-/logger-3.0.0.tgz", - "integrity": "sha512-DTuBFbqu4gGfajREEMrkq5jBhcnskinhr4+AnfJEk48zhVeEv3XnUKGIX98B74kxhYsIMfApGGySTn7V3b5yBA==", - "dev": true, - "requires": { - "@types/node": ">=12.0.0" - } - }, - "p-queue": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-2.4.2.tgz", - "integrity": "sha512-n8/y+yDJwBjoLQe1GSJbbaYQLTI7QHNZI2+rpmCDbe++WLf9HC3gf6iqj5yfPAV71W4UF3ql5W1+UBPXoXTxng==", - "dev": true - } - } - }, - "@slack/types": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/@slack/types/-/types-2.11.0.tgz", - "integrity": "sha512-UlIrDWvuLaDly3QZhCPnwUSI/KYmV1N9LyhuH6EDKCRS1HWZhyTG3Ja46T3D0rYfqdltKYFXbJSSRPwZpwO0cQ==", - "dev": true - }, - "@slack/web-api": { - "version": "6.11.2", - "resolved": "https://registry.npmjs.org/@slack/web-api/-/web-api-6.11.2.tgz", - "integrity": "sha512-s4qCQGXasr8jpCf/+6+V/smq+Z2RX7EIBnJeO/xe7Luie1nyBihFMgjICNyvzWoWBdaGntSnn5CcZdFm4ItBWg==", - "dev": true, - "requires": { - "@slack/logger": "^3.0.0", - "@slack/types": "^2.11.0", - "@types/is-stream": "^1.1.0", - "@types/node": ">=12.0.0", - "axios": "^1.6.5", - "eventemitter3": "^3.1.0", - "form-data": "^2.5.0", - "is-electron": "2.2.2", - "is-stream": "^1.1.0", - "p-queue": "^6.6.1", - "p-retry": "^4.0.0" - }, - "dependencies": { - "@slack/logger": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@slack/logger/-/logger-3.0.0.tgz", - "integrity": "sha512-DTuBFbqu4gGfajREEMrkq5jBhcnskinhr4+AnfJEk48zhVeEv3XnUKGIX98B74kxhYsIMfApGGySTn7V3b5yBA==", - "dev": true, - "requires": { - "@types/node": ">=12.0.0" - } - }, - "form-data": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", - "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "dev": true - } - } - }, "@types/babel__core": { "version": "7.20.1", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", From dbd193484d04c3e4487b045cb895f7090828e39d Mon Sep 17 00:00:00 2001 From: harshithad0703 Date: Thu, 11 Jan 2024 17:20:05 +0530 Subject: [PATCH 26/28] updated slack/bolt package dependency --- package-lock.json | 20 +++----------------- package.json | 2 +- 2 files changed, 4 insertions(+), 18 deletions(-) diff --git a/package-lock.json b/package-lock.json index a41027fd..97da7ea4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "1.14.1", "license": "MIT", "dependencies": { + "@slack/bolt": "^3.17.0", "axios": "^1.6.5", "form-data": "^3.0.1", "lodash": "^4.17.21", @@ -21,7 +22,6 @@ "@babel/preset-env": "^7.18.2", "@babel/register": "^7.17.7", "@babel/runtime": "^7.18.3", - "@slack/bolt":"3.17.0", "@types/chai": "^4.3.11", "@types/jest": "^28.1.0", "@types/lodash": "^4.14.202", @@ -2913,7 +2913,6 @@ "version": "3.17.0", "resolved": "https://registry.npmjs.org/@slack/bolt/-/bolt-3.17.0.tgz", "integrity": "sha512-gxZygJj/wnrrSPCAlXO4D5FIYre2McPC+Vwrkq6CS74S4MI+0/gRvdUUXMHoF+oSGfsGs3ul6Fk+Bc/EE7Waig==", - "dev": true, "dependencies": { "@slack/logger": "^4.0.0", "@slack/oauth": "^2.6.1", @@ -2939,14 +2938,12 @@ "node_modules/@slack/bolt/node_modules/path-to-regexp": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz", - "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==", - "dev": true + "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==" }, "node_modules/@slack/logger": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@slack/logger/-/logger-4.0.0.tgz", "integrity": "sha512-Wz7QYfPAlG/DR+DfABddUZeNgoeY7d1J39OCR2jR+v7VBsB8ezulDK5szTnDDPDwLH5IWhLvXIHlCFZV7MSKgA==", - "dev": true, "dependencies": { "@types/node": ">=18.0.0" }, @@ -2959,7 +2956,6 @@ "version": "2.6.2", "resolved": "https://registry.npmjs.org/@slack/oauth/-/oauth-2.6.2.tgz", "integrity": "sha512-2R3MyB/R63hTRXzk5J6wcui59TBxXzhk+Uh2/Xu3Wp3O4pXg/BNucQhP/DQbL/ScVhLvFtMXirLrKi0Yo5gIVw==", - "dev": true, "dependencies": { "@slack/logger": "^3.0.0", "@slack/web-api": "^6.11.2", @@ -2977,7 +2973,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/@slack/logger/-/logger-3.0.0.tgz", "integrity": "sha512-DTuBFbqu4gGfajREEMrkq5jBhcnskinhr4+AnfJEk48zhVeEv3XnUKGIX98B74kxhYsIMfApGGySTn7V3b5yBA==", - "dev": true, "dependencies": { "@types/node": ">=12.0.0" }, @@ -2990,7 +2985,6 @@ "version": "1.3.3", "resolved": "https://registry.npmjs.org/@slack/socket-mode/-/socket-mode-1.3.3.tgz", "integrity": "sha512-vN3zG4woRtf2Ut6rZgRW6G/Oe56uLMlnz39I08Q7DOvVfB+1MmDbNv0PNOiFgujdKXJR+bXF41/F/VvryXcqlw==", - "dev": true, "dependencies": { "@slack/logger": "^3.0.0", "@slack/web-api": "^6.11.2", @@ -3012,7 +3006,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/@slack/logger/-/logger-3.0.0.tgz", "integrity": "sha512-DTuBFbqu4gGfajREEMrkq5jBhcnskinhr4+AnfJEk48zhVeEv3XnUKGIX98B74kxhYsIMfApGGySTn7V3b5yBA==", - "dev": true, "dependencies": { "@types/node": ">=12.0.0" }, @@ -3025,7 +3018,6 @@ "version": "2.11.0", "resolved": "https://registry.npmjs.org/@slack/types/-/types-2.11.0.tgz", "integrity": "sha512-UlIrDWvuLaDly3QZhCPnwUSI/KYmV1N9LyhuH6EDKCRS1HWZhyTG3Ja46T3D0rYfqdltKYFXbJSSRPwZpwO0cQ==", - "dev": true, "engines": { "node": ">= 12.13.0", "npm": ">= 6.12.0" @@ -3035,7 +3027,6 @@ "version": "6.11.2", "resolved": "https://registry.npmjs.org/@slack/web-api/-/web-api-6.11.2.tgz", "integrity": "sha512-s4qCQGXasr8jpCf/+6+V/smq+Z2RX7EIBnJeO/xe7Luie1nyBihFMgjICNyvzWoWBdaGntSnn5CcZdFm4ItBWg==", - "dev": true, "dependencies": { "@slack/logger": "^3.0.0", "@slack/types": "^2.11.0", @@ -3058,7 +3049,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/@slack/logger/-/logger-3.0.0.tgz", "integrity": "sha512-DTuBFbqu4gGfajREEMrkq5jBhcnskinhr4+AnfJEk48zhVeEv3XnUKGIX98B74kxhYsIMfApGGySTn7V3b5yBA==", - "dev": true, "dependencies": { "@types/node": ">=12.0.0" }, @@ -3071,7 +3061,6 @@ "version": "2.5.1", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", - "dev": true, "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", @@ -3085,7 +3074,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -3094,7 +3082,6 @@ "version": "6.6.2", "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", - "dev": true, "dependencies": { "eventemitter3": "^4.0.4", "p-timeout": "^3.2.0" @@ -3109,8 +3096,7 @@ "node_modules/@slack/web-api/node_modules/p-queue/node_modules/eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" }, "node_modules/@types/babel__core": { "version": "7.20.1", diff --git a/package.json b/package.json index 3dd3f734..6eede519 100644 --- a/package.json +++ b/package.json @@ -51,6 +51,7 @@ "author": "Contentstack", "license": "MIT", "dependencies": { + "@slack/bolt": "^3.17.0", "axios": "^1.6.5", "form-data": "^3.0.1", "lodash": "^4.17.21", @@ -68,7 +69,6 @@ "@babel/preset-env": "^7.18.2", "@babel/register": "^7.17.7", "@babel/runtime": "^7.18.3", - "@slack/bolt": "^3.17.0", "@types/chai": "^4.3.11", "@types/jest": "^28.1.0", "@types/lodash": "^4.14.202", From 6b3efbbac85e94799233ca8d33e700bad411b4f0 Mon Sep 17 00:00:00 2001 From: harshithad0703 Date: Thu, 11 Jan 2024 17:45:13 +0530 Subject: [PATCH 27/28] chore: added alldependencies required for slack/bolt package --- package-lock.json | 2383 ++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 2129 insertions(+), 254 deletions(-) diff --git a/package-lock.json b/package-lock.json index 97da7ea4..4c8de3e7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3139,12 +3139,29 @@ "@babel/types": "^7.20.7" } }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, "node_modules/@types/chai": { "version": "4.3.11", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.11.tgz", "integrity": "sha512-qQR1dr2rGIHYlJulmr8Ioq3De0Le9E4MJ5AiaeAETJJpndT1uUNHsGFK3L/UIu+rbkQSdj8J/w2bCsBZc/Y5fQ==", "dev": true }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/eslint": { "version": "8.44.2", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.2.tgz", @@ -3171,6 +3188,28 @@ "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", "dev": true }, + "node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.41", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.41.tgz", + "integrity": "sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, "node_modules/@types/glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", @@ -3190,6 +3229,19 @@ "@types/node": "*" } }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==" + }, + "node_modules/@types/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@types/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-jkZatu4QVbR60mpIzjINmtS1ZF4a/FqdTUTBeQDVOQ2PYyidtwFKr0B5G6ERukKwliq+7mIXvxyppwzG5EgRYg==", + "dependencies": { + "@types/node": "*" + } + }, "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", @@ -3236,6 +3288,14 @@ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, + "node_modules/@types/jsonwebtoken": { + "version": "8.5.9", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.9.tgz", + "integrity": "sha512-272FMnFGzAVMGtu9tkr29hRL6bZj4Zs1KZNeHLnKqAvp06tAIcarTMwOh8/8bz4FmKRcMxZhZNeUAQsNLoiPhg==", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/linkify-it": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.2.tgz", @@ -3264,6 +3324,11 @@ "integrity": "sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==", "dev": true }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" + }, "node_modules/@types/minimatch": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", @@ -3279,8 +3344,12 @@ "node_modules/@types/node": { "version": "20.5.3", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.3.tgz", - "integrity": "sha512-ITI7rbWczR8a/S6qjAW7DMqxqFMjjTo61qZVWJ1ubPvbIQsL5D/TvwjYEalM8Kthpe3hTzOGrF2TGbAu2uyqeA==", - "dev": true + "integrity": "sha512-ITI7rbWczR8a/S6qjAW7DMqxqFMjjTo61qZVWJ1ubPvbIQsL5D/TvwjYEalM8Kthpe3hTzOGrF2TGbAu2uyqeA==" + }, + "node_modules/@types/p-queue": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@types/p-queue/-/p-queue-2.3.2.tgz", + "integrity": "sha512-eKAv5Ql6k78dh3ULCsSBxX6bFNuGjTmof5Q/T6PiECDq0Yf8IIn46jCyp3RJvCi8owaEmm3DZH1PEImjBMd/vQ==" }, "node_modules/@types/prettier": { "version": "2.7.3", @@ -3288,12 +3357,64 @@ "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", "dev": true }, + "node_modules/@types/promise.allsettled": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/promise.allsettled/-/promise.allsettled-1.0.6.tgz", + "integrity": "sha512-wA0UT0HeT2fGHzIFV9kWpYz5mdoyLxKrTgMdZQM++5h6pYAFH73HXcQhefg24nD1yivUFEn5KU+EF4b+CXJ4Wg==" + }, + "node_modules/@types/qs": { + "version": "6.9.11", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz", + "integrity": "sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" + }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", + "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", + "dependencies": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, "node_modules/@types/stack-utils": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", "dev": true }, + "node_modules/@types/tsscmp": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/tsscmp/-/tsscmp-1.0.2.tgz", + "integrity": "sha512-cy7BRSU8GYYgxjcx0Py+8lo5MthuDhlyu076KUcYzVNXL23luYgRHkMG2fIFEc6neckeh/ntP82mw+U4QjZq+g==" + }, + "node_modules/@types/ws": { + "version": "7.4.7", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", + "integrity": "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/yargs": { "version": "17.0.24", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", @@ -3509,6 +3630,18 @@ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/acorn": { "version": "8.10.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", @@ -3663,7 +3796,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "is-array-buffer": "^3.0.1" @@ -3672,6 +3804,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, "node_modules/array-from": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", @@ -3773,11 +3910,28 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/array.prototype.map": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/array.prototype.map/-/array.prototype.map-1.0.6.tgz", + "integrity": "sha512-nK1psgF2cXqP3wSyCSq0Hc7zwNq3sfljQqaG27r/7a7ooNUnn5nGq6yYWyks9jMO5EoFQ0ax80hSg6oXSRNXaw==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/arraybuffer.prototype.slice": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", - "dev": true, "dependencies": { "array-buffer-byte-length": "^1.0.0", "call-bind": "^1.0.2", @@ -3811,7 +3965,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -4441,6 +4594,101 @@ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", "dev": true }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/body-parser/node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -4522,12 +4770,25 @@ "node-int64": "^0.4.0" } }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/caching-transform": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", @@ -4860,12 +5121,44 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/convert-source-map": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "dev": true }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, "node_modules/core-js": { "version": "2.6.12", "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", @@ -5005,7 +5298,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", - "dev": true, "dependencies": { "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" @@ -5052,6 +5344,15 @@ "node": ">= 0.6" } }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, "node_modules/detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -5106,6 +5407,19 @@ "node": ">=10" } }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, "node_modules/electron-to-chromium": { "version": "1.4.499", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.499.tgz", @@ -5139,6 +5453,14 @@ "node": ">= 4" } }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/enhanced-resolve": { "version": "5.15.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", @@ -5186,7 +5508,6 @@ "version": "1.22.1", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", - "dev": true, "dependencies": { "array-buffer-byte-length": "^1.0.0", "arraybuffer.prototype.slice": "^1.0.1", @@ -5235,6 +5556,30 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==" + }, + "node_modules/es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/es-module-lexer": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", @@ -5245,7 +5590,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", - "dev": true, "dependencies": { "get-intrinsic": "^1.1.3", "has": "^1.0.3", @@ -5268,7 +5612,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, "dependencies": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", @@ -5299,8 +5642,7 @@ "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, "node_modules/escape-string-regexp": { "version": "1.0.5", @@ -5786,6 +6128,19 @@ "node": ">=0.10.0" } }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", + "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==" + }, "node_modules/events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", @@ -5843,6 +6198,110 @@ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/express/node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/express/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/express/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -5912,27 +6371,65 @@ "node": ">=8" } }, - "node_modules/find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" }, "engines": { - "node": ">=6" + "node": ">= 0.8" } }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/finalhandler/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", "path-exists": "^4.0.0" }, "engines": { @@ -5942,6 +6439,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/finity": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/finity/-/finity-0.5.4.tgz", + "integrity": "sha512-3l+5/1tuw616Lgb0QBimxfdd2TqaDGpfCBpfX6EqtFmqUV3FtQnVEX4Aa62DagYEqnsTIjZcTfbq9msDbXYgyA==" + }, "node_modules/flat": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", @@ -6008,7 +6510,6 @@ "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, "dependencies": { "is-callable": "^1.1.3" } @@ -6039,6 +6540,22 @@ "node": ">= 6" } }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/fromentries": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", @@ -6114,7 +6631,6 @@ "version": "1.1.5", "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", @@ -6132,7 +6648,6 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -6203,7 +6718,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.1" @@ -6266,7 +6780,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dev": true, "dependencies": { "define-properties": "^1.1.3" }, @@ -6306,7 +6819,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -6371,7 +6883,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -6389,7 +6900,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, "dependencies": { "get-intrinsic": "^1.1.1" }, @@ -6423,7 +6933,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, "dependencies": { "has-symbols": "^1.0.2" }, @@ -6499,6 +7008,17 @@ "node": ">=10.17.0" } }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/ignore": { "version": "5.2.4", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", @@ -6638,14 +7158,12 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/internal-slot": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", - "dev": true, "dependencies": { "get-intrinsic": "^1.2.0", "has": "^1.0.3", @@ -6673,11 +7191,18 @@ "loose-envify": "^1.0.0" } }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/is-arguments": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -6693,7 +7218,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.2.0", @@ -6713,7 +7237,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, "dependencies": { "has-bigints": "^1.0.1" }, @@ -6737,7 +7260,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -6776,7 +7298,6 @@ "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -6800,7 +7321,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -6811,6 +7331,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-electron": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-electron/-/is-electron-2.2.2.tgz", + "integrity": "sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg==" + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -6850,11 +7375,18 @@ "node": ">=0.10.0" } }, + "node_modules/is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-negative-zero": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -6875,7 +7407,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -6953,7 +7484,6 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -6965,11 +7495,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-shared-array-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, "dependencies": { "call-bind": "^1.0.2" }, @@ -6993,7 +7530,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -7008,7 +7544,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, "dependencies": { "has-symbols": "^1.0.2" }, @@ -7023,7 +7558,6 @@ "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": { "which-typed-array": "^1.1.11" }, @@ -7056,7 +7590,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, "dependencies": { "call-bind": "^1.0.2" }, @@ -7076,8 +7609,7 @@ "node_modules/isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" }, "node_modules/isexe": { "version": "2.0.0", @@ -7285,6 +7817,26 @@ "node": ">=8" } }, + "node_modules/iterate-iterator": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/iterate-iterator/-/iterate-iterator-1.0.2.tgz", + "integrity": "sha512-t91HubM4ZDQ70M9wqp+pcNpu8OyJ9UAtXntT/Bcsvp5tZMnz9vRa+IunKXeI8AnfZMTv0jNuVEmGeLSMjVvfPw==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/iterate-value": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/iterate-value/-/iterate-value-1.0.2.tgz", + "integrity": "sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==", + "dependencies": { + "es-get-iterator": "^1.0.2", + "iterate-iterator": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/jest": { "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest/-/jest-28.1.3.tgz", @@ -9042,12 +9594,82 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/jsonwebtoken": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jsonwebtoken/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==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jsonwebtoken/node_modules/semver": { + "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" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jsonwebtoken/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "node_modules/just-extend": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", "dev": true }, + "node_modules/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -9167,6 +9789,16 @@ "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", "dev": true }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + }, "node_modules/lodash.isempty": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz", @@ -9179,17 +9811,31 @@ "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==", "dev": true }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" + }, "node_modules/lodash.isobject": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-3.0.2.tgz", "integrity": "sha512-3/Qptq2vr7WeJbB4KHUSKlq8Pl7ASXi3UG6CMbBm8WRtXi8+GHm7mKaU3urfpSEzWe2wCIChs6/sdocUsTKJiA==", "dev": true }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, "node_modules/lodash.isstring": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", - "dev": true + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" }, "node_modules/lodash.memoize": { "version": "4.1.2", @@ -9203,6 +9849,11 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" + }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -9407,12 +10058,33 @@ "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", "dev": true }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", @@ -9426,6 +10098,17 @@ "node": ">=8.6" } }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -9855,8 +10538,7 @@ "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/multiparty": { "version": "4.2.3", @@ -9890,6 +10572,14 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", @@ -10328,7 +11018,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, "engines": { "node": ">= 0.4" } @@ -10337,7 +11026,6 @@ "version": "4.1.4", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -10397,6 +11085,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -10453,6 +11152,22 @@ "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==", "dev": true }, + "node_modules/p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "engines": { + "node": ">=4" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -10492,6 +11207,37 @@ "node": ">=6" } }, + "node_modules/p-queue": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-2.4.2.tgz", + "integrity": "sha512-n8/y+yDJwBjoLQe1GSJbbaYQLTI7QHNZI2+rpmCDbe++WLf9HC3gf6iqj5yfPAV71W4UF3ql5W1+UBPXoXTxng==", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -10546,6 +11292,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -10739,6 +11493,14 @@ "node": ">=4" } }, + "node_modules/please-upgrade-node": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", + "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", + "dependencies": { + "semver-compare": "^1.0.0" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -10787,6 +11549,25 @@ "node": ">=8" } }, + "node_modules/promise.allsettled": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/promise.allsettled/-/promise.allsettled-1.0.7.tgz", + "integrity": "sha512-hezvKvQQmsFkOdrZfYxUxkyxl8mgFQeT259Ajj9PXdbg9VzBCWrItOev72JyWxkCD5VSSqAeHmlN3tWx4DlmsA==", + "dependencies": { + "array.prototype.map": "^1.0.5", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "iterate-value": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", @@ -10826,6 +11607,18 @@ "node >= 0.8.1" ] }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", @@ -10892,11 +11685,64 @@ "safe-buffer": "^5.1.0" } }, - "node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true }, "node_modules/readdirp": { "version": "3.6.0", @@ -10959,7 +11805,6 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -11111,6 +11956,14 @@ "node": ">=10" } }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "engines": { + "node": ">= 4" + } + }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -11160,7 +12013,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.2.0", @@ -11178,7 +12030,6 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, "funding": [ { "type": "github", @@ -11198,7 +12049,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.3", @@ -11208,6 +12058,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, "node_modules/schema-utils": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", @@ -11235,6 +12090,83 @@ "semver": "bin/semver.js" } }, + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==" + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/send/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/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==" + }, + "node_modules/send/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/serialize-javascript": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", @@ -11244,6 +12176,20 @@ "randombytes": "^2.1.0" } }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -11253,8 +12199,7 @@ "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, "node_modules/shallow-clone": { "version": "3.0.1", @@ -11450,6 +12395,17 @@ "node": ">= 0.6" } }, + "node_modules/stop-iteration-iterator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", + "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "dependencies": { + "internal-slot": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/string-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", @@ -11512,7 +12468,6 @@ "version": "1.2.7", "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -11529,7 +12484,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -11543,7 +12497,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -11867,7 +12820,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true, "engines": { "node": ">=0.6" } @@ -11990,6 +12942,14 @@ "node": ">=4" } }, + "node_modules/tsscmp": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", + "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==", + "engines": { + "node": ">=0.6.x" + } + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -12023,11 +12983,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/typed-array-buffer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.2.1", @@ -12041,7 +13012,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "for-each": "^0.3.3", @@ -12059,7 +13029,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", - "dev": true, "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", @@ -12078,7 +13047,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "for-each": "^0.3.3", @@ -12132,7 +13100,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "has-bigints": "^1.0.2", @@ -12198,6 +13165,14 @@ "node": ">= 10.0.0" } }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/update-browserslist-db": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", @@ -12237,6 +13212,14 @@ "punycode": "^2.1.0" } }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", @@ -12269,6 +13252,14 @@ "node": ">= 0.10" } }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", @@ -12484,7 +13475,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, "dependencies": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", @@ -12506,7 +13496,6 @@ "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", @@ -12602,6 +13591,26 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/xmlcreate": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.4.tgz", @@ -13069,7 +14078,8 @@ "version": "7.21.0-placeholder-for-preset-env.2", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "dev": true + "dev": true, + "requires": {} }, "@babel/plugin-syntax-async-generators": { "version": "7.8.4", @@ -13904,97 +14914,6 @@ "@babel/types": "^7.23.6", "debug": "^4.3.1", "globals": "^11.1.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", - "dev": true, - "requires": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" - } - }, - "@babel/generator": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", - "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", - "dev": true, - "requires": { - "@babel/types": "^7.23.6", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - } - }, - "@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true - }, - "@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "requires": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - } - }, - "@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", - "dev": true - }, - "@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true - }, - "@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", - "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", - "dev": true - }, - "@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - } - }, - "@babel/types": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", - "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - } - } } }, "@babel/types": { @@ -14840,6 +15759,157 @@ "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", "dev": true }, + "@slack/bolt": { + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/@slack/bolt/-/bolt-3.17.0.tgz", + "integrity": "sha512-gxZygJj/wnrrSPCAlXO4D5FIYre2McPC+Vwrkq6CS74S4MI+0/gRvdUUXMHoF+oSGfsGs3ul6Fk+Bc/EE7Waig==", + "requires": { + "@slack/logger": "^4.0.0", + "@slack/oauth": "^2.6.1", + "@slack/socket-mode": "^1.3.2", + "@slack/types": "^2.11.0", + "@slack/web-api": "^6.11.0", + "@types/express": "^4.16.1", + "@types/promise.allsettled": "^1.0.3", + "@types/tsscmp": "^1.0.0", + "axios": "^1.6.0", + "express": "^4.16.4", + "path-to-regexp": "^6.2.1", + "please-upgrade-node": "^3.2.0", + "promise.allsettled": "^1.0.2", + "raw-body": "^2.3.3", + "tsscmp": "^1.0.6" + }, + "dependencies": { + "path-to-regexp": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz", + "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==" + } + } + }, + "@slack/logger": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@slack/logger/-/logger-4.0.0.tgz", + "integrity": "sha512-Wz7QYfPAlG/DR+DfABddUZeNgoeY7d1J39OCR2jR+v7VBsB8ezulDK5szTnDDPDwLH5IWhLvXIHlCFZV7MSKgA==", + "requires": { + "@types/node": ">=18.0.0" + } + }, + "@slack/oauth": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@slack/oauth/-/oauth-2.6.2.tgz", + "integrity": "sha512-2R3MyB/R63hTRXzk5J6wcui59TBxXzhk+Uh2/Xu3Wp3O4pXg/BNucQhP/DQbL/ScVhLvFtMXirLrKi0Yo5gIVw==", + "requires": { + "@slack/logger": "^3.0.0", + "@slack/web-api": "^6.11.2", + "@types/jsonwebtoken": "^8.3.7", + "@types/node": ">=12", + "jsonwebtoken": "^9.0.0", + "lodash.isstring": "^4.0.1" + }, + "dependencies": { + "@slack/logger": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@slack/logger/-/logger-3.0.0.tgz", + "integrity": "sha512-DTuBFbqu4gGfajREEMrkq5jBhcnskinhr4+AnfJEk48zhVeEv3XnUKGIX98B74kxhYsIMfApGGySTn7V3b5yBA==", + "requires": { + "@types/node": ">=12.0.0" + } + } + } + }, + "@slack/socket-mode": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@slack/socket-mode/-/socket-mode-1.3.3.tgz", + "integrity": "sha512-vN3zG4woRtf2Ut6rZgRW6G/Oe56uLMlnz39I08Q7DOvVfB+1MmDbNv0PNOiFgujdKXJR+bXF41/F/VvryXcqlw==", + "requires": { + "@slack/logger": "^3.0.0", + "@slack/web-api": "^6.11.2", + "@types/node": ">=12.0.0", + "@types/p-queue": "^2.3.2", + "@types/ws": "^7.4.7", + "eventemitter3": "^3.1.0", + "finity": "^0.5.4", + "p-cancelable": "^1.1.0", + "p-queue": "^2.4.2", + "ws": "^7.5.3" + }, + "dependencies": { + "@slack/logger": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@slack/logger/-/logger-3.0.0.tgz", + "integrity": "sha512-DTuBFbqu4gGfajREEMrkq5jBhcnskinhr4+AnfJEk48zhVeEv3XnUKGIX98B74kxhYsIMfApGGySTn7V3b5yBA==", + "requires": { + "@types/node": ">=12.0.0" + } + } + } + }, + "@slack/types": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@slack/types/-/types-2.11.0.tgz", + "integrity": "sha512-UlIrDWvuLaDly3QZhCPnwUSI/KYmV1N9LyhuH6EDKCRS1HWZhyTG3Ja46T3D0rYfqdltKYFXbJSSRPwZpwO0cQ==" + }, + "@slack/web-api": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/@slack/web-api/-/web-api-6.11.2.tgz", + "integrity": "sha512-s4qCQGXasr8jpCf/+6+V/smq+Z2RX7EIBnJeO/xe7Luie1nyBihFMgjICNyvzWoWBdaGntSnn5CcZdFm4ItBWg==", + "requires": { + "@slack/logger": "^3.0.0", + "@slack/types": "^2.11.0", + "@types/is-stream": "^1.1.0", + "@types/node": ">=12.0.0", + "axios": "^1.6.5", + "eventemitter3": "^3.1.0", + "form-data": "^2.5.0", + "is-electron": "2.2.2", + "is-stream": "^1.1.0", + "p-queue": "^6.6.1", + "p-retry": "^4.0.0" + }, + "dependencies": { + "@slack/logger": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@slack/logger/-/logger-3.0.0.tgz", + "integrity": "sha512-DTuBFbqu4gGfajREEMrkq5jBhcnskinhr4+AnfJEk48zhVeEv3XnUKGIX98B74kxhYsIMfApGGySTn7V3b5yBA==", + "requires": { + "@types/node": ">=12.0.0" + } + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==" + }, + "p-queue": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", + "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "requires": { + "eventemitter3": "^4.0.4", + "p-timeout": "^3.2.0" + }, + "dependencies": { + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + } + } + } + } + }, "@types/babel__core": { "version": "7.20.1", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", @@ -14881,12 +15951,29 @@ "@babel/types": "^7.20.7" } }, + "@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, "@types/chai": { "version": "4.3.11", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.11.tgz", "integrity": "sha512-qQR1dr2rGIHYlJulmr8Ioq3De0Le9E4MJ5AiaeAETJJpndT1uUNHsGFK3L/UIu+rbkQSdj8J/w2bCsBZc/Y5fQ==", "dev": true }, + "@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "requires": { + "@types/node": "*" + } + }, "@types/eslint": { "version": "8.44.2", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.2.tgz", @@ -14913,6 +16000,28 @@ "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", "dev": true }, + "@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.41", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.41.tgz", + "integrity": "sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==", + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, "@types/glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", @@ -14932,6 +16041,19 @@ "@types/node": "*" } }, + "@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==" + }, + "@types/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@types/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-jkZatu4QVbR60mpIzjINmtS1ZF4a/FqdTUTBeQDVOQ2PYyidtwFKr0B5G6ERukKwliq+7mIXvxyppwzG5EgRYg==", + "requires": { + "@types/node": "*" + } + }, "@types/istanbul-lib-coverage": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", @@ -14978,6 +16100,14 @@ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, + "@types/jsonwebtoken": { + "version": "8.5.9", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.9.tgz", + "integrity": "sha512-272FMnFGzAVMGtu9tkr29hRL6bZj4Zs1KZNeHLnKqAvp06tAIcarTMwOh8/8bz4FmKRcMxZhZNeUAQsNLoiPhg==", + "requires": { + "@types/node": "*" + } + }, "@types/linkify-it": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.2.tgz", @@ -15006,6 +16136,11 @@ "integrity": "sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==", "dev": true }, + "@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" + }, "@types/minimatch": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", @@ -15021,8 +16156,12 @@ "@types/node": { "version": "20.5.3", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.3.tgz", - "integrity": "sha512-ITI7rbWczR8a/S6qjAW7DMqxqFMjjTo61qZVWJ1ubPvbIQsL5D/TvwjYEalM8Kthpe3hTzOGrF2TGbAu2uyqeA==", - "dev": true + "integrity": "sha512-ITI7rbWczR8a/S6qjAW7DMqxqFMjjTo61qZVWJ1ubPvbIQsL5D/TvwjYEalM8Kthpe3hTzOGrF2TGbAu2uyqeA==" + }, + "@types/p-queue": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@types/p-queue/-/p-queue-2.3.2.tgz", + "integrity": "sha512-eKAv5Ql6k78dh3ULCsSBxX6bFNuGjTmof5Q/T6PiECDq0Yf8IIn46jCyp3RJvCi8owaEmm3DZH1PEImjBMd/vQ==" }, "@types/prettier": { "version": "2.7.3", @@ -15030,12 +16169,64 @@ "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", "dev": true }, + "@types/promise.allsettled": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/promise.allsettled/-/promise.allsettled-1.0.6.tgz", + "integrity": "sha512-wA0UT0HeT2fGHzIFV9kWpYz5mdoyLxKrTgMdZQM++5h6pYAFH73HXcQhefg24nD1yivUFEn5KU+EF4b+CXJ4Wg==" + }, + "@types/qs": { + "version": "6.9.11", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz", + "integrity": "sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==" + }, + "@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" + }, + "@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" + }, + "@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "requires": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "@types/serve-static": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", + "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", + "requires": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, "@types/stack-utils": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", "dev": true }, + "@types/tsscmp": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/tsscmp/-/tsscmp-1.0.2.tgz", + "integrity": "sha512-cy7BRSU8GYYgxjcx0Py+8lo5MthuDhlyu076KUcYzVNXL23luYgRHkMG2fIFEc6neckeh/ntP82mw+U4QjZq+g==" + }, + "@types/ws": { + "version": "7.4.7", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", + "integrity": "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==", + "requires": { + "@types/node": "*" + } + }, "@types/yargs": { "version": "17.0.24", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", @@ -15207,7 +16398,8 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", - "dev": true + "dev": true, + "requires": {} }, "@webpack-cli/info": { "version": "1.5.0", @@ -15222,7 +16414,8 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", - "dev": true + "dev": true, + "requires": {} }, "@xtuc/ieee754": { "version": "1.2.0", @@ -15236,6 +16429,15 @@ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true }, + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, "acorn": { "version": "8.10.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", @@ -15246,13 +16448,15 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "dev": true + "dev": true, + "requires": {} }, "acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true + "dev": true, + "requires": {} }, "aggregate-error": { "version": "3.1.0", @@ -15280,7 +16484,8 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true + "dev": true, + "requires": {} }, "ansi-colors": { "version": "4.1.1", @@ -15347,12 +16552,16 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", - "dev": true, "requires": { "call-bind": "^1.0.2", "is-array-buffer": "^3.0.1" } }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, "array-from": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", @@ -15424,11 +16633,22 @@ "es-shim-unscopables": "^1.0.0" } }, + "array.prototype.map": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/array.prototype.map/-/array.prototype.map-1.0.6.tgz", + "integrity": "sha512-nK1psgF2cXqP3wSyCSq0Hc7zwNq3sfljQqaG27r/7a7ooNUnn5nGq6yYWyks9jMO5EoFQ0ax80hSg6oXSRNXaw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + } + }, "arraybuffer.prototype.slice": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", - "dev": true, "requires": { "array-buffer-byte-length": "^1.0.0", "call-bind": "^1.0.2", @@ -15452,8 +16672,7 @@ "available-typed-arrays": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==" }, "axios": { "version": "1.6.5", @@ -15966,6 +17185,81 @@ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", "dev": true }, + "body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + } + } + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -16021,12 +17315,22 @@ "node-int64": "^0.4.0" } }, + "buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + }, "buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + }, "caching-transform": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", @@ -16266,12 +17570,35 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, + "content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "requires": { + "safe-buffer": "5.2.1" + } + }, + "content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" + }, "convert-source-map": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "dev": true }, + "cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, "core-js": { "version": "2.6.12", "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", @@ -16373,7 +17700,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", - "dev": true, "requires": { "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" @@ -16405,6 +17731,11 @@ "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", "dev": true }, + "destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" + }, "detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -16444,6 +17775,19 @@ "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", "dev": true }, + "ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, "electron-to-chromium": { "version": "1.4.499", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.499.tgz", @@ -16468,6 +17812,11 @@ "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", "dev": true }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" + }, "enhanced-resolve": { "version": "5.15.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", @@ -16503,7 +17852,6 @@ "version": "1.22.1", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", - "dev": true, "requires": { "array-buffer-byte-length": "^1.0.0", "arraybuffer.prototype.slice": "^1.0.1", @@ -16546,6 +17894,27 @@ "which-typed-array": "^1.1.10" } }, + "es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==" + }, + "es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + } + }, "es-module-lexer": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", @@ -16556,7 +17925,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", - "dev": true, "requires": { "get-intrinsic": "^1.1.3", "has": "^1.0.3", @@ -16576,7 +17944,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, "requires": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", @@ -16598,8 +17965,7 @@ "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, "escape-string-regexp": { "version": "1.0.5", @@ -16737,7 +18103,8 @@ "version": "13.0.1", "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-13.0.1.tgz", "integrity": "sha512-zLKp4QOgq6JFgRm1dDCVv1Iu0P5uZ4v5Wa4DTOkg2RFMxdCX/9Qf7lz9ezRj2dBRa955cWQF/O/LWEiYWAHbTw==", - "dev": true + "dev": true, + "requires": {} }, "eslint-import-resolver-node": { "version": "0.3.9", @@ -16860,7 +18227,8 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-4.1.0.tgz", "integrity": "sha512-ZL7+QRixjTR6/528YNGyDotyffm5OQst/sGxKDwGb9Uqs4In5Egi4+jbobhqJoyoCM6/7v/1A5fhQ7ScMtDjaQ==", - "dev": true + "dev": true, + "requires": {} }, "eslint-scope": { "version": "7.2.2", @@ -16942,6 +18310,16 @@ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" + }, + "eventemitter3": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", + "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==" + }, "events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", @@ -16984,6 +18362,94 @@ "jest-util": "^28.1.3" } }, + "express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "requires": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + } + } + }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -17044,6 +18510,40 @@ "to-regex-range": "^5.0.1" } }, + "finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + } + } + }, "find-cache-dir": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", @@ -17065,6 +18565,11 @@ "path-exists": "^4.0.0" } }, + "finity": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/finity/-/finity-0.5.4.tgz", + "integrity": "sha512-3l+5/1tuw616Lgb0QBimxfdd2TqaDGpfCBpfX6EqtFmqUV3FtQnVEX4Aa62DagYEqnsTIjZcTfbq9msDbXYgyA==" + }, "flat": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", @@ -17107,7 +18612,6 @@ "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, "requires": { "is-callable": "^1.1.3" } @@ -17132,6 +18636,16 @@ "mime-types": "^2.1.12" } }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" + }, "fromentries": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", @@ -17183,7 +18697,6 @@ "version": "1.1.5", "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", - "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", @@ -17194,8 +18707,7 @@ "functions-have-names": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==" }, "gensync": { "version": "1.0.0-beta.2", @@ -17242,7 +18754,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, "requires": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.1" @@ -17287,7 +18798,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dev": true, "requires": { "define-properties": "^1.1.3" } @@ -17317,7 +18827,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, "requires": { "get-intrinsic": "^1.1.3" } @@ -17368,8 +18877,7 @@ "has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==" }, "has-flag": { "version": "3.0.0", @@ -17381,7 +18889,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, "requires": { "get-intrinsic": "^1.1.1" } @@ -17400,7 +18907,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, "requires": { "has-symbols": "^1.0.2" } @@ -17454,6 +18960,14 @@ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, "ignore": { "version": "5.2.4", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", @@ -17553,14 +19067,12 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "internal-slot": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", - "dev": true, "requires": { "get-intrinsic": "^1.2.0", "has": "^1.0.3", @@ -17582,11 +19094,15 @@ "loose-envify": "^1.0.0" } }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, "is-arguments": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, "requires": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -17596,7 +19112,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", - "dev": true, "requires": { "call-bind": "^1.0.2", "get-intrinsic": "^1.2.0", @@ -17613,7 +19128,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, "requires": { "has-bigints": "^1.0.1" } @@ -17631,7 +19145,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, "requires": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -17646,8 +19159,7 @@ "is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==" }, "is-core-module": { "version": "2.13.0", @@ -17662,11 +19174,15 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, "requires": { "has-tostringtag": "^1.0.0" } }, + "is-electron": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-electron/-/is-electron-2.2.2.tgz", + "integrity": "sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg==" + }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -17694,11 +19210,15 @@ "is-extglob": "^2.1.1" } }, + "is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==" + }, "is-negative-zero": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==" }, "is-number": { "version": "7.0.0", @@ -17710,7 +19230,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, "requires": { "has-tostringtag": "^1.0.0" } @@ -17766,17 +19285,20 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, "requires": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" } }, + "is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==" + }, "is-shared-array-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, "requires": { "call-bind": "^1.0.2" } @@ -17791,7 +19313,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, "requires": { "has-tostringtag": "^1.0.0" } @@ -17800,7 +19321,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, "requires": { "has-symbols": "^1.0.2" } @@ -17809,7 +19329,6 @@ "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": { "which-typed-array": "^1.1.11" } @@ -17830,7 +19349,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, "requires": { "call-bind": "^1.0.2" } @@ -17844,8 +19362,7 @@ "isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" }, "isexe": { "version": "2.0.0", @@ -18003,6 +19520,20 @@ "istanbul-lib-report": "^3.0.0" } }, + "iterate-iterator": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/iterate-iterator/-/iterate-iterator-1.0.2.tgz", + "integrity": "sha512-t91HubM4ZDQ70M9wqp+pcNpu8OyJ9UAtXntT/Bcsvp5tZMnz9vRa+IunKXeI8AnfZMTv0jNuVEmGeLSMjVvfPw==" + }, + "iterate-value": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/iterate-value/-/iterate-value-1.0.2.tgz", + "integrity": "sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==", + "requires": { + "es-get-iterator": "^1.0.2", + "iterate-iterator": "^1.0.1" + } + }, "jest": { "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest/-/jest-28.1.3.tgz", @@ -18604,7 +20135,8 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true + "dev": true, + "requires": {} }, "jest-regex-util": { "version": "28.0.2", @@ -19311,12 +20843,71 @@ "universalify": "^2.0.0" } }, + "jsonwebtoken": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "requires": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "dependencies": { + "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==", + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "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" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, "just-extend": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", "dev": true }, + "jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "requires": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -19412,6 +21003,16 @@ "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", "dev": true }, + "lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" + }, + "lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + }, "lodash.isempty": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz", @@ -19424,17 +21025,31 @@ "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==", "dev": true }, + "lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" + }, + "lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" + }, "lodash.isobject": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-3.0.2.tgz", "integrity": "sha512-3/Qptq2vr7WeJbB4KHUSKlq8Pl7ASXi3UG6CMbBm8WRtXi8+GHm7mKaU3urfpSEzWe2wCIChs6/sdocUsTKJiA==", "dev": true }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, "lodash.isstring": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", - "dev": true + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" }, "lodash.memoize": { "version": "4.1.2", @@ -19448,6 +21063,11 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" + }, "log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -19592,7 +21212,8 @@ "version": "8.6.7", "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz", "integrity": "sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==", - "dev": true + "dev": true, + "requires": {} }, "marked": { "version": "4.3.0", @@ -19606,12 +21227,27 @@ "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", "dev": true }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" + }, "micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", @@ -19622,6 +21258,11 @@ "picomatch": "^2.3.1" } }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, "mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -19943,8 +21584,7 @@ "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "multiparty": { "version": "4.2.3", @@ -19969,6 +21609,11 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + }, "neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", @@ -20313,14 +21958,12 @@ "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" }, "object.assign": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -20362,6 +22005,14 @@ "es-abstract": "^1.20.4" } }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "requires": { + "ee-first": "1.1.1" + } + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -20406,6 +22057,16 @@ "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==", "dev": true }, + "p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==" + }, "p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -20430,6 +22091,28 @@ "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", "dev": true }, + "p-queue": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-2.4.2.tgz", + "integrity": "sha512-n8/y+yDJwBjoLQe1GSJbbaYQLTI7QHNZI2+rpmCDbe++WLf9HC3gf6iqj5yfPAV71W4UF3ql5W1+UBPXoXTxng==" + }, + "p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "requires": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + } + }, + "p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "requires": { + "p-finally": "^1.0.0" + } + }, "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -20469,6 +22152,11 @@ "lines-and-columns": "^1.1.6" } }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -20615,6 +22303,14 @@ } } }, + "please-upgrade-node": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", + "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", + "requires": { + "semver-compare": "^1.0.0" + } + }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -20650,6 +22346,19 @@ "fromentries": "^1.2.0" } }, + "promise.allsettled": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/promise.allsettled/-/promise.allsettled-1.0.7.tgz", + "integrity": "sha512-hezvKvQQmsFkOdrZfYxUxkyxl8mgFQeT259Ajj9PXdbg9VzBCWrItOev72JyWxkCD5VSSqAeHmlN3tWx4DlmsA==", + "requires": { + "array.prototype.map": "^1.0.5", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "iterate-value": "^1.0.2" + } + }, "prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", @@ -20685,6 +22394,15 @@ "integrity": "sha512-T/rqCJJaIPYObiLSmaDsIf4PGA7y+pkgYFHmwoXQyOHiDDSO1YCxcztNiRBmV4EZha4QIbID3vQIHkqKu5k0Xg==", "dev": true }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, "proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", @@ -20725,6 +22443,46 @@ "safe-buffer": "^5.1.0" } }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "dependencies": { + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + } + } + }, "react-is": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", @@ -20783,7 +22541,6 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", - "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -20897,6 +22654,11 @@ "integrity": "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==", "dev": true }, + "retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==" + }, "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -20925,7 +22687,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", - "dev": true, "requires": { "call-bind": "^1.0.2", "get-intrinsic": "^1.2.0", @@ -20936,20 +22697,23 @@ "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, "safe-regex-test": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dev": true, "requires": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.3", "is-regex": "^1.1.4" } }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, "schema-utils": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", @@ -20967,6 +22731,75 @@ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==" + }, + "send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "requires": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.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==" + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + } + } + }, "serialize-javascript": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", @@ -20976,6 +22809,17 @@ "randombytes": "^2.1.0" } }, + "serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + } + }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -20985,8 +22829,7 @@ "setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, "shallow-clone": { "version": "3.0.1", @@ -21142,6 +22985,14 @@ "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "dev": true }, + "stop-iteration-iterator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", + "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "requires": { + "internal-slot": "^1.0.4" + } + }, "string-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", @@ -21190,7 +23041,6 @@ "version": "1.2.7", "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", - "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -21201,7 +23051,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", - "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -21212,7 +23061,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", - "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -21441,8 +23289,7 @@ "toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" }, "ts-jest": { "version": "28.0.8", @@ -21521,6 +23368,11 @@ } } }, + "tsscmp": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", + "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==" + }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -21542,11 +23394,19 @@ "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, "typed-array-buffer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", - "dev": true, "requires": { "call-bind": "^1.0.2", "get-intrinsic": "^1.2.1", @@ -21557,7 +23417,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", - "dev": true, "requires": { "call-bind": "^1.0.2", "for-each": "^0.3.3", @@ -21569,7 +23428,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", - "dev": true, "requires": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", @@ -21582,7 +23440,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", - "dev": true, "requires": { "call-bind": "^1.0.2", "for-each": "^0.3.3", @@ -21623,7 +23480,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, "requires": { "call-bind": "^1.0.2", "has-bigints": "^1.0.2", @@ -21671,6 +23527,11 @@ "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "dev": true }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" + }, "update-browserslist-db": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", @@ -21690,6 +23551,11 @@ "punycode": "^2.1.0" } }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" + }, "uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", @@ -21713,6 +23579,11 @@ "integrity": "sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==", "dev": true }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" + }, "walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", @@ -21859,7 +23730,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, "requires": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", @@ -21878,7 +23748,6 @@ "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", @@ -21952,6 +23821,12 @@ "signal-exit": "^3.0.7" } }, + "ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "requires": {} + }, "xmlcreate": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.4.tgz", From 5b132086f483ccc0f13525f0f420fb84505df377 Mon Sep 17 00:00:00 2001 From: Nadeem Patwekar Date: Tue, 16 Jan 2024 11:59:56 +0530 Subject: [PATCH 28/28] chore: updates LICENSE file --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index af16eb4a..e17cc926 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2012-2023 Contentstack +Copyright (c) 2012-2024 Contentstack Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal