diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index 6970f89667..9544ab9938 100644 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -64,6 +64,7 @@ env: EXTERNAL_ACS_HOST: ${{ secrets.EXTERNAL_ACS_HOST }} E2E_DEVOPS_USERNAME: ${{ secrets.E2E_DEVOPS_USERNAME }} E2E_DEVOPS_PASSWORD: ${{ secrets.E2E_DEVOPS_PASSWORD }} + DEFAULT_APPS_REPOSITORY: ${{ secrets.DEFAULT_APPS_REPOSITORY }} USERNAME_SUPER_ADMIN_ADF: ${{ secrets.USERNAME_SUPER_ADMIN_ADF }} PASSWORD_SUPER_ADMIN_ADF: ${{ secrets.PASSWORD_SUPER_ADMIN_ADF }} HR_USER: ${{ secrets.HR_USER }} diff --git a/cspell.json b/cspell.json index f8f274258e..22e7872ec3 100644 --- a/cspell.json +++ b/cspell.json @@ -17,6 +17,7 @@ "booleanvisibility", "booleanvisibilityprocess", "boolitem", + "BPMECM", "BPMHOST", "cardview", "checkboxes", @@ -142,7 +143,7 @@ "Whitespaces", "xdescribe", "xsrf", - "BPMECM" + "zipfile" ], "dictionaries": [ "html", diff --git a/e2e/resources/activiti7/candidatebaseapp.zip b/e2e/resources/activiti7/candidatebaseapp.zip deleted file mode 100644 index 2435b06853..0000000000 Binary files a/e2e/resources/activiti7/candidatebaseapp.zip and /dev/null differ diff --git a/e2e/resources/activiti7/connector-regression.zip b/e2e/resources/activiti7/connector-regression.zip deleted file mode 100644 index 9b7c2bec48..0000000000 Binary files a/e2e/resources/activiti7/connector-regression.zip and /dev/null differ diff --git a/e2e/resources/activiti7/simpleapp.zip b/e2e/resources/activiti7/simpleapp.zip deleted file mode 100644 index d49996eb62..0000000000 Binary files a/e2e/resources/activiti7/simpleapp.zip and /dev/null differ diff --git a/e2e/resources/activiti7/subprocessapp.zip b/e2e/resources/activiti7/subprocessapp.zip deleted file mode 100644 index c185bac913..0000000000 Binary files a/e2e/resources/activiti7/subprocessapp.zip and /dev/null differ diff --git a/e2e/resources/activiti7/uat-be-default-app.zip b/e2e/resources/activiti7/uat-be-default-app.zip deleted file mode 100644 index dfbddc4eea..0000000000 Binary files a/e2e/resources/activiti7/uat-be-default-app.zip and /dev/null differ diff --git a/lib/cli/README.md b/lib/cli/README.md index 194f7037ea..8387d8f473 100644 --- a/lib/cli/README.md +++ b/lib/cli/README.md @@ -156,12 +156,12 @@ adf-cli docker --target "link" --dockerRepo "${docker_repository}" --dockerTags The following command is in charge of Initializing the activiti cloud env with the default apps: ```bash -adf-cli init-aae-env --host "gateway_env" --oauth "identity_env" --identityHost "identity_env" --modelerUsername "modelerusername" --modelerPassword "modelerpassword" --devopsUsername "devopsusername" --devopsPassword "devopspassword" +adf-cli init-aae-env --host "gateway_env" --oauth "identity_env" --identityHost "identity_env" --modelerUsername "modelerusername" --modelerPassword "modelerpassword" --devopsUsername "devopsusername" --devopsPassword "devopspassword" --appsRepository "repository with default apps name" ``` You can also specify the environment ids of the envs where to deploy the app adding the `--envs` option: ```bash -adf-cli init-aae-env --host "gateway_env" --oauth "identity_env" --identityHost "identity_env" --modelerUsername "modelerusername" --modelerPassword "modelerpassword" --devopsUsername "devopsusername" --devopsPassword "devopspassword" --envs envId1 envId2 +adf-cli init-aae-env --host "gateway_env" --oauth "identity_env" --identityHost "identity_env" --modelerUsername "modelerusername" --modelerPassword "modelerpassword" --devopsUsername "devopsusername" --devopsPassword "devopspassword" --envs envId1 envId2 --appsRepository "repository with default apps name" ``` If you want to add a new app the schema needs to be: diff --git a/lib/cli/scripts/github-folder-downloader.ts b/lib/cli/scripts/github-folder-downloader.ts new file mode 100644 index 0000000000..fdcbb95869 --- /dev/null +++ b/lib/cli/scripts/github-folder-downloader.ts @@ -0,0 +1,51 @@ +import axios, { AxiosResponse } from 'axios'; +import AdmZip from 'adm-zip'; +import path from 'path'; + +export class GitHubRepoUtils { + private baseURL = 'https://api.github.com'; + private token: string; + private repo: string; + private subFolderName: string; + + constructor(token: string, repo: string) { + this.token = token; + this.repo = repo; + } + + async downloadRepoAndUnpackRepository(owner: string, branch = 'main'): Promise { + const url = `${this.baseURL}/repos/${owner}/${this.repo}/zipball/${branch}`; + const headers = { + Authorization: `token ${this.token}`, + Accept: 'application/vnd.github+json', + 'X-GitHub-Api-Version': '2022-11-28' + }; + + try { + const response: AxiosResponse = await axios.get(url, { + responseType: 'arraybuffer', + headers, + }); + const repoZipped = new AdmZip(response.data); + this.subFolderName = (repoZipped.getEntries().find(entry => entry.entryName.includes(owner))).entryName; + + new AdmZip(response.data).extractAllTo(this.repo, /** overwrite **/ true); + + } catch (error) { + throw new Error(`Failed to download repository: ${error}`); + } + } + + async zipNeededApplication(appName: string): Promise { + const pathToZip = path.resolve(`${process.cwd()}/${this.repo}`, `${appName}.zip`); + try { + const zip = new AdmZip(); + zip.addLocalFolder(`${process.cwd()}/${this.repo}/${this.subFolderName}${appName}`); + await zip.writeZipPromise(pathToZip); + } catch (e) { + console.log(`Error during zipping app ${e}`) + } + return pathToZip; + } + +} diff --git a/lib/cli/scripts/init-aae-env.ts b/lib/cli/scripts/init-aae-env.ts index 25de52dad3..6c12f105ce 100755 --- a/lib/cli/scripts/init-aae-env.ts +++ b/lib/cli/scripts/init-aae-env.ts @@ -18,11 +18,12 @@ */ import program from 'commander'; -import fetch from 'node-fetch'; import * as fs from 'fs'; import { logger } from './logger'; import { AlfrescoApi, AlfrescoApiConfig } from '@alfresco/js-api'; import { argv, exit } from 'node:process'; +import { GitHubRepoUtils } from './github-folder-downloader'; + const ACTIVITI_CLOUD_APPS = require('./resources').ACTIVITI_CLOUD_APPS; let alfrescoJsApiModeler: AlfrescoApi; @@ -42,6 +43,9 @@ export interface ConfigArgs { host: string; tag: string; envs: string[]; + ghToken: string; + branch: string; + appsRepository: string; } export const AAE_MICROSERVICES = ['deployment-service', 'modeling-service', 'dmn-service']; @@ -94,7 +98,7 @@ async function healthCheck(nameService: string) { */ async function getApplications(): Promise<{ list: { entries: any[] } }> { const url = `${args.host}/deployment-service/v1/applications`; - + logger.info(url) const pathParams = {}; const queryParams = {}; const headerParams = {}; @@ -105,8 +109,7 @@ async function getApplications(): Promise<{ list: { entries: any[] } }> { try { await alfrescoJsApiDevops.login(args.devopsUsername, args.devopsPassword); - - const result = alfrescoJsApiDevops.oauth2Auth.callCustomApi( + const result = await alfrescoJsApiDevops.oauth2Auth.callCustomApi( url, 'GET', pathParams, @@ -117,12 +120,10 @@ async function getApplications(): Promise<{ list: { entries: any[] } }> { contentTypes, accepts ); - result.on('error', (error) => { - logger.error(`Get application by status ${error} `); - }); + // logger.info(result) return result; } catch (error) { - logger.error(`Get application by status ${error.status} `); + logger.error(`Get application by status ${JSON.stringify(error)} `); isValid = false; return null; } @@ -312,7 +313,6 @@ function deleteProject(projectId: string) { */ async function importAndReleaseProject(absoluteFilePath: string) { const fileContent = fs.createReadStream(absoluteFilePath); - try { const project = await alfrescoJsApiModeler.oauth2Auth.callCustomApi( `${args.host}/modeling-service/v1/projects/import`, @@ -340,7 +340,7 @@ async function importAndReleaseProject(absoluteFilePath: string) { ['application/json'] ); } catch (error) { - logger.error(`Not able to import the project/create the release ${absoluteFilePath} with status: ${error}`); + logger.error(`Not able to import the project/create the release with status: ${JSON.stringify(error)}`); isValid = false; throw error; } @@ -464,7 +464,7 @@ function getAlfrescoJsApiInstance(configArgs: ConfigArgs): AlfrescoApi { * @param tag tag * @param envs environments */ -async function deployMissingApps(tag?: string, envs?: string[]) { +async function deployMissingApps(envs: any) { const deployedApps = await getApplications(); const failingApps = findFailingApps(deployedApps.list.entries); const missingApps = findMissingApps(deployedApps.list.entries); @@ -479,7 +479,7 @@ async function deployMissingApps(tag?: string, envs?: string[]) { exit(1); } else if (missingApps.length > 0) { logger.warn(`Missing apps: ${JSON.stringify(missingApps)}`); - await checkIfAppIsReleased(missingApps, tag, envs); + await checkIfAppIsReleased(missingApps, envs); } else { const reset = '\x1b[0m'; const green = '\x1b[32m'; @@ -494,22 +494,25 @@ async function deployMissingApps(tag?: string, envs?: string[]) { * @param tag tag * @param envs environments */ -async function checkIfAppIsReleased(missingApps: any[], tag?: string, envs?: string[]) { +async function checkIfAppIsReleased(missingApps: any[], envs: any) { const projectList = await getProjects(); + let TIME = 5000; let noError = true; + const gitHubRepoUtils = new GitHubRepoUtils(envs.ghToken, envs.appsRepository); + await gitHubRepoUtils.downloadRepoAndUnpackRepository('HylandSoftware', envs.branch); + for (let i = 0; i < missingApps.length; i++) { noError = true; const currentAbsentApp = missingApps[i]; const project = projectList.list.entries.find((currentApp: any) => currentAbsentApp.name === currentApp.entry.name); let projectRelease: any; - if (project === undefined) { logger.warn('Missing project: Create the project for ' + currentAbsentApp.name); try { - projectRelease = await importProjectAndRelease(currentAbsentApp, tag); + projectRelease = await importProjectAndRelease(currentAbsentApp, gitHubRepoUtils); } catch (error) { logger.info(`error status ${error.status}`); @@ -530,7 +533,7 @@ async function checkIfAppIsReleased(missingApps: any[], tag?: string, envs?: str if (projectReleaseList.list.entries.length === 0) { logger.warn('Project needs release'); - projectRelease = await releaseProject(project); + projectRelease = await releaseProject(project.entry.id); logger.warn(`Project released: ${projectRelease.id}`); } else { logger.info('Project already has release'); @@ -558,6 +561,7 @@ async function checkIfAppIsReleased(missingApps: any[], tag?: string, envs?: str await deployWithPayload(currentAbsentApp, projectRelease); } } + } } @@ -611,16 +615,11 @@ async function checkDescriptorExist(name: string): Promise { * @param app application * @param tag tag */ -async function importProjectAndRelease(app: any, tag?: string) { - const appLocationReplaced = app.file_location(tag); - - logger.warn('App fileLocation ' + appLocationReplaced); - await getFileFromRemote(appLocationReplaced, app.name); +async function importProjectAndRelease(app: any, gitHubRepoUtils: GitHubRepoUtils) { + const pathToApp = await gitHubRepoUtils.zipNeededApplication(app.name) + const projectRelease = await importAndReleaseProject(pathToApp) logger.warn('Project imported ' + app.name); - const projectRelease = await importAndReleaseProject(`${app.name}.zip`); - - await deleteLocalFile(`${app.name}`); return projectRelease; } @@ -666,48 +665,6 @@ function findFailingApps(deployedApps: any[]): any[] { return result; } -/** - * Get file from the remote - * - * @param url url to file - * @param name name - */ -async function getFileFromRemote(url: string, name: string): Promise { - return fetch(url) - .then((response) => { - if (!response.ok) { - throw new Error(`HTTP error! Status: ${response.status}`); - } - return response; - }) - .then((response) => new Promise((resolve, reject) => { - const outputFile = fs.createWriteStream(`${name}.zip`); - response.body.pipe(outputFile); - outputFile.on('finish', () => { - logger.info(`The file is finished downloading.`); - resolve(); - }); - outputFile.on('error', (error) => { - logger.error(`Not possible to download the project form remote`); - reject(error); - }); - })) - .catch((error) => { - logger.error(`Failed to fetch file from remote: ${error.message}`); - throw error; - }); -} - -/** - * Deletes local file - * - * @param name file name - */ -async function deleteLocalFile(name: string) { - logger.info(`Deleting local file ${name}.zip`); - fs.unlinkSync(`${name}.zip`); -} - /** * Perform a timeout * @@ -728,7 +685,7 @@ export default async function main() { .version('0.1.0') .description( 'The following command is in charge of Initializing the activiti cloud env with the default apps' + - 'adf-cli init-aae-env --host "gateway_env" --modelerUsername "modelerusername" --modelerPassword "modelerpassword" --devopsUsername "devevopsusername" --devopsPassword "devopspassword"' + 'adf-cli init-aae-env --host "gateway_env" --modelerUsername "modelerusername" --modelerPassword "modelerpassword" --devopsUsername "devevopsusername" --devopsPassword "devopspassword" --appsRepository "repositoryName"' ) .option('-h, --host [type]', 'Host gateway') .option('--oauth [type]', 'SSO host') @@ -742,6 +699,9 @@ export default async function main() { .option('--devopsPassword [type]', 'devops password') .option('--tag [type]', 'tag name of the codebase') .option('--envs [type...]', 'environment ids of the envs where to deploy the app') + .option('--ghToken [type]', 'GitHub token to retrieve the private repo') + .option('--branch [type]', 'target branch of GitHub repository with the default apps. Default main') + .option('--appsRepository [type]', 'GitHub repository with the apps') .parse(argv); if (argv.includes('-h') || argv.includes('--help')) { @@ -763,7 +723,10 @@ export default async function main() { scope: options.scope, secret: options.secret, tag: options.tag, - envs: options.envs + envs: options.envs, + ghToken: options.ghToken, + branch: options.branch, + appsRepository: options.appsRepository }; alfrescoJsApiModeler = getAlfrescoJsApiInstance(args); @@ -799,9 +762,16 @@ export default async function main() { } ); - await deployMissingApps(args.tag, args.envs); + await deployMissingApps(args); + + const pathToRepositoryWithApps = `${process.cwd()}/${args.appsRepository}`; + if (fs.existsSync(pathToRepositoryWithApps)) { + fs.rmSync(pathToRepositoryWithApps, { force: true, recursive: true }); + } } else { logger.error('The environment is not up'); exit(1); } } + +main() diff --git a/lib/cli/scripts/resources.ts b/lib/cli/scripts/resources.ts index cdb53573db..0253f278bc 100644 --- a/lib/cli/scripts/resources.ts +++ b/lib/cli/scripts/resources.ts @@ -21,11 +21,6 @@ export const ACTIVITI_CLOUD_APPS: any = { SUB_PROCESS_APP: { name: 'subprocessapp', - file_location: (TAG = 'develop') => `https://github.com/Alfresco/alfresco-ng2-components/blob/${TAG}/e2e/resources/activiti7/subprocessapp.zip?raw=true`, - processes: { - processchild: 'processchild', - processparent: 'processparent' - }, security: [ { role: 'APPLICATION_MANAGER', groups: [], users: ['manageruser'] }, { role: 'ACTIVITI_ADMIN', groups: [], users: ['superadminuser'] }, @@ -34,170 +29,14 @@ export const ACTIVITI_CLOUD_APPS: any = { }, CANDIDATE_BASE_APP: { name: 'candidatebaseapp', - file_location: (TAG = 'develop') => `https://github.com/Alfresco/alfresco-ng2-components/blob/${TAG}/e2e/resources/activiti7/candidatebaseapp.zip?raw=true`, - processes: { - candidateUserProcess: 'candidateuserprocess', - candidateGroupProcess: 'candidategroupprocess', - anotherCandidateGroupProcess: 'anothercandidategroup', - uploadFileProcess: 'uploadfileprocess', - processwithstarteventform: 'processwithstarteventform', - processwithjsonfilemapping: 'processwithjsonfilemapping', - assigneeProcess: 'assigneeprocess', - errorStartEventProcess: { - process_name: 'errorstartevent', - error_id: 'Error_END_EVENT', - error_code: '123' - }, - errorBoundaryEventProcess: { - process_name: 'errorboundaryevent', - error_id: 'Error_END_EVENT', - error_code: '567' - }, - errorExclusiveGateProcess: { - process_name: 'errorexclusivegate', - error_id: 'Error_OK', - error_code: '200' - } - }, - forms: { - starteventform: 'starteventform', - formtotestvalidations: 'formtotestvalidations', - uploadfileform: 'uploadfileform', - inputform: 'inputform', - outputform: 'outputform' - }, security: [ { role: 'APPLICATION_MANAGER', groups: [], users: ['manageruser'] }, { role: 'ACTIVITI_ADMIN', groups: [], users: ['superadminuser', 'processadminuser'] }, { role: 'ACTIVITI_USER', groups: ['hr', 'testgroup'], users: ['hruser', 'salesuser'] } ], - tasks: { - uploadFileTask: 'UploadFileTask', - candidateUserTask: 'candidateUserTask' - } }, SIMPLE_APP: { name: 'simpleapp', - file_location: (TAG = 'develop') => `https://github.com/Alfresco/alfresco-ng2-components/blob/${TAG}/e2e/resources/activiti7/simpleapp.zip?raw=true`, - processes: { - processwithvariables: 'processwithvariables', - simpleProcess: 'simpleprocess', - dropdownrestprocess: 'dropdownrestprocess', - multilingualprocess: 'multilingualprocess', - processWithTabVisibility: 'processwithtabvisibility', - startmessageevent: 'start-message-event', - intermediatemessageevent: 'intermediate-message-event', - intboundaryevent: 'int-boundary-event', - nonintboundaryevent: 'nonint-boundary-event', - intboundarysubprocess: 'int-boundary-subprocess', - intstartmessageevent: 'int-start-message-event', - nonintstartmessageevent: 'nonint-start-message-event', - siblingtaskprocess: 'siblingtaskprocess', - startTaskVisibilityForm: 'start-task-visibility-form', - startVisibilityForm: 'start-visibility-form', - processstring: 'processstring', - processinteger: 'processinteger', - processboolean: 'processboolean', - processdate: 'processdate', - multiprocess: 'multiprocess', - terminateexclusive: 'terminate-exclusive', - terminatesubprocess: 'terminate-subprocess', - multiinstancedmnparallel: 'multiinstance-dmnparallel', - multiinstancecallactivity: 'multiinstance-callactivity', - multiinstancecollection: 'multiinstance-collection', - multiinstancecompletion: 'multiinstance-completion', - multiinstancesequential: 'multiinstance-sequential', - multiinstanceservicetask: 'multiinstance-servicetask', - multiinstanceusertask: 'multiinstance-usertask', - multiinstancedmnsequence: 'multiinstance-dmnsequence', - multiinstancemanualtask: 'multiinstance-manualtask', - multiinstancesubprocess: 'multiinstance-subprocess', - calledprocess: 'calledprocess', - booleanvisibilityprocess: 'booleanvisibilityprocess', - numbervisibilityprocess: 'numbervisibilityprocess', - processformoutcome: 'outcomebuttons', - uploadSingleMultipleFiles: 'upload-single-multiple-pro', - processDisplayRestJson: 'process-display-rest-json', - poolStartEndMessageThrow: 'pool-start-end-mess-throw', - poolStartEndMessageCatch: 'pool-start-end-mess-catch', - poolProcessCalled: 'pool-process-called', - poolProcessCalling: 'pool-process-calling', - poolNonIntBoundaryThrown: 'pool-nonint-boundary-throw', - poolNonIntBoundaryCatch: 'pool-nonint-boundary-catch', - poolIntermediateMessageThrow: 'pool-interm-message-throw', - poolIntermediateMessageCatch: 'pool-interm-message-catch', - poolInterruptingBoundarySubprocessThrow: 'pool-int-bound-subpr-throw', - poolInterruptingBoundarySubprocessCatch: 'pool-int-bound-subpr-catch', - poolInterruptingBoundaryThrow: 'pool-int-boundary-throw', - poolInterruptingBoundaryCatch: 'pool-int-boundary-catch', - outputVariablesMapping: 'output-variables-mapping' - }, - forms: { - tabVisibilityFields: { - name: 'tabvisibilitywithfields' - }, - tabVisibilityVars: { - name: 'tabvisibilitywithvars' - }, - usertaskform: { - name: 'usertaskform' - }, - dropdownform: { - name: 'dropdownform' - }, - formVisibility: { - name: 'form-visibility' - }, - multilingualform: { - name: 'multilingualform' - }, - inputform: { - name: 'inputform' - }, - outputform: { - name: 'outputform' - }, - exclusiveconditionform: { - name: 'exclusive-condition-form' - }, - uploadlocalfileform: { - name: 'upload-localfile-form' - }, - booleanvisibility: { - name: 'booleanvisibility' - }, - requirednumbervisibility: { - name: 'requirednumbervisibility' - }, - mealform: { - name: 'mealform' - }, - resultcollectionform: { - name: 'resultcollectionform' - }, - uploadSingleMultiple: { - name: 'upload-single-multiple', - widgets: { - contentMultipleAttachFileId: 'UploadMultipleFileFromContentId' - } - }, - formWithJsonWidget: { - name: 'form-with-json-widget' - }, - formWithAllWidgets: { - name: 'form-with-all-widgets' - }, - poolForm: { - name: 'pool-usertaskform' - }, - formWithSingleInput: { - name: 'form-with-single-input' - } - }, - tasks: { - processstring: 'inputtask', - uploadSingleMultipleFiles: 'UploadSingleMultipleFiles' - }, security: [ { role: 'APPLICATION_MANAGER', groups: [], users: ['manageruser'] }, { role: 'ACTIVITI_ADMIN', groups: [], users: ['superadminuser', 'processadminuser'] }, @@ -208,10 +47,6 @@ export const ACTIVITI_CLOUD_APPS: any = { }, UAT_BE_DEFAULT_APP: { name: 'uat-be-default-app', - file_location: (TAG = 'develop') => `https://github.com/Alfresco/alfresco-ng2-components/blob/${TAG}/e2e/resources/activiti7/uat-be-default-app.zip?raw=true`, - processes: { - 'script-acs-process': 'script-acs-process' - }, security: [ { role: 'ACTIVITI_ADMIN', groups: [], users: ['processadminuser'] }, { role: 'ACTIVITI_USER', groups: [], users: ['hruser', 'salesuser', 'testadmin', 'testuser'] } diff --git a/package-lock.json b/package-lock.json index 4d37755b9e..3ebf804ab6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -93,9 +93,12 @@ "@typescript-eslint/eslint-plugin": "5.59.8", "@typescript-eslint/parser": "5.62.0", "@typescript-eslint/typescript-estree": "6.7.0", + "adm-zip": "^0.5.10", "ajv": "^8.12.0", + "archiver": "^6.0.1", "commander": "6.2.1", "css-loader": "^6.8.1", + "decompress": "^4.2.1", "dotenv": "16.1.3", "editorjs-text-color-plugin": "1.13.1", "ejs": "^3.1.9", @@ -156,7 +159,8 @@ "typescript": "4.7.4", "webdriver-manager": "12.1.9", "webpack": "^5.88.2", - "webpack-cli": "^5.1.2" + "webpack-cli": "^5.1.2", + "zip-a-folder": "^3.1.5" }, "engines": { "node": ">=6.0.0" @@ -25098,6 +25102,52 @@ "devOptional": true, "license": "ISC" }, + "node_modules/archiver": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-6.0.1.tgz", + "integrity": "sha512-CXGy4poOLBKptiZH//VlWdFuUC1RESbdZjGjILwBuZ73P7WkAUN0htfSfBq/7k6FRFlpu7bg4JOkj1vU9G6jcQ==", + "dev": true, + "dependencies": { + "archiver-utils": "^4.0.1", + "async": "^3.2.4", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.1.2", + "tar-stream": "^3.0.0", + "zip-stream": "^5.0.1" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/archiver-utils": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-4.0.1.tgz", + "integrity": "sha512-Q4Q99idbvzmgCTEAAhi32BkOyq8iVI5EwdO0PmBDSGIzzjYNdcFn7Q7k3OzbLy4kLUPXfJtG6fO2RjftXbobBg==", + "dev": true, + "dependencies": { + "glob": "^8.0.0", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash": "^4.17.15", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/archiver/node_modules/tar-stream": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.6.tgz", + "integrity": "sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==", + "dev": true, + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, "node_modules/are-we-there-yet": { "version": "2.0.0", "devOptional": true, @@ -25510,6 +25560,12 @@ "deep-equal": "^2.0.5" } }, + "node_modules/b4a": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz", + "integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==", + "dev": true + }, "node_modules/babel-jest": { "version": "28.1.3", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-28.1.3.tgz", @@ -26891,6 +26947,37 @@ "ieee754": "^1.1.13" } }, + "node_modules/buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dev": true, + "dependencies": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "node_modules/buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", + "dev": true + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==", + "dev": true + }, "node_modules/buffer-from": { "version": "1.1.2", "dev": true, @@ -27815,6 +27902,21 @@ "version": "1.3.0", "license": "MIT" }, + "node_modules/compress-commons": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-5.0.1.tgz", + "integrity": "sha512-MPh//1cERdLtqwO3pOFLeXtpuai0Y2WCd5AhtKxznqM7WtaMYaOEMSgn45d9D10sIHSfIKE603HlOp8OPGrvag==", + "dev": true, + "dependencies": { + "crc-32": "^1.2.0", + "crc32-stream": "^5.0.0", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, "node_modules/compressible": { "version": "2.0.18", "license": "MIT", @@ -28667,6 +28769,31 @@ "node": ">=0.10.0" } }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "dev": true, + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/crc32-stream": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-5.0.0.tgz", + "integrity": "sha512-B0EPa1UK+qnpBZpG+7FgPCu0J2ETLpXq09o9BkLkEAhdB6Z61Qo4pJ3JYu0c+Qi+/SAL7QThqnzS06pmSSyZaw==", + "dev": true, + "dependencies": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, "node_modules/create-ecdh": { "version": "4.0.4", "dev": true, @@ -29578,6 +29705,25 @@ "node": ">=0.10" } }, + "node_modules/decompress": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.1.tgz", + "integrity": "sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==", + "dev": true, + "dependencies": { + "decompress-tar": "^4.0.0", + "decompress-tarbz2": "^4.0.0", + "decompress-targz": "^4.0.0", + "decompress-unzip": "^4.0.1", + "graceful-fs": "^4.1.10", + "make-dir": "^1.0.0", + "pify": "^2.3.0", + "strip-dirs": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/decompress-response": { "version": "4.2.1", "license": "MIT", @@ -29589,6 +29735,220 @@ "node": ">=8" } }, + "node_modules/decompress-tar": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", + "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", + "dev": true, + "dependencies": { + "file-type": "^5.2.0", + "is-stream": "^1.1.0", + "tar-stream": "^1.5.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-tar/node_modules/bl": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", + "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", + "dev": true, + "dependencies": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/decompress-tar/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/decompress-tar/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/decompress-tar/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/decompress-tar/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/decompress-tar/node_modules/tar-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", + "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", + "dev": true, + "dependencies": { + "bl": "^1.0.0", + "buffer-alloc": "^1.2.0", + "end-of-stream": "^1.0.0", + "fs-constants": "^1.0.0", + "readable-stream": "^2.3.0", + "to-buffer": "^1.1.1", + "xtend": "^4.0.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/decompress-tarbz2": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", + "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", + "dev": true, + "dependencies": { + "decompress-tar": "^4.1.0", + "file-type": "^6.1.0", + "is-stream": "^1.1.0", + "seek-bzip": "^1.0.5", + "unbzip2-stream": "^1.0.9" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-tarbz2/node_modules/file-type": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", + "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-tarbz2/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/decompress-targz": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", + "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", + "dev": true, + "dependencies": { + "decompress-tar": "^4.1.1", + "file-type": "^5.2.0", + "is-stream": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-targz/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/decompress-unzip": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", + "integrity": "sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw==", + "dev": true, + "dependencies": { + "file-type": "^3.8.0", + "get-stream": "^2.2.0", + "pify": "^2.3.0", + "yauzl": "^2.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-unzip/node_modules/file-type": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decompress-unzip/node_modules/get-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", + "integrity": "sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA==", + "dev": true, + "dependencies": { + "object-assign": "^4.0.1", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decompress-unzip/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decompress/node_modules/make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress/node_modules/make-dir/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/dedent": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", @@ -32171,6 +32531,12 @@ "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", "dev": true }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "dev": true + }, "node_modules/fast-glob": { "version": "3.2.7", "dev": true, @@ -32239,6 +32605,15 @@ "bser": "2.1.1" } }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "dependencies": { + "pend": "~1.2.0" + } + }, "node_modules/fetch-retry": { "version": "5.0.6", "resolved": "https://registry.npmjs.org/fetch-retry/-/fetch-retry-5.0.6.tgz", @@ -32360,6 +32735,15 @@ "ramda": "^0.28.0" } }, + "node_modules/file-type": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", + "integrity": "sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/file-uri-to-path": { "version": "1.0.0", "dev": true, @@ -38991,8 +39375,9 @@ }, "node_modules/jszip": { "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", "dev": true, - "license": "(MIT OR GPL-3.0-or-later)", "dependencies": { "lie": "~3.3.0", "pako": "~1.0.2", @@ -39339,6 +39724,48 @@ "node": ">=10" } }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dev": true, + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lazystream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/lazystream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/lazystream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/less": { "version": "4.1.3", "dev": true, @@ -43904,6 +44331,12 @@ "canvas": "^2.11.0" } }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true + }, "node_modules/performance-now": { "version": "2.1.0", "dev": true, @@ -46167,6 +46600,12 @@ ], "license": "MIT" }, + "node_modules/queue-tick": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", + "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", + "dev": true + }, "node_modules/quick-lru": { "version": "4.0.1", "dev": true, @@ -46601,6 +47040,36 @@ "node": ">= 6" } }, + "node_modules/readdir-glob": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", + "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", + "dev": true, + "dependencies": { + "minimatch": "^5.1.0" + } + }, + "node_modules/readdir-glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/readdir-glob/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/readdir-scoped-modules": { "version": "1.1.0", "dev": true, @@ -48230,6 +48699,25 @@ "dev": true, "license": "MIT" }, + "node_modules/seek-bzip": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.6.tgz", + "integrity": "sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==", + "dev": true, + "dependencies": { + "commander": "^2.8.1" + }, + "bin": { + "seek-bunzip": "bin/seek-bunzip", + "seek-table": "bin/seek-bzip-table" + } + }, + "node_modules/seek-bzip/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, "node_modules/select-hose": { "version": "2.0.0", "dev": true, @@ -49569,6 +50057,16 @@ "node": ">= 4.0.0" } }, + "node_modules/streamx": { + "version": "2.15.6", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.15.6.tgz", + "integrity": "sha512-q+vQL4AAz+FdfT137VF69Cc/APqUbxy+MDOImRrMvchJpigHj9GksgDU2LYbO9rx7RX6osWgxJB2WxhYv4SZAw==", + "dev": true, + "dependencies": { + "fast-fifo": "^1.1.0", + "queue-tick": "^1.0.1" + } + }, "node_modules/string_decoder": { "version": "1.3.0", "devOptional": true, @@ -49781,6 +50279,15 @@ "node": ">=8" } }, + "node_modules/strip-dirs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", + "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", + "dev": true, + "dependencies": { + "is-natural-number": "^4.0.1" + } + }, "node_modules/strip-eof": { "version": "1.0.0", "dev": true, @@ -50838,6 +51345,12 @@ "dev": true, "license": "MIT" }, + "node_modules/to-buffer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", + "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", + "dev": true + }, "node_modules/to-fast-properties": { "version": "2.0.0", "license": "MIT", @@ -51467,6 +51980,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/unbzip2-stream": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "dev": true, + "dependencies": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, "node_modules/unfetch": { "version": "4.2.0", "dev": true, @@ -53844,6 +54367,16 @@ "node": ">=8" } }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, "node_modules/yn": { "version": "3.1.1", "dev": true, @@ -53873,6 +54406,86 @@ "zen-observable": "0.8.15" } }, + "node_modules/zip-a-folder": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/zip-a-folder/-/zip-a-folder-3.1.5.tgz", + "integrity": "sha512-w7ZOjJS17MYqdjVEFiqa537H/hxVGcwxnmCcmOaUXDoezttVrWkbSob7nit4lqUqha+Q0pOFTCVsBttBx6hs5A==", + "dev": true, + "dependencies": { + "archiver": "^6.0.1", + "glob": "^10.3.10", + "is-glob": "^4.0.3" + } + }, + "node_modules/zip-a-folder/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/zip-a-folder/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/zip-a-folder/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/zip-a-folder/node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/zip-stream": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-5.0.1.tgz", + "integrity": "sha512-UfZ0oa0C8LI58wJ+moL46BDIMgCQbnsb+2PoiJYtonhBsMh2bq1eRBVkvjfVsqbEHd9/EgKPUuL9saSSsec8OA==", + "dev": true, + "dependencies": { + "archiver-utils": "^4.0.1", + "compress-commons": "^5.0.1", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, "node_modules/zone.js": { "version": "0.11.8", "license": "MIT", diff --git a/package.json b/package.json index bc7dc127fc..7699fc6493 100644 --- a/package.json +++ b/package.json @@ -143,9 +143,12 @@ "@typescript-eslint/eslint-plugin": "5.59.8", "@typescript-eslint/parser": "5.62.0", "@typescript-eslint/typescript-estree": "6.7.0", + "adm-zip": "^0.5.10", "ajv": "^8.12.0", + "archiver": "^6.0.1", "commander": "6.2.1", "css-loader": "^6.8.1", + "decompress": "^4.2.1", "dotenv": "16.1.3", "editorjs-text-color-plugin": "1.13.1", "ejs": "^3.1.9", @@ -206,7 +209,8 @@ "typescript": "4.7.4", "webdriver-manager": "12.1.9", "webpack": "^5.88.2", - "webpack-cli": "^5.1.2" + "webpack-cli": "^5.1.2", + "zip-a-folder": "^3.1.5" }, "license": "Apache-2.0", "bundlesize": [