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.
- package/README.md +2 -1
- package/package.json +1 -1
- 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,
|
|
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
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
|
-
|
|
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) =>
|
|
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({
|
|
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
|
|
691
|
-
lines.push("- `pracht generate shell
|
|
692
|
-
lines.push("- `pracht generate middleware
|
|
693
|
-
lines.push("- `pracht generate api
|
|
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("");
|