because I got bored of customising my CV for every job
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

feat(CVG-29): add FileStorage abstraction with disk and R2 backends

+2278 -20
+56
.docker/.manifests/apps__client__package.json
··· 1 + { 2 + "name": "@cv/client", 3 + "version": "0.0.0", 4 + "private": true, 5 + "type": "module", 6 + "scripts": { 7 + "dev": "vite", 8 + "build": "tsc -b && vite build", 9 + "preview": "vite preview", 10 + "lint": "biome check .", 11 + "lint:fix": "biome check --write .", 12 + "start": "vite", 13 + "typecheck": "tsc -b --noEmit", 14 + "codegen": "graphql-codegen --config codegen.ts", 15 + "codegen:client": "graphql-codegen --config codegen.ts" 16 + }, 17 + "dependencies": { 18 + "@cv/routing": "*", 19 + "@cv/ui": "*", 20 + "@cv/utils": "*", 21 + "@hookform/resolvers": "^5.2.2", 22 + "@tanstack/react-query": "^5.59.0", 23 + "@tanstack/react-query-devtools": "^5.59.0", 24 + "@tanstack/react-virtual": "^3.13.12", 25 + "@types/react-router-dom": "^5.3.3", 26 + "class-variance-authority": "^0.7.1", 27 + "clsx": "^2.0.0", 28 + "graphql": "^16.12.0", 29 + "graphql-request": "^6.1.0", 30 + "graphql-type-json": "^0.3.2", 31 + "react": "^19.2.3", 32 + "react-dom": "^19.2.3", 33 + "react-dropzone": "^14.3.8", 34 + "react-hook-form": "^7.70.0", 35 + "react-router-dom": "^7.9.4", 36 + "tailwind-merge": "^2.0.0", 37 + "zod": "^4.3.6" 38 + }, 39 + "devDependencies": { 40 + "@biomejs/biome": "^2.2.6", 41 + "@cv/biome-config": "*", 42 + "@cv/tsconfig": "*", 43 + "@graphql-codegen/cli": "^6.1.0", 44 + "@graphql-codegen/typescript": "^5.0.6", 45 + "@graphql-codegen/typescript-operations": "^5.0.6", 46 + "@graphql-codegen/typescript-react-query": "^6.1.0", 47 + "@tailwindcss/postcss": "^4.1.15", 48 + "@tailwindcss/vite": "^4.0.0", 49 + "@types/react": "^19.0.6", 50 + "@types/react-dom": "^19.0.3", 51 + "@vitejs/plugin-react": "^4.3.4", 52 + "tailwindcss": "^4.0.0", 53 + "typescript": "^5.6.3", 54 + "vite": "^7.1.10" 55 + } 56 + }
+44
.docker/.manifests/apps__docs__package.json
··· 1 + { 2 + "name": "@cv/docs", 3 + "version": "0.0.0", 4 + "private": true, 5 + "type": "module", 6 + "scripts": { 7 + "dev": "vite", 8 + "build": "tsc && vite build", 9 + "preview": "vite preview", 10 + "lint": "biome check .", 11 + "lint:fix": "biome check --write .", 12 + "typecheck": "tsc --noEmit" 13 + }, 14 + "dependencies": { 15 + "@catppuccin/palette": "^1.4.0", 16 + "@cv/routing": "*", 17 + "@cv/ui": "*", 18 + "@cv/utils": "*", 19 + "@mdx-js/react": "^3.1.1", 20 + "@mdx-js/rollup": "^3.1.1", 21 + "@types/mdx": "^2.0.13", 22 + "highlight.js": "^11.10.0", 23 + "react": "^19.2.3", 24 + "react-dom": "^19.2.3", 25 + "react-markdown": "^9.0.1", 26 + "react-router-dom": "^6.26.1", 27 + "rehype-highlight": "^7.0.0", 28 + "remark-gfm": "^4.0.0" 29 + }, 30 + "devDependencies": { 31 + "@tailwindcss/postcss": "^4.0.0", 32 + "@tailwindcss/vite": "^4.0.0", 33 + "@types/mdast": "^4.0.4", 34 + "@types/react": "^19.0.6", 35 + "@types/react-dom": "^19.0.3", 36 + "@types/unist": "^3.0.3", 37 + "@vitejs/plugin-react": "^4.3.1", 38 + "autoprefixer": "^10.4.20", 39 + "postcss": "^8.4.47", 40 + "tailwindcss": "^4.0.0", 41 + "typescript": "^5.5.3", 42 + "vite": "^5.4.3" 43 + } 44 + }
+118
.docker/.manifests/apps__server__package.json
··· 1 + { 2 + "name": "@cv/server", 3 + "version": "0.0.0", 4 + "private": true, 5 + "type": "commonjs", 6 + "scripts": { 7 + "build": "tsup", 8 + "start": "node dist/main.js", 9 + "dev": "nodemon --watch src -e ts --exec \"ts-node -r tsconfig-paths/register src/main.ts\"", 10 + "lint": "biome check .", 11 + "lint:fix": "biome check --write .", 12 + "typecheck": "tsc -p tsconfig.build.json --noEmit", 13 + "test": "jest --config ./test/jest-unit.json", 14 + "test:unit": "jest --config ./test/jest-unit.json", 15 + "test:e2e": "jest --config ./test/jest-e2e.json", 16 + "e2e:coverage:c8:start": "npm run prisma:deploy && npm run build && npx c8 -r text -r lcov node dist/main.js", 17 + "e2e:coverage:c8:report": "npx c8 report -r text -r lcov", 18 + "e2e:coverage:c8": "E2E_EXTERNAL_URL=http://localhost:3000 npm run test:e2e && npm run e2e:coverage:c8:report", 19 + "e2e:coverage:c8:stop": "pkill -f 'node dist/main.js' || true", 20 + "e2e:coverage:all": "node src/scripts/e2e-coverage-all.cjs", 21 + "prepare": "prisma generate || true", 22 + "prisma:generate": "prisma generate", 23 + "prisma:migrate": "prisma migrate dev", 24 + "prisma:deploy": "prisma migrate deploy", 25 + "prisma:studio": "prisma studio", 26 + "seed": "ts-node -r tsconfig-paths/register src/scripts/seed.ts", 27 + "seed:test": "ts-node -r tsconfig-paths/register src/scripts/seed-test.ts", 28 + "test:integration": "vitest run --config vitest.config.ts", 29 + "test:integration:watch": "vitest --config vitest.config.ts", 30 + "test:integration:ui": "vitest --ui --config vitest.config.ts" 31 + }, 32 + "dependencies": { 33 + "@apollo/server": "^4.11.0", 34 + "@cv/ai-parser": "*", 35 + "@cv/ai-provider": "*", 36 + "@cv/auth": "*", 37 + "@cv/cv-renderer": "*", 38 + "@cv/file-storage": "*", 39 + "@cv/file-upload": "*", 40 + "@cv/system": "*", 41 + "@cv/utils": "*", 42 + "@nestjs/apollo": "^12.2.2", 43 + "@nestjs/common": "^10.4.7", 44 + "@nestjs/config": "^3.2.0", 45 + "@nestjs/core": "^10.4.7", 46 + "@nestjs/event-emitter": "^3.0.1", 47 + "@nestjs/graphql": "^12.2.2", 48 + "@nestjs/jwt": "^10.2.0", 49 + "@nestjs/mapped-types": "^2.1.0", 50 + "@nestjs/passport": "^10.0.3", 51 + "@nestjs/platform-express": "^10.4.7", 52 + "@prisma/adapter-pg": "^7.1.0", 53 + "@prisma/client": "^7.1.0", 54 + "@riotbyte-com/nest-service-locator": "0.3.0-rc.4", 55 + "@riotbyte-com/project-q-core": "1.0.19-rc.3", 56 + "@riotbyte-com/project-q-nestjs": "1.0.19-rc.3", 57 + "@riotbyte-com/project-q-prisma": "1.0.19-rc.3", 58 + "@types/cookie-parser": "^1.4.10", 59 + "@types/handlebars": "^4.0.40", 60 + "@types/multer": "^2.0.0", 61 + "apollo-server-express": "^3.13.0", 62 + "bcryptjs": "^2.4.3", 63 + "canvas": "^3.1.0", 64 + "class-transformer": "^0.5.1", 65 + "class-validator": "^0.14.0", 66 + "cookie-parser": "^1.4.7", 67 + "dataloader": "^2.2.3", 68 + "express": "^4.21.2", 69 + "graphql": "^16.12.0", 70 + "graphql-scalars": "^1.23.0", 71 + "graphql-type-json": "^0.3.2", 72 + "handlebars": "^4.7.8", 73 + "mammoth": "^1.11.0", 74 + "multer": "^2.0.2", 75 + "nest-commander": "^3.16.0", 76 + "nestjs-zod": "^5.1.1", 77 + "passport": "^0.7.0", 78 + "passport-jwt": "^4.0.1", 79 + "passport-local": "^1.0.0", 80 + "pdf-parse": "^1.1.4", 81 + "pdf2json": "^3.1.4", 82 + "pdfjs-dist": "^3.11.174", 83 + "pg": "^8.16.3", 84 + "reflect-metadata": "^0.2.2", 85 + "resend": "^6.5.2", 86 + "rxjs": "^7.8.1", 87 + "tesseract.js": "^5.1.1", 88 + "zod": "^4.3.6" 89 + }, 90 + "devDependencies": { 91 + "@biomejs/biome": "^2.2.6", 92 + "@cv/biome-config": "*", 93 + "@cv/tsconfig": "*", 94 + "@faker-js/faker": "^9.9.0", 95 + "@nestjs/testing": "^10.4.7", 96 + "@swc/core": "^1.15.13", 97 + "@types/bcryptjs": "^2.4.6", 98 + "@types/express": "^5.0.0", 99 + "@types/jest": "^29.5.12", 100 + "@types/node": "^22.7.5", 101 + "@types/passport-jwt": "^4.0.1", 102 + "@types/passport-local": "^1.0.38", 103 + "@types/pdf-parse": "^1.1.5", 104 + "@types/pg": "^8.15.6", 105 + "@vitest/ui": "^4.0.16", 106 + "jest": "^29.7.0", 107 + "nodemon": "^3.1.7", 108 + "prisma": "^7.1.0", 109 + "supertest": "^6.3.4", 110 + "ts-jest": "^29.1.2", 111 + "ts-node": "^10.9.2", 112 + "tsconfig-paths": "^4.2.0", 113 + "tslib": "^2.8.0", 114 + "tsup": "^8.5.1", 115 + "typescript": "^5.6.3", 116 + "vitest": "^4.0.16" 117 + } 118 + }
+42
.docker/.manifests/apps__worker__package.json
··· 1 + { 2 + "name": "@cv/worker", 3 + "version": "0.0.0", 4 + "private": true, 5 + "type": "commonjs", 6 + "scripts": { 7 + "build": "tsup", 8 + "start": "node dist/main.js project-q:work async", 9 + "dev": "nodemon --watch src -e ts --exec \"ts-node src/main.ts project-q:work async\"", 10 + "typecheck": "tsc -p tsconfig.build.json --noEmit", 11 + "lint": "biome check .", 12 + "lint:fix": "biome check --write ." 13 + }, 14 + "dependencies": { 15 + "@cv/file-storage": "*", 16 + "@cv/system": "*", 17 + "@nestjs/common": "^10.4.7", 18 + "@nestjs/config": "^3.2.0", 19 + "@nestjs/core": "^10.4.7", 20 + "@nestjs/event-emitter": "^3.0.1", 21 + "@riotbyte-com/nest-service-locator": "0.3.0-rc.4", 22 + "@riotbyte-com/project-q-core": "1.0.19-rc.3", 23 + "@riotbyte-com/project-q-nestjs": "1.0.19-rc.3", 24 + "@riotbyte-com/project-q-prisma": "1.0.19-rc.3", 25 + "eventemitter2": "^6.4.9", 26 + "nest-commander": "^3.16.0", 27 + "playwright": "^1.52.0", 28 + "playwright-core": "^1.52.0", 29 + "reflect-metadata": "^0.2.2", 30 + "rxjs": "^7.8.1", 31 + "zod": "^4.3.6" 32 + }, 33 + "devDependencies": { 34 + "@cv/tsconfig": "*", 35 + "@swc/core": "^1.15.13", 36 + "@types/node": "^22.7.5", 37 + "nodemon": "^3.1.7", 38 + "ts-node": "^10.9.2", 39 + "tsup": "^8.5.1", 40 + "typescript": "^5.6.3" 41 + } 42 + }
+29
.docker/.manifests/packages__ai-parser__package.json
··· 1 + { 2 + "name": "@cv/ai-parser", 3 + "version": "0.0.0", 4 + "private": true, 5 + "main": "./src/index.ts", 6 + "types": "./src/index.ts", 7 + "scripts": { 8 + "typecheck": "tsc --noEmit", 9 + "test": "jest", 10 + "test:watch": "jest --watch", 11 + "test:coverage": "jest --coverage" 12 + }, 13 + "dependencies": { 14 + "@cv/ai-provider": "*", 15 + "@nestjs/common": "^11.1.3", 16 + "zod": "^4.3.6" 17 + }, 18 + "peerDependencies": { 19 + "@nestjs/common": "^11.0.0" 20 + }, 21 + "devDependencies": { 22 + "@cv/tsconfig": "*", 23 + "@types/jest": "^29.5.0", 24 + "@types/node": "^22.7.5", 25 + "jest": "^29.7.0", 26 + "ts-jest": "^29.1.1", 27 + "typescript": "^5.3.3" 28 + } 29 + }
+31
.docker/.manifests/packages__ai-provider__package.json
··· 1 + { 2 + "name": "@cv/ai-provider", 3 + "version": "0.0.0", 4 + "private": true, 5 + "main": "./src/index.ts", 6 + "types": "./src/index.ts", 7 + "scripts": { 8 + "typecheck": "tsc --noEmit", 9 + "test": "jest", 10 + "test:watch": "jest --watch", 11 + "test:integration": "jest --testPathPattern='.integration.test.ts$' --runInBand", 12 + "test:all": "jest --testPathIgnorePatterns=[]" 13 + }, 14 + "dependencies": { 15 + "@nestjs/common": "^11.1.3", 16 + "@nestjs/config": "^4.0.2", 17 + "zod": "^4.3.6" 18 + }, 19 + "peerDependencies": { 20 + "@nestjs/common": "^11.0.0", 21 + "@nestjs/config": "^4.0.0" 22 + }, 23 + "devDependencies": { 24 + "@cv/tsconfig": "*", 25 + "@types/jest": "^29.5.12", 26 + "@types/node": "^22.7.5", 27 + "jest": "^29.7.0", 28 + "ts-jest": "^29.1.2", 29 + "typescript": "^5.3.3" 30 + } 31 + }
+54
.docker/.manifests/packages__auth__package.json
··· 1 + { 2 + "name": "@cv/auth", 3 + "version": "0.0.0", 4 + "private": true, 5 + "main": "./src/index.ts", 6 + "types": "./src/index.ts", 7 + "exports": { 8 + ".": { 9 + "require": "./src/index.ts", 10 + "import": "./src/index.ts", 11 + "types": "./src/index.ts" 12 + } 13 + }, 14 + "files": [ 15 + "src/" 16 + ], 17 + "scripts": { 18 + "lint": "biome check .", 19 + "lint:fix": "biome check --write .", 20 + "typecheck": "tsc -b" 21 + }, 22 + "dependencies": { 23 + "@cv/system": "*", 24 + "@nestjs/common": "^10.4.7", 25 + "@nestjs/config": "^3.2.0", 26 + "@nestjs/core": "^10.4.7", 27 + "@nestjs/event-emitter": "^3.0.1", 28 + "@nestjs/graphql": "^12.2.2", 29 + "@nestjs/jwt": "^10.2.0", 30 + "bcryptjs": "^2.4.3", 31 + "graphql": "^16.12.0", 32 + "reflect-metadata": "^0.2.2", 33 + "zod": "^4.3.6" 34 + }, 35 + "devDependencies": { 36 + "@biomejs/biome": "^2.2.6", 37 + "@cv/biome-config": "*", 38 + "@cv/tsconfig": "*", 39 + "@types/bcryptjs": "^2.4.0", 40 + "@types/express": "^5.0.0", 41 + "typescript": "^5.6.3" 42 + }, 43 + "peerDependencies": { 44 + "@cv/system": "*", 45 + "@nestjs/common": "^10.4.7", 46 + "@nestjs/config": "^3.2.0", 47 + "@nestjs/core": "^10.4.7", 48 + "@nestjs/event-emitter": "^3.0.1", 49 + "@nestjs/graphql": "^12.2.2", 50 + "@nestjs/jwt": "^10.2.0", 51 + "bcryptjs": "^2.4.3", 52 + "graphql": "^16.12.0" 53 + } 54 + }
+8
.docker/.manifests/packages__biome-config__package.json
··· 1 + { 2 + "name": "@cv/biome-config", 3 + "version": "0.0.0", 4 + "private": true, 5 + "files": [ 6 + "biome.json" 7 + ] 8 + }
+15
.docker/.manifests/packages__cv-renderer__package.json
··· 1 + { 2 + "name": "@cv/cv-renderer", 3 + "version": "0.0.0", 4 + "private": true, 5 + "main": "./src/index.ts", 6 + "types": "./src/index.ts", 7 + "dependencies": { 8 + "handlebars": "^4.7.8" 9 + }, 10 + "devDependencies": { 11 + "@cv/tsconfig": "*", 12 + "@types/node": "^22.7.5", 13 + "typescript": "^5.3.3" 14 + } 15 + }
+39
.docker/.manifests/packages__file-storage__package.json
··· 1 + { 2 + "name": "@cv/file-storage", 3 + "version": "0.0.0", 4 + "private": true, 5 + "main": "./src/index.ts", 6 + "types": "./src/index.ts", 7 + "exports": { 8 + ".": { 9 + "require": "./src/index.ts", 10 + "import": "./src/index.ts", 11 + "types": "./src/index.ts" 12 + } 13 + }, 14 + "files": [ 15 + "src/" 16 + ], 17 + "scripts": { 18 + "lint": "biome check .", 19 + "lint:fix": "biome check --write .", 20 + "typecheck": "tsc -b" 21 + }, 22 + "dependencies": { 23 + "@aws-sdk/client-s3": "^3.800.0", 24 + "@nestjs/common": "^10.4.7", 25 + "@nestjs/config": "^3.2.0", 26 + "@nestjs/core": "^10.4.7" 27 + }, 28 + "devDependencies": { 29 + "@biomejs/biome": "^2.2.6", 30 + "@cv/biome-config": "*", 31 + "@cv/tsconfig": "*", 32 + "typescript": "^5.6.3" 33 + }, 34 + "peerDependencies": { 35 + "@nestjs/common": "^10.4.7", 36 + "@nestjs/config": "^3.2.0", 37 + "@nestjs/core": "^10.4.7" 38 + } 39 + }
+33
.docker/.manifests/packages__file-upload__package.json
··· 1 + { 2 + "name": "@cv/file-upload", 3 + "version": "0.0.0", 4 + "private": true, 5 + "main": "./src/index.ts", 6 + "types": "./src/index.ts", 7 + "scripts": { 8 + "typecheck": "tsc --noEmit", 9 + "test": "jest" 10 + }, 11 + "dependencies": { 12 + "@nestjs/common": "^11.1.3", 13 + "canvas": "^3.1.0", 14 + "mammoth": "^1.6.0", 15 + "pdf-parse": "^1.1.1", 16 + "pdf2json": "^3.1.4", 17 + "pdfjs-dist": "^3.11.174", 18 + "tesseract.js": "^5.1.1", 19 + "zod": "^4.3.6" 20 + }, 21 + "peerDependencies": { 22 + "@nestjs/common": "^11.0.0" 23 + }, 24 + "devDependencies": { 25 + "@cv/tsconfig": "*", 26 + "@types/jest": "^29.5.0", 27 + "@types/node": "^22.7.5", 28 + "@types/pdf-parse": "^1.1.5", 29 + "jest": "^29.7.0", 30 + "ts-jest": "^29.1.1", 31 + "typescript": "^5.3.3" 32 + } 33 + }
+33
.docker/.manifests/packages__routing__package.json
··· 1 + { 2 + "name": "@cv/routing", 3 + "version": "0.0.0", 4 + "private": true, 5 + "type": "module", 6 + "main": "./src/index.ts", 7 + "types": "./src/index.ts", 8 + "exports": { 9 + ".": { 10 + "import": "./src/index.ts", 11 + "types": "./src/index.ts" 12 + } 13 + }, 14 + "files": [ 15 + "src/" 16 + ], 17 + "scripts": { 18 + "lint": "biome check .", 19 + "lint:fix": "biome check --write .", 20 + "typecheck": "tsc --noEmit" 21 + }, 22 + "peerDependencies": { 23 + "react": "^19.2.3", 24 + "react-dom": "^19.2.3", 25 + "react-router-dom": "^7.9.4" 26 + }, 27 + "devDependencies": { 28 + "@cv/tsconfig": "workspace:^", 29 + "@types/react": "^19.0.6", 30 + "@types/react-dom": "^19.0.3", 31 + "typescript": "^5.5.3" 32 + } 33 + }
+57
.docker/.manifests/packages__system__package.json
··· 1 + { 2 + "name": "@cv/system", 3 + "version": "0.0.0", 4 + "private": true, 5 + "main": "./src/index.ts", 6 + "types": "./src/index.ts", 7 + "exports": { 8 + ".": { 9 + "require": "./src/index.ts", 10 + "import": "./src/index.ts", 11 + "types": "./src/index.ts" 12 + } 13 + }, 14 + "files": [ 15 + "src/" 16 + ], 17 + "scripts": { 18 + "lint": "biome check .", 19 + "lint:fix": "biome check --write .", 20 + "typecheck": "tsc -b" 21 + }, 22 + "dependencies": { 23 + "@nestjs/common": "^10.4.7", 24 + "@nestjs/config": "^3.2.0", 25 + "@nestjs/core": "^10.4.7", 26 + "@nestjs/event-emitter": "^3.0.1", 27 + "@nestjs/graphql": "^12.2.2", 28 + "@prisma/adapter-pg": "^7.1.0", 29 + "@prisma/client": "^7.1.0", 30 + "dataloader": "^2.2.3", 31 + "graphql": "^16.12.0", 32 + "handlebars": "^4.7.8", 33 + "pg": "^8.16.3", 34 + "reflect-metadata": "^0.2.2", 35 + "resend": "^6.5.2" 36 + }, 37 + "devDependencies": { 38 + "@biomejs/biome": "^2.2.6", 39 + "@cv/biome-config": "*", 40 + "@cv/tsconfig": "*", 41 + "@types/pg": "^8.15.0", 42 + "typescript": "^5.6.3" 43 + }, 44 + "peerDependencies": { 45 + "@nestjs/common": "^10.4.7", 46 + "@nestjs/config": "^3.2.0", 47 + "@nestjs/core": "^10.4.7", 48 + "@nestjs/event-emitter": "^3.0.1", 49 + "@nestjs/graphql": "^12.2.2", 50 + "@prisma/adapter-pg": "^7.1.0", 51 + "@prisma/client": "^7.1.0", 52 + "graphql": "^16.12.0", 53 + "handlebars": "^4.7.8", 54 + "pg": "^8.16.3", 55 + "resend": "^6.5.2" 56 + } 57 + }
+10
.docker/.manifests/packages__tsconfig__package.json
··· 1 + { 2 + "name": "@cv/tsconfig", 3 + "version": "0.0.0", 4 + "private": true, 5 + "files": [ 6 + "tsconfig.base.json", 7 + "tsconfig.node.json", 8 + "tsconfig.library.json" 9 + ] 10 + }
+45
.docker/.manifests/packages__ui__package.json
··· 1 + { 2 + "name": "@cv/ui", 3 + "version": "0.0.0", 4 + "private": true, 5 + "type": "module", 6 + "main": "./src/index.ts", 7 + "types": "./src/index.ts", 8 + "exports": { 9 + ".": { 10 + "import": "./src/index.ts", 11 + "types": "./src/index.ts" 12 + }, 13 + "./styles": "./src/index.css" 14 + }, 15 + "files": [ 16 + "src/", 17 + "*.css" 18 + ], 19 + "scripts": { 20 + "lint": "biome check .", 21 + "lint:fix": "biome check --write .", 22 + "typecheck": "tsc --noEmit" 23 + }, 24 + "peerDependencies": { 25 + "react": "^19.2.3", 26 + "react-dom": "^19.2.3" 27 + }, 28 + "dependencies": { 29 + "@cv/utils": "*", 30 + "@catppuccin/tailwindcss": "^1.0.0", 31 + "@tanstack/react-virtual": "^3.11.2", 32 + "class-variance-authority": "^0.7.0", 33 + "clsx": "^2.1.1", 34 + "tailwind-merge": "^2.5.3", 35 + "zod": "^4.3.6" 36 + }, 37 + "devDependencies": { 38 + "@tailwindcss/cli": "^4.1.16", 39 + "@tailwindcss/postcss": "^4.0.0", 40 + "@types/react": "^19.0.6", 41 + "@types/react-dom": "^19.0.3", 42 + "tailwindcss": "^4.0.0", 43 + "typescript": "^5.5.3" 44 + } 45 + }
+13
.docker/.manifests/packages__utils__package.json
··· 1 + { 2 + "name": "@cv/utils", 3 + "version": "0.0.0", 4 + "private": true, 5 + "main": "index.ts", 6 + "types": "index.ts", 7 + "scripts": { 8 + "typecheck": "tsc -b" 9 + }, 10 + "devDependencies": { 11 + "@cv/tsconfig": "workspace:*" 12 + } 13 + }
+1
apps/server/package.json
··· 35 35 "@cv/ai-provider": "*", 36 36 "@cv/auth": "*", 37 37 "@cv/cv-renderer": "*", 38 + "@cv/file-storage": "*", 38 39 "@cv/file-upload": "*", 39 40 "@cv/system": "*", 40 41 "@cv/utils": "*",
+18 -1
apps/server/src/config/env.validation.ts
··· 92 92 ANTHROPIC_BASE_URL: z.string().url().default("https://api.anthropic.com"), 93 93 ANTHROPIC_MODEL: z.string().default("claude-sonnet-4-5-20250929"), 94 94 95 - // PDF Output 95 + // File Storage 96 + FILE_STORAGE_DRIVER: z.enum(["disk", "r2"]).default("disk"), 96 97 PDF_OUTPUT_DIR: z.string().default("./pdf-output"), 98 + R2_ENDPOINT: z.string().optional().default(""), 99 + R2_ACCESS_KEY_ID: z.string().optional().default(""), 100 + R2_SECRET_ACCESS_KEY: z.string().optional().default(""), 101 + R2_BUCKET: z.string().optional().default(""), 97 102 }) 98 103 .superRefine((data, ctx) => { 99 104 if (data.AI_PROVIDER === "openai" && !data.OPENAI_API_KEY) { ··· 110 115 message: "ANTHROPIC_API_KEY is required when AI_PROVIDER=anthropic", 111 116 path: ["ANTHROPIC_API_KEY"], 112 117 }); 118 + } 119 + 120 + if (data.FILE_STORAGE_DRIVER === "r2") { 121 + for (const key of ["R2_ENDPOINT", "R2_ACCESS_KEY_ID", "R2_SECRET_ACCESS_KEY", "R2_BUCKET"] as const) { 122 + if (!data[key]) { 123 + ctx.addIssue({ 124 + code: z.ZodIssueCode.custom, 125 + message: `${key} is required when FILE_STORAGE_DRIVER=r2`, 126 + path: [key], 127 + }); 128 + } 129 + } 113 130 } 114 131 }); 115 132
+31
apps/server/src/config/file-storage.config.ts
··· 1 + import { Injectable } from "@nestjs/common"; 2 + import { ConfigService } from "@nestjs/config"; 3 + import type { 4 + FileStorageConfigProvider, 5 + FileStorageModuleConfig, 6 + } from "@cv/file-storage"; 7 + import type { Env } from "./env.validation"; 8 + 9 + @Injectable() 10 + export class FileStorageConfig implements FileStorageConfigProvider { 11 + constructor(private readonly configService: ConfigService<Env, true>) {} 12 + 13 + createFileStorageConfig(): FileStorageModuleConfig { 14 + const driver = this.configService.get("FILE_STORAGE_DRIVER"); 15 + 16 + if (driver === "r2") { 17 + return { 18 + driver: "r2", 19 + endpoint: this.configService.get("R2_ENDPOINT"), 20 + accessKeyId: this.configService.get("R2_ACCESS_KEY_ID"), 21 + secretAccessKey: this.configService.get("R2_SECRET_ACCESS_KEY"), 22 + bucket: this.configService.get("R2_BUCKET"), 23 + }; 24 + } 25 + 26 + return { 27 + driver: "disk", 28 + baseDir: this.configService.get("PDF_OUTPUT_DIR"), 29 + }; 30 + } 31 + }
+5
apps/server/src/modules/app.module.ts
··· 1 1 import { AuthModule, AuthorizationModule, UserModule } from "@cv/auth"; 2 + import { FileStorageModule } from "@cv/file-storage"; 2 3 import { 3 4 BaseModule, 4 5 DatabaseModule, ··· 13 14 import type { Request, Response } from "express"; 14 15 import { AppConfigModule } from "@/config/config.module"; 15 16 import { validate } from "@/config/env.validation"; 17 + import { FileStorageConfig } from "@/config/file-storage.config"; 16 18 import { AdminModule } from "./admin/admin.module"; 17 19 import { AiCallLogModule } from "./admin/ai-call-log.module"; 18 20 import { AppModule as AppModuleComponent } from "./app/app.module"; ··· 64 66 req, 65 67 res, 66 68 }), 69 + }), 70 + FileStorageModule.forRootAsync({ 71 + useClass: FileStorageConfig, 67 72 }), 68 73 AiCallLogModule, 69 74 AppConfigModule,
+14 -13
apps/server/src/modules/cv-template/pdf-download.controller.ts
··· 1 - import { existsSync } from "node:fs"; 2 - import { join } from "node:path"; 3 1 import type { User as DomainUser } from "@cv/auth"; 4 2 import { AuthorizationService, JwtAuthGuard } from "@cv/auth"; 3 + import { FILE_STORAGE, type FileStorage } from "@cv/file-storage"; 5 4 import { 6 5 Controller, 7 6 Get, 7 + Inject, 8 8 NotFoundException, 9 9 Param, 10 10 Req, 11 11 Res, 12 12 UseGuards, 13 13 } from "@nestjs/common"; 14 - import { ConfigService } from "@nestjs/config"; 15 14 import type { Response } from "express"; 16 - import type { Env } from "@/config/env.validation"; 17 15 import { CVService } from "./cv.service"; 18 16 import { CV } from "./graphql/cv.type"; 19 17 20 18 @Controller("api/cv") 21 19 @UseGuards(JwtAuthGuard) 22 20 export class PdfDownloadController { 23 - private readonly pdfOutputDir: string; 24 - 25 21 constructor( 26 22 private readonly cvService: CVService, 27 23 private readonly authorizationService: AuthorizationService, 28 - configService: ConfigService<Env, true>, 29 - ) { 30 - this.pdfOutputDir = configService.get("PDF_OUTPUT_DIR"); 31 - } 24 + @Inject(FILE_STORAGE) private readonly storage: FileStorage, 25 + ) {} 32 26 33 27 @Get(":id/pdf") 34 28 async downloadPdf( ··· 39 33 const cv = await this.cvService.findByIdOrFail(id); 40 34 await this.authorizationService.canView(req.user, cv, CV); 41 35 42 - const filePath = join(this.pdfOutputDir, `${id}.pdf`); 36 + const key = `${id}.pdf`; 43 37 44 - if (!existsSync(filePath)) { 38 + if (!(await this.storage.exists(key))) { 45 39 throw new NotFoundException("PDF not yet available"); 46 40 } 47 41 42 + const pdf = await this.storage.read(key); 48 43 const safeTitle = cv.title.replace(/[^a-zA-Z0-9_\- ]/g, ""); 49 - res.download(filePath, `${safeTitle}.pdf`); 44 + 45 + res.set({ 46 + "Content-Type": "application/pdf", 47 + "Content-Disposition": `attachment; filename="${safeTitle}.pdf"`, 48 + "Content-Length": pdf.length.toString(), 49 + }); 50 + res.send(pdf); 50 51 } 51 52 }
+1
apps/worker/package.json
··· 12 12 "lint:fix": "biome check --write ." 13 13 }, 14 14 "dependencies": { 15 + "@cv/file-storage": "*", 15 16 "@cv/system": "*", 16 17 "@nestjs/common": "^10.4.7", 17 18 "@nestjs/config": "^3.2.0",
+5
apps/worker/src/config.ts
··· 24 24 .split(",") 25 25 .map((s) => s.trim()) 26 26 .filter(Boolean), 27 + fileStorageDriver: (process.env["FILE_STORAGE_DRIVER"] ?? "disk") as "disk" | "r2", 28 + r2Endpoint: process.env["R2_ENDPOINT"] ?? "", 29 + r2AccessKeyId: process.env["R2_ACCESS_KEY_ID"] ?? "", 30 + r2SecretAccessKey: process.env["R2_SECRET_ACCESS_KEY"] ?? "", 31 + r2Bucket: process.env["R2_BUCKET"] ?? "", 27 32 } as const;
+5 -6
apps/worker/src/handlers/render-pdf.handler.ts
··· 1 - import * as fs from "node:fs/promises"; 2 - import * as path from "node:path"; 3 1 import { Inject, Injectable, Logger } from "@nestjs/common"; 4 2 import type { Envelope, Handler } from "@riotbyte-com/project-q-core"; 5 3 import { HandlerTag } from "@riotbyte-com/project-q-nestjs"; 4 + import { FILE_STORAGE, type FileStorage } from "@cv/file-storage"; 6 5 import type { WorkerConfig } from "../config"; 7 6 import { HtmlToPdfService } from "../pdf/html-to-pdf.service"; 8 7 import { WORKER_CONFIG } from "../worker.module"; ··· 21 20 constructor( 22 21 private readonly pdfService: HtmlToPdfService, 23 22 @Inject(WORKER_CONFIG) private readonly config: WorkerConfig, 23 + @Inject(FILE_STORAGE) private readonly storage: FileStorage, 24 24 ) {} 25 25 26 26 async handle(envelope: Envelope): Promise<void> { ··· 32 32 33 33 const pdf = await this.pdfService.convert(html, this.config.pdfTimeoutMs); 34 34 35 - await fs.mkdir(this.config.pdfOutputDir, { recursive: true }); 36 - const outputPath = path.join(this.config.pdfOutputDir, `${cvId}.pdf`); 37 - await fs.writeFile(outputPath, pdf); 35 + const key = `${cvId}.pdf`; 36 + await this.storage.write(key, pdf); 38 37 39 - this.logger.log(`PDF written to ${outputPath} (${pdf.length} bytes)`); 38 + this.logger.log(`PDF stored as ${key} (${pdf.length} bytes)`); 40 39 } 41 40 }
+12
apps/worker/src/worker.module.ts
··· 2 2 import { ConfigModule } from "@nestjs/config"; 3 3 import { EventEmitterModule } from "@nestjs/event-emitter"; 4 4 import { DatabaseModule, PrismaService } from "@cv/system"; 5 + import { FileStorageModule } from "@cv/file-storage"; 5 6 import { LoggerProvider, MessengerModule } from "@riotbyte-com/project-q-nestjs"; 6 7 import { PrismaClientToken, PrismaTransportFactory } from "@riotbyte-com/project-q-prisma"; 7 8 import type { WorkerConfig } from "./config"; ··· 22 23 DatabaseModule, 23 24 EventEmitterModule.forRoot(), 24 25 HeartbeatModule.register(config), 26 + FileStorageModule.forRoot( 27 + config.fileStorageDriver === "r2" 28 + ? { 29 + driver: "r2", 30 + endpoint: config.r2Endpoint, 31 + accessKeyId: config.r2AccessKeyId, 32 + secretAccessKey: config.r2SecretAccessKey, 33 + bucket: config.r2Bucket, 34 + } 35 + : { driver: "disk", baseDir: config.pdfOutputDir }, 36 + ), 25 37 MessengerModule.forRoot({ 26 38 transports: { 27 39 async: { dsn: `prisma://?queue=${config.queueName}`, retry: true },
+21
packages/file-storage/node_modules/.bin/biome
··· 1 + #!/bin/sh 2 + basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") 3 + 4 + case `uname` in 5 + *CYGWIN*|*MINGW*|*MSYS*) 6 + if command -v cygpath > /dev/null 2>&1; then 7 + basedir=`cygpath -w "$basedir"` 8 + fi 9 + ;; 10 + esac 11 + 12 + if [ -z "$NODE_PATH" ]; then 13 + export NODE_PATH="/Users/niels/Developer/mokkenstorm-dev/cv-generator/.worktrees/cvg-29/node_modules/.pnpm/@biomejs+biome@2.3.11/node_modules/@biomejs/biome/bin/node_modules:/Users/niels/Developer/mokkenstorm-dev/cv-generator/.worktrees/cvg-29/node_modules/.pnpm/@biomejs+biome@2.3.11/node_modules/@biomejs/biome/node_modules:/Users/niels/Developer/mokkenstorm-dev/cv-generator/.worktrees/cvg-29/node_modules/.pnpm/@biomejs+biome@2.3.11/node_modules/@biomejs/node_modules:/Users/niels/Developer/mokkenstorm-dev/cv-generator/.worktrees/cvg-29/node_modules/.pnpm/@biomejs+biome@2.3.11/node_modules:/Users/niels/Developer/mokkenstorm-dev/cv-generator/.worktrees/cvg-29/node_modules/.pnpm/node_modules" 14 + else 15 + export NODE_PATH="/Users/niels/Developer/mokkenstorm-dev/cv-generator/.worktrees/cvg-29/node_modules/.pnpm/@biomejs+biome@2.3.11/node_modules/@biomejs/biome/bin/node_modules:/Users/niels/Developer/mokkenstorm-dev/cv-generator/.worktrees/cvg-29/node_modules/.pnpm/@biomejs+biome@2.3.11/node_modules/@biomejs/biome/node_modules:/Users/niels/Developer/mokkenstorm-dev/cv-generator/.worktrees/cvg-29/node_modules/.pnpm/@biomejs+biome@2.3.11/node_modules/@biomejs/node_modules:/Users/niels/Developer/mokkenstorm-dev/cv-generator/.worktrees/cvg-29/node_modules/.pnpm/@biomejs+biome@2.3.11/node_modules:/Users/niels/Developer/mokkenstorm-dev/cv-generator/.worktrees/cvg-29/node_modules/.pnpm/node_modules:$NODE_PATH" 16 + fi 17 + if [ -x "$basedir/node" ]; then 18 + exec "$basedir/node" "$basedir/../@biomejs/biome/bin/biome" "$@" 19 + else 20 + exec node "$basedir/../@biomejs/biome/bin/biome" "$@" 21 + fi
+21
packages/file-storage/node_modules/.bin/tsc
··· 1 + #!/bin/sh 2 + basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") 3 + 4 + case `uname` in 5 + *CYGWIN*|*MINGW*|*MSYS*) 6 + if command -v cygpath > /dev/null 2>&1; then 7 + basedir=`cygpath -w "$basedir"` 8 + fi 9 + ;; 10 + esac 11 + 12 + if [ -z "$NODE_PATH" ]; then 13 + export NODE_PATH="/Users/niels/Developer/mokkenstorm-dev/cv-generator/.worktrees/cvg-29/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/bin/node_modules:/Users/niels/Developer/mokkenstorm-dev/cv-generator/.worktrees/cvg-29/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/node_modules:/Users/niels/Developer/mokkenstorm-dev/cv-generator/.worktrees/cvg-29/node_modules/.pnpm/typescript@5.9.3/node_modules:/Users/niels/Developer/mokkenstorm-dev/cv-generator/.worktrees/cvg-29/node_modules/.pnpm/node_modules" 14 + else 15 + export NODE_PATH="/Users/niels/Developer/mokkenstorm-dev/cv-generator/.worktrees/cvg-29/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/bin/node_modules:/Users/niels/Developer/mokkenstorm-dev/cv-generator/.worktrees/cvg-29/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/node_modules:/Users/niels/Developer/mokkenstorm-dev/cv-generator/.worktrees/cvg-29/node_modules/.pnpm/typescript@5.9.3/node_modules:/Users/niels/Developer/mokkenstorm-dev/cv-generator/.worktrees/cvg-29/node_modules/.pnpm/node_modules:$NODE_PATH" 16 + fi 17 + if [ -x "$basedir/node" ]; then 18 + exec "$basedir/node" "$basedir/../typescript/bin/tsc" "$@" 19 + else 20 + exec node "$basedir/../typescript/bin/tsc" "$@" 21 + fi
+21
packages/file-storage/node_modules/.bin/tsserver
··· 1 + #!/bin/sh 2 + basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") 3 + 4 + case `uname` in 5 + *CYGWIN*|*MINGW*|*MSYS*) 6 + if command -v cygpath > /dev/null 2>&1; then 7 + basedir=`cygpath -w "$basedir"` 8 + fi 9 + ;; 10 + esac 11 + 12 + if [ -z "$NODE_PATH" ]; then 13 + export NODE_PATH="/Users/niels/Developer/mokkenstorm-dev/cv-generator/.worktrees/cvg-29/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/bin/node_modules:/Users/niels/Developer/mokkenstorm-dev/cv-generator/.worktrees/cvg-29/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/node_modules:/Users/niels/Developer/mokkenstorm-dev/cv-generator/.worktrees/cvg-29/node_modules/.pnpm/typescript@5.9.3/node_modules:/Users/niels/Developer/mokkenstorm-dev/cv-generator/.worktrees/cvg-29/node_modules/.pnpm/node_modules" 14 + else 15 + export NODE_PATH="/Users/niels/Developer/mokkenstorm-dev/cv-generator/.worktrees/cvg-29/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/bin/node_modules:/Users/niels/Developer/mokkenstorm-dev/cv-generator/.worktrees/cvg-29/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/node_modules:/Users/niels/Developer/mokkenstorm-dev/cv-generator/.worktrees/cvg-29/node_modules/.pnpm/typescript@5.9.3/node_modules:/Users/niels/Developer/mokkenstorm-dev/cv-generator/.worktrees/cvg-29/node_modules/.pnpm/node_modules:$NODE_PATH" 16 + fi 17 + if [ -x "$basedir/node" ]; then 18 + exec "$basedir/node" "$basedir/../typescript/bin/tsserver" "$@" 19 + else 20 + exec node "$basedir/../typescript/bin/tsserver" "$@" 21 + fi
+1
packages/file-storage/node_modules/@aws-sdk/client-s3
··· 1 + ../../../../node_modules/.pnpm/@aws-sdk+client-s3@3.1013.0/node_modules/@aws-sdk/client-s3
+1
packages/file-storage/node_modules/@biomejs/biome
··· 1 + ../../../../node_modules/.pnpm/@biomejs+biome@2.3.11/node_modules/@biomejs/biome
+1
packages/file-storage/node_modules/@cv/biome-config
··· 1 + ../../../biome-config
+1
packages/file-storage/node_modules/@cv/tsconfig
··· 1 + ../../../tsconfig
+1
packages/file-storage/node_modules/@nestjs/common
··· 1 + ../../../../node_modules/.pnpm/@nestjs+common@10.4.20_class-transformer@0.5.1_class-validator@0.14.3_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common
+1
packages/file-storage/node_modules/@nestjs/config
··· 1 + ../../../../node_modules/.pnpm/@nestjs+config@3.3.0_@nestjs+common@10.4.20_class-transformer@0.5.1_class-validator@0.1_58c1bf1e717ef833921b83465d1ad77f/node_modules/@nestjs/config
+1
packages/file-storage/node_modules/@nestjs/core
··· 1 + ../../../../node_modules/.pnpm/@nestjs+core@10.4.20_@nestjs+common@10.4.20_class-transformer@0.5.1_class-validator@0.1_8e933ac409a05133c14a05ab97ef0b40/node_modules/@nestjs/core
+1
packages/file-storage/node_modules/typescript
··· 1 + ../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript
+39
packages/file-storage/package.json
··· 1 + { 2 + "name": "@cv/file-storage", 3 + "version": "0.0.0", 4 + "private": true, 5 + "main": "./src/index.ts", 6 + "types": "./src/index.ts", 7 + "exports": { 8 + ".": { 9 + "require": "./src/index.ts", 10 + "import": "./src/index.ts", 11 + "types": "./src/index.ts" 12 + } 13 + }, 14 + "files": [ 15 + "src/" 16 + ], 17 + "scripts": { 18 + "lint": "biome check .", 19 + "lint:fix": "biome check --write .", 20 + "typecheck": "tsc -b" 21 + }, 22 + "dependencies": { 23 + "@aws-sdk/client-s3": "^3.800.0", 24 + "@nestjs/common": "^10.4.7", 25 + "@nestjs/config": "^3.2.0", 26 + "@nestjs/core": "^10.4.7" 27 + }, 28 + "devDependencies": { 29 + "@biomejs/biome": "^2.2.6", 30 + "@cv/biome-config": "*", 31 + "@cv/tsconfig": "*", 32 + "typescript": "^5.6.3" 33 + }, 34 + "peerDependencies": { 35 + "@nestjs/common": "^10.4.7", 36 + "@nestjs/config": "^3.2.0", 37 + "@nestjs/core": "^10.4.7" 38 + } 39 + }
+39
packages/file-storage/src/disk-file-storage.ts
··· 1 + import * as fs from "node:fs/promises"; 2 + import * as path from "node:path"; 3 + import { Injectable, Logger } from "@nestjs/common"; 4 + import type { FileStorage } from "./file-storage.interface"; 5 + 6 + @Injectable() 7 + export class DiskFileStorage implements FileStorage { 8 + private readonly logger = new Logger(DiskFileStorage.name); 9 + 10 + constructor(private readonly baseDir: string) {} 11 + 12 + async write(key: string, data: Buffer): Promise<void> { 13 + const filePath = this.resolve(key); 14 + await fs.mkdir(path.dirname(filePath), { recursive: true }); 15 + await fs.writeFile(filePath, data); 16 + this.logger.debug(`Written ${data.length} bytes to ${filePath}`); 17 + } 18 + 19 + async read(key: string): Promise<Buffer> { 20 + return fs.readFile(this.resolve(key)); 21 + } 22 + 23 + async delete(key: string): Promise<void> { 24 + await fs.unlink(this.resolve(key)); 25 + } 26 + 27 + async exists(key: string): Promise<boolean> { 28 + try { 29 + await fs.access(this.resolve(key)); 30 + return true; 31 + } catch { 32 + return false; 33 + } 34 + } 35 + 36 + private resolve(key: string): string { 37 + return path.join(this.baseDir, key); 38 + } 39 + }
+12
packages/file-storage/src/file-storage.interface.ts
··· 1 + /** 2 + * Storage backend abstraction for file persistence. 3 + * Implementations: DiskFileStorage (local dev), R2FileStorage (prod). 4 + */ 5 + export interface FileStorage { 6 + write(key: string, data: Buffer): Promise<void>; 7 + read(key: string): Promise<Buffer>; 8 + delete(key: string): Promise<void>; 9 + exists(key: string): Promise<boolean>; 10 + } 11 + 12 + export const FILE_STORAGE = Symbol("FILE_STORAGE");
+72
packages/file-storage/src/file-storage.module.ts
··· 1 + import { type DynamicModule, Module, type Type } from "@nestjs/common"; 2 + import { DiskFileStorage } from "./disk-file-storage"; 3 + import { FILE_STORAGE } from "./file-storage.interface"; 4 + import { R2FileStorage, type R2FileStorageConfig } from "./r2-file-storage"; 5 + 6 + type DiskConfig = { driver: "disk"; baseDir: string }; 7 + type R2Config = { driver: "r2" } & R2FileStorageConfig; 8 + export type FileStorageModuleConfig = DiskConfig | R2Config; 9 + 10 + /** 11 + * Implement this interface to provide FileStorage configuration 12 + * via NestJS DI. Register it with `FileStorageModule.forRootAsync()`. 13 + */ 14 + export interface FileStorageConfigProvider { 15 + createFileStorageConfig(): FileStorageModuleConfig; 16 + } 17 + 18 + export const FILE_STORAGE_CONFIG_PROVIDER = Symbol("FILE_STORAGE_CONFIG_PROVIDER"); 19 + 20 + @Module({}) 21 + export class FileStorageModule { 22 + /** 23 + * Static configuration — pass the config directly. 24 + */ 25 + static forRoot(config: FileStorageModuleConfig): DynamicModule { 26 + return { 27 + module: FileStorageModule, 28 + providers: [ 29 + { 30 + provide: FILE_STORAGE, 31 + useFactory: () => createStorage(config), 32 + }, 33 + ], 34 + exports: [FILE_STORAGE], 35 + global: true, 36 + }; 37 + } 38 + 39 + /** 40 + * Async configuration — provide a class that implements 41 + * `FileStorageConfigProvider`. The class can inject ConfigService 42 + * or any other NestJS provider. 43 + */ 44 + static forRootAsync(options: { 45 + imports?: Type[]; 46 + useClass: Type<FileStorageConfigProvider>; 47 + }): DynamicModule { 48 + return { 49 + module: FileStorageModule, 50 + imports: options.imports ?? [], 51 + providers: [ 52 + { 53 + provide: FILE_STORAGE_CONFIG_PROVIDER, 54 + useClass: options.useClass, 55 + }, 56 + { 57 + provide: FILE_STORAGE, 58 + useFactory: (provider: FileStorageConfigProvider) => 59 + createStorage(provider.createFileStorageConfig()), 60 + inject: [FILE_STORAGE_CONFIG_PROVIDER], 61 + }, 62 + ], 63 + exports: [FILE_STORAGE], 64 + global: true, 65 + }; 66 + } 67 + } 68 + 69 + const createStorage = (config: FileStorageModuleConfig) => 70 + config.driver === "r2" 71 + ? new R2FileStorage(config) 72 + : new DiskFileStorage(config.baseDir);
+8
packages/file-storage/src/index.ts
··· 1 + export { FILE_STORAGE, type FileStorage } from "./file-storage.interface"; 2 + export { DiskFileStorage } from "./disk-file-storage"; 3 + export { R2FileStorage, type R2FileStorageConfig } from "./r2-file-storage"; 4 + export { 5 + FileStorageModule, 6 + type FileStorageModuleConfig, 7 + type FileStorageConfigProvider, 8 + } from "./file-storage.module";
+81
packages/file-storage/src/r2-file-storage.ts
··· 1 + import { Injectable, Logger } from "@nestjs/common"; 2 + import { 3 + DeleteObjectCommand, 4 + GetObjectCommand, 5 + HeadObjectCommand, 6 + PutObjectCommand, 7 + S3Client, 8 + } from "@aws-sdk/client-s3"; 9 + import type { FileStorage } from "./file-storage.interface"; 10 + 11 + export type R2FileStorageConfig = { 12 + endpoint: string; 13 + accessKeyId: string; 14 + secretAccessKey: string; 15 + bucket: string; 16 + }; 17 + 18 + @Injectable() 19 + export class R2FileStorage implements FileStorage { 20 + private readonly logger = new Logger(R2FileStorage.name); 21 + private readonly client: S3Client; 22 + private readonly bucket: string; 23 + 24 + constructor(config: R2FileStorageConfig) { 25 + this.bucket = config.bucket; 26 + this.client = new S3Client({ 27 + region: "auto", 28 + endpoint: config.endpoint, 29 + credentials: { 30 + accessKeyId: config.accessKeyId, 31 + secretAccessKey: config.secretAccessKey, 32 + }, 33 + }); 34 + } 35 + 36 + async write(key: string, data: Buffer): Promise<void> { 37 + await this.client.send( 38 + new PutObjectCommand({ 39 + Bucket: this.bucket, 40 + Key: key, 41 + Body: data, 42 + }), 43 + ); 44 + this.logger.debug(`Uploaded ${data.length} bytes to r2://${this.bucket}/${key}`); 45 + } 46 + 47 + async read(key: string): Promise<Buffer> { 48 + const response = await this.client.send( 49 + new GetObjectCommand({ 50 + Bucket: this.bucket, 51 + Key: key, 52 + }), 53 + ); 54 + const bytes = await response.Body?.transformToByteArray(); 55 + if (!bytes) throw new Error(`Empty response for key: ${key}`); 56 + return Buffer.from(bytes); 57 + } 58 + 59 + async delete(key: string): Promise<void> { 60 + await this.client.send( 61 + new DeleteObjectCommand({ 62 + Bucket: this.bucket, 63 + Key: key, 64 + }), 65 + ); 66 + } 67 + 68 + async exists(key: string): Promise<boolean> { 69 + try { 70 + await this.client.send( 71 + new HeadObjectCommand({ 72 + Bucket: this.bucket, 73 + Key: key, 74 + }), 75 + ); 76 + return true; 77 + } catch { 78 + return false; 79 + } 80 + } 81 + }
+12
packages/file-storage/tsconfig.json
··· 1 + { 2 + "extends": "@cv/tsconfig/tsconfig.library.json", 3 + "compilerOptions": { 4 + "outDir": "./dist", 5 + "rootDir": "./src", 6 + "baseUrl": ".", 7 + "composite": true, 8 + "declaration": true, 9 + "emitDeclarationOnly": true 10 + }, 11 + "include": ["src/**/*"] 12 + }
+1225
pnpm-lock.yaml
··· 236 236 '@cv/cv-renderer': 237 237 specifier: '*' 238 238 version: link:../../packages/cv-renderer 239 + '@cv/file-storage': 240 + specifier: '*' 241 + version: link:../../packages/file-storage 239 242 '@cv/file-upload': 240 243 specifier: '*' 241 244 version: link:../../packages/file-upload ··· 468 471 469 472 apps/worker: 470 473 dependencies: 474 + '@cv/file-storage': 475 + specifier: '*' 476 + version: link:../../packages/file-storage 471 477 '@cv/system': 472 478 specifier: '*' 473 479 version: link:../../packages/system ··· 674 680 specifier: ^5.3.3 675 681 version: 5.9.3 676 682 683 + packages/file-storage: 684 + dependencies: 685 + '@aws-sdk/client-s3': 686 + specifier: ^3.800.0 687 + version: 3.1013.0 688 + '@nestjs/common': 689 + specifier: ^10.4.7 690 + version: 10.4.20(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2) 691 + '@nestjs/config': 692 + specifier: ^3.2.0 693 + version: 3.3.0(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(rxjs@7.8.2) 694 + '@nestjs/core': 695 + specifier: ^10.4.7 696 + version: 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@10.4.20)(encoding@0.1.13)(reflect-metadata@0.2.2)(rxjs@7.8.2) 697 + devDependencies: 698 + '@biomejs/biome': 699 + specifier: ^2.2.6 700 + version: 2.3.11 701 + '@cv/biome-config': 702 + specifier: '*' 703 + version: link:../biome-config 704 + '@cv/tsconfig': 705 + specifier: '*' 706 + version: link:../tsconfig 707 + typescript: 708 + specifier: ^5.6.3 709 + version: 5.9.3 710 + 677 711 packages/file-upload: 678 712 dependencies: 679 713 '@nestjs/common': ··· 1027 1061 hasBin: true 1028 1062 peerDependencies: 1029 1063 graphql: '*' 1064 + 1065 + '@aws-crypto/crc32@5.2.0': 1066 + resolution: {integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==} 1067 + engines: {node: '>=16.0.0'} 1068 + 1069 + '@aws-crypto/crc32c@5.2.0': 1070 + resolution: {integrity: sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag==} 1071 + 1072 + '@aws-crypto/sha1-browser@5.2.0': 1073 + resolution: {integrity: sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==} 1074 + 1075 + '@aws-crypto/sha256-browser@5.2.0': 1076 + resolution: {integrity: sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==} 1077 + 1078 + '@aws-crypto/sha256-js@5.2.0': 1079 + resolution: {integrity: sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==} 1080 + engines: {node: '>=16.0.0'} 1081 + 1082 + '@aws-crypto/supports-web-crypto@5.2.0': 1083 + resolution: {integrity: sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==} 1084 + 1085 + '@aws-crypto/util@5.2.0': 1086 + resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} 1087 + 1088 + '@aws-sdk/client-s3@3.1013.0': 1089 + resolution: {integrity: sha512-vFdyRyRatF+xP9Fi+4alZkmzZadqOAM34Pm6SUZsYtumNrWkgMc/pFWITnsq6eltM8qcV/vcinQ1ZBXWm/PlKg==} 1090 + engines: {node: '>=20.0.0'} 1091 + 1092 + '@aws-sdk/core@3.973.22': 1093 + resolution: {integrity: sha512-lY6g5L95jBNgOUitUhfV2N/W+i08jHEl3xuLODYSQH5Sf50V+LkVYBSyZRLtv2RyuXZXiV7yQ+acpswK1tlrOA==} 1094 + engines: {node: '>=20.0.0'} 1095 + 1096 + '@aws-sdk/crc64-nvme@3.972.5': 1097 + resolution: {integrity: sha512-2VbTstbjKdT+yKi8m7b3a9CiVac+pL/IY2PHJwsaGkkHmuuqkJZIErPck1h6P3T9ghQMLSdMPyW6Qp7Di5swFg==} 1098 + engines: {node: '>=20.0.0'} 1099 + 1100 + '@aws-sdk/credential-provider-env@3.972.20': 1101 + resolution: {integrity: sha512-vI0QN96DFx3g9AunfOWF3CS4cMkqFiR/WM/FyP9QHr5rZ2dKPkYwP3tCgAOvGuu9CXI7dC1vU2FVUuZ+tfpNvQ==} 1102 + engines: {node: '>=20.0.0'} 1103 + 1104 + '@aws-sdk/credential-provider-http@3.972.22': 1105 + resolution: {integrity: sha512-aS/81smalpe7XDnuQfOq4LIPuaV2PRKU2aMTrHcqO5BD4HwO5kESOHNcec2AYfBtLtIDqgF6RXisgBnfK/jt0w==} 1106 + engines: {node: '>=20.0.0'} 1107 + 1108 + '@aws-sdk/credential-provider-ini@3.972.22': 1109 + resolution: {integrity: sha512-rpF8fBT0LllMDp78s62aL2A/8MaccjyJ0ORzqu+ZADeECLSrrCWIeeXsuRam+pxiAMkI1uIyDZJmgLGdadkPXw==} 1110 + engines: {node: '>=20.0.0'} 1111 + 1112 + '@aws-sdk/credential-provider-login@3.972.22': 1113 + resolution: {integrity: sha512-u33CO9zeNznlVSg9tWTCRYxaGkqr1ufU6qeClpmzAabXZa8RZxQoVXxL5T53oZJFzQYj+FImORCSsi7H7B77gQ==} 1114 + engines: {node: '>=20.0.0'} 1115 + 1116 + '@aws-sdk/credential-provider-node@3.972.23': 1117 + resolution: {integrity: sha512-U8tyLbLOZItuVWTH0ay9gWo4xMqZwqQbg1oMzdU4FQSkTpqXemm4X0uoKBR6llqAStgBp30ziKFJHTA43l4qMw==} 1118 + engines: {node: '>=20.0.0'} 1119 + 1120 + '@aws-sdk/credential-provider-process@3.972.20': 1121 + resolution: {integrity: sha512-QRfk7GbA4/HDRjhP3QYR6QBr/QKreVoOzvvlRHnOuGgYJkeoPgPY3LAI1kK1ZMgZ4hH9KiGp757/ntol+INAig==} 1122 + engines: {node: '>=20.0.0'} 1123 + 1124 + '@aws-sdk/credential-provider-sso@3.972.22': 1125 + resolution: {integrity: sha512-4vqlSaUbBj4aNPVKfB6yXuIQ2Z2mvLfIGba2OzzF6zUkN437/PGWsxBU2F8QPSFHti6seckvyCXidU3H+R8NvQ==} 1126 + engines: {node: '>=20.0.0'} 1127 + 1128 + '@aws-sdk/credential-provider-web-identity@3.972.22': 1129 + resolution: {integrity: sha512-/wN1CYg2rVLhW8/jLxMWacQrkpaynnL+4j/Z+e6X1PfoE6NiC0BeOw3i0JmtZrKun85wNV5GmspvuWJihfeeUw==} 1130 + engines: {node: '>=20.0.0'} 1131 + 1132 + '@aws-sdk/middleware-bucket-endpoint@3.972.8': 1133 + resolution: {integrity: sha512-WR525Rr2QJSETa9a050isktyWi/4yIGcmY3BQ1kpHqb0LqUglQHCS8R27dTJxxWNZvQ0RVGtEZjTCbZJpyF3Aw==} 1134 + engines: {node: '>=20.0.0'} 1135 + 1136 + '@aws-sdk/middleware-expect-continue@3.972.8': 1137 + resolution: {integrity: sha512-5DTBTiotEES1e2jOHAq//zyzCjeMB78lEHd35u15qnrid4Nxm7diqIf9fQQ3Ov0ChH1V3Vvt13thOnrACmfGVQ==} 1138 + engines: {node: '>=20.0.0'} 1139 + 1140 + '@aws-sdk/middleware-flexible-checksums@3.974.2': 1141 + resolution: {integrity: sha512-4soN/N4R6ptdnHw7hXPVDZMIIL+vhN8rwtLdDyS0uD7ExhadtJzolTBIM5eKSkbw5uBEbIwtJc8HCG2NM6tN/g==} 1142 + engines: {node: '>=20.0.0'} 1143 + 1144 + '@aws-sdk/middleware-host-header@3.972.8': 1145 + resolution: {integrity: sha512-wAr2REfKsqoKQ+OkNqvOShnBoh+nkPurDKW7uAeVSu6kUECnWlSJiPvnoqxGlfousEY/v9LfS9sNc46hjSYDIQ==} 1146 + engines: {node: '>=20.0.0'} 1147 + 1148 + '@aws-sdk/middleware-location-constraint@3.972.8': 1149 + resolution: {integrity: sha512-KaUoFuoFPziIa98DSQsTPeke1gvGXlc5ZGMhy+b+nLxZ4A7jmJgLzjEF95l8aOQN2T/qlPP3MrAyELm8ExXucw==} 1150 + engines: {node: '>=20.0.0'} 1151 + 1152 + '@aws-sdk/middleware-logger@3.972.8': 1153 + resolution: {integrity: sha512-CWl5UCM57WUFaFi5kB7IBY1UmOeLvNZAZ2/OZ5l20ldiJ3TiIz1pC65gYj8X0BCPWkeR1E32mpsCk1L1I4n+lA==} 1154 + engines: {node: '>=20.0.0'} 1155 + 1156 + '@aws-sdk/middleware-recursion-detection@3.972.8': 1157 + resolution: {integrity: sha512-BnnvYs2ZEpdlmZ2PNlV2ZyQ8j8AEkMTjN79y/YA475ER1ByFYrkVR85qmhni8oeTaJcDqbx364wDpitDAA/wCA==} 1158 + engines: {node: '>=20.0.0'} 1159 + 1160 + '@aws-sdk/middleware-sdk-s3@3.972.22': 1161 + resolution: {integrity: sha512-dkUcRxF4rVpPbyHpxjCApGK6b7JpnSeo7tDoNakpRKmiLMCqgy4tlGBgeEYJnZgLrA4xc5jVKuXgvgqKqU18Kw==} 1162 + engines: {node: '>=20.0.0'} 1163 + 1164 + '@aws-sdk/middleware-ssec@3.972.8': 1165 + resolution: {integrity: sha512-wqlK0yO/TxEC2UsY9wIlqeeutF6jjLe0f96Pbm40XscTo57nImUk9lBcw0dPgsm0sppFtAkSlDrfpK+pC30Wqw==} 1166 + engines: {node: '>=20.0.0'} 1167 + 1168 + '@aws-sdk/middleware-user-agent@3.972.23': 1169 + resolution: {integrity: sha512-HQu8QoqGZZTvg0Spl9H39QTsSMFwgu+8yz/QGKndXFLk9FZMiCiIgBCVlTVKMDvVbgqIzD9ig+/HmXsIL2Rb+g==} 1170 + engines: {node: '>=20.0.0'} 1171 + 1172 + '@aws-sdk/nested-clients@3.996.12': 1173 + resolution: {integrity: sha512-KLdQGJPSm98uLINolQ0Tol8OAbk7g0Y7zplHJ1K83vbMIH13aoCvR6Tho66xueW4l4aZlEgVGLWBnD8ifUMsGQ==} 1174 + engines: {node: '>=20.0.0'} 1175 + 1176 + '@aws-sdk/region-config-resolver@3.972.8': 1177 + resolution: {integrity: sha512-1eD4uhTDeambO/PNIDVG19A6+v4NdD7xzwLHDutHsUqz0B+i661MwQB2eYO4/crcCvCiQG4SRm1k81k54FEIvw==} 1178 + engines: {node: '>=20.0.0'} 1179 + 1180 + '@aws-sdk/signature-v4-multi-region@3.996.10': 1181 + resolution: {integrity: sha512-yJSbFTedh1McfqXa9wZzjchqQ2puq5PI/qRz5kUjg2UXS5mO4MBYBbeXaZ2rp/h+ZbkcYEdo4Qsiah9psyoxrA==} 1182 + engines: {node: '>=20.0.0'} 1183 + 1184 + '@aws-sdk/token-providers@3.1013.0': 1185 + resolution: {integrity: sha512-IL1c54UvbuERrs9oLm5rvkzMciwhhpn1FL0SlC3XUMoLlFhdBsWJgQKK8O5fsQLxbFVqjbjFx9OBkrn44X9PHw==} 1186 + engines: {node: '>=20.0.0'} 1187 + 1188 + '@aws-sdk/types@3.973.6': 1189 + resolution: {integrity: sha512-Atfcy4E++beKtwJHiDln2Nby8W/mam64opFPTiHEqgsthqeydFS1pY+OUlN1ouNOmf8ArPU/6cDS65anOP3KQw==} 1190 + engines: {node: '>=20.0.0'} 1191 + 1192 + '@aws-sdk/util-arn-parser@3.972.3': 1193 + resolution: {integrity: sha512-HzSD8PMFrvgi2Kserxuff5VitNq2sgf3w9qxmskKDiDTThWfVteJxuCS9JXiPIPtmCrp+7N9asfIaVhBFORllA==} 1194 + engines: {node: '>=20.0.0'} 1195 + 1196 + '@aws-sdk/util-endpoints@3.996.5': 1197 + resolution: {integrity: sha512-Uh93L5sXFNbyR5sEPMzUU8tJ++Ku97EY4udmC01nB8Zu+xfBPwpIwJ6F7snqQeq8h2pf+8SGN5/NoytfKgYPIw==} 1198 + engines: {node: '>=20.0.0'} 1199 + 1200 + '@aws-sdk/util-locate-window@3.965.5': 1201 + resolution: {integrity: sha512-WhlJNNINQB+9qtLtZJcpQdgZw3SCDCpXdUJP7cToGwHbCWCnRckGlc6Bx/OhWwIYFNAn+FIydY8SZ0QmVu3xTQ==} 1202 + engines: {node: '>=20.0.0'} 1203 + 1204 + '@aws-sdk/util-user-agent-browser@3.972.8': 1205 + resolution: {integrity: sha512-B3KGXJviV2u6Cdw2SDY2aDhoJkVfY/Q/Trwk2CMSkikE1Oi6gRzxhvhIfiRpHfmIsAhV4EA54TVEX8K6CbHbkA==} 1206 + 1207 + '@aws-sdk/util-user-agent-node@3.973.9': 1208 + resolution: {integrity: sha512-jeFqqp8KD/P5O+qeKxyGeu7WEVIZFNprnkaDjGmBOjwxYwafCBhpxTgV1TlW6L8e76Vh/siNylNmN/OmSIFBUQ==} 1209 + engines: {node: '>=20.0.0'} 1210 + peerDependencies: 1211 + aws-crt: '>=1.0.0' 1212 + peerDependenciesMeta: 1213 + aws-crt: 1214 + optional: true 1215 + 1216 + '@aws-sdk/xml-builder@3.972.14': 1217 + resolution: {integrity: sha512-G/Yd8Bnnyh8QrqLf8jWJbixEnScUFW24e/wOBGYdw1Cl4r80KX/DvHyM2GVZ2vTp7J4gTEr8IXJlTadA8+UfuQ==} 1218 + engines: {node: '>=20.0.0'} 1219 + 1220 + '@aws/lambda-invoke-store@0.2.4': 1221 + resolution: {integrity: sha512-iY8yvjE0y651BixKNPgmv1WrQc+GZ142sb0z4gYnChDDY2YqI4P/jsSopBWrKfAt7LOJAkOXt7rC/hms+WclQQ==} 1222 + engines: {node: '>=18.0.0'} 1030 1223 1031 1224 '@babel/code-frame@7.27.1': 1032 1225 resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} ··· 3204 3397 '@sinonjs/fake-timers@10.3.0': 3205 3398 resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} 3206 3399 3400 + '@smithy/abort-controller@4.2.12': 3401 + resolution: {integrity: sha512-xolrFw6b+2iYGl6EcOL7IJY71vvyZ0DJ3mcKtpykqPe2uscwtzDZJa1uVQXyP7w9Dd+kGwYnPbMsJrGISKiY/Q==} 3402 + engines: {node: '>=18.0.0'} 3403 + 3404 + '@smithy/chunked-blob-reader-native@4.2.3': 3405 + resolution: {integrity: sha512-jA5k5Udn7Y5717L86h4EIv06wIr3xn8GM1qHRi/Nf31annXcXHJjBKvgztnbn2TxH3xWrPBfgwHsOwZf0UmQWw==} 3406 + engines: {node: '>=18.0.0'} 3407 + 3408 + '@smithy/chunked-blob-reader@5.2.2': 3409 + resolution: {integrity: sha512-St+kVicSyayWQca+I1rGitaOEH6uKgE8IUWoYnnEX26SWdWQcL6LvMSD19Lg+vYHKdT9B2Zuu7rd3i6Wnyb/iw==} 3410 + engines: {node: '>=18.0.0'} 3411 + 3412 + '@smithy/config-resolver@4.4.13': 3413 + resolution: {integrity: sha512-iIzMC5NmOUP6WL6o8iPBjFhUhBZ9pPjpUpQYWMUFQqKyXXzOftbfK8zcQCz/jFV1Psmf05BK5ypx4K2r4Tnwdg==} 3414 + engines: {node: '>=18.0.0'} 3415 + 3416 + '@smithy/core@3.23.12': 3417 + resolution: {integrity: sha512-o9VycsYNtgC+Dy3I0yrwCqv9CWicDnke0L7EVOrZtJpjb2t0EjaEofmMrYc0T1Kn3yk32zm6cspxF9u9Bj7e5w==} 3418 + engines: {node: '>=18.0.0'} 3419 + 3420 + '@smithy/credential-provider-imds@4.2.12': 3421 + resolution: {integrity: sha512-cr2lR792vNZcYMriSIj+Um3x9KWrjcu98kn234xA6reOAFMmbRpQMOv8KPgEmLLtx3eldU6c5wALKFqNOhugmg==} 3422 + engines: {node: '>=18.0.0'} 3423 + 3424 + '@smithy/eventstream-codec@4.2.12': 3425 + resolution: {integrity: sha512-FE3bZdEl62ojmy8x4FHqxq2+BuOHlcxiH5vaZ6aqHJr3AIZzwF5jfx8dEiU/X0a8RboyNDjmXjlbr8AdEyLgiA==} 3426 + engines: {node: '>=18.0.0'} 3427 + 3428 + '@smithy/eventstream-serde-browser@4.2.12': 3429 + resolution: {integrity: sha512-XUSuMxlTxV5pp4VpqZf6Sa3vT/Q75FVkLSpSSE3KkWBvAQWeuWt1msTv8fJfgA4/jcJhrbrbMzN1AC/hvPmm5A==} 3430 + engines: {node: '>=18.0.0'} 3431 + 3432 + '@smithy/eventstream-serde-config-resolver@4.3.12': 3433 + resolution: {integrity: sha512-7epsAZ3QvfHkngz6RXQYseyZYHlmWXSTPOfPmXkiS+zA6TBNo1awUaMFL9vxyXlGdoELmCZyZe1nQE+imbmV+Q==} 3434 + engines: {node: '>=18.0.0'} 3435 + 3436 + '@smithy/eventstream-serde-node@4.2.12': 3437 + resolution: {integrity: sha512-D1pFuExo31854eAvg89KMn9Oab/wEeJR6Buy32B49A9Ogdtx5fwZPqBHUlDzaCDpycTFk2+fSQgX689Qsk7UGA==} 3438 + engines: {node: '>=18.0.0'} 3439 + 3440 + '@smithy/eventstream-serde-universal@4.2.12': 3441 + resolution: {integrity: sha512-+yNuTiyBACxOJUTvbsNsSOfH9G9oKbaJE1lNL3YHpGcuucl6rPZMi3nrpehpVOVR2E07YqFFmtwpImtpzlouHQ==} 3442 + engines: {node: '>=18.0.0'} 3443 + 3444 + '@smithy/fetch-http-handler@5.3.15': 3445 + resolution: {integrity: sha512-T4jFU5N/yiIfrtrsb9uOQn7RdELdM/7HbyLNr6uO/mpkj1ctiVs7CihVr51w4LyQlXWDpXFn4BElf1WmQvZu/A==} 3446 + engines: {node: '>=18.0.0'} 3447 + 3448 + '@smithy/hash-blob-browser@4.2.13': 3449 + resolution: {integrity: sha512-YrF4zWKh+ghLuquldj6e/RzE3xZYL8wIPfkt0MqCRphVICjyyjH8OwKD7LLlKpVEbk4FLizFfC1+gwK6XQdR3g==} 3450 + engines: {node: '>=18.0.0'} 3451 + 3452 + '@smithy/hash-node@4.2.12': 3453 + resolution: {integrity: sha512-QhBYbGrbxTkZ43QoTPrK72DoYviDeg6YKDrHTMJbbC+A0sml3kSjzFtXP7BtbyJnXojLfTQldGdUR0RGD8dA3w==} 3454 + engines: {node: '>=18.0.0'} 3455 + 3456 + '@smithy/hash-stream-node@4.2.12': 3457 + resolution: {integrity: sha512-O3YbmGExeafuM/kP7Y8r6+1y0hIh3/zn6GROx0uNlB54K9oihAL75Qtc+jFfLNliTi6pxOAYZrRKD9A7iA6UFw==} 3458 + engines: {node: '>=18.0.0'} 3459 + 3460 + '@smithy/invalid-dependency@4.2.12': 3461 + resolution: {integrity: sha512-/4F1zb7Z8LOu1PalTdESFHR0RbPwHd3FcaG1sI3UEIriQTWakysgJr65lc1jj6QY5ye7aFsisajotH6UhWfm/g==} 3462 + engines: {node: '>=18.0.0'} 3463 + 3464 + '@smithy/is-array-buffer@2.2.0': 3465 + resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} 3466 + engines: {node: '>=14.0.0'} 3467 + 3468 + '@smithy/is-array-buffer@4.2.2': 3469 + resolution: {integrity: sha512-n6rQ4N8Jj4YTQO3YFrlgZuwKodf4zUFs7EJIWH86pSCWBaAtAGBFfCM7Wx6D2bBJ2xqFNxGBSrUWswT3M0VJow==} 3470 + engines: {node: '>=18.0.0'} 3471 + 3472 + '@smithy/md5-js@4.2.12': 3473 + resolution: {integrity: sha512-W/oIpHCpWU2+iAkfZYyGWE+qkpuf3vEXHLxQQDx9FPNZTTdnul0dZ2d/gUFrtQ5je1G2kp4cjG0/24YueG2LbQ==} 3474 + engines: {node: '>=18.0.0'} 3475 + 3476 + '@smithy/middleware-content-length@4.2.12': 3477 + resolution: {integrity: sha512-YE58Yz+cvFInWI/wOTrB+DbvUVz/pLn5mC5MvOV4fdRUc6qGwygyngcucRQjAhiCEbmfLOXX0gntSIcgMvAjmA==} 3478 + engines: {node: '>=18.0.0'} 3479 + 3480 + '@smithy/middleware-endpoint@4.4.27': 3481 + resolution: {integrity: sha512-T3TFfUgXQlpcg+UdzcAISdZpj4Z+XECZ/cefgA6wLBd6V4lRi0svN2hBouN/be9dXQ31X4sLWz3fAQDf+nt6BA==} 3482 + engines: {node: '>=18.0.0'} 3483 + 3484 + '@smithy/middleware-retry@4.4.44': 3485 + resolution: {integrity: sha512-Y1Rav7m5CFRPQyM4CI0koD/bXjyjJu3EQxZZhtLGD88WIrBrQ7kqXM96ncd6rYnojwOo/u9MXu57JrEvu/nLrA==} 3486 + engines: {node: '>=18.0.0'} 3487 + 3488 + '@smithy/middleware-serde@4.2.15': 3489 + resolution: {integrity: sha512-ExYhcltZSli0pgAKOpQQe1DLFBLryeZ22605y/YS+mQpdNWekum9Ujb/jMKfJKgjtz1AZldtwA/wCYuKJgjjlg==} 3490 + engines: {node: '>=18.0.0'} 3491 + 3492 + '@smithy/middleware-stack@4.2.12': 3493 + resolution: {integrity: sha512-kruC5gRHwsCOuyCd4ouQxYjgRAym2uDlCvQ5acuMtRrcdfg7mFBg6blaxcJ09STpt3ziEkis6bhg1uwrWU7txw==} 3494 + engines: {node: '>=18.0.0'} 3495 + 3496 + '@smithy/node-config-provider@4.3.12': 3497 + resolution: {integrity: sha512-tr2oKX2xMcO+rBOjobSwVAkV05SIfUKz8iI53rzxEmgW3GOOPOv0UioSDk+J8OpRQnpnhsO3Af6IEBabQBVmiw==} 3498 + engines: {node: '>=18.0.0'} 3499 + 3500 + '@smithy/node-http-handler@4.5.0': 3501 + resolution: {integrity: sha512-Rnq9vQWiR1+/I6NZZMNzJHV6pZYyEHt2ZnuV3MG8z2NNenC4i/8Kzttz7CjZiHSmsN5frhXhg17z3Zqjjhmz1A==} 3502 + engines: {node: '>=18.0.0'} 3503 + 3504 + '@smithy/property-provider@4.2.12': 3505 + resolution: {integrity: sha512-jqve46eYU1v7pZ5BM+fmkbq3DerkSluPr5EhvOcHxygxzD05ByDRppRwRPPpFrsFo5yDtCYLKu+kreHKVrvc7A==} 3506 + engines: {node: '>=18.0.0'} 3507 + 3508 + '@smithy/protocol-http@5.3.12': 3509 + resolution: {integrity: sha512-fit0GZK9I1xoRlR4jXmbLhoN0OdEpa96ul8M65XdmXnxXkuMxM0Y8HDT0Fh0Xb4I85MBvBClOzgSrV1X2s1Hxw==} 3510 + engines: {node: '>=18.0.0'} 3511 + 3512 + '@smithy/querystring-builder@4.2.12': 3513 + resolution: {integrity: sha512-6wTZjGABQufekycfDGMEB84BgtdOE/rCVTov+EDXQ8NHKTUNIp/j27IliwP7tjIU9LR+sSzyGBOXjeEtVgzCHg==} 3514 + engines: {node: '>=18.0.0'} 3515 + 3516 + '@smithy/querystring-parser@4.2.12': 3517 + resolution: {integrity: sha512-P2OdvrgiAKpkPNKlKUtWbNZKB1XjPxM086NeVhK+W+wI46pIKdWBe5QyXvhUm3MEcyS/rkLvY8rZzyUdmyDZBw==} 3518 + engines: {node: '>=18.0.0'} 3519 + 3520 + '@smithy/service-error-classification@4.2.12': 3521 + resolution: {integrity: sha512-LlP29oSQN0Tw0b6D0Xo6BIikBswuIiGYbRACy5ujw/JgWSzTdYj46U83ssf6Ux0GyNJVivs2uReU8pt7Eu9okQ==} 3522 + engines: {node: '>=18.0.0'} 3523 + 3524 + '@smithy/shared-ini-file-loader@4.4.7': 3525 + resolution: {integrity: sha512-HrOKWsUb+otTeo1HxVWeEb99t5ER1XrBi/xka2Wv6NVmTbuCUC1dvlrksdvxFtODLBjsC+PHK+fuy2x/7Ynyiw==} 3526 + engines: {node: '>=18.0.0'} 3527 + 3528 + '@smithy/signature-v4@5.3.12': 3529 + resolution: {integrity: sha512-B/FBwO3MVOL00DaRSXfXfa/TRXRheagt/q5A2NM13u7q+sHS59EOVGQNfG7DkmVtdQm5m3vOosoKAXSqn/OEgw==} 3530 + engines: {node: '>=18.0.0'} 3531 + 3532 + '@smithy/smithy-client@4.12.7': 3533 + resolution: {integrity: sha512-q3gqnwml60G44FECaEEsdQMplYhDMZYCtYhMCzadCnRnnHIobZJjegmdoUo6ieLQlPUzvrMdIJUpx6DoPmzANQ==} 3534 + engines: {node: '>=18.0.0'} 3535 + 3536 + '@smithy/types@4.13.1': 3537 + resolution: {integrity: sha512-787F3yzE2UiJIQ+wYW1CVg2odHjmaWLGksnKQHUrK/lYZSEcy1msuLVvxaR/sI2/aDe9U+TBuLsXnr3vod1g0g==} 3538 + engines: {node: '>=18.0.0'} 3539 + 3540 + '@smithy/url-parser@4.2.12': 3541 + resolution: {integrity: sha512-wOPKPEpso+doCZGIlr+e1lVI6+9VAKfL4kZWFgzVgGWY2hZxshNKod4l2LXS3PRC9otH/JRSjtEHqQ/7eLciRA==} 3542 + engines: {node: '>=18.0.0'} 3543 + 3544 + '@smithy/util-base64@4.3.2': 3545 + resolution: {integrity: sha512-XRH6b0H/5A3SgblmMa5ErXQ2XKhfbQB+Fm/oyLZ2O2kCUrwgg55bU0RekmzAhuwOjA9qdN5VU2BprOvGGUkOOQ==} 3546 + engines: {node: '>=18.0.0'} 3547 + 3548 + '@smithy/util-body-length-browser@4.2.2': 3549 + resolution: {integrity: sha512-JKCrLNOup3OOgmzeaKQwi4ZCTWlYR5H4Gm1r2uTMVBXoemo1UEghk5vtMi1xSu2ymgKVGW631e2fp9/R610ZjQ==} 3550 + engines: {node: '>=18.0.0'} 3551 + 3552 + '@smithy/util-body-length-node@4.2.3': 3553 + resolution: {integrity: sha512-ZkJGvqBzMHVHE7r/hcuCxlTY8pQr1kMtdsVPs7ex4mMU+EAbcXppfo5NmyxMYi2XU49eqaz56j2gsk4dHHPG/g==} 3554 + engines: {node: '>=18.0.0'} 3555 + 3556 + '@smithy/util-buffer-from@2.2.0': 3557 + resolution: {integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==} 3558 + engines: {node: '>=14.0.0'} 3559 + 3560 + '@smithy/util-buffer-from@4.2.2': 3561 + resolution: {integrity: sha512-FDXD7cvUoFWwN6vtQfEta540Y/YBe5JneK3SoZg9bThSoOAC/eGeYEua6RkBgKjGa/sz6Y+DuBZj3+YEY21y4Q==} 3562 + engines: {node: '>=18.0.0'} 3563 + 3564 + '@smithy/util-config-provider@4.2.2': 3565 + resolution: {integrity: sha512-dWU03V3XUprJwaUIFVv4iOnS1FC9HnMHDfUrlNDSh4315v0cWyaIErP8KiqGVbf5z+JupoVpNM7ZB3jFiTejvQ==} 3566 + engines: {node: '>=18.0.0'} 3567 + 3568 + '@smithy/util-defaults-mode-browser@4.3.43': 3569 + resolution: {integrity: sha512-Qd/0wCKMaXxev/z00TvNzGCH2jlKKKxXP1aDxB6oKwSQthe3Og2dMhSayGCnsma1bK/kQX1+X7SMP99t6FgiiQ==} 3570 + engines: {node: '>=18.0.0'} 3571 + 3572 + '@smithy/util-defaults-mode-node@4.2.47': 3573 + resolution: {integrity: sha512-qSRbYp1EQ7th+sPFuVcVO05AE0QH635hycdEXlpzIahqHHf2Fyd/Zl+8v0XYMJ3cgDVPa0lkMefU7oNUjAP+DQ==} 3574 + engines: {node: '>=18.0.0'} 3575 + 3576 + '@smithy/util-endpoints@3.3.3': 3577 + resolution: {integrity: sha512-VACQVe50j0HZPjpwWcjyT51KUQ4AnsvEaQ2lKHOSL4mNLD0G9BjEniQ+yCt1qqfKfiAHRAts26ud7hBjamrwig==} 3578 + engines: {node: '>=18.0.0'} 3579 + 3580 + '@smithy/util-hex-encoding@4.2.2': 3581 + resolution: {integrity: sha512-Qcz3W5vuHK4sLQdyT93k/rfrUwdJ8/HZ+nMUOyGdpeGA1Wxt65zYwi3oEl9kOM+RswvYq90fzkNDahPS8K0OIg==} 3582 + engines: {node: '>=18.0.0'} 3583 + 3584 + '@smithy/util-middleware@4.2.12': 3585 + resolution: {integrity: sha512-Er805uFUOvgc0l8nv0e0su0VFISoxhJ/AwOn3gL2NWNY2LUEldP5WtVcRYSQBcjg0y9NfG8JYrCJaYDpupBHJQ==} 3586 + engines: {node: '>=18.0.0'} 3587 + 3588 + '@smithy/util-retry@4.2.12': 3589 + resolution: {integrity: sha512-1zopLDUEOwumjcHdJ1mwBHddubYF8GMQvstVCLC54Y46rqoHwlIU+8ZzUeaBcD+WCJHyDGSeZ2ml9YSe9aqcoQ==} 3590 + engines: {node: '>=18.0.0'} 3591 + 3592 + '@smithy/util-stream@4.5.20': 3593 + resolution: {integrity: sha512-4yXLm5n/B5SRBR2p8cZ90Sbv4zL4NKsgxdzCzp/83cXw2KxLEumt5p+GAVyRNZgQOSrzXn9ARpO0lUe8XSlSDw==} 3594 + engines: {node: '>=18.0.0'} 3595 + 3596 + '@smithy/util-uri-escape@4.2.2': 3597 + resolution: {integrity: sha512-2kAStBlvq+lTXHyAZYfJRb/DfS3rsinLiwb+69SstC9Vb0s9vNWkRwpnj918Pfi85mzi42sOqdV72OLxWAISnw==} 3598 + engines: {node: '>=18.0.0'} 3599 + 3600 + '@smithy/util-utf8@2.3.0': 3601 + resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==} 3602 + engines: {node: '>=14.0.0'} 3603 + 3604 + '@smithy/util-utf8@4.2.2': 3605 + resolution: {integrity: sha512-75MeYpjdWRe8M5E3AW0O4Cx3UadweS+cwdXjwYGBW5h/gxxnbeZ877sLPX/ZJA9GVTlL/qG0dXP29JWFCD1Ayw==} 3606 + engines: {node: '>=18.0.0'} 3607 + 3608 + '@smithy/util-waiter@4.2.13': 3609 + resolution: {integrity: sha512-2zdZ9DTHngRtcYxJK1GUDxruNr53kv5W2Lupe0LMU+Imr6ohQg8M2T14MNkj1Y0wS3FFwpgpGQyvuaMF7CiTmQ==} 3610 + engines: {node: '>=18.0.0'} 3611 + 3612 + '@smithy/uuid@1.1.2': 3613 + resolution: {integrity: sha512-O/IEdcCUKkubz60tFbGA7ceITTAJsty+lBjNoorP4Z6XRqaFb/OjQjZODophEcuq68nKm6/0r+6/lLQ+XVpk8g==} 3614 + engines: {node: '>=18.0.0'} 3615 + 3207 3616 '@stablelib/base64@1.0.1': 3208 3617 resolution: {integrity: sha512-1bnPQqSxSuc3Ii6MhBysoWCg58j97aUjuCSZrGSmDxNqtytIi0k8utUenAwTZN4V5mXXYGsVUI9zeBqy+jBOSQ==} 3209 3618 ··· 4036 4445 body-parser@1.20.4: 4037 4446 resolution: {integrity: sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==} 4038 4447 engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} 4448 + 4449 + bowser@2.14.1: 4450 + resolution: {integrity: sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==} 4039 4451 4040 4452 brace-expansion@1.1.12: 4041 4453 resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} ··· 4932 5344 4933 5345 fast-sha256@1.3.0: 4934 5346 resolution: {integrity: sha512-n11RGP/lrWEFI/bWdygLxhI+pVeo1ZYIVwvvPkW7azl/rOy+F3HYRZ2K5zeE9mmkhQppyv9sQFx0JM9UabnpPQ==} 5347 + 5348 + fast-xml-builder@1.1.4: 5349 + resolution: {integrity: sha512-f2jhpN4Eccy0/Uz9csxh3Nu6q4ErKxf0XIsasomfOihuSUa3/xw6w8dnOtCDgEItQFJG8KyXPzQXzcODDrrbOg==} 5350 + 5351 + fast-xml-parser@5.5.6: 5352 + resolution: {integrity: sha512-3+fdZyBRVg29n4rXP0joHthhcHdPUHaIC16cuyyd1iLsuaO6Vea36MPrxgAzbZna8lhvZeRL8Bc9GP56/J9xEw==} 5353 + hasBin: true 4935 5354 4936 5355 fastq@1.20.1: 4937 5356 resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} ··· 6884 7303 resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 6885 7304 engines: {node: '>=8'} 6886 7305 7306 + path-expression-matcher@1.1.3: 7307 + resolution: {integrity: sha512-qdVgY8KXmVdJZRSS1JdEPOKPdTiEK/pi0RkcT2sw1RhXxohdujUlJFPuS1TSkevZ9vzd3ZlL7ULl1MHGTApKzQ==} 7308 + engines: {node: '>=14.0.0'} 7309 + 6887 7310 path-is-absolute@1.0.1: 6888 7311 resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 6889 7312 engines: {node: '>=0.10.0'} ··· 7773 8196 strip-json-comments@3.1.1: 7774 8197 resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 7775 8198 engines: {node: '>=8'} 8199 + 8200 + strnum@2.2.1: 8201 + resolution: {integrity: sha512-BwRvNd5/QoAtyW1na1y1LsJGQNvRlkde6Q/ipqqEaivoMdV+B1OMOTVdwR+N/cwVUcIt9PYyHmV8HyexCZSupg==} 7776 8202 7777 8203 strtok3@10.3.4: 7778 8204 resolution: {integrity: sha512-KIy5nylvC5le1OdaaoCJ07L+8iQzJHGH6pWDuzS+d07Cu7n1MZ2x26P8ZKIWfbK02+XIL8Mp4RkWeqdUCrDMfg==} ··· 8805 9231 transitivePeerDependencies: 8806 9232 - encoding 8807 9233 9234 + '@aws-crypto/crc32@5.2.0': 9235 + dependencies: 9236 + '@aws-crypto/util': 5.2.0 9237 + '@aws-sdk/types': 3.973.6 9238 + tslib: 2.8.1 9239 + 9240 + '@aws-crypto/crc32c@5.2.0': 9241 + dependencies: 9242 + '@aws-crypto/util': 5.2.0 9243 + '@aws-sdk/types': 3.973.6 9244 + tslib: 2.8.1 9245 + 9246 + '@aws-crypto/sha1-browser@5.2.0': 9247 + dependencies: 9248 + '@aws-crypto/supports-web-crypto': 5.2.0 9249 + '@aws-crypto/util': 5.2.0 9250 + '@aws-sdk/types': 3.973.6 9251 + '@aws-sdk/util-locate-window': 3.965.5 9252 + '@smithy/util-utf8': 2.3.0 9253 + tslib: 2.8.1 9254 + 9255 + '@aws-crypto/sha256-browser@5.2.0': 9256 + dependencies: 9257 + '@aws-crypto/sha256-js': 5.2.0 9258 + '@aws-crypto/supports-web-crypto': 5.2.0 9259 + '@aws-crypto/util': 5.2.0 9260 + '@aws-sdk/types': 3.973.6 9261 + '@aws-sdk/util-locate-window': 3.965.5 9262 + '@smithy/util-utf8': 2.3.0 9263 + tslib: 2.8.1 9264 + 9265 + '@aws-crypto/sha256-js@5.2.0': 9266 + dependencies: 9267 + '@aws-crypto/util': 5.2.0 9268 + '@aws-sdk/types': 3.973.6 9269 + tslib: 2.8.1 9270 + 9271 + '@aws-crypto/supports-web-crypto@5.2.0': 9272 + dependencies: 9273 + tslib: 2.8.1 9274 + 9275 + '@aws-crypto/util@5.2.0': 9276 + dependencies: 9277 + '@aws-sdk/types': 3.973.6 9278 + '@smithy/util-utf8': 2.3.0 9279 + tslib: 2.8.1 9280 + 9281 + '@aws-sdk/client-s3@3.1013.0': 9282 + dependencies: 9283 + '@aws-crypto/sha1-browser': 5.2.0 9284 + '@aws-crypto/sha256-browser': 5.2.0 9285 + '@aws-crypto/sha256-js': 5.2.0 9286 + '@aws-sdk/core': 3.973.22 9287 + '@aws-sdk/credential-provider-node': 3.972.23 9288 + '@aws-sdk/middleware-bucket-endpoint': 3.972.8 9289 + '@aws-sdk/middleware-expect-continue': 3.972.8 9290 + '@aws-sdk/middleware-flexible-checksums': 3.974.2 9291 + '@aws-sdk/middleware-host-header': 3.972.8 9292 + '@aws-sdk/middleware-location-constraint': 3.972.8 9293 + '@aws-sdk/middleware-logger': 3.972.8 9294 + '@aws-sdk/middleware-recursion-detection': 3.972.8 9295 + '@aws-sdk/middleware-sdk-s3': 3.972.22 9296 + '@aws-sdk/middleware-ssec': 3.972.8 9297 + '@aws-sdk/middleware-user-agent': 3.972.23 9298 + '@aws-sdk/region-config-resolver': 3.972.8 9299 + '@aws-sdk/signature-v4-multi-region': 3.996.10 9300 + '@aws-sdk/types': 3.973.6 9301 + '@aws-sdk/util-endpoints': 3.996.5 9302 + '@aws-sdk/util-user-agent-browser': 3.972.8 9303 + '@aws-sdk/util-user-agent-node': 3.973.9 9304 + '@smithy/config-resolver': 4.4.13 9305 + '@smithy/core': 3.23.12 9306 + '@smithy/eventstream-serde-browser': 4.2.12 9307 + '@smithy/eventstream-serde-config-resolver': 4.3.12 9308 + '@smithy/eventstream-serde-node': 4.2.12 9309 + '@smithy/fetch-http-handler': 5.3.15 9310 + '@smithy/hash-blob-browser': 4.2.13 9311 + '@smithy/hash-node': 4.2.12 9312 + '@smithy/hash-stream-node': 4.2.12 9313 + '@smithy/invalid-dependency': 4.2.12 9314 + '@smithy/md5-js': 4.2.12 9315 + '@smithy/middleware-content-length': 4.2.12 9316 + '@smithy/middleware-endpoint': 4.4.27 9317 + '@smithy/middleware-retry': 4.4.44 9318 + '@smithy/middleware-serde': 4.2.15 9319 + '@smithy/middleware-stack': 4.2.12 9320 + '@smithy/node-config-provider': 4.3.12 9321 + '@smithy/node-http-handler': 4.5.0 9322 + '@smithy/protocol-http': 5.3.12 9323 + '@smithy/smithy-client': 4.12.7 9324 + '@smithy/types': 4.13.1 9325 + '@smithy/url-parser': 4.2.12 9326 + '@smithy/util-base64': 4.3.2 9327 + '@smithy/util-body-length-browser': 4.2.2 9328 + '@smithy/util-body-length-node': 4.2.3 9329 + '@smithy/util-defaults-mode-browser': 4.3.43 9330 + '@smithy/util-defaults-mode-node': 4.2.47 9331 + '@smithy/util-endpoints': 3.3.3 9332 + '@smithy/util-middleware': 4.2.12 9333 + '@smithy/util-retry': 4.2.12 9334 + '@smithy/util-stream': 4.5.20 9335 + '@smithy/util-utf8': 4.2.2 9336 + '@smithy/util-waiter': 4.2.13 9337 + tslib: 2.8.1 9338 + transitivePeerDependencies: 9339 + - aws-crt 9340 + 9341 + '@aws-sdk/core@3.973.22': 9342 + dependencies: 9343 + '@aws-sdk/types': 3.973.6 9344 + '@aws-sdk/xml-builder': 3.972.14 9345 + '@smithy/core': 3.23.12 9346 + '@smithy/node-config-provider': 4.3.12 9347 + '@smithy/property-provider': 4.2.12 9348 + '@smithy/protocol-http': 5.3.12 9349 + '@smithy/signature-v4': 5.3.12 9350 + '@smithy/smithy-client': 4.12.7 9351 + '@smithy/types': 4.13.1 9352 + '@smithy/util-base64': 4.3.2 9353 + '@smithy/util-middleware': 4.2.12 9354 + '@smithy/util-utf8': 4.2.2 9355 + tslib: 2.8.1 9356 + 9357 + '@aws-sdk/crc64-nvme@3.972.5': 9358 + dependencies: 9359 + '@smithy/types': 4.13.1 9360 + tslib: 2.8.1 9361 + 9362 + '@aws-sdk/credential-provider-env@3.972.20': 9363 + dependencies: 9364 + '@aws-sdk/core': 3.973.22 9365 + '@aws-sdk/types': 3.973.6 9366 + '@smithy/property-provider': 4.2.12 9367 + '@smithy/types': 4.13.1 9368 + tslib: 2.8.1 9369 + 9370 + '@aws-sdk/credential-provider-http@3.972.22': 9371 + dependencies: 9372 + '@aws-sdk/core': 3.973.22 9373 + '@aws-sdk/types': 3.973.6 9374 + '@smithy/fetch-http-handler': 5.3.15 9375 + '@smithy/node-http-handler': 4.5.0 9376 + '@smithy/property-provider': 4.2.12 9377 + '@smithy/protocol-http': 5.3.12 9378 + '@smithy/smithy-client': 4.12.7 9379 + '@smithy/types': 4.13.1 9380 + '@smithy/util-stream': 4.5.20 9381 + tslib: 2.8.1 9382 + 9383 + '@aws-sdk/credential-provider-ini@3.972.22': 9384 + dependencies: 9385 + '@aws-sdk/core': 3.973.22 9386 + '@aws-sdk/credential-provider-env': 3.972.20 9387 + '@aws-sdk/credential-provider-http': 3.972.22 9388 + '@aws-sdk/credential-provider-login': 3.972.22 9389 + '@aws-sdk/credential-provider-process': 3.972.20 9390 + '@aws-sdk/credential-provider-sso': 3.972.22 9391 + '@aws-sdk/credential-provider-web-identity': 3.972.22 9392 + '@aws-sdk/nested-clients': 3.996.12 9393 + '@aws-sdk/types': 3.973.6 9394 + '@smithy/credential-provider-imds': 4.2.12 9395 + '@smithy/property-provider': 4.2.12 9396 + '@smithy/shared-ini-file-loader': 4.4.7 9397 + '@smithy/types': 4.13.1 9398 + tslib: 2.8.1 9399 + transitivePeerDependencies: 9400 + - aws-crt 9401 + 9402 + '@aws-sdk/credential-provider-login@3.972.22': 9403 + dependencies: 9404 + '@aws-sdk/core': 3.973.22 9405 + '@aws-sdk/nested-clients': 3.996.12 9406 + '@aws-sdk/types': 3.973.6 9407 + '@smithy/property-provider': 4.2.12 9408 + '@smithy/protocol-http': 5.3.12 9409 + '@smithy/shared-ini-file-loader': 4.4.7 9410 + '@smithy/types': 4.13.1 9411 + tslib: 2.8.1 9412 + transitivePeerDependencies: 9413 + - aws-crt 9414 + 9415 + '@aws-sdk/credential-provider-node@3.972.23': 9416 + dependencies: 9417 + '@aws-sdk/credential-provider-env': 3.972.20 9418 + '@aws-sdk/credential-provider-http': 3.972.22 9419 + '@aws-sdk/credential-provider-ini': 3.972.22 9420 + '@aws-sdk/credential-provider-process': 3.972.20 9421 + '@aws-sdk/credential-provider-sso': 3.972.22 9422 + '@aws-sdk/credential-provider-web-identity': 3.972.22 9423 + '@aws-sdk/types': 3.973.6 9424 + '@smithy/credential-provider-imds': 4.2.12 9425 + '@smithy/property-provider': 4.2.12 9426 + '@smithy/shared-ini-file-loader': 4.4.7 9427 + '@smithy/types': 4.13.1 9428 + tslib: 2.8.1 9429 + transitivePeerDependencies: 9430 + - aws-crt 9431 + 9432 + '@aws-sdk/credential-provider-process@3.972.20': 9433 + dependencies: 9434 + '@aws-sdk/core': 3.973.22 9435 + '@aws-sdk/types': 3.973.6 9436 + '@smithy/property-provider': 4.2.12 9437 + '@smithy/shared-ini-file-loader': 4.4.7 9438 + '@smithy/types': 4.13.1 9439 + tslib: 2.8.1 9440 + 9441 + '@aws-sdk/credential-provider-sso@3.972.22': 9442 + dependencies: 9443 + '@aws-sdk/core': 3.973.22 9444 + '@aws-sdk/nested-clients': 3.996.12 9445 + '@aws-sdk/token-providers': 3.1013.0 9446 + '@aws-sdk/types': 3.973.6 9447 + '@smithy/property-provider': 4.2.12 9448 + '@smithy/shared-ini-file-loader': 4.4.7 9449 + '@smithy/types': 4.13.1 9450 + tslib: 2.8.1 9451 + transitivePeerDependencies: 9452 + - aws-crt 9453 + 9454 + '@aws-sdk/credential-provider-web-identity@3.972.22': 9455 + dependencies: 9456 + '@aws-sdk/core': 3.973.22 9457 + '@aws-sdk/nested-clients': 3.996.12 9458 + '@aws-sdk/types': 3.973.6 9459 + '@smithy/property-provider': 4.2.12 9460 + '@smithy/shared-ini-file-loader': 4.4.7 9461 + '@smithy/types': 4.13.1 9462 + tslib: 2.8.1 9463 + transitivePeerDependencies: 9464 + - aws-crt 9465 + 9466 + '@aws-sdk/middleware-bucket-endpoint@3.972.8': 9467 + dependencies: 9468 + '@aws-sdk/types': 3.973.6 9469 + '@aws-sdk/util-arn-parser': 3.972.3 9470 + '@smithy/node-config-provider': 4.3.12 9471 + '@smithy/protocol-http': 5.3.12 9472 + '@smithy/types': 4.13.1 9473 + '@smithy/util-config-provider': 4.2.2 9474 + tslib: 2.8.1 9475 + 9476 + '@aws-sdk/middleware-expect-continue@3.972.8': 9477 + dependencies: 9478 + '@aws-sdk/types': 3.973.6 9479 + '@smithy/protocol-http': 5.3.12 9480 + '@smithy/types': 4.13.1 9481 + tslib: 2.8.1 9482 + 9483 + '@aws-sdk/middleware-flexible-checksums@3.974.2': 9484 + dependencies: 9485 + '@aws-crypto/crc32': 5.2.0 9486 + '@aws-crypto/crc32c': 5.2.0 9487 + '@aws-crypto/util': 5.2.0 9488 + '@aws-sdk/core': 3.973.22 9489 + '@aws-sdk/crc64-nvme': 3.972.5 9490 + '@aws-sdk/types': 3.973.6 9491 + '@smithy/is-array-buffer': 4.2.2 9492 + '@smithy/node-config-provider': 4.3.12 9493 + '@smithy/protocol-http': 5.3.12 9494 + '@smithy/types': 4.13.1 9495 + '@smithy/util-middleware': 4.2.12 9496 + '@smithy/util-stream': 4.5.20 9497 + '@smithy/util-utf8': 4.2.2 9498 + tslib: 2.8.1 9499 + 9500 + '@aws-sdk/middleware-host-header@3.972.8': 9501 + dependencies: 9502 + '@aws-sdk/types': 3.973.6 9503 + '@smithy/protocol-http': 5.3.12 9504 + '@smithy/types': 4.13.1 9505 + tslib: 2.8.1 9506 + 9507 + '@aws-sdk/middleware-location-constraint@3.972.8': 9508 + dependencies: 9509 + '@aws-sdk/types': 3.973.6 9510 + '@smithy/types': 4.13.1 9511 + tslib: 2.8.1 9512 + 9513 + '@aws-sdk/middleware-logger@3.972.8': 9514 + dependencies: 9515 + '@aws-sdk/types': 3.973.6 9516 + '@smithy/types': 4.13.1 9517 + tslib: 2.8.1 9518 + 9519 + '@aws-sdk/middleware-recursion-detection@3.972.8': 9520 + dependencies: 9521 + '@aws-sdk/types': 3.973.6 9522 + '@aws/lambda-invoke-store': 0.2.4 9523 + '@smithy/protocol-http': 5.3.12 9524 + '@smithy/types': 4.13.1 9525 + tslib: 2.8.1 9526 + 9527 + '@aws-sdk/middleware-sdk-s3@3.972.22': 9528 + dependencies: 9529 + '@aws-sdk/core': 3.973.22 9530 + '@aws-sdk/types': 3.973.6 9531 + '@aws-sdk/util-arn-parser': 3.972.3 9532 + '@smithy/core': 3.23.12 9533 + '@smithy/node-config-provider': 4.3.12 9534 + '@smithy/protocol-http': 5.3.12 9535 + '@smithy/signature-v4': 5.3.12 9536 + '@smithy/smithy-client': 4.12.7 9537 + '@smithy/types': 4.13.1 9538 + '@smithy/util-config-provider': 4.2.2 9539 + '@smithy/util-middleware': 4.2.12 9540 + '@smithy/util-stream': 4.5.20 9541 + '@smithy/util-utf8': 4.2.2 9542 + tslib: 2.8.1 9543 + 9544 + '@aws-sdk/middleware-ssec@3.972.8': 9545 + dependencies: 9546 + '@aws-sdk/types': 3.973.6 9547 + '@smithy/types': 4.13.1 9548 + tslib: 2.8.1 9549 + 9550 + '@aws-sdk/middleware-user-agent@3.972.23': 9551 + dependencies: 9552 + '@aws-sdk/core': 3.973.22 9553 + '@aws-sdk/types': 3.973.6 9554 + '@aws-sdk/util-endpoints': 3.996.5 9555 + '@smithy/core': 3.23.12 9556 + '@smithy/protocol-http': 5.3.12 9557 + '@smithy/types': 4.13.1 9558 + '@smithy/util-retry': 4.2.12 9559 + tslib: 2.8.1 9560 + 9561 + '@aws-sdk/nested-clients@3.996.12': 9562 + dependencies: 9563 + '@aws-crypto/sha256-browser': 5.2.0 9564 + '@aws-crypto/sha256-js': 5.2.0 9565 + '@aws-sdk/core': 3.973.22 9566 + '@aws-sdk/middleware-host-header': 3.972.8 9567 + '@aws-sdk/middleware-logger': 3.972.8 9568 + '@aws-sdk/middleware-recursion-detection': 3.972.8 9569 + '@aws-sdk/middleware-user-agent': 3.972.23 9570 + '@aws-sdk/region-config-resolver': 3.972.8 9571 + '@aws-sdk/types': 3.973.6 9572 + '@aws-sdk/util-endpoints': 3.996.5 9573 + '@aws-sdk/util-user-agent-browser': 3.972.8 9574 + '@aws-sdk/util-user-agent-node': 3.973.9 9575 + '@smithy/config-resolver': 4.4.13 9576 + '@smithy/core': 3.23.12 9577 + '@smithy/fetch-http-handler': 5.3.15 9578 + '@smithy/hash-node': 4.2.12 9579 + '@smithy/invalid-dependency': 4.2.12 9580 + '@smithy/middleware-content-length': 4.2.12 9581 + '@smithy/middleware-endpoint': 4.4.27 9582 + '@smithy/middleware-retry': 4.4.44 9583 + '@smithy/middleware-serde': 4.2.15 9584 + '@smithy/middleware-stack': 4.2.12 9585 + '@smithy/node-config-provider': 4.3.12 9586 + '@smithy/node-http-handler': 4.5.0 9587 + '@smithy/protocol-http': 5.3.12 9588 + '@smithy/smithy-client': 4.12.7 9589 + '@smithy/types': 4.13.1 9590 + '@smithy/url-parser': 4.2.12 9591 + '@smithy/util-base64': 4.3.2 9592 + '@smithy/util-body-length-browser': 4.2.2 9593 + '@smithy/util-body-length-node': 4.2.3 9594 + '@smithy/util-defaults-mode-browser': 4.3.43 9595 + '@smithy/util-defaults-mode-node': 4.2.47 9596 + '@smithy/util-endpoints': 3.3.3 9597 + '@smithy/util-middleware': 4.2.12 9598 + '@smithy/util-retry': 4.2.12 9599 + '@smithy/util-utf8': 4.2.2 9600 + tslib: 2.8.1 9601 + transitivePeerDependencies: 9602 + - aws-crt 9603 + 9604 + '@aws-sdk/region-config-resolver@3.972.8': 9605 + dependencies: 9606 + '@aws-sdk/types': 3.973.6 9607 + '@smithy/config-resolver': 4.4.13 9608 + '@smithy/node-config-provider': 4.3.12 9609 + '@smithy/types': 4.13.1 9610 + tslib: 2.8.1 9611 + 9612 + '@aws-sdk/signature-v4-multi-region@3.996.10': 9613 + dependencies: 9614 + '@aws-sdk/middleware-sdk-s3': 3.972.22 9615 + '@aws-sdk/types': 3.973.6 9616 + '@smithy/protocol-http': 5.3.12 9617 + '@smithy/signature-v4': 5.3.12 9618 + '@smithy/types': 4.13.1 9619 + tslib: 2.8.1 9620 + 9621 + '@aws-sdk/token-providers@3.1013.0': 9622 + dependencies: 9623 + '@aws-sdk/core': 3.973.22 9624 + '@aws-sdk/nested-clients': 3.996.12 9625 + '@aws-sdk/types': 3.973.6 9626 + '@smithy/property-provider': 4.2.12 9627 + '@smithy/shared-ini-file-loader': 4.4.7 9628 + '@smithy/types': 4.13.1 9629 + tslib: 2.8.1 9630 + transitivePeerDependencies: 9631 + - aws-crt 9632 + 9633 + '@aws-sdk/types@3.973.6': 9634 + dependencies: 9635 + '@smithy/types': 4.13.1 9636 + tslib: 2.8.1 9637 + 9638 + '@aws-sdk/util-arn-parser@3.972.3': 9639 + dependencies: 9640 + tslib: 2.8.1 9641 + 9642 + '@aws-sdk/util-endpoints@3.996.5': 9643 + dependencies: 9644 + '@aws-sdk/types': 3.973.6 9645 + '@smithy/types': 4.13.1 9646 + '@smithy/url-parser': 4.2.12 9647 + '@smithy/util-endpoints': 3.3.3 9648 + tslib: 2.8.1 9649 + 9650 + '@aws-sdk/util-locate-window@3.965.5': 9651 + dependencies: 9652 + tslib: 2.8.1 9653 + 9654 + '@aws-sdk/util-user-agent-browser@3.972.8': 9655 + dependencies: 9656 + '@aws-sdk/types': 3.973.6 9657 + '@smithy/types': 4.13.1 9658 + bowser: 2.14.1 9659 + tslib: 2.8.1 9660 + 9661 + '@aws-sdk/util-user-agent-node@3.973.9': 9662 + dependencies: 9663 + '@aws-sdk/middleware-user-agent': 3.972.23 9664 + '@aws-sdk/types': 3.973.6 9665 + '@smithy/node-config-provider': 4.3.12 9666 + '@smithy/types': 4.13.1 9667 + '@smithy/util-config-provider': 4.2.2 9668 + tslib: 2.8.1 9669 + 9670 + '@aws-sdk/xml-builder@3.972.14': 9671 + dependencies: 9672 + '@smithy/types': 4.13.1 9673 + fast-xml-parser: 5.5.6 9674 + tslib: 2.8.1 9675 + 9676 + '@aws/lambda-invoke-store@0.2.4': {} 9677 + 8808 9678 '@babel/code-frame@7.27.1': 8809 9679 dependencies: 8810 9680 '@babel/helper-validator-identifier': 7.28.5 ··· 11340 12210 dependencies: 11341 12211 '@sinonjs/commons': 3.0.1 11342 12212 12213 + '@smithy/abort-controller@4.2.12': 12214 + dependencies: 12215 + '@smithy/types': 4.13.1 12216 + tslib: 2.8.1 12217 + 12218 + '@smithy/chunked-blob-reader-native@4.2.3': 12219 + dependencies: 12220 + '@smithy/util-base64': 4.3.2 12221 + tslib: 2.8.1 12222 + 12223 + '@smithy/chunked-blob-reader@5.2.2': 12224 + dependencies: 12225 + tslib: 2.8.1 12226 + 12227 + '@smithy/config-resolver@4.4.13': 12228 + dependencies: 12229 + '@smithy/node-config-provider': 4.3.12 12230 + '@smithy/types': 4.13.1 12231 + '@smithy/util-config-provider': 4.2.2 12232 + '@smithy/util-endpoints': 3.3.3 12233 + '@smithy/util-middleware': 4.2.12 12234 + tslib: 2.8.1 12235 + 12236 + '@smithy/core@3.23.12': 12237 + dependencies: 12238 + '@smithy/protocol-http': 5.3.12 12239 + '@smithy/types': 4.13.1 12240 + '@smithy/url-parser': 4.2.12 12241 + '@smithy/util-base64': 4.3.2 12242 + '@smithy/util-body-length-browser': 4.2.2 12243 + '@smithy/util-middleware': 4.2.12 12244 + '@smithy/util-stream': 4.5.20 12245 + '@smithy/util-utf8': 4.2.2 12246 + '@smithy/uuid': 1.1.2 12247 + tslib: 2.8.1 12248 + 12249 + '@smithy/credential-provider-imds@4.2.12': 12250 + dependencies: 12251 + '@smithy/node-config-provider': 4.3.12 12252 + '@smithy/property-provider': 4.2.12 12253 + '@smithy/types': 4.13.1 12254 + '@smithy/url-parser': 4.2.12 12255 + tslib: 2.8.1 12256 + 12257 + '@smithy/eventstream-codec@4.2.12': 12258 + dependencies: 12259 + '@aws-crypto/crc32': 5.2.0 12260 + '@smithy/types': 4.13.1 12261 + '@smithy/util-hex-encoding': 4.2.2 12262 + tslib: 2.8.1 12263 + 12264 + '@smithy/eventstream-serde-browser@4.2.12': 12265 + dependencies: 12266 + '@smithy/eventstream-serde-universal': 4.2.12 12267 + '@smithy/types': 4.13.1 12268 + tslib: 2.8.1 12269 + 12270 + '@smithy/eventstream-serde-config-resolver@4.3.12': 12271 + dependencies: 12272 + '@smithy/types': 4.13.1 12273 + tslib: 2.8.1 12274 + 12275 + '@smithy/eventstream-serde-node@4.2.12': 12276 + dependencies: 12277 + '@smithy/eventstream-serde-universal': 4.2.12 12278 + '@smithy/types': 4.13.1 12279 + tslib: 2.8.1 12280 + 12281 + '@smithy/eventstream-serde-universal@4.2.12': 12282 + dependencies: 12283 + '@smithy/eventstream-codec': 4.2.12 12284 + '@smithy/types': 4.13.1 12285 + tslib: 2.8.1 12286 + 12287 + '@smithy/fetch-http-handler@5.3.15': 12288 + dependencies: 12289 + '@smithy/protocol-http': 5.3.12 12290 + '@smithy/querystring-builder': 4.2.12 12291 + '@smithy/types': 4.13.1 12292 + '@smithy/util-base64': 4.3.2 12293 + tslib: 2.8.1 12294 + 12295 + '@smithy/hash-blob-browser@4.2.13': 12296 + dependencies: 12297 + '@smithy/chunked-blob-reader': 5.2.2 12298 + '@smithy/chunked-blob-reader-native': 4.2.3 12299 + '@smithy/types': 4.13.1 12300 + tslib: 2.8.1 12301 + 12302 + '@smithy/hash-node@4.2.12': 12303 + dependencies: 12304 + '@smithy/types': 4.13.1 12305 + '@smithy/util-buffer-from': 4.2.2 12306 + '@smithy/util-utf8': 4.2.2 12307 + tslib: 2.8.1 12308 + 12309 + '@smithy/hash-stream-node@4.2.12': 12310 + dependencies: 12311 + '@smithy/types': 4.13.1 12312 + '@smithy/util-utf8': 4.2.2 12313 + tslib: 2.8.1 12314 + 12315 + '@smithy/invalid-dependency@4.2.12': 12316 + dependencies: 12317 + '@smithy/types': 4.13.1 12318 + tslib: 2.8.1 12319 + 12320 + '@smithy/is-array-buffer@2.2.0': 12321 + dependencies: 12322 + tslib: 2.8.1 12323 + 12324 + '@smithy/is-array-buffer@4.2.2': 12325 + dependencies: 12326 + tslib: 2.8.1 12327 + 12328 + '@smithy/md5-js@4.2.12': 12329 + dependencies: 12330 + '@smithy/types': 4.13.1 12331 + '@smithy/util-utf8': 4.2.2 12332 + tslib: 2.8.1 12333 + 12334 + '@smithy/middleware-content-length@4.2.12': 12335 + dependencies: 12336 + '@smithy/protocol-http': 5.3.12 12337 + '@smithy/types': 4.13.1 12338 + tslib: 2.8.1 12339 + 12340 + '@smithy/middleware-endpoint@4.4.27': 12341 + dependencies: 12342 + '@smithy/core': 3.23.12 12343 + '@smithy/middleware-serde': 4.2.15 12344 + '@smithy/node-config-provider': 4.3.12 12345 + '@smithy/shared-ini-file-loader': 4.4.7 12346 + '@smithy/types': 4.13.1 12347 + '@smithy/url-parser': 4.2.12 12348 + '@smithy/util-middleware': 4.2.12 12349 + tslib: 2.8.1 12350 + 12351 + '@smithy/middleware-retry@4.4.44': 12352 + dependencies: 12353 + '@smithy/node-config-provider': 4.3.12 12354 + '@smithy/protocol-http': 5.3.12 12355 + '@smithy/service-error-classification': 4.2.12 12356 + '@smithy/smithy-client': 4.12.7 12357 + '@smithy/types': 4.13.1 12358 + '@smithy/util-middleware': 4.2.12 12359 + '@smithy/util-retry': 4.2.12 12360 + '@smithy/uuid': 1.1.2 12361 + tslib: 2.8.1 12362 + 12363 + '@smithy/middleware-serde@4.2.15': 12364 + dependencies: 12365 + '@smithy/core': 3.23.12 12366 + '@smithy/protocol-http': 5.3.12 12367 + '@smithy/types': 4.13.1 12368 + tslib: 2.8.1 12369 + 12370 + '@smithy/middleware-stack@4.2.12': 12371 + dependencies: 12372 + '@smithy/types': 4.13.1 12373 + tslib: 2.8.1 12374 + 12375 + '@smithy/node-config-provider@4.3.12': 12376 + dependencies: 12377 + '@smithy/property-provider': 4.2.12 12378 + '@smithy/shared-ini-file-loader': 4.4.7 12379 + '@smithy/types': 4.13.1 12380 + tslib: 2.8.1 12381 + 12382 + '@smithy/node-http-handler@4.5.0': 12383 + dependencies: 12384 + '@smithy/abort-controller': 4.2.12 12385 + '@smithy/protocol-http': 5.3.12 12386 + '@smithy/querystring-builder': 4.2.12 12387 + '@smithy/types': 4.13.1 12388 + tslib: 2.8.1 12389 + 12390 + '@smithy/property-provider@4.2.12': 12391 + dependencies: 12392 + '@smithy/types': 4.13.1 12393 + tslib: 2.8.1 12394 + 12395 + '@smithy/protocol-http@5.3.12': 12396 + dependencies: 12397 + '@smithy/types': 4.13.1 12398 + tslib: 2.8.1 12399 + 12400 + '@smithy/querystring-builder@4.2.12': 12401 + dependencies: 12402 + '@smithy/types': 4.13.1 12403 + '@smithy/util-uri-escape': 4.2.2 12404 + tslib: 2.8.1 12405 + 12406 + '@smithy/querystring-parser@4.2.12': 12407 + dependencies: 12408 + '@smithy/types': 4.13.1 12409 + tslib: 2.8.1 12410 + 12411 + '@smithy/service-error-classification@4.2.12': 12412 + dependencies: 12413 + '@smithy/types': 4.13.1 12414 + 12415 + '@smithy/shared-ini-file-loader@4.4.7': 12416 + dependencies: 12417 + '@smithy/types': 4.13.1 12418 + tslib: 2.8.1 12419 + 12420 + '@smithy/signature-v4@5.3.12': 12421 + dependencies: 12422 + '@smithy/is-array-buffer': 4.2.2 12423 + '@smithy/protocol-http': 5.3.12 12424 + '@smithy/types': 4.13.1 12425 + '@smithy/util-hex-encoding': 4.2.2 12426 + '@smithy/util-middleware': 4.2.12 12427 + '@smithy/util-uri-escape': 4.2.2 12428 + '@smithy/util-utf8': 4.2.2 12429 + tslib: 2.8.1 12430 + 12431 + '@smithy/smithy-client@4.12.7': 12432 + dependencies: 12433 + '@smithy/core': 3.23.12 12434 + '@smithy/middleware-endpoint': 4.4.27 12435 + '@smithy/middleware-stack': 4.2.12 12436 + '@smithy/protocol-http': 5.3.12 12437 + '@smithy/types': 4.13.1 12438 + '@smithy/util-stream': 4.5.20 12439 + tslib: 2.8.1 12440 + 12441 + '@smithy/types@4.13.1': 12442 + dependencies: 12443 + tslib: 2.8.1 12444 + 12445 + '@smithy/url-parser@4.2.12': 12446 + dependencies: 12447 + '@smithy/querystring-parser': 4.2.12 12448 + '@smithy/types': 4.13.1 12449 + tslib: 2.8.1 12450 + 12451 + '@smithy/util-base64@4.3.2': 12452 + dependencies: 12453 + '@smithy/util-buffer-from': 4.2.2 12454 + '@smithy/util-utf8': 4.2.2 12455 + tslib: 2.8.1 12456 + 12457 + '@smithy/util-body-length-browser@4.2.2': 12458 + dependencies: 12459 + tslib: 2.8.1 12460 + 12461 + '@smithy/util-body-length-node@4.2.3': 12462 + dependencies: 12463 + tslib: 2.8.1 12464 + 12465 + '@smithy/util-buffer-from@2.2.0': 12466 + dependencies: 12467 + '@smithy/is-array-buffer': 2.2.0 12468 + tslib: 2.8.1 12469 + 12470 + '@smithy/util-buffer-from@4.2.2': 12471 + dependencies: 12472 + '@smithy/is-array-buffer': 4.2.2 12473 + tslib: 2.8.1 12474 + 12475 + '@smithy/util-config-provider@4.2.2': 12476 + dependencies: 12477 + tslib: 2.8.1 12478 + 12479 + '@smithy/util-defaults-mode-browser@4.3.43': 12480 + dependencies: 12481 + '@smithy/property-provider': 4.2.12 12482 + '@smithy/smithy-client': 4.12.7 12483 + '@smithy/types': 4.13.1 12484 + tslib: 2.8.1 12485 + 12486 + '@smithy/util-defaults-mode-node@4.2.47': 12487 + dependencies: 12488 + '@smithy/config-resolver': 4.4.13 12489 + '@smithy/credential-provider-imds': 4.2.12 12490 + '@smithy/node-config-provider': 4.3.12 12491 + '@smithy/property-provider': 4.2.12 12492 + '@smithy/smithy-client': 4.12.7 12493 + '@smithy/types': 4.13.1 12494 + tslib: 2.8.1 12495 + 12496 + '@smithy/util-endpoints@3.3.3': 12497 + dependencies: 12498 + '@smithy/node-config-provider': 4.3.12 12499 + '@smithy/types': 4.13.1 12500 + tslib: 2.8.1 12501 + 12502 + '@smithy/util-hex-encoding@4.2.2': 12503 + dependencies: 12504 + tslib: 2.8.1 12505 + 12506 + '@smithy/util-middleware@4.2.12': 12507 + dependencies: 12508 + '@smithy/types': 4.13.1 12509 + tslib: 2.8.1 12510 + 12511 + '@smithy/util-retry@4.2.12': 12512 + dependencies: 12513 + '@smithy/service-error-classification': 4.2.12 12514 + '@smithy/types': 4.13.1 12515 + tslib: 2.8.1 12516 + 12517 + '@smithy/util-stream@4.5.20': 12518 + dependencies: 12519 + '@smithy/fetch-http-handler': 5.3.15 12520 + '@smithy/node-http-handler': 4.5.0 12521 + '@smithy/types': 4.13.1 12522 + '@smithy/util-base64': 4.3.2 12523 + '@smithy/util-buffer-from': 4.2.2 12524 + '@smithy/util-hex-encoding': 4.2.2 12525 + '@smithy/util-utf8': 4.2.2 12526 + tslib: 2.8.1 12527 + 12528 + '@smithy/util-uri-escape@4.2.2': 12529 + dependencies: 12530 + tslib: 2.8.1 12531 + 12532 + '@smithy/util-utf8@2.3.0': 12533 + dependencies: 12534 + '@smithy/util-buffer-from': 2.2.0 12535 + tslib: 2.8.1 12536 + 12537 + '@smithy/util-utf8@4.2.2': 12538 + dependencies: 12539 + '@smithy/util-buffer-from': 4.2.2 12540 + tslib: 2.8.1 12541 + 12542 + '@smithy/util-waiter@4.2.13': 12543 + dependencies: 12544 + '@smithy/abort-controller': 4.2.12 12545 + '@smithy/types': 4.13.1 12546 + tslib: 2.8.1 12547 + 12548 + '@smithy/uuid@1.1.2': 12549 + dependencies: 12550 + tslib: 2.8.1 12551 + 11343 12552 '@stablelib/base64@1.0.1': {} 11344 12553 11345 12554 '@standard-schema/spec@1.1.0': {} ··· 12315 13524 transitivePeerDependencies: 12316 13525 - supports-color 12317 13526 13527 + bowser@2.14.1: {} 13528 + 12318 13529 brace-expansion@1.1.12: 12319 13530 dependencies: 12320 13531 balanced-match: 1.0.2 ··· 13266 14477 13267 14478 fast-sha256@1.3.0: {} 13268 14479 14480 + fast-xml-builder@1.1.4: 14481 + dependencies: 14482 + path-expression-matcher: 1.1.3 14483 + 14484 + fast-xml-parser@5.5.6: 14485 + dependencies: 14486 + fast-xml-builder: 1.1.4 14487 + path-expression-matcher: 1.1.3 14488 + strnum: 2.2.1 14489 + 13269 14490 fastq@1.20.1: 13270 14491 dependencies: 13271 14492 reusify: 1.1.0 ··· 15916 17137 15917 17138 path-exists@4.0.0: {} 15918 17139 17140 + path-expression-matcher@1.1.3: {} 17141 + 15919 17142 path-is-absolute@1.0.1: {} 15920 17143 15921 17144 path-key@3.1.1: {} ··· 16855 18078 strip-json-comments@2.0.1: {} 16856 18079 16857 18080 strip-json-comments@3.1.1: {} 18081 + 18082 + strnum@2.2.1: {} 16858 18083 16859 18084 strtok3@10.3.4: 16860 18085 dependencies: