forgestack-os-cli 0.1.0

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 (82) hide show
  1. package/dist/commands/create.d.ts +1 -0
  2. package/dist/commands/create.d.ts.map +1 -0
  3. package/dist/commands/create.js +78 -0
  4. package/dist/commands/create.js.map +1 -0
  5. package/dist/generators/api.d.ts +3 -0
  6. package/dist/generators/api.d.ts.map +1 -0
  7. package/dist/generators/api.js +346 -0
  8. package/dist/generators/api.js.map +1 -0
  9. package/dist/generators/auth.d.ts +2 -0
  10. package/dist/generators/auth.d.ts.map +1 -0
  11. package/dist/generators/auth.js +371 -0
  12. package/dist/generators/auth.js.map +1 -0
  13. package/dist/generators/backend.d.ts +2 -0
  14. package/dist/generators/backend.d.ts.map +1 -0
  15. package/dist/generators/backend.js +875 -0
  16. package/dist/generators/backend.js.map +1 -0
  17. package/dist/generators/common.d.ts +2 -0
  18. package/dist/generators/common.d.ts.map +1 -0
  19. package/dist/generators/common.js +354 -0
  20. package/dist/generators/common.js.map +1 -0
  21. package/dist/generators/database.d.ts +2 -0
  22. package/dist/generators/database.d.ts.map +1 -0
  23. package/dist/generators/database.js +157 -0
  24. package/dist/generators/database.js.map +1 -0
  25. package/dist/generators/docker.d.ts +2 -0
  26. package/dist/generators/docker.d.ts.map +1 -0
  27. package/dist/generators/docker.js +181 -0
  28. package/dist/generators/docker.js.map +1 -0
  29. package/dist/generators/frontend-helpers.d.ts +3 -0
  30. package/dist/generators/frontend-helpers.d.ts.map +1 -0
  31. package/dist/generators/frontend-helpers.js +23 -0
  32. package/dist/generators/frontend-helpers.js.map +1 -0
  33. package/dist/generators/frontend.d.ts +2 -0
  34. package/dist/generators/frontend.d.ts.map +1 -0
  35. package/dist/generators/frontend.js +735 -0
  36. package/dist/generators/frontend.js.map +1 -0
  37. package/dist/generators/index.d.ts +2 -0
  38. package/dist/generators/index.d.ts.map +1 -0
  39. package/dist/generators/index.js +59 -0
  40. package/dist/generators/index.js.map +1 -0
  41. package/dist/generators/nextjs-helpers.d.ts +6 -0
  42. package/dist/generators/nextjs-helpers.d.ts.map +1 -0
  43. package/dist/generators/nextjs-helpers.js +216 -0
  44. package/dist/generators/nextjs-helpers.js.map +1 -0
  45. package/dist/index.d.ts +2 -0
  46. package/dist/index.d.ts.map +1 -0
  47. package/dist/index.js +24 -0
  48. package/dist/index.js.map +1 -0
  49. package/dist/types.d.ts +15 -0
  50. package/dist/types.d.ts.map +1 -0
  51. package/dist/types.js +3 -0
  52. package/dist/types.js.map +1 -0
  53. package/dist/utils/logger.d.ts +9 -0
  54. package/dist/utils/logger.d.ts.map +1 -0
  55. package/dist/utils/logger.js +32 -0
  56. package/dist/utils/logger.js.map +1 -0
  57. package/dist/utils/prompts.d.ts +2 -0
  58. package/dist/utils/prompts.d.ts.map +1 -0
  59. package/dist/utils/prompts.js +107 -0
  60. package/dist/utils/prompts.js.map +1 -0
  61. package/dist/utils/validators.d.ts +2 -0
  62. package/dist/utils/validators.d.ts.map +1 -0
  63. package/dist/utils/validators.js +48 -0
  64. package/dist/utils/validators.js.map +1 -0
  65. package/package.json +49 -0
  66. package/src/commands/create.ts +82 -0
  67. package/src/generators/api.ts +353 -0
  68. package/src/generators/auth.ts +406 -0
  69. package/src/generators/backend.ts +927 -0
  70. package/src/generators/common.ts +377 -0
  71. package/src/generators/database.ts +165 -0
  72. package/src/generators/docker.ts +185 -0
  73. package/src/generators/frontend.ts +783 -0
  74. package/src/generators/index.ts +64 -0
  75. package/src/index.ts +27 -0
  76. package/src/types.ts +16 -0
  77. package/src/utils/logger.ts +31 -0
  78. package/src/utils/prompts.ts +105 -0
  79. package/src/utils/validators.ts +50 -0
  80. package/tests/validators.test.ts +69 -0
  81. package/tsc_output.txt +0 -0
  82. package/tsconfig.json +21 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frontend.js","sourceRoot":"","sources":["../../src/generators/frontend.ts"],"names":[],"mappings":";;;;;AAIA,4CAoBC;AAxBD,gDAAwB;AACxB,wDAA0B;AAGnB,KAAK,UAAU,gBAAgB,CAAC,MAAmB,EAAE,WAAmB;IAC7E,8DAA8D;IAC9D,0DAA0D;IAE1D,QAAQ,MAAM,CAAC,QAAQ,EAAE,CAAC;QACxB,KAAK,YAAY;YACf,MAAM,iBAAiB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;YAC7C,MAAM;QACR,KAAK,QAAQ;YACX,MAAM,cAAc,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;YAC1C,MAAM;QACR,KAAK,UAAU;YACb,MAAM,eAAe,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;YAC3C,MAAM;QACR,KAAK,WAAW;YACd,MAAM,iBAAiB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;YAC7C,MAAM;QACR;YACE,MAAM,IAAI,KAAK,CAAC,yBAAyB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IAChE,CAAC;AACH,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,MAAmB,EAAE,WAAmB;IACvE,eAAe;IACf,MAAM,WAAW,GAAG;QAClB,IAAI,EAAE,GAAG,MAAM,CAAC,WAAW,WAAW;QACtC,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE;YACP,GAAG,EAAE,MAAM;YACX,KAAK,EAAE,mBAAmB;YAC1B,OAAO,EAAE,cAAc;YACvB,IAAI,EAAE,uBAAuB;SAC9B;QACD,YAAY,EAAE;YACZ,KAAK,EAAE,SAAS;YAChB,WAAW,EAAE,SAAS;YACtB,kBAAkB,EAAE,SAAS;YAC7B,KAAK,EAAE,QAAQ;YACf,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,OAAO,IAAI,EAAE,oBAAoB,EAAE,SAAS,EAAE,CAAC;YACnE,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,UAAU,IAAI,EAAE,uBAAuB,EAAE,SAAS,EAAE,CAAC;YACzE,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,UAAU,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;SAC3D;QACD,eAAe,EAAE;YACf,cAAc,EAAE,UAAU;YAC1B,kBAAkB,EAAE,UAAU;YAC9B,sBAAsB,EAAE,QAAQ;YAChC,UAAU,EAAE,QAAQ;YACpB,IAAI,EAAE,SAAS;YACf,aAAa,EAAE,QAAQ;YACvB,cAAc,EAAE,UAAU;YAC1B,SAAS,EAAE,SAAS;YACpB,QAAQ,EAAE,SAAS;YACnB,kCAAkC,EAAE,SAAS;YAC7C,2BAA2B,EAAE,SAAS;SACvC;KACF,CAAC;IAEF,MAAM,kBAAE,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,EAAE,WAAW,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;IAEvF,cAAc;IACd,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;CAepB,CAAC;IAEA,MAAM,kBAAE,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,gBAAgB,CAAC,EAAE,UAAU,CAAC,CAAC;IAEzE,oBAAoB;IACpB,MAAM,QAAQ,GAAG;QACf,eAAe,EAAE;YACf,MAAM,EAAE,QAAQ;YAChB,uBAAuB,EAAE,IAAI;YAC7B,GAAG,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,cAAc,CAAC;YACtC,MAAM,EAAE,QAAQ;YAChB,YAAY,EAAE,IAAI;YAClB,gBAAgB,EAAE,SAAS;YAC3B,0BAA0B,EAAE,IAAI;YAChC,iBAAiB,EAAE,IAAI;YACvB,eAAe,EAAE,IAAI;YACrB,MAAM,EAAE,IAAI;YACZ,GAAG,EAAE,WAAW;YAChB,MAAM,EAAE,IAAI;YACZ,cAAc,EAAE,IAAI;YACpB,kBAAkB,EAAE,IAAI;YACxB,0BAA0B,EAAE,IAAI;SACjC;QACD,OAAO,EAAE,CAAC,KAAK,CAAC;QAChB,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,CAAC;KAC/C,CAAC;IAEF,MAAM,kBAAE,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;IAErF,kBAAkB;IAClB,MAAM,cAAc,GAAG;;;;;;;;;;;CAWxB,CAAC;IAEA,MAAM,kBAAE,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,oBAAoB,CAAC,EAAE,cAAc,CAAC,CAAC;IAEjF,iBAAiB;IACjB,MAAM,aAAa,GAAG;;;;;;CAMvB,CAAC;IAEA,MAAM,kBAAE,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,mBAAmB,CAAC,EAAE,aAAa,CAAC,CAAC;IAE/E,iCAAiC;IACjC,MAAM,MAAM,GAAG,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IAC7C,MAAM,kBAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC3B,MAAM,kBAAE,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;IACpD,MAAM,kBAAE,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC/C,MAAM,kBAAE,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;IAC7C,MAAM,kBAAE,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAE/C,aAAa;IACb,MAAM,SAAS,GAAG;;;;;;aAMP,MAAM,CAAC,WAAW;;;;;;;CAO9B,CAAC;IAEA,MAAM,kBAAE,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,EAAE,SAAS,CAAC,CAAC;IAEpE,mBAAmB;IACnB,MAAM,OAAO,GAAG;;;;;;;;;;CAUjB,CAAC;IAEA,MAAM,kBAAE,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,OAAO,CAAC,CAAC;IAE3D,WAAW;IACX,MAAM,QAAQ,GAAG;;;;;;;;;;;;;;;;;;;;;;;CAuBlB,CAAC;IAEA,MAAM,kBAAE,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,QAAQ,CAAC,CAAC;IAE7D,gBAAgB;IAChB,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IACvC,MAAM,kBAAE,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,CAAC,CAAC;IAEzD,aAAa;IACb,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACvC,MAAM,kBAAE,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,EAAE,SAAS,CAAC,CAAC;AACpE,CAAC;AAED,SAAS,eAAe,CAAC,MAAmB;IAC1C,OAAO;;;;;EAKP,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,oDAAoD,CAAC,CAAC,CAAC,EAAE;;;IAGjF,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,iEAAiE,CAAC,CAAC,CAAC,EAAE;;;MAG9F,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,8CAA8C,CAAC,CAAC,CAAC,EAAE;MAC7E,MAAM,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE;;;;;;;;MAQ7C,MAAM,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE;MAC9C,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE;;;;;CAKtD,CAAC;AACF,CAAC;AAED,SAAS,YAAY,CAAC,MAAmB;IACvC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+BR,CAAC;AACF,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,MAAmB,EAAE,WAAmB;IACpE,eAAe;IACf,MAAM,WAAW,GAAG;QAClB,IAAI,EAAE,GAAG,MAAM,CAAC,WAAW,WAAW;QACtC,OAAO,EAAE,OAAO;QAChB,OAAO,EAAE;YACP,GAAG,EAAE,UAAU;YACf,KAAK,EAAE,YAAY;YACnB,KAAK,EAAE,YAAY;YACnB,IAAI,EAAE,WAAW;SAClB;QACD,YAAY,EAAE;YACZ,KAAK,EAAE,SAAS;YAChB,WAAW,EAAE,SAAS;YACtB,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,QAAQ;YACf,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,OAAO,IAAI,EAAE,eAAe,EAAE,SAAS,EAAE,CAAC;YAC9D,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,UAAU,IAAI,EAAE,uBAAuB,EAAE,SAAS,EAAE,eAAe,EAAE,SAAS,EAAE,CAAC;YACrG,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,UAAU,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;YAC1D,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC;SAC5D;QACD,eAAe,EAAE;YACf,aAAa,EAAE,UAAU;YACzB,cAAc,EAAE,UAAU;YAC1B,kBAAkB,EAAE,UAAU;YAC9B,UAAU,EAAE,QAAQ;YACpB,WAAW,EAAE,QAAQ;YACrB,YAAY,EAAE,UAAU;YACxB,OAAO,EAAE,SAAS;YAClB,MAAM,EAAE,SAAS;YACjB,oBAAoB,EAAE,SAAS;SAChC;KACF,CAAC;IAEF,MAAM,kBAAE,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,EAAE,WAAW,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;IAEvF,iBAAiB;IACjB,MAAM,UAAU,GAAG;;;;;;CAMpB,CAAC;IAEA,MAAM,kBAAE,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,gBAAgB,CAAC,EAAE,UAAU,CAAC,CAAC;IAEzE,oBAAoB;IACpB,MAAM,QAAQ,GAAG;QACf,eAAe,EAAE;YACf,MAAM,EAAE,QAAQ;YAChB,GAAG,EAAE,CAAC,KAAK,EAAE,cAAc,EAAE,QAAQ,CAAC;YACtC,OAAO,EAAE,IAAI;YACb,YAAY,EAAE,IAAI;YAClB,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,IAAI;YACZ,eAAe,EAAE,IAAI;YACrB,MAAM,EAAE,QAAQ;YAChB,gBAAgB,EAAE,SAAS;YAC3B,iBAAiB,EAAE,IAAI;YACvB,eAAe,EAAE,IAAI;YACrB,GAAG,EAAE,UAAU;YACf,WAAW,EAAE,IAAI;YACjB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;YAC3B,KAAK,EAAE;gBACL,KAAK,EAAE,CAAC,KAAK,CAAC;aACf;SACF;QACD,OAAO,EAAE,CAAC,eAAe,EAAE,SAAS,EAAE,UAAU,EAAE,qBAAqB,CAAC;QACxE,OAAO,EAAE,CAAC,cAAc,CAAC;KAC1B,CAAC;IAEF,MAAM,kBAAE,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;IAErF,kBAAkB;IAClB,MAAM,cAAc,GAAG;;;;;;;;;;;;;;CAcxB,CAAC;IAEA,MAAM,kBAAE,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,oBAAoB,CAAC,EAAE,cAAc,CAAC,CAAC;IAEjF,iBAAiB;IACjB,MAAM,aAAa,GAAG;;;;;;CAMvB,CAAC;IAEA,MAAM,kBAAE,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,mBAAmB,CAAC,EAAE,aAAa,CAAC,CAAC;IAE/E,iCAAiC;IACjC,MAAM,MAAM,GAAG,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IAC7C,MAAM,kBAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC3B,MAAM,kBAAE,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC/C,MAAM,kBAAE,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;IACnD,MAAM,kBAAE,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC;IACzD,MAAM,kBAAE,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC;IAElD,cAAc;IACd,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IACvC,MAAM,kBAAE,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,CAAC,CAAC;IAE5D,YAAY;IACZ,MAAM,QAAQ,GAAG;;;;kDAI+B,MAAM,CAAC,WAAW;;;;;;;;;;;;;;;;CAgBnE,CAAC;IAEA,MAAM,kBAAE,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,QAAQ,CAAC,CAAC;IAE5D,aAAa;IACb,MAAM,SAAS,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC7C,MAAM,kBAAE,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,SAAS,CAAC,CAAC;IAEtE,iBAAiB;IACjB,MAAM,aAAa,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;IACrD,MAAM,kBAAE,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,UAAU,CAAC,EAAE,aAAa,CAAC,CAAC;IAE9E,aAAa;IACb,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;CAmBpB,CAAC;IAEA,MAAM,kBAAE,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,EAAE,UAAU,CAAC,CAAC;IAEjE,aAAa;IACb,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmCnB,CAAC;IAEA,MAAM,kBAAE,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,QAAQ,CAAC,EAAE,SAAS,CAAC,CAAC;IAEvE,qDAAqD;IACrD,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC5B,MAAM,UAAU,GAAG;;;;;;;;;CAStB,CAAC;QACE,MAAM,kBAAE,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,EAAE,UAAU,CAAC,CAAC;IAC1E,CAAC;SAAM,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QACjC,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;CAsBtB,CAAC;QACE,MAAM,kBAAE,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,EAAE,UAAU,CAAC,CAAC;IAC1E,CAAC;IAED,qBAAqB;IACrB,MAAM,UAAU,GAAG;EACnB,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,iFAAiF,CAAC,CAAC,CAAC,EAAE;EAChH,MAAM,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,yFAAyF,CAAC,CAAC,CAAC,EAAE;CAC5H,CAAC;IAEA,MAAM,kBAAE,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,oBAAoB,CAAC,EAAE,UAAU,CAAC,CAAC;IAE7E,aAAa;IACb,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiCnB,CAAC;IAEA,MAAM,kBAAE,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,EAAE,SAAS,CAAC,CAAC;AACtE,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,OAAoB,EAAE,YAAoB;IACvE,iCAAiC;IACjC,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;AACnD,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,OAAoB,EAAE,YAAoB;IACzE,uCAAuC;IACvC,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;AACzD,CAAC;AACD,yDAAyD;AAEzD,SAAS,eAAe,CAAC,MAAmB;IAC1C,OAAO;;;;YAIG,MAAM,CAAC,WAAW;;;;;;;;;;;;;;;CAe7B,CAAC;AACF,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAmB;IAC7C,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC5B,OAAO;;;;;;;;;CASV,CAAC;IACA,CAAC;IAED,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4DR,CAAC;AACF,CAAC;AAED,SAAS,sBAAsB,CAAC,MAAmB;IACjD,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC5B,OAAO;;;;;;;;;;;;;;;+CAeoC,MAAM,CAAC,WAAW;;;;;;;;;;;CAWhE,CAAC;IACA,CAAC;IAED,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+CA4CsC,MAAM,CAAC,WAAW;;;;;;;;;;;;;;;;CAgBhE,CAAC;AACF,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { StackConfig } from '../types';
2
+ export declare function generateProject(config: StackConfig, targetDir: string): Promise<void>;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/generators/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AASvC,wBAAsB,eAAe,CAAC,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,iBAoD3E"}
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.generateProject = generateProject;
7
+ const path_1 = __importDefault(require("path"));
8
+ const fs_extra_1 = __importDefault(require("fs-extra"));
9
+ const logger_1 = require("../utils/logger");
10
+ const frontend_1 = require("./frontend");
11
+ const backend_1 = require("./backend");
12
+ const database_1 = require("./database");
13
+ const auth_1 = require("./auth");
14
+ const docker_1 = require("./docker");
15
+ const common_1 = require("./common");
16
+ async function generateProject(config, targetDir) {
17
+ const spinner = logger_1.logger.spinner('Creating project structure...');
18
+ try {
19
+ // Create project directory
20
+ await fs_extra_1.default.ensureDir(targetDir);
21
+ // Create subdirectories
22
+ const frontendDir = path_1.default.join(targetDir, 'frontend');
23
+ const backendDir = path_1.default.join(targetDir, 'backend');
24
+ await fs_extra_1.default.ensureDir(frontendDir);
25
+ await fs_extra_1.default.ensureDir(backendDir);
26
+ spinner.succeed('Project structure created');
27
+ // Generate common files (root package.json, README, .gitignore, etc.)
28
+ const commonSpinner = logger_1.logger.spinner('Generating common files...');
29
+ await (0, common_1.generateCommon)(config, targetDir);
30
+ commonSpinner.succeed('Common files generated');
31
+ // Generate frontend
32
+ const frontendSpinner = logger_1.logger.spinner(`Generating ${config.frontend} frontend...`);
33
+ await (0, frontend_1.generateFrontend)(config, frontendDir);
34
+ frontendSpinner.succeed('Frontend generated');
35
+ // Generate backend
36
+ const backendSpinner = logger_1.logger.spinner(`Generating ${config.backend} backend...`);
37
+ await (0, backend_1.generateBackend)(config, backendDir);
38
+ backendSpinner.succeed('Backend generated');
39
+ // Generate database setup
40
+ const dbSpinner = logger_1.logger.spinner(`Setting up ${config.database} database...`);
41
+ await (0, database_1.generateDatabase)(config, backendDir);
42
+ dbSpinner.succeed('Database setup complete');
43
+ // Generate auth integration
44
+ const authSpinner = logger_1.logger.spinner(`Integrating ${config.auth} authentication...`);
45
+ await (0, auth_1.generateAuth)(config, frontendDir, backendDir);
46
+ authSpinner.succeed('Authentication integrated');
47
+ // Generate Docker configuration if requested
48
+ if (config.docker) {
49
+ const dockerSpinner = logger_1.logger.spinner('Generating Docker configuration...');
50
+ await (0, docker_1.generateDocker)(config, targetDir);
51
+ dockerSpinner.succeed('Docker configuration generated');
52
+ }
53
+ }
54
+ catch (error) {
55
+ spinner.fail('Failed to generate project');
56
+ throw error;
57
+ }
58
+ }
59
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/generators/index.ts"],"names":[],"mappings":";;;;;AAWA,0CAoDC;AA/DD,gDAAwB;AACxB,wDAA0B;AAE1B,4CAAyC;AACzC,yCAA8C;AAC9C,uCAA4C;AAC5C,yCAA8C;AAC9C,iCAAsC;AACtC,qCAA0C;AAC1C,qCAA0C;AAEnC,KAAK,UAAU,eAAe,CAAC,MAAmB,EAAE,SAAiB;IACxE,MAAM,OAAO,GAAG,eAAM,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC;IAEhE,IAAI,CAAC;QACD,2BAA2B;QAC3B,MAAM,kBAAE,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAE9B,wBAAwB;QACxB,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QACrD,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAEnD,MAAM,kBAAE,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QAChC,MAAM,kBAAE,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAE/B,OAAO,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;QAE7C,sEAAsE;QACtE,MAAM,aAAa,GAAG,eAAM,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC;QACnE,MAAM,IAAA,uBAAc,EAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QACxC,aAAa,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;QAEhD,oBAAoB;QACpB,MAAM,eAAe,GAAG,eAAM,CAAC,OAAO,CAAC,cAAc,MAAM,CAAC,QAAQ,cAAc,CAAC,CAAC;QACpF,MAAM,IAAA,2BAAgB,EAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAC5C,eAAe,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;QAE9C,mBAAmB;QACnB,MAAM,cAAc,GAAG,eAAM,CAAC,OAAO,CAAC,cAAc,MAAM,CAAC,OAAO,aAAa,CAAC,CAAC;QACjF,MAAM,IAAA,yBAAe,EAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAC1C,cAAc,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;QAE5C,0BAA0B;QAC1B,MAAM,SAAS,GAAG,eAAM,CAAC,OAAO,CAAC,cAAc,MAAM,CAAC,QAAQ,cAAc,CAAC,CAAC;QAC9E,MAAM,IAAA,2BAAgB,EAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAC3C,SAAS,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;QAE7C,4BAA4B;QAC5B,MAAM,WAAW,GAAG,eAAM,CAAC,OAAO,CAAC,eAAe,MAAM,CAAC,IAAI,oBAAoB,CAAC,CAAC;QACnF,MAAM,IAAA,mBAAY,EAAC,MAAM,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;QACpD,WAAW,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;QAEjD,6CAA6C;QAC7C,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,aAAa,GAAG,eAAM,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAC;YAC3E,MAAM,IAAA,uBAAc,EAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YACxC,aAAa,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAC;QAC5D,CAAC;IAEL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QAC3C,MAAM,KAAK,CAAC;IAChB,CAAC;AACL,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { StackConfig } from '../types';
2
+ export declare function generateFrontend(config: StackConfig, frontendDir: string): Promise<void>;
3
+ export declare function getNextJSLayout(config: StackConfig): string;
4
+ export declare function getNextJSLoginPage(config: StackConfig): string;
5
+ export declare function getNextJSDashboardPage(config: StackConfig): string;
6
+ //# sourceMappingURL=nextjs-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nextjs-helpers.d.ts","sourceRoot":"","sources":["../../src/generators/nextjs-helpers.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,iBAiB9E;AAGD,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAqB3D;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CA2E9D;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CA6FlE"}
@@ -0,0 +1,216 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateFrontend = generateFrontend;
4
+ exports.getNextJSLayout = getNextJSLayout;
5
+ exports.getNextJSLoginPage = getNextJSLoginPage;
6
+ exports.getNextJSDashboardPage = getNextJSDashboardPage;
7
+ async function generateFrontend(config, frontendDir) {
8
+ switch (config.frontend) {
9
+ case 'react-vite':
10
+ await generateReactVite(config, frontendDir);
11
+ break;
12
+ case 'nextjs':
13
+ await generateNextJS(config, frontendDir);
14
+ break;
15
+ case 'vue-vite':
16
+ await generateVueVite(config, frontendDir);
17
+ break;
18
+ case 'sveltekit':
19
+ await generateSvelteKit(config, frontendDir);
20
+ break;
21
+ default:
22
+ throw new Error(`Unsupported frontend: ${config.frontend}`);
23
+ }
24
+ }
25
+ // Helper functions for Next.js
26
+ function getNextJSLayout(config) {
27
+ return `import type { Metadata } from 'next'
28
+ import './globals.css'
29
+
30
+ export const metadata: Metadata = {
31
+ title: '${config.projectName}',
32
+ description: 'Generated by ForgeStack OS',
33
+ }
34
+
35
+ export default function RootLayout({
36
+ children,
37
+ }: {
38
+ children: React.ReactNode
39
+ }) {
40
+ return (
41
+ <html lang="en">
42
+ <body>{children}</body>
43
+ </html>
44
+ )
45
+ }
46
+ `;
47
+ }
48
+ function getNextJSLoginPage(config) {
49
+ if (config.auth === 'clerk') {
50
+ return `import { SignIn } from '@clerk/nextjs'
51
+
52
+ export default function LoginPage() {
53
+ return (
54
+ <div className="min-h-screen flex items-center justify-center bg-gray-900">
55
+ <SignIn />
56
+ </div>
57
+ )
58
+ }
59
+ `;
60
+ }
61
+ return `'use client'
62
+
63
+ import { useState } from 'react'
64
+ import { useRouter } from 'next/navigation'
65
+ import api from '@/lib/api'
66
+
67
+ export default function LoginPage() {
68
+ const [email, setEmail] = useState('')
69
+ const [password, setPassword] = useState('')
70
+ const [error, setError] = useState('')
71
+ const router = useRouter()
72
+
73
+ const handleSubmit = async (e: React.FormEvent) => {
74
+ e.preventDefault()
75
+ try {
76
+ const res = await api.post('/auth/login', { email, password })
77
+ localStorage.setItem('token', res.data.token)
78
+ router.push('/dashboard')
79
+ } catch (err: any) {
80
+ setError(err.response?.data?.error || 'Login failed')
81
+ }
82
+ }
83
+
84
+ return (
85
+ <div className="min-h-screen flex items-center justify-center bg-gray-900">
86
+ <div className="bg-gray-800 p-8 rounded-lg shadow-lg w-full max-w-md">
87
+ <h1 className="text-3xl font-bold text-white mb-6">Login</h1>
88
+ {error && <div className="bg-red-500 text-white p-3 rounded mb-4">{error}</div>}
89
+ <form onSubmit={handleSubmit}>
90
+ <div className="mb-4">
91
+ <label className="block text-gray-300 mb-2">Email</label>
92
+ <input
93
+ type="email"
94
+ value={email}
95
+ onChange={(e) => setEmail(e.target.value)}
96
+ className="w-full p-3 rounded bg-gray-700 text-white"
97
+ required
98
+ />
99
+ </div>
100
+ <div className="mb-6">
101
+ <label className="block text-gray-300 mb-2">Password</label>
102
+ <input
103
+ type="password"
104
+ value={password}
105
+ onChange={(e) => setPassword(e.target.value)}
106
+ className="w-full p-3 rounded bg-gray-700 text-white"
107
+ required
108
+ />
109
+ </div>
110
+ <button
111
+ type="submit"
112
+ className="w-full bg-blue-600 hover:bg-blue-700 text-white font-bold py-3 rounded"
113
+ >
114
+ Login
115
+ </button>
116
+ </form>
117
+ </div>
118
+ </div>
119
+ )
120
+ }
121
+ `;
122
+ }
123
+ function getNextJSDashboardPage(config) {
124
+ if (config.auth === 'clerk') {
125
+ return `import { UserButton } from '@clerk/nextjs'
126
+ import { currentUser } from '@clerk/nextjs/server'
127
+ import { redirect } from 'next/navigation'
128
+
129
+ export default async function DashboardPage() {
130
+ const user = await currentUser()
131
+
132
+ if (!user) {
133
+ redirect('/login')
134
+ }
135
+
136
+ return (
137
+ <div className="min-h-screen bg-gray-900 text-white">
138
+ <nav className="bg-gray-800 p-4">
139
+ <div className="container mx-auto flex justify-between items-center">
140
+ <h1 className="text-2xl font-bold">${config.projectName}</h1>
141
+ <UserButton afterSignOutUrl="/" />
142
+ </div>
143
+ </nav>
144
+ <div className="container mx-auto px-4 py-16">
145
+ <h2 className="text-3xl font-bold mb-4">Welcome, {user.firstName || user.emailAddresses[0].emailAddress}!</h2>
146
+ <p className="text-gray-400">You're logged in to your dashboard.</p>
147
+ </div>
148
+ </div>
149
+ )
150
+ }
151
+ `;
152
+ }
153
+ return `'use client'
154
+
155
+ import { useEffect, useState } from 'react'
156
+ import { useRouter } from 'next/navigation'
157
+
158
+ export default function DashboardPage() {
159
+ const [user, setUser] = useState<any>(null)
160
+ const [loading, setLoading] = useState(true)
161
+ const router = useRouter()
162
+
163
+ useEffect(() => {
164
+ const token = localStorage.getItem('token')
165
+ if (!token) {
166
+ router.push('/login')
167
+ return
168
+ }
169
+
170
+ // Decode JWT to get user info (simplified)
171
+ try {
172
+ const payload = JSON.parse(atob(token.split('.')[1]))
173
+ setUser(payload)
174
+ } catch (err) {
175
+ router.push('/login')
176
+ } finally {
177
+ setLoading(false)
178
+ }
179
+ }, [router])
180
+
181
+ const handleLogout = () => {
182
+ localStorage.removeItem('token')
183
+ router.push('/login')
184
+ }
185
+
186
+ if (loading) {
187
+ return (
188
+ <div className="min-h-screen bg-gray-900 flex items-center justify-center">
189
+ <div className="text-white">Loading...</div>
190
+ </div>
191
+ )
192
+ }
193
+
194
+ return (
195
+ <div className="min-h-screen bg-gray-900 text-white">
196
+ <nav className="bg-gray-800 p-4">
197
+ <div className="container mx-auto flex justify-between items-center">
198
+ <h1 className="text-2xl font-bold">${config.projectName}</h1>
199
+ <button
200
+ onClick={handleLogout}
201
+ className="bg-red-600 hover:bg-red-700 px-4 py-2 rounded"
202
+ >
203
+ Logout
204
+ </button>
205
+ </div>
206
+ </nav>
207
+ <div className="container mx-auto px-4 py-16">
208
+ <h2 className="text-3xl font-bold mb-4">Welcome, {user?.email}!</h2>
209
+ <p className="text-gray-400">You're logged in to your dashboard.</p>
210
+ </div>
211
+ </div>
212
+ )
213
+ }
214
+ `;
215
+ }
216
+ //# sourceMappingURL=nextjs-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nextjs-helpers.js","sourceRoot":"","sources":["../../src/generators/nextjs-helpers.ts"],"names":[],"mappings":";;AAIA,4CAiBC;AAGD,0CAqBC;AAED,gDA2EC;AAED,wDA6FC;AArNM,KAAK,UAAU,gBAAgB,CAAC,MAAmB,EAAE,WAAmB;IAC3E,QAAQ,MAAM,CAAC,QAAQ,EAAE,CAAC;QACtB,KAAK,YAAY;YACb,MAAM,iBAAiB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;YAC7C,MAAM;QACV,KAAK,QAAQ;YACT,MAAM,cAAc,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;YAC1C,MAAM;QACV,KAAK,UAAU;YACX,MAAM,eAAe,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;YAC3C,MAAM;QACV,KAAK,WAAW;YACZ,MAAM,iBAAiB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;YAC7C,MAAM;QACV;YACI,MAAM,IAAI,KAAK,CAAC,yBAAyB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IACpE,CAAC;AACL,CAAC;AAED,+BAA+B;AAC/B,SAAgB,eAAe,CAAC,MAAmB;IAC/C,OAAO;;;;YAIC,MAAM,CAAC,WAAW;;;;;;;;;;;;;;;CAe7B,CAAC;AACF,CAAC;AAED,SAAgB,kBAAkB,CAAC,MAAmB;IAClD,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC1B,OAAO;;;;;;;;;CASd,CAAC;IACE,CAAC;IAED,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4DV,CAAC;AACF,CAAC;AAED,SAAgB,sBAAsB,CAAC,MAAmB;IACtD,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC1B,OAAO;;;;;;;;;;;;;;;+CAegC,MAAM,CAAC,WAAW;;;;;;;;;;;CAWhE,CAAC;IACE,CAAC;IAED,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+CA6CoC,MAAM,CAAC,WAAW;;;;;;;;;;;;;;;;CAgBhE,CAAC;AACF,CAAC"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const commander_1 = require("commander");
5
+ const create_1 = require("./commands/create");
6
+ const program = new commander_1.Command();
7
+ program
8
+ .name('forgestack')
9
+ .description('ForgeStack OS - One platform. Any stack. Production-ready.')
10
+ .version('0.1.0');
11
+ program
12
+ .command('create <project-name>')
13
+ .description('Create a new full-stack SaaS application')
14
+ .action(create_1.createCommand)
15
+ .option('--frontend <framework>', 'Frontend framework')
16
+ .option('--backend <framework>', 'Backend framework')
17
+ .option('--auth <provider>', 'Auth provider')
18
+ .option('--database <db>', 'Database')
19
+ .option('--api <style>', 'API style')
20
+ .option('--docker', 'Include Docker configuration')
21
+ .option('--no-docker', 'Skip Docker configuration')
22
+ .option('--multi-tenant', 'Enable multi-tenancy');
23
+ program.parse();
24
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAEA,yCAAoC;AAEpC,8CAAkD;AAElD,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACF,IAAI,CAAC,YAAY,CAAC;KAClB,WAAW,CAAC,4DAA4D,CAAC;KACzE,OAAO,CAAC,OAAO,CAAC,CAAC;AAEtB,OAAO;KACF,OAAO,CAAC,uBAAuB,CAAC;KAChC,WAAW,CAAC,0CAA0C,CAAC;KACvD,MAAM,CAAC,sBAAa,CAAC;KACrB,MAAM,CAAC,wBAAwB,EAAE,oBAAoB,CAAC;KACtD,MAAM,CAAC,uBAAuB,EAAE,mBAAmB,CAAC;KACpD,MAAM,CAAC,mBAAmB,EAAE,eAAe,CAAC;KAC5C,MAAM,CAAC,iBAAiB,EAAE,UAAU,CAAC;KACrC,MAAM,CAAC,eAAe,EAAE,WAAW,CAAC;KACpC,MAAM,CAAC,UAAU,EAAE,8BAA8B,CAAC;KAClD,MAAM,CAAC,aAAa,EAAE,2BAA2B,CAAC;KAClD,MAAM,CAAC,gBAAgB,EAAE,sBAAsB,CAAC,CAAC;AAEtD,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,15 @@
1
+ export interface StackConfig {
2
+ projectName: string;
3
+ frontend: 'react-vite' | 'nextjs' | 'vue-vite' | 'sveltekit';
4
+ backend: 'express' | 'fastify' | 'nestjs' | 'bun-elysia' | 'go-fiber';
5
+ auth: 'jwt' | 'clerk' | 'supabase' | 'authjs' | 'firebase';
6
+ database: 'postgresql' | 'mongodb' | 'mysql' | 'sqlite' | 'supabase-db';
7
+ apiStyle: 'rest' | 'graphql' | 'trpc';
8
+ docker: boolean;
9
+ multiTenant: boolean;
10
+ }
11
+ export interface ValidationResult {
12
+ valid: boolean;
13
+ errors: string[];
14
+ warnings: string[];
15
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,YAAY,GAAG,QAAQ,GAAG,UAAU,GAAG,WAAW,CAAC;IAC7D,OAAO,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,YAAY,GAAG,UAAU,CAAC;IACtE,IAAI,EAAE,KAAK,GAAG,OAAO,GAAG,UAAU,GAAG,QAAQ,GAAG,UAAU,CAAC;IAC3D,QAAQ,EAAE,YAAY,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,GAAG,aAAa,CAAC;IACxE,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC;IACtC,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC7B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACtB"}
package/dist/types.js ADDED
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,9 @@
1
+ import { Ora } from 'ora';
2
+ export declare const logger: {
3
+ info: (message: string) => void;
4
+ success: (message: string) => void;
5
+ error: (message: string) => void;
6
+ warning: (message: string) => void;
7
+ title: (message: string) => void;
8
+ spinner: (text: string) => Ora;
9
+ };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AACA,OAAY,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE/B,eAAO,MAAM,MAAM;oBACC,MAAM;uBAIH,MAAM;qBAIR,MAAM;uBAIJ,MAAM;qBAIR,MAAM;oBAIP,MAAM,KAAG,GAAG;CAM/B,CAAC"}
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.logger = void 0;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const ora_1 = __importDefault(require("ora"));
9
+ exports.logger = {
10
+ info: (message) => {
11
+ console.log(chalk_1.default.blue('ℹ'), message);
12
+ },
13
+ success: (message) => {
14
+ console.log(chalk_1.default.green('✔'), message);
15
+ },
16
+ error: (message) => {
17
+ console.log(chalk_1.default.red('✖'), message);
18
+ },
19
+ warning: (message) => {
20
+ console.log(chalk_1.default.yellow('⚠'), message);
21
+ },
22
+ title: (message) => {
23
+ console.log(chalk_1.default.bold.cyan(`\n${message}\n`));
24
+ },
25
+ spinner: (text) => {
26
+ return (0, ora_1.default)({
27
+ text,
28
+ color: 'cyan',
29
+ }).start();
30
+ },
31
+ };
32
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAC1B,8CAA+B;AAElB,QAAA,MAAM,GAAG;IAClB,IAAI,EAAE,CAAC,OAAe,EAAE,EAAE;QACtB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,EAAE,CAAC,OAAe,EAAE,EAAE;QACzB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,EAAE,CAAC,OAAe,EAAE,EAAE;QACvB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IAED,OAAO,EAAE,CAAC,OAAe,EAAE,EAAE;QACzB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,EAAE,CAAC,OAAe,EAAE,EAAE;QACvB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC;IACnD,CAAC;IAED,OAAO,EAAE,CAAC,IAAY,EAAO,EAAE;QAC3B,OAAO,IAAA,aAAG,EAAC;YACP,IAAI;YACJ,KAAK,EAAE,MAAM;SAChB,CAAC,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;CACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { StackConfig } from '../types';
2
+ export declare function promptForStack(projectName: string, options?: any): Promise<StackConfig>;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/utils/prompts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAoF9E"}
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.promptForStack = promptForStack;
7
+ const inquirer_1 = __importDefault(require("inquirer"));
8
+ async function promptForStack(projectName, options = {}) {
9
+ console.log('\n');
10
+ // If options are provided, merge them with defaults and return
11
+ // This allows non-interactive mode
12
+ if (options.frontend || options.backend || options.auth || options.database) {
13
+ return {
14
+ projectName,
15
+ frontend: options.frontend || 'react-vite',
16
+ backend: options.backend || 'express',
17
+ auth: options.auth || 'jwt',
18
+ database: options.database || 'postgresql',
19
+ apiStyle: options.api // 'api' option maps to 'apiStyle' in config
20
+ ? (options.api === 'trpc' ? 'trpc' : options.api === 'graphql' ? 'graphql' : 'rest')
21
+ : 'rest',
22
+ docker: options.docker !== false, // Default to true unless --no-docker
23
+ multiTenant: !!options.multiTenant,
24
+ };
25
+ }
26
+ const answers = await inquirer_1.default.prompt([
27
+ {
28
+ type: 'list',
29
+ name: 'frontend',
30
+ message: 'Choose your frontend framework:',
31
+ choices: [
32
+ { name: 'React + Vite (Recommended)', value: 'react-vite' },
33
+ { name: 'Next.js (App Router)', value: 'nextjs' },
34
+ { name: 'Vue + Vite', value: 'vue-vite' },
35
+ { name: 'SvelteKit', value: 'sveltekit' },
36
+ ],
37
+ default: 'react-vite',
38
+ },
39
+ {
40
+ type: 'list',
41
+ name: 'backend',
42
+ message: 'Choose your backend framework:',
43
+ choices: [
44
+ { name: 'Node.js + Express (Recommended)', value: 'express' },
45
+ { name: 'Node.js + Fastify', value: 'fastify' },
46
+ { name: 'NestJS', value: 'nestjs' },
47
+ { name: 'Bun + Elysia', value: 'bun-elysia' },
48
+ { name: 'Go + Fiber (Experimental)', value: 'go-fiber' },
49
+ ],
50
+ default: 'express',
51
+ },
52
+ {
53
+ type: 'list',
54
+ name: 'auth',
55
+ message: 'Choose your authentication provider:',
56
+ choices: [
57
+ { name: 'Built-in JWT Auth (Free)', value: 'jwt' },
58
+ { name: 'Clerk', value: 'clerk' },
59
+ { name: 'Supabase Auth', value: 'supabase' },
60
+ { name: 'Auth.js (NextAuth)', value: 'authjs' },
61
+ { name: 'Firebase Auth', value: 'firebase' },
62
+ ],
63
+ default: 'jwt',
64
+ },
65
+ {
66
+ type: 'list',
67
+ name: 'database',
68
+ message: 'Choose your database:',
69
+ choices: [
70
+ { name: 'PostgreSQL + Prisma (Recommended)', value: 'postgresql' },
71
+ { name: 'MongoDB + Mongoose', value: 'mongodb' },
72
+ { name: 'MySQL + Prisma', value: 'mysql' },
73
+ { name: 'SQLite (Local)', value: 'sqlite' },
74
+ { name: 'Supabase DB', value: 'supabase-db' },
75
+ ],
76
+ default: 'postgresql',
77
+ },
78
+ {
79
+ type: 'list',
80
+ name: 'apiStyle',
81
+ message: 'Choose your API style:',
82
+ choices: [
83
+ { name: 'REST (Recommended)', value: 'rest' },
84
+ { name: 'GraphQL', value: 'graphql' },
85
+ { name: 'tRPC (Type-safe)', value: 'trpc' },
86
+ ],
87
+ default: 'rest',
88
+ },
89
+ {
90
+ type: 'confirm',
91
+ name: 'docker',
92
+ message: 'Include Docker configuration?',
93
+ default: true,
94
+ },
95
+ {
96
+ type: 'confirm',
97
+ name: 'multiTenant',
98
+ message: 'Enable multi-tenancy support?',
99
+ default: false,
100
+ },
101
+ ]);
102
+ return {
103
+ projectName,
104
+ ...answers,
105
+ };
106
+ }
107
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/utils/prompts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { StackConfig, ValidationResult } from '../types';
2
+ export declare function validateStackConfig(config: StackConfig): ValidationResult;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../src/utils/validators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAGzD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,WAAW,GAAG,gBAAgB,CA8CzE"}
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.validateStackConfig = validateStackConfig;
7
+ const validate_npm_package_name_1 = __importDefault(require("validate-npm-package-name"));
8
+ function validateStackConfig(config) {
9
+ const errors = [];
10
+ const warnings = [];
11
+ // Validate project name
12
+ const nameValidation = (0, validate_npm_package_name_1.default)(config.projectName);
13
+ if (!nameValidation.validForNewPackages) {
14
+ errors.push(`Invalid project name: ${nameValidation.errors?.join(', ')}`);
15
+ }
16
+ // tRPC requires TypeScript backend
17
+ if (config.apiStyle === 'trpc') {
18
+ if (config.backend === 'go-fiber') {
19
+ errors.push('tRPC is not compatible with Go backend. Please choose a TypeScript backend.');
20
+ }
21
+ }
22
+ // GraphQL compatibility
23
+ if (config.apiStyle === 'graphql') {
24
+ if (config.backend === 'bun-elysia' || config.backend === 'go-fiber') {
25
+ warnings.push('GraphQL support for this backend is experimental.');
26
+ }
27
+ }
28
+ // Supabase auth requires Supabase DB
29
+ if (config.auth === 'supabase' && config.database !== 'supabase-db') {
30
+ warnings.push('Supabase Auth works best with Supabase DB. Consider using Supabase DB for full integration.');
31
+ }
32
+ // Go backend is experimental
33
+ if (config.backend === 'go-fiber') {
34
+ warnings.push('Go + Fiber backend is experimental and may have limited features.');
35
+ }
36
+ // Multi-tenancy warnings
37
+ if (config.multiTenant) {
38
+ if (config.database === 'sqlite') {
39
+ warnings.push('SQLite with multi-tenancy is not recommended for production use.');
40
+ }
41
+ }
42
+ return {
43
+ valid: errors.length === 0,
44
+ errors,
45
+ warnings,
46
+ };
47
+ }
48
+ //# sourceMappingURL=validators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validators.js","sourceRoot":"","sources":["../../src/utils/validators.ts"],"names":[],"mappings":";;;;;AAGA,kDA8CC;AAhDD,0FAA+D;AAE/D,SAAgB,mBAAmB,CAAC,MAAmB;IACnD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,wBAAwB;IACxB,MAAM,cAAc,GAAG,IAAA,mCAAsB,EAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAClE,IAAI,CAAC,cAAc,CAAC,mBAAmB,EAAE,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,yBAAyB,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9E,CAAC;IAED,mCAAmC;IACnC,IAAI,MAAM,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;QAC7B,IAAI,MAAM,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC,6EAA6E,CAAC,CAAC;QAC/F,CAAC;IACL,CAAC;IAED,wBAAwB;IACxB,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAChC,IAAI,MAAM,CAAC,OAAO,KAAK,YAAY,IAAI,MAAM,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;YACnE,QAAQ,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;QACvE,CAAC;IACL,CAAC;IAED,qCAAqC;IACrC,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,IAAI,MAAM,CAAC,QAAQ,KAAK,aAAa,EAAE,CAAC;QAClE,QAAQ,CAAC,IAAI,CAAC,6FAA6F,CAAC,CAAC;IACjH,CAAC;IAED,6BAA6B;IAC7B,IAAI,MAAM,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;QAChC,QAAQ,CAAC,IAAI,CAAC,mEAAmE,CAAC,CAAC;IACvF,CAAC;IAED,yBAAyB;IACzB,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QACrB,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC/B,QAAQ,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC;QACtF,CAAC;IACL,CAAC;IAED,OAAO;QACH,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;QAC1B,MAAM;QACN,QAAQ;KACX,CAAC;AACN,CAAC"}