wexts 4.0.0 → 4.1.5
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.
- package/README.md +49 -49
- package/bin/wexts.cjs +2 -2
- package/package.json +153 -148
- package/templates/.dockerignore +43 -43
- package/templates/.env.example +17 -17
- package/templates/Dockerfile +60 -60
- package/templates/Procfile +1 -1
- package/templates/README.md +67 -67
- package/templates/api-sdk.ts +115 -115
- package/templates/docker-compose.yml +34 -34
- package/templates/nestjs-api/.env.example +3 -3
- package/templates/nestjs-api/README.md +87 -87
- package/templates/nestjs-api/nest-cli.json +6 -6
- package/templates/nestjs-api/package.json +40 -40
- package/templates/nestjs-api/prisma/migrations/20251123205437_init/migration.sql +24 -24
- package/templates/nestjs-api/prisma/migrations/migration_lock.toml +3 -3
- package/templates/nestjs-api/prisma/schema.prisma +29 -29
- package/templates/nestjs-api/src/app.module.ts +17 -17
- package/templates/nestjs-api/src/auth/auth.controller.ts +27 -27
- package/templates/nestjs-api/src/auth/auth.module.ts +37 -37
- package/templates/nestjs-api/src/auth/auth.service.ts +86 -86
- package/templates/nestjs-api/src/auth/dto/auth.dto.ts +22 -22
- package/templates/nestjs-api/src/auth/guards/jwt-auth.guard.ts +5 -5
- package/templates/nestjs-api/src/auth/strategies/jwt.strategy.ts +27 -27
- package/templates/nestjs-api/src/main.ts +32 -32
- package/templates/nestjs-api/src/prisma/prisma.module.ts +9 -9
- package/templates/nestjs-api/src/prisma/prisma.service.ts +14 -14
- package/templates/nestjs-api/src/todos/dto/todo.dto.ts +24 -24
- package/templates/nestjs-api/src/todos/todos.controller.ts +39 -39
- package/templates/nestjs-api/src/todos/todos.module.ts +11 -11
- package/templates/nestjs-api/src/todos/todos.service.ts +53 -53
- package/templates/nestjs-api/src/users/users.controller.ts +14 -14
- package/templates/nestjs-api/src/users/users.module.ts +12 -12
- package/templates/nestjs-api/src/users/users.service.ts +19 -19
- package/templates/nestjs-api/tsconfig.json +39 -39
- package/templates/nextjs-web/README.md +76 -76
- package/templates/nextjs-web/app/actions/auth.ts +108 -108
- package/templates/nextjs-web/app/dashboard/error.tsx +39 -39
- package/templates/nextjs-web/app/dashboard/loading.tsx +14 -14
- package/templates/nextjs-web/app/dashboard/page.tsx +5 -5
- package/templates/nextjs-web/app/globals.css +93 -93
- package/templates/nextjs-web/app/layout.tsx +29 -29
- package/templates/nextjs-web/app/login/page.tsx +5 -5
- package/templates/nextjs-web/app/page.tsx +28 -28
- package/templates/nextjs-web/app/register/page.tsx +5 -5
- package/templates/nextjs-web/components/ui/button.tsx +56 -56
- package/templates/nextjs-web/components/ui/card.tsx +79 -79
- package/templates/nextjs-web/components/ui/input.tsx +25 -25
- package/templates/nextjs-web/components/ui/label.tsx +24 -24
- package/templates/nextjs-web/features/auth/LoginForm.tsx +140 -140
- package/templates/nextjs-web/features/auth/RegisterForm.tsx +159 -159
- package/templates/nextjs-web/features/auth/api.ts +35 -35
- package/templates/nextjs-web/features/auth/index.ts +3 -3
- package/templates/nextjs-web/features/dashboard/DashboardView.tsx +204 -204
- package/templates/nextjs-web/features/dashboard/api.ts +9 -9
- package/templates/nextjs-web/features/dashboard/components.tsx +74 -74
- package/templates/nextjs-web/features/dashboard/index.ts +3 -3
- package/templates/nextjs-web/hooks/index.ts +4 -4
- package/templates/nextjs-web/lib/api-client.ts +89 -89
- package/templates/nextjs-web/lib/api.ts +115 -115
- package/templates/nextjs-web/lib/axios-global-config.ts +17 -17
- package/templates/nextjs-web/lib/utils.ts +6 -6
- package/templates/nextjs-web/lib/wexts-client.ts +4 -4
- package/templates/nextjs-web/next-env.d.ts +6 -6
- package/templates/nextjs-web/next.config.ts +20 -20
- package/templates/nextjs-web/package.json +37 -37
- package/templates/nextjs-web/postcss.config.js +6 -6
- package/templates/nextjs-web/tailwind.config.ts +69 -69
- package/templates/nextjs-web/tsconfig.json +41 -41
- package/templates/nixpacks.toml +11 -11
- package/templates/root-package.json +31 -31
- package/templates/server.ts +66 -66
- package/templates/tsconfig.json +30 -30
- package/dist/chunk-2KAQYLVN.js +0 -1
- package/dist/chunk-2KAQYLVN.js.map +0 -1
- package/dist/chunk-2LJVUMXW.js +0 -228
- package/dist/chunk-2LJVUMXW.js.map +0 -1
- package/dist/chunk-7QKLIVRF.js +0 -94
- package/dist/chunk-7QKLIVRF.js.map +0 -1
- package/dist/chunk-7WULUGLH.mjs +0 -22
- package/dist/chunk-7WULUGLH.mjs.map +0 -1
- package/dist/chunk-BG56B4DE.js +0 -106
- package/dist/chunk-BG56B4DE.js.map +0 -1
- package/dist/chunk-CLM5PNSG.mjs +0 -496
- package/dist/chunk-CLM5PNSG.mjs.map +0 -1
- package/dist/chunk-DNLGCKTT.js +0 -31
- package/dist/chunk-DNLGCKTT.js.map +0 -1
- package/dist/chunk-JHOVXH3X.mjs +0 -65
- package/dist/chunk-JHOVXH3X.mjs.map +0 -1
- package/dist/chunk-MXINIFPC.js +0 -105
- package/dist/chunk-MXINIFPC.js.map +0 -1
- package/dist/chunk-SE32ZPOZ.js +0 -496
- package/dist/chunk-SE32ZPOZ.js.map +0 -1
- package/dist/chunk-UAL54DVV.mjs +0 -106
- package/dist/chunk-UAL54DVV.mjs.map +0 -1
- package/dist/chunk-WCKSKU3C.js +0 -65
- package/dist/chunk-WCKSKU3C.js.map +0 -1
- package/dist/chunk-WU6FW77M.mjs +0 -105
- package/dist/chunk-WU6FW77M.mjs.map +0 -1
- package/dist/chunk-XE4OXN2W.js +0 -12
- package/dist/chunk-XE4OXN2W.js.map +0 -1
- package/dist/chunk-YBM3IJEA.mjs +0 -94
- package/dist/chunk-YBM3IJEA.mjs.map +0 -1
- package/dist/chunk-YN6WIWNQ.mjs +0 -228
- package/dist/chunk-YN6WIWNQ.mjs.map +0 -1
- package/dist/chunk-YSLEF5C5.mjs +0 -1
- package/dist/chunk-YSLEF5C5.mjs.map +0 -1
- package/dist/chunk-ZX7QIN24.mjs +0 -31
- package/dist/chunk-ZX7QIN24.mjs.map +0 -1
- package/dist/cli/index.d.mts +0 -11
- package/dist/cli/index.d.ts +0 -11
- package/dist/cli/index.js +0 -332
- package/dist/cli/index.js.map +0 -1
- package/dist/cli/index.mjs +0 -334
- package/dist/cli/index.mjs.map +0 -1
- package/dist/client/index.d.mts +0 -21
- package/dist/client/index.d.ts +0 -21
- package/dist/client/index.js +0 -12
- package/dist/client/index.js.map +0 -1
- package/dist/client/index.mjs +0 -12
- package/dist/client/index.mjs.map +0 -1
- package/dist/codegen/index.d.mts +0 -2
- package/dist/codegen/index.d.ts +0 -2
- package/dist/codegen/index.js +0 -15
- package/dist/codegen/index.js.map +0 -1
- package/dist/codegen/index.mjs +0 -15
- package/dist/codegen/index.mjs.map +0 -1
- package/dist/decorators-BT1FFqN0.d.mts +0 -29
- package/dist/decorators-DvS58PqC.d.ts +0 -29
- package/dist/dev-server/index.d.mts +0 -1
- package/dist/dev-server/index.d.ts +0 -1
- package/dist/dev-server/index.js +0 -13
- package/dist/dev-server/index.js.map +0 -1
- package/dist/dev-server/index.mjs +0 -13
- package/dist/dev-server/index.mjs.map +0 -1
- package/dist/index-7QeQEf37.d.ts +0 -92
- package/dist/index-7RvU-jGE.d.mts +0 -66
- package/dist/index-7RvU-jGE.d.ts +0 -66
- package/dist/index-8nzxy0NN.d.mts +0 -92
- package/dist/index-Co5ZsLqq.d.ts +0 -58
- package/dist/index-D94W1__r.d.mts +0 -58
- package/dist/index-DQmyVp6F.d.mts +0 -27
- package/dist/index-KL_1BrQb.d.ts +0 -27
- package/dist/index.d.mts +0 -258
- package/dist/index.d.ts +0 -258
- package/dist/index.js +0 -410
- package/dist/index.js.map +0 -1
- package/dist/index.mjs +0 -410
- package/dist/index.mjs.map +0 -1
- package/dist/nest/index.d.mts +0 -3
- package/dist/nest/index.d.ts +0 -3
- package/dist/nest/index.js +0 -38
- package/dist/nest/index.js.map +0 -1
- package/dist/nest/index.mjs +0 -38
- package/dist/nest/index.mjs.map +0 -1
- package/dist/next/index.d.mts +0 -66
- package/dist/next/index.d.ts +0 -66
- package/dist/next/index.js +0 -226
- package/dist/next/index.js.map +0 -1
- package/dist/next/index.mjs +0 -188
- package/dist/next/index.mjs.map +0 -1
- package/dist/rpc/index.d.mts +0 -2
- package/dist/rpc/index.d.ts +0 -2
- package/dist/rpc/index.js +0 -23
- package/dist/rpc/index.js.map +0 -1
- package/dist/rpc/index.mjs +0 -23
- package/dist/rpc/index.mjs.map +0 -1
- package/dist/runtime/index.d.mts +0 -55
- package/dist/runtime/index.d.ts +0 -55
- package/dist/runtime/index.js +0 -213
- package/dist/runtime/index.js.map +0 -1
- package/dist/runtime/index.mjs +0 -213
- package/dist/runtime/index.mjs.map +0 -1
- package/dist/types/index.d.mts +0 -12
- package/dist/types/index.d.ts +0 -12
- package/dist/types/index.js +0 -2
- package/dist/types/index.js.map +0 -1
- package/dist/types/index.mjs +0 -3
- package/dist/types/index.mjs.map +0 -1
- package/dist/types-7d_fC-C3.d.mts +0 -32
- package/dist/types-7d_fC-C3.d.ts +0 -32
- package/dist/vercel-builder/index.d.mts +0 -58
- package/dist/vercel-builder/index.d.ts +0 -58
- package/dist/vercel-builder/index.js +0 -330
- package/dist/vercel-builder/index.js.map +0 -1
- package/dist/vercel-builder/index.mjs +0 -330
- package/dist/vercel-builder/index.mjs.map +0 -1
- package/templates/nestjs-api/package-lock.json +0 -5623
- package/templates/nextjs-web/package-lock.json +0 -3254
package/dist/cli/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["/Volumes/Projects/wexts/packages/dist/cli/index.js","../../src/cli/index.ts"],"names":["createCliProgram","program","Command","name","description","version","command","option","action","projectName","options","createProject","template","skipInstall","FusionDevServer","server","start","apiPath","api","webPath","web","webPort","Number","port","apiPort","useProxy","proxy","alias","type","generateRpcClient","manifest","projectPath","resolve","project","outputPath","output","logger","success","services","length","Error","scaffoldRpcService","skipGenerate","existsSync","runScript","cwd","process","env","PORT","startWextsRuntime","configPath","config","runtimeConfig","loadRuntimeConfig","dev","buildVercelOutput","result","rootDir","apiProjectPath","rpcOutputPath","runtimeConfigPath","skipCodegen","skipBuild","nodeVersion","maxDuration","warnings","warning","warn","errors","error","exit","runDoctor","security","pkgPath","join","push","pkg","JSON","parse","readFileSync","packageManager","startsWith","dir","readAllText","findTemplatePath","templatePath","detectPackageManager","toKebabCase","toPascalCase","toCamelCase","className","script","platform","runCommand","candidate","dirs","absolute","text","entry","walk","value","split","toLowerCase","filePath","pathToFileUrl","mod","createRequire","argv","parseAsync"],"mappings":"AAAA;AACA;AACE;AACF,uDAA6B;AAC7B;AACE;AACF,uDAA6B;AAC7B;AACA;ACNA,sCAAwB;AACxB,+DAAoB;AACpB,uEAAsB;AACtB,8CAA0B;AAC1B,gCAA8B;AAQvB,SAASA,gBAAAA,CAAAA,EAAAA;AACZ,EAAA,MAAMC,QAAAA,EAAU,IAAIC,uBAAAA,CAAAA,CAAAA;AAEpBD,EAAAA,OAAAA,CACKE,IAAAA,CAAK,OAAA,CAAA,CACLC,WAAAA,CAAY,oEAAA,CAAA,CACZC,OAAAA,CAAQ,OAAA,CAAA;AAEbJ,EAAAA,OAAAA,CACKK,OAAAA,CAAQ,uBAAA,CAAA,CACRF,WAAAA,CAAY,8DAAA,CAAA,CACZG,MAAAA,CAAO,2BAAA,EAA6B,2CAAA,EAA6C,UAAA,CAAA,CACjFA,MAAAA,CAAO,gBAAA,EAAkB,8BAAA,EAAgC,KAAA,CAAA,CACzDC,MAAAA,CAAO,MAAA,CAAOC,WAAAA,EAAqBC,OAAAA,EAAAA,GAAAA;AAChC,IAAA,MAAMC,aAAAA,CAAcF,WAAAA,EAAaC,OAAAA,CAAQE,QAAAA,EAAU;ADT/D,MCSiEC,WAAAA,EAAaH,OAAAA,CAAQG;ADRtF,ICQkG,CAAA,CAAA;ADPlG,ECQQ,CAAA,CAAA;AAEJZ,EAAAA,OAAAA,CACKK,OAAAA,CAAQ,KAAA,CAAA,CACRF,WAAAA,CAAY,mCAAA,CAAA,CACZG,MAAAA,CAAO,kBAAA,EAAoB,qBAAA,EAAuB,YAAA,CAAA,CAClDA,MAAAA,CAAO,kBAAA,EAAoB,qBAAA,EAAuB,YAAA,CAAA,CAClDA,MAAAA,CAAO,mBAAA,EAAqB,qBAAA,EAAuB,MAAA,CAAA,CACnDA,MAAAA,CAAO,mBAAA,EAAqB,qBAAA,EAAuB,MAAA,CAAA,CACnDA,MAAAA,CAAO,SAAA,EAAW,mDAAA,EAAqD,KAAA,CAAA,CACvEC,MAAAA,CAAO,MAAA,CAAOE,OAAAA,EAAAA,GAAAA;AACX,IAAA,MAAM,EAAEI,gBAAe,EAAA,EAAK,MAAM,4DAAA,CAAO,wBAAA,GAAA;AACzC,IAAA,MAAMC,OAAAA,EAAS,IAAID,eAAAA,CAAAA,CAAAA;AACnB,IAAA,MAAMC,MAAAA,CAAOC,KAAAA,CAAM;ADhB/B,MCiBgBC,OAAAA,EAASP,OAAAA,CAAQQ,GAAAA;ADhBjC,MCiBgBC,OAAAA,EAAST,OAAAA,CAAQU,GAAAA;ADhBjC,MCiBgBC,OAAAA,EAASC,MAAAA,CAAOZ,OAAAA,CAAQa,IAAI,CAAA;ADhB5C,MCiBgBC,OAAAA,EAASF,MAAAA,CAAOZ,OAAAA,CAAQc,OAAO,CAAA;ADhB/C,MCiBgBC,QAAAA,EAAUf,OAAAA,CAAQgB;ADhBlC,ICiBY,CAAA,CAAA;ADhBZ,ECiBQ,CAAA,CAAA;AAEJzB,EAAAA,OAAAA,CACKK,OAAAA,CAAQ,wBAAA,CAAA,CACRqB,KAAAA,CAAM,GAAA,CAAA,CACNvB,WAAAA,CAAY,iEAAA,CAAA,CACZG,MAAAA,CAAO,sBAAA,EAAwB,wBAAA,EAA0B,YAAA,CAAA,CACzDA,MAAAA,CAAO,qBAAA,EAAuB,2CAAA,EAA6C,sBAAA,CAAA,CAC3EC,MAAAA,CAAO,MAAA,CAAOoB,IAAAA,EAA0BzB,IAAAA,EAA0BO,OAAAA,EAAAA,GAAAA;AAC/D,IAAA,GAAA,CAAI,CAACkB,KAAAA,GAAQA,KAAAA,IAAS,KAAA,EAAO;AACzB,MAAA,MAAM,EAAEC,kBAAiB,EAAA,EAAK,MAAM,4DAAA,CAAO,qBAAA,GAAA;AAC3C,MAAA,MAAMC,SAAAA,EAAW,MAAMD,iBAAAA,CAAkB;ADvBzD,QCwBoBE,WAAAA,EAAkBC,IAAAA,CAAAA,OAAAA,CAAQtB,OAAAA,CAAQuB,OAAO,CAAA;ADvB7D,QCwBoBC,UAAAA,EAAiBF,IAAAA,CAAAA,OAAAA,CAAQtB,OAAAA,CAAQyB,MAAM;ADvB3D,MCwBgB,CAAA,CAAA;AACAC,MAAAA,uBAAAA,CAAOC,OAAAA,CAAQ,CAAA,+BAAA,EAAkCP,QAAAA,CAASQ,QAAAA,CAASC,MAAM,CAAA,YAAA,CAAc,CAAA;AACvF,MAAA,MAAA;ADvBhB,ICwBY;AAEA,IAAA,GAAA,CAAIX,KAAAA,IAAS,SAAA,EAAW;AACpB,MAAA,GAAA,CAAI,CAACzB,IAAAA,EAAM,MAAM,IAAIqC,KAAAA,CAAM,wDAAA,CAAA;AAC3B,MAAA,MAAMC,kBAAAA,CAAwBT,IAAAA,CAAAA,OAAAA,CAAQtB,OAAAA,CAAQuB,OAAO,CAAA,EAAG9B,IAAAA,CAAAA;AACxDiC,MAAAA,uBAAAA,CAAOC,OAAAA,CAAQ,CAAA,oBAAA,EAAuBlC,IAAAA,CAAAA,0CAAAA,CAAgD,CAAA;AACtF,MAAA,MAAA;ADxBhB,ICyBY;AAEA,IAAA,MAAM,IAAIqC,KAAAA,CAAM,CAAA,mBAAA,EAAsBZ,IAAAA,CAAAA,sCAAAA,CAA4C,CAAA;ADzB9F,EC0BQ,CAAA,CAAA;AAEJ3B,EAAAA,OAAAA,CACKK,OAAAA,CAAQ,SAAA,CAAA,CACRF,WAAAA,CAAY,8BAAA,CAAA,CACZG,MAAAA,CAAO,sBAAA,EAAwB,wBAAA,EAA0B,YAAA,CAAA,CACzDA,MAAAA,CAAO,qBAAA,EAAuB,2CAAA,EAA6C,sBAAA,CAAA,CAC3EC,MAAAA,CAAO,MAAA,CAAOE,OAAAA,EAAAA,GAAAA;AACX,IAAA,MAAM,EAAEmB,kBAAiB,EAAA,EAAK,MAAM,4DAAA,CAAO,qBAAA,GAAA;AAC3C,IAAA,MAAMC,SAAAA,EAAW,MAAMD,iBAAAA,CAAkB;AD/BrD,MCgCgBE,WAAAA,EAAkBC,IAAAA,CAAAA,OAAAA,CAAQtB,OAAAA,CAAQuB,OAAO,CAAA;AD/BzD,MCgCgBC,UAAAA,EAAiBF,IAAAA,CAAAA,OAAAA,CAAQtB,OAAAA,CAAQyB,MAAM;AD/BvD,ICgCY,CAAA,CAAA;AACAC,IAAAA,uBAAAA,CAAOC,OAAAA,CAAQ,CAAA,+BAAA,EAAkCP,QAAAA,CAASQ,QAAAA,CAASC,MAAM,CAAA,YAAA,CAAc,CAAA;AD/BnG,ECgCQ,CAAA,CAAA;AAEJtC,EAAAA,OAAAA,CACKK,OAAAA,CAAQ,OAAA,CAAA,CACRF,WAAAA,CAAY,sCAAA,CAAA,CACZG,MAAAA,CAAO,iBAAA,EAAmB,kCAAA,EAAoC,KAAA,CAAA,CAC9DA,MAAAA,CAAO,sBAAA,EAAwB,wBAAA,EAA0B,YAAA,CAAA,CACzDA,MAAAA,CAAO,qBAAA,EAAuB,2CAAA,EAA6C,sBAAA,CAAA,CAC3EC,MAAAA,CAAO,MAAA,CAAOE,OAAAA,EAAAA,GAAAA;AACX,IAAA,GAAA,CAAI,CAACA,OAAAA,CAAQgC,aAAAA,GAAmBC,EAAAA,CAAAA,UAAAA,CAAWjC,OAAAA,CAAQuB,OAAO,CAAA,EAAG;AACzD,MAAA,MAAM,EAAEJ,kBAAiB,EAAA,EAAK,MAAM,4DAAA,CAAO,qBAAA,GAAA;AAC3C,MAAA,MAAMA,iBAAAA,CAAkB;ADtCxC,QCuCoBE,WAAAA,EAAkBC,IAAAA,CAAAA,OAAAA,CAAQtB,OAAAA,CAAQuB,OAAO,CAAA;ADtC7D,QCuCoBC,UAAAA,EAAiBF,IAAAA,CAAAA,OAAAA,CAAQtB,OAAAA,CAAQyB,MAAM;ADtC3D,MCuCgB,CAAA,CAAA;ADtChB,ICuCY;AACAS,IAAAA,SAAAA,CAAU,OAAA,EAAS;ADtC/B,MCsCiCC,GAAAA,EAAKC,OAAAA,CAAQD,GAAAA,CAAG;ADrCjD,ICqCoD,CAAA,CAAA;ADpCpD,ECqCQ,CAAA,CAAA;AAEJ5C,EAAAA,OAAAA,CACKK,OAAAA,CAAQ,OAAA,CAAA,CACRF,WAAAA,CAAY,oCAAA,CAAA,CACZG,MAAAA,CAAO,qBAAA,EAAuB,4BAAA,EAA8B,oBAAA,CAAA,CAC5DA,MAAAA,CAAO,mBAAA,EAAqB,mBAAA,mBAAqBuC,OAAAA,CAAQC,GAAAA,CAAIC,IAAAA,UAAQ,QAAA,CAAA,CACrExC,MAAAA,CAAO,MAAA,CAAOE,OAAAA,EAAAA,GAAAA;AACX,IAAA,MAAM,EAAEuC,kBAAiB,EAAA,EAAK,MAAM,4DAAA,CAAO,qBAAA,GAAA;AAC3C,IAAA,MAAMC,WAAAA,EAAkBlB,IAAAA,CAAAA,OAAAA,CAAQtB,OAAAA,CAAQyC,MAAM,CAAA;AAC9C,IAAA,MAAMC,cAAAA,EAAmBT,EAAAA,CAAAA,UAAAA,CAAWO,UAAAA,EAAAA,EAC9B,MAAMG,iBAAAA,CAAkBH,UAAAA,EAAAA,EACxB,CAAC,CAAA;AACP,IAAA,MAAMD,iBAAAA,CAAkB;AD5CpC,MC6CgB,GAAGG,aAAAA;AD5CnB,MC6CgB7B,IAAAA,EAAMD,MAAAA,CAAOZ,OAAAA,CAAQa,IAAI,CAAA;AD5CzC,MC6CgB+B,GAAAA,EAAK;AD5CrB,IC6CY,CAAA,CAAA;AD5CZ,EC6CQ,CAAA,CAAA;AAEJrD,EAAAA,OAAAA,CACKK,OAAAA,CAAQ,cAAA,CAAA,CACRF,WAAAA,CAAY,4CAAA,CAAA,CACZG,MAAAA,CAAO,sBAAA,EAAwB,wBAAA,EAA0B,YAAA,CAAA,CACzDA,MAAAA,CAAO,qBAAA,EAAuB,2BAAA,EAA6B,sBAAA,CAAA,CAC3DA,MAAAA,CAAO,qBAAA,EAAuB,4BAAA,EAA8B,oBAAA,CAAA,CAC5DA,MAAAA,CAAO,gBAAA,EAAkB,qBAAA,EAAuB,KAAA,CAAA,CAChDA,MAAAA,CAAO,cAAA,EAAgB,yBAAA,EAA2B,KAAA,CAAA,CAClDA,MAAAA,CAAO,0BAAA,EAA4B,qCAAA,EAAuC,IAAA,CAAA,CAC1EA,MAAAA,CAAO,0BAAA,EAA4B,sCAAA,EAAwC,IAAA,CAAA,CAC3EC,MAAAA,CAAO,MAAA,CAAOE,OAAAA,EAAAA,GAAAA;AASX,IAAA,MAAM,EAAE6C,kBAAiB,EAAA,EAAK,MAAM,4DAAA,CAAO,4BAAA,GAAA;AAC3C,IAAA,MAAMC,OAAAA,EAAS,MAAMD,iBAAAA,CAAkB;AD/DnD,MCgEgBE,OAAAA,EAASX,OAAAA,CAAQD,GAAAA,CAAG,CAAA;AD/DpC,MCgEgBa,cAAAA,EAAgBhD,OAAAA,CAAQuB,OAAAA;AD/DxC,MCgEgB0B,aAAAA,EAAejD,OAAAA,CAAQyB,MAAAA;AD/DvC,MCgEgByB,iBAAAA,EAAmBlD,OAAAA,CAAQyC,MAAAA;AD/D3C,MCgEgBU,WAAAA,EAAanD,OAAAA,CAAQmD,WAAAA;AD/DrC,MCgEgBC,SAAAA,EAAWpD,OAAAA,CAAQoD,SAAAA;AD/DnC,MCgEgBC,WAAAA,EAAarD,OAAAA,CAAQqD,WAAAA;AD/DrC,MCgEgBC,WAAAA,EAAa1C,MAAAA,CAAOZ,OAAAA,CAAQsD,WAAW;AD/DvD,ICgEY,CAAA,CAAA;AACA,IAAA,GAAA,CAAIR,MAAAA,CAAOS,QAAAA,CAAS1B,OAAAA,EAAS,CAAA,EAAG;AAC5B,MAAA,IAAA,CAAA,MAAW2B,QAAAA,GAAWV,MAAAA,CAAOS,QAAAA,EAAU7B,uBAAAA,CAAO+B,IAAAA,CAAKD,OAAAA,CAAAA;AD/DnE,ICgEY;AACA,IAAA,GAAA,CAAIV,MAAAA,CAAOY,MAAAA,CAAO7B,OAAAA,EAAS,CAAA,EAAG;AAC1B,MAAA,IAAA,CAAA,MAAW8B,MAAAA,GAASb,MAAAA,CAAOY,MAAAA,EAAQhC,uBAAAA,CAAOiC,KAAAA,CAAMA,KAAAA,CAAAA;AAChDvB,MAAAA,OAAAA,CAAQwB,IAAAA,CAAK,CAAA,CAAA;AD/D7B,ICgEY;AACAlC,IAAAA,uBAAAA,CAAOC,OAAAA,CAAQ,6CAAA,CAAA;AD/D3B,ECgEQ,CAAA,CAAA;AAEJpC,EAAAA,OAAAA,CACKK,OAAAA,CAAQ,QAAA,CAAA,CACRF,WAAAA,CAAY,sCAAA,CAAA,CACZG,MAAAA,CAAO,YAAA,EAAc,8BAAA,EAAgC,KAAA,CAAA,CACrDC,MAAAA,CAAO,MAAA,CAAOE,OAAAA,EAAAA,GAAAA;AACX,IAAA,MAAM8C,OAAAA,EAASe,SAAAA,CAAUzB,OAAAA,CAAQD,GAAAA,CAAG,CAAA,EAAInC,OAAAA,CAAQ8D,QAAQ,CAAA;AACxD,IAAA,IAAA,CAAA,MAAWN,QAAAA,GAAWV,MAAAA,CAAOS,QAAAA,EAAU7B,uBAAAA,CAAO+B,IAAAA,CAAKD,OAAAA,CAAAA;AACnD,IAAA,IAAA,CAAA,MAAWG,MAAAA,GAASb,MAAAA,CAAOY,MAAAA,EAAQhC,uBAAAA,CAAOiC,KAAAA,CAAMA,KAAAA,CAAAA;AAChD,IAAA,GAAA,CAAIb,MAAAA,CAAOY,MAAAA,CAAO7B,OAAAA,EAAS,CAAA,EAAGO,OAAAA,CAAQwB,IAAAA,CAAK,CAAA,CAAA;AAC3ClC,IAAAA,uBAAAA,CAAOC,OAAAA,CAAQ3B,OAAAA,CAAQ8D,SAAAA,EAAW,0BAAA,EAA4B,gBAAA,CAAA;ADpE1E,ECqEQ,CAAA,CAAA;AAEJ,EAAA,OAAOvE,OAAAA;AACX;AAtKgBD,qCAAAA,gBAAAA,EAAAA,kBAAAA,CAAAA;AA6KT,SAASuE,SAAAA,CAAU1B,GAAAA,EAAa2B,SAAAA,EAAW,KAAA,EAAK;AACnD,EAAA,MAAMhB,OAAAA,EAAuB;AD1EjC,IC0EmCY,MAAAA,EAAQ,CAAA,CAAA;ADzE3C,ICyE+CH,QAAAA,EAAU,CAAA;ADxEzD,ECwE4D,CAAA;AACxD,EAAA,MAAMQ,QAAAA,EAAeC,IAAAA,CAAAA,IAAAA,CAAK7B,GAAAA,EAAK,cAAA,CAAA;AAE/B,EAAA,GAAA,CAAI,CAAIF,EAAAA,CAAAA,UAAAA,CAAW8B,OAAAA,CAAAA,EAAU;AACzBjB,IAAAA,MAAAA,CAAOY,MAAAA,CAAOO,IAAAA,CAAK,yBAAA,CAAA;AACnB,IAAA,OAAOnB,MAAAA;ADxEf,ECyEI;AAEA,EAAA,MAAMoB,IAAAA,EAAMC,IAAAA,CAAKC,KAAAA,CAASC,EAAAA,CAAAA,YAAAA,CAAaN,OAAAA,EAAS,MAAA,CAAA,CAAA;AAChD,EAAA,GAAA,CAAI,iBAACG,GAAAA,mBAAII,cAAAA,6BAAgBC,UAAAA,mBAAW,OAAA,GAAA,EAAU;AAC1CzB,IAAAA,MAAAA,CAAOS,QAAAA,CAASU,IAAAA,CAAK,iCAAA,CAAA;ADzE7B,EC0EI;AAEA,EAAA,IAAA,CAAA,MAAWO,IAAAA,GAAO;AD1EtB,IC0EuB,UAAA;ADzEvB,ICyEmC;ADxEnC,EAAE,CAAC,ECwE6C;AACxC,IAAA,GAAA,CAAI,CAAIvC,EAAAA,CAAAA,UAAAA,CAAgB+B,IAAAA,CAAAA,IAAAA,CAAK7B,GAAAA,EAAKqC,GAAAA,CAAAA,CAAAA,EAAO;AACrC1B,MAAAA,MAAAA,CAAOS,QAAAA,CAASU,IAAAA,CAAK,CAAA,EAAA;AACzB,IAAA;AACJ,EAAA;AAEuBD,EAAAA;AACE,IAAA;AACzB,EAAA;AAEc,EAAA;AACKS,IAAAA;AAAkB,MAAA;AAAgB,MAAA;AAAoC,IAAA;AACjE,IAAA;AACG,MAAA;AACvB,IAAA;AACI,IAAA;AACmB,MAAA;AACvB,IAAA;AACJ,EAAA;AAEO3B,EAAAA;AACX;AAnCgBe;AAqCD5D;AACc+D,EAAAA;AACP3C,EAAAA;AACE,IAAA;AACpB,EAAA;AAEqBqD,EAAAA;AACF,EAAA;AACC,IAAA;AACpB,EAAA;AAE0B,EAAA;AAAa,IAAA;AAAK,EAAA;AAE3B,EAAA;AACUrD,IAAAA;AAAmC,MAAA;AAAK,IAAA;AAC3CsD,IAAAA;AAA8E,MAAA;AAAK,IAAA;AACnFA,IAAAA;AAA8E,MAAA;AAAK,IAAA;AACjFX,IAAAA;AACAA,IAAAA;AACZjE,MAAAA;AACG,MAAA;AACO,MAAA;AACP,MAAA;AACA,QAAA;AACK,QAAA;AACH,QAAA;AACA,QAAA;AACC,QAAA;AACZ,MAAA;AACiB,MAAA;AACN,QAAA;AACX,MAAA;AACK,IAAA;AACW,EAAA;AACA4E,IAAAA;AAAuD,MAAA;AAAK,IAAA;AAC5D,EAAA;AACAA,IAAAA;AAAuD,MAAA;AAAK,IAAA;AAC7E,EAAA;AACa,IAAA;AACpB,EAAA;AAE0B,EAAA;AACXC,IAAAA;AAAoC,MAAA;AAAYvD,IAAAA;AAC/D,EAAA;AACJ;AA5CepB;AA8CA8B;AACS8C,EAAAA;AACCC,EAAAA;AACC9B,EAAAA;AACJ,EAAA;AAAa,IAAA;AAAK,EAAA;AACdgB,EAAAA;AD3DE;AACA;AACA;AC6DLe,qBAAAA;AACRC,aAAAA;AD3Da;AACA;AACA;AACA;AACA;AC6D3B;AACD;AAjBejD;AAmBoB/B;AACXmC,EAAAA;AACGyC,EAAAA;AACVN,EAAAA;AAA4B,IAAA;AAAOW,IAAAA;AAAU,EAAA;AAAC,IAAA;AAAOA,IAAAA;ADtD1C,EAAA;ACuDbX,EAAAA;AACf;AALSpC;AAOWtC;AACSA,EAAAA;AAAiBuC,IAAAA;AAAY,IAAA;AAA0B+C,IAAAA;AAAqB,EAAA;AAC5E,EAAA;AACFtF,IAAAA;AACvB,EAAA;AACJ;AALSuF;AAOAP;AACkBZ,EAAAA;AAChB,EAAA;AACX;AAHSY;AAKAF;AACc,EAAA;AACS,IAAA;AACA,IAAA;AACHvC,IAAAA;ADjDD,EAAA;ACoDAiD,EAAAA;AAC5B;AARSV;AAUyBW;AACnB,EAAA;AACa,EAAA;AACErB,IAAAA;AACHsB,IAAAA;AACKA,IAAAA;AACF,MAAA;AACHjB,QAAAA;AACf,MAAA;AACJ,IAAA;AACJ,EAAA;AACOkB,EAAAA;AACX;AAZSd;AAcgB;AACCD,EAAAA;AAAsB,IAAA;AAAiBgB,EAAAA;AACnCxB,IAAAA;AACG,IAAA;AAClB,IAAA;AAACsB,MAAAA;AD/CY,IAAA;ACgDxB,EAAA;AACJ;AANSG;AAQyB;AACT,EAAA;AACzB;AAFSZ;AAIaa;AACQC,EAAAA;AAC9B;AAFSb;AAIyB;AACfA,EAAAA;AACSc,EAAAA;AAC5B;AAHSb;AAKcc;AACFA,EAAAA;AACrB;AAFSC;AAIMnD;AACa,EAAA;AACF,IAAA;AACKoD,IAAAA;AAC3B,EAAA;AAEgBC,EAAAA;AACIxD,EAAAA;AACGuD,EAAAA;AAC3B;AATepD;AAWcsD;AAGR7D;AACE8D,EAAAA;AACFvC,IAAAA;AACA,IAAA;AACjB,EAAA;AACJ;ADjD4B;AACA;AACA;AACA","file":"/Volumes/Projects/wexts/packages/dist/cli/index.js","sourcesContent":[null,"#!/usr/bin/env node\n\nimport { Command } from 'commander';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { spawnSync } from 'child_process';\nimport { createRequire } from 'module';\nimport * as pc from 'picocolors';\nimport { logger } from '../core/logger';\n\ninterface CommonOptions {\n cwd?: string;\n}\n\nexport function createCliProgram(): Command {\n const program = new Command();\n\n program\n .name('wexts')\n .description('Wexts - production-focused single-runtime Next.js + NestJS toolkit')\n .version('3.0.3');\n\n program\n .command('create <project-name>')\n .description('Create a compatibility project from bundled legacy templates')\n .option('-t, --template <template>', 'Legacy template to use (monorepo|api|web)', 'monorepo')\n .option('--skip-install', 'Skip dependency installation', false)\n .action(async (projectName: string, options: { template: string; skipInstall: boolean }) => {\n await createProject(projectName, options.template, { skipInstall: options.skipInstall });\n });\n\n program\n .command('dev')\n .description('Start local development processes')\n .option('-a, --api <path>', 'Path to API project', './apps/api')\n .option('-w, --web <path>', 'Path to Web project', './apps/web')\n .option('-p, --port <port>', 'Port for web server', '3000')\n .option('--api-port <port>', 'Port for API server', '5050')\n .option('--proxy', 'Enable development proxy on a separate proxy port', false)\n .action(async (options: { api: string; web: string; port: string; apiPort: string; proxy: boolean }) => {\n const { FusionDevServer } = await import('../dev-server/index.js');\n const server = new FusionDevServer();\n await server.start({\n apiPath: options.api,\n webPath: options.web,\n webPort: Number(options.port),\n apiPort: Number(options.apiPort),\n useProxy: options.proxy,\n });\n });\n\n program\n .command('generate [type] [name]')\n .alias('g')\n .description('Generate RPC manifest/client, or scaffold a minimal RPC service')\n .option('-p, --project <path>', 'Path to NestJS project', './apps/api')\n .option('-o, --output <path>', 'Output directory for generated RPC client', './apps/web/lib/wexts')\n .action(async (type: string | undefined, name: string | undefined, options: { project: string; output: string }) => {\n if (!type || type === 'rpc') {\n const { generateRpcClient } = await import('../codegen/index.js');\n const manifest = await generateRpcClient({\n projectPath: path.resolve(options.project),\n outputPath: path.resolve(options.output),\n });\n logger.success(`Generated Wexts RPC client for ${manifest.services.length} service(s).`);\n return;\n }\n\n if (type === 'service') {\n if (!name) throw new Error('Service name is required: wexts generate service hello');\n await scaffoldRpcService(path.resolve(options.project), name);\n logger.success(`Created RPC service ${name}. Run wexts generate to update the client.`);\n return;\n }\n\n throw new Error(`Unknown generator \"${type}\". Supported generators: rpc, service.`);\n });\n\n program\n .command('codegen')\n .description('Alias for wexts generate rpc')\n .option('-p, --project <path>', 'Path to NestJS project', './apps/api')\n .option('-o, --output <path>', 'Output directory for generated RPC client', './apps/web/lib/wexts')\n .action(async (options: { project: string; output: string }) => {\n const { generateRpcClient } = await import('../codegen/index.js');\n const manifest = await generateRpcClient({\n projectPath: path.resolve(options.project),\n outputPath: path.resolve(options.output),\n });\n logger.success(`Generated Wexts RPC client for ${manifest.services.length} service(s).`);\n });\n\n program\n .command('build')\n .description('Build a Wexts project for production')\n .option('--skip-generate', 'Skip RPC generation before build', false)\n .option('-p, --project <path>', 'Path to NestJS project', './apps/api')\n .option('-o, --output <path>', 'Output directory for generated RPC client', './apps/web/lib/wexts')\n .action(async (options: { skipGenerate: boolean; project: string; output: string }) => {\n if (!options.skipGenerate && fs.existsSync(options.project)) {\n const { generateRpcClient } = await import('../codegen/index.js');\n await generateRpcClient({\n projectPath: path.resolve(options.project),\n outputPath: path.resolve(options.output),\n });\n }\n runScript('build', { cwd: process.cwd() });\n });\n\n program\n .command('start')\n .description('Start the production Wexts runtime')\n .option('-c, --config <path>', 'Runtime config module path', './wexts.runtime.js')\n .option('-p, --port <port>', 'Port to listen on', process.env.PORT ?? '3000')\n .action(async (options: { config: string; port: string }) => {\n const { startWextsRuntime } = await import('../runtime/index.js');\n const configPath = path.resolve(options.config);\n const runtimeConfig = fs.existsSync(configPath)\n ? await loadRuntimeConfig(configPath)\n : {};\n await startWextsRuntime({\n ...runtimeConfig,\n port: Number(options.port),\n dev: false,\n });\n });\n\n program\n .command('vercel-build')\n .description('Build for Vercel using Build Output API v3')\n .option('-p, --project <path>', 'Path to NestJS project', './apps/api')\n .option('-o, --output <path>', 'Output dir for RPC client', './apps/web/lib/wexts')\n .option('-c, --config <path>', 'Runtime config module path', './wexts.runtime.js')\n .option('--skip-codegen', 'Skip RPC generation', false)\n .option('--skip-build', 'Skip project build step', false)\n .option('--node-version <version>', 'Node.js version for Vercel function', '20')\n .option('--max-duration <seconds>', 'Max duration for serverless function', '30')\n .action(async (options: {\n project: string;\n output: string;\n config: string;\n skipCodegen: boolean;\n skipBuild: boolean;\n nodeVersion: string;\n maxDuration: string;\n }) => {\n const { buildVercelOutput } = await import('../vercel-builder/index.js');\n const result = await buildVercelOutput({\n rootDir: process.cwd(),\n apiProjectPath: options.project,\n rpcOutputPath: options.output,\n runtimeConfigPath: options.config,\n skipCodegen: options.skipCodegen,\n skipBuild: options.skipBuild,\n nodeVersion: options.nodeVersion,\n maxDuration: Number(options.maxDuration),\n });\n if (result.warnings.length > 0) {\n for (const warning of result.warnings) logger.warn(warning);\n }\n if (result.errors.length > 0) {\n for (const error of result.errors) logger.error(error);\n process.exit(1);\n }\n logger.success('Vercel build output ready at .vercel/output');\n });\n\n program\n .command('doctor')\n .description('Validate Wexts project configuration')\n .option('--security', 'Run security-specific checks', false)\n .action(async (options: { security: boolean }) => {\n const result = runDoctor(process.cwd(), options.security);\n for (const warning of result.warnings) logger.warn(warning);\n for (const error of result.errors) logger.error(error);\n if (result.errors.length > 0) process.exit(1);\n logger.success(options.security ? 'Security doctor passed.' : 'Doctor passed.');\n });\n\n return program;\n}\n\nexport interface DoctorResult {\n errors: string[];\n warnings: string[];\n}\n\nexport function runDoctor(cwd: string, security = false): DoctorResult {\n const result: DoctorResult = { errors: [], warnings: [] };\n const pkgPath = path.join(cwd, 'package.json');\n\n if (!fs.existsSync(pkgPath)) {\n result.errors.push('package.json not found.');\n return result;\n }\n\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));\n if (!pkg.packageManager?.startsWith('pnpm@')) {\n result.warnings.push('packageManager should pin pnpm.');\n }\n\n for (const dir of ['apps/api', 'apps/web']) {\n if (!fs.existsSync(path.join(cwd, dir))) {\n result.warnings.push(`${dir} not found; some Wexts commands may need explicit paths.`);\n }\n }\n\n if (fs.existsSync(path.join(cwd, 'apps/api')) && fs.existsSync(path.join(cwd, 'apps/web'))) {\n result.warnings.push('Development mode starts separate web/API processes. Single-port serving is the production `wexts start` runtime path.');\n }\n\n if (security) {\n const source = readAllText(cwd, ['apps/api/src', 'packages/templates/nestjs-api/src']);\n if (source.includes('default-secret')) {\n result.errors.push('JWT fallback \"default-secret\" found. Production apps must fail without a strong JWT_SECRET.');\n }\n if (/origin:\\s*['\"]\\*['\"]/.test(source)) {\n result.errors.push('Wildcard CORS origin found. Use an explicit origin allowlist.');\n }\n }\n\n return result;\n}\n\nasync function createProject(projectName: string, template: string, options: { skipInstall: boolean }): Promise<void> {\n const projectPath = path.join(process.cwd(), projectName);\n if (fs.existsSync(projectPath)) {\n throw new Error(`Directory already exists: ${projectName}`);\n }\n\n const templatePath = findTemplatePath();\n if (!templatePath) {\n throw new Error('Template directory not found in package.');\n }\n\n fs.mkdirSync(projectPath, { recursive: true });\n\n if (template === 'monorepo') {\n fs.mkdirSync(path.join(projectPath, 'apps'), { recursive: true });\n fs.cpSync(path.join(templatePath, 'nestjs-api'), path.join(projectPath, 'apps/api'), { recursive: true });\n fs.cpSync(path.join(templatePath, 'nextjs-web'), path.join(projectPath, 'apps/web'), { recursive: true });\n fs.writeFileSync(path.join(projectPath, 'pnpm-workspace.yaml'), \"packages:\\n - 'apps/*'\\n\");\n fs.writeFileSync(path.join(projectPath, 'package.json'), JSON.stringify({\n name: projectName,\n private: true,\n packageManager: 'pnpm@10.22.0',\n scripts: {\n dev: 'wexts dev',\n generate: 'wexts generate',\n build: 'wexts build',\n start: 'wexts start',\n doctor: 'wexts doctor',\n },\n devDependencies: {\n wexts: 'latest',\n },\n }, null, 2));\n } else if (template === 'api') {\n fs.cpSync(path.join(templatePath, 'nestjs-api'), projectPath, { recursive: true });\n } else if (template === 'web') {\n fs.cpSync(path.join(templatePath, 'nextjs-web'), projectPath, { recursive: true });\n } else {\n throw new Error(`Unknown template \"${template}\".`);\n }\n\n if (!options.skipInstall) {\n runCommand(detectPackageManager(projectPath), ['install'], projectPath);\n }\n}\n\nasync function scaffoldRpcService(apiProjectPath: string, rawName: string): Promise<void> {\n const serviceName = toKebabCase(rawName);\n const className = `${toPascalCase(serviceName)}Service`;\n const dir = path.join(apiProjectPath, 'src', serviceName);\n fs.mkdirSync(dir, { recursive: true });\n fs.writeFileSync(path.join(dir, `${serviceName}.service.ts`), `import { Injectable } from '@nestjs/common';\nimport { RpcMethod, RpcService } from 'wexts/nest';\n\n@Injectable()\n@RpcService({ name: '${toCamelCase(serviceName)}', requireAuth: false })\nexport class ${className} {\n @RpcMethod()\n async sayHello(name: string): Promise<string> {\n return \\`Hello, \\${name}!\\`;\n }\n}\n`);\n}\n\nfunction runScript(script: string, options: CommonOptions): void {\n const cwd = options.cwd ?? process.cwd();\n const packageManager = detectPackageManager(cwd);\n const args = packageManager === 'npm' ? ['run', script] : ['run', script];\n runCommand(packageManager, args, cwd);\n}\n\nfunction runCommand(command: string, args: string[], cwd: string): void {\n const result = spawnSync(command, args, { cwd, stdio: 'inherit', shell: process.platform === 'win32' });\n if (result.status !== 0) {\n throw new Error(`${command} ${args.join(' ')} failed with exit code ${result.status}`);\n }\n}\n\nfunction detectPackageManager(cwd: string): 'pnpm' | 'npm' {\n if (fs.existsSync(path.join(cwd, 'pnpm-lock.yaml'))) return 'pnpm';\n return 'npm';\n}\n\nfunction findTemplatePath(): string | undefined {\n const candidates = [\n path.resolve(__dirname, '../../templates'),\n path.resolve(__dirname, '../templates'),\n path.resolve(process.cwd(), 'packages/templates'),\n ];\n\n return candidates.find((candidate) => fs.existsSync(candidate));\n}\n\nfunction readAllText(cwd: string, dirs: string[]): string {\n let text = '';\n for (const dir of dirs) {\n const absolute = path.join(cwd, dir);\n if (!fs.existsSync(absolute)) continue;\n for (const file of walk(absolute)) {\n if (file.endsWith('.ts') || file.endsWith('.tsx') || file.endsWith('.js')) {\n text += fs.readFileSync(file, 'utf8');\n }\n }\n }\n return text;\n}\n\nfunction walk(dir: string): string[] {\n return fs.readdirSync(dir, { withFileTypes: true }).flatMap((entry) => {\n const absolute = path.join(dir, entry.name);\n if (entry.isDirectory()) return walk(absolute);\n return [absolute];\n });\n}\n\nfunction toKebabCase(value: string): string {\n return value.replace(/([a-z0-9])([A-Z])/g, '$1-$2').replace(/[_\\s]+/g, '-').toLowerCase();\n}\n\nfunction toPascalCase(value: string): string {\n return toKebabCase(value).split('-').map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join('');\n}\n\nfunction toCamelCase(value: string): string {\n const pascal = toPascalCase(value);\n return pascal.charAt(0).toLowerCase() + pascal.slice(1);\n}\n\nfunction pathToFileUrl(filePath: string): string {\n return `file://${filePath}`;\n}\n\nasync function loadRuntimeConfig(configPath: string): Promise<Record<string, unknown>> {\n if (configPath.endsWith('.mjs')) {\n const mod = await import(pathToFileUrl(configPath));\n return (mod.default ?? mod) as Record<string, unknown>;\n }\n\n const require = createRequire(__filename);\n const mod = require(configPath);\n return (mod.default ?? mod) as Record<string, unknown>;\n}\n\nconst invokedAsCli = process.argv[1]\n && (path.basename(process.argv[1]) === 'wexts' || path.basename(process.argv[1]) === 'wexts.cjs' || path.resolve(process.argv[1]).includes(`${path.sep}dist${path.sep}cli${path.sep}index`));\n\nif (invokedAsCli && !process.env.VITEST) {\n createCliProgram().parseAsync(process.argv).catch((error) => {\n logger.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n });\n}\n"]}
|
package/dist/cli/index.mjs
DELETED
|
@@ -1,334 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
logger
|
|
4
|
-
} from "../chunk-JHOVXH3X.mjs";
|
|
5
|
-
import {
|
|
6
|
-
__dirname,
|
|
7
|
-
__filename,
|
|
8
|
-
__name
|
|
9
|
-
} from "../chunk-7WULUGLH.mjs";
|
|
10
|
-
|
|
11
|
-
// src/cli/index.ts
|
|
12
|
-
import { Command } from "commander";
|
|
13
|
-
import * as fs from "fs";
|
|
14
|
-
import * as path from "path";
|
|
15
|
-
import { spawnSync } from "child_process";
|
|
16
|
-
import { createRequire } from "module";
|
|
17
|
-
function createCliProgram() {
|
|
18
|
-
const program = new Command();
|
|
19
|
-
program.name("wexts").description("Wexts - production-focused single-runtime Next.js + NestJS toolkit").version("3.0.3");
|
|
20
|
-
program.command("create <project-name>").description("Create a compatibility project from bundled legacy templates").option("-t, --template <template>", "Legacy template to use (monorepo|api|web)", "monorepo").option("--skip-install", "Skip dependency installation", false).action(async (projectName, options) => {
|
|
21
|
-
await createProject(projectName, options.template, {
|
|
22
|
-
skipInstall: options.skipInstall
|
|
23
|
-
});
|
|
24
|
-
});
|
|
25
|
-
program.command("dev").description("Start local development processes").option("-a, --api <path>", "Path to API project", "./apps/api").option("-w, --web <path>", "Path to Web project", "./apps/web").option("-p, --port <port>", "Port for web server", "3000").option("--api-port <port>", "Port for API server", "5050").option("--proxy", "Enable development proxy on a separate proxy port", false).action(async (options) => {
|
|
26
|
-
const { FusionDevServer } = await import("../dev-server/index.mjs");
|
|
27
|
-
const server = new FusionDevServer();
|
|
28
|
-
await server.start({
|
|
29
|
-
apiPath: options.api,
|
|
30
|
-
webPath: options.web,
|
|
31
|
-
webPort: Number(options.port),
|
|
32
|
-
apiPort: Number(options.apiPort),
|
|
33
|
-
useProxy: options.proxy
|
|
34
|
-
});
|
|
35
|
-
});
|
|
36
|
-
program.command("generate [type] [name]").alias("g").description("Generate RPC manifest/client, or scaffold a minimal RPC service").option("-p, --project <path>", "Path to NestJS project", "./apps/api").option("-o, --output <path>", "Output directory for generated RPC client", "./apps/web/lib/wexts").action(async (type, name, options) => {
|
|
37
|
-
if (!type || type === "rpc") {
|
|
38
|
-
const { generateRpcClient } = await import("../codegen/index.mjs");
|
|
39
|
-
const manifest = await generateRpcClient({
|
|
40
|
-
projectPath: path.resolve(options.project),
|
|
41
|
-
outputPath: path.resolve(options.output)
|
|
42
|
-
});
|
|
43
|
-
logger.success(`Generated Wexts RPC client for ${manifest.services.length} service(s).`);
|
|
44
|
-
return;
|
|
45
|
-
}
|
|
46
|
-
if (type === "service") {
|
|
47
|
-
if (!name) throw new Error("Service name is required: wexts generate service hello");
|
|
48
|
-
await scaffoldRpcService(path.resolve(options.project), name);
|
|
49
|
-
logger.success(`Created RPC service ${name}. Run wexts generate to update the client.`);
|
|
50
|
-
return;
|
|
51
|
-
}
|
|
52
|
-
throw new Error(`Unknown generator "${type}". Supported generators: rpc, service.`);
|
|
53
|
-
});
|
|
54
|
-
program.command("codegen").description("Alias for wexts generate rpc").option("-p, --project <path>", "Path to NestJS project", "./apps/api").option("-o, --output <path>", "Output directory for generated RPC client", "./apps/web/lib/wexts").action(async (options) => {
|
|
55
|
-
const { generateRpcClient } = await import("../codegen/index.mjs");
|
|
56
|
-
const manifest = await generateRpcClient({
|
|
57
|
-
projectPath: path.resolve(options.project),
|
|
58
|
-
outputPath: path.resolve(options.output)
|
|
59
|
-
});
|
|
60
|
-
logger.success(`Generated Wexts RPC client for ${manifest.services.length} service(s).`);
|
|
61
|
-
});
|
|
62
|
-
program.command("build").description("Build a Wexts project for production").option("--skip-generate", "Skip RPC generation before build", false).option("-p, --project <path>", "Path to NestJS project", "./apps/api").option("-o, --output <path>", "Output directory for generated RPC client", "./apps/web/lib/wexts").action(async (options) => {
|
|
63
|
-
if (!options.skipGenerate && fs.existsSync(options.project)) {
|
|
64
|
-
const { generateRpcClient } = await import("../codegen/index.mjs");
|
|
65
|
-
await generateRpcClient({
|
|
66
|
-
projectPath: path.resolve(options.project),
|
|
67
|
-
outputPath: path.resolve(options.output)
|
|
68
|
-
});
|
|
69
|
-
}
|
|
70
|
-
runScript("build", {
|
|
71
|
-
cwd: process.cwd()
|
|
72
|
-
});
|
|
73
|
-
});
|
|
74
|
-
program.command("start").description("Start the production Wexts runtime").option("-c, --config <path>", "Runtime config module path", "./wexts.runtime.js").option("-p, --port <port>", "Port to listen on", process.env.PORT ?? "3000").action(async (options) => {
|
|
75
|
-
const { startWextsRuntime } = await import("../runtime/index.mjs");
|
|
76
|
-
const configPath = path.resolve(options.config);
|
|
77
|
-
const runtimeConfig = fs.existsSync(configPath) ? await loadRuntimeConfig(configPath) : {};
|
|
78
|
-
await startWextsRuntime({
|
|
79
|
-
...runtimeConfig,
|
|
80
|
-
port: Number(options.port),
|
|
81
|
-
dev: false
|
|
82
|
-
});
|
|
83
|
-
});
|
|
84
|
-
program.command("vercel-build").description("Build for Vercel using Build Output API v3").option("-p, --project <path>", "Path to NestJS project", "./apps/api").option("-o, --output <path>", "Output dir for RPC client", "./apps/web/lib/wexts").option("-c, --config <path>", "Runtime config module path", "./wexts.runtime.js").option("--skip-codegen", "Skip RPC generation", false).option("--skip-build", "Skip project build step", false).option("--node-version <version>", "Node.js version for Vercel function", "20").option("--max-duration <seconds>", "Max duration for serverless function", "30").action(async (options) => {
|
|
85
|
-
const { buildVercelOutput } = await import("../vercel-builder/index.mjs");
|
|
86
|
-
const result = await buildVercelOutput({
|
|
87
|
-
rootDir: process.cwd(),
|
|
88
|
-
apiProjectPath: options.project,
|
|
89
|
-
rpcOutputPath: options.output,
|
|
90
|
-
runtimeConfigPath: options.config,
|
|
91
|
-
skipCodegen: options.skipCodegen,
|
|
92
|
-
skipBuild: options.skipBuild,
|
|
93
|
-
nodeVersion: options.nodeVersion,
|
|
94
|
-
maxDuration: Number(options.maxDuration)
|
|
95
|
-
});
|
|
96
|
-
if (result.warnings.length > 0) {
|
|
97
|
-
for (const warning of result.warnings) logger.warn(warning);
|
|
98
|
-
}
|
|
99
|
-
if (result.errors.length > 0) {
|
|
100
|
-
for (const error of result.errors) logger.error(error);
|
|
101
|
-
process.exit(1);
|
|
102
|
-
}
|
|
103
|
-
logger.success("Vercel build output ready at .vercel/output");
|
|
104
|
-
});
|
|
105
|
-
program.command("doctor").description("Validate Wexts project configuration").option("--security", "Run security-specific checks", false).action(async (options) => {
|
|
106
|
-
const result = runDoctor(process.cwd(), options.security);
|
|
107
|
-
for (const warning of result.warnings) logger.warn(warning);
|
|
108
|
-
for (const error of result.errors) logger.error(error);
|
|
109
|
-
if (result.errors.length > 0) process.exit(1);
|
|
110
|
-
logger.success(options.security ? "Security doctor passed." : "Doctor passed.");
|
|
111
|
-
});
|
|
112
|
-
return program;
|
|
113
|
-
}
|
|
114
|
-
__name(createCliProgram, "createCliProgram");
|
|
115
|
-
function runDoctor(cwd, security = false) {
|
|
116
|
-
const result = {
|
|
117
|
-
errors: [],
|
|
118
|
-
warnings: []
|
|
119
|
-
};
|
|
120
|
-
const pkgPath = path.join(cwd, "package.json");
|
|
121
|
-
if (!fs.existsSync(pkgPath)) {
|
|
122
|
-
result.errors.push("package.json not found.");
|
|
123
|
-
return result;
|
|
124
|
-
}
|
|
125
|
-
const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf8"));
|
|
126
|
-
if (!pkg.packageManager?.startsWith("pnpm@")) {
|
|
127
|
-
result.warnings.push("packageManager should pin pnpm.");
|
|
128
|
-
}
|
|
129
|
-
for (const dir of [
|
|
130
|
-
"apps/api",
|
|
131
|
-
"apps/web"
|
|
132
|
-
]) {
|
|
133
|
-
if (!fs.existsSync(path.join(cwd, dir))) {
|
|
134
|
-
result.warnings.push(`${dir} not found; some Wexts commands may need explicit paths.`);
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
if (fs.existsSync(path.join(cwd, "apps/api")) && fs.existsSync(path.join(cwd, "apps/web"))) {
|
|
138
|
-
result.warnings.push("Development mode starts separate web/API processes. Single-port serving is the production `wexts start` runtime path.");
|
|
139
|
-
}
|
|
140
|
-
if (security) {
|
|
141
|
-
const source = readAllText(cwd, [
|
|
142
|
-
"apps/api/src",
|
|
143
|
-
"packages/templates/nestjs-api/src"
|
|
144
|
-
]);
|
|
145
|
-
if (source.includes("default-secret")) {
|
|
146
|
-
result.errors.push('JWT fallback "default-secret" found. Production apps must fail without a strong JWT_SECRET.');
|
|
147
|
-
}
|
|
148
|
-
if (/origin:\s*['"]\*['"]/.test(source)) {
|
|
149
|
-
result.errors.push("Wildcard CORS origin found. Use an explicit origin allowlist.");
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
return result;
|
|
153
|
-
}
|
|
154
|
-
__name(runDoctor, "runDoctor");
|
|
155
|
-
async function createProject(projectName, template, options) {
|
|
156
|
-
const projectPath = path.join(process.cwd(), projectName);
|
|
157
|
-
if (fs.existsSync(projectPath)) {
|
|
158
|
-
throw new Error(`Directory already exists: ${projectName}`);
|
|
159
|
-
}
|
|
160
|
-
const templatePath = findTemplatePath();
|
|
161
|
-
if (!templatePath) {
|
|
162
|
-
throw new Error("Template directory not found in package.");
|
|
163
|
-
}
|
|
164
|
-
fs.mkdirSync(projectPath, {
|
|
165
|
-
recursive: true
|
|
166
|
-
});
|
|
167
|
-
if (template === "monorepo") {
|
|
168
|
-
fs.mkdirSync(path.join(projectPath, "apps"), {
|
|
169
|
-
recursive: true
|
|
170
|
-
});
|
|
171
|
-
fs.cpSync(path.join(templatePath, "nestjs-api"), path.join(projectPath, "apps/api"), {
|
|
172
|
-
recursive: true
|
|
173
|
-
});
|
|
174
|
-
fs.cpSync(path.join(templatePath, "nextjs-web"), path.join(projectPath, "apps/web"), {
|
|
175
|
-
recursive: true
|
|
176
|
-
});
|
|
177
|
-
fs.writeFileSync(path.join(projectPath, "pnpm-workspace.yaml"), "packages:\n - 'apps/*'\n");
|
|
178
|
-
fs.writeFileSync(path.join(projectPath, "package.json"), JSON.stringify({
|
|
179
|
-
name: projectName,
|
|
180
|
-
private: true,
|
|
181
|
-
packageManager: "pnpm@10.22.0",
|
|
182
|
-
scripts: {
|
|
183
|
-
dev: "wexts dev",
|
|
184
|
-
generate: "wexts generate",
|
|
185
|
-
build: "wexts build",
|
|
186
|
-
start: "wexts start",
|
|
187
|
-
doctor: "wexts doctor"
|
|
188
|
-
},
|
|
189
|
-
devDependencies: {
|
|
190
|
-
wexts: "latest"
|
|
191
|
-
}
|
|
192
|
-
}, null, 2));
|
|
193
|
-
} else if (template === "api") {
|
|
194
|
-
fs.cpSync(path.join(templatePath, "nestjs-api"), projectPath, {
|
|
195
|
-
recursive: true
|
|
196
|
-
});
|
|
197
|
-
} else if (template === "web") {
|
|
198
|
-
fs.cpSync(path.join(templatePath, "nextjs-web"), projectPath, {
|
|
199
|
-
recursive: true
|
|
200
|
-
});
|
|
201
|
-
} else {
|
|
202
|
-
throw new Error(`Unknown template "${template}".`);
|
|
203
|
-
}
|
|
204
|
-
if (!options.skipInstall) {
|
|
205
|
-
runCommand(detectPackageManager(projectPath), [
|
|
206
|
-
"install"
|
|
207
|
-
], projectPath);
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
__name(createProject, "createProject");
|
|
211
|
-
async function scaffoldRpcService(apiProjectPath, rawName) {
|
|
212
|
-
const serviceName = toKebabCase(rawName);
|
|
213
|
-
const className = `${toPascalCase(serviceName)}Service`;
|
|
214
|
-
const dir = path.join(apiProjectPath, "src", serviceName);
|
|
215
|
-
fs.mkdirSync(dir, {
|
|
216
|
-
recursive: true
|
|
217
|
-
});
|
|
218
|
-
fs.writeFileSync(path.join(dir, `${serviceName}.service.ts`), `import { Injectable } from '@nestjs/common';
|
|
219
|
-
import { RpcMethod, RpcService } from 'wexts/nest';
|
|
220
|
-
|
|
221
|
-
@Injectable()
|
|
222
|
-
@RpcService({ name: '${toCamelCase(serviceName)}', requireAuth: false })
|
|
223
|
-
export class ${className} {
|
|
224
|
-
@RpcMethod()
|
|
225
|
-
async sayHello(name: string): Promise<string> {
|
|
226
|
-
return \`Hello, \${name}!\`;
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
`);
|
|
230
|
-
}
|
|
231
|
-
__name(scaffoldRpcService, "scaffoldRpcService");
|
|
232
|
-
function runScript(script, options) {
|
|
233
|
-
const cwd = options.cwd ?? process.cwd();
|
|
234
|
-
const packageManager = detectPackageManager(cwd);
|
|
235
|
-
const args = packageManager === "npm" ? [
|
|
236
|
-
"run",
|
|
237
|
-
script
|
|
238
|
-
] : [
|
|
239
|
-
"run",
|
|
240
|
-
script
|
|
241
|
-
];
|
|
242
|
-
runCommand(packageManager, args, cwd);
|
|
243
|
-
}
|
|
244
|
-
__name(runScript, "runScript");
|
|
245
|
-
function runCommand(command, args, cwd) {
|
|
246
|
-
const result = spawnSync(command, args, {
|
|
247
|
-
cwd,
|
|
248
|
-
stdio: "inherit",
|
|
249
|
-
shell: process.platform === "win32"
|
|
250
|
-
});
|
|
251
|
-
if (result.status !== 0) {
|
|
252
|
-
throw new Error(`${command} ${args.join(" ")} failed with exit code ${result.status}`);
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
__name(runCommand, "runCommand");
|
|
256
|
-
function detectPackageManager(cwd) {
|
|
257
|
-
if (fs.existsSync(path.join(cwd, "pnpm-lock.yaml"))) return "pnpm";
|
|
258
|
-
return "npm";
|
|
259
|
-
}
|
|
260
|
-
__name(detectPackageManager, "detectPackageManager");
|
|
261
|
-
function findTemplatePath() {
|
|
262
|
-
const candidates = [
|
|
263
|
-
path.resolve(__dirname, "../../templates"),
|
|
264
|
-
path.resolve(__dirname, "../templates"),
|
|
265
|
-
path.resolve(process.cwd(), "packages/templates")
|
|
266
|
-
];
|
|
267
|
-
return candidates.find((candidate) => fs.existsSync(candidate));
|
|
268
|
-
}
|
|
269
|
-
__name(findTemplatePath, "findTemplatePath");
|
|
270
|
-
function readAllText(cwd, dirs) {
|
|
271
|
-
let text = "";
|
|
272
|
-
for (const dir of dirs) {
|
|
273
|
-
const absolute = path.join(cwd, dir);
|
|
274
|
-
if (!fs.existsSync(absolute)) continue;
|
|
275
|
-
for (const file of walk(absolute)) {
|
|
276
|
-
if (file.endsWith(".ts") || file.endsWith(".tsx") || file.endsWith(".js")) {
|
|
277
|
-
text += fs.readFileSync(file, "utf8");
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
return text;
|
|
282
|
-
}
|
|
283
|
-
__name(readAllText, "readAllText");
|
|
284
|
-
function walk(dir) {
|
|
285
|
-
return fs.readdirSync(dir, {
|
|
286
|
-
withFileTypes: true
|
|
287
|
-
}).flatMap((entry) => {
|
|
288
|
-
const absolute = path.join(dir, entry.name);
|
|
289
|
-
if (entry.isDirectory()) return walk(absolute);
|
|
290
|
-
return [
|
|
291
|
-
absolute
|
|
292
|
-
];
|
|
293
|
-
});
|
|
294
|
-
}
|
|
295
|
-
__name(walk, "walk");
|
|
296
|
-
function toKebabCase(value) {
|
|
297
|
-
return value.replace(/([a-z0-9])([A-Z])/g, "$1-$2").replace(/[_\s]+/g, "-").toLowerCase();
|
|
298
|
-
}
|
|
299
|
-
__name(toKebabCase, "toKebabCase");
|
|
300
|
-
function toPascalCase(value) {
|
|
301
|
-
return toKebabCase(value).split("-").map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join("");
|
|
302
|
-
}
|
|
303
|
-
__name(toPascalCase, "toPascalCase");
|
|
304
|
-
function toCamelCase(value) {
|
|
305
|
-
const pascal = toPascalCase(value);
|
|
306
|
-
return pascal.charAt(0).toLowerCase() + pascal.slice(1);
|
|
307
|
-
}
|
|
308
|
-
__name(toCamelCase, "toCamelCase");
|
|
309
|
-
function pathToFileUrl(filePath) {
|
|
310
|
-
return `file://${filePath}`;
|
|
311
|
-
}
|
|
312
|
-
__name(pathToFileUrl, "pathToFileUrl");
|
|
313
|
-
async function loadRuntimeConfig(configPath) {
|
|
314
|
-
if (configPath.endsWith(".mjs")) {
|
|
315
|
-
const mod2 = await import(pathToFileUrl(configPath));
|
|
316
|
-
return mod2.default ?? mod2;
|
|
317
|
-
}
|
|
318
|
-
const require2 = createRequire(__filename);
|
|
319
|
-
const mod = require2(configPath);
|
|
320
|
-
return mod.default ?? mod;
|
|
321
|
-
}
|
|
322
|
-
__name(loadRuntimeConfig, "loadRuntimeConfig");
|
|
323
|
-
var invokedAsCli = process.argv[1] && (path.basename(process.argv[1]) === "wexts" || path.basename(process.argv[1]) === "wexts.cjs" || path.resolve(process.argv[1]).includes(`${path.sep}dist${path.sep}cli${path.sep}index`));
|
|
324
|
-
if (invokedAsCli && !process.env.VITEST) {
|
|
325
|
-
createCliProgram().parseAsync(process.argv).catch((error) => {
|
|
326
|
-
logger.error(error instanceof Error ? error.message : String(error));
|
|
327
|
-
process.exit(1);
|
|
328
|
-
});
|
|
329
|
-
}
|
|
330
|
-
export {
|
|
331
|
-
createCliProgram,
|
|
332
|
-
runDoctor
|
|
333
|
-
};
|
|
334
|
-
//# sourceMappingURL=index.mjs.map
|
package/dist/cli/index.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/index.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from 'commander';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { spawnSync } from 'child_process';\nimport { createRequire } from 'module';\nimport * as pc from 'picocolors';\nimport { logger } from '../core/logger';\n\ninterface CommonOptions {\n cwd?: string;\n}\n\nexport function createCliProgram(): Command {\n const program = new Command();\n\n program\n .name('wexts')\n .description('Wexts - production-focused single-runtime Next.js + NestJS toolkit')\n .version('3.0.3');\n\n program\n .command('create <project-name>')\n .description('Create a compatibility project from bundled legacy templates')\n .option('-t, --template <template>', 'Legacy template to use (monorepo|api|web)', 'monorepo')\n .option('--skip-install', 'Skip dependency installation', false)\n .action(async (projectName: string, options: { template: string; skipInstall: boolean }) => {\n await createProject(projectName, options.template, { skipInstall: options.skipInstall });\n });\n\n program\n .command('dev')\n .description('Start local development processes')\n .option('-a, --api <path>', 'Path to API project', './apps/api')\n .option('-w, --web <path>', 'Path to Web project', './apps/web')\n .option('-p, --port <port>', 'Port for web server', '3000')\n .option('--api-port <port>', 'Port for API server', '5050')\n .option('--proxy', 'Enable development proxy on a separate proxy port', false)\n .action(async (options: { api: string; web: string; port: string; apiPort: string; proxy: boolean }) => {\n const { FusionDevServer } = await import('../dev-server/index.js');\n const server = new FusionDevServer();\n await server.start({\n apiPath: options.api,\n webPath: options.web,\n webPort: Number(options.port),\n apiPort: Number(options.apiPort),\n useProxy: options.proxy,\n });\n });\n\n program\n .command('generate [type] [name]')\n .alias('g')\n .description('Generate RPC manifest/client, or scaffold a minimal RPC service')\n .option('-p, --project <path>', 'Path to NestJS project', './apps/api')\n .option('-o, --output <path>', 'Output directory for generated RPC client', './apps/web/lib/wexts')\n .action(async (type: string | undefined, name: string | undefined, options: { project: string; output: string }) => {\n if (!type || type === 'rpc') {\n const { generateRpcClient } = await import('../codegen/index.js');\n const manifest = await generateRpcClient({\n projectPath: path.resolve(options.project),\n outputPath: path.resolve(options.output),\n });\n logger.success(`Generated Wexts RPC client for ${manifest.services.length} service(s).`);\n return;\n }\n\n if (type === 'service') {\n if (!name) throw new Error('Service name is required: wexts generate service hello');\n await scaffoldRpcService(path.resolve(options.project), name);\n logger.success(`Created RPC service ${name}. Run wexts generate to update the client.`);\n return;\n }\n\n throw new Error(`Unknown generator \"${type}\". Supported generators: rpc, service.`);\n });\n\n program\n .command('codegen')\n .description('Alias for wexts generate rpc')\n .option('-p, --project <path>', 'Path to NestJS project', './apps/api')\n .option('-o, --output <path>', 'Output directory for generated RPC client', './apps/web/lib/wexts')\n .action(async (options: { project: string; output: string }) => {\n const { generateRpcClient } = await import('../codegen/index.js');\n const manifest = await generateRpcClient({\n projectPath: path.resolve(options.project),\n outputPath: path.resolve(options.output),\n });\n logger.success(`Generated Wexts RPC client for ${manifest.services.length} service(s).`);\n });\n\n program\n .command('build')\n .description('Build a Wexts project for production')\n .option('--skip-generate', 'Skip RPC generation before build', false)\n .option('-p, --project <path>', 'Path to NestJS project', './apps/api')\n .option('-o, --output <path>', 'Output directory for generated RPC client', './apps/web/lib/wexts')\n .action(async (options: { skipGenerate: boolean; project: string; output: string }) => {\n if (!options.skipGenerate && fs.existsSync(options.project)) {\n const { generateRpcClient } = await import('../codegen/index.js');\n await generateRpcClient({\n projectPath: path.resolve(options.project),\n outputPath: path.resolve(options.output),\n });\n }\n runScript('build', { cwd: process.cwd() });\n });\n\n program\n .command('start')\n .description('Start the production Wexts runtime')\n .option('-c, --config <path>', 'Runtime config module path', './wexts.runtime.js')\n .option('-p, --port <port>', 'Port to listen on', process.env.PORT ?? '3000')\n .action(async (options: { config: string; port: string }) => {\n const { startWextsRuntime } = await import('../runtime/index.js');\n const configPath = path.resolve(options.config);\n const runtimeConfig = fs.existsSync(configPath)\n ? await loadRuntimeConfig(configPath)\n : {};\n await startWextsRuntime({\n ...runtimeConfig,\n port: Number(options.port),\n dev: false,\n });\n });\n\n program\n .command('vercel-build')\n .description('Build for Vercel using Build Output API v3')\n .option('-p, --project <path>', 'Path to NestJS project', './apps/api')\n .option('-o, --output <path>', 'Output dir for RPC client', './apps/web/lib/wexts')\n .option('-c, --config <path>', 'Runtime config module path', './wexts.runtime.js')\n .option('--skip-codegen', 'Skip RPC generation', false)\n .option('--skip-build', 'Skip project build step', false)\n .option('--node-version <version>', 'Node.js version for Vercel function', '20')\n .option('--max-duration <seconds>', 'Max duration for serverless function', '30')\n .action(async (options: {\n project: string;\n output: string;\n config: string;\n skipCodegen: boolean;\n skipBuild: boolean;\n nodeVersion: string;\n maxDuration: string;\n }) => {\n const { buildVercelOutput } = await import('../vercel-builder/index.js');\n const result = await buildVercelOutput({\n rootDir: process.cwd(),\n apiProjectPath: options.project,\n rpcOutputPath: options.output,\n runtimeConfigPath: options.config,\n skipCodegen: options.skipCodegen,\n skipBuild: options.skipBuild,\n nodeVersion: options.nodeVersion,\n maxDuration: Number(options.maxDuration),\n });\n if (result.warnings.length > 0) {\n for (const warning of result.warnings) logger.warn(warning);\n }\n if (result.errors.length > 0) {\n for (const error of result.errors) logger.error(error);\n process.exit(1);\n }\n logger.success('Vercel build output ready at .vercel/output');\n });\n\n program\n .command('doctor')\n .description('Validate Wexts project configuration')\n .option('--security', 'Run security-specific checks', false)\n .action(async (options: { security: boolean }) => {\n const result = runDoctor(process.cwd(), options.security);\n for (const warning of result.warnings) logger.warn(warning);\n for (const error of result.errors) logger.error(error);\n if (result.errors.length > 0) process.exit(1);\n logger.success(options.security ? 'Security doctor passed.' : 'Doctor passed.');\n });\n\n return program;\n}\n\nexport interface DoctorResult {\n errors: string[];\n warnings: string[];\n}\n\nexport function runDoctor(cwd: string, security = false): DoctorResult {\n const result: DoctorResult = { errors: [], warnings: [] };\n const pkgPath = path.join(cwd, 'package.json');\n\n if (!fs.existsSync(pkgPath)) {\n result.errors.push('package.json not found.');\n return result;\n }\n\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));\n if (!pkg.packageManager?.startsWith('pnpm@')) {\n result.warnings.push('packageManager should pin pnpm.');\n }\n\n for (const dir of ['apps/api', 'apps/web']) {\n if (!fs.existsSync(path.join(cwd, dir))) {\n result.warnings.push(`${dir} not found; some Wexts commands may need explicit paths.`);\n }\n }\n\n if (fs.existsSync(path.join(cwd, 'apps/api')) && fs.existsSync(path.join(cwd, 'apps/web'))) {\n result.warnings.push('Development mode starts separate web/API processes. Single-port serving is the production `wexts start` runtime path.');\n }\n\n if (security) {\n const source = readAllText(cwd, ['apps/api/src', 'packages/templates/nestjs-api/src']);\n if (source.includes('default-secret')) {\n result.errors.push('JWT fallback \"default-secret\" found. Production apps must fail without a strong JWT_SECRET.');\n }\n if (/origin:\\s*['\"]\\*['\"]/.test(source)) {\n result.errors.push('Wildcard CORS origin found. Use an explicit origin allowlist.');\n }\n }\n\n return result;\n}\n\nasync function createProject(projectName: string, template: string, options: { skipInstall: boolean }): Promise<void> {\n const projectPath = path.join(process.cwd(), projectName);\n if (fs.existsSync(projectPath)) {\n throw new Error(`Directory already exists: ${projectName}`);\n }\n\n const templatePath = findTemplatePath();\n if (!templatePath) {\n throw new Error('Template directory not found in package.');\n }\n\n fs.mkdirSync(projectPath, { recursive: true });\n\n if (template === 'monorepo') {\n fs.mkdirSync(path.join(projectPath, 'apps'), { recursive: true });\n fs.cpSync(path.join(templatePath, 'nestjs-api'), path.join(projectPath, 'apps/api'), { recursive: true });\n fs.cpSync(path.join(templatePath, 'nextjs-web'), path.join(projectPath, 'apps/web'), { recursive: true });\n fs.writeFileSync(path.join(projectPath, 'pnpm-workspace.yaml'), \"packages:\\n - 'apps/*'\\n\");\n fs.writeFileSync(path.join(projectPath, 'package.json'), JSON.stringify({\n name: projectName,\n private: true,\n packageManager: 'pnpm@10.22.0',\n scripts: {\n dev: 'wexts dev',\n generate: 'wexts generate',\n build: 'wexts build',\n start: 'wexts start',\n doctor: 'wexts doctor',\n },\n devDependencies: {\n wexts: 'latest',\n },\n }, null, 2));\n } else if (template === 'api') {\n fs.cpSync(path.join(templatePath, 'nestjs-api'), projectPath, { recursive: true });\n } else if (template === 'web') {\n fs.cpSync(path.join(templatePath, 'nextjs-web'), projectPath, { recursive: true });\n } else {\n throw new Error(`Unknown template \"${template}\".`);\n }\n\n if (!options.skipInstall) {\n runCommand(detectPackageManager(projectPath), ['install'], projectPath);\n }\n}\n\nasync function scaffoldRpcService(apiProjectPath: string, rawName: string): Promise<void> {\n const serviceName = toKebabCase(rawName);\n const className = `${toPascalCase(serviceName)}Service`;\n const dir = path.join(apiProjectPath, 'src', serviceName);\n fs.mkdirSync(dir, { recursive: true });\n fs.writeFileSync(path.join(dir, `${serviceName}.service.ts`), `import { Injectable } from '@nestjs/common';\nimport { RpcMethod, RpcService } from 'wexts/nest';\n\n@Injectable()\n@RpcService({ name: '${toCamelCase(serviceName)}', requireAuth: false })\nexport class ${className} {\n @RpcMethod()\n async sayHello(name: string): Promise<string> {\n return \\`Hello, \\${name}!\\`;\n }\n}\n`);\n}\n\nfunction runScript(script: string, options: CommonOptions): void {\n const cwd = options.cwd ?? process.cwd();\n const packageManager = detectPackageManager(cwd);\n const args = packageManager === 'npm' ? ['run', script] : ['run', script];\n runCommand(packageManager, args, cwd);\n}\n\nfunction runCommand(command: string, args: string[], cwd: string): void {\n const result = spawnSync(command, args, { cwd, stdio: 'inherit', shell: process.platform === 'win32' });\n if (result.status !== 0) {\n throw new Error(`${command} ${args.join(' ')} failed with exit code ${result.status}`);\n }\n}\n\nfunction detectPackageManager(cwd: string): 'pnpm' | 'npm' {\n if (fs.existsSync(path.join(cwd, 'pnpm-lock.yaml'))) return 'pnpm';\n return 'npm';\n}\n\nfunction findTemplatePath(): string | undefined {\n const candidates = [\n path.resolve(__dirname, '../../templates'),\n path.resolve(__dirname, '../templates'),\n path.resolve(process.cwd(), 'packages/templates'),\n ];\n\n return candidates.find((candidate) => fs.existsSync(candidate));\n}\n\nfunction readAllText(cwd: string, dirs: string[]): string {\n let text = '';\n for (const dir of dirs) {\n const absolute = path.join(cwd, dir);\n if (!fs.existsSync(absolute)) continue;\n for (const file of walk(absolute)) {\n if (file.endsWith('.ts') || file.endsWith('.tsx') || file.endsWith('.js')) {\n text += fs.readFileSync(file, 'utf8');\n }\n }\n }\n return text;\n}\n\nfunction walk(dir: string): string[] {\n return fs.readdirSync(dir, { withFileTypes: true }).flatMap((entry) => {\n const absolute = path.join(dir, entry.name);\n if (entry.isDirectory()) return walk(absolute);\n return [absolute];\n });\n}\n\nfunction toKebabCase(value: string): string {\n return value.replace(/([a-z0-9])([A-Z])/g, '$1-$2').replace(/[_\\s]+/g, '-').toLowerCase();\n}\n\nfunction toPascalCase(value: string): string {\n return toKebabCase(value).split('-').map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join('');\n}\n\nfunction toCamelCase(value: string): string {\n const pascal = toPascalCase(value);\n return pascal.charAt(0).toLowerCase() + pascal.slice(1);\n}\n\nfunction pathToFileUrl(filePath: string): string {\n return `file://${filePath}`;\n}\n\nasync function loadRuntimeConfig(configPath: string): Promise<Record<string, unknown>> {\n if (configPath.endsWith('.mjs')) {\n const mod = await import(pathToFileUrl(configPath));\n return (mod.default ?? mod) as Record<string, unknown>;\n }\n\n const require = createRequire(__filename);\n const mod = require(configPath);\n return (mod.default ?? mod) as Record<string, unknown>;\n}\n\nconst invokedAsCli = process.argv[1]\n && (path.basename(process.argv[1]) === 'wexts' || path.basename(process.argv[1]) === 'wexts.cjs' || path.resolve(process.argv[1]).includes(`${path.sep}dist${path.sep}cli${path.sep}index`));\n\nif (invokedAsCli && !process.env.VITEST) {\n createCliProgram().parseAsync(process.argv).catch((error) => {\n logger.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n });\n}\n"],"mappings":"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","names":["Command","fs","path","spawnSync","createRequire","createCliProgram","program","Command","name","description","version","command","option","action","projectName","options","createProject","template","skipInstall","FusionDevServer","server","start","apiPath","api","webPath","web","webPort","Number","port","apiPort","useProxy","proxy","alias","type","generateRpcClient","manifest","projectPath","resolve","project","outputPath","output","logger","success","services","length","Error","scaffoldRpcService","skipGenerate","existsSync","runScript","cwd","process","env","PORT","startWextsRuntime","configPath","config","runtimeConfig","loadRuntimeConfig","dev","buildVercelOutput","result","rootDir","apiProjectPath","rpcOutputPath","runtimeConfigPath","skipCodegen","skipBuild","nodeVersion","maxDuration","warnings","warning","warn","errors","error","exit","runDoctor","security","pkgPath","join","push","pkg","JSON","parse","readFileSync","packageManager","startsWith","dir","source","readAllText","includes","test","templatePath","findTemplatePath","fs","mkdirSync","recursive","cpSync","writeFileSync","stringify","private","scripts","generate","build","doctor","devDependencies","wexts","runCommand","detectPackageManager","rawName","serviceName","toKebabCase","className","toPascalCase","toCamelCase","script","args","spawnSync","stdio","shell","platform","status","candidates","__dirname","find","candidate","dirs","text","absolute","file","walk","endsWith","readdirSync","withFileTypes","flatMap","entry","isDirectory","value","replace","toLowerCase","split","map","part","charAt","toUpperCase","slice","pascal","pathToFileUrl","filePath","mod","default","require","createRequire","__filename","invokedAsCli","argv","basename","sep","VITEST","parseAsync","catch","message","String"]}
|
package/dist/client/index.d.mts
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { c as RpcManifest } from '../types-7d_fC-C3.mjs';
|
|
2
|
-
|
|
3
|
-
declare class FusionFetcher {
|
|
4
|
-
private baseUrl;
|
|
5
|
-
constructor(baseUrl?: string);
|
|
6
|
-
private request;
|
|
7
|
-
get<T>(path: string): Promise<T>;
|
|
8
|
-
post<T>(path: string, body: any): Promise<T>;
|
|
9
|
-
put<T>(path: string, body: any): Promise<T>;
|
|
10
|
-
delete<T>(path: string): Promise<T>;
|
|
11
|
-
}
|
|
12
|
-
declare const apiFetcher: FusionFetcher;
|
|
13
|
-
interface WextsRpcClientOptions {
|
|
14
|
-
baseUrl?: string;
|
|
15
|
-
fetch?: typeof fetch;
|
|
16
|
-
getHeaders?: () => Record<string, string> | Promise<Record<string, string>>;
|
|
17
|
-
}
|
|
18
|
-
type WextsRpcClient = Record<string, Record<string, (...args: unknown[]) => Promise<unknown>>>;
|
|
19
|
-
declare function createWextsRpcClient(manifest: Pick<RpcManifest, 'services'> | undefined, options?: WextsRpcClientOptions): WextsRpcClient;
|
|
20
|
-
|
|
21
|
-
export { FusionFetcher, type WextsRpcClient, type WextsRpcClientOptions, apiFetcher, createWextsRpcClient };
|
package/dist/client/index.d.ts
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { c as RpcManifest } from '../types-7d_fC-C3.js';
|
|
2
|
-
|
|
3
|
-
declare class FusionFetcher {
|
|
4
|
-
private baseUrl;
|
|
5
|
-
constructor(baseUrl?: string);
|
|
6
|
-
private request;
|
|
7
|
-
get<T>(path: string): Promise<T>;
|
|
8
|
-
post<T>(path: string, body: any): Promise<T>;
|
|
9
|
-
put<T>(path: string, body: any): Promise<T>;
|
|
10
|
-
delete<T>(path: string): Promise<T>;
|
|
11
|
-
}
|
|
12
|
-
declare const apiFetcher: FusionFetcher;
|
|
13
|
-
interface WextsRpcClientOptions {
|
|
14
|
-
baseUrl?: string;
|
|
15
|
-
fetch?: typeof fetch;
|
|
16
|
-
getHeaders?: () => Record<string, string> | Promise<Record<string, string>>;
|
|
17
|
-
}
|
|
18
|
-
type WextsRpcClient = Record<string, Record<string, (...args: unknown[]) => Promise<unknown>>>;
|
|
19
|
-
declare function createWextsRpcClient(manifest: Pick<RpcManifest, 'services'> | undefined, options?: WextsRpcClientOptions): WextsRpcClient;
|
|
20
|
-
|
|
21
|
-
export { FusionFetcher, type WextsRpcClient, type WextsRpcClientOptions, apiFetcher, createWextsRpcClient };
|
package/dist/client/index.js
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
var _chunkMXINIFPCjs = require('../chunk-MXINIFPC.js');
|
|
6
|
-
require('../chunk-XE4OXN2W.js');
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
exports.FusionFetcher = _chunkMXINIFPCjs.FusionFetcher; exports.apiFetcher = _chunkMXINIFPCjs.apiFetcher; exports.createWextsRpcClient = _chunkMXINIFPCjs.createWextsRpcClient;
|
|
12
|
-
//# sourceMappingURL=index.js.map
|
package/dist/client/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["/Volumes/Projects/wexts/packages/dist/client/index.js"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACF,uDAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACA;AACA;AACF,+KAAC","file":"/Volumes/Projects/wexts/packages/dist/client/index.js"}
|
package/dist/client/index.mjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/dist/codegen/index.d.mts
DELETED
package/dist/codegen/index.d.ts
DELETED
package/dist/codegen/index.js
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
var _chunkSE32ZPOZjs = require('../chunk-SE32ZPOZ.js');
|
|
7
|
-
require('../chunk-WCKSKU3C.js');
|
|
8
|
-
require('../chunk-XE4OXN2W.js');
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
exports.ClientGenerator = _chunkSE32ZPOZjs.ClientGenerator; exports.CodegenWatcher = _chunkSE32ZPOZjs.CodegenWatcher; exports.NestJSParser = _chunkSE32ZPOZjs.NestJSParser; exports.generateRpcClient = _chunkSE32ZPOZjs.generateRpcClient;
|
|
15
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["/Volumes/Projects/wexts/packages/dist/codegen/index.js"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACF,uDAA6B;AAC7B,gCAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACA;AACA;AACA;AACF,2OAAC","file":"/Volumes/Projects/wexts/packages/dist/codegen/index.js"}
|
package/dist/codegen/index.mjs
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
ClientGenerator,
|
|
3
|
-
CodegenWatcher,
|
|
4
|
-
NestJSParser,
|
|
5
|
-
generateRpcClient
|
|
6
|
-
} from "../chunk-CLM5PNSG.mjs";
|
|
7
|
-
import "../chunk-JHOVXH3X.mjs";
|
|
8
|
-
import "../chunk-7WULUGLH.mjs";
|
|
9
|
-
export {
|
|
10
|
-
ClientGenerator,
|
|
11
|
-
CodegenWatcher,
|
|
12
|
-
NestJSParser,
|
|
13
|
-
generateRpcClient
|
|
14
|
-
};
|
|
15
|
-
//# sourceMappingURL=index.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import { R as RpcAuthPolicy } from './types-7d_fC-C3.mjs';
|
|
2
|
-
|
|
3
|
-
interface RpcServiceOptions {
|
|
4
|
-
name?: string;
|
|
5
|
-
requireAuth?: boolean;
|
|
6
|
-
}
|
|
7
|
-
interface RpcMethodOptions {
|
|
8
|
-
name?: string;
|
|
9
|
-
requireAuth?: boolean;
|
|
10
|
-
}
|
|
11
|
-
interface RuntimeRpcServiceMetadata {
|
|
12
|
-
name?: string;
|
|
13
|
-
requireAuth: boolean;
|
|
14
|
-
}
|
|
15
|
-
interface RuntimeRpcMethodMetadata {
|
|
16
|
-
propertyKey: string | symbol;
|
|
17
|
-
name?: string;
|
|
18
|
-
requireAuth?: boolean;
|
|
19
|
-
}
|
|
20
|
-
declare function RpcService(nameOrOptions?: string | RpcServiceOptions): ClassDecorator;
|
|
21
|
-
declare function RpcMethod(nameOrOptions?: string | RpcMethodOptions): MethodDecorator;
|
|
22
|
-
declare function RequireAuth(): MethodDecorator & ClassDecorator;
|
|
23
|
-
declare function getRuntimeRpcServiceMetadata(target: Function): RuntimeRpcServiceMetadata | undefined;
|
|
24
|
-
declare function getRuntimeRpcMethodsMetadata(target: Function): RuntimeRpcMethodMetadata[];
|
|
25
|
-
declare function getRpcAuthPolicy(requireAuth?: boolean): RpcAuthPolicy;
|
|
26
|
-
declare const WextsRpcService: typeof RpcService;
|
|
27
|
-
declare const WextsRpc: typeof RpcMethod;
|
|
28
|
-
|
|
29
|
-
export { RequireAuth as R, WextsRpc as W, RpcMethod as a, type RpcMethodOptions as b, RpcService as c, type RpcServiceOptions as d, type RuntimeRpcMethodMetadata as e, type RuntimeRpcServiceMetadata as f, WextsRpcService as g, getRpcAuthPolicy as h, getRuntimeRpcMethodsMetadata as i, getRuntimeRpcServiceMetadata as j };
|