@nest-arch/tui 0.5.0 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/README.md +31 -0
  2. package/dist/cli.js +2 -1
  3. package/dist/{constants-DX5wiqrq.js → constants-CUTbfu9C.js} +1 -1
  4. package/dist/index.js +6 -417
  5. package/dist/nonInteractive-C1KZ0b_6.js +5 -0
  6. package/dist/nonInteractiveOptions-CIaoLAWg.js +24 -0
  7. package/dist/projectGeneratorService-CeWJK-HA.js +420 -0
  8. package/dist/projectName-CcE90t2V.js +1 -0
  9. package/dist/templates/base/.env.example.hbs +23 -0
  10. package/dist/templates/base/prisma.config.ts.hbs +6 -6
  11. package/dist/templates/base/src/app.controller.spec.ts.hbs +6 -0
  12. package/dist/templates/base/src/app.module.ts.hbs +1 -1
  13. package/dist/templates/base/src/database/adapters/interfaces/db-adapter.interface.ts.hbs +5 -5
  14. package/dist/templates/base/src/database/adapters/mongo/raw-mongo.adapter.ts.hbs +2 -2
  15. package/dist/templates/base/src/database/adapters/mongo/typeorm-mongo.adapter.ts.hbs +27 -0
  16. package/dist/templates/base/src/database/db.module.ts.hbs +22 -16
  17. package/dist/templates/base/src/database/db.service.ts.hbs +7 -2
  18. package/dist/templates/base/src/database/entities/todo.entity.ts.hbs +15 -3
  19. package/dist/templates/base/src/database/orm/drizzle/schema.ts.hbs +38 -14
  20. package/dist/templates/base/src/database/orm/typeorm/data-source.ts.hbs +12 -6
  21. package/dist/templates/base/src/libs/middlewares/rate-limit.trpc.middleware.ts.hbs +2 -1
  22. package/dist/templates/base/test/app.e2e-spec.ts.hbs +14 -10
  23. package/dist/templates/extras/docker/Dockerfile.hbs +2 -2
  24. package/dist/templates/extras/health/src/health/health.controller.ts.hbs +5 -0
  25. package/dist/templates/feature/rest/todo-example/src/api/todo/todo.router.ts.hbs +4 -4
  26. package/dist/templates/feature/rest/todo-example/src/api/todo/todo.service.ts.hbs +135 -11
  27. package/dist/templates/single-project/architecture/nest-microservice/.env.hbs +24 -1
  28. package/dist/templates/single-project/architecture/nest-microservice/proto/app.proto.hbs +13 -0
  29. package/dist/templates/single-project/architecture/nest-microservice/src/app.controller.ts.hbs +24 -0
  30. package/dist/templates/single-project/architecture/nest-microservice/src/app.module.ts.hbs +33 -0
  31. package/dist/templates/single-project/architecture/nest-microservice/src/app.service.ts.hbs +16 -4
  32. package/dist/templates/single-project/architecture/nest-microservice/src/main.ts.hbs +25 -6
  33. package/dist/templates/single-project/architecture/nest-microservice/test/microservice.e2e-spec.ts.hbs +7 -122
  34. package/dist/templates/single-project/shared/config/env.ts.hbs +14 -14
  35. package/package.json +2 -1
@@ -0,0 +1,420 @@
1
+ var bi=Object.defineProperty;var c=(e,t)=>bi(e,"name",{value:t,configurable:!0});import{existsSync as ki}from"node:fs";import{homedir as vi}from"node:os";import k,{isAbsolute as Wt,join as E}from"node:path";import{exec as Ve,execFile as Kt,spawn as ke}from"node:child_process";import{promisify as ie}from"node:util";import M,{readFile as N,mkdir as Yt,writeFile as U,access as qi}from"node:fs/promises";import D from"handlebars";import{Project as Xt,Scope as xi}from"ts-morph";import{createHash as es}from"node:crypto";import{once as J}from"node:events";import{createEnv as zi}from"@t3-oss/env-nextjs";import{z as te}from"zod";import{CLI_VERSION as Si}from"./constants-CUTbfu9C.js";const ts=zi({emptyStringAsUndefined:!0,runtimeEnv:process.env,server:{APP_MAX_WIDTH:te.string().pipe(te.coerce.number()).default(95),NEST_ARCH_BETA_MODE:te.enum(["true","false"]).default("false").transform(e=>e==="true"),NEST_ARCH_SCHEMA_URL:te.string().default("./schema.json"),NEST_ARCH_VERSION:te.string().default("0.0.1"),NODE_ENV:te.enum(["development","production","test"]).default("development")}});var wi=Object.defineProperty,p=c((e,t)=>wi(e,"name",{value:t,configurable:!0}),"p");const Pi=[{label:"NestJS Best Practices",name:"nestjs-best-practices",repo:"kadajett/agent-nestjs-skills",when:p(()=>!0,"when")},{label:"Prisma CLI",name:"prisma-cli",repo:"prisma/skills",when:p(e=>e.orm.includes("prisma"),"when")},{label:"Prisma Client API",name:"prisma-client-api",repo:"prisma/skills",when:p(e=>e.orm.includes("prisma"),"when")},{label:"Prisma Database Setup",name:"prisma-database-setup",repo:"prisma/skills",when:p(e=>e.orm.includes("prisma"),"when")},{label:"Prisma NestJS Patterns",name:"prisma-nestjs-patterns",repo:"davidcastagnetoa/skills",when:p(e=>e.orm.includes("prisma"),"when")},{label:"NestJS TypeORM Integration",name:"nestjs-typeorm-integration",repo:"vong3432/vibemark",when:p(e=>e.orm.includes("typeorm"),"when")},{label:"Better Auth Best Practices",name:"better-auth-best-practices",repo:"better-auth/skills",when:p(e=>e.auth==="better-auth"||e.auth==="better-auth:stateless","when")},{label:"JWT Security",name:"jwt-security",repo:"mindrally/skills",when:p(e=>e.auth!=="none","when")},{label:"Turborepo",name:"turborepo",repo:"vercel/turborepo",when:p(e=>e.projectType==="monorepo","when")},{label:"Ultracite",name:"ultracite",repo:"haydenbleasel/ultracite",when:p(e=>e.addons.includes("ultracite"),"when")}];function ss(e){return Pi.filter(t=>t.when(e))}c(ss,"ct"),p(ss,"resolveSkills");const Ei=ie(Ve);function rs(e,t){if(!/^[a-z0-9-]+\/[a-z0-9-]+$/iu.test(e))throw new Error(`Invalid skill repository: ${e}`);if(!/^[a-z0-9-]+$/iu.test(t))throw new Error(`Invalid skill name: ${t}`);return`npx --yes skills add https://github.com/${e} --skill ${t} --agent codex --copy --yes --json`}c(rs,"Pr"),p(rs,"buildCommand");async function as(e,t){const s={failed:[],installed:[]};if(!t.addons.includes("agent-skills"))return s;const r=ss(t);for(const a of r)try{await Ei(rs(a.repo,a.name),{cwd:e,maxBuffer:4*1024*1024,timeout:6e4,windowsHide:!0}),s.installed.push(a.name)}catch(i){const o=i instanceof Error?i.message:"Unknown error";s.failed.push({error:o,name:a.name})}return s}c(as,"dt"),p(as,"installAgentSkills");class Zt{static{c(this,"$e")}static{p(this,"TemplateEngine")}cache={};cacheEnabled;templatesDir;constructor(t,s={}){this.templatesDir=t,this.cacheEnabled=s.cache??!0,Zt.registerHelpers(s.helpers)}static registerHelpers(t){if(D.registerHelper("eq",(s,r)=>s===r),D.registerHelper("ne",(s,r)=>s!==r),D.registerHelper("not",s=>!s),D.registerHelper("lt",(s,r)=>s<r),D.registerHelper("gt",(s,r)=>s>r),D.registerHelper("and",(...s)=>(s.pop(),s.every(Boolean))),D.registerHelper("or",(...s)=>(s.pop(),s.some(Boolean))),D.registerHelper("includes",(s,r)=>Array.isArray(s)?s.includes(r):typeof s=="string"?s.includes(String(r)):!1),D.registerHelper("uppercase",s=>s?.toUpperCase?.()),D.registerHelper("lowercase",s=>s?.toLowerCase?.()),D.registerHelper("capitalize",s=>s?s.charAt(0).toUpperCase()+s.slice(1):""),D.registerHelper("camelCase",s=>s?.split("-").map((r,a)=>a===0?r.toLowerCase():r.charAt(0).toUpperCase()+r.slice(1).toLowerCase()).join("")),D.registerHelper("pascalCase",s=>s?.split("-").map(r=>r.charAt(0).toUpperCase()+r.slice(1).toLowerCase()).join("")),D.registerHelper("snakeCase",s=>s?.replaceAll(/([A-Z])/gu,"_$1").toLowerCase()),t)for(const[s,r]of Object.entries(t))D.registerHelper(s,r)}async loadTemplate(t){const s=t;if(this.cacheEnabled&&this.cache[s])return this.cache[s];const r=k.join(this.templatesDir,t),a=await M.readFile(r,"utf-8"),i=D.compile(a);return this.cacheEnabled&&(this.cache[s]=i),i}async renderTemplate(t,s){return(await this.loadTemplate(t))(s.context)}async renderToFile(t,s,r){return{content:await this.renderTemplate(t,r),filePath:s,isBinary:!1}}clearCache(){this.cache={}}getCacheStats(){return{enabled:this.cacheEnabled,size:Object.keys(this.cache).length}}}class Ti{static{c(this,"ut")}static{p(this,"FileWriter")}baseDir;writtenFiles=new Set;constructor(t){this.baseDir=t}getBaseDir(){return this.baseDir}async writeFile(t,s={}){const r=k.join(this.baseDir,t.filePath),a=k.dirname(r);try{await M.mkdir(a,{recursive:!0});let i=!1;try{await M.stat(r),i=!0}catch{i=!1}if(i&&!s.overwrite)return{backed:!1,error:"File already exists and overwrite is disabled",filePath:r,written:!1};let o=!1;if(i&&s.createBackups&&!s.dryRun){const n=`${r}.bak`;await M.copyFile(r,n),o=!0}return s.dryRun||(await M.writeFile(r,t.content,"utf-8"),this.writtenFiles.add(r)),{backed:o,filePath:r,written:!s.dryRun}}catch(i){return{backed:!1,error:i instanceof Error?i.message:"Unknown error",filePath:r,written:!1}}}writeFiles(t,s={}){return Promise.all(t.map(r=>this.writeFile(r,s)))}async fileExists(t){const s=k.join(this.baseDir,t);try{return await M.stat(s),!0}catch{return!1}}getWrittenFiles(){return[...this.writtenFiles]}clearWrittenFiles(){this.writtenFiles.clear()}async copyDirectory(t,s){const r=[],a=k.join(this.baseDir,t),i=k.join(this.baseDir,s);await M.mkdir(i,{recursive:!0});const o=await M.readdir(a,{withFileTypes:!0});for(const n of o){const l=k.join(a,n.name),d=k.join(i,n.name);if(n.isDirectory()){const u=await this.copyDirectory(k.relative(this.baseDir,l),k.relative(this.baseDir,d));r.push(...u)}else{const u=await M.readFile(l,"utf-8");await M.writeFile(d,u,"utf-8"),r.push(d),this.writtenFiles.add(d)}}return r}}const ve=ie(Kt);async function Je(e){await ve("git",["init"],{cwd:e})}c(Je,"De"),p(Je,"gitInit");async function qe(e){await ve("git",["add","."],{cwd:e})}c(qe,"he"),p(qe,"gitAddAll");async function xe(e,t){await ve("git",["commit","--no-verify","-m",t],{cwd:e})}c(xe,"fe"),p(xe,"gitCommit");async function is(e){try{const{stdout:t}=await ve("git",["diff","--cached","--name-only"],{cwd:e});return t.trim().length>0}catch{return!1}}c(is,"mt"),p(is,"gitHasStagedChanges");async function Ze(e){try{return await qi(E(e,".git")),!0}catch{return!1}}c(Ze,"Le"),p(Ze,"gitDirectoryExists");class Sd{static{c(this,"Tr")}static{p(this,"GitInitializer")}baseDir;constructor(t){this.baseDir=t}async initGit(){try{return await Ze(this.baseDir)?{success:!0}:(await Je(this.baseDir),await qe(this.baseDir),await xe(this.baseDir,"init"),{success:!0})}catch(t){return{error:t instanceof Error?t.message:String(t),success:!1}}}}const os=ie(Ve),ji={bun:["Bun is not installed or not found in your PATH.",""," Install Bun: https://bun.sh",""," Then restart your terminal and try again."].join(`
2
+ `),npm:["npm is not installed or not found in your PATH.",""," Install npm: https://nodejs.org/en/download",""," Then restart your terminal and try again."].join(`
3
+ `),pnpm:["pnpm is not installed or not found in your PATH.",""," Install pnpm: npm install -g pnpm"," Or enable Corepack: corepack enable && corepack prepare pnpm@latest --activate",""," Then restart your terminal and try again."].join(`
4
+ `),yarn:["Yarn is not installed or not found in your PATH.",""," Install Yarn: npm install -g yarn",""," Then restart your terminal and try again."].join(`
5
+ `)};function ns(e){switch(e){case"pnpm":return"pnpm run format";case"npm":return"npm run format";case"yarn":return"yarn run format";case"bun":return"bun run format";default:{const t=e;throw new Error(`Unsupported package manager: ${t}`)}}}c(ns,"Rr"),p(ns,"getFormatterCommand");function ps(e){return e instanceof Error&&"code"in e&&(e.code==="ENOENT"||e.code==="EINVAL")}c(ps,"Ar"),p(ps,"isPackageManagerNotFoundError");async function ls(e,t){const s=ns(e);try{return await os(s,{cwd:t,timeout:12e4}),await os(s,{cwd:t,timeout:12e4}),{success:!0}}catch(r){if(ps(r))return{error:ji[e],success:!1};const a=[r instanceof Error?r.message:String(r)];return r&&typeof r=="object"&&("stdout"in r&&typeof r.stdout=="string"&&a.push(r.stdout),"stderr"in r&&typeof r.stderr=="string"&&a.push(r.stderr)),{error:a.join(`
6
+ `),success:!1}}}c(ls,"ft"),p(ls,"runFormatter");const oe={name:"@nest-arch/dependencies-reference",version:"0.0.0",description:"Single source of truth for dependency versions used across all generated templates. Do not install this package.",private:!0,catalog:{"@types/node":"^24.0.0",dotenv:"^17.2.2",typescript:"^6.0.2","typescript-7":"^7.0.0",zod:"^4.4.3"},dependencies:{"@apollo/server":"^5.5.1","@as-integrations/express5":"^1.1.2","@as-integrations/fastify":"^3.1.0","@better-auth/drizzle-adapter":"^1.2.0","@fastify/static":"^10.1.5","@grpc/grpc-js":"^1.12.0","@grpc/proto-loader":"^0.7.13","@nats-io/transport-node":"^3.4.0","@nestjs/apollo":"^14.0.0","@nestjs/common":"^12.0.1","@nestjs/core":"^12.0.1","@nestjs/graphql":"^14.0.0","@nestjs/jwt":"^12.0.0","@nestjs/microservices":"^12.0.1","@nestjs/passport":"^12.0.0","@nestjs/platform-express":"^12.0.1","@nestjs/platform-fastify":"^12.0.1","@nestjs/swagger":"^12.0.1","@nestjs/terminus":"^12.0.0","@nestjs/throttler":"6.5.0","@nestjs/typeorm":"12.0.1","@prisma/adapter-better-sqlite3":"^7.10.0","@prisma/adapter-mariadb":"^7.10.0","@prisma/adapter-mssql":"^7.10.0","@prisma/adapter-pg":"^7.10.0","@prisma/adapter-ppg":"^7.10.0","@prisma/client":"^7.10.0","@prisma/orm-mongo":"^8.0.0-rc.8","@prisma/orm-postgres":"^8.0.0-rc.8","@scalar/nestjs-api-reference":"^1.2.17","@t3-oss/env-core":"^0.13.11","@thallesp/nestjs-better-auth":"^2.8.0","@trpc/client":"^11.18.0","@trpc/openapi":"^11.18.0-alpha","@trpc/server":"^11.18.0","amqp-connection-manager":"^5.0.0",amqplib:"^0.10.5",bcrypt:"^6.0.0","better-auth":"^1.7.5","better-sqlite3":"^12.11.1",dotenv:"^17.2.2","drizzle-graphql":"^0.8.5","drizzle-orm":"^0.45.2","drizzle-orm-mssql":"1.0.0-rc.4",graphql:"^17.0.2","graphql-scalars":"^2.0.0",ioredis:"^5.6.0","jwks-rsa":"^4.1.0",kafkajs:"^2.2.4",mongodb:"^6.13.0",mqtt:"^5.10.0",mssql:"^11.0.1",mysql2:"^3.12.0",nats:"^2.28.0","nestjs-trpc":"^2.13.0","nestjs-zod":"^5.5.0",passport:"^0.7.0","passport-jwt":"^4.0.1","passport-local":"^1.0.0",pg:"^8.21.0","reflect-metadata":"^0.2.2",rxjs:"^7.8.1","temporal-polyfill":"^1.0.4",typeorm:"^1.1.1","typeorm-relations-graphql":"^3.0.0",zod:"^4.5.4"},devDependencies:{"@nestjs/cli":"^12.0.0","@nestjs/mau":"^0.2.6","@nestjs/schematics":"^12.0.0","@nestjs/testing":"^12.0.1","@types/amqplib":"^0.10.6","@types/bcrypt":"^5.0.2","@types/better-sqlite3":"^7.6.13","@types/express":"^5.0.0","@types/mssql":"^9.1.8","@types/node":"^24.0.0","@types/passport-jwt":"^4.0.1","@types/passport-local":"^1.0.38","@types/pg":"^8.11.11","@types/supertest":"^7.0.0","@vitest/coverage-v8":"^4.1.2","drizzle-kit":"^0.31.10","drizzle-kit-mssql":"1.0.0-rc.4",husky:"^9.1.7",oxfmt:"^0.66.0",oxlint:"^1.81.0",prettier:"^3.4.2",prisma:"^7.10.0","source-map-support":"^0.5.21",supertest:"^7.0.0","tsc-watch":"^7.2.1",tsx:"^4.22.3",turbo:"^2.8.12",typescript:"^6.0.2","typescript-7":"^7.0.0",ultracite:"7.9.4",vitest:"^4.1.10"}};function cs(e,t){const s=e.addons.includes("ultracite"),r={};return e.extras.includes("swagger")||Object.assign(r,{"@darraghor/nestjs-typed/api-method-should-specify-api-operation":"off","@darraghor/nestjs-typed/api-method-should-specify-api-response":"off","@darraghor/nestjs-typed/controllers-should-supply-api-tags":"off"}),e.auth==="none"&&(r["@darraghor/nestjs-typed/api-methods-should-be-guarded"]="off"),['import { defineConfig } from "eslint/config";','import ts from "@typescript-eslint/eslint-plugin";','import parser from "@typescript-eslint/parser";',...s?['import nestjs from "ultracite/eslint/nestjs";']:[],"","export default defineConfig([",` { ignores: ${JSON.stringify(t)} },`,` { files: ["**/*.ts"], languageOptions: { parser${s?", parserOptions: { projectService: true, tsconfigRootDir: import.meta.dirname }":""} }, plugins: { "@typescript-eslint": ts }, rules: ts.configs.recommended.rules },`,...s?[" // Only the backend preset: eslint/core imports frontend plugins."," { extends: [nestjs] },",` { files: ["**/*.ts"], rules: ${JSON.stringify(r)} },`," // Nest's per-class Logger intentionally uses the class name.",' { files: ["**/trpc/error.handler.ts"], rules: { "@darraghor/nestjs-typed/use-dependency-injection": "off" } },']:[],"]);",""].join(`
7
+ `)}c(cs,"_r"),p(cs,"createEslintConfig");async function ds(e,t){const s=t.addons.includes("ultracite"),r=E(e,"package.json"),a=JSON.parse(await N(r,"utf-8")),i=a.devDependencies??{},o=a.scripts??{},n={},l=["**/node_modules/**","**/dist/**","**/coverage/**","**/.turbo/**","**/generated/**","**/@generated/**","**/migrations/**",...t.auth==="better-auth"&&t.orm.includes("drizzle")?["src/database/orm/drizzle/auth-schema.ts"]:[]];if(s&&(i.ultracite=oe.devDependencies.ultracite),t.formatter==="biome")i["@biomejs/biome"]="2.5.3",n["biome.jsonc"]=JSON.stringify({...s?{extends:["ultracite/biome/core","ultracite/biome/nestjs"]}:{},files:{includes:["**",...l.map(d=>`!${d.replace(/\/\*\*$/u,"")}`)]},javascript:{parser:{unsafeParameterDecoratorsEnabled:!0}},linter:{enabled:!0,rules:{complexity:{noStaticOnlyClass:"off",noUselessConstructor:"off"},preset:"recommended",style:{useImportType:"off"}}}},null,2),o.check="biome check .",o.fix="biome check --write .",o.format="biome check --write --unsafe .";else if(t.formatter==="oxlint-oxfmt")i.oxlint=oe.devDependencies.oxlint,i.oxfmt=oe.devDependencies.oxfmt,n["oxlint.config.ts"]=`import { defineConfig } from "oxlint";
8
+ ${s?`import core from "ultracite/oxlint/core";
9
+ import nestjs from "ultracite/oxlint/nestjs";
10
+
11
+ `:""}export default defineConfig({
12
+ ${s?` extends: [core, nestjs],
13
+ `:` plugins: ["typescript", "unicorn", "oxc"],
14
+ `} ignorePatterns: ${JSON.stringify(l)},
15
+ });
16
+ `,s?n["oxfmt.config.ts"]=`import { defineConfig } from "oxfmt";
17
+ import core from "ultracite/oxfmt";
18
+
19
+ export default defineConfig({ ...core, ignorePatterns: ${JSON.stringify(l)} });
20
+ `:n[".oxfmtrc.json"]=JSON.stringify({ignorePatterns:l},null,2),o.check="oxlint && oxfmt --check .",o.fix="oxlint --fix && oxfmt --write .",o.format="oxlint --fix && oxfmt --write .";else{i.eslint="^10.0.0",i.prettier=oe.devDependencies.prettier,i["@typescript-eslint/parser"]="^8.62.1",i["@typescript-eslint/eslint-plugin"]="^8.62.1",s&&(i["@darraghor/eslint-plugin-nestjs-typed"]="^7.2.5"),n["eslint.config.mjs"]=cs(t,l),n["prettier.config.mjs"]=s?`export { default } from "ultracite/prettier";
21
+ `:`export default {};
22
+ `,n[".prettierignore"]=`${l.join(`
23
+ `)}
24
+ `;const d='eslint "**/src/**/*.ts" "**/test/**/*.ts"';o.check=`${d} && prettier --check .`,o.fix=`${d} --fix && prettier --write .`,o.format=s?o.fix:"prettier --write .",t.formatter==="eslint-prettier-stylelint"&&(i.stylelint="^17.15.0",i["stylelint-config-standard"]="^40.0.0",n["stylelint.config.mjs"]=`export default { extends: ["stylelint-config-standard"] };
25
+ `,o.check+=' && stylelint "**/*.css" --allow-empty-input',o.fix+=' && stylelint "**/*.css" --fix --allow-empty-input')}a.devDependencies=i,a.scripts=o;for(const[d,u]of Object.entries(n))await U(E(e,d),`${u.trim()}
26
+ `);await U(r,`${JSON.stringify(a,null,2)}
27
+ `)}c(ds,"$r"),p(ds,"setupManualLinter");const Ri=ie(Ve);function us(e,t){const s=t.join(" ");switch(e){case"pnpm":return`pnpm dlx ${s}`;case"yarn":return`yarn dlx ${s}`;case"bun":return`bunx ${s}`;default:return`npx --yes ${s}`}}c(us,"Dr"),p(us,"buildUltraciteInitCommand");function ms(e){switch(e){case"biome":return"biome";case"eslint-prettier-stylelint":case"eslint-prettier-no-stylelint":return"eslint";case"oxlint-oxfmt":return"oxlint";case"none":return"none";default:return"oxlint"}}c(ms,"Lr"),p(ms,"mapFormatterToLinter");async function hs(e,t){const s=ms(t.formatter);if(s==="none")return{message:"Skipping ultracite init (no formatter selected)",success:!0};if(!t.addons.includes("ultracite")||t.formatter==="eslint-prettier-no-stylelint"||t.formatter!=="eslint-prettier-stylelint"&&t.ultraciteAgents.length===0&&t.ultraciteEditors.length===0&&t.ultraciteHooks.length===0&&t.ultraciteInstallSkill==="no"&&!t.addons.includes("husky"))try{return await ds(e,t),{message:"Manual linter configuration completed",success:!0}}catch(o){return{message:String(o),success:!1}}const r=[];t.addons.includes("husky")&&r.push("husky");const a=["ultracite","init","--quiet","--skip-install","--pm",t.packageManager,"--linter",s,"--frameworks","nestjs"];r.length>0&&a.push("--integrations",...r),t.addons.includes("ultracite")&&(t.ultraciteEditors.length>0&&a.push("--editors",...t.ultraciteEditors),t.ultraciteAgents.length>0&&a.push("--agents",...t.ultraciteAgents),t.ultraciteHooks.length>0&&a.push("--hooks",...t.ultraciteHooks),t.ultraciteInstallSkill==="yes"&&a.push("--install-skill"));const i=us(t.packageManager,a);try{if(await Ri(i,{cwd:e,timeout:12e4}),t.ultraciteAgents.includes("firebender")){const l=E(e,"firebender.json"),d=await N(l,"utf-8");try{JSON.parse(d)}catch{await U(l,`${JSON.stringify({rules:[d.trim()]},null,2)}
28
+ `)}}const o=E(e,"package.json"),n=JSON.parse(await N(o,"utf-8"));return n.scripts={...n.scripts,format:t.addons.includes("ultracite")?"ultracite fix":{biome:"biome format --write .",eslint:"prettier --write .",oxlint:"oxfmt --write ."}[s]},await U(o,`${JSON.stringify(n,null,2)}
29
+ `),{message:"Ultracite setup completed",success:!0}}catch(o){let n=o instanceof Error?o.message:String(o);if(o&&typeof o=="object"&&"stderr"in o){const l=o.stderr?.trim();l&&(n=`${n}
30
+ ${l}`)}return{message:`Ultracite setup failed: ${n}`,success:!1}}}c(hs,"gt"),p(hs,"runUltraciteInit");class Ai{static{c(this,"yt")}static{p(this,"TemplateRegistry")}templates=new Map;groups=new Map;registerTemplate(t){this.templates.set(t.id,t)}registerTemplates(t){for(const s of t)this.registerTemplate(s)}registerGroup(t){this.groups.set(t.id,t);for(const s of t.templates)this.registerTemplate(s)}getTemplate(t){return this.templates.get(t)}getGroup(t){return this.groups.get(t)}getAllTemplates(){return[...this.templates.values()]}getAllGroups(){return[...this.groups.values()]}getTemplatesByGroup(t){return this.groups.get(t)?.templates||[]}getTemplatesByFormat(t){return[...this.templates.values()].filter(s=>s.format===t)}async loadFromDirectory(t,s){const r=[];try{const a=await M.readdir(t,{withFileTypes:!0});for(const i of a){if(!i.isFile())continue;const{name:o}=i,n=k.extname(o);if(n===".hbs"){const l=k.basename(o,n),d={description:`Template: ${l}`,format:"handlebars",id:l,name:l.replaceAll(/[-_]/gu," "),optional:o.startsWith("_"),path:k.join(k.relative(k.dirname(t),t),o)};r.push(d),this.registerTemplate(d)}}if(s&&r.length>0){const i={description:`Templates from ${t}`,id:s,name:s,templates:r};this.registerGroup(i)}}catch(a){console.error(`Failed to load templates from ${t}:`,a)}return r}clear(){this.templates.clear(),this.groups.clear()}getStats(){return{groupCount:this.groups.size,templateCount:this.templates.size}}}function $i(e,t,s){}c($i,"pd"),p($i,"log");const We={biome:{complexity:{noStaticOnlyClass:"off",noUselessConstructor:"off"},performance:{noNamespaceImport:"off"},style:{noParameterProperties:"off",useImportType:"off"}},eslint:{"@typescript-eslint/consistent-type-imports":"off","@typescript-eslint/no-extraneous-class":"off","@typescript-eslint/parameter-properties":"off","class-methods-use-this":"off","func-style":["off"],"no-useless-constructor":"off","unicorn/no-static-only-class":"off","vitest/consistent-test-filename":"off"},oxlint:{"class-methods-use-this":"off","func-style":["off"],"no-useless-constructor":"off","oxc/no-const-enum":"off","typescript/ban-ts-comment":"off","typescript/consistent-type-imports":"off","typescript/no-extraneous-class":"off","typescript/no-non-null-assertion":"off","typescript/parameter-properties":"off","unicorn/no-static-only-class":"off"}};async function fs(e){const t=E(e,"oxlint.config.ts");let s;try{s=await N(t,"utf-8"),`${t}`}catch{return}let r=s;/import vitest from "ultracite\/oxlint\/vitest"/u.test(s)||(r=r.replace(/(import nestjs from "ultracite\/oxlint\/nestjs";)/u,`$1
31
+ import vitest from "ultracite/oxlint/vitest";`));const a=Object.entries(We.oxlint).map(([n,l])=>{const d=Array.isArray(l)?JSON.stringify(l):`"${l}"`;return` "${n}": ${d}`}).join(`,
32
+ `),i=`[
33
+ "error",
34
+ { pattern: ".*\\\\.(test|spec)\\\\.[tj]sx?$" },
35
+ ]`;r=r.replace(/export default defineConfig\(\{([\s\S]*?)\}\);/u,(n,l)=>{const d=l.includes("vitest"),u=l.includes("ignorePatterns"),m=l.includes("rules:"),h=l.includes("overrides:");let g=l;return d||(g=g.replace(/(extends:\s*\[)([\s\S]*?)(\s*\],)/u,(v,b,z,L)=>{const V=z.trim().replace(/,\s*$/u,"");return`${b}${V}, vitest${L.trimStart()}`})),u&&!l.includes("migrations/**")&&!l.includes("**/migrations/**")?g=g.replace(/ignorePatterns:\s*([^,\n]+),/u,'ignorePatterns: [...($1 ?? []), "migrations/**"],'):u||(g=g.replace(/(extends:\s*\[[\s\S]*?\],?)/u,`$1
36
+ ignorePatterns: [...(core.ignorePatterns ?? []), "prisma/generated/**", "migrations/**"],`)),g.includes("**/prisma/contract.d.ts")||(g=g.replace(/("migrations\/\*\*")/u,'$1, "**/prisma/contract.d.ts"')),g=g.replace(/ignorePatterns:\s*\[([^\]]*)\],/u,(v,b)=>`ignorePatterns: [
37
+ ${JSON.parse(`[${b}]`).map(z=>` "${z}",`).join(`
38
+ `)}
39
+ ],`),h||(g=`${g} overrides: [
40
+ {
41
+ files: ["**/*.{test,spec}.{ts,tsx,js,jsx}"],
42
+ plugins: ["vitest"],
43
+ rules: {
44
+ "vitest/consistent-test-filename": ${i},
45
+ },
46
+ },
47
+ ],
48
+ `),m||(g=`${g} rules: {
49
+ ${a},
50
+ },
51
+ `),`export default defineConfig({${g}});`});try{await U(t,r,"utf-8"),`${t}`}catch{}const o=E(e,".gitignore");try{const n=await N(o,"utf-8");n.split(/\r?\n/u).includes("migrations/")||await U(o,`${n.trimEnd()}
52
+ migrations/
53
+ `)}catch{}}c(fs,"Or"),p(fs,"injectOxlintRules");async function gs(e){const t=E(e,"biome.jsonc");let s;try{s=await N(t,"utf-8"),`${t}`}catch{return}const r=We.biome,a=s.includes('"linter"'),i=s.includes('"rules"');if(a&&i){const o=Object.entries(r).flatMap(([l,d])=>Object.entries(d).map(([u,m])=>` "${l}": {
54
+ "${u}": "${m}"
55
+ }`)).join(`,
56
+ `),n=s.replace(/("linter"\s*:\s*\{[\s\S]*?"rules"\s*:\s*\{)([\s\S]*?)(\})/u,(l,d,u,m)=>{const h=u.trim().endsWith(",")?"":",";return`${d}${u}${h}
57
+ ${o}
58
+ ${m}`});try{await U(t,n,"utf-8"),`${t}`}catch{}}else{const o=` "linter": {
59
+ "rules": {
60
+ ${Object.entries(r).map(([l,d])=>{const u=Object.entries(d).map(([m,h])=>` "${m}": "${h}"`).join(`,
61
+ `);return` "${l}": {
62
+ ${u}
63
+ }`}).join(`,
64
+ `)}
65
+ }
66
+ }`,n=s.replace(/(\}\s*)$/u,l=>`,
67
+ ${o}
68
+ ${l}`);try{await U(t,n,"utf-8"),`${t}`}catch{}}}c(gs,"Ir"),p(gs,"injectBiomeRules");async function ys(e){const t=E(e,"eslint.config.mjs");let s;try{s=await N(t,"utf-8"),`${t}`}catch{return}if(s.includes("rules:"))return;const r=Object.entries(We.eslint).map(([i,o])=>{const n=Array.isArray(o)?JSON.stringify(o):`"${o}"`;return` "${i}": ${n}`}).join(`,
69
+ `),a=s.replace(/\];?$/u,` {
70
+ rules: {
71
+ ${r},
72
+ },
73
+ },
74
+ ];`);try{await U(t,a,"utf-8"),`${t}`}catch{}}c(ys,"Ur"),p(ys,"injectEslintRules");async function bs(e,t){switch(t){case"oxlint-oxfmt":return await fs(e),{success:!0};case"biome":return await gs(e),{success:!0};case"eslint-prettier-stylelint":case"eslint-prettier-no-stylelint":return await ys(e),{success:!0};default:return{message:"No injection needed",success:!0}}}c(bs,"bt"),p(bs,"injectUltraciteRules");const ze=["grpc","kafka","mqtt","nats","rabbitmq","redis"],ne=[{database:"postgresql",family:"prisma-sql",id:"prisma-postgresql-7",orm:"prisma",prismaVersion:"7"},{database:"postgresql",family:"typeorm-sql",id:"typeorm-postgresql",orm:"typeorm"},{database:"postgresql",family:"drizzle-sql",id:"drizzle-postgresql",orm:"drizzle"},{database:"mysql",family:"prisma-sql",id:"prisma-mysql-7",orm:"prisma",prismaVersion:"7"},{database:"mysql",family:"typeorm-sql",id:"typeorm-mysql",orm:"typeorm"},{database:"mysql",family:"drizzle-sql",id:"drizzle-mysql",orm:"drizzle"},{database:"sqlite",family:"prisma-sql",id:"prisma-sqlite-7",orm:"prisma",prismaVersion:"7"},{database:"sqlite",family:"typeorm-sql",id:"typeorm-sqlite",orm:"typeorm"},{database:"sqlite",family:"drizzle-sql",id:"drizzle-sqlite",orm:"drizzle"},{database:"sqlserver",family:"prisma-sql",id:"prisma-sqlserver-7",orm:"prisma",prismaVersion:"7"},{database:"sqlserver",family:"typeorm-sql",id:"typeorm-sqlserver",orm:"typeorm"},{database:"sqlserver",family:"drizzle-sql",id:"drizzle-sqlserver",orm:"drizzle"},{database:"mongodb",family:"prisma-mongo",id:"prisma-mongodb-6",orm:"prisma",prismaVersion:"6"},{database:"mongodb",family:"typeorm-mongo",id:"typeorm-mongodb",orm:"typeorm"},{database:"mongodb",family:"native-mongo",id:"mongodb-native",orm:void 0}],ks=[{httpProvider:"express",trpc:!1},{httpProvider:"fastify",trpc:!1},{httpProvider:"express",trpc:!0},{httpProvider:"fastify",trpc:!0}];function pe(e,t,s,r){return`microservice-${e}-${t}${s==="fastify"?"-fastify":""}${r?"-trpc":""}`}c(pe,"ye"),p(pe,"microserviceStorageProfileId");const Z=Object.fromEntries(ne.flatMap(e=>ze.flatMap(t=>ks.map(({httpProvider:s,trpc:r})=>[pe(e.id,t,s,r),{api:r?["rest","trpc"]:["rest"],auth:"none",code:"microservice-storage",database:[e.database],family:e.family,httpProvider:s,microservices:[t],orm:e.orm?[e.orm]:[],..."prismaVersion"in e?{prismaVersion:e.prismaVersion}:{},storage:e.id}])))),vs=["docker","health-check","rate-limiting","swagger","todo-example","typescript-7"],qs=["agent-skills","husky","nestjs-zod","scalar-ui","ultracite"],Di=(()=>{const e=new Set;for(const[s,r]of ne.entries())for(const[a,i]of ks.entries()){const o=ze[(s+a)%ze.length];o&&e.add(pe(r.id,o,i.httpProvider,i.trpc))}for(const s of ne)for(const r of ze)[...e].some(a=>{const i=Z[a];return i.family===s.family&&i.microservices.includes(r)})||e.add(pe(s.id,r,"express",!0));const t=pe("prisma-postgresql-7","nats","express",!0);return e.add(t),[t,...[...e].filter(s=>s!==t)]})();function xs(e){return Object.hasOwn(Z,e)}c(xs,"Fr"),p(xs,"isMicroserviceStorageProfileId");const Se=["microservice-drizzle-mysql-grpc-fastify","microservice-drizzle-mysql-kafka-trpc","microservice-drizzle-mysql-mqtt-fastify-trpc","microservice-drizzle-mysql-redis","microservice-drizzle-postgresql-mqtt","microservice-drizzle-postgresql-nats-fastify","microservice-drizzle-postgresql-rabbitmq-trpc","microservice-drizzle-postgresql-redis-fastify-trpc","microservice-drizzle-sqlite-mqtt","microservice-drizzle-sqlite-nats-fastify","microservice-drizzle-sqlite-rabbitmq-trpc","microservice-drizzle-sqlite-redis-fastify-trpc","microservice-drizzle-sqlserver-grpc-fastify","microservice-drizzle-sqlserver-kafka-trpc","microservice-drizzle-sqlserver-mqtt-fastify-trpc","microservice-drizzle-sqlserver-redis","microservice-mongodb-native-grpc-trpc","microservice-mongodb-native-kafka-trpc","microservice-mongodb-native-mqtt","microservice-mongodb-native-nats-fastify","microservice-mongodb-native-rabbitmq-trpc","microservice-mongodb-native-redis-fastify-trpc","microservice-prisma-mongodb-6-grpc","microservice-prisma-mongodb-6-kafka-fastify","microservice-prisma-mongodb-6-mqtt-trpc","microservice-prisma-mongodb-6-nats-fastify-trpc","microservice-prisma-mongodb-6-rabbitmq-trpc","microservice-prisma-mongodb-6-redis-trpc","microservice-prisma-mysql-7-grpc-fastify-trpc","microservice-prisma-mysql-7-nats","microservice-prisma-mysql-7-rabbitmq-fastify","microservice-prisma-mysql-7-redis-trpc","microservice-prisma-postgresql-7-grpc","microservice-prisma-postgresql-7-kafka-fastify","microservice-prisma-postgresql-7-mqtt-trpc","microservice-prisma-postgresql-7-nats-fastify-trpc","microservice-prisma-postgresql-7-nats-trpc","microservice-prisma-sqlite-7-grpc","microservice-prisma-sqlite-7-kafka-fastify","microservice-prisma-sqlite-7-mqtt-trpc","microservice-prisma-sqlite-7-nats-fastify-trpc","microservice-prisma-sqlserver-7-grpc-fastify-trpc","microservice-prisma-sqlserver-7-nats","microservice-prisma-sqlserver-7-rabbitmq-fastify","microservice-prisma-sqlserver-7-redis-trpc","microservice-typeorm-mongodb-grpc-trpc","microservice-typeorm-mongodb-kafka","microservice-typeorm-mongodb-mqtt-fastify","microservice-typeorm-mongodb-nats-trpc","microservice-typeorm-mongodb-rabbitmq-fastify-trpc","microservice-typeorm-mongodb-redis-trpc","microservice-typeorm-mysql-grpc-trpc","microservice-typeorm-mysql-kafka-fastify-trpc","microservice-typeorm-mysql-rabbitmq","microservice-typeorm-mysql-redis-fastify","microservice-typeorm-postgresql-kafka","microservice-typeorm-postgresql-mqtt-fastify","microservice-typeorm-postgresql-nats-trpc","microservice-typeorm-postgresql-rabbitmq-fastify-trpc","microservice-typeorm-sqlite-kafka","microservice-typeorm-sqlite-mqtt-fastify","microservice-typeorm-sqlite-nats-trpc","microservice-typeorm-sqlite-rabbitmq-fastify-trpc","microservice-typeorm-sqlserver-grpc-trpc","microservice-typeorm-sqlserver-kafka-fastify-trpc","microservice-typeorm-sqlserver-rabbitmq","microservice-typeorm-sqlserver-redis-fastify"];function we(e){if(Se.includes(e))return[e];const t=Z[e],s=Se.find(a=>{const i=Z[a];return i.storage===t.storage&&i.httpProvider===t.httpProvider&&JSON.stringify(i.api)===JSON.stringify(t.api)}),r=Se.find(a=>{const i=Z[a];return i.family===t.family&&JSON.stringify(i.microservices)===JSON.stringify(t.microservices)});if(!(!s||!r))return[...new Set([s,r])]}c(we,"Ie"),p(we,"microserviceStorageCoverage");const _i=Object.keys(Z).filter(e=>we(e)!==void 0),Ci=[{profile:"passport-typeorm-mysql",scenario:"215-passport-typeorm-mysql-husky-ultracite"},{profile:"passport-typeorm-sqlite",scenario:"216-passport-typeorm-sqlite-husky-ultracite"},{profile:"passport-drizzle-mysql",scenario:"217-passport-drizzle-mysql-husky-ultracite"},{profile:"passport-drizzle-sqlite",scenario:"218-passport-drizzle-sqlite-husky-ultracite"}],Li=[{auth:"better-auth",profile:"better-auth-typeorm-postgres-trpc",scenario:"219-better-auth-typeorm-postgres-trpc-todo"},{auth:"passport",profile:"passport-typeorm-postgres-trpc",scenario:"220-passport-typeorm-postgres-trpc-todo"},{auth:"better-auth",profile:"better-auth-drizzle-postgres-trpc",scenario:"221-better-auth-drizzle-postgres-trpc-todo"},{auth:"passport",profile:"passport-drizzle-postgres-trpc",scenario:"222-passport-drizzle-postgres-trpc-todo"},{auth:"better-auth",profile:"better-auth-typeorm-postgres-fastify-trpc",scenario:"223-better-auth-typeorm-postgres-fastify-trpc-todo"},{auth:"passport",profile:"passport-typeorm-postgres-fastify-trpc",scenario:"224-passport-typeorm-postgres-fastify-trpc-todo"},{auth:"better-auth",profile:"better-auth-drizzle-postgres-fastify-trpc",scenario:"225-better-auth-drizzle-postgres-fastify-trpc-todo"},{auth:"passport",profile:"passport-drizzle-postgres-fastify-trpc",scenario:"226-passport-drizzle-postgres-fastify-trpc-todo"}],Ii=[["better-auth","better-auth-typeorm-mysql-trpc","237-better-auth-typeorm-mysql-trpc-todo"],["passport","passport-typeorm-mysql-trpc","238-passport-typeorm-mysql-trpc-todo"],["better-auth","better-auth-drizzle-mysql-trpc","239-better-auth-drizzle-mysql-trpc-todo"],["passport","passport-drizzle-mysql-trpc","240-passport-drizzle-mysql-trpc-todo"],["better-auth","better-auth-typeorm-sqlite-trpc","241-better-auth-typeorm-sqlite-trpc-todo"],["passport","passport-typeorm-sqlite-trpc","242-passport-typeorm-sqlite-trpc-todo"],["passport","passport-drizzle-sqlite-trpc","243-passport-drizzle-sqlite-trpc-todo"]],Oi=[["better-auth","better-auth-prisma-fastify-trpc","244-better-auth-prisma-postgres-fastify-trpc-todo"],["passport","passport-prisma-fastify-trpc","245-passport-prisma-postgres-fastify-trpc-todo"]],Ui=[["better-auth-drizzle-trpc","271-better-auth-drizzle-sqlite-express-trpc-todo"],["better-auth-drizzle-fastify-trpc","272-better-auth-drizzle-sqlite-fastify-trpc-todo"]],Qi=[["better-auth","better-auth-prisma-mongo-trpc","273-better-auth-prisma-mongo-express-trpc-todo"],["better-auth","better-auth-prisma-mongo-fastify-trpc","274-better-auth-prisma-mongo-fastify-trpc-todo"],["passport","passport-prisma-mongo-trpc","275-passport-prisma-mongo-express-trpc-todo"],["passport","passport-prisma-mongo-fastify-trpc","276-passport-prisma-mongo-fastify-trpc-todo"]],Fi=[["better-auth","better-auth-typeorm-mysql-fastify-trpc","246-better-auth-typeorm-mysql-fastify-trpc-todo"],["passport","passport-typeorm-mysql-fastify-trpc","247-passport-typeorm-mysql-fastify-trpc-todo"],["better-auth","better-auth-drizzle-mysql-fastify-trpc","248-better-auth-drizzle-mysql-fastify-trpc-todo"],["passport","passport-drizzle-mysql-fastify-trpc","249-passport-drizzle-mysql-fastify-trpc-todo"],["better-auth","better-auth-typeorm-sqlite-fastify-trpc","250-better-auth-typeorm-sqlite-fastify-trpc-todo"],["passport","passport-typeorm-sqlite-fastify-trpc","251-passport-typeorm-sqlite-fastify-trpc-todo"],["passport","passport-drizzle-sqlite-fastify-trpc","252-passport-drizzle-sqlite-fastify-trpc-todo"]],Hi=[["better-auth","better-auth-typeorm-mysql-fastify","253-better-auth-typeorm-mysql-fastify-rest-todo"],["passport","passport-typeorm-mysql-fastify","254-passport-typeorm-mysql-fastify-rest-todo"],["better-auth","better-auth-drizzle-mysql-fastify","255-better-auth-drizzle-mysql-fastify-rest-todo"],["passport","passport-drizzle-mysql-fastify","256-passport-drizzle-mysql-fastify-rest-todo"],["better-auth","better-auth-typeorm-sqlite-fastify","257-better-auth-typeorm-sqlite-fastify-rest-todo"],["passport","passport-typeorm-sqlite-fastify","258-passport-typeorm-sqlite-fastify-rest-todo"],["passport","passport-drizzle-sqlite-fastify","259-passport-drizzle-sqlite-fastify-rest-todo"],["better-auth","better-auth-prisma-fastify","277-better-auth-prisma-postgres-fastify-rest-todo"],["passport","passport-prisma-fastify","278-passport-prisma-postgres-fastify-rest-todo"],["passport","passport-typeorm-postgres-fastify","279-passport-typeorm-postgres-fastify-rest-todo"],["passport","passport-drizzle-postgres-fastify","280-passport-drizzle-postgres-fastify-rest-todo"]],Mi=[["passport-typeorm-postgres-fastify","260-passport-typeorm-postgresql-fastify-rate-limiting"],["passport-drizzle-postgres-fastify","261-passport-drizzle-postgresql-fastify-rate-limiting"],["passport-typeorm-mysql-fastify","262-passport-typeorm-mysql-fastify-rate-limiting"],["passport-drizzle-mysql-fastify","263-passport-drizzle-mysql-fastify-rate-limiting"],["passport-typeorm-sqlite-fastify","264-passport-typeorm-sqlite-fastify-rate-limiting"],["passport-drizzle-sqlite-fastify","265-passport-drizzle-sqlite-fastify-rate-limiting"]],Ni=[["better-auth","better-auth-drizzle-graphql-fastify","227-better-auth-drizzle-graphql-postgresql-fastify-todo"],["better-auth","better-auth-drizzle-graphql-mysql","228-better-auth-drizzle-graphql-mysql-todo"],["better-auth","better-auth-drizzle-graphql-mysql-fastify","229-better-auth-drizzle-graphql-mysql-fastify-todo"],["better-auth","better-auth-drizzle-graphql-sqlite","230-better-auth-drizzle-graphql-sqlite-todo"],["better-auth","better-auth-drizzle-graphql-sqlite-fastify","231-better-auth-drizzle-graphql-sqlite-fastify-todo"],["passport","passport-drizzle-graphql-fastify","232-passport-drizzle-graphql-postgresql-fastify-todo"],["passport","passport-drizzle-graphql-mysql","233-passport-drizzle-graphql-mysql-todo"],["passport","passport-drizzle-graphql-mysql-fastify","234-passport-drizzle-graphql-mysql-fastify-todo"],["passport","passport-drizzle-graphql-sqlite","235-passport-drizzle-graphql-sqlite-todo"],["passport","passport-drizzle-graphql-sqlite-fastify","236-passport-drizzle-graphql-sqlite-fastify-todo"]],Pe=[["better-auth-drizzle-graphql-fastify","281-better-auth-drizzle-graphql-postgres-fastify-rate-limiting"],["better-auth-drizzle-graphql-mysql","282-better-auth-drizzle-graphql-mysql-rate-limiting"],["better-auth-drizzle-graphql-mysql-fastify","283-better-auth-drizzle-graphql-mysql-fastify-rate-limiting"],["better-auth-drizzle-graphql-sqlite","284-better-auth-drizzle-graphql-sqlite-rate-limiting"],["better-auth-drizzle-graphql-sqlite-fastify","285-better-auth-drizzle-graphql-sqlite-fastify-rate-limiting"],["passport-drizzle-graphql-fastify","286-passport-drizzle-graphql-postgres-fastify-rate-limiting"],["passport-drizzle-graphql-mysql","287-passport-drizzle-graphql-mysql-rate-limiting"],["passport-drizzle-graphql-mysql-fastify","288-passport-drizzle-graphql-mysql-fastify-rate-limiting"],["passport-drizzle-graphql-sqlite","289-passport-drizzle-graphql-sqlite-rate-limiting"],["passport-drizzle-graphql-sqlite-fastify","290-passport-drizzle-graphql-sqlite-fastify-rate-limiting"]],Gi=[["better-auth-typeorm-postgres","better-auth","291-better-auth-typeorm-postgres-rest-todo"],["better-auth-drizzle-postgres","better-auth","292-better-auth-drizzle-postgres-rest-todo"],["passport-prisma-mongo","passport","293-passport-prisma-mongo-rest-todo"],["passport-prisma-mongo-fastify","passport","294-passport-prisma-mongo-fastify-rest-todo"]],Bi=[["better-auth-prisma-mongo","301-better-auth-prisma-mongo-rest-todo"],["better-auth-prisma-mongo-fastify","302-better-auth-prisma-mongo-fastify-rest-todo"],["better-auth-drizzle","303-better-auth-drizzle-sqlite-rest-todo"],["better-auth-drizzle-fastify","304-better-auth-drizzle-sqlite-fastify-rest-todo"]],Vi=[["better-auth-prisma-docker","better-auth",["docker","todo-example"],"305-better-auth-prisma-docker-todo"],["passport-prisma-docker","passport",["docker","todo-example"],"306-passport-prisma-docker-todo"],["better-auth-monorepo-prisma-postgres","better-auth",["packages/shared","todo-example"],"307-better-auth-monorepo-prisma-todo"]],Ji=[["passport-prisma","295-passport-prisma-typescript-7"]],Zi=[["better-auth-drizzle-graphql-fastify","296-better-auth-drizzle-graphql-postgres-fastify-health"],["better-auth-drizzle-graphql-mysql","297-better-auth-drizzle-graphql-mysql-health"],["better-auth-drizzle-graphql-mysql-fastify","298-better-auth-drizzle-graphql-mysql-fastify-health"],["better-auth-drizzle-graphql-sqlite","299-better-auth-drizzle-graphql-sqlite-health"],["better-auth-drizzle-graphql-sqlite-fastify","300-better-auth-drizzle-graphql-sqlite-fastify-health"]],Wi=[["better-auth-drizzle-graphql","better-auth","114-better-auth-drizzle-graphql-health"],["passport-prisma-graphql","passport","52-passport-prisma-graphql"],["passport-typeorm-mysql","passport","178-passport-typeorm-mysql-health"],["passport-typeorm-sqlite","passport","179-passport-typeorm-sqlite-health"],["passport-drizzle-mysql","passport","180-passport-drizzle-mysql-health"],["passport-drizzle-sqlite","passport","181-passport-drizzle-sqlite-health"]],Ki=[["better-auth","typeorm","postgresql","express","better-auth-typeorm-postgres"],["better-auth","typeorm","postgresql","fastify","better-auth-typeorm-postgres-fastify"],["better-auth","typeorm","mysql","express","better-auth-typeorm-mysql"],["better-auth","typeorm","mysql","fastify","better-auth-typeorm-mysql-fastify"],["better-auth","typeorm","sqlite","express","better-auth-typeorm-sqlite"],["better-auth","typeorm","sqlite","fastify","better-auth-typeorm-sqlite-fastify"],["passport","typeorm","postgresql","express","passport-typeorm-postgres"],["passport","typeorm","postgresql","fastify","passport-typeorm-postgres-fastify"],["passport","typeorm","mysql","express","passport-typeorm-mysql"],["passport","typeorm","mysql","fastify","passport-typeorm-mysql-fastify"],["passport","typeorm","sqlite","express","passport-typeorm-sqlite"],["passport","typeorm","sqlite","fastify","passport-typeorm-sqlite-fastify"],["better-auth","drizzle","postgresql","express","better-auth-drizzle-postgres"],["better-auth","drizzle","postgresql","fastify","better-auth-drizzle-postgres-fastify"],["better-auth","drizzle","mysql","express","better-auth-drizzle-mysql"],["better-auth","drizzle","mysql","fastify","better-auth-drizzle-mysql-fastify"],["better-auth","drizzle","sqlite","express","better-auth-drizzle"],["better-auth","drizzle","sqlite","fastify","better-auth-drizzle-fastify"],["passport","drizzle","postgresql","express","passport-drizzle-postgres"],["passport","drizzle","postgresql","fastify","passport-drizzle-postgres-fastify"],["passport","drizzle","mysql","express","passport-drizzle-mysql"],["passport","drizzle","mysql","fastify","passport-drizzle-mysql-fastify"],["passport","drizzle","sqlite","express","passport-drizzle-sqlite"],["passport","drizzle","sqlite","fastify","passport-drizzle-sqlite-fastify"]],zs=new Set(["better-auth-typeorm-postgres-fastify","better-auth-typeorm-mysql-fastify","better-auth-drizzle-postgres-fastify","better-auth-drizzle-mysql-fastify","passport-typeorm-postgres-fastify","passport-drizzle-postgres-fastify","better-auth-typeorm-sqlite-fastify","passport-typeorm-mysql-fastify","passport-typeorm-sqlite-fastify","better-auth-drizzle-fastify","passport-drizzle-mysql-fastify","passport-drizzle-sqlite-fastify"]),Yi=Ki.map(([e,t,s,r,a])=>{const i=`${e}-${t}-${s}${r==="fastify"?"-fastify":""}-rest-full-feature-bundle`;return{addons:["agent-skills","husky",...e==="passport"?["nestjs-zod"]:[],"scalar-ui","ultracite"],auth:e,extras:["docker","health-check","rate-limiting","swagger","todo-example","typescript-7"],formatter:"oxlint-oxfmt",id:i,note:`${e==="better-auth"?"Better Auth":"Passport"} ${t} ${s} ${r} REST ${r==="fastify"&&!zs.has(a)?"is scheduled for":"passed"} the complete generated-project bundle: install, migrations, build, unit/E2E, auth and protected todos, Docker readiness and published-port probes, Swagger/Scalar, rate limiting, Husky, skills, and Ultracite.`,profiles:[a],scenarios:[i],status:r==="fastify"&&!zs.has(a)?"implemented":"certified"}}),Xi=[["better-auth","prisma","express","better-auth-prisma-sqlserver"],["better-auth","prisma","fastify","better-auth-prisma-sqlserver-fastify"],["passport","typeorm","express","passport-typeorm-sqlserver"],["passport","typeorm","fastify","passport-typeorm-sqlserver-fastify"],["passport","drizzle","express","passport-drizzle-sqlserver"],["passport","drizzle","fastify","passport-drizzle-sqlserver-fastify"]],eo=Xi.map(([e,t,s,r])=>{const a=`${e}-${t}-sqlserver-${s}-rest-full-feature-bundle`;return{addons:["husky",...e==="passport"?["nestjs-zod"]:[],"scalar-ui","ultracite"],auth:e,extras:["docker","health-check","rate-limiting","swagger","todo-example","typescript-7"],formatter:"oxlint-oxfmt",id:a,note:`${e==="better-auth"?"Better Auth":"Passport"} ${t} SQL Server ${s} REST passed clean installation, database setup, build, unit/E2E, authenticated todo ownership, Swagger/Scalar, rate limiting, Docker readiness, and published-port auth and persistence probes.`,profiles:[r],scenarios:[a],status:"certified"}}),to=[["none","prisma-fastify"],["better-auth","better-auth-prisma-fastify"],["passport","passport-prisma-fastify"]],so=to.map(([e,t])=>{const s=`${e}-prisma-postgresql-fastify-rest-full-feature-bundle`;return{addons:["agent-skills","husky",...e==="passport"||e==="none"?["nestjs-zod"]:[],"scalar-ui","ultracite"],auth:e,extras:["docker","health-check","rate-limiting","swagger","todo-example","typescript-7"],formatter:"oxlint-oxfmt",id:s,note:`Prisma 7 PostgreSQL Fastify ${e} passed clean install, migrations, build, unit/E2E, auth and todo checks, Swagger/Scalar, rate limiting, hooks, skills, Ultracite, and Docker published-port probes.`,profiles:[t],scenarios:[s],status:"certified"}}),ro=[["mysql","prisma-mysql-fastify"],["sqlite","prisma-sqlite-fastify"]],Ss=new Set(["prisma-mysql-fastify","prisma-sqlite-fastify"]),ao=ro.map(([e,t])=>{const s=`none-prisma-${e}-fastify-rest-full-feature-bundle`;return{addons:["agent-skills","husky","nestjs-zod","scalar-ui","ultracite"],auth:"none",extras:["docker","health-check","rate-limiting","swagger","todo-example","typescript-7"],formatter:"oxlint-oxfmt",id:s,note:`Prisma 7 ${e} Fastify REST full bundle ${Ss.has(t)?"passed":"is pending a clean full run for"} migrations, build, unit/E2E, CRUD, Swagger/Scalar, rate limiting, hooks, skills, Ultracite, and Docker published-port probes.`,profiles:[t],scenarios:[s],status:Ss.has(t)?"certified":"implemented"}}),io=[["none","express","prisma-trpc"],["none","fastify","prisma-fastify-trpc"],["better-auth","express","better-auth-prisma-trpc"],["better-auth","fastify","better-auth-prisma-fastify-trpc"],["passport","express","passport-prisma-trpc"],["passport","fastify","passport-prisma-fastify-trpc"]],ws=new Set(["prisma-trpc","prisma-fastify-trpc","better-auth-prisma-trpc","better-auth-prisma-fastify-trpc","passport-prisma-trpc","passport-prisma-fastify-trpc"]),oo=io.map(([e,t,s])=>{const r=`${e}-prisma-postgresql${t==="fastify"?"-fastify":""}-trpc-full-feature-bundle`;return{addons:["agent-skills","husky",...e==="passport"||e==="none"?["nestjs-zod"]:[],"scalar-ui","ultracite"],auth:e,extras:["docker","health-check","rate-limiting","swagger","todo-example","typescript-7"],formatter:"oxlint-oxfmt",id:r,note:`Prisma 7 PostgreSQL ${t} ${e} REST+tRPC full bundle ${ws.has(s)?"passed":"is pending"} migrations, build, tRPC/REST E2E, auth/todo, docs, throttling, hooks, skills, lint, and Docker probes.`,profiles:[s],scenarios:[r],status:ws.has(s)?"certified":"implemented"}}),no=[["better-auth","express","better-auth-prisma-mongo",["agent-skills","husky","scalar-ui","ultracite"]],["better-auth","fastify","better-auth-prisma-mongo-fastify",["agent-skills","husky","scalar-ui","ultracite"]],["passport","express","passport-prisma-mongo",["agent-skills","husky","nestjs-zod","scalar-ui","ultracite"]],["passport","fastify","passport-prisma-mongo-fastify",["agent-skills","husky","scalar-ui","ultracite"]]],po=no.map(([e,t,s,r])=>{const a=`${e}-prisma-mongodb${t==="fastify"?"-fastify":""}-rest-full-feature-bundle`;return{addons:r,auth:e,extras:["docker","health-check","rate-limiting","swagger","todo-example","typescript-7"],formatter:"oxlint-oxfmt",id:a,note:`Prisma 6 MongoDB ${t} ${e} REST full bundle passed clean install, Prisma generation/push, build, unit/E2E, auth and todo ownership, Swagger/Scalar, rate limiting, Husky, agent skills, Ultracite, Docker readiness and published-port probes, and container cleanup.`,profiles:[s],scenarios:[a],status:"certified"}}),lo=[["better-auth","better-auth-prisma-mongo-trpc"],["better-auth","better-auth-prisma-mongo-fastify-trpc"],["passport","passport-prisma-mongo-trpc"],["passport","passport-prisma-mongo-fastify-trpc"]],co=lo.map(([e,t])=>{const s=t.includes("fastify"),r=`${e}-prisma-mongodb${s?"-fastify":""}-trpc-full-feature-bundle`;return{addons:["agent-skills","husky","scalar-ui","ultracite"],auth:e,extras:["docker","health-check","rate-limiting","swagger","todo-example","typescript-7"],formatter:"oxlint-oxfmt",id:r,note:`Prisma 6 MongoDB ${s?"Fastify":"Express"} ${e} REST+tRPC full bundle passed generation, database setup, build, unit/E2E, authenticated todo ownership, docs, throttling, tooling, Docker readiness, published-port checks, and cleanup.`,profiles:[t],scenarios:[r],status:"certified"}}),uo=[["better-auth","express","better-auth-prisma-mysql",["agent-skills","husky","scalar-ui","ultracite"]],["better-auth","fastify","better-auth-prisma-mysql-fastify",["agent-skills","husky","scalar-ui","ultracite"]],["better-auth","express","better-auth-prisma-sqlite",["agent-skills","husky","scalar-ui","ultracite"]],["better-auth","fastify","better-auth-prisma-sqlite-fastify",["agent-skills","husky","scalar-ui","ultracite"]],["passport","express","passport-prisma-mysql",["agent-skills","husky","nestjs-zod","scalar-ui","ultracite"]],["passport","fastify","passport-prisma-mysql-fastify",["agent-skills","husky","nestjs-zod","scalar-ui","ultracite"]],["passport","express","passport-prisma-sqlite",["agent-skills","husky","nestjs-zod","scalar-ui","ultracite"]],["passport","fastify","passport-prisma-sqlite-fastify",["agent-skills","husky","nestjs-zod","scalar-ui","ultracite"]]],mo=uo.map(([e,t,s,r])=>{const a=s.includes("mysql")?"mysql":"sqlite",i=`${e}-prisma-${a}${t==="fastify"?"-fastify":""}-rest-full-feature-bundle`;return{addons:r,auth:e,extras:["docker","health-check","rate-limiting","swagger","todo-example","typescript-7"],formatter:"oxlint-oxfmt",id:i,note:`Prisma 7 ${a} ${t} ${e} REST full bundle passed clean generation, install, migrations, build, unit/E2E, auth and todo ownership, docs, throttling, hooks, skills, Ultracite, and Docker runtime probes.`,profiles:[s],scenarios:[i],status:"certified"}}),ho=[["better-auth","express","mysql","better-auth-prisma-mysql-trpc"],["better-auth","fastify","mysql","better-auth-prisma-mysql-fastify-trpc"],["better-auth","express","sqlite","better-auth-prisma-sqlite-trpc"],["better-auth","fastify","sqlite","better-auth-prisma-sqlite-fastify-trpc"],["passport","express","mysql","passport-prisma-mysql-trpc"],["passport","fastify","mysql","passport-prisma-mysql-fastify-trpc"],["passport","express","sqlite","passport-prisma-sqlite-trpc"],["passport","fastify","sqlite","passport-prisma-sqlite-fastify-trpc"]],fo=ho.map(([e,t,s,r])=>{const a=`${e}-prisma-${s}${t==="fastify"?"-fastify":""}-trpc-full-feature-bundle`;return{addons:["agent-skills","husky",...e==="passport"?["nestjs-zod"]:[],"scalar-ui","ultracite"],auth:e,extras:["docker","health-check","rate-limiting","swagger","todo-example","typescript-7"],formatter:"oxlint-oxfmt",id:a,note:`Prisma 7 ${s} ${t} ${e} REST+tRPC full bundle passed migrations, build, unit/E2E, authenticated ownership, docs, throttling, tooling, and Docker runtime probes.`,profiles:[r],scenarios:[a],status:"certified"}}),go=[["better-auth","better-auth-prisma-graphql"],["passport","passport-prisma-graphql"]].map(([e,t])=>({addons:[],auth:e,extras:["health-check","todo-example"],id:`${e}-prisma-postgresql-graphql-health-todo`,note:"Combined GraphQL health and authenticated todo ownership passed full generated-project runtime certification.",profiles:[t],scenarios:[`${e}-prisma-postgresql-graphql-health-todo`],status:"certified"})),yo=[["typeorm","postgresql","typeorm-postgresql-fastify"],["typeorm","mysql","typeorm-mysql-fastify"],["typeorm","sqlite","typeorm-sqlite-fastify"],["drizzle","postgresql","drizzle-postgresql-fastify"],["drizzle","mysql","drizzle-mysql-fastify"],["drizzle","sqlite","drizzle-sqlite-fastify"]],Ps=new Set(["typeorm-postgresql-fastify","typeorm-mysql-fastify","typeorm-sqlite-fastify","drizzle-postgresql-fastify","drizzle-mysql-fastify","drizzle-sqlite-fastify"]),bo=yo.map(([e,t,s])=>{const r=`${e}-${t}-fastify-rest-full-feature-bundle`;return{addons:["agent-skills","husky","nestjs-zod","scalar-ui","ultracite"],auth:"none",extras:["docker","health-check","rate-limiting","swagger","todo-example","typescript-7"],formatter:"oxlint-oxfmt",id:r,note:`Unauthenticated ${e} ${t} Fastify REST full-feature scenario ${Ps.has(s)?"passed":"is scheduled for"} clean install, migrations, build, todo CRUD, Swagger/Scalar, rate limiting, hooks, skills, Ultracite, and Docker published-port checks.`,profiles:[s],scenarios:[r],status:Ps.has(s)?"certified":"implemented"}}),ko=[["better-auth","typeorm","express","better-auth-typeorm-postgres-trpc"],["better-auth","typeorm","fastify","better-auth-typeorm-postgres-fastify-trpc"],["passport","typeorm","express","passport-typeorm-postgres-trpc"],["passport","typeorm","fastify","passport-typeorm-postgres-fastify-trpc"],["better-auth","drizzle","express","better-auth-drizzle-postgres-trpc"],["better-auth","drizzle","fastify","better-auth-drizzle-postgres-fastify-trpc"],["passport","drizzle","express","passport-drizzle-postgres-trpc"],["passport","drizzle","fastify","passport-drizzle-postgres-fastify-trpc"]],vo=ko.map(([e,t,s,r])=>{const a=`${e}-${t}-postgresql${s==="fastify"?"-fastify":""}-rest-trpc-full-feature-bundle`;return{addons:["agent-skills","husky","scalar-ui","ultracite"],auth:e,extras:["docker","health-check","rate-limiting","swagger","todo-example","typescript-7"],formatter:"oxlint-oxfmt",id:a,note:`Authenticated ${e} ${t} PostgreSQL REST+tRPC ${s} passed clean install, migrations, build, REST and tRPC E2E, auth ownership, Docker probes, Swagger/Scalar, rate limiting, Husky, skills, and Ultracite.`,profiles:[r],scenarios:[a],status:"certified"}}),qo=[["better-auth","typeorm","mysql","express","better-auth-typeorm-mysql-trpc"],["better-auth","typeorm","mysql","fastify","better-auth-typeorm-mysql-fastify-trpc"],["passport","typeorm","mysql","express","passport-typeorm-mysql-trpc"],["passport","typeorm","mysql","fastify","passport-typeorm-mysql-fastify-trpc"],["better-auth","typeorm","sqlite","express","better-auth-typeorm-sqlite-trpc"],["better-auth","typeorm","sqlite","fastify","better-auth-typeorm-sqlite-fastify-trpc"],["passport","typeorm","sqlite","express","passport-typeorm-sqlite-trpc"],["passport","typeorm","sqlite","fastify","passport-typeorm-sqlite-fastify-trpc"],["better-auth","drizzle","mysql","express","better-auth-drizzle-mysql-trpc"],["better-auth","drizzle","mysql","fastify","better-auth-drizzle-mysql-fastify-trpc"],["passport","drizzle","mysql","express","passport-drizzle-mysql-trpc"],["passport","drizzle","mysql","fastify","passport-drizzle-mysql-fastify-trpc"],["passport","drizzle","sqlite","express","passport-drizzle-sqlite-trpc"],["passport","drizzle","sqlite","fastify","passport-drizzle-sqlite-fastify-trpc"]],xo=qo.map(([e,t,s,r,a])=>{const i=`${e}-${t}-${s}${r==="fastify"?"-fastify":""}-rest-trpc-full-feature-bundle`;return{addons:["agent-skills","husky","scalar-ui","ultracite"],auth:e,extras:["docker","health-check","rate-limiting","swagger","todo-example","typescript-7"],formatter:"oxlint-oxfmt",id:i,note:`Authenticated ${e} ${t} ${s} REST+tRPC ${r} passed clean install, migrations, build, REST and tRPC E2E, auth ownership, Docker probes, Swagger/Scalar, rate limiting, Husky, skills, and Ultracite.`,profiles:[a],scenarios:[i],status:"certified"}}),zo=[["better-auth-drizzle-trpc","express"],["better-auth-drizzle-fastify-trpc","fastify"]],So=zo.map(([e,t])=>{const s=`better-auth-drizzle-sqlite${t==="fastify"?"-fastify":""}-rest-trpc-full-feature-bundle`;return{addons:["agent-skills","husky","scalar-ui","ultracite"],auth:"better-auth",extras:["docker","health-check","rate-limiting","swagger","todo-example","typescript-7"],formatter:"oxlint-oxfmt",id:s,note:`Better Auth Drizzle SQLite REST+tRPC ${t} passed clean install, migrations, build, REST and tRPC E2E, auth ownership, Docker probes, Swagger/Scalar, rate limiting, Husky, skills, and Ultracite.`,profiles:[e],scenarios:[s],status:"certified"}}),wo=[["better-auth","better-auth-prisma-graphql"],["passport","passport-prisma-graphql"]].map(([e,t])=>({addons:[],auth:e,extras:["rate-limiting","todo-example"],id:`${e}-prisma-postgresql-graphql-rate-todo`,note:"Combined GraphQL rate limiting and authenticated todo ownership passed full generated-project runtime certification.",profiles:[t],scenarios:[`${e}-prisma-postgresql-graphql-rate-todo`],status:"certified"})),Es=[["graphql-drizzle","none","postgresql","express"],["graphql-drizzle-fastify","none","postgresql","fastify"],["graphql-drizzle-mysql","none","mysql","express"],["graphql-drizzle-mysql-fastify","none","mysql","fastify"],["graphql-drizzle-sqlite","none","sqlite","express"],["graphql-drizzle-sqlite-fastify","none","sqlite","fastify"],["better-auth-drizzle-graphql","better-auth","postgresql","express"],["better-auth-drizzle-graphql-fastify","better-auth","postgresql","fastify"],["better-auth-drizzle-graphql-mysql","better-auth","mysql","express"],["better-auth-drizzle-graphql-mysql-fastify","better-auth","mysql","fastify"],["better-auth-drizzle-graphql-sqlite","better-auth","sqlite","express"],["better-auth-drizzle-graphql-sqlite-fastify","better-auth","sqlite","fastify"],["passport-drizzle-graphql","passport","postgresql","express"],["passport-drizzle-graphql-fastify","passport","postgresql","fastify"],["passport-drizzle-graphql-mysql","passport","mysql","express"],["passport-drizzle-graphql-mysql-fastify","passport","mysql","fastify"],["passport-drizzle-graphql-sqlite","passport","sqlite","express"],["passport-drizzle-graphql-sqlite-fastify","passport","sqlite","fastify"]],Po=Es.map(([e,t,s,r])=>{const a=`drizzle-graphql-${s}-${t}-${r}-health-todo`;return{addons:[],auth:t,extras:["health-check","todo-example"],id:a,note:`Drizzle GraphQL ${s} ${r} ${t} health and todo combination passed clean generated-project migrations, build, and GraphQL end-to-end checks.`,profiles:[e],scenarios:[a],status:"certified"}}),Ts=[["better-auth-drizzle-graphql","better-auth","postgresql","express"],["better-auth-drizzle-graphql-fastify","better-auth","postgresql","fastify"],["better-auth-drizzle-graphql-mysql","better-auth","mysql","express"],["better-auth-drizzle-graphql-mysql-fastify","better-auth","mysql","fastify"],["better-auth-drizzle-graphql-sqlite","better-auth","sqlite","express"],["better-auth-drizzle-graphql-sqlite-fastify","better-auth","sqlite","fastify"],["passport-drizzle-graphql","passport","postgresql","express"],["passport-drizzle-graphql-fastify","passport","postgresql","fastify"],["passport-drizzle-graphql-mysql","passport","mysql","express"],["passport-drizzle-graphql-mysql-fastify","passport","mysql","fastify"],["passport-drizzle-graphql-sqlite","passport","sqlite","express"],["passport-drizzle-graphql-sqlite-fastify","passport","sqlite","fastify"]],Eo=Ts.map(([e,t,s,r])=>{const a=`drizzle-graphql-${s}-${t}-${r}-rate-todo`;return{addons:[],auth:t,extras:["rate-limiting","todo-example"],id:a,note:`Drizzle GraphQL ${s} ${r} ${t} passed rate limiting and authenticated todo ownership together in a clean generated-project runtime scenario.`,profiles:[e],scenarios:[a],status:"certified"}}),To=Ts.map(([e,t,s,r])=>{const a=`drizzle-graphql-${s}-${t}-${r}-health-rate`;return{addons:[],auth:t,extras:["health-check","rate-limiting"],id:a,note:`Drizzle GraphQL ${s} ${r} ${t} passed clean generated-project migrations, build, readiness and GraphQL rate-limit E2E checks.`,profiles:[e],scenarios:[a],status:"certified"}}),jo=Es.filter(([,e])=>e==="none").map(([e,t,s,r])=>{const a=`drizzle-graphql-${s}-${t}-${r}-health-rate`;return{addons:[],auth:t,extras:["health-check","rate-limiting"],id:a,note:`Unauthenticated Drizzle GraphQL ${s} ${r} passed clean generated-project migrations, build, readiness and GraphQL rate-limit E2E checks.`,profiles:[e],scenarios:[a],status:"certified"}}),Ro=[["passport-drizzle-graphql","postgresql","express"],["passport-drizzle-graphql-fastify","postgresql","fastify"],["passport-drizzle-graphql-mysql","mysql","express"],["passport-drizzle-graphql-mysql-fastify","mysql","fastify"],["passport-drizzle-graphql-sqlite","sqlite","express"],["passport-drizzle-graphql-sqlite-fastify","sqlite","fastify"]],Ao=Ro.map(([e,t,s])=>{const r=`passport-drizzle-graphql-${t}-${s}-full-feature-bundle`;return{addons:["agent-skills","husky","scalar-ui","ultracite"],auth:"passport",extras:["docker","health-check","rate-limiting","swagger","todo-example","typescript-7"],formatter:"oxlint-oxfmt",id:r,note:`Passport Drizzle GraphQL ${t} ${s} passed clean install, migrations, build, authenticated todo E2E, health, Swagger/Scalar, HTTP 429, Husky hooks, Agent Skills, Ultracite, TypeScript 7, Docker build/Compose, and published-port checks.`,profiles:[e],scenarios:[r],status:"certified"}}),$o=[["better-auth-drizzle-graphql","postgresql","express"],["better-auth-drizzle-graphql-fastify","postgresql","fastify"],["better-auth-drizzle-graphql-mysql","mysql","express"],["better-auth-drizzle-graphql-mysql-fastify","mysql","fastify"],["better-auth-drizzle-graphql-sqlite","sqlite","express"],["better-auth-drizzle-graphql-sqlite-fastify","sqlite","fastify"]],Do=$o.map(([e,t,s])=>{const r=`better-auth-drizzle-graphql-${t}-${s}-full-feature-bundle`;return{addons:["agent-skills","husky","scalar-ui","ultracite"],auth:"better-auth",extras:["docker","health-check","rate-limiting","swagger","todo-example","typescript-7"],formatter:"oxlint-oxfmt",id:r,note:`Better Auth Drizzle GraphQL ${t} ${s} passed clean install, auth schema generation, migrations, build, authenticated todo E2E, health, Swagger/Scalar, HTTP 429, Husky hooks, Agent Skills, Ultracite, TypeScript 7, Docker build/Compose, and published-port checks.`,profiles:[e],scenarios:[r],status:"certified"}}),_o=[["better-auth-native-postgres","express"],["better-auth-native-postgres-trpc","express"],["better-auth-native-postgres-fastify","fastify"],["better-auth-native-postgres-fastify-trpc","fastify"]],Co=_o.map(([e,t])=>{const s=`${e}-rest-full-feature-bundle`;return{addons:["agent-skills","husky","scalar-ui","ultracite"],auth:"better-auth",extras:["docker","health-check","rate-limiting","swagger","todo-example","typescript-7"],formatter:"oxlint-oxfmt",id:s,note:`Better Auth native PostgreSQL ${t} REST${e.includes("trpc")?"+tRPC":""} passed clean install, auth generation/migrations, build, unit/E2E, protected todo CRUD, health, Swagger/Scalar, HTTP 429, hooks, skills, Ultracite, Docker build/Compose, and published-port auth probes.`,profiles:[e],scenarios:[s],status:"certified"}}),Lo=[["grpc","fastify","rest","538-microservice-grpc-fastify-rest"],["kafka","fastify","rest","539-microservice-kafka-fastify-rest"],["mqtt","fastify","rest","540-microservice-mqtt-fastify-rest"],["nats","fastify","rest","541-microservice-nats-fastify-rest"],["rabbitmq","fastify","rest","542-microservice-rabbitmq-fastify-rest"],["redis","fastify","rest","543-microservice-redis-fastify-rest"],["grpc","express","trpc","544-microservice-grpc-express-rest-trpc"],["kafka","express","trpc","545-microservice-kafka-express-rest-trpc"],["mqtt","express","trpc","546-microservice-mqtt-express-rest-trpc"],["nats","express","trpc","547-microservice-nats-express-rest-trpc"],["rabbitmq","express","trpc","548-microservice-rabbitmq-express-rest-trpc"],["redis","express","trpc","549-microservice-redis-express-rest-trpc"],["nats","fastify","trpc","550-microservice-nats-fastify-rest-trpc"]].map(([e,t,s,r])=>({addons:[],auth:"none",extras:["docker"],id:`${r}-baseline-evidence`,note:`${r} passed generated tRPC/REST codegen where selected, build, unit/E2E, Docker image/Compose, and published HTTP checks for the exact broker/API/provider shape. Broker request/reply is inherited only from the matching transport's existing direct runtime scenario.`,profiles:[`microservice-${e}${t==="fastify"?"-fastify":""}${s==="trpc"?"-trpc":""}`],scenarios:[r],status:"certified"})),Io=[{addons:["agent-skills","husky","scalar-ui","ultracite"],auth:"none",extras:["docker","health-check","rate-limiting","swagger","todo-example","typescript-7"],formatter:"oxlint-oxfmt",id:"551-microservice-nats-express-rest-trpc-full-feature-bundle",note:"NATS Express REST+tRPC full feature bundle passed clean install, tRPC codegen and CRUD/rate-limit E2E, lint, build, Docker Compose and broker probes, HTTP readiness/throttling, OpenAPI/Scalar, Husky, Agent Skills, Ultracite, TypeScript 7, and cleanup.",profiles:["microservice-nats-trpc"],scenarios:["551-microservice-nats-express-rest-trpc-full-feature-bundle"],status:"certified"},{addons:["agent-skills","husky","scalar-ui","ultracite"],auth:"none",extras:["docker","health-check","rate-limiting","swagger","todo-example","typescript-7"],formatter:"oxlint-oxfmt",id:"552-microservice-nats-fastify-rest-trpc-full-feature-bundle",note:"NATS Fastify REST+tRPC full feature bundle passed clean install, tRPC codegen and CRUD/rate-limit E2E, lint, build, Docker Compose and broker probes, HTTP readiness/throttling, OpenAPI/Scalar, Husky, Agent Skills, Ultracite, TypeScript 7, and cleanup.",profiles:["microservice-nats-fastify-trpc"],scenarios:["552-microservice-nats-fastify-rest-trpc-full-feature-bundle"],status:"certified"}],Q=[...Di.map(e=>({addons:qs,auth:"none",extras:vs,formatter:"oxlint-oxfmt",id:`storage-${e}`,note:"Full storage/transport integration anchor; certified only after its clean-install runtime scenario passes.",profiles:[e],scenarios:[`storage-${e}`],status:Se.includes(e)?"certified":"implemented"})),{addons:["agent-skills","husky","scalar-ui","ultracite"],auth:"better-auth",extras:["docker","health-check","rate-limiting","swagger","todo-example","typescript-7"],formatter:"oxlint-oxfmt",id:"better-auth-prisma-docker-rest-full-feature-bundle",note:"Better Auth Prisma PostgreSQL Docker passed clean install, generation, migrations, build, unit/E2E, OpenAPI/Scalar, rate limiting, Husky, Agent Skills, Ultracite, Docker image/Compose readiness, authenticated signup/session/todo persistence, and cleanup.",profiles:["better-auth-prisma"],scenarios:["better-auth-prisma-docker-rest-full-feature-bundle"],status:"certified"},{addons:["agent-skills","husky","scalar-ui","ultracite"],auth:"better-auth",extras:["docker","health-check","rate-limiting","swagger","todo-example","typescript-7"],formatter:"oxlint-oxfmt",id:"better-auth-prisma-graphql-full-feature-bundle",note:"Better Auth Prisma PostgreSQL GraphQL passed clean install, auth and Prisma generation/migrations, build, GraphQL E2E, OpenAPI/Scalar, GraphQL throttling, Husky, Agent Skills, Ultracite, Docker image/Compose readiness, authenticated signup/session/owner-scoped GraphQL todo persistence, and cleanup.",profiles:["better-auth-prisma-graphql"],scenarios:["better-auth-prisma-graphql-full-feature-bundle"],status:"certified"},{addons:["agent-skills","husky","nestjs-zod","scalar-ui","ultracite"],auth:"better-auth",extras:["docker","health-check","rate-limiting","swagger","todo-example","typescript-7"],formatter:"oxlint-oxfmt",id:"better-auth-prisma-postgresql-zod-full-feature-bundle",note:"Better Auth Prisma PostgreSQL with nestjs-zod passed clean install, auth and Prisma generation/migrations, build, unit/E2E including invalid DTO rejection, Zod-backed OpenAPI/Scalar, rate limiting, Husky, Agent Skills, Ultracite, Docker image/Compose readiness, authenticated signup/session/todo persistence, and cleanup.",profiles:["better-auth-prisma"],scenarios:["better-auth-prisma-postgresql-zod-full-feature-bundle"],status:"certified"},...Ao,...Do,...Co,...["grpc","kafka","mqtt","nats","rabbitmq","redis"].map(e=>({addons:["agent-skills","husky","scalar-ui","ultracite"],auth:"none",extras:["docker","health-check","rate-limiting","swagger","todo-example","typescript-7"],formatter:"oxlint-oxfmt",id:`microservice-${e}-http-full-feature-bundle`,note:`${e} microservice HTTP extras and addon full-feature bundle passed clean install, lint, build, unit/E2E, broker request/reply, HTTP CRUD/health/rate limiting, Swagger/Scalar, Docker Compose, and cleanup.`,profiles:[`microservice-${e}`],scenarios:[`microservice-${e}-http-full-feature-bundle`],status:"certified"})),...Lo,...Io,{addons:["agent-skills","husky","scalar-ui","ultracite"],auth:"passport",extras:["docker","health-check","rate-limiting","swagger","todo-example","typescript-7"],formatter:"oxlint-oxfmt",id:"passport-prisma-postgresql-graphql-full-feature-bundle",note:"Passport Prisma 7 PostgreSQL GraphQL passed clean pnpm install, migrations, build, GraphQL auth and owner-isolated todo E2E, health, Swagger/Scalar, GraphQL HTTP 429, Husky hooks, Agent Skills, Ultracite, TypeScript 7, Docker build/Compose, and published-port checks.",profiles:["passport-prisma-graphql"],scenarios:["passport-prisma-postgresql-graphql-full-feature-bundle"],status:"certified"},{addons:["agent-skills","husky","scalar-ui","ultracite"],auth:"passport",extras:["docker","health-check","rate-limiting","swagger","todo-example","typescript-7"],formatter:"oxlint-oxfmt",id:"passport-external-identity-rest-full-feature-bundle",note:"Passport external identity REST passed clean install, TypeScript build, unit/E2E tests, JWT issuer/audience/signature validation, owner-isolated in-memory todo CRUD, health, Swagger/Scalar, HTTP 429, Husky, Agent Skills, Ultracite, TypeScript 7, Docker Compose, and published-port probes.",profiles:["passport-external-identity"],scenarios:["passport-external-identity-rest-full-feature-bundle"],status:"certified"},{addons:["agent-skills","husky","scalar-ui","ultracite"],auth:"passport",extras:["docker","health-check","rate-limiting","swagger","todo-example","typescript-7"],formatter:"oxlint-oxfmt",id:"passport-prisma-docker-express-full-feature-bundle",note:"Passport Prisma Docker preset passed clean pnpm install, migrations, build, unit/E2E tests, authenticated session and protected todo persistence, health, Swagger/Scalar, HTTP 429, Husky hooks, Agent Skills, Ultracite, TypeScript 7, Docker build/Compose, and published-port checks.",profiles:["passport-prisma-docker"],scenarios:["passport-prisma-docker-rest-full-feature-bundle"],status:"certified"},{addons:["agent-skills","husky","scalar-ui","ultracite"],auth:"better-auth",extras:["docker","health-check","rate-limiting","swagger","todo-example","typescript-7"],formatter:"oxlint-oxfmt",id:"better-auth-prisma-postgresql-express-full-feature-bundle",note:"Better Auth Prisma 7 PostgreSQL REST passed clean pnpm install, auth generation, migrations, build, unit/E2E, authenticated session and protected todo persistence, health, Swagger/Scalar, HTTP 429, Husky hooks, Agent Skills, Ultracite, TypeScript 7, Docker build/Compose, and published-port checks.",profiles:["better-auth-prisma"],scenarios:["better-auth-prisma-postgresql-rest-full-feature-bundle"],status:"certified"},{addons:["agent-skills","husky","nestjs-zod","scalar-ui","ultracite"],auth:"passport",extras:["docker","health-check","rate-limiting","swagger","todo-example","typescript-7"],formatter:"oxlint-oxfmt",id:"passport-prisma-postgresql-express-full-feature-bundle",note:"Passport Prisma 7 PostgreSQL REST passed clean pnpm install, migrations, build, unit/E2E tests, authenticated signup/session and protected todo persistence, health, Swagger/Scalar, HTTP 429, Husky hooks, Agent Skills, Ultracite, TypeScript 7, Docker build/Compose, and published-port checks.",profiles:["passport-prisma"],scenarios:["passport-prisma-postgresql-rest-full-feature-bundle"],status:"certified"},{addons:["agent-skills","husky","nestjs-zod","scalar-ui","ultracite"],auth:"none",extras:["docker","health-check","rate-limiting","swagger","todo-example","typescript-7"],formatter:"oxlint-oxfmt",id:"none-prisma-postgresql-express-full-feature-bundle",note:"Prisma 7 PostgreSQL REST passed clean pnpm install, client generation and migrations, build, unit/E2E, TODO CRUD, health, Swagger/Scalar, HTTP 429, Husky hooks, Agent Skills, Ultracite, TypeScript 7, Docker build/Compose, published-port probes and cleanup in scenario prisma-postgresql-rest-full-feature-bundle.",profiles:["prisma"],scenarios:["prisma-postgresql-rest-full-feature-bundle"],status:"certified"},{addons:["agent-skills","husky","nestjs-zod","scalar-ui","ultracite"],auth:"none",extras:["docker","health-check","rate-limiting","swagger","todo-example","typescript-7"],formatter:"oxlint-oxfmt",id:"none-mongodb-native-express-full-feature-bundle",note:"MongoDB native REST passed pnpm install, Zod validation, unit/E2E, Swagger/Scalar, health, rate limiting, Husky, Agent Skills, Ultracite, TypeScript 7, Docker build/Compose, published-port probes and persistent todo CRUD in scenario mongodb-native-rest-full-feature-bundle.",profiles:["mongodb-native"],scenarios:["mongodb-native-rest-full-feature-bundle"],status:"certified"},{addons:["agent-skills","husky","nestjs-zod","scalar-ui","ultracite"],auth:"none",extras:["docker","health-check","rate-limiting","swagger","todo-example","typescript-7"],formatter:"oxlint-oxfmt",id:"none-prisma8-postgres-express-full-feature-bundle",note:"The Prisma 8 PostgreSQL Express profile passed clean pnpm install, contract emit and migrations, build, unit/E2E tests, TODO CRUD, health/readiness, Swagger/Scalar, HTTP 429, Husky hooks, Agent Skills, Ultracite, TypeScript 7, Docker build/Compose, and published-port checks in scenario prisma8-postgres-rest-full-feature-bundle.",profiles:["prisma8-postgres"],scenarios:["prisma8-postgres-rest-full-feature-bundle"],status:"certified"},{addons:["agent-skills","husky","nestjs-zod","scalar-ui","ultracite"],auth:"none",extras:["docker","health-check","rate-limiting","swagger","todo-example","typescript-7"],formatter:"oxlint-oxfmt",id:"none-prisma-postgresql-graphql-full-feature-bundle",note:"Unauthenticated Prisma 7 PostgreSQL GraphQL passed the complete supported single-app feature bundle, including Docker, readiness, rate limiting, todo CRUD, OpenAPI/Scalar, validation, Husky, skills, Ultracite, and TypeScript 7.",profiles:["graphql-prisma"],scenarios:["graphql-prisma-postgresql-full-feature-bundle"],status:"certified"},{addons:["agent-skills","husky","nestjs-zod","scalar-ui","ultracite"],auth:"none",extras:["docker","health-check","rate-limiting","swagger","todo-example","typescript-7"],formatter:"oxlint-oxfmt",id:"none-drizzle-graphql-full-feature-bundles",note:"Unauthenticated Drizzle GraphQL across PostgreSQL, MySQL, and SQLite on Express and Fastify passed the complete supported single-app feature bundle, including Docker, readiness, rate limiting, todo CRUD, OpenAPI/Scalar, validation, Husky, skills, Ultracite, and TypeScript 7.",profiles:["graphql-drizzle","graphql-drizzle-fastify","graphql-drizzle-mysql","graphql-drizzle-mysql-fastify","graphql-drizzle-sqlite","graphql-drizzle-sqlite-fastify"],scenarios:["graphql-drizzle-postgresql-express-full-feature-bundle","graphql-drizzle-postgresql-fastify-full-feature-bundle","graphql-drizzle-mysql-express-full-feature-bundle","graphql-drizzle-mysql-fastify-full-feature-bundle","graphql-drizzle-sqlite-express-full-feature-bundle","graphql-drizzle-sqlite-fastify-full-feature-bundle"],status:"certified"},{addons:["agent-skills","husky","scalar-ui","ultracite"],auth:"better-auth:stateless",extras:["docker","health-check","rate-limiting","swagger","todo-example","typescript-7"],formatter:"oxlint-oxfmt",id:"stateless-auth-full-feature-bundles",note:"Stateless Better Auth REST and REST+tRPC profiles across Express, Fastify, Drizzle, and TypeORM passed full generated-project certification, including OIDC sessions, protected todo CRUD, Docker readiness, and published HTTP/rate-limit probes.",profiles:["better-auth-stateless","better-auth-stateless-fastify","better-auth-stateless-trpc","better-auth-stateless-fastify-trpc","better-auth-stateless-drizzle","better-auth-stateless-typeorm"],scenarios:["better-auth-stateless-rest-full-feature-bundle","better-auth-stateless-fastify-rest-full-feature-bundle","better-auth-stateless-trpc-rest-full-feature-bundle","better-auth-stateless-fastify-trpc-rest-full-feature-bundle","better-auth-stateless-drizzle-rest-full-feature-bundle","better-auth-stateless-typeorm-rest-full-feature-bundle"],status:"certified"},...eo,...bo,...vo,...xo,...So,...so,...ao,...oo,...po,...co,...mo,...fo,...go,...wo,...Po,...Eo,...To,...jo,{addons:["husky","nestjs-zod","scalar-ui","ultracite"],auth:"passport",extras:["docker","health-check","rate-limiting","swagger","todo-example","typescript-7"],formatter:"oxlint-oxfmt",id:"passport-prisma-sqlserver-fastify-full-feature-bundle",note:"Scenario passport-prisma-sqlserver-fastify-rest-full-feature-bundle passed clean pnpm installation, Prisma 7 SQL Server migrations and deploy, build, unit/E2E, authenticated todo ownership, Swagger/Scalar, rate limiting, Docker image/readiness, and published-port signup/session/todo persistence.",profiles:["passport-prisma-sqlserver-fastify"],scenarios:["passport-prisma-sqlserver-fastify-rest-full-feature-bundle"],status:"certified"},{addons:["husky","nestjs-zod","scalar-ui","ultracite"],auth:"passport",extras:["docker","health-check","rate-limiting","swagger","todo-example","typescript-7"],formatter:"oxlint-oxfmt",id:"passport-prisma-sqlserver-express-full-feature-bundle",note:"Scenario passport-prisma-sqlserver-express-rest-full-feature-bundle passed clean pnpm installation, Prisma 7 SQL Server migrations and deploy, build, unit/E2E, authenticated todo ownership, Swagger/Scalar, rate limiting, Docker image/readiness, and published-port signup/session/todo persistence.",profiles:["passport-prisma-sqlserver"],scenarios:["passport-prisma-sqlserver-express-rest-full-feature-bundle"],status:"certified"},...Yi,{addons:["agent-skills"],auth:"any",extras:[],id:"single-app-agent-skills-transferable",note:"Agent skill installation and integrity checks are generator-independent and pass across representative unauthenticated, Better Auth, and Passport single-app profiles; exact feature combinations remain subject to profile-specific integration evidence.",scenarios:["210-passport-drizzle-agent-skills","212-better-auth-prisma-agent-skills","213-passport-typeorm-agent-skills","316-passport-prisma-mongo-agent-skills"],status:"certified"},{addons:["husky"],auth:"any",extras:[],id:"single-app-husky-transferable",note:"Husky hook installation and commit behavior are package-level features verified in clean pnpm single-app projects across multiple ORMs and auth providers.",scenarios:["215-passport-typeorm-mysql-husky-ultracite","216-passport-typeorm-sqlite-husky-ultracite","217-passport-drizzle-mysql-husky-ultracite","218-passport-drizzle-sqlite-husky-ultracite","sqlserver-typeorm-rest-full-feature-bundle","sqlserver-drizzle-rest-full-feature-bundle"],status:"certified"},{addons:[],auth:"any",extras:["typescript-7"],id:"single-app-typescript-7-transferable",note:"The TypeScript 7 compiler/toolchain is verified in single-app Express and Fastify bundles and is independent of the selected supported ORM, database, or auth adapter; generated integration code still requires its own profile evidence.",scenarios:["482-prisma-sqlserver-express-full-stack","483-prisma-sqlserver-fastify-full-stack","sqlserver-typeorm-rest-full-feature-bundle","sqlserver-drizzle-rest-full-feature-bundle"],status:"certified"},{addons:["agent-skills","husky","nestjs-zod","scalar-ui","ultracite"],auth:"none",extras:["docker","health-check","rate-limiting","swagger","todo-example","typescript-7"],formatter:"oxlint-oxfmt",id:"none-typeorm-sqlserver-express-full-feature-bundle",note:"Scenario sqlserver-typeorm-rest-full-feature-bundle passed clean pnpm install, agent skill hashes, Husky hooks, Ultracite setup/fix/check, TypeScript 7 build, SQL Server synchronization, unit/E2E tests, Zod validation, Swagger/Scalar runtime, health check, HTTP 429, Docker image and readiness, and published-port todo CRUD.",profiles:["typeorm-sqlserver-express"],scenarios:["sqlserver-typeorm-rest-full-feature-bundle"],status:"certified"},{addons:["agent-skills","husky","nestjs-zod","scalar-ui","ultracite"],auth:"none",extras:["docker","health-check","rate-limiting","swagger","todo-example","typescript-7"],formatter:"oxlint-oxfmt",id:"none-drizzle-sqlserver-express-full-feature-bundle",note:"Scenario sqlserver-drizzle-rest-full-feature-bundle passed clean pnpm install, agent skill hashes, Husky hooks, Ultracite setup/fix/check, TypeScript 7 build, SQL Server schema push, unit/E2E tests, Zod validation, Swagger/Scalar runtime, health check, HTTP 429, Docker image and readiness, and published-port todo CRUD.",profiles:["drizzle-sqlserver-express"],scenarios:["sqlserver-drizzle-rest-full-feature-bundle"],status:"certified"},{addons:["agent-skills","husky","nestjs-zod","scalar-ui","ultracite"],auth:"none",extras:["docker","health-check","rate-limiting","swagger","todo-example","typescript-7"],formatter:"oxlint-oxfmt",id:"none-typeorm-postgresql-express-full-feature-bundle",note:"The clean pnpm Express scenario passed PostgreSQL TypeORM schema sync, build, unit/E2E tests, Zod validation, Swagger/Scalar, health, rate-limit 429, Docker readiness, todo CRUD through the published port, Husky hooks, skills, and Ultracite.",profiles:["typeorm-postgresql-express"],scenarios:["typeorm-postgresql-rest-full-feature-bundle"],status:"certified"},{addons:["agent-skills","husky","nestjs-zod","scalar-ui","ultracite"],auth:"none",extras:["docker","health-check","rate-limiting","swagger","todo-example","typescript-7"],formatter:"oxlint-oxfmt",id:"none-typeorm-mysql-express-full-feature-bundle",note:"The clean pnpm Express scenario passed MySQL TypeORM schema sync, build, unit/E2E tests, Zod validation, Swagger/Scalar, health, rate-limit 429, Docker readiness, todo CRUD through the published port, Husky hooks, skills, and Ultracite.",profiles:["typeorm-mysql-express"],scenarios:["typeorm-mysql-rest-full-feature-bundle"],status:"certified"},{addons:["agent-skills","husky","nestjs-zod","scalar-ui","ultracite"],auth:"none",extras:["docker","health-check","rate-limiting","swagger","todo-example","typescript-7"],formatter:"oxlint-oxfmt",id:"none-typeorm-sqlite-express-full-feature-bundle",note:"The clean pnpm Express scenario passed SQLite TypeORM schema sync, build, unit/E2E tests, Zod validation, Swagger/Scalar, health, rate-limit 429, Docker readiness, todo CRUD through the published port, Husky hooks, skills, and Ultracite.",profiles:["typeorm-sqlite-express"],scenarios:["typeorm-sqlite-rest-full-feature-bundle"],status:"certified"},{addons:["agent-skills","husky","nestjs-zod","scalar-ui","ultracite"],auth:"none",extras:["docker","health-check","rate-limiting","swagger","todo-example","typescript-7"],formatter:"oxlint-oxfmt",id:"none-drizzle-postgresql-express-full-feature-bundle",note:"The clean pnpm Express scenario passed PostgreSQL Drizzle migrations, build, unit/E2E tests, Zod validation, Swagger/Scalar, health, rate-limit 429, Docker readiness, todo CRUD through the published port, Husky hooks, skills, and Ultracite.",profiles:["drizzle-postgresql-express"],scenarios:["drizzle-postgresql-rest-full-feature-bundle"],status:"certified"},{addons:["agent-skills","husky","nestjs-zod","scalar-ui","ultracite"],auth:"none",extras:["docker","health-check","rate-limiting","swagger","todo-example","typescript-7"],formatter:"oxlint-oxfmt",id:"none-drizzle-mysql-express-full-feature-bundle",note:"The clean pnpm Express scenario passed MySQL Drizzle migrations, build, unit/E2E tests, Zod validation, Swagger/Scalar, health, rate-limit 429, Docker readiness, todo CRUD through the published port, Husky hooks, skills, and Ultracite.",profiles:["drizzle-mysql-express"],scenarios:["drizzle-mysql-rest-full-feature-bundle"],status:"certified"},{addons:["agent-skills","husky","nestjs-zod","scalar-ui","ultracite"],auth:"none",extras:["docker","health-check","rate-limiting","swagger","todo-example","typescript-7"],formatter:"oxlint-oxfmt",id:"none-drizzle-sqlite-express-full-feature-bundle",note:"The clean pnpm Express scenario passed SQLite Drizzle migrations, build, unit/E2E tests, Zod validation, Swagger/Scalar, health, rate-limit 429, Docker readiness, todo CRUD through the published port, Husky hooks, skills, and Ultracite.",profiles:["drizzle-sqlite-express"],scenarios:["drizzle-sqlite-rest-full-feature-bundle"],status:"certified"},{addons:[],auth:"none",extras:["docker","swagger","todo-example"],id:"none-typeorm-sqlserver-express-docker-swagger-todo",note:"Scenario sqlserver-typeorm-rest-docker-swagger-todo passed clean pnpm installation, SQL Server schema synchronization, build, unit/E2E tests, Swagger runtime check, Docker image build, healthy Compose startup, and unauthenticated todo CRUD through the published application port.",profiles:["typeorm-sqlserver-express"],scenarios:["sqlserver-typeorm-rest-docker-swagger-todo"],status:"certified"},{addons:[],auth:"none",extras:["docker","swagger","todo-example"],id:"none-drizzle-sqlserver-express-docker-swagger-todo",note:"Scenario sqlserver-drizzle-rest-docker-swagger-todo passed clean pnpm installation, SQL Server schema push, build, unit/E2E tests, Swagger runtime check, Docker image build, healthy Compose startup, and unauthenticated todo CRUD through the published application port.",profiles:["drizzle-sqlserver-express"],scenarios:["sqlserver-drizzle-rest-docker-swagger-todo"],status:"certified"},{addons:["agent-skills","husky","scalar-ui","ultracite"],auth:"none",extras:["docker","rate-limiting","swagger","todo-example"],formatter:"oxlint-oxfmt",id:"none-prisma-sqlserver-agent-skills-docker-husky-rate-limiting-scalar-ui-swagger-todo-example-ultracite",note:"Scenario sqlserver-matrix-express-agent-skills-docker-husky-rate-limiting-scalar-ui-swagger-todo-example-ultracite passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for agent-skills, docker, husky, rate-limiting, scalar-ui, swagger, todo-example, ultracite.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-agent-skills-docker-husky-rate-limiting-scalar-ui-swagger-todo-example-ultracite"],status:"certified"},{addons:["husky","ultracite"],auth:"none",extras:["health-check"],formatter:"oxlint-oxfmt",id:"none-prisma-sqlserver-health-check-husky-ultracite",note:"Scenario sqlserver-matrix-express-health-check-husky-ultracite passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for health-check, husky, ultracite.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-health-check-husky-ultracite"],status:"certified"},{addons:["husky","ultracite"],auth:"none",extras:["rate-limiting"],formatter:"oxlint-oxfmt",id:"none-prisma-sqlserver-husky-rate-limiting-ultracite",note:"Scenario sqlserver-matrix-express-husky-rate-limiting-ultracite passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for husky, rate-limiting, ultracite.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-husky-rate-limiting-ultracite"],status:"certified"},{addons:["husky","scalar-ui"],auth:"none",extras:["swagger"],id:"none-prisma-sqlserver-husky-scalar-ui-swagger",note:"Scenario sqlserver-matrix-express-husky-scalar-ui-swagger passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for husky, scalar-ui, swagger.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-husky-scalar-ui-swagger"],status:"certified"},{addons:["husky","ultracite"],auth:"none",extras:["swagger"],formatter:"oxlint-oxfmt",id:"none-prisma-sqlserver-husky-swagger-ultracite",note:"Scenario sqlserver-matrix-express-husky-swagger-ultracite passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for husky, swagger, ultracite.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-husky-swagger-ultracite"],status:"certified"},{addons:["agent-skills","scalar-ui"],auth:"none",extras:["swagger"],id:"none-prisma-sqlserver-agent-skills-scalar-ui-swagger",note:"Scenario sqlserver-matrix-express-agent-skills-scalar-ui-swagger passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for agent-skills, scalar-ui, swagger.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-agent-skills-scalar-ui-swagger"],status:"certified"},{addons:["agent-skills","ultracite"],auth:"none",extras:["swagger"],formatter:"oxlint-oxfmt",id:"none-prisma-sqlserver-agent-skills-swagger-ultracite",note:"Scenario sqlserver-matrix-express-agent-skills-swagger-ultracite passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for agent-skills, swagger, ultracite.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-agent-skills-swagger-ultracite"],status:"certified"},{addons:["agent-skills","ultracite"],auth:"none",extras:["todo-example"],formatter:"oxlint-oxfmt",id:"none-prisma-sqlserver-agent-skills-todo-example-ultracite",note:"Scenario sqlserver-matrix-express-agent-skills-todo-example-ultracite passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for agent-skills, todo-example, ultracite.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-agent-skills-todo-example-ultracite"],status:"certified"},{addons:["husky","ultracite"],auth:"none",extras:["docker"],formatter:"oxlint-oxfmt",id:"none-prisma-sqlserver-docker-husky-ultracite",note:"Scenario sqlserver-matrix-express-docker-husky-ultracite passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for docker, husky, ultracite.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-docker-husky-ultracite"],status:"certified"},{addons:["agent-skills","husky"],auth:"none",extras:["rate-limiting"],id:"none-prisma-sqlserver-agent-skills-husky-rate-limiting",note:"Scenario sqlserver-matrix-express-agent-skills-husky-rate-limiting passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for agent-skills, husky, rate-limiting.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-agent-skills-husky-rate-limiting"],status:"certified"},{addons:["agent-skills","husky"],auth:"none",extras:["swagger"],id:"none-prisma-sqlserver-agent-skills-husky-swagger",note:"Scenario sqlserver-matrix-express-agent-skills-husky-swagger passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for agent-skills, husky, swagger.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-agent-skills-husky-swagger"],status:"certified"},{addons:["agent-skills","husky"],auth:"none",extras:["todo-example"],id:"none-prisma-sqlserver-agent-skills-husky-todo-example",note:"Scenario sqlserver-matrix-express-agent-skills-husky-todo-example passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for agent-skills, husky, todo-example.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-agent-skills-husky-todo-example"],status:"certified"},{addons:["agent-skills","ultracite"],auth:"none",extras:["rate-limiting"],formatter:"oxlint-oxfmt",id:"none-prisma-sqlserver-agent-skills-rate-limiting-ultracite",note:"Scenario sqlserver-matrix-express-agent-skills-rate-limiting-ultracite passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for agent-skills, rate-limiting, ultracite.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-agent-skills-rate-limiting-ultracite"],status:"certified"},{addons:["agent-skills","husky"],auth:"none",extras:["docker"],id:"none-prisma-sqlserver-agent-skills-docker-husky",note:"Scenario sqlserver-matrix-express-agent-skills-docker-husky passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for agent-skills, docker, husky.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-agent-skills-docker-husky"],status:"certified"},{addons:["agent-skills","ultracite"],auth:"none",extras:["docker"],formatter:"oxlint-oxfmt",id:"none-prisma-sqlserver-agent-skills-docker-ultracite",note:"Scenario sqlserver-matrix-express-agent-skills-docker-ultracite passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for agent-skills, docker, ultracite.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-agent-skills-docker-ultracite"],status:"certified"},{addons:["agent-skills","husky"],auth:"none",extras:["health-check"],id:"none-prisma-sqlserver-agent-skills-health-check-husky",note:"Scenario sqlserver-matrix-express-agent-skills-health-check-husky passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for agent-skills, health-check, husky.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-agent-skills-health-check-husky"],status:"certified"},{addons:["agent-skills","ultracite"],auth:"none",extras:["health-check"],formatter:"oxlint-oxfmt",id:"none-prisma-sqlserver-agent-skills-health-check-ultracite",note:"Scenario sqlserver-matrix-express-agent-skills-health-check-ultracite passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for agent-skills, health-check, ultracite.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-agent-skills-health-check-ultracite"],status:"certified"},{addons:["husky"],auth:"none",extras:["docker","rate-limiting"],id:"none-prisma-sqlserver-docker-husky-rate-limiting",note:"Scenario sqlserver-matrix-express-docker-husky-rate-limiting passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for docker, husky, rate-limiting.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-docker-husky-rate-limiting"],status:"certified"},{addons:["husky"],auth:"none",extras:["docker","swagger"],id:"none-prisma-sqlserver-docker-husky-swagger",note:"Scenario sqlserver-matrix-express-docker-husky-swagger passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for docker, husky, swagger.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-docker-husky-swagger"],status:"certified"},{addons:["husky"],auth:"none",extras:["docker","todo-example"],id:"none-prisma-sqlserver-docker-husky-todo-example",note:"Scenario sqlserver-matrix-express-docker-husky-todo-example passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for docker, husky, todo-example.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-docker-husky-todo-example"],status:"certified"},{addons:["ultracite"],auth:"none",extras:["docker","rate-limiting"],formatter:"oxlint-oxfmt",id:"none-prisma-sqlserver-docker-rate-limiting-ultracite",note:"Scenario sqlserver-matrix-express-docker-rate-limiting-ultracite passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for docker, rate-limiting, ultracite.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-docker-rate-limiting-ultracite"],status:"certified"},{addons:["agent-skills"],auth:"none",extras:["rate-limiting","todo-example"],id:"none-prisma-sqlserver-agent-skills-rate-limiting-todo-example",note:"Scenario sqlserver-matrix-express-agent-skills-rate-limiting-todo-example passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for agent-skills, rate-limiting, todo-example.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-agent-skills-rate-limiting-todo-example"],status:"certified"},{addons:["agent-skills"],auth:"none",extras:["swagger","todo-example"],id:"none-prisma-sqlserver-agent-skills-swagger-todo-example",note:"Scenario sqlserver-matrix-express-agent-skills-swagger-todo-example passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for agent-skills, swagger, todo-example.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-agent-skills-swagger-todo-example"],status:"certified"},{addons:["husky"],auth:"none",extras:["docker","health-check"],id:"none-prisma-sqlserver-docker-health-check-husky",note:"Scenario sqlserver-matrix-express-docker-health-check-husky passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for docker, health-check, husky.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-docker-health-check-husky"],status:"certified"},{addons:["ultracite"],auth:"none",extras:["docker","health-check"],formatter:"oxlint-oxfmt",id:"none-prisma-sqlserver-docker-health-check-ultracite",note:"Scenario sqlserver-matrix-express-docker-health-check-ultracite passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for docker, health-check, ultracite.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-docker-health-check-ultracite"],status:"certified"},{addons:["agent-skills"],auth:"none",extras:["health-check","rate-limiting"],id:"none-prisma-sqlserver-agent-skills-health-check-rate-limiting",note:"Scenario sqlserver-matrix-express-agent-skills-health-check-rate-limiting passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for agent-skills, health-check, rate-limiting.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-agent-skills-health-check-rate-limiting"],status:"certified"},{addons:["agent-skills"],auth:"none",extras:["health-check","swagger"],id:"none-prisma-sqlserver-agent-skills-health-check-swagger",note:"Scenario sqlserver-matrix-express-agent-skills-health-check-swagger passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for agent-skills, health-check, swagger.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-agent-skills-health-check-swagger"],status:"certified"},{addons:["agent-skills"],auth:"none",extras:["health-check","todo-example"],id:"none-prisma-sqlserver-agent-skills-health-check-todo-example",note:"Scenario sqlserver-matrix-express-agent-skills-health-check-todo-example passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for agent-skills, health-check, todo-example.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-agent-skills-health-check-todo-example"],status:"certified"},{addons:["agent-skills"],auth:"none",extras:["rate-limiting","swagger"],id:"none-prisma-sqlserver-agent-skills-rate-limiting-swagger",note:"Scenario sqlserver-matrix-express-agent-skills-rate-limiting-swagger passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for agent-skills, rate-limiting, swagger.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-agent-skills-rate-limiting-swagger"],status:"certified"},{addons:["agent-skills"],auth:"none",extras:["docker","health-check"],id:"none-prisma-sqlserver-agent-skills-docker-health-check",note:"Scenario sqlserver-matrix-express-agent-skills-docker-health-check passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for agent-skills, docker, health-check.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-agent-skills-docker-health-check"],status:"certified"},{addons:["agent-skills"],auth:"none",extras:["docker","rate-limiting"],id:"none-prisma-sqlserver-agent-skills-docker-rate-limiting",note:"Scenario sqlserver-matrix-express-agent-skills-docker-rate-limiting passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for agent-skills, docker, rate-limiting.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-agent-skills-docker-rate-limiting"],status:"certified"},{addons:["agent-skills"],auth:"none",extras:["docker","swagger"],id:"none-prisma-sqlserver-agent-skills-docker-swagger",note:"Scenario sqlserver-matrix-express-agent-skills-docker-swagger passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for agent-skills, docker, swagger.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-agent-skills-docker-swagger"],status:"certified"},{addons:["agent-skills"],auth:"none",extras:["docker","todo-example"],id:"none-prisma-sqlserver-agent-skills-docker-todo-example",note:"Scenario sqlserver-matrix-express-agent-skills-docker-todo-example passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for agent-skills, docker, todo-example.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-agent-skills-docker-todo-example"],status:"certified"},{addons:["husky"],auth:"none",extras:["todo-example"],id:"none-prisma-sqlserver-husky-todo-example",note:"Scenario sqlserver-matrix-express-husky-todo-example passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for husky, todo-example.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-husky-todo-example"],status:"certified"},{addons:["ultracite"],auth:"none",extras:["rate-limiting"],formatter:"oxlint-oxfmt",id:"none-prisma-sqlserver-rate-limiting-ultracite",note:"Scenario sqlserver-matrix-express-rate-limiting-ultracite passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for rate-limiting, ultracite.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-rate-limiting-ultracite"],status:"certified"},{addons:["ultracite"],auth:"none",extras:["swagger"],formatter:"oxlint-oxfmt",id:"none-prisma-sqlserver-swagger-ultracite",note:"Scenario sqlserver-matrix-express-swagger-ultracite passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for swagger, ultracite.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-swagger-ultracite"],status:"certified"},{addons:["ultracite"],auth:"none",extras:["todo-example"],formatter:"oxlint-oxfmt",id:"none-prisma-sqlserver-todo-example-ultracite",note:"Scenario sqlserver-matrix-express-todo-example-ultracite passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for todo-example, ultracite.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-todo-example-ultracite"],status:"certified"},{addons:["agent-skills","husky","scalar-ui","ultracite"],auth:"none",extras:["docker","swagger","todo-example"],formatter:"oxlint-oxfmt",id:"none-prisma-sqlserver-express-docker-swagger-todo-all-addons",note:"Scenario 541 passed clean pnpm install, Prisma 7 SQL Server migrations, build, unit/E2E, Ultracite fix/check, Agent Skills integrity, OpenAPI + Scalar runtime, Docker Compose startup and HTTP 200, and Husky accepting/rejecting hooks.",profiles:["prisma-sqlserver"],scenarios:["541-prisma-sqlserver-express-docker-swagger-todo-all-addons"],status:"certified"},{addons:["husky"],auth:"none",extras:["docker"],id:"none-prisma-sqlserver-express-docker-husky",note:"SQL Server Prisma 7 Express passed Docker image build, Compose published HTTP 200, cleanup, and Husky passing/failing commit checks with the Docker extra.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-docker-husky"],status:"certified"},{addons:["husky"],auth:"none",extras:["docker"],id:"none-prisma-sqlserver-fastify-docker-husky",note:"SQL Server Prisma 7 Fastify passed Docker image build, Compose published HTTP 200, cleanup, and Husky passing/failing commit checks with the Docker extra.",profiles:["prisma-sqlserver-fastify"],scenarios:["sqlserver-matrix-fastify-docker-husky"],status:"certified"},{addons:["ultracite"],auth:"none",extras:["docker"],formatter:"oxlint-oxfmt",id:"none-prisma-sqlserver-express-docker-ultracite",note:"SQL Server Prisma 7 Express passed Docker image build, Compose published HTTP 200, cleanup, and Oxlint/Oxfmt Ultracite checks with the Docker extra.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-docker-ultracite"],status:"certified"},{addons:["ultracite"],auth:"none",extras:["docker"],formatter:"oxlint-oxfmt",id:"none-prisma-sqlserver-fastify-docker-ultracite",note:"SQL Server Prisma 7 Fastify passed Docker image build, Compose published HTTP 200, cleanup, and Oxlint/Oxfmt Ultracite checks with the Docker extra.",profiles:["prisma-sqlserver-fastify"],scenarios:["sqlserver-matrix-fastify-docker-ultracite"],status:"certified"},{addons:["husky"],auth:"none",extras:["docker","rate-limiting","swagger","todo-example"],id:"none-prisma-sqlserver-express-husky-docker-rate-swagger-todo",note:"Scenario 538 passed SQL Server migrations, todo E2E, OpenAPI, throttling, Docker build and Compose HTTP probes on an available host port, and Husky pass/fail hooks.",profiles:["prisma-sqlserver"],scenarios:["538-prisma-sqlserver-express-husky-docker-rate-swagger-todo"],status:"certified"},{addons:["ultracite"],auth:"none",extras:["docker","rate-limiting","swagger","todo-example"],formatter:"oxlint-oxfmt",id:"none-prisma-sqlserver-express-ultracite-docker-rate-swagger-todo",note:"Scenario 539 passed SQL Server migrations, todo E2E, OpenAPI, throttling, Docker build and Compose HTTP probes on an available host port, and Ultracite checks.",profiles:["prisma-sqlserver"],scenarios:["539-prisma-sqlserver-express-ultracite-docker-rate-swagger-todo"],status:"certified"},{addons:["husky","ultracite"],auth:"none",extras:["docker","rate-limiting","swagger","todo-example"],formatter:"oxlint-oxfmt",id:"none-prisma-sqlserver-express-husky-ultracite-docker-rate-swagger-todo",note:"Scenario 540 passed SQL Server migrations, todo E2E, OpenAPI, throttling, Docker build and Compose HTTP probes on an available host port, Ultracite checks, and Husky pass/fail hooks.",profiles:["prisma-sqlserver"],scenarios:["540-prisma-sqlserver-express-husky-ultracite-docker-rate-swagger-todo"],status:"certified"},{addons:["agent-skills"],auth:"none",extras:["todo-example"],id:"none-prisma-sqlserver-express-agent-skills-todo",note:"SQL Server Prisma 7 Express passed agent-skill integrity, migrations, build, unit/E2E, and todo CRUD checks.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-agent-skills-todo-example"],status:"certified"},{addons:["husky"],auth:"none",extras:["rate-limiting"],id:"none-prisma-sqlserver-express-husky-rate-limit",note:"SQL Server Prisma 7 Express passed migrations, build, unit/E2E, runtime HTTP 429 checks, and Husky passing/failing commit hooks.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-husky-rate-limiting"],status:"certified"},{addons:["husky"],auth:"none",extras:["rate-limiting"],id:"none-prisma-sqlserver-fastify-husky-rate-limit",note:"SQL Server Prisma 7 Fastify passed migrations, build, unit/E2E, runtime HTTP 429 checks, and Husky passing/failing commit hooks.",profiles:["prisma-sqlserver-fastify"],scenarios:["sqlserver-matrix-fastify-husky-rate-limiting"],status:"certified"},{addons:["husky"],auth:"none",extras:["swagger"],id:"none-prisma-sqlserver-express-husky-swagger",note:"SQL Server Prisma 7 Express passed migrations, build, unit/E2E, OpenAPI runtime checks, and Husky passing/failing commit hooks.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-husky-swagger"],status:"certified"},{addons:["agent-skills"],auth:"none",extras:["todo-example"],id:"none-prisma-sqlserver-fastify-agent-skills-todo",note:"SQL Server Prisma 7 Fastify passed agent-skill integrity, migrations, build, unit/E2E, and todo CRUD checks.",profiles:["prisma-sqlserver-fastify"],scenarios:["sqlserver-matrix-fastify-agent-skills-todo-example"],status:"certified"},{addons:["agent-skills"],auth:"none",extras:["rate-limiting"],id:"none-prisma-sqlserver-express-agent-skills-rate-limit",note:"SQL Server Prisma 7 Express passed agent-skill integrity, migrations, build, unit/E2E, and compiled HTTP 429 checks.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-agent-skills-rate-limiting"],status:"certified"},{addons:["agent-skills"],auth:"none",extras:["rate-limiting"],id:"none-prisma-sqlserver-fastify-agent-skills-rate-limit",note:"SQL Server Prisma 7 Fastify passed agent-skill integrity, migrations, build, unit/E2E, and compiled HTTP 429 checks.",profiles:["prisma-sqlserver-fastify"],scenarios:["sqlserver-matrix-fastify-agent-skills-rate-limiting"],status:"certified"},{addons:["agent-skills"],auth:"none",extras:["swagger"],id:"none-prisma-sqlserver-express-agent-skills-swagger",note:"SQL Server Prisma 7 Express passed agent-skill integrity, migrations, build, unit/E2E, and runtime OpenAPI checks.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-agent-skills-swagger"],status:"certified"},{addons:["agent-skills"],auth:"none",extras:["swagger"],id:"none-prisma-sqlserver-fastify-agent-skills-swagger",note:"SQL Server Prisma 7 Fastify passed agent-skill integrity, migrations, build, unit/E2E, and runtime OpenAPI checks.",profiles:["prisma-sqlserver-fastify"],scenarios:["sqlserver-matrix-fastify-agent-skills-swagger"],status:"certified"},{addons:["agent-skills"],auth:"none",extras:["docker"],id:"none-prisma-sqlserver-express-agent-skills-docker",note:"SQL Server Prisma 7 Express passed skill-integrity checks, migrations, build, unit/E2E, Docker image build, Compose readiness, published HTTP 200, and cleanup.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-agent-skills-docker"],status:"certified"},{addons:["agent-skills"],auth:"none",extras:["docker"],id:"none-prisma-sqlserver-fastify-agent-skills-docker",note:"SQL Server Prisma 7 Fastify passed skill-integrity checks, migrations, build, unit/E2E, Docker image build, Compose readiness, published HTTP 200, and cleanup.",profiles:["prisma-sqlserver-fastify"],scenarios:["sqlserver-matrix-fastify-agent-skills-docker"],status:"certified"},{addons:["agent-skills"],auth:"none",extras:["health-check"],id:"none-prisma-sqlserver-express-agent-skills-health-check",note:"SQL Server Prisma 7 Express passed skill-integrity checks, migrations, build, unit/E2E, and health readiness/outage assertions.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-agent-skills-health-check"],status:"certified"},{addons:["agent-skills"],auth:"none",extras:["health-check"],id:"none-prisma-sqlserver-fastify-agent-skills-health-check",note:"SQL Server Prisma 7 Fastify passed skill-integrity checks, migrations, build, unit/E2E, and health readiness/outage assertions.",profiles:["prisma-sqlserver-fastify"],scenarios:["sqlserver-matrix-fastify-agent-skills-health-check"],status:"certified"},{addons:["husky"],auth:"none",extras:["health-check"],id:"none-prisma-sqlserver-express-husky-health-check",note:"SQL Server Prisma 7 Express passed migrations, build, health readiness/outage E2E, and Husky passing/failing commit hooks.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-health-check-husky"],status:"certified"},{addons:["husky"],auth:"none",extras:["health-check"],id:"none-prisma-sqlserver-fastify-husky-health-check",note:"SQL Server Prisma 7 Fastify passed migrations, build, health readiness/outage E2E, and Husky passing/failing commit hooks.",profiles:["prisma-sqlserver-fastify"],scenarios:["sqlserver-matrix-fastify-health-check-husky"],status:"certified"},{addons:["ultracite"],auth:"none",extras:["health-check"],formatter:"oxlint-oxfmt",id:"none-prisma-sqlserver-express-ultracite-health-check",note:"SQL Server Prisma 7 Express passed migrations, build, health readiness/outage E2E, and Oxlint/Oxfmt Ultracite fix/check.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-health-check-ultracite"],status:"certified"},{addons:["ultracite"],auth:"none",extras:["health-check"],formatter:"oxlint-oxfmt",id:"none-prisma-sqlserver-fastify-ultracite-health-check",note:"SQL Server Prisma 7 Fastify passed migrations, build, health readiness/outage E2E, and Oxlint/Oxfmt Ultracite fix/check.",profiles:["prisma-sqlserver-fastify"],scenarios:["sqlserver-matrix-fastify-health-check-ultracite"],status:"certified"},{addons:[],auth:"none",extras:["docker","health-check","rate-limiting","swagger","todo-example"],id:"none-prisma-sqlserver-express-full-extras",note:"SQL Server Prisma 7 Express passed migrations, build, unit/E2E, health and outage, OpenAPI, todo CRUD, HTTP 429, Docker readiness, published HTTP 200/429, and cleanup.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-docker-health-check-rate-limiting-swagger-todo-example"],status:"certified"},{addons:[],auth:"none",extras:["docker","health-check","rate-limiting","swagger","todo-example"],id:"none-prisma-sqlserver-fastify-full-extras",note:"SQL Server Prisma 7 Fastify passed migrations, build, unit/E2E, health and outage, OpenAPI, todo CRUD, HTTP 429, Docker readiness, published HTTP 200/429, and cleanup.",profiles:["prisma-sqlserver-fastify"],scenarios:["sqlserver-matrix-fastify-docker-health-check-rate-limiting-swagger-todo-example"],status:"certified"},{addons:[],auth:"none",extras:["docker","rate-limiting","swagger","todo-example"],id:"none-prisma-sqlserver-express-docker-rate-limit-swagger-todo",note:"SQL Server Prisma 7 Express passed migrations, build, unit/E2E, OpenAPI, todo CRUD, Docker readiness, published HTTP 200/429 probes, and cleanup.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-docker-rate-limiting-swagger-todo-example"],status:"certified"},{addons:[],auth:"none",extras:["docker","rate-limiting","swagger","todo-example"],id:"none-prisma-sqlserver-fastify-docker-rate-limit-swagger-todo",note:"SQL Server Prisma 7 Fastify passed migrations, build, unit/E2E, OpenAPI, todo CRUD, Docker readiness, published HTTP 200/429 probes, and cleanup.",profiles:["prisma-sqlserver-fastify"],scenarios:["sqlserver-matrix-fastify-docker-rate-limiting-swagger-todo-example"],status:"certified"},{addons:[],auth:"none",extras:["health-check","rate-limiting","swagger","todo-example"],id:"none-prisma-sqlserver-express-health-rate-limit-swagger-todo",note:"SQL Server Prisma 7 Express passed migrations, build, unit/E2E health and outage, OpenAPI, todo CRUD, and HTTP 429 checks.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-health-check-rate-limiting-swagger-todo-example"],status:"certified"},{addons:[],auth:"none",extras:["health-check","rate-limiting","swagger","todo-example"],id:"none-prisma-sqlserver-fastify-health-rate-limit-swagger-todo",note:"SQL Server Prisma 7 Fastify passed migrations, build, unit/E2E health and outage, OpenAPI, todo CRUD, and HTTP 429 checks.",profiles:["prisma-sqlserver-fastify"],scenarios:["sqlserver-matrix-fastify-health-check-rate-limiting-swagger-todo-example"],status:"certified"},{addons:[],auth:"none",extras:["docker","health-check","rate-limiting","swagger"],id:"none-prisma-sqlserver-express-docker-health-rate-limit-swagger",note:"SQL Server Prisma 7 Express passed migrations, build, unit/E2E health and docs checks, Docker image build, Compose readiness, published HTTP 200/429, and cleanup.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-docker-health-check-rate-limiting-swagger"],status:"certified"},{addons:[],auth:"none",extras:["docker","health-check","rate-limiting","swagger"],id:"none-prisma-sqlserver-fastify-docker-health-rate-limit-swagger",note:"SQL Server Prisma 7 Fastify passed migrations, build, unit/E2E health and docs checks, Docker image build, Compose readiness, published HTTP 200/429, and cleanup.",profiles:["prisma-sqlserver-fastify"],scenarios:["sqlserver-matrix-fastify-docker-health-check-rate-limiting-swagger"],status:"certified"},{addons:[],auth:"none",extras:["docker","health-check","swagger","todo-example"],id:"none-prisma-sqlserver-express-docker-health-swagger-todo",note:"SQL Server Prisma 7 Express passed migrations, build, unit/E2E health, OpenAPI, and todo checks, Docker image build, Compose readiness, published HTTP 200, and cleanup.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-docker-health-check-swagger-todo-example"],status:"certified"},{addons:[],auth:"none",extras:["docker","health-check","swagger","todo-example"],id:"none-prisma-sqlserver-fastify-docker-health-swagger-todo",note:"SQL Server Prisma 7 Fastify passed migrations, build, unit/E2E health, OpenAPI, and todo checks, Docker image build, Compose readiness, published HTTP 200, and cleanup.",profiles:["prisma-sqlserver-fastify"],scenarios:["sqlserver-matrix-fastify-docker-health-check-swagger-todo-example"],status:"certified"},{addons:[],auth:"none",extras:["rate-limiting","swagger","todo-example"],id:"none-prisma-sqlserver-express-rate-limit-swagger-todo",note:"SQL Server Prisma 7 Express passed migrations, build, unit/E2E, OpenAPI checks, todo CRUD, and compiled HTTP 429 probe.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-rate-limiting-swagger-todo-example"],status:"certified"},{addons:[],auth:"none",extras:["rate-limiting","swagger","todo-example"],id:"none-prisma-sqlserver-fastify-rate-limit-swagger-todo",note:"SQL Server Prisma 7 Fastify passed migrations, build, unit/E2E, OpenAPI checks, todo CRUD, and compiled HTTP 429 probe.",profiles:["prisma-sqlserver-fastify"],scenarios:["sqlserver-matrix-fastify-rate-limiting-swagger-todo-example"],status:"certified"},{addons:[],auth:"none",extras:["health-check","rate-limiting","swagger"],id:"none-prisma-sqlserver-express-health-rate-limit-swagger",note:"SQL Server Prisma 7 Express passed migrations, build, unit/E2E health readiness/outage, OpenAPI checks, and compiled HTTP 429 probe.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-health-check-rate-limiting-swagger"],status:"certified"},{addons:[],auth:"none",extras:["health-check","rate-limiting","swagger"],id:"none-prisma-sqlserver-fastify-health-rate-limit-swagger",note:"SQL Server Prisma 7 Fastify passed migrations, build, unit/E2E health readiness/outage, OpenAPI checks, and compiled HTTP 429 probe.",profiles:["prisma-sqlserver-fastify"],scenarios:["sqlserver-matrix-fastify-health-check-rate-limiting-swagger"],status:"certified"},{addons:[],auth:"none",extras:["health-check","swagger","todo-example"],id:"none-prisma-sqlserver-express-health-swagger-todo",note:"SQL Server Prisma 7 Express passed migrations, build, unit/E2E health readiness/outage, OpenAPI checks, and todo CRUD.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-health-check-swagger-todo-example"],status:"certified"},{addons:[],auth:"none",extras:["health-check","swagger","todo-example"],id:"none-prisma-sqlserver-fastify-health-swagger-todo",note:"SQL Server Prisma 7 Fastify passed migrations, build, unit/E2E health readiness/outage, OpenAPI checks, and todo CRUD.",profiles:["prisma-sqlserver-fastify"],scenarios:["sqlserver-matrix-fastify-health-check-swagger-todo-example"],status:"certified"},{addons:[],auth:"none",extras:["docker","rate-limiting","todo-example"],id:"none-prisma-sqlserver-express-docker-rate-limit-todo",note:"SQL Server Prisma 7 Express passed migrations, build, todo CRUD and HTTP 429 checks, Docker image build, Compose readiness, published HTTP 200/429 probes, and cleanup.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-docker-rate-limiting-todo-example"],status:"certified"},{addons:[],auth:"none",extras:["docker","rate-limiting","todo-example"],id:"none-prisma-sqlserver-fastify-docker-rate-limit-todo",note:"SQL Server Prisma 7 Fastify passed migrations, build, todo CRUD and HTTP 429 checks, Docker image build, Compose readiness, published HTTP 200/429 probes, and cleanup.",profiles:["prisma-sqlserver-fastify"],scenarios:["sqlserver-matrix-fastify-docker-rate-limiting-todo-example"],status:"certified"},{addons:[],auth:"none",extras:["docker","swagger","todo-example"],id:"none-prisma-sqlserver-express-docker-swagger-todo",note:"SQL Server Prisma 7 Express passed migrations, build, OpenAPI and todo CRUD checks, Docker image build, Compose readiness, published HTTP 200 probe, and cleanup.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-docker-swagger-todo-example"],status:"certified"},{addons:[],auth:"none",extras:["docker","swagger","todo-example"],id:"none-prisma-sqlserver-fastify-docker-swagger-todo",note:"SQL Server Prisma 7 Fastify passed migrations, build, OpenAPI and todo CRUD checks, Docker image build, Compose readiness, published HTTP 200 probe, and cleanup.",profiles:["prisma-sqlserver-fastify"],scenarios:["sqlserver-matrix-fastify-docker-swagger-todo-example"],status:"certified"},{addons:[],auth:"none",extras:["docker","health-check","todo-example"],id:"none-prisma-sqlserver-express-docker-health-todo",note:"SQL Server Prisma 7 Express passed migrations, build, todo CRUD and health readiness/outage tests, Docker image build, Compose readiness, published HTTP 200, and cleanup.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-docker-health-check-todo-example"],status:"certified"},{addons:[],auth:"none",extras:["docker","health-check","todo-example"],id:"none-prisma-sqlserver-fastify-docker-health-todo",note:"SQL Server Prisma 7 Fastify passed migrations, build, todo CRUD and health readiness/outage tests, Docker image build, Compose readiness, published HTTP 200, and cleanup.",profiles:["prisma-sqlserver-fastify"],scenarios:["sqlserver-matrix-fastify-docker-health-check-todo-example"],status:"certified"},{addons:[],auth:"none",extras:["docker","rate-limiting","swagger"],id:"none-prisma-sqlserver-express-docker-rate-limit-swagger",note:"SQL Server Prisma 7 Express passed migrations, build, OpenAPI and HTTP 429 checks, Docker image build, Compose readiness, published HTTP 200/429 probes, and cleanup.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-docker-rate-limiting-swagger"],status:"certified"},{addons:[],auth:"none",extras:["docker","rate-limiting","swagger"],id:"none-prisma-sqlserver-fastify-docker-rate-limit-swagger",note:"SQL Server Prisma 7 Fastify passed migrations, build, OpenAPI and HTTP 429 checks, Docker image build, Compose readiness, published HTTP 200/429 probes, and cleanup.",profiles:["prisma-sqlserver-fastify"],scenarios:["sqlserver-matrix-fastify-docker-rate-limiting-swagger"],status:"certified"},{addons:[],auth:"none",extras:["docker","health-check","rate-limiting"],id:"none-prisma-sqlserver-express-docker-health-rate-limit",note:"SQL Server Prisma 7 Express passed migrations, build, unit/E2E health readiness/outage checks, Docker image build and Compose readiness, published HTTP 200/429 probes, and cleanup.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-docker-health-check-rate-limiting"],status:"certified"},{addons:[],auth:"none",extras:["docker","health-check","rate-limiting"],id:"none-prisma-sqlserver-fastify-docker-health-rate-limit",note:"SQL Server Prisma 7 Fastify passed migrations, build, unit/E2E health readiness/outage checks, Docker image build and Compose readiness, published HTTP 200/429 probes, and cleanup.",profiles:["prisma-sqlserver-fastify"],scenarios:["sqlserver-matrix-fastify-docker-health-check-rate-limiting"],status:"certified"},{addons:[],auth:"none",extras:["docker","health-check","swagger"],id:"none-prisma-sqlserver-express-docker-health-swagger",note:"SQL Server Prisma 7 Express passed migrations, build, unit/E2E health readiness/outage and OpenAPI checks, Docker image build and Compose readiness, published HTTP 200 probe, and cleanup.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-docker-health-check-swagger"],status:"certified"},{addons:[],auth:"none",extras:["docker","health-check","swagger"],id:"none-prisma-sqlserver-fastify-docker-health-swagger",note:"SQL Server Prisma 7 Fastify passed migrations, build, unit/E2E health readiness/outage and OpenAPI checks, Docker image build and Compose readiness, published HTTP 200 probe, and cleanup.",profiles:["prisma-sqlserver-fastify"],scenarios:["sqlserver-matrix-fastify-docker-health-check-swagger"],status:"certified"},{addons:[],auth:"none",extras:["rate-limiting","swagger"],id:"none-prisma-sqlserver-express-rate-limit-swagger",note:"SQL Server Prisma 7 Express passed migrations, build, unit/E2E, OpenAPI runtime checks, and compiled HTTP 429 rate-limit probe in the generated certification run.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-rate-limiting-swagger"],status:"certified"},{addons:[],auth:"none",extras:["rate-limiting","swagger"],id:"none-prisma-sqlserver-fastify-rate-limit-swagger",note:"SQL Server Prisma 7 Fastify passed migrations, build, unit/E2E, OpenAPI runtime checks, and compiled HTTP 429 rate-limit probe in the generated certification run.",profiles:["prisma-sqlserver-fastify"],scenarios:["sqlserver-matrix-fastify-rate-limiting-swagger"],status:"certified"},{addons:[],auth:"none",extras:["rate-limiting","todo-example"],id:"none-prisma-sqlserver-express-rate-limit-todo",note:"SQL Server Prisma 7 Express passed migrations, build, unit/E2E todo CRUD, and compiled HTTP 429 rate-limit probe in the generated certification run.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-rate-limiting-todo-example"],status:"certified"},{addons:[],auth:"none",extras:["rate-limiting","todo-example"],id:"none-prisma-sqlserver-fastify-rate-limit-todo",note:"SQL Server Prisma 7 Fastify passed migrations, build, unit/E2E todo CRUD, and compiled HTTP 429 rate-limit probe in the generated certification run.",profiles:["prisma-sqlserver-fastify"],scenarios:["sqlserver-matrix-fastify-rate-limiting-todo-example"],status:"certified"},{addons:[],auth:"none",extras:["health-check","swagger"],id:"none-prisma-sqlserver-express-health-swagger",note:"SQL Server Prisma 7 Express passed migrations, build, unit/E2E, Swagger OpenAPI checks, and health readiness/outage assertions in the generated certification run.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-health-check-swagger"],status:"certified"},{addons:[],auth:"none",extras:["health-check","swagger"],id:"none-prisma-sqlserver-fastify-health-swagger",note:"SQL Server Prisma 7 Fastify passed migrations, build, unit/E2E, Swagger OpenAPI checks, and health readiness/outage assertions in the generated certification run.",profiles:["prisma-sqlserver-fastify"],scenarios:["sqlserver-matrix-fastify-health-check-swagger"],status:"certified"},{addons:[],auth:"none",extras:["health-check","todo-example"],id:"none-prisma-sqlserver-express-health-todo",note:"SQL Server Prisma 7 Express passed migrations, build, unit/E2E, health readiness/outage assertions, and todo CRUD checks in the generated certification run.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-health-check-todo-example"],status:"certified"},{addons:[],auth:"none",extras:["health-check","todo-example"],id:"none-prisma-sqlserver-fastify-health-todo",note:"SQL Server Prisma 7 Fastify passed migrations, build, unit/E2E, health readiness/outage assertions, and todo CRUD checks in the generated certification run.",profiles:["prisma-sqlserver-fastify"],scenarios:["sqlserver-matrix-fastify-health-check-todo-example"],status:"certified"},{addons:[],auth:"none",extras:["docker","todo-example"],id:"none-prisma-sqlserver-express-docker-todo",note:"SQL Server Prisma 7 Express passed migrations, build, unit/E2E todo CRUD, Docker image build, Compose readiness, published HTTP 200, and cleanup in the generated certification run.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-docker-todo-example"],status:"certified"},{addons:[],auth:"none",extras:["docker","todo-example"],id:"none-prisma-sqlserver-fastify-docker-todo",note:"SQL Server Prisma 7 Fastify passed migrations, build, unit/E2E todo CRUD, Docker image build, Compose readiness, published HTTP 200, and cleanup in the generated certification run.",profiles:["prisma-sqlserver-fastify"],scenarios:["sqlserver-matrix-fastify-docker-todo-example"],status:"certified"},{addons:[],auth:"none",extras:["health-check","rate-limiting"],id:"none-prisma-sqlserver-express-health-rate-limit",note:"SQL Server Prisma 7 Express passed migrations, build, unit/E2E readiness, runtime health and outage checks, and compiled HTTP 429 probe in the generated certification run.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-health-check-rate-limiting"],status:"certified"},{addons:[],auth:"none",extras:["health-check","rate-limiting"],id:"none-prisma-sqlserver-fastify-health-rate-limit",note:"SQL Server Prisma 7 Fastify passed migrations, build, unit/E2E readiness, runtime health and outage checks, and compiled HTTP 429 probe in the generated certification run.",profiles:["prisma-sqlserver-fastify"],scenarios:["sqlserver-matrix-fastify-health-check-rate-limiting"],status:"certified"},{addons:[],auth:"none",extras:["docker","rate-limiting"],id:"none-prisma-sqlserver-express-docker-rate-limit",note:"SQL Server Prisma 7 Express passed generated-project migrations, build, unit/E2E tests, runtime HTTP 429, Docker image build, Compose SQL Server/app readiness, published HTTP 200/429 probes, and cleanup in the generated certification run.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-docker-rate-limiting"],status:"certified"},{addons:[],auth:"none",extras:["docker","rate-limiting"],id:"none-prisma-sqlserver-fastify-docker-rate-limit",note:"SQL Server Prisma 7 Fastify passed generated-project migrations, build, unit/E2E tests, runtime HTTP 429, Docker image build, Compose SQL Server/app readiness, published HTTP 200/429 probes, and cleanup in the generated certification run.",profiles:["prisma-sqlserver-fastify"],scenarios:["sqlserver-matrix-fastify-docker-rate-limiting"],status:"certified"},{addons:[],auth:"none",extras:["docker","swagger"],id:"none-prisma-sqlserver-express-docker-swagger",note:"SQL Server Prisma 7 Express passed generated-project migrations, build, unit/E2E tests, OpenAPI assertions, Docker image build, Compose SQL Server/app readiness, published HTTP 200 probe, and cleanup in the generated certification run.",profiles:["prisma-sqlserver"],scenarios:["sqlserver-matrix-express-docker-swagger"],status:"certified"},{addons:[],auth:"none",extras:["docker","swagger"],id:"none-prisma-sqlserver-fastify-docker-swagger",note:"SQL Server Prisma 7 Fastify passed generated-project migrations, build, unit/E2E tests, OpenAPI assertions, Docker image build, Compose SQL Server/app readiness, published HTTP 200 probe, and cleanup in the generated certification run.",profiles:["prisma-sqlserver-fastify"],scenarios:["sqlserver-matrix-fastify-docker-swagger"],status:"certified"},{addons:["husky","nestjs-zod"],auth:"none",extras:["swagger","todo-example"],id:"none-prisma-sqlserver-express-husky-nestjs-zod",note:"Scenario 536 passed SQL Server Prisma 7 Express successful/failing Husky hooks, Zod DTO validation, Swagger, todo CRUD, migrations, build, and E2E.",profiles:["prisma-sqlserver"],scenarios:["536-prisma-sqlserver-express-husky-nestjs-zod"],status:"certified"},{addons:["husky","nestjs-zod"],auth:"none",extras:["swagger","todo-example"],id:"none-prisma-sqlserver-fastify-husky-nestjs-zod",note:"Scenario 537 passed SQL Server Prisma 7 Fastify successful/failing Husky hooks, Zod DTO validation, Swagger, todo CRUD, migrations, build, and E2E.",profiles:["prisma-sqlserver-fastify"],scenarios:["537-prisma-sqlserver-fastify-husky-nestjs-zod"],status:"certified"},{addons:["scalar-ui","ultracite"],auth:"none",extras:["swagger"],formatter:"oxlint-oxfmt",id:"none-prisma-sqlserver-express-scalar-ultracite",note:"Scenario 534 passed SQL Server Prisma 7 Express OpenAPI, Scalar UI, Ultracite, clean install, migrations, build, and E2E.",profiles:["prisma-sqlserver"],scenarios:["534-prisma-sqlserver-express-scalar-ultracite"],status:"certified"},{addons:["scalar-ui","ultracite"],auth:"none",extras:["swagger"],formatter:"oxlint-oxfmt",id:"none-prisma-sqlserver-fastify-scalar-ultracite",note:"Scenario 535 passed SQL Server Prisma 7 Fastify OpenAPI, Scalar UI, Ultracite, clean install, migrations, build, and E2E.",profiles:["prisma-sqlserver-fastify"],scenarios:["535-prisma-sqlserver-fastify-scalar-ultracite"],status:"certified"},{addons:["nestjs-zod","scalar-ui"],auth:"none",extras:["swagger","todo-example"],id:"none-prisma-sqlserver-express-nestjs-zod-scalar-todo",note:"Scenario 528 passed SQL Server Prisma 7 Express nestjs-zod DTO validation, Swagger/OpenAPI, Scalar UI, todo CRUD, clean install, migrations, build, and E2E.",profiles:["prisma-sqlserver"],scenarios:["528-prisma-sqlserver-express-nestjs-zod-scalar-todo"],status:"certified"},{addons:["nestjs-zod","scalar-ui"],auth:"none",extras:["swagger","todo-example"],id:"none-prisma-sqlserver-fastify-nestjs-zod-scalar-todo",note:"Scenario 529 passed SQL Server Prisma 7 Fastify nestjs-zod DTO validation, Swagger/OpenAPI, Scalar UI, todo CRUD, clean install, migrations, build, and E2E.",profiles:["prisma-sqlserver-fastify"],scenarios:["529-prisma-sqlserver-fastify-nestjs-zod-scalar-todo"],status:"certified"},{addons:["nestjs-zod","ultracite"],auth:"none",extras:["swagger","todo-example"],formatter:"oxlint-oxfmt",id:"none-prisma-sqlserver-express-nestjs-zod-ultracite",note:"Scenario 530 passed SQL Server Prisma 7 Express nestjs-zod validation, Swagger/OpenAPI, todo CRUD, Ultracite checks, clean install, migrations, build, and E2E.",profiles:["prisma-sqlserver"],scenarios:["530-prisma-sqlserver-express-nestjs-zod-ultracite"],status:"certified"},{addons:["nestjs-zod","ultracite"],auth:"none",extras:["swagger","todo-example"],formatter:"oxlint-oxfmt",id:"none-prisma-sqlserver-fastify-nestjs-zod-ultracite",note:"Scenario 531 passed SQL Server Prisma 7 Fastify nestjs-zod validation, Swagger/OpenAPI, todo CRUD, Ultracite checks, clean install, migrations, build, and E2E.",profiles:["prisma-sqlserver-fastify"],scenarios:["531-prisma-sqlserver-fastify-nestjs-zod-ultracite"],status:"certified"},{addons:["nestjs-zod","scalar-ui","ultracite"],auth:"none",extras:["swagger","todo-example"],formatter:"oxlint-oxfmt",id:"none-prisma-sqlserver-express-nestjs-zod-scalar-ultracite",note:"Scenario 532 passed SQL Server Prisma 7 Express DTO validation, Swagger/OpenAPI, Scalar UI, todo CRUD, Ultracite, clean install, migrations, build, and E2E.",profiles:["prisma-sqlserver"],scenarios:["532-prisma-sqlserver-express-nestjs-zod-scalar-ultracite"],status:"certified"},{addons:["nestjs-zod","scalar-ui","ultracite"],auth:"none",extras:["swagger","todo-example"],formatter:"oxlint-oxfmt",id:"none-prisma-sqlserver-fastify-nestjs-zod-scalar-ultracite",note:"Scenario 533 passed SQL Server Prisma 7 Fastify DTO validation, Swagger/OpenAPI, Scalar UI, todo CRUD, Ultracite, clean install, migrations, build, and E2E.",profiles:["prisma-sqlserver-fastify"],scenarios:["533-prisma-sqlserver-fastify-nestjs-zod-scalar-ultracite"],status:"certified"},{addons:["agent-skills","husky"],auth:"none",extras:[],id:"none-prisma-sqlserver-express-agent-skills-husky",note:"Scenario 522 passed a clean pnpm install, Prisma migrations, build, tests, verified agent-skill files/hashes, and Husky accepting/rejecting hooks for SQL Server Prisma 7 Express.",profiles:["prisma-sqlserver"],scenarios:["522-prisma-sqlserver-express-agent-skills-husky"],status:"certified"},{addons:["agent-skills","husky"],auth:"none",extras:[],id:"none-prisma-sqlserver-fastify-agent-skills-husky",note:"Scenario 523 passed SQL Server Prisma 7 Fastify agent-skills installation and Husky accepting/rejecting hook checks.",profiles:["prisma-sqlserver-fastify"],scenarios:["523-prisma-sqlserver-fastify-agent-skills-husky"],status:"certified"},{addons:["husky","ultracite"],auth:"none",extras:[],formatter:"oxlint-oxfmt",id:"none-prisma-sqlserver-express-husky-ultracite",note:"Scenario 524 passed SQL Server Prisma 7 Express Husky hooks, Ultracite integrations, migrations, build, tests, and final lint/format checks.",profiles:["prisma-sqlserver"],scenarios:["524-prisma-sqlserver-express-husky-ultracite"],status:"certified"},{addons:["husky","ultracite"],auth:"none",extras:[],formatter:"oxlint-oxfmt",id:"none-prisma-sqlserver-fastify-husky-ultracite",note:"Scenario 525 passed SQL Server Prisma 7 Fastify Husky hooks, Ultracite integrations, migrations, build, tests, and final lint/format checks.",profiles:["prisma-sqlserver-fastify"],scenarios:["525-prisma-sqlserver-fastify-husky-ultracite"],status:"certified"},{addons:["agent-skills","ultracite"],auth:"none",extras:[],formatter:"oxlint-oxfmt",id:"none-prisma-sqlserver-express-agent-skills-ultracite",note:"Scenario 526 passed SQL Server Prisma 7 Express agent-skills installation, Ultracite integrations, migrations, build, tests, and final lint/format checks.",profiles:["prisma-sqlserver"],scenarios:["526-prisma-sqlserver-express-agent-skills-ultracite"],status:"certified"},{addons:["agent-skills","ultracite"],auth:"none",extras:[],formatter:"oxlint-oxfmt",id:"none-prisma-sqlserver-fastify-agent-skills-ultracite",note:"Scenario 527 passed SQL Server Prisma 7 Fastify agent-skills installation, Ultracite integrations, migrations, build, tests, and final lint/format checks.",profiles:["prisma-sqlserver-fastify"],scenarios:["527-prisma-sqlserver-fastify-agent-skills-ultracite"],status:"certified"},{addons:[],auth:"none",extras:[],id:"none-prisma-sqlserver-express-minimal",note:"Scenario 510 passed the minimal SQL Server Prisma 7 Express REST project.",profiles:["prisma-sqlserver"],scenarios:["510-prisma-sqlserver-express-minimal"],status:"certified"},{addons:[],auth:"none",extras:[],id:"none-prisma-sqlserver-fastify-minimal",note:"Scenario 511 passed the minimal SQL Server Prisma 7 Fastify REST project.",profiles:["prisma-sqlserver-fastify"],scenarios:["511-prisma-sqlserver-fastify-minimal"],status:"certified"},{addons:[],auth:"none",extras:["todo-example"],id:"none-prisma-sqlserver-express-todo",note:"Scenario 512 passed SQL Server Prisma 7 Express todo-only generation, migrations, build, and CRUD E2E tests.",profiles:["prisma-sqlserver"],scenarios:["512-prisma-sqlserver-express-todo"],status:"certified"},{addons:[],auth:"none",extras:["todo-example"],id:"none-prisma-sqlserver-fastify-todo",note:"Scenario 513 passed SQL Server Prisma 7 Fastify todo-only generation, migrations, build, and CRUD E2E tests.",profiles:["prisma-sqlserver-fastify"],scenarios:["513-prisma-sqlserver-fastify-todo"],status:"certified"},{addons:[],auth:"none",extras:["docker"],id:"none-prisma-sqlserver-express-docker",note:"Scenario 518 passed the SQL Server Prisma 7 Express Docker-only image build, Compose startup, published readiness probe, and cleanup.",profiles:["prisma-sqlserver"],scenarios:["518-prisma-sqlserver-express-docker"],status:"certified"},{addons:[],auth:"none",extras:["docker"],id:"none-prisma-sqlserver-fastify-docker",note:"Scenario 519 passed the SQL Server Prisma 7 Fastify Docker-only image build, Compose startup, published readiness probe, and cleanup.",profiles:["prisma-sqlserver-fastify"],scenarios:["519-prisma-sqlserver-fastify-docker"],status:"certified"},{addons:[],auth:"none",extras:["health-check"],id:"none-prisma-sqlserver-express-health",note:"Scenario 514 passed SQL Server Prisma 7 Express health-check-only generation, migrations, build, and E2E tests.",profiles:["prisma-sqlserver"],scenarios:["514-prisma-sqlserver-express-health"],status:"certified"},{addons:[],auth:"none",extras:["health-check"],id:"none-prisma-sqlserver-fastify-health",note:"Scenario 515 passed SQL Server Prisma 7 Fastify health-check-only generation, migrations, build, and E2E tests.",profiles:["prisma-sqlserver-fastify"],scenarios:["515-prisma-sqlserver-fastify-health"],status:"certified"},{addons:[],auth:"none",extras:["rate-limiting"],id:"none-prisma-sqlserver-express-rate-limit",note:"Scenario 516 passed SQL Server Prisma 7 Express rate-limit-only build, E2E, and compiled HTTP 429 checks.",profiles:["prisma-sqlserver"],scenarios:["516-prisma-sqlserver-express-rate-limit"],status:"certified"},{addons:[],auth:"none",extras:["rate-limiting"],id:"none-prisma-sqlserver-fastify-rate-limit",note:"Scenario 517 passed SQL Server Prisma 7 Fastify rate-limit-only build, E2E, and compiled HTTP 429 checks.",profiles:["prisma-sqlserver-fastify"],scenarios:["517-prisma-sqlserver-fastify-rate-limit"],status:"certified"},{addons:["agent-skills","husky","nestjs-zod","scalar-ui","ultracite"],auth:"none",extras:["docker","health-check","rate-limiting","swagger","todo-example"],formatter:"oxlint-oxfmt",id:"none-prisma-sqlserver-express-full-stack-normal-compiler",note:"Scenario 508 passed the complete SQL Server/Prisma 7 Express integration bundle on the standard compiler, including migrations, tests, tool integrations, Docker readiness, published health, and HTTP 429 probes.",profiles:["prisma-sqlserver"],scenarios:["508-prisma-sqlserver-express-full-stack-normal-compiler"],status:"certified"},{addons:["agent-skills","husky","nestjs-zod","scalar-ui","ultracite"],auth:"none",extras:["docker","health-check","rate-limiting","swagger","todo-example"],formatter:"oxlint-oxfmt",id:"none-prisma-sqlserver-fastify-full-stack-normal-compiler",note:"Scenario 509 passed the complete SQL Server/Prisma 7 Fastify integration bundle on the standard compiler, including migrations, tests, tool integrations, Docker readiness, published health, and HTTP 429 probes.",profiles:["prisma-sqlserver-fastify"],scenarios:["509-prisma-sqlserver-fastify-full-stack-normal-compiler"],status:"certified"},{addons:["ultracite"],auth:"none",extras:["typescript-7"],formatter:"oxlint-oxfmt",id:"none-prisma-sqlserver-express-typescript-7-ultracite",note:"Scenario 506 is pending for SQL Server/Prisma 7 Express TypeScript 7 and Ultracite/Oxlint/Oxfmt checks.",profiles:["prisma-sqlserver"],scenarios:["506-prisma-sqlserver-express-typescript-7-ultracite"],status:"certified"},{addons:["ultracite"],auth:"none",extras:["typescript-7"],formatter:"oxlint-oxfmt",id:"none-prisma-sqlserver-fastify-typescript-7-ultracite",note:"Scenario 507 is pending for SQL Server/Prisma 7 Fastify TypeScript 7 and Ultracite/Oxlint/Oxfmt checks.",profiles:["prisma-sqlserver-fastify"],scenarios:["507-prisma-sqlserver-fastify-typescript-7-ultracite"],status:"certified"},{addons:[],auth:"none",extras:["docker","health-check"],id:"none-prisma-sqlserver-express-docker-health-check",note:"Scenario 502 is pending for SQL Server/Prisma 7 Express Docker image, Compose readiness, and published health endpoint.",profiles:["prisma-sqlserver"],scenarios:["502-prisma-sqlserver-express-docker-health-check"],status:"certified"},{addons:[],auth:"none",extras:["docker","health-check"],id:"none-prisma-sqlserver-fastify-docker-health-check",note:"Scenario 503 is pending for SQL Server/Prisma 7 Fastify Docker image, Compose readiness, and published health endpoint.",profiles:["prisma-sqlserver-fastify"],scenarios:["503-prisma-sqlserver-fastify-docker-health-check"],status:"certified"},{addons:[],auth:"none",extras:["docker","todo-example","health-check","rate-limiting"],id:"none-prisma-sqlserver-express-docker-todo-health-rate-limit",note:"Scenario 504 is pending for SQL Server/Prisma 7 Express Docker Compose, todo, readiness, and published HTTP 429 checks.",profiles:["prisma-sqlserver"],scenarios:["504-prisma-sqlserver-express-docker-todo-health-rate-limit"],status:"certified"},{addons:[],auth:"none",extras:["docker","todo-example","health-check","rate-limiting"],id:"none-prisma-sqlserver-fastify-docker-todo-health-rate-limit",note:"Scenario 505 is pending for SQL Server/Prisma 7 Fastify Docker Compose, todo, readiness, and published HTTP 429 checks.",profiles:["prisma-sqlserver-fastify"],scenarios:["505-prisma-sqlserver-fastify-docker-todo-health-rate-limit"],status:"certified"},{addons:["scalar-ui"],auth:"none",extras:["swagger","todo-example","health-check","rate-limiting"],id:"none-prisma-sqlserver-express-swagger-scalar-todo-health-rate-limit",note:"Scenario 500 is pending for SQL Server/Prisma 7 Express docs, todo, health, rate limiting, and Scalar UI.",profiles:["prisma-sqlserver"],scenarios:["500-prisma-sqlserver-express-swagger-scalar-todo-health-rate-limit"],status:"certified"},{addons:["scalar-ui"],auth:"none",extras:["swagger","todo-example","health-check","rate-limiting"],id:"none-prisma-sqlserver-fastify-swagger-scalar-todo-health-rate-limit",note:"Scenario 501 is pending for SQL Server/Prisma 7 Fastify docs, todo, health, rate limiting, and Scalar UI.",profiles:["prisma-sqlserver-fastify"],scenarios:["501-prisma-sqlserver-fastify-swagger-scalar-todo-health-rate-limit"],status:"certified"},{addons:[],auth:"none",extras:["todo-example","health-check","rate-limiting"],id:"none-prisma-sqlserver-express-todo-health-rate-limit",note:"Scenario 498 is pending for SQL Server/Prisma 7 Express todo CRUD, readiness, and HTTP throttling.",profiles:["prisma-sqlserver"],scenarios:["498-prisma-sqlserver-express-todo-health-rate-limit"],status:"certified"},{addons:[],auth:"none",extras:["todo-example","health-check","rate-limiting"],id:"none-prisma-sqlserver-fastify-todo-health-rate-limit",note:"Scenario 499 is pending for SQL Server/Prisma 7 Fastify todo CRUD, readiness, and HTTP throttling.",profiles:["prisma-sqlserver-fastify"],scenarios:["499-prisma-sqlserver-fastify-todo-health-rate-limit"],status:"certified"},{addons:["nestjs-zod"],auth:"none",extras:["swagger","todo-example"],id:"none-prisma-sqlserver-express-nestjs-zod-swagger-todo",note:"Scenario 508 passed SQL Server/Prisma 7 Express nestjs-zod DTO validation, documented todo CRUD, OpenAPI, and the complete runtime bundle on NestJS 12.",profiles:["prisma-sqlserver"],scenarios:["508-prisma-sqlserver-express-full-stack-normal-compiler"],status:"certified"},{addons:["nestjs-zod"],auth:"none",extras:["swagger","todo-example"],id:"none-prisma-sqlserver-fastify-nestjs-zod-swagger-todo",note:"Scenario 509 passed SQL Server/Prisma 7 Fastify nestjs-zod DTO validation, documented todo CRUD, OpenAPI, and the complete runtime bundle on NestJS 12.",profiles:["prisma-sqlserver-fastify"],scenarios:["509-prisma-sqlserver-fastify-full-stack-normal-compiler"],status:"certified"},{addons:["scalar-ui"],auth:"none",extras:["swagger"],id:"none-prisma-sqlserver-express-swagger-scalar",note:"Scenario 492 checks SQL Server/Prisma 7 Express OpenAPI runtime and Scalar UI responses.",profiles:["prisma-sqlserver"],scenarios:["492-prisma-sqlserver-express-swagger-scalar"],status:"certified"},{addons:["scalar-ui"],auth:"none",extras:["swagger"],id:"none-prisma-sqlserver-fastify-swagger-scalar",note:"Scenario 493 checks SQL Server/Prisma 7 Fastify OpenAPI runtime and Scalar UI responses.",profiles:["prisma-sqlserver-fastify"],scenarios:["493-prisma-sqlserver-fastify-swagger-scalar"],status:"certified"},{addons:[],auth:"none",extras:["swagger","todo-example"],id:"none-prisma-sqlserver-express-swagger-todo",note:"Scenario 494 checks SQL Server/Prisma 7 Express OpenAPI runtime and todo CRUD E2E.",profiles:["prisma-sqlserver"],scenarios:["494-prisma-sqlserver-express-swagger-todo"],status:"certified"},{addons:[],auth:"none",extras:["swagger","todo-example"],id:"none-prisma-sqlserver-fastify-swagger-todo",note:"Scenario 495 checks SQL Server/Prisma 7 Fastify OpenAPI runtime and todo CRUD E2E.",profiles:["prisma-sqlserver-fastify"],scenarios:["495-prisma-sqlserver-fastify-swagger-todo"],status:"certified"},{addons:["agent-skills"],auth:"none",extras:[],id:"none-prisma-sqlserver-express-agent-skills",note:"Scenario 488 checks noninteractive skill installation, generated files, and lock hashes for Prisma 7 SQL Server Express REST.",profiles:["prisma-sqlserver"],scenarios:["488-prisma-sqlserver-express-agent-skills"],status:"certified"},{addons:["agent-skills"],auth:"none",extras:[],id:"none-prisma-sqlserver-fastify-agent-skills",note:"Scenario 489 checks noninteractive skill installation, generated files, and lock hashes for Prisma 7 SQL Server Fastify REST.",profiles:["prisma-sqlserver-fastify"],scenarios:["489-prisma-sqlserver-fastify-agent-skills"],status:"certified"},{addons:[],auth:"none",extras:["swagger"],id:"none-prisma-sqlserver-express-swagger",note:"Scenario 490 checks the compiled Prisma 7 SQL Server Express REST application serves an OpenAPI v3 document with its REST route.",profiles:["prisma-sqlserver"],scenarios:["490-prisma-sqlserver-express-swagger"],status:"certified"},{addons:[],auth:"none",extras:["swagger"],id:"none-prisma-sqlserver-fastify-swagger",note:"Scenario 491 checks the compiled Prisma 7 SQL Server Fastify REST application serves an OpenAPI v3 document with its REST route.",profiles:["prisma-sqlserver-fastify"],scenarios:["491-prisma-sqlserver-fastify-swagger"],status:"certified"},{addons:["ultracite"],auth:"none",extras:[],formatter:"oxlint-oxfmt",id:"none-prisma-sqlserver-express-ultracite",note:"Scenario 484 passed clean-install Prisma 7 SQL Server migration, build, tests, and Ultracite/Oxlint/Oxfmt integration checks for Express REST.",profiles:["prisma-sqlserver"],scenarios:["484-prisma-sqlserver-express-ultracite"],status:"certified"},{addons:["ultracite"],auth:"none",extras:[],formatter:"oxlint-oxfmt",id:"none-prisma-sqlserver-fastify-ultracite",note:"Scenario 485 passed clean-install Prisma 7 SQL Server migration, build, tests, and Ultracite/Oxlint/Oxfmt integration checks for Fastify REST.",profiles:["prisma-sqlserver-fastify"],scenarios:["485-prisma-sqlserver-fastify-ultracite"],status:"certified"},{addons:["husky"],auth:"none",extras:[],id:"none-prisma-sqlserver-express-husky",note:"Scenario 486 checks Husky's passing and failing pre-commit behavior on the no-auth Prisma 7 SQL Server Express REST profile.",profiles:["prisma-sqlserver"],scenarios:["486-prisma-sqlserver-express-husky"],status:"certified"},{addons:["husky"],auth:"none",extras:[],id:"none-prisma-sqlserver-fastify-husky",note:"Scenario 487 checks Husky's passing and failing pre-commit behavior on the no-auth Prisma 7 SQL Server Fastify REST profile.",profiles:["prisma-sqlserver-fastify"],scenarios:["487-prisma-sqlserver-fastify-husky"],status:"certified"},{addons:["agent-skills","husky","nestjs-zod","scalar-ui","ultracite"],auth:"none",extras:["docker","health-check","rate-limiting","swagger","todo-example","typescript-7"],formatter:"oxlint-oxfmt",id:"none-prisma-sqlserver-express-full-stack",note:"Scenario 482 passed clean install, Prisma 7 migrations, build, unit/E2E and Ultracite checks, Husky hooks, Docker Compose SQL Server/app readiness, published HTTP 200, and a published rate-limit HTTP 429 probe.",profiles:["prisma-sqlserver"],scenarios:["482-prisma-sqlserver-express-full-stack"],status:"certified"},{addons:["agent-skills","husky","nestjs-zod","scalar-ui","ultracite"],auth:"none",extras:["docker","health-check","rate-limiting","swagger","todo-example","typescript-7"],formatter:"oxlint-oxfmt",id:"none-prisma-sqlserver-fastify-full-stack",note:"Scenario 483 passed clean install, Prisma 7 migrations, build, unit/E2E and Ultracite checks, Husky hooks, Docker Compose SQL Server/app readiness, published HTTP 200, and a published rate-limit HTTP 429 probe.",profiles:["prisma-sqlserver-fastify"],scenarios:["483-prisma-sqlserver-fastify-full-stack"],status:"certified"},{addons:[],auth:"none",extras:["docker"],id:"none-prisma-docker",note:"Prisma 7 PostgreSQL REST Docker image and Compose startup, HTTP runtime, health and teardown pass in scenario 453.",profiles:["prisma"],scenarios:["453-prisma-rest-docker"],status:"certified"},{addons:[],auth:"none",extras:["docker"],id:"none-prisma-trpc-docker",note:"Prisma 7 PostgreSQL REST+tRPC image, Compose runtime, tRPC E2E, and cleanup pass in scenario 468.",profiles:["prisma-trpc"],scenarios:["468-prisma-rest-trpc-docker"],status:"certified"},{addons:[],auth:"none",extras:["health-check"],id:"none-prisma-trpc-health-check",note:"Prisma 7 REST+tRPC readiness and database outage transitions pass in scenario 469.",profiles:["prisma-trpc"],scenarios:["469-prisma-rest-trpc-health-check"],status:"certified"},{addons:[],auth:"none",extras:["rate-limiting"],id:"none-prisma-trpc-rate-limiting",note:"Prisma 7 REST+tRPC throttle returns the expected limit response in scenario 470.",profiles:["prisma-trpc"],scenarios:["470-prisma-rest-trpc-rate-limiting"],status:"certified"},{addons:[],auth:"none",extras:["swagger"],id:"none-prisma-trpc-swagger",note:"Prisma 7 REST+tRPC Swagger document loads in scenario 471.",profiles:["prisma-trpc"],scenarios:["471-prisma-rest-trpc-swagger"],status:"certified"},{addons:[],auth:"none",extras:["swagger","todo-example"],id:"none-prisma-trpc-swagger-todo",note:"Prisma 7 REST+tRPC todo CRUD and Swagger paths pass in scenario 472.",profiles:["prisma-trpc"],scenarios:["472-prisma-rest-trpc-swagger-todo"],status:"certified"},{addons:[],auth:"none",extras:["typescript-7"],id:"none-prisma-trpc-typescript-7",note:"Prisma 7 REST+tRPC builds and passes tests with TypeScript 7 in scenario 473.",profiles:["prisma-trpc"],scenarios:["473-prisma-rest-trpc-typescript-7"],status:"certified"},{addons:["ultracite"],auth:"none",extras:["typescript-7"],formatter:"oxlint-oxfmt",id:"none-prisma-trpc-typescript-7-ultracite",note:"Prisma 7 REST+tRPC with TypeScript 7 passes Ultracite formatting, build, and tests in scenario 474.",profiles:["prisma-trpc"],scenarios:["474-prisma-rest-trpc-typescript-7-ultracite"],status:"certified"},{addons:["scalar-ui"],auth:"none",extras:["swagger"],id:"none-prisma-trpc-swagger-scalar",note:"Prisma 7 REST+tRPC OpenAPI and Scalar UI pass in scenario 475.",profiles:["prisma-trpc"],scenarios:["475-prisma-rest-trpc-swagger-scalar"],status:"certified"},{addons:["nestjs-zod"],auth:"none",extras:["swagger","todo-example"],id:"none-prisma-trpc-nestjs-zod-swagger-todo",note:"Prisma 7 REST+tRPC DTO validation, Swagger, and todo checks pass in scenario 476.",profiles:["prisma-trpc"],scenarios:["476-prisma-rest-trpc-nestjs-zod-swagger-todo"],status:"certified"},{addons:["nestjs-zod","scalar-ui"],auth:"none",extras:["swagger","todo-example"],id:"none-prisma-trpc-nestjs-zod-swagger-scalar-todo",note:"Prisma 7 REST+tRPC validation, OpenAPI, and Scalar pass in scenario 477.",profiles:["prisma-trpc"],scenarios:["477-prisma-rest-trpc-nestjs-zod-swagger-scalar-todo"],status:"certified"},{addons:["agent-skills"],auth:"none",extras:[],id:"none-prisma-trpc-agent-skills-standalone",note:"Prisma 7 REST+tRPC installs integrity-checked agent skills in scenario 479.",profiles:["prisma-trpc"],scenarios:["479-prisma-rest-trpc-agent-skills"],status:"certified"},{addons:["husky"],auth:"none",extras:[],id:"none-prisma-trpc-husky-standalone",note:"Prisma 7 REST+tRPC passing and failing Husky commit checks pass scenario 480.",profiles:["prisma-trpc"],scenarios:["480-prisma-rest-trpc-husky"],status:"certified"},{addons:[],auth:"none",extras:["docker","health-check"],id:"none-prisma-trpc-docker-health-check",note:"Prisma 7 REST+tRPC Docker health and published tRPC runtime pass in scenario 481.",profiles:["prisma-trpc"],scenarios:["481-prisma-rest-trpc-docker-health-check"],status:"certified"},{addons:[],auth:"none",extras:["packages/shared"],id:"none-prisma-trpc-monorepo-shared",note:"Prisma 7 REST+tRPC monorepo shared package builds and passes app tests in scenario 478.",scenarios:["478-prisma-rest-trpc-monorepo-shared"],status:"certified"},{addons:[],auth:"none",extras:["health-check"],id:"none-prisma-health-check",note:"Prisma 7 PostgreSQL REST health endpoint and database outage transition pass in scenario 457.",profiles:["prisma"],scenarios:["457-prisma-rest-health-check"],status:"certified"},{addons:[],auth:"none",extras:["rate-limiting"],id:"none-prisma-rate-limiting",note:"Prisma 7 PostgreSQL REST rate limiting passes in scenario 458.",profiles:["prisma"],scenarios:["458-prisma-rest-rate-limiting"],status:"certified"},{addons:[],auth:"none",extras:["swagger"],id:"none-prisma-swagger",note:"Prisma 7 PostgreSQL REST Swagger passes in scenario 459.",profiles:["prisma"],scenarios:["459-prisma-rest-swagger"],status:"certified"},{addons:[],auth:"none",extras:["swagger","todo-example"],id:"none-prisma-swagger-todo",note:"Prisma 7 PostgreSQL REST Swagger and todo CRUD pass in scenario 460.",profiles:["prisma"],scenarios:["460-prisma-rest-swagger-todo"],status:"certified"},{addons:["scalar-ui"],auth:"none",extras:["swagger"],id:"none-prisma-swagger-scalar",note:"Prisma 7 REST OpenAPI document and Scalar page load in scenario 461.",profiles:["prisma"],scenarios:["461-prisma-rest-swagger-scalar"],status:"certified"},{addons:["nestjs-zod"],auth:"none",extras:["swagger","todo-example"],id:"none-prisma-nestjs-zod-swagger-todo",note:"Prisma 7 REST validates malformed todo requests and documents valid routes in scenario 462.",profiles:["prisma"],scenarios:["462-prisma-rest-nestjs-zod-swagger-todo"],status:"certified"},{addons:["nestjs-zod","scalar-ui"],auth:"none",extras:["swagger","todo-example"],id:"none-prisma-nestjs-zod-swagger-scalar-todo",note:"Prisma 7 REST validation, OpenAPI generation, and Scalar UI pass in scenario 463.",profiles:["prisma"],scenarios:["463-prisma-rest-nestjs-zod-swagger-scalar-todo"],status:"certified"},{addons:[],auth:"none",extras:["typescript-7"],id:"none-prisma-typescript-7",note:"Prisma 7 PostgreSQL REST builds and runs generated tests on TypeScript 7 in scenario 464.",profiles:["prisma"],scenarios:["464-prisma-rest-typescript-7"],status:"certified"},{addons:["ultracite"],auth:"none",extras:["typescript-7"],formatter:"oxlint-oxfmt",id:"none-prisma-typescript-7-ultracite",note:"Prisma 7 REST with TypeScript 7 passes Ultracite formatting, checks, build, and tests in scenario 465.",profiles:["prisma"],scenarios:["465-prisma-rest-typescript-7-ultracite"],status:"certified"},{addons:[],auth:"none",extras:["packages/shared"],id:"none-prisma-monorepo-shared",note:"Prisma 7 PostgreSQL monorepo shared package builds and passes tests in scenario 466.",scenarios:["466-prisma-monorepo-shared"],status:"certified"},{addons:["ultracite"],auth:"none",extras:["packages/shared"],formatter:"oxlint-oxfmt",id:"none-prisma-monorepo-shared-ultracite",note:"Prisma 7 PostgreSQL monorepo shared package passes Ultracite, build, and tests in scenario 467.",scenarios:["467-prisma-monorepo-shared-ultracite"],status:"certified"},{addons:["ultracite"],auth:"none",extras:[],formatter:"oxlint-oxfmt",id:"none-prisma-ultracite",note:"Prisma 7 PostgreSQL REST with Ultracite passes full runtime and formatter checks in scenario 454.",profiles:["prisma"],scenarios:["454-prisma-rest-ultracite"],status:"certified"},{addons:["ultracite"],auth:"none",extras:[],formatter:"oxlint-oxfmt",id:"none-graphql-drizzle-ultracite",note:"Unauthenticated PostgreSQL Drizzle GraphQL with Ultracite passes runtime scenario 117.",profiles:["graphql-drizzle"],scenarios:["117-graphql-drizzle-ultracite"],status:"certified"},{addons:["husky"],auth:"none",extras:[],id:"none-prisma-husky",note:"Prisma 7 PostgreSQL REST with a real Husky hook installation and pass/fail commit checks passes scenario 455.",profiles:["prisma"],scenarios:["455-prisma-rest-husky"],status:"certified"},{addons:["agent-skills"],auth:"none",extras:[],formatter:"oxlint-oxfmt",id:"none-prisma-agent-skills",note:"Prisma 7 PostgreSQL REST with integrity-checked generated agent skill files passes scenario 456.",profiles:["prisma"],scenarios:["456-prisma-rest-agent-skills"],status:"certified"},{addons:[],auth:"none",extras:["todo-example"],id:"none-prisma-trpc-todo",note:"Prisma 7 PostgreSQL REST+tRPC with todo-example passes full clean Yarn install, migrations, code generation, build, unit/E2E tests, and tRPC CRUD in scenario 444.",profiles:["prisma-trpc"],scenarios:["444-prisma-rest-trpc-todo"],status:"certified"},{addons:["ultracite"],auth:"better-auth",extras:["todo-example"],formatter:"oxlint-oxfmt",id:"better-auth-prisma-trpc-todo-ultracite",note:"Better Auth Prisma 7 PostgreSQL REST+tRPC todo ownership with Ultracite passes full clean-install runtime scenario 443.",profiles:["better-auth-prisma-trpc"],scenarios:["443-better-auth-prisma-trpc-todo-ultracite"],status:"certified"},{addons:["ultracite"],auth:"none",extras:["todo-example"],formatter:"oxlint-oxfmt",id:"none-prisma-trpc-todo-ultracite",note:"Prisma 7 PostgreSQL REST+tRPC with the todo example passes clean Yarn install, migrations, tRPC generation, lint/format, build, unit/E2E tests, and runtime queries in scenario 441.",profiles:["prisma-trpc"],scenarios:["441-prisma-rest-trpc-todo-ultracite"],status:"certified"},{addons:["agent-skills"],auth:"none",extras:[],formatter:"oxlint-oxfmt",id:"none-prisma-trpc-agent-skills",note:"Prisma 7 PostgreSQL REST+tRPC with integrity-checked agent skill files passes scenario 446.",profiles:["prisma-trpc"],scenarios:["446-prisma-rest-trpc-todo-agent-skills"],status:"certified"},{addons:["husky","ultracite"],auth:"none",extras:[],formatter:"oxlint-oxfmt",id:"none-prisma-trpc-husky-ultracite",note:"Prisma 7 PostgreSQL REST+tRPC with Ultracite and executable Husky pass/fail hooks passes scenario 448.",profiles:["prisma-trpc"],scenarios:["448-prisma-rest-trpc-husky-ultracite"],status:"certified"},{addons:["agent-skills","husky"],auth:"none",extras:[],id:"none-prisma-trpc-agent-skills-husky",note:"Prisma 7 PostgreSQL REST+tRPC passes agent-skill integrity checks and Husky passing/failing commit checks in scenario 451.",profiles:["prisma-trpc"],scenarios:["451-prisma-rest-trpc-agent-skills-husky"],status:"certified"},{addons:["agent-skills","husky","ultracite"],auth:"none",extras:[],formatter:"oxlint-oxfmt",id:"none-prisma-trpc-agent-skills-husky-ultracite",note:"Prisma 7 PostgreSQL REST+tRPC passes agent-skill integrity, Ultracite formatting/runtime checks and Husky passing/failing commit checks in scenario 452.",profiles:["prisma-trpc"],scenarios:["452-prisma-rest-trpc-agent-skills-husky-ultracite"],status:"certified"},{addons:["husky"],auth:"none",extras:["todo-example"],id:"none-prisma-trpc-todo-husky",note:"Prisma 7 PostgreSQL REST+tRPC todo with Husky hook behavior passes full runtime certification in scenario 445.",profiles:["prisma-trpc"],scenarios:["445-prisma-rest-trpc-todo-husky"],status:"certified"},{addons:["agent-skills"],auth:"none",extras:["todo-example"],formatter:"oxlint-oxfmt",id:"none-prisma-trpc-todo-agent-skills",note:"Prisma 7 PostgreSQL REST+tRPC todo runtime and non-interactive skill installation pass scenario 446.",profiles:["prisma-trpc"],scenarios:["446-prisma-rest-trpc-todo-agent-skills"],status:"certified"},{addons:["agent-skills"],auth:"none",extras:["todo-example"],id:"none-prisma-trpc-todo-agent-skills-no-formatter",note:"Prisma 7 PostgreSQL REST+tRPC todo runtime and non-interactive skill installation pass scenario 446; skill installation does not require a formatter.",profiles:["prisma-trpc"],scenarios:["446-prisma-rest-trpc-todo-agent-skills"],status:"certified"},{addons:["agent-skills","ultracite"],auth:"none",extras:[],formatter:"oxlint-oxfmt",id:"none-prisma-trpc-agent-skills-ultracite",note:"Prisma 7 PostgreSQL REST+tRPC with verified agent skill installation and Ultracite checks passes scenario 450.",profiles:["prisma-trpc"],scenarios:["450-prisma-rest-trpc-agent-skills-ultracite"],status:"certified"},{addons:["ultracite"],auth:"none",extras:[],formatter:"oxlint-oxfmt",id:"none-prisma-trpc-ultracite",note:"Prisma 7 PostgreSQL REST+tRPC with Ultracite formatting, linting, build, and E2E passes scenario 447.",profiles:["prisma-trpc"],scenarios:["447-prisma-rest-trpc-ultracite"],status:"certified"},{addons:["agent-skills","husky","nestjs-zod","scalar-ui","ultracite"],auth:"passport",extras:["docker","health-check","rate-limiting","swagger","todo-example","typescript-7"],formatter:"oxlint-oxfmt",id:"passport-prisma-mongo-rest-certified-bundle",note:"Passport Prisma 6 MongoDB with all eligible REST extras and addons passed clean install, checks, tests, Husky hooks, Docker health, authenticated todo creation, app restart persistence, and cleanup in scenario 320.",profiles:["passport-prisma-mongo"],scenarios:["320-passport-prisma-mongo-rest-certified-bundle"],status:"certified"},{addons:[],auth:"passport",extras:["docker","todo-example"],id:"passport-prisma-mongo-docker-todo",note:"Passport Prisma 6 MongoDB Docker Compose authenticated todo creation and persistence across app restart passed with clean teardown in scenario 319.",profiles:["passport-prisma-mongo"],scenarios:["319-passport-prisma-mongo-docker-todo"],status:"certified"},{addons:[],auth:"passport",extras:["typescript-7"],id:"passport-prisma-mongo-typescript-7",note:"Passport Prisma 6 MongoDB REST with TypeScript 7 passed generation, build, unit tests, and authenticated E2E in scenario 312.",profiles:["passport-prisma-mongo"],scenarios:["312-passport-prisma-mongo-typescript-7"],status:"certified"},{addons:["ultracite"],auth:"passport",extras:[],id:"passport-prisma-mongo-ultracite",note:"Passport Prisma 6 MongoDB REST with Ultracite passed formatting, clean check, build, unit tests, and authenticated E2E in scenario 313.",profiles:["passport-prisma-mongo"],scenarios:["313-passport-prisma-mongo-ultracite"],status:"certified"},{addons:["husky"],auth:"passport",extras:[],id:"passport-prisma-mongo-husky",note:"Passport Prisma 6 MongoDB REST with Husky passed clean installation and hook verification in scenario 314.",profiles:["passport-prisma-mongo"],scenarios:["314-passport-prisma-mongo-husky"],status:"certified"},{addons:["husky","ultracite"],auth:"passport",extras:[],id:"passport-prisma-mongo-husky-ultracite",note:"Passport Prisma 6 MongoDB REST with Husky and Ultracite passed hooks, formatting, clean check, build, unit tests, and authenticated E2E in scenario 315.",profiles:["passport-prisma-mongo"],scenarios:["315-passport-prisma-mongo-husky-ultracite"],status:"certified"},{addons:["agent-skills"],auth:"passport",extras:[],id:"passport-prisma-mongo-agent-skills",note:"Passport Prisma 6 MongoDB REST with agent-skills passed non-interactive installation and runtime verification in scenario 316.",profiles:["passport-prisma-mongo"],scenarios:["316-passport-prisma-mongo-agent-skills"],status:"certified"},{addons:["agent-skills","ultracite"],auth:"passport",extras:[],id:"passport-prisma-mongo-agent-skills-ultracite",note:"Passport Prisma 6 MongoDB REST with agent-skills and Ultracite passed skill installation, formatting, clean check, build, unit tests, and authenticated E2E in scenario 317.",profiles:["passport-prisma-mongo"],scenarios:["317-passport-prisma-mongo-agent-skills-ultracite"],status:"certified"},{addons:["nestjs-zod"],auth:"passport",extras:["swagger","todo-example"],id:"passport-prisma-mongo-nestjs-zod-swagger-todo",note:"Passport Prisma 6 MongoDB REST with NestJS-Zod, Swagger, and todo passed schema generation, build, unit, and feature E2E checks in scenario 318.",profiles:["passport-prisma-mongo"],scenarios:["318-passport-prisma-mongo-nestjs-zod-swagger-todo"],status:"certified"},{addons:[],auth:"passport",extras:["rate-limiting"],id:"passport-prisma-mongo-rate-limiting",note:"Passport Prisma 6 MongoDB REST allows valid login and throttles repeated invalid attempts with HTTP 429 in clean-install scenario 310.",profiles:["passport-prisma-mongo"],scenarios:["310-passport-prisma-mongo-rate-limiting"],status:"certified"},{addons:["scalar-ui"],auth:"passport",extras:["swagger"],id:"passport-prisma-mongo-swagger-scalar",note:"Passport Prisma 6 MongoDB REST documents authenticated endpoints and serves Scalar in clean-install scenario 311.",profiles:["passport-prisma-mongo"],scenarios:["311-passport-prisma-mongo-swagger-scalar"],status:"certified"},{addons:[],auth:"passport",extras:["health-check","todo-example"],id:"passport-drizzle-postgres-todo-health",note:"Passport Drizzle PostgreSQL REST todo owner isolation and database health readiness passed the clean-install runtime scenario 308.",profiles:["passport-drizzle-postgres"],scenarios:["308-passport-drizzle-postgres-rest-todo-health"],status:"certified"},{addons:[],auth:"passport",extras:["health-check","todo-example"],id:"passport-prisma-mongo-todo-health",note:"Passport Prisma 6 MongoDB REST todo owner isolation and MongoDB health readiness passed the clean-install runtime scenario 309.",profiles:["passport-prisma-mongo"],scenarios:["309-passport-prisma-mongo-rest-todo-health"],status:"certified"},...[["microservice-redis","333-microservice-redis-certified"],["microservice-grpc","332-microservice-grpc-certified"],["microservice-mqtt","334-microservice-mqtt-certified"],["microservice-nats","335-microservice-nats-certified"],["microservice-rabbitmq","336-microservice-rabbitmq-certified"],["microservice-kafka","337-microservice-kafka-certified"]].map(([e,t])=>({addons:[],auth:"none",extras:[],id:`${e}-runtime`,note:`Clean-installed ${e} passed build, unit/E2E tests, compiled main.ts protocol request/reply, HTTP routing, shutdown, and broker event delivery where supported in scenario ${t}.`,profiles:[e],scenarios:[t],status:"certified"})),...Wi.map(([e,t,s])=>({addons:[],auth:t,extras:["health-check"],id:`${e}-graphql-health-check`,note:`Authenticated health-check runtime behavior passed scenario ${s} for ${e}.`,profiles:[e],scenarios:[s],status:"certified"})),...Vi.map(([e,t,s,r])=>({addons:[],auth:t,extras:s,id:`${e}-todo-example`,note:`Authenticated todo ownership passed the full runtime scenario ${r} for layout profile ${e}.`,profiles:[e],scenarios:[r],status:"certified"})),...Bi.map(([e,t])=>({addons:[],auth:"better-auth",extras:["todo-example"],id:`${e}-todo-rest`,note:`Better Auth authenticated todo ownership passed runtime scenario ${t}.`,profiles:[e],scenarios:[t],status:"certified"})),...Zi.map(([e,t])=>({addons:[],auth:"better-auth",extras:["health-check"],id:`${e}-health-check`,note:`Better Auth Drizzle GraphQL healthy readiness and database outage HTTP 503 passed in scenario ${t}.`,profiles:[e],scenarios:[t],status:"certified"})),...Ji.map(([e,t])=>({addons:[],auth:"passport",extras:["typescript-7"],id:`${e}-typescript-7`,note:`Passport Prisma TypeScript 7 builds, migrates, passes unit tests, and authenticates in runtime scenario ${t}.`,profiles:[e],scenarios:[t],status:"certified"})),...Gi.map(([e,t,s])=>({addons:[],auth:t,extras:["todo-example"],id:`${e}-todo-rest`,note:`Todo create, owner isolation, update, and delete passed for ${e} in full runtime scenario ${s}.`,profiles:[e],scenarios:[s],status:"certified"})),{addons:[],auth:"better-auth",extras:["typescript-7"],id:"better-auth-prisma-typescript-7",note:"Better Auth Prisma TypeScript 7 builds, generates its adapter schema, passes unit and E2E tests, and resolves an authenticated profile in scenario 268.",profiles:["better-auth-prisma"],scenarios:["268-better-auth-prisma-typescript-7"],status:"certified"},{addons:[],auth:"better-auth",extras:["packages/shared"],id:"better-auth-monorepo-packages-shared",note:"Better Auth Prisma monorepo auth schema generation, database migrations, workspace build, and authenticated session resolution passed in scenario 267.",profiles:["better-auth-monorepo-prisma-postgres"],scenarios:["267-better-auth-monorepo-prisma-postgres"],status:"certified"},...Mi.map(([e,t])=>({addons:[],auth:"passport",extras:["rate-limiting"],id:`${e}-rate-limiting`,note:`Passport Fastify REST login remains usable and repeated invalid attempts receive HTTP 429 in scenario ${t}.`,profiles:[e],scenarios:[t],status:"certified"})),...Hi.map(([e,t,s])=>({addons:[],auth:e,extras:["todo-example"],id:`${t}-todo-rest`,note:`${e==="better-auth"?"Better Auth":"Passport"} PostgreSQL Fastify REST todo ownership passed authentication, owner isolation, update, delete, migrations, build, unit tests, and runtime checks in scenario ${s}.`,profiles:[t],scenarios:[s],status:"certified"})),...Fi.map(([e,t,s])=>({addons:[],auth:e,extras:["todo-example"],id:`${t}-todo-trpc`,note:`${e==="better-auth"?"Better Auth":"Passport"} ${t.includes("typeorm")?"TypeORM":"Drizzle"} ${t.includes("mysql")?"MySQL":"SQLite"} Fastify tRPC todo ownership passed anonymous rejection, authentication, owner isolation, update, delete, migrations, build, unit tests, and runtime checks in scenario ${s}.`,profiles:[t],scenarios:[s],status:"certified"})),...Oi.map(([e,t,s])=>({addons:[],auth:e,extras:["todo-example"],id:`${t}-todo-trpc`,note:`${e==="better-auth"?"Better Auth":"Passport"} Prisma PostgreSQL Fastify tRPC todo ownership passed authentication, owner isolation, update, delete, Prisma migrations, build, unit tests, and runtime checks in scenario ${s}.`,profiles:[t],scenarios:[s],status:"certified"})),...Ui.map(([e,t])=>({addons:[],auth:"better-auth",extras:["todo-example"],id:`${e}-todo-trpc`,note:`Better Auth Drizzle SQLite ${e.includes("fastify")?"Fastify":"Express"} tRPC todo ownership passed anonymous rejection, authentication, owner isolation, update, delete, migrations, build, unit tests, and runtime checks in scenario ${t}.`,profiles:[e],scenarios:[t],status:"certified"})),...Qi.map(([e,t,s])=>({addons:[],auth:e,extras:["todo-example"],id:`${t}-todo-trpc`,note:`${e==="better-auth"?"Better Auth":"Passport"} Prisma MongoDB ${t.includes("fastify")?"Fastify":"Express"} tRPC todo ownership passed authentication, owner isolation, create, update, delete, Prisma generation and push, build, unit tests, and runtime checks in scenario ${s}.`,profiles:[t],scenarios:[s],status:"certified"})),...Ii.map(([e,t,s])=>({addons:[],auth:e,extras:["todo-example"],id:`${t}-todo-trpc`,note:`${e==="better-auth"?"Better Auth":"Passport"} ${t.includes("typeorm")?"TypeORM":"Drizzle"} ${t.includes("mysql")?"MySQL":"SQLite"} tRPC todo ownership passed anonymous rejection, authentication, owner isolation, update, delete, migrations, build, unit tests, and runtime checks in scenario ${s}.`,profiles:[t],scenarios:[s],status:"certified"})),...Ni.map(([e,t,s])=>{let r="PostgreSQL";t.includes("sqlite")?r="SQLite":t.includes("mysql")&&(r="MySQL");const a=t.includes("fastify")?"Fastify":"Express",i=e==="better-auth"?"Better Auth":"Passport";return{addons:[],auth:e,extras:["todo-example"],id:`${t}-todo-graphql`,note:`${i} Drizzle GraphQL todo ownership for ${r} ${a} passed anonymous rejection, owner isolation, update, delete, build, and runtime checks in scenario ${s}.`,profiles:[t],scenarios:[s],status:"certified"}}),...Li.map(({auth:e,profile:t,scenario:s})=>({addons:[],auth:e,extras:["todo-example"],id:`${t}-todo-trpc`,note:`${e==="better-auth"?"Better Auth":"Passport"} ${t.includes("typeorm")?"TypeORM":"Drizzle"} PostgreSQL tRPC todo ownership passed registration, authentication, owner isolation, update, delete, migrations, build, unit tests, and end-to-end runtime checks in scenario ${s}.`,profiles:[t],scenarios:[s],status:"certified"})),{addons:["agent-skills"],auth:"passport",extras:[],id:"passport-agent-skills",note:"Passport + Drizzle PostgreSQL skills install noninteractively into the Codex project directory without replacing generated app files (scenario 210).",profiles:["passport-drizzle-postgres"],scenarios:["210-passport-drizzle-agent-skills"],status:"certified"},{addons:["agent-skills","ultracite"],auth:"passport",extras:[],id:"passport-agent-skills-ultracite",note:"Passport + Drizzle PostgreSQL skills install noninteractively and coexist with generated Ultracite instructions (scenario 211).",profiles:["passport-drizzle-postgres"],scenarios:["211-passport-drizzle-agent-skills-ultracite"],status:"certified"},{addons:["agent-skills"],auth:"better-auth",extras:[],id:"better-auth-agent-skills",note:"Better Auth + Prisma PostgreSQL installs auth, Prisma, NestJS, and JWT skills into the Codex project directory and passes generated-project checks (scenario 212).",profiles:["better-auth-prisma"],scenarios:["212-better-auth-prisma-agent-skills"],status:"certified"},{addons:["agent-skills"],auth:"passport",extras:[],id:"passport-typeorm-agent-skills",note:"Passport + TypeORM PostgreSQL installs TypeORM, NestJS, and JWT skills into the Codex project directory (scenario 213).",profiles:["passport-typeorm-postgres"],scenarios:["213-passport-typeorm-agent-skills"],status:"certified"},{addons:["agent-skills"],auth:"better-auth",extras:[],id:"better-auth-drizzle-agent-skills",note:"Better Auth + Drizzle PostgreSQL installs auth, NestJS, and JWT skills into the Codex project directory (scenario 214).",profiles:["better-auth-drizzle-postgres"],scenarios:["214-better-auth-drizzle-agent-skills"],status:"certified"},{addons:[],auth:"any",extras:[],id:"baseline",note:"No extras and no addons is the certified baseline for every profile.",scenarios:["01-minimal-no-install-no-git","14-better-auth-prisma","15-better-auth-drizzle","17-passport-prisma","31-better-auth-native-postgres"],status:"certified"},{addons:[],auth:"none",extras:["todo-example"],id:"none-todo-example",note:"Todo example with unauthenticated scaffolds across SQL and MongoDB profiles.",scenarios:["04-postgres-prisma","11-mysql-prisma-fastify","12-sqlite-drizzle","13-postgres-typeorm","16-graphql-prisma","18-mongodb-native","20-prisma8-postgres","101-todo-fastify-drizzle-mysql"],status:"certified"},{addons:[],auth:"none",extras:["docker"],id:"none-docker",note:"PostgreSQL Prisma Docker image builds, migrates, starts under Compose, serves the health endpoint over its published port, and tears down cleanly in scenario 171.",profiles:["prisma"],scenarios:["171-docker-health-prisma"],status:"certified"},{addons:[],auth:"none",extras:["docker","health-check"],id:"none-docker-health-check",note:"PostgreSQL Prisma Docker health-check runtime passed in scenario 171.",profiles:["prisma"],scenarios:["171-docker-health-prisma"],status:"certified"},{addons:["scalar-ui"],auth:"none",extras:["swagger"],id:"none-swagger-scalar",note:"Swagger document generation with the Scalar reference UI.",scenarios:["03-rest-swagger-scalar","99-swagger-scalar-fastify-drizzle"],status:"certified"},{addons:["scalar-ui"],auth:"better-auth",extras:["swagger"],id:"better-auth-prisma-swagger-scalar",note:"Better Auth + Prisma OpenAPI generation and Scalar UI; scenario 158 checks generated auth paths and serves the reference UI.",profiles:["better-auth-prisma"],scenarios:["158-better-auth-prisma-swagger-scalar"],status:"certified"},{addons:["scalar-ui"],auth:"passport",extras:["swagger"],id:"passport-prisma-swagger-scalar",note:"Passport + Prisma OpenAPI generation and Scalar UI; scenario 159 checks documented auth paths and serves the reference UI.",profiles:["passport-prisma"],scenarios:["159-passport-prisma-swagger-scalar"],status:"certified"},{addons:["scalar-ui"],auth:"passport",extras:["swagger"],id:"passport-typeorm-swagger-scalar",note:"Passport TypeORM PostgreSQL REST Swagger auth documentation and Scalar UI pass build and E2E in scenario 194.",profiles:["passport-typeorm-postgres"],scenarios:["194-passport-typeorm-swagger-scalar"],status:"certified"},{addons:["scalar-ui"],auth:"passport",extras:["swagger"],id:"passport-drizzle-swagger-scalar",note:"Passport Drizzle PostgreSQL REST Swagger auth documentation and Scalar UI pass migrations, build, and E2E in scenario 195.",profiles:["passport-drizzle-postgres"],scenarios:["195-passport-drizzle-swagger-scalar"],status:"certified"},{addons:["scalar-ui"],auth:"passport",extras:["swagger"],id:"passport-typeorm-mysql-swagger-scalar",note:"Passport TypeORM MySQL REST Swagger auth documentation and Scalar UI pass build and E2E in scenario 202.",profiles:["passport-typeorm-mysql"],scenarios:["202-passport-typeorm-mysql-swagger-scalar"],status:"certified"},{addons:["scalar-ui"],auth:"passport",extras:["swagger"],id:"passport-typeorm-sqlite-swagger-scalar",note:"Passport TypeORM SQLite REST Swagger auth documentation and Scalar UI pass build and E2E in scenario 203.",profiles:["passport-typeorm-sqlite"],scenarios:["203-passport-typeorm-sqlite-swagger-scalar"],status:"certified"},{addons:["scalar-ui"],auth:"passport",extras:["swagger"],id:"passport-drizzle-mysql-swagger-scalar",note:"Passport Drizzle MySQL REST Swagger auth documentation and Scalar UI pass migrations, build, and E2E in scenario 204.",profiles:["passport-drizzle-mysql"],scenarios:["204-passport-drizzle-mysql-swagger-scalar"],status:"certified"},{addons:["scalar-ui"],auth:"passport",extras:["swagger"],id:"passport-drizzle-sqlite-swagger-scalar",note:"Passport Drizzle SQLite REST Swagger auth documentation and Scalar UI pass migrations, build, and E2E in scenario 205.",profiles:["passport-drizzle-sqlite"],scenarios:["205-passport-drizzle-sqlite-swagger-scalar"],status:"certified"},{addons:["nestjs-zod"],auth:"better-auth",extras:["swagger","todo-example"],id:"better-auth-prisma-nestjs-zod-swagger-todo",note:"Better Auth + Prisma with nestjs-zod DTO validation and Swagger generation; scenario 160 checks invalid authenticated todos and documents their request body.",profiles:["better-auth-prisma"],scenarios:["160-better-auth-prisma-nestjs-zod-swagger-todo"],status:"certified"},{addons:["husky"],auth:"better-auth",extras:[],id:"better-auth-prisma-husky",note:"Better Auth + Prisma with the Husky pre-commit hook; scenario 162 checks Git setup and both successful and failing hook execution.",profiles:["better-auth-prisma"],scenarios:["162-better-auth-prisma-husky"],status:"certified"},{addons:["husky","ultracite"],auth:"better-auth",extras:[],id:"better-auth-prisma-husky-ultracite",note:"Better Auth + Prisma with Ultracite formatting and Husky hooks passed clean install, schema/migration generation, tests, and hook success/failure checks in scenario 167.",profiles:["better-auth-prisma"],scenarios:["167-better-auth-prisma-husky-ultracite"],status:"certified"},{addons:["husky","ultracite"],auth:"passport",extras:[],id:"passport-typeorm-husky-ultracite",note:"Passport TypeORM PostgreSQL REST with Ultracite and Husky hooks passed clean install, migrations, build, tests, formatting, and passing/failing hook commits in scenario 192.",profiles:["passport-typeorm-postgres"],scenarios:["192-passport-typeorm-husky-ultracite"],status:"certified"},{addons:["husky","ultracite"],auth:"passport",extras:[],id:"passport-drizzle-husky-ultracite",note:"Passport Drizzle PostgreSQL REST with Ultracite and Husky hooks passed clean install, migrations, build, tests, formatting, and passing/failing hook commits in scenario 193.",profiles:["passport-drizzle-postgres"],scenarios:["193-passport-drizzle-husky-ultracite"],status:"certified"},{addons:["husky","ultracite"],auth:"passport",extras:[],id:"passport-prisma-husky-ultracite",note:"Passport Prisma with Ultracite passes formatting, schema generation, migrations, build, tests, and successful/failing Husky hooks in scenario 173.",profiles:["passport-prisma"],scenarios:["173-passport-prisma-husky-ultracite"],status:"certified"},...Ci.map(({profile:e,scenario:t})=>({addons:["husky","ultracite"],auth:"passport",extras:[],id:`${e}-husky-ultracite`,note:`Passport ${e.includes("typeorm")?"TypeORM":"Drizzle"} ${e.includes("mysql")?"MySQL":"SQLite"} REST with Husky and Ultracite passed migrations, build, tests, formatting, and hook success/failure checks in scenario ${t}.`,profiles:[e],scenarios:[t],status:"certified"})),{addons:["husky"],auth:"passport",extras:[],id:"passport-prisma-husky",note:"Passport + Prisma with the Husky pre-commit hook; scenario 163 checks Git setup and both successful and failing hook execution.",profiles:["passport-prisma"],scenarios:["163-passport-prisma-husky"],status:"certified"},{addons:[],auth:"better-auth",extras:["docker"],id:"better-auth-prisma-docker",note:"Better Auth + Prisma Docker image, container-side schema generation/migrations, Compose startup, and published-port auth check passed in scenario 164.",profiles:["better-auth-prisma-docker"],scenarios:["164-better-auth-prisma-docker"],status:"certified"},{addons:[],auth:"passport",extras:["docker"],id:"passport-prisma-docker",note:"Passport + Prisma Docker clean install, migrations, build/tests, Compose startup, and protected published-port endpoint passed in scenario 165.",profiles:["passport-prisma-docker"],scenarios:["165-passport-prisma-docker"],status:"certified"},{addons:[],auth:"better-auth",extras:["docker","health-check"],id:"better-auth-prisma-docker-health-restart",note:"Better Auth user creation, generated migrations, Docker health, app-container restart, and post-restart sign-in/session resolution passed in scenario 172.",profiles:["better-auth-prisma-docker"],scenarios:["172-better-auth-prisma-docker-health-restart"],status:"certified"},{addons:[],auth:"better-auth",extras:["todo-example"],id:"better-auth-prisma-trpc-todo",note:"Better Auth + Prisma REST and tRPC todo operations pass anonymous rejection and two-user owner-isolation checks in scenario 168.",profiles:["better-auth-prisma-trpc"],scenarios:["168-better-auth-prisma-trpc-todo"],status:"certified"},{addons:[],auth:"passport",extras:["todo-example"],id:"passport-prisma-trpc-todo",note:"Passport + Prisma REST and tRPC todo operations pass anonymous rejection and two-user owner-isolation checks in scenario 169.",profiles:["passport-prisma-trpc"],scenarios:["169-passport-prisma-trpc-todo"],status:"certified"},{addons:[],auth:"passport",extras:["rate-limiting"],id:"passport-prisma-rate-limiting",note:"Normal Passport login and repeated login throttling return the expected success and 429 responses in scenario 170.",profiles:["passport-prisma"],scenarios:["170-passport-prisma-rate-limiting"],status:"certified"},{addons:[],auth:"passport",extras:["rate-limiting"],id:"passport-prisma-trpc-rate-limiting",note:"Scenario 270 verifies normal Passport login, HTTP 429 after repeated invalid login attempts, and HTTP 429 for repeated tRPC procedure requests.",profiles:["passport-prisma-trpc"],scenarios:["270-passport-prisma-trpc-rate-limiting"],status:"certified"},{addons:[],auth:"passport",extras:["rate-limiting"],id:"passport-typeorm-rate-limiting",note:"Scenario 188 verifies Passport TypeORM PostgreSQL REST login remains usable and repeated invalid logins receive HTTP 429.",profiles:["passport-typeorm-postgres"],scenarios:["188-passport-typeorm-postgres-rate-limiting"],status:"certified"},{addons:[],auth:"passport",extras:["rate-limiting"],id:"passport-drizzle-rate-limiting",note:"Scenario 189 verifies Passport Drizzle PostgreSQL REST login remains usable and repeated invalid logins receive HTTP 429.",profiles:["passport-drizzle-postgres"],scenarios:["189-passport-drizzle-postgres-rate-limiting"],status:"certified"},{addons:[],auth:"passport",extras:["rate-limiting"],id:"passport-typeorm-mysql-rate-limiting",note:"Scenario 198 verifies Passport TypeORM MySQL REST normal login and HTTP 429 after repeated invalid attempts.",profiles:["passport-typeorm-mysql"],scenarios:["198-passport-typeorm-mysql-rate-limiting"],status:"certified"},{addons:[],auth:"passport",extras:["rate-limiting"],id:"passport-typeorm-sqlite-rate-limiting",note:"Scenario 199 verifies Passport TypeORM SQLite REST normal login and HTTP 429 after repeated invalid attempts.",profiles:["passport-typeorm-sqlite"],scenarios:["199-passport-typeorm-sqlite-rate-limiting"],status:"certified"},{addons:[],auth:"passport",extras:["rate-limiting"],id:"passport-drizzle-mysql-rate-limiting",note:"Scenario 200 verifies Passport Drizzle MySQL REST normal login and HTTP 429 after repeated invalid attempts.",profiles:["passport-drizzle-mysql"],scenarios:["200-passport-drizzle-mysql-rate-limiting"],status:"certified"},{addons:[],auth:"passport",extras:["rate-limiting"],id:"passport-drizzle-sqlite-rate-limiting",note:"Scenario 201 verifies Passport Drizzle SQLite REST normal login and HTTP 429 after repeated invalid attempts.",profiles:["passport-drizzle-sqlite"],scenarios:["201-passport-drizzle-sqlite-rate-limiting"],status:"certified"},{addons:[],auth:"passport",extras:["health-check"],id:"passport-prisma-health-check",note:"Scenario 174 verifies healthy anonymous readiness and PostgreSQL outage transitions return HTTP 503 with Passport Prisma REST.",profiles:["passport-prisma"],scenarios:["174-passport-prisma-health-check"],status:"certified"},{addons:[],auth:"passport",extras:["todo-example"],id:"passport-prisma-rest-todo",note:"Passport Prisma REST todo scenario 175 verifies authenticated owner access and blocks cross-user list, update, and delete operations.",profiles:["passport-prisma"],scenarios:["175-passport-prisma-rest-todo"],status:"certified"},{addons:[],auth:"passport",extras:["todo-example"],id:"passport-typeorm-rest-todo",note:"Passport TypeORM REST todo ownership and owner isolation passed on PostgreSQL, MySQL, and SQLite in scenarios 182, 184, and 185; Fastify/tRPC variants remain gated.",profiles:["passport-typeorm-postgres","passport-typeorm-mysql","passport-typeorm-sqlite"],scenarios:["182-passport-typeorm-postgres-rest-todo","184-passport-typeorm-mysql-rest-todo","185-passport-typeorm-sqlite-rest-todo"],status:"certified"},{addons:[],auth:"passport",extras:["todo-example"],id:"passport-drizzle-rest-todo",note:"Passport Drizzle REST todo ownership and owner isolation passed on PostgreSQL, MySQL, and SQLite in scenarios 183, 186, and 187; Fastify/tRPC variants remain gated.",profiles:["passport-drizzle-postgres","passport-drizzle-mysql","passport-drizzle-sqlite"],scenarios:["183-passport-drizzle-postgres-rest-todo","186-passport-drizzle-mysql-rest-todo","187-passport-drizzle-sqlite-rest-todo"],status:"certified"},{addons:[],auth:"better-auth",extras:["rate-limiting"],id:"better-auth-prisma-rate-limiting",note:"A successful Better Auth sign-in followed by repeated authentication requests reaching 429 passed in scenario 48.",profiles:["better-auth-prisma"],scenarios:["48-better-auth-prisma-rate-limit"],status:"certified"},{addons:["nestjs-zod"],auth:"passport",extras:["swagger","todo-example"],id:"passport-typeorm-nestjs-zod-swagger-todo",note:"Passport TypeORM PostgreSQL REST nestjs-zod, Swagger, and authenticated todo ownership pass build and E2E in scenario 196.",profiles:["passport-typeorm-postgres"],scenarios:["196-passport-typeorm-nestjs-zod-swagger-todo"],status:"certified"},{addons:["nestjs-zod"],auth:"passport",extras:["swagger","todo-example"],id:"passport-drizzle-nestjs-zod-swagger-todo",note:"Passport Drizzle PostgreSQL REST nestjs-zod, Swagger, and authenticated todo ownership pass migrations, build, and E2E in scenario 197.",profiles:["passport-drizzle-postgres"],scenarios:["197-passport-drizzle-nestjs-zod-swagger-todo"],status:"certified"},{addons:["nestjs-zod"],auth:"passport",extras:["swagger","todo-example"],id:"passport-typeorm-mysql-nestjs-zod-swagger-todo",note:"Passport TypeORM MySQL REST nestjs-zod, Swagger, and todo ownership pass migrations, build, and E2E in scenario 206.",profiles:["passport-typeorm-mysql"],scenarios:["206-passport-typeorm-mysql-nestjs-zod-swagger-todo"],status:"certified"},{addons:["nestjs-zod"],auth:"passport",extras:["swagger","todo-example"],id:"passport-typeorm-sqlite-nestjs-zod-swagger-todo",note:"Passport TypeORM SQLite REST nestjs-zod, Swagger, and todo ownership pass migrations, build, and E2E in scenario 207.",profiles:["passport-typeorm-sqlite"],scenarios:["207-passport-typeorm-sqlite-nestjs-zod-swagger-todo"],status:"certified"},{addons:["nestjs-zod"],auth:"passport",extras:["swagger","todo-example"],id:"passport-drizzle-mysql-nestjs-zod-swagger-todo",note:"Passport Drizzle MySQL REST nestjs-zod, Swagger, and todo ownership pass migrations, build, and E2E in scenario 208.",profiles:["passport-drizzle-mysql"],scenarios:["208-passport-drizzle-mysql-nestjs-zod-swagger-todo"],status:"certified"},{addons:["nestjs-zod"],auth:"passport",extras:["swagger","todo-example"],id:"passport-drizzle-sqlite-nestjs-zod-swagger-todo",note:"Passport Drizzle SQLite REST nestjs-zod, Swagger, and todo ownership pass migrations, build, and E2E in scenario 209.",profiles:["passport-drizzle-sqlite"],scenarios:["209-passport-drizzle-sqlite-nestjs-zod-swagger-todo"],status:"certified"},{addons:["nestjs-zod"],auth:"passport",extras:["swagger","todo-example"],id:"passport-prisma-nestjs-zod-swagger-todo",note:"Passport + Prisma with nestjs-zod DTO validation and Swagger generation; scenario 161 checks invalid authenticated todos and documents their request body.",profiles:["passport-prisma"],scenarios:["161-passport-prisma-nestjs-zod-swagger-todo"],status:"certified"},{addons:["ultracite"],auth:"none",extras:["health-check"],id:"none-health-ultracite",note:"Terminus health endpoints with the Ultracite toolchain preset.",scenarios:["06-fastify-health","100-health-fastify-typeorm"],status:"certified"},{addons:["ultracite"],auth:"none",extras:[],formatter:"eslint-prettier-no-stylelint",id:"none-ultracite",note:"Unauthenticated no-database REST+tRPC with ESLint/Prettier; direct runtime certification is in progress.",profiles:[],scenarios:["05-trpc-yarn"],status:"certified"},{addons:["ultracite"],auth:"none",extras:[],formatter:"biome",id:"none-ultracite-biome",note:"The unauthenticated no-database app uses the Biome-backed Ultracite toolchain.",profiles:[],scenarios:["06-fastify-health","08-rest-npm-zod"],status:"certified"},{addons:["ultracite"],auth:"none",extras:[],formatter:"oxlint-oxfmt",id:"none-ultracite-oxlint",note:"The unauthenticated app uses the Oxlint/Oxfmt Ultracite toolchain.",profiles:[],scenarios:["117-graphql-drizzle-ultracite"],status:"certified"},{addons:["ultracite"],auth:"none",extras:[],formatter:"oxlint-oxfmt",id:"microservice-grpc-ultracite",note:"gRPC with Ultracite passed a clean install, pre-format lint, formatted checks, build, unit and E2E tests, compiled main.ts gRPC calls, HTTP route verification, and process shutdown in scenario 326.",profiles:["microservice-grpc"],scenarios:["326-microservice-grpc-ultracite"],status:"certified"},...["redis","mqtt","nats","rabbitmq","kafka"].map((e,t)=>({addons:["ultracite"],auth:"none",extras:[],formatter:"oxlint-oxfmt",id:`microservice-${e}-ultracite`,note:`${e} with Ultracite passed fresh install, pre-format lint, formatted checks, build, unit/E2E tests, broker event delivery, independent request/reply against compiled main.ts, HTTP routing, and shutdown in scenario ${321+t}.`,profiles:[`microservice-${e}`],scenarios:[`${321+t}-microservice-${e}-ultracite`],status:"certified"})),...["grpc","redis","mqtt","nats","rabbitmq","kafka"].map((e,t)=>({addons:["ultracite"],auth:"none",extras:[],formatter:"biome",id:`microservice-${e}-biome-ultracite`,note:`Biome + Ultracite passed initial Oxlint, formatting checks, build, tests, compiled runtime, HTTP route, and shutdown in scenario ${362+t}.`,profiles:[`microservice-${e}`],scenarios:[`${362+t}-microservice-${e}-biome-ultracite`],status:"certified"})),...["grpc","redis","mqtt","nats","rabbitmq","kafka"].map((e,t)=>({addons:[],auth:"none",extras:["docker"],id:`microservice-${e}-docker`,note:`Scenario ${368+t} passed fresh install, build, tests, compiled transport request/reply${e==="grpc"?"":" and event delivery"}, Docker Compose readiness, and cleanup. Recovery scenario ${380+t} restarted ${e==="grpc"?"the gRPC app":"the broker and then the app"}, waited for health, and passed compiled transport request/reply${e==="grpc"?"":" and event delivery"} again. This proves operator restart recovery, not transparent reconnect or durable delivery.`,profiles:[`microservice-${e}`],scenarios:[`${368+t}-microservice-${e}-docker`,`${380+t}-microservice-${e}-docker-recovery`],status:"certified"})),...["grpc","redis","mqtt","nats","rabbitmq","kafka"].map((e,t)=>({addons:["husky","ultracite"],auth:"none",extras:[],formatter:"oxlint-oxfmt",id:`microservice-${e}-husky-ultracite-oxlint`,note:`Scenario ${374+t} passed generation, pre-format lint, Ultracite formatting/checks, build, tests, compiled transport runtime, Husky successful and failing pre-commit behavior, and every selected editor/agent/hook/skill integration for this exact transport.`,profiles:[`microservice-${e}`],scenarios:[`${374+t}-microservice-${e}-husky-ultracite`],status:"certified"})),...["biome","eslint-prettier-stylelint","eslint-prettier-no-stylelint","oxlint-oxfmt"].flatMap((e,t)=>["grpc","redis","mqtt","nats","rabbitmq","kafka"].map((s,r)=>{const a=338+t*6+r;return{addons:[],auth:"none",extras:[],formatter:e,id:`microservice-${s}-${e}`,note:`${s} with ${e} passed clean installation, formatter check/fix, build, tests, compiled runtime, HTTP route, and shutdown in scenario ${a}.`,profiles:[`microservice-${s}`],scenarios:[`${a}-microservice-${s}-${e}`],status:"certified"}})),{addons:["nestjs-zod","ultracite"],auth:"none",extras:[],formatter:"biome",id:"none-nestjs-zod-ultracite",note:"NestJS-Zod request validation with the Ultracite toolchain.",scenarios:["08-rest-npm-zod"],status:"certified"},{addons:["ultracite"],auth:"none",extras:["todo-example"],formatter:"biome",id:"none-todo-ultracite-biome",note:"Biome-backed Ultracite todo compositions are runtime-verified separately for Prisma/MySQL/Fastify and TypeORM/PostgreSQL.",profiles:["prisma-mysql-fastify","typeorm-postgresql-express"],scenarios:["11-mysql-prisma-fastify","13-postgres-typeorm"],status:"certified"},{addons:["ultracite"],auth:"none",extras:["todo-example"],formatter:"oxlint-oxfmt",id:"none-todo-ultracite-oxlint",note:"Todo example with Oxlint/Oxfmt Ultracite passes on Drizzle/SQLite.",scenarios:["12-sqlite-drizzle"],status:"certified"},{addons:[],auth:"none",extras:["packages/shared"],id:"none-packages-shared",note:"The generated monorepo shared package compiles and passes app unit and E2E tests in scenario 418.",scenarios:["418-monorepo-shared-package-runtime"],status:"certified"},{addons:["ultracite"],auth:"none",extras:["packages/shared"],id:"none-packages-shared-ultracite",note:"The generated monorepo shared package passes Ultracite checks, build, app unit tests, and E2E tests in scenario 419.",scenarios:["419-monorepo-shared-package-ultracite"],status:"certified"},{addons:["ultracite"],auth:"better-auth",extras:["rate-limiting"],id:"better-auth-rate-limiting-ultracite",note:"Throttling applied to Better Auth endpoints with the Ultracite toolchain.",profiles:["better-auth-native-postgres-trpc"],scenarios:["07-postgres-better-auth-trpc"],status:"certified"},{addons:["ultracite"],auth:"passport",extras:[],id:"passport-prisma-ultracite",note:"Passport + Prisma generated authentication files pass Ultracite formatting, build, unit tests, and E2E in scenario 166.",profiles:["passport-prisma"],scenarios:["166-passport-prisma-ultracite"],status:"certified"},{addons:["ultracite"],auth:"passport",extras:["todo-example"],formatter:"oxlint-oxfmt",id:"passport-prisma-trpc-todo-ultracite",note:"Passport Prisma PostgreSQL REST+tRPC authenticated todo ownership and Ultracite pass in scenario 442.",profiles:["passport-prisma-trpc"],scenarios:["442-passport-prisma-trpc-todo-ultracite"],status:"certified"},{addons:["ultracite"],auth:"better-auth",extras:[],formatter:"oxlint-oxfmt",id:"better-auth-prisma-trpc-ultracite",note:"Better Auth Prisma 7 PostgreSQL REST+tRPC with Ultracite formatting, build and E2E passes scenario 443.",profiles:["better-auth-prisma-trpc"],scenarios:["443-better-auth-prisma-trpc-todo-ultracite"],status:"certified"},{addons:["ultracite"],auth:"passport",extras:[],formatter:"oxlint-oxfmt",id:"passport-prisma-trpc-ultracite",note:"Passport Prisma 7 PostgreSQL REST+tRPC with Ultracite formatting, build and E2E passes scenario 442.",profiles:["passport-prisma-trpc"],scenarios:["442-passport-prisma-trpc-todo-ultracite"],status:"certified"},{addons:["ultracite"],auth:"passport",extras:[],id:"passport-typeorm-ultracite",note:"Passport TypeORM PostgreSQL REST with Ultracite passed clean install, migrations, lint/format, build, unit tests, and E2E in scenario 190.",profiles:["passport-typeorm-postgres"],scenarios:["190-passport-typeorm-postgres-ultracite"],status:"certified"},{addons:["ultracite"],auth:"passport",extras:[],id:"passport-drizzle-ultracite",note:"Passport Drizzle PostgreSQL REST with Ultracite passed clean install, migrations, lint/format, build, unit tests, and E2E in scenario 191.",profiles:["passport-drizzle-postgres"],scenarios:["191-passport-drizzle-postgres-ultracite"],status:"certified"},{addons:["ultracite"],auth:"passport",extras:[],id:"passport-drizzle-graphql-ultracite",note:"Ultracite with Passport and Drizzle GraphQL; scenarios 133\u2013138 passed across PostgreSQL/MySQL/SQLite and Express/Fastify.",profiles:["passport-drizzle-graphql","passport-drizzle-graphql-fastify","passport-drizzle-graphql-mysql","passport-drizzle-graphql-mysql-fastify","passport-drizzle-graphql-sqlite","passport-drizzle-graphql-sqlite-fastify"],scenarios:["133-passport-drizzle-graphql-ultracite","134-passport-drizzle-graphql-fastify-ultracite","135-passport-drizzle-graphql-mysql-ultracite","136-passport-drizzle-graphql-mysql-fastify-ultracite","137-passport-drizzle-graphql-sqlite-ultracite","138-passport-drizzle-graphql-sqlite-fastify-ultracite"],status:"certified"},{addons:["ultracite"],auth:"none",extras:[],id:"graphql-drizzle-ultracite",note:"Ultracite on the unauthenticated Drizzle GraphQL profile; runtime scenario 117 passed install, migrations, lint/format, build, and GraphQL E2E.",profiles:["graphql-drizzle"],scenarios:["117-graphql-drizzle-ultracite"],status:"certified"},{addons:[],auth:"better-auth",extras:["rate-limiting"],id:"better-auth-rate-limiting",note:"Throttling applied to Better Auth endpoints alone.",profiles:["better-auth-native-postgres-trpc","better-auth-prisma"],scenarios:["07-postgres-better-auth-trpc"],status:"certified"},{addons:[],auth:"better-auth",extras:["health-check"],id:"better-auth-health-check",note:"Terminus health endpoints alongside Better Auth; scenario 47 verifies PostgreSQL outage transitions return HTTP 503.",profiles:["better-auth-prisma"],scenarios:["47-better-auth-prisma-health"],status:"certified"},{addons:[],auth:"better-auth",extras:["todo-example"],id:"better-auth-todo-example",note:"Ownership-scoped todo example alongside Better Auth.",profiles:["better-auth-prisma"],scenarios:["49-better-auth-prisma-todo"],status:"certified"},{addons:["ultracite"],auth:"better-auth",extras:[],id:"better-auth-ultracite",note:"Bare Better Auth + Ultracite composition; scenario 157 runs auth schema generation, formatting, migrations, build, and E2E.",profiles:["better-auth-prisma"],scenarios:["157-better-auth-prisma-ultracite"],status:"certified"},{addons:[],auth:"better-auth",extras:["health-check"],id:"better-auth-graphql-health-check",note:"Terminus health endpoints alongside GraphQL and Better Auth.",profiles:["better-auth-prisma-graphql"],scenarios:["51-better-auth-prisma-graphql"],status:"certified"},{addons:[],auth:"better-auth",extras:["rate-limiting"],id:"better-auth-graphql-rate-limiting",note:"GraphQL rate limiting with Better Auth and Prisma; scenario 155 exercises repeated GraphQL requests against the generated throttler guard.",profiles:["better-auth-prisma-graphql"],scenarios:["155-better-auth-prisma-graphql-rate-limiting"],status:"certified"},{addons:[],auth:"passport",extras:["health-check"],id:"passport-graphql-health-check",note:"Terminus health endpoints alongside GraphQL and Passport.",profiles:["passport-prisma-graphql"],scenarios:["52-passport-prisma-graphql"],status:"certified"},{addons:[],auth:"passport",extras:["rate-limiting"],id:"passport-graphql-rate-limiting",note:"GraphQL rate limiting with Passport and Prisma; scenario 156 exercises repeated GraphQL requests against the generated throttler guard.",profiles:["passport-prisma-graphql"],scenarios:["156-passport-prisma-graphql-rate-limiting"],status:"certified"},{addons:[],auth:"better-auth",extras:["health-check"],id:"better-auth-drizzle-graphql-health-check",note:"Terminus readiness alongside Better Auth and Drizzle GraphQL; certified by scenario 114.",profiles:["better-auth-drizzle-graphql"],scenarios:["114-better-auth-drizzle-graphql-health"],status:"certified"},{addons:[],auth:"passport",extras:["health-check"],id:"passport-drizzle-graphql-health-check",note:"Terminus readiness alongside Passport and Drizzle GraphQL; scenarios 115 and 139\u2013143 pass across PostgreSQL/MySQL/SQLite and Express/Fastify.",profiles:["passport-drizzle-graphql","passport-drizzle-graphql-fastify","passport-drizzle-graphql-mysql","passport-drizzle-graphql-mysql-fastify","passport-drizzle-graphql-sqlite","passport-drizzle-graphql-sqlite-fastify"],scenarios:["115-passport-drizzle-graphql-health","139-passport-drizzle-graphql-fastify-health","140-passport-drizzle-graphql-mysql-health","141-passport-drizzle-graphql-mysql-fastify-health","142-passport-drizzle-graphql-sqlite-health","143-passport-drizzle-graphql-sqlite-fastify-health"],status:"certified"},{addons:[],auth:"passport",extras:["todo-example"],id:"passport-graphql-todo-example",note:"Passport GraphQL todo with Prisma; scenario 154 verifies anonymous rejection and owner isolation using Prisma Passport's register/login flow.",profiles:["passport-prisma-graphql"],scenarios:["154-passport-prisma-graphql-todo"],status:"certified"},{addons:[],auth:"better-auth",extras:["todo-example"],id:"better-auth-prisma-graphql-todo-example",note:"Better Auth GraphQL todo with Prisma; scenario 153 verifies anonymous rejection and owner isolation across two persisted users.",profiles:["better-auth-prisma-graphql"],scenarios:["153-better-auth-prisma-graphql-todo"],status:"certified"},{addons:[],auth:"better-auth",extras:["todo-example"],id:"better-auth-drizzle-graphql-todo-example",note:"Certified by scenario 149: anonymous access is rejected and todo ownership is isolated across two persisted users.",profiles:["better-auth-drizzle-graphql"],scenarios:["149-better-auth-drizzle-graphql-todo"],status:"certified"},{addons:[],auth:"passport",extras:["todo-example"],id:"passport-drizzle-graphql-todo-example",note:"Certified by scenario 150: anonymous access is rejected and todo ownership is isolated across two JWT-authenticated users.",profiles:["passport-drizzle-graphql"],scenarios:["150-passport-drizzle-graphql-todo"],status:"certified"},{addons:[],auth:"better-auth",extras:["rate-limiting"],id:"better-auth-drizzle-graphql-rate-limiting",note:"Better Auth authentication throttling and GraphQL rate-limit errors passed on Drizzle PostgreSQL, MySQL, and SQLite with Express and Fastify in scenarios 151 and 281\u2013285.",profiles:["better-auth-drizzle-graphql",...Pe.filter(([e])=>e.startsWith("better-auth")).map(([e])=>e)],scenarios:["151-better-auth-drizzle-graphql-rate-limiting",...Pe.filter(([e])=>e.startsWith("better-auth")).map(([,e])=>e)],status:"certified"},{addons:[],auth:"passport",extras:["rate-limiting"],id:"passport-drizzle-graphql-rate-limiting",note:"Passport GraphQL throttling passed on Drizzle PostgreSQL, MySQL, and SQLite with Express and Fastify in scenarios 152 and 286\u2013290.",profiles:["passport-drizzle-graphql",...Pe.filter(([e])=>e.startsWith("passport")).map(([e])=>e)],scenarios:["152-passport-drizzle-graphql-rate-limiting",...Pe.filter(([e])=>e.startsWith("passport")).map(([,e])=>e)],status:"certified"},{addons:[],auth:"better-auth",extras:["health-check"],id:"better-auth-typeorm-health-check",note:"Terminus health endpoints alongside Better Auth and TypeORM; runtime scenario 91 is now certified.",profiles:["better-auth-typeorm-postgres","better-auth-typeorm-postgres-fastify","better-auth-typeorm-postgres-trpc","better-auth-typeorm-postgres-fastify-trpc","better-auth-typeorm-mysql","better-auth-typeorm-mysql-fastify","better-auth-typeorm-mysql-trpc","better-auth-typeorm-mysql-fastify-trpc","better-auth-typeorm-sqlite","better-auth-typeorm-sqlite-fastify","better-auth-typeorm-sqlite-trpc","better-auth-typeorm-sqlite-fastify-trpc"],scenarios:["91-better-auth-typeorm-postgres-health"],status:"certified"},{addons:[],auth:"better-auth",extras:["rate-limiting"],id:"better-auth-typeorm-rate-limiting",note:"Throttling applied to Better Auth endpoints with TypeORM; runtime scenario 92 is now certified.",profiles:["better-auth-typeorm-postgres","better-auth-typeorm-postgres-fastify","better-auth-typeorm-postgres-trpc","better-auth-typeorm-postgres-fastify-trpc","better-auth-typeorm-mysql","better-auth-typeorm-mysql-fastify","better-auth-typeorm-mysql-trpc","better-auth-typeorm-mysql-fastify-trpc","better-auth-typeorm-sqlite","better-auth-typeorm-sqlite-fastify","better-auth-typeorm-sqlite-trpc","better-auth-typeorm-sqlite-fastify-trpc"],scenarios:["92-better-auth-typeorm-postgres-rate-limit"],status:"certified"},{addons:[],auth:"better-auth",extras:["todo-example"],id:"better-auth-typeorm-todo-example",note:"Ownership-scoped todo example alongside Better Auth and TypeORM; runtime scenario 93 is now certified.",profiles:["better-auth-typeorm-postgres","better-auth-typeorm-postgres-fastify","better-auth-typeorm-postgres-trpc","better-auth-typeorm-postgres-fastify-trpc","better-auth-typeorm-mysql","better-auth-typeorm-mysql-fastify","better-auth-typeorm-mysql-trpc","better-auth-typeorm-mysql-fastify-trpc","better-auth-typeorm-sqlite","better-auth-typeorm-sqlite-fastify","better-auth-typeorm-sqlite-trpc","better-auth-typeorm-sqlite-fastify-trpc"],scenarios:["93-better-auth-typeorm-postgres-todo"],status:"certified"},{addons:[],auth:"better-auth",extras:["health-check"],id:"better-auth-drizzle-health-check",note:"Terminus health endpoints alongside Better Auth and Drizzle; runtime scenario 94 is now certified.",profiles:["better-auth-drizzle","better-auth-drizzle-fastify","better-auth-drizzle-trpc","better-auth-drizzle-postgres","better-auth-drizzle-postgres-fastify","better-auth-drizzle-postgres-trpc","better-auth-drizzle-postgres-fastify-trpc","better-auth-drizzle-mysql","better-auth-drizzle-mysql-fastify","better-auth-drizzle-mysql-trpc","better-auth-drizzle-mysql-fastify-trpc"],scenarios:["94-better-auth-drizzle-postgres-health"],status:"certified"},{addons:[],auth:"better-auth",extras:["rate-limiting"],id:"better-auth-drizzle-rate-limiting",note:"Throttling applied to Better Auth endpoints with Drizzle; runtime scenario 95 is now certified.",profiles:["better-auth-drizzle","better-auth-drizzle-fastify","better-auth-drizzle-trpc","better-auth-drizzle-postgres","better-auth-drizzle-postgres-fastify","better-auth-drizzle-postgres-trpc","better-auth-drizzle-postgres-fastify-trpc","better-auth-drizzle-mysql","better-auth-drizzle-mysql-fastify","better-auth-drizzle-mysql-trpc","better-auth-drizzle-mysql-fastify-trpc"],scenarios:["95-better-auth-drizzle-postgres-rate-limit"],status:"certified"},{addons:[],auth:"better-auth",extras:["todo-example"],id:"better-auth-drizzle-todo-example",note:"Ownership-scoped todo example alongside Better Auth and Drizzle; runtime scenario 96 is now certified.",profiles:["better-auth-drizzle","better-auth-drizzle-fastify","better-auth-drizzle-trpc","better-auth-drizzle-postgres","better-auth-drizzle-postgres-fastify","better-auth-drizzle-postgres-trpc","better-auth-drizzle-postgres-fastify-trpc","better-auth-drizzle-mysql","better-auth-drizzle-mysql-fastify","better-auth-drizzle-mysql-trpc","better-auth-drizzle-mysql-fastify-trpc"],scenarios:["96-better-auth-drizzle-postgres-todo"],status:"certified"},{addons:[],auth:"passport",extras:["health-check"],id:"passport-typeorm-health-check",note:"Terminus health checks and database-outage HTTP 503 transitions passed for Passport TypeORM PostgreSQL, MySQL, and SQLite REST; Fastify/tRPC profiles remain gated.",profiles:["passport-typeorm-postgres","passport-typeorm-mysql","passport-typeorm-sqlite"],scenarios:["97-passport-typeorm-postgres-health","176-passport-typeorm-postgres-health","178-passport-typeorm-mysql-health","179-passport-typeorm-sqlite-health"],status:"certified"},{addons:["ultracite"],auth:"better-auth",extras:["health-check"],id:"better-auth-drizzle-graphql-health-ultracite",note:"Ultracite with Better Auth, Drizzle GraphQL, and health-check; runtime scenario 116 passed install, repeated auth generation, migrations, lint/format, build, and GraphQL E2E.",profiles:["better-auth-drizzle-graphql"],scenarios:["116-better-auth-drizzle-graphql-health-ultracite"],status:"certified"},{addons:[],auth:"passport",extras:["health-check"],id:"passport-drizzle-health-check",note:"Terminus health checks and database-outage HTTP 503 transitions passed for Passport Drizzle PostgreSQL, MySQL, and SQLite REST; Fastify/tRPC profiles remain gated.",profiles:["passport-drizzle-postgres","passport-drizzle-mysql","passport-drizzle-sqlite"],scenarios:["98-passport-drizzle-postgres-health","177-passport-drizzle-postgres-health","180-passport-drizzle-mysql-health","181-passport-drizzle-sqlite-health"],status:"certified"}];function se(e,t){if(e.length!==t.length)return!1;const s=new Set(t);return e.every(r=>s.has(r))}c(se,"ie"),p(se,"sameSet");function Ee(e,t,s,r,a,i=!1){if(r!==void 0){const o=Q.find(n=>(n.auth==="any"||n.auth===e)&&se(n.extras,t)&&se(n.addons,s)&&(n.profiles===void 0||n.profiles.includes(r))&&(a===void 0||n.formatter===void 0&&(!s.includes("ultracite")||e!=="none")||n.formatter===a)&&n.profiles?.includes(r));if(o)return o}return Q.find(o=>(o.auth==="any"||o.auth===e)&&(e!=="none"||o.profiles===void 0||o.profiles.length===0||o.profiles.includes(r))&&(!i||r===void 0||o.profiles===void 0||o.profiles.length===0)&&se(o.extras,t)&&se(o.addons,s)&&(a===void 0||o.formatter===void 0&&(!s.includes("ultracite")||e!=="none")||o.formatter===a))}c(Ee,"Ue"),p(Ee,"findEvidence");const js={addons:["agent-skills","husky","nestjs-zod","scalar-ui","ultracite"],extras:["docker","health-check","rate-limiting","swagger","todo-example","typescript-7"]},Oo=["husky","nestjs-zod","scalar-ui","ultracite","docker","health-check","rate-limiting","swagger","todo-example","typescript-7"],Uo=[["docker","rate-limiting","swagger"],["docker","rate-limiting","todo-example"],["docker","swagger","todo-example"],["nestjs-zod","swagger","todo-example"],["scalar-ui","swagger"]],Qo=[["agent-skills","husky","scalar-ui","ultracite","docker","rate-limiting","swagger","todo-example"]];function Ke(e){const{profile:t}=e,s=e.auth??"none";if(!["none","passport","better-auth","better-auth:stateless"].includes(s)||t===void 0||t.includes("monorepo")||e.projectType==="monorepo")return;const r=e.addons??[],a=e.extras??[],i=[...r,...a],o=new Set([...js.addons,...js.extras]);if(i.some(m=>!o.has(m))||r.includes("ultracite")&&e.formatter!=="oxlint-oxfmt"||t==="prisma-sqlserver"&&Qo.some(m=>m.length===i.length&&m.every(h=>i.includes(h))))return;if(t.endsWith("-prisma-trpc")||t.endsWith("-prisma-fastify-trpc")){const m=Q.find(h=>h.id===`${s}-prisma-postgresql${t.includes("fastify")?"-fastify":""}-trpc-full-feature-bundle`&&h.status==="certified"&&h.profiles?.includes(t));if(m&&i.every(h=>[...m.addons,...m.extras].some(g=>g===h))&&(!r.includes("ultracite")||e.formatter===m.formatter))return{...m,addons:r,extras:a,id:`inferred-${t}-${i.toSorted().join("-")||"baseline"}`,note:`This feature subset is covered by the certified PostgreSQL Prisma REST+tRPC full bundle for ${t}.`}}const n=new Set,l=new Set(["agent-skills","husky","typescript-7"]),d=p(m=>{const h=Q.filter(g=>{const v=g.auth==="any"&&g.profiles===void 0&&m.length===1&&m.every(z=>l.has(z));if(g.status!=="certified"||!v&&(g.auth!==s||!g.profiles?.includes(t)))return!1;const b=[...g.addons,...g.extras];return m.length===0&&b.length>0||!m.every(z=>b.includes(z))?!1:!m.includes("ultracite")||g.formatter==="oxlint-oxfmt"});for(const g of h)for(const v of g.scenarios)n.add(v);return h[0]},"evidenceFor");if(!Q.some(m=>m.status==="certified"&&(m.auth===s||m.auth==="any")&&m.addons.length===0&&m.extras.length===0&&(m.profiles===void 0||m.profiles.includes(t))))return;for(const m of i)if(!d([m]))return;const u=i.filter(m=>Oo.some(h=>h===m&&!l.has(h)));for(let m=0;m<u.length;m+=1){const h=u[m];if(h)for(let g=m+1;g<u.length;g+=1){const v=u[g];if(v&&!d([h,v]))return}}for(const m of Uo)if(m.every(h=>i.includes(h))&&!d(m))return;return{addons:r,auth:s,extras:a,...r.includes("ultracite")?{formatter:"oxlint-oxfmt"}:{},id:`heuristic-${t}-${i.toSorted().join("-")||"baseline"}`,note:`Composition coverage is inferred from directly certified single-app ${t} evidence for every selected feature, relevant pair, and required high-risk interaction. The inference is restricted to the same database, auth provider, API, and HTTP profile. This exact feature subset was not run as a separate scenario.`,profiles:[t],scenarios:[...n].toSorted(),status:"certified"}}c(Ke,"jt"),p(Ke,"getOrmDatabaseInferredCompositionEvidence");function Ye(e){const{profile:t}=e;if(e.projectType==="monorepo"||e.auth!==void 0&&e.auth!=="none"||t===void 0||!t.startsWith("microservice-"))return;if(xs(t)){const h=e.extras??[],g=e.addons??[];if(h.some(b=>!vs.includes(b))||g.some(b=>!qs.includes(b))||g.includes("ultracite")&&e.formatter!=="oxlint-oxfmt")return;const v=we(t);return{addons:g,auth:"none",extras:h,formatter:g.includes("ultracite")?"oxlint-oxfmt":void 0,id:`heuristic-storage-${t}`,note:"Bounded storage inference requires a direct anchor for this database/ORM/version/API/provider and a direct anchor for this broker/storage family. This feature subset was not run independently.",profiles:[t],scenarios:(v??[t]).map(b=>`storage-${b}`),status:v?"certified":"implemented"}}const s=t.match(/^microservice-(grpc|kafka|mqtt|nats|rabbitmq|redis)(-fastify)?(-trpc)?$/u);if(!s)return;const[,r,a,i]=s;if(a||i){const h=p(I=>Q.find(be=>be.status==="certified"&&be.profiles?.includes(I)===!0&&se(be.extras,["docker"])&&be.addons.length===0),"findStructuralAnchor"),g=[h(t),...a&&i&&r!=="nats"?[h(`microservice-${r}-fastify`),h(`microservice-${r}-trpc`),h("microservice-nats-fastify-trpc")]:[]].filter(I=>I!==void 0),v=Q.find(I=>I.id===`microservice-${r}-http-full-feature-bundle`&&I.status==="certified");let b;i&&a?b="552-microservice-nats-fastify-rest-trpc-full-feature-bundle":i?b="551-microservice-nats-express-rest-trpc-full-feature-bundle":a&&(b="552-microservice-nats-fastify-rest-trpc-full-feature-bundle");const z=b?Q.find(I=>I.id===b&&I.status==="certified"):v;if(g.length===0||!v||!z)return;const L=e.extras??[],V=e.addons??[],fi=new Set([...v.extras,...v.addons]),gi=new Set([...z.extras,...z.addons]),yi=new Set([...fi].filter(I=>gi.has(I)));return[...L,...V].some(I=>!yi.has(I))||V.includes("ultracite")&&e.formatter!=="oxlint-oxfmt"?void 0:{...v,addons:V,extras:L,formatter:V.includes("ultracite")?"oxlint-oxfmt":void 0,id:`heuristic-${t}-microservice-feature-subset`,note:`Heuristic coverage for ${t}: every selected feature is present in the passing full-feature runtime bundles for the same broker and the pairwise API/provider anchor, and the exact broker/API/provider baseline passed. Broker-specific assertions remain tied to the transport bundle; this feature subset was not run independently.`,profiles:[t],scenarios:[...new Set([...g.flatMap(I=>I.scenarios),...v.scenarios,...z.scenarios])].toSorted()}}const o=Q.find(h=>h.id===`${t}-http-full-feature-bundle`&&h.status==="certified"),n=Q.find(h=>h.id===`microservice-${r}-http-full-feature-bundle`&&h.status==="certified"),l=o??n;if(!l)return;const d=e.addons??[],u=e.extras??[],m=new Set([...l.addons,...l.extras]);if(!([...d,...u].some(h=>!m.has(h))||d.includes("ultracite")&&e.formatter!=="oxlint-oxfmt"))return{...l,addons:d,extras:u,id:`inferred-${t}-http-full-feature-bundle`,note:`The ${t} full-feature runtime scenario covers this feature subset and its interactions.`}}c(Ye,"Rt"),p(Ye,"getMicroserviceInferredCompositionEvidence");function G(e,t){return e.profiles===void 0||e.profiles.length===0?!0:t.profile!==void 0&&e.profiles.includes(t.profile)}c(G,"N"),p(G,"isEvidenceScopedToProfile");function Te(e){const t=Ee(e.auth??"none",e.extras??[],e.addons??[],e.profile,e.formatter);return t?.status==="certified"&&G(t,e)?t:Ye(e)??Ke(e)??t}c(Te,"Qe"),p(Te,"resolveCompositionEvidence");function le(e){const t=Te(e);return t?.status==="certified"&&G(t,e)}c(le,"oe"),p(le,"isCompositionCertified");function Rs(e){const t=Te(e);return t?.status==="implemented"&&G(t,e)}c(Rs,"At"),p(Rs,"isCompositionImplemented");function je(e){return Te(e)}c(je,"ve"),p(je,"getCompositionEvidence");function Fo(e){return Ee(e.auth??"none",e.extras??[],e.addons??[],e.profile,e.formatter)}c(Fo,"Va"),p(Fo,"getDirectCompositionEvidence");function Xe(e){const t=Ee(e.auth??"none",e.extras??[],e.addons??[],e.profile,e.formatter,!0);return t?.status==="certified"?t:Ye(e)??Ke(e)??t}c(Xe,"_t"),p(Xe,"getProfileCompositionEvidence");function ce(e){const t=je(e);return t?.status==="implemented"&&G(t,e)}c(ce,"ne"),p(ce,"isCompositionPending");function et(e){const t=[],s=e.extras??[],r=e.addons??[],a=e.auth??"none",i=e.projectType??"single";if(r.includes("scalar-ui")&&!s.includes("swagger")&&t.push({code:"scalar-requires-swagger",kind:"invalid",message:"Scalar UI requires the Swagger extra; enable Swagger or remove Scalar UI."}),s.includes("packages/shared")&&i!=="monorepo"&&t.push({code:"shared-requires-monorepo",kind:"invalid",message:"The packages/shared extra requires a monorepo project layout."}),r.includes("ultracite")&&e.formatter==="none"&&t.push({code:"ultracite-requires-formatter",kind:"invalid",message:"The Ultracite addon requires a formatter; choose Biome or Oxlint + Oxfmt."}),t.length===0){const o=je(e);if(o)o.status!=="certified"?t.push({code:"auth-feature-composition",kind:"unverified",message:`The ${a} feature composition "${o.id}" is generated but not yet certified; pending scenarios: ${o.scenarios.join(", ")}.`}):G(o,e)||t.push({code:"auth-feature-composition",kind:"unverified",message:`The ${a} feature composition "${o.id}" was certified for a different base profile and does not cover this exact selection.`});else{const n=s.length>0?s.join(", "):"none",l=r.length>0?r.join(", "):"none";t.push({code:"auth-feature-composition",kind:"unverified",message:`Extras (${n}) and addons (${l}) combined with ${a} authentication have no certified runtime evidence yet.`})}}if(a==="none"&&e.profile!==void 0){const o=je(e);(!o||!G(o,e))&&t.push({code:"auth-feature-composition",kind:"unverified",message:`Extras (${s.join(", ")||"none"}) and addons (${r.join(", ")||"none"}) have no exact runtime evidence for profile ${e.profile}.`})}return t}c(et,"Fe"),p(et,"evaluateComposition");const R=p((e,t,s)=>({api:t,auth:"none",code:"microservice-transport",database:[],...s?{httpProvider:s}:{},microservices:[e],orm:[]}),"microserviceProfile"),de={...Z,"better-auth-drizzle":{api:["rest","trpc"],auth:"better-auth",code:"better-auth-adapter",database:["sqlite"],orm:["drizzle"]},"better-auth-drizzle-fastify":{api:["rest"],auth:"better-auth",code:"better-auth-adapter",database:["sqlite"],httpProvider:"fastify",orm:["drizzle"]},"better-auth-drizzle-fastify-trpc":{api:["rest","trpc"],auth:"better-auth",code:"better-auth-adapter",database:["sqlite"],httpProvider:"fastify",orm:["drizzle"]},"better-auth-drizzle-graphql":{api:["graphql"],auth:"better-auth",code:"better-auth-adapter",database:["postgresql"],orm:["drizzle"]},"better-auth-drizzle-graphql-fastify":{api:["graphql"],auth:"better-auth",code:"better-auth-adapter",database:["postgresql"],httpProvider:"fastify",orm:["drizzle"]},"better-auth-drizzle-graphql-mysql":{api:["graphql"],auth:"better-auth",code:"better-auth-adapter",database:["mysql"],orm:["drizzle"]},"better-auth-drizzle-graphql-mysql-fastify":{api:["graphql"],auth:"better-auth",code:"better-auth-adapter",database:["mysql"],httpProvider:"fastify",orm:["drizzle"]},"better-auth-drizzle-graphql-sqlite":{api:["graphql"],auth:"better-auth",code:"better-auth-adapter",database:["sqlite"],orm:["drizzle"]},"better-auth-drizzle-graphql-sqlite-fastify":{api:["graphql"],auth:"better-auth",code:"better-auth-adapter",database:["sqlite"],httpProvider:"fastify",orm:["drizzle"]},"better-auth-drizzle-trpc":{api:["rest","trpc"],auth:"better-auth",code:"better-auth-adapter",database:["sqlite"],orm:["drizzle"]},"better-auth-native-postgres":{api:["rest"],auth:"better-auth",code:"better-auth-adapter",database:["postgresql"],orm:[]},"better-auth-native-postgres-fastify":{api:["rest"],auth:"better-auth",code:"better-auth-adapter",database:["postgresql"],httpProvider:"fastify",orm:[]},"better-auth-native-postgres-fastify-trpc":{api:["rest","trpc"],auth:"better-auth",code:"better-auth-adapter",database:["postgresql"],httpProvider:"fastify",orm:[]},"better-auth-native-postgres-trpc":{api:["rest","trpc"],auth:"better-auth",code:"better-auth-adapter",database:["postgresql"],orm:[]},"better-auth-prisma":{api:["rest"],auth:"better-auth",code:"better-auth-adapter",database:["postgresql"],orm:["prisma"],prismaVersion:"7"},"better-auth-prisma-docker":{api:["rest"],auth:"better-auth",code:"better-auth-adapter",database:["postgresql"],orm:["prisma"],prismaVersion:"7"},"better-auth-monorepo-prisma-postgres":{api:["rest"],auth:"better-auth",code:"better-auth-adapter",database:["postgresql"],orm:["prisma"],prismaVersion:"7",projectType:"monorepo"},"better-auth-prisma-mongo":{api:["rest"],auth:"better-auth",code:"better-auth-adapter",database:["mongodb"],orm:["prisma"],prismaVersion:"6"},"better-auth-prisma-mysql":{api:["rest"],auth:"better-auth",code:"better-auth-adapter",database:["mysql"],orm:["prisma"],prismaVersion:"7"},"better-auth-prisma-mysql-fastify":{api:["rest"],auth:"better-auth",code:"better-auth-adapter",database:["mysql"],httpProvider:"fastify",orm:["prisma"],prismaVersion:"7"},"better-auth-prisma-sqlite":{api:["rest"],auth:"better-auth",code:"better-auth-adapter",database:["sqlite"],orm:["prisma"],prismaVersion:"7"},"better-auth-prisma-sqlite-fastify":{api:["rest"],auth:"better-auth",code:"better-auth-adapter",database:["sqlite"],httpProvider:"fastify",orm:["prisma"],prismaVersion:"7"},"better-auth-prisma-mysql-trpc":{api:["rest","trpc"],auth:"better-auth",code:"better-auth-adapter",database:["mysql"],orm:["prisma"],prismaVersion:"7"},"better-auth-prisma-mysql-fastify-trpc":{api:["rest","trpc"],auth:"better-auth",code:"better-auth-adapter",database:["mysql"],httpProvider:"fastify",orm:["prisma"],prismaVersion:"7"},"better-auth-prisma-sqlite-trpc":{api:["rest","trpc"],auth:"better-auth",code:"better-auth-adapter",database:["sqlite"],orm:["prisma"],prismaVersion:"7"},"better-auth-prisma-sqlite-fastify-trpc":{api:["rest","trpc"],auth:"better-auth",code:"better-auth-adapter",database:["sqlite"],httpProvider:"fastify",orm:["prisma"],prismaVersion:"7"},"better-auth-prisma-mongo-fastify":{api:["rest"],auth:"better-auth",code:"better-auth-adapter",database:["mongodb"],httpProvider:"fastify",orm:["prisma"],prismaVersion:"6"},"better-auth-prisma-mongo-fastify-trpc":{api:["rest","trpc"],auth:"better-auth",code:"better-auth-adapter",database:["mongodb"],httpProvider:"fastify",orm:["prisma"],prismaVersion:"6"},"better-auth-prisma-mongo-trpc":{api:["rest","trpc"],auth:"better-auth",code:"better-auth-adapter",database:["mongodb"],orm:["prisma"],prismaVersion:"6"},"better-auth-prisma-fastify":{api:["rest"],auth:"better-auth",code:"better-auth-adapter",database:["postgresql"],httpProvider:"fastify",orm:["prisma"],prismaVersion:"7"},"better-auth-prisma-fastify-trpc":{api:["rest","trpc"],auth:"better-auth",code:"better-auth-adapter",database:["postgresql"],httpProvider:"fastify",orm:["prisma"],prismaVersion:"7"},"better-auth-prisma-trpc":{api:["rest","trpc"],auth:"better-auth",code:"better-auth-adapter",database:["postgresql"],orm:["prisma"],prismaVersion:"7"},"better-auth-stateless":{api:["rest"],auth:"better-auth:stateless",code:"better-auth-stateless",database:[],orm:[]},"better-auth-stateless-fastify":{api:["rest"],auth:"better-auth:stateless",code:"better-auth-stateless",database:[],httpProvider:"fastify",orm:[]},"better-auth-stateless-trpc":{api:["rest","trpc"],auth:"better-auth:stateless",code:"better-auth-stateless",database:[],orm:[]},"better-auth-stateless-fastify-trpc":{api:["rest","trpc"],auth:"better-auth:stateless",code:"better-auth-stateless",database:[],httpProvider:"fastify",orm:[]},"better-auth-stateless-drizzle":{api:["rest"],auth:"better-auth:stateless",code:"better-auth-stateless",database:["postgresql"],orm:["drizzle"]},"better-auth-stateless-typeorm":{api:["rest"],auth:"better-auth:stateless",code:"better-auth-stateless",database:["postgresql"],orm:["typeorm"]},"better-auth-prisma-graphql":{api:["graphql"],auth:"better-auth",code:"better-auth-adapter",database:["postgresql"],orm:["prisma"],prismaVersion:"7"},"graphql-prisma":{api:["graphql"],auth:"none",code:"graphql",database:["postgresql"],orm:["prisma"],prismaVersion:"7"},prisma:{api:["rest"],auth:"none",code:"prisma",database:["postgresql"],orm:["prisma"],prismaVersion:"7"},"prisma-fastify":{api:["rest"],auth:"none",code:"prisma",database:["postgresql"],httpProvider:"fastify",orm:["prisma"],prismaVersion:"7"},"prisma-mysql-fastify":{api:["rest"],auth:"none",code:"prisma",database:["mysql"],httpProvider:"fastify",orm:["prisma"],prismaVersion:"7"},"prisma-sqlite-fastify":{api:["rest"],auth:"none",code:"prisma",database:["sqlite"],httpProvider:"fastify",orm:["prisma"],prismaVersion:"7"},"prisma-sqlserver":{api:["rest"],auth:"none",code:"prisma",database:["sqlserver"],orm:["prisma"],prismaVersion:"7"},"prisma-sqlserver-fastify":{api:["rest"],auth:"none",code:"prisma",database:["sqlserver"],httpProvider:"fastify",orm:["prisma"],prismaVersion:"7"},"better-auth-prisma-sqlserver":{api:["rest"],auth:"better-auth",code:"better-auth-adapter",database:["sqlserver"],httpProvider:"express",orm:["prisma"],prismaVersion:"7"},"better-auth-prisma-sqlserver-fastify":{api:["rest"],auth:"better-auth",code:"better-auth-adapter",database:["sqlserver"],httpProvider:"fastify",orm:["prisma"],prismaVersion:"7"},"passport-prisma-sqlserver":{api:["rest"],auth:"passport",code:"passport",database:["sqlserver"],httpProvider:"express",orm:["prisma"],prismaVersion:"7"},"passport-prisma-sqlserver-fastify":{api:["rest"],auth:"passport",code:"passport",database:["sqlserver"],httpProvider:"fastify",orm:["prisma"],prismaVersion:"7"},"passport-typeorm-sqlserver":{api:["rest"],auth:"passport",code:"passport",database:["sqlserver"],httpProvider:"express",orm:["typeorm"]},"passport-typeorm-sqlserver-fastify":{api:["rest"],auth:"passport",code:"passport",database:["sqlserver"],httpProvider:"fastify",orm:["typeorm"]},"passport-drizzle-sqlserver":{api:["rest"],auth:"passport",code:"passport",database:["sqlserver"],httpProvider:"express",orm:["drizzle"]},"passport-drizzle-sqlserver-fastify":{api:["rest"],auth:"passport",code:"passport",database:["sqlserver"],httpProvider:"fastify",orm:["drizzle"]},"typeorm-postgresql-express":{api:["rest"],auth:"none",code:"typeorm-postgresql",database:["postgresql"],httpProvider:"express",orm:["typeorm"]},"typeorm-postgresql-fastify":{api:["rest"],auth:"none",code:"typeorm-postgresql",database:["postgresql"],httpProvider:"fastify",orm:["typeorm"]},"typeorm-mysql-express":{api:["rest"],auth:"none",code:"typeorm-mysql",database:["mysql"],httpProvider:"express",orm:["typeorm"]},"typeorm-mysql-fastify":{api:["rest"],auth:"none",code:"typeorm-mysql",database:["mysql"],httpProvider:"fastify",orm:["typeorm"]},"typeorm-sqlite-express":{api:["rest"],auth:"none",code:"typeorm-sqlite",database:["sqlite"],httpProvider:"express",orm:["typeorm"]},"typeorm-sqlite-fastify":{api:["rest"],auth:"none",code:"typeorm-sqlite",database:["sqlite"],httpProvider:"fastify",orm:["typeorm"]},"typeorm-sqlserver-express":{api:["rest"],auth:"none",code:"typeorm-sqlserver",database:["sqlserver"],httpProvider:"express",orm:["typeorm"]},"drizzle-postgresql-express":{api:["rest"],auth:"none",code:"drizzle-postgresql",database:["postgresql"],httpProvider:"express",orm:["drizzle"]},"drizzle-postgresql-fastify":{api:["rest"],auth:"none",code:"drizzle-postgresql",database:["postgresql"],httpProvider:"fastify",orm:["drizzle"]},"drizzle-mysql-express":{api:["rest"],auth:"none",code:"drizzle-mysql",database:["mysql"],httpProvider:"express",orm:["drizzle"]},"drizzle-mysql-fastify":{api:["rest"],auth:"none",code:"drizzle-mysql",database:["mysql"],httpProvider:"fastify",orm:["drizzle"]},"drizzle-sqlite-express":{api:["rest"],auth:"none",code:"drizzle-sqlite",database:["sqlite"],httpProvider:"express",orm:["drizzle"]},"drizzle-sqlite-fastify":{api:["rest"],auth:"none",code:"drizzle-sqlite",database:["sqlite"],httpProvider:"fastify",orm:["drizzle"]},"drizzle-sqlserver-express":{api:["rest"],auth:"none",code:"drizzle-sqlserver",database:["sqlserver"],httpProvider:"express",orm:["drizzle"]},"prisma-trpc":{api:["rest","trpc"],auth:"none",code:"prisma",database:["postgresql"],orm:["prisma"],prismaVersion:"7"},"prisma-fastify-trpc":{api:["rest","trpc"],auth:"none",code:"prisma",database:["postgresql"],httpProvider:"fastify",orm:["prisma"],prismaVersion:"7"},"graphql-drizzle":{api:["graphql"],auth:"none",code:"graphql",database:["postgresql"],orm:["drizzle"]},"graphql-drizzle-fastify":{api:["graphql"],auth:"none",code:"graphql",database:["postgresql"],httpProvider:"fastify",orm:["drizzle"]},"graphql-drizzle-mysql":{api:["graphql"],auth:"none",code:"graphql",database:["mysql"],orm:["drizzle"]},"graphql-drizzle-mysql-fastify":{api:["graphql"],auth:"none",code:"graphql",database:["mysql"],httpProvider:"fastify",orm:["drizzle"]},"graphql-drizzle-sqlite":{api:["graphql"],auth:"none",code:"graphql",database:["sqlite"],orm:["drizzle"]},"graphql-drizzle-sqlite-fastify":{api:["graphql"],auth:"none",code:"graphql",database:["sqlite"],httpProvider:"fastify",orm:["drizzle"]},"microservice-grpc":{api:["rest"],auth:"none",code:"microservice-transport",database:[],microservices:["grpc"],orm:[]},"microservice-grpc-fastify":R("grpc",["rest"],"fastify"),"microservice-grpc-trpc":R("grpc",["rest","trpc"]),"microservice-grpc-fastify-trpc":R("grpc",["rest","trpc"],"fastify"),"microservice-kafka":{api:["rest"],auth:"none",code:"microservice-transport",database:[],microservices:["kafka"],orm:[]},"microservice-mqtt":{api:["rest"],auth:"none",code:"microservice-transport",database:[],microservices:["mqtt"],orm:[]},"microservice-nats":{api:["rest"],auth:"none",code:"microservice-transport",database:[],microservices:["nats"],orm:[]},"microservice-rabbitmq":{api:["rest"],auth:"none",code:"microservice-transport",database:[],microservices:["rabbitmq"],orm:[]},"microservice-redis":{api:["rest"],auth:"none",code:"microservice-transport",database:[],microservices:["redis"],orm:[]},"microservice-kafka-fastify":R("kafka",["rest"],"fastify"),"microservice-kafka-trpc":R("kafka",["rest","trpc"]),"microservice-kafka-fastify-trpc":R("kafka",["rest","trpc"],"fastify"),"microservice-mqtt-fastify":R("mqtt",["rest"],"fastify"),"microservice-mqtt-trpc":R("mqtt",["rest","trpc"]),"microservice-mqtt-fastify-trpc":R("mqtt",["rest","trpc"],"fastify"),"microservice-nats-fastify":R("nats",["rest"],"fastify"),"microservice-nats-trpc":R("nats",["rest","trpc"]),"microservice-nats-fastify-trpc":R("nats",["rest","trpc"],"fastify"),"microservice-rabbitmq-fastify":R("rabbitmq",["rest"],"fastify"),"microservice-rabbitmq-trpc":R("rabbitmq",["rest","trpc"]),"microservice-rabbitmq-fastify-trpc":R("rabbitmq",["rest","trpc"],"fastify"),"microservice-redis-fastify":R("redis",["rest"],"fastify"),"microservice-redis-trpc":R("redis",["rest","trpc"]),"microservice-redis-fastify-trpc":R("redis",["rest","trpc"],"fastify"),"mongodb-native":{api:["rest"],auth:"none",code:"mongodb",database:["mongodb"],orm:[]},"passport-external-identity":{api:["rest"],auth:"passport",code:"passport",database:[],orm:[]},"passport-prisma":{api:["rest"],auth:"passport",code:"passport",database:["postgresql"],orm:["prisma"],prismaVersion:"7"},"passport-prisma-docker":{api:["rest"],auth:"passport",code:"passport",database:["postgresql"],orm:["prisma"],prismaVersion:"7"},"passport-prisma-mongo":{api:["rest"],auth:"passport",code:"passport",database:["mongodb"],orm:["prisma"],prismaVersion:"6"},"passport-prisma-mysql":{api:["rest"],auth:"passport",code:"passport",database:["mysql"],orm:["prisma"],prismaVersion:"7"},"passport-prisma-mysql-fastify":{api:["rest"],auth:"passport",code:"passport",database:["mysql"],httpProvider:"fastify",orm:["prisma"],prismaVersion:"7"},"passport-prisma-sqlite":{api:["rest"],auth:"passport",code:"passport",database:["sqlite"],orm:["prisma"],prismaVersion:"7"},"passport-prisma-sqlite-fastify":{api:["rest"],auth:"passport",code:"passport",database:["sqlite"],httpProvider:"fastify",orm:["prisma"],prismaVersion:"7"},"passport-prisma-mysql-trpc":{api:["rest","trpc"],auth:"passport",code:"passport",database:["mysql"],orm:["prisma"],prismaVersion:"7"},"passport-prisma-mysql-fastify-trpc":{api:["rest","trpc"],auth:"passport",code:"passport",database:["mysql"],httpProvider:"fastify",orm:["prisma"],prismaVersion:"7"},"passport-prisma-sqlite-trpc":{api:["rest","trpc"],auth:"passport",code:"passport",database:["sqlite"],orm:["prisma"],prismaVersion:"7"},"passport-prisma-sqlite-fastify-trpc":{api:["rest","trpc"],auth:"passport",code:"passport",database:["sqlite"],httpProvider:"fastify",orm:["prisma"],prismaVersion:"7"},"passport-prisma-mongo-fastify":{api:["rest"],auth:"passport",code:"passport",database:["mongodb"],httpProvider:"fastify",orm:["prisma"],prismaVersion:"6"},"passport-prisma-mongo-fastify-trpc":{api:["rest","trpc"],auth:"passport",code:"passport",database:["mongodb"],httpProvider:"fastify",orm:["prisma"],prismaVersion:"6"},"passport-prisma-mongo-trpc":{api:["rest","trpc"],auth:"passport",code:"passport",database:["mongodb"],orm:["prisma"],prismaVersion:"6"},"passport-prisma-fastify":{api:["rest"],auth:"passport",code:"passport",database:["postgresql"],httpProvider:"fastify",orm:["prisma"],prismaVersion:"7"},"passport-prisma-fastify-trpc":{api:["rest","trpc"],auth:"passport",code:"passport",database:["postgresql"],httpProvider:"fastify",orm:["prisma"],prismaVersion:"7"},"passport-prisma-graphql":{api:["graphql"],auth:"passport",code:"passport",database:["postgresql"],orm:["prisma"],prismaVersion:"7"},"passport-prisma-trpc":{api:["rest","trpc"],auth:"passport",code:"passport",database:["postgresql"],orm:["prisma"],prismaVersion:"7"},"prisma8-postgres":{api:["rest"],auth:"none",code:"prisma-8",database:["postgresql"],orm:["prisma"],prismaVersion:"8"},"better-auth-typeorm-postgres":{api:["rest"],auth:"better-auth",code:"better-auth-adapter",database:["postgresql"],orm:["typeorm"]},"better-auth-typeorm-postgres-fastify":{api:["rest"],auth:"better-auth",code:"better-auth-adapter",database:["postgresql"],httpProvider:"fastify",orm:["typeorm"]},"better-auth-typeorm-postgres-trpc":{api:["rest","trpc"],auth:"better-auth",code:"better-auth-adapter",database:["postgresql"],orm:["typeorm"]},"better-auth-typeorm-postgres-fastify-trpc":{api:["rest","trpc"],auth:"better-auth",code:"better-auth-adapter",database:["postgresql"],httpProvider:"fastify",orm:["typeorm"]},"better-auth-typeorm-mysql":{api:["rest"],auth:"better-auth",code:"better-auth-adapter",database:["mysql"],orm:["typeorm"]},"better-auth-typeorm-mysql-fastify":{api:["rest"],auth:"better-auth",code:"better-auth-adapter",database:["mysql"],httpProvider:"fastify",orm:["typeorm"]},"better-auth-typeorm-mysql-trpc":{api:["rest","trpc"],auth:"better-auth",code:"better-auth-adapter",database:["mysql"],orm:["typeorm"]},"better-auth-typeorm-mysql-fastify-trpc":{api:["rest","trpc"],auth:"better-auth",code:"better-auth-adapter",database:["mysql"],httpProvider:"fastify",orm:["typeorm"]},"better-auth-typeorm-sqlite":{api:["rest"],auth:"better-auth",code:"better-auth-adapter",database:["sqlite"],orm:["typeorm"]},"better-auth-typeorm-sqlite-fastify":{api:["rest"],auth:"better-auth",code:"better-auth-adapter",database:["sqlite"],httpProvider:"fastify",orm:["typeorm"]},"better-auth-typeorm-sqlite-trpc":{api:["rest","trpc"],auth:"better-auth",code:"better-auth-adapter",database:["sqlite"],orm:["typeorm"]},"better-auth-typeorm-sqlite-fastify-trpc":{api:["rest","trpc"],auth:"better-auth",code:"better-auth-adapter",database:["sqlite"],httpProvider:"fastify",orm:["typeorm"]},"passport-typeorm-postgres":{api:["rest"],auth:"passport",code:"passport",database:["postgresql"],orm:["typeorm"]},"passport-typeorm-postgres-fastify":{api:["rest"],auth:"passport",code:"passport",database:["postgresql"],httpProvider:"fastify",orm:["typeorm"]},"passport-typeorm-postgres-trpc":{api:["rest","trpc"],auth:"passport",code:"passport",database:["postgresql"],orm:["typeorm"]},"passport-typeorm-postgres-fastify-trpc":{api:["rest","trpc"],auth:"passport",code:"passport",database:["postgresql"],httpProvider:"fastify",orm:["typeorm"]},"passport-typeorm-mysql":{api:["rest"],auth:"passport",code:"passport",database:["mysql"],orm:["typeorm"]},"passport-typeorm-mysql-fastify":{api:["rest"],auth:"passport",code:"passport",database:["mysql"],httpProvider:"fastify",orm:["typeorm"]},"passport-typeorm-mysql-trpc":{api:["rest","trpc"],auth:"passport",code:"passport",database:["mysql"],orm:["typeorm"]},"passport-typeorm-mysql-fastify-trpc":{api:["rest","trpc"],auth:"passport",code:"passport",database:["mysql"],httpProvider:"fastify",orm:["typeorm"]},"passport-typeorm-sqlite":{api:["rest"],auth:"passport",code:"passport",database:["sqlite"],orm:["typeorm"]},"passport-typeorm-sqlite-fastify":{api:["rest"],auth:"passport",code:"passport",database:["sqlite"],httpProvider:"fastify",orm:["typeorm"]},"passport-typeorm-sqlite-trpc":{api:["rest","trpc"],auth:"passport",code:"passport",database:["sqlite"],orm:["typeorm"]},"passport-typeorm-sqlite-fastify-trpc":{api:["rest","trpc"],auth:"passport",code:"passport",database:["sqlite"],httpProvider:"fastify",orm:["typeorm"]},"better-auth-drizzle-postgres":{api:["rest"],auth:"better-auth",code:"better-auth-adapter",database:["postgresql"],orm:["drizzle"]},"better-auth-drizzle-postgres-fastify":{api:["rest"],auth:"better-auth",code:"better-auth-adapter",database:["postgresql"],httpProvider:"fastify",orm:["drizzle"]},"better-auth-drizzle-postgres-trpc":{api:["rest","trpc"],auth:"better-auth",code:"better-auth-adapter",database:["postgresql"],orm:["drizzle"]},"better-auth-drizzle-postgres-fastify-trpc":{api:["rest","trpc"],auth:"better-auth",code:"better-auth-adapter",database:["postgresql"],httpProvider:"fastify",orm:["drizzle"]},"better-auth-drizzle-mysql":{api:["rest"],auth:"better-auth",code:"better-auth-adapter",database:["mysql"],orm:["drizzle"]},"better-auth-drizzle-mysql-fastify":{api:["rest"],auth:"better-auth",code:"better-auth-adapter",database:["mysql"],httpProvider:"fastify",orm:["drizzle"]},"better-auth-drizzle-mysql-trpc":{api:["rest","trpc"],auth:"better-auth",code:"better-auth-adapter",database:["mysql"],orm:["drizzle"]},"better-auth-drizzle-mysql-fastify-trpc":{api:["rest","trpc"],auth:"better-auth",code:"better-auth-adapter",database:["mysql"],httpProvider:"fastify",orm:["drizzle"]},"passport-drizzle-postgres":{api:["rest"],auth:"passport",code:"passport",database:["postgresql"],orm:["drizzle"]},"passport-drizzle-graphql":{api:["graphql"],auth:"passport",code:"passport",database:["postgresql"],orm:["drizzle"]},"passport-drizzle-graphql-fastify":{api:["graphql"],auth:"passport",code:"passport",database:["postgresql"],httpProvider:"fastify",orm:["drizzle"]},"passport-drizzle-graphql-mysql":{api:["graphql"],auth:"passport",code:"passport",database:["mysql"],orm:["drizzle"]},"passport-drizzle-graphql-mysql-fastify":{api:["graphql"],auth:"passport",code:"passport",database:["mysql"],httpProvider:"fastify",orm:["drizzle"]},"passport-drizzle-graphql-sqlite":{api:["graphql"],auth:"passport",code:"passport",database:["sqlite"],orm:["drizzle"]},"passport-drizzle-graphql-sqlite-fastify":{api:["graphql"],auth:"passport",code:"passport",database:["sqlite"],httpProvider:"fastify",orm:["drizzle"]},"passport-drizzle-postgres-fastify":{api:["rest"],auth:"passport",code:"passport",database:["postgresql"],httpProvider:"fastify",orm:["drizzle"]},"passport-drizzle-postgres-trpc":{api:["rest","trpc"],auth:"passport",code:"passport",database:["postgresql"],orm:["drizzle"]},"passport-drizzle-postgres-fastify-trpc":{api:["rest","trpc"],auth:"passport",code:"passport",database:["postgresql"],httpProvider:"fastify",orm:["drizzle"]},"passport-drizzle-mysql":{api:["rest"],auth:"passport",code:"passport",database:["mysql"],orm:["drizzle"]},"passport-drizzle-mysql-fastify":{api:["rest"],auth:"passport",code:"passport",database:["mysql"],httpProvider:"fastify",orm:["drizzle"]},"passport-drizzle-mysql-trpc":{api:["rest","trpc"],auth:"passport",code:"passport",database:["mysql"],orm:["drizzle"]},"passport-drizzle-mysql-fastify-trpc":{api:["rest","trpc"],auth:"passport",code:"passport",database:["mysql"],httpProvider:"fastify",orm:["drizzle"]},"passport-drizzle-sqlite":{api:["rest"],auth:"passport",code:"passport",database:["sqlite"],orm:["drizzle"]},"passport-drizzle-sqlite-fastify":{api:["rest"],auth:"passport",code:"passport",database:["sqlite"],httpProvider:"fastify",orm:["drizzle"]},"passport-drizzle-sqlite-trpc":{api:["rest","trpc"],auth:"passport",code:"passport",database:["sqlite"],orm:["drizzle"]},"passport-drizzle-sqlite-fastify-trpc":{api:["rest","trpc"],auth:"passport",code:"passport",database:["sqlite"],httpProvider:"fastify",orm:["drizzle"]}};function tt(e,t){const s=de[t],r=e.projectType??"single",a=e.architecture??"nest-api",i=e.httpProvider??"express",o=e.microservices??[];return r===("projectType"in s?s.projectType:"single")&&a===("microservices"in s?"nest-microservice":"nest-api")&&i===("httpProvider"in s?s.httpProvider:"express")&&JSON.stringify(o)===JSON.stringify("microservices"in s?s.microservices:[])&&e.auth===s.auth&&JSON.stringify(e.api.toSorted())===JSON.stringify(s.api.toSorted())&&JSON.stringify(e.database)===JSON.stringify(s.database)&&JSON.stringify(e.orm)===JSON.stringify(s.orm)&&e.prismaVersion===("prismaVersion"in s?s.prismaVersion:void 0)}c(tt,"Me"),p(tt,"matchesProfileShape");function As(e,t){const s=[...e.addons??[],t],r=e.extras??[],{auth:a}=e,i=new Set(Object.keys(de).filter(o=>tt(e,o)));return i.size===0?!1:[...i].some(o=>le({addons:s,auth:a,extras:r,formatter:e.formatter,profile:o,projectType:e.projectType}))?!0:Q.some(o=>o.status==="certified"&&(o.auth==="any"||o.auth===a)&&r.every(n=>o.extras.includes(n))&&s.every(n=>o.addons.includes(n))&&(o.formatter===void 0||e.formatter===o.formatter)&&(e.projectType!=="monorepo"&&(o.profiles===void 0||o.profiles.length===0)||o.profiles!==void 0&&o.profiles.some(n=>i.has(n))))}c(As,"Ja"),p(As,"isAddonInCertifiedComposition");function Re(e,t,s={}){const r=de[t],a=e.extras??[],i=e.addons??[];if(i.includes("nestjs-zod")&&(!t.includes("prisma")&&!t.includes("typeorm")&&!t.includes("drizzle")&&t!=="mongodb-native"&&!t.startsWith("microservice-mongodb-native-")||t.startsWith("better-auth")&&t!=="better-auth-prisma"||t.startsWith("passport")&&!["passport-prisma","passport-prisma-fastify","passport-prisma-trpc","passport-prisma-fastify-trpc","passport-prisma-mongo","passport-prisma-mysql","passport-prisma-mysql-fastify","passport-prisma-sqlite","passport-prisma-sqlite-fastify","passport-prisma-mysql-trpc","passport-prisma-mysql-fastify-trpc","passport-prisma-sqlite-trpc","passport-prisma-sqlite-fastify-trpc","passport-prisma-sqlserver","passport-prisma-sqlserver-fastify","passport-typeorm-postgres","passport-typeorm-postgres-fastify","passport-typeorm-mysql","passport-typeorm-mysql-fastify","passport-typeorm-sqlite","passport-typeorm-sqlite-fastify","passport-typeorm-sqlserver","passport-typeorm-sqlserver-fastify","passport-drizzle-postgres","passport-drizzle-postgres-fastify","passport-drizzle-mysql","passport-drizzle-mysql-fastify","passport-drizzle-sqlite","passport-drizzle-sqlite-fastify","passport-drizzle-sqlserver","passport-drizzle-sqlserver-fastify","passport-prisma-sqlserver","passport-prisma-sqlserver-fastify"].includes(t)))return!1;const o=new Set(["agent-skills","husky","nestjs-zod","scalar-ui","ultracite"]);if(i.some(b=>!o.has(b))||et({addons:i,auth:e.auth,extras:a,profile:t,projectType:e.projectType}).some(({kind:b})=>b==="invalid"))return!1;const n={addons:i,auth:e.auth,extras:a,formatter:e.formatter,profile:t},l=e.auth==="none"&&s.pendingComposition===!0&&ce(n);if(!(s.certificationCandidate===!0||le(n)||l))return!1;const d=Xe({addons:i,auth:e.auth,extras:a,formatter:e.formatter,profile:t}),u=Xe({addons:i,auth:e.auth,extras:a,formatter:e.formatter,profile:t}),m=e.projectType===("projectType"in r?r.projectType:"single")&&e.architecture===("microservices"in r?"nest-microservice":"nest-api")&&e.httpProvider===("httpProvider"in r?r.httpProvider:"express")&&JSON.stringify(e.microservices)===JSON.stringify("microservices"in r?r.microservices:[])&&e.auth===r.auth&&JSON.stringify(e.api)===JSON.stringify(r.api)&&JSON.stringify(e.database)===JSON.stringify(r.database)&&JSON.stringify(e.orm)===JSON.stringify(r.orm)&&e.prismaVersion===("prismaVersion"in r?r.prismaVersion:void 0),h=s.certificationCandidate===!0,g=e.auth!=="none"||h||(i.length===0||!i.includes("ultracite")||e.architecture!=="nest-microservice"||(u?.status==="certified"||s.pendingComposition===!0&&u?.status==="implemented")&&G(u,{auth:e.auth,profile:t}))&&(a.length===0||l||d?.status==="certified"&&G(d,{auth:e.auth,profile:t})),v=e.auth!=="none"||h||i.length===0||e.formatter==="none"||e.architecture!=="nest-microservice"||(u?.status==="certified"||s.pendingComposition===!0&&u?.status==="implemented")&&G(u,{auth:e.auth,profile:t});return m&&g&&v}c(Re,"qe"),p(Re,"matchesCandidate");const $s=[..._i,"typeorm-postgresql-express","typeorm-postgresql-fastify","drizzle-postgresql-fastify","drizzle-mysql-fastify","drizzle-sqlite-fastify","typeorm-mysql-express","typeorm-mysql-fastify","typeorm-sqlite-express","typeorm-sqlite-fastify","drizzle-postgresql-express","drizzle-mysql-express","drizzle-sqlite-express","passport-external-identity","prisma","prisma-fastify","prisma-fastify-trpc","prisma-mysql-fastify","prisma-sqlite-fastify","prisma-sqlserver","prisma-sqlserver-fastify","typeorm-sqlserver-express","drizzle-sqlserver-express","better-auth-prisma-sqlserver","better-auth-prisma-sqlserver-fastify","passport-prisma-sqlserver","passport-prisma-sqlserver-fastify","better-auth-prisma-mysql","better-auth-prisma-mysql-fastify","better-auth-prisma-sqlite","better-auth-prisma-sqlite-fastify","passport-prisma-mysql","passport-prisma-mysql-fastify","passport-prisma-sqlite","passport-prisma-sqlite-fastify","better-auth-prisma-mysql-trpc","better-auth-prisma-mysql-fastify-trpc","better-auth-prisma-sqlite-trpc","better-auth-prisma-sqlite-fastify-trpc","passport-prisma-mysql-trpc","passport-prisma-mysql-fastify-trpc","passport-prisma-sqlite-trpc","passport-prisma-sqlite-fastify-trpc","passport-typeorm-sqlserver","passport-typeorm-sqlserver-fastify","passport-drizzle-sqlserver","passport-drizzle-sqlserver-fastify","better-auth-monorepo-prisma-postgres","better-auth-prisma","better-auth-prisma-docker","better-auth-prisma-mongo","better-auth-prisma-fastify","better-auth-prisma-mongo-fastify","better-auth-prisma-trpc","better-auth-prisma-mongo-trpc","better-auth-prisma-fastify-trpc","better-auth-prisma-mongo-fastify-trpc","better-auth-native-postgres","better-auth-native-postgres-fastify","better-auth-native-postgres-trpc","better-auth-native-postgres-fastify-trpc","better-auth-drizzle","better-auth-drizzle-fastify","better-auth-drizzle-fastify-trpc","better-auth-drizzle-graphql","better-auth-drizzle-graphql-fastify","better-auth-drizzle-graphql-mysql","better-auth-drizzle-graphql-mysql-fastify","better-auth-drizzle-graphql-sqlite","better-auth-drizzle-graphql-sqlite-fastify","better-auth-drizzle-trpc","graphql-prisma","passport-prisma","passport-prisma-docker","passport-prisma-mongo","passport-prisma-fastify","passport-prisma-mongo-fastify","passport-prisma-trpc","passport-prisma-mongo-trpc","passport-prisma-fastify-trpc","passport-prisma-mongo-fastify-trpc","prisma-trpc","mongodb-native","prisma8-postgres","better-auth-stateless","better-auth-stateless-fastify","better-auth-stateless-trpc","better-auth-stateless-fastify-trpc","better-auth-stateless-drizzle","better-auth-stateless-typeorm","microservice-grpc","microservice-redis","microservice-kafka","microservice-mqtt","microservice-nats","microservice-rabbitmq","microservice-grpc-fastify","microservice-grpc-trpc","microservice-grpc-fastify-trpc","microservice-kafka-fastify","microservice-kafka-trpc","microservice-kafka-fastify-trpc","microservice-mqtt-fastify","microservice-mqtt-trpc","microservice-mqtt-fastify-trpc","microservice-nats-fastify","microservice-nats-trpc","microservice-nats-fastify-trpc","microservice-rabbitmq-fastify","microservice-rabbitmq-trpc","microservice-rabbitmq-fastify-trpc","microservice-redis-fastify","microservice-redis-trpc","microservice-redis-fastify-trpc","better-auth-drizzle-postgres","better-auth-drizzle-mysql","passport-typeorm-postgres","passport-drizzle-postgres","passport-drizzle-graphql","passport-drizzle-graphql-fastify","passport-drizzle-graphql-mysql","passport-drizzle-graphql-mysql-fastify","passport-drizzle-graphql-sqlite","passport-drizzle-graphql-sqlite-fastify","passport-drizzle-sqlite","better-auth-typeorm-postgres","better-auth-typeorm-postgres-fastify","better-auth-typeorm-postgres-trpc","better-auth-typeorm-postgres-fastify-trpc","better-auth-typeorm-mysql","better-auth-typeorm-mysql-fastify","better-auth-typeorm-mysql-trpc","better-auth-typeorm-mysql-fastify-trpc","better-auth-typeorm-sqlite","better-auth-typeorm-sqlite-fastify","better-auth-typeorm-sqlite-trpc","better-auth-typeorm-sqlite-fastify-trpc","passport-typeorm-postgres-fastify","passport-typeorm-postgres-trpc","passport-typeorm-postgres-fastify-trpc","passport-typeorm-mysql","passport-typeorm-mysql-fastify","passport-typeorm-mysql-trpc","passport-typeorm-mysql-fastify-trpc","passport-typeorm-sqlite","passport-typeorm-sqlite-fastify","passport-typeorm-sqlite-trpc","passport-typeorm-sqlite-fastify-trpc","better-auth-drizzle-postgres-fastify","better-auth-drizzle-postgres-trpc","better-auth-drizzle-postgres-fastify-trpc","better-auth-drizzle-mysql-fastify","better-auth-drizzle-mysql-trpc","better-auth-drizzle-mysql-fastify-trpc","passport-drizzle-postgres-fastify","passport-drizzle-postgres-trpc","passport-drizzle-postgres-fastify-trpc","passport-drizzle-mysql","passport-drizzle-mysql-fastify","passport-drizzle-mysql-trpc","passport-drizzle-mysql-fastify-trpc","passport-drizzle-sqlite-fastify","passport-drizzle-sqlite-trpc","passport-drizzle-sqlite-fastify-trpc","better-auth-prisma-graphql","passport-prisma-graphql","graphql-drizzle","graphql-drizzle-fastify","graphql-drizzle-mysql","graphql-drizzle-mysql-fastify","graphql-drizzle-sqlite","graphql-drizzle-sqlite-fastify"];function st(e,t){const s=de[e],r=s.api,a=s.database,i=s.orm,o="prismaVersion"in s?s.prismaVersion:void 0;return s.code===t||t==="prisma-8"&&o==="8"||t==="sqlserver-orm-auth"&&s.auth!=="none"&&a.includes("sqlserver")&&(i.includes("prisma")||i.includes("typeorm")||s.auth==="passport"&&i.includes("drizzle"))||t==="graphql"&&r.includes("graphql")||t==="mongodb"&&s.database.some(n=>n==="mongodb")}c(st,"$t"),p(st,"profileClearsCode");function rt(e,t={}){const s=[];e.architecture==="nest-microservice"&&e.database.length===1&&e.orm.length<=1&&!ne.some(d=>d.database===e.database[0]&&d.orm===e.orm[0]&&(!("prismaVersion"in d)||d.prismaVersion===e.prismaVersion))&&s.push({code:"microservice-storage-adapter",kind:"invalid",message:"Select a compatible microservice database/ORM/version combination. MongoDB supports native access, Prisma 6, or TypeORM; SQL databases require a configured ORM."}),(e.database.length>1||e.orm.length>1)&&s.push({code:"multiple-database-adapters",kind:"unverified",message:"Select at most one database and one ORM; multiple adapter ownership is not implemented yet."}),e.orm.length>0&&e.database.length===0&&s.push({code:"orm-requires-database",kind:"invalid",message:"Select a database before selecting an ORM."}),e.microservices.length>0&&e.architecture!=="nest-microservice"&&s.push({code:"microservice-transport",kind:"invalid",message:"Transport protocols require the Nest microservice architecture; select that architecture or remove the transport selection."}),e.microservices.length>0&&e.auth!=="none"&&s.push({code:"microservice-feature-combination",kind:"unverified",message:"Transport combinations with authentication require separate runtime certification."}),e.orm.includes("prisma")&&e.database.length>0&&!e.prismaVersion&&s.push({code:"prisma-version-required",kind:"invalid",message:"Select Prisma 7 explicitly; implicit Prisma 8 generation is not supported."}),e.database.includes("sqlserver")&&(e.orm.includes("typeorm")||e.orm.includes("drizzle"))&&e.auth!=="none"&&s.push({code:"sqlserver-orm-auth",kind:"unverified",message:"TypeORM and Drizzle with SQL Server are currently limited to unauthenticated REST projects until their auth adapters are runtime-certified."}),e.auth==="better-auth"&&(e.database.length===0?s.push({code:"better-auth-requires-database",kind:"invalid",message:"Database-backed Better Auth requires a database."}):e.orm.includes("prisma")&&e.prismaVersion==="7"&&(e.database.includes("mysql")||e.database.includes("sqlite"))||s.push({code:"better-auth-adapter",kind:"unverified",message:"This Better Auth combination is unverified. Select one of the certified exact profiles offered by the wizard; extras, addons, and untested API/database combinations remain gated."})),e.database.includes("mongodb")&&s.push({code:"mongodb",kind:"unverified",message:"This MongoDB combination is unverified. Use native MongoDB with single-project Express/REST and no authentication; ORM and other API combinations remain gated."}),e.prismaVersion==="8"&&s.push({code:"prisma-8",kind:"unverified",message:"Prisma 8 generation is not supported yet; the generated contract has not passed clean-install runtime validation."}),e.api.includes("graphql")&&s.push({code:"graphql",kind:"unverified",message:"This GraphQL combination is unverified. Select an exact certified GraphQL profile from the wizard; other database, ORM, authentication, layout, extras, and addon combinations remain gated."}),e.auth==="passport"&&s.push({code:"passport",kind:"unverified",message:"This Passport combination is unverified. Select an exact certified Passport profile from the wizard; other database, ORM, API, layout, extras, and addon combinations remain gated."}),e.auth==="better-auth:stateless"&&s.push({code:"better-auth-stateless",kind:"unverified",message:"This stateless Better Auth selection has no exact runtime-certified profile for its database, ORM, API, provider, and feature set yet."});const r=Object.keys(de).filter(d=>tt(e,d));e.architecture==="nest-microservice"&&e.database.length>0&&e.microservices.length>0&&s.push({code:"microservice-storage",kind:"unverified",message:"This microservice storage combination is awaiting its storage/API/provider and transport/adapter runtime evidence."});const a=p(d=>({addons:e.addons??[],auth:e.auth,extras:e.extras??[],formatter:e.formatter,profile:d}),"compositionSelection"),i=r.find(d=>{const u=a(d);return le(u)||t.pendingComposition===!0&&ce(u)})??r[0],o=r.find(d=>le(a(d))),n=e.auth==="none"&&o!==void 0?o:i,l={addons:e.addons??[],auth:e.auth,extras:e.extras??[],formatter:e.formatter,profile:n,projectType:e.projectType};for(const d of et(l))t.pendingComposition===!0&&d.kind==="unverified"&&Rs(l)||s.push(d);return e.auth==="none"&&e.addons?.includes("ultracite")===!0&&i!==void 0&&o===void 0&&s.push({code:"formatter-composition",kind:"unverified",message:"This formatter and Ultracite combination has no exact runtime certification for the selected transport profile."}),s.filter(({code:d})=>d==="microservice-feature-combination"?!0:d==="better-auth-adapter"&&e.auth==="better-auth"&&e.orm.includes("prisma")&&e.prismaVersion==="7"&&(e.database.includes("mysql")||e.database.includes("sqlite"))?!1:!$s.some(u=>st(u,d)&&Re(e,u)))}c(rt,"Ct"),p(rt,"getUnsupportedSelections");function at(e,t,s=!1,r=!1){const a=s;if(t&&!Re(e,t,{certificationCandidate:s,pendingComposition:a}))throw new Error(`Context does not match runtime certification profile: ${t}`);const i=rt(e,{pendingComposition:a}).filter(({code:o,kind:n})=>r&&n==="unverified"||t&&s&&n==="unverified"||t&&o==="formatter-composition"&&ce({addons:e.addons,auth:e.auth,extras:e.extras,formatter:e.formatter,profile:t})||t&&e.auth==="none"&&n==="unverified"&&ce({addons:e.addons,auth:e.auth,extras:e.extras,formatter:e.formatter,profile:t})?!1:!t||!st(t,o)||n==="invalid"?!0:!Re(e,t,{certificationCandidate:s,pendingComposition:a}));if(i.length>0)throw new Error(i.map(({message:o})=>o).join(`
75
+ `))}c(at,"Dt"),p(at,"validateProjectContext");const S=["rest"],j=["rest","trpc"],Ho=[["graphql-drizzle-fastify","none","postgresql","fastify"],["better-auth-drizzle-graphql-fastify","better-auth","postgresql","fastify"],["passport-drizzle-graphql-fastify","passport","postgresql","fastify"],["graphql-drizzle-mysql","none","mysql","express"],["graphql-drizzle-mysql-fastify","none","mysql","fastify"],["better-auth-drizzle-graphql-mysql","better-auth","mysql","express"],["better-auth-drizzle-graphql-mysql-fastify","better-auth","mysql","fastify"],["passport-drizzle-graphql-mysql","passport","mysql","express"],["passport-drizzle-graphql-mysql-fastify","passport","mysql","fastify"],["graphql-drizzle-sqlite","none","sqlite","express"],["graphql-drizzle-sqlite-fastify","none","sqlite","fastify"],["better-auth-drizzle-graphql-sqlite","better-auth","sqlite","express"],["better-auth-drizzle-graphql-sqlite-fastify","better-auth","sqlite","fastify"],["passport-drizzle-graphql-sqlite","passport","sqlite","express"],["passport-drizzle-graphql-sqlite-fastify","passport","sqlite","fastify"]],Ds=[["better-auth-prisma-sqlserver","better-auth","prisma","express"],["better-auth-prisma-sqlserver-fastify","better-auth","prisma","fastify"],["passport-typeorm-sqlserver","passport","typeorm","express"],["passport-typeorm-sqlserver-fastify","passport","typeorm","fastify"],["passport-drizzle-sqlserver","passport","drizzle","express"],["passport-drizzle-sqlserver-fastify","passport","drizzle","fastify"]],Mo=[["prisma-fastify","none"],["better-auth-prisma-fastify","better-auth"],["passport-prisma-fastify","passport"]],No=[["prisma-mysql-fastify","mysql",!0],["prisma-sqlite-fastify","sqlite",!0]],Go=[["prisma-trpc","none","express",!0],["prisma-fastify-trpc","none","fastify",!0],["better-auth-prisma-trpc","better-auth","express",!0],["better-auth-prisma-fastify-trpc","better-auth","fastify",!0],["passport-prisma-trpc","passport","express",!0],["passport-prisma-fastify-trpc","passport","fastify",!0]],Bo=[["typeorm-postgresql-fastify","typeorm","postgresql"],["typeorm-mysql-fastify","typeorm","mysql"],["typeorm-sqlite-fastify","typeorm","sqlite"],["drizzle-postgresql-fastify","drizzle","postgresql"],["drizzle-mysql-fastify","drizzle","mysql"],["drizzle-sqlite-fastify","drizzle","sqlite"]],Vo=[["better-auth-typeorm-postgres-fastify","better-auth","typeorm","postgresql"],["better-auth-typeorm-mysql-fastify","better-auth","typeorm","mysql"],["better-auth-typeorm-sqlite-fastify","better-auth","typeorm","sqlite"],["passport-typeorm-postgres-fastify","passport","typeorm","postgresql"],["passport-typeorm-mysql-fastify","passport","typeorm","mysql"],["passport-typeorm-sqlite-fastify","passport","typeorm","sqlite"],["better-auth-drizzle-postgres-fastify","better-auth","drizzle","postgresql"],["better-auth-drizzle-mysql-fastify","better-auth","drizzle","mysql"],["better-auth-drizzle-fastify","better-auth","drizzle","sqlite"],["passport-drizzle-postgres-fastify","passport","drizzle","postgresql"],["passport-drizzle-mysql-fastify","passport","drizzle","mysql"],["passport-drizzle-sqlite-fastify","passport","drizzle","sqlite"]],Jo={"typeorm-postgresql-express":["typeorm-postgresql-rest-full-feature-bundle"],"typeorm-mysql-express":["typeorm-mysql-rest-full-feature-bundle"],"typeorm-sqlite-express":["typeorm-sqlite-rest-full-feature-bundle"],"drizzle-postgresql-express":["drizzle-postgresql-rest-full-feature-bundle"],"drizzle-mysql-express":["drizzle-mysql-rest-full-feature-bundle"],"drizzle-sqlite-express":["drizzle-sqlite-rest-full-feature-bundle"],"drizzle-sqlserver-express":["sqlserver-drizzle-rest-full-feature-bundle"],"typeorm-sqlserver-express":["sqlserver-typeorm-rest-full-feature-bundle"],"passport-external-identity":["266-passport-external-identity-express-rest"],"better-auth-monorepo-prisma-postgres":["267-better-auth-monorepo-prisma-postgres"],"better-auth-drizzle":["better-auth-drizzle-sqlite-rest-full-feature-bundle"],"better-auth-drizzle-fastify":["29-better-auth-drizzle-fastify"],"better-auth-drizzle-fastify-trpc":["144-better-auth-drizzle-fastify-trpc"],"better-auth-drizzle-graphql":["112-better-auth-drizzle-graphql"],"better-auth-drizzle-graphql-fastify":["119-better-auth-drizzle-graphql-fastify"],"better-auth-drizzle-graphql-mysql":["123-better-auth-drizzle-graphql-mysql"],"better-auth-drizzle-graphql-mysql-fastify":["124-better-auth-drizzle-graphql-mysql-fastify"],"better-auth-drizzle-graphql-sqlite":["129-better-auth-drizzle-graphql-sqlite"],"better-auth-drizzle-graphql-sqlite-fastify":["130-better-auth-drizzle-graphql-sqlite-fastify"],"better-auth-drizzle-mysql":["better-auth-drizzle-mysql-rest-full-feature-bundle"],"better-auth-drizzle-mysql-fastify":["78-better-auth-drizzle-mysql-fastify"],"better-auth-drizzle-mysql-fastify-trpc":["80-better-auth-drizzle-mysql-fastify-trpc"],"better-auth-drizzle-mysql-trpc":["79-better-auth-drizzle-mysql-trpc"],"better-auth-drizzle-postgres":["better-auth-drizzle-postgresql-rest-full-feature-bundle"],"better-auth-drizzle-postgres-fastify":["75-better-auth-drizzle-postgres-fastify"],"better-auth-drizzle-postgres-fastify-trpc":["77-better-auth-drizzle-postgres-fastify-trpc"],"better-auth-drizzle-postgres-trpc":["76-better-auth-drizzle-postgres-trpc"],"better-auth-drizzle-trpc":["35-better-auth-drizzle-trpc"],"better-auth-native-postgres":["31-better-auth-native-postgres"],"better-auth-native-postgres-fastify":["32-better-auth-native-postgres-fastify"],"better-auth-native-postgres-fastify-trpc":["40-better-auth-native-postgres-fastify-trpc"],"better-auth-native-postgres-trpc":["34-better-auth-native-postgres-trpc"],"better-auth-prisma":["14-better-auth-prisma"],"better-auth-prisma-sqlserver":["better-auth-prisma-sqlserver-express-rest-full-feature-bundle"],"better-auth-prisma-sqlserver-fastify":["better-auth-prisma-sqlserver-fastify-rest-full-feature-bundle"],"better-auth-prisma-docker":["164-better-auth-prisma-docker"],"better-auth-prisma-mongo":["103-better-auth-prisma-mongo"],"better-auth-prisma-fastify":["28-better-auth-prisma-fastify"],"better-auth-prisma-mongo-fastify":["104-better-auth-prisma-mongo-fastify"],"better-auth-prisma-fastify-trpc":["38-better-auth-prisma-fastify-trpc"],"better-auth-prisma-mongo-fastify-trpc":["106-better-auth-prisma-mongo-fastify-trpc"],"better-auth-prisma-trpc":["33-better-auth-prisma-trpc"],"better-auth-prisma-mongo-trpc":["105-better-auth-prisma-mongo-trpc"],"better-auth-stateless":["21-better-auth-stateless"],"better-auth-stateless-fastify":["145-better-auth-stateless-fastify"],"better-auth-stateless-trpc":["37-better-auth-stateless-trpc"],"better-auth-stateless-fastify-trpc":["146-better-auth-stateless-fastify-trpc"],"better-auth-stateless-drizzle":["147-better-auth-stateless-drizzle"],"better-auth-stateless-typeorm":["148-better-auth-stateless-typeorm"],"better-auth-typeorm-mysql":["better-auth-typeorm-mysql-rest-full-feature-bundle"],"better-auth-typeorm-mysql-fastify":["57-better-auth-typeorm-mysql-fastify"],"better-auth-typeorm-mysql-fastify-trpc":["59-better-auth-typeorm-mysql-fastify-trpc"],"better-auth-typeorm-mysql-trpc":["58-better-auth-typeorm-mysql-trpc"],"better-auth-typeorm-postgres":["better-auth-typeorm-postgresql-rest-full-feature-bundle"],"better-auth-typeorm-postgres-fastify":["53-better-auth-typeorm-postgres-fastify"],"better-auth-typeorm-postgres-fastify-trpc":["55-better-auth-typeorm-postgres-fastify-trpc"],"better-auth-typeorm-postgres-trpc":["54-better-auth-typeorm-postgres-trpc"],"better-auth-typeorm-sqlite":["better-auth-typeorm-sqlite-rest-full-feature-bundle"],"better-auth-typeorm-sqlite-fastify":["61-better-auth-typeorm-sqlite-fastify"],"better-auth-typeorm-sqlite-fastify-trpc":["63-better-auth-typeorm-sqlite-fastify-trpc"],"better-auth-typeorm-sqlite-trpc":["62-better-auth-typeorm-sqlite-trpc"],"graphql-drizzle":["111-graphql-drizzle"],"graphql-drizzle-fastify":["118-graphql-drizzle-fastify"],"graphql-drizzle-mysql":["121-graphql-drizzle-mysql"],"graphql-drizzle-mysql-fastify":["122-graphql-drizzle-mysql-fastify"],"graphql-drizzle-sqlite":["127-graphql-drizzle-sqlite"],"graphql-drizzle-sqlite-fastify":["128-graphql-drizzle-sqlite-fastify"],"passport-drizzle-graphql":["113-passport-drizzle-graphql"],"passport-drizzle-graphql-fastify":["120-passport-drizzle-graphql-fastify"],"passport-drizzle-graphql-mysql":["125-passport-drizzle-graphql-mysql"],"passport-drizzle-graphql-mysql-fastify":["126-passport-drizzle-graphql-mysql-fastify"],"passport-drizzle-graphql-sqlite":["131-passport-drizzle-graphql-sqlite"],"passport-drizzle-graphql-sqlite-fastify":["132-passport-drizzle-graphql-sqlite-fastify"],"passport-drizzle-mysql":["passport-drizzle-mysql-rest-full-feature-bundle"],"passport-drizzle-mysql-fastify":["85-passport-drizzle-mysql-fastify"],"passport-drizzle-mysql-fastify-trpc":["87-passport-drizzle-mysql-fastify-trpc"],"passport-drizzle-mysql-trpc":["86-passport-drizzle-mysql-trpc"],"passport-drizzle-postgres":["passport-drizzle-postgresql-rest-full-feature-bundle"],"passport-drizzle-postgres-fastify":["81-passport-drizzle-postgres-fastify"],"passport-drizzle-postgres-fastify-trpc":["83-passport-drizzle-postgres-fastify-trpc"],"passport-drizzle-postgres-trpc":["82-passport-drizzle-postgres-trpc"],"passport-drizzle-sqlite":["passport-drizzle-sqlite-rest-full-feature-bundle"],"passport-drizzle-sqlite-fastify":["88-passport-drizzle-sqlite-fastify"],"passport-drizzle-sqlite-fastify-trpc":["90-passport-drizzle-sqlite-fastify-trpc"],"passport-drizzle-sqlite-trpc":["89-passport-drizzle-sqlite-trpc"],"passport-drizzle-sqlserver":["passport-drizzle-sqlserver-express-rest-full-feature-bundle"],"passport-drizzle-sqlserver-fastify":["passport-drizzle-sqlserver-fastify-rest-full-feature-bundle"],"passport-prisma":["17-passport-prisma"],"passport-prisma-docker":["165-passport-prisma-docker"],"passport-prisma-mongo":["107-passport-prisma-mongo"],"passport-prisma-fastify":["30-passport-prisma-fastify"],"passport-prisma-mongo-fastify":["108-passport-prisma-mongo-fastify"],"passport-prisma-fastify-trpc":["39-passport-prisma-fastify-trpc"],"passport-prisma-mongo-fastify-trpc":["110-passport-prisma-mongo-fastify-trpc"],"passport-prisma-trpc":["36-passport-prisma-trpc"],"passport-prisma-mongo-trpc":["109-passport-prisma-mongo-trpc"],"passport-typeorm-mysql":["passport-typeorm-mysql-rest-full-feature-bundle"],"passport-typeorm-mysql-fastify":["68-passport-typeorm-mysql-fastify"],"passport-typeorm-mysql-fastify-trpc":["70-passport-typeorm-mysql-fastify-trpc"],"passport-typeorm-mysql-trpc":["69-passport-typeorm-mysql-trpc"],"passport-typeorm-postgres":["passport-typeorm-postgresql-rest-full-feature-bundle"],"passport-typeorm-postgres-fastify":["64-passport-typeorm-postgres-fastify"],"passport-typeorm-postgres-fastify-trpc":["66-passport-typeorm-postgres-fastify-trpc"],"passport-typeorm-postgres-trpc":["65-passport-typeorm-postgres-trpc"],"passport-typeorm-sqlite":["passport-typeorm-sqlite-rest-full-feature-bundle"],"passport-typeorm-sqlite-fastify":["72-passport-typeorm-sqlite-fastify"],"passport-typeorm-sqlite-fastify-trpc":["74-passport-typeorm-sqlite-fastify-trpc"],"passport-typeorm-sqlite-trpc":["73-passport-typeorm-sqlite-trpc"],"passport-typeorm-sqlserver":["passport-typeorm-sqlserver-express-rest-full-feature-bundle"],"passport-typeorm-sqlserver-fastify":["passport-typeorm-sqlserver-fastify-rest-full-feature-bundle"],prisma:["04-postgres-prisma"],"prisma-trpc":["440-prisma-rest-trpc"],"better-auth-prisma-graphql":["51-better-auth-prisma-graphql"],"passport-prisma-graphql":["52-passport-prisma-graphql"]};function x(e){const t=e.status??"desired",s=t==="desired"&&e.profile!==void 0&&$s.includes(e.profile),r=e.scenarios??(e.profile!==void 0?Jo[e.profile]??[]:[]);return{...e,reason:e.reason??"Status derived from runtime scenario evidence.",scenarios:r,status:t,...s?{status:"certified"}:{}}}c(x,"z"),p(x,"authEntry");const _s=[...[["better-auth","mysql","express","better-auth-prisma-mysql-trpc"],["better-auth","mysql","fastify","better-auth-prisma-mysql-fastify-trpc"],["better-auth","sqlite","express","better-auth-prisma-sqlite-trpc"],["better-auth","sqlite","fastify","better-auth-prisma-sqlite-fastify-trpc"],["passport","mysql","express","passport-prisma-mysql-trpc"],["passport","mysql","fastify","passport-prisma-mysql-fastify-trpc"],["passport","sqlite","express","passport-prisma-sqlite-trpc"],["passport","sqlite","fastify","passport-prisma-sqlite-fastify-trpc"]].map(([e,t,s,r])=>x({api:j,auth:e,database:[t],httpProvider:s,id:`${e}-prisma-${t}-${s}-rest-trpc`,orm:["prisma"],profile:r,projectType:"single",reason:`Prisma 7 ${t} ${s} ${e} REST+tRPC passed full generated-project runtime certification.`,scenarios:[`${e}-prisma-${t}${s==="fastify"?"-fastify":""}-trpc-full-feature-bundle`],status:"certified",storage:"orm"})),...[["better-auth","mysql","express","better-auth-prisma-mysql"],["better-auth","mysql","fastify","better-auth-prisma-mysql-fastify"],["better-auth","sqlite","express","better-auth-prisma-sqlite"],["better-auth","sqlite","fastify","better-auth-prisma-sqlite-fastify"],["passport","mysql","express","passport-prisma-mysql"],["passport","mysql","fastify","passport-prisma-mysql-fastify"],["passport","sqlite","express","passport-prisma-sqlite"],["passport","sqlite","fastify","passport-prisma-sqlite-fastify"]].map(([e,t,s,r])=>x({api:S,auth:e,database:[t],httpProvider:s,id:`${e}-prisma-${t}-${s}-rest`,orm:["prisma"],profile:r,projectType:"single",reason:`Prisma 7 ${t} ${s} ${e} REST passed the full authenticated feature-bundle runtime scenario.`,scenarios:[`${e}-prisma-${t}${s==="fastify"?"-fastify":""}-rest-full-feature-bundle`],status:"certified",storage:"orm"})),...Ds.map(([e,t,s,r])=>x({api:S,auth:t,database:["sqlserver"],httpProvider:r,id:`${e}-rest-full-feature-bundle`,orm:[s],profile:e,projectType:"single",reason:`${t==="better-auth"?"Better Auth":"Passport"} ${s} SQL Server ${r} REST passed its clean full-feature runtime scenario.`,scenarios:[`${t}-${s}-sqlserver-${r}-rest-full-feature-bundle`],status:"certified",storage:"orm"})),...Ho.map(([e,t,s,r])=>x({api:["graphql"],auth:t,database:[s],httpProvider:r,id:`${e}-graphql`,orm:["drizzle"],profile:e,projectType:"single",reason:"Drizzle GraphQL profile passed clean install, migration, build, and authenticated or anonymous GraphQL runtime checks.",status:"desired",storage:"orm"})),x({api:S,auth:"better-auth",database:["postgresql"],httpProvider:"express",id:"better-auth-prisma-postgres-express-rest",orm:["prisma"],profile:"better-auth-prisma",projectType:"single",storage:"orm"}),x({api:S,auth:"better-auth",database:["mongodb"],httpProvider:"express",id:"better-auth-prisma-mongo-express-rest",orm:["prisma"],profile:"better-auth-prisma-mongo",projectType:"single",storage:"orm"}),x({api:S,auth:"better-auth",database:["postgresql"],httpProvider:"fastify",id:"better-auth-prisma-postgres-fastify-rest",orm:["prisma"],profile:"better-auth-prisma-fastify",projectType:"single",storage:"orm"}),x({api:S,auth:"better-auth",database:["mongodb"],httpProvider:"fastify",id:"better-auth-prisma-mongo-fastify-rest",orm:["prisma"],profile:"better-auth-prisma-mongo-fastify",projectType:"single",storage:"orm"}),x({api:j,auth:"better-auth",database:["postgresql"],httpProvider:"express",id:"better-auth-prisma-postgres-express-rest-trpc",orm:["prisma"],profile:"better-auth-prisma-trpc",projectType:"single",storage:"orm"}),x({api:j,auth:"better-auth",database:["mongodb"],httpProvider:"express",id:"better-auth-prisma-mongo-express-rest-trpc",orm:["prisma"],profile:"better-auth-prisma-mongo-trpc",projectType:"single",storage:"orm"}),x({api:j,auth:"better-auth",database:["postgresql"],httpProvider:"fastify",id:"better-auth-prisma-postgres-fastify-rest-trpc",orm:["prisma"],profile:"better-auth-prisma-fastify-trpc",projectType:"single",storage:"orm"}),x({api:S,auth:"better-auth",database:["postgresql"],httpProvider:"express",id:"better-auth-native-postgres-express-rest",orm:[],profile:"better-auth-native-postgres",projectType:"single",storage:"native-sql"}),x({api:S,auth:"better-auth",database:["postgresql"],httpProvider:"fastify",id:"better-auth-native-postgres-fastify-rest",orm:[],profile:"better-auth-native-postgres-fastify",projectType:"single",storage:"native-sql"}),x({api:j,auth:"better-auth",database:["postgresql"],httpProvider:"express",id:"better-auth-native-postgres-express-rest-trpc",orm:[],profile:"better-auth-native-postgres-trpc",projectType:"single",storage:"native-sql"}),x({api:j,auth:"better-auth",database:["postgresql"],httpProvider:"fastify",id:"better-auth-native-postgres-fastify-rest-trpc",orm:[],profile:"better-auth-native-postgres-fastify-trpc",projectType:"single",storage:"native-sql"}),x({api:S,auth:"better-auth",database:["sqlite"],httpProvider:"express",id:"better-auth-drizzle-sqlite-express-rest",orm:["drizzle"],profile:"better-auth-drizzle",projectType:"single",storage:"orm"}),x({api:S,auth:"better-auth",database:["sqlite"],httpProvider:"fastify",id:"better-auth-drizzle-sqlite-fastify-rest",orm:["drizzle"],profile:"better-auth-drizzle-fastify",projectType:"single",storage:"orm"}),x({api:j,auth:"better-auth",database:["sqlite"],httpProvider:"fastify",id:"better-auth-drizzle-sqlite-fastify-rest-trpc",orm:["drizzle"],profile:"better-auth-drizzle-fastify-trpc",projectType:"single",storage:"orm"}),x({api:j,auth:"better-auth",database:["sqlite"],httpProvider:"express",id:"better-auth-drizzle-sqlite-express-rest-trpc",orm:["drizzle"],profile:"better-auth-drizzle-trpc",projectType:"single",storage:"orm"}),x({api:S,auth:"better-auth:stateless",database:[],httpProvider:"express",id:"better-auth-stateless-express-rest",orm:[],profile:"better-auth-stateless",projectType:"single",storage:"stateless-cookie"}),x({api:S,auth:"better-auth:stateless",database:[],httpProvider:"fastify",id:"better-auth-stateless-fastify-rest",orm:[],profile:"better-auth-stateless-fastify",projectType:"single",storage:"stateless-cookie"}),x({api:j,auth:"better-auth:stateless",database:[],httpProvider:"express",id:"better-auth-stateless-express-rest-trpc",orm:[],profile:"better-auth-stateless-trpc",projectType:"single",storage:"stateless-cookie"}),x({api:j,auth:"better-auth:stateless",database:[],httpProvider:"fastify",id:"better-auth-stateless-fastify-rest-trpc",orm:[],profile:"better-auth-stateless-fastify-trpc",projectType:"single",storage:"stateless-cookie"}),x({api:S,auth:"passport",database:["postgresql"],httpProvider:"express",id:"passport-prisma-postgres-express-rest",orm:["prisma"],profile:"passport-prisma",projectType:"single",storage:"orm"}),x({api:S,auth:"passport",database:["postgresql"],httpProvider:"fastify",id:"passport-prisma-postgres-fastify-rest",orm:["prisma"],profile:"passport-prisma-fastify",projectType:"single",storage:"orm"}),x({api:j,auth:"passport",database:["postgresql"],httpProvider:"express",id:"passport-prisma-postgres-express-rest-trpc",orm:["prisma"],profile:"passport-prisma-trpc",projectType:"single",storage:"orm"}),x({api:S,auth:"passport",database:["mongodb"],httpProvider:"express",id:"passport-prisma-mongo-express-rest",orm:["prisma"],profile:"passport-prisma-mongo",projectType:"single",storage:"orm"}),x({api:S,auth:"passport",database:["mongodb"],httpProvider:"fastify",id:"passport-prisma-mongo-fastify-rest",orm:["prisma"],profile:"passport-prisma-mongo-fastify",projectType:"single",storage:"orm"}),x({api:j,auth:"passport",database:["postgresql"],httpProvider:"fastify",id:"passport-prisma-postgres-fastify-rest-trpc",orm:["prisma"],profile:"passport-prisma-fastify-trpc",projectType:"single",storage:"orm"}),x({api:j,auth:"passport",database:["mongodb"],httpProvider:"express",id:"passport-prisma-mongo-express-rest-trpc",orm:["prisma"],profile:"passport-prisma-mongo-trpc",projectType:"single",storage:"orm"}),x({api:j,auth:"passport",database:["mongodb"],httpProvider:"fastify",id:"passport-prisma-mongo-fastify-rest-trpc",orm:["prisma"],profile:"passport-prisma-mongo-fastify-trpc",projectType:"single",storage:"orm"}),...["postgresql","mysql","sqlite"].flatMap(e=>[{api:S,httpProvider:"express",profile:`better-auth-typeorm-${e==="postgresql"?"postgres":e}`},{api:S,httpProvider:"fastify",profile:`better-auth-typeorm-${e==="postgresql"?"postgres":e}-fastify`},{api:j,httpProvider:"express",profile:`better-auth-typeorm-${e==="postgresql"?"postgres":e}-trpc`},{api:j,httpProvider:"fastify",profile:`better-auth-typeorm-${e==="postgresql"?"postgres":e}-fastify-trpc`}].map(t=>x({api:t.api,auth:"better-auth",database:[e],httpProvider:t.httpProvider,id:`better-auth-typeorm-${e}-${t.httpProvider}-${t.api.join("-")}`,orm:["typeorm"],profile:t.profile,projectType:"single",storage:"native-sql"}))),...["postgresql","mysql","sqlite"].flatMap(e=>[{api:S,httpProvider:"express",profile:`passport-typeorm-${e==="postgresql"?"postgres":e}`},{api:S,httpProvider:"fastify",profile:`passport-typeorm-${e==="postgresql"?"postgres":e}-fastify`},{api:j,httpProvider:"express",profile:`passport-typeorm-${e==="postgresql"?"postgres":e}-trpc`},{api:j,httpProvider:"fastify",profile:`passport-typeorm-${e==="postgresql"?"postgres":e}-fastify-trpc`}].map(t=>x({api:t.api,auth:"passport",database:[e],httpProvider:t.httpProvider,id:`passport-typeorm-${e}-${t.httpProvider}-${t.api.join("-")}`,orm:["typeorm"],profile:t.profile,projectType:"single",storage:"orm"}))),...["postgresql","mysql"].flatMap(e=>[{api:S,httpProvider:"express",profile:`better-auth-drizzle-${e==="postgresql"?"postgres":e}`},{api:S,httpProvider:"fastify",profile:`better-auth-drizzle-${e==="postgresql"?"postgres":e}-fastify`},{api:j,httpProvider:"express",profile:`better-auth-drizzle-${e==="postgresql"?"postgres":e}-trpc`},{api:j,httpProvider:"fastify",profile:`better-auth-drizzle-${e==="postgresql"?"postgres":e}-fastify-trpc`}].map(t=>x({api:t.api,auth:"better-auth",database:[e],httpProvider:t.httpProvider,id:`better-auth-drizzle-${e}-${t.httpProvider}-${t.api.join("-")}`,orm:["drizzle"],profile:t.profile,projectType:"single",storage:"orm"}))),...["postgresql","mysql","sqlite"].flatMap(e=>[{api:S,httpProvider:"express",profile:`passport-drizzle-${e==="postgresql"?"postgres":e}`},{api:S,httpProvider:"fastify",profile:`passport-drizzle-${e==="postgresql"?"postgres":e}-fastify`},{api:j,httpProvider:"express",profile:`passport-drizzle-${e==="postgresql"?"postgres":e}-trpc`},{api:j,httpProvider:"fastify",profile:`passport-drizzle-${e==="postgresql"?"postgres":e}-fastify-trpc`}].map(t=>x({api:t.api,auth:"passport",database:[e],httpProvider:t.httpProvider,id:`passport-drizzle-${e}-${t.httpProvider}-${t.api.join("-")}`,orm:["drizzle"],profile:t.profile,projectType:"single",storage:"orm"}))),x({api:["graphql"],auth:"better-auth",database:["postgresql"],httpProvider:"express",id:"better-auth-graphql-prisma-postgres",orm:["prisma"],profile:"better-auth-prisma-graphql",projectType:"single",reason:"GraphQL resolver guards are Passport-generated, so Better Auth restricts todo-example; certified by scenario 51.",storage:"orm"}),x({api:["graphql"],auth:"passport",database:["postgresql"],httpProvider:"express",id:"passport-graphql-prisma-postgres",orm:["prisma"],profile:"passport-prisma-graphql",projectType:"single",reason:"GraphQL authentication with Passport guards/decorators; certified by scenario 52.",storage:"orm"}),x({api:["graphql"],auth:"better-auth",database:["postgresql"],httpProvider:"express",id:"better-auth-graphql-drizzle-postgres",orm:["drizzle"],profile:"better-auth-drizzle-graphql",projectType:"single",storage:"orm"}),x({api:["graphql"],auth:"passport",database:["postgresql"],httpProvider:"express",id:"passport-graphql-drizzle-postgres",orm:["drizzle"],profile:"passport-drizzle-graphql",projectType:"single",storage:"orm"}),x({api:S,auth:"passport",database:[],httpProvider:"express",id:"passport-external-identity-express-rest",orm:[],profile:"passport-external-identity",projectType:"single",reason:"External RS256 bearer access tokens are checked against a configured JWKS URI, issuer, and audience; no local credential or token-minting endpoint is generated. Scenario 266 covers successful mapping and invalid-token rejection.",scenarios:["266-passport-external-identity-express-rest"],status:"certified",storage:"none"}),x({api:S,auth:"better-auth",database:["postgresql"],httpProvider:"express",id:"better-auth-monorepo-prisma-postgres",orm:["prisma"],profile:"better-auth-monorepo-prisma-postgres",projectType:"monorepo",reason:"Better Auth Prisma monorepo auth schema generation, database migrations, workspace build, and authenticated session resolution pass in scenario 267.",scenarios:["267-better-auth-monorepo-prisma-postgres"],status:"certified",storage:"orm"}),x({api:S,auth:"better-auth:stateless",database:["postgresql"],httpProvider:"express",id:"better-auth-stateless-with-app-database",orm:["typeorm"],projectType:"single",profile:"better-auth-stateless-typeorm",reason:"TypeORM owns a small application data entity while Better Auth keeps OIDC sessions in encrypted cookies without auth tables.",scenarios:["148-better-auth-stateless-typeorm"],status:"desired",storage:"stateless-cookie"}),x({api:S,auth:"better-auth:stateless",database:["postgresql"],httpProvider:"express",id:"better-auth-stateless-with-app-drizzle",orm:["drizzle"],projectType:"single",profile:"better-auth-stateless-drizzle",reason:"Application data uses Drizzle while stateless Better Auth keeps OIDC sessions in encrypted cookies without database-backed auth tables.",scenarios:["147-better-auth-stateless-drizzle"],status:"desired",storage:"stateless-cookie"}),x({api:S,auth:"passport",database:["sqlserver"],httpProvider:"express",id:"passport-prisma-sqlserver-express-rest",orm:["prisma"],profile:"passport-prisma-sqlserver",projectType:"single",reason:"Passport Prisma 7 SQL Server REST passed clean install, both migrations, build, unit/E2E, authenticated owner-isolated todos, Docker image/readiness, and published-port signup/session/todo checks in its full-feature scenario.",scenarios:["passport-prisma-sqlserver-express-rest-full-feature-bundle"],status:"certified",storage:"orm"}),x({api:S,auth:"passport",database:["sqlserver"],httpProvider:"fastify",id:"passport-prisma-sqlserver-fastify-rest",orm:["prisma"],profile:"passport-prisma-sqlserver-fastify",projectType:"single",reason:"Passport Prisma 7 SQL Server Fastify passed clean install, migrations and deploy, build, unit/E2E, authenticated todo ownership, Swagger/Scalar, rate limiting, Docker readiness, and published-port auth/session/todo persistence in its full-feature scenario.",scenarios:["passport-prisma-sqlserver-fastify-rest-full-feature-bundle"],status:"certified",storage:"orm"})],F=["better-auth","passport"],Zo=[{appliesTo:["none"],feature:"docker",id:"extra-docker-prisma-sqlserver-express",kind:"extra",profiles:["prisma-sqlserver"],scenarios:["518-prisma-sqlserver-express-docker"],reason:"SQL Server Prisma 7 Express Docker-only image build, Compose readiness, published HTTP 200, and cleanup pass in scenario 518.",requiredEvidence:["image build, Compose readiness, published endpoint, and cleanup pass"],status:"certified"},{appliesTo:["none"],feature:"docker",id:"extra-docker-prisma-sqlserver-fastify",kind:"extra",profiles:["prisma-sqlserver-fastify"],scenarios:["519-prisma-sqlserver-fastify-docker"],reason:"SQL Server Prisma 7 Fastify Docker-only image build, Compose readiness, published HTTP 200, and cleanup pass in scenario 519.",requiredEvidence:["image build, Compose readiness, published endpoint, and cleanup pass"],status:"certified"},{appliesTo:["none"],feature:"health-check",id:"extra-health-prisma-sqlserver-express",kind:"extra",profiles:["prisma-sqlserver"],scenarios:["514-prisma-sqlserver-express-health"],reason:"SQL Server Prisma 7 Express health-check-only generation, migrations, build, and E2E pass in scenario 514.",requiredEvidence:["healthy and database outage readiness checks pass"],status:"certified"},{appliesTo:["none"],feature:"health-check",id:"extra-health-prisma-sqlserver-fastify",kind:"extra",profiles:["prisma-sqlserver-fastify"],scenarios:["515-prisma-sqlserver-fastify-health"],reason:"SQL Server Prisma 7 Fastify health-check-only generation, migrations, build, and E2E pass in scenario 515.",requiredEvidence:["healthy and database outage readiness checks pass"],status:"certified"},{appliesTo:["none"],feature:"rate-limiting",id:"extra-rate-limit-prisma-sqlserver-express",kind:"extra",profiles:["prisma-sqlserver"],scenarios:["516-prisma-sqlserver-express-rate-limit"],reason:"SQL Server Prisma 7 Express rate-limit-only E2E and compiled HTTP 429 pass in scenario 516.",requiredEvidence:["compiled request threshold returns HTTP 429"],status:"certified"},{appliesTo:["none"],feature:"rate-limiting",id:"extra-rate-limit-prisma-sqlserver-fastify",kind:"extra",profiles:["prisma-sqlserver-fastify"],scenarios:["517-prisma-sqlserver-fastify-rate-limit"],reason:"SQL Server Prisma 7 Fastify rate-limit-only E2E and compiled HTTP 429 pass in scenario 517.",requiredEvidence:["compiled request threshold returns HTTP 429"],status:"certified"},{appliesTo:["none"],feature:"todo-example",id:"extra-todo-prisma-sqlserver-express",kind:"extra",profiles:["prisma-sqlserver"],scenarios:["512-prisma-sqlserver-express-todo"],reason:"SQL Server Prisma 7 Express todo-only migrations, build, and CRUD E2E pass in scenario 512.",requiredEvidence:["todo CRUD persistence checks pass"],status:"certified"},{appliesTo:["none"],feature:"todo-example",id:"extra-todo-prisma-sqlserver-fastify",kind:"extra",profiles:["prisma-sqlserver-fastify"],scenarios:["513-prisma-sqlserver-fastify-todo"],reason:"SQL Server Prisma 7 Fastify todo-only migrations, build, and CRUD E2E pass in scenario 513.",requiredEvidence:["todo CRUD persistence checks pass"],status:"certified"},{appliesTo:["none"],feature:"typescript-7",id:"extra-typescript-7-ultracite-prisma-sqlserver",kind:"extra",profiles:["prisma-sqlserver","prisma-sqlserver-fastify"],scenarios:["506-prisma-sqlserver-express-typescript-7-ultracite","507-prisma-sqlserver-fastify-typescript-7-ultracite"],reason:"SQL Server/Prisma 7 Express and Fastify resolve TypeScript 7, build, pass E2E, and pass Ultracite checks in scenarios 506\u2013507.",requiredEvidence:["TypeScript 7 resolution, build, runtime tests, and lint checks pass"],status:"certified"},{appliesTo:["none"],feature:"docker",id:"extra-docker-health-prisma-sqlserver",kind:"extra",profiles:["prisma-sqlserver","prisma-sqlserver-fastify"],scenarios:["502-prisma-sqlserver-express-docker-health-check","503-prisma-sqlserver-fastify-docker-health-check"],reason:"SQL Server/Prisma 7 Express and Fastify Docker images built, started with Compose readiness, served published health endpoints, and cleaned up in scenarios 502\u2013503.",requiredEvidence:["image build, Compose health, HTTP readiness, and cleanup pass"],status:"certified"},{appliesTo:["none"],feature:"health-check",id:"extra-health-docker-prisma-sqlserver",kind:"extra",profiles:["prisma-sqlserver","prisma-sqlserver-fastify"],scenarios:["502-prisma-sqlserver-express-docker-health-check","503-prisma-sqlserver-fastify-docker-health-check"],reason:"SQL Server/Prisma 7 Express and Fastify Docker deployments return healthy readiness responses in scenarios 502\u2013503.",requiredEvidence:["published health endpoint returns HTTP 200"],status:"certified"},{appliesTo:["none"],feature:"docker",id:"extra-docker-todo-health-rate-prisma-sqlserver",kind:"extra",profiles:["prisma-sqlserver","prisma-sqlserver-fastify"],scenarios:["504-prisma-sqlserver-express-docker-todo-health-rate-limit","505-prisma-sqlserver-fastify-docker-todo-health-rate-limit"],reason:"SQL Server/Prisma 7 Express and Fastify Docker bundles built, passed Compose readiness, todo and health E2E, HTTP 200/429 probes, and cleanup in scenarios 504\u2013505.",requiredEvidence:["Docker runtime, todo CRUD, HTTP readiness, HTTP 429, and cleanup pass"],status:"certified"},{appliesTo:["none"],feature:"todo-example",id:"extra-todo-docker-health-rate-prisma-sqlserver",kind:"extra",profiles:["prisma-sqlserver","prisma-sqlserver-fastify"],scenarios:["504-prisma-sqlserver-express-docker-todo-health-rate-limit","505-prisma-sqlserver-fastify-docker-todo-health-rate-limit"],reason:"SQL Server/Prisma 7 Express and Fastify Docker bundles pass todo CRUD E2E with health and rate limiting in scenarios 504\u2013505.",requiredEvidence:["todo CRUD and persistence checks pass"],status:"certified"},{appliesTo:["none"],feature:"health-check",id:"extra-health-docker-todo-rate-prisma-sqlserver",kind:"extra",profiles:["prisma-sqlserver","prisma-sqlserver-fastify"],scenarios:["504-prisma-sqlserver-express-docker-todo-health-rate-limit","505-prisma-sqlserver-fastify-docker-todo-health-rate-limit"],reason:"SQL Server/Prisma 7 Express and Fastify Docker bundles pass health readiness and outage checks with todo and rate limiting in scenarios 504\u2013505.",requiredEvidence:["healthy and database outage HTTP status checks pass"],status:"certified"},{appliesTo:["none"],feature:"rate-limiting",id:"extra-rate-docker-todo-health-prisma-sqlserver",kind:"extra",profiles:["prisma-sqlserver","prisma-sqlserver-fastify"],scenarios:["504-prisma-sqlserver-express-docker-todo-health-rate-limit","505-prisma-sqlserver-fastify-docker-todo-health-rate-limit"],reason:"SQL Server/Prisma 7 Express and Fastify Docker deployments return HTTP 429 over published ports in scenarios 504\u2013505.",requiredEvidence:["request threshold returns HTTP 429"],status:"certified"},{appliesTo:["none"],feature:"swagger",id:"extra-swagger-scalar-todo-health-rate-prisma-sqlserver",kind:"extra",profiles:["prisma-sqlserver","prisma-sqlserver-fastify"],scenarios:["500-prisma-sqlserver-express-swagger-scalar-todo-health-rate-limit","501-prisma-sqlserver-fastify-swagger-scalar-todo-health-rate-limit"],reason:"SQL Server/Prisma 7 Express and Fastify serve generated OpenAPI docs alongside Scalar, todo, health, and rate limiting in scenarios 500\u2013501.",requiredEvidence:["OpenAPI document and REST paths are served at runtime"],status:"certified"},{appliesTo:["none"],feature:"todo-example",id:"extra-todo-swagger-scalar-health-rate-prisma-sqlserver",kind:"extra",profiles:["prisma-sqlserver","prisma-sqlserver-fastify"],scenarios:["500-prisma-sqlserver-express-swagger-scalar-todo-health-rate-limit","501-prisma-sqlserver-fastify-swagger-scalar-todo-health-rate-limit"],reason:"SQL Server/Prisma 7 Express and Fastify pass todo CRUD E2E with Swagger, Scalar, health, and rate limiting in scenarios 500\u2013501.",requiredEvidence:["todo CRUD and persistence checks pass"],status:"certified"},{appliesTo:["none"],feature:"health-check",id:"extra-health-swagger-scalar-todo-rate-prisma-sqlserver",kind:"extra",profiles:["prisma-sqlserver","prisma-sqlserver-fastify"],scenarios:["500-prisma-sqlserver-express-swagger-scalar-todo-health-rate-limit","501-prisma-sqlserver-fastify-swagger-scalar-todo-health-rate-limit"],reason:"SQL Server/Prisma 7 Express and Fastify pass health readiness and outage checks with Swagger, Scalar, todo, and rate limiting in scenarios 500\u2013501.",requiredEvidence:["healthy and database outage HTTP status checks pass"],status:"certified"},{appliesTo:["none"],feature:"rate-limiting",id:"extra-rate-swagger-scalar-todo-health-prisma-sqlserver",kind:"extra",profiles:["prisma-sqlserver","prisma-sqlserver-fastify"],scenarios:["500-prisma-sqlserver-express-swagger-scalar-todo-health-rate-limit","501-prisma-sqlserver-fastify-swagger-scalar-todo-health-rate-limit"],reason:"SQL Server/Prisma 7 Express and Fastify compiled applications reach HTTP 429 with Swagger, Scalar, todo, and health enabled in scenarios 500\u2013501.",requiredEvidence:["request threshold returns HTTP 429"],status:"certified"},{appliesTo:["none"],feature:"health-check",id:"extra-health-check-prisma-sqlserver-express-todo-rate-limit",kind:"extra",profiles:["prisma-sqlserver"],scenarios:["498-prisma-sqlserver-express-todo-health-rate-limit"],reason:"SQL Server/Prisma 7 Express health readiness and database outage responses pass with todo and rate limiting in scenario 498.",requiredEvidence:["healthy and database outage HTTP status checks pass"],status:"certified"},{appliesTo:["none"],feature:"health-check",id:"extra-health-check-prisma-sqlserver-fastify-todo-rate-limit",kind:"extra",profiles:["prisma-sqlserver-fastify"],scenarios:["499-prisma-sqlserver-fastify-todo-health-rate-limit"],reason:"SQL Server/Prisma 7 Fastify health readiness and database outage responses pass with todo and rate limiting in scenario 499.",requiredEvidence:["healthy and database outage HTTP status checks pass"],status:"certified"},{appliesTo:["none"],feature:"rate-limiting",id:"extra-rate-limiting-prisma-sqlserver-express-todo-health",kind:"extra",profiles:["prisma-sqlserver"],scenarios:["498-prisma-sqlserver-express-todo-health-rate-limit"],reason:"SQL Server/Prisma 7 Express rate limiting returns HTTP 429 after a compiled-app request burst in scenario 498.",requiredEvidence:["request threshold returns HTTP 429"],status:"certified"},{appliesTo:["none"],feature:"rate-limiting",id:"extra-rate-limiting-prisma-sqlserver-fastify-todo-health",kind:"extra",profiles:["prisma-sqlserver-fastify"],scenarios:["499-prisma-sqlserver-fastify-todo-health-rate-limit"],reason:"SQL Server/Prisma 7 Fastify rate limiting returns HTTP 429 after a compiled-app request burst in scenario 499.",requiredEvidence:["request threshold returns HTTP 429"],status:"certified"},{appliesTo:["none"],feature:"todo-example",id:"extra-todo-prisma-sqlserver-express-health-rate-limit",kind:"extra",profiles:["prisma-sqlserver"],scenarios:["498-prisma-sqlserver-express-todo-health-rate-limit"],reason:"SQL Server/Prisma 7 Express todo CRUD, health readiness/outage, and HTTP throttling pass scenario 498.",requiredEvidence:["todo CRUD, health outage response, and HTTP 429 pass"],status:"certified"},{appliesTo:["none"],feature:"todo-example",id:"extra-todo-prisma-sqlserver-fastify-health-rate-limit",kind:"extra",profiles:["prisma-sqlserver-fastify"],scenarios:["499-prisma-sqlserver-fastify-todo-health-rate-limit"],reason:"SQL Server/Prisma 7 Fastify todo CRUD, health readiness/outage, and HTTP throttling pass scenario 499.",requiredEvidence:["todo CRUD, health outage response, and HTTP 429 pass"],status:"certified"},{appliesTo:["none"],feature:"todo-example",id:"extra-todo-prisma-sqlserver-express-nestjs-zod",kind:"extra",profiles:["prisma-sqlserver"],scenarios:["508-prisma-sqlserver-express-full-stack-normal-compiler"],reason:"SQL Server/Prisma 7 Express todo CRUD and nestjs-zod DTO validation with Swagger pass as part of the full runtime bundle in scenario 508.",requiredEvidence:["todo CRUD, invalid DTO rejection, and OpenAPI validation pass"],status:"certified"},{appliesTo:["none"],feature:"todo-example",id:"extra-todo-prisma-sqlserver-fastify-nestjs-zod",kind:"extra",profiles:["prisma-sqlserver-fastify"],scenarios:["509-prisma-sqlserver-fastify-full-stack-normal-compiler"],reason:"SQL Server/Prisma 7 Fastify todo CRUD and nestjs-zod DTO validation with Swagger pass as part of the full runtime bundle in scenario 509.",requiredEvidence:["todo CRUD, invalid DTO rejection, and OpenAPI validation pass"],status:"certified"},{appliesTo:["none"],feature:"swagger",id:"extra-swagger-todo-prisma-sqlserver-express",kind:"extra",profiles:["prisma-sqlserver"],scenarios:["494-prisma-sqlserver-express-swagger-todo"],reason:"Prisma 7 SQL Server Express REST checks runtime OpenAPI and todo CRUD E2E in scenario 494.",requiredEvidence:["OpenAPI route and todo CRUD runtime checks pass"],status:"certified"},{appliesTo:["none"],feature:"swagger",id:"extra-swagger-todo-prisma-sqlserver-fastify",kind:"extra",profiles:["prisma-sqlserver-fastify"],scenarios:["495-prisma-sqlserver-fastify-swagger-todo"],reason:"Prisma 7 SQL Server Fastify REST checks runtime OpenAPI and todo CRUD E2E in scenario 495.",requiredEvidence:["OpenAPI route and todo CRUD runtime checks pass"],status:"certified"},{appliesTo:["none"],feature:"swagger",id:"extra-swagger-prisma-sqlserver-express",kind:"extra",profiles:["prisma-sqlserver"],scenarios:["490-prisma-sqlserver-express-swagger"],reason:"Prisma 7 SQL Server Express REST passes OpenAPI v3 and compiled HTTP docs JSON route checks in scenario 490.",requiredEvidence:["OpenAPI document and REST paths are served at runtime"],status:"certified"},{appliesTo:["none"],feature:"swagger",id:"extra-swagger-prisma-sqlserver-fastify",kind:"extra",profiles:["prisma-sqlserver-fastify"],scenarios:["491-prisma-sqlserver-fastify-swagger"],reason:"Prisma 7 SQL Server Fastify REST passes OpenAPI v3 and compiled HTTP docs JSON route checks in scenario 491.",requiredEvidence:["OpenAPI document and REST paths are served at runtime"],status:"certified"},{appliesTo:[],feature:"docker",id:"extra-docker-microservices",kind:"extra",profiles:["microservice-grpc","microservice-redis","microservice-mqtt","microservice-nats","microservice-rabbitmq","microservice-kafka"],scenarios:["368-microservice-grpc-docker","369-microservice-redis-docker","370-microservice-mqtt-docker","371-microservice-nats-docker","372-microservice-rabbitmq-docker","373-microservice-kafka-docker","380-microservice-grpc-docker-recovery","381-microservice-redis-docker-recovery","382-microservice-mqtt-docker-recovery","383-microservice-nats-docker-recovery","384-microservice-rabbitmq-docker-recovery","385-microservice-kafka-docker-recovery"],reason:"Scenarios 368\u2013373 cover Docker startup, protocol request/reply, event observation where applicable, and cleanup. Distinct recovery scenarios 380\u2013385 restart each broker and then the generated app (or restart the gRPC app), wait for health, and pass protocol request/reply and event probes again. This proves recovery with an app restart; transparent reconnect, delivery during outages, and durability remain unclaimed.",requiredEvidence:["generated application build and E2E","Docker Compose service readiness","Docker-network request/reply and event delivery","broker/app restart and post-restart transport probe","container and volume cleanup"],status:"certified"},{appliesTo:F,feature:"docker",id:"extra-docker-auth",kind:"extra",profiles:["better-auth-prisma-docker","passport-prisma-docker","passport-prisma-mongo"],scenarios:["164-better-auth-prisma-docker","165-passport-prisma-docker","319-passport-prisma-mongo-docker-todo","320-passport-prisma-mongo-rest-certified-bundle"],reason:"Full generated-project and Docker runtime checks passed for the exact Better Auth and Passport Prisma 7/PostgreSQL profiles and Passport Prisma 6/MongoDB REST with authenticated todo persistence across app restart (scenarios 164, 165, 319, and 320). Other database and ORM Docker combinations remain gated.",requiredEvidence:["docker compose up","auth lifecycle over published port"],status:"certified"},{appliesTo:F,feature:"health-check",id:"extra-health-check-auth",kind:"extra",profiles:["better-auth-prisma","better-auth-drizzle-graphql","better-auth-drizzle-graphql-fastify","better-auth-drizzle-graphql-mysql","better-auth-drizzle-graphql-mysql-fastify","better-auth-drizzle-graphql-sqlite","better-auth-drizzle-graphql-sqlite-fastify","passport-prisma","passport-prisma-graphql","passport-typeorm-postgres","passport-typeorm-mysql","passport-typeorm-sqlite","passport-drizzle-postgres","passport-drizzle-mysql","passport-drizzle-sqlite"],scenarios:["47-better-auth-prisma-health","114-better-auth-drizzle-graphql-health","296-better-auth-drizzle-graphql-postgres-fastify-health","297-better-auth-drizzle-graphql-mysql-health","298-better-auth-drizzle-graphql-mysql-fastify-health","299-better-auth-drizzle-graphql-sqlite-health","300-better-auth-drizzle-graphql-sqlite-fastify-health","115-passport-drizzle-graphql-health","139-passport-drizzle-graphql-fastify-health","140-passport-drizzle-graphql-mysql-health","141-passport-drizzle-graphql-mysql-fastify-health","142-passport-drizzle-graphql-sqlite-health","143-passport-drizzle-graphql-sqlite-fastify-health","52-passport-prisma-graphql","174-passport-prisma-health-check","176-passport-typeorm-postgres-health","177-passport-drizzle-postgres-health","178-passport-typeorm-mysql-health","179-passport-typeorm-sqlite-health","180-passport-drizzle-mysql-health","181-passport-drizzle-sqlite-health"],reason:"Authenticated health checks and database-outage HTTP 503 transitions passed for the exact Prisma, TypeORM, Drizzle REST, Prisma GraphQL, and Drizzle GraphQL profiles listed here; scenarios 47, 52, 114\u2013115, 139\u2013143, and 174\u2013181, 296\u2013300 back those profiles. Other profiles remain gated.",requiredEvidence:["anonymous access matches policy","database outage changes readiness"],status:"certified"},{appliesTo:F,feature:"rate-limiting",id:"extra-rate-limiting-auth",kind:"extra",profiles:["better-auth-prisma","better-auth-prisma-graphql","better-auth-drizzle-graphql","better-auth-drizzle-graphql-fastify","better-auth-drizzle-graphql-mysql","better-auth-drizzle-graphql-mysql-fastify","better-auth-drizzle-graphql-sqlite","better-auth-drizzle-graphql-sqlite-fastify","passport-prisma-graphql","passport-drizzle-graphql","passport-drizzle-graphql-fastify","passport-drizzle-graphql-mysql","passport-drizzle-graphql-mysql-fastify","passport-drizzle-graphql-sqlite","passport-drizzle-graphql-sqlite-fastify","passport-prisma","passport-prisma-mongo","passport-prisma-trpc","passport-typeorm-postgres","passport-drizzle-postgres","passport-typeorm-mysql","passport-typeorm-sqlite","passport-drizzle-mysql","passport-drizzle-sqlite","passport-typeorm-postgres-fastify","passport-drizzle-postgres-fastify","passport-typeorm-mysql-fastify","passport-drizzle-mysql-fastify","passport-typeorm-sqlite-fastify","passport-drizzle-sqlite-fastify"],scenarios:["48-better-auth-prisma-rate-limit","155-better-auth-prisma-graphql-rate-limiting","156-passport-prisma-graphql-rate-limiting","170-passport-prisma-rate-limiting","270-passport-prisma-trpc-rate-limiting","310-passport-prisma-mongo-rate-limiting","188-passport-typeorm-postgres-rate-limiting","189-passport-drizzle-postgres-rate-limiting","198-passport-typeorm-mysql-rate-limiting","199-passport-typeorm-sqlite-rate-limiting","200-passport-drizzle-mysql-rate-limiting","201-passport-drizzle-sqlite-rate-limiting","281-better-auth-drizzle-graphql-postgres-fastify-rate-limiting","282-better-auth-drizzle-graphql-mysql-rate-limiting","283-better-auth-drizzle-graphql-mysql-fastify-rate-limiting","284-better-auth-drizzle-graphql-sqlite-rate-limiting","285-better-auth-drizzle-graphql-sqlite-fastify-rate-limiting","286-passport-drizzle-graphql-postgres-fastify-rate-limiting","287-passport-drizzle-graphql-mysql-rate-limiting","288-passport-drizzle-graphql-mysql-fastify-rate-limiting","289-passport-drizzle-graphql-sqlite-rate-limiting","290-passport-drizzle-graphql-sqlite-fastify-rate-limiting","260-passport-typeorm-postgresql-fastify-rate-limiting","261-passport-drizzle-postgresql-fastify-rate-limiting","262-passport-typeorm-mysql-fastify-rate-limiting","263-passport-drizzle-mysql-fastify-rate-limiting","264-passport-typeorm-sqlite-fastify-rate-limiting","265-passport-drizzle-sqlite-fastify-rate-limiting"],composition:"better-auth-prisma-rate-limiting",reason:"Throttling must cover actual auth endpoints, including Better Auth handlers that bypass controller guards. Runtime proof covers Prisma REST/GraphQL, Passport Prisma 6 MongoDB REST (scenario 310), Passport tRPC procedure requests (scenario 270), Passport TypeORM/Drizzle REST on PostgreSQL, MySQL, and SQLite through Express/Fastify (scenarios 188\u2013201 and 260\u2013265), and authenticated Drizzle GraphQL across PostgreSQL/MySQL/SQLite and Express/Fastify (scenarios 151\u2013152 and 281\u2013290). Other combinations remain gated.",requiredEvidence:["repeated login attempts reach 429","normal login remains usable"],status:"certified"},{appliesTo:["none"],composition:"none-docker-health-check",feature:"docker",id:"extra-docker-health-check-none",kind:"extra",profiles:["prisma"],scenarios:["171-docker-health-prisma"],reason:"PostgreSQL Prisma Docker startup and published health endpoint passed; other databases and profiles remain gated.",requiredEvidence:["container image builds","Compose startup and health probe pass","cleanup succeeds"],status:"certified"},{appliesTo:F,feature:"swagger",id:"extra-swagger-auth",kind:"extra",profiles:["better-auth-prisma","passport-prisma","passport-prisma-mongo","passport-typeorm-postgres","passport-drizzle-postgres","passport-typeorm-mysql","passport-typeorm-sqlite","passport-drizzle-mysql","passport-drizzle-sqlite"],scenarios:["158-better-auth-prisma-swagger-scalar","159-passport-prisma-swagger-scalar","311-passport-prisma-mongo-swagger-scalar","194-passport-typeorm-swagger-scalar","195-passport-drizzle-swagger-scalar","202-passport-typeorm-mysql-swagger-scalar","203-passport-typeorm-sqlite-swagger-scalar","204-passport-drizzle-mysql-swagger-scalar","205-passport-drizzle-sqlite-swagger-scalar"],reason:"OpenAPI parsing, auth paths, and Scalar UI passed for the exact Better Auth Prisma, Passport Prisma and Prisma 6 MongoDB, and Passport TypeORM/Drizzle REST profiles listed across PostgreSQL, MongoDB, MySQL, and SQLite (scenarios 158\u2013159, 194\u2013205, and 311). Other auth/API profiles remain gated.",requiredEvidence:["document parses","paths exist","documented authentication works"],status:"certified"},{appliesTo:F,feature:"todo-example",id:"extra-todo-auth",kind:"extra",profiles:["better-auth-prisma","better-auth-typeorm-postgres","better-auth-drizzle-postgres","better-auth-prisma-fastify","better-auth-prisma-trpc","better-auth-prisma-graphql","better-auth-drizzle-trpc","better-auth-drizzle-fastify-trpc","better-auth-prisma-mongo-trpc","better-auth-prisma-mongo-fastify-trpc","better-auth-prisma-mongo","better-auth-prisma-mongo-fastify","better-auth-drizzle","better-auth-drizzle-fastify","better-auth-prisma-docker","passport-prisma-docker","better-auth-monorepo-prisma-postgres","passport-prisma","passport-prisma-fastify","passport-prisma-trpc","passport-prisma-mongo-trpc","passport-prisma-mongo-fastify-trpc","passport-prisma-mongo","passport-prisma-mongo-fastify","passport-prisma-graphql","passport-typeorm-postgres","passport-typeorm-postgres-fastify","passport-drizzle-postgres","passport-drizzle-postgres-fastify","passport-typeorm-mysql","passport-typeorm-sqlite","passport-drizzle-mysql","passport-drizzle-sqlite","better-auth-typeorm-mysql-fastify","passport-typeorm-mysql-fastify","better-auth-drizzle-mysql-fastify","passport-drizzle-mysql-fastify","better-auth-typeorm-sqlite-fastify","passport-typeorm-sqlite-fastify","passport-drizzle-sqlite-fastify"],scenarios:["49-better-auth-prisma-todo","444-prisma-rest-trpc-todo","441-prisma-rest-trpc-todo-ultracite","443-better-auth-prisma-trpc-todo-ultracite","442-passport-prisma-trpc-todo-ultracite","453-prisma-rest-docker","153-better-auth-prisma-graphql-todo","154-passport-prisma-graphql-todo","149-better-auth-drizzle-graphql-todo","150-passport-drizzle-graphql-todo","227-better-auth-drizzle-graphql-postgresql-fastify-todo","228-better-auth-drizzle-graphql-mysql-todo","229-better-auth-drizzle-graphql-mysql-fastify-todo","230-better-auth-drizzle-graphql-sqlite-todo","231-better-auth-drizzle-graphql-sqlite-fastify-todo","232-passport-drizzle-graphql-postgresql-fastify-todo","233-passport-drizzle-graphql-mysql-todo","234-passport-drizzle-graphql-mysql-fastify-todo","235-passport-drizzle-graphql-sqlite-todo","236-passport-drizzle-graphql-sqlite-fastify-todo","168-better-auth-prisma-trpc-todo","443-better-auth-prisma-trpc-todo-ultracite","169-passport-prisma-trpc-todo","442-passport-prisma-trpc-todo-ultracite","271-better-auth-drizzle-sqlite-express-trpc-todo","272-better-auth-drizzle-sqlite-fastify-trpc-todo","273-better-auth-prisma-mongo-express-trpc-todo","274-better-auth-prisma-mongo-fastify-trpc-todo","275-passport-prisma-mongo-express-trpc-todo","276-passport-prisma-mongo-fastify-trpc-todo","175-passport-prisma-rest-todo","182-passport-typeorm-postgres-rest-todo","183-passport-drizzle-postgres-rest-todo","184-passport-typeorm-mysql-rest-todo","185-passport-typeorm-sqlite-rest-todo","186-passport-drizzle-mysql-rest-todo","187-passport-drizzle-sqlite-rest-todo","196-passport-typeorm-nestjs-zod-swagger-todo","197-passport-drizzle-nestjs-zod-swagger-todo","206-passport-typeorm-mysql-nestjs-zod-swagger-todo","207-passport-typeorm-sqlite-nestjs-zod-swagger-todo","208-passport-drizzle-mysql-nestjs-zod-swagger-todo","209-passport-drizzle-sqlite-nestjs-zod-swagger-todo","253-better-auth-typeorm-mysql-fastify-rest-todo","254-passport-typeorm-mysql-fastify-rest-todo","255-better-auth-drizzle-mysql-fastify-rest-todo","256-passport-drizzle-mysql-fastify-rest-todo","257-better-auth-typeorm-sqlite-fastify-rest-todo","258-passport-typeorm-sqlite-fastify-rest-todo","259-passport-drizzle-sqlite-fastify-rest-todo","277-better-auth-prisma-postgres-fastify-rest-todo","278-passport-prisma-postgres-fastify-rest-todo","279-passport-typeorm-postgres-fastify-rest-todo","280-passport-drizzle-postgres-fastify-rest-todo","291-better-auth-typeorm-postgres-rest-todo","292-better-auth-drizzle-postgres-rest-todo","293-passport-prisma-mongo-rest-todo","294-passport-prisma-mongo-fastify-rest-todo","301-better-auth-prisma-mongo-rest-todo","302-better-auth-prisma-mongo-fastify-rest-todo","303-better-auth-drizzle-sqlite-rest-todo","304-better-auth-drizzle-sqlite-fastify-rest-todo","305-better-auth-prisma-docker-todo","306-passport-prisma-docker-todo","307-better-auth-monorepo-prisma-todo"],reason:"Todo ownership is certified for the exact authenticated Prisma REST/GraphQL, Drizzle GraphQL PostgreSQL/MySQL/SQLite Express/Fastify, tRPC, Passport TypeORM/Drizzle SQL REST, Better Auth TypeORM/Drizzle PostgreSQL and SQLite REST, Better Auth/Passport Prisma MongoDB REST, Docker, and Better Auth Prisma monorepo profiles listed here. Scenarios 291\u2013307 cover the additional ORM, MongoDB, Docker, and monorepo owner-isolation cases; other API/database combinations remain gated until their owner-isolation scenarios pass.",requiredEvidence:["two users cannot read, mutate, or delete each other's records"],status:"certified"},{appliesTo:F,feature:"typescript-7",id:"extra-typescript-7-auth",kind:"extra",profiles:["better-auth-prisma","passport-prisma","passport-prisma-mongo"],scenarios:["268-better-auth-prisma-typescript-7","295-passport-prisma-typescript-7","312-passport-prisma-mongo-typescript-7"],reason:"Better Auth and Passport Prisma PostgreSQL plus Passport Prisma 6 MongoDB TypeScript 7 builds, schema setup, unit tests, and authenticated E2E pass for the exact profiles listed here in scenarios 268, 295, and 312; other ORM and database profiles remain gated.",requiredEvidence:["clean build","runtime auth tests"],status:"certified"},{appliesTo:F,feature:"packages/shared",id:"extra-packages-shared-auth",kind:"extra",profiles:["better-auth-monorepo-prisma-postgres"],scenarios:["267-better-auth-monorepo-prisma-postgres","307-better-auth-monorepo-prisma-todo"],reason:"Better Auth Prisma monorepo workspace packages build and authenticate in scenarios 267 and 307, including authenticated todo owner isolation; other layouts remain gated.",requiredEvidence:["consumer package compiles","packaged application authenticates"],status:"certified"},{appliesTo:["none"],composition:"none-prisma-docker",feature:"docker",id:"extra-docker-prisma-rest",kind:"extra",profiles:["prisma"],scenarios:["453-prisma-rest-docker"],reason:"Prisma 7 PostgreSQL REST Docker startup, application checks and Compose teardown passed in scenario 453.",requiredEvidence:["Docker startup and teardown pass"],status:"certified"},{appliesTo:["none"],composition:"none-prisma-health-check",feature:"health-check",id:"extra-health-check-prisma-rest",kind:"extra",profiles:["prisma"],scenarios:["457-prisma-rest-health-check"],reason:"Prisma 7 REST health endpoint returns readiness and reports database outage in scenario 457.",requiredEvidence:["healthy and database outage HTTP status checks pass"],status:"certified"},{appliesTo:["none"],composition:"none-prisma-rate-limiting",feature:"rate-limiting",id:"extra-rate-limiting-prisma-rest",kind:"extra",profiles:["prisma"],scenarios:["458-prisma-rest-rate-limiting"],reason:"Prisma 7 REST throttle returns 429 after the configured request count in scenario 458.",requiredEvidence:["request threshold and recovery are tested"],status:"certified"},{appliesTo:["none"],composition:"none-prisma-swagger",feature:"swagger",id:"extra-swagger-prisma-rest",kind:"extra",profiles:["prisma"],scenarios:["459-prisma-rest-swagger"],reason:"Prisma 7 REST Swagger document and Scalar UI load in scenario 459.",requiredEvidence:["OpenAPI document and UI load"],status:"certified"},{appliesTo:["none"],composition:"none-prisma-swagger-todo",feature:"todo-example",id:"extra-todo-prisma-rest-swagger",kind:"extra",profiles:["prisma"],scenarios:["460-prisma-rest-swagger-todo"],reason:"Prisma 7 REST todo CRUD with Swagger passes scenario 460.",requiredEvidence:["todo CRUD and generated Swagger paths pass"],status:"certified"},{appliesTo:["none"],composition:"none-prisma-typescript-7",feature:"typescript-7",id:"extra-typescript-7-prisma-rest",kind:"extra",profiles:["prisma"],scenarios:["464-prisma-rest-typescript-7"],reason:"Prisma 7 PostgreSQL REST passes TypeScript 7 build and generated tests in scenario 464.",requiredEvidence:["clean build and runtime tests"],status:"certified"},{appliesTo:["none"],composition:"none-prisma-trpc-docker",feature:"docker",id:"extra-docker-prisma-rest-trpc",kind:"extra",profiles:["prisma-trpc"],scenarios:["468-prisma-rest-trpc-docker"],reason:"Prisma 7 REST+tRPC Docker image, published runtime, and teardown pass scenario 468.",requiredEvidence:["image build, Compose runtime, tRPC check, and teardown"],status:"certified"},{appliesTo:["none"],composition:"none-prisma-trpc-health-check",feature:"health-check",id:"extra-health-check-prisma-rest-trpc",kind:"extra",profiles:["prisma-trpc"],scenarios:["469-prisma-rest-trpc-health-check"],reason:"Prisma 7 REST+tRPC readiness and database outage checks pass scenario 469.",requiredEvidence:["healthy and database outage responses"],status:"certified"},{appliesTo:["none"],composition:"none-prisma-trpc-rate-limiting",feature:"rate-limiting",id:"extra-rate-limiting-prisma-rest-trpc",kind:"extra",profiles:["prisma-trpc"],scenarios:["470-prisma-rest-trpc-rate-limiting"],reason:"Prisma 7 REST+tRPC throttle behavior passes scenario 470.",requiredEvidence:["limit threshold and usable normal requests"],status:"certified"},{appliesTo:["none"],composition:"none-prisma-trpc-swagger",feature:"swagger",id:"extra-swagger-prisma-rest-trpc",kind:"extra",profiles:["prisma-trpc"],scenarios:["471-prisma-rest-trpc-swagger"],reason:"Prisma 7 REST+tRPC OpenAPI output passes scenario 471.",requiredEvidence:["OpenAPI document and REST paths load"],status:"certified"},{appliesTo:["none"],composition:"none-prisma-trpc-swagger-todo",feature:"todo-example",id:"extra-todo-prisma-rest-trpc-swagger",kind:"extra",profiles:["prisma-trpc"],scenarios:["472-prisma-rest-trpc-swagger-todo"],reason:"Prisma 7 REST+tRPC todo CRUD and OpenAPI paths pass scenario 472.",requiredEvidence:["todo CRUD, tRPC, and Swagger paths pass"],status:"certified"},{appliesTo:["none"],composition:"none-prisma-trpc-typescript-7",feature:"typescript-7",id:"extra-typescript-7-prisma-rest-trpc",kind:"extra",profiles:["prisma-trpc"],scenarios:["473-prisma-rest-trpc-typescript-7"],reason:"Prisma 7 REST+tRPC builds and tests with TypeScript 7 in scenario 473.",requiredEvidence:["clean install, build, and tests"],status:"certified"},{appliesTo:["none"],composition:"none-prisma-monorepo-shared",feature:"packages/shared",id:"extra-packages-shared-prisma-monorepo",kind:"extra",profiles:["prisma"],scenarios:["466-prisma-monorepo-shared"],reason:"The Prisma 7 PostgreSQL monorepo shared package compiles and passes generated app tests in scenario 466.",requiredEvidence:["workspace package builds and app runtime tests pass"],status:"certified"},{appliesTo:["none"],composition:"none-prisma-monorepo-shared-ultracite",feature:"packages/shared",id:"extra-packages-shared-prisma-monorepo-ultracite",kind:"extra",profiles:["prisma"],scenarios:["467-prisma-monorepo-shared-ultracite"],reason:"The Prisma 7 PostgreSQL monorepo shared package passes Ultracite, build, and app tests in scenario 467.",requiredEvidence:["workspace checks and app runtime tests pass"],status:"certified"},{appliesTo:["none"],composition:"none-prisma-trpc-monorepo-shared",feature:"packages/shared",id:"extra-packages-shared-prisma-rest-trpc-monorepo",kind:"extra",scenarios:["478-prisma-rest-trpc-monorepo-shared"],reason:"The Prisma 7 REST+tRPC monorepo shared package builds and passes app tests in scenario 478.",requiredEvidence:["workspace package and generated app pass checks"],status:"certified"},{appliesTo:["none"],composition:"none-prisma-trpc-docker-health-check",feature:"docker",id:"extra-docker-health-check-prisma-rest-trpc",kind:"extra",profiles:["prisma-trpc"],scenarios:["481-prisma-rest-trpc-docker-health-check"],reason:"Prisma 7 REST+tRPC Docker startup, health endpoint, published runtime, and teardown pass scenario 481.",requiredEvidence:["Docker health, HTTP probe, and teardown pass"],status:"certified"}],Wo=[{appliesTo:["none"],feature:"ultracite",id:"addon-ultracite-typescript-7-prisma-sqlserver",kind:"addon",profiles:["prisma-sqlserver","prisma-sqlserver-fastify"],scenarios:["506-prisma-sqlserver-express-typescript-7-ultracite","507-prisma-sqlserver-fastify-typescript-7-ultracite"],reason:"SQL Server/Prisma 7 Express and Fastify pass Ultracite/Oxlint/Oxfmt fix/check with TypeScript 7 in scenarios 506\u2013507.",requiredEvidence:["formatter, linter, build, and tests pass"],status:"certified"},{appliesTo:["none"],feature:"scalar-ui",id:"addon-scalar-swagger-todo-health-rate-prisma-sqlserver",kind:"addon",profiles:["prisma-sqlserver","prisma-sqlserver-fastify"],scenarios:["500-prisma-sqlserver-express-swagger-scalar-todo-health-rate-limit","501-prisma-sqlserver-fastify-swagger-scalar-todo-health-rate-limit"],reason:"SQL Server/Prisma 7 Express and Fastify serve the Scalar UI at `/docs` with Swagger and practical extras in scenarios 500\u2013501.",requiredEvidence:["OpenAPI and Scalar pages load at runtime"],status:"certified"},{appliesTo:["none"],feature:"nestjs-zod",id:"addon-nestjs-zod-prisma-sqlserver-express",kind:"addon",profiles:["prisma-sqlserver"],scenarios:["508-prisma-sqlserver-express-full-stack-normal-compiler"],reason:"SQL Server/Prisma 7 Express rejects malformed todo DTOs and documents valid routes in scenario 508's full runtime bundle.",requiredEvidence:["malformed DTO rejection and OpenAPI validation"],status:"certified"},{appliesTo:["none"],feature:"nestjs-zod",id:"addon-nestjs-zod-prisma-sqlserver-fastify",kind:"addon",profiles:["prisma-sqlserver-fastify"],scenarios:["509-prisma-sqlserver-fastify-full-stack-normal-compiler"],reason:"SQL Server/Prisma 7 Fastify rejects malformed todo DTOs and documents valid routes in scenario 509's full runtime bundle.",requiredEvidence:["malformed DTO rejection and OpenAPI validation"],status:"certified"},{appliesTo:["none"],feature:"scalar-ui",id:"addon-scalar-prisma-sqlserver-express",kind:"addon",profiles:["prisma-sqlserver"],scenarios:["492-prisma-sqlserver-express-swagger-scalar"],reason:"Prisma 7 SQL Server Express REST checks the Scalar UI and its generated OpenAPI document through E2E and compiled runtime probes in scenario 492.",requiredEvidence:["OpenAPI and Scalar pages load at runtime"],status:"certified"},{appliesTo:["none"],feature:"scalar-ui",id:"addon-scalar-prisma-sqlserver-fastify",kind:"addon",profiles:["prisma-sqlserver-fastify"],scenarios:["493-prisma-sqlserver-fastify-swagger-scalar"],reason:"Prisma 7 SQL Server Fastify REST checks the Scalar UI and its generated OpenAPI document through E2E and compiled runtime probes in scenario 493.",requiredEvidence:["OpenAPI and Scalar pages load at runtime"],status:"certified"},{appliesTo:["none"],feature:"agent-skills",id:"addon-agent-skills-prisma-sqlserver-express",kind:"addon",profiles:["prisma-sqlserver"],scenarios:["488-prisma-sqlserver-express-agent-skills"],reason:"Prisma 7 SQL Server Express REST checks clean skill installation, generated files, and content hashes in scenario 488.",requiredEvidence:["skill files and content hashes are verified"],status:"certified"},{appliesTo:["none"],feature:"agent-skills",id:"addon-agent-skills-prisma-sqlserver-fastify",kind:"addon",profiles:["prisma-sqlserver-fastify"],scenarios:["489-prisma-sqlserver-fastify-agent-skills"],reason:"Prisma 7 SQL Server Fastify REST checks clean skill installation, generated files, and content hashes in scenario 489.",requiredEvidence:["skill files and content hashes are verified"],status:"certified"},{appliesTo:["none"],feature:"ultracite",id:"addon-ultracite-prisma-sqlserver-express",kind:"addon",profiles:["prisma-sqlserver"],scenarios:["484-prisma-sqlserver-express-ultracite"],reason:"Prisma 7 SQL Server Express REST passes clean install, migrations, build, unit/E2E, and Ultracite/Oxlint/Oxfmt checks in scenario 484.",requiredEvidence:["format, lint, migrations, build, and tests pass"],status:"certified"},{appliesTo:["none"],feature:"ultracite",id:"addon-ultracite-prisma-sqlserver-fastify",kind:"addon",profiles:["prisma-sqlserver-fastify"],scenarios:["485-prisma-sqlserver-fastify-ultracite"],reason:"Prisma 7 SQL Server Fastify REST passes clean install, migrations, build, unit/E2E, and Ultracite/Oxlint/Oxfmt checks in scenario 485.",requiredEvidence:["format, lint, migrations, build, and tests pass"],status:"certified"},{appliesTo:["none"],feature:"husky",id:"addon-husky-prisma-sqlserver-express",kind:"addon",profiles:["prisma-sqlserver"],scenarios:["486-prisma-sqlserver-express-husky"],reason:"Prisma 7 SQL Server Express REST passes migrations, build, tests, and both successful and intentionally failing pre-commit hook checks in scenario 486.",requiredEvidence:["passing commit succeeds; failing check blocks commit"],status:"certified"},{appliesTo:["none"],feature:"husky",id:"addon-husky-prisma-sqlserver-fastify",kind:"addon",profiles:["prisma-sqlserver-fastify"],scenarios:["487-prisma-sqlserver-fastify-husky"],reason:"Prisma 7 SQL Server Fastify REST passes migrations, build, tests, and both successful and intentionally failing pre-commit hook checks in scenario 487.",requiredEvidence:["passing commit succeeds; failing check blocks commit"],status:"certified"},{appliesTo:[],feature:"ultracite",id:"addon-ultracite-microservices",kind:"addon",profiles:["microservice-grpc","microservice-redis","microservice-mqtt","microservice-nats","microservice-rabbitmq","microservice-kafka"],scenarios:["332-microservice-grpc-certified","333-microservice-redis-certified","334-microservice-mqtt-certified","335-microservice-nats-certified","336-microservice-rabbitmq-certified","337-microservice-kafka-certified","321-microservice-redis-ultracite","322-microservice-mqtt-ultracite","323-microservice-nats-ultracite","324-microservice-rabbitmq-ultracite","325-microservice-kafka-ultracite","326-microservice-grpc-ultracite",...Array.from({length:24},(e,t)=>{const s=338+t,r=["grpc","redis","mqtt","nats","rabbitmq","kafka"][t%6],a=["biome","eslint-prettier-stylelint","eslint-prettier-no-stylelint","oxlint-oxfmt"][Math.floor(t/6)];return`${s}-microservice-${r}-${a}`}),...Array.from({length:6},(e,t)=>{const s=362+t,r=["grpc","redis","mqtt","nats","rabbitmq","kafka"][t];return`${s}-microservice-${r}-biome-ultracite`}),...Array.from({length:6},(e,t)=>{const s=374+t,r=["grpc","redis","mqtt","nats","rabbitmq","kafka"][t];return`${s}-microservice-${r}-husky-ultracite`}),...Array.from({length:6},(e,t)=>{const s=374+t,r=["grpc","redis","mqtt","nats","rabbitmq","kafka"][t];return`${s}-microservice-${r}-husky-ultracite`})],reason:"All six base transport profiles passed runtime certification in scenarios 332\u2013337. Each transport passed with Biome, ESLint/Prettier with and without Stylelint, and Oxlint/Oxfmt in scenarios 338\u2013361. Oxlint/Oxfmt and Biome Ultracite profiles passed pre-format lint and formatted checks in scenarios 321\u2013326 and 362\u2013367. The full selected Husky + Oxlint/Oxfmt Ultracite bundle, including all editor/agent/hook choices and skill installation, passed in scenarios 374\u2013379.",requiredEvidence:["pre-format lint and post-format checks pass","Husky accepts a passing commit and rejects a failing check","selected Ultracite editor, agent, hook, and skill integrations are valid","Husky accepts a passing commit and rejects a failing check","selected Ultracite editor, agent, hook, and skill files are valid","broker event delivery reaches its handler","compiled application serves independent protocol requests","runtime shutdown completes"],status:"certified"},{appliesTo:["none"],feature:"agent-skills",id:"addon-agent-skills-prisma-rest-trpc",profiles:["prisma-trpc"],scenarios:["479-prisma-rest-trpc-agent-skills","446-prisma-rest-trpc-todo-agent-skills","450-prisma-rest-trpc-agent-skills-ultracite","451-prisma-rest-trpc-agent-skills-husky","452-prisma-rest-trpc-agent-skills-husky-ultracite"],kind:"addon",reason:"Non-interactive skill installation preserved generated code and verified skill files and lock hashes on Prisma 7 PostgreSQL REST+tRPC, with and without extras and in the tested Ultracite/Husky bundles (scenarios 446, 450\u2013452, and 479).",requiredEvidence:["installation is non-interactive","project code is untouched"],status:"certified"},{appliesTo:["none"],feature:"agent-skills",id:"addon-agent-skills-prisma-rest",kind:"addon",profiles:["prisma"],scenarios:["456-prisma-rest-agent-skills"],reason:"Prisma 7 REST skill installation, generated files, and content hashes pass scenario 456.",requiredEvidence:["skill files and content hashes are verified"],status:"certified"},{appliesTo:["none"],feature:"scalar-ui",id:"addon-scalar-prisma-rest",kind:"addon",profiles:["prisma"],scenarios:["461-prisma-rest-swagger-scalar"],reason:"Prisma 7 REST OpenAPI and Scalar UI pass scenario 461.",requiredEvidence:["OpenAPI document and Scalar page load"],status:"certified"},{appliesTo:["none"],feature:"nestjs-zod",id:"addon-nestjs-zod-prisma-rest",kind:"addon",profiles:["prisma"],scenarios:["462-prisma-rest-nestjs-zod-swagger-todo"],reason:"Prisma 7 REST rejects malformed DTOs and documents valid todo routes in scenario 462.",requiredEvidence:["malformed DTO rejection and OpenAPI validation"],status:"certified"},{appliesTo:["none"],feature:"nestjs-zod",id:"addon-nestjs-zod-scalar-prisma-rest",kind:"addon",profiles:["prisma"],scenarios:["463-prisma-rest-nestjs-zod-swagger-scalar-todo"],reason:"Prisma 7 REST validation, Swagger and Scalar UI pass together in scenario 463.",requiredEvidence:["malformed DTO rejection, OpenAPI, and Scalar UI"],status:"certified"},{appliesTo:["none"],feature:"ultracite",id:"addon-ultracite-prisma-rest",kind:"addon",profiles:["prisma"],scenarios:["454-prisma-rest-ultracite"],reason:"Prisma 7 REST passes Ultracite formatting, checks, build, and runtime tests in scenario 454.",requiredEvidence:["format, lint, build, and tests pass"],status:"certified"},{appliesTo:["none"],feature:"ultracite",id:"addon-ultracite-prisma-typescript-7",kind:"addon",profiles:["prisma"],scenarios:["465-prisma-rest-typescript-7-ultracite"],reason:"Prisma 7 REST with TypeScript 7 passes Ultracite checks, build and tests in scenario 465.",requiredEvidence:["format, lint, build, and tests pass"],status:"certified"},{appliesTo:F,feature:"agent-skills",id:"addon-agent-skills-auth",profiles:["better-auth-prisma","better-auth-drizzle-postgres","passport-drizzle-postgres","passport-typeorm-postgres","passport-prisma-mongo"],scenarios:["210-passport-drizzle-agent-skills","211-passport-drizzle-agent-skills-ultracite","212-better-auth-prisma-agent-skills","213-passport-typeorm-agent-skills","214-better-auth-drizzle-agent-skills","316-passport-prisma-mongo-agent-skills"],kind:"addon",reason:"Skill installation, generated files, and lock hashes passed on the exact Better Auth/Passport profiles listed (scenarios 210\u2013214 and 316).",requiredEvidence:["installation is non-interactive","project code is untouched"],status:"certified"},{appliesTo:F,feature:"husky",id:"addon-husky-auth",kind:"addon",profiles:["better-auth-prisma","passport-prisma","passport-prisma-mongo","passport-typeorm-postgres","passport-drizzle-postgres","passport-typeorm-mysql","passport-typeorm-sqlite","passport-drizzle-mysql","passport-drizzle-sqlite"],scenarios:["162-better-auth-prisma-husky","163-passport-prisma-husky","167-better-auth-prisma-husky-ultracite","173-passport-prisma-husky-ultracite","192-passport-typeorm-husky-ultracite","193-passport-drizzle-husky-ultracite","215-passport-typeorm-mysql-husky-ultracite","216-passport-typeorm-sqlite-husky-ultracite","217-passport-drizzle-mysql-husky-ultracite","218-passport-drizzle-sqlite-husky-ultracite","314-passport-prisma-mongo-husky"],reason:"Git-enabled and git-disabled creation plus successful and intentionally failing hooks passed for the exact Better Auth/Passport SQL REST profiles and Passport Prisma 6 MongoDB (scenarios 162\u2013163, 167, 173, 192\u2013193, 215\u2013218, and 314\u2013315). Other profiles remain gated.",requiredEvidence:["git-enabled and git-disabled creation","successful and failing hook execution"],status:"certified"},{appliesTo:["none"],feature:"husky",id:"addon-husky-prisma-rest-trpc",kind:"addon",profiles:["prisma-trpc"],scenarios:["445-prisma-rest-trpc-todo-husky","480-prisma-rest-trpc-husky","448-prisma-rest-trpc-husky-ultracite","451-prisma-rest-trpc-agent-skills-husky","452-prisma-rest-trpc-agent-skills-husky-ultracite"],reason:"Git hooks pass successful commits and block failing checks on Prisma 7 REST+tRPC, with and without todo or other addons (scenarios 445, 448, 451\u2013452, and 480).",requiredEvidence:["passing commit succeeds","failing check blocks commit"],status:"certified"},{appliesTo:["none"],feature:"husky",id:"addon-husky-prisma-rest",kind:"addon",profiles:["prisma"],scenarios:["455-prisma-rest-husky"],reason:"Prisma 7 REST Husky accepts a passing commit and blocks a failing hook in scenario 455.",requiredEvidence:["passing and failing hook behavior is tested"],status:"certified"},{appliesTo:F,feature:"ultracite",id:"addon-ultracite-auth",kind:"addon",profiles:["better-auth-prisma","passport-prisma","passport-typeorm-postgres","passport-drizzle-postgres","passport-drizzle-graphql","passport-prisma-mongo"],scenarios:["157-better-auth-prisma-ultracite","166-passport-prisma-ultracite","190-passport-typeorm-postgres-ultracite","191-passport-drizzle-postgres-ultracite","133-passport-drizzle-graphql-ultracite","313-passport-prisma-mongo-ultracite","315-passport-prisma-mongo-husky-ultracite","317-passport-prisma-mongo-agent-skills-ultracite"],reason:"Generated Better Auth and Passport files pass Ultracite formatting, clean checks, build, unit tests, and runtime tests for the listed Prisma, TypeORM, and Drizzle profiles, including Passport Prisma 6 MongoDB bundles (scenarios 133, 157, 166, 190\u2013191, 313, 315, and 317). Other profiles remain gated.",requiredEvidence:["formatting preserves behavior","auth schema generation then format/build/test passes"],status:"certified"},{appliesTo:["none"],feature:"ultracite",id:"addon-ultracite-prisma-rest-trpc",kind:"addon",profiles:["prisma-trpc"],scenarios:["447-prisma-rest-trpc-ultracite","448-prisma-rest-trpc-husky-ultracite","450-prisma-rest-trpc-agent-skills-ultracite","452-prisma-rest-trpc-agent-skills-husky-ultracite"],reason:"Ultracite format and check passes on clean Prisma REST+tRPC projects, including the certified Husky/skills bundles listed (scenarios 447\u2013448, 450, and 452).",requiredEvidence:["formatting preserves behavior","final lint/build/tests pass"],status:"certified"},{appliesTo:["none"],feature:"ultracite",id:"addon-ultracite-prisma-rest-trpc-typescript-7",kind:"addon",profiles:["prisma-trpc"],scenarios:["474-prisma-rest-trpc-typescript-7-ultracite"],reason:"Prisma 7 REST+tRPC with TypeScript 7 passes Ultracite checks, build, and tests in scenario 474.",requiredEvidence:["format, lint, build, and tests pass"],status:"certified"},{appliesTo:["none"],feature:"scalar-ui",id:"addon-scalar-prisma-rest-trpc",kind:"addon",profiles:["prisma-trpc"],scenarios:["475-prisma-rest-trpc-swagger-scalar"],reason:"Prisma 7 REST+tRPC OpenAPI and Scalar UI pass scenario 475.",requiredEvidence:["OpenAPI document and Scalar page load"],status:"certified"},{appliesTo:["none"],feature:"nestjs-zod",id:"addon-nestjs-zod-prisma-rest-trpc",kind:"addon",profiles:["prisma-trpc"],scenarios:["476-prisma-rest-trpc-nestjs-zod-swagger-todo"],reason:"Prisma 7 REST+tRPC DTO validation, Swagger, and todo checks pass scenario 476.",requiredEvidence:["invalid DTO rejection and generated OpenAPI"],status:"certified"},{appliesTo:["none"],feature:"nestjs-zod",id:"addon-nestjs-zod-scalar-prisma-rest-trpc",kind:"addon",profiles:["prisma-trpc"],scenarios:["477-prisma-rest-trpc-nestjs-zod-swagger-scalar-todo"],reason:"Prisma 7 REST+tRPC DTO validation, OpenAPI, and Scalar pass scenario 477.",requiredEvidence:["invalid DTO rejection, OpenAPI, and Scalar UI"],status:"certified"},{appliesTo:["none"],feature:"agent-skills",id:"addon-agent-skills-prisma-rest-trpc-standalone",kind:"addon",profiles:["prisma-trpc"],scenarios:["479-prisma-rest-trpc-agent-skills"],reason:"Agent skills install without feature extras on Prisma 7 REST+tRPC in scenario 479.",requiredEvidence:["skill files and content hashes are verified"],status:"certified"},{appliesTo:["none"],feature:"husky",id:"addon-husky-prisma-rest-trpc-standalone",kind:"addon",profiles:["prisma-trpc"],scenarios:["480-prisma-rest-trpc-husky"],reason:"Husky accepts passing commits and blocks deliberately failing checks on Prisma REST+tRPC in scenario 480.",requiredEvidence:["passing and failing pre-commit behavior is tested"],status:"certified"},{appliesTo:F,feature:"scalar-ui",id:"addon-scalar-auth",kind:"addon",profiles:["better-auth-prisma","passport-prisma","passport-prisma-mongo","passport-typeorm-postgres","passport-drizzle-postgres","passport-typeorm-mysql","passport-typeorm-sqlite","passport-drizzle-mysql","passport-drizzle-sqlite"],scenarios:["158-better-auth-prisma-swagger-scalar","159-passport-prisma-swagger-scalar","311-passport-prisma-mongo-swagger-scalar","194-passport-typeorm-swagger-scalar","195-passport-drizzle-swagger-scalar","202-passport-typeorm-mysql-swagger-scalar","203-passport-typeorm-sqlite-swagger-scalar","204-passport-drizzle-mysql-swagger-scalar","205-passport-drizzle-sqlite-swagger-scalar"],reason:"Authenticated Scalar pages passed for the exact Better Auth Prisma, Passport Prisma and Prisma 6 MongoDB, and Passport TypeORM/Drizzle REST profiles listed across PostgreSQL, MongoDB, MySQL, and SQLite (scenarios 158\u2013159, 194\u2013205, and 311). Broader profiles remain gated.",requiredEvidence:["schema loads","bearer and cookie auth configured"],status:"certified"},{appliesTo:F,feature:"nestjs-zod",id:"addon-nestjs-zod-auth",kind:"addon",profiles:["better-auth-prisma","passport-prisma","passport-prisma-mongo","passport-typeorm-postgres","passport-drizzle-postgres","passport-typeorm-mysql","passport-typeorm-sqlite","passport-drizzle-mysql","passport-drizzle-sqlite"],scenarios:["160-better-auth-prisma-nestjs-zod-swagger-todo","161-passport-prisma-nestjs-zod-swagger-todo","196-passport-typeorm-nestjs-zod-swagger-todo","197-passport-drizzle-nestjs-zod-swagger-todo","206-passport-typeorm-mysql-nestjs-zod-swagger-todo","207-passport-typeorm-sqlite-nestjs-zod-swagger-todo","208-passport-drizzle-mysql-nestjs-zod-swagger-todo","209-passport-drizzle-sqlite-nestjs-zod-swagger-todo","318-passport-prisma-mongo-nestjs-zod-swagger-todo"],reason:"Peer resolution, invalid DTO rejection, Swagger generation, authentication, and todo ownership passed for the exact Better Auth Prisma and Passport TypeORM/Drizzle REST profiles listed across PostgreSQL, MySQL, and SQLite, plus Passport Prisma 6 MongoDB (scenarios 160\u2013161, 196\u2013209, and 318). Other auth/API profiles remain gated.",requiredEvidence:["peer dependencies resolve","invalid requests rejected","swagger integration works"],status:"certified"},{appliesTo:[],feature:"husky",id:"addon-husky-microservices",kind:"addon",profiles:["microservice-grpc","microservice-redis","microservice-mqtt","microservice-nats","microservice-rabbitmq","microservice-kafka"],scenarios:["374-microservice-grpc-husky-ultracite","375-microservice-redis-husky-ultracite","376-microservice-mqtt-husky-ultracite","377-microservice-nats-husky-ultracite","378-microservice-rabbitmq-husky-ultracite","379-microservice-kafka-husky-ultracite"],reason:"Husky passed both clean and deliberately failing pre-commit checks with the complete selected Ultracite integration bundle for all six transport profiles in scenarios 374\u2013379.",requiredEvidence:["passing commit succeeds","failing formatter check blocks commit","transport runtime remains valid"],status:"certified"}],Ko=[{features:["auth","agent-skills","docker","health-check","husky","nestjs-zod","rate-limiting","scalar-ui","swagger","todo-example","typescript-7","ultracite"],id:"combined-better-auth-prisma-zod-full-feature-bundle",profiles:["better-auth-prisma"],reason:"Better Auth Prisma with nestjs-zod passed full generated-project and Docker runtime checks, including invalid DTO rejection.",scenarios:["better-auth-prisma-postgresql-zod-full-feature-bundle"],status:"certified"},{features:["auth","agent-skills","docker","health-check","husky","rate-limiting","scalar-ui","swagger","todo-example","typescript-7","ultracite"],id:"combined-better-auth-prisma-docker-express-full-feature-bundle",profiles:["better-auth-prisma-docker"],reason:"Better Auth Prisma Docker passed authenticated Docker signup, session, and persisted todo runtime checks.",scenarios:["better-auth-prisma-docker-rest-full-feature-bundle"],status:"certified"},...["grpc","kafka","mqtt","nats","rabbitmq","redis"].map(e=>{const t=`microservice-${e}`,s=`${t}-http-full-feature-bundle`;return{features:["agent-skills","docker","health-check","husky","rate-limiting","scalar-ui","swagger","todo-example","typescript-7","ultracite"],id:`combined-${s}`,profiles:[t],reason:`${e} microservice full-feature runtime bundle certified its transport together with HTTP todo CRUD, health, rate limiting, Swagger/Scalar, Docker, Husky, Agent Skills, TypeScript 7, and Ultracite.`,scenarios:[s],status:"certified"}}),...[["better-auth-native-postgres","express"],["better-auth-native-postgres-trpc","express"],["better-auth-native-postgres-fastify","fastify"],["better-auth-native-postgres-fastify-trpc","fastify"]].map(([e,t])=>{const s=`${e}-rest-full-feature-bundle`;return{features:["auth","agent-skills","docker","health-check","husky","rate-limiting","scalar-ui","swagger","todo-example","typescript-7","ultracite"],id:`combined-${e}-full-feature-bundle`,profiles:[e],reason:`Better Auth native PostgreSQL ${t} passed protected todo E2E and Docker, docs, throttling, hooks, skills, and lint checks.`,scenarios:[s],status:"certified"}}),...[["better-auth-drizzle-graphql","postgresql","express"],["better-auth-drizzle-graphql-fastify","postgresql","fastify"],["better-auth-drizzle-graphql-mysql","mysql","express"],["better-auth-drizzle-graphql-mysql-fastify","mysql","fastify"],["better-auth-drizzle-graphql-sqlite","sqlite","express"],["better-auth-drizzle-graphql-sqlite-fastify","sqlite","fastify"]].map(([e,t,s])=>{const r=`better-auth-drizzle-graphql-${t}-${s}-full-feature-bundle`;return{features:["auth","agent-skills","docker","health-check","husky","rate-limiting","scalar-ui","swagger","todo-example","typescript-7","ultracite"],id:`combined-${e}-full-feature-bundle`,profiles:[e],reason:`Better Auth Drizzle GraphQL ${t} ${s} passed authenticated todo E2E and full Docker, docs, throttling, skills, hook, and lint checks.`,scenarios:[r],status:"certified"}}),...[["passport-drizzle-graphql","postgresql","express"],["passport-drizzle-graphql-fastify","postgresql","fastify"],["passport-drizzle-graphql-mysql","mysql","express"],["passport-drizzle-graphql-mysql-fastify","mysql","fastify"],["passport-drizzle-graphql-sqlite","sqlite","express"],["passport-drizzle-graphql-sqlite-fastify","sqlite","fastify"]].map(([e,t,s])=>{const r=`passport-drizzle-graphql-${t}-${s}-full-feature-bundle`;return{features:["auth","agent-skills","docker","health-check","husky","rate-limiting","scalar-ui","swagger","todo-example","typescript-7","ultracite"],id:`combined-${e}-full-feature-bundle`,profiles:[e],reason:`Passport Drizzle GraphQL ${t} ${s} passed authenticated todo E2E and full Docker, docs, throttling, skills, hook, and lint checks.`,scenarios:[r],status:"certified"}}),{features:["auth","agent-skills","docker","health-check","husky","rate-limiting","scalar-ui","swagger","todo-example","typescript-7","ultracite"],id:"combined-better-auth-prisma-graphql-full-feature-bundle",profiles:["better-auth-prisma-graphql"],reason:"Better Auth Prisma GraphQL passed full generated-project and Docker runtime checks, including authenticated GraphQL todo ownership.",scenarios:["better-auth-prisma-graphql-full-feature-bundle"],status:"certified"},{features:["auth","agent-skills","docker","health-check","husky","rate-limiting","scalar-ui","swagger","todo-example","typescript-7","ultracite"],id:"combined-passport-prisma-postgresql-graphql-full-feature-bundle",profiles:["passport-prisma-graphql"],reason:"Passport Prisma 7 GraphQL passed owner-isolated todo E2E and full Docker, docs, throttling, skills, hook, and lint checks.",scenarios:["passport-prisma-postgresql-graphql-full-feature-bundle"],status:"certified"},{features:["auth","agent-skills","docker","health-check","husky","rate-limiting","scalar-ui","swagger","todo-example","typescript-7","ultracite"],id:"combined-passport-prisma-docker-express-full-feature-bundle",profiles:["passport-prisma-docker"],reason:"Passport Prisma Docker preset passed protected todo CRUD and full Docker, docs, throttling, skills, hook, and lint checks.",scenarios:["passport-prisma-docker-rest-full-feature-bundle"],status:"certified"},{features:["auth","agent-skills","docker","health-check","husky","rate-limiting","scalar-ui","swagger","todo-example","typescript-7","ultracite"],id:"combined-better-auth-prisma-postgresql-express-full-feature-bundle",profiles:["better-auth-prisma"],reason:"Better Auth Prisma 7 PostgreSQL Express REST passed protected todo CRUD and full Docker, docs, throttling, skills, hook, and lint checks.",scenarios:["better-auth-prisma-postgresql-rest-full-feature-bundle"],status:"certified"},{features:["auth","agent-skills","docker","health-check","husky","nestjs-zod","rate-limiting","scalar-ui","swagger","todo-example","typescript-7","ultracite"],id:"combined-passport-prisma-postgresql-express-full-feature-bundle",profiles:["passport-prisma"],reason:"Passport Prisma 7 PostgreSQL Express REST passed authenticated TODO CRUD and full Docker, docs, throttling, skills, hook, and lint checks.",scenarios:["passport-prisma-postgresql-rest-full-feature-bundle"],status:"certified"},{features:["auth","agent-skills","docker","health-check","husky","rate-limiting","scalar-ui","swagger","todo-example","typescript-7","ultracite"],id:"combined-passport-external-identity-full-feature-bundle",profiles:["passport-external-identity"],reason:"Passport external identity REST passed validated OIDC JWT auth, owner-isolated todo CRUD, and full Docker, docs, throttling, hooks, skills, and lint checks.",scenarios:["passport-external-identity-rest-full-feature-bundle"],status:"certified"},...[["better-auth-drizzle-trpc","express"],["better-auth-drizzle-fastify-trpc","fastify"]].map(([e,t])=>{const s=`better-auth-drizzle-sqlite${t==="fastify"?"-fastify":""}-rest-trpc-full-feature-bundle`;return{features:["auth","agent-skills","docker","health-check","husky","rate-limiting","scalar-ui","swagger","todo-example","typescript-7","ultracite"],id:`combined-better-auth-drizzle-sqlite-${t}-trpc-full-feature-bundle`,profiles:[e],reason:`Runtime scenario ${s} passed Better Auth Drizzle SQLite ${t} REST+tRPC full feature integration and Docker probes.`,scenarios:[s],status:"certified"}}),...[["better-auth-typeorm-mysql-trpc","better-auth","typeorm","mysql","express"],["better-auth-typeorm-mysql-fastify-trpc","better-auth","typeorm","mysql","fastify"],["passport-typeorm-mysql-trpc","passport","typeorm","mysql","express"],["passport-typeorm-mysql-fastify-trpc","passport","typeorm","mysql","fastify"],["better-auth-typeorm-sqlite-trpc","better-auth","typeorm","sqlite","express"],["better-auth-typeorm-sqlite-fastify-trpc","better-auth","typeorm","sqlite","fastify"],["passport-typeorm-sqlite-trpc","passport","typeorm","sqlite","express"],["passport-typeorm-sqlite-fastify-trpc","passport","typeorm","sqlite","fastify"],["better-auth-drizzle-mysql-trpc","better-auth","drizzle","mysql","express"],["better-auth-drizzle-mysql-fastify-trpc","better-auth","drizzle","mysql","fastify"],["passport-drizzle-mysql-trpc","passport","drizzle","mysql","express"],["passport-drizzle-mysql-fastify-trpc","passport","drizzle","mysql","fastify"],["passport-drizzle-sqlite-trpc","passport","drizzle","sqlite","express"],["passport-drizzle-sqlite-fastify-trpc","passport","drizzle","sqlite","fastify"]].map(([e,t,s,r,a])=>{const i=`${t}-${s}-${r}${a==="fastify"?"-fastify":""}-rest-trpc-full-feature-bundle`;return{features:["auth","agent-skills","docker","health-check","husky","rate-limiting","scalar-ui","swagger","todo-example","typescript-7","ultracite"],id:`combined-${t}-${s}-${r}-${a}-trpc-full-feature-bundle`,profiles:[e],reason:`Runtime scenario ${i} passed the authenticated ${s} ${r} ${a} REST+tRPC full feature pipeline.`,scenarios:[i],status:"certified"}}),...[["better-auth-typeorm-postgres-trpc","better-auth","typeorm","express"],["better-auth-typeorm-postgres-fastify-trpc","better-auth","typeorm","fastify"],["passport-typeorm-postgres-trpc","passport","typeorm","express"],["passport-typeorm-postgres-fastify-trpc","passport","typeorm","fastify"],["better-auth-drizzle-postgres-trpc","better-auth","drizzle","express"],["better-auth-drizzle-postgres-fastify-trpc","better-auth","drizzle","fastify"],["passport-drizzle-postgres-trpc","passport","drizzle","express"],["passport-drizzle-postgres-fastify-trpc","passport","drizzle","fastify"]].map(([e,t,s,r])=>{const a=`${t}-${s}-postgresql${r==="fastify"?"-fastify":""}-rest-trpc-full-feature-bundle`;return{features:["auth","agent-skills","docker","health-check","husky","rate-limiting","scalar-ui","swagger","todo-example","typescript-7","ultracite"],id:`combined-${t}-${s}-postgresql-${r}-rest-trpc-full-feature-bundle`,profiles:[e],reason:`Runtime scenario ${a} passed the authenticated ${s} PostgreSQL ${r} REST+tRPC full feature pipeline.`,scenarios:[a],status:"certified"}}),...[["graphql-drizzle","none","postgresql","express"],["graphql-drizzle-fastify","none","postgresql","fastify"],["graphql-drizzle-mysql","none","mysql","express"],["graphql-drizzle-mysql-fastify","none","mysql","fastify"],["graphql-drizzle-sqlite","none","sqlite","express"],["graphql-drizzle-sqlite-fastify","none","sqlite","fastify"]].map(([e,t,s,r])=>{const a=`drizzle-graphql-${s}-${t}-${r}-health-rate`;return{features:["health-check","rate-limiting"],id:a,profiles:[e],reason:`Unauthenticated Drizzle GraphQL ${s} ${r} passed migrations, build, health readiness, and rate-limit E2E together.`,scenarios:[a],status:"certified"}}),...[["better-auth-drizzle-graphql","better-auth","postgresql","express"],["better-auth-drizzle-graphql-fastify","better-auth","postgresql","fastify"],["better-auth-drizzle-graphql-mysql","better-auth","mysql","express"],["better-auth-drizzle-graphql-mysql-fastify","better-auth","mysql","fastify"],["better-auth-drizzle-graphql-sqlite","better-auth","sqlite","express"],["better-auth-drizzle-graphql-sqlite-fastify","better-auth","sqlite","fastify"],["passport-drizzle-graphql","passport","postgresql","express"],["passport-drizzle-graphql-fastify","passport","postgresql","fastify"],["passport-drizzle-graphql-mysql","passport","mysql","express"],["passport-drizzle-graphql-mysql-fastify","passport","mysql","fastify"],["passport-drizzle-graphql-sqlite","passport","sqlite","express"],["passport-drizzle-graphql-sqlite-fastify","passport","sqlite","fastify"]].map(([e,t,s,r])=>{const a=`drizzle-graphql-${s}-${t}-${r}-health-rate`;return{features:["auth","health-check","rate-limiting"],id:a,profiles:[e],reason:`Drizzle GraphQL ${s} ${r} passed migrations, build, health readiness, and rate-limit E2E together.`,scenarios:[a],status:"certified"}}),...[["better-auth-drizzle-graphql","better-auth","postgresql","express"],["better-auth-drizzle-graphql-fastify","better-auth","postgresql","fastify"],["better-auth-drizzle-graphql-mysql","better-auth","mysql","express"],["better-auth-drizzle-graphql-mysql-fastify","better-auth","mysql","fastify"],["better-auth-drizzle-graphql-sqlite","better-auth","sqlite","express"],["better-auth-drizzle-graphql-sqlite-fastify","better-auth","sqlite","fastify"],["passport-drizzle-graphql","passport","postgresql","express"],["passport-drizzle-graphql-fastify","passport","postgresql","fastify"],["passport-drizzle-graphql-mysql","passport","mysql","express"],["passport-drizzle-graphql-mysql-fastify","passport","mysql","fastify"],["passport-drizzle-graphql-sqlite","passport","sqlite","express"],["passport-drizzle-graphql-sqlite-fastify","passport","sqlite","fastify"]].map(([e,t,s,r])=>{const a=`drizzle-graphql-${s}-${t}-${r}-rate-todo`;return{features:["auth","rate-limiting","todo-example"],id:a,profiles:[e],reason:`Drizzle GraphQL ${s} ${r} passed rate-limiting and todo ownership together in a clean generated-project runtime scenario.`,scenarios:[a],status:"certified"}}),...[["graphql-drizzle","none","postgresql","express"],["graphql-drizzle-fastify","none","postgresql","fastify"],["graphql-drizzle-mysql","none","mysql","express"],["graphql-drizzle-mysql-fastify","none","mysql","fastify"],["graphql-drizzle-sqlite","none","sqlite","express"],["graphql-drizzle-sqlite-fastify","none","sqlite","fastify"],["better-auth-drizzle-graphql","better-auth","postgresql","express"],["better-auth-drizzle-graphql-fastify","better-auth","postgresql","fastify"],["better-auth-drizzle-graphql-mysql","better-auth","mysql","express"],["better-auth-drizzle-graphql-mysql-fastify","better-auth","mysql","fastify"],["better-auth-drizzle-graphql-sqlite","better-auth","sqlite","express"],["better-auth-drizzle-graphql-sqlite-fastify","better-auth","sqlite","fastify"],["passport-drizzle-graphql","passport","postgresql","express"],["passport-drizzle-graphql-fastify","passport","postgresql","fastify"],["passport-drizzle-graphql-mysql","passport","mysql","express"],["passport-drizzle-graphql-mysql-fastify","passport","mysql","fastify"],["passport-drizzle-graphql-sqlite","passport","sqlite","express"],["passport-drizzle-graphql-sqlite-fastify","passport","sqlite","fastify"]].map(([e,t,s,r])=>{const a=`drizzle-graphql-${s}-${t}-${r}-health-todo`;return{features:[...t==="none"?[]:["auth"],"health-check","todo-example"],id:a,profiles:[e],reason:`Drizzle GraphQL ${s} ${r} ${t} health and todo passed clean migrations, build, and GraphQL E2E.`,scenarios:[a],status:"certified"}}),...[["better-auth","better-auth-prisma-graphql"],["passport","passport-prisma-graphql"]].map(([e,t])=>{const s=`${e}-prisma-postgresql-graphql-health-todo`;return{features:["auth","health-check","todo-example"],id:s,profiles:[t],reason:"Combined GraphQL health and authenticated todo ownership passed full generated-project runtime certification.",scenarios:[s],status:"certified"}}),...[["better-auth","better-auth-prisma-graphql"],["passport","passport-prisma-graphql"]].map(([e,t])=>{const s=`${e}-prisma-postgresql-graphql-rate-todo`;return{features:["auth","rate-limiting","todo-example"],id:s,profiles:[t],reason:"Combined GraphQL rate limiting and authenticated todo ownership passed full generated-project runtime certification.",scenarios:[s],status:"certified"}}),...[["better-auth-prisma-mysql-trpc","better-auth","mysql","express"],["better-auth-prisma-mysql-fastify-trpc","better-auth","mysql","fastify"],["better-auth-prisma-sqlite-trpc","better-auth","sqlite","express"],["better-auth-prisma-sqlite-fastify-trpc","better-auth","sqlite","fastify"],["passport-prisma-mysql-trpc","passport","mysql","express"],["passport-prisma-mysql-fastify-trpc","passport","mysql","fastify"],["passport-prisma-sqlite-trpc","passport","sqlite","express"],["passport-prisma-sqlite-fastify-trpc","passport","sqlite","fastify"]].map(([e,t,s,r])=>{const a=`${t}-prisma-${s}${r==="fastify"?"-fastify":""}-trpc-full-feature-bundle`;return{features:["auth","agent-skills","docker","health-check","husky",...t==="passport"?["nestjs-zod"]:[],"rate-limiting","scalar-ui","swagger","todo-example","typescript-7","ultracite"],id:`combined-${t}-prisma-${s}-${r}-trpc-full-feature-bundle`,profiles:[e],reason:`Runtime scenario ${a} passed authenticated Prisma 7 ${s} ${r} REST+tRPC full-feature integration and Docker probes.`,scenarios:[a],status:"certified"}}),...[["better-auth-prisma-mysql","better-auth","mysql","express"],["better-auth-prisma-mysql-fastify","better-auth","mysql","fastify"],["better-auth-prisma-sqlite","better-auth","sqlite","express"],["better-auth-prisma-sqlite-fastify","better-auth","sqlite","fastify"],["passport-prisma-mysql","passport","mysql","express"],["passport-prisma-mysql-fastify","passport","mysql","fastify"],["passport-prisma-sqlite","passport","sqlite","express"],["passport-prisma-sqlite-fastify","passport","sqlite","fastify"]].map(([e,t,s,r])=>{const a=`${t}-prisma-${s}${r==="fastify"?"-fastify":""}-rest-full-feature-bundle`;return{features:["auth","agent-skills","docker","health-check","husky",...t==="passport"?["nestjs-zod"]:[],"rate-limiting","scalar-ui","swagger","todo-example","typescript-7","ultracite"],id:`combined-${t}-prisma-${s}-${r}-full-feature-bundle`,profiles:[e],reason:`Runtime scenario ${a} passed the authenticated Prisma 7 ${s} ${r} REST full-feature integration and published Docker probes.`,scenarios:[a],status:"certified"}}),...[["better-auth-prisma-mongo","better-auth","express"],["better-auth-prisma-mongo-fastify","better-auth","fastify"],["passport-prisma-mongo","passport","express"],["passport-prisma-mongo-fastify","passport","fastify"]].map(([e,t,s])=>{const r=`${t}-prisma-mongodb${s==="fastify"?"-fastify":""}-rest-full-feature-bundle`;return{features:["auth","agent-skills","docker","health-check","husky",...t==="passport"&&s==="express"?["nestjs-zod"]:[],"rate-limiting","scalar-ui","swagger","todo-example","typescript-7","ultracite"],id:`combined-${t}-prisma-mongodb-${s}-full-feature-bundle`,profiles:[e],reason:`Runtime scenario ${r} passed the authenticated Prisma 6 MongoDB ${s} REST full-feature integration and published Docker probes.`,scenarios:[r],status:"certified"}}),...[["better-auth-prisma-mongo-trpc","better-auth","express"],["better-auth-prisma-mongo-fastify-trpc","better-auth","fastify"],["passport-prisma-mongo-trpc","passport","express"],["passport-prisma-mongo-fastify-trpc","passport","fastify"]].map(([e,t,s])=>{const r=`${t}-prisma-mongodb${s==="fastify"?"-fastify":""}-trpc-full-feature-bundle`;return{features:["auth","agent-skills","docker","health-check","husky","rate-limiting","scalar-ui","swagger","todo-example","typescript-7","ultracite"],id:`combined-${t}-prisma-mongodb-${s}-trpc-full-feature-bundle`,profiles:[e],reason:`Runtime scenario ${r} passed authenticated Prisma 6 MongoDB ${s} REST+tRPC full-feature integration and published Docker probes.`,scenarios:[r],status:"certified"}}),...Bo.map(([e,t,s])=>{const r=`${t}-${s}-fastify-rest-full-feature-bundle`;return{features:["agent-skills","docker","health-check","husky","nestjs-zod","rate-limiting","scalar-ui","swagger","todo-example","typescript-7","ultracite"],id:`combined-none-${t}-${s}-fastify-full-feature-bundle`,profiles:[e],reason:`Runtime scenario ${r} passed the unauthenticated Fastify full-feature integration, including database, Docker probes, docs, throttling, hooks, skills, and linting.`,scenarios:[r],status:"certified"}}),...Mo.map(([e,t])=>{const s=`${t}-prisma-postgresql-fastify-rest-full-feature-bundle`;return{features:["agent-skills",...t==="none"?[]:["auth"],"docker","health-check",...t==="passport"||t==="none"?["nestjs-zod"]:[],"rate-limiting","scalar-ui","swagger","todo-example","typescript-7","ultracite","husky"],id:`combined-${t}-prisma-postgresql-fastify-full-feature-bundle`,profiles:[e],reason:`Runtime scenario ${s} certifies Prisma 7 PostgreSQL Fastify and its auth-specific full-feature stack.`,scenarios:[s],status:"certified"}}),...No.map(([e,t,s])=>{const r=`none-prisma-${t}-fastify-rest-full-feature-bundle`;return{features:["agent-skills","docker","health-check","husky","nestjs-zod","rate-limiting","scalar-ui","swagger","todo-example","typescript-7","ultracite"],id:`combined-none-prisma-${t}-fastify-full-feature-bundle`,profiles:[e],reason:`Runtime scenario ${r} ${s?"certifies":"is pending to certify"} Prisma 7 ${t} Fastify REST and its evidence-scoped feature subsets.`,scenarios:[r],status:s?"certified":"implemented"}}),...Go.map(([e,t,s,r])=>{const a=`${t}-prisma-postgresql${s==="fastify"?"-fastify":""}-trpc-full-feature-bundle`;return{features:["agent-skills",...t==="none"?[]:["auth"],"docker","health-check",...t==="passport"||t==="none"?["nestjs-zod"]:[],"rate-limiting","scalar-ui","swagger","todo-example","typescript-7","ultracite","husky"],id:`combined-${t}-prisma-postgresql-${s}-trpc-full-feature-bundle`,profiles:[e],reason:`Runtime scenario ${a} ${r?"certifies":"is scheduled to certify"} the Prisma 7 PostgreSQL ${s} ${t} REST+tRPC full-feature integration.`,scenarios:[a],status:r?"certified":"implemented"}}),...Vo.map(([e,t,s,r])=>{const a=`${t}-${s}-${r}-fastify-rest-full-feature-bundle`;return{features:["agent-skills","auth","docker","health-check",...t==="passport"?["nestjs-zod"]:[],"rate-limiting","scalar-ui","swagger","todo-example","typescript-7","ultracite","husky"],id:`combined-${t}-${s}-${r}-fastify-full-feature-bundle`,profiles:[e],reason:`Runtime scenario ${a} passed the authenticated Fastify REST full-feature pipeline, including auth ownership, Docker probes, docs, throttling, hooks, skills, and linting.`,scenarios:[a],status:"certified"}}),...Ds.map(([e,t,s,r])=>{const a=`${t}-${s}-sqlserver-${r}-rest-full-feature-bundle`;return{features:["auth","docker","health-check",...t==="passport"?["nestjs-zod"]:[],"rate-limiting","scalar-ui","swagger","todo-example","typescript-7","ultracite","husky"],id:`combined-${t}-${s}-sqlserver-${r}-full-feature-bundle`,profiles:[e],reason:`Runtime scenario ${a} passed the complete authenticated SQL Server project pipeline and published-port probes.`,scenarios:[a],status:"certified"}}),{features:["auth","docker","health-check","nestjs-zod","rate-limiting","scalar-ui","swagger","todo-example","typescript-7","ultracite","husky"],id:"combined-passport-prisma-sqlserver-fastify-full-feature-bundle",profiles:["passport-prisma-sqlserver-fastify"],reason:"Clean pnpm run passed Prisma 7 SQL Server migration and deploy, build, unit and E2E checks, authenticated todo ownership, Swagger/Scalar, rate-limit 429, Husky, Ultracite, Docker readiness, and published-port auth/session/todo persistence.",scenarios:["passport-prisma-sqlserver-fastify-rest-full-feature-bundle"],status:"certified"},{features:["auth","docker","health-check","nestjs-zod","rate-limiting","scalar-ui","swagger","todo-example","typescript-7","ultracite","husky"],id:"combined-passport-prisma-sqlserver-express-full-feature-bundle",profiles:["passport-prisma-sqlserver"],reason:"The clean pnpm run passed Prisma 7 SQL Server migration and deploy, build, unit and 10 E2E checks, authenticated todo ownership, Swagger/Scalar, rate-limit 429, Husky, Ultracite, Docker image/readiness, and signup/session/todo persistence through its published port.",scenarios:["passport-prisma-sqlserver-express-rest-full-feature-bundle"],status:"certified"},{features:["docker","swagger","todo-example"],id:"combined-drizzle-sqlserver-express-docker-swagger-todo",profiles:["drizzle-sqlserver-express"],reason:"Scenario sqlserver-drizzle-rest-docker-swagger-todo passed SQL Server push, build, unit/E2E, Swagger runtime checks, Docker readiness, and published-port unauthenticated todo CRUD.",scenarios:["sqlserver-drizzle-rest-docker-swagger-todo"],status:"certified"},{features:["docker","swagger","todo-example"],id:"combined-typeorm-sqlserver-express-docker-swagger-todo",profiles:["typeorm-sqlserver-express"],reason:"Scenario sqlserver-typeorm-rest-docker-swagger-todo passed SQL Server synchronization, build, unit/E2E, Swagger runtime checks, Docker readiness, and published-port unauthenticated todo CRUD.",scenarios:["sqlserver-typeorm-rest-docker-swagger-todo"],status:"certified"},{features:["agent-skills","docker","health-check","husky","nestjs-zod","rate-limiting","scalar-ui","swagger","todo-example","typescript-7","ultracite"],id:"combined-drizzle-sqlserver-express-full-feature-bundle",profiles:["drizzle-sqlserver-express"],reason:"Scenario sqlserver-drizzle-rest-full-feature-bundle passed the full pnpm install, SQL Server push, TypeScript 7 build, unit/E2E, Zod validation, all addons and extras, Docker health/readiness, HTTP 429, Swagger/Scalar, and published-port todo CRUD checks.",scenarios:["sqlserver-drizzle-rest-full-feature-bundle"],status:"certified"},{features:["agent-skills","docker","health-check","husky","nestjs-zod","rate-limiting","scalar-ui","swagger","todo-example","typescript-7","ultracite"],id:"combined-typeorm-sqlserver-express-full-feature-bundle",profiles:["typeorm-sqlserver-express"],reason:"Scenario sqlserver-typeorm-rest-full-feature-bundle passed the full pnpm install, SQL Server sync, TypeScript 7 build, unit/E2E, Zod validation, all addons and extras, Docker health/readiness, HTTP 429, Swagger/Scalar, and published-port todo CRUD checks.",scenarios:["sqlserver-typeorm-rest-full-feature-bundle"],status:"certified"},{features:["agent-skills","docker","husky","rate-limiting","scalar-ui","swagger","todo-example","ultracite"],id:"combined-prisma-sqlserver-agent-skills-docker-husky-rate-limiting-scalar-ui-swagger-todo-example-ultracite",profiles:["prisma-sqlserver"],reason:"Scenario sqlserver-matrix-express-agent-skills-docker-husky-rate-limiting-scalar-ui-swagger-todo-example-ultracite passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for agent-skills, docker, husky, rate-limiting, scalar-ui, swagger, todo-example, ultracite.",scenarios:["sqlserver-matrix-express-agent-skills-docker-husky-rate-limiting-scalar-ui-swagger-todo-example-ultracite"],status:"certified"},{features:["health-check","husky","ultracite"],id:"combined-prisma-sqlserver-health-check-husky-ultracite",profiles:["prisma-sqlserver"],reason:"Scenario sqlserver-matrix-express-health-check-husky-ultracite passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for health-check, husky, ultracite.",scenarios:["sqlserver-matrix-express-health-check-husky-ultracite"],status:"certified"},{features:["husky","rate-limiting","ultracite"],id:"combined-prisma-sqlserver-husky-rate-limiting-ultracite",profiles:["prisma-sqlserver"],reason:"Scenario sqlserver-matrix-express-husky-rate-limiting-ultracite passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for husky, rate-limiting, ultracite.",scenarios:["sqlserver-matrix-express-husky-rate-limiting-ultracite"],status:"certified"},{features:["husky","scalar-ui","swagger"],id:"combined-prisma-sqlserver-husky-scalar-ui-swagger",profiles:["prisma-sqlserver"],reason:"Scenario sqlserver-matrix-express-husky-scalar-ui-swagger passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for husky, scalar-ui, swagger.",scenarios:["sqlserver-matrix-express-husky-scalar-ui-swagger"],status:"certified"},{features:["husky","swagger","ultracite"],id:"combined-prisma-sqlserver-husky-swagger-ultracite",profiles:["prisma-sqlserver"],reason:"Scenario sqlserver-matrix-express-husky-swagger-ultracite passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for husky, swagger, ultracite.",scenarios:["sqlserver-matrix-express-husky-swagger-ultracite"],status:"certified"},{features:["agent-skills","scalar-ui","swagger"],id:"combined-prisma-sqlserver-agent-skills-scalar-ui-swagger",profiles:["prisma-sqlserver"],reason:"Scenario sqlserver-matrix-express-agent-skills-scalar-ui-swagger passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for agent-skills, scalar-ui, swagger.",scenarios:["sqlserver-matrix-express-agent-skills-scalar-ui-swagger"],status:"certified"},{features:["agent-skills","swagger","ultracite"],id:"combined-prisma-sqlserver-agent-skills-swagger-ultracite",profiles:["prisma-sqlserver"],reason:"Scenario sqlserver-matrix-express-agent-skills-swagger-ultracite passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for agent-skills, swagger, ultracite.",scenarios:["sqlserver-matrix-express-agent-skills-swagger-ultracite"],status:"certified"},{features:["agent-skills","todo-example","ultracite"],id:"combined-prisma-sqlserver-agent-skills-todo-example-ultracite",profiles:["prisma-sqlserver"],reason:"Scenario sqlserver-matrix-express-agent-skills-todo-example-ultracite passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for agent-skills, todo-example, ultracite.",scenarios:["sqlserver-matrix-express-agent-skills-todo-example-ultracite"],status:"certified"},{features:["docker","husky","ultracite"],id:"combined-prisma-sqlserver-docker-husky-ultracite",profiles:["prisma-sqlserver"],reason:"Scenario sqlserver-matrix-express-docker-husky-ultracite passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for docker, husky, ultracite.",scenarios:["sqlserver-matrix-express-docker-husky-ultracite"],status:"certified"},{features:["agent-skills","husky","rate-limiting"],id:"combined-prisma-sqlserver-agent-skills-husky-rate-limiting",profiles:["prisma-sqlserver"],reason:"Scenario sqlserver-matrix-express-agent-skills-husky-rate-limiting passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for agent-skills, husky, rate-limiting.",scenarios:["sqlserver-matrix-express-agent-skills-husky-rate-limiting"],status:"certified"},{features:["agent-skills","husky","swagger"],id:"combined-prisma-sqlserver-agent-skills-husky-swagger",profiles:["prisma-sqlserver"],reason:"Scenario sqlserver-matrix-express-agent-skills-husky-swagger passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for agent-skills, husky, swagger.",scenarios:["sqlserver-matrix-express-agent-skills-husky-swagger"],status:"certified"},{features:["agent-skills","husky","todo-example"],id:"combined-prisma-sqlserver-agent-skills-husky-todo-example",profiles:["prisma-sqlserver"],reason:"Scenario sqlserver-matrix-express-agent-skills-husky-todo-example passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for agent-skills, husky, todo-example.",scenarios:["sqlserver-matrix-express-agent-skills-husky-todo-example"],status:"certified"},{features:["agent-skills","rate-limiting","ultracite"],id:"combined-prisma-sqlserver-agent-skills-rate-limiting-ultracite",profiles:["prisma-sqlserver"],reason:"Scenario sqlserver-matrix-express-agent-skills-rate-limiting-ultracite passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for agent-skills, rate-limiting, ultracite.",scenarios:["sqlserver-matrix-express-agent-skills-rate-limiting-ultracite"],status:"certified"},{features:["agent-skills","docker","husky"],id:"combined-prisma-sqlserver-agent-skills-docker-husky",profiles:["prisma-sqlserver"],reason:"Scenario sqlserver-matrix-express-agent-skills-docker-husky passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for agent-skills, docker, husky.",scenarios:["sqlserver-matrix-express-agent-skills-docker-husky"],status:"certified"},{features:["agent-skills","docker","ultracite"],id:"combined-prisma-sqlserver-agent-skills-docker-ultracite",profiles:["prisma-sqlserver"],reason:"Scenario sqlserver-matrix-express-agent-skills-docker-ultracite passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for agent-skills, docker, ultracite.",scenarios:["sqlserver-matrix-express-agent-skills-docker-ultracite"],status:"certified"},{features:["agent-skills","health-check","husky"],id:"combined-prisma-sqlserver-agent-skills-health-check-husky",profiles:["prisma-sqlserver"],reason:"Scenario sqlserver-matrix-express-agent-skills-health-check-husky passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for agent-skills, health-check, husky.",scenarios:["sqlserver-matrix-express-agent-skills-health-check-husky"],status:"certified"},{features:["agent-skills","health-check","ultracite"],id:"combined-prisma-sqlserver-agent-skills-health-check-ultracite",profiles:["prisma-sqlserver"],reason:"Scenario sqlserver-matrix-express-agent-skills-health-check-ultracite passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for agent-skills, health-check, ultracite.",scenarios:["sqlserver-matrix-express-agent-skills-health-check-ultracite"],status:"certified"},{features:["docker","husky","rate-limiting"],id:"combined-prisma-sqlserver-docker-husky-rate-limiting",profiles:["prisma-sqlserver"],reason:"Scenario sqlserver-matrix-express-docker-husky-rate-limiting passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for docker, husky, rate-limiting.",scenarios:["sqlserver-matrix-express-docker-husky-rate-limiting"],status:"certified"},{features:["docker","husky","swagger"],id:"combined-prisma-sqlserver-docker-husky-swagger",profiles:["prisma-sqlserver"],reason:"Scenario sqlserver-matrix-express-docker-husky-swagger passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for docker, husky, swagger.",scenarios:["sqlserver-matrix-express-docker-husky-swagger"],status:"certified"},{features:["docker","husky","todo-example"],id:"combined-prisma-sqlserver-docker-husky-todo-example",profiles:["prisma-sqlserver"],reason:"Scenario sqlserver-matrix-express-docker-husky-todo-example passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for docker, husky, todo-example.",scenarios:["sqlserver-matrix-express-docker-husky-todo-example"],status:"certified"},{features:["docker","rate-limiting","ultracite"],id:"combined-prisma-sqlserver-docker-rate-limiting-ultracite",profiles:["prisma-sqlserver"],reason:"Scenario sqlserver-matrix-express-docker-rate-limiting-ultracite passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for docker, rate-limiting, ultracite.",scenarios:["sqlserver-matrix-express-docker-rate-limiting-ultracite"],status:"certified"},{features:["agent-skills","rate-limiting","todo-example"],id:"combined-prisma-sqlserver-agent-skills-rate-limiting-todo-example",profiles:["prisma-sqlserver"],reason:"Scenario sqlserver-matrix-express-agent-skills-rate-limiting-todo-example passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for agent-skills, rate-limiting, todo-example.",scenarios:["sqlserver-matrix-express-agent-skills-rate-limiting-todo-example"],status:"certified"},{features:["agent-skills","swagger","todo-example"],id:"combined-prisma-sqlserver-agent-skills-swagger-todo-example",profiles:["prisma-sqlserver"],reason:"Scenario sqlserver-matrix-express-agent-skills-swagger-todo-example passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for agent-skills, swagger, todo-example.",scenarios:["sqlserver-matrix-express-agent-skills-swagger-todo-example"],status:"certified"},{features:["docker","health-check","husky"],id:"combined-prisma-sqlserver-docker-health-check-husky",profiles:["prisma-sqlserver"],reason:"Scenario sqlserver-matrix-express-docker-health-check-husky passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for docker, health-check, husky.",scenarios:["sqlserver-matrix-express-docker-health-check-husky"],status:"certified"},{features:["docker","health-check","ultracite"],id:"combined-prisma-sqlserver-docker-health-check-ultracite",profiles:["prisma-sqlserver"],reason:"Scenario sqlserver-matrix-express-docker-health-check-ultracite passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for docker, health-check, ultracite.",scenarios:["sqlserver-matrix-express-docker-health-check-ultracite"],status:"certified"},{features:["agent-skills","health-check","rate-limiting"],id:"combined-prisma-sqlserver-agent-skills-health-check-rate-limiting",profiles:["prisma-sqlserver"],reason:"Scenario sqlserver-matrix-express-agent-skills-health-check-rate-limiting passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for agent-skills, health-check, rate-limiting.",scenarios:["sqlserver-matrix-express-agent-skills-health-check-rate-limiting"],status:"certified"},{features:["agent-skills","health-check","swagger"],id:"combined-prisma-sqlserver-agent-skills-health-check-swagger",profiles:["prisma-sqlserver"],reason:"Scenario sqlserver-matrix-express-agent-skills-health-check-swagger passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for agent-skills, health-check, swagger.",scenarios:["sqlserver-matrix-express-agent-skills-health-check-swagger"],status:"certified"},{features:["agent-skills","health-check","todo-example"],id:"combined-prisma-sqlserver-agent-skills-health-check-todo-example",profiles:["prisma-sqlserver"],reason:"Scenario sqlserver-matrix-express-agent-skills-health-check-todo-example passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for agent-skills, health-check, todo-example.",scenarios:["sqlserver-matrix-express-agent-skills-health-check-todo-example"],status:"certified"},{features:["agent-skills","rate-limiting","swagger"],id:"combined-prisma-sqlserver-agent-skills-rate-limiting-swagger",profiles:["prisma-sqlserver"],reason:"Scenario sqlserver-matrix-express-agent-skills-rate-limiting-swagger passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for agent-skills, rate-limiting, swagger.",scenarios:["sqlserver-matrix-express-agent-skills-rate-limiting-swagger"],status:"certified"},{features:["agent-skills","docker","health-check"],id:"combined-prisma-sqlserver-agent-skills-docker-health-check",profiles:["prisma-sqlserver"],reason:"Scenario sqlserver-matrix-express-agent-skills-docker-health-check passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for agent-skills, docker, health-check.",scenarios:["sqlserver-matrix-express-agent-skills-docker-health-check"],status:"certified"},{features:["agent-skills","docker","rate-limiting"],id:"combined-prisma-sqlserver-agent-skills-docker-rate-limiting",profiles:["prisma-sqlserver"],reason:"Scenario sqlserver-matrix-express-agent-skills-docker-rate-limiting passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for agent-skills, docker, rate-limiting.",scenarios:["sqlserver-matrix-express-agent-skills-docker-rate-limiting"],status:"certified"},{features:["agent-skills","docker","swagger"],id:"combined-prisma-sqlserver-agent-skills-docker-swagger",profiles:["prisma-sqlserver"],reason:"Scenario sqlserver-matrix-express-agent-skills-docker-swagger passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for agent-skills, docker, swagger.",scenarios:["sqlserver-matrix-express-agent-skills-docker-swagger"],status:"certified"},{features:["agent-skills","docker","todo-example"],id:"combined-prisma-sqlserver-agent-skills-docker-todo-example",profiles:["prisma-sqlserver"],reason:"Scenario sqlserver-matrix-express-agent-skills-docker-todo-example passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for agent-skills, docker, todo-example.",scenarios:["sqlserver-matrix-express-agent-skills-docker-todo-example"],status:"certified"},{features:["husky","todo-example"],id:"combined-prisma-sqlserver-husky-todo-example",profiles:["prisma-sqlserver"],reason:"Scenario sqlserver-matrix-express-husky-todo-example passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for husky, todo-example.",scenarios:["sqlserver-matrix-express-husky-todo-example"],status:"certified"},{features:["rate-limiting","ultracite"],id:"combined-prisma-sqlserver-rate-limiting-ultracite",profiles:["prisma-sqlserver"],reason:"Scenario sqlserver-matrix-express-rate-limiting-ultracite passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for rate-limiting, ultracite.",scenarios:["sqlserver-matrix-express-rate-limiting-ultracite"],status:"certified"},{features:["swagger","ultracite"],id:"combined-prisma-sqlserver-swagger-ultracite",profiles:["prisma-sqlserver"],reason:"Scenario sqlserver-matrix-express-swagger-ultracite passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for swagger, ultracite.",scenarios:["sqlserver-matrix-express-swagger-ultracite"],status:"certified"},{features:["todo-example","ultracite"],id:"combined-prisma-sqlserver-todo-example-ultracite",profiles:["prisma-sqlserver"],reason:"Scenario sqlserver-matrix-express-todo-example-ultracite passed the full pnpm install, Prisma 7 SQL Server migration, build, unit/E2E, and feature-specific runtime checks for todo-example, ultracite.",scenarios:["sqlserver-matrix-express-todo-example-ultracite"],status:"certified"},{features:["agent-skills","docker","husky","scalar-ui","swagger","todo-example","ultracite"],id:"combined-prisma-sqlserver-express-docker-swagger-todo-all-addons",profiles:["prisma-sqlserver"],reason:"Scenario 541 passed clean pnpm install, Prisma 7 SQL Server migrations, build, unit/E2E, Ultracite fix/check, Agent Skills integrity, OpenAPI + Scalar runtime, Docker Compose startup and HTTP 200, and Husky accepting/rejecting hooks.",scenarios:["541-prisma-sqlserver-express-docker-swagger-todo-all-addons"],status:"certified"},{features:["agent-skills","todo-example"],id:"combined-prisma-sqlserver-express-agent-skills-todo",profiles:["prisma-sqlserver"],reason:"The generated SQL Server Prisma 7 Express project passed skill integrity, migrations, build, and todo CRUD E2E.",scenarios:["sqlserver-matrix-express-agent-skills-todo-example"],status:"certified"},{features:["agent-skills","todo-example"],id:"combined-prisma-sqlserver-fastify-agent-skills-todo",profiles:["prisma-sqlserver-fastify"],reason:"The generated SQL Server Prisma 7 Fastify project passed skill integrity, migrations, build, and todo CRUD E2E.",scenarios:["sqlserver-matrix-fastify-agent-skills-todo-example"],status:"certified"},{features:["agent-skills","rate-limiting"],id:"combined-prisma-sqlserver-express-agent-skills-rate-limit",profiles:["prisma-sqlserver"],reason:"The generated SQL Server Prisma 7 Express project passed skill integrity, migrations, build, E2E, and compiled HTTP 429 checks.",scenarios:["sqlserver-matrix-express-agent-skills-rate-limiting"],status:"certified"},{features:["agent-skills","rate-limiting"],id:"combined-prisma-sqlserver-fastify-agent-skills-rate-limit",profiles:["prisma-sqlserver-fastify"],reason:"The generated SQL Server Prisma 7 Fastify project passed skill integrity, migrations, build, E2E, and compiled HTTP 429 checks.",scenarios:["sqlserver-matrix-fastify-agent-skills-rate-limiting"],status:"certified"},{features:["agent-skills","swagger"],id:"combined-prisma-sqlserver-express-agent-skills-swagger",profiles:["prisma-sqlserver"],reason:"The generated SQL Server Prisma 7 Express project passed skill integrity, migrations, build, OpenAPI E2E, and runtime docs checks.",scenarios:["sqlserver-matrix-express-agent-skills-swagger"],status:"certified"},{features:["agent-skills","swagger"],id:"combined-prisma-sqlserver-fastify-agent-skills-swagger",profiles:["prisma-sqlserver-fastify"],reason:"The generated SQL Server Prisma 7 Fastify project passed skill integrity, migrations, build, OpenAPI E2E, and runtime docs checks.",scenarios:["sqlserver-matrix-fastify-agent-skills-swagger"],status:"certified"},{features:["agent-skills","docker"],id:"combined-prisma-sqlserver-express-agent-skills-docker",profiles:["prisma-sqlserver"],reason:"The generated SQL Server Prisma 7 Express project passed skill-integrity, migration, build, E2E, Docker readiness, published HTTP 200, and cleanup checks.",scenarios:["sqlserver-matrix-express-agent-skills-docker"],status:"certified"},{features:["agent-skills","docker"],id:"combined-prisma-sqlserver-fastify-agent-skills-docker",profiles:["prisma-sqlserver-fastify"],reason:"The generated SQL Server Prisma 7 Fastify project passed skill-integrity, migration, build, E2E, Docker readiness, published HTTP 200, and cleanup checks.",scenarios:["sqlserver-matrix-fastify-agent-skills-docker"],status:"certified"},{features:["agent-skills","health-check"],id:"combined-prisma-sqlserver-express-agent-skills-health-check",profiles:["prisma-sqlserver"],reason:"The generated SQL Server Prisma 7 Express project passed skill-integrity, migrations, build, E2E, and health readiness/outage checks.",scenarios:["sqlserver-matrix-express-agent-skills-health-check"],status:"certified"},{features:["agent-skills","health-check"],id:"combined-prisma-sqlserver-fastify-agent-skills-health-check",profiles:["prisma-sqlserver-fastify"],reason:"The generated SQL Server Prisma 7 Fastify project passed skill-integrity, migrations, build, E2E, and health readiness/outage checks.",scenarios:["sqlserver-matrix-fastify-agent-skills-health-check"],status:"certified"},{features:["husky","rate-limiting"],id:"combined-prisma-sqlserver-express-husky-rate-limit",profiles:["prisma-sqlserver"],reason:"The generated SQL Server Prisma 7 Express project passed runtime HTTP 429 checks and Husky passing/failing commit hooks.",scenarios:["sqlserver-matrix-express-husky-rate-limiting"],status:"certified"},{features:["husky","swagger"],id:"combined-prisma-sqlserver-express-husky-swagger",profiles:["prisma-sqlserver"],reason:"The generated SQL Server Prisma 7 Express project passed migrations, build, unit/E2E, OpenAPI runtime checks, and Husky passing/failing commit hooks.",scenarios:["sqlserver-matrix-express-husky-swagger"],status:"certified"},{features:["husky","rate-limiting"],id:"combined-prisma-sqlserver-fastify-husky-rate-limit",profiles:["prisma-sqlserver-fastify"],reason:"The generated SQL Server Prisma 7 Fastify project passed runtime HTTP 429 checks and Husky passing/failing commit hooks.",scenarios:["sqlserver-matrix-fastify-husky-rate-limiting"],status:"certified"},{features:["husky","health-check"],id:"combined-prisma-sqlserver-express-husky-health-check",profiles:["prisma-sqlserver"],reason:"The generated SQL Server Prisma 7 Express project passed health readiness/outage E2E and Husky passing/failing commit hooks.",scenarios:["sqlserver-matrix-express-health-check-husky"],status:"certified"},{features:["husky","health-check"],id:"combined-prisma-sqlserver-fastify-husky-health-check",profiles:["prisma-sqlserver-fastify"],reason:"The generated SQL Server Prisma 7 Fastify project passed health readiness/outage E2E and Husky passing/failing commit hooks.",scenarios:["sqlserver-matrix-fastify-health-check-husky"],status:"certified"},{features:["ultracite","health-check"],id:"combined-prisma-sqlserver-express-ultracite-health-check",profiles:["prisma-sqlserver"],reason:"The generated SQL Server Prisma 7 Express project passed health readiness/outage E2E and Oxlint/Oxfmt Ultracite fix/check.",scenarios:["sqlserver-matrix-express-health-check-ultracite"],status:"certified"},{features:["ultracite","health-check"],id:"combined-prisma-sqlserver-fastify-ultracite-health-check",profiles:["prisma-sqlserver-fastify"],reason:"The generated SQL Server Prisma 7 Fastify project passed health readiness/outage E2E and Oxlint/Oxfmt Ultracite fix/check.",scenarios:["sqlserver-matrix-fastify-health-check-ultracite"],status:"certified"},{features:["docker","health-check","rate-limiting","swagger","todo-example"],id:"combined-prisma-sqlserver-express-full-extras",profiles:["prisma-sqlserver"],reason:"The generated SQL Server Prisma 7 Express project passed all practical extra checks, Docker readiness and published HTTP 200/429, and cleanup.",scenarios:["sqlserver-matrix-express-docker-health-check-rate-limiting-swagger-todo-example"],status:"certified"},{features:["docker","husky"],id:"combined-prisma-sqlserver-express-docker-husky",profiles:["prisma-sqlserver"],reason:"The Express SQL Server Docker + Husky project passed Compose HTTP 200 and Husky hook acceptance/rejection checks.",scenarios:["sqlserver-matrix-express-docker-husky"],status:"certified"},{features:["docker","husky"],id:"combined-prisma-sqlserver-fastify-docker-husky",profiles:["prisma-sqlserver-fastify"],reason:"The Fastify SQL Server Docker + Husky project passed Compose HTTP 200 and Husky hook acceptance/rejection checks.",scenarios:["sqlserver-matrix-fastify-docker-husky"],status:"certified"},{features:["docker","ultracite"],id:"combined-prisma-sqlserver-express-docker-ultracite",profiles:["prisma-sqlserver"],reason:"The Express SQL Server Docker + Oxlint/Oxfmt Ultracite project passed formatting/linting, Compose HTTP 200, and cleanup.",scenarios:["sqlserver-matrix-express-docker-ultracite"],status:"certified"},{features:["docker","ultracite"],id:"combined-prisma-sqlserver-fastify-docker-ultracite",profiles:["prisma-sqlserver-fastify"],reason:"The Fastify SQL Server Docker + Oxlint/Oxfmt Ultracite project passed formatting/linting, Compose HTTP 200, and cleanup.",scenarios:["sqlserver-matrix-fastify-docker-ultracite"],status:"certified"},{features:["docker","health-check","rate-limiting","swagger","todo-example"],id:"combined-prisma-sqlserver-fastify-full-extras",profiles:["prisma-sqlserver-fastify"],reason:"The generated SQL Server Prisma 7 Fastify project passed all practical extra checks, Docker readiness and published HTTP 200/429, and cleanup.",scenarios:["sqlserver-matrix-fastify-docker-health-check-rate-limiting-swagger-todo-example"],status:"certified"},{features:["docker","rate-limiting","swagger","todo-example"],id:"combined-prisma-sqlserver-express-docker-rate-limit-swagger-todo",profiles:["prisma-sqlserver"],reason:"The generated SQL Server Prisma 7 Express project passed OpenAPI and todo E2E, Docker Compose readiness, published HTTP 200/429 probes, and cleanup.",scenarios:["sqlserver-matrix-express-docker-rate-limiting-swagger-todo-example"],status:"certified"},{features:["docker","rate-limiting","swagger","todo-example"],id:"combined-prisma-sqlserver-fastify-docker-rate-limit-swagger-todo",profiles:["prisma-sqlserver-fastify"],reason:"The generated SQL Server Prisma 7 Fastify project passed OpenAPI and todo E2E, Docker Compose readiness, published HTTP 200/429 probes, and cleanup.",scenarios:["sqlserver-matrix-fastify-docker-rate-limiting-swagger-todo-example"],status:"certified"},{features:["health-check","rate-limiting","swagger","todo-example"],id:"combined-prisma-sqlserver-express-health-rate-limit-swagger-todo",profiles:["prisma-sqlserver"],reason:"The generated SQL Server Prisma 7 Express project passed health/outage, OpenAPI, todo CRUD, and HTTP 429 E2E.",scenarios:["sqlserver-matrix-express-health-check-rate-limiting-swagger-todo-example"],status:"certified"},{features:["health-check","rate-limiting","swagger","todo-example"],id:"combined-prisma-sqlserver-fastify-health-rate-limit-swagger-todo",profiles:["prisma-sqlserver-fastify"],reason:"The generated SQL Server Prisma 7 Fastify project passed health/outage, OpenAPI, todo CRUD, and HTTP 429 E2E.",scenarios:["sqlserver-matrix-fastify-health-check-rate-limiting-swagger-todo-example"],status:"certified"},{features:["docker","health-check","rate-limiting","swagger"],id:"combined-prisma-sqlserver-express-docker-health-rate-limit-swagger",profiles:["prisma-sqlserver"],reason:"The generated SQL Server Prisma 7 Express project passed health and OpenAPI E2E, Docker Compose readiness, published HTTP 200/429, and cleanup.",scenarios:["sqlserver-matrix-express-docker-health-check-rate-limiting-swagger"],status:"certified"},{features:["docker","health-check","rate-limiting","swagger"],id:"combined-prisma-sqlserver-fastify-docker-health-rate-limit-swagger",profiles:["prisma-sqlserver-fastify"],reason:"The generated SQL Server Prisma 7 Fastify project passed health and OpenAPI E2E, Docker Compose readiness, published HTTP 200/429, and cleanup.",scenarios:["sqlserver-matrix-fastify-docker-health-check-rate-limiting-swagger"],status:"certified"},{features:["docker","health-check","swagger","todo-example"],id:"combined-prisma-sqlserver-express-docker-health-swagger-todo",profiles:["prisma-sqlserver"],reason:"The generated SQL Server Prisma 7 Express project passed health, OpenAPI, and todo E2E, Docker Compose readiness, published HTTP 200, and cleanup.",scenarios:["sqlserver-matrix-express-docker-health-check-swagger-todo-example"],status:"certified"},{features:["docker","health-check","swagger","todo-example"],id:"combined-prisma-sqlserver-fastify-docker-health-swagger-todo",profiles:["prisma-sqlserver-fastify"],reason:"The generated SQL Server Prisma 7 Fastify project passed health, OpenAPI, and todo E2E, Docker Compose readiness, published HTTP 200, and cleanup.",scenarios:["sqlserver-matrix-fastify-docker-health-check-swagger-todo-example"],status:"certified"},{features:["rate-limiting","swagger","todo-example"],id:"combined-prisma-sqlserver-express-rate-limit-swagger-todo",profiles:["prisma-sqlserver"],reason:"The generated SQL Server Prisma 7 Express project passed migrations, OpenAPI and todo E2E, and compiled HTTP 429 probe.",scenarios:["sqlserver-matrix-express-rate-limiting-swagger-todo-example"],status:"certified"},{features:["rate-limiting","swagger","todo-example"],id:"combined-prisma-sqlserver-fastify-rate-limit-swagger-todo",profiles:["prisma-sqlserver-fastify"],reason:"The generated SQL Server Prisma 7 Fastify project passed migrations, OpenAPI and todo E2E, and compiled HTTP 429 probe.",scenarios:["sqlserver-matrix-fastify-rate-limiting-swagger-todo-example"],status:"certified"},{features:["health-check","rate-limiting","swagger"],id:"combined-prisma-sqlserver-express-health-rate-limit-swagger",profiles:["prisma-sqlserver"],reason:"The generated SQL Server Prisma 7 Express project passed migrations, health readiness/outage E2E, OpenAPI checks, and compiled HTTP 429 probe.",scenarios:["sqlserver-matrix-express-health-check-rate-limiting-swagger"],status:"certified"},{features:["health-check","rate-limiting","swagger"],id:"combined-prisma-sqlserver-fastify-health-rate-limit-swagger",profiles:["prisma-sqlserver-fastify"],reason:"The generated SQL Server Prisma 7 Fastify project passed migrations, health readiness/outage E2E, OpenAPI checks, and compiled HTTP 429 probe.",scenarios:["sqlserver-matrix-fastify-health-check-rate-limiting-swagger"],status:"certified"},{features:["health-check","swagger","todo-example"],id:"combined-prisma-sqlserver-express-health-swagger-todo",profiles:["prisma-sqlserver"],reason:"The generated SQL Server Prisma 7 Express project passed migrations, health readiness/outage, OpenAPI, and todo CRUD E2E.",scenarios:["sqlserver-matrix-express-health-check-swagger-todo-example"],status:"certified"},{features:["health-check","swagger","todo-example"],id:"combined-prisma-sqlserver-fastify-health-swagger-todo",profiles:["prisma-sqlserver-fastify"],reason:"The generated SQL Server Prisma 7 Fastify project passed migrations, health readiness/outage, OpenAPI, and todo CRUD E2E.",scenarios:["sqlserver-matrix-fastify-health-check-swagger-todo-example"],status:"certified"},{features:["docker","rate-limiting","todo-example"],id:"combined-prisma-sqlserver-express-docker-rate-limit-todo",profiles:["prisma-sqlserver"],reason:"The generated SQL Server Prisma 7 Express project passed migrations, todo CRUD and rate-limit E2E, Docker Compose readiness, published HTTP 200/429, and cleanup.",scenarios:["sqlserver-matrix-express-docker-rate-limiting-todo-example"],status:"certified"},{features:["docker","rate-limiting","todo-example"],id:"combined-prisma-sqlserver-fastify-docker-rate-limit-todo",profiles:["prisma-sqlserver-fastify"],reason:"The generated SQL Server Prisma 7 Fastify project passed migrations, todo CRUD and rate-limit E2E, Docker Compose readiness, published HTTP 200/429, and cleanup.",scenarios:["sqlserver-matrix-fastify-docker-rate-limiting-todo-example"],status:"certified"},{features:["docker","swagger","todo-example"],id:"combined-prisma-sqlserver-express-docker-swagger-todo",profiles:["prisma-sqlserver"],reason:"The generated SQL Server Prisma 7 Express project passed migrations, OpenAPI and todo E2E, Docker Compose readiness, published HTTP 200, and cleanup.",scenarios:["sqlserver-matrix-express-docker-swagger-todo-example"],status:"certified"},{features:["docker","swagger","todo-example"],id:"combined-prisma-sqlserver-fastify-docker-swagger-todo",profiles:["prisma-sqlserver-fastify"],reason:"The generated SQL Server Prisma 7 Fastify project passed migrations, OpenAPI and todo E2E, Docker Compose readiness, published HTTP 200, and cleanup.",scenarios:["sqlserver-matrix-fastify-docker-swagger-todo-example"],status:"certified"},{features:["docker","health-check","todo-example"],id:"combined-prisma-sqlserver-express-docker-health-todo",profiles:["prisma-sqlserver"],reason:"The generated SQL Server Prisma 7 Express project passed migrations, build, todo CRUD and health E2E, Docker Compose readiness, published HTTP 200, and cleanup.",scenarios:["sqlserver-matrix-express-docker-health-check-todo-example"],status:"certified"},{features:["docker","health-check","todo-example"],id:"combined-prisma-sqlserver-fastify-docker-health-todo",profiles:["prisma-sqlserver-fastify"],reason:"The generated SQL Server Prisma 7 Fastify project passed migrations, build, todo CRUD and health E2E, Docker Compose readiness, published HTTP 200, and cleanup.",scenarios:["sqlserver-matrix-fastify-docker-health-check-todo-example"],status:"certified"},{features:["docker","rate-limiting","swagger"],id:"combined-prisma-sqlserver-express-docker-rate-limit-swagger",profiles:["prisma-sqlserver"],reason:"The generated SQL Server Prisma 7 Express project passed migrations, build, OpenAPI and rate-limit E2E, Docker Compose readiness, published HTTP 200/429, and cleanup.",scenarios:["sqlserver-matrix-express-docker-rate-limiting-swagger"],status:"certified"},{features:["docker","rate-limiting","swagger"],id:"combined-prisma-sqlserver-fastify-docker-rate-limit-swagger",profiles:["prisma-sqlserver-fastify"],reason:"The generated SQL Server Prisma 7 Fastify project passed migrations, build, OpenAPI and rate-limit E2E, Docker Compose readiness, published HTTP 200/429, and cleanup.",scenarios:["sqlserver-matrix-fastify-docker-rate-limiting-swagger"],status:"certified"},{features:["docker","health-check","rate-limiting"],id:"combined-prisma-sqlserver-express-docker-health-rate-limit",profiles:["prisma-sqlserver"],reason:"The generated SQL Server Prisma 7 Express project passed migrations, build, health readiness/outage E2E, Docker Compose readiness, published HTTP 200/429 probes, and cleanup.",scenarios:["sqlserver-matrix-express-docker-health-check-rate-limiting"],status:"certified"},{features:["docker","health-check","rate-limiting"],id:"combined-prisma-sqlserver-fastify-docker-health-rate-limit",profiles:["prisma-sqlserver-fastify"],reason:"The generated SQL Server Prisma 7 Fastify project passed migrations, build, health readiness/outage E2E, Docker Compose readiness, published HTTP 200/429 probes, and cleanup.",scenarios:["sqlserver-matrix-fastify-docker-health-check-rate-limiting"],status:"certified"},{features:["docker","health-check","swagger"],id:"combined-prisma-sqlserver-express-docker-health-swagger",profiles:["prisma-sqlserver"],reason:"The generated SQL Server Prisma 7 Express project passed migrations, build, health readiness/outage and OpenAPI E2E, Docker Compose readiness, published HTTP 200, and cleanup.",scenarios:["sqlserver-matrix-express-docker-health-check-swagger"],status:"certified"},{features:["docker","health-check","swagger"],id:"combined-prisma-sqlserver-fastify-docker-health-swagger",profiles:["prisma-sqlserver-fastify"],reason:"The generated SQL Server Prisma 7 Fastify project passed migrations, build, health readiness/outage and OpenAPI E2E, Docker Compose readiness, published HTTP 200, and cleanup.",scenarios:["sqlserver-matrix-fastify-docker-health-check-swagger"],status:"certified"},{features:["rate-limiting","swagger"],id:"combined-prisma-sqlserver-express-rate-limit-swagger",profiles:["prisma-sqlserver"],reason:"The generated SQL Server Prisma 7 Express project passed migrations, build, unit/E2E, OpenAPI runtime checks, and compiled HTTP 429 rate-limit probe.",scenarios:["sqlserver-matrix-express-rate-limiting-swagger"],status:"certified"},{features:["rate-limiting","swagger"],id:"combined-prisma-sqlserver-fastify-rate-limit-swagger",profiles:["prisma-sqlserver-fastify"],reason:"The generated SQL Server Prisma 7 Fastify project passed migrations, build, unit/E2E, OpenAPI runtime checks, and compiled HTTP 429 rate-limit probe.",scenarios:["sqlserver-matrix-fastify-rate-limiting-swagger"],status:"certified"},{features:["rate-limiting","todo-example"],id:"combined-prisma-sqlserver-express-rate-limit-todo",profiles:["prisma-sqlserver"],reason:"The generated SQL Server Prisma 7 Express project passed migrations, build, unit/E2E todo CRUD, and compiled HTTP 429 rate-limit probe.",scenarios:["sqlserver-matrix-express-rate-limiting-todo-example"],status:"certified"},{features:["rate-limiting","todo-example"],id:"combined-prisma-sqlserver-fastify-rate-limit-todo",profiles:["prisma-sqlserver-fastify"],reason:"The generated SQL Server Prisma 7 Fastify project passed migrations, build, unit/E2E todo CRUD, and compiled HTTP 429 rate-limit probe.",scenarios:["sqlserver-matrix-fastify-rate-limiting-todo-example"],status:"certified"},{features:["health-check","swagger"],id:"combined-prisma-sqlserver-express-health-swagger",profiles:["prisma-sqlserver"],reason:"The generated SQL Server Prisma 7 Express project passed migrations, build, unit/E2E, Swagger OpenAPI checks, and health readiness/outage assertions.",scenarios:["sqlserver-matrix-express-health-check-swagger"],status:"certified"},{features:["health-check","swagger"],id:"combined-prisma-sqlserver-fastify-health-swagger",profiles:["prisma-sqlserver-fastify"],reason:"The generated SQL Server Prisma 7 Fastify project passed migrations, build, unit/E2E, Swagger OpenAPI checks, and health readiness/outage assertions.",scenarios:["sqlserver-matrix-fastify-health-check-swagger"],status:"certified"},{features:["health-check","todo-example"],id:"combined-prisma-sqlserver-express-health-todo",profiles:["prisma-sqlserver"],reason:"The generated SQL Server Prisma 7 Express project passed migrations, build, unit/E2E, health readiness/outage assertions, and todo CRUD checks.",scenarios:["sqlserver-matrix-express-health-check-todo-example"],status:"certified"},{features:["health-check","todo-example"],id:"combined-prisma-sqlserver-fastify-health-todo",profiles:["prisma-sqlserver-fastify"],reason:"The generated SQL Server Prisma 7 Fastify project passed migrations, build, unit/E2E, health readiness/outage assertions, and todo CRUD checks.",scenarios:["sqlserver-matrix-fastify-health-check-todo-example"],status:"certified"},{features:["docker","todo-example"],id:"combined-prisma-sqlserver-express-docker-todo",profiles:["prisma-sqlserver"],reason:"The generated SQL Server Prisma 7 Express project passed migrations, build, todo CRUD E2E, Docker Compose readiness, published HTTP 200, and cleanup.",scenarios:["sqlserver-matrix-express-docker-todo-example"],status:"certified"},{features:["docker","todo-example"],id:"combined-prisma-sqlserver-fastify-docker-todo",profiles:["prisma-sqlserver-fastify"],reason:"The generated SQL Server Prisma 7 Fastify project passed migrations, build, todo CRUD E2E, Docker Compose readiness, published HTTP 200, and cleanup.",scenarios:["sqlserver-matrix-fastify-docker-todo-example"],status:"certified"},{features:["health-check","rate-limiting"],id:"combined-prisma-sqlserver-express-health-rate-limit",profiles:["prisma-sqlserver"],reason:"The generated SQL Server Prisma 7 Express project passed migrations, build, E2E readiness and outage checks, and compiled HTTP 429 probe.",scenarios:["sqlserver-matrix-express-health-check-rate-limiting"],status:"certified"},{features:["health-check","rate-limiting"],id:"combined-prisma-sqlserver-fastify-health-rate-limit",profiles:["prisma-sqlserver-fastify"],reason:"The generated SQL Server Prisma 7 Fastify project passed migrations, build, E2E readiness and outage checks, and compiled HTTP 429 probe.",scenarios:["sqlserver-matrix-fastify-health-check-rate-limiting"],status:"certified"},{features:["docker","rate-limiting"],id:"combined-prisma-sqlserver-express-docker-rate-limit",profiles:["prisma-sqlserver"],reason:"The generated SQL Server Prisma 7 Express project passed migrations, build, unit/E2E, runtime HTTP 429, Docker Compose readiness, published HTTP 200/429 probes, and cleanup.",scenarios:["sqlserver-matrix-express-docker-rate-limiting"],status:"certified"},{features:["docker","rate-limiting"],id:"combined-prisma-sqlserver-fastify-docker-rate-limit",profiles:["prisma-sqlserver-fastify"],reason:"The generated SQL Server Prisma 7 Fastify project passed migrations, build, unit/E2E, runtime HTTP 429, Docker Compose readiness, published HTTP 200/429 probes, and cleanup.",scenarios:["sqlserver-matrix-fastify-docker-rate-limiting"],status:"certified"},{features:["docker","swagger"],id:"combined-prisma-sqlserver-express-docker-swagger",profiles:["prisma-sqlserver"],reason:"The generated SQL Server Prisma 7 Express project passed migrations, build, unit/E2E, OpenAPI assertions, Docker Compose readiness, published HTTP 200 probe, and cleanup.",scenarios:["sqlserver-matrix-express-docker-swagger"],status:"certified"},{features:["docker","swagger"],id:"combined-prisma-sqlserver-fastify-docker-swagger",profiles:["prisma-sqlserver-fastify"],reason:"The generated SQL Server Prisma 7 Fastify project passed migrations, build, unit/E2E, OpenAPI assertions, Docker Compose readiness, published HTTP 200 probe, and cleanup.",scenarios:["sqlserver-matrix-fastify-docker-swagger"],status:"certified"},{features:["husky","nestjs-zod","swagger","todo-example"],id:"combined-prisma-sqlserver-express-husky-nestjs-zod",profiles:["prisma-sqlserver"],reason:"Scenario 536 passed SQL Server Prisma 7 Express Husky hook checks, DTO validation, todo CRUD, OpenAPI runtime, migrations, build, and tests.",scenarios:["536-prisma-sqlserver-express-husky-nestjs-zod"],status:"certified"},{features:["husky","nestjs-zod","swagger","todo-example"],id:"combined-prisma-sqlserver-fastify-husky-nestjs-zod",profiles:["prisma-sqlserver-fastify"],reason:"Scenario 537 passed SQL Server Prisma 7 Fastify Husky hook checks, DTO validation, todo CRUD, OpenAPI runtime, migrations, build, and tests.",scenarios:["537-prisma-sqlserver-fastify-husky-nestjs-zod"],status:"certified"},{features:["scalar-ui","ultracite","swagger"],id:"combined-prisma-sqlserver-express-scalar-ultracite",profiles:["prisma-sqlserver"],reason:"Scenario 534 passed SQL Server Prisma 7 Express OpenAPI and Scalar runtime probes, migrations, build, tests, and Ultracite.",scenarios:["534-prisma-sqlserver-express-scalar-ultracite"],status:"certified"},{features:["scalar-ui","ultracite","swagger"],id:"combined-prisma-sqlserver-fastify-scalar-ultracite",profiles:["prisma-sqlserver-fastify"],reason:"Scenario 535 passed SQL Server Prisma 7 Fastify OpenAPI and Scalar runtime probes, migrations, build, tests, and Ultracite.",scenarios:["535-prisma-sqlserver-fastify-scalar-ultracite"],status:"certified"},{features:["nestjs-zod","scalar-ui","ultracite","swagger","todo-example"],id:"combined-prisma-sqlserver-express-nestjs-zod-scalar-ultracite",profiles:["prisma-sqlserver"],reason:"Scenario 532 passed SQL Server Prisma 7 Express DTO validation, todo CRUD, OpenAPI and Scalar runtime probes, migrations, build, tests, and Ultracite.",scenarios:["532-prisma-sqlserver-express-nestjs-zod-scalar-ultracite"],status:"certified"},{features:["nestjs-zod","scalar-ui","ultracite","swagger","todo-example"],id:"combined-prisma-sqlserver-fastify-nestjs-zod-scalar-ultracite",profiles:["prisma-sqlserver-fastify"],reason:"Scenario 533 passed SQL Server Prisma 7 Fastify DTO validation, todo CRUD, OpenAPI and Scalar runtime probes, migrations, build, tests, and Ultracite.",scenarios:["533-prisma-sqlserver-fastify-nestjs-zod-scalar-ultracite"],status:"certified"},{features:["nestjs-zod","ultracite","swagger","todo-example"],id:"combined-prisma-sqlserver-express-nestjs-zod-ultracite",profiles:["prisma-sqlserver"],reason:"Scenario 530 passed SQL Server Prisma 7 Express DTO validation, todo CRUD, OpenAPI runtime checks, migrations, build, tests, and Ultracite.",scenarios:["530-prisma-sqlserver-express-nestjs-zod-ultracite"],status:"certified"},{features:["nestjs-zod","ultracite","swagger","todo-example"],id:"combined-prisma-sqlserver-fastify-nestjs-zod-ultracite",profiles:["prisma-sqlserver-fastify"],reason:"Scenario 531 passed SQL Server Prisma 7 Fastify DTO validation, todo CRUD, OpenAPI runtime checks, migrations, build, tests, and Ultracite.",scenarios:["531-prisma-sqlserver-fastify-nestjs-zod-ultracite"],status:"certified"},{features:["nestjs-zod","scalar-ui","swagger","todo-example"],id:"combined-prisma-sqlserver-express-nestjs-zod-scalar-todo",profiles:["prisma-sqlserver"],reason:"Scenario 528 passed SQL Server Prisma 7 Express Zod DTO validation, todo CRUD, OpenAPI and Scalar runtime probes, migrations, build, and tests.",scenarios:["528-prisma-sqlserver-express-nestjs-zod-scalar-todo"],status:"certified"},{features:["nestjs-zod","scalar-ui","swagger","todo-example"],id:"combined-prisma-sqlserver-fastify-nestjs-zod-scalar-todo",profiles:["prisma-sqlserver-fastify"],reason:"Scenario 529 passed SQL Server Prisma 7 Fastify Zod DTO validation, todo CRUD, OpenAPI and Scalar runtime probes, migrations, build, and tests.",scenarios:["529-prisma-sqlserver-fastify-nestjs-zod-scalar-todo"],status:"certified"},{features:["agent-skills","docker","health-check","husky","nestjs-zod","rate-limiting","scalar-ui","swagger","todo-example","ultracite"],id:"combined-prisma-sqlserver-express-full-stack-normal-compiler",profiles:["prisma-sqlserver"],reason:"Scenario 508 passed clean pnpm install, Prisma 7 generation/migrations, build, unit/E2E tests, Ultracite, Husky hooks, agent skills/integrations, compiled Scalar and HTTP 429 probes, Docker image build, Compose readiness, published HTTP 200 and 429 checks, and cleanup.",scenarios:["508-prisma-sqlserver-express-full-stack-normal-compiler"],status:"certified"},{features:["agent-skills","docker","health-check","husky","nestjs-zod","rate-limiting","scalar-ui","swagger","todo-example","ultracite"],id:"combined-prisma-sqlserver-fastify-full-stack-normal-compiler",profiles:["prisma-sqlserver-fastify"],reason:"Scenario 509 passed clean pnpm install, Prisma 7 generation/migrations, build, unit/E2E tests, Ultracite, Husky hooks, agent skills/integrations, compiled Scalar and HTTP 429 probes, Docker image build, Compose readiness, published HTTP 200 and 429 checks, and cleanup.",scenarios:["509-prisma-sqlserver-fastify-full-stack-normal-compiler"],status:"certified"},{features:["agent-skills","docker","health-check","husky","nestjs-zod","rate-limiting","scalar-ui","swagger","todo-example","typescript-7","ultracite"],id:"combined-prisma-sqlserver-express-full-stack",profiles:["prisma-sqlserver"],reason:"Scenario 482 passed clean install, Prisma 7 migrations, build, unit/E2E and Ultracite checks, Husky hooks, Docker Compose SQL Server/app readiness, published HTTP 200 and rate-limit HTTP 429. Other SQL Server feature subsets remain gated.",scenarios:["482-prisma-sqlserver-express-full-stack"],status:"certified"},{features:["agent-skills","docker","health-check","husky","nestjs-zod","rate-limiting","scalar-ui","swagger","todo-example","typescript-7","ultracite"],id:"combined-prisma-sqlserver-fastify-full-stack",profiles:["prisma-sqlserver-fastify"],reason:"Scenario 483 passed clean install, Prisma 7 migrations, build, unit/E2E and Ultracite checks, Husky hooks, Docker Compose SQL Server/app readiness, published HTTP 200 and rate-limit HTTP 429. Other SQL Server feature subsets remain gated.",scenarios:["483-prisma-sqlserver-fastify-full-stack"],status:"certified"},{features:["message-transport","broker-outage-event-publish"],id:"combined-broker-offline-event-publish",profiles:["microservice-redis","microservice-mqtt","microservice-nats","microservice-rabbitmq","microservice-kafka"],reason:"Scenarios 435\u2013439 stop each broker while its generated consumer app remains running. Publish attempts time out or report unavailable, and the event is absent after broker recovery. This does not establish persistence for events accepted before a broker restart.",scenarios:["435-microservice-redis-broker-outage-event","436-microservice-mqtt-broker-outage-event","437-microservice-nats-broker-outage-event","438-microservice-rabbitmq-broker-outage-event","439-microservice-kafka-broker-outage-event"],status:"certified"},{features:["message-transport","handler-failure-redelivery"],id:"combined-broker-handler-failure-redelivery",profiles:["microservice-redis","microservice-mqtt","microservice-nats","microservice-rabbitmq","microservice-kafka"],reason:"Scenarios 430\u2013434 record one handler invocation (attempts=[1]) after the first event delivery throws for Redis, MQTT, NATS, RabbitMQ, and Kafka. The generated handlers do not trigger redelivery in these local profiles; this does not test manual acknowledgments or durable broker configurations.",scenarios:["430-microservice-redis-event-failure-retry","431-microservice-mqtt-event-failure-retry","432-microservice-nats-event-failure-retry","433-microservice-rabbitmq-event-failure-retry","434-microservice-kafka-event-failure-retry"],status:"certified"},{features:["message-transport","consumer-outage-event-delivery"],id:"combined-broker-consumer-outage-delivery",profiles:["microservice-redis","microservice-mqtt","microservice-nats","microservice-rabbitmq","microservice-kafka"],reason:"Scenarios 425\u2013429 publish while each consumer app is stopped, then restart it and inspect a file-backed handler ledger. Local outcomes: Redis, MQTT, NATS, and Kafka did not deliver; RabbitMQ delivered after the app returned. This does not test broker outages or durability across broker restart.",scenarios:["425-microservice-redis-consumer-outage-event","426-microservice-mqtt-consumer-outage-event","427-microservice-nats-consumer-outage-event","428-microservice-rabbitmq-consumer-outage-event","429-microservice-kafka-consumer-outage-event"],status:"certified"},{features:["message-transport","malformed-event-payload"],id:"combined-broker-malformed-audit-event",profiles:["microservice-redis","microservice-mqtt","microservice-nats","microservice-rabbitmq","microservice-kafka"],reason:"Scenarios 420\u2013424 send malformed but serializable audit event objects. The generated handler logs and discards each invalid payload; valid ping/log controls and absence of audit side effects are checked for every broker.",scenarios:["420-microservice-redis-malformed-event","421-microservice-mqtt-malformed-event","422-microservice-nats-malformed-event","423-microservice-rabbitmq-malformed-event","424-microservice-kafka-malformed-event"],status:"certified"},{features:["message-transport","duplicate-event-delivery"],id:"combined-broker-duplicate-event-delivery",profiles:["microservice-redis","microservice-mqtt","microservice-nats","microservice-rabbitmq","microservice-kafka"],reason:"Scenarios 413\u2013417 publish the same event ID twice and observe two handler invocations across the five broker transports. The generated handler is not idempotent for duplicate delivery; this does not model broker-generated retries or redelivery.",scenarios:["413-microservice-redis-duplicate-event","414-microservice-mqtt-duplicate-event","415-microservice-nats-duplicate-event","416-microservice-rabbitmq-duplicate-event","417-microservice-kafka-duplicate-event"],status:"certified"},{features:["message-transport","event-handler-exception"],id:"combined-broker-event-handler-exception-outcomes",profiles:["microservice-redis","microservice-mqtt","microservice-nats","microservice-rabbitmq","microservice-kafka"],reason:"Scenarios 408\u2013412 make the temporary audit event handler throw and observe whether the publish completes and whether the event side effect is visible over HTTP.",scenarios:["408-microservice-redis-event-handler-failure","409-microservice-mqtt-event-handler-failure","410-microservice-nats-event-handler-failure","411-microservice-rabbitmq-event-handler-failure","412-microservice-kafka-event-handler-failure"],status:"certified"},{features:["message-transport","handler-exception"],id:"combined-transport-handler-exception-outcomes",profiles:["microservice-grpc","microservice-redis","microservice-mqtt","microservice-nats","microservice-rabbitmq","microservice-kafka"],reason:"Scenarios 402\u2013407 add a temporary throwing request handler in each fresh generated project and check the client-visible result after successful request/event controls. gRPC returns INTERNAL; Redis, MQTT, NATS, RabbitMQ, and Kafka return the generic Internal server error. All cases are bounded and clean up Compose resources.",scenarios:["402-microservice-grpc-handler-failure","403-microservice-redis-handler-failure","404-microservice-mqtt-handler-failure","405-microservice-nats-handler-failure","406-microservice-rabbitmq-handler-failure","407-microservice-kafka-handler-failure"],status:"certified"},{features:["message-transport","malformed-request-payload"],id:"combined-broker-malformed-null-payload",profiles:["microservice-redis","microservice-mqtt","microservice-nats","microservice-rabbitmq","microservice-kafka"],reason:"Scenarios 397\u2013401 send null to the generated log request pattern after valid transport checks. All five client libraries reject it before broker delivery with Error: The invalid data or message pattern (undefined/null). This does not establish generated handler validation semantics.",scenarios:["397-microservice-redis-malformed-payload","398-microservice-mqtt-malformed-payload","399-microservice-nats-malformed-payload","400-microservice-rabbitmq-malformed-payload","401-microservice-kafka-malformed-payload"],status:"certified"},{features:["message-transport","transparent-reconnect"],id:"combined-broker-transparent-reconnect",profiles:["microservice-redis","microservice-mqtt","microservice-nats","microservice-rabbitmq","microservice-kafka"],reason:"Scenarios 392\u2013396 restart each broker and probe request/reply plus event behavior while keeping the generated app process running. MQTT, NATS, and Kafka pass; Redis request/reply times out and RabbitMQ reports ECONNREFUSED.",scenarios:["392-microservice-redis-transparent-reconnect","393-microservice-mqtt-transparent-reconnect","394-microservice-nats-transparent-reconnect","395-microservice-rabbitmq-transparent-reconnect","396-microservice-kafka-transparent-reconnect"],status:"certified"},{features:["message-transport","unknown-request-pattern"],id:"combined-broker-unknown-request-outcomes",profiles:["microservice-redis","microservice-mqtt","microservice-nats","microservice-rabbitmq","microservice-kafka"],reason:"Fresh Docker-backed runtime scenarios 387\u2013391 classify an unhandled request: Redis, MQTT, and Kafka time out at the 10-second deadline; NATS returns its immediate no-subscriber error; RabbitMQ produces an empty reply. Each same client first passes valid request/reply and event checks.",scenarios:["387-microservice-redis-unknown-pattern","388-microservice-mqtt-unknown-pattern","389-microservice-nats-unknown-pattern","390-microservice-rabbitmq-unknown-pattern","391-microservice-kafka-unknown-pattern"],status:"certified"},{features:["grpc","status-contract"],id:"combined-grpc-unimplemented-status",profiles:["microservice-grpc"],reason:"Scenario 386 made real RPCs against the compiled application and verified an unknown AppService method returns the gRPC UNIMPLEMENTED status while Ping and Log still succeed.",scenarios:["386-microservice-grpc-status-contract"],status:"certified"},{features:["grpc","ultracite"],id:"combined-grpc-ultracite-compiled-runtime",profiles:["microservice-grpc"],reason:"Scenario 326 passes clean install, pre-format lint, formatted checks, build, unit/E2E tests, independent gRPC Ping and Log requests against compiled main.ts, HTTP routing, and child shutdown.",scenarios:["326-microservice-grpc-ultracite"],status:"certified"},...["redis","mqtt","nats","rabbitmq","kafka"].map((e,t)=>({features:[e,"ultracite","event-delivery"],id:`combined-${e}-ultracite-event-runtime`,profiles:[`microservice-${e}`],reason:`${e} with Ultracite passed clean install, pre-format lint, formatted checks, build, unit/E2E tests, broker event delivery, independent request/reply against compiled main.ts, HTTP routing, and shutdown in scenario ${321+t}.`,scenarios:[`${321+t}-microservice-${e}-ultracite`],status:"certified"})),{features:["auth","docker","health-check","rate-limiting","swagger","todo-example","typescript-7","agent-skills","husky","nestjs-zod","scalar-ui","ultracite"],id:"combined-passport-prisma-mongo-certified-rest-bundle",profiles:["passport-prisma-mongo"],reason:"The full Passport Prisma 6 MongoDB REST bundle passed clean install, schema generation, build, unit and HTTP E2E tests, formatting, lint, Husky pass/fail hooks, Docker Compose health, authenticated todo creation, app restart persistence, and volume cleanup in scenario 320.",scenarios:["320-passport-prisma-mongo-rest-certified-bundle"],status:"certified"},{features:["auth","docker","todo-example"],id:"combined-passport-prisma-mongo-docker-todo",profiles:["passport-prisma-mongo"],reason:"Passport Prisma 6 MongoDB Docker Compose startup, authenticated todo creation, app restart, todo persistence, and cleanup passed in scenario 319.",scenarios:["319-passport-prisma-mongo-docker-todo"],status:"certified"},{features:["auth","todo-example","health-check"],id:"combined-passport-drizzle-postgres-todo-health",profiles:["passport-drizzle-postgres"],reason:"Passport Drizzle PostgreSQL REST passed authenticated todo ownership, CRUD, database readiness, and outage HTTP 503 checks in clean-install scenario 308.",scenarios:["308-passport-drizzle-postgres-rest-todo-health"],status:"certified"},{features:["auth","todo-example","health-check"],id:"combined-passport-prisma-mongo-todo-health",profiles:["passport-prisma-mongo"],reason:"Passport Prisma 6 MongoDB REST passed authenticated todo ownership, CRUD, MongoDB readiness, and outage HTTP 503 checks in clean-install scenario 309.",scenarios:["309-passport-prisma-mongo-rest-todo-health"],status:"certified"},{features:["auth","docker","health-check"],id:"combined-auth-docker-health",profiles:["better-auth-prisma-docker"],reason:"Better Auth Prisma migrations, Docker health, authenticated user creation, container restart, and post-restart sign-in passed in scenario 172; other profiles remain gated.",scenarios:["172-better-auth-prisma-docker-health-restart"],status:"certified"},{features:["auth","rate-limiting","reverse-proxy"],id:"combined-auth-rate-limit-proxy",profiles:["passport-prisma"],reason:"Passport login throttling respects the configured trusted proxy address, returns 429 for repeated failures by one client IP, and keeps a second client IP usable in scenario 269.",scenarios:["269-passport-prisma-rate-limit-reverse-proxy"],status:"certified"},{features:["auth","swagger","scalar-ui"],id:"combined-auth-swagger-scalar",profiles:["better-auth-prisma","passport-prisma","passport-prisma-mongo","passport-typeorm-postgres","passport-typeorm-mysql","passport-typeorm-sqlite","passport-drizzle-postgres","passport-drizzle-mysql","passport-drizzle-sqlite"],reason:"Documented authentication through Scalar passed for Better Auth Prisma REST, Passport Prisma REST including Prisma 6 MongoDB, and Passport TypeORM/Drizzle REST across PostgreSQL, MySQL, and SQLite; other auth/API profiles remain gated.",scenarios:["158-better-auth-prisma-swagger-scalar","159-passport-prisma-swagger-scalar","311-passport-prisma-mongo-swagger-scalar","194-passport-typeorm-swagger-scalar","195-passport-drizzle-swagger-scalar","202-passport-typeorm-mysql-swagger-scalar","203-passport-typeorm-sqlite-swagger-scalar","204-passport-drizzle-mysql-swagger-scalar","205-passport-drizzle-sqlite-swagger-scalar"],status:"certified"},{features:["auth","todo-example","trpc"],id:"combined-auth-todo-trpc",profiles:["better-auth-prisma-trpc","passport-prisma-trpc","better-auth-prisma-fastify-trpc","passport-prisma-fastify-trpc","better-auth-typeorm-postgres-trpc","passport-typeorm-postgres-trpc","better-auth-drizzle-postgres-trpc","passport-drizzle-postgres-trpc","better-auth-typeorm-postgres-fastify-trpc","passport-typeorm-postgres-fastify-trpc","better-auth-drizzle-postgres-fastify-trpc","passport-drizzle-postgres-fastify-trpc","better-auth-typeorm-mysql-trpc","passport-typeorm-mysql-trpc","better-auth-drizzle-mysql-trpc","passport-drizzle-mysql-trpc","better-auth-typeorm-sqlite-trpc","passport-typeorm-sqlite-trpc","passport-drizzle-sqlite-trpc","better-auth-drizzle-trpc","better-auth-drizzle-fastify-trpc","better-auth-prisma-mongo-trpc","better-auth-prisma-mongo-fastify-trpc","passport-prisma-mongo-trpc","passport-prisma-mongo-fastify-trpc","better-auth-typeorm-mysql-fastify-trpc","passport-typeorm-mysql-fastify-trpc","better-auth-drizzle-mysql-fastify-trpc","passport-drizzle-mysql-fastify-trpc","better-auth-typeorm-sqlite-fastify-trpc","passport-typeorm-sqlite-fastify-trpc","passport-drizzle-sqlite-fastify-trpc"],reason:"Full runtime owner-isolation scenarios passed for all 32 listed authenticated tRPC todo profiles across PostgreSQL, MySQL, SQLite, and MongoDB.",scenarios:["168-better-auth-prisma-trpc-todo","169-passport-prisma-trpc-todo","219-better-auth-typeorm-postgres-trpc-todo","220-passport-typeorm-postgres-trpc-todo","221-better-auth-drizzle-postgres-trpc-todo","222-passport-drizzle-postgres-trpc-todo","223-better-auth-typeorm-postgres-fastify-trpc-todo","224-passport-typeorm-postgres-fastify-trpc-todo","225-better-auth-drizzle-postgres-fastify-trpc-todo","226-passport-drizzle-postgres-fastify-trpc-todo","237-better-auth-typeorm-mysql-trpc-todo","238-passport-typeorm-mysql-trpc-todo","239-better-auth-drizzle-mysql-trpc-todo","240-passport-drizzle-mysql-trpc-todo","241-better-auth-typeorm-sqlite-trpc-todo","242-passport-typeorm-sqlite-trpc-todo","243-passport-drizzle-sqlite-trpc-todo","244-better-auth-prisma-postgres-fastify-trpc-todo","245-passport-prisma-postgres-fastify-trpc-todo","271-better-auth-drizzle-sqlite-express-trpc-todo","272-better-auth-drizzle-sqlite-fastify-trpc-todo","273-better-auth-prisma-mongo-express-trpc-todo","274-better-auth-prisma-mongo-fastify-trpc-todo","275-passport-prisma-mongo-express-trpc-todo","276-passport-prisma-mongo-fastify-trpc-todo","246-better-auth-typeorm-mysql-fastify-trpc-todo","247-passport-typeorm-mysql-fastify-trpc-todo","248-better-auth-drizzle-mysql-fastify-trpc-todo","249-passport-drizzle-mysql-fastify-trpc-todo","250-better-auth-typeorm-sqlite-fastify-trpc-todo","251-passport-typeorm-sqlite-fastify-trpc-todo","252-passport-drizzle-sqlite-fastify-trpc-todo"],status:"certified"},{features:["auth","docker","health-check","migrations","restart-persistence"],id:"combined-auth-docker-migrations-restart",profiles:["better-auth-prisma-docker"],reason:"Better Auth Prisma 7/PostgreSQL users and sessions survive Docker-managed migrations and an application container restart in scenario 172; this certifies that exact profile, with broader auth/database profiles gated.",scenarios:["172-better-auth-prisma-docker-health-restart"],status:"certified"},{features:["auth","husky","ultracite"],id:"combined-auth-husky-ultracite",profiles:["better-auth-prisma","passport-prisma","passport-typeorm-postgres","passport-drizzle-postgres"],reason:"Hook success/failure and Ultracite formatting passed for Better Auth and Passport across Prisma, TypeORM, and Drizzle PostgreSQL REST; other database and API profiles remain gated.",scenarios:["167-better-auth-prisma-husky-ultracite","173-passport-prisma-husky-ultracite","192-passport-typeorm-husky-ultracite","193-passport-drizzle-husky-ultracite"],status:"certified"},{features:["auth","agent-skills","ultracite"],id:"combined-auth-agent-skills-ultracite",profiles:["passport-drizzle-postgres"],reason:"Passport + Drizzle PostgreSQL skills and Ultracite instructions both install successfully; generated-project formatting, build, and runtime tests pass (scenario 211).",scenarios:["211-passport-drizzle-agent-skills-ultracite"],status:"certified"},{features:["auth","typescript-7"],id:"combined-auth-typescript-7",profiles:["better-auth-prisma","passport-prisma"],reason:"Better Auth and Passport Prisma TypeScript 7 builds, migrations, and authenticated runtime pass in scenarios 268 and 295; other profiles remain gated.",scenarios:["268-better-auth-prisma-typescript-7","295-passport-prisma-typescript-7"],status:"certified"},{features:["docker","rate-limiting","swagger","todo-example","husky"],id:"combined-prisma-sqlserver-express-husky-docker-rate-swagger-todo",profiles:["prisma-sqlserver"],reason:"Scenario 538 passed the Express SQL Server Docker, CRUD, OpenAPI, throttling, and Husky runtime checks.",scenarios:["538-prisma-sqlserver-express-husky-docker-rate-swagger-todo"],status:"certified"},{features:["docker","rate-limiting","swagger","todo-example","ultracite"],id:"combined-prisma-sqlserver-express-ultracite-docker-rate-swagger-todo",profiles:["prisma-sqlserver"],reason:"Scenario 539 passed the Express SQL Server Docker, CRUD, OpenAPI, throttling, and Oxlint/Oxfmt Ultracite checks.",scenarios:["539-prisma-sqlserver-express-ultracite-docker-rate-swagger-todo"],status:"certified"},{features:["docker","rate-limiting","swagger","todo-example","husky","ultracite"],id:"combined-prisma-sqlserver-express-husky-ultracite-docker-rate-swagger-todo",profiles:["prisma-sqlserver"],reason:"Scenario 540 passed the complete requested Express SQL Server project, including Docker HTTP 200/429, CRUD, OpenAPI, Ultracite, and Husky pass/fail hooks.",scenarios:["540-prisma-sqlserver-express-husky-ultracite-docker-rate-swagger-todo"],status:"certified"}],Yo=Object.keys(Z).map(e=>{const t=we(e)!==void 0;return{id:`single-app:${e}`,reason:t?"Covered by the bounded runtime-anchor heuristic across database/ORM/API/provider and transport/storage family.":"Awaiting clean generated-project runtime evidence for its storage/API/provider and transport/storage family anchors.",status:t?"certified":"implemented"}});function Cs(e){return{certified:e.filter(t=>t.status==="certified").length,desired:e.filter(t=>t.status==="desired").length,implemented:e.filter(t=>t.status==="implemented").length,unfinished:e.filter(t=>t.status!=="certified").map(({id:t,reason:s,status:r})=>({id:t,reason:s,status:r}))}}c(Cs,"ai"),p(Cs,"summarize");function Xo(){const e=Q.filter(s=>s.status!=="certified"&&s.auth!=="none").map(({id:s,note:r,status:a})=>({id:`composition:${s}`,reason:r,status:a})),t=[..._s,...Zo,...Wo,...Ko,...Yo,...e];return Cs(t)}c(Xo,"ii"),p(Xo,"getCoverageReport");function en(){return _s.filter(e=>e.status==="desired"&&!e.profile)}c(en,"oi"),p(en,"getMissingProfiles");async function Ae(e){try{return await N(e,"utf-8")}catch(t){if(t instanceof Error&&"code"in t&&t.code==="ENOENT")return;throw t}}c(Ae,"Ne"),p(Ae,"readOptionalFile");async function it(e,t){const s=t.projectType==="monorepo"?[".","apps/api-gateway","packages/db"]:["."],r={};for(const n of s){const l=await Ae(E(e,n,"package.json"));if(!l)continue;const d=JSON.parse(l),u={};if(typeof d=="object"&&d!==null&&"scripts"in d&&typeof d.scripts=="object"&&d.scripts!==null)for(const[m,h]of Object.entries(d.scripts))typeof h=="string"&&(u[m]=h);r[n]={scripts:u}}const a=[...(await Ae(E(e,"docker-compose.yml")))?.split(/^services:[^\S\r\n]*$/mu)[1]?.split(/^(?=\S)/mu)[0]?.matchAll(/^ {2}([\w-]+):[^\S\r\n]*$/gmu)??[]].map(n=>n[1]).filter(n=>n!==void 0&&n!==t.projectName),i=t.projectType==="monorepo"?"packages/db":".",o=await Ae(E(e,i,"src/database/orm/typeorm/data-source.ts"));return{composeServices:a,hasTypeormEntities:o!==void 0&&!/entities:\s*\[\s*\]/u.test(o),packages:r}}c(it,"Ft"),p(it,"readProjectSetupArtifacts");function Ls(e,t,s){return t==="."?`${e} run ${s}`:`${e} ${e==="pnpm"?"--dir":e==="npm"?"--prefix":"--cwd"} ${t} run ${s}`}c(Ls,"ni"),p(Ls,"scriptCommand");function Is(e){const t=[];return e.database.length>0&&(t.push("Set the selected database connection settings in .env."),e.database.includes("sqlserver")&&t.push("SQL Server requires an existing database."),e.database.includes("sqlite")&&t.push("Check that the SQLite file location is writable.")),(e.auth==="better-auth"||e.auth==="better-auth:stateless")&&t.push("Set BETTER_AUTH_SECRET to a random secret of at least 32 characters and configure BETTER_AUTH_URL and CORS_ORIGIN."),e.auth==="better-auth:stateless"&&t.push("Configure OIDC_PROVIDER_ID, OIDC_CLIENT_ID, OIDC_CLIENT_SECRET and OIDC_DISCOVERY_URL; register the Better Auth callback URL with your provider."),e.auth==="passport"&&t.push(e.database.length>0?"Set distinct random JWT_ACCESS_SECRET and JWT_REFRESH_SECRET values of at least 32 characters.":"Configure OIDC_JWKS_URI, OIDC_ISSUER and OIDC_AUDIENCE for your identity provider."),e.microservices.length>0&&t.push("Check the selected transport addresses and ports in .env."),t.length>0&&e.projectType==="monorepo"&&t.push("Make these variables available to apps/api-gateway and packages/db when running their scripts (for example, with a .env file in each package)."),t}c(Is,"pi"),p(Is,"environmentInstructions");function ot(e,t,s){const r=[];s.includeDirectory!==!1&&r.push({commands:[`cd "${s.outputDir??e.projectName}"`],id:"directory",title:"Move into the project directory"});const a=Is(e);a.length>0&&r.push({commands:[],description:a.join(" "),id:"environment",title:"Configure environment variables"}),s.dependenciesInstalled||r.push({commands:[`${e.packageManager} install`],id:"install",title:"Install dependencies"}),(e.database.some(o=>o!=="sqlite")||e.microservices.some(o=>o!=="grpc"))&&r.push({commands:t.composeServices.length>0?[`docker compose up -d --wait ${t.composeServices.join(" ")}`]:[],description:"Ensure the selected database servers and message brokers are reachable at the addresses configured in .env.",id:"services",title:"Start required services"});const i=p((o,n,l,d="")=>{const u=Object.entries(t.packages).find(([,m])=>Object.hasOwn(m.scripts,o));u&&r.push({commands:[`${Ls(e.packageManager,u[0],o)}${d}`],description:l,id:o,title:n})},"addScript");return e.auth==="better-auth"&&(e.orm.includes("prisma")||e.orm.includes("drizzle")?i("auth:generate","Generate the authentication schema"):i("auth:migrate","Initialize the authentication tables")),e.orm.includes("prisma")&&(i("prisma:push","Push the database schema","Apply the schema to your local development database."),i("prisma:generate","Generate Prisma Client")),e.orm.includes("drizzle")&&i("db:push","Push the database schema","Apply the schema to your local development database."),e.api.includes("trpc")&&i("trpc:generate","Generate tRPC types"),e.orm.includes("typeorm")&&t.hasTypeormEntities&&(i("build","Build the application for TypeORM"),Object.values(t.packages).some(o=>Object.hasOwn(o.scripts,"typeorm:generate:initial"))?i("typeorm:generate:initial","Generate the initial database migration"):i("typeorm:generate","Generate the initial database migration",void 0," src/database/orm/typeorm/migrations/InitialSchema"),i("typeorm:run","Apply database migrations")),i("dev","Start the development server"),r}c(ot,"Mt"),p(ot,"buildProjectNextSteps");function Os(e){return e.map((t,s)=>{const r=t.description?`
76
+
77
+ ${t.description}`:"",a=t.commands.length>0?`
78
+
79
+ \`\`\`bash
80
+ ${t.commands.map(i=>` ${i}`).join(`
81
+ `)}
82
+ \`\`\``:"";return`${s+1}. ${t.title}${r}${a}`}).join(`
83
+
84
+ `)}c(Os,"Ht"),p(Os,"renderProjectSetupMarkdown");const tn="single-project/architecture/nest-api",sn="single-project/architecture/nest-gateway",rn="single-project/architecture/nest-microservice",an="monorepo/root",on="monorepo/apps/api-gateway",nn="monorepo/packages",pn="addons/husky",ln="extras/docker",cn="extras/swagger",dn="extras/health",un="extras/database",mn="monorepo/packages/db",hn="feature/graphql/todo-example",fn="monorepo/feature/graphql/todo-example",Us="feature/rest/todo-example",Qs="monorepo/feature/rest/todo-example",gn=[{conditions:{extras:["docker"]},id:"extra-docker",name:"Docker Support",priority:5,templateGroups:[ln]},{conditions:{extras:["swagger"]},id:"extra-swagger",name:"Swagger Documentation",priority:5,templateGroups:[cn]},{conditions:{extras:["health-check"]},id:"extra-health-check",name:"Terminus Health Endpoints",priority:5,templateGroups:[dn]},{conditions:{database:["postgresql","mysql","sqlite","mongodb","sqlserver"]},id:"extra-database",name:"Database Module",priority:5,templateGroups:[un]},{conditions:{database:["postgresql","mysql","sqlite","mongodb","sqlserver"],projectType:"monorepo"},id:"monorepo-db-package",name:"Monorepo DB Package",priority:5,templateGroups:[mn]},{conditions:{api:["rest"],projectType:"single"},id:"feature-rest",name:"REST API templates (single)",priority:3,templateGroups:["feature/rest"]},{conditions:{api:["rest"],projectType:"monorepo"},id:"monorepo-feature-rest",name:"REST API templates (monorepo)",priority:3,templateGroups:["monorepo/feature/rest"]},{conditions:{api:["trpc"],projectType:"single"},id:"feature-trpc",name:"tRPC API templates (single)",priority:3,templateGroups:["feature/trpc"]},{conditions:{api:["trpc"],projectType:"monorepo"},id:"monorepo-feature-trpc",name:"tRPC API templates (monorepo)",priority:3,templateGroups:["monorepo/feature/trpc"]},{conditions:{api:["graphql"],projectType:"single"},id:"feature-graphql",name:"GraphQL API templates (single)",priority:3,templateGroups:["feature/graphql"]},{conditions:{api:["graphql"],projectType:"monorepo"},id:"monorepo-feature-graphql",name:"GraphQL API templates (monorepo)",priority:3,templateGroups:["monorepo/feature/graphql"]},{conditions:{api:["graphql"],extras:["todo-example"],projectType:"single"},id:"extra-todo-example",name:"Todo Example (single, graphql)",priority:5,templateGroups:[hn]},{conditions:{api:["graphql"],extras:["todo-example"],projectType:"monorepo"},id:"monorepo-extra-todo-example",name:"Todo Example (monorepo, graphql)",priority:5,templateGroups:[fn]},{conditions:{api:["rest"],extras:["todo-example"],projectType:"single"},id:"extra-rest-todo-example",name:"REST Todo Example (single)",priority:5,templateGroups:[Us]},{conditions:{api:["rest"],extras:["todo-example"],projectType:"monorepo"},id:"monorepo-extra-rest-todo-example",name:"REST Todo Example (monorepo)",priority:5,templateGroups:[Qs]},{conditions:{api:["trpc"],extras:["todo-example"],projectType:"single"},id:"extra-trpc-todo-example",name:"tRPC Todo Example (single)",priority:5,templateGroups:[Us]},{conditions:{api:["trpc"],extras:["todo-example"],projectType:"monorepo"},id:"monorepo-extra-trpc-todo-example",name:"tRPC Todo Example (monorepo)",priority:5,templateGroups:[Qs]}],yn=[{conditions:{architecture:"nest-api",projectType:"single"},id:"single-nest-api",name:"Single NestJS API",priority:10,templateGroups:[tn]},{conditions:{architecture:"nest-gateway",projectType:"single"},id:"single-nest-gateway",name:"Single NestJS Gateway",priority:10,templateGroups:[sn]},{conditions:{architecture:"nest-microservice",projectType:"single"},id:"single-nest-microservice",name:"Single NestJS Microservice",priority:10,templateGroups:[rn]},{conditions:{projectType:"monorepo"},id:"monorepo-root",name:"Monorepo Root",priority:10,templateGroups:[an,on,nn]},{conditions:{addons:["husky"]},id:"addon-husky",name:"Husky Git Hooks",priority:5,templateGroups:[pn]}],Fs=[...yn,...gn];function Hs(e){e.registerAll(Fs)}c(Hs,"as"),p(Hs,"initializeTemplateMappings");function bn(){return[...Fs]}c(bn,"fi"),p(bn,"getPredefinedMappings");class Be{static{c(this,"ce")}static{p(this,"TemplateMapper")}mappings=[];register(t){this.mappings.push(t),this.mappings.sort((s,r)=>(r.priority??0)-(s.priority??0))}registerAll(t){for(const s of t)this.register(s)}resolve(t){const s=[];for(const o of this.mappings)Be.matches(o.conditions,t)&&s.push(o);const r=[],a={},i=[];for(const o of s){for(const n of o.templateGroups)r.includes(n)||r.push(n);Object.assign(a,o.extraVariables),i.push(o.id)}return{extraVariables:a,matchedMappings:i,templateGroups:r}}findFirst(t){return this.mappings.find(s=>Be.matches(s.conditions,t))}getAll(){return[...this.mappings]}getById(t){return this.mappings.find(s=>s.id===t)}clear(){this.mappings=[]}static matches(t,s){return!(t.architecture!==void 0&&t.architecture!==s.architecture||t.projectType!==void 0&&t.projectType!==s.projectType||t.database!==void 0&&!t.database.some(r=>s.database.includes(r))||t.orm!==void 0&&!t.orm.some(r=>s.orm.includes(r))||t.api!==void 0&&!t.api.some(r=>s.api.includes(r))||t.extras!==void 0&&!t.extras.some(r=>s.extras.includes(r))||t.addons!==void 0&&!t.addons.some(r=>s.addons.includes(r))||t.microservices!==void 0&&!t.microservices.some(r=>s.microservices.includes(r)))}}function Ms(e){return e.replaceAll(/([a-z])([A-Z])/gu,"$1-$2").replaceAll(/\s+/gu,"-").toLowerCase()}c(Ms,"gi"),p(Ms,"toKebabCase");function Ns(e){return e.replaceAll(/[-_\s](.)/gu,(t,s)=>s.toUpperCase()).replace(/^(.)/u,t=>t.toLowerCase())}c(Ns,"is"),p(Ns,"toCamelCase");function Gs(e){return e.replaceAll(/[-_\s](.)/gu,(t,s)=>s.toUpperCase()).replace(/^(.)/u,t=>t.toUpperCase())}c(Gs,"yi"),p(Gs,"toPascalCase");function Bs(e){const t=e.database.includes("postgresql"),s=e.database.includes("mysql"),r=e.database.includes("sqlite"),a=e.database.includes("mongodb"),i=e.database.includes("sqlserver"),o=e.orm.includes("prisma"),n=e.orm.includes("typeorm"),l=e.orm.includes("drizzle"),d=e.database.length>0&&!o&&!n&&!l;let u=`${e.packageManager} run`;e.packageManager==="npm"?u="npm run":e.packageManager==="yarn"&&(u="yarn");const m=[];return e.projectType!=="monorepo"&&l&&(e.auth==="better-auth"&&m.push(`${u} auth:generate`),i||m.push(`${u} db:generate`)),{addons:[...e.addons],apiType:e.api[0]??null,apis:[...e.api],architecture:e.architecture,auth:e.auth,databasePorts:{mongodb:27017,mysql:3306,postgres:5432,sqlserver:1433},databaseType:e.database[0]??null,databases:[...e.database],dockerBuildSetupCommands:m,description:e.description||"A NestJS application",docker:e.extras.includes("docker"),extras:[...e.extras],graphqlPlayground:e.api.includes("graphql"),hasAuth:e.auth!=="none",hasFormatter:e.formatter!=="none",hasBetterAuthWithoutRest:(e.auth==="better-auth"||e.auth==="better-auth:stateless")&&!e.api.includes("rest"),hasDatabase:e.database.length>0,hasGraphql:e.api.includes("graphql"),hasHealthCheck:e.extras.includes("health-check"),hasMongodb:a,hasSqlserver:i,hasMysql:s,hasOrm:e.orm.length>0,hasPostgres:t,hasRateLimiting:e.extras.includes("rate-limiting"),hasTrustedProxy:(e.trustedProxyIps?.length??0)>0,hasRest:e.api.includes("rest"),hasSqlite:r,hasTodoExample:e.extras.includes("todo-example"),hasTrpc:e.api.includes("trpc"),hasTrpcAndAuth:e.api.includes("trpc")&&e.auth!=="none",httpProvider:e.httpProvider,initGit:e.initGit,isBetterAuth:e.auth==="better-auth"||e.auth==="better-auth:stateless",isBun:e.packageManager==="bun",isMonorepo:e.projectType==="monorepo",isNpm:e.packageManager==="npm",isPassportAuth:e.auth==="passport",isPnpm:e.packageManager==="pnpm",isSingle:e.projectType==="single",isYarn:e.packageManager==="yarn",microservices:[...e.microservices],trustedProxyIps:[...e.trustedProxyIps??[]],ormType:e.orm[0]??null,orms:[...e.orm],packageManager:e.packageManager,projectName:e.projectName,projectNameCamelCase:Ns(e.projectName),projectNameKebab:Ms(e.projectName),projectNamePascalCase:Gs(e.projectName),projectType:e.projectType,shouldImportAuthModule:e.auth!=="none"&&(e.api.includes("rest")||e.api.includes("graphql")),supportsCatalog:["pnpm","yarn","bun"].includes(e.packageManager),swagger:e.extras.includes("swagger"),trpcGeneratePath:e.projectType==="monorepo"?"../../packages/shared/src/trpc/@generated":"src/libs/trpc/@generated",useDrizzle:l,usePrisma:o,isPrisma8:o&&(e.prismaVersion==="8"||a&&!e.prismaVersion||!e.prismaVersion&&!s&&!r&&!i),isPrisma6:o&&e.prismaVersion==="6",isPrisma7:o&&(e.prismaVersion==="7"||s||i||r||e.prismaVersion!=="8"&&!a),isPrismaMongo:o&&a&&(e.prismaVersion==="8"||e.prismaVersion!=="7"),isPrismaPostgres:o&&t&&(e.prismaVersion==="8"||!e.prismaVersion&&!s&&!r),useRawSql:d,useSwaggerScalar:e.extras.includes("swagger")&&e.addons.includes("scalar-ui"),useTypeorm:n,useTypescript7:e.extras.includes("typescript-7"),year:new Date().getFullYear()}}c(Bs,"os"),p(Bs,"buildTemplateVariables");function Vs(e,t){return{...e,...t}}c(Vs,"ns"),p(Vs,"mergeTemplateExtras");class B{static{c(this,"G")}static{p(this,"BetterAuthGenerator")}project;config;environmentImport(){return`import { env } from "${this.config.envImport??"../config/env.js"}";`}hasRateLimiting(){return(this.config.extras??[]).includes("rate-limiting")}rateLimitOption(){return this.hasRateLimiting()?[" rateLimit: { enabled: true, max: 60, window: 60 },"]:[]}constructor(t,s){this.project=t,this.config=s}generate(t){this.generateCliConfig(t);const s=this.config.orm??[],r=this.config.database??[],a=r.length>0,i=this.config.skipModule??!1;if(this.config.api?.includes("graphql")&&this.generateGraphqlAuthSupport(t),this.config.strategy==="better-auth:stateless"||!a){this.generateStateless(t,i);return}const o=s.includes("prisma"),n=s.includes("drizzle"),l=s.includes("typeorm");o?(this.generatePrisma(t,r),i||this.generateModule(t,"prisma")):n?(this.generateDrizzle(t,r),i||this.generateModule(t,"drizzle")):l?(this.generateNative(t,r),i||this.generateTypeormModule(t,r)):(this.generateNative(t,r),i||this.generateModule(t,"raw.sql"))}generateGraphqlAuthSupport(t){const s=['import { CanActivate, ExecutionContext, Injectable, UnauthorizedException } from "@nestjs/common";','import { GqlExecutionContext } from "@nestjs/graphql";','import { AuthService } from "@thallesp/nestjs-better-auth";','import { fromNodeHeaders } from "better-auth/node";','import type { IncomingHttpHeaders } from "node:http";',...this.config.strategy==="better-auth:stateless"?['import { auth } from "../auth.js";']:[],"","interface GraphqlRequest {"," headers: IncomingHttpHeaders;"," user?: { id: string };","}","","@Injectable()","export class GqlAuthGuard implements CanActivate {",...this.config.strategy==="better-auth:stateless"?[" private readonly auth = auth;"]:[" constructor(private readonly authService: AuthService) {}"," private get auth() { return this.authService.instance; }"]," async canActivate(context: ExecutionContext): Promise<boolean> {"," const { req } = GqlExecutionContext.create(context).getContext<{ req: GraphqlRequest }>();"," const session = await this.auth.api.getSession({ headers: fromNodeHeaders(req.headers) });"," if (!session) throw new UnauthorizedException();"," req.user = session.user;"," return true;"," }","}",""].join(`
85
+ `);this.project.createSourceFile(k.join(t,"guards/gql-auth.guard.ts"),s,{overwrite:!0});const r=['import { CanActivate, ExecutionContext, Injectable, UnauthorizedException } from "@nestjs/common";','import { AuthService } from "@thallesp/nestjs-better-auth";','import { fromNodeHeaders } from "better-auth/node";','import type { IncomingHttpHeaders } from "node:http";',...this.config.strategy==="better-auth:stateless"?['import { auth } from "../auth.js";']:[],"","interface AuthenticatedRequest { headers: IncomingHttpHeaders; session?: { user: { id: string } }; user?: { id: string }; }","@Injectable()","export class RestAuthGuard implements CanActivate {",...this.config.strategy==="better-auth:stateless"?[" private readonly auth = auth;"]:[" constructor(private readonly authService: AuthService) {}"," private get auth() { return this.authService.instance; }"]," async canActivate(context: ExecutionContext): Promise<boolean> {"," const request = context.switchToHttp().getRequest<AuthenticatedRequest>();"," const session = await this.auth.api.getSession({ headers: fromNodeHeaders(request.headers) });"," if (!session) throw new UnauthorizedException();"," request.session = session;"," request.user = session.user;"," return true;"," }","}",""].join(`
86
+ `);this.project.createSourceFile(k.join(t,"guards/rest-auth.guard.ts"),r,{overwrite:!0});const a=['import { createParamDecorator, ExecutionContext } from "@nestjs/common";','import { GqlExecutionContext } from "@nestjs/graphql";',"","export const UserEntity = createParamDecorator("," (_data: unknown, context: ExecutionContext) => {"," const gqlContext = GqlExecutionContext.create(context);"," return gqlContext.getContext<{ req: { user: { id: string } } }>().req.user;"," }",");",""].join(`
87
+ `);this.project.createSourceFile(k.join(t,"decorators/user.decorator.ts"),a,{overwrite:!0}),this.project.createSourceFile(k.join(t,"decorators/index.ts"),`export { UserEntity } from "./user.decorator.js";
88
+ `,{overwrite:!0})}generateAuthOnly(t){this.generateCliConfig(t);const s=this.config.database??[],r=s.length>0;if(this.config.strategy==="better-auth:stateless"||!r){this.generateStateless(t,!0);return}const a=this.config.orm??[],i=a.includes("prisma"),o=a.includes("drizzle"),n=a.includes("typeorm");i?this.generatePrisma(t,s):o?this.generateDrizzle(t,s):n?this.generateNative(t,s):this.generateNative(t,s)}generateCliConfig(t){const s=this.config.orm??[],r=this.config.database??[];if(this.config.strategy==="better-auth:stateless"||r.length===0){this.project.createSourceFile(k.join(t,"auth.cli.ts"),`export { auth } from "./auth.js";
89
+ `,{overwrite:!0});return}const a=s.includes("prisma"),i=s.includes("drizzle"),o=r.includes("postgresql"),n=r.includes("mysql"),l=r.includes("mongodb"),d=r.includes("sqlserver"),u=B.sqlDialect(o,n,l,d);if(a&&l&&this.project.createSourceFile(k.resolve(t,"../../scripts/install-auth-schema.mjs"),['import { readFile, writeFile } from "node:fs/promises";','const schema = await readFile("auth-schema.prisma", "utf8");','const datasource = schema.match(/datasource\\s+\\w+\\s*\\{[^}]*provider\\s*=\\s*"(?<provider>[^"]+)"/msu)?.groups?.provider ?? "postgresql";','const models = schema.replace(/^(?:generator|datasource)\\s+\\w+\\s*\\{[^}]*\\}/gmu, "").trim();',"const normalizeMongo = (content) => {"," let next = content;",String.raw` next = next.replace(/^(?<idPrefix>(?:\s*id\s+String\s+)).*$/gmu, '$<idPrefix>@id @default(auto()) @map("_id") @db.ObjectId');`,String.raw` next = next.replace(/@map\("_id"\)\s*@db\.ObjectId\s*@map\("_id"\)/gu, '@map("_id") @db.ObjectId');`,String.raw` next = next.replace(/@map\("_id"\)\s*@map\("_id"\)/gu, '@map("_id")');`,String.raw` next = next.replace(/^(?<relation>\s*(?:userId|sessionId|accountId)\s+String)(?!\s+@db\.ObjectId)/gmu, '$<relation> @db.ObjectId');`," return next;","};",'const normalized = datasource === "mongodb" ? normalizeMongo(models) : models;','if (!normalized.includes("model User")) throw new Error("Auth CLI produced no User model");',`await writeFile("${this.config.projectType==="monorepo"?"../../packages/db/src/database/orm/prisma/auth.prisma":"src/database/orm/prisma/auth.prisma"}", normalized + "\\n");`].join(`
90
+ `),{overwrite:!0}),a){this.project.createSourceFile(k.join(t,"auth.cli.ts"),['import { betterAuth } from "better-auth";','import { prismaAdapter } from "better-auth/adapters/prisma";',this.environmentImport(),"// Schema discovery needs adapter metadata, not a live database connection.","export const auth = betterAuth({"," secret: env.BETTER_AUTH_SECRET,"," baseURL: env.BETTER_AUTH_URL,",` database: prismaAdapter({} as never, { provider: "${u}" }),`," emailAndPassword: { enabled: true },","});"].join(`
91
+ `),{overwrite:!0});return}if(i){const v=B.drizzleProvider(o,n);this.project.createSourceFile(k.join(t,"auth.cli.ts"),['import { betterAuth } from "better-auth";','import { drizzleAdapter } from "@better-auth/drizzle-adapter";',this.environmentImport(),"// Schema discovery needs adapter metadata, not a live database connection.","export const auth = betterAuth({"," secret: env.BETTER_AUTH_SECRET,"," baseURL: env.BETTER_AUTH_URL,",` database: drizzleAdapter({} as never, { provider: "${v}" }),`," emailAndPassword: { enabled: true },","});"].join(`
92
+ `),{overwrite:!0});return}const m=B.nativeClientImport(r),h=B.nativeClientConstructor(r),g=r.includes("sqlite");this.project.createSourceFile(k.join(t,"auth.cli.ts"),['import { betterAuth } from "better-auth";',...g?['import type { Auth, BetterAuthOptions } from "better-auth";']:[],this.environmentImport(),m.trim(),...g?['type AuthOptions = Omit<BetterAuthOptions, "baseURL" | "database" | "emailAndPassword" | "secret"> & { baseURL: string; database: Database.Database; emailAndPassword: { enabled: true }; secret: string };',""]:[],"// CLI-only connection used for schema discovery and migrations.",`export const auth${g?": Auth<AuthOptions>":""} = betterAuth({`," secret: env.BETTER_AUTH_SECRET,"," baseURL: env.BETTER_AUTH_URL,",` database: ${h},`," emailAndPassword: { enabled: true },","});"].join(`
93
+ `),{overwrite:!0})}generatePrisma(t,s){const r=B.prismaProvider(s),a=this.config.extras?.includes("swagger");let i='import { PrismaClient } from "../database/orm/prisma/generated/client.js";';this.config.projectType==="monorepo"&&(i='import type { PrismaClient } from "@repo/db";'),this.config.prismaVersion==="6"&&(i='import { PrismaClient } from "@prisma/client";');const o=[this.environmentImport(),'import { betterAuth } from "better-auth";','import { prismaAdapter } from "better-auth/adapters/prisma";',i,...a?['import { openAPI } from "better-auth/plugins";']:[],"","export function createAuth(prisma: PrismaClient) {"," return betterAuth({"," secret: env.BETTER_AUTH_SECRET,"," baseURL: env.BETTER_AUTH_URL,",` database: prismaAdapter(prisma, { provider: "${r}" }),`,...s.includes("mongodb")?[" advanced: { database: { generateId: false } },"]:[]," emailAndPassword: { enabled: true },",...this.rateLimitOption(),...a?[" plugins: [openAPI()],"]:[]," });","}","","export type UserSession = ReturnType<typeof createAuth>['$Infer']['Session'];"],n=k.join(t,"auth.ts");this.project.createSourceFile(n,o.join(`
94
+ `),{overwrite:!0})}generateDrizzle(t,s){const r=s.includes("postgresql"),a=s.includes("mysql");let i,o,n;r?(i="NodePgDatabase",o="drizzle-orm/node-postgres",n="pg"):a?(i="MySql2Database",o="drizzle-orm/mysql2",n="mysql"):(i="BetterSQLite3Database",o="drizzle-orm/better-sqlite3",n="sqlite");const l=this.config.extras?.includes("swagger"),d=['import { betterAuth } from "better-auth";','import { drizzleAdapter } from "@better-auth/drizzle-adapter";',`import type { ${i} } from "${o}";`,this.environmentImport(),'import * as schema from "../database/orm/drizzle/schema.js";',...l?['import { openAPI } from "better-auth/plugins";']:[],"",`export function createAuth(db: ${i}<typeof schema>) {`," return betterAuth({"," secret: env.BETTER_AUTH_SECRET,"," baseURL: env.BETTER_AUTH_URL,",` database: drizzleAdapter(db, { provider: "${n}", schema }),`," emailAndPassword: { enabled: true, minPasswordLength: 8 },",...this.rateLimitOption(),...l?[" plugins: [openAPI()],"]:[]," });","}","","export type UserSession = ReturnType<typeof createAuth>['$Infer']['Session'];"],u=k.join(t,"auth.ts");this.project.createSourceFile(u,d.join(`
95
+ `),{overwrite:!0}),this.config.projectType!=="monorepo"&&this.project.createSourceFile(k.resolve(this.config.outputDir,"../scripts/normalize-drizzle-auth-schema.mjs"),['import { readFile, writeFile } from "node:fs/promises";','const schemaPath = "src/database/orm/drizzle/auth-schema.ts";','const disableInlineCommentRule = "// oxlint-disable eslint/no-inline-comments";','const schema = await readFile(schemaPath, "utf8");',"if (!schema.startsWith(disableInlineCommentRule)) {",' await writeFile(schemaPath, disableInlineCommentRule + "\\n" + schema);',"}",""].join(`
96
+ `),{overwrite:!0})}generateNative(t,s){const r=this.config.extras?.includes("swagger"),a=s.includes("sqlite"),i=[this.environmentImport(),'import { betterAuth } from "better-auth";',...a?['import type { Auth, BetterAuthOptions } from "better-auth";']:[],B.nativeClientImport(s).trim(),...r?['import { openAPI } from "better-auth/plugins";']:[],"",...a?['type AuthOptions = Omit<BetterAuthOptions, "baseURL" | "database" | "emailAndPassword" | "secret"> & { baseURL: string; database: Database.Database; emailAndPassword: { enabled: true }; secret: string };',""]:[],`export function createAuth(pool: ${B.nativeClientType(s)})${a?": Auth<AuthOptions>":""} {`," return betterAuth({"," secret: env.BETTER_AUTH_SECRET,"," baseURL: env.BETTER_AUTH_URL,"," database: pool,"," emailAndPassword: { enabled: true },",...this.rateLimitOption(),...r?[" plugins: [openAPI()],"]:[],` })${a?" as unknown as Auth<AuthOptions>":""};`,"}","","export type UserSession = ReturnType<typeof createAuth>['$Infer']['Session'];"],o=k.join(t,"auth.ts");this.project.createSourceFile(o,i.join(`
97
+ `),{overwrite:!0})}static prismaProvider(t){return t.includes("mongodb")?"mongodb":t.includes("postgresql")?"postgresql":t.includes("mysql")?"mysql":t.includes("sqlserver")?"sqlserver":"sqlite"}static sqlDialect(t,s,r,a){return r?"mongodb":t?"postgresql":s?"mysql":a?"sqlserver":"sqlite"}static drizzleProvider(t,s){return t?"pg":s?"mysql":"sqlite"}static nativeClientImport(t){const s=t.includes("postgresql"),r=t.includes("mysql");return s?'import { Pool } from "pg";':r?'import { createPool } from "mysql2/promise";':'import Database from "better-sqlite3";'}static nativeClientType(t){const s=t.includes("postgresql"),r=t.includes("mysql");return s?"Pool":r?"ReturnType<typeof createPool>":"Database.Database"}static nativeClientConstructor(t){const s=t.includes("postgresql"),r=t.includes("mysql");return s?"new Pool({ connectionString: env.POSTGRES_URL })":r?"createPool({ uri: env.MYSQL_URL })":"new Database(env.SQLITE_PATH)"}generateStateless(t,s=!1){const r=this.config.extras?.includes("swagger"),a=['import { betterAuth } from "better-auth";',`import { genericOAuth${r?", openAPI":""} } from "better-auth/plugins";`,this.environmentImport(),"","export const auth = betterAuth({"," secret: env.BETTER_AUTH_SECRET,"," baseURL: env.BETTER_AUTH_URL,"," session: {"," cookieCache: {"," enabled: true,"," // Seven days"," maxAge: 7 * 24 * 60 * 60,",' strategy: "jwe",'," },"," },"," account: {"," storeAccountCookie: true,",' storeStateStrategy: "cookie",'," },",...this.rateLimitOption()," plugins: ["," genericOAuth({"," config: [{"," clientId: env.OIDC_CLIENT_ID,"," clientSecret: env.OIDC_CLIENT_SECRET,"," discoveryUrl: env.OIDC_DISCOVERY_URL,"," providerId: env.OIDC_PROVIDER_ID,",' scopes: ["openid", "email", "profile"],'," }],"," }),",...r?[" openAPI(),"]:[]," ],","});","","export type UserSession = typeof auth.$Infer.Session;"].join(`
98
+ `),i=k.join(t,"auth.ts");this.project.createSourceFile(i,a,{overwrite:!0}),s||this.generateStatelessModule(t)}generateModule(t,s){const r=(this.config.orm??[]).some(o=>o==="prisma"||o==="drizzle");r&&this.project.createSourceFile(k.join(t,"profile.controller.ts"),[`import { Controller, Get${this.config.api?.includes("graphql")?", UseGuards":""} } from "@nestjs/common";`,...this.config.projectType==="monorepo"&&this.config.extras?.includes("packages/shared")?['import type { AuthUserProfile } from "@repo/shared/auth";']:[],...this.config.api?.includes("graphql")?['import { RestAuthGuard } from "./guards/rest-auth.guard.js";']:[],'import { Session } from "@thallesp/nestjs-better-auth";','import type { UserSession } from "./auth.js";','@Controller("auth-profile")',...this.config.api?.includes("graphql")?["@UseGuards(RestAuthGuard)"]:[],"export class ProfileController {"," @Get()",this.config.projectType==="monorepo"&&this.config.extras?.includes("packages/shared")?" profile(@Session() session: UserSession): AuthUserProfile { return { id: session.user.id, email: session.user.email }; }":" profile(@Session() session: UserSession) { return { id: session.user.id, email: session.user.email }; }","}"].join(`
99
+ `),{overwrite:!0});const a=['import { Module } from "@nestjs/common";','import { AuthModule as BetterAuthModule } from "@thallesp/nestjs-better-auth";',this.config.projectType==="monorepo"?'import { DbService } from "@repo/db";':'import { DbService } from "../database/db.service.js";','import { createAuth } from "./auth.js";',...r?['import { ProfileController } from "./profile.controller.js";']:[],"","@Module({",...r?[" controllers: [ProfileController],"]:[]," exports: [BetterAuthModule],"," imports: ["," BetterAuthModule.forRootAsync({",...this.config.api?.includes("graphql")?[" disableGlobalAuthGuard: true,"]:[]," inject: [DbService],"," useFactory: (db: DbService) => ({",` auth: createAuth(db.${s}),`,...this.config.api?.includes("graphql")&&this.config.strategy!=="better-auth:stateless"?[]:[]," }),"," }),"," ],","})","export class AuthModule {}",""],i=k.join(t,"auth.module.ts");this.project.createSourceFile(i,a.join(`
100
+ `),{overwrite:!0})}generateTypeormModule(t,s){const{clientImport:r,poolType:a,poolCtor:i,destroyCalls:o}=B.nativeModuleParts(s),n=a==="DatabaseType"?`this.pool.${o};`:`return this.pool.${o};`,l=['import { Injectable, type OnModuleDestroy } from "@nestjs/common";',r,this.environmentImport(),"","@Injectable()","export class AuthPool implements OnModuleDestroy {",` readonly pool: ${a};`," constructor() {",` this.pool = ${i};`," }"," onModuleDestroy(): Promise<void> | void {",` ${n}`," }","}",""];this.project.createSourceFile(k.join(t,"auth.pool.ts"),l.join(`
101
+ `),{overwrite:!0});const d=['import { Module } from "@nestjs/common";','import { AuthPool } from "./auth.pool.js";',"","@Module({ exports: [AuthPool], providers: [AuthPool] })","export class AuthPoolModule {}",""];this.project.createSourceFile(k.join(t,"auth-pool.module.ts"),d.join(`
102
+ `),{overwrite:!0});const u=['import { Module } from "@nestjs/common";','import { AuthModule as BetterAuthModule } from "@thallesp/nestjs-better-auth";','import { AuthPool } from "./auth.pool.js";','import { AuthPoolModule } from "./auth-pool.module.js";','import { createAuth } from "./auth.js";',"","@Module({"," controllers: [],"," exports: [BetterAuthModule],"," imports: ["," AuthPoolModule,"," BetterAuthModule.forRootAsync({"," imports: [AuthPoolModule],"," inject: [AuthPool],"," useFactory: (pool: AuthPool) => ({"," auth: createAuth(pool.pool),"," }),"," }),"," ],","})","export class AuthModule {}",""],m=k.join(t,"auth.module.ts");this.project.createSourceFile(m,u.join(`
103
+ `),{overwrite:!0})}static nativeModuleParts(t){const s=t.includes("postgresql"),r=t.includes("mysql");return s?{clientImport:'import { Pool } from "pg";',destroyCalls:"end()",poolCtor:"new Pool({ connectionString: env.POSTGRES_URL })",poolType:"Pool"}:r?{clientImport:'import { createPool, type Pool as MysqlPool } from "mysql2/promise";',destroyCalls:"end()",poolCtor:"createPool({ uri: env.MYSQL_URL })",poolType:"MysqlPool"}:{clientImport:'import Database, { type Database as DatabaseType } from "better-sqlite3";',destroyCalls:"close()",poolCtor:"new Database(env.SQLITE_PATH)",poolType:"DatabaseType"}}generateStatelessModule(t){const s=['import { Module } from "@nestjs/common";','import { AuthModule as BetterAuthModule } from "@thallesp/nestjs-better-auth";','import { auth } from "./auth.js";',"","@Module({"," imports: [BetterAuthModule.forRoot({ auth })],"," exports: [BetterAuthModule],","})","export class AuthModule {}",""],r=k.join(t,"auth.module.ts");this.project.createSourceFile(r,s.join(`
104
+ `),{overwrite:!0})}}function Js(e,t,s){const r={"auth.controller.ts":`import { BadRequestException, Body, Controller, Get, HttpCode, Post, Req, UseGuards } from "@nestjs/common";
105
+ ${s?`import {
106
+ ApiBadRequestResponse,
107
+ ApiBearerAuth,
108
+ ApiBody,
109
+ ApiConflictResponse,
110
+ ApiCreatedResponse,
111
+ ApiOkResponse,
112
+ ApiOperation,
113
+ ApiTags,
114
+ ApiUnauthorizedResponse,
115
+ } from "@nestjs/swagger";`:""}
116
+ import { z } from "zod";
117
+ import { AuthService } from "./auth.service.js";
118
+ import { RestAuthGuard } from "./guards/rest-auth.guard.js";
119
+
120
+ const credentials = z.object({ email: z.email().transform((value) => value.toLowerCase()), password: z.string().min(12).max(72).refine((value) => Buffer.byteLength(value, "utf8") <= 72) }).strict();
121
+ const refreshBody = z.object({ refreshToken: z.string().min(32).max(256) }).strict();
122
+ function validate<T>(schema: z.ZodType<T>, body: unknown): T {
123
+ const result = schema.safeParse(body);
124
+ if (!result.success) throw new BadRequestException("Invalid authentication input");
125
+ return result.data;
126
+ }
127
+
128
+ ${s?`@ApiTags("Authentication")
129
+ `:""}@Controller("auth")
130
+ export class AuthController {
131
+ constructor(private readonly auth: AuthService) {}
132
+ @Post("register")
133
+ ${s?` @ApiOperation({ summary: "Register an account" })
134
+ @ApiBody({ schema: { type: "object", properties: { email: { format: "email", type: "string" }, password: { format: "password", type: "string" } }, required: ["email", "password"] } })
135
+ @ApiCreatedResponse({ description: "Account created" })
136
+ @ApiConflictResponse({ description: "Account already exists" })
137
+ @ApiBadRequestResponse({ description: "Invalid registration input" })
138
+ `:""}
139
+ register(@Body() body: unknown) { const input = validate(credentials, body); return this.auth.register(input.email, input.password); }
140
+ @Post("login") @HttpCode(200)
141
+ ${s?` @ApiOperation({ summary: "Create an authenticated session" })
142
+ @ApiBody({ schema: { type: "object", properties: { email: { format: "email", type: "string" }, password: { format: "password", type: "string" } }, required: ["email", "password"] } })
143
+ @ApiOkResponse({ description: "Access and refresh tokens" })
144
+ @ApiUnauthorizedResponse({ description: "Invalid credentials" })
145
+ `:""}
146
+ login(@Body() body: unknown) { const input = validate(credentials, body); return this.auth.login(input.email, input.password); }
147
+ @Post("refresh") @HttpCode(200)
148
+ ${s?` @ApiOperation({ summary: "Rotate a refresh token" })
149
+ @ApiBody({ schema: { type: "object", properties: { refreshToken: { type: "string" } }, required: ["refreshToken"] } })
150
+ @ApiOkResponse({ description: "Rotated access and refresh tokens" })
151
+ `:""}
152
+ refresh(@Body() body: unknown) { return this.auth.refresh(validate(refreshBody, body).refreshToken); }
153
+ @Post("logout") @HttpCode(200)
154
+ ${s?` @ApiOperation({ summary: "Revoke a refresh-token family" })
155
+ @ApiBody({ schema: { type: "object", properties: { refreshToken: { type: "string" } }, required: ["refreshToken"] } })
156
+ @ApiOkResponse({ description: "Session revoked" })
157
+ `:""}
158
+ logout(@Body() body: unknown) { return this.auth.logout(validate(refreshBody, body).refreshToken); }
159
+ @Get("profile") @UseGuards(RestAuthGuard)
160
+ ${s?` @ApiBearerAuth()
161
+ @ApiOperation({ summary: "Get the authenticated profile" })
162
+ @ApiOkResponse({ description: "Authenticated profile" })
163
+ @ApiUnauthorizedResponse({ description: "Authentication required" })
164
+ `:""}
165
+ profile(@Req() request: { user: unknown }) { return request.user; }
166
+ }
167
+ `,"auth.module.ts":`import { Module } from "@nestjs/common";
168
+ import { JwtModule } from "@nestjs/jwt";
169
+ import { PassportModule } from "@nestjs/passport";
170
+ import { env } from "../config/env.js";
171
+ import { AuthService } from "./auth.service.js";
172
+ import { AuthController } from "./auth.controller.js";
173
+ import { JwtStrategy } from "./strategies/jwt.strategy.js";
174
+ import { RestAuthGuard } from "./guards/rest-auth.guard.js";
175
+ @Module({
176
+ imports: [PassportModule.register({ defaultStrategy: "jwt" }), JwtModule.register({ secret: env.JWT_ACCESS_SECRET, signOptions: { algorithm: "HS256", audience: env.JWT_AUDIENCE, expiresIn: "15m", issuer: env.JWT_ISSUER, keyid: env.JWT_KEY_ID } })],
177
+ controllers: [AuthController], providers: [AuthService, JwtStrategy, RestAuthGuard], exports: [AuthService, JwtModule, RestAuthGuard],
178
+ })
179
+ export class AuthModule {}
180
+ `,"auth.service.ts":`import { Injectable, UnauthorizedException, ConflictException } from "@nestjs/common";
181
+ import { JwtService } from "@nestjs/jwt";
182
+ import { createHash, randomBytes, randomUUID } from "node:crypto";
183
+ import { compare, hash } from "bcrypt";
184
+ import { DbService } from "../database/db.service.js";
185
+
186
+ const publicUser = { id: true, email: true, role: true } as const;
187
+ const digest = (token: string) => createHash("sha256").update(token).digest("hex");
188
+
189
+ @Injectable()
190
+ export class AuthService {
191
+ constructor(private readonly db: DbService, private readonly jwt: JwtService) {}
192
+
193
+ async register(email: string, password: string) {
194
+ const passwordHash = await hash(password, 12);
195
+ try {
196
+ return await this.db.prisma.user.create({ data: { email, password: passwordHash }, select: publicUser });
197
+ } catch (error) {
198
+ if (typeof error === "object" && error !== null && "code" in error && error.code === "P2002") {
199
+ throw new ConflictException("Account already exists");
200
+ }
201
+ throw error;
202
+ }
203
+ }
204
+
205
+ async login(email: string, password: string) {
206
+ const user = await this.db.prisma.user.findUnique({ where: { email }, select: { id: true, password: true } });
207
+ if (!user || !(await compare(password, user.password))) throw new UnauthorizedException("Invalid credentials");
208
+ const familyId = randomUUID();
209
+ const refreshToken = randomBytes(32).toString("base64url");
210
+ await this.db.prisma.refreshToken.create({ data: { userId: user.id, familyId, tokenHash: digest(refreshToken), expiresAt: new Date(Date.now() + 7 * 86_400_000) } });
211
+ return this.tokens(user.id, familyId, refreshToken);
212
+ }
213
+
214
+ private async tokens(userId: string, familyId: string, refreshToken: string) {
215
+ return { accessToken: await this.jwt.signAsync({ sub: userId, sid: familyId, jti: randomUUID() }), refreshToken };
216
+ }
217
+
218
+ async refresh(token: string) {
219
+ const replacement = randomBytes(32).toString("base64url");
220
+ const result = await this.db.prisma.$transaction(async (tx) => {
221
+ const current = await tx.refreshToken.findUnique({ where: { tokenHash: digest(token) } });
222
+ if (!current) return null;
223
+ const changed = await tx.refreshToken.updateMany({ data: { consumedAt: new Date() }, where: { consumedAt: null, expiresAt: { gt: new Date() }, id: current.id, revokedAt: null } });
224
+ if (changed.count !== 1) {
225
+ await tx.refreshToken.updateMany({ data: { revokedAt: new Date() }, where: { familyId: current.familyId } });
226
+ return null;
227
+ }
228
+ await tx.refreshToken.create({ data: { userId: current.userId, familyId: current.familyId, tokenHash: digest(replacement), expiresAt: current.expiresAt } });
229
+ return current;
230
+ });
231
+ if (!result) throw new UnauthorizedException("Invalid refresh token");
232
+ return this.tokens(result.userId, result.familyId, replacement);
233
+ }
234
+
235
+ async logout(token: string) {
236
+ const current = await this.db.prisma.refreshToken.findUnique({ where: { tokenHash: digest(token) } });
237
+ if (current) await this.db.prisma.refreshToken.updateMany({ data: { revokedAt: new Date() }, where: { familyId: current.familyId } });
238
+ return { success: true };
239
+ }
240
+
241
+ async validate(payload: Record<string, unknown>) {
242
+ if (typeof payload.sub !== "string" || typeof payload.sid !== "string" || typeof payload.exp !== "number" || typeof payload.iat !== "number" || typeof payload.jti !== "string") throw new UnauthorizedException();
243
+ const session = await this.db.prisma.refreshToken.findFirst({ where: { consumedAt: null, expiresAt: { gt: new Date() }, familyId: payload.sid, revokedAt: null, userId: payload.sub }, select: { user: { select: publicUser } } });
244
+ if (!session) throw new UnauthorizedException();
245
+ return session.user;
246
+ }
247
+ }
248
+ `,"decorators/current-user.decorator.ts":`import { createParamDecorator, type ExecutionContext } from "@nestjs/common";
249
+
250
+ export const CurrentUser = createParamDecorator(
251
+ (_data: unknown, context: ExecutionContext) => {
252
+ const request = context.switchToHttp().getRequest<{ user: unknown }>();
253
+ return request.user;
254
+ }
255
+ );
256
+ `,"guards/rest-auth.guard.ts":`import { Injectable } from "@nestjs/common";
257
+ import { AuthGuard } from "@nestjs/passport";
258
+ @Injectable()
259
+ export class RestAuthGuard extends AuthGuard("jwt") {}
260
+ `,"strategies/jwt.strategy.ts":`import { Injectable } from "@nestjs/common";
261
+ import { PassportStrategy } from "@nestjs/passport";
262
+ import { ExtractJwt, Strategy } from "passport-jwt";
263
+ import { env } from "../../config/env.js";
264
+ import { AuthService } from "../auth.service.js";
265
+ @Injectable()
266
+ export class JwtStrategy extends PassportStrategy(Strategy) {
267
+ constructor(private readonly auth: AuthService) {
268
+ super({ jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(), secretOrKey: env.JWT_ACCESS_SECRET, algorithms: ["HS256"], issuer: env.JWT_ISSUER, audience: env.JWT_AUDIENCE, ignoreExpiration: false });
269
+ }
270
+ validate(payload: Record<string, unknown>) { return this.auth.validate(payload); }
271
+ }
272
+ `};for(const[a,i]of Object.entries(r))e.createSourceFile(k.join(t,a),i,{overwrite:!0})}c(Js,"bi"),p(Js,"generatePassportPrisma");class kn{static{c(this,"ki")}static{p(this,"PassportAuthGenerator")}project;config;constructor(t,s){this.project=t,this.config=s}generate(t){if(this.config.orm?.includes("prisma")&&(this.config.database?.some(s=>["postgresql","mysql","sqlite","sqlserver"].includes(s))??!1)&&this.config.api?.includes("rest")&&!this.config.api.includes("graphql")){Js(this.project,t,this.config.extras?.includes("swagger")??!1);return}(this.config.database?.length??0)>0?this.generateDbAuth(t):this.generateStatelessAuth(t)}generateStatelessAuth(t){const s=['import { Injectable, UnauthorizedException } from "@nestjs/common";','import { PassportStrategy } from "@nestjs/passport";','import { Strategy, ExtractJwt } from "passport-jwt";','import { passportJwtSecret } from "jwks-rsa";',`import { env } from "${this.config.envImport?.startsWith("@")?this.config.envImport:"../../config/env.js"}";`,"","interface JwtPayload {"," iss?: string;"," sub?: string;"," email?: string;"," [key: string]: unknown;","}","","@Injectable()","export class JwtStrategy extends PassportStrategy(Strategy) {"," constructor() {"," super({"," jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),"," secretOrKeyProvider: passportJwtSecret({"," cache: true,"," jwksRequestsPerMinute: 5,"," jwksUri: env.OIDC_JWKS_URI,"," rateLimit: true,"," }),"," issuer: env.OIDC_ISSUER,"," audience: env.OIDC_AUDIENCE,",' algorithms: ["RS256"],'," ignoreExpiration: false,"," });"," }",""," validate(payload: JwtPayload) {",' if (typeof payload.sub !== "string" || payload.sub.length === 0) {',' throw new UnauthorizedException("External identity token has no subject");'," }"," return {",' email: typeof payload.email === "string" ? payload.email : undefined,'," id: payload.sub,"," issuer: payload.iss,"," userId: payload.sub,"," };"," }","}",""].join(`
273
+ `),r=k.join(t,"strategies/jwt.strategy.ts");this.project.createSourceFile(r,s,{overwrite:!0});const a=["import {"," Controller,"," Get, UseGuards, Req",'} from "@nestjs/common";','import { AuthGuard } from "@nestjs/passport";','import type { Request } from "express";',"",'@Controller("auth")',"export class AuthController {","",' @Get("profile")',' @UseGuards(AuthGuard("jwt"))'," getProfile(@Req() request: Request) {"," return request.user;"," }","","}",""].join(`
274
+ `),i=k.join(t,"auth.controller.ts");this.project.createSourceFile(i,a,{overwrite:!0}),this.generateDecorators(t),this.generateGuard(t);const o=['import { Module } from "@nestjs/common";','import { PassportModule } from "@nestjs/passport";','import { AuthController } from "./auth.controller.js";','import { JwtStrategy } from "./strategies/jwt.strategy.js";','import { RestAuthGuard } from "./guards/rest-auth.guard.js";','import { RestOptionalAuthGuard } from "./guards/rest-optional-auth.guard.js";','import { RestRolesGuard } from "./guards/rest-roles.guard.js";',"","@Module({",' imports: [PassportModule.register({ defaultStrategy: "jwt" })],'," controllers: [AuthController],"," providers: ["," JwtStrategy,"," RestAuthGuard,"," RestOptionalAuthGuard,"," RestRolesGuard,"," ],"," exports: ["," RestAuthGuard,"," RestOptionalAuthGuard,"," RestRolesGuard,"," ],","})","export class AuthModule {}",""].join(`
275
+ `),n=k.join(t,"auth.module.ts");this.project.createSourceFile(n,o,{overwrite:!0})}generateDbAuth(t){const s=this.config.orm??[],r=s.includes("prisma"),a=s.includes("typeorm"),i=s.includes("drizzle"),o=(this.config.api??[]).includes("graphql"),n=(this.config.extras??[]).includes("swagger");this.generatePasswordService(t),this.generateDbAuthService(t,{useDrizzle:i,usePrisma:r,useSqlServer:this.config.database?.includes("sqlserver")??!1,useTypeorm:a}),this.generateLoginSchema(t),this.generateSignupSchema(t),this.generateRefreshTokenSchema(t),this.generateJwtDto(t),o?(this.generateLoginInput(t),this.generateSignupInput(t),this.generateRefreshTokenInput(t)):(this.generateRestLoginInput(t),this.generateRestSignupInput(t),this.generateRestRefreshTokenInput(t)),this.generateDbJwtStrategy(t),this.generateDbRestGuard(t),o&&this.generateDbGqlGuard(t),this.generateRestOptionalAuthGuard(t),this.generateRestRolesGuard(t),o&&(this.generateGqlOptionalAuthGuard(t),this.generateGqlRolesGuard(t)),this.generateDbController(t,n),o&&(this.generateTokenModel(t),this.generateAuthModel(t),this.generateAuthResolver(t)),this.generateDecorators(t),this.generateDbModule(t,{hasGraphql:o})}generatePasswordService(t){const s=['import { Injectable } from "@nestjs/common";','import { hash, compare } from "bcrypt";',"","@Injectable()","export class PasswordService {"," private readonly saltRounds = 10;",""," validatePassword(password: string, hashedPassword: string): Promise<boolean> {"," return compare(password, hashedPassword);"," }",""," hashPassword(password: string): Promise<string> {"," return hash(password, this.saltRounds);"," }","}",""].join(`
276
+ `);this.project.createSourceFile(k.join(t,"password.service.ts"),s,{overwrite:!0})}generateDbAuthService(t,s){const{usePrisma:r,useSqlServer:a,useTypeorm:i}=s,o=["import {"," ConflictException,"," Injectable,"," NotFoundException,"," UnauthorizedException,",'} from "@nestjs/common";','import { JwtService } from "@nestjs/jwt";','import { env } from "../config/env.js";','import { PasswordService } from "./password.service.js";'];let n,l,d,u,m;if(r)n='import { DbService } from "../database/db.service.js";',l=[" private readonly db: DbService,"," private readonly jwtService: JwtService,"," private readonly passwordService: PasswordService,"].join(`
277
+ `),d=[" const hashedPassword = await this.passwordService.hashPassword("," payload.password"," );"," try {"," const user = await this.db.prisma.user.create({"," data: {"," email: payload.email,"," firstname: payload.firstname ?? null,"," lastname: payload.lastname ?? null,"," password: hashedPassword,",' role: "USER",'," },"," });"," return this.generateTokens({ userId: user.id });"," } catch {"," throw new ConflictException(`Email ${payload.email} already used.`);"," }"].join(`
278
+ `),u=["const user = await this.db.prisma.user.findUnique({"," where: { email },","});"].join(`
279
+ `),m=["return this.db.prisma.user.findUnique({ where: { id: userId } });"].join(`
280
+ `);else if(i)n=['import { DbService } from "../database/db.service.js";','import { UserEntity } from "../modules/users/entities/user.entity.js";'].join(`
281
+ `),l=[" private readonly db: DbService,"," private readonly jwtService: JwtService,"," private readonly passwordService: PasswordService,"].join(`
282
+ `),d=[" const hashedPassword = await this.passwordService.hashPassword("," payload.password"," );"," try {"," const repository = this.db.typeorm.getRepository(UserEntity);"," const user = repository.create({"," email: payload.email,"," firstname: payload.firstname ?? null,"," lastname: payload.lastname ?? null,"," password: hashedPassword,",' role: "USER",'," });"," await repository.save(user);"," return this.generateTokens({ userId: user.id });"," } catch {"," throw new ConflictException(`Email ${payload.email} already used.`);"," }"].join(`
283
+ `),u=["const user = await this.db.typeorm"," .getRepository(UserEntity)"," .findOne({"," where: { email },"," });"].join(`
284
+ `),m=["return this.db.typeorm"," .getRepository(UserEntity)"," .findOne({"," where: { id: userId },"," });"].join(`
285
+ `);else{const g=a?[" .top(1)"]:[],v=a?[]:[" .limit(1);"];n=['import { DbService } from "../database/db.service.js";','import { users } from "../database/orm/drizzle/schema.js";','import { eq } from "drizzle-orm";','import { randomUUID } from "node:crypto";'].join(`
286
+ `),l=[" private readonly db: DbService,"," private readonly jwtService: JwtService,"," private readonly passwordService: PasswordService,"].join(`
287
+ `),d=[" const hashedPassword = await this.passwordService.hashPassword("," payload.password"," );"," const userId = randomUUID();"," try {"," await this.db.sql.getClient()"," .insert(users)"," .values({"," id: userId,"," email: payload.email,"," firstname: payload.firstname ?? null,"," lastname: payload.lastname ?? null,"," password: hashedPassword,",' role: "USER",'," });"," return this.generateTokens({ userId });"," } catch {"," throw new ConflictException(`Email ${payload.email} already used.`);"," }"].join(`
288
+ `),u=["const [user] = await this.db.sql.getClient()"," .select()",...g," .from(users)"," .where(eq(users.email, email))",...v].join(`
289
+ `),m=["const [user] = await this.db.sql.getClient()"," .select()",...g," .from(users)"," .where(eq(users.id, userId))",...v,"return user ?? null;"].join(`
290
+ `)}const h=[o.join(`
291
+ `),"",n,"",'import type { SignupInput } from "./dto/signup.input.js";',"","export interface TokenPayload {"," accessToken: string;"," refreshToken: string;","}","","@Injectable()","export class AuthService {"," constructor(",l," ) {}",""," async createUser(payload: SignupInput): Promise<TokenPayload> {",d," }",""," async login("," email: string,"," password: string"," ): Promise<TokenPayload> {",u," if (!user) {",' throw new NotFoundException("No user found for email: " + email);'," }"," const passwordValid = await this.passwordService.validatePassword("," password,"," user.password"," );"," if (!passwordValid) {",' throw new UnauthorizedException("Invalid password");'," }"," return this.generateTokens({ userId: user.id });"," }","",` ${s.useDrizzle?"async ":""}validateUser(userId: string) {`,` ${m}`," }",""," async getUserFromToken(token: string) {"," try {"," const payload = this.jwtService.decode<{ userId: string }>(token);"," if (!payload?.userId) {"," return null;"," }"," return await this.validateUser(payload.userId);"," } catch {"," return null;"," }"," }",""," generateTokens(payload: {"," userId: string;"," }): TokenPayload {"," return {"," accessToken: this.generateAccessToken(payload),"," refreshToken: this.generateRefreshToken(payload),"," };"," }",""," private generateAccessToken(payload: {"," userId: string;"," }): string {"," return this.jwtService.sign(payload);"," }",""," private generateRefreshToken(payload: {"," userId: string;"," }): string {"," return this.jwtService.sign(payload, {",' expiresIn: "7d",'," secret: env.JWT_REFRESH_SECRET,"," });"," }",""," refreshToken(token: string) {"," try {"," const { userId } = this.jwtService.verify<{ userId: string }>("," token,"," { secret: env.JWT_REFRESH_SECRET }"," );"," return this.generateTokens({ userId });"," } catch {"," throw new UnauthorizedException();"," }"," }","}",""].join(`
292
+ `);this.project.createSourceFile(k.join(t,"auth.service.ts"),h,{overwrite:!0})}generateLoginSchema(t){const s=['import { z } from "zod";',"","export const loginSchema = z.object({"," email: z.email(),"," password: z.string().min(8),","});",""].join(`
293
+ `);this.project.createSourceFile(k.join(t,"schemas/login.schema.ts"),s,{overwrite:!0})}generateSignupSchema(t){const s=['import { z } from "zod";',"","export const signupSchema = z.object({"," email: z.email(),"," firstname: z.string().optional(),"," lastname: z.string().optional(),"," password: z"," .string()",' .min(8, "Password must be at least 8 characters")',' .regex(/[A-Z]/u, "Password must contain an uppercase letter")',' .regex(/[a-z]/u, "Password must contain a lowercase letter")',' .regex(/[0-9]/u, "Password must contain a number")',' .regex(/[^A-Za-z0-9]/u, "Password must contain a special character"),',"});",""].join(`
294
+ `);this.project.createSourceFile(k.join(t,"schemas/signup.schema.ts"),s,{overwrite:!0})}generateRefreshTokenSchema(t){const s=['import { z } from "zod";',"","export const refreshTokenSchema = z.object({"," token: z.string().min(1),","});",""].join(`
295
+ `);this.project.createSourceFile(k.join(t,"schemas/refresh-token.schema.ts"),s,{overwrite:!0})}generateJwtDto(t){const s=["export interface JwtDto {"," userId: string;"," iat: number;"," exp: number;","}",""].join(`
296
+ `);this.project.createSourceFile(k.join(t,"dto/jwt.dto.ts"),s,{overwrite:!0})}generateLoginInput(t){const s=['import { Field, InputType } from "@nestjs/graphql";',"",'import { loginSchema } from "../schemas/login.schema.js";',"","@InputType()","export class LoginInput {"," static schema = loginSchema;",""," @Field()"," email: string;",""," @Field()"," password: string;","}",""].join(`
297
+ `);this.project.createSourceFile(k.join(t,"dto/login.input.ts"),s,{overwrite:!0})}generateSignupInput(t){const s=['import { Field, InputType } from "@nestjs/graphql";',"",'import { signupSchema } from "../schemas/signup.schema.js";',"","@InputType()","export class SignupInput {"," static schema = signupSchema;",""," @Field()"," email: string;",""," @Field()"," password: string;",""," @Field({ nullable: true })"," firstname?: string;",""," @Field({ nullable: true })"," lastname?: string;","}",""].join(`
298
+ `);this.project.createSourceFile(k.join(t,"dto/signup.input.ts"),s,{overwrite:!0})}generateRefreshTokenInput(t){const s=['import { ArgsType, Field } from "@nestjs/graphql";','import { GraphQLJWT } from "graphql-scalars";',"",'import { refreshTokenSchema } from "../schemas/refresh-token.schema.js";',"","@ArgsType()","export class RefreshTokenInput {"," static schema = refreshTokenSchema;",""," @Field(() => GraphQLJWT)"," token: string;","}",""].join(`
299
+ `);this.project.createSourceFile(k.join(t,"dto/refresh-token.input.ts"),s,{overwrite:!0})}generateRestLoginInput(t){const s=['import { loginSchema } from "../schemas/login.schema.js";',"","export class LoginInput {"," static schema = loginSchema;",""," email: string;",""," password: string;","}",""].join(`
300
+ `);this.project.createSourceFile(k.join(t,"dto/login.input.ts"),s,{overwrite:!0})}generateRestSignupInput(t){const s=['import { signupSchema } from "../schemas/signup.schema.js";',"","export class SignupInput {"," static schema = signupSchema;",""," email: string;",""," password: string;",""," firstname?: string;",""," lastname?: string;","}",""].join(`
301
+ `);this.project.createSourceFile(k.join(t,"dto/signup.input.ts"),s,{overwrite:!0})}generateRestRefreshTokenInput(t){const s=['import { refreshTokenSchema } from "../schemas/refresh-token.schema.js";',"","export class RefreshTokenInput {"," static schema = refreshTokenSchema;",""," token: string;","}",""].join(`
302
+ `);this.project.createSourceFile(k.join(t,"dto/refresh-token.input.ts"),s,{overwrite:!0})}generateDbJwtStrategy(t){const s=['import { Injectable, UnauthorizedException } from "@nestjs/common";','import { PassportStrategy } from "@nestjs/passport";','import { ExtractJwt, Strategy } from "passport-jwt";',"",'import { env } from "../../config/env.js";','import { AuthService } from "../auth.service.js";','import type { JwtDto } from "../dto/jwt.dto.js";',"","@Injectable()","export class JwtStrategy extends PassportStrategy(Strategy) {"," constructor(private readonly authService: AuthService) {"," super({"," jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),"," secretOrKey: env.JWT_ACCESS_SECRET,",' algorithms: ["HS256"],'," audience: env.JWT_AUDIENCE,"," issuer: env.JWT_ISSUER,"," });"," }",""," async validate(payload: JwtDto) {"," const user = await this.authService.validateUser(payload.userId);"," if (!user) {"," throw new UnauthorizedException();"," }"," return user;"," }","}",""].join(`
303
+ `);this.project.createSourceFile(k.join(t,"strategies/jwt.strategy.ts"),s,{overwrite:!0})}generateDbRestGuard(t){const s=['import { Injectable, UnauthorizedException } from "@nestjs/common";','import { AuthGuard } from "@nestjs/passport";',"","@Injectable()",'export class RestAuthGuard extends AuthGuard("jwt") {'," handleRequest<TUser>(err: Error | null, user: TUser): TUser {"," if (err || !user) {",' throw err || new UnauthorizedException("Invalid or expired token");'," }"," return user;"," }","}",""].join(`
304
+ `);this.project.createSourceFile(k.join(t,"guards/rest-auth.guard.ts"),s,{overwrite:!0})}generateDbGqlGuard(t){const s=["import {"," ExecutionContext,"," Injectable,"," UnauthorizedException,",'} from "@nestjs/common";','import { GqlExecutionContext } from "@nestjs/graphql";','import { AuthGuard } from "@nestjs/passport";',"","@Injectable()",'export class GqlAuthGuard extends AuthGuard("jwt") {'," getRequest(context: ExecutionContext) {"," const ctx = GqlExecutionContext.create(context);"," return ctx.getContext().req;"," }",""," handleRequest<TUser>(err: Error | null, user: TUser): TUser {"," if (err || !user) {",' throw err || new UnauthorizedException("Invalid or expired token");'," }"," return user;"," }","}",""].join(`
305
+ `);this.project.createSourceFile(k.join(t,"guards/gql-auth.guard.ts"),s,{overwrite:!0})}generateRestOptionalAuthGuard(t){const s=['import { Injectable } from "@nestjs/common";','import { AuthGuard } from "@nestjs/passport";',"","@Injectable()",'export class RestOptionalAuthGuard extends AuthGuard("jwt") {'," handleRequest<TUser>(err: Error | null, user: TUser): TUser | null {"," if (err || !user) {"," return null;"," }"," return user;"," }","}",""].join(`
306
+ `);this.project.createSourceFile(k.join(t,"guards/rest-optional-auth.guard.ts"),s,{overwrite:!0})}generateGqlOptionalAuthGuard(t){const s=['import { ExecutionContext, Injectable } from "@nestjs/common";','import { GqlExecutionContext } from "@nestjs/graphql";','import { AuthGuard } from "@nestjs/passport";',"","@Injectable()",'export class GqlOptionalAuthGuard extends AuthGuard("jwt") {'," getRequest(context: ExecutionContext) {"," const ctx = GqlExecutionContext.create(context);"," return ctx.getContext().req;"," }",""," handleRequest<TUser>(err: Error | null, user: TUser): TUser | null {"," if (err || !user) {"," return null;"," }"," return user;"," }","}",""].join(`
307
+ `);this.project.createSourceFile(k.join(t,"guards/gql-optional-auth.guard.ts"),s,{overwrite:!0})}generateRestRolesGuard(t){const s=["import {"," UnauthorizedException,"," ForbiddenException,",'} from "@nestjs/common";','import { AuthGuard } from "@nestjs/passport";',"",'export class RestRolesGuard extends AuthGuard("jwt") {'," constructor(private readonly roles: string[]) {"," super();"," }",""," handleRequest<TUser extends { role: string }>("," err: Error | null,"," user: TUser"," ): TUser {"," if (err || !user) {",' throw err || new UnauthorizedException("Invalid or expired token");'," }"," if (!this.roles.includes(user.role)) {",' throw new ForbiddenException("Insufficient permissions");'," }"," return user;"," }","}",""].join(`
308
+ `);this.project.createSourceFile(k.join(t,"guards/rest-roles.guard.ts"),s,{overwrite:!0})}generateGqlRolesGuard(t){const s=["import {"," ExecutionContext,"," UnauthorizedException,"," ForbiddenException,",'} from "@nestjs/common";','import { GqlExecutionContext } from "@nestjs/graphql";','import { AuthGuard } from "@nestjs/passport";',"",'export class GqlRolesGuard extends AuthGuard("jwt") {'," constructor(private readonly roles: string[]) {"," super();"," }",""," getRequest(context: ExecutionContext) {"," const ctx = GqlExecutionContext.create(context);"," return ctx.getContext().req;"," }",""," handleRequest<TUser extends { role: string }>("," err: Error | null,"," user: TUser"," ): TUser {"," if (err || !user) {",' throw err || new UnauthorizedException("Invalid or expired token");'," }"," if (!this.roles.includes(user.role)) {",' throw new ForbiddenException("Insufficient permissions");'," }"," return user;"," }","}",""].join(`
309
+ `);this.project.createSourceFile(k.join(t,"guards/gql-roles.guard.ts"),s,{overwrite:!0})}generateDbController(t,s){const r=s?["import {"," ApiCreatedResponse,"," ApiOperation,"," ApiTags,"," ApiUnauthorizedResponse,",'} from "@nestjs/swagger";']:[],a=[];s&&a.push('@ApiTags("Auth")');const i=[];s&&i.push(' @ApiOperation({ summary: "/api/auth/signup" })'," @ApiCreatedResponse({ description: 'User registered successfully' })");const o=[];s&&o.push(' @ApiOperation({ summary: "/api/auth/login" })'," @ApiCreatedResponse({ description: 'User logged in successfully' })"," @ApiUnauthorizedResponse({ description: 'Invalid credentials' })");const n=[];s&&n.push(' @ApiOperation({ summary: "/api/auth/refresh" })');const l=this.config.addons?.includes("nestjs-zod")?['import { ZodValidationPipe } from "nestjs-zod";',""]:[],d=this.config.addons?.includes("nestjs-zod")?"@Body(new ZodValidationPipe(SignupInput.schema))":"@Body()",u=this.config.addons?.includes("nestjs-zod")?"@Body(new ZodValidationPipe(LoginInput.schema))":"@Body()",m=this.config.addons?.includes("nestjs-zod")?"@Body(new ZodValidationPipe(RefreshTokenInput.schema))":"@Body()",h=['import { Body, Controller, HttpCode, Post } from "@nestjs/common";',...l,...r,"",'import { AuthService } from "./auth.service.js";','import { LoginInput } from "./dto/login.input.js";','import { RefreshTokenInput } from "./dto/refresh-token.input.js";','import { SignupInput } from "./dto/signup.input.js";',"",...a,'@Controller("auth")',"export class AuthController {"," constructor(private readonly auth: AuthService) {}","",' @Post("signup")',...i,` signup(${d} data: SignupInput) {`," data.email = data.email.toLowerCase();"," return this.auth.createUser(data);"," }","",' @Post("login") @HttpCode(200)',...o,` login(${u} { email, password }: LoginInput) {`," return this.auth.login(email.toLowerCase(), password);"," }","",' @Post("refresh") @HttpCode(200)',...n," refreshToken(",` ${m} { token }: RefreshTokenInput`," ) {"," return this.auth.refreshToken(token);"," }","}",""];this.project.createSourceFile(k.join(t,"auth.controller.ts"),h.join(`
310
+ `),{overwrite:!0})}generateTokenModel(t){const s=['import { Field, ObjectType } from "@nestjs/graphql";','import { GraphQLJWT } from "graphql-scalars";',"","@ObjectType()","export class Token {"," @Field(() => GraphQLJWT, { description: 'JWT access token' })"," accessToken: string;",""," @Field(() => GraphQLJWT, { description: 'JWT refresh token' })"," refreshToken: string;","}",""].join(`
311
+ `);this.project.createSourceFile(k.join(t,"models/token.model.ts"),s,{overwrite:!0})}generateAuthModel(t){const s=['import { Field, ObjectType } from "@nestjs/graphql";',"",'import { User } from "../../graphql/models/user.model.js";','import { Token } from "./token.model.js";',"","@ObjectType()","export class Auth extends Token {"," @Field(() => User)"," user: User;","}",""].join(`
312
+ `);this.project.createSourceFile(k.join(t,"models/auth.model.ts"),s,{overwrite:!0})}generateAuthResolver(t){const s=['import { StandardSchemaValidationPipe, UsePipes } from "@nestjs/common";',"import {"," Resolver,"," Mutation,"," Args,"," Parent,"," ResolveField,",'} from "@nestjs/graphql";',"",'import { User } from "../graphql/models/user.model.js";','import { AuthService } from "./auth.service.js";','import { LoginInput } from "./dto/login.input.js";','import { RefreshTokenInput } from "./dto/refresh-token.input.js";','import { SignupInput } from "./dto/signup.input.js";','import { Auth } from "./models/auth.model.js";','import { Token } from "./models/token.model.js";',"","@UsePipes(new StandardSchemaValidationPipe())","@Resolver(() => Auth)","export class AuthResolver {"," constructor(private readonly auth: AuthService) {}",""," @Mutation(() => Auth)"," async signup(@Args('data') data: SignupInput) {"," data.email = data.email.toLowerCase();"," const { accessToken, refreshToken } = await this.auth.createUser("," data"," );"," return { accessToken, refreshToken };"," }",""," @Mutation(() => Auth)"," async login("," @Args('data') { email, password }: LoginInput"," ) {"," const { accessToken, refreshToken } = await this.auth.login("," email.toLowerCase(),"," password"," );"," return { accessToken, refreshToken };"," }",""," @Mutation(() => Token)"," refreshToken(@Args() { token }: RefreshTokenInput) {"," return this.auth.refreshToken(token);"," }",""," @ResolveField('user', () => User)"," user(@Parent() auth: Auth) {"," return this.auth.getUserFromToken(auth.accessToken);"," }","}",""].join(`
313
+ `);this.project.createSourceFile(k.join(t,"auth.resolver.ts"),s,{overwrite:!0})}generateDbModule(t,s){const{hasGraphql:r}=s,a=['import { Global, Module } from "@nestjs/common";','import { JwtModule } from "@nestjs/jwt";','import { PassportModule } from "@nestjs/passport";',"",'import { env } from "../config/env.js";','import { AuthController } from "./auth.controller.js";','import { AuthService } from "./auth.service.js";','import { RestAuthGuard } from "./guards/rest-auth.guard.js";','import { RestOptionalAuthGuard } from "./guards/rest-optional-auth.guard.js";','import { PasswordService } from "./password.service.js";','import { JwtStrategy } from "./strategies/jwt.strategy.js";'];r?(a.push('import { AuthResolver } from "./auth.resolver.js";'),a.push('import { GqlAuthGuard } from "./guards/gql-auth.guard.js";'),a.push('import { GqlOptionalAuthGuard } from "./guards/gql-optional-auth.guard.js";')):a.push('import { RestRolesGuard } from "./guards/rest-roles.guard.js";');const i=[" AuthService,"," JwtStrategy,"," PasswordService,"," RestAuthGuard,"," RestOptionalAuthGuard,"];r?(i.push(" GqlAuthGuard,"),i.push(" GqlOptionalAuthGuard,"),i.push(" AuthResolver,")):i.push(" RestRolesGuard,");const o=r?[" GqlAuthGuard,"," GqlOptionalAuthGuard,"," PassportModule,"," RestAuthGuard,"," RestOptionalAuthGuard,"]:[" PassportModule,"," RestAuthGuard,"," RestOptionalAuthGuard,"," RestRolesGuard,"],n=[...a,"","@Global()","@Module({"," controllers: [AuthController],"," exports: [",o.join(`
314
+ `)," AuthService,"," JwtModule,"," ],"," imports: [",' PassportModule.register({ defaultStrategy: "jwt" }),'," JwtModule.register({"," secret: env.JWT_ACCESS_SECRET,",' signOptions: { algorithm: "HS256", audience: env.JWT_AUDIENCE, expiresIn: "15m", issuer: env.JWT_ISSUER, keyid: env.JWT_KEY_ID },'," }),"," ],"," providers: [",i.join(`
315
+ `)," ],","})","export class AuthModule {}",""];this.project.createSourceFile(k.join(t,"auth.module.ts"),n.join(`
316
+ `),{overwrite:!0})}generateDecorators(t){const s=k.join(t,"decorators"),r=(this.config.api??[]).includes("graphql"),a=['import { createParamDecorator, ExecutionContext } from "@nestjs/common";',"","export const CurrentUser = createParamDecorator("," (_data: unknown, ctx: ExecutionContext) => {"," const request = ctx.switchToHttp().getRequest();"," return request.user;"," }",");",""].join(`
317
+ `);this.project.createSourceFile(k.join(s,"current-user.decorator.ts"),a,{overwrite:!0});const i=r?['import { createParamDecorator, ExecutionContext } from "@nestjs/common";','import { GqlExecutionContext } from "@nestjs/graphql";',"","export const UserEntity = createParamDecorator("," (_data: unknown, ctx: ExecutionContext) => {"," const gqlCtx = GqlExecutionContext.create(ctx);"," return gqlCtx.getContext().req.user;"," }",");",""].join(`
318
+ `):['import { createParamDecorator, ExecutionContext } from "@nestjs/common";',"","export const UserEntity = createParamDecorator("," (_data: unknown, ctx: ExecutionContext) => {"," const request = ctx.switchToHttp().getRequest();"," return request.user;"," }",");",""].join(`
319
+ `);this.project.createSourceFile(k.join(s,"user.decorator.ts"),i,{overwrite:!0});const o=['export { CurrentUser } from "./current-user.decorator.js";','export { UserEntity } from "./user.decorator.js";',""].join(`
320
+ `);this.project.createSourceFile(k.join(s,"index.ts"),o,{overwrite:!0})}generateGuard(t){this.generateDbRestGuard(t),this.generateRestOptionalAuthGuard(t),this.generateRestRolesGuard(t)}}class vn{static{c(this,"ps")}static{p(this,"AuthModuleGenerator")}project;config;passportGen;betterAuthGen;constructor(t){this.config=t,this.project=new Xt,this.passportGen=new kn(this.project,t),this.betterAuthGen=new B(this.project,t)}generate(){const t=`${this.config.outputDir}/auth`,s=this.config.strategy==="better-auth:stateless"?"better-auth":this.config.strategy;s==="passport"?this.passportGen.generate(t):s==="better-auth"&&this.betterAuthGen.generate(t)}generateAuthOnly(){const t=`${this.config.outputDir}/auth`;(this.config.strategy==="better-auth:stateless"?"better-auth":this.config.strategy)==="better-auth"&&this.betterAuthGen.generateAuthOnly(t)}async save(){await this.project.save()}}class qn{static{c(this,"ls")}static{p(this,"PresetComposer")}presets=new Map;constructor(){this.registerDefaultPresets()}registerDefaultPresets(){this.registerPreset({architectures:["nest-api"],description:"RESTful API with JWT authentication and Swagger documentation",extras:["swagger"],generators:["auth"],id:"rest-api",name:"REST API"}),this.registerPreset({architectures:["nest-api"],description:"GraphQL API with Apollo Server and authentication",extras:["graphql","apollo"],generators:["auth"],id:"graphql-api",name:"GraphQL API"}),this.registerPreset({architectures:["nest-microservice"],description:"Microservice with messaging and inter-service communication",extras:["nats","rabbitmq"],generators:["auth"],id:"microservice",name:"Microservice"}),this.registerPreset({architectures:["nest-gateway"],description:"API Gateway for routing and load balancing",extras:["rate-limiting","load-balance"],generators:[],id:"gateway",name:"API Gateway"}),this.registerPreset({architectures:["nest-api"],description:"Complete application with database, auth, and all extras",extras:["swagger","docker","health-check","rate-limiting"],generators:["auth","config","database"],id:"fullstack",name:"Full Stack"})}registerPreset(t){this.presets.set(t.id,t)}getPreset(t){return this.presets.get(t)}getAllPresets(){return[...this.presets.values()]}getPresetsForArchitecture(t){return[...this.presets.values()].filter(s=>s.architectures.includes(t))}static composeGenerators(t){const s=new Set;return t.auth!=="none"&&s.add("auth"),t.database.length>0&&s.add("database"),[...s]}static composeExtras(t){const s=new Set(t.extras);return t.api.includes("rest")&&t.extras.includes("swagger")&&s.add("swagger"),t.orm.includes("prisma")&&s.add("prisma"),t.orm.includes("typeorm")&&s.add("typeorm"),[...s]}suggestPreset(t){if(this.getPresetsForArchitecture(t.architecture).length!==0)return t.api.includes("graphql")?this.presets.get("graphql-api"):t.architecture==="nest-microservice"?this.presets.get("microservice"):t.architecture==="nest-gateway"?this.presets.get("gateway"):t.database.length>0&&t.auth!=="none"?this.presets.get("fullstack")??this.presets.get("rest-api"):this.presets.get("rest-api")}validateContext(t,s){const r=this.getPreset(s);return r?r.architectures.includes(t.architecture):!1}}async function Zs(e,t,s){const r=[];for(const a of s)try{if(a==="auth"){const i=e.api.includes("rest"),o=e.api.includes("graphql"),n=new vn({addons:e.addons,api:e.api,database:e.database,envImport:e.projectType==="monorepo"?"@repo/env/api-gateway":"../config/env.js",extras:e.extras,orm:e.orm,outputDir:e.projectType==="monorepo"?`${t}/apps/api-gateway/src`:`${t}/src`,prismaVersion:e.prismaVersion,projectType:e.projectType,skipModule:!i&&!o&&(e.auth==="better-auth"||e.auth==="better-auth:stateless"),strategy:e.auth});await(i||o||e.auth==="passport"?n.generate():n.generateAuthOnly()),await n.save(),r.push({filesCount:3,generatedFiles:[],success:!0})}else console.log(`Generator ${a} not yet implemented`)}catch(i){r.push({error:i instanceof Error?i.message:"Unknown error",filesCount:0,generatedFiles:[],success:!1})}return r}c(Zs,"cs"),p(Zs,"executePresetGenerators");function Ws(e){const t=e.httpProvider==="fastify"?3001:3e3,s=`\${APP_PORT:-${t}}`,r=e.projectName.slice(0,60),a=e.api.includes("rest")?"/api/health":"/health";let i=`${e.packageManager} run`;e.packageManager==="npm"?i="npm run":e.packageManager==="yarn"&&(i="yarn");const o=["services:",` ${e.projectName}:`,` image: ${e.projectName}:local`," build:"," context: ."," dockerfile: Dockerfile"," init: true"," restart: unless-stopped"," ports:",` - "127.0.0.1:${s}:${t}"`," environment:"," NODE_ENV: production",` PORT: "${t}"`],n=[],l=[];if(e.auth==="better-auth"&&e.orm.includes("prisma")&&n.push(`${i} auth:generate`),e.orm.includes("prisma"))e.database.includes("mongodb")?n.push(`${i} prisma:push`):e.prismaVersion==="8"?n.push(`${i} migrate`):e.database.includes("sqlserver")?n.push(`(attempt=0; until ${i} prisma:migrate:deploy; do attempt=$$((attempt + 1)); [ $$attempt -ge 120 ] && exit 1; sleep 5; done)`):n.push(`${i} prisma:migrate:deploy`);else if(e.orm.includes("drizzle"))n.push(...e.database.includes("sqlserver")?[`(attempt=0; until ${i} db:push; do attempt=$$((attempt + 1)); [ $$attempt -ge 120 ] && exit 1; sleep 5; done)`]:[],...e.database.includes("sqlserver")?[]:[`${i} db:migrate`]);else if(e.orm.includes("typeorm")){const z=e.database.includes("sqlserver")||e.extras.includes("docker")&&e.extras.includes("todo-example");n.push(...z?[`(attempt=0; until ${i} typeorm:sync; do attempt=$$((attempt + 1)); [ $$attempt -ge 120 ] && exit 1; sleep 5; done)`]:[`${i} typeorm:run`]),e.auth==="better-auth"&&e.database.length>0&&e.extras.includes("docker")&&n.push(`(attempt=0; until ${i} auth:migrate; do attempt=$$((attempt + 1)); [ $$attempt -ge 120 ] && exit 1; sleep 5; done)`)}e.auth==="better-auth"&&e.database.length>0&&e.orm.length===0&&e.extras.includes("docker")&&n.push(`(attempt=0; until ${i} auth:migrate; do attempt=$$((attempt + 1)); [ $$attempt -ge 120 ] && exit 1; sleep 5; done)`);const d=e.extras.includes("health-check")?[" healthcheck:",` test: ["CMD", "node", "-e", "fetch('http://127.0.0.1:${t}${a}').then((r) => process.exit(r.ok ? 0 : 1)).catch(() => process.exit(1))"]`," interval: 10s"," timeout: 5s",` retries: ${e.database.includes("sqlserver")?120:10}`,` start_period: ${e.database.includes("sqlserver")?"1200s":"30s"}`]:[],u=[];e.database.includes("postgresql")&&(u.push("postgres"),l.push(` POSTGRES_URL: postgresql://postgres:postgres@postgres:5432/${r}_db?schema=public`)),e.database.includes("mysql")&&(u.push("mysql"),l.push(` MYSQL_URL: mysql://root:mysql@mysql:3306/${r}_db`)),e.database.includes("sqlserver")&&(u.push("sqlserver"),l.push(" SQLSERVER_HOST: sqlserver",' SQLSERVER_PORT: "1433"',` SQLSERVER_DATABASE: ${r}_db`," SQLSERVER_USER: sa"," SQLSERVER_PASSWORD: ${SQLSERVER_PASSWORD:?Set SQLSERVER_PASSWORD in .env}",' SQLSERVER_ENCRYPT: "true"',' SQLSERVER_TRUST_SERVER_CERTIFICATE: "true"')),e.database.includes("mongodb")&&(u.push("mongodb"),l.push(` MONGODB_URL: mongodb://mongodb:27017/${r}_db?replicaSet=rs0`)),e.database.includes("sqlite")&&l.push(e.orm.includes("prisma")?" SQLITE_PATH: file:./src/database/dev.db":" SQLITE_PATH: ./src/database/dev.db"),(e.auth==="better-auth"||e.auth==="better-auth:stateless")&&(l.push(" BETTER_AUTH_SECRET: ${BETTER_AUTH_SECRET:?Set BETTER_AUTH_SECRET in .env}",` BETTER_AUTH_URL: http://localhost:${t}`,` CORS_ORIGIN: http://localhost:${t}`),e.auth==="better-auth:stateless"&&l.push(" OIDC_PROVIDER_ID: ${OIDC_PROVIDER_ID:?Set OIDC_PROVIDER_ID in .env}"," OIDC_CLIENT_ID: ${OIDC_CLIENT_ID:?Set OIDC_CLIENT_ID in .env}"," OIDC_CLIENT_SECRET: ${OIDC_CLIENT_SECRET:?Set OIDC_CLIENT_SECRET in .env}"," OIDC_DISCOVERY_URL: ${OIDC_DISCOVERY_URL:?Set OIDC_DISCOVERY_URL in .env}")),e.auth==="passport"&&(e.database.length===0?l.push(" OIDC_JWKS_URI: ${OIDC_JWKS_URI:?Set OIDC_JWKS_URI in .env}"," OIDC_ISSUER: ${OIDC_ISSUER:?Set OIDC_ISSUER in .env}"," OIDC_AUDIENCE: ${OIDC_AUDIENCE:?Set OIDC_AUDIENCE in .env}"):(l.push(" JWT_ACCESS_SECRET: ${JWT_ACCESS_SECRET:?Set JWT_ACCESS_SECRET in .env}"," JWT_ISSUER: ${JWT_ISSUER:-generated-app}"," JWT_AUDIENCE: ${JWT_AUDIENCE:-generated-app-api}"," JWT_KEY_ID: ${JWT_KEY_ID:-primary}"),l.push(" JWT_REFRESH_SECRET: ${JWT_REFRESH_SECRET:?Set JWT_REFRESH_SECRET in .env}")));const m=[],h={kafka:"KAFKA_BROKER=kafka:9092",mqtt:"MQTT_URL=mqtt://mqtt:1883",nats:"NATS_URL=nats://nats:4222",rabbitmq:"RABBITMQ_URL=amqp://rabbitmq:5672",redis:"REDIS_URL=redis://redis:6379"};for(const z of e.microservices){if(z==="grpc")continue;m.push(z);const[L,V]=h[z].split("=");l.push(` ${L}: ${V}`)}e.microservices.includes("grpc")&&o.splice(10,0,' - "${GRPC_PORT:-5000}:5000"'),o.push(...l),o.push(...d),n.length>0&&o.push(` command: ["sh", "-c", "${n.join(" && ")} && ${i} start:prod"]`);const g=[...u,...m];if(g.length>0){o.push(" depends_on:");for(const z of g)o.push(` ${z}:`),o.push(" condition: service_healthy")}e.database.includes("postgresql")&&o.push(""," postgres:"," image: postgres:17-alpine"," ports:",' - "127.0.0.1:${POSTGRES_PORT:-5432}:5432"'," environment:"," POSTGRES_USER: postgres"," POSTGRES_PASSWORD: postgres",` POSTGRES_DB: ${r}_db`," healthcheck:",` test: ["CMD-SHELL", "pg_isready -U postgres -d ${r}_db"]`," interval: 5s"," timeout: 3s"," retries: 20"," volumes:"," - postgres_data:/var/lib/postgresql/data"),e.database.includes("mysql")&&o.push(""," mysql:"," image: mysql:9.7.1"," environment:"," MYSQL_ROOT_PASSWORD: mysql",` MYSQL_DATABASE: ${r}_db`," healthcheck:",' test: ["CMD", "mysqladmin", "ping", "-hmysql", "-uroot", "-pmysql"]'," interval: 5s"," timeout: 3s"," retries: 30"," volumes:"," - mysql_data:/var/lib/mysql"),e.database.includes("sqlserver")&&o.push(""," sqlserver:"," image: mcr.microsoft.com/mssql/server:2022-latest"," environment:"," ACCEPT_EULA: Y"," MSSQL_SA_PASSWORD: ${SQLSERVER_PASSWORD:?Set SQLSERVER_PASSWORD in .env}",` MSSQL_DATABASE: ${r}_db`," ports:",' - "127.0.0.1:${SQLSERVER_PORT:-1433}:1433"'," healthcheck:",` test: ["CMD-SHELL", "/opt/mssql-tools18/bin/sqlcmd -C -S localhost -U sa -P \\"$$MSSQL_SA_PASSWORD\\" -Q \\"IF DB_ID(N'${r}_db') IS NULL CREATE DATABASE [${r}_db]; SELECT 1\\" -b"]`," interval: 10s"," timeout: 30s"," retries: 120"," start_period: 1200s"," volumes:"," - sqlserver_data:/var/opt/mssql"),e.database.includes("mongodb")&&o.push(""," mongodb:"," image: mongo:8.3.4-noble",' command: ["mongod", "--dbpath", "/data/db", "--replSet", "rs0", "--bind_ip_all", "--setParameter", "diagnosticDataCollectionEnabled=false"]'," environment:",` MONGO_INITDB_DATABASE: ${r}_db`," healthcheck:",' test: ["CMD", "mongosh", "--quiet", "--eval", "try { rs.status().ok } catch (error) { rs.initiate({ _id: \\"rs0\\", members: [{ _id: 0, host: \\"mongodb:27017\\" }] }).ok }"]'," interval: 5s"," timeout: 30s"," retries: 20"," volumes:"," - mongo_data:/data/db");const v={kafka:["image: apache/kafka:3.9.0","environment:",' KAFKA_ADVERTISED_LISTENERS: "PLAINTEXT://kafka:9092"',' KAFKA_AUTO_CREATE_TOPICS_ENABLE: "true"'," KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER",' KAFKA_CONTROLLER_QUORUM_VOTERS: "1@localhost:9093"',' KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: "0"'," KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT",' KAFKA_LISTENERS: "PLAINTEXT://:9092,CONTROLLER://:9093"',' KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: "CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT"',' KAFKA_NODE_ID: "1"',' KAFKA_OFFSETS_TOPIC_NUM_PARTITIONS: "1"',' KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: "1"',' KAFKA_PROCESS_ROLES: "broker,controller"',' KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: "1"',' KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: "1"','ports: ["${KAFKA_PORT:-9092}:9092"]','healthcheck: { test: ["CMD-SHELL", "for topic in ping ping.reply log log.reply audit todo.create todo.create.reply todo.list todo.list.reply; do marker=\\"/tmp/nest-arch-$$topic\\"; [ -e \\"$$marker\\" ] || { /opt/kafka/bin/kafka-topics.sh --bootstrap-server localhost:9092 --create --if-not-exists --topic $$topic --partitions 1 --replication-factor 1 >/dev/null 2>&1 && touch \\"$$marker\\" || exit 1; }; done"], interval: 5s, timeout: 30s, retries: 30, start_period: 30s }'],mqtt:["image: eclipse-mosquitto:2",'ports: ["${MQTT_PORT:-1883}:1883"]','healthcheck: { test: ["CMD-SHELL", "nc -z localhost 1883"], interval: 5s, timeout: 3s, retries: 20 }'],nats:["image: nats:2-alpine",'command: ["--http_port", "8222"]','ports: ["${NATS_PORT:-4222}:4222"]','healthcheck: { test: ["CMD-SHELL", "wget -qO- http://localhost:8222/healthz"], interval: 5s, timeout: 3s, retries: 20 }'],rabbitmq:["image: rabbitmq:3.13-alpine",'ports: ["${RABBITMQ_PORT:-5672}:5672"]','healthcheck: { test: ["CMD", "rabbitmq-diagnostics", "-q", "ping"], interval: 5s, timeout: 3s, retries: 20 }'],redis:["image: redis:7-alpine",'ports: ["${REDIS_PORT:-6379}:6379"]','healthcheck: { test: ["CMD", "redis-cli", "ping"], interval: 5s, timeout: 3s, retries: 20 }']};for(const z of m){o.push("",` ${z}:`);for(const L of v[z]??[])o.push(` ${L}`)}const b=[...e.database.includes("postgresql")?["postgres_data"]:[],...e.database.includes("mysql")?["mysql_data"]:[],...e.database.includes("sqlserver")?["sqlserver_data"]:[],...e.database.includes("mongodb")?["mongo_data"]:[]];return b.length>0&&o.push("","volumes:",...b.map(z=>` ${z}:`)),`${o.join(`
321
+ `)}
322
+ `}c(Ws,"vi"),p(Ws,"generateDockerCompose");async function Ks(e,t,s,r,a){let i="postgresql";t.database.includes("mysql")?i="mysql":t.database.includes("sqlite")?i="sqlite":t.database.includes("sqlserver")&&(i="mssql");const o=t.projectType==="monorepo"?"./packages/db/src/orm/drizzle/schema.ts":"./src/database/orm/drizzle/schema.ts",n=o,l=n.replace("/schema.ts","/migrations");let d="env.POSTGRES_URL";t.database.includes("mysql")?d="env.MYSQL_URL":t.database.includes("sqlite")&&(d="env.SQLITE_PATH");const u=[t.formatter==="oxlint-oxfmt"?"// oxlint-disable typescript/no-non-null-assertion":"","import 'dotenv/config';",t.projectType==="monorepo"?"import { env } from '@repo/env/api-gateway';":"import { env } from './src/config/env.js';","import { defineConfig } from 'drizzle-kit';","","export default defineConfig({"," dbCredentials: {",...t.database.includes("sqlserver")?[" database: env.SQLSERVER_DATABASE,"," options: { encrypt: env.SQLSERVER_ENCRYPT, trustServerCertificate: env.SQLSERVER_TRUST_SERVER_CERTIFICATE },"," password: env.SQLSERVER_PASSWORD,"," port: env.SQLSERVER_PORT,"," server: env.SQLSERVER_HOST,"," user: env.SQLSERVER_USER,"]:[` url: ${d},`]," },",` dialect: '${i}',`,` out: '${l}',`,` schema: '${n}',`,"});",""].join(`
323
+ `);try{if(t.auth==="better-auth"){const h=o.replace("schema.ts","auth-schema.ts");await e.writeFile({content:`// Run auth:generate before building.
324
+ // oxlint-disable eslint/no-inline-comments
325
+ export const authSchemaPlaceholder = true;
326
+ `,filePath:h,isBinary:!1},s)}const m=await e.writeFile({content:u,filePath:"drizzle.config.ts",isBinary:!1},s);m.written&&r.push(m.filePath)}catch(m){const h=m instanceof Error?m.message:String(m);a.push(`Failed to generate drizzle.config.ts: ${h}`)}}c(Ks,"qi"),p(Ks,"generateDrizzleConfig");function nt(e,t){if(e instanceof Promise)throw new Error(t)}c(nt,"ds"),p(nt,"ensureSynchronous");function Ys(e,t){const s={},r=[];for(const a in e){const i=e[a]["~standard"].validate(t[a]);if(nt(i,`Validation must be synchronous, but ${a} returned a Promise.`),i.issues){r.push(...i.issues.map(o=>({...o,message:o.message,path:[a,...o.path??[]]})));continue}s[a]=i.value}return r.length?{issues:r}:{value:s}}c(Ys,"zi"),p(Ys,"parseWithDictionary");function Xs(e){const t=e.runtimeEnvStrict??e.runtimeEnv??process.env;if(e.emptyStringAsUndefined??!1)for(const[b,z]of Object.entries(t))z===""&&delete t[b];if(e.skipValidation){if(e.extends)for(const b of e.extends)b.skipValidation=!0;return t}const s=typeof e.client=="object"?e.client:{},r=typeof e.server=="object"?e.server:{},a=typeof e.shared=="object"?e.shared:{},i=e.isServer??(typeof window>"u"||"Deno"in window),o=i?{...r,...a,...s}:{...s,...a},n=e.createFinalSchema?.(o,i)?.["~standard"].validate(t)??Ys(o,t);nt(n,"Validation must be synchronous");const l=e.onValidationError??(b=>{throw console.error("\u274C Invalid environment variables:",b),new Error("Invalid environment variables")}),d=e.onInvalidAccess??(()=>{throw new Error("\u274C Attempted to access a server-side environment variable on the client")});if(n.issues)return l(n.issues);const u=p(b=>e.clientPrefix?!b.startsWith(e.clientPrefix)&&!(b in a):!0,"isServerAccess"),m=p(b=>i||!u(b),"isValidServerAccess"),h=p(b=>b==="__esModule"||b==="$$typeof","ignoreProp"),g=(e.extends??[]).reduce((b,z)=>Object.assign(b,z),{}),v=Object.assign(g,n.value);return new Proxy(v,{get(b,z){if(typeof z=="string"&&!h(z))return m(z)?Reflect.get(b,z):d(z)}})}c(Xs,"Si"),p(Xs,"createEnv$1");const xn="NEXT_PUBLIC_";function er(e){const t=typeof e.client=="object"?e.client:{},s=typeof e.server=="object"?e.server:{},r=e.shared,a=e.runtimeEnv?e.runtimeEnv:{...process.env,...e.experimental__runtimeEnv};return Xs({...e,shared:r,client:t,server:s,clientPrefix:xn,runtimeEnv:a})}c(er,"wi"),p(er,"createEnv");var tr;function y(e,t,s){function r(n,l){if(n._zod||Object.defineProperty(n,"_zod",{value:{def:l,constr:o,traits:new Set},enumerable:!1}),n._zod.traits.has(e))return;n._zod.traits.add(e),t(n,l);const d=o.prototype,u=Object.keys(d);for(let m=0;m<u.length;m++){const h=u[m];h in n||(n[h]=d[h].bind(n))}}c(r,"r"),p(r,"init");const a=s?.Parent??Object;class i extends a{static{c(this,"o")}static{p(this,"Definition")}}Object.defineProperty(i,"name",{value:e});function o(n){var l;const d=s?.Parent?new i:this;r(d,n),(l=d._zod).deferred??(l.deferred=[]);for(const u of d._zod.deferred)u();return d}return c(o,"i"),p(o,"_"),Object.defineProperty(o,"init",{value:r}),Object.defineProperty(o,Symbol.hasInstance,{value:p(n=>s?.Parent&&n instanceof s.Parent?!0:n?._zod?.traits?.has(e),"value")}),Object.defineProperty(o,"name",{value:e}),o}c(y,"g"),p(y,"$constructor");class re extends Error{static{c(this,"X")}static{p(this,"$ZodAsyncError")}constructor(){super("Encountered Promise during synchronous parse. Use .parseAsync() instead.")}}class sr extends Error{static{c(this,"ms")}static{p(this,"$ZodEncodeError")}constructor(t){super(`Encountered unidirectional transform during encode: ${t}`),this.name="ZodEncodeError"}}(tr=globalThis).__zod_globalConfig??(tr.__zod_globalConfig={});const zn=globalThis.__zod_globalConfig;function W(e){return zn}c(W,"W"),p(W,"config");function pt(e){const t=Object.values(e).filter(s=>typeof s=="number");return Object.entries(e).filter(([s,r])=>t.indexOf(+s)===-1).map(([s,r])=>r)}c(pt,"hs"),p(pt,"getEnumValues");function $e(e,t){return typeof t=="bigint"?t.toString():t}c($e,"Ge"),p($e,"jsonStringifyReplacer");function De(e){return e==null}c(De,"Be"),p(De,"nullish");function _e(e){const t=e.startsWith("^")?1:0,s=e.endsWith("$")?e.length-1:e.length;return e.slice(t,s)}c(_e,"Ze"),p(_e,"cleanRegex");function rr(e,t){const s=e/t,r=Math.round(s),a=Number.EPSILON*Math.max(Math.abs(s),1);return Math.abs(s-r)<a?0:s-r}c(rr,"Pi"),p(rr,"floatSafeRemainder");const ar=Symbol("evaluating");function w(e,t,s){let r;Object.defineProperty(e,t,{get(){if(r!==ar)return r===void 0&&(r=ar,r=s()),r},set(a){Object.defineProperty(e,t,{value:a})},configurable:!0})}c(w,"w"),p(w,"defineLazy");function ir(...e){const t={};for(const s of e){const r=Object.getOwnPropertyDescriptors(s);Object.assign(t,r)}return Object.defineProperties({},t)}c(ir,"Ti"),p(ir,"mergeDefs");function or(e){return e.toLowerCase().trim().replace(/[^\w\s-]/g,"").replace(/[\s_-]+/g,"-").replace(/^-+|-+$/g,"")}c(or,"ji"),p(or,"slugify");const nr="captureStackTrace"in Error?Error.captureStackTrace:(...e)=>{};function lt(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}c(lt,"ys"),p(lt,"isObject");function Ce(e){if(lt(e)===!1)return!1;const t=e.constructor;if(t===void 0||typeof t!="function")return!0;const s=t.prototype;return!(lt(s)===!1||Object.prototype.hasOwnProperty.call(s,"isPrototypeOf")===!1)}c(Ce,"Ve"),p(Ce,"isPlainObject");function ct(e){return Ce(e)?{...e}:Array.isArray(e)?[...e]:e instanceof Map?new Map(e):e instanceof Set?new Set(e):e}c(ct,"bs"),p(ct,"shallowClone");const Sn=new Set(["string","number","symbol"]);function ue(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}c(ue,"Se"),p(ue,"escapeRegex");function pr(e,t,s){const r=new e._zod.constr(t??e._zod.def);return(!t||s?.parent)&&(r._zod.parent=e),r}c(pr,"Ai"),p(pr,"clone");function q(e){const t=e;if(!t)return{};if(typeof t=="string")return{error:p(()=>t,"error")};if(t?.message!==void 0){if(t?.error!==void 0)throw new Error("Cannot specify both `message` and `error` params");t.error=t.message}return delete t.message,typeof t.error=="string"?{...t,error:p(()=>t.error,"error")}:t}c(q,"q"),p(q,"normalizeParams");const wn={safeint:[Number.MIN_SAFE_INTEGER,Number.MAX_SAFE_INTEGER],int32:[-2147483648,2147483647],uint32:[0,4294967295],float32:[-34028234663852886e22,34028234663852886e22],float64:[-Number.MAX_VALUE,Number.MAX_VALUE]};function X(e,t=0){if(e.aborted===!0)return!0;for(let s=t;s<e.issues.length;s++)if(e.issues[s]?.continue!==!0)return!0;return!1}c(X,"ee"),p(X,"aborted");function lr(e,t=0){if(e.aborted===!0)return!0;for(let s=t;s<e.issues.length;s++)if(e.issues[s]?.continue===!1)return!0;return!1}c(lr,"$i"),p(lr,"explicitlyAborted");function cr(e,t){return t.map(s=>{var r;return(r=s).path??(r.path=[]),s.path.unshift(e),s})}c(cr,"Ci"),p(cr,"prefixIssues");function me(e){return typeof e=="string"?e:e?.message}c(me,"xe"),p(me,"unwrapMessage");function K(e,t,s){const r=e.message?e.message:me(e.inst?._zod.def?.error?.(e))??me(t?.error?.(e))??me(s.customError?.(e))??me(s.localeError?.(e))??"Invalid input",{inst:a,continue:i,input:o,...n}=e;return n.path??(n.path=[]),n.message=r,t?.reportInput&&(n.input=o),n}c(K,"K"),p(K,"finalizeIssue");function Le(e){return Array.isArray(e)?"array":typeof e=="string"?"string":"unknown"}c(Le,"Je"),p(Le,"getLengthableOrigin");function ae(...e){const[t,s,r]=e;return typeof t=="string"?{message:t,code:"custom",input:s,inst:r}:{...t}}c(ae,"pe"),p(ae,"issue");const dr=p((e,t)=>{e.name="$ZodError",Object.defineProperty(e,"_zod",{value:e._zod,enumerable:!1}),Object.defineProperty(e,"issues",{value:t,enumerable:!1}),e.message=JSON.stringify(t,$e,2),Object.defineProperty(e,"toString",{value:p(()=>e.message,"value"),enumerable:!1})},"initializer$1"),ur=y("$ZodError",dr),mr=y("$ZodError",dr,{Parent:Error});function hr(e,t=s=>s.message){const s={},r=[];for(const a of e.issues)a.path.length>0?(s[a.path[0]]=s[a.path[0]]||[],s[a.path[0]].push(t(a))):r.push(t(a));return{formErrors:r,fieldErrors:s}}c(hr,"Di"),p(hr,"flattenError");function fr(e,t=s=>s.message){const s={_errors:[]},r=p((a,i=[])=>{for(const o of a.issues)if(o.code==="invalid_union"&&o.errors.length)o.errors.map(n=>r({issues:n},[...i,...o.path]));else if(o.code==="invalid_key")r({issues:o.issues},[...i,...o.path]);else if(o.code==="invalid_element")r({issues:o.issues},[...i,...o.path]);else{const n=[...i,...o.path];if(n.length===0)s._errors.push(t(o));else{let l=s,d=0;for(;d<n.length;){const u=n[d];d===n.length-1?(l[u]=l[u]||{_errors:[]},l[u]._errors.push(t(o))):l[u]=l[u]||{_errors:[]},l=l[u],d++}}}},"processError");return r(e),s}c(fr,"Li"),p(fr,"formatError");const dt=p(e=>(t,s,r,a)=>{const i=r?{...r,async:!1}:{async:!1},o=t._zod.run({value:s,issues:[]},i);if(o instanceof Promise)throw new re;if(o.issues.length){const n=new(a?.Err??e)(o.issues.map(l=>K(l,i,W())));throw nr(n,a?.callee),n}return o.value},"_parse"),ut=p(e=>async(t,s,r,a)=>{const i=r?{...r,async:!0}:{async:!0};let o=t._zod.run({value:s,issues:[]},i);if(o instanceof Promise&&(o=await o),o.issues.length){const n=new(a?.Err??e)(o.issues.map(l=>K(l,i,W())));throw nr(n,a?.callee),n}return o.value},"_parseAsync"),Ie=p(e=>(t,s,r)=>{const a=r?{...r,async:!1}:{async:!1},i=t._zod.run({value:s,issues:[]},a);if(i instanceof Promise)throw new re;return i.issues.length?{success:!1,error:new(e??ur)(i.issues.map(o=>K(o,a,W())))}:{success:!0,data:i.value}},"_safeParse"),Pn=Ie(mr),Oe=p(e=>async(t,s,r)=>{const a=r?{...r,async:!0}:{async:!0};let i=t._zod.run({value:s,issues:[]},a);return i instanceof Promise&&(i=await i),i.issues.length?{success:!1,error:new e(i.issues.map(o=>K(o,a,W())))}:{success:!0,data:i.value}},"_safeParseAsync"),En=Oe(mr),Tn=p(e=>(t,s,r)=>{const a=r?{...r,direction:"backward"}:{direction:"backward"};return dt(e)(t,s,a)},"_encode"),jn=p(e=>(t,s,r)=>dt(e)(t,s,r),"_decode"),Rn=p(e=>async(t,s,r)=>{const a=r?{...r,direction:"backward"}:{direction:"backward"};return ut(e)(t,s,a)},"_encodeAsync"),An=p(e=>async(t,s,r)=>ut(e)(t,s,r),"_decodeAsync"),$n=p(e=>(t,s,r)=>{const a=r?{...r,direction:"backward"}:{direction:"backward"};return Ie(e)(t,s,a)},"_safeEncode"),Dn=p(e=>(t,s,r)=>Ie(e)(t,s,r),"_safeDecode"),_n=p(e=>async(t,s,r)=>{const a=r?{...r,direction:"backward"}:{direction:"backward"};return Oe(e)(t,s,a)},"_safeEncodeAsync"),Cn=p(e=>async(t,s,r)=>Oe(e)(t,s,r),"_safeDecodeAsync"),Ln=/^[cC][0-9a-z]{6,}$/,In=/^[0-9a-z]+$/,On=/^[0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{26}$/,Un=/^[0-9a-vA-V]{20}$/,Qn=/^[A-Za-z0-9]{27}$/,Fn=/^[a-zA-Z0-9_-]{21}$/,Hn=/^P(?:(\d+W)|(?!.*W)(?=\d|T\d)(\d+Y)?(\d+M)?(\d+D)?(T(?=\d)(\d+H)?(\d+M)?(\d+([.,]\d+)?S)?)?)$/,Mn=/^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$/,gr=p(e=>e?new RegExp(`^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-${e}[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$`):/^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/,"uuid"),Nn=/^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$/,Gn="^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$";function yr(){return new RegExp(Gn,"u")}c(yr,"ro"),p(yr,"emoji");const Bn=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,Vn=/^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))$/,Jn=/^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/([0-9]|[1-2][0-9]|3[0-2])$/,Zn=/^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|::|([0-9a-fA-F]{1,4})?::([0-9a-fA-F]{1,4}:?){0,6})\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,Wn=/^$|^(?:[0-9a-zA-Z+/]{4})*(?:(?:[0-9a-zA-Z+/]{2}==)|(?:[0-9a-zA-Z+/]{3}=))?$/,br=/^[A-Za-z0-9_-]*$/,Kn=/^https?$/,Yn=/^\+[1-9]\d{6,14}$/,kr="(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))",Xn=new RegExp(`^${kr}$`);function mt(e){const t="(?:[01]\\d|2[0-3]):[0-5]\\d";return typeof e.precision=="number"?e.precision===-1?`${t}`:e.precision===0?`${t}:[0-5]\\d`:`${t}:[0-5]\\d\\.\\d{${e.precision}}`:`${t}(?::[0-5]\\d(?:\\.\\d+)?)?`}c(mt,"ws"),p(mt,"timeSource");function vr(e){return new RegExp(`^${mt(e)}$`)}c(vr,"mo"),p(vr,"time$1");function qr(e){const t=mt({precision:e.precision}),s=["Z"];e.local&&s.push(""),e.offset&&s.push("([+-](?:[01]\\d|2[0-3]):[0-5]\\d)");const r=`${t}(?:${s.join("|")})`;return new RegExp(`^${kr}T(?:${r})$`)}c(qr,"ho"),p(qr,"datetime$1");const ep=p(e=>{const t=e?`[\\s\\S]{${e?.minimum??0},${e?.maximum??""}}`:"[\\s\\S]*";return new RegExp(`^${t}$`)},"string$1"),tp=/^-?\d+$/,sp=/^-?\d+(?:\.\d+)?$/,rp=/^[^A-Z]*$/,ap=/^[^a-z]*$/,O=y("$ZodCheck",(e,t)=>{var s;e._zod??(e._zod={}),e._zod.def=t,(s=e._zod).onattach??(s.onattach=[])}),xr={number:"number",bigint:"bigint",object:"date"},zr=y("$ZodCheckLessThan",(e,t)=>{O.init(e,t);const s=xr[typeof t.value];e._zod.onattach.push(r=>{const a=r._zod.bag,i=(t.inclusive?a.maximum:a.exclusiveMaximum)??Number.POSITIVE_INFINITY;t.value<i&&(t.inclusive?a.maximum=t.value:a.exclusiveMaximum=t.value)}),e._zod.check=r=>{(t.inclusive?r.value<=t.value:r.value<t.value)||r.issues.push({origin:s,code:"too_big",maximum:typeof t.value=="object"?t.value.getTime():t.value,input:r.value,inclusive:t.inclusive,inst:e,continue:!t.abort})}}),Sr=y("$ZodCheckGreaterThan",(e,t)=>{O.init(e,t);const s=xr[typeof t.value];e._zod.onattach.push(r=>{const a=r._zod.bag,i=(t.inclusive?a.minimum:a.exclusiveMinimum)??Number.NEGATIVE_INFINITY;t.value>i&&(t.inclusive?a.minimum=t.value:a.exclusiveMinimum=t.value)}),e._zod.check=r=>{(t.inclusive?r.value>=t.value:r.value>t.value)||r.issues.push({origin:s,code:"too_small",minimum:typeof t.value=="object"?t.value.getTime():t.value,input:r.value,inclusive:t.inclusive,inst:e,continue:!t.abort})}}),ip=y("$ZodCheckMultipleOf",(e,t)=>{O.init(e,t),e._zod.onattach.push(s=>{var r;(r=s._zod.bag).multipleOf??(r.multipleOf=t.value)}),e._zod.check=s=>{if(typeof s.value!=typeof t.value)throw new Error("Cannot mix number and bigint in multiple_of check.");(typeof s.value=="bigint"?s.value%t.value===BigInt(0):rr(s.value,t.value)===0)||s.issues.push({origin:typeof s.value,code:"not_multiple_of",divisor:t.value,input:s.value,inst:e,continue:!t.abort})}}),op=y("$ZodCheckNumberFormat",(e,t)=>{O.init(e,t),t.format=t.format||"float64";const s=t.format?.includes("int"),r=s?"int":"number",[a,i]=wn[t.format];e._zod.onattach.push(o=>{const n=o._zod.bag;n.format=t.format,n.minimum=a,n.maximum=i,s&&(n.pattern=tp)}),e._zod.check=o=>{const n=o.value;if(s){if(!Number.isInteger(n)){o.issues.push({expected:r,format:t.format,code:"invalid_type",continue:!1,input:n,inst:e});return}if(!Number.isSafeInteger(n)){n>0?o.issues.push({input:n,code:"too_big",maximum:Number.MAX_SAFE_INTEGER,note:"Integers must be within the safe integer range.",inst:e,origin:r,inclusive:!0,continue:!t.abort}):o.issues.push({input:n,code:"too_small",minimum:Number.MIN_SAFE_INTEGER,note:"Integers must be within the safe integer range.",inst:e,origin:r,inclusive:!0,continue:!t.abort});return}}n<a&&o.issues.push({origin:"number",input:n,code:"too_small",minimum:a,inclusive:!0,inst:e,continue:!t.abort}),n>i&&o.issues.push({origin:"number",input:n,code:"too_big",maximum:i,inclusive:!0,inst:e,continue:!t.abort})}}),np=y("$ZodCheckMaxLength",(e,t)=>{var s;O.init(e,t),(s=e._zod.def).when??(s.when=r=>{const a=r.value;return!De(a)&&a.length!==void 0}),e._zod.onattach.push(r=>{const a=r._zod.bag.maximum??Number.POSITIVE_INFINITY;t.maximum<a&&(r._zod.bag.maximum=t.maximum)}),e._zod.check=r=>{const a=r.value;if(a.length<=t.maximum)return;const i=Le(a);r.issues.push({origin:i,code:"too_big",maximum:t.maximum,inclusive:!0,input:a,inst:e,continue:!t.abort})}}),pp=y("$ZodCheckMinLength",(e,t)=>{var s;O.init(e,t),(s=e._zod.def).when??(s.when=r=>{const a=r.value;return!De(a)&&a.length!==void 0}),e._zod.onattach.push(r=>{const a=r._zod.bag.minimum??Number.NEGATIVE_INFINITY;t.minimum>a&&(r._zod.bag.minimum=t.minimum)}),e._zod.check=r=>{const a=r.value;if(a.length>=t.minimum)return;const i=Le(a);r.issues.push({origin:i,code:"too_small",minimum:t.minimum,inclusive:!0,input:a,inst:e,continue:!t.abort})}}),lp=y("$ZodCheckLengthEquals",(e,t)=>{var s;O.init(e,t),(s=e._zod.def).when??(s.when=r=>{const a=r.value;return!De(a)&&a.length!==void 0}),e._zod.onattach.push(r=>{const a=r._zod.bag;a.minimum=t.length,a.maximum=t.length,a.length=t.length}),e._zod.check=r=>{const a=r.value,i=a.length;if(i===t.length)return;const o=Le(a),n=i>t.length;r.issues.push({origin:o,...n?{code:"too_big",maximum:t.length}:{code:"too_small",minimum:t.length},inclusive:!0,exact:!0,input:r.value,inst:e,continue:!t.abort})}}),Ue=y("$ZodCheckStringFormat",(e,t)=>{var s,r;O.init(e,t),e._zod.onattach.push(a=>{const i=a._zod.bag;i.format=t.format,t.pattern&&(i.patterns??(i.patterns=new Set),i.patterns.add(t.pattern))}),t.pattern?(s=e._zod).check??(s.check=a=>{t.pattern.lastIndex=0,!t.pattern.test(a.value)&&a.issues.push({origin:"string",code:"invalid_format",format:t.format,input:a.value,...t.pattern?{pattern:t.pattern.toString()}:{},inst:e,continue:!t.abort})}):(r=e._zod).check??(r.check=()=>{})}),cp=y("$ZodCheckRegex",(e,t)=>{Ue.init(e,t),e._zod.check=s=>{t.pattern.lastIndex=0,!t.pattern.test(s.value)&&s.issues.push({origin:"string",code:"invalid_format",format:"regex",input:s.value,pattern:t.pattern.toString(),inst:e,continue:!t.abort})}}),dp=y("$ZodCheckLowerCase",(e,t)=>{t.pattern??(t.pattern=rp),Ue.init(e,t)}),up=y("$ZodCheckUpperCase",(e,t)=>{t.pattern??(t.pattern=ap),Ue.init(e,t)}),mp=y("$ZodCheckIncludes",(e,t)=>{O.init(e,t);const s=ue(t.includes),r=new RegExp(typeof t.position=="number"?`^.{${t.position}}${s}`:s);t.pattern=r,e._zod.onattach.push(a=>{const i=a._zod.bag;i.patterns??(i.patterns=new Set),i.patterns.add(r)}),e._zod.check=a=>{a.value.includes(t.includes,t.position)||a.issues.push({origin:"string",code:"invalid_format",format:"includes",includes:t.includes,input:a.value,inst:e,continue:!t.abort})}}),hp=y("$ZodCheckStartsWith",(e,t)=>{O.init(e,t);const s=new RegExp(`^${ue(t.prefix)}.*`);t.pattern??(t.pattern=s),e._zod.onattach.push(r=>{const a=r._zod.bag;a.patterns??(a.patterns=new Set),a.patterns.add(s)}),e._zod.check=r=>{r.value.startsWith(t.prefix)||r.issues.push({origin:"string",code:"invalid_format",format:"starts_with",prefix:t.prefix,input:r.value,inst:e,continue:!t.abort})}}),fp=y("$ZodCheckEndsWith",(e,t)=>{O.init(e,t);const s=new RegExp(`.*${ue(t.suffix)}$`);t.pattern??(t.pattern=s),e._zod.onattach.push(r=>{const a=r._zod.bag;a.patterns??(a.patterns=new Set),a.patterns.add(s)}),e._zod.check=r=>{r.value.endsWith(t.suffix)||r.issues.push({origin:"string",code:"invalid_format",format:"ends_with",suffix:t.suffix,input:r.value,inst:e,continue:!t.abort})}}),gp=y("$ZodCheckOverwrite",(e,t)=>{O.init(e,t),e._zod.check=s=>{s.value=t.tx(s.value)}}),yp={major:4,minor:4,patch:3},A=y("$ZodType",(e,t)=>{var s;e??(e={}),e._zod.def=t,e._zod.bag=e._zod.bag||{},e._zod.version=yp;const r=[...e._zod.def.checks??[]];e._zod.traits.has("$ZodCheck")&&r.unshift(e);for(const a of r)for(const i of a._zod.onattach)i(e);if(r.length===0)(s=e._zod).deferred??(s.deferred=[]),e._zod.deferred?.push(()=>{e._zod.run=e._zod.parse});else{const a=p((o,n,l)=>{let d=X(o),u;for(const m of n){if(m._zod.def.when){if(lr(o)||!m._zod.def.when(o))continue}else if(d)continue;const h=o.issues.length,g=m._zod.check(o);if(g instanceof Promise&&l?.async===!1)throw new re;if(u||g instanceof Promise)u=(u??Promise.resolve()).then(async()=>{await g,o.issues.length!==h&&(d||(d=X(o,h)))});else{if(o.issues.length===h)continue;d||(d=X(o,h))}}return u?u.then(()=>o):o},"runChecks"),i=p((o,n,l)=>{if(X(o))return o.aborted=!0,o;const d=a(n,r,l);if(d instanceof Promise){if(l.async===!1)throw new re;return d.then(u=>e._zod.parse(u,l))}return e._zod.parse(d,l)},"handleCanaryResult");e._zod.run=(o,n)=>{if(n.skipChecks)return e._zod.parse(o,n);if(n.direction==="backward"){const d=e._zod.parse({value:o.value,issues:[]},{...n,skipChecks:!0});return d instanceof Promise?d.then(u=>i(u,o,n)):i(d,o,n)}const l=e._zod.parse(o,n);if(l instanceof Promise){if(n.async===!1)throw new re;return l.then(d=>a(d,r,n))}return a(l,r,n)}}w(e,"~standard",()=>({validate:p(a=>{try{const i=Pn(e,a);return i.success?{value:i.data}:{issues:i.error?.issues}}catch{return En(e,a).then(i=>i.success?{value:i.data}:{issues:i.error?.issues})}},"validate"),vendor:"zod",version:1}))}),ht=y("$ZodString",(e,t)=>{A.init(e,t),e._zod.pattern=[...e?._zod.bag?.patterns??[]].pop()??ep(e._zod.bag),e._zod.parse=(s,r)=>{if(t.coerce)try{s.value=String(s.value)}catch{}return typeof s.value=="string"||s.issues.push({expected:"string",code:"invalid_type",input:s.value,inst:e}),s}}),P=y("$ZodStringFormat",(e,t)=>{Ue.init(e,t),ht.init(e,t)}),bp=y("$ZodGUID",(e,t)=>{t.pattern??(t.pattern=Mn),P.init(e,t)}),kp=y("$ZodUUID",(e,t)=>{if(t.version){const s={v1:1,v2:2,v3:3,v4:4,v5:5,v6:6,v7:7,v8:8}[t.version];if(s===void 0)throw new Error(`Invalid UUID version: "${t.version}"`);t.pattern??(t.pattern=gr(s))}else t.pattern??(t.pattern=gr());P.init(e,t)}),vp=y("$ZodEmail",(e,t)=>{t.pattern??(t.pattern=Nn),P.init(e,t)}),qp=y("$ZodURL",(e,t)=>{P.init(e,t),e._zod.check=s=>{try{const r=s.value.trim();if(!t.normalize&&t.protocol?.source===Kn.source&&!/^https?:\/\//i.test(r)){s.issues.push({code:"invalid_format",format:"url",note:"Invalid URL format",input:s.value,inst:e,continue:!t.abort});return}const a=new URL(r);t.hostname&&(t.hostname.lastIndex=0,t.hostname.test(a.hostname)||s.issues.push({code:"invalid_format",format:"url",note:"Invalid hostname",pattern:t.hostname.source,input:s.value,inst:e,continue:!t.abort})),t.protocol&&(t.protocol.lastIndex=0,t.protocol.test(a.protocol.endsWith(":")?a.protocol.slice(0,-1):a.protocol)||s.issues.push({code:"invalid_format",format:"url",note:"Invalid protocol",pattern:t.protocol.source,input:s.value,inst:e,continue:!t.abort})),t.normalize?s.value=a.href:s.value=r;return}catch{s.issues.push({code:"invalid_format",format:"url",input:s.value,inst:e,continue:!t.abort})}}}),xp=y("$ZodEmoji",(e,t)=>{t.pattern??(t.pattern=yr()),P.init(e,t)}),zp=y("$ZodNanoID",(e,t)=>{t.pattern??(t.pattern=Fn),P.init(e,t)}),Sp=y("$ZodCUID",(e,t)=>{t.pattern??(t.pattern=Ln),P.init(e,t)}),wp=y("$ZodCUID2",(e,t)=>{t.pattern??(t.pattern=In),P.init(e,t)}),Pp=y("$ZodULID",(e,t)=>{t.pattern??(t.pattern=On),P.init(e,t)}),Ep=y("$ZodXID",(e,t)=>{t.pattern??(t.pattern=Un),P.init(e,t)}),Tp=y("$ZodKSUID",(e,t)=>{t.pattern??(t.pattern=Qn),P.init(e,t)}),jp=y("$ZodISODateTime",(e,t)=>{t.pattern??(t.pattern=qr(t)),P.init(e,t)}),Rp=y("$ZodISODate",(e,t)=>{t.pattern??(t.pattern=Xn),P.init(e,t)}),Ap=y("$ZodISOTime",(e,t)=>{t.pattern??(t.pattern=vr(t)),P.init(e,t)}),$p=y("$ZodISODuration",(e,t)=>{t.pattern??(t.pattern=Hn),P.init(e,t)}),Dp=y("$ZodIPv4",(e,t)=>{t.pattern??(t.pattern=Bn),P.init(e,t),e._zod.bag.format="ipv4"}),_p=y("$ZodIPv6",(e,t)=>{t.pattern??(t.pattern=Vn),P.init(e,t),e._zod.bag.format="ipv6",e._zod.check=s=>{try{new URL(`http://[${s.value}]`)}catch{s.issues.push({code:"invalid_format",format:"ipv6",input:s.value,inst:e,continue:!t.abort})}}}),Cp=y("$ZodCIDRv4",(e,t)=>{t.pattern??(t.pattern=Jn),P.init(e,t)}),Lp=y("$ZodCIDRv6",(e,t)=>{t.pattern??(t.pattern=Zn),P.init(e,t),e._zod.check=s=>{const r=s.value.split("/");try{if(r.length!==2)throw new Error;const[a,i]=r;if(!i)throw new Error;const o=Number(i);if(`${o}`!==i)throw new Error;if(o<0||o>128)throw new Error;new URL(`http://[${a}]`)}catch{s.issues.push({code:"invalid_format",format:"cidrv6",input:s.value,inst:e,continue:!t.abort})}}});function ft(e){if(e==="")return!0;if(/\s/.test(e)||e.length%4!==0)return!1;try{return atob(e),!0}catch{return!1}}c(ft,"js"),p(ft,"isValidBase64");const Ip=y("$ZodBase64",(e,t)=>{t.pattern??(t.pattern=Wn),P.init(e,t),e._zod.bag.contentEncoding="base64",e._zod.check=s=>{ft(s.value)||s.issues.push({code:"invalid_format",format:"base64",input:s.value,inst:e,continue:!t.abort})}});function wr(e){if(!br.test(e))return!1;const t=e.replace(/[-_]/g,r=>r==="-"?"+":"/"),s=t.padEnd(Math.ceil(t.length/4)*4,"=");return ft(s)}c(wr,"Xo"),p(wr,"isValidBase64URL");const Op=y("$ZodBase64URL",(e,t)=>{t.pattern??(t.pattern=br),P.init(e,t),e._zod.bag.contentEncoding="base64url",e._zod.check=s=>{wr(s.value)||s.issues.push({code:"invalid_format",format:"base64url",input:s.value,inst:e,continue:!t.abort})}}),Up=y("$ZodE164",(e,t)=>{t.pattern??(t.pattern=Yn),P.init(e,t)});function Pr(e,t=null){try{const s=e.split(".");if(s.length!==3)return!1;const[r]=s;if(!r)return!1;const a=JSON.parse(atob(r));return!("typ"in a&&a?.typ!=="JWT"||!a.alg||t&&(!("alg"in a)||a.alg!==t))}catch{return!1}}c(Pr,"sn"),p(Pr,"isValidJWT");const Qp=y("$ZodJWT",(e,t)=>{P.init(e,t),e._zod.check=s=>{Pr(s.value,t.alg)||s.issues.push({code:"invalid_format",format:"jwt",input:s.value,inst:e,continue:!t.abort})}}),Er=y("$ZodNumber",(e,t)=>{A.init(e,t),e._zod.pattern=e._zod.bag.pattern??sp,e._zod.parse=(s,r)=>{if(t.coerce)try{s.value=Number(s.value)}catch{}const a=s.value;if(typeof a=="number"&&!Number.isNaN(a)&&Number.isFinite(a))return s;const i=typeof a=="number"?Number.isNaN(a)?"NaN":Number.isFinite(a)?void 0:"Infinity":void 0;return s.issues.push({expected:"number",code:"invalid_type",input:a,inst:e,...i?{received:i}:{}}),s}}),Fp=y("$ZodNumberFormat",(e,t)=>{op.init(e,t),Er.init(e,t)});function gt(e,t,s){e.issues.length&&t.issues.push(...cr(s,e.issues)),t.value[s]=e.value}c(gt,"As"),p(gt,"handleArrayResult");const Hp=y("$ZodArray",(e,t)=>{A.init(e,t),e._zod.parse=(s,r)=>{const a=s.value;if(!Array.isArray(a))return s.issues.push({expected:"array",code:"invalid_type",input:a,inst:e}),s;s.value=Array(a.length);const i=[];for(let o=0;o<a.length;o++){const n=a[o],l=t.element._zod.run({value:n,issues:[]},r);l instanceof Promise?i.push(l.then(d=>gt(d,s,o))):gt(l,s,o)}return i.length?Promise.all(i).then(()=>s):s}});function yt(e,t,s,r){for(const i of e)if(i.issues.length===0)return t.value=i.value,t;const a=e.filter(i=>!X(i));return a.length===1?(t.value=a[0].value,a[0]):(t.issues.push({code:"invalid_union",input:t.value,inst:s,errors:e.map(i=>i.issues.map(o=>K(o,r,W())))}),t)}c(yt,"_s"),p(yt,"handleUnionResults");const Mp=y("$ZodUnion",(e,t)=>{A.init(e,t),w(e._zod,"optin",()=>t.options.some(r=>r._zod.optin==="optional")?"optional":void 0),w(e._zod,"optout",()=>t.options.some(r=>r._zod.optout==="optional")?"optional":void 0),w(e._zod,"values",()=>{if(t.options.every(r=>r._zod.values))return new Set(t.options.flatMap(r=>Array.from(r._zod.values)))}),w(e._zod,"pattern",()=>{if(t.options.every(r=>r._zod.pattern)){const r=t.options.map(a=>a._zod.pattern);return new RegExp(`^(${r.map(a=>_e(a.source)).join("|")})$`)}});const s=t.options.length===1?t.options[0]._zod.run:null;e._zod.parse=(r,a)=>{if(s)return s(r,a);let i=!1;const o=[];for(const n of t.options){const l=n._zod.run({value:r.value,issues:[]},a);if(l instanceof Promise)o.push(l),i=!0;else{if(l.issues.length===0)return l;o.push(l)}}return i?Promise.all(o).then(n=>yt(n,r,e,a)):yt(o,r,e,a)}}),Np=y("$ZodIntersection",(e,t)=>{A.init(e,t),e._zod.parse=(s,r)=>{const a=s.value,i=t.left._zod.run({value:a,issues:[]},r),o=t.right._zod.run({value:a,issues:[]},r);return i instanceof Promise||o instanceof Promise?Promise.all([i,o]).then(([n,l])=>bt(s,n,l)):bt(s,i,o)}});function Qe(e,t){if(e===t)return{valid:!0,data:e};if(e instanceof Date&&t instanceof Date&&+e==+t)return{valid:!0,data:e};if(Ce(e)&&Ce(t)){const s=Object.keys(t),r=Object.keys(e).filter(i=>s.indexOf(i)!==-1),a={...e,...t};for(const i of r){const o=Qe(e[i],t[i]);if(!o.valid)return{valid:!1,mergeErrorPath:[i,...o.mergeErrorPath]};a[i]=o.data}return{valid:!0,data:a}}if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return{valid:!1,mergeErrorPath:[]};const s=[];for(let r=0;r<e.length;r++){const a=e[r],i=t[r],o=Qe(a,i);if(!o.valid)return{valid:!1,mergeErrorPath:[r,...o.mergeErrorPath]};s.push(o.data)}return{valid:!0,data:s}}return{valid:!1,mergeErrorPath:[]}}c(Qe,"Xe"),p(Qe,"mergeValues");function bt(e,t,s){const r=new Map;let a;for(const n of t.issues)if(n.code==="unrecognized_keys"){a??(a=n);for(const l of n.keys)r.has(l)||r.set(l,{}),r.get(l).l=!0}else e.issues.push(n);for(const n of s.issues)if(n.code==="unrecognized_keys")for(const l of n.keys)r.has(l)||r.set(l,{}),r.get(l).r=!0;else e.issues.push(n);const i=[...r].filter(([,n])=>n.l&&n.r).map(([n])=>n);if(i.length&&a&&e.issues.push({...a,keys:i}),X(e))return e;const o=Qe(t.value,s.value);if(!o.valid)throw new Error(`Unmergable intersection. Error path: ${JSON.stringify(o.mergeErrorPath)}`);return e.value=o.data,e}c(bt,"$s"),p(bt,"handleIntersectionResults");const Gp=y("$ZodEnum",(e,t)=>{A.init(e,t);const s=pt(t.entries),r=new Set(s);e._zod.values=r,e._zod.pattern=new RegExp(`^(${s.filter(a=>Sn.has(typeof a)).map(a=>typeof a=="string"?ue(a):a.toString()).join("|")})$`),e._zod.parse=(a,i)=>{const o=a.value;return r.has(o)||a.issues.push({code:"invalid_value",values:s,input:o,inst:e}),a}}),Bp=y("$ZodTransform",(e,t)=>{A.init(e,t),e._zod.optin="optional",e._zod.parse=(s,r)=>{if(r.direction==="backward")throw new sr(e.constructor.name);const a=t.transform(s.value,s);if(r.async)return(a instanceof Promise?a:Promise.resolve(a)).then(i=>(s.value=i,s.fallback=!0,s));if(a instanceof Promise)throw new re;return s.value=a,s.fallback=!0,s}});function kt(e,t){return t===void 0&&(e.issues.length||e.fallback)?{issues:[],value:void 0}:e}c(kt,"Cs"),p(kt,"handleOptionalResult");const Tr=y("$ZodOptional",(e,t)=>{A.init(e,t),e._zod.optin="optional",e._zod.optout="optional",w(e._zod,"values",()=>t.innerType._zod.values?new Set([...t.innerType._zod.values,void 0]):void 0),w(e._zod,"pattern",()=>{const s=t.innerType._zod.pattern;return s?new RegExp(`^(${_e(s.source)})?$`):void 0}),e._zod.parse=(s,r)=>{if(t.innerType._zod.optin==="optional"){const a=s.value,i=t.innerType._zod.run(s,r);return i instanceof Promise?i.then(o=>kt(o,a)):kt(i,a)}return s.value===void 0?s:t.innerType._zod.run(s,r)}}),Vp=y("$ZodExactOptional",(e,t)=>{Tr.init(e,t),w(e._zod,"values",()=>t.innerType._zod.values),w(e._zod,"pattern",()=>t.innerType._zod.pattern),e._zod.parse=(s,r)=>t.innerType._zod.run(s,r)}),Jp=y("$ZodNullable",(e,t)=>{A.init(e,t),w(e._zod,"optin",()=>t.innerType._zod.optin),w(e._zod,"optout",()=>t.innerType._zod.optout),w(e._zod,"pattern",()=>{const s=t.innerType._zod.pattern;return s?new RegExp(`^(${_e(s.source)}|null)$`):void 0}),w(e._zod,"values",()=>t.innerType._zod.values?new Set([...t.innerType._zod.values,null]):void 0),e._zod.parse=(s,r)=>s.value===null?s:t.innerType._zod.run(s,r)}),Zp=y("$ZodDefault",(e,t)=>{A.init(e,t),e._zod.optin="optional",w(e._zod,"values",()=>t.innerType._zod.values),e._zod.parse=(s,r)=>{if(r.direction==="backward")return t.innerType._zod.run(s,r);if(s.value===void 0)return s.value=t.defaultValue,s;const a=t.innerType._zod.run(s,r);return a instanceof Promise?a.then(i=>vt(i,t)):vt(a,t)}});function vt(e,t){return e.value===void 0&&(e.value=t.defaultValue),e}c(vt,"Ls"),p(vt,"handleDefaultResult");const Wp=y("$ZodPrefault",(e,t)=>{A.init(e,t),e._zod.optin="optional",w(e._zod,"values",()=>t.innerType._zod.values),e._zod.parse=(s,r)=>(r.direction==="backward"||s.value===void 0&&(s.value=t.defaultValue),t.innerType._zod.run(s,r))}),Kp=y("$ZodNonOptional",(e,t)=>{A.init(e,t),w(e._zod,"values",()=>{const s=t.innerType._zod.values;return s?new Set([...s].filter(r=>r!==void 0)):void 0}),e._zod.parse=(s,r)=>{const a=t.innerType._zod.run(s,r);return a instanceof Promise?a.then(i=>qt(i,e)):qt(a,e)}});function qt(e,t){return!e.issues.length&&e.value===void 0&&e.issues.push({code:"invalid_type",expected:"nonoptional",input:e.value,inst:t}),e}c(qt,"Os"),p(qt,"handleNonOptionalResult");const Yp=y("$ZodCatch",(e,t)=>{A.init(e,t),e._zod.optin="optional",w(e._zod,"optout",()=>t.innerType._zod.optout),w(e._zod,"values",()=>t.innerType._zod.values),e._zod.parse=(s,r)=>{if(r.direction==="backward")return t.innerType._zod.run(s,r);const a=t.innerType._zod.run(s,r);return a instanceof Promise?a.then(i=>(s.value=i.value,i.issues.length&&(s.value=t.catchValue({...s,error:{issues:i.issues.map(o=>K(o,r,W()))},input:s.value}),s.issues=[],s.fallback=!0),s)):(s.value=a.value,a.issues.length&&(s.value=t.catchValue({...s,error:{issues:a.issues.map(i=>K(i,r,W()))},input:s.value}),s.issues=[],s.fallback=!0),s)}}),Xp=y("$ZodPipe",(e,t)=>{A.init(e,t),w(e._zod,"values",()=>t.in._zod.values),w(e._zod,"optin",()=>t.in._zod.optin),w(e._zod,"optout",()=>t.out._zod.optout),w(e._zod,"propValues",()=>t.in._zod.propValues),e._zod.parse=(s,r)=>{if(r.direction==="backward"){const i=t.out._zod.run(s,r);return i instanceof Promise?i.then(o=>he(o,t.in,r)):he(i,t.in,r)}const a=t.in._zod.run(s,r);return a instanceof Promise?a.then(i=>he(i,t.out,r)):he(a,t.out,r)}});function he(e,t,s){return e.issues.length?(e.aborted=!0,e):t._zod.run({value:e.value,issues:e.issues,fallback:e.fallback},s)}c(he,"Te"),p(he,"handlePipeResult");const el=y("$ZodReadonly",(e,t)=>{A.init(e,t),w(e._zod,"propValues",()=>t.innerType._zod.propValues),w(e._zod,"values",()=>t.innerType._zod.values),w(e._zod,"optin",()=>t.innerType?._zod?.optin),w(e._zod,"optout",()=>t.innerType?._zod?.optout),e._zod.parse=(s,r)=>{if(r.direction==="backward")return t.innerType._zod.run(s,r);const a=t.innerType._zod.run(s,r);return a instanceof Promise?a.then(xt):xt(a)}});function xt(e){return e.value=Object.freeze(e.value),e}c(xt,"Is"),p(xt,"handleReadonlyResult");const tl=y("$ZodCustom",(e,t)=>{O.init(e,t),A.init(e,t),e._zod.parse=(s,r)=>s,e._zod.check=s=>{const r=s.value,a=t.fn(r);if(a instanceof Promise)return a.then(i=>zt(i,s,r,e));zt(a,s,r,e)}});function zt(e,t,s,r){if(!e){const a={code:"custom",input:s,inst:r,path:[...r._zod.def.path??[]],continue:!r._zod.def.abort};r._zod.def.params&&(a.params=r._zod.def.params),t.issues.push(ae(a))}}c(zt,"Us"),p(zt,"handleRefineResult");var jr;class sl{static{c(this,"vn")}static{p(this,"$ZodRegistry")}constructor(){this._map=new WeakMap,this._idmap=new Map}add(t,...s){const r=s[0];return this._map.set(t,r),r&&typeof r=="object"&&"id"in r&&this._idmap.set(r.id,t),this}clear(){return this._map=new WeakMap,this._idmap=new Map,this}remove(t){const s=this._map.get(t);return s&&typeof s=="object"&&"id"in s&&this._idmap.delete(s.id),this._map.delete(t),this}get(t){const s=t._zod.parent;if(s){const r={...this.get(s)??{}};delete r.id;const a={...r,...this._map.get(t)};return Object.keys(a).length?a:void 0}return this._map.get(t)}has(t){return this._map.has(t)}}function Rr(){return new sl}c(Rr,"qn"),p(Rr,"registry"),(jr=globalThis).__zod_globalRegistry??(jr.__zod_globalRegistry=Rr());const fe=globalThis.__zod_globalRegistry;function Ar(e,t){return new e({type:"string",...q(t)})}c(Ar,"zn"),p(Ar,"_string");function $r(e,t){return new e({type:"string",format:"email",check:"string_format",abort:!1,...q(t)})}c($r,"Sn"),p($r,"_email");function St(e,t){return new e({type:"string",format:"guid",check:"string_format",abort:!1,...q(t)})}c(St,"Fs"),p(St,"_guid");function Dr(e,t){return new e({type:"string",format:"uuid",check:"string_format",abort:!1,...q(t)})}c(Dr,"xn"),p(Dr,"_uuid");function _r(e,t){return new e({type:"string",format:"uuid",check:"string_format",abort:!1,version:"v4",...q(t)})}c(_r,"wn"),p(_r,"_uuidv4");function Cr(e,t){return new e({type:"string",format:"uuid",check:"string_format",abort:!1,version:"v6",...q(t)})}c(Cr,"En"),p(Cr,"_uuidv6");function Lr(e,t){return new e({type:"string",format:"uuid",check:"string_format",abort:!1,version:"v7",...q(t)})}c(Lr,"Pn"),p(Lr,"_uuidv7");function Ir(e,t){return new e({type:"string",format:"url",check:"string_format",abort:!1,...q(t)})}c(Ir,"Tn"),p(Ir,"_url");function Or(e,t){return new e({type:"string",format:"emoji",check:"string_format",abort:!1,...q(t)})}c(Or,"jn"),p(Or,"_emoji");function Ur(e,t){return new e({type:"string",format:"nanoid",check:"string_format",abort:!1,...q(t)})}c(Ur,"Rn"),p(Ur,"_nanoid");function Qr(e,t){return new e({type:"string",format:"cuid",check:"string_format",abort:!1,...q(t)})}c(Qr,"An"),p(Qr,"_cuid");function Fr(e,t){return new e({type:"string",format:"cuid2",check:"string_format",abort:!1,...q(t)})}c(Fr,"_n"),p(Fr,"_cuid2");function Hr(e,t){return new e({type:"string",format:"ulid",check:"string_format",abort:!1,...q(t)})}c(Hr,"$n"),p(Hr,"_ulid");function Mr(e,t){return new e({type:"string",format:"xid",check:"string_format",abort:!1,...q(t)})}c(Mr,"Cn"),p(Mr,"_xid");function Nr(e,t){return new e({type:"string",format:"ksuid",check:"string_format",abort:!1,...q(t)})}c(Nr,"Dn"),p(Nr,"_ksuid");function Gr(e,t){return new e({type:"string",format:"ipv4",check:"string_format",abort:!1,...q(t)})}c(Gr,"Ln"),p(Gr,"_ipv4");function Br(e,t){return new e({type:"string",format:"ipv6",check:"string_format",abort:!1,...q(t)})}c(Br,"On"),p(Br,"_ipv6");function Vr(e,t){return new e({type:"string",format:"cidrv4",check:"string_format",abort:!1,...q(t)})}c(Vr,"In"),p(Vr,"_cidrv4");function Jr(e,t){return new e({type:"string",format:"cidrv6",check:"string_format",abort:!1,...q(t)})}c(Jr,"Un"),p(Jr,"_cidrv6");function Zr(e,t){return new e({type:"string",format:"base64",check:"string_format",abort:!1,...q(t)})}c(Zr,"Qn"),p(Zr,"_base64");function Wr(e,t){return new e({type:"string",format:"base64url",check:"string_format",abort:!1,...q(t)})}c(Wr,"Fn"),p(Wr,"_base64url");function Kr(e,t){return new e({type:"string",format:"e164",check:"string_format",abort:!1,...q(t)})}c(Kr,"Mn"),p(Kr,"_e164");function Yr(e,t){return new e({type:"string",format:"jwt",check:"string_format",abort:!1,...q(t)})}c(Yr,"Hn"),p(Yr,"_jwt");function Xr(e,t){return new e({type:"string",format:"datetime",check:"string_format",offset:!1,local:!1,precision:null,...q(t)})}c(Xr,"Nn"),p(Xr,"_isoDateTime");function ea(e,t){return new e({type:"string",format:"date",check:"string_format",...q(t)})}c(ea,"Gn"),p(ea,"_isoDate");function ta(e,t){return new e({type:"string",format:"time",check:"string_format",precision:null,...q(t)})}c(ta,"Bn"),p(ta,"_isoTime");function sa(e,t){return new e({type:"string",format:"duration",check:"string_format",...q(t)})}c(sa,"Zn"),p(sa,"_isoDuration");function ra(e,t){return new e({type:"number",coerce:!0,checks:[],...q(t)})}c(ra,"Vn"),p(ra,"_coercedNumber");function aa(e,t){return new e({type:"number",check:"number_format",abort:!1,format:"safeint",...q(t)})}c(aa,"Jn"),p(aa,"_int");function wt(e,t){return new zr({check:"less_than",...q(t),value:e,inclusive:!1})}c(wt,"Ms"),p(wt,"_lt");function Fe(e,t){return new zr({check:"less_than",...q(t),value:e,inclusive:!0})}c(Fe,"et"),p(Fe,"_lte");function Pt(e,t){return new Sr({check:"greater_than",...q(t),value:e,inclusive:!1})}c(Pt,"Hs"),p(Pt,"_gt");function He(e,t){return new Sr({check:"greater_than",...q(t),value:e,inclusive:!0})}c(He,"tt"),p(He,"_gte");function Et(e,t){return new ip({check:"multiple_of",...q(t),value:e})}c(Et,"Ns"),p(Et,"_multipleOf");function Tt(e,t){return new np({check:"max_length",...q(t),maximum:e})}c(Tt,"Gs"),p(Tt,"_maxLength");function ge(e,t){return new pp({check:"min_length",...q(t),minimum:e})}c(ge,"je"),p(ge,"_minLength");function jt(e,t){return new lp({check:"length_equals",...q(t),length:e})}c(jt,"Bs"),p(jt,"_length");function ia(e,t){return new cp({check:"string_format",format:"regex",...q(t),pattern:e})}c(ia,"Wn"),p(ia,"_regex");function oa(e){return new dp({check:"string_format",format:"lowercase",...q(e)})}c(oa,"Kn"),p(oa,"_lowercase");function na(e){return new up({check:"string_format",format:"uppercase",...q(e)})}c(na,"Yn"),p(na,"_uppercase");function pa(e,t){return new mp({check:"string_format",format:"includes",...q(t),includes:e})}c(pa,"Xn"),p(pa,"_includes");function la(e,t){return new hp({check:"string_format",format:"starts_with",...q(t),prefix:e})}c(la,"ep"),p(la,"_startsWith");function ca(e,t){return new fp({check:"string_format",format:"ends_with",...q(t),suffix:e})}c(ca,"tp"),p(ca,"_endsWith");function ee(e){return new gp({check:"overwrite",tx:e})}c(ee,"te"),p(ee,"_overwrite");function da(e){return ee(t=>t.normalize(e))}c(da,"sp"),p(da,"_normalize");function ua(){return ee(e=>e.trim())}c(ua,"rp"),p(ua,"_trim");function ma(){return ee(e=>e.toLowerCase())}c(ma,"ap"),p(ma,"_toLowerCase");function ha(){return ee(e=>e.toUpperCase())}c(ha,"ip"),p(ha,"_toUpperCase");function fa(){return ee(e=>or(e))}c(fa,"op"),p(fa,"_slugify");function ga(e,t,s){return new e({type:"array",element:t,...q(s)})}c(ga,"np"),p(ga,"_array");function ya(e,t,s){return new e({type:"custom",check:"custom",fn:t,...q(s)})}c(ya,"pp"),p(ya,"_refine");function ba(e,t){const s=ka(r=>(r.addIssue=a=>{if(typeof a=="string")r.issues.push(ae(a,r.value,s._zod.def));else{const i=a;i.fatal&&(i.continue=!1),i.code??(i.code="custom"),i.input??(i.input=r.value),i.inst??(i.inst=s),i.continue??(i.continue=!s._zod.def.abort),r.issues.push(ae(i))}},e(r.value,r)),t);return s}c(ba,"lp"),p(ba,"_superRefine");function ka(e,t){const s=new O({check:"custom",...q(t)});return s._zod.check=e,s}c(ka,"cp"),p(ka,"_check");function Rt(e){let t=e?.target??"draft-2020-12";return t==="draft-4"&&(t="draft-04"),t==="draft-7"&&(t="draft-07"),{processors:e.processors??{},metadataRegistry:e?.metadata??fe,target:t,unrepresentable:e?.unrepresentable??"throw",override:e?.override??(()=>{}),io:e?.io??"output",counter:0,seen:new Map,cycles:e?.cycles??"ref",reused:e?.reused??"inline",external:e?.external??void 0}}c(Rt,"Zs"),p(Rt,"initializeContext");function _(e,t,s={path:[],schemaPath:[]}){var r;const a=e._zod.def,i=t.seen.get(e);if(i)return i.count++,s.schemaPath.includes(e)&&(i.cycle=s.path),i.schema;const o={schema:{},count:1,cycle:void 0,path:s.path};t.seen.set(e,o);const n=e._zod.toJSONSchema?.();if(n)o.schema=n;else{const d={...s,schemaPath:[...s.schemaPath,e],path:s.path};if(e._zod.processJSONSchema)e._zod.processJSONSchema(t,o.schema,d);else{const m=o.schema,h=t.processors[a.type];if(!h)throw new Error(`[toJSONSchema]: Non-representable type encountered: ${a.type}`);h(e,t,m,d)}const u=e._zod.parent;u&&(o.ref||(o.ref=u),_(u,t,d),t.seen.get(u).isParent=!0)}const l=t.metadataRegistry.get(e);return l&&Object.assign(o.schema,l),t.io==="input"&&C(e)&&(delete o.schema.examples,delete o.schema.default),t.io==="input"&&"_prefault"in o.schema&&((r=o.schema).default??(r.default=o.schema._prefault)),delete o.schema._prefault,t.seen.get(e).schema}c(_,"D"),p(_,"process$1");function At(e,t){const s=e.seen.get(t);if(!s)throw new Error("Unprocessed schema. This is a bug in Zod.");const r=new Map;for(const o of e.seen.entries()){const n=e.metadataRegistry.get(o[0])?.id;if(n){const l=r.get(n);if(l&&l!==o[0])throw new Error(`Duplicate schema id "${n}" detected during JSON Schema conversion. Two different schemas cannot share the same id when converted together.`);r.set(n,o[0])}}const a=p(o=>{const n=e.target==="draft-2020-12"?"$defs":"definitions";if(e.external){const u=e.external.registry.get(o[0])?.id,m=e.external.uri??(g=>g);if(u)return{ref:m(u)};const h=o[1].defId??o[1].schema.id??`schema${e.counter++}`;return o[1].defId=h,{defId:h,ref:`${m("__shared")}#/${n}/${h}`}}if(o[1]===s)return{ref:"#"};const l=`#/${n}/`,d=o[1].schema.id??`__schema${e.counter++}`;return{defId:d,ref:l+d}},"makeURI"),i=p(o=>{if(o[1].schema.$ref)return;const n=o[1],{ref:l,defId:d}=a(o);n.def={...n.schema},d&&(n.defId=d);const u=n.schema;for(const m in u)delete u[m];u.$ref=l},"extractToDef");if(e.cycles==="throw")for(const o of e.seen.entries()){const n=o[1];if(n.cycle)throw new Error(`Cycle detected: #/${n.cycle?.join("/")}/<root>
327
+
328
+ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.`)}for(const o of e.seen.entries()){const n=o[1];if(t===o[0]){i(o);continue}if(e.external){const l=e.external.registry.get(o[0])?.id;if(t!==o[0]&&l){i(o);continue}}if(e.metadataRegistry.get(o[0])?.id){i(o);continue}if(n.cycle){i(o);continue}if(n.count>1&&e.reused==="ref"){i(o);continue}}}c(At,"Vs"),p(At,"extractDefs");function $t(e,t){const s=e.seen.get(t);if(!s)throw new Error("Unprocessed schema. This is a bug in Zod.");const r=p(n=>{const l=e.seen.get(n);if(l.ref===null)return;const d=l.def??l.schema,u={...d},m=l.ref;if(l.ref=null,m){r(m);const g=e.seen.get(m),v=g.schema;if(v.$ref&&(e.target==="draft-07"||e.target==="draft-04"||e.target==="openapi-3.0")?(d.allOf=d.allOf??[],d.allOf.push(v)):Object.assign(d,v),Object.assign(d,u),n._zod.parent===m)for(const b in d)b==="$ref"||b==="allOf"||b in u||delete d[b];if(v.$ref&&g.def)for(const b in d)b==="$ref"||b==="allOf"||b in g.def&&JSON.stringify(d[b])===JSON.stringify(g.def[b])&&delete d[b]}const h=n._zod.parent;if(h&&h!==m){r(h);const g=e.seen.get(h);if(g?.schema.$ref&&(d.$ref=g.schema.$ref,g.def))for(const v in d)v==="$ref"||v==="allOf"||v in g.def&&JSON.stringify(d[v])===JSON.stringify(g.def[v])&&delete d[v]}e.override({zodSchema:n,jsonSchema:d,path:l.path??[]})},"flattenRef");for(const n of[...e.seen.entries()].reverse())r(n[0]);const a={};if(e.target==="draft-2020-12"?a.$schema="https://json-schema.org/draft/2020-12/schema":e.target==="draft-07"?a.$schema="http://json-schema.org/draft-07/schema#":e.target==="draft-04"?a.$schema="http://json-schema.org/draft-04/schema#":e.target,e.external?.uri){const n=e.external.registry.get(t)?.id;if(!n)throw new Error("Schema is missing an `id` property");a.$id=e.external.uri(n)}Object.assign(a,s.def??s.schema);const i=e.metadataRegistry.get(t)?.id;i!==void 0&&a.id===i&&delete a.id;const o=e.external?.defs??{};for(const n of e.seen.entries()){const l=n[1];l.def&&l.defId&&(l.def.id===l.defId&&delete l.def.id,o[l.defId]=l.def)}e.external||Object.keys(o).length>0&&(e.target==="draft-2020-12"?a.$defs=o:a.definitions=o);try{const n=JSON.parse(JSON.stringify(a));return Object.defineProperty(n,"~standard",{value:{...t["~standard"],jsonSchema:{input:Me(t,"input",e.processors),output:Me(t,"output",e.processors)}},enumerable:!1,writable:!1}),n}catch{throw new Error("Error converting schema to JSON.")}}c($t,"Js"),p($t,"finalize");function C(e,t){const s=t??{seen:new Set};if(s.seen.has(e))return!1;s.seen.add(e);const r=e._zod.def;if(r.type==="transform")return!0;if(r.type==="array")return C(r.element,s);if(r.type==="set")return C(r.valueType,s);if(r.type==="lazy")return C(r.getter(),s);if(r.type==="promise"||r.type==="optional"||r.type==="nonoptional"||r.type==="nullable"||r.type==="readonly"||r.type==="default"||r.type==="prefault")return C(r.innerType,s);if(r.type==="intersection")return C(r.left,s)||C(r.right,s);if(r.type==="record"||r.type==="map")return C(r.keyType,s)||C(r.valueType,s);if(r.type==="pipe")return e._zod.traits.has("$ZodCodec")?!0:C(r.in,s)||C(r.out,s);if(r.type==="object"){for(const a in r.shape)if(C(r.shape[a],s))return!0;return!1}if(r.type==="union"){for(const a of r.options)if(C(a,s))return!0;return!1}if(r.type==="tuple"){for(const a of r.items)if(C(a,s))return!0;return!!(r.rest&&C(r.rest,s))}return!1}c(C,"L"),p(C,"isTransforming");const rl=p((e,t={})=>s=>{const r=Rt({...s,processors:t});return _(e,r),At(r,e),$t(r,e)},"createToJSONSchemaMethod"),Me=p((e,t,s={})=>r=>{const{libraryOptions:a,target:i}=r??{},o=Rt({...a??{},target:i,io:t,processors:s});return _(e,o),At(o,e),$t(o,e)},"createStandardJSONSchemaMethod"),al={guid:"uuid",url:"uri",datetime:"date-time",json_string:"json-string",regex:""},il=p((e,t,s,r)=>{const a=s;a.type="string";const{minimum:i,maximum:o,format:n,patterns:l,contentEncoding:d}=e._zod.bag;if(typeof i=="number"&&(a.minLength=i),typeof o=="number"&&(a.maxLength=o),n&&(a.format=al[n]??n,a.format===""&&delete a.format,n==="time"&&delete a.format),d&&(a.contentEncoding=d),l&&l.size>0){const u=[...l];u.length===1?a.pattern=u[0].source:u.length>1&&(a.allOf=[...u.map(m=>({...t.target==="draft-07"||t.target==="draft-04"||t.target==="openapi-3.0"?{type:"string"}:{},pattern:m.source}))])}},"stringProcessor"),ol=p((e,t,s,r)=>{const a=s,{minimum:i,maximum:o,format:n,multipleOf:l,exclusiveMaximum:d,exclusiveMinimum:u}=e._zod.bag;typeof n=="string"&&n.includes("int")?a.type="integer":a.type="number";const m=typeof u=="number"&&u>=(i??Number.NEGATIVE_INFINITY),h=typeof d=="number"&&d<=(o??Number.POSITIVE_INFINITY),g=t.target==="draft-04"||t.target==="openapi-3.0";m?g?(a.minimum=u,a.exclusiveMinimum=!0):a.exclusiveMinimum=u:typeof i=="number"&&(a.minimum=i),h?g?(a.maximum=d,a.exclusiveMaximum=!0):a.exclusiveMaximum=d:typeof o=="number"&&(a.maximum=o),typeof l=="number"&&(a.multipleOf=l)},"numberProcessor"),nl=p((e,t,s,r)=>{const a=e._zod.def,i=pt(a.entries);i.every(o=>typeof o=="number")&&(s.type="number"),i.every(o=>typeof o=="string")&&(s.type="string"),s.enum=i},"enumProcessor"),pl=p((e,t,s,r)=>{if(t.unrepresentable==="throw")throw new Error("Custom types cannot be represented in JSON Schema")},"customProcessor"),ll=p((e,t,s,r)=>{if(t.unrepresentable==="throw")throw new Error("Transforms cannot be represented in JSON Schema")},"transformProcessor"),cl=p((e,t,s,r)=>{const a=s,i=e._zod.def,{minimum:o,maximum:n}=e._zod.bag;typeof o=="number"&&(a.minItems=o),typeof n=="number"&&(a.maxItems=n),a.type="array",a.items=_(i.element,t,{...r,path:[...r.path,"items"]})},"arrayProcessor"),dl=p((e,t,s,r)=>{const a=e._zod.def,i=a.inclusive===!1,o=a.options.map((n,l)=>_(n,t,{...r,path:[...r.path,i?"oneOf":"anyOf",l]}));i?s.oneOf=o:s.anyOf=o},"unionProcessor"),ul=p((e,t,s,r)=>{const a=e._zod.def,i=_(a.left,t,{...r,path:[...r.path,"allOf",0]}),o=_(a.right,t,{...r,path:[...r.path,"allOf",1]}),n=p(d=>"allOf"in d&&Object.keys(d).length===1,"isSimpleIntersection"),l=[...n(i)?i.allOf:[i],...n(o)?o.allOf:[o]];s.allOf=l},"intersectionProcessor"),ml=p((e,t,s,r)=>{const a=e._zod.def,i=_(a.innerType,t,r),o=t.seen.get(e);t.target==="openapi-3.0"?(o.ref=a.innerType,s.nullable=!0):s.anyOf=[i,{type:"null"}]},"nullableProcessor"),hl=p((e,t,s,r)=>{const a=e._zod.def;_(a.innerType,t,r);const i=t.seen.get(e);i.ref=a.innerType},"nonoptionalProcessor"),fl=p((e,t,s,r)=>{const a=e._zod.def;_(a.innerType,t,r);const i=t.seen.get(e);i.ref=a.innerType,s.default=JSON.parse(JSON.stringify(a.defaultValue))},"defaultProcessor"),gl=p((e,t,s,r)=>{const a=e._zod.def;_(a.innerType,t,r);const i=t.seen.get(e);i.ref=a.innerType,t.io==="input"&&(s._prefault=JSON.parse(JSON.stringify(a.defaultValue)))},"prefaultProcessor"),yl=p((e,t,s,r)=>{const a=e._zod.def;_(a.innerType,t,r);const i=t.seen.get(e);i.ref=a.innerType;let o;try{o=a.catchValue(void 0)}catch{throw new Error("Dynamic catch values are not supported in JSON Schema")}s.default=o},"catchProcessor"),bl=p((e,t,s,r)=>{const a=e._zod.def,i=a.in._zod.traits.has("$ZodTransform"),o=t.io==="input"?i?a.out:a.in:a.out;_(o,t,r);const n=t.seen.get(e);n.ref=o},"pipeProcessor"),kl=p((e,t,s,r)=>{const a=e._zod.def;_(a.innerType,t,r);const i=t.seen.get(e);i.ref=a.innerType,s.readOnly=!0},"readonlyProcessor"),va=p((e,t,s,r)=>{const a=e._zod.def;_(a.innerType,t,r);const i=t.seen.get(e);i.ref=a.innerType},"optionalProcessor"),vl=y("ZodISODateTime",(e,t)=>{jp.init(e,t),T.init(e,t)});function qa(e){return Xr(vl,e)}c(qa,"jp"),p(qa,"datetime");const ql=y("ZodISODate",(e,t)=>{Rp.init(e,t),T.init(e,t)});function xa(e){return ea(ql,e)}c(xa,"Ap"),p(xa,"date");const xl=y("ZodISOTime",(e,t)=>{Ap.init(e,t),T.init(e,t)});function za(e){return ta(xl,e)}c(za,"$p"),p(za,"time");const zl=y("ZodISODuration",(e,t)=>{$p.init(e,t),T.init(e,t)});function Sa(e){return sa(zl,e)}c(Sa,"Dp"),p(Sa,"duration");const Sl=p((e,t)=>{ur.init(e,t),e.name="ZodError",Object.defineProperties(e,{format:{value:p(s=>fr(e,s),"value")},flatten:{value:p(s=>hr(e,s),"value")},addIssue:{value:p(s=>{e.issues.push(s),e.message=JSON.stringify(e.issues,$e,2)},"value")},addIssues:{value:p(s=>{e.issues.push(...s),e.message=JSON.stringify(e.issues,$e,2)},"value")},isEmpty:{get(){return e.issues.length===0}}})},"initializer"),H=y("ZodError",Sl,{Parent:Error}),wl=dt(H),Pl=ut(H),El=Ie(H),Tl=Oe(H),jl=Tn(H),Rl=jn(H),Al=Rn(H),$l=An(H),Dl=$n(H),_l=Dn(H),Cl=_n(H),Ll=Cn(H),wa=new WeakMap;function ye(e,t,s){const r=Object.getPrototypeOf(e);let a=wa.get(r);if(a||(a=new Set,wa.set(r,a)),!a.has(t)){a.add(t);for(const i in s){const o=s[i];Object.defineProperty(r,i,{configurable:!0,enumerable:!1,get(){const n=o.bind(this);return Object.defineProperty(this,i,{configurable:!0,writable:!0,enumerable:!0,value:n}),n},set(n){Object.defineProperty(this,i,{configurable:!0,writable:!0,enumerable:!0,value:n})}})}}}c(ye,"Ae"),p(ye,"_installLazyMethods");const $=y("ZodType",(e,t)=>(A.init(e,t),Object.assign(e["~standard"],{jsonSchema:{input:Me(e,"input"),output:Me(e,"output")}}),e.toJSONSchema=rl(e,{}),e.def=t,e.type=t.type,Object.defineProperty(e,"_def",{value:t}),e.parse=(s,r)=>wl(e,s,r,{callee:e.parse}),e.safeParse=(s,r)=>El(e,s,r),e.parseAsync=async(s,r)=>Pl(e,s,r,{callee:e.parseAsync}),e.safeParseAsync=async(s,r)=>Tl(e,s,r),e.spa=e.safeParseAsync,e.encode=(s,r)=>jl(e,s,r),e.decode=(s,r)=>Rl(e,s,r),e.encodeAsync=async(s,r)=>Al(e,s,r),e.decodeAsync=async(s,r)=>$l(e,s,r),e.safeEncode=(s,r)=>Dl(e,s,r),e.safeDecode=(s,r)=>_l(e,s,r),e.safeEncodeAsync=async(s,r)=>Cl(e,s,r),e.safeDecodeAsync=async(s,r)=>Ll(e,s,r),ye(e,"ZodType",{check(...s){const r=this.def;return this.clone(ir(r,{checks:[...r.checks??[],...s.map(a=>typeof a=="function"?{_zod:{check:a,def:{check:"custom"},onattach:[]}}:a)]}),{parent:!0})},with(...s){return this.check(...s)},clone(s,r){return pr(this,s,r)},brand(){return this},register(s,r){return s.add(this,r),this},refine(s,r){return this.check(Ua(s,r))},superRefine(s,r){return this.check(Qa(s,r))},overwrite(s){return this.check(ee(s))},optional(){return Lt(this)},exactOptional(){return Da(this)},nullable(){return It(this)},nullish(){return Lt(It(this))},nonoptional(s){return La(this,s)},array(){return ja(this)},or(s){return Ra([this,s])},and(s){return Aa(this,s)},transform(s){return Ot(this,$a(s))},default(s){return _a(this,s)},prefault(s){return Ca(this,s)},catch(s){return Ia(this,s)},pipe(s){return Ot(this,s)},readonly(){return Oa(this)},describe(s){const r=this.clone();return fe.add(r,{description:s}),r},meta(...s){if(s.length===0)return fe.get(this);const r=this.clone();return fe.add(r,s[0]),r},isOptional(){return this.safeParse(void 0).success},isNullable(){return this.safeParse(null).success},apply(s){return s(this)}}),Object.defineProperty(e,"description",{get(){return fe.get(e)?.description},configurable:!0}),e)),Pa=y("_ZodString",(e,t)=>{ht.init(e,t),$.init(e,t),e._zod.processJSONSchema=(r,a,i)=>il(e,r,a);const s=e._zod.bag;e.format=s.format??null,e.minLength=s.minimum??null,e.maxLength=s.maximum??null,ye(e,"_ZodString",{regex(...r){return this.check(ia(...r))},includes(...r){return this.check(pa(...r))},startsWith(...r){return this.check(la(...r))},endsWith(...r){return this.check(ca(...r))},min(...r){return this.check(ge(...r))},max(...r){return this.check(Tt(...r))},length(...r){return this.check(jt(...r))},nonempty(...r){return this.check(ge(1,...r))},lowercase(r){return this.check(oa(r))},uppercase(r){return this.check(na(r))},trim(){return this.check(ua())},normalize(...r){return this.check(da(...r))},toLowerCase(){return this.check(ma())},toUpperCase(){return this.check(ha())},slugify(){return this.check(fa())}})}),Il=y("ZodString",(e,t)=>{ht.init(e,t),Pa.init(e,t),e.email=s=>e.check($r(Ol,s)),e.url=s=>e.check(Ir(Ul,s)),e.jwt=s=>e.check(Yr(ec,s)),e.emoji=s=>e.check(Or(Ql,s)),e.guid=s=>e.check(St(Ea,s)),e.uuid=s=>e.check(Dr(Ge,s)),e.uuidv4=s=>e.check(_r(Ge,s)),e.uuidv6=s=>e.check(Cr(Ge,s)),e.uuidv7=s=>e.check(Lr(Ge,s)),e.nanoid=s=>e.check(Ur(Fl,s)),e.guid=s=>e.check(St(Ea,s)),e.cuid=s=>e.check(Qr(Hl,s)),e.cuid2=s=>e.check(Fr(Ml,s)),e.ulid=s=>e.check(Hr(Nl,s)),e.base64=s=>e.check(Zr(Kl,s)),e.base64url=s=>e.check(Wr(Yl,s)),e.xid=s=>e.check(Mr(Gl,s)),e.ksuid=s=>e.check(Nr(Bl,s)),e.ipv4=s=>e.check(Gr(Vl,s)),e.ipv6=s=>e.check(Br(Jl,s)),e.cidrv4=s=>e.check(Vr(Zl,s)),e.cidrv6=s=>e.check(Jr(Wl,s)),e.e164=s=>e.check(Kr(Xl,s)),e.datetime=s=>e.check(qa(s)),e.date=s=>e.check(xa(s)),e.time=s=>e.check(za(s)),e.duration=s=>e.check(Sa(s))});function Ne(e){return Ar(Il,e)}c(Ne,"st"),p(Ne,"string");const T=y("ZodStringFormat",(e,t)=>{P.init(e,t),Pa.init(e,t)}),Ol=y("ZodEmail",(e,t)=>{vp.init(e,t),T.init(e,t)}),Ea=y("ZodGUID",(e,t)=>{bp.init(e,t),T.init(e,t)}),Ge=y("ZodUUID",(e,t)=>{kp.init(e,t),T.init(e,t)}),Ul=y("ZodURL",(e,t)=>{qp.init(e,t),T.init(e,t)}),Ql=y("ZodEmoji",(e,t)=>{xp.init(e,t),T.init(e,t)}),Fl=y("ZodNanoID",(e,t)=>{zp.init(e,t),T.init(e,t)}),Hl=y("ZodCUID",(e,t)=>{Sp.init(e,t),T.init(e,t)}),Ml=y("ZodCUID2",(e,t)=>{wp.init(e,t),T.init(e,t)}),Nl=y("ZodULID",(e,t)=>{Pp.init(e,t),T.init(e,t)}),Gl=y("ZodXID",(e,t)=>{Ep.init(e,t),T.init(e,t)}),Bl=y("ZodKSUID",(e,t)=>{Tp.init(e,t),T.init(e,t)}),Vl=y("ZodIPv4",(e,t)=>{Dp.init(e,t),T.init(e,t)}),Jl=y("ZodIPv6",(e,t)=>{_p.init(e,t),T.init(e,t)}),Zl=y("ZodCIDRv4",(e,t)=>{Cp.init(e,t),T.init(e,t)}),Wl=y("ZodCIDRv6",(e,t)=>{Lp.init(e,t),T.init(e,t)}),Kl=y("ZodBase64",(e,t)=>{Ip.init(e,t),T.init(e,t)}),Yl=y("ZodBase64URL",(e,t)=>{Op.init(e,t),T.init(e,t)}),Xl=y("ZodE164",(e,t)=>{Up.init(e,t),T.init(e,t)}),ec=y("ZodJWT",(e,t)=>{Qp.init(e,t),T.init(e,t)}),Ta=y("ZodNumber",(e,t)=>{Er.init(e,t),$.init(e,t),e._zod.processJSONSchema=(r,a,i)=>ol(e,r,a),ye(e,"ZodNumber",{gt(r,a){return this.check(Pt(r,a))},gte(r,a){return this.check(He(r,a))},min(r,a){return this.check(He(r,a))},lt(r,a){return this.check(wt(r,a))},lte(r,a){return this.check(Fe(r,a))},max(r,a){return this.check(Fe(r,a))},int(r){return this.check(Dt(r))},safe(r){return this.check(Dt(r))},positive(r){return this.check(Pt(0,r))},nonnegative(r){return this.check(He(0,r))},negative(r){return this.check(wt(0,r))},nonpositive(r){return this.check(Fe(0,r))},multipleOf(r,a){return this.check(Et(r,a))},step(r,a){return this.check(Et(r,a))},finite(){return this}});const s=e._zod.bag;e.minValue=Math.max(s.minimum??Number.NEGATIVE_INFINITY,s.exclusiveMinimum??Number.NEGATIVE_INFINITY)??null,e.maxValue=Math.min(s.maximum??Number.POSITIVE_INFINITY,s.exclusiveMaximum??Number.POSITIVE_INFINITY)??null,e.isInt=(s.format??"").includes("int")||Number.isSafeInteger(s.multipleOf??.5),e.isFinite=!0,e.format=s.format??null}),tc=y("ZodNumberFormat",(e,t)=>{Fp.init(e,t),Ta.init(e,t)});function Dt(e){return aa(tc,e)}c(Dt,"tr"),p(Dt,"int");const sc=y("ZodArray",(e,t)=>{Hp.init(e,t),$.init(e,t),e._zod.processJSONSchema=(s,r,a)=>cl(e,s,r,a),e.element=t.element,ye(e,"ZodArray",{min(s,r){return this.check(ge(s,r))},nonempty(s){return this.check(ge(1,s))},max(s,r){return this.check(Tt(s,r))},length(s,r){return this.check(jt(s,r))},unwrap(){return this.element}})});function ja(e,t){return ga(sc,e,t)}c(ja,"fl"),p(ja,"array");const rc=y("ZodUnion",(e,t)=>{Mp.init(e,t),$.init(e,t),e._zod.processJSONSchema=(s,r,a)=>dl(e,s,r,a),e.options=t.options});function Ra(e,t){return new rc({type:"union",options:e,...q(t)})}c(Ra,"yl"),p(Ra,"union");const ac=y("ZodIntersection",(e,t)=>{Np.init(e,t),$.init(e,t),e._zod.processJSONSchema=(s,r,a)=>ul(e,s,r,a)});function Aa(e,t){return new ac({type:"intersection",left:e,right:t})}c(Aa,"kl"),p(Aa,"intersection");const _t=y("ZodEnum",(e,t)=>{Gp.init(e,t),$.init(e,t),e._zod.processJSONSchema=(r,a,i)=>nl(e,r,a),e.enum=t.entries,e.options=Object.values(t.entries);const s=new Set(Object.keys(t.entries));e.extract=(r,a)=>{const i={};for(const o of r)if(s.has(o))i[o]=t.entries[o];else throw new Error(`Key ${o} not found in enum`);return new _t({...t,checks:[],...q(a),entries:i})},e.exclude=(r,a)=>{const i={...t.entries};for(const o of r)if(s.has(o))delete i[o];else throw new Error(`Key ${o} not found in enum`);return new _t({...t,checks:[],...q(a),entries:i})}});function Ct(e,t){const s=Array.isArray(e)?Object.fromEntries(e.map(r=>[r,r])):e;return new _t({type:"enum",entries:s,...q(t)})}c(Ct,"sr"),p(Ct,"_enum");const ic=y("ZodTransform",(e,t)=>{Bp.init(e,t),$.init(e,t),e._zod.processJSONSchema=(s,r,a)=>ll(e,s),e._zod.parse=(s,r)=>{if(r.direction==="backward")throw new sr(e.constructor.name);s.addIssue=i=>{if(typeof i=="string")s.issues.push(ae(i,s.value,t));else{const o=i;o.fatal&&(o.continue=!1),o.code??(o.code="custom"),o.input??(o.input=s.value),o.inst??(o.inst=e),s.issues.push(ae(o))}};const a=t.transform(s.value,s);return a instanceof Promise?a.then(i=>(s.value=i,s.fallback=!0,s)):(s.value=a,s.fallback=!0,s)}});function $a(e){return new ic({type:"transform",transform:e})}c($a,"ql"),p($a,"transform");const oc=y("ZodOptional",(e,t)=>{Tr.init(e,t),$.init(e,t),e._zod.processJSONSchema=(s,r,a)=>va(e,s,r,a),e.unwrap=()=>e._zod.def.innerType});function Lt(e){return new oc({type:"optional",innerType:e})}c(Lt,"rr"),p(Lt,"optional");const nc=y("ZodExactOptional",(e,t)=>{Vp.init(e,t),$.init(e,t),e._zod.processJSONSchema=(s,r,a)=>va(e,s,r,a),e.unwrap=()=>e._zod.def.innerType});function Da(e){return new nc({type:"optional",innerType:e})}c(Da,"xl"),p(Da,"exactOptional");const pc=y("ZodNullable",(e,t)=>{Jp.init(e,t),$.init(e,t),e._zod.processJSONSchema=(s,r,a)=>ml(e,s,r,a),e.unwrap=()=>e._zod.def.innerType});function It(e){return new pc({type:"nullable",innerType:e})}c(It,"ar"),p(It,"nullable");const lc=y("ZodDefault",(e,t)=>{Zp.init(e,t),$.init(e,t),e._zod.processJSONSchema=(s,r,a)=>fl(e,s,r,a),e.unwrap=()=>e._zod.def.innerType,e.removeDefault=e.unwrap});function _a(e,t){return new lc({type:"default",innerType:e,get defaultValue(){return typeof t=="function"?t():ct(t)}})}c(_a,"Pl"),p(_a,"_default");const cc=y("ZodPrefault",(e,t)=>{Wp.init(e,t),$.init(e,t),e._zod.processJSONSchema=(s,r,a)=>gl(e,s,r,a),e.unwrap=()=>e._zod.def.innerType});function Ca(e,t){return new cc({type:"prefault",innerType:e,get defaultValue(){return typeof t=="function"?t():ct(t)}})}c(Ca,"jl"),p(Ca,"prefault");const dc=y("ZodNonOptional",(e,t)=>{Kp.init(e,t),$.init(e,t),e._zod.processJSONSchema=(s,r,a)=>hl(e,s,r,a),e.unwrap=()=>e._zod.def.innerType});function La(e,t){return new dc({type:"nonoptional",innerType:e,...q(t)})}c(La,"Al"),p(La,"nonoptional");const uc=y("ZodCatch",(e,t)=>{Yp.init(e,t),$.init(e,t),e._zod.processJSONSchema=(s,r,a)=>yl(e,s,r,a),e.unwrap=()=>e._zod.def.innerType,e.removeCatch=e.unwrap});function Ia(e,t){return new uc({type:"catch",innerType:e,catchValue:typeof t=="function"?t:()=>t})}c(Ia,"$l"),p(Ia,"_catch");const mc=y("ZodPipe",(e,t)=>{Xp.init(e,t),$.init(e,t),e._zod.processJSONSchema=(s,r,a)=>bl(e,s,r,a),e.in=t.in,e.out=t.out});function Ot(e,t){return new mc({type:"pipe",in:e,out:t})}c(Ot,"ir"),p(Ot,"pipe");const hc=y("ZodReadonly",(e,t)=>{el.init(e,t),$.init(e,t),e._zod.processJSONSchema=(s,r,a)=>kl(e,s,r,a),e.unwrap=()=>e._zod.def.innerType});function Oa(e){return new hc({type:"readonly",innerType:e})}c(Oa,"Ll"),p(Oa,"readonly");const fc=y("ZodCustom",(e,t)=>{tl.init(e,t),$.init(e,t),e._zod.processJSONSchema=(s,r,a)=>pl(e,s)});function Ua(e,t={}){return ya(fc,e,t)}c(Ua,"Il"),p(Ua,"refine");function Qa(e,t){return ba(e,t)}c(Qa,"Ul"),p(Qa,"superRefine");function Fa(e){return ra(Ta,e)}c(Fa,"Ql"),p(Fa,"number");const gc=er({emptyStringAsUndefined:!0,runtimeEnv:process.env,server:{APP_MAX_WIDTH:Ne().pipe(Fa()).default(95),NEST_ARCH_BETA_MODE:Ct(["true","false"]).default("false").transform(e=>e==="true"),NEST_ARCH_SCHEMA_URL:Ne().default("./schema.json"),NEST_ARCH_VERSION:Ne().default("0.0.1"),NODE_ENV:Ct(["development","production","test"]).default("development")}});function Ha(e){const t=[e.projectName,"--package-manager",e.packageManager,"--http-provider",e.httpProvider,"--project-type",e.projectType,"--architecture",e.architecture,"--auth",e.auth,"--formatter",e.formatter,"--install-dependencies",e.installDependencies?"yes":"no",e.initGit?"--git":"--no-git","--ultracite-install-skill",e.ultraciteInstallSkill],s=[["--database",e.database],["--orm",e.orm],["--api",e.api],["--extras",e.extras],["--microservices",e.microservices],["--addons",e.addons],["--ultracite-editors",e.ultraciteEditors],["--ultracite-agents",e.ultraciteAgents],["--ultracite-hooks",e.ultraciteHooks]];for(const[r,a]of s)t.push(r,...a.length>0?a:["none"]);return e.description!==void 0&&t.push(`--description-base64=${Buffer.from(e.description,"utf-8").toString("base64")}`),e.prismaVersion!==void 0&&t.push("--prisma-version",e.prismaVersion),e.trustedProxyIps!==void 0&&t.push("--trusted-proxy-ips",...e.trustedProxyIps.length>0?e.trustedProxyIps:["none"]),t}c(Ha,"Ml"),p(Ha,"buildReproducibleArgs");const yc=/^[a-zA-Z0-9_./:@=-]+$/u;function Ma(e,t=process.platform){return yc.test(e)?e:`'${t==="win32"?e.replaceAll("'","''"):e.replaceAll("'",`'"'"'`)}'`}c(Ma,"Nl"),p(Ma,"quoteShellArgument");function Na(e,t){return["pnpm","dlx",`@nest-arch/tui@${t}`,...Ha(e)].map(s=>Ma(s)).join(" ")}c(Na,"Gl"),p(Na,"buildReproducibleCommand");function Ga(e,t){return{$schema:gc.NEST_ARCH_SCHEMA_URL,addons:e.addons,api:e.api,architecture:e.architecture,auth:e.auth,createdAt:new Date().toISOString(),database:e.database,description:e.description,extras:e.extras,formatter:e.formatter,httpProvider:e.httpProvider,initGit:e.initGit,installDependencies:e.installDependencies,microservices:e.microservices,orm:e.orm,packageManager:e.packageManager,prismaVersion:e.prismaVersion,projectName:e.projectName,projectType:e.projectType,reproducibleCommand:Na(e,t),trustedProxyIps:e.trustedProxyIps,ultraciteAgents:e.ultraciteAgents,ultraciteEditors:e.ultraciteEditors,ultraciteHooks:e.ultraciteHooks,ultraciteInstallSkill:e.ultraciteInstallSkill,version:t}}c(Ga,"Bl"),p(Ga,"buildMetadata");function Ba(e){return`${["// nest-arch","//","// Project scaffolding tool for NestJS applications","//","// This file records the options used to generate this project.","// It can be used to reproduce the exact same project setup.","// This file is safe to delete.",""].join(`
329
+ `)+JSON.stringify(e,null,2)}
330
+ `}c(Ba,"Zl"),p(Ba,"serializeMetadata");function Va(){return`${JSON.stringify({$schema:"http://json-schema.org/draft-07/schema#",description:"NestArch project configuration metadata file schema",properties:{$schema:{type:"string"},addons:{items:{enum:["agent-skills","husky","ultracite","nestjs-zod","scalar-ui"]},type:"array"},api:{items:{enum:["rest","trpc","graphql"]},type:"array"},architecture:{enum:["nest-api","nest-gateway","nest-microservice"]},auth:{enum:["passport","better-auth","better-auth:stateless","none"]},createdAt:{format:"date-time",type:"string"},database:{items:{enum:["postgresql","mysql","sqlite","mongodb","sqlserver"]},type:"array"},description:{type:"string"},extras:{items:{enum:["docker","health-check","rate-limiting","swagger","packages/shared","todo-example","typescript-7"]},type:"array"},formatter:{enum:["biome","eslint-prettier-stylelint","eslint-prettier-no-stylelint","oxlint-oxfmt","none"]},httpProvider:{enum:["express","fastify"]},initGit:{type:"boolean"},installDependencies:{type:"boolean"},microservices:{items:{enum:["redis","mqtt","nats","rabbitmq","kafka","grpc"]},type:"array"},orm:{items:{enum:["prisma","typeorm","drizzle"]},type:"array"},packageManager:{enum:["pnpm","npm","yarn","bun"]},prismaVersion:{enum:["6","7","8"]},projectName:{type:"string"},projectType:{enum:["single","monorepo"]},reproducibleCommand:{type:"string"},trustedProxyIps:{items:{type:"string"},type:"array"},ultraciteAgents:{items:{enum:["universal","claude","codex","jules","replit","devin","lovable","zencoder","ona","openclaw","continue","snowflake-cortex","deepagents","qoder","kimi-cli","mcpjam","mux","pi","adal","copilot","cline","amp","aider","firebase-studio","open-hands","gemini","junie","augmentcode","kilo-code","goose","roo-code","warp","droid","opencode","crush","qwen","amazon-q-cli","firebender","cursor-cli","mistral-vibe","vercel"]},type:"array"},ultraciteEditors:{items:{enum:["universal","vscode","cursor","windsurf","antigravity","kiro","trae","void","bob","codebuddy","zed"]},type:"array"},ultraciteHooks:{items:{enum:["cursor","windsurf","codebuddy","claude","copilot"]},type:"array"},ultraciteInstallSkill:{enum:["yes","no"]},version:{type:"string"}},required:["version","createdAt","reproducibleCommand","projectName","packageManager","httpProvider","projectType","architecture","database","orm","api","auth","extras","microservices","addons","initGit","formatter","installDependencies","ultraciteEditors","ultraciteAgents","ultraciteHooks","ultraciteInstallSkill"],title:"NestArchMetadata",type:"object"},null,2)}
331
+ `}c(Va,"Vl"),p(Va,"buildSchemaContent");var bc="0.4.3",kc={version:bc};async function Ja(e,t,s,r,a,i=!1,o=kc.version){try{const n=Ga(t,o);!i&&n.$schema==="./schema.json"&&delete n.$schema;const l=Ba(n),d=await e.writeFile({content:l,filePath:"nest-arch.jsonc",isBinary:!1},s);if(d.error&&a.push(`Failed to generate nest-arch.jsonc: ${d.error}`),d.written&&r.push(d.filePath),!i)return;const u=Va(),m=await e.writeFile({content:u,filePath:"schema.json",isBinary:!1},s);m.error&&a.push(`Failed to generate schema.json: ${m.error}`),m.written&&r.push(m.filePath)}catch(n){const l=n instanceof Error?n.message:String(n);a.push(`Failed to generate nest-arch.jsonc/schema.json: ${l}`)}}c(Ja,"Kl"),p(Ja,"generateMetadata");function Ut(){return oe}c(Ut,"or"),p(Ut,"loadReference");function f(e){const t=Ut(),s=t.dependencies[e]??t.devDependencies[e];if(!s)throw new Error(`Dependency "${e}" not found in reference package.json`);return s}c(f,"f"),p(f,"getDependencyVersion");function Qt(){return{...Ut().catalog}}c(Qt,"nr"),p(Qt,"getCatalogDependencies");const vc=[{dest:"tsconfig.json",src:"base/tsconfig.json.hbs"},{dest:"tsconfig.build.json",src:"base/tsconfig.build.json.hbs"},{dest:"nest-cli.json",src:"base/nest-cli.json.hbs"},{dest:".gitignore",src:"base/.gitignore.hbs"},{dest:".env",src:"base/.env.hbs"},{dest:".env.example",src:"base/.env.example.hbs"},{dest:"README.md",src:"base/README.md.hbs"},{dest:"vitest.config.ts",src:"base/vitest.config.ts.hbs"},{dest:"vitest.config.e2e.ts",src:"base/vitest.config.e2e.ts.hbs"},{dest:"src/main.ts",src:"base/src/main.ts.hbs"},{dest:"src/app.module.ts",src:"base/src/app.module.ts.hbs"},{dest:"src/app.service.ts",src:"base/src/app.service.ts.hbs"},{dest:"src/config/env.ts",src:"single-project/shared/config/env.ts.hbs"}],qc={dest:"pnpm-workspace.yaml",src:"base/pnpm-workspace.yaml.hbs"},xc={dest:".yarnrc.yml",src:"base/.yarnrc.yml.hbs"},zc={dest:"bunfig.toml",src:"base/bunfig.toml.hbs"},Sc=[{dest:"src/app.controller.ts",src:"base/src/app.controller.ts.hbs"},{dest:"src/app.controller.spec.ts",src:"base/src/app.controller.spec.ts.hbs"},{dest:"test/app.e2e-spec.ts",src:"base/test/app.e2e-spec.ts.hbs"},{dest:"test/bootstrap.e2e-spec.ts",src:"base/test/bootstrap.e2e-spec.ts.hbs"}],wc=[{dest:"src/api/todo/todo.controller.ts",src:"feature/rest/todo-example/src/api/todo/todo.controller.ts.hbs"},{dest:"src/api/todo/todo.service.ts",src:"feature/rest/todo-example/src/api/todo/todo.service.ts.hbs"},{dest:"src/api/todo/todo.module.ts",src:"feature/rest/todo-example/src/api/todo/todo.module.ts.hbs"},{dest:"src/api/todo/todo.router.ts",src:"feature/rest/todo-example/src/api/todo/todo.router.ts.hbs"},{dest:"src/api/todo/dto/create-todo.dto.ts",src:"feature/rest/todo-example/src/api/todo/dto/create-todo.dto.ts.hbs"},{dest:"src/api/todo/dto/update-todo.dto.ts",src:"feature/rest/todo-example/src/api/todo/dto/update-todo.dto.ts.hbs"}],Pc=[{dest:"apps/api-gateway/src/api/todo/todo.controller.ts",src:"feature/rest/todo-example/src/api/todo/todo.controller.ts.hbs"},{dest:"apps/api-gateway/src/api/todo/todo.service.ts",src:"feature/rest/todo-example/src/api/todo/todo.service.ts.hbs"},{dest:"apps/api-gateway/src/api/todo/todo.module.ts",src:"feature/rest/todo-example/src/api/todo/todo.module.ts.hbs"},{dest:"apps/api-gateway/src/api/todo/todo.router.ts",src:"feature/rest/todo-example/src/api/todo/todo.router.ts.hbs"},{dest:"apps/api-gateway/src/api/todo/dto/create-todo.dto.ts",src:"feature/rest/todo-example/src/api/todo/dto/create-todo.dto.ts.hbs"},{dest:"apps/api-gateway/src/api/todo/dto/update-todo.dto.ts",src:"feature/rest/todo-example/src/api/todo/dto/update-todo.dto.ts.hbs"}],Ec=[{dest:"src/app.router.ts",src:"base/src/app.router.ts.hbs"},{dest:"src/app.router.spec.ts",src:"base/src/app.router.spec.ts.hbs"},{dest:"src/libs/trpc/context.ts",src:"base/src/libs/trpc/context.ts.hbs"},{dest:"src/libs/trpc/error.handler.ts",src:"base/src/libs/trpc/error.handler.ts.hbs"},{dest:"src/libs/trpc/protected.ts",src:"base/src/libs/trpc/protected.ts.hbs"},{dest:"src/libs/trpc/inner.context.ts",src:"base/src/libs/trpc/inner.context.ts.hbs"},{dest:"src/libs/middlewares/auth.trpc.middleware.ts",src:"base/src/libs/middlewares/auth.trpc.middleware.ts.hbs"},{dest:"src/libs/middlewares/rate-limit.trpc.middleware.ts",src:"base/src/libs/middlewares/rate-limit.trpc.middleware.ts.hbs"}],Tc=[{dest:".husky/pre-commit",src:"addons/husky/pre-commit.hbs"},{dest:".husky/prepare-commit-msg",src:"addons/husky/noop-hook.hbs"},{dest:".husky/commit-msg",src:"addons/husky/noop-hook.hbs"},{dest:".husky/post-commit",src:"addons/husky/noop-hook.hbs"}],jc=[{dest:"Dockerfile",src:"extras/docker/Dockerfile.hbs"},{dest:"docker-compose.yml",src:"extras/docker/docker-compose.yml.hbs"},{dest:".dockerignore",src:"extras/docker/.dockerignore.hbs"}],Rc=[{dest:"src/health/health.module.ts",src:"extras/health/src/health/health.module.ts.hbs"},{dest:"src/health/health.controller.ts",src:"extras/health/src/health/health.controller.ts.hbs"}],Ac=[{dest:"src/database/adapters/mongo/typeorm-mongo.adapter.ts",src:"base/src/database/adapters/mongo/typeorm-mongo.adapter.ts.hbs"},{dest:"src/database/adapters/interfaces/db-adapter.interface.ts",src:"base/src/database/adapters/interfaces/db-adapter.interface.ts.hbs"},{dest:"src/database/adapters/sql/prisma-sql.adapter.ts",src:"base/src/database/adapters/sql/prisma-sql.adapter.ts.hbs"},{dest:"src/database/adapters/sql/drizzle-sql.adapter.ts",src:"base/src/database/adapters/sql/drizzle-sql.adapter.ts.hbs"},{dest:"src/database/adapters/sql/typeorm-sql.adapter.ts",src:"base/src/database/adapters/sql/typeorm-sql.adapter.ts.hbs"},{dest:"src/database/adapters/sql/raw-sql.adapter.ts",src:"base/src/database/adapters/sql/raw-sql.adapter.ts.hbs"},{dest:"src/database/adapters/mongo/prisma-mongo.adapter.ts",src:"base/src/database/adapters/mongo/prisma-mongo.adapter.ts.hbs"},{dest:"src/database/adapters/mongo/raw-mongo.adapter.ts",src:"base/src/database/adapters/mongo/raw-mongo.adapter.ts.hbs"},{dest:"src/database/db.service.ts",src:"base/src/database/db.service.ts.hbs"},{dest:"src/database/db.module.ts",src:"base/src/database/db.module.ts.hbs"},{dest:"src/database/index.ts",src:"base/src/database/index.ts.hbs"},{dest:"src/database/orm/drizzle/schema.ts",src:"base/src/database/orm/drizzle/schema.ts.hbs"},{dest:"src/database/orm/typeorm/data-source.ts",src:"base/src/database/orm/typeorm/data-source.ts.hbs"},{dest:"src/database/entities/todo.entity.ts",src:"base/src/database/entities/todo.entity.ts.hbs"},{dest:"src/database/entities/app.entity.ts",src:"base/src/database/entities/app.entity.ts.hbs"},{dest:"src/modules/users/entities/user.entity.ts",src:"base/src/modules/users/entities/user.entity.ts.hbs"}],$c=[{dest:"packages/db/package.json",src:"monorepo/packages/db/package.json.hbs"},{dest:"packages/db/tsconfig.json",src:"monorepo/packages/db/tsconfig.json.hbs"},{dest:"packages/db/src/adapters/interfaces/db-adapter.interface.ts",src:"base/src/database/adapters/interfaces/db-adapter.interface.ts.hbs"},{dest:"packages/db/src/adapters/sql/prisma-sql.adapter.ts",src:"base/src/database/adapters/sql/prisma-sql.adapter.ts.hbs"},{dest:"packages/db/src/adapters/sql/drizzle-sql.adapter.ts",src:"base/src/database/adapters/sql/drizzle-sql.adapter.ts.hbs"},{dest:"packages/db/src/adapters/sql/typeorm-sql.adapter.ts",src:"base/src/database/adapters/sql/typeorm-sql.adapter.ts.hbs"},{dest:"packages/db/src/adapters/sql/raw-sql.adapter.ts",src:"base/src/database/adapters/sql/raw-sql.adapter.ts.hbs"},{dest:"packages/db/src/adapters/mongo/prisma-mongo.adapter.ts",src:"base/src/database/adapters/mongo/prisma-mongo.adapter.ts.hbs"},{dest:"packages/db/src/adapters/mongo/raw-mongo.adapter.ts",src:"base/src/database/adapters/mongo/raw-mongo.adapter.ts.hbs"},{dest:"packages/db/src/db.service.ts",src:"base/src/database/db.service.ts.hbs"},{dest:"packages/db/src/db.module.ts",src:"base/src/database/db.module.ts.hbs"},{dest:"packages/db/src/index.ts",src:"base/src/database/index.ts.hbs"},{dest:"packages/db/src/orm/drizzle/schema.ts",src:"base/src/database/orm/drizzle/schema.ts.hbs"},{dest:"packages/db/src/orm/typeorm/data-source.ts",src:"base/src/database/orm/typeorm/data-source.ts.hbs"},{dest:"packages/db/src/entities/todo.entity.ts",src:"base/src/database/entities/todo.entity.ts.hbs"}],Dc={"single-project/architecture/nest-api":[{dest:"src/main.ts",src:"single-project/architecture/nest-api/src/main.ts.hbs"},{dest:".env",src:"single-project/architecture/nest-api/.env.hbs"},{dest:"package.json",src:"single-project/architecture/nest-api/package.json.hbs"},{dest:"pnpm-workspace.yaml",src:"single-project/architecture/nest-api/pnpm-workspace.yaml.hbs"}],"single-project/architecture/nest-gateway":[{dest:"src/main.ts",src:"single-project/architecture/nest-gateway/src/main.ts.hbs"},{dest:"src/app.module.ts",src:"single-project/architecture/nest-gateway/src/app.module.ts.hbs"},{dest:"src/app.controller.ts",src:"single-project/architecture/nest-gateway/src/app.controller.ts.hbs"},{dest:"src/app.service.ts",src:"single-project/architecture/nest-gateway/src/app.service.ts.hbs"},{dest:"package.json",src:"single-project/architecture/nest-api/package.json.hbs"},{dest:"pnpm-workspace.yaml",src:"single-project/architecture/nest-api/pnpm-workspace.yaml.hbs"}],"single-project/architecture/nest-microservice":[{dest:"src/main.ts",src:"single-project/architecture/nest-microservice/src/main.ts.hbs"},{dest:"src/app.module.ts",src:"single-project/architecture/nest-microservice/src/app.module.ts.hbs"},{dest:"src/http-throttler.guard.ts",src:"single-project/architecture/nest-microservice/src/http-throttler.guard.ts.hbs"},{dest:"src/app.controller.ts",src:"single-project/architecture/nest-microservice/src/app.controller.ts.hbs"},{dest:"src/app.service.ts",src:"single-project/architecture/nest-microservice/src/app.service.ts.hbs"},{dest:"src/proto/app.proto",src:"single-project/architecture/nest-microservice/proto/app.proto.hbs"},{dest:"test/microservice.e2e-spec.ts",src:"single-project/architecture/nest-microservice/test/microservice.e2e-spec.ts.hbs"},{dest:".env",src:"single-project/architecture/nest-microservice/.env.hbs"},{dest:"package.json",src:"single-project/architecture/nest-api/package.json.hbs"},{dest:"pnpm-workspace.yaml",src:"single-project/architecture/nest-api/pnpm-workspace.yaml.hbs"}]},Za=[{dest:"turbo.json",src:"monorepo/root/turbo.json.hbs"},{dest:"tsconfig.json",src:"monorepo/root/tsconfig.json.hbs"},{dest:".gitignore",src:"monorepo/root/.gitignore.hbs"},{dest:"README.md",src:"monorepo/root/README.md.hbs"}],_c="package.json",Cc=[{dest:"apps/api-gateway/src/main.ts",src:"monorepo/apps/api-gateway/src/main.ts.hbs"},{dest:"apps/api-gateway/src/app.module.ts",src:"monorepo/apps/api-gateway/src/app.module.ts.hbs"},{dest:"apps/api-gateway/src/app.service.ts",src:"monorepo/apps/api-gateway/src/app.service.ts.hbs"},{dest:"apps/api-gateway/tsconfig.json",src:"monorepo/apps/api-gateway/tsconfig.json.hbs"},{dest:"apps/api-gateway/tsconfig.build.json",src:"monorepo/apps/api-gateway/tsconfig.build.json.hbs"},{dest:"apps/api-gateway/nest-cli.json",src:"monorepo/apps/api-gateway/nest-cli.json.hbs"},{dest:"apps/api-gateway/vitest.config.ts",src:"monorepo/apps/api-gateway/vitest.config.ts.hbs"},{dest:"apps/api-gateway/vitest.config.e2e.ts",src:"monorepo/apps/api-gateway/vitest.config.e2e.ts.hbs"}],Lc=[{dest:"apps/api-gateway/src/app.controller.ts",src:"monorepo/apps/api-gateway/src/app.controller.ts.hbs"},{dest:"apps/api-gateway/src/app.controller.spec.ts",src:"monorepo/apps/api-gateway/src/app.controller.spec.ts.hbs"},{dest:"apps/api-gateway/test/app.e2e-spec.ts",src:"monorepo/apps/api-gateway/test/app.e2e-spec.ts.hbs"}],Ic=[{dest:"test/app.e2e-spec.ts",src:"base/test/app.e2e-spec.ts.hbs"},{dest:"test/bootstrap.e2e-spec.ts",src:"base/test/bootstrap.e2e-spec.ts.hbs"},{dest:"src/graphql/graphql.module.ts",src:"feature/graphql/src/graphql/graphql.module.ts.hbs"},{dest:"src/graphql/resolvers/health.resolver.ts",src:"feature/graphql/src/graphql/resolvers/health.resolver.ts.hbs"},{dest:"src/graphql/models/base.model.ts",src:"feature/graphql/src/graphql/models/base.model.ts.hbs"},{dest:"src/graphql/models/user.model.ts",src:"feature/graphql/src/graphql/models/user.model.ts.hbs"},{dest:"src/graphql/orm/typeorm/typeorm-graphql-relations.helper.ts",src:"feature/graphql/src/graphql/orm/typeorm/typeorm-graphql-relations.helper.ts.hbs"},{dest:"src/graphql/orm/drizzle/drizzle-graphql.module.ts",src:"feature/graphql/src/graphql/orm/drizzle/drizzle-graphql.module.ts.hbs"}],Oc=[{dest:"src/graphql/dto/create-todo.input.ts",src:"feature/graphql/src/graphql/dto/create-todo.input.ts.hbs"},{dest:"src/graphql/dto/update-todo.input.ts",src:"feature/graphql/src/graphql/dto/update-todo.input.ts.hbs"},{dest:"src/graphql/models/todo.model.ts",src:"feature/graphql/src/graphql/models/todo.model.ts.hbs"},{dest:"src/graphql/resolvers/todo.resolver.ts",src:"feature/graphql/src/graphql/resolvers/todo.resolver.ts.hbs"}],Uc=[{dest:"apps/api-gateway/src/app.router.ts",src:"base/src/app.router.ts.hbs"},{dest:"apps/api-gateway/src/app.router.spec.ts",src:"base/src/app.router.spec.ts.hbs"},{dest:"apps/api-gateway/src/libs/trpc/context.ts",src:"base/src/libs/trpc/context.ts.hbs"},{dest:"apps/api-gateway/src/libs/trpc/error.handler.ts",src:"base/src/libs/trpc/error.handler.ts.hbs"},{dest:"apps/api-gateway/src/libs/trpc/protected.ts",src:"base/src/libs/trpc/protected.ts.hbs"},{dest:"apps/api-gateway/src/libs/trpc/inner.context.ts",src:"base/src/libs/trpc/inner.context.ts.hbs"},{dest:"apps/api-gateway/src/libs/middlewares/auth.trpc.middleware.ts",src:"base/src/libs/middlewares/auth.trpc.middleware.ts.hbs"},{dest:"apps/api-gateway/src/libs/middlewares/rate-limit.trpc.middleware.ts",src:"base/src/libs/middlewares/rate-limit.trpc.middleware.ts.hbs"}],Qc=[{dest:"apps/api-gateway/src/graphql/graphql.module.ts",src:"monorepo/feature/graphql/src/graphql/graphql.module.ts.hbs"},{dest:"apps/api-gateway/src/graphql/resolvers/health.resolver.ts",src:"monorepo/feature/graphql/src/graphql/resolvers/health.resolver.ts.hbs"},{dest:"apps/api-gateway/src/graphql/models/base.model.ts",src:"monorepo/feature/graphql/src/graphql/models/base.model.ts.hbs"},{dest:"apps/api-gateway/src/graphql/models/user.model.ts",src:"monorepo/feature/graphql/src/graphql/models/user.model.ts.hbs"},{dest:"apps/api-gateway/src/graphql/orm/typeorm/typeorm-graphql-relations.helper.ts",src:"monorepo/feature/graphql/src/graphql/orm/typeorm/typeorm-graphql-relations.helper.ts.hbs"},{dest:"apps/api-gateway/src/graphql/orm/drizzle/drizzle-graphql.module.ts",src:"monorepo/feature/graphql/src/graphql/orm/drizzle/drizzle-graphql.module.ts.hbs"}],Fc=[{dest:"apps/api-gateway/src/graphql/dto/create-todo.input.ts",src:"monorepo/feature/graphql/src/graphql/dto/create-todo.input.ts.hbs"},{dest:"apps/api-gateway/src/graphql/dto/update-todo.input.ts",src:"monorepo/feature/graphql/src/graphql/dto/update-todo.input.ts.hbs"},{dest:"apps/api-gateway/src/graphql/models/todo.model.ts",src:"monorepo/feature/graphql/src/graphql/models/todo.model.ts.hbs"},{dest:"apps/api-gateway/src/graphql/resolvers/todo.resolver.ts",src:"monorepo/feature/graphql/src/graphql/resolvers/todo.resolver.ts.hbs"}],Hc=[{dest:"packages/config/package.json",src:"monorepo/packages/config/package.json.hbs"},{dest:"packages/config/tsconfig.base.json",src:"monorepo/packages/config/tsconfig.base.json.hbs"},{dest:"packages/config/tsconfig.nestjs.json",src:"monorepo/packages/config/tsconfig.nestjs.json.hbs"},{dest:"packages/env/package.json",src:"monorepo/packages/env/package.json.hbs"},{dest:"packages/env/src/api-gateway.ts",src:"monorepo/packages/env/src/api-gateway.ts.hbs"},{dest:"packages/env/tsconfig.json",src:"monorepo/packages/env/tsconfig.json.hbs"},{dest:"packages/shared/package.json",src:"monorepo/packages/shared/package.json.hbs"},{dest:"packages/shared/tsconfig.json",src:"monorepo/packages/shared/tsconfig.json.hbs"},{dest:"packages/shared/src/auth.ts",src:"monorepo/packages/shared/src/auth.ts.hbs"}],Wa={"addons/husky":Tc,"extras/database":Ac,"extras/docker":jc,"extras/health":Rc,"extras/swagger":[],"feature/graphql":Ic,"feature/graphql/todo-example":Oc,"feature/rest":Sc,"feature/rest/todo-example":wc,"feature/trpc":Ec,"monorepo/apps/api-gateway":Cc,"monorepo/feature/graphql":Qc,"monorepo/feature/graphql/todo-example":Fc,"monorepo/feature/rest":Lc,"monorepo/feature/rest/todo-example":Pc,"monorepo/feature/trpc":Uc,"monorepo/packages":Hc,"monorepo/packages/db":$c,"monorepo/root":Za};function Ft(e,t,s,r){const a=e.api.includes("trpc")&&e.extras.includes("swagger");let i="tsc";a&&(t.typescript=f("typescript"),delete s.typescript,s["typescript-native"]=`npm:typescript@${f("typescript-7")}`,i="node node_modules/typescript-native/bin/tsc"),s["tsc-watch"]=f("tsc-watch"),r.build=`${i} --project tsconfig.build.json`,r.dev=`tsc-watch --compileCommand "${i}" --project tsconfig.build.json --onSuccess "node dist/main.js"`,r.start=`${i} --project tsconfig.build.json && node dist/main.js`,r["start:debug"]=`tsc-watch --compileCommand "${i}" --project tsconfig.build.json --onSuccess "node --inspect-brk dist/main.js"`,r["start:dev"]=r.dev}c(Ft,"cr"),p(Ft,"configureTypeScript7");function Ht(e){for(const t of["build","dev","start","start:dev","start:debug"])e[t]=`${e["trpc:generate"]} && ${e[t]}`}c(Ht,"dr"),p(Ht,"configureTrpcGeneration");function Ka(e,t){if(!e.microservices.includes("grpc")||!e.extras.includes("typescript-7"))return!1;const{build:s}=t,{start:r}=t,{dev:a}=t,i=t["start:debug"];if(!(s&&r&&a&&i))return!1;const o="node scripts/copy-grpc-proto.mjs";return t.build=`${s} && ${o}`,t.start=r.replace(" && node dist/main.js",` && ${o} && node dist/main.js`),t.dev=a.replace('"node dist/main.js"',`"${o} && node dist/main.js"`),t["start:dev"]=t.dev,t["start:debug"]=i.replace('"node --inspect-brk dist/main.js"',`"${o} && node --inspect-brk dist/main.js"`),!0}c(Ka,"qc"),p(Ka,"configureGrpcProtoCopy");const Mc=`import { copyFileSync, mkdirSync } from "node:fs";
332
+
333
+ const outputDirectory = new URL("../dist/proto/", import.meta.url);
334
+ mkdirSync(outputDirectory, { recursive: true });
335
+ copyFileSync(
336
+ new URL("../src/proto/app.proto", import.meta.url),
337
+ new URL("../dist/proto/app.proto", import.meta.url)
338
+ );
339
+ `;function Mt(e,t,s){e.auth==="passport"?(t["@nestjs/passport"]=f("@nestjs/passport"),t.passport=f("passport"),t["passport-jwt"]=f("passport-jwt"),s["@types/passport-jwt"]=f("@types/passport-jwt"),e.database.length>0?(t["@nestjs/jwt"]=f("@nestjs/jwt"),t.bcrypt=f("bcrypt"),s["@types/bcrypt"]=f("@types/bcrypt"),e.orm.includes("typeorm")&&(t.typeorm=f("typeorm"))):t["jwks-rsa"]=f("jwks-rsa")):(e.auth==="better-auth"||e.auth==="better-auth:stateless")&&(t["better-auth"]=f("better-auth"),t["@thallesp/nestjs-better-auth"]=f("@thallesp/nestjs-better-auth"),e.orm.includes("drizzle")&&(t["@better-auth/drizzle-adapter"]=f("@better-auth/drizzle-adapter")));for(const r of e.api)r==="graphql"?(t["@nestjs/graphql"]=f("@nestjs/graphql"),t["@nestjs/apollo"]=f("@nestjs/apollo"),t.graphql=f("graphql"),t["@apollo/server"]=f("@apollo/server"),e.httpProvider==="fastify"?t["@as-integrations/fastify"]=f("@as-integrations/fastify"):t["@as-integrations/express5"]=f("@as-integrations/express5"),e.auth==="passport"&&(t["graphql-scalars"]=f("graphql-scalars")),e.orm.includes("typeorm")&&(t["typeorm-relations-graphql"]=f("typeorm-relations-graphql")),e.orm.includes("drizzle")&&(t["drizzle-graphql"]=f("drizzle-graphql"))):r==="trpc"&&(t["@trpc/server"]=f("@trpc/server"),t["@trpc/client"]=f("@trpc/client"),t["@trpc/openapi"]=f("@trpc/openapi"),t["nestjs-trpc"]=f("nestjs-trpc"));e.extras.includes("swagger")&&(t["@nestjs/swagger"]=f("@nestjs/swagger"),e.httpProvider==="fastify"&&(t["@fastify/static"]=f("@fastify/static")),e.addons.includes("scalar-ui")&&(t["@scalar/nestjs-api-reference"]=f("@scalar/nestjs-api-reference"))),e.extras.includes("health-check")&&(t["@nestjs/terminus"]=f("@nestjs/terminus")),e.extras.includes("rate-limiting")&&(t["@nestjs/throttler"]=f("@nestjs/throttler")),e.microservices.length>0&&(t["@nestjs/microservices"]=f("@nestjs/microservices"));for(const r of e.microservices)r==="redis"?t.ioredis=f("ioredis"):r==="mqtt"?t.mqtt=f("mqtt"):r==="nats"?(t.nats=f("nats"),t["@nats-io/transport-node"]=f("@nats-io/transport-node")):r==="rabbitmq"?(t.amqplib=f("amqplib"),t["amqp-connection-manager"]=f("amqp-connection-manager"),s["@types/amqplib"]=f("@types/amqplib")):r==="kafka"?t.kafkajs=f("kafkajs"):r==="grpc"&&(t["@grpc/grpc-js"]=f("@grpc/grpc-js"),t["@grpc/proto-loader"]=f("@grpc/proto-loader"));e.addons.includes("nestjs-zod")&&(t["nestjs-zod"]=f("nestjs-zod"))}c(Mt,"ur"),p(Mt,"addConditionalDependencies");function Nt(e,t,s){const r=e.orm.includes("prisma"),a=e.orm.includes("drizzle"),i=e.orm.includes("typeorm"),o=e.database.length>0&&!r&&!a&&!i;for(const n of e.orm)if(n==="prisma"){const l=e.prismaVersion==="8"||e.database.includes("mongodb")&&!e.prismaVersion||!e.prismaVersion&&!e.database.includes("mysql")&&!e.database.includes("sqlite")&&!e.database.includes("sqlserver");s.prisma=f("prisma"),e.prismaVersion==="6"&&e.database.includes("mongodb")&&(s.prisma="^6.19.0"),l?(s.prisma="^8.0.0-rc.15",e.database.includes("mongodb")&&(t["@prisma/orm-mongo"]=f("@prisma/orm-mongo"),t.mongodb=f("mongodb")),e.database.includes("postgresql")&&(t["@prisma/orm-postgres"]=f("@prisma/orm-postgres"),t["temporal-polyfill"]=f("temporal-polyfill"))):(t["@prisma/client"]=f("@prisma/client"),e.prismaVersion==="6"&&e.database.includes("mongodb")&&(t["@prisma/client"]="^6.19.0"),e.database.includes("postgresql")&&(t["@prisma/adapter-pg"]=f("@prisma/adapter-pg")),e.database.includes("mysql")&&(t["@prisma/adapter-mariadb"]=f("@prisma/adapter-mariadb")),e.database.includes("sqlite")&&(t["@prisma/adapter-better-sqlite3"]=f("@prisma/adapter-better-sqlite3")),e.database.includes("sqlserver")&&(t["@prisma/adapter-mssql"]=f("@prisma/adapter-mssql"),s["@types/mssql"]=f("@types/mssql")))}else if(n==="typeorm")t.typeorm=f("typeorm"),e.database.includes("mongodb")&&(t.mongodb="^7.0.0"),e.database.includes("postgresql")&&(t.pg=f("pg"),s["@types/pg"]=f("@types/pg")),e.database.includes("sqlserver")&&(t.mssql=f("mssql"),s["@types/mssql"]=f("@types/mssql"));else if(n==="drizzle"){const l=e.database.includes("sqlserver");t["drizzle-orm"]=f(l?"drizzle-orm-mssql":"drizzle-orm"),s["drizzle-kit"]=f(l?"drizzle-kit-mssql":"drizzle-kit"),e.database.includes("sqlserver")&&(t.mssql=f("mssql"),s["@types/mssql"]=f("@types/mssql"))}e.database.includes("postgresql")&&(a||o)&&(t.pg=f("pg"),s["@types/pg"]=f("@types/pg")),e.database.includes("mysql")&&(a||o||i)&&(t.mysql2=f("mysql2")),e.database.includes("sqlite")&&(a||o||i)&&(t["better-sqlite3"]=f("better-sqlite3"),s["@types/better-sqlite3"]=f("@types/better-sqlite3")),e.database.includes("mongodb")&&o&&(t.mongodb=f("mongodb"))}c(Nt,"mr"),p(Nt,"addDatabaseDependencies");async function Ya(e,t,s,r,a,i){try{const o=e.httpProvider==="fastify"?"@nestjs/platform-fastify":"@nestjs/platform-express",n={"@nestjs/common":f("@nestjs/common"),"@nestjs/core":f("@nestjs/core"),[o]:f(o),"@t3-oss/env-core":f("@t3-oss/env-core"),dotenv:f("dotenv"),"reflect-metadata":f("reflect-metadata"),rxjs:f("rxjs"),zod:f("zod")},l=e.extras.includes("typescript-7")?f("typescript-7"):f("typescript"),d={"@nestjs/cli":f("@nestjs/cli"),"@nestjs/mau":f("@nestjs/mau"),"@nestjs/schematics":f("@nestjs/schematics"),"@nestjs/testing":f("@nestjs/testing"),"@types/node":f("@types/node"),"@types/supertest":f("@types/supertest"),"@vitest/coverage-v8":f("@vitest/coverage-v8"),"source-map-support":f("source-map-support"),supertest:f("supertest"),typescript:l,vitest:f("vitest")};e.httpProvider==="express"&&(d["@types/express"]=f("@types/express"));const u={build:"nest build",deploy:"nest deploy",dev:"nest start --watch",start:"nest start","start:debug":"nest start --debug --watch","start:dev":"nest start --watch","start:prod":"node dist/main",test:"vitest run","test:cov":"vitest run --coverage","test:debug":"vitest --inspect-brk --no-file-parallelism","test:e2e":"vitest run --config ./vitest.config.e2e.ts","test:watch":"vitest"};if(e.extras.includes("typescript-7")&&Ft(e,n,d,u),Mt(e,n,d),Nt(e,n,d),e.auth==="better-auth"&&e.database.length>0){d.auth=f("better-auth");const b=e.orm.includes("prisma"),z=e.orm.includes("drizzle");let L="auth-schema.sql";b?L=e.database.includes("mongodb")?"auth-schema.prisma":"src/database/orm/prisma/schema.prisma":z&&(L="src/database/orm/drizzle/auth-schema.ts"),u["auth:generate"]=`auth generate --config src/auth/auth.cli.ts --output ${L} --yes`,b&&e.database.includes("mongodb")&&(u["auth:generate"]+=" && node scripts/install-auth-schema.mjs"),z&&e.projectType!=="monorepo"&&(u["auth:generate"]+=" && node scripts/normalize-drizzle-auth-schema.mjs"),!b&&!z&&(u["auth:migrate"]="auth migrate --config src/auth/auth.cli.ts --yes")}e.addons.includes("ultracite")&&(d.ultracite=f("ultracite"),u.check="ultracite check",u.fix="ultracite fix"),e.addons.includes("husky")&&(d.husky=f("husky"),u.prepare="husky"),e.orm.includes("prisma")&&(e.prismaVersion==="8"||e.database.includes("mongodb")&&!e.prismaVersion||!e.prismaVersion&&!e.database.includes("mysql")&&!e.database.includes("sqlite")&&!e.database.includes("sqlserver")?(u["contract:emit"]="prisma contract emit",u["db:init"]="prisma db init",u["db:update"]="prisma db update",u["db:verify"]="prisma db verify",u.migrate="prisma db migrate",u["migration:plan"]="prisma migration plan --name initial",u["migration:show"]="prisma migration show",u["migration:status"]="prisma migration status",u["skills:sync"]="prisma skills sync || exit 0"):(u["prisma:generate"]="prisma generate",u["prisma:format"]="prisma format",u["prisma:push"]="prisma db push",u["prisma:studio"]="prisma studio",u["prisma:migrate"]="prisma migrate dev",u["prisma:migrate:deploy"]="prisma migrate deploy",u.postinstall="prisma generate")),e.orm.includes("drizzle")&&(u["db:generate"]=e.formatter==="oxlint-oxfmt"?"drizzle-kit generate && oxfmt --write .":"drizzle-kit generate",u["db:migrate"]="drizzle-kit migrate",u["db:studio"]="drizzle-kit studio",u["db:push"]="drizzle-kit push"),e.api.includes("trpc")&&(u["trpc:generate"]="nestjs-trpc generate -e src/app.module.ts -o src/libs/trpc/@generated",u["trpc:watch"]="nestjs-trpc watch -e src/app.module.ts -o src/libs/trpc/@generated",Ht(u));const m=Ka(e,u);e.orm.includes("typeorm")&&(u["typeorm:run"]="typeorm migration:run -d dist/database/orm/typeorm/data-source.js",u["typeorm:revert"]="typeorm migration:revert -d dist/database/orm/typeorm/data-source.js",u["typeorm:generate"]="typeorm migration:generate -d dist/database/orm/typeorm/data-source.js --outputJs --esm",u["typeorm:generate:initial"]="typeorm migration:generate -d dist/database/orm/typeorm/data-source.js --outputJs --esm src/database/orm/typeorm/migrations/InitialSchema",u["typeorm:sync"]="typeorm schema:sync -d dist/database/orm/typeorm/data-source.js",u["typeorm:create"]="typeorm migration:create");const h={name:t.projectName,version:"0.0.1",description:t.description,author:"",license:"UNLICENSED",private:!0,type:"module",...e.packageManager==="yarn"?{packageManager:"yarn@4.6.0"}:{},scripts:u,dependencies:n,devDependencies:d},g=JSON.stringify(h,null,2),v=await s.writeFile({content:g,filePath:"package.json",isBinary:!1},{dryRun:r.dryRun,overwrite:r.overwrite});if(v.error&&i.push(`Failed to generate ${v.filePath}: ${v.error}`),v.written&&a.push(v.filePath),m){const b=await s.writeFile({content:Mc,filePath:"scripts/copy-grpc-proto.mjs",isBinary:!1},{dryRun:r.dryRun,overwrite:r.overwrite});b.error&&i.push(`Failed to generate ${b.filePath}: ${b.error}`),b.written&&a.push(b.filePath)}}catch(o){const n=o instanceof Error?o.message:String(o);i.push(`Failed to generate package.json: ${n}`),console.error("Failed to generate package.json:",o)}}c(Ya,"Sc"),p(Ya,"generateSingleProjectPackageJson");async function Xa(e,t,s,r,a,i){try{const o={build:"turbo build",test:"turbo run test","test:e2e":"turbo run test:e2e","check-types":"turbo check-types",dev:"turbo dev"},n={"@repo/env":"workspace:*",dotenv:"catalog:",zod:"catalog:"},l=e.extras.includes("typescript-7"),d=l?f("typescript-7"):"catalog:",u={"@repo/config":"workspace:*","@types/node":"catalog:",turbo:f("turbo"),typescript:d};e.addons.includes("ultracite")&&(o.check="ultracite check"),e.addons.includes("husky")&&(u.husky=f("husky"),o.prepare="husky");const m={bun:"bun@1.3.14",npm:void 0,pnpm:"pnpm@11.6.0",yarn:"yarn@4.6.0"}[e.packageManager],h=l?{...Qt(),typescript:f("typescript-7")}:Qt(),g={name:t.projectName,version:"0.0.1",description:t.description,author:"",license:"UNLICENSED",private:!0,workspaces:["apps/*","packages/*"],type:"module",...m?{packageManager:m}:{},...e.packageManager==="bun"?{catalog:h}:{},scripts:o,dependencies:n,devDependencies:u},v=JSON.stringify(g,null,2),b=await s.writeFile({content:v,filePath:_c,isBinary:!1},{dryRun:r.dryRun,overwrite:r.overwrite});b.error&&i.push(`Failed to generate ${b.filePath}: ${b.error}`),b.written&&a.push(b.filePath)}catch(o){const n=o instanceof Error?o.message:String(o);i.push(`Failed to generate monorepo root package.json: ${n}`),console.error("Failed to generate monorepo root package.json:",o)}}c(Xa,"xc"),p(Xa,"generateMonorepoRootPackageJson");async function ei(e,t,s,r,a,i){try{const o=e.httpProvider==="fastify"?"@nestjs/platform-fastify":"@nestjs/platform-express",n={"@nestjs/common":f("@nestjs/common"),"@nestjs/core":f("@nestjs/core"),[o]:f(o),"@repo/env":"workspace:*","reflect-metadata":f("reflect-metadata"),rxjs:f("rxjs"),zod:"catalog:"};e.database.length>0&&(n["@repo/db"]="workspace:*"),e.extras.includes("packages/shared")&&(n["@repo/shared"]="workspace:*");const l=e.extras.includes("typescript-7")?f("typescript-7"):"catalog:",d={"@nestjs/cli":f("@nestjs/cli"),"@nestjs/mau":f("@nestjs/mau"),"@nestjs/schematics":f("@nestjs/schematics"),"@nestjs/testing":f("@nestjs/testing"),"@repo/config":"workspace:*","@types/node":"catalog:","@types/supertest":f("@types/supertest"),"@vitest/coverage-v8":f("@vitest/coverage-v8"),"source-map-support":f("source-map-support"),supertest:f("supertest"),typescript:l,vitest:f("vitest")};e.httpProvider==="express"&&(d["@types/express"]=f("@types/express"));const u={build:"nest build",deploy:"nest deploy",dev:"nest start --watch",start:"nest start","start:debug":"nest start --debug --watch","start:dev":"nest start --watch","start:prod":"node dist/main",test:"vitest run","test:cov":"vitest run --coverage","test:debug":"vitest --inspect-brk --no-file-parallelism","test:e2e":"vitest run --config ./vitest.config.e2e.ts","test:watch":"vitest"};if(e.extras.includes("typescript-7")&&Ft(e,n,d,u),Mt(e,n,d),e.auth==="better-auth"&&e.orm.includes("prisma")){d.auth=f("better-auth");const v=e.database.includes("mongodb")?"auth-schema.prisma":"../../packages/db/src/database/orm/prisma/schema.prisma";u["auth:generate"]=`auth generate --config src/auth/auth.cli.ts --output ${v} --yes`,e.database.includes("mongodb")&&(u["auth:generate"]+=" && node scripts/install-auth-schema.mjs")}e.addons.includes("ultracite")&&(d.ultracite=f("ultracite"),u.check="ultracite check",u.fix="ultracite fix"),e.addons.includes("husky")&&(d.husky=f("husky"),u.prepare="husky"),e.api.includes("trpc")&&(u["trpc:generate"]="nestjs-trpc generate -e src/app.module.ts -o ../../packages/shared/src/trpc/@generated",u["trpc:watch"]="nestjs-trpc watch -e src/app.module.ts -o ../../packages/shared/src/trpc/@generated",Ht(u));const m={name:"@repo/api-gateway",version:"0.0.1",description:t.description,author:"",license:"UNLICENSED",private:!0,type:"module",scripts:u,dependencies:n,devDependencies:d},h=JSON.stringify(m,null,2),g=await s.writeFile({content:h,filePath:"apps/api-gateway/package.json",isBinary:!1},{dryRun:r.dryRun,overwrite:r.overwrite});g.error&&i.push(`Failed to generate ${g.filePath}: ${g.error}`),g.written&&a.push(g.filePath)}catch(o){const n=o instanceof Error?o.message:String(o);i.push(`Failed to generate monorepo app package.json: ${n}`),console.error("Failed to generate monorepo app package.json:",o)}}c(ei,"wc"),p(ei,"generateMonorepoAppPackageJson");async function ti(e,t,s,r,a,i){try{const o={"@nestjs/common":"catalog:","@nestjs/core":"catalog:","reflect-metadata":"catalog:",rxjs:"catalog:","@repo/env":"workspace:*"},n={"@repo/config":"workspace:*","@types/node":"catalog:",typescript:e.extras.includes("typescript-7")?f("typescript-7"):"catalog:"};Nt(e,o,n);const l={};if(e.orm.includes("prisma"))if(e.prismaVersion==="8"||e.database.includes("mongodb")&&!e.prismaVersion||!e.prismaVersion&&!e.database.includes("mysql")&&!e.database.includes("sqlite")&&!e.database.includes("sqlserver"))l["contract:emit"]="prisma contract emit",l["db:init"]="prisma db init",l["db:update"]="prisma db update",l["db:verify"]="prisma db verify",l.migrate="prisma db migrate",l["migration:plan"]="prisma migration plan",l["migration:show"]="prisma migration show",l["migration:status"]="prisma migration status",l["skills:sync"]="prisma skills sync || exit 0";else{const h="--schema ./src/database/orm/prisma",g="--config ../../prisma.config.ts";l["prisma:generate"]=`prisma generate ${h}`,l["prisma:format"]=`prisma format ${h}`,l["prisma:push"]=`prisma db push ${h} ${g}`,l["prisma:studio"]=`prisma studio ${h} ${g}`,l["prisma:migrate"]=`prisma migrate dev ${h} ${g}`,l["prisma:migrate:deploy"]=`prisma migrate deploy ${h} ${g}`,l.postinstall="prisma generate --schema ./src/database/orm/prisma"}e.orm.includes("drizzle")&&(l["db:generate"]=e.formatter==="oxlint-oxfmt"?"drizzle-kit generate && oxfmt --write .":"drizzle-kit generate",l["db:migrate"]="drizzle-kit migrate",l["db:studio"]="drizzle-kit studio",l["db:push"]="drizzle-kit push"),e.orm.includes("typeorm")&&(l["typeorm:run"]="typeorm-ts esm migration:run -d src/database/orm/typeorm/data-source.ts",l["typeorm:revert"]="typeorm-ts esm migration:revert -d src/database/orm/typeorm/data-source.ts",l["typeorm:generate"]="typeorm-ts esm migration:generate -d src/database/orm/typeorm/data-source.ts",l["typeorm:create"]="typeorm migration:create");const d={name:"@repo/db",version:"0.0.1",private:!0,type:"module",main:"./src/index.ts",exports:{".":"./src/index.ts"},...Object.keys(l).length>0?{scripts:l}:{},dependencies:o,devDependencies:n},u=JSON.stringify(d,null,2),m=await s.writeFile({content:u,filePath:"packages/db/package.json",isBinary:!1},{dryRun:r.dryRun,overwrite:r.overwrite});m.error&&i.push(`Failed to generate ${m.filePath}: ${m.error}`),m.written&&a.push(m.filePath)}catch(o){const n=o instanceof Error?o.message:String(o);i.push(`Failed to generate monorepo db package.json: ${n}`),console.error("Failed to generate monorepo db package.json:",o)}}c(ti,"Ec"),p(ti,"generateMonorepoDbPackageJson");async function si(e,t,s,r,a){const i=t.database.includes("mongodb"),o=t.extras.includes("todo-example"),n=["// use prisma-next",""];t.auth==="passport"&&t.database.length>0&&n.push("enum Role {"," ADMIN"," USER","}",""),i?(t.auth==="passport"&&t.database.length>0&&n.push("model User {",' id ObjectId @id @map("_id")'," email String @unique"," username String?"," name String?"," password String"," firstname String?"," lastname String?"," role Role @default(USER)",...o?[" todos Todo[]"]:[],' @@map("users")',"}",""),o&&t.database.length>0&&n.push("model Todo {",' id ObjectId @id @map("_id")'," title String"," description String?"," completed Boolean @default(false)",...t.auth!=="none"?[" author User? @relation(fields: [authorId], references: [id])"," authorId ObjectId?"]:[],' @@map("todos")',"}","")):(t.auth==="passport"&&t.database.length>0&&n.push("model User {"," id Int @id @default(autoincrement())"," email String @unique"," username String?"," name String?"," password String"," firstname String?"," lastname String?"," role Role @default(USER)",...o?[" todos Todo[]"]:[]," createdAt TimestamptzString @default(now())"," updatedAt temporal.updatedAtString()",' @@map("users")',"}",""),o&&t.database.length>0&&n.push("model Todo {"," id Int @id @default(autoincrement())"," title String"," description String?"," completed Boolean @default(false)",...t.auth!=="none"?[" author User? @relation(fields: [authorId], references: [id])"," authorId Int?"]:[]," createdAt TimestamptzString @default(now())"," updatedAt temporal.updatedAtString()",' @@map("todos")',"}",""));const l=n.join(`
340
+ `),d=t.projectType==="monorepo"?"packages/db/src/prisma/contract.prisma":"src/prisma/contract.prisma";try{const h=await e.writeFile({content:l,filePath:d,isBinary:!1},s);h.written&&r.push(h.filePath)}catch(h){const g=h instanceof Error?h.message:String(h);a.push(`Failed to generate ${d}: ${g}`)}const u=i?['import mongo from "@prisma/orm-mongo/runtime";',t.projectType==="monorepo"?'import { env } from "@repo/env/api-gateway";':'import { env } from "../config/env.js";',"",'import type { Contract } from "./contract.d.ts";','import contractJson from "./contract.json" with { type: "json" };',"","const databaseUrl = env.MONGODB_URL;","","export const db = databaseUrl"," ? mongo<Contract>({ contractJson, url: databaseUrl })"," : mongo<Contract>({ contractJson });","","let connection: Promise<void> | undefined;","","export function connectDatabase(): Promise<void> {"," connection ??= (async () => {"," try {"," await db.connect();"," } catch (error: unknown) {"," connection = undefined;"," throw error;"," }"," })();"," return connection;","}",""].join(`
341
+ `):['import postgres from "@prisma/orm-postgres/runtime";',t.projectType==="monorepo"?'import { env } from "@repo/env/api-gateway";':'import { env } from "../config/env.js";','import "temporal-polyfill/global";',"",'import type { Contract } from "./contract.d.ts";','import contractJson from "./contract.json" with { type: "json" };',"","const databaseUrl = env.POSTGRES_URL;","","export const db = databaseUrl"," ? postgres<Contract>({ contractJson, url: databaseUrl })"," : postgres<Contract>({ contractJson });","","let connection: Promise<void> | undefined;","","export function connectDatabase(): Promise<void> {"," connection ??= (async () => {"," try {"," await db.connect();"," } catch (error: unknown) {"," connection = undefined;"," throw error;"," }"," })();"," return connection;","}",""].join(`
342
+ `),m=t.projectType==="monorepo"?"packages/db/src/prisma/db.ts":"src/prisma/db.ts";try{const h=await e.writeFile({content:u,filePath:m,isBinary:!1},s);h.written&&r.push(h.filePath)}catch(h){const g=h instanceof Error?h.message:String(h);a.push(`Failed to generate ${m}: ${g}`)}}c(si,"Pc"),p(si,"generatePrisma8Contract");async function ri(e,t,s,r,a){let i="postgresql";t.database.includes("mysql")?i="mysql":t.database.includes("sqlite")?i="sqlite":t.database.includes("mongodb")?i="mongodb":t.database.includes("sqlserver")&&(i="sqlserver");const o=i==="mongodb",n=["generator client {",` provider = "${t.prismaVersion==="6"?"prisma-client-js":"prisma-client"}"`,...t.prismaVersion==="6"?[]:[' output = "./generated"'],...t.prismaVersion==="6"?[' previewFeatures = ["prismaSchemaFolder"]']:[],"}","","datasource db {",` provider = "${i}"`,...t.prismaVersion==="6"&&o?[' url = env("MONGODB_URL")']:[],"}",""],l=t.extras.includes("todo-example");let d="";if(o?d=" @db.ObjectId":i==="sqlserver"&&(d=" @db.NVarChar(36)"),t.auth==="passport"&&t.database.length>0){const h=i!=="sqlserver";h&&n.push("enum Role {"," ADMIN"," USER","}",""),n.push("model User {",` id String ${o?'@id @default(auto()) @map("_id") @db.ObjectId':`@id @default(cuid())${i==="sqlserver"?" @db.NVarChar(36)":""}`}`," createdAt DateTime @default(now())"," updatedAt DateTime @updatedAt"," email String @unique"," password String"," refreshTokens RefreshToken[]"," firstname String?"," lastname String?",h?" role Role @default(USER)":' role String @default("USER")',...l?[" todos Todo[]",""]:[""],' @@map("user")',"}","")}t.auth==="passport"&&n.push(`model RefreshToken {
343
+ id String @id @default(cuid())${o?' @map("_id")':""}
344
+ userId String${d}
345
+ user User @relation(fields: [userId], references: [id], onDelete: Cascade)
346
+ familyId String
347
+ tokenHash String @unique
348
+ expiresAt DateTime
349
+ consumedAt DateTime?
350
+ revokedAt DateTime?
351
+ @@index([familyId])
352
+ }`),l&&t.database.length>0&&(t.auth==="none"?n.push("model Todo {",` id String ${o?'@id @default(auto()) @map("_id") @db.ObjectId':`@id @default(cuid())${i==="sqlserver"?" @db.NVarChar(36)":""}`}`," createdAt DateTime @default(now())"," updatedAt DateTime @updatedAt"," title String"," description String?"," completed Boolean @default(false)","",' @@map("todo")',"}",""):t.auth==="passport"?n.push("model Todo {",` id String ${o?'@id @default(auto()) @map("_id") @db.ObjectId':`@id @default(cuid())${i==="sqlserver"?" @db.NVarChar(36)":""}`}`," createdAt DateTime @default(now())"," updatedAt DateTime @updatedAt"," title String"," description String?"," completed Boolean @default(false)",` authorId String?${d}`," author User? @relation(fields: [authorId], references: [id])","",' @@map("todo")',"}",""):n.push("model Todo {",` id String ${o?'@id @default(auto()) @map("_id") @db.ObjectId':`@id @default(cuid())${i==="sqlserver"?" @db.NVarChar(36)":""}`}`," createdAt DateTime @default(now())"," updatedAt DateTime @updatedAt"," title String"," description String?"," completed Boolean @default(false)",` authorId String?${d}`,"",' @@map("todo")',"}",""));const u=n.join(`
353
+ `),m=t.projectType==="monorepo"?"packages/db/src/database/orm/prisma/schema.prisma":"src/database/orm/prisma/schema.prisma";try{const h=await e.writeFile({content:u,filePath:m,isBinary:!1},s);h.written&&r.push(h.filePath)}catch(h){const g=h instanceof Error?h.message:String(h);a.push(`Failed to generate ${m}: ${g}`)}}c(ri,"Tc"),p(ri,"generatePrisma7Schema");async function ai(e,t,s,r,a){await(t.prismaVersion==="8"||t.database.includes("mongodb")&&!t.prismaVersion||!t.prismaVersion&&!t.database.includes("mysql")&&!t.database.includes("sqlite")&&!t.database.includes("sqlserver")?si(e,t,s,r,a):ri(e,t,s,r,a))}c(ai,"jc"),p(ai,"generatePrismaSchema");function Gt(e,t){const s=!!t.usePrisma,r=!!t.useTypeorm,a=!!t.useDrizzle,i=!!t.useRawSql,o=!!t.hasPostgres,n=!!t.hasMysql,l=!!t.hasSqlite,d=!!t.hasMongodb,u=!!t.hasSqlserver,m=!!t.isPrisma8;return e.filter(h=>{const{dest:g}=h;return g.includes("prisma-sql.adapter")?s&&!m&&(o||n||l||u):g.includes("prisma-mongo.adapter")?s&&d:g.includes("typeorm-sql.adapter")?r&&(o||n||l||u):g.includes("typeorm-mongo.adapter")?r&&d:g.includes("orm/typeorm/data-source")?r:g.includes("modules/users/entities/")?r&&!!t.isPassportAuth:g.endsWith("entities/app.entity.ts")?r&&t.auth==="better-auth:stateless":g.includes("entities/")?r:g.includes("drizzle-sql.adapter")?a:g.includes("raw-sql.adapter")?i&&(o||n||l):g.includes("raw-mongo.adapter")?i&&d:g.includes("orm/drizzle/schema")?a:!0})}c(Gt,"hr"),p(Gt,"filterDatabaseTemplates");function Bt(e,t){const s=!!t.hasTrpcAndAuth,r=!!t.hasRateLimiting;return e.filter(a=>a.dest.includes("libs/trpc/protected.ts")||a.dest.includes("libs/trpc/inner.context.ts")||a.dest.includes("libs/middlewares/auth.trpc.middleware.ts")?s:a.dest.includes("libs/middlewares/rate-limit.trpc.middleware.ts")?r:!0)}c(Bt,"fr"),p(Bt,"filterTrpcTemplates");function Vt(e,t){const s=!!t.useTypeorm,r=!!t.usePrisma,a=!!t.useDrizzle;return e.filter(i=>{const{dest:o}=i;return o.includes("orm/typeorm")?s:o.includes("orm/prisma")?r:o.includes("orm/drizzle")?a:!0})}c(Vt,"gr"),p(Vt,"filterGraphqlTemplates");function Jt(e,t){const s=!!t.hasTrpc,r=!!t.hasRest;return e.filter(a=>a.dest.includes("todo.router.ts")?s:a.dest.includes("todo.controller.ts")?r:!0)}c(Jt,"yr"),p(Jt,"filterTodoTemplates");function ii(e){return`import { spawnSync } from "node:child_process";
354
+ import { existsSync, readFileSync } from "node:fs";
355
+ import path from "node:path";
356
+ import { parseEnv } from "node:util";
357
+
358
+ const root = import.meta.dirname;
359
+ const file = path.join(root, existsSync(path.join(root, ".env.test")) ? ".env.test" : ".env.test.example");
360
+ const [script, ...args] = process.argv.slice(2);
361
+ const scriptPattern = /^[a-zA-Z0-9:_-]+$/u;
362
+ const argumentPattern = /^[a-zA-Z0-9_./=-]+$/u;
363
+ if (!script || !scriptPattern.test(script) || args.some((arg) => !argumentPattern.test(arg))) {
364
+ throw new Error("Usage: node test-with-services.mjs <package-script> [arguments]");
365
+ }
366
+ const manager = ${JSON.stringify(e)};
367
+ const command = [manager, "run", script, ...(manager === "npm" && args.length > 0 ? ["--"] : []), ...args].join(" ");
368
+ const result = spawnSync(command, {
369
+ cwd: root,
370
+ env: { ...process.env, ...parseEnv(readFileSync(file, "utf-8")) },
371
+ shell: true,
372
+ stdio: "inherit",
373
+ windowsHide: true,
374
+ });
375
+ if (result.error) {
376
+ throw result.error;
377
+ }
378
+ process.exitCode = result.status ?? 1;
379
+ `}c(ii,"Rc"),p(ii,"testServicesRunnerTemplate");function oi(e){const t={},s={BETTER_AUTH_SECRET:"local-test-secret-at-least-32-characters-long",BETTER_AUTH_URL:"http://localhost:3000",JWT_ACCESS_SECRET:"local-test-access-secret-at-least-32-characters",JWT_REFRESH_SECRET:"local-test-refresh-secret-at-least-32-characters",NODE_ENV:"test",OIDC_CLIENT_ID:"generated-scenario-client",OIDC_CLIENT_SECRET:"generated-scenario-secret",OIDC_DISCOVERY_URL:"http://127.0.0.1:1/.well-known/openid-configuration",OIDC_PROVIDER_ID:"scenario-oidc"},r=p((i,o,n,l,d,u)=>{t[i]={environment:l,...d&&d.length>0?{healthcheck:{interval:"2s",retries:i==="sqlserver"?120:45,start_period:i==="sqlserver"?"1200s":"10s",test:d,timeout:i==="sqlserver"?"30s":"5s"}}:{},image:o,labels:{"nest-arch.generated-test":"true"},ports:[`127.0.0.1:\${TEST_${i.toUpperCase()}_PORT:-${n}}:${n}`],...u?{command:u}:{}}},"add");if(e.database.includes("postgresql")&&(r("postgres","postgres:17-alpine",5432,{POSTGRES_DB:"scenario",POSTGRES_PASSWORD:"scenario",POSTGRES_USER:"scenario"},["CMD","pg_isready","-h","127.0.0.1","-U","scenario","-d","scenario"]),s.POSTGRES_URL="postgresql://scenario:scenario@127.0.0.1:5432/scenario"),e.database.includes("mysql")&&(r("mysql","mysql:8.4",3306,{MYSQL_DATABASE:"scenario",MYSQL_ROOT_HOST:"%",MYSQL_ROOT_PASSWORD:"scenario"},["CMD","mysql","--host=127.0.0.1","--user=root","--password=scenario","--execute=SELECT 1","scenario"]),s.MYSQL_URL="mysql://root:scenario@127.0.0.1:3306/scenario"),e.database.includes("sqlserver")){const i="Scenario_Strong_Password_2026!X9";r("sqlserver","mcr.microsoft.com/mssql/server:2022-latest",1433,{ACCEPT_EULA:"Y",MSSQL_SA_PASSWORD:i},["CMD-SHELL",`until /opt/mssql-tools18/bin/sqlcmd -C -S localhost -U sa -P "$$MSSQL_SA_PASSWORD" -Q "SELECT 1" -b; do sleep 5; done; /opt/mssql-tools18/bin/sqlcmd -C -S localhost -U sa -P "$$MSSQL_SA_PASSWORD" -Q "IF DB_ID(N'scenario') IS NULL CREATE DATABASE [scenario]; SELECT 1" -b`]),s.SQLSERVER_HOST="127.0.0.1",s.SQLSERVER_PORT="1433",s.SQLSERVER_DATABASE="scenario",s.SQLSERVER_USER="sa",s.SQLSERVER_PASSWORD=i,s.SQLSERVER_ENCRYPT="true",s.SQLSERVER_TRUST_SERVER_CERTIFICATE="true"}if(e.database.includes("mongodb")&&(r("mongodb","mongo:8",27017,{},["CMD","mongosh","--quiet","--eval","db.adminCommand('ping')"],["mongod","--replSet","rs0","--bind_ip_all"]),s.MONGODB_URL="mongodb://127.0.0.1:27017/scenario"),e.microservices.includes("redis")&&(r("redis","redis:7-alpine",6379,{},["CMD","redis-cli","ping"]),s.REDIS_URL="redis://127.0.0.1:6379"),e.microservices.includes("grpc")&&(s.GRPC_URL="127.0.0.1:5000"),e.microservices.includes("mqtt")&&(r("mqtt","eclipse-mosquitto:2",1883,{},[]),s.MQTT_URL="mqtt://127.0.0.1:1883"),e.microservices.includes("nats")&&(r("nats","nats:2-alpine",4222,{},[]),s.NATS_URL="nats://127.0.0.1:4222"),e.microservices.includes("rabbitmq")&&(r("rabbitmq","rabbitmq:3.13-alpine",5672,{},["CMD","rabbitmq-diagnostics","-q","ping"]),s.RABBITMQ_URL="amqp://127.0.0.1:5672"),e.microservices.includes("kafka")&&(r("kafka","apache/kafka:3.9.0",9092,{KAFKA_ADVERTISED_LISTENERS:"INTERNAL://kafka:9093,EXTERNAL://127.0.0.1:9092",KAFKA_AUTO_CREATE_TOPICS_ENABLE:"true",KAFKA_CONTROLLER_LISTENER_NAMES:"CONTROLLER",KAFKA_CONTROLLER_QUORUM_VOTERS:"1@localhost:9094",KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS:"0",KAFKA_INTER_BROKER_LISTENER_NAME:"INTERNAL",KAFKA_LISTENERS:"INTERNAL://:9093,EXTERNAL://:9092,CONTROLLER://:9094",KAFKA_LISTENER_SECURITY_PROTOCOL_MAP:"CONTROLLER:PLAINTEXT,EXTERNAL:PLAINTEXT,INTERNAL:PLAINTEXT",KAFKA_NODE_ID:"1",KAFKA_OFFSETS_TOPIC_NUM_PARTITIONS:"1",KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR:"1",KAFKA_PROCESS_ROLES:"broker,controller",KAFKA_TRANSACTION_STATE_LOG_MIN_ISR:"1",KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR:"1"},[]),s.KAFKA_BROKER="127.0.0.1:9092"),Object.keys(t).length===0)return{};const a=[...e.auth==="better-auth"?["auth:generate",...e.orm.length===0||e.orm.includes("typeorm")?["auth:migrate"]:[]]:[],...e.orm.includes("prisma")?["prisma:generate","prisma:migrate --name initial","prisma:migrate:deploy"]:[],...e.api.includes("trpc")?["trpc:generate"]:[],...e.orm.includes("drizzle")?["db:generate","db:migrate"]:[],"build",...e.orm.includes("typeorm")?["typeorm:generate:initial","typeorm:run"]:[],"test","test:e2e"];return{".env.test.example":`${Object.entries(s).map(([i,o])=>`${i}=${o}`).join(`
380
+ `)}
381
+ `,"TESTING.md":`# Servicios para pruebas
382
+
383
+ Desde la ra\xEDz del proyecto:
384
+
385
+ 1. Ejecuta \`docker compose -f docker-compose.test.yml up -d --wait\`.
386
+ 2. Ejecuta cada comando de abajo con \`node test-with-services.mjs <script> [argumentos]\`. El helper carga .env.test.example (o .env.test si lo creas), y la aplicaci\xF3n valida las variables con createEnv.
387
+ 3. Al terminar ejecuta \`docker compose -f docker-compose.test.yml down --volumes --remove-orphans\`. Esto elimina los datos de pruebas.
388
+
389
+ ${a.map(i=>`- \`node test-with-services.mjs ${i}\``).join(`
390
+ `)}
391
+
392
+ Las migraciones iniciales se generan una sola vez; en ejecuciones posteriores aplica las existentes. Los puertos se publican solo en localhost. Puedes cambiarlos con TEST_POSTGRES_PORT, TEST_MYSQL_PORT, TEST_SQLSERVER_PORT, TEST_MONGODB_PORT o TEST_REDIS_PORT y actualizar la configuraci\xF3n correspondiente en .env.test. Estos servicios son exclusivamente de desarrollo/pruebas. Redis se incluye si fue seleccionado; esto no implica que las pruebas HTTP certifiquen el transporte.
393
+ `,"docker-compose.test.yml":`${JSON.stringify({services:t},null,2)}
394
+ `,"test-with-services.mjs":ii(e.packageManager)}}c(oi,"Ac"),p(oi,"generateTestServices");class Nc{static{c(this,"br")}static{p(this,"ProjectGenerator")}templateEngine;fileWriter;registry;options;mapper;constructor(t,s){this.options=s,this.fileWriter=new Ti(t),this.templateEngine=new Zt(s.templatesDir,{cache:s.cacheTemplates??!0}),this.registry=new Ai,this.mapper=new Be,Hs(this.mapper)}getMapper(){return this.mapper}async generate(t){const s=Date.now(),r=[],a=[];try{at(t,this.options.candidateProfile,this.options.candidateProfile!==void 0,this.options.allowUnverifiedComposition===!0&&this.options.automatedTestArtifacts===!0);const i=this.mapper.resolve(t);let o=Bs(t);o=Vs(o,i.extraVariables),o.hasUltracite=t.addons.includes("ultracite"),o.hasHusky=t.addons.includes("husky"),o.hasAgentSkills=t.addons.includes("agent-skills"),await(t.projectType==="monorepo"?this.generateMonorepo.bind(this):this.generateSingleProject.bind(this))(t,o,i.templateGroups,r,a);const n=Date.now()-s,l=`${this.fileWriter.getBaseDir()}/README.md`,d=r.some(m=>m.replaceAll("\\","/")===l.replaceAll("\\","/"));if(!this.options.dryRun&&a.length===0&&d){const m=await it(this.fileWriter.getBaseDir(),t),h=Os(ot(t,m,{dependenciesInstalled:!1,includeDirectory:!1})),g=t.projectType==="monorepo"?"monorepo/root/README.md.hbs":"base/README.md.hbs",v=await this.templateEngine.renderToFile(g,"README.md",{context:{...o,setupInstructions:h}}),b=await this.fileWriter.writeFile(v,{overwrite:!0});b.error&&a.push(b.error)}if(a.length===0){const m={dryRun:this.options.dryRun,overwrite:this.options.overwrite};await Ja(this.fileWriter,t,m,r,a,this.options.automatedTestArtifacts??!1,this.options.generatorVersion)}const u=a.length===0;return u&&console.log(`\u2705 Project generated in ${n}ms`),{error:u?void 0:a.join(`
395
+ `),filesCount:r.length,generatedFiles:r,success:u}}catch(i){return{error:i instanceof Error?i.message:"Unknown error",filesCount:0,generatedFiles:r,success:!1}}}async generateSingleProject(t,s,r,a,i){const o={dryRun:this.options.dryRun,overwrite:this.options.overwrite},n=[...vc];s.packageManager==="pnpm"?n.push(qc):s.packageManager==="yarn"?(n.push(xc),n.push({dest:"yarn.lock",src:"base/yarn.lock.hbs"})):s.packageManager==="bun"&&n.push(zc),await Ya(t,s,this.fileWriter,o,a,i);const l=this.resolveSingleProjectTemplates(n,r,s);for(const d of l.values())this.shouldSkipTemplate(d,t,!1)||await this.renderAndWrite(d.src,d.dest,s,a,i);await this.processPostTemplateSteps(t,s,a,i)}async generateMonorepo(t,s,r,a,i){const o={dryRun:this.options.dryRun,overwrite:this.options.overwrite};await Xa(t,s,this.fileWriter,o,a,i),await ei(t,s,this.fileWriter,o,a,i),t.database.length>0&&await ti(t,s,this.fileWriter,o,a,i),await this.processTemplateGroups(t,s,r,a,i),await this.processPostTemplateSteps(t,s,a,i)}TEMPLATE_FILTERS={"extras/database":Gt,"feature/graphql":Vt,"feature/rest/todo-example":Jt,"feature/trpc":Bt,"monorepo/feature/graphql":Vt,"monorepo/feature/rest/todo-example":Jt,"monorepo/feature/trpc":Bt,"monorepo/packages/db":Gt};resolveSingleProjectTemplates(t,s,r){const a=new Map(t.map(n=>[n.dest,n])),i=[],o=new Set(["package.json","pnpm-workspace.yaml",".yarnrc.yml","bunfig.toml"]);for(const n of s){const l=Dc[n];if(l){for(const h of l)o.has(h.dest)||i.push(h);continue}if(n==="monorepo/packages/db")continue;const d=Wa[n]??[],u=this.TEMPLATE_FILTERS[n],m=u?u(d,r):d;for(const h of m)a.set(h.dest,h)}for(const n of i)a.set(n.dest,n);return a}async processMonorepoRoot(t,s,r){for(const n of Za)await this.renderAndWrite(n.src,n.dest,t,s,r);const a={bun:{dest:"bunfig.toml",src:"monorepo/root/bunfig.toml.hbs"},pnpm:{dest:"pnpm-workspace.yaml",src:"monorepo/root/pnpm-workspace.yaml.hbs"},yarn:{dest:".yarnrc.yml",src:"monorepo/root/.yarnrc.yml.hbs"}},i=t.packageManager,o=a[i];o&&await this.renderAndWrite(o.src,o.dest,t,s,r)}shouldSkipTemplate(t,s,r){return!!(r&&t.dest==="packages/db/package.json"||t.dest==="docker-compose.yml"||s.architecture==="nest-microservice"&&(t.dest==="src/app.controller.ts"&&!t.src.includes("architecture/nest-microservice/")||t.dest==="test/bootstrap.e2e-spec.ts")||s.architecture==="nest-microservice"&&t.dest==="src/http-throttler.guard.ts"&&!s.extras.includes("rate-limiting")||s.architecture==="nest-microservice"&&t.dest==="src/proto/app.proto"&&!s.microservices.includes("grpc"))}async processTemplateGroups(t,s,r,a,i){const o=t.projectType==="monorepo";for(const n of r){if(o&&n==="monorepo/root"){await this.processMonorepoRoot(s,a,i);continue}if(!o&&n==="monorepo/packages/db")continue;const l=Wa[n];if(!l)continue;const d=this.TEMPLATE_FILTERS[n],u=d?d(l,s):l;for(const m of u)this.shouldSkipTemplate(m,t,o)||await this.renderAndWrite(m.src,m.dest,s,a,i)}}async processPostTemplateSteps(t,s,r,a){const i={dryRun:this.options.dryRun,overwrite:this.options.overwrite},o=t.projectType==="monorepo"?"apps/api-gateway/src/docs/create-docs.ts":"src/docs/create-docs.ts";t.projectType==="single"&&t.api.includes("graphql")&&t.extras.includes("rate-limiting")&&await this.renderAndWrite("base/src/libs/middlewares/graphql-throttler.guard.ts.hbs","src/libs/middlewares/graphql-throttler.guard.ts",s,r,a),t.extras.includes("swagger")&&await this.renderAndWrite("extras/swagger/create-docs.ts.hbs",o,s,r,a);for(const[n,l]of Object.entries(this.options.automatedTestArtifacts?oi(t):{})){const d=await this.fileWriter.writeFile({content:l,filePath:n,isBinary:!1},i);d.error&&a.push(`Failed to generate ${n}: ${d.error}`),d.written&&r.push(d.filePath)}if(t.extras.includes("docker")){const n=Ws(t),l=await this.fileWriter.writeFile({content:n,filePath:"docker-compose.yml",isBinary:!1},i);l.error&&a.push(`Failed to generate docker-compose.yml: ${l.error}`),l.written&&r.push(l.filePath)}if(t.orm.includes("prisma")&&(await ai(this.fileWriter,t,i,r,a),await this.renderAndWrite("base/prisma.config.ts.hbs","prisma.config.ts",s,r,a)),t.orm.includes("drizzle")&&await Ks(this.fileWriter,t,i,r,a),t.auth!=="none"){const n=qn.composeGenerators(t),l=await Zs(t,this.fileWriter.getBaseDir(),n);for(const d of l)!d.success&&d.error&&a.push(d.error)}}async renderAndWrite(t,s,r,a,i){try{const o=await this.templateEngine.renderToFile(t,s,{context:r}),n=await this.fileWriter.writeFile(o,{dryRun:this.options.dryRun,overwrite:this.options.overwrite});n.error&&i.push(`Failed to generate ${s}: ${n.error}`),n.written&&a.push(n.filePath)}catch(o){const n=o instanceof Error?o.message:String(o);i.push(`Failed to generate ${s}: ${n}`),console.error(`Failed to generate ${s}:`,o)}}getBaseDir(){return this.fileWriter.getBaseDir()}clearCaches(){this.templateEngine.clearCache(),this.registry.clear()}}class Y{static{c(this,"Z")}static{p(this,"ModuleGenerator")}project;config;constructor(t){this.config=t,this.project=new Xt}generate(){const t=this.config.name,s=Y.toPascalCase(t),r=this.config.routePrefix||Y.toKebabCase(t),a={controller:`${t}.controller.ts`,module:`${t}.module.ts`,service:`${t}.service.ts`};return this.generateService(s,t),this.generateController(s,t,r),this.generateModuleFile(s,t),this.config.dtos&&(this.generateDTOs(s,t),a.dto=`dto/create-${Y.toKebabCase(t)}.dto.ts`),this.config.entity&&(this.generateEntity(s,t),a.entity=`entities/${t}.entity.ts`),a}generateService(t,s){const r=k.join(this.config.outputDir,`${s}.service.ts`),a=this.project.createSourceFile(r,"",{overwrite:!0});a.addImportDeclaration({moduleSpecifier:"@nestjs/common",namedImports:["Injectable"]}),a.addClass({decorators:[{arguments:[],name:"Injectable"}],isExported:!0,methods:[{name:"create",parameters:[{name:`create${t}Dto`,type:`Create${t}Dto`}],returnType:"void",statements:["// Create logic here"]},{name:"findAll",returnType:`${t}[]`,statements:["// Find all logic here","return []"]},{name:"findOne",parameters:[{name:"id",type:"string"}],returnType:t,statements:["// Find one logic here",`return { id } as ${t}`]},{name:"update",parameters:[{name:"id",type:"string"},{name:`update${t}Dto`,type:`Update${t}Dto`}],returnType:"void",statements:["// Update logic here"]},{name:"remove",parameters:[{name:"id",type:"string"}],returnType:"void",statements:["// Remove logic here"]}],name:`${t}Service`})}generateController(t,s,r){const a=k.join(this.config.outputDir,`${s}.controller.ts`),i=this.project.createSourceFile(a,"",{overwrite:!0});i.addImportDeclaration({moduleSpecifier:"@nestjs/common",namedImports:["Controller","Get","Post","Body","Param","Put","Delete"]}),this.config.enableSwagger&&i.addImportDeclaration({moduleSpecifier:"@nestjs/swagger",namedImports:["ApiOperation","ApiResponse","ApiTags"]}),i.addImportDeclaration({moduleSpecifier:`./${s}.service`,namedImports:[`${t}Service`]});const o=[{arguments:[`'${r}'`],name:"Controller"}];this.config.enableSwagger&&o.unshift({arguments:[`'${t}'`],name:"ApiTags"}),i.addClass({ctors:[{parameters:[{isReadonly:!0,name:`${s}Service`,scope:xi.Private,type:`${t}Service`}]}],decorators:o,isExported:!0,methods:[{decorators:[{name:"Post"}],name:"create",parameters:[{decorators:[{name:"Body"}],name:"createDto"}],statements:[`return this.${s}Service.create(createDto)`]},{decorators:[{name:"Get"}],name:"findAll",statements:[`return this.${s}Service.findAll()`]},{decorators:[{arguments:["':id'"],name:"Get"}],name:"findOne",parameters:[{decorators:[{arguments:["'id'"],name:"Param"}],name:"id"}],statements:[`return this.${s}Service.findOne(id)`]},{decorators:[{arguments:["':id'"],name:"Put"}],name:"update",parameters:[{decorators:[{arguments:["'id'"],name:"Param"}],name:"id"},{decorators:[{name:"Body"}],name:"updateDto"}],statements:[`return this.${s}Service.update(id, updateDto)`]},{decorators:[{arguments:["':id'"],name:"Delete"}],name:"remove",parameters:[{decorators:[{arguments:["'id'"],name:"Param"}],name:"id"}],statements:[`return this.${s}Service.remove(id)`]}],name:`${t}Controller`})}generateModuleFile(t,s){const r=k.join(this.config.outputDir,`${s}.module.ts`),a=this.project.createSourceFile(r,"",{overwrite:!0});a.addImportDeclaration({moduleSpecifier:"@nestjs/common",namedImports:["Module"]}),a.addImportDeclaration({moduleSpecifier:`./${s}.service`,namedImports:[`${t}Service`]}),a.addImportDeclaration({moduleSpecifier:`./${s}.controller`,namedImports:[`${t}Controller`]}),a.addClass({decorators:[{arguments:[`{
396
+ controllers: [${t}Controller],
397
+ providers: [${t}Service],
398
+ }`],name:"Module"}],isExported:!0,name:`${t}Module`})}generateDTOs(t,s){const r=k.join(this.config.outputDir,"dto"),a=k.join(r,`create-${Y.toKebabCase(s)}.dto.ts`),i=k.join(r,`update-${Y.toKebabCase(s)}.dto.ts`);this.project.createSourceFile(a,"",{overwrite:!0}).addClass({isExported:!0,name:`Create${t}Dto`,properties:[{hasExclamationToken:!0,name:"title",type:"string"},{name:"description",type:"string | undefined"}]});const o=this.project.createSourceFile(i,"",{overwrite:!0});o.addImportDeclaration({moduleSpecifier:"@nestjs/mapped-types",namedImports:["PartialType"]}),o.addImportDeclaration({moduleSpecifier:`./create-${Y.toKebabCase(s)}.dto`,namedImports:[`Create${t}Dto`]}),o.addTypeAlias({isExported:!0,name:`Update${t}Dto`,type:`PartialType(Create${t}Dto)`})}generateEntity(t,s){const r=k.join(this.config.outputDir,`entities/${Y.toKebabCase(s)}.entity.ts`),a=this.project.createSourceFile(r,"",{overwrite:!0});this.config.ormType==="typeorm"?(a.addImportDeclaration({moduleSpecifier:"typeorm",namedImports:["Column","CreateDateColumn","Entity","PrimaryGeneratedColumn","UpdateDateColumn"]}),a.addClass({decorators:[{arguments:[],name:"Entity"}],isExported:!0,name:`${t}Entity`,properties:[{decorators:[{arguments:["'uuid'"],name:"PrimaryGeneratedColumn"}],hasExclamationToken:!0,name:"id",type:"string"},{decorators:[{arguments:[],name:"Column"}],hasExclamationToken:!0,name:"title",type:"string"},{decorators:[{arguments:[],name:"Column"}],name:"description",type:"string | undefined"},{decorators:[{arguments:[],name:"CreateDateColumn"}],hasExclamationToken:!0,name:"createdAt",type:"Date"},{decorators:[{arguments:[],name:"UpdateDateColumn"}],hasExclamationToken:!0,name:"updatedAt",type:"Date"}]})):a.addClass({isExported:!0,name:`${t}Entity`,properties:[{hasExclamationToken:!0,name:"id",type:"string"},{hasExclamationToken:!0,name:"title",type:"string"},{name:"description",type:"string | undefined"},{hasExclamationToken:!0,name:"createdAt",type:"Date"},{hasExclamationToken:!0,name:"updatedAt",type:"Date"}]})}async save(){await this.project.save()}static toPascalCase(t){return t.split(/[-_]/u).map(s=>s.charAt(0).toUpperCase()+s.slice(1).toLowerCase()).join("")}static toKebabCase(t){return t.replaceAll(/([a-z])([A-Z])/gu,"$1-$2").replaceAll(/\s+/gu,"-").toLowerCase()}}const Gc=/Resolved|Resolving/iu,Bc=/Downloaded?|downloaded/iu,Vc=/Link(ed|ing)/iu,Jc=/saved (to )?(lockfile|bun)/iu;function ni(e){const t=[],s=e.split(`
399
+ `);for(const r of s){const a=r.trim();if(a){if(Gc.test(a)){t.push({message:"Resolving packages...",phase:"resolve"});continue}if(Bc.test(a)){t.push({message:"Downloading...",phase:"download"});continue}if(Vc.test(a)){t.push({message:"Linking packages...",phase:"link"});continue}if(a.includes("packages installed")){t.push({message:a,percentage:100,phase:"link"});continue}if(Jc.test(a)){t.push({message:"Saving lockfile...",phase:"postinstall"});continue}(a.includes("[script]")||a.includes("postinstall"))&&t.push({message:"Running postinstall scripts...",phase:"postinstall"})}}return t}c(ni,"Lc"),p(ni,"parseBunText");class Zc{static{c(this,"Oc")}static{p(this,"BunInstaller")}async install(t,s,r){const a=ke("bun install",[],{cwd:t,shell:!0,signal:r,stdio:["ignore","pipe","pipe"]});let i="";const o=p(l=>{const d=l.toString();i+=d;const u=ni(d);for(const m of u)s?.(m)},"handleData");a.stderr.on("data",o),a.stdout.on("data",o);const[n]=await Promise.race([J(a,"close"),J(a,"error").then(([l])=>{const d=l;throw d.code==="ENOENT"||d.code==="EINVAL"?new Error(["Bun is not installed or not found in your PATH.",""," Install Bun: https://bun.sh",""," Then restart your terminal and try again."].join(`
400
+ `)):new Error(d.message)})]);if(n===0){s?.({message:"Done",percentage:100,phase:"complete"});return}throw new Error(i.trim()||`bun install exited with code ${n}`)}}const Wc=/^(\d+)\/(\d+)\s+resolving/iu,Kc=/^(\d+)\/(\d+)\s+extract:/iu,Yc=/^(\d+)\/(\d+)\s+(\S+)/iu,Xc=/^(\d+)ms\s+(.*)/iu;function pi(e){const t=[],s=e.split(`
401
+ `);for(const r of s){const a=r.trim();if(a.includes("resolving")){const i=Wc.exec(a);i?t.push({completed:Number(i[1]),message:"Resolving packages...",percentage:Math.round(Number(i[1])/Number(i[2])*100),phase:"resolve",total:Number(i[2])}):t.push({message:"Resolving packages...",phase:"resolve"});continue}if(a.includes("extract:")||a.includes("http fetch")){const i=Kc.exec(a)||Yc.exec(a);i?t.push({completed:Number(i[1]),message:"Downloading...",percentage:Math.round(Number(i[1])/Number(i[2])*100),phase:"download",total:Number(i[2])}):t.push({message:"Downloading...",phase:"download"});continue}if(a.includes("timing")){const i=Xc.exec(a);if(i){const o=i[2]??"";o.includes("build")?t.push({message:"Building dependencies...",phase:"build"}):o.includes("link")&&t.push({message:"Linking packages...",phase:"link"})}continue}a.includes("postinstall")&&!a.includes("timing")&&t.push({message:"Running postinstall scripts...",phase:"postinstall"})}return t}c(pi,"Mc"),p(pi,"parseNpmText");class ed{static{c(this,"Hc")}static{p(this,"NpmInstaller")}async install(t,s,r){const a=ke("npm install --loglevel silly",[],{cwd:t,shell:!0,signal:r,stdio:["ignore","pipe","pipe"]});let i="";const o=p(l=>{const d=l.toString();i+=d;const u=pi(d);for(const m of u)s?.(m)},"handleData");a.stderr.on("data",o),a.stdout.on("data",()=>{});const[n]=await Promise.race([J(a,"close"),J(a,"error").then(([l])=>{const d=l;throw d.code==="ENOENT"||d.code==="EINVAL"?new Error(["npm is not installed or not found in your PATH.",""," Install npm: https://nodejs.org/en/download",""," Then restart your terminal and try again."].join(`
402
+ `)):new Error(d.message)})]);if(n===0){s?.({message:"Done",percentage:100,phase:"complete"});return}throw new Error(i.trim()||`npm install exited with code ${n}`)}}const td={importing_done:{message:"Finishing installation...",phase:"link"},importing_started:{message:"Linking packages...",phase:"link"},resolution_done:{message:"Downloading packages...",phase:"download"},resolution_started:{message:"Resolving packages...",phase:"resolve"}},sd={fetched:{message:"Downloading packages...",phase:"download"},found_in_store:{message:"Reusing cached packages...",phase:"download"},imported:{message:"Linking packages...",phase:"link"},resolved:{message:"Resolving packages...",phase:"resolve"}};function li(e){if(!e||typeof e!="object")return null;const t="name"in e?e.name:void 0,s="level"in e?e.level:void 0,r="message"in e?e.message:void 0;if(t==="pnpm:install-check"&&s==="warn"&&typeof r=="string"&&r.startsWith("Unsupported platform"))return null;if(s==="error"||s==="warn"){const a="err"in e?e.err:void 0,i=a&&typeof a=="object"&&"message"in a?a.message:void 0;let o=JSON.stringify(e);return typeof r=="string"?o=r:typeof i=="string"&&(o=i),{message:o,phase:"download"}}switch(t){case"pnpm:stage":return"stage"in e&&typeof e.stage=="string"?td[e.stage]??null:null;case"pnpm:progress":return"status"in e&&typeof e.status=="string"?sd[e.status]??null:null;case"pnpm:lifecycle":return{message:"Running dependency scripts...",phase:"build"};default:return null}}c(li,"Bc"),p(li,"parsePnpmLine");function ci(e){const t=[e.code&&`code: ${e.code}`,e.syscall&&`operation: ${e.syscall}`,e.path&&`path: ${e.path}`,e.message].filter(Boolean);return[...new Set(t)].join(`
403
+ `)}c(ci,"Zc"),p(ci,"formatProcessError");class rd{static{c(this,"Vc")}static{p(this,"PnpmInstaller")}async install(t,s,r){const a=process.env.NEST_ARCH_SCENARIO_PNPM_STORE_DIR,i=a?` --store-dir "${a.replaceAll('"','\\"')}"`:"",o=ke(`pnpm install --reporter ndjson${i}`,[],{cwd:t,shell:!0,signal:r,stdio:["ignore","pipe","pipe"]});let n="",l="",d="";o.stdout.on("data",h=>{const g=h.toString();l+=g,d+=g;const v=d.split(`
404
+ `);d=v.pop()??"";for(const b of v)try{const z=JSON.parse(b),L=li(z);L&&s&&s(L)}catch{}}),o.stderr.on("data",h=>{n+=h.toString()});const[u]=await Promise.race([J(o,"close"),J(o,"error").then(([h])=>{const g=h;throw g.code==="ENOENT"||g.code==="EINVAL"?new Error(["pnpm is not installed or not found in your PATH.",""," Install pnpm: npm install -g pnpm"," Or enable Corepack: corepack enable && corepack prepare pnpm@latest --activate",""," Then restart your terminal and try again."].join(`
405
+ `)):new Error(ci(g))})]);if(u===0){s?.({message:"Done",percentage:100,phase:"complete"});return}const m=`${n.trim()}
406
+ ${l.slice(-2e4)}`.trim();throw new Error(`pnpm install exited with code ${u}${m?`
407
+ ${m}`:""}`)}}function di(e){switch(e.type){case"step":{const t=e.displayName??"";return t.includes("Resolution")?{message:"Resolving packages...",phase:"resolve"}:t.includes("Fetch")?{message:"Downloading...",phase:"download"}:t.includes("Link")?{message:"Linking packages...",phase:"link"}:t.includes("Build")?{message:"Building dependencies...",phase:"build"}:{message:t||"Installing...",phase:"postinstall"}}case"progress":{const t=typeof e.data=="object"?e.data:void 0,s=t?.current,r=t?.total;return s!==void 0&&r!==void 0?{completed:s,message:"Processing...",percentage:Math.round(s/r*100),phase:"download",total:r}:null}case"success":return{message:typeof e.data=="string"?e.data:e.data?.message??"Done",percentage:100,phase:"complete"};case"error":return{message:typeof e.data=="string"?e.data:e.data?.message??"Error",phase:"download"};default:return null}}c(di,"Jc"),p(di,"parseYarnLine");class ad{static{c(this,"Wc")}static{p(this,"YarnInstaller")}async install(t,s,r){const a=ke("yarn install --json",[],{cwd:t,shell:!0,signal:r,stdio:["ignore","pipe","pipe"]});let i="";a.stdout.on("data",n=>{const l=n.toString().split(`
408
+ `).filter(Boolean);for(const d of l)try{const u=JSON.parse(d),m=di(u);m&&s&&s(m)}catch{}}),a.stderr.on("data",n=>{i+=n.toString()});const[o]=await Promise.race([J(a,"close"),J(a,"error").then(([n])=>{const l=n;throw l.code==="ENOENT"||l.code==="EINVAL"?new Error(["Yarn is not installed or not found in your PATH.",""," Install Yarn: npm install -g yarn",""," Then restart your terminal and try again."].join(`
409
+ `)):new Error(l.message)})]);if(o===0){s?.({message:"Done",percentage:100,phase:"complete"});return}throw new Error(i.trim()||`yarn install exited with code ${o}`)}}function ui(e){switch(e){case"pnpm":return new rd;case"npm":return new ed;case"yarn":return new ad;case"bun":return new Zc;default:throw new Error(`Unhandled package manager: ${e}`)}}c(ui,"kr"),p(ui,"createPackageInstaller");const id=ie(Kt);class od{static{c(this,"Yc")}static{p(this,"ProjectPipeline")}outputDir;generatorOptions;skipFormatter;state;context;events;constructor(t,s){this.outputDir=t;const{skipFormatter:r=!1,...a}=s;this.generatorOptions=a,this.skipFormatter=r}emit(t){this.events?.onStageChange?.(t)}addPhase(t){this.state.phases.push(t)}async execute(t,s){this.context=t,this.events=s,this.state={generatedFiles:[],installSucceeded:!1,phases:[]};const r=[this.phaseGenerateFiles,this.phaseInstallAgentSkills,this.phaseSetupLinter,this.phaseGitInit,this.phaseInstallDependencies,this.phaseRunFormatter,this.phaseFormatterCommit];for(const i of r)if(!await i.call(this))break;this.emit("complete");const a=this.state.phases.every(i=>i.success||i.skipped);return this.buildResult(a)}async phaseGenerateFiles(){this.emit("generate-files");const t=new Nc(this.outputDir,this.generatorOptions);try{const s=await t.generate(this.context);return this.state.generatedFiles.push(...s.generatedFiles),s.success?(this.addPhase({phase:"generate-files",success:!0}),!0):(this.addPhase({error:s.error,phase:"generate-files",success:!1}),!1)}catch(s){return this.addPhase({error:s instanceof Error?s.message:String(s),phase:"generate-files",success:!1}),!1}}async phaseInstallAgentSkills(){if(!this.context.addons.includes("agent-skills"))return this.addPhase({phase:"install-agent-skills",skipped:!0,success:!0}),!0;this.emit("install-agent-skills");try{const t=await Promise.all(this.state.generatedFiles.map(async i=>[i,es("sha256").update(await N(Wt(i)?i:E(this.outputDir,i))).digest("hex")])),s=await as(this.outputDir,this.context),r=[];for(const[i,o]of t)try{es("sha256").update(await N(Wt(i)?i:E(this.outputDir,i))).digest("hex")!==o&&r.push(i)}catch{r.push(i)}const a=[...s.failed.length>0?[s.failed.map(i=>`${i.name}: ${i.error}`).join(", ")]:[],...r.length>0?[`Agent skills changed generated files: ${r.join(", ")}`]:[]].join("; ")||void 0;this.addPhase({phase:"install-agent-skills",success:s.failed.length===0&&r.length===0,...a?{error:a}:{}})}catch(t){this.addPhase({error:t instanceof Error?t.message:String(t),phase:"install-agent-skills",success:!1})}return!0}async phaseSetupLinter(){if(this.context.formatter==="none")return this.addPhase({phase:"setup-linter",skipped:!0,success:!0}),!0;this.emit("setup-linter");try{const t=await hs(this.outputDir,this.context);if(!t.success)return this.addPhase({error:t.message,phase:"setup-linter",success:!1}),!1;const s=this.context.addons.includes("ultracite")&&this.context.formatter!=="biome"?await bs(this.outputDir,this.context.formatter):{success:!0};return s.success?(this.addPhase({phase:"setup-linter",success:!0}),!0):(this.addPhase({error:s.message??"Rule injection failed",phase:"setup-linter",success:!1}),!1)}catch(t){return this.addPhase({error:t instanceof Error?t.message:String(t),phase:"setup-linter",success:!1}),!1}}async phaseGitInit(){if(!this.context.initGit)return this.addPhase({phase:"initialize-git",skipped:!0,success:!0}),this.addPhase({phase:"initial-commit",skipped:!0,success:!0}),!0;this.emit("initialize-git");try{await Ze(this.outputDir)||await Je(this.outputDir),this.addPhase({phase:"initialize-git",success:!0})}catch(s){this.addPhase({error:s instanceof Error?s.message:String(s),phase:"initialize-git",success:!1})}const{3:t}=this.state.phases;if(t?.success??!1){this.emit("initial-commit");try{await qe(this.outputDir),await xe(this.outputDir,"Initial project scaffold"),this.addPhase({phase:"initial-commit",success:!0})}catch(s){this.addPhase({error:s instanceof Error?s.message:String(s),phase:"initial-commit",success:!1})}}else this.addPhase({phase:"initial-commit",skipped:!0,success:!0});return!0}async phaseInstallDependencies(){if(!this.context.installDependencies)return this.addPhase({phase:"install-dependencies",skipped:!0,success:!0}),!0;this.emit("install-dependencies");try{await ui(this.context.packageManager).install(this.outputDir,t=>{this.events?.onInstallProgress?.(t)}),this.context.addons.includes("husky")&&await this.ensureHuskyPreCommitHook(),this.state.installSucceeded=!0,this.addPhase({phase:"install-dependencies",success:!0})}catch(t){this.addPhase({error:t instanceof Error?t.message:String(t),phase:"install-dependencies",success:!1})}return!0}async ensureHuskyPreCommitHook(){const t=E(this.outputDir,".husky","pre-commit");try{await N(t,"utf-8")}catch{await Yt(E(this.outputDir,".husky"),{recursive:!0}),await U(t,`yarn test
410
+ `,"utf-8")}await id("git",["config","core.hooksPath",".husky/_"],{cwd:this.outputDir}),await Yt(E(this.outputDir,".husky","_"),{recursive:!0}),await U(E(this.outputDir,".husky","_","pre-commit"),`#!/usr/bin/env sh
411
+ . "$(dirname -- "$0")/h"
412
+ `,"utf-8"),await U(E(this.outputDir,".husky","_","h"),`#!/usr/bin/env sh
413
+
414
+ export PATH="node_modules/.bin:$PATH"
415
+ hook="$(basename -- "$0")"
416
+ sh -e ".husky/$hook"
417
+ `,"utf-8")}async phaseRunFormatter(){if(this.skipFormatter)return this.addPhase({phase:"run-formatter",skipped:!0,success:!0}),!0;if(!(this.state.installSucceeded&&this.context.formatter!=="none"))return this.addPhase({phase:"run-formatter",skipped:!0,success:!0}),!0;this.emit("run-formatter");try{const t=await ls(this.context.packageManager,this.outputDir);this.addPhase({phase:"run-formatter",success:t.success,...t.success?{}:{error:t.error}})}catch(t){this.addPhase({error:t instanceof Error?t.message:String(t),phase:"run-formatter",success:!1})}return!0}async phaseFormatterCommit(){const t=this.state.phases.find(s=>s.phase==="run-formatter");if(!(this.context.initGit&&t?.success&&!t.skipped))return this.addPhase({phase:"formatter-commit",skipped:!0,success:!0}),!0;this.emit("formatter-commit");try{await qe(this.outputDir),await is(this.outputDir)&&await xe(this.outputDir,"Apply formatter"),this.addPhase({phase:"formatter-commit",success:!0})}catch(s){this.addPhase({error:s instanceof Error?s.message:String(s),phase:"formatter-commit",success:!1})}return!0}buildResult(t){return{generatedFiles:this.state.generatedFiles,outputDir:this.outputDir,phases:this.state.phases,success:t}}}function nd(e){return{addons:e.addons,api:e.api,architecture:e.architecture,auth:e.auth,database:e.database,description:`${e.projectName} NestJS application`,extras:e.extras,formatter:e.formatter,httpProvider:e.httpProvider,initGit:e.initGit==="yes",installDependencies:e.installDependencies==="yes",microservices:e.microservices,orm:e.orm,packageManager:e.packageManager,prismaVersion:e.prismaVersion,projectName:e.projectName,projectType:e.projectType,ultraciteAgents:e.ultraciteAgents,ultraciteEditors:e.ultraciteEditors,ultraciteHooks:e.ultraciteHooks,ultraciteInstallSkill:e.ultraciteInstallSkill}}c(nd,"buildGeneratorContext");function mi(e){return ts.NEST_ARCH_BETA_MODE?E(vi(),"test-projects",e):E(process.cwd(),e)}c(mi,"getOutputDir");function pd(){const e=import.meta.dirname;if(e){const s=E(e,"templates");if(ki(s))return s}return E(e??process.cwd(),"..","..","..","..","packages","core","templates")}c(pd,"getTemplatesDir");async function hi(e,t,s){const r=pd(),a=new od(t,{cacheTemplates:!0,generatorVersion:Si,templatesDir:r});try{const i=await a.execute(e,s),o={"formatter-commit":"Commit formatting","generate-files":"Generate project","initial-commit":"Initial commit","initialize-git":"Initialize Git","install-dependencies":"Install dependencies","run-formatter":"Run formatter","setup-linter":"Setup linter"},n=i.phases.filter(m=>!m.success&&!m.skipped&&m.error).map(m=>`${o[m.phase]||m.phase} failed:
418
+ ${m.error}`);if(!i.success)return{dependenciesInstalled:!1,isGitInitialized:!1,message:n.join(`
419
+
420
+ `)||"Project generation failed",nextSteps:[],outputDir:t,phases:i.phases,success:!1};const l=c(m=>i.phases.some(h=>h.phase===m&&h.success&&!h.skipped),"phaseCompleted"),d=l("install-dependencies"),u=await it(t,e);return{dependenciesInstalled:d,isGitInitialized:l("initialize-git"),message:`Project created with ${i.generatedFiles.length} files`,nextSteps:ot(e,u,{dependenciesInstalled:d,outputDir:t}),outputDir:t,phases:i.phases,success:!0}}catch(i){return{dependenciesInstalled:!1,isGitInitialized:!1,message:`Failed to generate project: ${i instanceof Error?i.message:String(i)}`,nextSteps:[],outputDir:t,phases:[],success:!1}}}c(hi,"generateProjectContext");async function ld(e,t){return await hi(nd(e),mi(e.projectName),t)}c(ld,"generateProject");export{rt as C,at as D,As as J,ne as a,ld as b,hi as c,ts as e,mi as g};