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): Kubernetes deployment with FileStorage, simplified Dockerfiles, and CI scripts

+2543 -428
+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 + }
-60
.docker/client.Dockerfile
··· 1 - FROM node:24-bookworm-slim AS development 2 - 3 - RUN apt-get update && apt-get install -y --no-install-recommends curl && rm -rf /var/lib/apt/lists/* 4 - RUN corepack enable && corepack prepare pnpm@latest --activate 5 - 6 - WORKDIR /app 7 - 8 - # Layer 1: workspace config + lockfile 9 - COPY package.json pnpm-lock.yaml pnpm-workspace.yaml lerna.json ./ 10 - 11 - # Layer 2: package.json manifests only 12 - COPY .docker/.manifests/ /tmp/manifests/ 13 - COPY .docker/restore-manifests.sh /tmp/ 14 - RUN sh /tmp/restore-manifests.sh /tmp/manifests 15 - 16 - # Layer 3: install (skip native addon builds — canvas is server-only) 17 - RUN pnpm install --frozen-lockfile --ignore-scripts 18 - 19 - # Layer 4: source code 20 - COPY packages/ ./packages/ 21 - COPY apps/client/ ./apps/client/ 22 - 23 - EXPOSE 5173 24 - 25 - WORKDIR /app/apps/client 26 - CMD ["pnpm", "dev"] 27 - 28 - # ---- Production build ---- 29 - FROM node:24-bookworm-slim AS builder 30 - 31 - RUN corepack enable && corepack prepare pnpm@latest --activate 32 - 33 - WORKDIR /app 34 - 35 - COPY package.json pnpm-lock.yaml pnpm-workspace.yaml lerna.json ./ 36 - COPY .docker/.manifests/ /tmp/manifests/ 37 - COPY .docker/restore-manifests.sh /tmp/ 38 - RUN sh /tmp/restore-manifests.sh /tmp/manifests 39 - RUN pnpm install --frozen-lockfile --ignore-scripts 40 - 41 - COPY packages/ ./packages/ 42 - COPY apps/client/ ./apps/client/ 43 - 44 - ARG VITE_SERVER_URL 45 - ARG VITE_DOCS_URL 46 - ENV VITE_SERVER_URL=${VITE_SERVER_URL} 47 - ENV VITE_DOCS_URL=${VITE_DOCS_URL} 48 - 49 - WORKDIR /app/apps/client 50 - RUN pnpm exec vite build 51 - 52 - # ---- Production serve ---- 53 - FROM nginx:alpine AS production 54 - 55 - COPY --from=builder /app/apps/client/dist /usr/share/nginx/html 56 - COPY apps/client/nginx.conf /etc/nginx/conf.d/default.conf 57 - 58 - EXPOSE 80 59 - 60 - CMD ["nginx", "-g", "daemon off;"]
-64
.docker/patch-vendor-links.sh
··· 1 - #!/bin/sh 2 - # Patches link: paths in package.json to point to vendored copies at 3 - # $ROOT/vendor/ so pnpm install can resolve them with --frozen-lockfile. 4 - # 5 - # Also creates a /riotbyte/project-q/packages/ directory tree that 6 - # mirrors the layout pnpm's lockfile expects (relative link: targets 7 - # resolve to /riotbyte/... inside Docker because the workspace root 8 - # is at /app which is only 1 level deep). 9 - # 10 - # Usage: patch-vendor-links.sh [workspace-root] 11 - 12 - set -e 13 - 14 - ROOT="${1:-.}" 15 - 16 - # Step 1: Patch package.json specifiers (link:host-path → link:$ROOT/vendor/*) 17 - # pnpm validates specifiers match package.json during --frozen-lockfile 18 - find "$ROOT" -name 'package.json' -not -path '*/node_modules/*' | while read -r f; do 19 - if grep -q '"link:.*project-q\|"link:.*nest-service-locator' "$f" 2>/dev/null; then 20 - sed -i \ 21 - -e "s|\"link:[^\"]*project-q/packages/core\"|\"link:$ROOT/vendor/project-q-core\"|g" \ 22 - -e "s|\"link:[^\"]*project-q/packages/framework/nest\"|\"link:$ROOT/vendor/project-q-nestjs\"|g" \ 23 - -e "s|\"link:[^\"]*project-q/packages/transport/prisma\"|\"link:$ROOT/vendor/project-q-prisma\"|g" \ 24 - -e "s|\"link:[^\"]*nest-service-locator\"|\"link:$ROOT/vendor/nest-service-locator\"|g" \ 25 - "$f" 26 - echo "Patched $f" 27 - fi 28 - done 29 - 30 - # Step 2: Patch lockfile specifiers to match the package.json changes 31 - # Only patch absolute specifier lines (link:/...), leave relative 32 - # version lines untouched — they resolve via mount points below. 33 - LOCKFILE="$ROOT/pnpm-lock.yaml" 34 - if [ -f "$LOCKFILE" ] && grep -q 'project-q\|nest-service-locator' "$LOCKFILE" 2>/dev/null; then 35 - sed -i \ 36 - -e "s|link:/[^ ]*project-q/packages/core|link:$ROOT/vendor/project-q-core|g" \ 37 - -e "s|link:/[^ ]*project-q/packages/framework/nest|link:$ROOT/vendor/project-q-nestjs|g" \ 38 - -e "s|link:/[^ ]*project-q/packages/transport/prisma|link:$ROOT/vendor/project-q-prisma|g" \ 39 - -e "s|link:/[^ ]*nest-service-locator|link:$ROOT/vendor/nest-service-locator|g" \ 40 - "$LOCKFILE" 41 - echo "Patched $LOCKFILE" 42 - fi 43 - 44 - # Step 3: Create mount points so pnpm's relative symlinks resolve correctly. 45 - # Inside Docker, relative link: paths from the lockfile resolve to 46 - # /riotbyte/project-q/packages/* (because the workspace is at /app). 47 - # We create symlinks there pointing to the vendored copies inside the 48 - # workspace tree (at $ROOT/vendor/). 49 - mkdir -p /riotbyte/project-q/packages/framework /riotbyte/project-q/packages/transport /riotbyte 50 - ln -sfn "$ROOT/vendor/project-q-core" /riotbyte/project-q/packages/core 51 - ln -sfn "$ROOT/vendor/project-q-nestjs" /riotbyte/project-q/packages/framework/nest 52 - ln -sfn "$ROOT/vendor/project-q-prisma" /riotbyte/project-q/packages/transport/prisma 53 - ln -sfn "$ROOT/vendor/nest-service-locator" /riotbyte/nest-service-locator 54 - echo "Created mount points at /riotbyte/" 55 - 56 - # Step 4: Create root-level node_modules symlinks so vendored packages 57 - # can resolve each other (e.g. transport-postgres depends on core). 58 - # pnpm only creates per-workspace symlinks for link: deps, not at root. 59 - mkdir -p "$ROOT/node_modules/@riotbyte" 60 - ln -sfn "$ROOT/vendor/project-q-core" "$ROOT/node_modules/@riotbyte/project-q-core" 61 - ln -sfn "$ROOT/vendor/project-q-nestjs" "$ROOT/node_modules/@riotbyte/project-q-nestjs" 62 - ln -sfn "$ROOT/vendor/project-q-prisma" "$ROOT/node_modules/@riotbyte/project-q-prisma" 63 - ln -sfn "$ROOT/vendor/nest-service-locator" "$ROOT/node_modules/@riotbyte/nest-service-locator" 64 - echo "Created root node_modules symlinks for vendored packages"
+17 -41
.docker/server.Dockerfile
··· 19 19 COPY .docker/restore-manifests.sh /tmp/ 20 20 RUN sh /tmp/restore-manifests.sh /tmp/manifests 21 21 22 - # Layer 2b: vendor project-q packages (from additional build context) 23 - COPY --from=project-q packages/core/package.json ./vendor/project-q-core/package.json 24 - COPY --from=project-q packages/core/dist/ ./vendor/project-q-core/dist/ 25 - COPY --from=project-q packages/framework/nest/package.json ./vendor/project-q-nestjs/package.json 26 - COPY --from=project-q packages/framework/nest/dist/ ./vendor/project-q-nestjs/dist/ 27 - COPY --from=project-q packages/transport/prisma/package.json ./vendor/project-q-prisma/package.json 28 - COPY --from=project-q packages/transport/prisma/dist/ ./vendor/project-q-prisma/dist/ 29 - COPY --from=nest-service-locator package.json ./vendor/nest-service-locator/package.json 30 - COPY --from=nest-service-locator dist/src/ ./vendor/nest-service-locator/dist/src/ 22 + # GHCR npm auth for @riotbyte-com packages 23 + ARG GITHUB_TOKEN 24 + COPY .npmrc .npmrc 25 + RUN echo "//npm.pkg.github.com/:_authToken=${GITHUB_TOKEN}" >> .npmrc 31 26 32 - # Patch link: → file: for project-q packages 33 - COPY .docker/patch-vendor-links.sh /tmp/ 34 - RUN sh /tmp/patch-vendor-links.sh /app 35 - 36 - # Layer 3: install (lockfile was patched above to match vendored paths) 37 - RUN NPM_CONFIG_SHAMEFULLY_HOIST=true pnpm install --frozen-lockfile 27 + # Layer 3: install 28 + RUN pnpm install --frozen-lockfile 38 29 39 30 # Layer 4: source code (changes frequently) 40 31 COPY packages/ ./packages/ 41 32 COPY apps/server/ ./apps/server/ 42 - 43 - # Patch server package.json too (COPY overwrote the patched version) 44 - RUN sh /tmp/patch-vendor-links.sh /app 45 33 46 34 # Generate Prisma client 47 35 WORKDIR /app/apps/server ··· 68 56 COPY .docker/restore-manifests.sh /tmp/ 69 57 RUN sh /tmp/restore-manifests.sh /tmp/manifests 70 58 71 - COPY --from=project-q packages/core/package.json ./vendor/project-q-core/package.json 72 - COPY --from=project-q packages/core/dist/ ./vendor/project-q-core/dist/ 73 - COPY --from=project-q packages/framework/nest/package.json ./vendor/project-q-nestjs/package.json 74 - COPY --from=project-q packages/framework/nest/dist/ ./vendor/project-q-nestjs/dist/ 75 - COPY --from=project-q packages/transport/prisma/package.json ./vendor/project-q-prisma/package.json 76 - COPY --from=project-q packages/transport/prisma/dist/ ./vendor/project-q-prisma/dist/ 77 - 78 - COPY .docker/patch-vendor-links.sh /tmp/ 79 - RUN sh /tmp/patch-vendor-links.sh /app 59 + ARG GITHUB_TOKEN 60 + COPY .npmrc .npmrc 61 + RUN echo "//npm.pkg.github.com/:_authToken=${GITHUB_TOKEN}" >> .npmrc 80 62 81 - RUN NPM_CONFIG_SHAMEFULLY_HOIST=true pnpm install --frozen-lockfile 63 + RUN pnpm install --frozen-lockfile 82 64 83 65 COPY packages/ ./packages/ 84 66 COPY apps/server/ ./apps/server/ 85 - RUN sh /tmp/patch-vendor-links.sh /app 86 67 87 68 WORKDIR /app/apps/server 88 69 RUN pnpm exec prisma generate ··· 106 87 COPY .docker/restore-manifests.sh /tmp/ 107 88 RUN sh /tmp/restore-manifests.sh /tmp/manifests 108 89 109 - COPY --from=project-q packages/core/package.json ./vendor/project-q-core/package.json 110 - COPY --from=project-q packages/core/dist/ ./vendor/project-q-core/dist/ 111 - COPY --from=project-q packages/framework/nest/package.json ./vendor/project-q-nestjs/package.json 112 - COPY --from=project-q packages/framework/nest/dist/ ./vendor/project-q-nestjs/dist/ 113 - COPY --from=project-q packages/transport/prisma/package.json ./vendor/project-q-prisma/package.json 114 - COPY --from=project-q packages/transport/prisma/dist/ ./vendor/project-q-prisma/dist/ 115 - COPY --from=nest-service-locator package.json ./vendor/nest-service-locator/package.json 116 - COPY --from=nest-service-locator dist/src/ ./vendor/nest-service-locator/dist/src/ 90 + ARG GITHUB_TOKEN 91 + COPY .npmrc .npmrc 92 + RUN echo "//npm.pkg.github.com/:_authToken=${GITHUB_TOKEN}" >> .npmrc 117 93 118 - COPY .docker/patch-vendor-links.sh /tmp/ 119 - RUN sh /tmp/patch-vendor-links.sh /app 120 - 121 - RUN NPM_CONFIG_SHAMEFULLY_HOIST=true pnpm install --frozen-lockfile --prod 94 + RUN pnpm install --frozen-lockfile --prod 122 95 123 96 # Copy Prisma schema + generated client 124 97 COPY apps/server/prisma/ ./apps/server/prisma/ ··· 127 100 128 101 # Copy bundled output (single file, @cv/* packages inlined) 129 102 COPY --from=builder /app/apps/server/dist/ ./apps/server/dist/ 103 + 104 + # Remove auth token from final image 105 + RUN sed -i '/_authToken/d' .npmrc 130 106 131 107 ENV NODE_ENV=production 132 108 EXPOSE 3000
+19 -46
.docker/worker.Dockerfile
··· 13 13 COPY .docker/restore-manifests.sh /tmp/ 14 14 RUN sh /tmp/restore-manifests.sh /tmp/manifests 15 15 16 - # Layer 2b: vendor project-q packages (inside workspace tree so Node 17 - # module resolution walks up to /app/node_modules) 18 - COPY --from=project-q packages/core/package.json ./vendor/project-q-core/package.json 19 - COPY --from=project-q packages/core/dist/ ./vendor/project-q-core/dist/ 20 - COPY --from=project-q packages/framework/nest/package.json ./vendor/project-q-nestjs/package.json 21 - COPY --from=project-q packages/framework/nest/dist/ ./vendor/project-q-nestjs/dist/ 22 - COPY --from=project-q packages/transport/prisma/package.json ./vendor/project-q-prisma/package.json 23 - COPY --from=project-q packages/transport/prisma/dist/ ./vendor/project-q-prisma/dist/ 24 - COPY --from=nest-service-locator package.json ./vendor/nest-service-locator/package.json 25 - COPY --from=nest-service-locator dist/src/ ./vendor/nest-service-locator/dist/src/ 16 + # GHCR npm auth for @riotbyte-com packages 17 + ARG GITHUB_TOKEN 18 + COPY .npmrc .npmrc 19 + RUN echo "//npm.pkg.github.com/:_authToken=${GITHUB_TOKEN}" >> .npmrc 26 20 27 - # Patch link: specifiers + create mount points for lockfile relative paths 28 - COPY .docker/patch-vendor-links.sh /tmp/ 29 - RUN sh /tmp/patch-vendor-links.sh /app 30 - 31 - # Layer 3: install (lockfile was patched above to match vendored paths) 32 - # shamefully-hoist makes all deps available at /app/node_modules/ so 33 - # vendored project-q packages (linked via link: protocol) can resolve 34 - # their transitive deps (uuid, zod, pg) through Node's upward walk. 35 - RUN NPM_CONFIG_SHAMEFULLY_HOIST=true pnpm install --frozen-lockfile 21 + # Layer 3: install 22 + RUN pnpm install --frozen-lockfile 36 23 37 24 # Layer 4: source code 38 25 COPY packages/tsconfig/ ./packages/tsconfig/ 39 26 COPY packages/system/ ./packages/system/ 27 + COPY packages/file-storage/ ./packages/file-storage/ 40 28 COPY apps/server/prisma/ ./apps/server/prisma/ 41 29 COPY apps/worker/ ./apps/worker/ 42 - RUN sh /tmp/patch-vendor-links.sh /app 43 30 44 31 # Generate Prisma client (@cv/system depends on @prisma/client) 45 32 RUN cd apps/server && pnpm exec prisma generate ··· 63 50 COPY .docker/restore-manifests.sh /tmp/ 64 51 RUN sh /tmp/restore-manifests.sh /tmp/manifests 65 52 66 - COPY --from=project-q packages/core/package.json ./vendor/project-q-core/package.json 67 - COPY --from=project-q packages/core/dist/ ./vendor/project-q-core/dist/ 68 - COPY --from=project-q packages/framework/nest/package.json ./vendor/project-q-nestjs/package.json 69 - COPY --from=project-q packages/framework/nest/dist/ ./vendor/project-q-nestjs/dist/ 70 - COPY --from=project-q packages/transport/prisma/package.json ./vendor/project-q-prisma/package.json 71 - COPY --from=project-q packages/transport/prisma/dist/ ./vendor/project-q-prisma/dist/ 53 + ARG GITHUB_TOKEN 54 + COPY .npmrc .npmrc 55 + RUN echo "//npm.pkg.github.com/:_authToken=${GITHUB_TOKEN}" >> .npmrc 72 56 73 - COPY .docker/patch-vendor-links.sh /tmp/ 74 - RUN sh /tmp/patch-vendor-links.sh /app 75 - 76 - # shamefully-hoist makes all deps available at /app/node_modules/ so 77 - # vendored project-q packages (linked via link: protocol) can resolve 78 - # their transitive deps (uuid, zod, pg) through Node's upward walk. 79 - RUN NPM_CONFIG_SHAMEFULLY_HOIST=true pnpm install --frozen-lockfile 57 + RUN pnpm install --frozen-lockfile 80 58 81 59 COPY packages/tsconfig/ ./packages/tsconfig/ 82 60 COPY packages/system/ ./packages/system/ 61 + COPY packages/file-storage/ ./packages/file-storage/ 83 62 COPY apps/server/prisma/ ./apps/server/prisma/ 84 63 COPY apps/worker/ ./apps/worker/ 85 - RUN sh /tmp/patch-vendor-links.sh /app 86 64 87 65 RUN cd apps/server && pnpm exec prisma generate 88 66 ··· 101 79 COPY .docker/restore-manifests.sh /tmp/ 102 80 RUN sh /tmp/restore-manifests.sh /tmp/manifests 103 81 104 - COPY --from=project-q packages/core/package.json ./vendor/project-q-core/package.json 105 - COPY --from=project-q packages/core/dist/ ./vendor/project-q-core/dist/ 106 - COPY --from=project-q packages/framework/nest/package.json ./vendor/project-q-nestjs/package.json 107 - COPY --from=project-q packages/framework/nest/dist/ ./vendor/project-q-nestjs/dist/ 108 - COPY --from=project-q packages/transport/prisma/package.json ./vendor/project-q-prisma/package.json 109 - COPY --from=project-q packages/transport/prisma/dist/ ./vendor/project-q-prisma/dist/ 110 - COPY --from=nest-service-locator package.json ./vendor/nest-service-locator/package.json 111 - COPY --from=nest-service-locator dist/src/ ./vendor/nest-service-locator/dist/src/ 112 - 113 - COPY .docker/patch-vendor-links.sh /tmp/ 114 - RUN sh /tmp/patch-vendor-links.sh /app 82 + ARG GITHUB_TOKEN 83 + COPY .npmrc .npmrc 84 + RUN echo "//npm.pkg.github.com/:_authToken=${GITHUB_TOKEN}" >> .npmrc 115 85 116 - RUN NPM_CONFIG_SHAMEFULLY_HOIST=true pnpm install --frozen-lockfile --prod 86 + RUN pnpm install --frozen-lockfile --prod 117 87 118 88 # Install Chromium + system deps via Playwright 119 89 RUN cd apps/worker && pnpm exec playwright install --with-deps chromium 120 90 121 91 # Copy compiled output 122 92 COPY --from=builder /app/apps/worker/dist/ ./apps/worker/dist/ 93 + 94 + # Remove auth token from final image 95 + RUN sed -i '/_authToken/d' .npmrc 123 96 124 97 ENV NODE_ENV=production 125 98
+63
.github/workflows/create-release.yml
··· 1 + name: Create release 2 + 3 + on: 4 + workflow_dispatch: 5 + inputs: 6 + bump: 7 + description: "Version bump type" 8 + required: true 9 + type: choice 10 + options: 11 + - patch 12 + - minor 13 + - major 14 + 15 + permissions: 16 + contents: write 17 + 18 + jobs: 19 + release: 20 + name: Create tag and release 21 + runs-on: ubuntu-latest 22 + steps: 23 + - uses: actions/create-github-app-token@v1 24 + id: app-token 25 + with: 26 + app-id: ${{ vars.RIOTBYTE_BOT_APP_ID }} 27 + private-key: ${{ secrets.RIOTBYTE_BOT_PRIVATE_KEY }} 28 + 29 + - uses: actions/checkout@v4 30 + with: 31 + fetch-depth: 0 32 + 33 + - name: Determine next version 34 + id: version 35 + run: | 36 + LATEST=$(git tag --list --sort=-v:refname '[0-9]*.[0-9]*.[0-9]*' --merged HEAD | head -n1) 37 + 38 + if [ -z "$LATEST" ]; then 39 + LATEST="0.0.0" 40 + fi 41 + 42 + IFS='.' read -r MAJOR MINOR PATCH <<< "$LATEST" 43 + 44 + case "${{ inputs.bump }}" in 45 + major) MAJOR=$((MAJOR + 1)); MINOR=0; PATCH=0 ;; 46 + minor) MINOR=$((MINOR + 1)); PATCH=0 ;; 47 + patch) PATCH=$((PATCH + 1)) ;; 48 + esac 49 + 50 + NEXT="${MAJOR}.${MINOR}.${PATCH}" 51 + echo "previous=${LATEST}" >> "$GITHUB_OUTPUT" 52 + echo "next=${NEXT}" >> "$GITHUB_OUTPUT" 53 + echo "Bumping ${LATEST} → ${NEXT} (${{ inputs.bump }})" 54 + 55 + - name: Create tag and GitHub release 56 + env: 57 + GH_TOKEN: ${{ steps.app-token.outputs.token }} 58 + run: | 59 + gh release create "${{ steps.version.outputs.next }}" \ 60 + --target "${{ github.sha }}" \ 61 + --title "${{ steps.version.outputs.next }}" \ 62 + --generate-notes \ 63 + --notes-start-tag "${{ steps.version.outputs.previous }}"
+34
.github/workflows/deploy-client.yml
··· 1 + name: Deploy client to Cloudflare Pages 2 + 3 + on: 4 + push: 5 + tags: 6 + - "*.*.*" 7 + 8 + jobs: 9 + deploy: 10 + name: Build and deploy SPA 11 + runs-on: ubuntu-latest 12 + permissions: 13 + contents: read 14 + 15 + steps: 16 + - uses: actions/checkout@v4 17 + 18 + - uses: pnpm/action-setup@v4 19 + with: 20 + version: latest 21 + 22 + - uses: actions/setup-node@v4 23 + with: 24 + node-version: 24 25 + cache: pnpm 26 + 27 + - name: Install dependencies 28 + run: pnpm install --frozen-lockfile 29 + 30 + - name: Build and deploy 31 + env: 32 + CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} 33 + CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} 34 + run: ./ci/deploy-client.sh
+22
.github/workflows/release.yml
··· 1 + name: Build and publish Docker images 2 + 3 + on: 4 + push: 5 + tags: 6 + - "*.*.*" 7 + 8 + jobs: 9 + build-and-push: 10 + runs-on: ubuntu-latest 11 + permissions: 12 + contents: read 13 + packages: write 14 + 15 + steps: 16 + - uses: actions/checkout@v4 17 + 18 + - name: Build and push images 19 + env: 20 + VERSION: ${{ github.ref_name }} 21 + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 22 + run: ./ci/build-images.sh
+1
.npmrc
··· 1 1 link-workspace-packages=true 2 2 prefer-workspace-packages=true 3 + @riotbyte-com:registry=https://npm.pkg.github.com
+5 -4
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": "*", ··· 50 51 "@nestjs/platform-express": "^10.4.7", 51 52 "@prisma/adapter-pg": "^7.1.0", 52 53 "@prisma/client": "^7.1.0", 53 - "@riotbyte/nest-service-locator": "link:/Users/niels/Developer/riotbyte/nest-service-locator", 54 - "@riotbyte/project-q-core": "link:/Users/niels/Developer/riotbyte/project-q/packages/core", 55 - "@riotbyte/project-q-nestjs": "link:/Users/niels/Developer/riotbyte/project-q/packages/framework/nest", 56 - "@riotbyte/project-q-prisma": "link:/Users/niels/Developer/riotbyte/project-q/packages/transport/prisma", 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", 57 58 "@types/cookie-parser": "^1.4.10", 58 59 "@types/handlebars": "^4.0.40", 59 60 "@types/multer": "^2.0.0",
+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,
+2 -2
apps/server/src/modules/cv-template/graphql/cv-template.resolver.ts
··· 7 7 import { PaginationService, UuidFactoryService } from "@cv/system"; 8 8 import { UseGuards } from "@nestjs/common"; 9 9 import { Args, Mutation, Query, Resolver } from "@nestjs/graphql"; 10 - import type { MessageBus } from "@riotbyte/project-q-core"; 11 - import { InjectMessageBus } from "@riotbyte/project-q-nestjs"; 10 + import type { MessageBus } from "@riotbyte-com/project-q-core"; 11 + import { InjectMessageBus } from "@riotbyte-com/project-q-nestjs"; 12 12 import { CurrentUser } from "@/modules/current-user/current-user.decorator"; 13 13 import { RenderPdfMessage } from "@/modules/messenger/messages/render-pdf.message"; 14 14 import { CVRendererService } from "../cv-renderer.service";
+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 -1
apps/server/src/modules/messenger/logger.provider.ts
··· 1 1 import { Logger as NestLogger } from "@nestjs/common"; 2 - import type { Logger } from "@riotbyte/project-q-core"; 2 + import type { Logger } from "@riotbyte-com/project-q-core"; 3 3 4 4 export class NestProjectQLogger implements Logger { 5 5 private readonly logger = new NestLogger("ProjectQ");
+1 -1
apps/server/src/modules/messenger/messages/render-pdf.message.ts
··· 1 - import { defineZodMessage } from "@riotbyte/project-q-core"; 1 + import { defineZodMessage } from "@riotbyte-com/project-q-core"; 2 2 import { z } from "zod/v4"; 3 3 4 4 export const RenderPdfMessage = defineZodMessage(
+1 -1
apps/server/src/modules/messenger/messenger.module.ts
··· 1 1 import { Module } from "@nestjs/common"; 2 - import { LoggerProvider, MessengerModule } from "@riotbyte/project-q-nestjs"; 2 + import { LoggerProvider, MessengerModule } from "@riotbyte-com/project-q-nestjs"; 3 3 import { NestProjectQLogger } from "./logger.provider"; 4 4 import { PrismaTransportModule } from "./prisma-transport.module"; 5 5
+1 -1
apps/server/src/modules/messenger/prisma-transport.module.ts
··· 1 1 import { Module } from "@nestjs/common"; 2 2 import { DatabaseModule, PrismaService } from "@cv/system"; 3 - import { PrismaClientToken, PrismaTransportFactory } from "@riotbyte/project-q-prisma"; 3 + import { PrismaClientToken, PrismaTransportFactory } from "@riotbyte-com/project-q-prisma"; 4 4 5 5 @Module({ 6 6 imports: [DatabaseModule],
+5 -4
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", 18 19 "@nestjs/core": "^10.4.7", 19 20 "@nestjs/event-emitter": "^3.0.1", 20 - "@riotbyte/nest-service-locator": "link:/Users/niels/Developer/riotbyte/nest-service-locator", 21 - "@riotbyte/project-q-core": "link:/Users/niels/Developer/riotbyte/project-q/packages/core", 22 - "@riotbyte/project-q-nestjs": "link:/Users/niels/Developer/riotbyte/project-q/packages/framework/nest", 23 - "@riotbyte/project-q-prisma": "link:/Users/niels/Developer/riotbyte/project-q/packages/transport/prisma", 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", 24 25 "eventemitter2": "^6.4.9", 25 26 "nest-commander": "^3.16.0", 26 27 "playwright": "^1.52.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;
+7 -8
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 - import type { Envelope, Handler } from "@riotbyte/project-q-core"; 5 - import { HandlerTag } from "@riotbyte/project-q-nestjs"; 2 + import type { Envelope, Handler } from "@riotbyte-com/project-q-core"; 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 }
+1 -1
apps/worker/src/heartbeat/heartbeat.listener.ts
··· 3 3 WorkerRunningEvent, 4 4 WorkerStartedEvent, 5 5 WorkerStoppedEvent, 6 - } from "@riotbyte/project-q-core"; 6 + } from "@riotbyte-com/project-q-core"; 7 7 import { EventEmitter2 } from "eventemitter2"; 8 8 import type { HeartbeatStrategy } from "./heartbeat.strategy"; 9 9 import { HEARTBEAT_STRATEGIES } from "./heartbeat.strategy";
+1 -1
apps/worker/src/logger.provider.ts
··· 1 1 import { Logger as NestLogger } from "@nestjs/common"; 2 - import type { Logger } from "@riotbyte/project-q-core"; 2 + import type { Logger } from "@riotbyte-com/project-q-core"; 3 3 4 4 export class NestProjectQLogger implements Logger { 5 5 private readonly logger = new NestLogger("ProjectQ");
+14 -2
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 { LoggerProvider, MessengerModule } from "@riotbyte/project-q-nestjs"; 6 - import { PrismaClientToken, PrismaTransportFactory } from "@riotbyte/project-q-prisma"; 5 + import { FileStorageModule } from "@cv/file-storage"; 6 + import { LoggerProvider, MessengerModule } from "@riotbyte-com/project-q-nestjs"; 7 + import { PrismaClientToken, PrismaTransportFactory } from "@riotbyte-com/project-q-prisma"; 7 8 import type { WorkerConfig } from "./config"; 8 9 import { config } from "./config"; 9 10 import { RenderPdfHandler } from "./handlers/render-pdf.handler"; ··· 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 },
+53
ci/build-images.sh
··· 1 + #!/usr/bin/env bash 2 + set -euo pipefail 3 + 4 + # Builds and pushes server + worker Docker images to GHCR. 5 + # 6 + # Required env vars: 7 + # VERSION — semver tag (e.g. "1.2.3") 8 + # GITHUB_TOKEN — GHCR auth token (also used as build arg for npm auth) 9 + # REGISTRY — container registry (default: ghcr.io) 10 + # IMAGE_BASE — image name prefix (default: ghcr.io/riotbyte-com/cv-generator) 11 + 12 + REGISTRY="${REGISTRY:-ghcr.io}" 13 + IMAGE_BASE="${IMAGE_BASE:-${REGISTRY}/riotbyte-com/cv-generator}" 14 + 15 + : "${VERSION:?VERSION is required}" 16 + : "${GITHUB_TOKEN:?GITHUB_TOKEN is required}" 17 + 18 + echo "${GITHUB_TOKEN}" | docker login "${REGISTRY}" -u _ --password-stdin 19 + 20 + IFS='.' read -r MAJOR MINOR PATCH <<< "${VERSION}" 21 + 22 + build_and_push() { 23 + local name="$1" 24 + local dockerfile="$2" 25 + local image="${IMAGE_BASE}-${name}" 26 + 27 + local tags=( 28 + "${image}:${VERSION}" 29 + "${image}:${MAJOR}.${MINOR}" 30 + "${image}:latest" 31 + ) 32 + 33 + local tag_args=() 34 + for t in "${tags[@]}"; do 35 + tag_args+=("-t" "$t") 36 + done 37 + 38 + echo "Building ${image}:${VERSION} from ${dockerfile}..." 39 + docker build \ 40 + -f "${dockerfile}" \ 41 + --target production \ 42 + --build-arg "GITHUB_TOKEN=${GITHUB_TOKEN}" \ 43 + "${tag_args[@]}" \ 44 + . 45 + 46 + for t in "${tags[@]}"; do 47 + echo "Pushing ${t}..." 48 + docker push "$t" 49 + done 50 + } 51 + 52 + build_and_push server .docker/server.Dockerfile 53 + build_and_push worker .docker/worker.Dockerfile
+25
ci/deploy-client.sh
··· 1 + #!/usr/bin/env bash 2 + set -euo pipefail 3 + 4 + # Builds the client SPA and deploys to Cloudflare Pages. 5 + # 6 + # Required env vars: 7 + # CLOUDFLARE_API_TOKEN — Cloudflare API token with Pages permissions 8 + # CLOUDFLARE_ACCOUNT_ID — Cloudflare account ID 9 + # 10 + # Optional env vars: 11 + # VITE_SERVER_URL — API server URL (default: https://cv-generator-api.riotbyte.com) 12 + # PAGES_PROJECT — Cloudflare Pages project name (default: cv-generator) 13 + 14 + export VITE_SERVER_URL="${VITE_SERVER_URL:-https://cv-generator-api.riotbyte.com}" 15 + PAGES_PROJECT="${PAGES_PROJECT:-cv-generator}" 16 + 17 + : "${CLOUDFLARE_API_TOKEN:?CLOUDFLARE_API_TOKEN is required}" 18 + : "${CLOUDFLARE_ACCOUNT_ID:?CLOUDFLARE_ACCOUNT_ID is required}" 19 + 20 + echo "Building client with VITE_SERVER_URL=${VITE_SERVER_URL}..." 21 + pnpm --filter @cv/client build 22 + 23 + echo "Deploying to Cloudflare Pages project '${PAGES_PROJECT}'..." 24 + npx wrangler pages deploy apps/client/dist \ 25 + --project-name="${PAGES_PROJECT}"
-153
docker-compose.prod.yml
··· 1 - services: 2 - caddy: 3 - image: caddy:2-alpine 4 - environment: 5 - DOMAIN: ${DOMAIN} 6 - BASIC_AUTH_USER: ${BASIC_AUTH_USER:-admin} 7 - BASIC_AUTH_HASH: ${BASIC_AUTH_HASH} 8 - ports: 9 - - "80:80" 10 - - "443:443" 11 - volumes: 12 - - ./ci/Caddyfile:/etc/caddy/Caddyfile:ro 13 - - caddy-data:/data 14 - - caddy-config:/config 15 - depends_on: 16 - server: 17 - condition: service_healthy 18 - client: 19 - condition: service_healthy 20 - restart: unless-stopped 21 - 22 - db: 23 - image: postgres:16-alpine 24 - environment: 25 - POSTGRES_USER: ${POSTGRES_USER} 26 - POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} 27 - POSTGRES_DB: ${POSTGRES_DB} 28 - volumes: 29 - - db-data:/var/lib/postgresql/data 30 - healthcheck: 31 - test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"] 32 - interval: 10s 33 - timeout: 5s 34 - retries: 3 35 - restart: unless-stopped 36 - 37 - server: 38 - build: 39 - context: . 40 - dockerfile: .docker/server.Dockerfile 41 - target: production 42 - additional_contexts: 43 - project-q: ${PROJECT_Q_PATH} 44 - nest-service-locator: ${NEST_SERVICE_LOCATOR_PATH} 45 - environment: 46 - PORT: "3000" 47 - NODE_ENV: production 48 - DATABASE_URL: postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB} 49 - JWT_SECRET: ${JWT_SECRET} 50 - JWT_ACCESS_TOKEN_EXPIRY: ${JWT_ACCESS_TOKEN_EXPIRY:-15m} 51 - JWT_REFRESH_TOKEN_EXPIRY: ${JWT_REFRESH_TOKEN_EXPIRY:-7d} 52 - ENCRYPTION_KEY: ${ENCRYPTION_KEY} 53 - RESEND_API_KEY: ${RESEND_API_KEY:-} 54 - EMAIL_FROM_ADDRESS: ${EMAIL_FROM_ADDRESS:-} 55 - EMAIL_FROM_NAME: ${EMAIL_FROM_NAME:-CV Generator} 56 - CLIENT_URL: ${PUBLIC_URL} 57 - ALLOWED_ORIGINS: ${PUBLIC_URL} 58 - AI_PROVIDER: ${AI_PROVIDER:-anthropic} 59 - AI_TEMPERATURE: ${AI_TEMPERATURE:-0.1} 60 - AI_MAX_TOKENS: ${AI_MAX_TOKENS:-8192} 61 - AI_TIMEOUT: ${AI_TIMEOUT:-60000} 62 - ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY:-} 63 - ANTHROPIC_MODEL: ${ANTHROPIC_MODEL:-claude-sonnet-4-5-20250929} 64 - OPENAI_API_KEY: ${OPENAI_API_KEY:-} 65 - OPENAI_MODEL: ${OPENAI_MODEL:-gpt-4o-mini} 66 - PDF_OUTPUT_DIR: /app/pdf-output 67 - depends_on: 68 - db: 69 - condition: service_healthy 70 - volumes: 71 - - worker-output:/app/pdf-output:ro 72 - healthcheck: 73 - test: ["CMD", "curl", "-f", "http://localhost:3000/health"] 74 - interval: 15s 75 - timeout: 5s 76 - retries: 3 77 - start_period: 30s 78 - restart: unless-stopped 79 - 80 - client: 81 - build: 82 - context: . 83 - dockerfile: .docker/client.Dockerfile 84 - target: production 85 - args: 86 - VITE_SERVER_URL: ${PUBLIC_URL} 87 - VITE_DOCS_URL: https://docs.${DOMAIN} 88 - healthcheck: 89 - test: ["CMD", "curl", "-f", "http://localhost:80"] 90 - interval: 15s 91 - timeout: 5s 92 - retries: 3 93 - start_period: 5s 94 - restart: unless-stopped 95 - 96 - worker: 97 - build: 98 - context: . 99 - dockerfile: .docker/worker.Dockerfile 100 - target: production 101 - additional_contexts: 102 - project-q: ${PROJECT_Q_PATH} 103 - nest-service-locator: ${NEST_SERVICE_LOCATOR_PATH} 104 - environment: 105 - DATABASE_URL: postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB} 106 - QUEUE_SCHEMA: ${QUEUE_SCHEMA:-queue} 107 - QUEUE_NAME: ${QUEUE_NAME:-default} 108 - POLL_INTERVAL_MS: ${POLL_INTERVAL_MS:-2000} 109 - PDF_OUTPUT_DIR: /app/pdf-output 110 - PDF_TIMEOUT_MS: ${PDF_TIMEOUT_MS:-30000} 111 - HEARTBEAT_FILE_PATH: /tmp/worker-heartbeat 112 - HEARTBEAT_DB_INTERVAL_MS: ${HEARTBEAT_DB_INTERVAL_MS:-30000} 113 - CHROMIUM_ARGS: ${CHROMIUM_ARGS:---no-sandbox,--disable-dev-shm-usage,--disable-gpu,--single-process,--disable-extensions} 114 - depends_on: 115 - db: 116 - condition: service_healthy 117 - volumes: 118 - - worker-output:/app/pdf-output 119 - deploy: 120 - resources: 121 - limits: 122 - memory: 512M 123 - healthcheck: 124 - test: ["CMD-SHELL", "find /tmp/worker-heartbeat -mmin -1 | grep -q ."] 125 - interval: 30s 126 - timeout: 5s 127 - retries: 3 128 - start_period: 15s 129 - restart: unless-stopped 130 - 131 - docs: 132 - profiles: 133 - - docs 134 - build: 135 - context: . 136 - dockerfile: .docker/docs.Dockerfile 137 - target: production 138 - args: 139 - VITE_CLIENT_URL: ${PUBLIC_URL} 140 - VITE_SERVER_URL: ${PUBLIC_URL} 141 - healthcheck: 142 - test: ["CMD", "curl", "-f", "http://localhost:80"] 143 - interval: 15s 144 - timeout: 5s 145 - retries: 3 146 - start_period: 5s 147 - restart: unless-stopped 148 - 149 - volumes: 150 - db-data: 151 - worker-output: 152 - caddy-data: 153 - caddy-config:
+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 + }
+1307 -24
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 ··· 281 284 '@prisma/client': 282 285 specifier: ^7.1.0 283 286 version: 7.2.0(prisma@7.2.0(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(typescript@5.9.3) 284 - '@riotbyte/nest-service-locator': 285 - specifier: link:/Users/niels/Developer/riotbyte/nest-service-locator 286 - version: link:../../../../riotbyte/nest-service-locator 287 - '@riotbyte/project-q-core': 288 - specifier: link:/Users/niels/Developer/riotbyte/project-q/packages/core 289 - version: link:../../../../riotbyte/project-q/packages/core 290 - '@riotbyte/project-q-nestjs': 291 - specifier: link:/Users/niels/Developer/riotbyte/project-q/packages/framework/nest 292 - version: link:../../../../riotbyte/project-q/packages/framework/nest 293 - '@riotbyte/project-q-prisma': 294 - specifier: link:/Users/niels/Developer/riotbyte/project-q/packages/transport/prisma 295 - version: link:../../../../riotbyte/project-q/packages/transport/prisma 287 + '@riotbyte-com/nest-service-locator': 288 + specifier: 0.3.0-rc.4 289 + version: 0.3.0-rc.4(@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/core@10.4.20) 290 + '@riotbyte-com/project-q-core': 291 + specifier: 1.0.19-rc.3 292 + version: 1.0.19-rc.3 293 + '@riotbyte-com/project-q-nestjs': 294 + specifier: 1.0.19-rc.3 295 + version: 1.0.19-rc.3(@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/core@10.4.20)(@nestjs/event-emitter@3.0.1(@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/core@10.4.20))(@riotbyte-com/nest-service-locator@0.3.0-rc.4(@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/core@10.4.20))(eventemitter2@6.4.9)(nest-commander@3.16.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))(@nestjs/core@10.4.20)(@types/inquirer@8.2.12)(typescript@5.9.3)) 296 + '@riotbyte-com/project-q-prisma': 297 + specifier: 1.0.19-rc.3 298 + version: 1.0.19-rc.3(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@riotbyte-com/project-q-core@1.0.19-rc.3)(@riotbyte-com/project-q-nestjs@1.0.19-rc.3(@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/core@10.4.20)(@nestjs/event-emitter@3.0.1(@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/core@10.4.20))(@riotbyte-com/nest-service-locator@0.3.0-rc.4(@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/core@10.4.20))(eventemitter2@6.4.9)(nest-commander@3.16.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))(@nestjs/core@10.4.20)(@types/inquirer@8.2.12)(typescript@5.9.3))) 296 299 '@types/cookie-parser': 297 300 specifier: ^1.4.10 298 301 version: 1.4.10(@types/express@5.0.6) ··· 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 ··· 483 489 '@nestjs/event-emitter': 484 490 specifier: ^3.0.1 485 491 version: 3.0.1(@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/core@10.4.20) 486 - '@riotbyte/nest-service-locator': 487 - specifier: link:/Users/niels/Developer/riotbyte/nest-service-locator 488 - version: link:../../../../riotbyte/nest-service-locator 489 - '@riotbyte/project-q-core': 490 - specifier: link:/Users/niels/Developer/riotbyte/project-q/packages/core 491 - version: link:../../../../riotbyte/project-q/packages/core 492 - '@riotbyte/project-q-nestjs': 493 - specifier: link:/Users/niels/Developer/riotbyte/project-q/packages/framework/nest 494 - version: link:../../../../riotbyte/project-q/packages/framework/nest 495 - '@riotbyte/project-q-prisma': 496 - specifier: link:/Users/niels/Developer/riotbyte/project-q/packages/transport/prisma 497 - version: link:../../../../riotbyte/project-q/packages/transport/prisma 492 + '@riotbyte-com/nest-service-locator': 493 + specifier: 0.3.0-rc.4 494 + version: 0.3.0-rc.4(@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/core@10.4.20) 495 + '@riotbyte-com/project-q-core': 496 + specifier: 1.0.19-rc.3 497 + version: 1.0.19-rc.3 498 + '@riotbyte-com/project-q-nestjs': 499 + specifier: 1.0.19-rc.3 500 + version: 1.0.19-rc.3(@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/core@10.4.20)(@nestjs/event-emitter@3.0.1(@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/core@10.4.20))(@riotbyte-com/nest-service-locator@0.3.0-rc.4(@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/core@10.4.20))(eventemitter2@6.4.9)(nest-commander@3.16.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))(@nestjs/core@10.4.20)(@types/inquirer@8.2.12)(typescript@5.9.3)) 501 + '@riotbyte-com/project-q-prisma': 502 + specifier: 1.0.19-rc.3 503 + version: 1.0.19-rc.3(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@riotbyte-com/project-q-core@1.0.19-rc.3)(@riotbyte-com/project-q-nestjs@1.0.19-rc.3(@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/core@10.4.20)(@nestjs/event-emitter@3.0.1(@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/core@10.4.20))(@riotbyte-com/nest-service-locator@0.3.0-rc.4(@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/core@10.4.20))(eventemitter2@6.4.9)(nest-commander@3.16.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))(@nestjs/core@10.4.20)(@types/inquirer@8.2.12)(typescript@5.9.3))) 498 504 eventemitter2: 499 505 specifier: ^6.4.9 500 506 version: 6.4.9 ··· 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==} ··· 3010 3203 '@repeaterjs/repeater@3.0.6': 3011 3204 resolution: {integrity: sha512-Javneu5lsuhwNCryN+pXH93VPQ8g0dBX7wItHFgYiwQmzE1sVdg5tWHiOgHywzL2W21XQopa7IwIEnNbmeUJYA==} 3012 3205 3206 + '@riotbyte-com/nest-service-locator@0.3.0-rc.4': 3207 + resolution: {integrity: sha512-mQKzGAHikszzeILl2fns6jNK7qEWGV0UGHegLH5yF9/88UFyMm8lFRQDTA2oDQaass1T6JHPB+dVDSijceoWxA==, tarball: https://npm.pkg.github.com/download/@riotbyte-com/nest-service-locator/0.3.0-rc.4/6042137a64cf014f73995d30ce4035e4c33211b8} 3208 + engines: {node: '>= 20.0.0'} 3209 + peerDependencies: 3210 + '@nestjs/common': ^10.0.0 || ^11.0.0 3211 + '@nestjs/core': ^10.0.0 || ^11.0.0 3212 + 3213 + '@riotbyte-com/project-q-core@1.0.19-rc.3': 3214 + resolution: {integrity: sha512-/E+o3IMCWjIMS6O81RZFmpww5KJDxwiaj0LcTrs9gwi2hldJ+7ZR1nBXVlBxVB8b5mIshkp5AKgR26Re/NRM/Q==, tarball: https://npm.pkg.github.com/download/@riotbyte-com/project-q-core/1.0.19-rc.3/b78ac8b11c804150fdc1dcc0d635340e07143e8e} 3215 + 3216 + '@riotbyte-com/project-q-nestjs@1.0.19-rc.3': 3217 + resolution: {integrity: sha512-FwvF/6gHPTcSijzajcqNPeadhVUHMJf0el2Py4CBcnw8p/KihbF0LNu330UUVYJ6Cs/w4HsAUVrOkR+f2fNJmw==, tarball: https://npm.pkg.github.com/download/@riotbyte-com/project-q-nestjs/1.0.19-rc.3/85526283b3b35e70c0b7ec767f524cf624db8aec} 3218 + peerDependencies: 3219 + '@nestjs/common': ^10.0 || ^11.0 3220 + '@nestjs/core': ^10.0 || ^11.0 3221 + '@nestjs/event-emitter': ^3.0 3222 + '@riotbyte-com/nest-service-locator': '>=0.3.0-rc.3' 3223 + eventemitter2: ^6.0 3224 + nest-commander: ^3.0 3225 + 3226 + '@riotbyte-com/project-q-prisma@1.0.19-rc.3': 3227 + resolution: {integrity: sha512-VKNL3J5Abb0DIgbNXDdUyz+Gxiy5bFhfPy1LhC5gpjBlMk09Ud0n0Op1+2Y4wv75FncRrQDyt2rfSN0HNBwXJQ==, tarball: https://npm.pkg.github.com/download/@riotbyte-com/project-q-prisma/1.0.19-rc.3/b729eca9b298d56612e24ee6a6f43bfdac105116} 3228 + engines: {node: '>=18'} 3229 + peerDependencies: 3230 + '@nestjs/common': ^9.0 || ^10.0 || ^11.0 3231 + '@riotbyte-com/project-q-core': 1.0.19-rc.3 3232 + '@riotbyte-com/project-q-nestjs': 1.0.19-rc.3 3233 + 3013 3234 '@rolldown/pluginutils@1.0.0-beta.27': 3014 3235 resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==} 3015 3236 ··· 3176 3397 '@sinonjs/fake-timers@10.3.0': 3177 3398 resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} 3178 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 + 3179 3616 '@stablelib/base64@1.0.1': 3180 3617 resolution: {integrity: sha512-1bnPQqSxSuc3Ii6MhBysoWCg58j97aUjuCSZrGSmDxNqtytIi0k8utUenAwTZN4V5mXXYGsVUI9zeBqy+jBOSQ==} 3181 3618 ··· 4008 4445 body-parser@1.20.4: 4009 4446 resolution: {integrity: sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==} 4010 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==} 4011 4451 4012 4452 brace-expansion@1.1.12: 4013 4453 resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} ··· 4905 5345 fast-sha256@1.3.0: 4906 5346 resolution: {integrity: sha512-n11RGP/lrWEFI/bWdygLxhI+pVeo1ZYIVwvvPkW7azl/rOy+F3HYRZ2K5zeE9mmkhQppyv9sQFx0JM9UabnpPQ==} 4907 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 5354 + 4908 5355 fastq@1.20.1: 4909 5356 resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} 4910 5357 ··· 6856 7303 resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 6857 7304 engines: {node: '>=8'} 6858 7305 7306 + path-expression-matcher@1.1.3: 7307 + resolution: {integrity: sha512-qdVgY8KXmVdJZRSS1JdEPOKPdTiEK/pi0RkcT2sw1RhXxohdujUlJFPuS1TSkevZ9vzd3ZlL7ULl1MHGTApKzQ==} 7308 + engines: {node: '>=14.0.0'} 7309 + 6859 7310 path-is-absolute@1.0.1: 6860 7311 resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 6861 7312 engines: {node: '>=0.10.0'} ··· 7746 8197 resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 7747 8198 engines: {node: '>=8'} 7748 8199 8200 + strnum@2.2.1: 8201 + resolution: {integrity: sha512-BwRvNd5/QoAtyW1na1y1LsJGQNvRlkde6Q/ipqqEaivoMdV+B1OMOTVdwR+N/cwVUcIt9PYyHmV8HyexCZSupg==} 8202 + 7749 8203 strtok3@10.3.4: 7750 8204 resolution: {integrity: sha512-KIy5nylvC5le1OdaaoCJ07L+8iQzJHGH6pWDuzS+d07Cu7n1MZ2x26P8ZKIWfbK02+XIL8Mp4RkWeqdUCrDMfg==} 7751 8205 engines: {node: '>=18'} ··· 8777 9231 transitivePeerDependencies: 8778 9232 - encoding 8779 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 + 8780 9678 '@babel/code-frame@7.27.1': 8781 9679 dependencies: 8782 9680 '@babel/helper-validator-identifier': 7.28.5 ··· 11164 12062 11165 12063 '@repeaterjs/repeater@3.0.6': {} 11166 12064 12065 + '@riotbyte-com/nest-service-locator@0.3.0-rc.4(@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/core@10.4.20)': 12066 + dependencies: 12067 + '@nestjs/common': 10.4.20(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2) 12068 + '@nestjs/core': 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) 12069 + 12070 + '@riotbyte-com/project-q-core@1.0.19-rc.3': 12071 + dependencies: 12072 + uuid: 11.0.3 12073 + zod: 4.3.6 12074 + 12075 + '@riotbyte-com/project-q-nestjs@1.0.19-rc.3(@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/core@10.4.20)(@nestjs/event-emitter@3.0.1(@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/core@10.4.20))(@riotbyte-com/nest-service-locator@0.3.0-rc.4(@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/core@10.4.20))(eventemitter2@6.4.9)(nest-commander@3.16.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))(@nestjs/core@10.4.20)(@types/inquirer@8.2.12)(typescript@5.9.3))': 12076 + dependencies: 12077 + '@nestjs/common': 10.4.20(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2) 12078 + '@nestjs/core': 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) 12079 + '@nestjs/event-emitter': 3.0.1(@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/core@10.4.20) 12080 + '@riotbyte-com/nest-service-locator': 0.3.0-rc.4(@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/core@10.4.20) 12081 + '@riotbyte-com/project-q-core': 1.0.19-rc.3 12082 + eventemitter2: 6.4.9 12083 + nest-commander: 3.16.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))(@nestjs/core@10.4.20)(@types/inquirer@8.2.12)(typescript@5.9.3) 12084 + uuid: 11.0.3 12085 + zod: 4.3.6 12086 + 12087 + '@riotbyte-com/project-q-prisma@1.0.19-rc.3(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@riotbyte-com/project-q-core@1.0.19-rc.3)(@riotbyte-com/project-q-nestjs@1.0.19-rc.3(@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/core@10.4.20)(@nestjs/event-emitter@3.0.1(@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/core@10.4.20))(@riotbyte-com/nest-service-locator@0.3.0-rc.4(@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/core@10.4.20))(eventemitter2@6.4.9)(nest-commander@3.16.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))(@nestjs/core@10.4.20)(@types/inquirer@8.2.12)(typescript@5.9.3)))': 12088 + dependencies: 12089 + '@nestjs/common': 10.4.20(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2) 12090 + '@riotbyte-com/project-q-core': 1.0.19-rc.3 12091 + '@riotbyte-com/project-q-nestjs': 1.0.19-rc.3(@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/core@10.4.20)(@nestjs/event-emitter@3.0.1(@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/core@10.4.20))(@riotbyte-com/nest-service-locator@0.3.0-rc.4(@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/core@10.4.20))(eventemitter2@6.4.9)(nest-commander@3.16.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))(@nestjs/core@10.4.20)(@types/inquirer@8.2.12)(typescript@5.9.3)) 12092 + uuid: 11.0.3 12093 + zod: 4.3.6 12094 + 11167 12095 '@rolldown/pluginutils@1.0.0-beta.27': {} 11168 12096 11169 12097 '@rollup/pluginutils@5.3.0(rollup@4.54.0)': ··· 11282 12210 dependencies: 11283 12211 '@sinonjs/commons': 3.0.1 11284 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 + 11285 12552 '@stablelib/base64@1.0.1': {} 11286 12553 11287 12554 '@standard-schema/spec@1.1.0': {} ··· 12257 13524 transitivePeerDependencies: 12258 13525 - supports-color 12259 13526 13527 + bowser@2.14.1: {} 13528 + 12260 13529 brace-expansion@1.1.12: 12261 13530 dependencies: 12262 13531 balanced-match: 1.0.2 ··· 13208 14477 13209 14478 fast-sha256@1.3.0: {} 13210 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 + 13211 14490 fastq@1.20.1: 13212 14491 dependencies: 13213 14492 reusify: 1.1.0 ··· 15858 17137 15859 17138 path-exists@4.0.0: {} 15860 17139 17140 + path-expression-matcher@1.1.3: {} 17141 + 15861 17142 path-is-absolute@1.0.1: {} 15862 17143 15863 17144 path-key@3.1.1: {} ··· 16797 18078 strip-json-comments@2.0.1: {} 16798 18079 16799 18080 strip-json-comments@3.1.1: {} 18081 + 18082 + strnum@2.2.1: {} 16800 18083 16801 18084 strtok3@10.3.4: 16802 18085 dependencies: