create-arkos 2.0.0-next.17 → 2.0.0-next.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/utils/project-config-inquirer.js +40 -33
- package/dist/utils/project-config-inquirer.js.map +1 -1
- package/dist/utils/template-compiler.js +16 -11
- package/dist/utils/template-compiler.js.map +1 -1
- package/package.json +1 -1
- package/templates/basic/.env.hbs +5 -1
- package/templates/basic/.gitignore.hbs +2 -0
- package/templates/basic/README.md.hbs +1 -1
- package/templates/basic/arkos.config.ts.hbs +16 -3
- package/templates/basic/jsconfig.json.hbs +3 -3
- package/templates/basic/package.json.hbs +31 -13
- package/templates/basic/prisma/schema/__tests__/user-role.prisma.hbs.test.ts +2 -2
- package/templates/basic/prisma/schema/__tests__/user.prisma.hbs.test.ts +2 -2
- package/templates/basic/prisma/schema/auth-permission.prisma.hbs +3 -9
- package/templates/basic/prisma/schema/auth-role.prisma.hbs +2 -2
- package/templates/basic/prisma/schema/schema.prisma.hbs +2 -3
- package/templates/basic/prisma/schema/user-permission.prisma.hbs +18 -0
- package/templates/basic/prisma/schema/user.prisma.hbs +4 -2
- package/templates/basic/prisma.config.ts.hbs +10 -0
- package/templates/basic/public/favicon.ico +0 -0
- package/templates/basic/src/app.ts.hbs +9 -7
- package/templates/basic/src/modules/auth/auth.policy.ts.hbs +1 -1
- package/templates/basic/src/modules/auth/auth.router.ts.hbs +72 -7
- package/templates/basic/src/modules/auth/dtos/login.dto.ts.hbs +1 -1
- package/templates/basic/src/modules/auth/dtos/signup.dto.ts.hbs +1 -1
- package/templates/basic/src/modules/auth/dtos/update-me.dto.ts.hbs +1 -1
- package/templates/basic/src/modules/auth/dtos/update-password.dto.ts.hbs +1 -1
- package/templates/basic/src/modules/auth-permission/auth-permission.router.ts.hbs +39 -7
- package/templates/basic/src/modules/auth-permission/auth-permission.service.ts.hbs +4 -6
- package/templates/basic/src/modules/auth-permission/dtos/create-auth-permission.dto.ts.hbs +6 -5
- package/templates/basic/src/modules/auth-permission/dtos/{query-auth-role.dto.ts.hbs → query-auth-permission.dto.ts.hbs} +1 -1
- package/templates/basic/src/modules/auth-permission/dtos/update-auth-permission.dto.ts.hbs +17 -4
- package/templates/basic/src/modules/auth-role/auth-role.router.ts.hbs +38 -6
- package/templates/basic/src/modules/auth-role/auth-role.service.ts.hbs +4 -6
- package/templates/basic/src/modules/auth-role/dtos/create-auth-role.dto.ts.hbs +1 -1
- package/templates/basic/src/modules/auth-role/dtos/query-auth-role.dto.ts.hbs +1 -1
- package/templates/basic/src/modules/auth-role/dtos/update-auth-role.dto.ts.hbs +2 -1
- package/templates/basic/src/modules/file-upload/file-upload.router.ts.hbs +28 -8
- package/templates/basic/src/modules/user/dtos/create-user.dto.ts.hbs +3 -3
- package/templates/basic/src/modules/user/dtos/update-user.dto.ts.hbs +3 -3
- package/templates/basic/src/modules/user/user.router.ts.hbs +91 -7
- package/templates/basic/src/modules/user/user.service.ts.hbs +4 -6
- package/templates/basic/src/router.ts.hbs +2 -2
- package/templates/basic/src/server.ts.hbs +8 -0
- package/templates/basic/src/utils/prisma/index.ts.hbs +48 -2
- package/templates/basic/src/utils/validation/api-actions.ts.hbs +2 -2
- package/templates/basic/tsconfig.json.hbs +5 -4
- package/templates/basic/src/loadables.ts.hbs +0 -29
- package/templates/basic/src/modules/auth/auth.route-hook.ts.hbs +0 -66
- package/templates/basic/src/modules/auth-permission/auth-permission.route-hook.ts.hbs +0 -35
- package/templates/basic/src/modules/auth-role/auth-role.route-hook.ts.hbs +0 -35
- package/templates/basic/src/modules/file-upload/file-upload.route-hook.ts.hbs +0 -23
- package/templates/basic/src/modules/user/user.route-hook.ts.hbs +0 -88
package/dist/index.js
CHANGED
|
@@ -11,6 +11,10 @@ import { detectPackageManagerFromUserAgent } from "./utils/helpers/npm.helpers.j
|
|
|
11
11
|
import { fileURLToPath } from "url";
|
|
12
12
|
handlebars.registerHelper("eq", (a, b) => a === b);
|
|
13
13
|
handlebars.registerHelper("neq", (a, b) => a !== b);
|
|
14
|
+
handlebars.registerHelper("or", (...args) => {
|
|
15
|
+
const conditions = args.slice(0, -1);
|
|
16
|
+
return conditions.some((a) => !!a);
|
|
17
|
+
});
|
|
14
18
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
15
19
|
export async function main() {
|
|
16
20
|
const config = await projectConfigInquirer.run();
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,qBAAqB,MAAM,iCAAiC,CAAC;AACpE,OAAO,gBAAgB,MAAM,2BAA2B,CAAC;AACzD,OAAO,UAAU,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,gCAAgC,EAAE,MAAM,sCAAsC,CAAC;AACxF,OAAO,EAAE,iCAAiC,EAAE,MAAM,6BAA6B,CAAC;AAChF,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,UAAU,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAM,EAAE,CAAM,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AAC7D,UAAU,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC,CAAM,EAAE,CAAM,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\nimport fs from \"fs\";\nimport path, { dirname } 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 { getProcjetPackageJsonDependecies } from \"./utils/helpers/package-json.helpers\";\nimport { detectPackageManagerFromUserAgent } from \"./utils/helpers/npm.helpers\";\nimport { fileURLToPath } from \"url\";\n\nhandlebars.registerHelper(\"eq\", (a: any, b: any) => a === b);\nhandlebars.registerHelper(\"neq\", (a: any, b: any) => a !== b);\nhandlebars.registerHelper(\"or\", (...args: any[]) => {\n const conditions = args.slice(0, -1);\n return conditions.some((a) => !!a);\n});\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\nexport async function main() {\n const config = await projectConfigInquirer.run();\n const argProjectName = config.argProjectName;\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 under ${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 const { dependencies, devDependencies } =\n getProcjetPackageJsonDependecies(projectPath);\n\n console.info(chalk.cyan(chalk.bold(\"\\ndependencies:\")));\n dependencies.forEach((dependency) => console.info(`- ${dependency}`));\n\n console.info(chalk.cyan(chalk.bold(\"\\ndevDependencies:\")));\n devDependencies.forEach((devDependency) =>\n console.info(`- ${devDependency}`)\n );\n\n console.info(chalk.bold(\"\\nInstalling dependencies...\"));\n console.info(`Using ${packageManager}.\\n`);\n\n const installCmd = `${packageManager} install`;\n execSync(installCmd, { stdio: \"inherit\", cwd: projectPath });\n execSync(installCmd, { stdio: \"pipe\", cwd: projectPath });\n\n process.chdir(projectPath);\n\n console.info(`\n \\n${chalk.bold(chalk.cyan(\"Arkos.js\"))} project created successfully!\n\n ${chalk.bold(\"Next Steps:\")}\n ${\n argProjectName !== \".\"\n ? `1. cd ${config.projectName}\n 2. setup your ${chalk.cyan(\"DATABASE_URL\")} under .env\n 3. npx arkos prisma generate\n 4. npx prisma db push\n 5. ${packageManager} run dev\n`\n : `1. setup your ${chalk.cyan(\"DATABASE_URL\")} under .env\n 2. npx arkos prisma generate\n 3. npx prisma db push\n 4. ${packageManager} run dev\n`\n }\n `);\n}\n\nmain().catch(console.error);\n\nexport { handlebars };\n"]}
|
|
@@ -16,6 +16,7 @@ class ProjectConfigInquirer {
|
|
|
16
16
|
await this.promptValidation();
|
|
17
17
|
await this.promptAuthentication();
|
|
18
18
|
await this.promptStrictRouting();
|
|
19
|
+
await this.promptEntryPoint();
|
|
19
20
|
if (this.config.projectName === ".") {
|
|
20
21
|
this.config.projectName = path.basename(process.cwd());
|
|
21
22
|
this.config.projectPath = path.resolve(process.cwd());
|
|
@@ -24,6 +25,9 @@ class ProjectConfigInquirer {
|
|
|
24
25
|
this.config.projectPath = path.resolve(process.cwd(), this.config.projectName);
|
|
25
26
|
if (process?.argv?.includes?.("--advanced"))
|
|
26
27
|
this.config.advanced = true;
|
|
28
|
+
if (this.config.prisma.defaultDatabaseUrl)
|
|
29
|
+
this.config.prisma.defaultDatabaseUrl =
|
|
30
|
+
this.config.prisma.defaultDatabaseUrl.replaceAll("{{projectName}}", this.config.projectName);
|
|
27
31
|
return this.config;
|
|
28
32
|
}
|
|
29
33
|
async promptProjectName() {
|
|
@@ -80,7 +84,7 @@ class ProjectConfigInquirer {
|
|
|
80
84
|
type: "confirm",
|
|
81
85
|
name: "typescript",
|
|
82
86
|
message: `Would you like to use ${chalk.cyan("TypeScript")}?`,
|
|
83
|
-
default:
|
|
87
|
+
default: true,
|
|
84
88
|
},
|
|
85
89
|
]);
|
|
86
90
|
this.config.typescript = typescript;
|
|
@@ -98,75 +102,65 @@ class ProjectConfigInquirer {
|
|
|
98
102
|
"sqlite",
|
|
99
103
|
"sqlserver",
|
|
100
104
|
"cockroachdb",
|
|
105
|
+
"none",
|
|
101
106
|
],
|
|
102
107
|
},
|
|
103
108
|
]);
|
|
104
109
|
let idDatabaseType;
|
|
105
|
-
let
|
|
110
|
+
let defaultDatabaseUrl;
|
|
106
111
|
switch (prismaProvider) {
|
|
107
112
|
case "mongodb":
|
|
108
113
|
idDatabaseType = '@id @default(auto()) @map("_id") @db.ObjectId';
|
|
109
|
-
|
|
114
|
+
defaultDatabaseUrl = `mongodb://localhost:27017/{{projectName}}`;
|
|
110
115
|
break;
|
|
111
116
|
case "sqlite":
|
|
112
117
|
idDatabaseType = "@id @default(cuid())";
|
|
113
|
-
|
|
118
|
+
defaultDatabaseUrl = "file:../../file.db";
|
|
114
119
|
break;
|
|
115
120
|
case "mysql":
|
|
116
121
|
idDatabaseType = "@id @default(uuid())";
|
|
117
|
-
|
|
122
|
+
defaultDatabaseUrl = `mysql://username:password@localhost:3306/{{projectName}}`;
|
|
118
123
|
break;
|
|
119
124
|
case "postgresql":
|
|
120
125
|
idDatabaseType = "@id @default(uuid())";
|
|
121
|
-
|
|
126
|
+
defaultDatabaseUrl = `postgresql://username:password@localhost:5432/{{projectName}}`;
|
|
122
127
|
break;
|
|
123
128
|
case "sqlserver":
|
|
124
129
|
idDatabaseType = "@id @default(uuid())";
|
|
125
|
-
|
|
130
|
+
defaultDatabaseUrl = `sqlserver://localhost:1433;database={{projectName}};username=sa;password=password;encrypt=DANGER_PLAINTEXT`;
|
|
126
131
|
break;
|
|
127
132
|
case "cockroachdb":
|
|
128
133
|
idDatabaseType = "@id @default(uuid())";
|
|
129
|
-
|
|
134
|
+
defaultDatabaseUrl = `postgresql://username:password@localhost:26257/{{projectName}}?sslmode=require`;
|
|
130
135
|
break;
|
|
131
136
|
default:
|
|
132
137
|
idDatabaseType = "@id @default(uuid())";
|
|
133
|
-
|
|
138
|
+
defaultDatabaseUrl = `postgresql://username:password@localhost:5432/{{projectName}}`;
|
|
134
139
|
}
|
|
135
140
|
this.config.prisma = {
|
|
136
141
|
provider: prismaProvider,
|
|
137
|
-
idDatabaseType
|
|
138
|
-
|
|
142
|
+
idDatabaseType,
|
|
143
|
+
defaultDatabaseUrl,
|
|
139
144
|
};
|
|
140
145
|
}
|
|
141
146
|
async promptValidation() {
|
|
142
|
-
const
|
|
147
|
+
const choices = this.config.typescript
|
|
148
|
+
? ["zod", "class-validator", "none"]
|
|
149
|
+
: ["zod", "none"];
|
|
150
|
+
const { validationType } = await inquirer.prompt([
|
|
143
151
|
{
|
|
144
|
-
type: "
|
|
145
|
-
name: "
|
|
146
|
-
message: `
|
|
147
|
-
|
|
152
|
+
type: "list",
|
|
153
|
+
name: "validationType",
|
|
154
|
+
message: `Which ${chalk.cyan("Validation")} library would you like to use?`,
|
|
155
|
+
choices,
|
|
156
|
+
default: "zod",
|
|
148
157
|
},
|
|
149
158
|
]);
|
|
150
|
-
if (
|
|
151
|
-
let validationTypeResponse = { validationType: "zod" };
|
|
152
|
-
if (this.config.typescript)
|
|
153
|
-
validationTypeResponse = await inquirer.prompt([
|
|
154
|
-
{
|
|
155
|
-
type: "list",
|
|
156
|
-
name: "validationType",
|
|
157
|
-
message: "Choose validation library:",
|
|
158
|
-
choices: ["zod", "class-validator"],
|
|
159
|
-
},
|
|
160
|
-
]);
|
|
161
|
-
else {
|
|
162
|
-
console.info(chalk.bold(`${chalk.greenBright("?")} Validation library set to zod (class-validator is not supported on JavaScript):`), chalk.cyan("zod"));
|
|
163
|
-
}
|
|
159
|
+
if (validationType !== "none") {
|
|
164
160
|
this.config.validation = {
|
|
165
|
-
type:
|
|
161
|
+
type: validationType,
|
|
166
162
|
};
|
|
167
163
|
}
|
|
168
|
-
else if (!this.config.typescript) {
|
|
169
|
-
}
|
|
170
164
|
}
|
|
171
165
|
async promptAuthentication() {
|
|
172
166
|
if (this.config.prisma.provider === "none") {
|
|
@@ -242,6 +236,19 @@ class ProjectConfigInquirer {
|
|
|
242
236
|
strict: strictRouting,
|
|
243
237
|
};
|
|
244
238
|
}
|
|
239
|
+
async promptEntryPoint() {
|
|
240
|
+
const ext = this.config.typescript ? "ts" : "js";
|
|
241
|
+
const { entryPoint } = await inquirer.prompt([
|
|
242
|
+
{
|
|
243
|
+
type: "list",
|
|
244
|
+
name: "entryPoint",
|
|
245
|
+
message: `Which ${chalk.cyan("Entry Point")} would you like to use?`,
|
|
246
|
+
choices: [`src/app.${ext}`, `src/server.${ext}`],
|
|
247
|
+
default: `src/app.${ext}`,
|
|
248
|
+
},
|
|
249
|
+
]);
|
|
250
|
+
this.config.entryPoint = entryPoint.replace(`.${ext}`, "");
|
|
251
|
+
}
|
|
245
252
|
}
|
|
246
253
|
const projectConfigInquirer = new ProjectConfigInquirer();
|
|
247
254
|
export default projectConfigInquirer;
|
|
@@ -1 +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\";\nimport { detectPackageManagerFromUserAgent } from \"./helpers/npm.helpers\";\n\nexport interface ProjectConfig {\n projectName: string;\n argProjectName?: string;\n typescript: boolean;\n validation?: {\n type?: \"zod\" | \"class-validator\" | \"none\";\n };\n authentication?: {\n type?: \"static\" | \"dynamic\" | \"none\";\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 | \"none\";\n idDatabaseType: string;\n defaultDBurl: string;\n };\n projectPath: string;\n routing?: {\n strict?: boolean;\n };\n advanced?: boolean;\n entryPoint: \"src/app\" | \"src/server\";\n packageManager: string;\n}\n\nclass ProjectConfigInquirer {\n private config: ProjectConfig;\n\n constructor() {\n this.config = {\n packageManager: detectPackageManagerFromUserAgent(),\n } 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 await this.promptStrictRouting();\n\n if (this.config.projectName === \".\") {\n this.config.projectName = path.basename(process.cwd());\n this.config.projectPath = path.resolve(process.cwd());\n } else\n this.config.projectPath = path.resolve(\n process.cwd(),\n this.config.projectName\n );\n\n if (process?.argv?.includes?.(\"--advanced\")) this.config.advanced = true;\n\n return this.config;\n }\n\n private async promptProjectName() {\n let projectName = process?.argv?.[2];\n this.config.argProjectName = 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: this.validateProjectName,\n },\n ]);\n projectName = result.projectName;\n } else {\n // Validate the project name from command line args\n const validation = this.validateProjectName(projectName);\n if (validation !== true) {\n console.error(chalk.red(`\\nError: ${validation}`));\n process.exit(1);\n }\n }\n\n this.config.projectName = projectName;\n }\n\n private validateProjectName(input: string): boolean | string {\n if (input === \".\") return true;\n\n if (!input || input.length === 0) {\n return \"Project name cannot be empty\";\n }\n\n if (!/^[a-zA-Z0-9_-]+$/.test(input)) {\n return \"Project name can only contain letters, numbers, hyphens, and underscores\";\n }\n\n if (!/^[a-zA-Z0-9]/.test(input)) {\n return \"Project name must start with a letter or number\";\n }\n\n if (!/[a-zA-Z0-9]$/.test(input)) {\n return \"Project name must end with a letter or number\";\n }\n\n if (input.length > 50) {\n return \"Project name must be 50 characters or less\";\n }\n\n const reservedNames = [\"node_modules\"];\n if (reservedNames.includes(input.toLowerCase())) {\n return \"Project name cannot be a reserved name\";\n }\n\n return true;\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 let defaultDBurl: string;\n\n switch (prismaProvider) {\n case \"mongodb\":\n idDatabaseType = '@id @default(auto()) @map(\"_id\") @db.ObjectId';\n defaultDBurl = `mongodb://localhost:27017/${this.config.projectName}`;\n break;\n case \"sqlite\":\n idDatabaseType = \"@id @default(cuid())\";\n defaultDBurl = \"file:../../file.db\";\n break;\n case \"mysql\":\n idDatabaseType = \"@id @default(uuid())\";\n defaultDBurl = `mysql://username:password@localhost:3306/${this.config.projectName}`;\n break;\n case \"postgresql\":\n idDatabaseType = \"@id @default(uuid())\";\n defaultDBurl = `postgresql://username:password@localhost:5432/${this.config.projectName}`;\n break;\n case \"sqlserver\":\n idDatabaseType = \"@id @default(uuid())\";\n defaultDBurl = `sqlserver://localhost:1433;database=${this.config.projectName};username=sa;password=password;encrypt=DANGER_PLAINTEXT`;\n break;\n case \"cockroachdb\":\n idDatabaseType = \"@id @default(uuid())\";\n defaultDBurl = `postgresql://username:password@localhost:26257/${this.config.projectName}?sslmode=require`;\n break;\n default:\n idDatabaseType = \"@id @default(uuid())\";\n defaultDBurl = `postgresql://username:password@localhost:5432/${this.config.projectName}`;\n }\n\n this.config.prisma = {\n provider: prismaProvider,\n idDatabaseType: idDatabaseType,\n defaultDBurl: defaultDBurl,\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 let validationTypeResponse: {\n validationType: \"zod\" | \"class-validator\";\n } = { validationType: \"zod\" };\n\n if (this.config.typescript)\n validationTypeResponse = await inquirer.prompt([\n {\n type: \"list\",\n name: \"validationType\",\n message: \"Choose validation library:\",\n choices: [\"zod\", \"class-validator\"],\n },\n ]);\n else {\n console.info(\n chalk.bold(\n `${chalk.greenBright(\"?\")} Validation library set to zod (class-validator is not supported on JavaScript):`\n ),\n chalk.cyan(\"zod\")\n );\n }\n this.config.validation = {\n type: validationTypeResponse.validationType,\n };\n } else if (!this.config.typescript) {\n }\n }\n\n private async promptAuthentication() {\n if (this.config.prisma.provider === \"none\") {\n console.info(\n `${chalk.green(\"! \")}${chalk.bold(\"Skipping authentication setup as it requires prisma.\")}`\n );\n this.config.authentication = {\n type: \"none\",\n };\n return;\n }\n\n const { authenticationType } = await inquirer.prompt([\n {\n type: \"list\",\n name: \"authenticationType\",\n message: `Which ${chalk.cyan(\"Authentication\")} mode would you like to use?`,\n choices: [\"static\", \"dynamic\", \"none\"],\n default: \"static\",\n },\n ]);\n\n if (authenticationType === \"none\") {\n this.config.authentication = { type: \"none\", multipleRoles: false };\n return;\n }\n\n const { usernameField } = await inquirer.prompt([\n {\n type: \"input\",\n name: \"usernameField\",\n message: \"Enter the Prisma field name to use as the login username:\",\n default: \"email\",\n validate: (input: string) => {\n if (!input || input.length === 0) return \"Field name cannot be empty\";\n if (!/^[a-z][a-zA-Z0-9]*$/.test(input))\n return \"Must be a valid Prisma field name (camelCase, starts with lowercase, letters and numbers only)\";\n return true;\n },\n },\n ]);\n\n this.config.authentication = {\n type: authenticationType as \"static\" | \"dynamic\",\n usernameField,\n multipleRoles: false,\n };\n\n if (\n authenticationType !== \"static\" ||\n (authenticationType == \"static\" &&\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 this.config.authentication = {\n ...this.config.authentication,\n multipleRoles,\n };\n } else if (this.config.prisma.provider === \"sqlite\") {\n console.info(\n `${chalk.green(\"! \")}${chalk.bold(\"Skipping multiple roles option because it is not supported with sqlite prisma provider and static authentication mode.\")}`\n );\n }\n }\n\n private async promptStrictRouting() {\n const { strictRouting } = await inquirer.prompt([\n {\n type: \"confirm\",\n name: \"strictRouting\",\n message: `Would you like to use ${chalk.cyan(\"Strict Routing\")}?`,\n default: false,\n },\n ]);\n this.config.routing = {\n strict: strictRouting,\n };\n }\n}\n\nconst projectConfigInquirer = new ProjectConfigInquirer();\n\nexport default projectConfigInquirer;\n"]}
|
|
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\";\nimport { detectPackageManagerFromUserAgent } from \"./helpers/npm.helpers\";\n\nexport interface ProjectConfig {\n projectName: string;\n argProjectName?: string;\n typescript: boolean;\n validation?: {\n type?: \"zod\" | \"class-validator\";\n };\n authentication?: {\n type?: \"static\" | \"dynamic\" | \"none\";\n usernameField?: string;\n multipleRoles?: boolean;\n };\n prisma: {\n provider:\n | \"postgresql\"\n | \"mysql\"\n | \"sqlite\"\n | \"sqlserver\"\n | \"cockroachdb\"\n | \"mongodb\"\n | \"none\";\n idDatabaseType: string;\n defaultDatabaseUrl: string;\n };\n projectPath: string;\n routing?: {\n strict?: boolean;\n };\n advanced?: boolean;\n entryPoint: \"src/app\" | \"src/server\";\n packageManager: string;\n}\n\nclass ProjectConfigInquirer {\n private config: ProjectConfig;\n\n constructor() {\n this.config = {\n packageManager: detectPackageManagerFromUserAgent(),\n } 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 await this.promptStrictRouting();\n await this.promptEntryPoint();\n\n if (this.config.projectName === \".\") {\n this.config.projectName = path.basename(process.cwd());\n this.config.projectPath = path.resolve(process.cwd());\n } else\n this.config.projectPath = path.resolve(\n process.cwd(),\n this.config.projectName\n );\n\n if (process?.argv?.includes?.(\"--advanced\")) this.config.advanced = true;\n if (this.config.prisma.defaultDatabaseUrl)\n this.config.prisma.defaultDatabaseUrl =\n this.config.prisma.defaultDatabaseUrl.replaceAll(\n \"{{projectName}}\",\n this.config.projectName\n );\n\n return this.config;\n }\n\n private async promptProjectName() {\n let projectName = process?.argv?.[2];\n this.config.argProjectName = 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: this.validateProjectName,\n },\n ]);\n projectName = result.projectName;\n } else {\n const validation = this.validateProjectName(projectName);\n if (validation !== true) {\n console.error(chalk.red(`\\nError: ${validation}`));\n process.exit(1);\n }\n }\n\n this.config.projectName = projectName;\n }\n\n private validateProjectName(input: string): boolean | string {\n if (input === \".\") return true;\n\n if (!input || input.length === 0) {\n return \"Project name cannot be empty\";\n }\n\n if (!/^[a-zA-Z0-9_-]+$/.test(input)) {\n return \"Project name can only contain letters, numbers, hyphens, and underscores\";\n }\n\n if (!/^[a-zA-Z0-9]/.test(input)) {\n return \"Project name must start with a letter or number\";\n }\n\n if (!/[a-zA-Z0-9]$/.test(input)) {\n return \"Project name must end with a letter or number\";\n }\n\n if (input.length > 50) {\n return \"Project name must be 50 characters or less\";\n }\n\n const reservedNames = [\"node_modules\"];\n if (reservedNames.includes(input.toLowerCase())) {\n return \"Project name cannot be a reserved name\";\n }\n\n return true;\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: true,\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 \"none\",\n ],\n },\n ]);\n\n let idDatabaseType: string;\n let defaultDatabaseUrl: string;\n\n switch (prismaProvider) {\n case \"mongodb\":\n idDatabaseType = '@id @default(auto()) @map(\"_id\") @db.ObjectId';\n defaultDatabaseUrl = `mongodb://localhost:27017/{{projectName}}`;\n break;\n case \"sqlite\":\n idDatabaseType = \"@id @default(cuid())\";\n defaultDatabaseUrl = \"file:../../file.db\";\n break;\n case \"mysql\":\n idDatabaseType = \"@id @default(uuid())\";\n defaultDatabaseUrl = `mysql://username:password@localhost:3306/{{projectName}}`;\n break;\n case \"postgresql\":\n idDatabaseType = \"@id @default(uuid())\";\n defaultDatabaseUrl = `postgresql://username:password@localhost:5432/{{projectName}}`;\n break;\n case \"sqlserver\":\n idDatabaseType = \"@id @default(uuid())\";\n defaultDatabaseUrl = `sqlserver://localhost:1433;database={{projectName}};username=sa;password=password;encrypt=DANGER_PLAINTEXT`;\n break;\n case \"cockroachdb\":\n idDatabaseType = \"@id @default(uuid())\";\n defaultDatabaseUrl = `postgresql://username:password@localhost:26257/{{projectName}}?sslmode=require`;\n break;\n default:\n idDatabaseType = \"@id @default(uuid())\";\n defaultDatabaseUrl = `postgresql://username:password@localhost:5432/{{projectName}}`;\n }\n\n this.config.prisma = {\n provider: prismaProvider,\n idDatabaseType,\n defaultDatabaseUrl,\n };\n }\n\n private async promptValidation() {\n const choices = this.config.typescript\n ? [\"zod\", \"class-validator\", \"none\"]\n : [\"zod\", \"none\"];\n\n const { validationType } = await inquirer.prompt([\n {\n type: \"list\",\n name: \"validationType\",\n message: `Which ${chalk.cyan(\"Validation\")} library would you like to use?`,\n choices,\n default: \"zod\",\n },\n ]);\n\n if (validationType !== \"none\") {\n this.config.validation = {\n type: validationType as \"zod\" | \"class-validator\",\n };\n }\n // validation stays undefined when \"none\" is chosen — matches original behaviour\n }\n\n private async promptAuthentication() {\n if (this.config.prisma.provider === \"none\") {\n console.info(\n `${chalk.green(\"! \")}${chalk.bold(\"Skipping authentication setup as it requires prisma.\")}`\n );\n this.config.authentication = {\n type: \"none\",\n };\n return;\n }\n\n const { authenticationType } = await inquirer.prompt([\n {\n type: \"list\",\n name: \"authenticationType\",\n message: `Which ${chalk.cyan(\"Authentication\")} mode would you like to use?`,\n choices: [\"static\", \"dynamic\", \"none\"],\n default: \"static\",\n },\n ]);\n\n if (authenticationType === \"none\") {\n this.config.authentication = { type: \"none\", multipleRoles: false };\n return;\n }\n\n const { usernameField } = await inquirer.prompt([\n {\n type: \"input\",\n name: \"usernameField\",\n message: \"Enter the Prisma field name to use as the login username:\",\n default: \"email\",\n validate: (input: string) => {\n if (!input || input.length === 0) return \"Field name cannot be empty\";\n if (!/^[a-z][a-zA-Z0-9]*$/.test(input))\n return \"Must be a valid Prisma field name (camelCase, starts with lowercase, letters and numbers only)\";\n return true;\n },\n },\n ]);\n\n this.config.authentication = {\n type: authenticationType as \"static\" | \"dynamic\",\n usernameField,\n multipleRoles: false,\n };\n\n if (\n authenticationType !== \"static\" ||\n (authenticationType == \"static\" &&\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 this.config.authentication = {\n ...this.config.authentication,\n multipleRoles,\n };\n } else if (this.config.prisma.provider === \"sqlite\") {\n console.info(\n `${chalk.green(\"! \")}${chalk.bold(\"Skipping multiple roles option because it is not supported with sqlite prisma provider and static authentication mode.\")}`\n );\n }\n }\n\n private async promptStrictRouting() {\n const { strictRouting } = await inquirer.prompt([\n {\n type: \"confirm\",\n name: \"strictRouting\",\n message: `Would you like to use ${chalk.cyan(\"Strict Routing\")}?`,\n default: false,\n },\n ]);\n this.config.routing = {\n strict: strictRouting,\n };\n }\n\n private async promptEntryPoint() {\n const ext = this.config.typescript ? \"ts\" : \"js\";\n const { entryPoint } = await inquirer.prompt([\n {\n type: \"list\",\n name: \"entryPoint\",\n message: `Which ${chalk.cyan(\"Entry Point\")} would you like to use?`,\n choices: [`src/app.${ext}`, `src/server.${ext}`],\n default: `src/app.${ext}`,\n },\n ]);\n\n this.config.entryPoint = entryPoint.replace(`.${ext}`, \"\");\n }\n}\n\nconst projectConfigInquirer = new ProjectConfigInquirer();\n\nexport default projectConfigInquirer;\n"]}
|
|
@@ -12,11 +12,7 @@ class TemplateCompiler {
|
|
|
12
12
|
"auth-permission.prisma.hbs",
|
|
13
13
|
"auth-role.prisma.hbs",
|
|
14
14
|
"user-role.prisma.hbs",
|
|
15
|
-
|
|
16
|
-
const userDtoFiles = [
|
|
17
|
-
"create-user.dto.ts.hbs",
|
|
18
|
-
"update-user.dto.ts.hbs",
|
|
19
|
-
"query-user.dto.ts.hbs",
|
|
15
|
+
"user-permission.prisma.hbs",
|
|
20
16
|
];
|
|
21
17
|
const sharedAuthDtoFiles = [
|
|
22
18
|
"login.dto.ts.hbs",
|
|
@@ -32,31 +28,33 @@ class TemplateCompiler {
|
|
|
32
28
|
"update-auth-role.dto.ts.hbs",
|
|
33
29
|
"query-auth-role.dto.ts.hbs",
|
|
34
30
|
];
|
|
31
|
+
const userDtoFiles = [
|
|
32
|
+
"create-user.dto.ts.hbs",
|
|
33
|
+
"update-user.dto.ts.hbs",
|
|
34
|
+
"query-user.dto.ts.hbs",
|
|
35
|
+
];
|
|
35
36
|
const authModuleComponents = [
|
|
36
|
-
"auth.route-hook.ts.hbs",
|
|
37
37
|
"auth.policy.ts.hbs",
|
|
38
38
|
"auth.router.ts.hbs",
|
|
39
39
|
];
|
|
40
40
|
const authPermissionModuleComponents = [
|
|
41
41
|
"auth-permission.router.ts.hbs",
|
|
42
42
|
"auth-permission.policy.ts.hbs",
|
|
43
|
-
"auth-permission.route-hook.ts.hbs",
|
|
44
43
|
"auth-permission.service.ts.hbs",
|
|
45
44
|
];
|
|
46
45
|
const authRoleModuleComponents = [
|
|
47
46
|
"auth-role.router.ts.hbs",
|
|
48
47
|
"auth-role.policy.ts.hbs",
|
|
49
|
-
"auth-role.route-hook.ts.hbs",
|
|
50
48
|
"auth-role.service.ts.hbs",
|
|
51
49
|
];
|
|
52
50
|
const userModuleComponents = [
|
|
53
|
-
"user.route-hook.ts.hbs",
|
|
54
51
|
"user.service.ts.hbs",
|
|
55
52
|
"user.router.ts.hbs",
|
|
56
53
|
"user.policy.ts.hbs",
|
|
57
54
|
];
|
|
58
|
-
if (
|
|
59
|
-
|
|
55
|
+
if (config.prisma?.provider === "none")
|
|
56
|
+
files.push(...authSharedPrismaFiles, ...dynamicAuthPrismaFiles, "schema.prisma.hbs", ...sharedAuthDtoFiles, ...dynamicAuthDtoFiles, ...userModuleComponents, ...authModuleComponents, ...authPermissionModuleComponents, ...authRoleModuleComponents, ...userDtoFiles, "file-upload.auth.ts.hbs");
|
|
57
|
+
if (!config.authentication?.type || config.authentication?.type === "none")
|
|
60
58
|
files.push(...authSharedPrismaFiles, ...dynamicAuthPrismaFiles, ...sharedAuthDtoFiles, ...dynamicAuthDtoFiles, ...userModuleComponents, ...authModuleComponents, ...authPermissionModuleComponents, ...authRoleModuleComponents, ...userDtoFiles, "file-upload.policy.ts.hbs");
|
|
61
59
|
if (config.authentication?.type === "static")
|
|
62
60
|
files.push(...dynamicAuthPrismaFiles, ...dynamicAuthDtoFiles, ...authPermissionModuleComponents, ...authRoleModuleComponents);
|
|
@@ -66,6 +64,8 @@ class TemplateCompiler {
|
|
|
66
64
|
files.push(...["tsconfig.json.hbs"]);
|
|
67
65
|
if (config?.typescript)
|
|
68
66
|
files.push(...["jsconfig.json.hbs"]);
|
|
67
|
+
if (config.entryPoint === "src/app")
|
|
68
|
+
files.push("server.ts.hbs");
|
|
69
69
|
return files;
|
|
70
70
|
}
|
|
71
71
|
async compile(templatesDir, config) {
|
|
@@ -95,6 +95,11 @@ class TemplateCompiler {
|
|
|
95
95
|
fs.mkdirSync(path.dirname(outputPath), { recursive: true });
|
|
96
96
|
fs.writeFileSync(outputPath, content);
|
|
97
97
|
}
|
|
98
|
+
else {
|
|
99
|
+
const outputPath = path.join(outputDir, relativePath);
|
|
100
|
+
fs.mkdirSync(path.dirname(outputPath), { recursive: true });
|
|
101
|
+
fs.copyFileSync(fullPath, outputPath);
|
|
102
|
+
}
|
|
98
103
|
});
|
|
99
104
|
}
|
|
100
105
|
processTemplates(templatesDir);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template-compiler.js","sourceRoot":"","sources":["../../src/utils/template-compiler.ts"],"names":[],"mappings":"AACA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,UAAU,MAAM,YAAY,CAAC;AAEpC,MAAM,gBAAgB;IACpB,KAAK,CAAC,iCAAiC,CAAC,MAAqB;QAC3D,OAAO,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC;IACjC,CAAC;IAED,gBAAgB,CAAC,MAAqB;QACpC,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,MAAM,qBAAqB,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAElD,MAAM,sBAAsB,GAAG;YAC7B,4BAA4B;YAC5B,sBAAsB;YACtB,sBAAsB;
|
|
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 const authSharedPrismaFiles = [\"user.prisma.hbs\"];\n\n const dynamicAuthPrismaFiles = [\n \"auth-permission.prisma.hbs\",\n \"auth-role.prisma.hbs\",\n \"user-role.prisma.hbs\",\n \"user-permission.prisma.hbs\",\n ];\n\n const sharedAuthDtoFiles = [\n \"login.dto.ts.hbs\",\n \"signup.dto.ts.hbs\",\n \"update-password.dto.ts.hbs\",\n \"update-me.dto.ts.hbs\",\n ];\n\n const dynamicAuthDtoFiles = [\n \"create-auth-permission.dto.ts.hbs\",\n \"update-auth-permission.dto.ts.hbs\",\n \"query-auth-permission.dto.ts.hbs\",\n \"create-auth-role.dto.ts.hbs\",\n \"update-auth-role.dto.ts.hbs\",\n \"query-auth-role.dto.ts.hbs\",\n ];\n\n const userDtoFiles = [\n \"create-user.dto.ts.hbs\",\n \"update-user.dto.ts.hbs\",\n \"query-user.dto.ts.hbs\",\n ];\n\n const authModuleComponents = [\n \"auth.policy.ts.hbs\",\n \"auth.router.ts.hbs\",\n ];\n\n const authPermissionModuleComponents = [\n \"auth-permission.router.ts.hbs\",\n \"auth-permission.policy.ts.hbs\",\n \"auth-permission.service.ts.hbs\",\n ];\n\n const authRoleModuleComponents = [\n \"auth-role.router.ts.hbs\",\n \"auth-role.policy.ts.hbs\",\n \"auth-role.service.ts.hbs\",\n ];\n\n const userModuleComponents = [\n \"user.service.ts.hbs\",\n \"user.router.ts.hbs\",\n \"user.policy.ts.hbs\",\n ];\n\n if (config.prisma?.provider === \"none\")\n files.push(\n ...authSharedPrismaFiles,\n ...dynamicAuthPrismaFiles,\n \"schema.prisma.hbs\",\n ...sharedAuthDtoFiles,\n ...dynamicAuthDtoFiles,\n ...userModuleComponents,\n ...authModuleComponents,\n ...authPermissionModuleComponents,\n ...authRoleModuleComponents,\n ...userDtoFiles,\n \"file-upload.auth.ts.hbs\",\n );\n\n if (!config.authentication?.type || config.authentication?.type === \"none\")\n files.push(\n ...authSharedPrismaFiles,\n ...dynamicAuthPrismaFiles,\n ...sharedAuthDtoFiles,\n ...dynamicAuthDtoFiles,\n ...userModuleComponents,\n ...authModuleComponents,\n ...authPermissionModuleComponents,\n ...authRoleModuleComponents,\n ...userDtoFiles,\n \"file-upload.policy.ts.hbs\"\n );\n\n if (config.authentication?.type === \"static\")\n files.push(\n ...dynamicAuthPrismaFiles,\n ...dynamicAuthDtoFiles,\n ...authPermissionModuleComponents,\n ...authRoleModuleComponents\n );\n\n // Ignore all DTOs when no validation library is selected\n if (!config.validation?.type)\n files.push(\n ...sharedAuthDtoFiles,\n ...dynamicAuthDtoFiles,\n ...userDtoFiles\n );\n\n // Ignoring typescript related files when typescript false\n if (!config.typescript) files.push(...[\"tsconfig.json.hbs\"]);\n\n // Ignoring javascript related files when typescript true\n if (config?.typescript) files.push(...[\"jsconfig.json.hbs\"]);\n\n if (config.entryPoint === \"src/app\") files.push(\"server.ts.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 (\n filesToBeSkipped.includes(dirent.name) ||\n dirent.name === \"__tests__\" ||\n dirent.name?.includes(\".test.ts\")\n )\n 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 arkosCurrentVersion = \"{{arkosCurrentVersion}}\";\n\n const content = template({ ...config, arkosCurrentVersion });\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 } else {\n const outputPath = path.join(outputDir, relativePath);\n fs.mkdirSync(path.dirname(outputPath), { recursive: true });\n fs.copyFileSync(fullPath, outputPath);\n }\n });\n }\n\n processTemplates(templatesDir);\n }\n}\n\nconst templateCompiler = new TemplateCompiler();\n\nexport default templateCompiler;\n"]}
|
package/package.json
CHANGED
package/templates/basic/.env.hbs
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
|
+
{{#if (neq prisma.provider "none")}}
|
|
1
2
|
# Database connection
|
|
2
|
-
DATABASE_URL={{prisma.
|
|
3
|
+
DATABASE_URL={{prisma.defaultDatabaseUrl}}
|
|
4
|
+
{{/if}}
|
|
3
5
|
|
|
6
|
+
{{#if (neq authentication.type "none")}}
|
|
4
7
|
# JWT secrets
|
|
5
8
|
# JWT_SECRET=
|
|
6
9
|
# JWT_EXPIRES_IN=30d
|
|
10
|
+
{{/if}}
|
|
7
11
|
|
|
8
12
|
# Server configuration
|
|
9
13
|
PORT=8000
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
This is an [Arkos.js](https://arkosjs.com) project scaffolded with [`create-arkos`](https://arkosjs.com/docs/tooling/
|
|
1
|
+
This is an [Arkos.js](https://arkosjs.com) project scaffolded with [`create-arkos`](https://arkosjs.com/docs/tooling/create-arkos).
|
|
2
2
|
|
|
3
3
|
## Getting Started
|
|
4
4
|
|
|
@@ -6,7 +6,12 @@ const arkosConfig = defineConfig({
|
|
|
6
6
|
prisma: {
|
|
7
7
|
instance: prisma
|
|
8
8
|
},
|
|
9
|
-
{{#if
|
|
9
|
+
{{#if (eq entryPoint "src/server")}}
|
|
10
|
+
source: {
|
|
11
|
+
entryPoint: "{{entryPoint}}{{#if typescript}}.ts{{else}}.js{{/if}}"
|
|
12
|
+
},
|
|
13
|
+
{{/if}}
|
|
14
|
+
{{#if (neq authentication.type "none")}}
|
|
10
15
|
authentication: {
|
|
11
16
|
mode: '{{authentication.type}}',
|
|
12
17
|
login: {
|
|
@@ -30,10 +35,18 @@ const arkosConfig = defineConfig({
|
|
|
30
35
|
strict: false,
|
|
31
36
|
},
|
|
32
37
|
middlewares: {
|
|
33
|
-
cors: {
|
|
34
|
-
|
|
38
|
+
cors: {},
|
|
39
|
+
},
|
|
40
|
+
{{#if (eq prisma.provider "none")}}
|
|
41
|
+
warnings: {
|
|
42
|
+
suppress: {
|
|
43
|
+
prisma: {
|
|
44
|
+
noInstanceFound: true,
|
|
45
|
+
noSchemaFound: true,
|
|
46
|
+
},
|
|
35
47
|
},
|
|
36
48
|
}
|
|
49
|
+
{{/if}}
|
|
37
50
|
})
|
|
38
51
|
|
|
39
52
|
export default arkosConfig
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"compilerOptions": {
|
|
3
|
-
"target": "
|
|
4
|
-
"module": "
|
|
3
|
+
"target": "es2022",
|
|
4
|
+
"module": "es2022",
|
|
5
5
|
"moduleResolution": "bundler",
|
|
6
6
|
"rootDir": ".",
|
|
7
7
|
"baseUrl": ".",
|
|
@@ -20,5 +20,5 @@
|
|
|
20
20
|
}
|
|
21
21
|
},
|
|
22
22
|
"include": ["src/**/*.js", "src/**/*.jsx", "packages/**/*.js", "arkos.config.js"],
|
|
23
|
-
"exclude": ["node_modules", ".build", "src/**/__tests__/**", "src/**/*.test", "src/**/*.spec", "build", "dist", "uploads"]
|
|
23
|
+
"exclude": ["node_modules", ".build", "src/**/__tests__/**", "src/**/*.test", "src/**/*.spec", "build", "dist", "uploads", "src/generated", ".arkos"]
|
|
24
24
|
}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "{{projectName}}",
|
|
3
|
-
"
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "This RESTful API was generated by create-arkos, read more about Arkos.js at [www.arkosjs.com](https://www.arkosjs.com)",
|
|
4
6
|
"scripts": {
|
|
5
7
|
"dev": "arkos dev",
|
|
6
8
|
"build": "arkos build",
|
|
@@ -12,30 +14,46 @@
|
|
|
12
14
|
},
|
|
13
15
|
"devDependencies": {
|
|
14
16
|
{{#if typescript}}
|
|
15
|
-
"typescript": "
|
|
16
|
-
"@types/node": "
|
|
17
|
-
"@types/express": "5.0.
|
|
17
|
+
"typescript": "7.0.2",
|
|
18
|
+
"@types/node": "26.1.1",
|
|
19
|
+
"@types/express": "5.0.6",
|
|
18
20
|
{{/if}}
|
|
19
|
-
"tsx-strict": "0.
|
|
21
|
+
"tsx-strict": "0.8.0",
|
|
20
22
|
"tsx": "4.23.1"{{#if (neq prisma.provider "none")}},
|
|
21
|
-
"prisma": "
|
|
23
|
+
"prisma": "7.9.0"
|
|
22
24
|
{{/if}}
|
|
23
25
|
},
|
|
24
26
|
"dependencies": {
|
|
25
|
-
"arkos": "2.0.0-next.
|
|
26
|
-
"express": "
|
|
27
|
-
"@scalar/express-api-reference": "0.10.
|
|
28
|
-
"@scalar/api-reference": "1.
|
|
27
|
+
"arkos": "2.0.0-next.19",
|
|
28
|
+
"express": "5.2.1",
|
|
29
|
+
"@scalar/express-api-reference": "0.10.11",
|
|
30
|
+
"@scalar/api-reference": "1.63.0"{{#if (or (neq prisma.provider "none") validation.type)}},{{/if}}
|
|
29
31
|
{{#if (neq prisma.provider "none")}}
|
|
30
|
-
"@prisma/client": "
|
|
32
|
+
"@prisma/client": "7.9.0",
|
|
33
|
+
{{#if (eq prisma.provider "postgresql")}}
|
|
34
|
+
"@prisma/adapter-pg": "7.9.0",
|
|
35
|
+
{{/if}}
|
|
36
|
+
{{#if (eq prisma.provider "cockroachdb")}}
|
|
37
|
+
"@prisma/adapter-pg": "7.9.0",
|
|
38
|
+
{{/if}}
|
|
39
|
+
{{#if (eq prisma.provider "mysql")}}
|
|
40
|
+
"@prisma/adapter-mariadb": "7.9.0",
|
|
41
|
+
{{/if}}
|
|
42
|
+
{{#if (eq prisma.provider "sqlite")}}
|
|
43
|
+
"@prisma/adapter-better-sqlite3": "7.9.0",
|
|
44
|
+
{{/if}}
|
|
45
|
+
{{#if (eq prisma.provider "sqlserver")}}
|
|
46
|
+
"@prisma/adapter-mssql": "7.9.0",
|
|
47
|
+
{{/if}}
|
|
48
|
+
{{#if validation.type}},{{/if}}
|
|
31
49
|
{{/if}}
|
|
32
50
|
{{#if (eq validation.type "class-validator")}}
|
|
33
51
|
"reflect-metadata": "0.2.2",
|
|
34
52
|
"class-transformer": "0.5.1",
|
|
35
|
-
"class-validator": "0.
|
|
53
|
+
"class-validator": "0.15.1"
|
|
36
54
|
{{/if}}
|
|
37
55
|
{{#if (eq validation.type "zod")}}
|
|
38
|
-
"zod": "
|
|
56
|
+
"zod": "4.4.3"
|
|
39
57
|
{{/if}}
|
|
40
58
|
}
|
|
41
59
|
}
|
|
@@ -24,10 +24,10 @@ describe("UserRole model template rendering", () => {
|
|
|
24
24
|
const result1 = renderTemplate(templatePath, context1);
|
|
25
25
|
expect(result1.trim()).toBe("");
|
|
26
26
|
|
|
27
|
-
// Test case 2:
|
|
27
|
+
// Test case 2: none authentication
|
|
28
28
|
const context2 = {
|
|
29
29
|
authentication: {
|
|
30
|
-
type: "
|
|
30
|
+
type: "none",
|
|
31
31
|
multipleRoles: false,
|
|
32
32
|
},
|
|
33
33
|
prisma: {
|
|
@@ -65,10 +65,10 @@ describe("User model template rendering", () => {
|
|
|
65
65
|
expect(result3).toContain("roles UserRole[]");
|
|
66
66
|
});
|
|
67
67
|
|
|
68
|
-
it('should handle "
|
|
68
|
+
it('should handle "none" authentication type', () => {
|
|
69
69
|
const context = {
|
|
70
70
|
authentication: {
|
|
71
|
-
type: "
|
|
71
|
+
type: "none",
|
|
72
72
|
usernameField: "email",
|
|
73
73
|
},
|
|
74
74
|
prisma: {
|
|
@@ -1,17 +1,11 @@
|
|
|
1
1
|
model AuthPermission {
|
|
2
2
|
id String {{{prisma.idDatabaseType}}}
|
|
3
3
|
resource String
|
|
4
|
-
{{#if (eq prisma.provider "sqlite")}}
|
|
5
4
|
action String @default("View")
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
{{/if}}
|
|
9
|
-
roleId String {{#if (eq prisma.provider "mongodb")}}@db.ObjectId{{/if}}
|
|
10
|
-
role AuthRole @relation(fields: [roleId], references: [id])
|
|
5
|
+
roles AuthRole[]
|
|
6
|
+
users UserPermission[]
|
|
11
7
|
createdAt DateTime @default(now())
|
|
12
8
|
updatedAt DateTime @updatedAt
|
|
13
9
|
|
|
14
|
-
@@unique([resource, action
|
|
10
|
+
@@unique([resource, action])
|
|
15
11
|
}
|
|
16
|
-
|
|
17
|
-
|