create-arkos 0.0.9 → 0.0.13

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 (31) hide show
  1. package/dist/create-arkos/src/index.js +54 -0
  2. package/dist/create-arkos/src/index.js.map +1 -0
  3. package/dist/create-arkos/src/utils/helpers/hbs-tester.helpers.js.map +1 -0
  4. package/dist/create-arkos/src/utils/helpers/index.js.map +1 -0
  5. package/dist/create-arkos/src/utils/helpers/template-processor.js.map +1 -0
  6. package/dist/{utils → create-arkos/src/utils}/project-config-inquirer.js +5 -1
  7. package/dist/create-arkos/src/utils/project-config-inquirer.js.map +1 -0
  8. package/dist/{utils → create-arkos/src/utils}/template-compiler.js +5 -3
  9. package/dist/create-arkos/src/utils/template-compiler.js.map +1 -0
  10. package/dist/index.d.mts +1 -0
  11. package/dist/index.d.ts +1 -0
  12. package/dist/index.js +331 -37
  13. package/dist/index.mjs +325 -0
  14. package/dist/shared/src/index.js +18 -0
  15. package/dist/shared/src/index.js.map +1 -0
  16. package/dist/shared/src/utils/helpers/user-agent.helpers.js +25 -0
  17. package/dist/shared/src/utils/helpers/user-agent.helpers.js.map +1 -0
  18. package/package.json +10 -9
  19. package/templates/basic/.gitignore.hbs +2 -0
  20. package/templates/basic/package.json.hbs +19 -2
  21. package/templates/basic/prisma/schema/user.prisma.hbs +1 -1
  22. package/templates/basic/src/app.ts.hbs +3 -0
  23. package/dist/index.js.map +0 -1
  24. package/dist/utils/helpers/hbs-tester.helpers.js.map +0 -1
  25. package/dist/utils/helpers/index.js.map +0 -1
  26. package/dist/utils/helpers/template-processor.js.map +0 -1
  27. package/dist/utils/project-config-inquirer.js.map +0 -1
  28. package/dist/utils/template-compiler.js.map +0 -1
  29. /package/dist/{utils → create-arkos/src/utils}/helpers/hbs-tester.helpers.js +0 -0
  30. /package/dist/{utils → create-arkos/src/utils}/helpers/index.js +0 -0
  31. /package/dist/{utils → create-arkos/src/utils}/helpers/template-processor.js +0 -0
@@ -0,0 +1,54 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
4
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
5
+ return new (P || (P = Promise))(function (resolve, reject) {
6
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
7
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
8
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
9
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
10
+ });
11
+ };
12
+ var __importDefault = (this && this.__importDefault) || function (mod) {
13
+ return (mod && mod.__esModule) ? mod : { "default": mod };
14
+ };
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ const fs_1 = __importDefault(require("fs"));
17
+ const path_1 = __importDefault(require("path"));
18
+ const chalk_1 = __importDefault(require("chalk"));
19
+ const child_process_1 = require("child_process");
20
+ const project_config_inquirer_1 = __importDefault(require("./utils/project-config-inquirer"));
21
+ const template_compiler_1 = __importDefault(require("./utils/template-compiler"));
22
+ const handlebars_1 = __importDefault(require("handlebars"));
23
+ const shared_1 = require("@arkos/shared");
24
+ handlebars_1.default.registerHelper("eq", (a, b) => a === b);
25
+ handlebars_1.default.registerHelper("neq", (a, b) => a !== b);
26
+ function main() {
27
+ return __awaiter(this, void 0, void 0, function* () {
28
+ const config = yield project_config_inquirer_1.default.run();
29
+ const projectPath = config.projectPath;
30
+ fs_1.default.mkdirSync(projectPath, { recursive: true });
31
+ console.info(`\nCreating a new ${chalk_1.default.bold(chalk_1.default.cyan("Arkos.js"))} project in ${chalk_1.default.green(`./${config.projectName}`)}`);
32
+ const templatesDir = path_1.default.join(__dirname, `../templates/basic`);
33
+ yield template_compiler_1.default.compile(templatesDir, config);
34
+ process.chdir(projectPath);
35
+ const packageManager = (0, shared_1.detectPackageManagerFromUserAgent)();
36
+ console.info("\nInstalling dependencies...");
37
+ console.info(`\nUsing ${packageManager}.\n`);
38
+ (0, child_process_1.execSync)(`${packageManager} install`, { stdio: "inherit" });
39
+ console.info("\nRunning: npx prisma generate");
40
+ (0, child_process_1.execSync)(`npx prisma generate`, { stdio: "inherit" });
41
+ console.info(`
42
+ ${chalk_1.default.bold(chalk_1.default.cyan("Arkos.js"))} project created successfully!
43
+
44
+ Next steps:
45
+ 1. cd ${config.projectName}
46
+ 2. setup your ${chalk_1.default.cyan("DATABASE_URL")} under .env
47
+ 3. npx prisma db push
48
+ 4. npx prisma generate
49
+ 5. npm run dev
50
+ `);
51
+ });
52
+ }
53
+ main().catch(console.error);
54
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AACA,4CAAoB;AACpB,gDAAwB;AACxB,kDAA0B;AAC1B,iDAAyC;AACzC,8FAAoE;AACpE,kFAAyD;AACzD,4DAAoC;AACpC,0CAAkE;AAElE,oBAAU,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AACnD,oBAAU,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AAEpD,SAAe,IAAI;;QACjB,MAAM,MAAM,GAAG,MAAM,iCAAqB,CAAC,GAAG,EAAE,CAAC;QAEjD,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;QAEvC,YAAE,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE/C,OAAO,CAAC,IAAI,CACV,oBAAoB,eAAK,CAAC,IAAI,CAAC,eAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,eAAe,eAAK,CAAC,KAAK,CAAC,KAAK,MAAM,CAAC,WAAW,EAAE,CAAC,EAAE,CAC9G,CAAC;QAEF,MAAM,YAAY,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC;QAChE,MAAM,2BAAgB,CAAC,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QAErD,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAE3B,MAAM,cAAc,GAAG,IAAA,0CAAiC,GAAE,CAAC;QAE3D,OAAO,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;QAC7C,OAAO,CAAC,IAAI,CAAC,WAAW,cAAc,KAAK,CAAC,CAAC;QAE7C,IAAA,wBAAQ,EAAC,GAAG,cAAc,UAAU,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAE5D,OAAO,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;QAC/C,IAAA,wBAAQ,EAAC,qBAAqB,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAEtD,OAAO,CAAC,IAAI,CAAC;IACX,eAAK,CAAC,IAAI,CAAC,eAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;;;UAG5B,MAAM,CAAC,WAAW;kBACV,eAAK,CAAC,IAAI,CAAC,cAAc,CAAC;;;;KAIvC,CAAC,CAAC;IACP,CAAC;CAAA;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC","sourcesContent":["#!/usr/bin/env node\nimport fs from \"fs\";\nimport path from \"path\";\nimport chalk from \"chalk\";\nimport { execSync } from \"child_process\";\nimport projectConfigInquirer from \"./utils/project-config-inquirer\";\nimport templateCompiler from \"./utils/template-compiler\";\nimport Handlebars from \"handlebars\";\nimport { detectPackageManagerFromUserAgent } from \"@arkos/shared\";\n\nHandlebars.registerHelper(\"eq\", (a, b) => a === b);\nHandlebars.registerHelper(\"neq\", (a, b) => a !== b);\n\nasync function main() {\n const config = await projectConfigInquirer.run();\n\n const projectPath = config.projectPath;\n\n fs.mkdirSync(projectPath, { recursive: true });\n\n console.info(\n `\\nCreating a new ${chalk.bold(chalk.cyan(\"Arkos.js\"))} project in ${chalk.green(`./${config.projectName}`)}`\n );\n\n const templatesDir = path.join(__dirname, `../templates/basic`);\n await templateCompiler.compile(templatesDir, config);\n\n process.chdir(projectPath);\n\n const packageManager = detectPackageManagerFromUserAgent();\n\n console.info(\"\\nInstalling dependencies...\");\n console.info(`\\nUsing ${packageManager}.\\n`);\n\n execSync(`${packageManager} install`, { stdio: \"inherit\" });\n\n console.info(\"\\nRunning: npx prisma generate\");\n execSync(`npx prisma generate`, { stdio: \"inherit\" });\n\n console.info(`\n ${chalk.bold(chalk.cyan(\"Arkos.js\"))} project created successfully!\n\n Next steps:\n 1. cd ${config.projectName}\n 2. setup your ${chalk.cyan(\"DATABASE_URL\")} under .env\n 3. npx prisma db push\n 4. npx prisma generate\n 5. npm run dev\n `);\n}\n\nmain().catch(console.error);\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hbs-tester.helpers.js","sourceRoot":"","sources":["../../../../../src/utils/helpers/hbs-tester.helpers.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,4CAAoB;AACpB,gDAAwB;AACxB,4DAAoC;AAEpC,oBAAU,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AACnD,oBAAU,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AAEpD,CAAC,GAAG,EAAE;IACJ,MAAM,YAAY,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,6BAA6B,CAAC;IACnE,MAAM,SAAS,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,0BAA0B,CAAC;IAC7D,MAAM,MAAM,GAAkB;QAC5B,WAAW,EAAE,eAAe;QAC5B,UAAU,EAAE,IAAI;QAChB,UAAU,EAAE;YACV,IAAI,EAAE,KAAK;SACZ;QACD,cAAc,EAAE;YACd,IAAI,EAAE,SAAS;YACf,aAAa,EAAE,OAAO;YACtB,aAAa,EAAE,IAAI;SACpB;QACD,MAAM,EAAE;YACN,QAAQ,EAAE,SAAS;YACnB,cAAc,EAAE,sBAAsB;SACvC;QACD,WAAW,EAAE,SAAS;KACvB,CAAC;IAEF,SAAS,gBAAgB,CAAC,GAAW,EAAE,WAAW,GAAG,EAAE;QACrD,YAAE,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAO,MAAM,EAAE,EAAE;YACpE,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;YAC7C,MAAM,YAAY,GAAG,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;YAEzD,IAAI,MAAM,CAAC,WAAW,EAAE,EAAE;gBACxB,gBAAgB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;aAC1C;iBAAM,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;gBACvC,MAAM,YAAY,GAAG,QAAQ,CAAC;gBAC9B,MAAM,QAAQ,GAAG,oBAAU,CAAC,OAAO,CACjC,YAAE,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CACtC,CAAC;gBAEF,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACjC,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;gBAE9C,IAAI,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;gBACxE,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;oBACjC,UAAU,GAAG,cAAI,CAAC,IAAI,CACpB,SAAS,EACT,YAAY,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CACrC,CAAC;gBAEJ,YAAE,CAAC,SAAS,CAAC,cAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC5D,YAAE,CAAC,aAAa,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;aACvC;QACH,CAAC,CAAA,CAAC,CAAC;IACL,CAAC;IAED,gBAAgB,CAAC,YAAY,CAAC,CAAC;AACjC,CAAC,CAAC,EAAE,CAAC","sourcesContent":["import fs from \"fs\";\nimport path from \"path\";\nimport handlebars from \"handlebars\";\nimport { ProjectConfig } from \"../project-config-inquirer\";\nhandlebars.registerHelper(\"eq\", (a, b) => a === b);\nhandlebars.registerHelper(\"neq\", (a, b) => a !== b);\n\n(() => {\n const templatesDir = `${process.cwd()}/cache/handlebars/templates`;\n const outputDir = `${process.cwd()}/cache/handlebars/output`;\n const config: ProjectConfig = {\n projectName: \"arkos-project\",\n typescript: true,\n validation: {\n type: \"zod\",\n },\n authentication: {\n type: \"dynamic\",\n usernameField: \"email\",\n multipleRoles: true,\n },\n prisma: {\n provider: \"mongodb\",\n idDatabaseType: \"@db @default(uuid())\",\n },\n projectPath: outputDir,\n };\n\n function processTemplates(dir: string, relativeDir = \"\") {\n fs.readdirSync(dir, { withFileTypes: true }).forEach(async (dirent) => {\n const fullPath = path.join(dir, dirent.name);\n const relativePath = path.join(relativeDir, dirent.name);\n\n if (dirent.isDirectory()) {\n processTemplates(fullPath, relativePath);\n } else if (dirent.name.endsWith(\".hbs\")) {\n const templatePath = fullPath;\n const template = handlebars.compile(\n fs.readFileSync(templatePath, \"utf8\")\n );\n\n const content = template(config);\n const ext = config.typescript ? \".ts\" : \".js\";\n\n let outputPath = path.join(outputDir, relativePath.replace(\".hbs\", \"\"));\n if (dirent.name.endsWith(\".ts.hbs\"))\n outputPath = path.join(\n outputDir,\n relativePath.replace(\".ts.hbs\", ext)\n );\n\n fs.mkdirSync(path.dirname(outputPath), { recursive: true });\n fs.writeFileSync(outputPath, content);\n }\n });\n }\n\n processTemplates(templatesDir);\n})();\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/utils/helpers/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,SAAsB,gBAAgB,CAAC,WAAmB;;QACxD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,8BAA8B,WAAW,EAAE,CAAC,CAAC;QACrE,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;QAE/D,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC;IAClC,CAAC;CAAA;AAND,4CAMC","sourcesContent":["export async function getLatestVersion(packageName: string) {\n const res = await fetch(`https://registry.npmjs.org/${packageName}`);\n if (!res.ok) throw new Error(`Failed to fetch: ${res.status}`);\n\n const data = await res.json();\n return data[\"dist-tags\"].latest;\n}\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-processor.js","sourceRoot":"","sources":["../../../../../src/utils/helpers/template-processor.ts"],"names":[],"mappings":"","sourcesContent":["// import Handlebars from \"handlebars\";\n// import fs from \"fs\";\n// import { ProjectConfig } from \"../project-config-inquirer\";\n\n// async function processTemplate(templatePath: string, config: ProjectConfig) {\n// const files = await this.getAllFiles(templatePath);\n\n// for (const file of files) {\n// const content = fs.readFileSync(file, \"utf-8\");\n\n// // Compile template\n// const template = Handlebars.compile(content);\n\n// // Replace with config values\n// const processed = template({\n// PROJECT_NAME: config.projectName,\n// AUTH_ENABLED: config.authentication.enabled,\n// AUTH_TYPE: config.authentication.type,\n// VALIDATION_ENABLED: config.validation.enabled,\n// VALIDATION_TYPE: config.validation.type,\n// PRISMA_DATABASE_PROVIDER: config.prismaProvideer,\n// });\n\n// fs.writeFileSync(file, processed);\n// }\n// }\n"]}
@@ -140,7 +140,8 @@ class ProjectConfigInquirer {
140
140
  choices: ["static", "dynamic", "define later"],
141
141
  },
142
142
  ]);
143
- if (authenticationType !== "define later") {
143
+ if (authenticationType !== "define later" &&
144
+ this.config.prisma.provider !== "sqlite") {
144
145
  const { multipleRoles } = yield inquirer_1.default.prompt([
145
146
  {
146
147
  type: "confirm",
@@ -163,6 +164,9 @@ class ProjectConfigInquirer {
163
164
  multipleRoles,
164
165
  };
165
166
  }
167
+ else if (this.config.prisma.provider === "sqlite") {
168
+ console.info(`Skipping multiple roles options because provider is sqlite...`);
169
+ }
166
170
  }
167
171
  });
168
172
  }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-config-inquirer.js","sourceRoot":"","sources":["../../../../src/utils/project-config-inquirer.ts"],"names":[],"mappings":"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","sourcesContent":["import path from \"path\";\nimport inquirer from \"inquirer\";\nimport chalk from \"chalk\";\n\nexport interface ProjectConfig {\n projectName: string;\n typescript: boolean;\n validation: {\n type?: \"zod\" | \"class-validator\";\n };\n authentication: {\n type?: \"static\" | \"dynamic\" | \"define later\";\n usernameField?: \"username\" | \"email\" | \"custom\";\n multipleRoles: boolean;\n };\n prisma: {\n provider:\n | \"postgresql\"\n | \"mysql\"\n | \"sqlite\"\n | \"sqlserver\"\n | \"cockroachdb\"\n | \"mongodb\";\n idDatabaseType: string;\n };\n projectPath: string;\n}\n\nclass ProjectConfigInquirer {\n private config: ProjectConfig;\n\n constructor() {\n this.config = {} as ProjectConfig;\n }\n\n async run() {\n await this.promptProjectName();\n await this.promptTypescript();\n await this.promptPrismaProvider();\n await this.promptValidation();\n await this.promptAuthentication();\n\n const projectPath = path.resolve(process.cwd(), this.config.projectName);\n this.config.projectPath = projectPath;\n\n return this.config;\n }\n\n private async promptProjectName() {\n let projectName = process.argv[2];\n\n if (!projectName) {\n const result = await inquirer.prompt([\n {\n type: \"input\",\n name: \"projectName\",\n message: \"What is the name of your project?\",\n default: \"my-arkos-project\",\n validate: (input) =>\n input.length > 0 ? true : \"Project name cannot be empty\",\n },\n ]);\n projectName = result.projectName;\n }\n this.config.projectName = projectName;\n }\n\n private async promptTypescript() {\n const { typescript } = await inquirer.prompt([\n {\n type: \"confirm\",\n name: \"typescript\",\n message: `Would you like to use ${chalk.cyan(\"TypeScript\")}?`,\n default: false,\n },\n ]);\n this.config.typescript = typescript;\n }\n\n private async promptPrismaProvider() {\n const { prismaProvider } = await inquirer.prompt([\n {\n type: \"list\",\n name: \"prismaProvider\",\n message: `What db provider will be used for ${chalk.cyan(\"Prisma\")}?`,\n choices: [\n \"postgresql\",\n \"mongodb\",\n \"mysql\",\n \"sqlite\",\n \"sqlserver\",\n \"cockroachdb\",\n ],\n },\n ]);\n\n // Set the correct idDatabaseType based on provider\n let idDatabaseType: string;\n\n switch (prismaProvider) {\n case \"mongodb\":\n idDatabaseType = '@id @default(auto()) @map(\"_id\") @db.ObjectId';\n break;\n case \"sqlite\":\n idDatabaseType = \"@id @default(cuid())\";\n break;\n default:\n idDatabaseType = \"@id @default(uuid())\";\n }\n\n this.config.prisma = {\n provider: prismaProvider,\n idDatabaseType: idDatabaseType,\n };\n }\n\n private async promptValidation() {\n const { useValidation } = await inquirer.prompt([\n {\n type: \"confirm\",\n name: \"useValidation\",\n message: `Would you like to set up ${chalk.cyan(\"Validation\")}?`,\n default: true,\n },\n ]);\n\n if (useValidation) {\n const { validationType } = await inquirer.prompt([\n {\n type: \"list\",\n name: \"validationType\",\n message: \"Choose validation library:\",\n choices: [\"zod\", \"class-validator\"],\n },\n ]);\n this.config.validation = {\n type: validationType,\n };\n }\n }\n\n private async promptAuthentication() {\n const { useAuthentication } = await inquirer.prompt([\n {\n type: \"confirm\",\n name: \"useAuthentication\",\n message: `Would you like to set up ${chalk.cyan(\"Authentication\")}?`,\n default: true,\n },\n ]);\n\n if (useAuthentication) {\n const { authenticationType } = await inquirer.prompt([\n {\n type: \"list\",\n name: \"authenticationType\",\n message: \"Choose authentication type:\",\n choices: [\"static\", \"dynamic\", \"define later\"],\n },\n ]);\n\n if (\n authenticationType !== \"define later\" &&\n this.config.prisma.provider !== \"sqlite\"\n ) {\n const { multipleRoles } = await inquirer.prompt([\n {\n type: \"confirm\",\n name: \"multipleRoles\",\n default: true,\n message: `Would you like to use authentication with ${chalk.cyan(\"Multiple Roles\")}?`,\n },\n ]);\n\n const { usernameField } = await inquirer.prompt([\n {\n type: \"list\",\n name: \"usernameField\",\n message: \"Choose default username field for login:\",\n choices: [\"email\", \"username\", \"define later\"],\n },\n ]);\n\n this.config.authentication = {\n type: authenticationType,\n usernameField:\n usernameField === \"define later\" ? \"custom\" : usernameField,\n multipleRoles,\n };\n } else if (this.config.prisma.provider === \"sqlite\") {\n console.info(\n `Skipping multiple roles options because provider is sqlite...`\n );\n }\n }\n }\n}\n\nconst projectConfigInquirer = new ProjectConfigInquirer();\n\nexport default projectConfigInquirer;\n"]}
@@ -25,11 +25,13 @@ class TemplateCompiler {
25
25
  var _a;
26
26
  const files = [];
27
27
  if (config.authentication.type !== "define later")
28
- files.concat(["user.prisma.hbs"]);
28
+ files.concat(...["user.prisma.hbs"]);
29
29
  if (((_a = config.authentication) === null || _a === void 0 ? void 0 : _a.type) === "static")
30
- files.concat(["auth-role.prisma.hbs", "auth-permission.prisma.hbs"]);
30
+ files.concat(...["auth-role.prisma.hbs", "auth-permission.prisma.hbs"]);
31
31
  if (!config.typescript)
32
- files.concat(["tsconfig.json.hbs"]);
32
+ files.concat(...["tsconfig.json.hbs"]);
33
+ if (config.authentication.type === "dynamic")
34
+ files.concat(...["user-role.prisma.hbs"]);
33
35
  return files;
34
36
  }
35
37
  compile(templatesDir, config) {
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-compiler.js","sourceRoot":"","sources":["../../../../src/utils/template-compiler.ts"],"names":[],"mappings":"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","sourcesContent":["import { ProjectConfig } from \"./project-config-inquirer\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport handlebars from \"handlebars\";\n\nclass TemplateCompiler {\n async canCompileAuthenticationTemplates(config: ProjectConfig) {\n return !!config.authentication;\n }\n\n filesToBeSkipped(config: ProjectConfig) {\n const files: string[] = [];\n\n if (config.authentication.type !== \"define later\")\n files.concat(...[\"user.prisma.hbs\"]);\n\n if (config.authentication?.type === \"static\")\n files.concat(...[\"auth-role.prisma.hbs\", \"auth-permission.prisma.hbs\"]);\n\n if (!config.typescript) files.concat(...[\"tsconfig.json.hbs\"]);\n\n if (config.authentication.type === \"dynamic\")\n files.concat(...[\"user-role.prisma.hbs\"]);\n\n return files;\n }\n /**\n * Compiles the Arkos.js project with handlebars templates\n *\n * @param templatesDir {string} templates location\n * @param config {ProjectConfig} the project configuration\n * @returns void\n * */\n async compile(templatesDir: string, config: ProjectConfig) {\n const outputDir = config.projectPath;\n const isTypescript = config.typescript;\n const filesToBeSkipped = this.filesToBeSkipped(config);\n\n function processTemplates(dir: string, relativeDir = \"\") {\n fs.readdirSync(dir, { withFileTypes: true }).forEach(async (dirent) => {\n if (filesToBeSkipped.includes(dirent.name)) return;\n\n const fullPath = path.join(dir, dirent.name);\n const relativePath = path.join(relativeDir, dirent.name);\n\n if (dirent.isDirectory()) {\n processTemplates(fullPath, relativePath);\n } else if (dirent.name.endsWith(\".hbs\")) {\n const templatePath = fullPath;\n const template = handlebars.compile(\n fs.readFileSync(templatePath, \"utf8\")\n );\n\n let arkosLatestVersion = \"1.0.0\";\n\n const content = template({ ...config, arkosLatestVersion });\n const ext = isTypescript ? \".ts\" : \".js\";\n\n let outputPath = path.join(\n outputDir,\n relativePath.replace(\".hbs\", \"\")\n );\n if (dirent.name.endsWith(\".ts.hbs\"))\n outputPath = path.join(\n outputDir,\n relativePath.replace(\".ts.hbs\", ext)\n );\n\n fs.mkdirSync(path.dirname(outputPath), { recursive: true });\n fs.writeFileSync(outputPath, content);\n }\n });\n }\n\n processTemplates(templatesDir);\n }\n}\n\nconst templateCompiler = new TemplateCompiler();\n\nexport default templateCompiler;\n"]}
@@ -0,0 +1 @@
1
+ #!/usr/bin/env node
@@ -0,0 +1 @@
1
+ #!/usr/bin/env node
package/dist/index.js CHANGED
@@ -1,52 +1,346 @@
1
1
  #!/usr/bin/env node
2
2
  "use strict";
3
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
4
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
5
- return new (P || (P = Promise))(function (resolve, reject) {
6
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
7
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
8
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
9
- step((generator = generator.apply(thisArg, _arguments || [])).next());
3
+ var __create = Object.create;
4
+ var __defProp = Object.defineProperty;
5
+ var __defProps = Object.defineProperties;
6
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
7
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
8
+ var __getOwnPropNames = Object.getOwnPropertyNames;
9
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
10
+ var __getProtoOf = Object.getPrototypeOf;
11
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
12
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
13
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
14
+ var __spreadValues = (a, b) => {
15
+ for (var prop in b || (b = {}))
16
+ if (__hasOwnProp.call(b, prop))
17
+ __defNormalProp(a, prop, b[prop]);
18
+ if (__getOwnPropSymbols)
19
+ for (var prop of __getOwnPropSymbols(b)) {
20
+ if (__propIsEnum.call(b, prop))
21
+ __defNormalProp(a, prop, b[prop]);
22
+ }
23
+ return a;
24
+ };
25
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
26
+ var __copyProps = (to, from, except, desc) => {
27
+ if (from && typeof from === "object" || typeof from === "function") {
28
+ for (let key of __getOwnPropNames(from))
29
+ if (!__hasOwnProp.call(to, key) && key !== except)
30
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
31
+ }
32
+ return to;
33
+ };
34
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
35
+ // If the importer is in node compatibility mode or this is not an ESM
36
+ // file that has been converted to a CommonJS file using a Babel-
37
+ // compatible transform (i.e. "__esModule" has not been set), then set
38
+ // "default" to the CommonJS "module.exports" for node compatibility.
39
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
40
+ mod
41
+ ));
42
+ var __async = (__this, __arguments, generator) => {
43
+ return new Promise((resolve, reject) => {
44
+ var fulfilled = (value) => {
45
+ try {
46
+ step(generator.next(value));
47
+ } catch (e) {
48
+ reject(e);
49
+ }
50
+ };
51
+ var rejected = (value) => {
52
+ try {
53
+ step(generator.throw(value));
54
+ } catch (e) {
55
+ reject(e);
56
+ }
57
+ };
58
+ var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
59
+ step((generator = generator.apply(__this, __arguments)).next());
60
+ });
61
+ };
62
+
63
+ // src/index.ts
64
+ var import_fs2 = __toESM(require("fs"));
65
+ var import_path3 = __toESM(require("path"));
66
+ var import_chalk2 = __toESM(require("chalk"));
67
+ var import_child_process = require("child_process");
68
+
69
+ // src/utils/project-config-inquirer.ts
70
+ var import_path = __toESM(require("path"));
71
+ var import_inquirer = __toESM(require("inquirer"));
72
+ var import_chalk = __toESM(require("chalk"));
73
+ var ProjectConfigInquirer = class {
74
+ constructor() {
75
+ this.config = {};
76
+ }
77
+ run() {
78
+ return __async(this, null, function* () {
79
+ yield this.promptProjectName();
80
+ yield this.promptTypescript();
81
+ yield this.promptPrismaProvider();
82
+ yield this.promptValidation();
83
+ yield this.promptAuthentication();
84
+ const projectPath = import_path.default.resolve(process.cwd(), this.config.projectName);
85
+ this.config.projectPath = projectPath;
86
+ return this.config;
87
+ });
88
+ }
89
+ promptProjectName() {
90
+ return __async(this, null, function* () {
91
+ let projectName = process.argv[2];
92
+ if (!projectName) {
93
+ const result = yield import_inquirer.default.prompt([
94
+ {
95
+ type: "input",
96
+ name: "projectName",
97
+ message: "What is the name of your project?",
98
+ default: "my-arkos-project",
99
+ validate: (input) => input.length > 0 ? true : "Project name cannot be empty"
100
+ }
101
+ ]);
102
+ projectName = result.projectName;
103
+ }
104
+ this.config.projectName = projectName;
105
+ });
106
+ }
107
+ promptTypescript() {
108
+ return __async(this, null, function* () {
109
+ const { typescript } = yield import_inquirer.default.prompt([
110
+ {
111
+ type: "confirm",
112
+ name: "typescript",
113
+ message: `Would you like to use ${import_chalk.default.cyan("TypeScript")}?`,
114
+ default: false
115
+ }
116
+ ]);
117
+ this.config.typescript = typescript;
118
+ });
119
+ }
120
+ promptPrismaProvider() {
121
+ return __async(this, null, function* () {
122
+ const { prismaProvider } = yield import_inquirer.default.prompt([
123
+ {
124
+ type: "list",
125
+ name: "prismaProvider",
126
+ message: `What db provider will be used for ${import_chalk.default.cyan("Prisma")}?`,
127
+ choices: [
128
+ "postgresql",
129
+ "mongodb",
130
+ "mysql",
131
+ "sqlite",
132
+ "sqlserver",
133
+ "cockroachdb"
134
+ ]
135
+ }
136
+ ]);
137
+ let idDatabaseType;
138
+ switch (prismaProvider) {
139
+ case "mongodb":
140
+ idDatabaseType = '@id @default(auto()) @map("_id") @db.ObjectId';
141
+ break;
142
+ case "sqlite":
143
+ idDatabaseType = "@id @default(cuid())";
144
+ break;
145
+ default:
146
+ idDatabaseType = "@id @default(uuid())";
147
+ }
148
+ this.config.prisma = {
149
+ provider: prismaProvider,
150
+ idDatabaseType
151
+ };
152
+ });
153
+ }
154
+ promptValidation() {
155
+ return __async(this, null, function* () {
156
+ const { useValidation } = yield import_inquirer.default.prompt([
157
+ {
158
+ type: "confirm",
159
+ name: "useValidation",
160
+ message: `Would you like to set up ${import_chalk.default.cyan("Validation")}?`,
161
+ default: true
162
+ }
163
+ ]);
164
+ if (useValidation) {
165
+ const { validationType } = yield import_inquirer.default.prompt([
166
+ {
167
+ type: "list",
168
+ name: "validationType",
169
+ message: "Choose validation library:",
170
+ choices: ["zod", "class-validator"]
171
+ }
172
+ ]);
173
+ this.config.validation = {
174
+ type: validationType
175
+ };
176
+ }
10
177
  });
178
+ }
179
+ promptAuthentication() {
180
+ return __async(this, null, function* () {
181
+ const { useAuthentication } = yield import_inquirer.default.prompt([
182
+ {
183
+ type: "confirm",
184
+ name: "useAuthentication",
185
+ message: `Would you like to set up ${import_chalk.default.cyan("Authentication")}?`,
186
+ default: true
187
+ }
188
+ ]);
189
+ if (useAuthentication) {
190
+ const { authenticationType } = yield import_inquirer.default.prompt([
191
+ {
192
+ type: "list",
193
+ name: "authenticationType",
194
+ message: "Choose authentication type:",
195
+ choices: ["static", "dynamic", "define later"]
196
+ }
197
+ ]);
198
+ if (authenticationType !== "define later") {
199
+ const { multipleRoles } = yield import_inquirer.default.prompt([
200
+ {
201
+ type: "confirm",
202
+ name: "multipleRoles",
203
+ default: true,
204
+ message: `Would you like to use authentication with ${import_chalk.default.cyan("Multiple Roles")}?`
205
+ }
206
+ ]);
207
+ const { usernameField } = yield import_inquirer.default.prompt([
208
+ {
209
+ type: "list",
210
+ name: "usernameField",
211
+ message: "Choose default username field for login:",
212
+ choices: ["email", "username", "define later"]
213
+ }
214
+ ]);
215
+ this.config.authentication = {
216
+ type: authenticationType,
217
+ usernameField: usernameField === "define later" ? "custom" : usernameField,
218
+ multipleRoles
219
+ };
220
+ }
221
+ }
222
+ });
223
+ }
11
224
  };
12
- var __importDefault = (this && this.__importDefault) || function (mod) {
13
- return (mod && mod.__esModule) ? mod : { "default": mod };
225
+ var projectConfigInquirer = new ProjectConfigInquirer();
226
+ var project_config_inquirer_default = projectConfigInquirer;
227
+
228
+ // src/utils/template-compiler.ts
229
+ var import_path2 = __toESM(require("path"));
230
+ var import_fs = __toESM(require("fs"));
231
+ var import_handlebars = __toESM(require("handlebars"));
232
+ var TemplateCompiler = class {
233
+ canCompileAuthenticationTemplates(config) {
234
+ return __async(this, null, function* () {
235
+ return !!config.authentication;
236
+ });
237
+ }
238
+ filesToBeSkipped(config) {
239
+ var _a;
240
+ const files = [];
241
+ if (config.authentication.type !== "define later")
242
+ files.concat(["user.prisma.hbs"]);
243
+ if (((_a = config.authentication) == null ? void 0 : _a.type) === "static")
244
+ files.concat(["auth-role.prisma.hbs", "auth-permission.prisma.hbs"]);
245
+ if (!config.typescript) files.concat(["tsconfig.json.hbs"]);
246
+ return files;
247
+ }
248
+ /**
249
+ * Compiles the Arkos.js project with handlebars templates
250
+ *
251
+ * @param templatesDir {string} templates location
252
+ * @param config {ProjectConfig} the project configuration
253
+ * @returns void
254
+ * */
255
+ compile(templatesDir, config) {
256
+ return __async(this, null, function* () {
257
+ const outputDir = config.projectPath;
258
+ const isTypescript = config.typescript;
259
+ const filesToBeSkipped = this.filesToBeSkipped(config);
260
+ function processTemplates(dir, relativeDir = "") {
261
+ import_fs.default.readdirSync(dir, { withFileTypes: true }).forEach((dirent) => __async(null, null, function* () {
262
+ if (filesToBeSkipped.includes(dirent.name)) return;
263
+ const fullPath = import_path2.default.join(dir, dirent.name);
264
+ const relativePath = import_path2.default.join(relativeDir, dirent.name);
265
+ if (dirent.isDirectory()) {
266
+ processTemplates(fullPath, relativePath);
267
+ } else if (dirent.name.endsWith(".hbs")) {
268
+ const templatePath = fullPath;
269
+ const template = import_handlebars.default.compile(
270
+ import_fs.default.readFileSync(templatePath, "utf8")
271
+ );
272
+ let arkosLatestVersion = "1.0.0";
273
+ const content = template(__spreadProps(__spreadValues({}, config), { arkosLatestVersion }));
274
+ const ext = isTypescript ? ".ts" : ".js";
275
+ let outputPath = import_path2.default.join(
276
+ outputDir,
277
+ relativePath.replace(".hbs", "")
278
+ );
279
+ if (dirent.name.endsWith(".ts.hbs"))
280
+ outputPath = import_path2.default.join(
281
+ outputDir,
282
+ relativePath.replace(".ts.hbs", ext)
283
+ );
284
+ import_fs.default.mkdirSync(import_path2.default.dirname(outputPath), { recursive: true });
285
+ import_fs.default.writeFileSync(outputPath, content);
286
+ }
287
+ }));
288
+ }
289
+ processTemplates(templatesDir);
290
+ });
291
+ }
14
292
  };
15
- Object.defineProperty(exports, "__esModule", { value: true });
16
- const fs_1 = __importDefault(require("fs"));
17
- const path_1 = __importDefault(require("path"));
18
- const chalk_1 = __importDefault(require("chalk"));
19
- const child_process_1 = require("child_process");
20
- const project_config_inquirer_1 = __importDefault(require("./utils/project-config-inquirer"));
21
- const template_compiler_1 = __importDefault(require("./utils/template-compiler"));
22
- const handlebars_1 = __importDefault(require("handlebars"));
23
- const shared_1 = require("@arkos/shared");
24
- handlebars_1.default.registerHelper("eq", (a, b) => a === b);
25
- handlebars_1.default.registerHelper("neq", (a, b) => a !== b);
293
+ var templateCompiler = new TemplateCompiler();
294
+ var template_compiler_default = templateCompiler;
295
+
296
+ // src/index.ts
297
+ var import_handlebars2 = __toESM(require("handlebars"));
298
+
299
+ // ../shared/src/utils/helpers/user-agent.helpers.ts
300
+ function detectPackageManagerFromUserAgent() {
301
+ const userAgent = process.env.npm_config_user_agent || "";
302
+ if (!userAgent) return "npm";
303
+ if (userAgent.includes("pnpm")) return "pnpm";
304
+ if (userAgent.includes("yarn")) return "yarn";
305
+ if (userAgent.includes("npm")) return "npm";
306
+ if (userAgent.includes("bun")) return "bun";
307
+ if (userAgent.includes("cnpm")) return "cnpm";
308
+ if (userAgent.includes("corepack")) return "corepack";
309
+ if (userAgent.includes("deno")) return "deno";
310
+ return "npm";
311
+ }
312
+
313
+ // src/index.ts
314
+ import_handlebars2.default.registerHelper("eq", (a, b) => a === b);
315
+ import_handlebars2.default.registerHelper("neq", (a, b) => a !== b);
26
316
  function main() {
27
- return __awaiter(this, void 0, void 0, function* () {
28
- const config = yield project_config_inquirer_1.default.run();
29
- const projectPath = config.projectPath;
30
- fs_1.default.mkdirSync(projectPath, { recursive: true });
31
- console.info(`\nCreating a new ${chalk_1.default.bold(chalk_1.default.cyan("Arkos.js"))} project in ${chalk_1.default.green(`./${config.projectName}`)}`);
32
- const templatesDir = path_1.default.join(__dirname, `../templates/basic`);
33
- yield template_compiler_1.default.compile(templatesDir, config);
34
- process.chdir(projectPath);
35
- const packageManager = (0, shared_1.detectPackageManagerFromUserAgent)();
36
- console.info("\nInstalling dependencies...");
37
- console.info(`\nUsing ${packageManager}.\n`);
38
- (0, child_process_1.execSync)(`${packageManager} install`, { stdio: "inherit" });
39
- console.info(`
40
- ${chalk_1.default.bold(chalk_1.default.cyan("Arkos.js"))} project created successfully!
317
+ return __async(this, null, function* () {
318
+ const config = yield project_config_inquirer_default.run();
319
+ const projectPath = config.projectPath;
320
+ import_fs2.default.mkdirSync(projectPath, { recursive: true });
321
+ console.info(
322
+ `
323
+ Creating a new ${import_chalk2.default.bold(import_chalk2.default.cyan("Arkos.js"))} project in ${import_chalk2.default.green(`./${config.projectName}`)}`
324
+ );
325
+ const templatesDir = import_path3.default.join(__dirname, `../templates/basic`);
326
+ yield template_compiler_default.compile(templatesDir, config);
327
+ process.chdir(projectPath);
328
+ const packageManager = detectPackageManagerFromUserAgent();
329
+ console.info("\nInstalling dependencies...");
330
+ console.info(`
331
+ Using ${packageManager}.
332
+ `);
333
+ (0, import_child_process.execSync)(`${packageManager} install`, { stdio: "inherit" });
334
+ console.info(`
335
+ ${import_chalk2.default.bold(import_chalk2.default.cyan("Arkos.js"))} project created successfully!
41
336
 
42
337
  Next steps:
43
338
  1. cd ${config.projectName}
44
- 2. setup your ${chalk_1.default.cyan("DATABASE_URL")} under .env
339
+ 2. setup your ${import_chalk2.default.cyan("DATABASE_URL")} under .env
45
340
  3. npx prisma db push
46
341
  4. npx prisma generate
47
342
  5. npm run dev
48
343
  `);
49
- });
344
+ });
50
345
  }
51
346
  main().catch(console.error);
52
- //# sourceMappingURL=index.js.map
package/dist/index.mjs ADDED
@@ -0,0 +1,325 @@
1
+ #!/usr/bin/env node
2
+ var __defProp = Object.defineProperty;
3
+ var __defProps = Object.defineProperties;
4
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
5
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
8
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
9
+ var __spreadValues = (a, b) => {
10
+ for (var prop in b || (b = {}))
11
+ if (__hasOwnProp.call(b, prop))
12
+ __defNormalProp(a, prop, b[prop]);
13
+ if (__getOwnPropSymbols)
14
+ for (var prop of __getOwnPropSymbols(b)) {
15
+ if (__propIsEnum.call(b, prop))
16
+ __defNormalProp(a, prop, b[prop]);
17
+ }
18
+ return a;
19
+ };
20
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
21
+ var __async = (__this, __arguments, generator) => {
22
+ return new Promise((resolve, reject) => {
23
+ var fulfilled = (value) => {
24
+ try {
25
+ step(generator.next(value));
26
+ } catch (e) {
27
+ reject(e);
28
+ }
29
+ };
30
+ var rejected = (value) => {
31
+ try {
32
+ step(generator.throw(value));
33
+ } catch (e) {
34
+ reject(e);
35
+ }
36
+ };
37
+ var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
38
+ step((generator = generator.apply(__this, __arguments)).next());
39
+ });
40
+ };
41
+
42
+ // src/index.ts
43
+ import fs2 from "fs";
44
+ import path3 from "path";
45
+ import chalk2 from "chalk";
46
+ import { execSync } from "child_process";
47
+
48
+ // src/utils/project-config-inquirer.ts
49
+ import path from "path";
50
+ import inquirer from "inquirer";
51
+ import chalk from "chalk";
52
+ var ProjectConfigInquirer = class {
53
+ constructor() {
54
+ this.config = {};
55
+ }
56
+ run() {
57
+ return __async(this, null, function* () {
58
+ yield this.promptProjectName();
59
+ yield this.promptTypescript();
60
+ yield this.promptPrismaProvider();
61
+ yield this.promptValidation();
62
+ yield this.promptAuthentication();
63
+ const projectPath = path.resolve(process.cwd(), this.config.projectName);
64
+ this.config.projectPath = projectPath;
65
+ return this.config;
66
+ });
67
+ }
68
+ promptProjectName() {
69
+ return __async(this, null, function* () {
70
+ let projectName = process.argv[2];
71
+ if (!projectName) {
72
+ const result = yield inquirer.prompt([
73
+ {
74
+ type: "input",
75
+ name: "projectName",
76
+ message: "What is the name of your project?",
77
+ default: "my-arkos-project",
78
+ validate: (input) => input.length > 0 ? true : "Project name cannot be empty"
79
+ }
80
+ ]);
81
+ projectName = result.projectName;
82
+ }
83
+ this.config.projectName = projectName;
84
+ });
85
+ }
86
+ promptTypescript() {
87
+ return __async(this, null, function* () {
88
+ const { typescript } = yield inquirer.prompt([
89
+ {
90
+ type: "confirm",
91
+ name: "typescript",
92
+ message: `Would you like to use ${chalk.cyan("TypeScript")}?`,
93
+ default: false
94
+ }
95
+ ]);
96
+ this.config.typescript = typescript;
97
+ });
98
+ }
99
+ promptPrismaProvider() {
100
+ return __async(this, null, function* () {
101
+ const { prismaProvider } = yield inquirer.prompt([
102
+ {
103
+ type: "list",
104
+ name: "prismaProvider",
105
+ message: `What db provider will be used for ${chalk.cyan("Prisma")}?`,
106
+ choices: [
107
+ "postgresql",
108
+ "mongodb",
109
+ "mysql",
110
+ "sqlite",
111
+ "sqlserver",
112
+ "cockroachdb"
113
+ ]
114
+ }
115
+ ]);
116
+ let idDatabaseType;
117
+ switch (prismaProvider) {
118
+ case "mongodb":
119
+ idDatabaseType = '@id @default(auto()) @map("_id") @db.ObjectId';
120
+ break;
121
+ case "sqlite":
122
+ idDatabaseType = "@id @default(cuid())";
123
+ break;
124
+ default:
125
+ idDatabaseType = "@id @default(uuid())";
126
+ }
127
+ this.config.prisma = {
128
+ provider: prismaProvider,
129
+ idDatabaseType
130
+ };
131
+ });
132
+ }
133
+ promptValidation() {
134
+ return __async(this, null, function* () {
135
+ const { useValidation } = yield inquirer.prompt([
136
+ {
137
+ type: "confirm",
138
+ name: "useValidation",
139
+ message: `Would you like to set up ${chalk.cyan("Validation")}?`,
140
+ default: true
141
+ }
142
+ ]);
143
+ if (useValidation) {
144
+ const { validationType } = yield inquirer.prompt([
145
+ {
146
+ type: "list",
147
+ name: "validationType",
148
+ message: "Choose validation library:",
149
+ choices: ["zod", "class-validator"]
150
+ }
151
+ ]);
152
+ this.config.validation = {
153
+ type: validationType
154
+ };
155
+ }
156
+ });
157
+ }
158
+ promptAuthentication() {
159
+ return __async(this, null, function* () {
160
+ const { useAuthentication } = yield inquirer.prompt([
161
+ {
162
+ type: "confirm",
163
+ name: "useAuthentication",
164
+ message: `Would you like to set up ${chalk.cyan("Authentication")}?`,
165
+ default: true
166
+ }
167
+ ]);
168
+ if (useAuthentication) {
169
+ const { authenticationType } = yield inquirer.prompt([
170
+ {
171
+ type: "list",
172
+ name: "authenticationType",
173
+ message: "Choose authentication type:",
174
+ choices: ["static", "dynamic", "define later"]
175
+ }
176
+ ]);
177
+ if (authenticationType !== "define later") {
178
+ const { multipleRoles } = yield inquirer.prompt([
179
+ {
180
+ type: "confirm",
181
+ name: "multipleRoles",
182
+ default: true,
183
+ message: `Would you like to use authentication with ${chalk.cyan("Multiple Roles")}?`
184
+ }
185
+ ]);
186
+ const { usernameField } = yield inquirer.prompt([
187
+ {
188
+ type: "list",
189
+ name: "usernameField",
190
+ message: "Choose default username field for login:",
191
+ choices: ["email", "username", "define later"]
192
+ }
193
+ ]);
194
+ this.config.authentication = {
195
+ type: authenticationType,
196
+ usernameField: usernameField === "define later" ? "custom" : usernameField,
197
+ multipleRoles
198
+ };
199
+ }
200
+ }
201
+ });
202
+ }
203
+ };
204
+ var projectConfigInquirer = new ProjectConfigInquirer();
205
+ var project_config_inquirer_default = projectConfigInquirer;
206
+
207
+ // src/utils/template-compiler.ts
208
+ import path2 from "path";
209
+ import fs from "fs";
210
+ import handlebars from "handlebars";
211
+ var TemplateCompiler = class {
212
+ canCompileAuthenticationTemplates(config) {
213
+ return __async(this, null, function* () {
214
+ return !!config.authentication;
215
+ });
216
+ }
217
+ filesToBeSkipped(config) {
218
+ var _a;
219
+ const files = [];
220
+ if (config.authentication.type !== "define later")
221
+ files.concat(["user.prisma.hbs"]);
222
+ if (((_a = config.authentication) == null ? void 0 : _a.type) === "static")
223
+ files.concat(["auth-role.prisma.hbs", "auth-permission.prisma.hbs"]);
224
+ if (!config.typescript) files.concat(["tsconfig.json.hbs"]);
225
+ return files;
226
+ }
227
+ /**
228
+ * Compiles the Arkos.js project with handlebars templates
229
+ *
230
+ * @param templatesDir {string} templates location
231
+ * @param config {ProjectConfig} the project configuration
232
+ * @returns void
233
+ * */
234
+ compile(templatesDir, config) {
235
+ return __async(this, null, function* () {
236
+ const outputDir = config.projectPath;
237
+ const isTypescript = config.typescript;
238
+ const filesToBeSkipped = this.filesToBeSkipped(config);
239
+ function processTemplates(dir, relativeDir = "") {
240
+ fs.readdirSync(dir, { withFileTypes: true }).forEach((dirent) => __async(null, null, function* () {
241
+ if (filesToBeSkipped.includes(dirent.name)) return;
242
+ const fullPath = path2.join(dir, dirent.name);
243
+ const relativePath = path2.join(relativeDir, dirent.name);
244
+ if (dirent.isDirectory()) {
245
+ processTemplates(fullPath, relativePath);
246
+ } else if (dirent.name.endsWith(".hbs")) {
247
+ const templatePath = fullPath;
248
+ const template = handlebars.compile(
249
+ fs.readFileSync(templatePath, "utf8")
250
+ );
251
+ let arkosLatestVersion = "1.0.0";
252
+ const content = template(__spreadProps(__spreadValues({}, config), { arkosLatestVersion }));
253
+ const ext = isTypescript ? ".ts" : ".js";
254
+ let outputPath = path2.join(
255
+ outputDir,
256
+ relativePath.replace(".hbs", "")
257
+ );
258
+ if (dirent.name.endsWith(".ts.hbs"))
259
+ outputPath = path2.join(
260
+ outputDir,
261
+ relativePath.replace(".ts.hbs", ext)
262
+ );
263
+ fs.mkdirSync(path2.dirname(outputPath), { recursive: true });
264
+ fs.writeFileSync(outputPath, content);
265
+ }
266
+ }));
267
+ }
268
+ processTemplates(templatesDir);
269
+ });
270
+ }
271
+ };
272
+ var templateCompiler = new TemplateCompiler();
273
+ var template_compiler_default = templateCompiler;
274
+
275
+ // src/index.ts
276
+ import Handlebars from "handlebars";
277
+
278
+ // ../shared/src/utils/helpers/user-agent.helpers.ts
279
+ function detectPackageManagerFromUserAgent() {
280
+ const userAgent = process.env.npm_config_user_agent || "";
281
+ if (!userAgent) return "npm";
282
+ if (userAgent.includes("pnpm")) return "pnpm";
283
+ if (userAgent.includes("yarn")) return "yarn";
284
+ if (userAgent.includes("npm")) return "npm";
285
+ if (userAgent.includes("bun")) return "bun";
286
+ if (userAgent.includes("cnpm")) return "cnpm";
287
+ if (userAgent.includes("corepack")) return "corepack";
288
+ if (userAgent.includes("deno")) return "deno";
289
+ return "npm";
290
+ }
291
+
292
+ // src/index.ts
293
+ Handlebars.registerHelper("eq", (a, b) => a === b);
294
+ Handlebars.registerHelper("neq", (a, b) => a !== b);
295
+ function main() {
296
+ return __async(this, null, function* () {
297
+ const config = yield project_config_inquirer_default.run();
298
+ const projectPath = config.projectPath;
299
+ fs2.mkdirSync(projectPath, { recursive: true });
300
+ console.info(
301
+ `
302
+ Creating a new ${chalk2.bold(chalk2.cyan("Arkos.js"))} project in ${chalk2.green(`./${config.projectName}`)}`
303
+ );
304
+ const templatesDir = path3.join(__dirname, `../templates/basic`);
305
+ yield template_compiler_default.compile(templatesDir, config);
306
+ process.chdir(projectPath);
307
+ const packageManager = detectPackageManagerFromUserAgent();
308
+ console.info("\nInstalling dependencies...");
309
+ console.info(`
310
+ Using ${packageManager}.
311
+ `);
312
+ execSync(`${packageManager} install`, { stdio: "inherit" });
313
+ console.info(`
314
+ ${chalk2.bold(chalk2.cyan("Arkos.js"))} project created successfully!
315
+
316
+ Next steps:
317
+ 1. cd ${config.projectName}
318
+ 2. setup your ${chalk2.cyan("DATABASE_URL")} under .env
319
+ 3. npx prisma db push
320
+ 4. npx prisma generate
321
+ 5. npm run dev
322
+ `);
323
+ });
324
+ }
325
+ main().catch(console.error);
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./utils/helpers/user-agent.helpers"), exports);
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../shared/src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,qEAAmD","sourcesContent":["export * from \"./utils/helpers/user-agent.helpers\";\n"]}
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.detectPackageManagerFromUserAgent = void 0;
4
+ function detectPackageManagerFromUserAgent() {
5
+ const userAgent = process.env.npm_config_user_agent || "";
6
+ if (!userAgent)
7
+ return "npm";
8
+ if (userAgent.includes("pnpm"))
9
+ return "pnpm";
10
+ if (userAgent.includes("yarn"))
11
+ return "yarn";
12
+ if (userAgent.includes("npm"))
13
+ return "npm";
14
+ if (userAgent.includes("bun"))
15
+ return "bun";
16
+ if (userAgent.includes("cnpm"))
17
+ return "cnpm";
18
+ if (userAgent.includes("corepack"))
19
+ return "corepack";
20
+ if (userAgent.includes("deno"))
21
+ return "deno";
22
+ return "npm";
23
+ }
24
+ exports.detectPackageManagerFromUserAgent = detectPackageManagerFromUserAgent;
25
+ //# sourceMappingURL=user-agent.helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-agent.helpers.js","sourceRoot":"","sources":["../../../../../../shared/src/utils/helpers/user-agent.helpers.ts"],"names":[],"mappings":";;;AAMA,SAAgB,iCAAiC;IAC/C,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE,CAAC;IAE1D,IAAI,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC;IAC7B,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IAC9C,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IAC9C,IAAI,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IAC9C,IAAI,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,OAAO,UAAU,CAAC;IACtD,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IAE9C,OAAO,KAAK,CAAC;AACf,CAAC;AAbD,8EAaC","sourcesContent":["/**\n * Helps getting the current package manager from user agent\n *\n * @returns {string} the package manager\n * @default \"npm\"\n */\nexport function detectPackageManagerFromUserAgent(): string {\n const userAgent = process.env.npm_config_user_agent || \"\";\n\n if (!userAgent) return \"npm\";\n if (userAgent.includes(\"pnpm\")) return \"pnpm\";\n if (userAgent.includes(\"yarn\")) return \"yarn\";\n if (userAgent.includes(\"npm\")) return \"npm\";\n if (userAgent.includes(\"bun\")) return \"bun\";\n if (userAgent.includes(\"cnpm\")) return \"cnpm\";\n if (userAgent.includes(\"corepack\")) return \"corepack\";\n if (userAgent.includes(\"deno\")) return \"deno\";\n\n return \"npm\";\n}\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "create-arkos",
3
- "version": "0.0.9",
4
- "description": "CLI for creating Arkos.js projects, see docs at www.arkosjs.com/docs",
3
+ "version": "0.0.13",
4
+ "description": "CLI for creating Arkos.js projects, see docs at www.arkosjs.com",
5
5
  "bin": {
6
6
  "create-arkos": "./dist/index.js"
7
7
  },
@@ -9,8 +9,8 @@
9
9
  "build": "tsc",
10
10
  "dev": "ts-node src/index.ts",
11
11
  "test:hbs": "ts-node src/utils/helpers/hbs-tester.helpers.ts",
12
- "prebuild": "npm run build -w @arkos/shared && npm run build -w arkos",
13
- "prepublishOnly": "pnpm run build"
12
+ "prebuild": "pnpm --filter @arkos/shared build",
13
+ "prepublishOnly": "pnpm build"
14
14
  },
15
15
  "author": "Uanela Como",
16
16
  "license": "MIT",
@@ -21,20 +21,21 @@
21
21
  "bugs": {
22
22
  "url": "https://github.com/uanela/arkos/issues"
23
23
  },
24
- "homepage": "https://www.arkosjs.com/docs/api-reference/create-arkos-cli",
24
+ "homepage": "https://www.arkosjs.com/docs/cli/create-arkos",
25
25
  "files": ["dist", "templates", "cli.js", "README.md"],
26
26
  "devDependencies": {
27
27
  "@types/inquirer": "^8.1.0",
28
28
  "@types/node": "^16.18.126",
29
29
  "ts-node": "^10.9.2",
30
- "typescript": "^4.9.5"
30
+ "tsup": "^8.5.0",
31
+ "typescript": "^4.9.5",
32
+ "@arkos/shared": "workspace:*"
31
33
  },
32
34
  "dependencies": {
33
35
  "@clack/prompts": "^0.11.0",
34
36
  "@inquirer/prompts": "^7.6.0",
35
- "inquirer": "^8.2.6",
36
- "@arkos/shared": "workspace:*",
37
37
  "chalk": "^5.4.1",
38
- "handlebars": "^4.7.8"
38
+ "handlebars": "^4.7.8",
39
+ "inquirer": "^8.2.6"
39
40
  }
40
41
  }
@@ -83,3 +83,5 @@ $RECYCLE.BIN/
83
83
  .cache/
84
84
  .docz/
85
85
  .vercel
86
+
87
+ *.db
@@ -17,11 +17,28 @@
17
17
  "ts-node": "^10.9.2",
18
18
  "ts-node-dev": "^2.0.0",
19
19
  "@types/node": "^24.0.12",
20
+ "@types/express": "^5.0.0",
21
+ "@types/swagger-jsdoc": "^6.0.4",
22
+ "@types/swagger-ui-express": "^4.1.8",
23
+ {{else}}
24
+ "nodemon": "^2.0.12",
20
25
  {{/if}}
21
26
  "prisma": "^6.11.1"
22
27
  },
23
28
  "dependencies": {
24
- "arkos": "^1.2.0-beta",
25
- "@prisma/client": "^6.11.1"
29
+ "arkos": "^1.2.6-beta",
30
+ "express": "^4.21.2",
31
+ "@prisma/client": "^6.4.1",
32
+ "swagger-jsdoc": "^6.2.8",
33
+ "swagger-ui-express": "^5.0.1",
34
+ {{#if (eq validation.type "class-validator")}}
35
+ "class-transformer": "^0.5.1",
36
+ "class-validator": "^0.14.1",
37
+ "class-validator-jsonschema": "^5.0.2",
38
+ {{/if}}
39
+ {{#if (eq validation.type "zod")}}
40
+ "zod": "^3.24.2",
41
+ "zod-to-json-schema": "^3.24.6"
42
+ {{/if}}
26
43
  }
27
44
  }
@@ -10,7 +10,7 @@ model User {
10
10
  isActive Boolean @default(true)
11
11
  {{#if authentication.multipleRoles}}
12
12
  {{#if (eq prisma.provider "sqlite")}}
13
- roles String[] // Roles examples: Admin, User
13
+ role String // Roles examples: Admin, User
14
14
  {{else}}
15
15
  roles UserRole[]
16
16
  {{/if}}
@@ -1,6 +1,9 @@
1
1
  import arkos from 'arkos';
2
2
 
3
3
  arkos.init({
4
+ cors: {
5
+ allowedOrigins: process.env.NODE_ENV !== "production" ? "*" : "your-production-url"
6
+ },
4
7
  {{#if authentication.type}}
5
8
  authentication: {
6
9
  mode: '{{authentication.type}}',
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AACA,4CAAoB;AACpB,gDAAwB;AACxB,kDAA0B;AAC1B,iDAAyC;AACzC,8FAAoE;AACpE,kFAAyD;AACzD,4DAAoC;AACpC,0CAAkE;AAElE,oBAAU,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AACnD,oBAAU,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AAEpD,SAAe,IAAI;;QACjB,MAAM,MAAM,GAAG,MAAM,iCAAqB,CAAC,GAAG,EAAE,CAAC;QAEjD,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;QAEvC,YAAE,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE/C,OAAO,CAAC,IAAI,CACV,oBAAoB,eAAK,CAAC,IAAI,CAAC,eAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,eAAe,eAAK,CAAC,KAAK,CAAC,KAAK,MAAM,CAAC,WAAW,EAAE,CAAC,EAAE,CAC9G,CAAC;QAEF,MAAM,YAAY,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC;QAChE,MAAM,2BAAgB,CAAC,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QAErD,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAE3B,MAAM,cAAc,GAAG,IAAA,0CAAiC,GAAE,CAAC;QAE3D,OAAO,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;QAC7C,OAAO,CAAC,IAAI,CAAC,WAAW,cAAc,KAAK,CAAC,CAAC;QAE7C,IAAA,wBAAQ,EAAC,GAAG,cAAc,UAAU,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAE5D,OAAO,CAAC,IAAI,CAAC;IACX,eAAK,CAAC,IAAI,CAAC,eAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;;;UAG5B,MAAM,CAAC,WAAW;kBACV,eAAK,CAAC,IAAI,CAAC,cAAc,CAAC;;;;KAIvC,CAAC,CAAC;IACP,CAAC;CAAA;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC","sourcesContent":["#!/usr/bin/env node\nimport fs from \"fs\";\nimport path from \"path\";\nimport chalk from \"chalk\";\nimport { execSync } from \"child_process\";\nimport projectConfigInquirer from \"./utils/project-config-inquirer\";\nimport templateCompiler from \"./utils/template-compiler\";\nimport Handlebars from \"handlebars\";\nimport { detectPackageManagerFromUserAgent } from \"@arkos/shared\";\n\nHandlebars.registerHelper(\"eq\", (a, b) => a === b);\nHandlebars.registerHelper(\"neq\", (a, b) => a !== b);\n\nasync function main() {\n const config = await projectConfigInquirer.run();\n\n const projectPath = config.projectPath;\n\n fs.mkdirSync(projectPath, { recursive: true });\n\n console.info(\n `\\nCreating a new ${chalk.bold(chalk.cyan(\"Arkos.js\"))} project in ${chalk.green(`./${config.projectName}`)}`\n );\n\n const templatesDir = path.join(__dirname, `../templates/basic`);\n await templateCompiler.compile(templatesDir, config);\n\n process.chdir(projectPath);\n\n const packageManager = detectPackageManagerFromUserAgent();\n\n console.info(\"\\nInstalling dependencies...\");\n console.info(`\\nUsing ${packageManager}.\\n`);\n\n execSync(`${packageManager} install`, { stdio: \"inherit\" });\n\n console.info(`\n ${chalk.bold(chalk.cyan(\"Arkos.js\"))} project created successfully!\n\n Next steps:\n 1. cd ${config.projectName}\n 2. setup your ${chalk.cyan(\"DATABASE_URL\")} under .env\n 3. npx prisma db push\n 4. npx prisma generate\n 5. npm run dev\n `);\n}\n\nmain().catch(console.error);\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"hbs-tester.helpers.js","sourceRoot":"","sources":["../../../src/utils/helpers/hbs-tester.helpers.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,4CAAoB;AACpB,gDAAwB;AACxB,4DAAoC;AAEpC,oBAAU,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AACnD,oBAAU,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AAEpD,CAAC,GAAG,EAAE;IACJ,MAAM,YAAY,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,6BAA6B,CAAC;IACnE,MAAM,SAAS,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,0BAA0B,CAAC;IAC7D,MAAM,MAAM,GAAkB;QAC5B,WAAW,EAAE,eAAe;QAC5B,UAAU,EAAE,IAAI;QAChB,UAAU,EAAE;YACV,IAAI,EAAE,KAAK;SACZ;QACD,cAAc,EAAE;YACd,IAAI,EAAE,SAAS;YACf,aAAa,EAAE,OAAO;YACtB,aAAa,EAAE,IAAI;SACpB;QACD,MAAM,EAAE;YACN,QAAQ,EAAE,SAAS;YACnB,cAAc,EAAE,sBAAsB;SACvC;QACD,WAAW,EAAE,SAAS;KACvB,CAAC;IAEF,SAAS,gBAAgB,CAAC,GAAW,EAAE,WAAW,GAAG,EAAE;QACrD,YAAE,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAO,MAAM,EAAE,EAAE;YACpE,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;YAC7C,MAAM,YAAY,GAAG,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;YAEzD,IAAI,MAAM,CAAC,WAAW,EAAE,EAAE;gBACxB,gBAAgB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;aAC1C;iBAAM,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;gBACvC,MAAM,YAAY,GAAG,QAAQ,CAAC;gBAC9B,MAAM,QAAQ,GAAG,oBAAU,CAAC,OAAO,CACjC,YAAE,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CACtC,CAAC;gBAEF,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACjC,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;gBAE9C,IAAI,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;gBACxE,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;oBACjC,UAAU,GAAG,cAAI,CAAC,IAAI,CACpB,SAAS,EACT,YAAY,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CACrC,CAAC;gBAEJ,YAAE,CAAC,SAAS,CAAC,cAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC5D,YAAE,CAAC,aAAa,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;aACvC;QACH,CAAC,CAAA,CAAC,CAAC;IACL,CAAC;IAED,gBAAgB,CAAC,YAAY,CAAC,CAAC;AACjC,CAAC,CAAC,EAAE,CAAC","sourcesContent":["import fs from \"fs\";\nimport path from \"path\";\nimport handlebars from \"handlebars\";\nimport { ProjectConfig } from \"../project-config-inquirer\";\nhandlebars.registerHelper(\"eq\", (a, b) => a === b);\nhandlebars.registerHelper(\"neq\", (a, b) => a !== b);\n\n(() => {\n const templatesDir = `${process.cwd()}/cache/handlebars/templates`;\n const outputDir = `${process.cwd()}/cache/handlebars/output`;\n const config: ProjectConfig = {\n projectName: \"arkos-project\",\n typescript: true,\n validation: {\n type: \"zod\",\n },\n authentication: {\n type: \"dynamic\",\n usernameField: \"email\",\n multipleRoles: true,\n },\n prisma: {\n provider: \"mongodb\",\n idDatabaseType: \"@db @default(uuid())\",\n },\n projectPath: outputDir,\n };\n\n function processTemplates(dir: string, relativeDir = \"\") {\n fs.readdirSync(dir, { withFileTypes: true }).forEach(async (dirent) => {\n const fullPath = path.join(dir, dirent.name);\n const relativePath = path.join(relativeDir, dirent.name);\n\n if (dirent.isDirectory()) {\n processTemplates(fullPath, relativePath);\n } else if (dirent.name.endsWith(\".hbs\")) {\n const templatePath = fullPath;\n const template = handlebars.compile(\n fs.readFileSync(templatePath, \"utf8\")\n );\n\n const content = template(config);\n const ext = config.typescript ? \".ts\" : \".js\";\n\n let outputPath = path.join(outputDir, relativePath.replace(\".hbs\", \"\"));\n if (dirent.name.endsWith(\".ts.hbs\"))\n outputPath = path.join(\n outputDir,\n relativePath.replace(\".ts.hbs\", ext)\n );\n\n fs.mkdirSync(path.dirname(outputPath), { recursive: true });\n fs.writeFileSync(outputPath, content);\n }\n });\n }\n\n processTemplates(templatesDir);\n})();\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/helpers/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,SAAsB,gBAAgB,CAAC,WAAmB;;QACxD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,8BAA8B,WAAW,EAAE,CAAC,CAAC;QACrE,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;QAE/D,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC;IAClC,CAAC;CAAA;AAND,4CAMC","sourcesContent":["export async function getLatestVersion(packageName: string) {\n const res = await fetch(`https://registry.npmjs.org/${packageName}`);\n if (!res.ok) throw new Error(`Failed to fetch: ${res.status}`);\n\n const data = await res.json();\n return data[\"dist-tags\"].latest;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"template-processor.js","sourceRoot":"","sources":["../../../src/utils/helpers/template-processor.ts"],"names":[],"mappings":"","sourcesContent":["// import Handlebars from \"handlebars\";\n// import fs from \"fs\";\n// import { ProjectConfig } from \"../project-config-inquirer\";\n\n// async function processTemplate(templatePath: string, config: ProjectConfig) {\n// const files = await this.getAllFiles(templatePath);\n\n// for (const file of files) {\n// const content = fs.readFileSync(file, \"utf-8\");\n\n// // Compile template\n// const template = Handlebars.compile(content);\n\n// // Replace with config values\n// const processed = template({\n// PROJECT_NAME: config.projectName,\n// AUTH_ENABLED: config.authentication.enabled,\n// AUTH_TYPE: config.authentication.type,\n// VALIDATION_ENABLED: config.validation.enabled,\n// VALIDATION_TYPE: config.validation.type,\n// PRISMA_DATABASE_PROVIDER: config.prismaProvideer,\n// });\n\n// fs.writeFileSync(file, processed);\n// }\n// }\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"project-config-inquirer.js","sourceRoot":"","sources":["../../src/utils/project-config-inquirer.ts"],"names":[],"mappings":"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","sourcesContent":["import path from \"path\";\nimport inquirer from \"inquirer\";\nimport chalk from \"chalk\";\n\nexport interface ProjectConfig {\n projectName: string;\n typescript: boolean;\n validation: {\n type?: \"zod\" | \"class-validator\";\n };\n authentication: {\n type?: \"static\" | \"dynamic\" | \"define later\";\n usernameField?: \"username\" | \"email\" | \"custom\";\n multipleRoles: boolean;\n };\n prisma: {\n provider:\n | \"postgresql\"\n | \"mysql\"\n | \"sqlite\"\n | \"sqlserver\"\n | \"cockroachdb\"\n | \"mongodb\";\n idDatabaseType: string;\n };\n projectPath: string;\n}\n\nclass ProjectConfigInquirer {\n private config: ProjectConfig;\n\n constructor() {\n this.config = {} as ProjectConfig;\n }\n\n async run() {\n await this.promptProjectName();\n await this.promptTypescript();\n await this.promptPrismaProvider();\n await this.promptValidation();\n await this.promptAuthentication();\n\n const projectPath = path.resolve(process.cwd(), this.config.projectName);\n this.config.projectPath = projectPath;\n\n return this.config;\n }\n\n private async promptProjectName() {\n let projectName = process.argv[2];\n\n if (!projectName) {\n const result = await inquirer.prompt([\n {\n type: \"input\",\n name: \"projectName\",\n message: \"What is the name of your project?\",\n default: \"my-arkos-project\",\n validate: (input) =>\n input.length > 0 ? true : \"Project name cannot be empty\",\n },\n ]);\n projectName = result.projectName;\n }\n this.config.projectName = projectName;\n }\n\n private async promptTypescript() {\n const { typescript } = await inquirer.prompt([\n {\n type: \"confirm\",\n name: \"typescript\",\n message: `Would you like to use ${chalk.cyan(\"TypeScript\")}?`,\n default: false,\n },\n ]);\n this.config.typescript = typescript;\n }\n\n private async promptPrismaProvider() {\n const { prismaProvider } = await inquirer.prompt([\n {\n type: \"list\",\n name: \"prismaProvider\",\n message: `What db provider will be used for ${chalk.cyan(\"Prisma\")}?`,\n choices: [\n \"postgresql\",\n \"mongodb\",\n \"mysql\",\n \"sqlite\",\n \"sqlserver\",\n \"cockroachdb\",\n ],\n },\n ]);\n\n // Set the correct idDatabaseType based on provider\n let idDatabaseType: string;\n\n switch (prismaProvider) {\n case \"mongodb\":\n idDatabaseType = '@id @default(auto()) @map(\"_id\") @db.ObjectId';\n break;\n case \"sqlite\":\n idDatabaseType = \"@id @default(cuid())\";\n break;\n default:\n idDatabaseType = \"@id @default(uuid())\";\n }\n\n this.config.prisma = {\n provider: prismaProvider,\n idDatabaseType: idDatabaseType,\n };\n }\n\n private async promptValidation() {\n const { useValidation } = await inquirer.prompt([\n {\n type: \"confirm\",\n name: \"useValidation\",\n message: `Would you like to set up ${chalk.cyan(\"Validation\")}?`,\n default: true,\n },\n ]);\n\n if (useValidation) {\n const { validationType } = await inquirer.prompt([\n {\n type: \"list\",\n name: \"validationType\",\n message: \"Choose validation library:\",\n choices: [\"zod\", \"class-validator\"],\n },\n ]);\n this.config.validation = {\n type: validationType,\n };\n }\n }\n\n private async promptAuthentication() {\n const { useAuthentication } = await inquirer.prompt([\n {\n type: \"confirm\",\n name: \"useAuthentication\",\n message: `Would you like to set up ${chalk.cyan(\"Authentication\")}?`,\n default: true,\n },\n ]);\n\n if (useAuthentication) {\n const { authenticationType } = await inquirer.prompt([\n {\n type: \"list\",\n name: \"authenticationType\",\n message: \"Choose authentication type:\",\n choices: [\"static\", \"dynamic\", \"define later\"],\n },\n ]);\n\n if (authenticationType !== \"define later\") {\n const { multipleRoles } = await inquirer.prompt([\n {\n type: \"confirm\",\n name: \"multipleRoles\",\n default: true,\n message: `Would you like to use authentication with ${chalk.cyan(\"Multiple Roles\")}?`,\n },\n ]);\n\n const { usernameField } = await inquirer.prompt([\n {\n type: \"list\",\n name: \"usernameField\",\n message: \"Choose default username field for login:\",\n choices: [\"email\", \"username\", \"define later\"],\n },\n ]);\n\n this.config.authentication = {\n type: authenticationType,\n usernameField:\n usernameField === \"define later\" ? \"custom\" : usernameField,\n multipleRoles,\n };\n }\n }\n }\n}\n\nconst projectConfigInquirer = new ProjectConfigInquirer();\n\nexport default projectConfigInquirer;\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"template-compiler.js","sourceRoot":"","sources":["../../src/utils/template-compiler.ts"],"names":[],"mappings":"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","sourcesContent":["import { ProjectConfig } from \"./project-config-inquirer\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport handlebars from \"handlebars\";\n\nclass TemplateCompiler {\n async canCompileAuthenticationTemplates(config: ProjectConfig) {\n return !!config.authentication;\n }\n\n filesToBeSkipped(config: ProjectConfig) {\n const files: string[] = [];\n\n if (config.authentication.type !== \"define later\")\n files.concat([\"user.prisma.hbs\"]);\n\n if (config.authentication?.type === \"static\")\n files.concat([\"auth-role.prisma.hbs\", \"auth-permission.prisma.hbs\"]);\n\n if (!config.typescript) files.concat([\"tsconfig.json.hbs\"]);\n\n return files;\n }\n /**\n * Compiles the Arkos.js project with handlebars templates\n *\n * @param templatesDir {string} templates location\n * @param config {ProjectConfig} the project configuration\n * @returns void\n * */\n async compile(templatesDir: string, config: ProjectConfig) {\n const outputDir = config.projectPath;\n const isTypescript = config.typescript;\n const filesToBeSkipped = this.filesToBeSkipped(config);\n\n function processTemplates(dir: string, relativeDir = \"\") {\n fs.readdirSync(dir, { withFileTypes: true }).forEach(async (dirent) => {\n if (filesToBeSkipped.includes(dirent.name)) return;\n\n const fullPath = path.join(dir, dirent.name);\n const relativePath = path.join(relativeDir, dirent.name);\n\n if (dirent.isDirectory()) {\n processTemplates(fullPath, relativePath);\n } else if (dirent.name.endsWith(\".hbs\")) {\n const templatePath = fullPath;\n const template = handlebars.compile(\n fs.readFileSync(templatePath, \"utf8\")\n );\n\n let arkosLatestVersion = \"1.0.0\";\n\n const content = template({ ...config, arkosLatestVersion });\n const ext = isTypescript ? \".ts\" : \".js\";\n\n let outputPath = path.join(\n outputDir,\n relativePath.replace(\".hbs\", \"\")\n );\n if (dirent.name.endsWith(\".ts.hbs\"))\n outputPath = path.join(\n outputDir,\n relativePath.replace(\".ts.hbs\", ext)\n );\n\n fs.mkdirSync(path.dirname(outputPath), { recursive: true });\n fs.writeFileSync(outputPath, content);\n }\n });\n }\n\n processTemplates(templatesDir);\n }\n}\n\nconst templateCompiler = new TemplateCompiler();\n\nexport default templateCompiler;\n"]}