create-celsian 0.1.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,46 +1,155 @@
1
1
  #!/usr/bin/env node
2
2
  // create-celsian — Project scaffolder
3
- import { mkdirSync, writeFileSync } from 'node:fs';
4
- import { join, dirname } from 'node:path';
5
- import { basicTemplate } from './templates/basic.js';
6
- import { restApiTemplate } from './templates/rest-api.js';
7
- import { rpcApiTemplate } from './templates/rpc-api.js';
3
+ // Zero external dependencies. Interactive prompts via raw stdin.
4
+ import { mkdirSync, writeFileSync } from "node:fs";
5
+ import { basename, dirname, isAbsolute, join, resolve } from "node:path";
6
+ import { createInterface } from "node:readline";
7
+ import { basicTemplate } from "./templates/basic.js";
8
+ import { fullTemplate } from "./templates/full.js";
9
+ import { restApiTemplate } from "./templates/rest-api.js";
10
+ import { rpcApiTemplate } from "./templates/rpc-api.js";
11
+ // ─── Template Registry ───
8
12
  const templates = {
13
+ full: fullTemplate,
9
14
  basic: basicTemplate,
10
- 'rest-api': restApiTemplate,
11
- 'rpc-api': rpcApiTemplate,
15
+ "rest-api": restApiTemplate,
16
+ "rpc-api": rpcApiTemplate,
12
17
  };
18
+ const templateDescriptions = {
19
+ full: "Full-stack API with auth, CRUD, RPC, tasks, cron, OpenAPI, Docker",
20
+ basic: "Minimal API server",
21
+ "rest-api": "REST API with TypeBox schemas",
22
+ "rpc-api": "RPC-first with typed client",
23
+ };
24
+ // ─── CLI Argument Parsing ───
13
25
  const args = process.argv.slice(2);
14
- const name = args[0];
15
- const templateFlag = args.indexOf('--template');
16
- const template = templateFlag !== -1 ? args[templateFlag + 1] ?? 'basic' : 'basic';
17
- if (!name) {
18
- console.log('Usage: create-celsian <project-name> [--template basic|rest-api|rpc-api]');
19
- console.log('');
20
- console.log('Templates:');
21
- console.log(' basic Minimal API server (default)');
22
- console.log(' rest-api REST + TypeBox schemas');
23
- console.log(' rpc-api RPC-first with typed client');
24
- process.exit(1);
26
+ // Handle --help
27
+ if (args.includes("--help") || args.includes("-h")) {
28
+ printUsage();
29
+ process.exit(0);
25
30
  }
26
- const files = templates[template];
27
- if (!files) {
28
- console.error(`Unknown template: ${template}`);
29
- console.error('Available: basic, rest-api, rpc-api');
30
- process.exit(1);
31
+ // Extract flags
32
+ const templateFlag = args.indexOf("--template");
33
+ const templateArg = templateFlag !== -1 ? args[templateFlag + 1] : undefined;
34
+ const nameArg = args.find((a) => !a.startsWith("--") && (templateFlag === -1 || args.indexOf(a) !== templateFlag + 1));
35
+ // ─── Interactive Mode ───
36
+ async function prompt(question, defaultValue) {
37
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
38
+ return new Promise((resolve) => {
39
+ rl.question(` ${question} (${defaultValue}): `, (answer) => {
40
+ rl.close();
41
+ resolve(answer.trim() || defaultValue);
42
+ });
43
+ });
44
+ }
45
+ function detectPackageManager() {
46
+ const userAgent = process.env.npm_config_user_agent ?? "";
47
+ if (userAgent.startsWith("pnpm"))
48
+ return "pnpm";
49
+ if (userAgent.startsWith("bun"))
50
+ return "bun";
51
+ return "npm";
31
52
  }
32
- const dir = join(process.cwd(), name);
33
- console.log(`\nCreating Celsian project: ${name}\n`);
34
- for (const [filePath, content] of Object.entries(files)) {
35
- const fullPath = join(dir, filePath);
36
- const fileDir = dirname(fullPath);
37
- mkdirSync(fileDir, { recursive: true });
38
- writeFileSync(fullPath, content.replace(/\{\{name\}\}/g, name));
39
- console.log(` + ${filePath}`);
53
+ async function interactiveMode() {
54
+ console.log("");
55
+ console.log(" Create a new Celsian project");
56
+ console.log(" ────────────────────────────");
57
+ console.log("");
58
+ const name = await prompt("Project name", "my-celsian-app");
59
+ console.log("");
60
+ console.log(" Available templates:");
61
+ for (const [key, desc] of Object.entries(templateDescriptions)) {
62
+ const marker = key === "full" ? " (recommended)" : "";
63
+ console.log(` ${key.padEnd(12)} ${desc}${marker}`);
64
+ }
65
+ console.log("");
66
+ const template = await prompt("Template", "full");
67
+ const detected = detectPackageManager();
68
+ const pm = await prompt("Package manager", detected);
69
+ return { name, template, pm };
40
70
  }
41
- console.log(`\nDone! Next steps:\n`);
42
- console.log(` cd ${name}`);
43
- console.log(' npm install');
44
- console.log(' npm run dev');
45
- console.log('');
71
+ // ─── Scaffold ───
72
+ function scaffold(name, template, pm) {
73
+ const files = templates[template];
74
+ if (!files) {
75
+ console.error(`\n Unknown template: ${template}`);
76
+ console.error(` Available: ${Object.keys(templates).join(", ")}\n`);
77
+ process.exit(1);
78
+ }
79
+ // Sanitize: reject names containing path traversal
80
+ if (name.includes("..")) {
81
+ console.error("\n Invalid project name: must not contain '..'.\n");
82
+ process.exit(1);
83
+ }
84
+ const cwd = process.cwd();
85
+ const dir = isAbsolute(name) ? name : join(cwd, name);
86
+ const resolved = resolve(dir);
87
+ // Ensure the resolved path is a child of cwd
88
+ if (!resolved.startsWith(cwd + "/") && resolved !== cwd) {
89
+ console.error("\n Invalid project name: resolved path must be inside the current directory.\n");
90
+ process.exit(1);
91
+ }
92
+ const projectName = basename(dir);
93
+ console.log(`\n Creating Celsian project: ${projectName}`);
94
+ console.log(` Template: ${template}`);
95
+ console.log("");
96
+ for (const [filePath, content] of Object.entries(files)) {
97
+ const fullPath = join(dir, filePath);
98
+ const fileDir = dirname(fullPath);
99
+ mkdirSync(fileDir, { recursive: true });
100
+ writeFileSync(fullPath, content.replace(/\{\{name\}\}/g, projectName));
101
+ console.log(` + ${filePath}`);
102
+ }
103
+ const install = pm === "npm" ? "npm install" : `${pm} install`;
104
+ const dev = pm === "npm" ? "npm run dev" : `${pm} run dev`;
105
+ console.log(`\n Done! Next steps:\n`);
106
+ console.log(` cd ${projectName}`);
107
+ console.log(` ${install}`);
108
+ if (template === "full") {
109
+ console.log(" cp .env.example .env");
110
+ }
111
+ console.log(` ${dev}`);
112
+ if (template === "full") {
113
+ console.log("");
114
+ console.log(" Open http://localhost:3000/docs for API documentation");
115
+ }
116
+ console.log("");
117
+ }
118
+ // ─── Main ───
119
+ async function main() {
120
+ // If both name and template are provided via CLI args, skip interactive mode
121
+ if (nameArg) {
122
+ const template = templateArg ?? "full";
123
+ const pm = detectPackageManager();
124
+ scaffold(nameArg, template, pm);
125
+ return;
126
+ }
127
+ // No project name — enter interactive mode
128
+ // But only if stdin is a TTY (not piped)
129
+ if (process.stdin.isTTY) {
130
+ const { name, template, pm } = await interactiveMode();
131
+ scaffold(name, template, pm);
132
+ }
133
+ else {
134
+ printUsage();
135
+ process.exit(1);
136
+ }
137
+ }
138
+ function printUsage() {
139
+ console.log("");
140
+ console.log(" Usage: create-celsian <project-name> [--template full|basic|rest-api|rpc-api]");
141
+ console.log("");
142
+ console.log(" Templates:");
143
+ for (const [key, desc] of Object.entries(templateDescriptions)) {
144
+ const defaultMarker = key === "full" ? " (default)" : "";
145
+ console.log(` ${key.padEnd(12)} ${desc}${defaultMarker}`);
146
+ }
147
+ console.log("");
148
+ console.log(" Run without arguments for interactive mode.");
149
+ console.log("");
150
+ }
151
+ main().catch((err) => {
152
+ console.error(err);
153
+ process.exit(1);
154
+ });
46
155
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,sCAAsC;AAEtC,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,MAAM,SAAS,GAA2C;IACxD,KAAK,EAAE,aAAa;IACpB,UAAU,EAAE,eAAe;IAC3B,SAAS,EAAE,cAAc;CAC1B,CAAC;AAEF,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AACrB,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;AAChD,MAAM,QAAQ,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;AAEnF,IAAI,CAAC,IAAI,EAAE,CAAC;IACV,OAAO,CAAC,GAAG,CAAC,0EAA0E,CAAC,CAAC;IACxF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAC1B,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;IACzD,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;IACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,KAAK,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAClC,IAAI,CAAC,KAAK,EAAE,CAAC;IACX,OAAO,CAAC,KAAK,CAAC,qBAAqB,QAAQ,EAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;AAEtC,OAAO,CAAC,GAAG,CAAC,+BAA+B,IAAI,IAAI,CAAC,CAAC;AAErD,KAAK,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;IACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACrC,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAClC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxC,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC,CAAC;IAChE,OAAO,CAAC,GAAG,CAAC,OAAO,QAAQ,EAAE,CAAC,CAAC;AACjC,CAAC;AAED,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;AACrC,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;AAC5B,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;AAC7B,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;AAC7B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  export declare const basicTemplate: {
2
- 'package.json': string;
3
- 'tsconfig.json': string;
4
- 'src/index.ts': string;
2
+ "package.json": string;
3
+ "tsconfig.json": string;
4
+ "src/index.ts": string;
5
5
  };
6
6
  //# sourceMappingURL=basic.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"basic.d.ts","sourceRoot":"","sources":["../../src/templates/basic.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,aAAa;;;;CAqDzB,CAAC"}
1
+ {"version":3,"file":"basic.d.ts","sourceRoot":"","sources":["../../src/templates/basic.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,aAAa;;;;CAsEzB,CAAC"}
@@ -1,38 +1,55 @@
1
1
  export const basicTemplate = {
2
- 'package.json': JSON.stringify({
3
- name: '{{name}}',
4
- version: '0.0.1',
5
- type: 'module',
2
+ "package.json": JSON.stringify({
3
+ name: "{{name}}",
4
+ version: "0.0.1",
5
+ type: "module",
6
6
  scripts: {
7
- dev: 'npx celsian dev',
8
- build: 'tsc',
9
- start: 'node dist/index.js',
7
+ dev: "npx tsx --watch src/index.ts",
8
+ build: "tsc",
9
+ start: "node dist/index.js",
10
10
  },
11
11
  dependencies: {
12
- celsian: '^0.1.0',
12
+ celsian: "latest",
13
13
  },
14
14
  devDependencies: {
15
- typescript: '^5.7.0',
16
- tsx: '^4.0.0',
15
+ typescript: "^5.7.0",
16
+ tsx: "^4.0.0",
17
17
  },
18
18
  }, null, 2),
19
- 'tsconfig.json': JSON.stringify({
19
+ "tsconfig.json": JSON.stringify({
20
20
  compilerOptions: {
21
- target: 'ES2022',
22
- module: 'ESNext',
23
- moduleResolution: 'bundler',
21
+ target: "ES2022",
22
+ module: "ESNext",
23
+ moduleResolution: "bundler",
24
24
  strict: true,
25
25
  esModuleInterop: true,
26
26
  skipLibCheck: true,
27
- outDir: 'dist',
28
- rootDir: 'src',
27
+ outDir: "dist",
28
+ rootDir: "src",
29
29
  },
30
- include: ['src'],
30
+ include: ["src"],
31
31
  }, null, 2),
32
- 'src/index.ts': `import { createApp, serve } from 'celsian';
32
+ "src/index.ts": `import { createApp, serve, cors, security } from 'celsian';
33
33
 
34
34
  const app = createApp();
35
35
 
36
+ // ─── Security (CORS + security headers) ───
37
+
38
+ const CORS_ORIGIN = process.env.CORS_ORIGIN ?? 'http://localhost:3000';
39
+
40
+ await app.register(cors({
41
+ origin: CORS_ORIGIN,
42
+ credentials: true,
43
+ maxAge: 86400,
44
+ }));
45
+
46
+ await app.register(security({
47
+ hsts: { maxAge: 31536000, includeSubDomains: true },
48
+ referrerPolicy: 'strict-origin-when-cross-origin',
49
+ }));
50
+
51
+ // ─── Routes ───
52
+
36
53
  app.get('/health', (req, reply) => {
37
54
  return reply.json({ status: 'ok', timestamp: new Date().toISOString() });
38
55
  });
@@ -1 +1 @@
1
- {"version":3,"file":"basic.js","sourceRoot":"","sources":["../../src/templates/basic.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,cAAc,EAAE,IAAI,CAAC,SAAS,CAC5B;QACE,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE;YACP,GAAG,EAAE,iBAAiB;YACtB,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,oBAAoB;SAC5B;QACD,YAAY,EAAE;YACZ,OAAO,EAAE,QAAQ;SAClB;QACD,eAAe,EAAE;YACf,UAAU,EAAE,QAAQ;YACpB,GAAG,EAAE,QAAQ;SACd;KACF,EACD,IAAI,EACJ,CAAC,CACF;IACD,eAAe,EAAE,IAAI,CAAC,SAAS,CAC7B;QACE,eAAe,EAAE;YACf,MAAM,EAAE,QAAQ;YAChB,MAAM,EAAE,QAAQ;YAChB,gBAAgB,EAAE,SAAS;YAC3B,MAAM,EAAE,IAAI;YACZ,eAAe,EAAE,IAAI;YACrB,YAAY,EAAE,IAAI;YAClB,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,KAAK;SACf;QACD,OAAO,EAAE,CAAC,KAAK,CAAC;KACjB,EACD,IAAI,EACJ,CAAC,CACF;IACD,cAAc,EAAE;;;;;;;;;;;;;CAajB;CACA,CAAC"}
1
+ {"version":3,"file":"basic.js","sourceRoot":"","sources":["../../src/templates/basic.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,cAAc,EAAE,IAAI,CAAC,SAAS,CAC5B;QACE,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE;YACP,GAAG,EAAE,8BAA8B;YACnC,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,oBAAoB;SAC5B;QACD,YAAY,EAAE;YACZ,OAAO,EAAE,QAAQ;SAClB;QACD,eAAe,EAAE;YACf,UAAU,EAAE,QAAQ;YACpB,GAAG,EAAE,QAAQ;SACd;KACF,EACD,IAAI,EACJ,CAAC,CACF;IACD,eAAe,EAAE,IAAI,CAAC,SAAS,CAC7B;QACE,eAAe,EAAE;YACf,MAAM,EAAE,QAAQ;YAChB,MAAM,EAAE,QAAQ;YAChB,gBAAgB,EAAE,SAAS;YAC3B,MAAM,EAAE,IAAI;YACZ,eAAe,EAAE,IAAI;YACrB,YAAY,EAAE,IAAI;YAClB,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,KAAK;SACf;QACD,OAAO,EAAE,CAAC,KAAK,CAAC;KACjB,EACD,IAAI,EACJ,CAAC,CACF;IACD,cAAc,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8BjB;CACA,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const fullTemplate: Record<string, string>;
2
+ //# sourceMappingURL=full.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"full.d.ts","sourceRoot":"","sources":["../../src/templates/full.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAg4B/C,CAAC"}