create-galdur 0.0.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.
@@ -0,0 +1,2 @@
1
+
2
+ export { }
package/dist/index.js ADDED
@@ -0,0 +1,540 @@
1
+ #!/usr/bin/env node
2
+
3
+ // src/index.ts
4
+ import process2 from "process";
5
+ import path12 from "path";
6
+ import { intro, outro, spinner, log } from "@clack/prompts";
7
+ import color from "picocolors";
8
+ import { execa } from "execa";
9
+
10
+ // src/questions.ts
11
+ import path from "path";
12
+ import process from "process";
13
+ import { text, select, confirm, isCancel, cancel } from "@clack/prompts";
14
+ function ensureNotCancelled(result) {
15
+ if (isCancel(result)) {
16
+ cancel("Operation cancelled.");
17
+ process.exit(0);
18
+ }
19
+ return result;
20
+ }
21
+ async function askText(options) {
22
+ const result = await text(options);
23
+ return ensureNotCancelled(result);
24
+ }
25
+ async function askSelect(options) {
26
+ const result = await select(options);
27
+ return ensureNotCancelled(result);
28
+ }
29
+ async function askConfirm(options) {
30
+ const result = await confirm(options);
31
+ return ensureNotCancelled(result);
32
+ }
33
+ function getDefaultProjectName() {
34
+ const base = path.basename(process.cwd());
35
+ return base && base !== path.parse(process.cwd()).root ? base : "my-galdur-app";
36
+ }
37
+ function normalizeAliasPrefix(value) {
38
+ let v = value.trim();
39
+ if (!v) {
40
+ return "@/";
41
+ }
42
+ if (!v.startsWith("@")) {
43
+ v = `@${v}`;
44
+ }
45
+ if (!v.endsWith("/")) {
46
+ v = `${v}/`;
47
+ }
48
+ return v;
49
+ }
50
+ async function askAllQuestions() {
51
+ const defaultProjectName = getDefaultProjectName();
52
+ const rawProjectName = await askText({
53
+ message: "Project name",
54
+ placeholder: defaultProjectName,
55
+ initialValue: "",
56
+ validate: (value) => !value || value.trim().length === 0 ? "Project name is required" : void 0
57
+ });
58
+ const projectName = rawProjectName.trim() || defaultProjectName;
59
+ const projectDir = path.join(process.cwd(), projectName);
60
+ const packageManager = await askSelect({
61
+ message: "Package manager",
62
+ options: [
63
+ { value: "pnpm", label: "pnpm" },
64
+ { value: "npm", label: "npm" },
65
+ { value: "yarn", label: "yarn" },
66
+ { value: "bun", label: "bun" }
67
+ ],
68
+ initialValue: "pnpm"
69
+ });
70
+ const language = await askSelect({
71
+ message: "Language",
72
+ options: [
73
+ { value: "typescript", label: "TypeScript" },
74
+ { value: "javascript", label: "JavaScript" }
75
+ ],
76
+ initialValue: "typescript"
77
+ });
78
+ const frameworkMode = await askSelect({
79
+ message: "Framework mode",
80
+ options: [
81
+ { value: "file-router", label: "File router", hint: "routes resolved from the filesystem" },
82
+ { value: "cms-driven", label: "CMS-driven", hint: "routes resolved from a headless CMS" }
83
+ ],
84
+ initialValue: "file-router"
85
+ });
86
+ const linting = await askSelect({
87
+ message: "Linting",
88
+ options: [
89
+ { value: "biome", label: "Biome" },
90
+ { value: "eslint", label: "ESLint" },
91
+ { value: "none", label: "None" }
92
+ ],
93
+ initialValue: "biome"
94
+ });
95
+ const formatting = await askSelect({
96
+ message: "Formatting",
97
+ options: [
98
+ { value: "biome", label: "Biome" },
99
+ { value: "prettier", label: "Prettier" },
100
+ { value: "none", label: "None" }
101
+ ],
102
+ initialValue: "biome"
103
+ });
104
+ const cssStrategy = await askSelect({
105
+ message: "CSS strategy",
106
+ options: [
107
+ { value: "tailwind", label: "Tailwind CSS" },
108
+ { value: "plain-css", label: "Plain CSS" },
109
+ { value: "css-modules", label: "CSS Modules" },
110
+ { value: "sass", label: "Sass" }
111
+ ],
112
+ initialValue: "tailwind"
113
+ });
114
+ const usePathAliases = await askConfirm({
115
+ message: "Use path aliases?",
116
+ initialValue: true
117
+ });
118
+ let pathAliasPrefix = void 0;
119
+ if (usePathAliases) {
120
+ const raw = await askText({
121
+ message: "Path alias prefix",
122
+ placeholder: "@/",
123
+ initialValue: "@/",
124
+ validate: (value) => {
125
+ const v = value.trim();
126
+ if (!v) {
127
+ return "Prefix is required";
128
+ }
129
+ return void 0;
130
+ }
131
+ });
132
+ pathAliasPrefix = normalizeAliasPrefix(raw);
133
+ }
134
+ return {
135
+ projectName,
136
+ projectDir,
137
+ packageManager,
138
+ language,
139
+ frameworkMode,
140
+ linting,
141
+ formatting,
142
+ cssStrategy,
143
+ usePathAliases,
144
+ pathAliasPrefix
145
+ };
146
+ }
147
+
148
+ // src/template/folders.ts
149
+ import path2 from "path";
150
+ import { promises as fs } from "fs";
151
+ var folders = [
152
+ "public",
153
+ "src/app/api",
154
+ "src/views",
155
+ "src/features",
156
+ "src/shared/styles"
157
+ ];
158
+ async function createFolders(projectDir) {
159
+ for (const folder of folders) {
160
+ const fullPath = path2.join(projectDir, folder);
161
+ await fs.mkdir(fullPath, { recursive: true });
162
+ }
163
+ }
164
+
165
+ // src/template/files/galdur-config.ts
166
+ import path3 from "path";
167
+ import { promises as fs2 } from "fs";
168
+ async function writeGaldurConfig(projectDir, answers) {
169
+ const { cssStrategy } = answers;
170
+ const stylesValue = cssStrategy === "tailwind" ? `'tailwind'` : `'css'`;
171
+ const config = `import type { Middleware } from '@bgunnarsson/galdur-middleware'
172
+ import type { RenderContext, RenderResult } from '@bgunnarsson/galdur-router'
173
+
174
+ const globalMiddlewares: Middleware<RenderContext, RenderResult>[] = []
175
+
176
+ const isProd = process.env.NODE_ENV === 'production'
177
+
178
+ const config = {
179
+ styles: ${stylesValue},
180
+ cache: {
181
+ default: isProd ? 'public' : 'no-store',
182
+ },
183
+ server: {
184
+ mode: 'ssr', // ssr, hybrid, static
185
+ port: 3000,
186
+ https: !isProd,
187
+ },
188
+ actions: {
189
+ enable: true,
190
+ },
191
+ globalMiddlewares,
192
+ banner: {
193
+ title: 'Galdur',
194
+ subtitle: 'Built with @bgunnarsson/galdur',
195
+ },
196
+ }
197
+
198
+ export default config
199
+ `;
200
+ await fs2.writeFile(path3.join(projectDir, "galdur.config.ts"), config, "utf8");
201
+ }
202
+
203
+ // src/template/files/package-json.ts
204
+ import path4 from "path";
205
+ import { promises as fs3 } from "fs";
206
+ var GALDUR_VERSION = "0.0.18";
207
+ var REACT_VERSION = "19.2.0";
208
+ async function writePackageJson(projectDir, answers) {
209
+ const { projectName, cssStrategy } = answers;
210
+ const scripts = {
211
+ dev: "cross-env NODE_TLS_REJECT_UNAUTHORIZED=0 tsx ./src/app/server.ts",
212
+ "build:server": `vite build --ssr --config node_modules/@bgunnarsson/galdur-vite/vite.config.mjs`,
213
+ "build:client": `vite build --config node_modules/@bgunnarsson/galdur-vite/vite.config.mjs`,
214
+ build: "pnpm run build:server && pnpm run build:client",
215
+ "start:prod": `cross-env NODE_ENV=production node --env-file=.env ./dist/server/app/server.js`
216
+ };
217
+ if (cssStrategy === "tailwind") {
218
+ scripts["tw:build"] = "galdur-tailwind --app-root . -i ./src/shared/styles/main.css -o ./public/main.min.css --minify";
219
+ scripts["tw:dev"] = "galdur-tailwind --app-root . -i ./src/shared/styles/main.css -o ./public/main.min.css --watch";
220
+ scripts["dev"] = `cross-env NODE_TLS_REJECT_UNAUTHORIZED=0 tsx ./src/app/server.ts`;
221
+ scripts["build"] = "pnpm run tw:build && pnpm run build:server && pnpm run build:client";
222
+ }
223
+ const dependencies = {
224
+ [`@bgunnarsson/galdur-actions`]: GALDUR_VERSION,
225
+ [`@bgunnarsson/galdur-document`]: GALDUR_VERSION,
226
+ [`@bgunnarsson/galdur-islands`]: GALDUR_VERSION,
227
+ [`@bgunnarsson/galdur-middleware`]: GALDUR_VERSION,
228
+ [`@bgunnarsson/galdur-router`]: GALDUR_VERSION,
229
+ [`@bgunnarsson/galdur-server`]: GALDUR_VERSION,
230
+ react: REACT_VERSION,
231
+ "react-dom": REACT_VERSION
232
+ };
233
+ const devDependencies = {
234
+ [`@bgunnarsson/galdur-vite`]: GALDUR_VERSION,
235
+ "@types/node": "24.10.1",
236
+ "@types/react": "19.2.7",
237
+ "@types/react-dom": "19.2.3",
238
+ "cross-env": "10.1.0",
239
+ hono: "4.12.8",
240
+ tsx: "4.21.0",
241
+ typescript: "5.9.3",
242
+ vite: "7.2.4"
243
+ };
244
+ if (cssStrategy === "tailwind") {
245
+ devDependencies[`@bgunnarsson/galdur-plugin-tailwind`] = GALDUR_VERSION;
246
+ devDependencies["@tailwindcss/cli"] = "^4.1.18";
247
+ devDependencies["tailwindcss"] = "4.1.18";
248
+ }
249
+ const pkgJson = {
250
+ name: projectName,
251
+ private: true,
252
+ version: "0.0.0",
253
+ type: "module",
254
+ scripts,
255
+ dependencies,
256
+ devDependencies,
257
+ pnpm: {
258
+ onlyBuiltDependencies: ["@swc/core", "esbuild"]
259
+ }
260
+ };
261
+ await fs3.writeFile(path4.join(projectDir, "package.json"), JSON.stringify(pkgJson, null, 2), "utf8");
262
+ }
263
+
264
+ // src/template/files/server.ts
265
+ import path5 from "path";
266
+ import { promises as fs4 } from "fs";
267
+ async function writeServer(projectDir) {
268
+ const content = `import { startDevServer, startProdServer } from '@bgunnarsson/galdur-server'
269
+ import config from '../../galdur.config.js'
270
+
271
+ const isProduction = process.env.NODE_ENV === 'production'
272
+
273
+ function resolvePort(port: unknown) {
274
+ if (typeof port === 'number' && Number.isFinite(port)) {
275
+ return port
276
+ }
277
+ const env = Number.parseInt(process.env.PORT ?? '', 10)
278
+ return Number.isFinite(env) ? env : 3000
279
+ }
280
+
281
+ const options = {
282
+ port: resolvePort((config as any)?.server?.port),
283
+ https: (config as any)?.server?.https,
284
+ actions: config?.actions,
285
+ globalMiddlewares: config?.globalMiddlewares,
286
+ banner: config?.banner,
287
+ }
288
+
289
+ if (isProduction) {
290
+ await startProdServer(options)
291
+ } else {
292
+ await startDevServer(options)
293
+ }
294
+ `;
295
+ await fs4.writeFile(path5.join(projectDir, "src/app/server.ts"), content, "utf8");
296
+ }
297
+
298
+ // src/template/files/entry-client.ts
299
+ import path6 from "path";
300
+ import { promises as fs5 } from "fs";
301
+ async function writeEntryClient(projectDir) {
302
+ const content = `import { installClientNavigation } from '@bgunnarsson/galdur-router/browser'
303
+ import { installRouteProgressBar } from '@bgunnarsson/galdur-router/progress'
304
+ import { createIslandsHydrator } from '@bgunnarsson/galdur-islands/client'
305
+ import { loadIsland } from '@bgunnarsson/galdur-islands/registry.client'
306
+
307
+ installRouteProgressBar()
308
+
309
+ const hydrate = createIslandsHydrator(loadIsland)
310
+
311
+ installClientNavigation({
312
+ onAfterNavigate: () => void hydrate(document),
313
+ })
314
+
315
+ void hydrate(document)
316
+ `;
317
+ await fs5.writeFile(path6.join(projectDir, "src/app/entry.client.tsx"), content, "utf8");
318
+ }
319
+
320
+ // src/template/files/path-page.ts
321
+ import path7 from "path";
322
+ import { promises as fs6 } from "fs";
323
+ async function writePathPage(projectDir, answers) {
324
+ const isCmsDriven = answers.frameworkMode === "cms-driven";
325
+ const content = isCmsDriven ? `import type { RenderContext } from '@bgunnarsson/galdur-router'
326
+ import { notFound, ok } from '@bgunnarsson/galdur-router'
327
+ import Home from '../views/Home.server.js'
328
+
329
+ // TODO: Replace with your CMS fetch logic
330
+ async function fetchPageByPath(pathname: string) {
331
+ // e.g. return await cms.getByPath(pathname)
332
+ if (pathname === '/') return { contentType: 'home', name: 'Home' }
333
+ return null
334
+ }
335
+
336
+ export async function render(ctx: RenderContext) {
337
+ const page = await fetchPageByPath(ctx.pathname)
338
+
339
+ if (!page) {
340
+ return notFound()
341
+ }
342
+
343
+ if (page.contentType === 'home') {
344
+ return ok({
345
+ element: <Home data={page} />,
346
+ })
347
+ }
348
+
349
+ return notFound()
350
+ }
351
+ ` : `import type { RenderContext } from '@bgunnarsson/galdur-router'
352
+ import { notFound, ok } from '@bgunnarsson/galdur-router'
353
+ import Home from '../views/Home.server.js'
354
+
355
+ export async function render(ctx: RenderContext) {
356
+ if (ctx.pathname === '/') {
357
+ return ok({
358
+ element: <Home />,
359
+ })
360
+ }
361
+
362
+ return notFound()
363
+ }
364
+ `;
365
+ await fs6.writeFile(path7.join(projectDir, "src/app/+path.server.tsx"), content, "utf8");
366
+ }
367
+
368
+ // src/template/files/home-view.ts
369
+ import path8 from "path";
370
+ import { promises as fs7 } from "fs";
371
+ async function writeHomeView(projectDir, answers) {
372
+ const isCmsDriven = answers.frameworkMode === "cms-driven";
373
+ const content = isCmsDriven ? `import type { FC } from 'react'
374
+
375
+ type Props = {
376
+ data: { name: string }
377
+ }
378
+
379
+ const Home: FC<Props> = ({ data }) => {
380
+ return (
381
+ <main>
382
+ <h1>{data.name}</h1>
383
+ </main>
384
+ )
385
+ }
386
+
387
+ export default Home
388
+ ` : `const Home = () => {
389
+ return (
390
+ <main>
391
+ <h1>Welcome to Galdur</h1>
392
+ </main>
393
+ )
394
+ }
395
+
396
+ export default Home
397
+ `;
398
+ await fs7.writeFile(path8.join(projectDir, "src/views/Home.server.tsx"), content, "utf8");
399
+ }
400
+
401
+ // src/template/files/tsconfig-json.ts
402
+ import path9 from "path";
403
+ import { promises as fs8 } from "fs";
404
+ async function writeTsconfig(projectDir, answers) {
405
+ const { usePathAliases, pathAliasPrefix, projectName } = answers;
406
+ const paths = {};
407
+ if (usePathAliases && pathAliasPrefix) {
408
+ paths[`${pathAliasPrefix}*`] = ["./src/*"];
409
+ }
410
+ const compilerOptions = {
411
+ $schema: "https://json.schemastore.org/tsconfig",
412
+ target: "ES2022",
413
+ lib: ["ES2022", "DOM", "DOM.Iterable"],
414
+ module: "ESNext",
415
+ moduleResolution: "Bundler",
416
+ verbatimModuleSyntax: true,
417
+ resolveJsonModule: true,
418
+ jsx: "react-jsx",
419
+ strict: true,
420
+ noUncheckedIndexedAccess: true,
421
+ exactOptionalPropertyTypes: true,
422
+ isolatedModules: true,
423
+ useDefineForClassFields: true,
424
+ skipLibCheck: true,
425
+ forceConsistentCasingInFileNames: true,
426
+ noEmit: true,
427
+ types: ["node", "vite/client"],
428
+ allowImportingTsExtensions: true,
429
+ moduleDetection: "force",
430
+ incremental: true,
431
+ tsBuildInfoFile: `./node_modules/.cache/tsbuildinfo/${projectName}.tsbuildinfo`
432
+ };
433
+ if (Object.keys(paths).length > 0) {
434
+ compilerOptions["paths"] = paths;
435
+ }
436
+ const tsconfig = {
437
+ compilerOptions,
438
+ include: ["src", "galdur.config.ts"]
439
+ };
440
+ await fs8.writeFile(path9.join(projectDir, "tsconfig.json"), JSON.stringify(tsconfig, null, 2), "utf8");
441
+ }
442
+
443
+ // src/template/files/index-html.ts
444
+ import path10 from "path";
445
+ import { promises as fs9 } from "fs";
446
+ async function writeIndexHtml(projectDir, answers) {
447
+ const hasCss = answers.cssStrategy === "tailwind";
448
+ const cssLink = hasCss ? `
449
+ <link rel="preload" href="/main.min.css" as="style" />
450
+ <link rel="stylesheet" href="/main.min.css" />` : "";
451
+ const content = `<!DOCTYPE html>
452
+ <html lang="en">
453
+ <head>
454
+ <meta charset="UTF-8">
455
+ <meta name="viewport" content="width=device-width, initial-scale=1">
456
+ <meta http-equiv="X-UA-Compatible" content="ie=edge">${cssLink}
457
+ <!--app-head-->
458
+ </head>
459
+ <body>
460
+ <div id="__galdur"><!--ssr-outlet--></div>
461
+ <!--app-scripts-->
462
+ </body>
463
+ </html>
464
+ `;
465
+ await fs9.writeFile(path10.join(projectDir, "index.html"), content, "utf8");
466
+ }
467
+
468
+ // src/template/files/styles.ts
469
+ import path11 from "path";
470
+ import { promises as fs10 } from "fs";
471
+ async function writeStyles(projectDir, answers) {
472
+ if (answers.cssStrategy === "tailwind") {
473
+ const main = `@import "tailwindcss";
474
+ `;
475
+ await fs10.writeFile(path11.join(projectDir, "src/shared/styles/main.css"), main, "utf8");
476
+ } else {
477
+ const main = `/* Global styles */
478
+ `;
479
+ await fs10.writeFile(path11.join(projectDir, "src/shared/styles/main.css"), main, "utf8");
480
+ }
481
+ }
482
+
483
+ // src/index.ts
484
+ process2.on("unhandledRejection", (reason) => {
485
+ console.error("Unhandled Promise Rejection:", reason);
486
+ process2.exit(1);
487
+ });
488
+ process2.on("uncaughtException", (error) => {
489
+ console.error("Uncaught Exception:", error);
490
+ process2.exit(1);
491
+ });
492
+ var INSTALL_COMMANDS = {
493
+ pnpm: ["pnpm", ["install"]],
494
+ npm: ["npm", ["install"]],
495
+ yarn: ["yarn", ["install"]],
496
+ bun: ["bun", ["install"]]
497
+ };
498
+ (async (_argv) => {
499
+ console.clear();
500
+ intro(color.cyan("create-galdur"));
501
+ const answers = await askAllQuestions();
502
+ const { projectDir, packageManager } = answers;
503
+ const s = spinner();
504
+ s.start("Scaffolding project...");
505
+ try {
506
+ await createFolders(projectDir);
507
+ await Promise.all([
508
+ writePackageJson(projectDir, answers),
509
+ writeTsconfig(projectDir, answers),
510
+ writeGaldurConfig(projectDir, answers),
511
+ writeIndexHtml(projectDir, answers),
512
+ writeStyles(projectDir, answers)
513
+ ]);
514
+ await Promise.all([
515
+ writeServer(projectDir),
516
+ writeEntryClient(projectDir),
517
+ writePathPage(projectDir, answers),
518
+ writeHomeView(projectDir, answers)
519
+ ]);
520
+ } catch (err) {
521
+ s.stop(color.red("Scaffolding failed."));
522
+ console.error(err);
523
+ process2.exit(1);
524
+ }
525
+ s.stop(color.green("Project scaffolded."));
526
+ s.start(`Installing dependencies with ${packageManager}...`);
527
+ try {
528
+ const [cmd, args] = INSTALL_COMMANDS[packageManager];
529
+ await execa(cmd, args, { cwd: projectDir, stdio: "pipe" });
530
+ s.stop(color.green("Dependencies installed."));
531
+ } catch {
532
+ s.stop(color.yellow("Dependency install failed \u2014 run it manually."));
533
+ }
534
+ const rel = path12.relative(process2.cwd(), projectDir);
535
+ log.info(color.dim("Next steps:"));
536
+ log.info(` cd ${rel}`);
537
+ log.info(` ${packageManager} run dev`);
538
+ outro(color.green("Done."));
539
+ })(process2.argv.slice(2));
540
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/questions.ts","../src/template/folders.ts","../src/template/files/galdur-config.ts","../src/template/files/package-json.ts","../src/template/files/server.ts","../src/template/files/entry-client.ts","../src/template/files/path-page.ts","../src/template/files/home-view.ts","../src/template/files/tsconfig-json.ts","../src/template/files/index-html.ts","../src/template/files/styles.ts"],"sourcesContent":["import process from 'node:process'\nimport path from 'node:path'\nimport { intro, outro, spinner, log } from '@clack/prompts'\nimport color from 'picocolors'\nimport { execa } from 'execa'\nimport { askAllQuestions } from './questions.js'\nimport { createFolders } from './template/folders.js'\nimport { writeGaldurConfig } from './template/files/galdur-config.js'\nimport { writePackageJson } from './template/files/package-json.js'\nimport { writeServer } from './template/files/server.js'\nimport { writeEntryClient } from './template/files/entry-client.js'\nimport { writePathPage } from './template/files/path-page.js'\nimport { writeHomeView } from './template/files/home-view.js'\nimport { writeTsconfig } from './template/files/tsconfig-json.js'\nimport { writeIndexHtml } from './template/files/index-html.js'\nimport { writeStyles } from './template/files/styles.js'\n\nprocess.on('unhandledRejection', (reason) => {\n console.error('Unhandled Promise Rejection:', reason)\n process.exit(1)\n})\n\nprocess.on('uncaughtException', (error) => {\n console.error('Uncaught Exception:', error)\n process.exit(1)\n})\n\nconst INSTALL_COMMANDS: Record<string, readonly string[]> = {\n pnpm: ['pnpm', ['install']],\n npm: ['npm', ['install']],\n yarn: ['yarn', ['install']],\n bun: ['bun', ['install']],\n} as any\n\n// IIFE entrypoint\n;(async (_argv: string[]) => {\n console.clear()\n intro(color.cyan('create-galdur'))\n\n const answers = await askAllQuestions()\n const { projectDir, packageManager } = answers\n\n const s = spinner()\n\n // --- scaffold ---\n s.start('Scaffolding project...')\n\n try {\n await createFolders(projectDir)\n await Promise.all([\n writePackageJson(projectDir, answers),\n writeTsconfig(projectDir, answers),\n writeGaldurConfig(projectDir, answers),\n writeIndexHtml(projectDir, answers),\n writeStyles(projectDir, answers),\n ])\n await Promise.all([\n writeServer(projectDir),\n writeEntryClient(projectDir),\n writePathPage(projectDir, answers),\n writeHomeView(projectDir, answers),\n ])\n } catch (err) {\n s.stop(color.red('Scaffolding failed.'))\n console.error(err)\n process.exit(1)\n }\n\n s.stop(color.green('Project scaffolded.'))\n\n // --- install deps ---\n s.start(`Installing dependencies with ${packageManager}...`)\n\n try {\n const [cmd, args] = INSTALL_COMMANDS[packageManager] as [string, string[]]\n await execa(cmd, args, { cwd: projectDir, stdio: 'pipe' })\n s.stop(color.green('Dependencies installed.'))\n } catch {\n s.stop(color.yellow('Dependency install failed — run it manually.'))\n }\n\n // --- done ---\n const rel = path.relative(process.cwd(), projectDir)\n log.info(color.dim('Next steps:'))\n log.info(` cd ${rel}`)\n log.info(` ${packageManager} run dev`)\n\n outro(color.green('Done.'))\n})(process.argv.slice(2))\n","import path from 'node:path'\nimport process from 'node:process'\n\nimport { text, select, confirm, isCancel, cancel, type TextOptions, type ConfirmOptions } from '@clack/prompts'\n\n// --- our own select config ---------------------------------\n\ntype SelectOption<Value extends string> = {\n value: Value\n label?: string\n hint?: string\n}\n\ntype SelectConfig<Value extends string> = {\n message: string\n options: SelectOption<Value>[]\n initialValue?: Value\n}\n\n// -----------------------------------------------------------\n\nexport type PackageManager = 'pnpm' | 'yarn' | 'npm' | 'bun'\nexport type Language = 'typescript' | 'javascript'\nexport type FrameworkMode = 'file-router' | 'cms-driven'\n\nexport type Linting = 'biome' | 'eslint' | 'none'\nexport type Formatting = 'biome' | 'prettier' | 'none'\n\nexport type CssStrategy = 'tailwind' | 'plain-css' | 'css-modules' | 'sass'\n\nexport type CLIAnswers = {\n projectName: string\n projectDir: string\n packageManager: PackageManager\n language: Language\n frameworkMode: FrameworkMode\n linting: Linting\n formatting: Formatting\n cssStrategy: CssStrategy\n usePathAliases: boolean\n pathAliasPrefix?: string | undefined // e.g. \"@/\"\n}\n\nfunction ensureNotCancelled<T>(result: T | symbol): T {\n if (isCancel(result)) {\n cancel('Operation cancelled.')\n process.exit(0)\n }\n return result as T\n}\n\nasync function askText(options: TextOptions): Promise<string> {\n const result = await text(options)\n return ensureNotCancelled(result)\n}\n\nasync function askSelect<Value extends string>(options: SelectConfig<Value>): Promise<Value> {\n const result = await select(options as any)\n return ensureNotCancelled(result) as any\n}\n\nasync function askConfirm(options: ConfirmOptions): Promise<boolean> {\n const result = await confirm(options)\n return ensureNotCancelled(result)\n}\n\n// -----------------------------------------------------------\n\nfunction getDefaultProjectName(): string {\n const base = path.basename(process.cwd())\n return base && base !== path.parse(process.cwd()).root ? base : 'my-galdur-app'\n}\n\nfunction normalizeAliasPrefix(value: string): string {\n let v = value.trim()\n if (!v) {\n return '@/'\n }\n if (!v.startsWith('@')) {\n v = `@${v}`\n }\n if (!v.endsWith('/')) {\n v = `${v}/`\n }\n return v\n}\n\nexport async function askAllQuestions(): Promise<CLIAnswers> {\n const defaultProjectName = getDefaultProjectName()\n\n const rawProjectName = await askText({\n message: 'Project name',\n placeholder: defaultProjectName,\n initialValue: '',\n validate: (value) => (!value || value.trim().length === 0 ? 'Project name is required' : undefined),\n })\n const projectName = rawProjectName.trim() || defaultProjectName\n const projectDir = path.join(process.cwd(), projectName)\n\n const packageManager = await askSelect<PackageManager>({\n message: 'Package manager',\n options: [\n { value: 'pnpm', label: 'pnpm' },\n { value: 'npm', label: 'npm' },\n { value: 'yarn', label: 'yarn' },\n { value: 'bun', label: 'bun' },\n ],\n initialValue: 'pnpm',\n })\n\n const language = await askSelect<Language>({\n message: 'Language',\n options: [\n { value: 'typescript', label: 'TypeScript' },\n { value: 'javascript', label: 'JavaScript' },\n ],\n initialValue: 'typescript',\n })\n\n const frameworkMode = await askSelect<FrameworkMode>({\n message: 'Framework mode',\n options: [\n { value: 'file-router', label: 'File router', hint: 'routes resolved from the filesystem' },\n { value: 'cms-driven', label: 'CMS-driven', hint: 'routes resolved from a headless CMS' },\n ],\n initialValue: 'file-router',\n })\n\n const linting = await askSelect<Linting>({\n message: 'Linting',\n options: [\n { value: 'biome', label: 'Biome' },\n { value: 'eslint', label: 'ESLint' },\n { value: 'none', label: 'None' },\n ],\n initialValue: 'biome',\n })\n\n const formatting = await askSelect<Formatting>({\n message: 'Formatting',\n options: [\n { value: 'biome', label: 'Biome' },\n { value: 'prettier', label: 'Prettier' },\n { value: 'none', label: 'None' },\n ],\n initialValue: 'biome',\n })\n\n const cssStrategy = await askSelect<CssStrategy>({\n message: 'CSS strategy',\n options: [\n { value: 'tailwind', label: 'Tailwind CSS' },\n { value: 'plain-css', label: 'Plain CSS' },\n { value: 'css-modules', label: 'CSS Modules' },\n { value: 'sass', label: 'Sass' },\n ],\n initialValue: 'tailwind',\n })\n\n const usePathAliases = await askConfirm({\n message: 'Use path aliases?',\n initialValue: true,\n })\n\n let pathAliasPrefix: string | undefined = undefined\n if (usePathAliases) {\n const raw = await askText({\n message: 'Path alias prefix',\n placeholder: '@/',\n initialValue: '@/',\n validate: (value) => {\n const v = value.trim()\n if (!v) {\n return 'Prefix is required'\n }\n return undefined\n },\n })\n pathAliasPrefix = normalizeAliasPrefix(raw)\n }\n\n return {\n projectName,\n projectDir,\n packageManager,\n language,\n frameworkMode,\n linting,\n formatting,\n cssStrategy,\n usePathAliases,\n pathAliasPrefix,\n }\n}\n","import path from 'node:path'\nimport { promises as fs } from 'node:fs'\n\nconst folders = [\n 'public',\n 'src/app/api',\n 'src/views',\n 'src/features',\n 'src/shared/styles',\n]\n\nexport async function createFolders(projectDir: string) {\n for (const folder of folders) {\n const fullPath = path.join(projectDir, folder)\n await fs.mkdir(fullPath, { recursive: true })\n }\n}\n","import path from 'node:path'\nimport { promises as fs } from 'node:fs'\nimport type { CLIAnswers } from '../../questions.js'\n\nexport async function writeGaldurConfig(projectDir: string, answers: CLIAnswers) {\n const { cssStrategy } = answers\n\n const stylesValue = cssStrategy === 'tailwind' ? `'tailwind'` : `'css'`\n\n const config = `import type { Middleware } from '@bgunnarsson/galdur-middleware'\nimport type { RenderContext, RenderResult } from '@bgunnarsson/galdur-router'\n\nconst globalMiddlewares: Middleware<RenderContext, RenderResult>[] = []\n\nconst isProd = process.env.NODE_ENV === 'production'\n\nconst config = {\n styles: ${stylesValue},\n cache: {\n default: isProd ? 'public' : 'no-store',\n },\n server: {\n mode: 'ssr', // ssr, hybrid, static\n port: 3000,\n https: !isProd,\n },\n actions: {\n enable: true,\n },\n globalMiddlewares,\n banner: {\n title: 'Galdur',\n subtitle: 'Built with @bgunnarsson/galdur',\n },\n}\n\nexport default config\n`\n\n await fs.writeFile(path.join(projectDir, 'galdur.config.ts'), config, 'utf8')\n}\n","import path from 'node:path'\nimport { promises as fs } from 'node:fs'\nimport type { CLIAnswers } from '../../questions.js'\n\nconst GALDUR_VERSION = '0.0.18'\nconst REACT_VERSION = '19.2.0'\n\nexport async function writePackageJson(projectDir: string, answers: CLIAnswers) {\n const { projectName, cssStrategy } = answers\n\n const scripts: Record<string, string> = {\n dev: 'cross-env NODE_TLS_REJECT_UNAUTHORIZED=0 tsx ./src/app/server.ts',\n 'build:server': `vite build --ssr --config node_modules/@bgunnarsson/galdur-vite/vite.config.mjs`,\n 'build:client': `vite build --config node_modules/@bgunnarsson/galdur-vite/vite.config.mjs`,\n build: 'pnpm run build:server && pnpm run build:client',\n 'start:prod': `cross-env NODE_ENV=production node --env-file=.env ./dist/server/app/server.js`,\n }\n\n if (cssStrategy === 'tailwind') {\n scripts['tw:build'] = 'galdur-tailwind --app-root . -i ./src/shared/styles/main.css -o ./public/main.min.css --minify'\n scripts['tw:dev'] = 'galdur-tailwind --app-root . -i ./src/shared/styles/main.css -o ./public/main.min.css --watch'\n scripts['dev'] = `cross-env NODE_TLS_REJECT_UNAUTHORIZED=0 tsx ./src/app/server.ts`\n scripts['build'] = 'pnpm run tw:build && pnpm run build:server && pnpm run build:client'\n }\n\n const dependencies: Record<string, string> = {\n [`@bgunnarsson/galdur-actions`]: GALDUR_VERSION,\n [`@bgunnarsson/galdur-document`]: GALDUR_VERSION,\n [`@bgunnarsson/galdur-islands`]: GALDUR_VERSION,\n [`@bgunnarsson/galdur-middleware`]: GALDUR_VERSION,\n [`@bgunnarsson/galdur-router`]: GALDUR_VERSION,\n [`@bgunnarsson/galdur-server`]: GALDUR_VERSION,\n react: REACT_VERSION,\n 'react-dom': REACT_VERSION,\n }\n\n const devDependencies: Record<string, string> = {\n [`@bgunnarsson/galdur-vite`]: GALDUR_VERSION,\n '@types/node': '24.10.1',\n '@types/react': '19.2.7',\n '@types/react-dom': '19.2.3',\n 'cross-env': '10.1.0',\n hono: '4.12.8',\n tsx: '4.21.0',\n typescript: '5.9.3',\n vite: '7.2.4',\n }\n\n if (cssStrategy === 'tailwind') {\n devDependencies[`@bgunnarsson/galdur-plugin-tailwind`] = GALDUR_VERSION\n devDependencies['@tailwindcss/cli'] = '^4.1.18'\n devDependencies['tailwindcss'] = '4.1.18'\n }\n\n const pkgJson = {\n name: projectName,\n private: true,\n version: '0.0.0',\n type: 'module',\n scripts,\n dependencies,\n devDependencies,\n pnpm: {\n onlyBuiltDependencies: ['@swc/core', 'esbuild'],\n },\n }\n\n await fs.writeFile(path.join(projectDir, 'package.json'), JSON.stringify(pkgJson, null, 2), 'utf8')\n}\n","import path from 'node:path'\nimport { promises as fs } from 'node:fs'\n\nexport async function writeServer(projectDir: string) {\n const content = `import { startDevServer, startProdServer } from '@bgunnarsson/galdur-server'\nimport config from '../../galdur.config.js'\n\nconst isProduction = process.env.NODE_ENV === 'production'\n\nfunction resolvePort(port: unknown) {\n if (typeof port === 'number' && Number.isFinite(port)) {\n return port\n }\n const env = Number.parseInt(process.env.PORT ?? '', 10)\n return Number.isFinite(env) ? env : 3000\n}\n\nconst options = {\n port: resolvePort((config as any)?.server?.port),\n https: (config as any)?.server?.https,\n actions: config?.actions,\n globalMiddlewares: config?.globalMiddlewares,\n banner: config?.banner,\n}\n\nif (isProduction) {\n await startProdServer(options)\n} else {\n await startDevServer(options)\n}\n`\n\n await fs.writeFile(path.join(projectDir, 'src/app/server.ts'), content, 'utf8')\n}\n","import path from 'node:path'\nimport { promises as fs } from 'node:fs'\n\nexport async function writeEntryClient(projectDir: string) {\n const content = `import { installClientNavigation } from '@bgunnarsson/galdur-router/browser'\nimport { installRouteProgressBar } from '@bgunnarsson/galdur-router/progress'\nimport { createIslandsHydrator } from '@bgunnarsson/galdur-islands/client'\nimport { loadIsland } from '@bgunnarsson/galdur-islands/registry.client'\n\ninstallRouteProgressBar()\n\nconst hydrate = createIslandsHydrator(loadIsland)\n\ninstallClientNavigation({\n onAfterNavigate: () => void hydrate(document),\n})\n\nvoid hydrate(document)\n`\n\n await fs.writeFile(path.join(projectDir, 'src/app/entry.client.tsx'), content, 'utf8')\n}\n","import path from 'node:path'\nimport { promises as fs } from 'node:fs'\nimport type { CLIAnswers } from '../../questions.js'\n\nexport async function writePathPage(projectDir: string, answers: CLIAnswers) {\n const isCmsDriven = answers.frameworkMode === 'cms-driven'\n\n const content = isCmsDriven\n ? `import type { RenderContext } from '@bgunnarsson/galdur-router'\nimport { notFound, ok } from '@bgunnarsson/galdur-router'\nimport Home from '../views/Home.server.js'\n\n// TODO: Replace with your CMS fetch logic\nasync function fetchPageByPath(pathname: string) {\n // e.g. return await cms.getByPath(pathname)\n if (pathname === '/') return { contentType: 'home', name: 'Home' }\n return null\n}\n\nexport async function render(ctx: RenderContext) {\n const page = await fetchPageByPath(ctx.pathname)\n\n if (!page) {\n return notFound()\n }\n\n if (page.contentType === 'home') {\n return ok({\n element: <Home data={page} />,\n })\n }\n\n return notFound()\n}\n`\n : `import type { RenderContext } from '@bgunnarsson/galdur-router'\nimport { notFound, ok } from '@bgunnarsson/galdur-router'\nimport Home from '../views/Home.server.js'\n\nexport async function render(ctx: RenderContext) {\n if (ctx.pathname === '/') {\n return ok({\n element: <Home />,\n })\n }\n\n return notFound()\n}\n`\n\n await fs.writeFile(path.join(projectDir, 'src/app/+path.server.tsx'), content, 'utf8')\n}\n","import path from 'node:path'\nimport { promises as fs } from 'node:fs'\nimport type { CLIAnswers } from '../../questions.js'\n\nexport async function writeHomeView(projectDir: string, answers: CLIAnswers) {\n const isCmsDriven = answers.frameworkMode === 'cms-driven'\n\n const content = isCmsDriven\n ? `import type { FC } from 'react'\n\ntype Props = {\n data: { name: string }\n}\n\nconst Home: FC<Props> = ({ data }) => {\n return (\n <main>\n <h1>{data.name}</h1>\n </main>\n )\n}\n\nexport default Home\n`\n : `const Home = () => {\n return (\n <main>\n <h1>Welcome to Galdur</h1>\n </main>\n )\n}\n\nexport default Home\n`\n\n await fs.writeFile(path.join(projectDir, 'src/views/Home.server.tsx'), content, 'utf8')\n}\n","import path from 'node:path'\nimport { promises as fs } from 'node:fs'\nimport type { CLIAnswers } from '../../questions.js'\n\nexport async function writeTsconfig(projectDir: string, answers: CLIAnswers) {\n const { usePathAliases, pathAliasPrefix, projectName } = answers\n\n const paths: Record<string, string[]> = {}\n if (usePathAliases && pathAliasPrefix) {\n paths[`${pathAliasPrefix}*`] = ['./src/*']\n }\n\n const compilerOptions: Record<string, unknown> = {\n $schema: 'https://json.schemastore.org/tsconfig',\n target: 'ES2022',\n lib: ['ES2022', 'DOM', 'DOM.Iterable'],\n module: 'ESNext',\n moduleResolution: 'Bundler',\n verbatimModuleSyntax: true,\n resolveJsonModule: true,\n jsx: 'react-jsx',\n strict: true,\n noUncheckedIndexedAccess: true,\n exactOptionalPropertyTypes: true,\n isolatedModules: true,\n useDefineForClassFields: true,\n skipLibCheck: true,\n forceConsistentCasingInFileNames: true,\n noEmit: true,\n types: ['node', 'vite/client'],\n allowImportingTsExtensions: true,\n moduleDetection: 'force',\n incremental: true,\n tsBuildInfoFile: `./node_modules/.cache/tsbuildinfo/${projectName}.tsbuildinfo`,\n }\n\n if (Object.keys(paths).length > 0) {\n compilerOptions['paths'] = paths\n }\n\n const tsconfig = {\n compilerOptions,\n include: ['src', 'galdur.config.ts'],\n }\n\n await fs.writeFile(path.join(projectDir, 'tsconfig.json'), JSON.stringify(tsconfig, null, 2), 'utf8')\n}\n","import path from 'node:path'\nimport { promises as fs } from 'node:fs'\nimport type { CLIAnswers } from '../../questions.js'\n\nexport async function writeIndexHtml(projectDir: string, answers: CLIAnswers) {\n const hasCss = answers.cssStrategy === 'tailwind'\n\n const cssLink = hasCss\n ? `\n <link rel=\"preload\" href=\"/main.min.css\" as=\"style\" />\n <link rel=\"stylesheet\" href=\"/main.min.css\" />`\n : ''\n\n const content = `<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">${cssLink}\n <!--app-head-->\n </head>\n <body>\n <div id=\"__galdur\"><!--ssr-outlet--></div>\n <!--app-scripts-->\n </body>\n</html>\n`\n\n await fs.writeFile(path.join(projectDir, 'index.html'), content, 'utf8')\n}\n","import path from 'node:path'\nimport { promises as fs } from 'node:fs'\nimport type { CLIAnswers } from '../../questions.js'\n\nexport async function writeStyles(projectDir: string, answers: CLIAnswers) {\n if (answers.cssStrategy === 'tailwind') {\n const main = `@import \"tailwindcss\";\n`\n await fs.writeFile(path.join(projectDir, 'src/shared/styles/main.css'), main, 'utf8')\n } else {\n const main = `/* Global styles */\n`\n await fs.writeFile(path.join(projectDir, 'src/shared/styles/main.css'), main, 'utf8')\n }\n}\n"],"mappings":"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","names":["process","path","path","path","fs","path","fs","path","fs","path","fs","path","fs","path","fs","path","fs","path","fs","path","fs","process","path"]}
package/package.json ADDED
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "create-galdur",
3
+ "version": "0.0.19",
4
+ "description": "Scaffold a Galdur framework project.",
5
+ "type": "module",
6
+ "publishConfig": {
7
+ "access": "public"
8
+ },
9
+ "sideEffects": false,
10
+ "files": [
11
+ "dist"
12
+ ],
13
+ "bin": {
14
+ "create-galdur": "./dist/index.js"
15
+ },
16
+ "main": "./dist/index.js",
17
+ "module": "./dist/index.js",
18
+ "types": "./dist/index.d.ts",
19
+ "exports": {
20
+ ".": {
21
+ "types": "./dist/index.d.ts",
22
+ "import": "./dist/index.js"
23
+ }
24
+ },
25
+ "dependencies": {
26
+ "@clack/prompts": "0.7.0",
27
+ "execa": "8.0.1",
28
+ "picocolors": "1.1.1"
29
+ },
30
+ "devDependencies": {
31
+ "@types/node": "24.10.1",
32
+ "tsup": "8",
33
+ "typescript": "5",
34
+ "cross-env": "7.0.3"
35
+ },
36
+ "scripts": {
37
+ "build": "tsup",
38
+ "dev": "tsup --watch",
39
+ "clean": "rimraf dist",
40
+ "start": "node ./dist/index.js"
41
+ }
42
+ }