@catmint/cli 0.0.0-prealpha.1
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/LICENSE +339 -0
- package/bin/catmint.js +2 -0
- package/dist/commands/build.d.ts +11 -0
- package/dist/commands/build.d.ts.map +1 -0
- package/dist/commands/build.js +529 -0
- package/dist/commands/build.js.map +1 -0
- package/dist/commands/dev.d.ts +11 -0
- package/dist/commands/dev.d.ts.map +1 -0
- package/dist/commands/dev.js +173 -0
- package/dist/commands/dev.js.map +1 -0
- package/dist/commands/generate.d.ts +9 -0
- package/dist/commands/generate.d.ts.map +1 -0
- package/dist/commands/generate.js +160 -0
- package/dist/commands/generate.js.map +1 -0
- package/dist/commands/start.d.ts +8 -0
- package/dist/commands/start.d.ts.map +1 -0
- package/dist/commands/start.js +443 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/cors-utils.d.ts +22 -0
- package/dist/cors-utils.d.ts.map +1 -0
- package/dist/cors-utils.js +32 -0
- package/dist/cors-utils.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +47 -0
- package/dist/index.js.map +1 -0
- package/dist/scan-utils.d.ts +20 -0
- package/dist/scan-utils.d.ts.map +1 -0
- package/dist/scan-utils.js +64 -0
- package/dist/scan-utils.js.map +1 -0
- package/package.json +33 -0
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
// catmint dev — Start development server with HMR
|
|
2
|
+
import { resolve, basename } from "node:path";
|
|
3
|
+
import { networkInterfaces } from "node:os";
|
|
4
|
+
import { watch } from "node:fs";
|
|
5
|
+
import { createServer } from "vite";
|
|
6
|
+
import { loadConfig } from "catmint/config";
|
|
7
|
+
import { scanRoutes } from "catmint/routing";
|
|
8
|
+
import { loadEnv } from "catmint/env";
|
|
9
|
+
import catmintVite from "@catmint/vite";
|
|
10
|
+
const VERSION = "0.1.0";
|
|
11
|
+
function parseFlags(args) {
|
|
12
|
+
const flags = {};
|
|
13
|
+
for (let i = 0; i < args.length; i++) {
|
|
14
|
+
const arg = args[i];
|
|
15
|
+
if (arg.startsWith("--")) {
|
|
16
|
+
const [key, val] = arg.slice(2).split("=");
|
|
17
|
+
flags[key] = val ?? args[++i] ?? true;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return flags;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Get the local network address for display.
|
|
24
|
+
*/
|
|
25
|
+
function getNetworkAddress() {
|
|
26
|
+
const interfaces = networkInterfaces();
|
|
27
|
+
for (const name of Object.keys(interfaces)) {
|
|
28
|
+
const addrs = interfaces[name];
|
|
29
|
+
if (!addrs)
|
|
30
|
+
continue;
|
|
31
|
+
for (const addr of addrs) {
|
|
32
|
+
if (addr.family === "IPv4" && !addr.internal) {
|
|
33
|
+
return addr.address;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return undefined;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Build a formatted route table for display.
|
|
41
|
+
*/
|
|
42
|
+
function formatRouteTable(routes) {
|
|
43
|
+
const lines = [];
|
|
44
|
+
for (const route of routes) {
|
|
45
|
+
const file = basename(route.filePath);
|
|
46
|
+
if (route.type === "page") {
|
|
47
|
+
lines.push(` GET ${padEnd(route.pattern, 20)} → ${file}`);
|
|
48
|
+
}
|
|
49
|
+
else if (route.methods && route.methods.length > 0) {
|
|
50
|
+
for (const method of route.methods) {
|
|
51
|
+
const m = method === "default" ? "ALL" : method;
|
|
52
|
+
lines.push(` ${padEnd(m, 6)}${padEnd(route.pattern, 20)} → ${file}`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
lines.push(` ALL ${padEnd(route.pattern, 20)} → ${file}`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
if (lines.length === 0) {
|
|
60
|
+
lines.push(" (no routes found)");
|
|
61
|
+
}
|
|
62
|
+
// Calculate box width
|
|
63
|
+
const maxLen = Math.max(...lines.map((l) => l.length), 20);
|
|
64
|
+
const boxWidth = maxLen + 4;
|
|
65
|
+
const top = ` ┌${"─".repeat(boxWidth)}┐`;
|
|
66
|
+
const bottom = ` └${"─".repeat(boxWidth)}┘`;
|
|
67
|
+
const header = ` │ Routes:${" ".repeat(boxWidth - 10)}│`;
|
|
68
|
+
const boxedLines = lines.map((l) => ` │${l}${" ".repeat(boxWidth - l.length)}│`);
|
|
69
|
+
return [top, header, ...boxedLines, bottom].join("\n");
|
|
70
|
+
}
|
|
71
|
+
function padEnd(str, len) {
|
|
72
|
+
return str.length >= len ? str + " " : str + " ".repeat(len - str.length + 1);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Start the Catmint development server.
|
|
76
|
+
*
|
|
77
|
+
* Features:
|
|
78
|
+
* - Built on Vite for fast HMR
|
|
79
|
+
* - Watches `app/` directory for route changes
|
|
80
|
+
* - Regenerates route types automatically
|
|
81
|
+
* - Proxies server function calls to the dev server
|
|
82
|
+
*/
|
|
83
|
+
export async function dev(args) {
|
|
84
|
+
const flags = parseFlags(args);
|
|
85
|
+
const rootDir = process.cwd();
|
|
86
|
+
// Load config
|
|
87
|
+
const config = await loadConfig(rootDir);
|
|
88
|
+
// Load env files (dev mode: .env and .env.local, NOT .env.production*)
|
|
89
|
+
loadEnv(rootDir, "development");
|
|
90
|
+
// Determine port and host from flags or config
|
|
91
|
+
const port = typeof flags.port === "string"
|
|
92
|
+
? parseInt(flags.port, 10)
|
|
93
|
+
: config.server.port;
|
|
94
|
+
const host = typeof flags.host === "string" ? flags.host : "localhost";
|
|
95
|
+
const open = flags.open === true;
|
|
96
|
+
// Scan routes for initial display
|
|
97
|
+
const appDir = resolve(rootDir, "app");
|
|
98
|
+
let routes;
|
|
99
|
+
try {
|
|
100
|
+
routes = await scanRoutes(appDir);
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
routes = [];
|
|
104
|
+
}
|
|
105
|
+
// Display startup info
|
|
106
|
+
console.log();
|
|
107
|
+
console.log(` catmint v${VERSION} dev server`);
|
|
108
|
+
console.log();
|
|
109
|
+
console.log(formatRouteTable(routes));
|
|
110
|
+
console.log();
|
|
111
|
+
console.log(` Local: http://${host}:${port}`);
|
|
112
|
+
const networkAddr = getNetworkAddress();
|
|
113
|
+
if (networkAddr) {
|
|
114
|
+
console.log(` Network: http://${networkAddr}:${port}`);
|
|
115
|
+
}
|
|
116
|
+
console.log();
|
|
117
|
+
// Create Vite dev server with Catmint plugin
|
|
118
|
+
// Merge user's vite.plugins with catmintVite() instead of overwriting
|
|
119
|
+
const { plugins: userPlugins, ...viteRest } = config.vite;
|
|
120
|
+
const server = await createServer({
|
|
121
|
+
root: rootDir,
|
|
122
|
+
server: {
|
|
123
|
+
port,
|
|
124
|
+
host,
|
|
125
|
+
open,
|
|
126
|
+
},
|
|
127
|
+
plugins: [
|
|
128
|
+
...(Array.isArray(userPlugins) ? userPlugins : []),
|
|
129
|
+
catmintVite({
|
|
130
|
+
mdx: {
|
|
131
|
+
remarkPlugins: config.mdx.remarkPlugins,
|
|
132
|
+
rehypePlugins: config.mdx.rehypePlugins,
|
|
133
|
+
},
|
|
134
|
+
softNavigation: config.navigation.soft,
|
|
135
|
+
i18n: config.i18n,
|
|
136
|
+
}),
|
|
137
|
+
],
|
|
138
|
+
...viteRest,
|
|
139
|
+
});
|
|
140
|
+
await server.listen();
|
|
141
|
+
// Watch app/ directory for route changes
|
|
142
|
+
try {
|
|
143
|
+
const watcher = watch(appDir, { recursive: true }, async (eventType, filename) => {
|
|
144
|
+
if (!filename)
|
|
145
|
+
return;
|
|
146
|
+
const base = basename(filename);
|
|
147
|
+
if (base === "page.tsx" ||
|
|
148
|
+
base === "page.jsx" ||
|
|
149
|
+
base === "page.mdx" ||
|
|
150
|
+
base === "endpoint.ts" ||
|
|
151
|
+
base === "endpoint.js") {
|
|
152
|
+
try {
|
|
153
|
+
const updatedRoutes = await scanRoutes(appDir);
|
|
154
|
+
console.log();
|
|
155
|
+
console.log(" Routes updated:");
|
|
156
|
+
console.log(formatRouteTable(updatedRoutes));
|
|
157
|
+
console.log();
|
|
158
|
+
}
|
|
159
|
+
catch (err) {
|
|
160
|
+
console.error(" Failed to rescan routes:", err);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
// Cleanup on server close
|
|
165
|
+
server.httpServer?.on("close", () => {
|
|
166
|
+
watcher.close();
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
// app/ directory may not exist yet — that's ok
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=dev.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Regenerate route types and manifests.
|
|
3
|
+
*
|
|
4
|
+
* Scans the `app/` directory and generates:
|
|
5
|
+
* - `.catmint/routes.d.ts` — Type-safe route manifest
|
|
6
|
+
* - `env.d.ts` — Environment variable type declarations
|
|
7
|
+
*/
|
|
8
|
+
export declare function generate(_args: string[]): Promise<void>;
|
|
9
|
+
//# sourceMappingURL=generate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"AAsIA;;;;;;GAMG;AACH,wBAAsB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA4C7D"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
// catmint generate — Regenerate route types and manifests
|
|
2
|
+
import { resolve, join, relative } from "node:path";
|
|
3
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
4
|
+
import { mkdir, writeFile } from "node:fs/promises";
|
|
5
|
+
import { loadConfig } from "catmint/config";
|
|
6
|
+
import { scanRoutes } from "catmint/routing";
|
|
7
|
+
import { parseEnvFile } from "catmint/env";
|
|
8
|
+
/**
|
|
9
|
+
* Build a TypeScript type string for a route's params.
|
|
10
|
+
*/
|
|
11
|
+
function buildParamsType(route) {
|
|
12
|
+
const params = [];
|
|
13
|
+
for (const seg of route.segments) {
|
|
14
|
+
if (seg.paramName) {
|
|
15
|
+
switch (seg.type) {
|
|
16
|
+
case "dynamic":
|
|
17
|
+
params.push(`${seg.paramName}: string`);
|
|
18
|
+
break;
|
|
19
|
+
case "catch-all":
|
|
20
|
+
params.push(`${seg.paramName}: string[]`);
|
|
21
|
+
break;
|
|
22
|
+
case "optional-catch-all":
|
|
23
|
+
params.push(`${seg.paramName}?: string[]`);
|
|
24
|
+
break;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
if (params.length === 0) {
|
|
29
|
+
return "Record<string, never>";
|
|
30
|
+
}
|
|
31
|
+
return `{ ${params.join("; ")} }`;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Generate the .catmint/routes.d.ts content.
|
|
35
|
+
*/
|
|
36
|
+
function generateRouteTypes(routes) {
|
|
37
|
+
const lines = [];
|
|
38
|
+
lines.push("// Auto-generated by catmint generate — do not edit manually");
|
|
39
|
+
lines.push("// This file provides type-safe route definitions");
|
|
40
|
+
lines.push("");
|
|
41
|
+
lines.push("declare module 'catmint/routing' {");
|
|
42
|
+
lines.push(" interface RouteMap {");
|
|
43
|
+
for (const route of routes) {
|
|
44
|
+
const paramsType = buildParamsType(route);
|
|
45
|
+
lines.push(` "${route.pattern}": ${paramsType};`);
|
|
46
|
+
}
|
|
47
|
+
lines.push(" }");
|
|
48
|
+
lines.push("}");
|
|
49
|
+
lines.push("");
|
|
50
|
+
return lines.join("\n");
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Collect all env variable keys from .env files in the project root.
|
|
54
|
+
*/
|
|
55
|
+
function collectEnvKeys(rootDir) {
|
|
56
|
+
const envFiles = [
|
|
57
|
+
".env",
|
|
58
|
+
".env.local",
|
|
59
|
+
".env.production",
|
|
60
|
+
".env.production.local",
|
|
61
|
+
];
|
|
62
|
+
const allKeys = new Set();
|
|
63
|
+
for (const fileName of envFiles) {
|
|
64
|
+
const filePath = resolve(rootDir, fileName);
|
|
65
|
+
if (!existsSync(filePath))
|
|
66
|
+
continue;
|
|
67
|
+
try {
|
|
68
|
+
const content = readFileSync(filePath, "utf-8");
|
|
69
|
+
const parsed = parseEnvFile(content);
|
|
70
|
+
for (const key of Object.keys(parsed)) {
|
|
71
|
+
allKeys.add(key);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
// Skip unreadable files
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
const publicKeys = [];
|
|
79
|
+
const privateKeys = [];
|
|
80
|
+
for (const key of Array.from(allKeys).sort()) {
|
|
81
|
+
if (key.startsWith("CATMINT_PUBLIC_")) {
|
|
82
|
+
// Strip the prefix for the PublicEnv interface
|
|
83
|
+
publicKeys.push(key.slice("CATMINT_PUBLIC_".length));
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
privateKeys.push(key);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return { publicKeys, privateKeys };
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Generate the env.d.ts content.
|
|
93
|
+
*/
|
|
94
|
+
function generateEnvTypes(publicKeys, privateKeys) {
|
|
95
|
+
const lines = [];
|
|
96
|
+
lines.push("// Auto-generated by catmint generate — do not edit manually");
|
|
97
|
+
lines.push("// This file provides type-safe environment variable access");
|
|
98
|
+
lines.push("// and ambient type declarations for asset imports (CSS, images, etc.)");
|
|
99
|
+
lines.push("");
|
|
100
|
+
lines.push('/// <reference types="catmint/client" />');
|
|
101
|
+
lines.push("");
|
|
102
|
+
lines.push("declare module 'catmint/env' {");
|
|
103
|
+
lines.push(" interface PublicEnv {");
|
|
104
|
+
for (const key of publicKeys) {
|
|
105
|
+
lines.push(` ${key}: string;`);
|
|
106
|
+
}
|
|
107
|
+
lines.push(" }");
|
|
108
|
+
lines.push("");
|
|
109
|
+
lines.push(" interface PrivateEnv {");
|
|
110
|
+
for (const key of privateKeys) {
|
|
111
|
+
lines.push(` ${key}: string;`);
|
|
112
|
+
}
|
|
113
|
+
lines.push(" }");
|
|
114
|
+
lines.push("}");
|
|
115
|
+
lines.push("");
|
|
116
|
+
return lines.join("\n");
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Regenerate route types and manifests.
|
|
120
|
+
*
|
|
121
|
+
* Scans the `app/` directory and generates:
|
|
122
|
+
* - `.catmint/routes.d.ts` — Type-safe route manifest
|
|
123
|
+
* - `env.d.ts` — Environment variable type declarations
|
|
124
|
+
*/
|
|
125
|
+
export async function generate(_args) {
|
|
126
|
+
const rootDir = process.cwd();
|
|
127
|
+
// Load config
|
|
128
|
+
const config = await loadConfig(rootDir);
|
|
129
|
+
console.log();
|
|
130
|
+
console.log(" catmint generate");
|
|
131
|
+
console.log();
|
|
132
|
+
// 1. Scan routes
|
|
133
|
+
const appDir = resolve(rootDir, "app");
|
|
134
|
+
let routes = [];
|
|
135
|
+
try {
|
|
136
|
+
routes = await scanRoutes(appDir);
|
|
137
|
+
}
|
|
138
|
+
catch (err) {
|
|
139
|
+
console.warn(" Warning: Failed to scan routes:", err);
|
|
140
|
+
}
|
|
141
|
+
// 2. Generate .catmint/routes.d.ts
|
|
142
|
+
const catmintDir = resolve(rootDir, ".catmint");
|
|
143
|
+
await mkdir(catmintDir, { recursive: true });
|
|
144
|
+
const routeTypesContent = generateRouteTypes(routes);
|
|
145
|
+
const routeTypesPath = join(catmintDir, "routes.d.ts");
|
|
146
|
+
await writeFile(routeTypesPath, routeTypesContent, "utf-8");
|
|
147
|
+
console.log(` Generated ${relative(rootDir, routeTypesPath)}`);
|
|
148
|
+
console.log(` ${routes.length} route(s) discovered`);
|
|
149
|
+
// 3. Generate env.d.ts from .env files
|
|
150
|
+
const { publicKeys, privateKeys } = collectEnvKeys(rootDir);
|
|
151
|
+
const envTypesContent = generateEnvTypes(publicKeys, privateKeys);
|
|
152
|
+
const envTypesPath = join(rootDir, "env.d.ts");
|
|
153
|
+
await writeFile(envTypesPath, envTypesContent, "utf-8");
|
|
154
|
+
console.log(` Generated ${relative(rootDir, envTypesPath)}`);
|
|
155
|
+
console.log(` ${publicKeys.length} public var(s), ${privateKeys.length} private var(s)`);
|
|
156
|
+
console.log();
|
|
157
|
+
console.log(" Done!");
|
|
158
|
+
console.log();
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=generate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Start the Catmint production server.
|
|
3
|
+
*
|
|
4
|
+
* Loads the RSC and SSR build entries and serves pages using the
|
|
5
|
+
* RSC flight protocol → SSR HTML rendering pipeline.
|
|
6
|
+
*/
|
|
7
|
+
export declare function start(args: string[]): Promise<void>;
|
|
8
|
+
//# sourceMappingURL=start.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"AAoJA;;;;;GAKG;AACH,wBAAsB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA4azD"}
|