diff --git a/.github/workflows/lib-ms.yml b/.github/workflows/lib-ms.yml index b12ffae2c..59ab02959 100644 --- a/.github/workflows/lib-ms.yml +++ b/.github/workflows/lib-ms.yml @@ -8,13 +8,14 @@ on: paths: - 'servers/lib/**' workflow_dispatch: - paths: - - 'servers/lib/**' jobs: test-lib-ms: name: Test library microservice runs-on: ubuntu-latest + defaults: + run: + working-directory: servers/lib steps: - name: Checkout @@ -27,47 +28,67 @@ jobs: cache: "yarn" cache-dependency-path: "**/yarn.lock" - # - name: Install pm2 - # run: | - # npm install -g pm2 + - name: Install pm2 and jest + run: | + npm install -g pm2 + npm install -g jest - name: Run the linting checks run: | - cd servers/lib yarn install yarn syntax - name: Build the lib microservice run: | - cd servers/lib yarn install yarn build - name: Run all tests + env: + PORT: 4001 + LOCAL_PATH: ${{ github.workspace }}/files + MODE: local + LOG_LEVEL: debug + APOLLO_PATH: /lib run: | - cd servers/lib yarn install yarn build yarn test:all + + - name: Start http mode env: - PORT: 4001 + PORT: 4003 LOCAL_PATH: ${{ github.workspace }}/files MODE: local LOG_LEVEL: debug APOLLO_PATH: /lib + run: | + yarn install + yarn build + yarn start:pm2 + + - name: Check server is running + env: + PORT: 4003 + uses: nick-fields/retry@v3 + with: + timeout_seconds: 10 + max_attempts: 4 + command: "curl -f -LI http://localhost:${{ env.PORT }}/lib/files" + + - name: Run http test + env: + PORT: 4003 + LOCAL_PATH: ${{ github.workspace }}/files + MODE: local + LOG_LEVEL: debug + APOLLO_PATH: /lib + run: | + yarn test:http-github - # - name: Run http mode tests - # run: | - # cd servers/lib - # yarn install - # yarn build - # yarn test:http-github - # env: - # PORT: 4002 - # LOCAL_PATH: ${{ github.workspace }}/files - # MODE: local - # LOG_LEVEL: debug - # APOLLO_PATH: /lib + - name: Stop http mode + run: | + yarn stop:pm2 - name: Upload test coverage to Codecov uses: codecov/codecov-action@v3 diff --git a/servers/lib/DEVELOPER.md b/servers/lib/DEVELOPER.md index 6cc4d371d..497eeee53 100644 --- a/servers/lib/DEVELOPER.md +++ b/servers/lib/DEVELOPER.md @@ -43,6 +43,30 @@ The URL endpoint for this microservice is located at: `localhost:PORT/lib` The [API](./API.md) page shows sample queries and responses. +## Manual testing + +As of now, some features require manual testing or attention. + +### CloudCMD (a npm package dependency) + +Due to how CloudCMD works, +it is required to manually run `yarn test:http` with `LOCAL_PATH` both as an +absolute path and local path. For example, the manual tests +need to be done with the following `LOCAL_PATH` values. + +| OS | Absolute Path | Relative Path | +| ------- | ----------------------------- | ------------- | +| Windows | C:\DTaaS\files | ..\..\files | +| Linux | /Users//DTaaS/files | ../../files | + +### PM2 + +the pm2 might not close spawned processes correctly, +therefore please use the following command to kill a process. +`pm2 del `. + +**NOTE:** to see the processes spawned by pm2 use `pm2 list` + ## :package: :ship: Packages ### Docker images @@ -86,6 +110,44 @@ with publishing **libms npm package** in local computer. Application of the advice given on that page for **libms** will require running the following commands. +## Use in Docker Environment + +### Adjust Configuration (Optional) + +The microservices require configuration and the docker version +of the microservices uses the configuration +file available in `config/.env.default`. + +Please add a `.env` file with the environment variables for +the docker compose file to use. +e.g. + +```sh +PORT='4001' +MODE='local' +LOCAL_PATH='..\..\files' +``` + +### Use + +The commands to start and stop the appliation are: + +**NOTE**: the docker compose file is located in the `servers/lib` directory. + +```bash +docker compose -f compose.lib.dev.yml up -d +``` + +This command brings up the lib docker container and makes +the website available at . +The `config/.env.default` file is used as the microservice configuration. +If the configuration values are changed, please restart the container. + +```bash +docker compose -f compose.lib.dev.yml down +docker compose -f compose.lib.dev.yml up -d +``` + ### Publish ```bash diff --git a/servers/lib/README.md b/servers/lib/README.md index e3ab8528a..9117a0676 100644 --- a/servers/lib/README.md +++ b/servers/lib/README.md @@ -40,6 +40,37 @@ your Github username and the password is your Github In order for the npm to download the package, your personal access token needs to have _read:packages_ scope. +## Use in Docker Environment + +### Adjust Configuration (Optional) + +The microservices require configuration, +see the [Configure](#gear-configure) section for more info. + +The docker version of the microservices uses the configuration +file available in `config/.env.default`. +If you would like to adjust the configuration, please change this file. + +### Use + +The commands to start and stop the appliation are: + +```bash +git clone https://github.com/INTO-CPS-Association/DTaaS.git +cd servers/lib +docker compose -f compose.lib.yml up -d +``` + +This command brings up the lib docker container and makes +the website available at . +The `config/.env.default` file is used as the microservice configuration. +If the configuration values are changed, please restart the container. + +```bash +docker compose -f compose.lib.yml down +docker compose -f compose.lib.yml up -d +``` + ## :gear: Configure The microservices requires config specified in INI format. diff --git a/servers/lib/compose.lib.dev.yml b/servers/lib/compose.lib.dev.yml new file mode 100644 index 000000000..f1e4a8ba0 --- /dev/null +++ b/servers/lib/compose.lib.dev.yml @@ -0,0 +1,9 @@ +services: + libms: + build: + context: ../../ + dockerfile: ./docker/libms.dockerfile + volumes: + - ${LOCAL_PATH}:/dtaas/libms/files + ports: + - ${PORT}:4001 diff --git a/servers/lib/jest.config.json b/servers/lib/jest.config.json index 86c1a7059..991f79e8b 100644 --- a/servers/lib/jest.config.json +++ b/servers/lib/jest.config.json @@ -12,7 +12,8 @@ "node_modules", "./dist", "../src/app.module.ts", - "../src/main.ts" + "../src/main.ts", + "../src/bootstrap.ts" ], "modulePathIgnorePatterns": ["config"], "coverageDirectory": "/coverage/", diff --git a/servers/lib/package.json b/servers/lib/package.json index aa97d099f..10e14c87e 100644 --- a/servers/lib/package.json +++ b/servers/lib/package.json @@ -1,6 +1,6 @@ { "name": "@into-cps-association/libms", - "version": "0.4.5", + "version": "0.4.6", "description": "microservices that handles request by fetching and returning the file-names and folders of given directory", "author": "phillip.boe.jensen@gmail.com", "contributors": [ @@ -11,21 +11,21 @@ "private": false, "license": "SEE LICENSE IN ", "scripts": { - "build": "npx tsc", + "build": "tsc", "clean": "npx rimraf build node_modules coverage dist src.svg test.svg", "format": "prettier --ignore-path ../.gitignore --write \"**/*.{ts,tsx,css,scss}\"", "graph": "npx madge --image src.svg src && npx madge --image test.svg test", "start": "node dist/src/main.js", "start:pm2": "pm2 start pm2.config.js", "stop:pm2": "pm2 delete libms", - "syntax": "npx eslint . --fix", + "syntax": "eslint . --fix", "pretest": "npx shx cp test/data/user2/tools/README.md ../../files/user2/tools/README.md", "posttest": "npx rimraf ../../files/user2/tools/README.md", "test:all": "npx cross-env LOCAL_PATH=test/data jest --testPathIgnorePatterns=cloudcmd --coverage", "test:e2e": "npx cross-env LOCAL_PATH=test/data jest --config ./test/jest-e2e.json --coverage", "test:http": "yarn build && pm2 start -f --name libms-test dist/src/main.js -- -c .env -H ./config/http.json && jest test/cloudcmd --coverage --coverageThreshold=\"{}\" && pm2 delete libms-test", "test:http-nocov": "yarn build && pm2 start -f --name libms-test dist/src/main.js -- -c .env -H ./config/http.json && jest test/cloudcmd --coverage=false && pm2 delete libms-test", - "test:http-github": "yarn build && yarn start:pm2 && jest test/cloudcmd --coverage --coverageThreshold=\"{}\" && pm2 delete libms", + "test:http-github": "jest test/cloudcmd --coverage --coverageThreshold=\"{}\"", "test:int": "npx cross-env LOCAL_PATH=test/data jest ../test/integration --coverage", "test:nocov": "yarn test:http-nocov && npx cross-env LOCAL_PATH=test/data jest --testPathIgnorePatterns=cloudcmd --coverage=false", "test:unit": "npx cross-env LOCAL_PATH=test/data jest ../test/unit --coverage" @@ -59,8 +59,8 @@ "@types/jest": "^29.5.12", "@types/node": "20.12.5", "@types/supertest": "^6.0.2", - "@typescript-eslint/eslint-plugin": "^6.19.0", - "@typescript-eslint/parser": "^6.19.0", + "@typescript-eslint/eslint-plugin": "^8.4.0", + "@typescript-eslint/parser": "^8.4.0", "cross-fetch": "^4.0.0", "eslint": "^8.56.0", "eslint-config-airbnb-base": "^15.0.0", diff --git a/servers/lib/src/bootstrap.ts b/servers/lib/src/bootstrap.ts index 9e9132b3d..1f56673bc 100644 --- a/servers/lib/src/bootstrap.ts +++ b/servers/lib/src/bootstrap.ts @@ -15,7 +15,7 @@ export default async function bootstrap(options?: BootstrapOptions) { path: options?.config ?? '.env', override: true, }); - if (configFile.error) { + if (configFile.error && process.env.LOCAL_PATH === undefined) { // eslint-disable-next-line no-console console.error(configFile.error); if (options.runHelp) { diff --git a/servers/lib/src/cloudcmd/cloudcmd.ts b/servers/lib/src/cloudcmd/cloudcmd.ts index 73addd31e..d24f9e4b3 100644 --- a/servers/lib/src/cloudcmd/cloudcmd.ts +++ b/servers/lib/src/cloudcmd/cloudcmd.ts @@ -1,7 +1,9 @@ import { INestApplication } from '@nestjs/common'; import { Server } from 'socket.io'; import * as cloudcmd from 'cloudcmd'; -import { join } from 'path'; +import { join, relative } from 'path'; + +const isWindowsAbsolutePath = (filesPath: string) => filesPath.includes(':'); const runCloudCMD = ( app: INestApplication, @@ -13,7 +15,13 @@ const runCloudCMD = ( configPath: join(process.cwd(), optionsPath), }); - configManager('root', filesPath); + if (isWindowsAbsolutePath(filesPath)) { + const workDir = process.cwd(); + const relativePath = relative(workDir, filesPath); + configManager('root', relativePath); + } else { + configManager('root', filesPath); + } const server = app.getHttpServer(); diff --git a/servers/lib/src/files/services/local-files.service.ts b/servers/lib/src/files/services/local-files.service.ts index 49804a04e..f94aba572 100644 --- a/servers/lib/src/files/services/local-files.service.ts +++ b/servers/lib/src/files/services/local-files.service.ts @@ -45,7 +45,7 @@ export default class LocalFilesService implements IFilesService { return LocalFilesService.formatResponse(name, content); } catch (error) { - throw new InternalServerErrorException('Error reading file'); + throw new InternalServerErrorException('Error reading file', error); } } diff --git a/servers/lib/test/cloudcmd/cloudcmd.spec.ts b/servers/lib/test/cloudcmd/cloudcmd.spec.ts index 97b417a17..2620d5dd3 100644 --- a/servers/lib/test/cloudcmd/cloudcmd.spec.ts +++ b/servers/lib/test/cloudcmd/cloudcmd.spec.ts @@ -23,13 +23,11 @@ describe('cloudcmd test for the application', () => { responseType: 'json', }, ); - /* eslint-disable no-console */ - console.log(response.data); - /* eslint-enable no-console */ expect(response.data.path).toEqual('/'); - expect(response.data.files[0].name).toEqual('common'); - expect(response.data.files[1].name).toEqual('user1'); - expect(response.data.files[2].name).toEqual('user2'); + const fileNames = response.data.files.map((file) => file.name); + expect(fileNames).toContain('common'); + expect(fileNames).toContain('user1'); + expect(fileNames).toContain('user2'); }, 10000); it('should return the content of a file that is uplaoded to cloudcmd ', async () => { diff --git a/servers/lib/test/unit/files-service.factory.unit.spec.ts b/servers/lib/test/unit/files-service.factory.unit.spec.ts index 743aadd9c..5305f61f1 100644 --- a/servers/lib/test/unit/files-service.factory.unit.spec.ts +++ b/servers/lib/test/unit/files-service.factory.unit.spec.ts @@ -32,6 +32,6 @@ describe('FilesServiceFactory', () => { it('should throw an error when MODE is invalid', () => { jest.spyOn(configService, 'get').mockReturnValue('invalid'); - expect(() => serviceFactory.create()).toThrowError(`Invalid MODE: invalid`); + expect(() => serviceFactory.create()).toThrow(`Invalid MODE: invalid`); }); }); diff --git a/servers/lib/yarn.lock b/servers/lib/yarn.lock index 310816636..bbc3d9cd8 100644 --- a/servers/lib/yarn.lock +++ b/servers/lib/yarn.lock @@ -649,7 +649,12 @@ dependencies: eslint-visitor-keys "^3.3.0" -"@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.1": +"@eslint-community/regexpp@^4.10.0": + version "4.11.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.0.tgz#b0ffd0312b4a3fd2d6f77237e7248a5ad3a680ae" + integrity sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A== + +"@eslint-community/regexpp@^4.6.1": version "4.10.0" resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== @@ -2625,32 +2630,30 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@^6.19.0": - version "6.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz#30830c1ca81fd5f3c2714e524c4303e0194f9cd3" - integrity sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA== +"@typescript-eslint/eslint-plugin@^8.4.0": + version "8.4.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.4.0.tgz#188c65610ef875a086404b5bfe105df936b035da" + integrity sha512-rg8LGdv7ri3oAlenMACk9e+AR4wUV0yrrG+XKsGKOK0EVgeEDqurkXMPILG2836fW4ibokTB5v4b6Z9+GYQDEw== dependencies: - "@eslint-community/regexpp" "^4.5.1" - "@typescript-eslint/scope-manager" "6.21.0" - "@typescript-eslint/type-utils" "6.21.0" - "@typescript-eslint/utils" "6.21.0" - "@typescript-eslint/visitor-keys" "6.21.0" - debug "^4.3.4" + "@eslint-community/regexpp" "^4.10.0" + "@typescript-eslint/scope-manager" "8.4.0" + "@typescript-eslint/type-utils" "8.4.0" + "@typescript-eslint/utils" "8.4.0" + "@typescript-eslint/visitor-keys" "8.4.0" graphemer "^1.4.0" - ignore "^5.2.4" + ignore "^5.3.1" natural-compare "^1.4.0" - semver "^7.5.4" - ts-api-utils "^1.0.1" + ts-api-utils "^1.3.0" -"@typescript-eslint/parser@^6.19.0": - version "6.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.21.0.tgz#af8fcf66feee2edc86bc5d1cf45e33b0630bf35b" - integrity sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ== +"@typescript-eslint/parser@^8.4.0": + version "8.4.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.4.0.tgz#36b7cd7643a1c190d49dc0278192b2450f615a6f" + integrity sha512-NHgWmKSgJk5K9N16GIhQ4jSobBoJwrmURaLErad0qlLjrpP5bECYg+wxVTGlGZmJbU03jj/dfnb6V9bw+5icsA== dependencies: - "@typescript-eslint/scope-manager" "6.21.0" - "@typescript-eslint/types" "6.21.0" - "@typescript-eslint/typescript-estree" "6.21.0" - "@typescript-eslint/visitor-keys" "6.21.0" + "@typescript-eslint/scope-manager" "8.4.0" + "@typescript-eslint/types" "8.4.0" + "@typescript-eslint/typescript-estree" "8.4.0" + "@typescript-eslint/visitor-keys" "8.4.0" debug "^4.3.4" "@typescript-eslint/scope-manager@6.21.0": @@ -2661,21 +2664,34 @@ "@typescript-eslint/types" "6.21.0" "@typescript-eslint/visitor-keys" "6.21.0" -"@typescript-eslint/type-utils@6.21.0": - version "6.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz#6473281cfed4dacabe8004e8521cee0bd9d4c01e" - integrity sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag== +"@typescript-eslint/scope-manager@8.4.0": + version "8.4.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.4.0.tgz#8a13d3c0044513d7960348db6f4789d2a06fa4b4" + integrity sha512-n2jFxLeY0JmKfUqy3P70rs6vdoPjHK8P/w+zJcV3fk0b0BwRXC/zxRTEnAsgYT7MwdQDt/ZEbtdzdVC+hcpF0A== dependencies: - "@typescript-eslint/typescript-estree" "6.21.0" - "@typescript-eslint/utils" "6.21.0" + "@typescript-eslint/types" "8.4.0" + "@typescript-eslint/visitor-keys" "8.4.0" + +"@typescript-eslint/type-utils@8.4.0": + version "8.4.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.4.0.tgz#4a91b5789f41946adb56d73e2fb4639fdcf37af7" + integrity sha512-pu2PAmNrl9KX6TtirVOrbLPLwDmASpZhK/XU7WvoKoCUkdtq9zF7qQ7gna0GBZFN0hci0vHaSusiL2WpsQk37A== + dependencies: + "@typescript-eslint/typescript-estree" "8.4.0" + "@typescript-eslint/utils" "8.4.0" debug "^4.3.4" - ts-api-utils "^1.0.1" + ts-api-utils "^1.3.0" "@typescript-eslint/types@6.21.0": version "6.21.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.21.0.tgz#205724c5123a8fef7ecd195075fa6e85bac3436d" integrity sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg== +"@typescript-eslint/types@8.4.0": + version "8.4.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.4.0.tgz#b44d6a90a317a6d97a3e5fabda5196089eec6171" + integrity sha512-T1RB3KQdskh9t3v/qv7niK6P8yvn7ja1mS7QK7XfRVL6wtZ8/mFs/FHf4fKvTA0rKnqnYxl/uHFNbnEt0phgbw== + "@typescript-eslint/typescript-estree@6.21.0": version "6.21.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz#c47ae7901db3b8bddc3ecd73daff2d0895688c46" @@ -2690,7 +2706,31 @@ semver "^7.5.4" ts-api-utils "^1.0.1" -"@typescript-eslint/utils@6.21.0", "@typescript-eslint/utils@^6.0.0": +"@typescript-eslint/typescript-estree@8.4.0": + version "8.4.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.4.0.tgz#00ed79ae049e124db37315cde1531a900a048482" + integrity sha512-kJ2OIP4dQw5gdI4uXsaxUZHRwWAGpREJ9Zq6D5L0BweyOrWsL6Sz0YcAZGWhvKnH7fm1J5YFE1JrQL0c9dd53A== + dependencies: + "@typescript-eslint/types" "8.4.0" + "@typescript-eslint/visitor-keys" "8.4.0" + debug "^4.3.4" + fast-glob "^3.3.2" + is-glob "^4.0.3" + minimatch "^9.0.4" + semver "^7.6.0" + ts-api-utils "^1.3.0" + +"@typescript-eslint/utils@8.4.0": + version "8.4.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.4.0.tgz#35c552a404858c853a1f62ba6df2214f1988afc3" + integrity sha512-swULW8n1IKLjRAgciCkTCafyTHHfwVQFt8DovmaF69sKbOxTSFMmIZaSHjqO9i/RV0wIblaawhzvtva8Nmm7lQ== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@typescript-eslint/scope-manager" "8.4.0" + "@typescript-eslint/types" "8.4.0" + "@typescript-eslint/typescript-estree" "8.4.0" + +"@typescript-eslint/utils@^6.0.0": version "6.21.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.21.0.tgz#4714e7a6b39e773c1c8e97ec587f520840cd8134" integrity sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ== @@ -2711,6 +2751,14 @@ "@typescript-eslint/types" "6.21.0" eslint-visitor-keys "^3.4.1" +"@typescript-eslint/visitor-keys@8.4.0": + version "8.4.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.4.0.tgz#1e8a8b8fd3647db1e42361fdd8de3e1679dec9d2" + integrity sha512-zTQD6WLNTre1hj5wp09nBIDiOc2U5r/qmzo7wxPn4ZgAjHql09EofqhF9WF+fZHzL5aCyaIpPcT2hyxl73kr9A== + dependencies: + "@typescript-eslint/types" "8.4.0" + eslint-visitor-keys "^3.4.3" + "@ungap/structured-clone@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" @@ -5002,7 +5050,7 @@ fast-diff@^1.1.2: resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== -fast-glob@3.3.2, fast-glob@^3.2.2, fast-glob@^3.2.9, fast-glob@^3.3.1: +fast-glob@3.3.2, fast-glob@^3.2.2, fast-glob@^3.2.9, fast-glob@^3.3.1, fast-glob@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== @@ -5763,6 +5811,11 @@ ignore@^5.0.4, ignore@^5.2.0, ignore@^5.2.4: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== +ignore@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== + import-fresh@^3.2.1, import-fresh@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" @@ -7671,6 +7724,13 @@ minimatch@^9.0.1: dependencies: brace-expansion "^2.0.1" +minimatch@^9.0.4: + version "9.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== + dependencies: + brace-expansion "^2.0.1" + minimist-options@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" @@ -9479,6 +9539,11 @@ semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3, semve dependencies: lru-cache "^6.0.0" +semver@^7.6.0: + version "7.6.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" + integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== + send@0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" @@ -9830,7 +9895,16 @@ string-to-stream@^3.0.1: dependencies: readable-stream "^3.4.0" -"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -9890,7 +9964,14 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -10361,7 +10442,7 @@ tryrequire@^3.0.0: dependencies: try-catch "^3.0.0" -ts-api-utils@^1.0.1: +ts-api-utils@^1.0.1, ts-api-utils@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== @@ -11009,8 +11090,7 @@ win32@^7.0.0, win32@^7.2.0: redzip "^3.0.0" through2 "^4.0.2" -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: - name wrap-ansi-cjs +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -11028,6 +11108,15 @@ wrap-ansi@^6.0.1, wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"