create-pracht 0.2.1 → 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/README.md +2 -1
  2. package/package.json +1 -1
  3. package/src/index.js +54 -11
package/README.md CHANGED
@@ -16,7 +16,8 @@ npm run dev
16
16
  - Prompts for the target folder.
17
17
  - Detects the active package manager from the current environment.
18
18
  - Lets the user choose between the Node.js, Cloudflare, and Vercel adapters.
19
- - Scaffolds a minimal app with a route manifest, shell, home route, sample API route, and runnable project README.
19
+ - Scaffolds a minimal app with a route manifest or pages router, shell, home route, sample API route, runnable project README, and agent instructions.
20
+ - `--dry-run` uses pinned fallback versions and does not require npm registry access.
20
21
 
21
22
  ## Usage
22
23
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-pracht",
3
- "version": "0.2.1",
3
+ "version": "0.2.3",
4
4
  "license": "MIT",
5
5
  "homepage": "https://github.com/JoviDeCroock/pracht/tree/main/packages/start",
6
6
  "bugs": {
package/src/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { spawn } from "node:child_process";
2
2
  import { existsSync } from "node:fs";
3
- import { mkdir, readdir, stat, symlink, writeFile } from "node:fs/promises";
3
+ import { copyFile, mkdir, readdir, stat, symlink, writeFile } from "node:fs/promises";
4
4
  import { basename, dirname, resolve } from "node:path";
5
5
  import { createInterface } from "node:readline/promises";
6
6
 
@@ -11,6 +11,16 @@ export class ValidationError extends Error {
11
11
  }
12
12
  }
13
13
 
14
+ const FALLBACK_VERSION_RANGES = {
15
+ "@pracht/adapter-cloudflare": "^0.2.1",
16
+ "@pracht/adapter-node": "^0.1.10",
17
+ "@pracht/adapter-vercel": "^0.0.12",
18
+ "@pracht/cli": "^1.3.0",
19
+ "@pracht/core": "^0.4.0",
20
+ "@pracht/vite-plugin": "^0.3.1",
21
+ vercel: "latest",
22
+ };
23
+
14
24
  async function fetchLatestVersion(packageName) {
15
25
  const res = await fetch(`https://registry.npmjs.org/${packageName}/latest`);
16
26
  if (!res.ok) {
@@ -87,6 +97,7 @@ export async function run(argv = process.argv.slice(2)) {
87
97
  adapter: ADAPTERS[resolvedAdapter],
88
98
  packageManager,
89
99
  projectName: toPackageName(basename(targetDir)),
100
+ resolveRemoteVersions: false,
90
101
  router: resolvedRouter,
91
102
  });
92
103
 
@@ -132,6 +143,7 @@ export async function run(argv = process.argv.slice(2)) {
132
143
  adapter: ADAPTERS[resolvedAdapter],
133
144
  packageManager,
134
145
  projectName: toPackageName(basename(targetDir)),
146
+ resolveRemoteVersions: false,
135
147
  router: resolvedRouter,
136
148
  });
137
149
 
@@ -172,7 +184,15 @@ export async function scaffoldProject({ adapter, packageManager, router = "manif
172
184
  await writeFile(filePath, content, "utf-8");
173
185
  }
174
186
 
175
- await symlink("AGENTS.md", resolve(targetDir, "CLAUDE.md"));
187
+ try {
188
+ await symlink("AGENTS.md", resolve(targetDir, "CLAUDE.md"));
189
+ } catch (error) {
190
+ if (error && typeof error === "object" && ["EPERM", "EINVAL"].includes(error.code)) {
191
+ await copyFile(resolve(targetDir, "AGENTS.md"), resolve(targetDir, "CLAUDE.md"));
192
+ } else {
193
+ throw error;
194
+ }
195
+ }
176
196
  }
177
197
 
178
198
  export function getPackageManager(userAgent = process.env.npm_config_user_agent ?? "") {
@@ -365,14 +385,28 @@ function normalizeAdapter(value) {
365
385
  return null;
366
386
  }
367
387
 
368
- async function resolveVersions(packageNames) {
388
+ async function resolveVersions(packageNames, { remote = true } = {}) {
369
389
  const entries = await Promise.all(
370
- packageNames.map(async (name) => [name, `^${await fetchLatestVersion(name)}`]),
390
+ packageNames.map(async (name) => {
391
+ const fallback = FALLBACK_VERSION_RANGES[name] ?? "latest";
392
+ if (!remote) return [name, fallback];
393
+ try {
394
+ return [name, `^${await fetchLatestVersion(name)}`];
395
+ } catch {
396
+ return [name, fallback];
397
+ }
398
+ }),
371
399
  );
372
400
  return Object.fromEntries(entries);
373
401
  }
374
402
 
375
- async function buildProjectFiles({ adapter, packageManager, projectName, router }) {
403
+ async function buildProjectFiles({
404
+ adapter,
405
+ packageManager,
406
+ projectName,
407
+ resolveRemoteVersions = true,
408
+ router,
409
+ }) {
376
410
  const packagesToResolve = [
377
411
  "@pracht/cli",
378
412
  "@pracht/vite-plugin",
@@ -383,7 +417,7 @@ async function buildProjectFiles({ adapter, packageManager, projectName, router
383
417
  packagesToResolve.push("vercel");
384
418
  }
385
419
 
386
- const versions = await resolveVersions(packagesToResolve);
420
+ const versions = await resolveVersions(packagesToResolve, { remote: resolveRemoteVersions });
387
421
 
388
422
  const files = {
389
423
  ".gitignore": "dist\nnode_modules\n.wrangler\n.vercel\n",
@@ -607,9 +641,18 @@ function createPagesHomeRoute(adapter) {
607
641
  function createBaseTSConfig(_adapter) {
608
642
  const config = {
609
643
  compilerOptions: {
644
+ allowImportingTsExtensions: true,
610
645
  jsx: "react-jsx",
611
646
  jsxImportSource: "preact",
612
- lib: ["ES2022"],
647
+ lib: ["ES2022", "DOM", "DOM.Iterable"],
648
+ module: "ESNext",
649
+ moduleResolution: "Bundler",
650
+ noEmit: true,
651
+ skipLibCheck: true,
652
+ strict: true,
653
+ target: "ES2022",
654
+ types: ["vite/client"],
655
+ verbatimModuleSyntax: true,
613
656
  },
614
657
  };
615
658
  return JSON.stringify(config, null, 4);
@@ -687,10 +730,10 @@ function createAgentInstructions({ adapter, packageManager, router }) {
687
730
  lines.push("");
688
731
  lines.push("Use the CLI to generate new files:");
689
732
  lines.push("");
690
- lines.push("- `pracht generate route <name>` — add a route");
691
- lines.push("- `pracht generate shell <name>` — add a shell");
692
- lines.push("- `pracht generate middleware <name>` — add middleware");
693
- lines.push("- `pracht generate api <name>` — add an API route");
733
+ lines.push("- `pracht generate route --path /about` — add a route");
734
+ lines.push("- `pracht generate shell --name app` — add a shell");
735
+ lines.push("- `pracht generate middleware --name auth` — add middleware");
736
+ lines.push("- `pracht generate api --path /health --methods GET` — add an API route");
694
737
  lines.push("- `pracht doctor` — check project health");
695
738
 
696
739
  lines.push("");