@hypen-space/cli 0.3.8
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 +157 -0
- package/dist/bin/hypen.js +826 -0
- package/dist/bin/hypen.js.map +13 -0
- package/dist/src/dev-bun.js +266 -0
- package/dist/src/dev-bun.js.map +10 -0
- package/dist/src/dev-node.js +313 -0
- package/dist/src/dev-node.js.map +10 -0
- package/dist/src/dev.js +576 -0
- package/dist/src/dev.js.map +12 -0
- package/dist/src/index.js +580 -0
- package/dist/src/index.js.map +13 -0
- package/package.json +58 -0
- package/templates/counter/hypen.json +15 -0
- package/templates/counter/package.json +18 -0
- package/templates/counter/src/app.ts +16 -0
- package/templates/counter/src/components/App/component.hypen +55 -0
- package/templates/counter/src/components/App/component.ts +21 -0
- package/templates/counter/tsconfig.json +26 -0
|
@@ -0,0 +1,580 @@
|
|
|
1
|
+
import { createRequire } from "node:module";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
4
|
+
var __defProp = Object.defineProperty;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __toESM = (mod, isNodeMode, target) => {
|
|
8
|
+
target = mod != null ? __create(__getProtoOf(mod)) : {};
|
|
9
|
+
const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
|
|
10
|
+
for (let key of __getOwnPropNames(mod))
|
|
11
|
+
if (!__hasOwnProp.call(to, key))
|
|
12
|
+
__defProp(to, key, {
|
|
13
|
+
get: () => mod[key],
|
|
14
|
+
enumerable: true
|
|
15
|
+
});
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __export = (target, all) => {
|
|
19
|
+
for (var name in all)
|
|
20
|
+
__defProp(target, name, {
|
|
21
|
+
get: all[name],
|
|
22
|
+
enumerable: true,
|
|
23
|
+
configurable: true,
|
|
24
|
+
set: (newValue) => all[name] = () => newValue
|
|
25
|
+
});
|
|
26
|
+
};
|
|
27
|
+
var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
|
|
28
|
+
var __require = /* @__PURE__ */ createRequire(import.meta.url);
|
|
29
|
+
|
|
30
|
+
// src/dev-bun.ts
|
|
31
|
+
var exports_dev_bun = {};
|
|
32
|
+
__export(exports_dev_bun, {
|
|
33
|
+
hypen: () => hypen,
|
|
34
|
+
dev: () => dev,
|
|
35
|
+
default: () => dev_bun_default,
|
|
36
|
+
build: () => build
|
|
37
|
+
});
|
|
38
|
+
import { join, resolve } from "path";
|
|
39
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from "fs";
|
|
40
|
+
import {
|
|
41
|
+
watchComponents,
|
|
42
|
+
generateComponentsCode
|
|
43
|
+
} from "@hypen-space/core/discovery";
|
|
44
|
+
function getDefaultHtmlTemplate(entry) {
|
|
45
|
+
return `<!DOCTYPE html>
|
|
46
|
+
<html lang="en">
|
|
47
|
+
<head>
|
|
48
|
+
<meta charset="UTF-8">
|
|
49
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
50
|
+
<title>Hypen App</title>
|
|
51
|
+
<style>
|
|
52
|
+
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
53
|
+
body { font-family: system-ui, -apple-system, sans-serif; }
|
|
54
|
+
</style>
|
|
55
|
+
</head>
|
|
56
|
+
<body>
|
|
57
|
+
<div id="app"></div>
|
|
58
|
+
<script type="module" src="/__hypen__/main.js"></script>
|
|
59
|
+
</body>
|
|
60
|
+
</html>
|
|
61
|
+
`;
|
|
62
|
+
}
|
|
63
|
+
function generateMainEntry(entry, componentsPath, debug) {
|
|
64
|
+
return `/**
|
|
65
|
+
* Auto-generated Hypen entry point
|
|
66
|
+
*/
|
|
67
|
+
import { renderWithComponents } from "@hypen-space/core";
|
|
68
|
+
import * as components from "${componentsPath}";
|
|
69
|
+
|
|
70
|
+
const app = await renderWithComponents(
|
|
71
|
+
components,
|
|
72
|
+
"${entry}",
|
|
73
|
+
"#app",
|
|
74
|
+
{ debug: ${debug} }
|
|
75
|
+
);
|
|
76
|
+
|
|
77
|
+
// Hot reload support
|
|
78
|
+
if (import.meta.hot) {
|
|
79
|
+
import.meta.hot.accept();
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export default app;
|
|
83
|
+
`;
|
|
84
|
+
}
|
|
85
|
+
async function dev(options) {
|
|
86
|
+
const {
|
|
87
|
+
components: componentsDir,
|
|
88
|
+
entry,
|
|
89
|
+
port = 3000,
|
|
90
|
+
hot = true,
|
|
91
|
+
debug = false,
|
|
92
|
+
htmlTemplate,
|
|
93
|
+
outDir = ".hypen",
|
|
94
|
+
onStart,
|
|
95
|
+
onComponentsChange
|
|
96
|
+
} = options;
|
|
97
|
+
const log = debug ? (...args) => console.log("[hypen:dev]", ...args) : () => {};
|
|
98
|
+
const resolvedComponentsDir = resolve(componentsDir);
|
|
99
|
+
const resolvedOutDir = resolve(outDir);
|
|
100
|
+
if (!existsSync(resolvedOutDir)) {
|
|
101
|
+
mkdirSync(resolvedOutDir, { recursive: true });
|
|
102
|
+
}
|
|
103
|
+
log("Components directory:", resolvedComponentsDir);
|
|
104
|
+
log("Output directory:", resolvedOutDir);
|
|
105
|
+
const generateComponents = async () => {
|
|
106
|
+
log("Generating components...");
|
|
107
|
+
const code = await generateComponentsCode(resolvedComponentsDir, { debug });
|
|
108
|
+
const componentsPath2 = join(resolvedOutDir, "components.generated.ts");
|
|
109
|
+
writeFileSync(componentsPath2, code);
|
|
110
|
+
log("Generated:", componentsPath2);
|
|
111
|
+
return componentsPath2;
|
|
112
|
+
};
|
|
113
|
+
const generateMain = (componentsPath2) => {
|
|
114
|
+
log("Generating main entry...");
|
|
115
|
+
const code = generateMainEntry(entry, componentsPath2, debug);
|
|
116
|
+
const mainPath2 = join(resolvedOutDir, "main.ts");
|
|
117
|
+
writeFileSync(mainPath2, code);
|
|
118
|
+
log("Generated:", mainPath2);
|
|
119
|
+
return mainPath2;
|
|
120
|
+
};
|
|
121
|
+
const componentsPath = await generateComponents();
|
|
122
|
+
const mainPath = generateMain(componentsPath);
|
|
123
|
+
let watcher = null;
|
|
124
|
+
if (hot) {
|
|
125
|
+
watcher = watchComponents(resolvedComponentsDir, {
|
|
126
|
+
debug,
|
|
127
|
+
onChange: async (components) => {
|
|
128
|
+
log("Components changed, regenerating...");
|
|
129
|
+
await generateComponents();
|
|
130
|
+
onComponentsChange?.(components);
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
const html = htmlTemplate ? readFileSync(htmlTemplate, "utf-8") : getDefaultHtmlTemplate(entry);
|
|
135
|
+
const server = Bun.serve({
|
|
136
|
+
port,
|
|
137
|
+
async fetch(req) {
|
|
138
|
+
const url = new URL(req.url);
|
|
139
|
+
const pathname = url.pathname;
|
|
140
|
+
log("Request:", pathname);
|
|
141
|
+
if (pathname === "/" || pathname === "/index.html") {
|
|
142
|
+
return new Response(html, {
|
|
143
|
+
headers: { "Content-Type": "text/html" }
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
if (pathname.startsWith("/__hypen__/")) {
|
|
147
|
+
const fileName = pathname.replace("/__hypen__/", "");
|
|
148
|
+
const filePath = join(resolvedOutDir, fileName.replace(/\.js$/, ".ts"));
|
|
149
|
+
if (existsSync(filePath)) {
|
|
150
|
+
const transpiler = new Bun.Transpiler({ loader: "ts" });
|
|
151
|
+
const code = readFileSync(filePath, "utf-8");
|
|
152
|
+
const js = transpiler.transformSync(code);
|
|
153
|
+
return new Response(js, {
|
|
154
|
+
headers: { "Content-Type": "application/javascript" }
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
if (pathname.endsWith(".ts") || pathname.endsWith(".js")) {
|
|
159
|
+
const possiblePaths = [
|
|
160
|
+
join(resolvedComponentsDir, pathname),
|
|
161
|
+
join(process.cwd(), pathname.slice(1))
|
|
162
|
+
];
|
|
163
|
+
for (const filePath of possiblePaths) {
|
|
164
|
+
if (existsSync(filePath)) {
|
|
165
|
+
const transpiler = new Bun.Transpiler({ loader: "ts" });
|
|
166
|
+
const code = readFileSync(filePath, "utf-8");
|
|
167
|
+
const js = transpiler.transformSync(code);
|
|
168
|
+
return new Response(js, {
|
|
169
|
+
headers: { "Content-Type": "application/javascript" }
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
return new Response("Not Found", { status: 404 });
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
const serverUrl = `http://localhost:${port}`;
|
|
178
|
+
console.log(`
|
|
179
|
+
Hypen Dev Server
|
|
180
|
+
`);
|
|
181
|
+
console.log(` Local: ${serverUrl}`);
|
|
182
|
+
console.log(` Entry: ${entry}`);
|
|
183
|
+
console.log(` Components: ${resolvedComponentsDir}
|
|
184
|
+
`);
|
|
185
|
+
onStart?.(serverUrl);
|
|
186
|
+
return {
|
|
187
|
+
url: serverUrl,
|
|
188
|
+
stop: () => {
|
|
189
|
+
watcher?.stop();
|
|
190
|
+
server.stop();
|
|
191
|
+
}
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
async function build(options) {
|
|
195
|
+
const {
|
|
196
|
+
components: componentsDir,
|
|
197
|
+
entry,
|
|
198
|
+
outDir = "dist",
|
|
199
|
+
minify = true,
|
|
200
|
+
sourcemap = false
|
|
201
|
+
} = options;
|
|
202
|
+
const resolvedComponentsDir = resolve(componentsDir);
|
|
203
|
+
const resolvedOutDir = resolve(outDir);
|
|
204
|
+
console.log(`
|
|
205
|
+
Hypen Build
|
|
206
|
+
`);
|
|
207
|
+
console.log(` Entry: ${entry}`);
|
|
208
|
+
console.log(` Components: ${resolvedComponentsDir}`);
|
|
209
|
+
console.log(` Output: ${resolvedOutDir}
|
|
210
|
+
`);
|
|
211
|
+
if (!existsSync(resolvedOutDir)) {
|
|
212
|
+
mkdirSync(resolvedOutDir, { recursive: true });
|
|
213
|
+
}
|
|
214
|
+
const code = await generateComponentsCode(resolvedComponentsDir);
|
|
215
|
+
const tempDir = join(resolvedOutDir, ".temp");
|
|
216
|
+
if (!existsSync(tempDir)) {
|
|
217
|
+
mkdirSync(tempDir, { recursive: true });
|
|
218
|
+
}
|
|
219
|
+
const componentsPath = join(tempDir, "components.generated.ts");
|
|
220
|
+
writeFileSync(componentsPath, code);
|
|
221
|
+
const mainCode = generateMainEntry(entry, componentsPath, false);
|
|
222
|
+
const mainPath = join(tempDir, "main.ts");
|
|
223
|
+
writeFileSync(mainPath, mainCode);
|
|
224
|
+
const result = await Bun.build({
|
|
225
|
+
entrypoints: [mainPath],
|
|
226
|
+
outdir: resolvedOutDir,
|
|
227
|
+
minify,
|
|
228
|
+
sourcemap: sourcemap ? "external" : "none",
|
|
229
|
+
target: "browser",
|
|
230
|
+
format: "esm"
|
|
231
|
+
});
|
|
232
|
+
if (!result.success) {
|
|
233
|
+
console.error("Build failed:");
|
|
234
|
+
for (const log of result.logs) {
|
|
235
|
+
console.error(log);
|
|
236
|
+
}
|
|
237
|
+
process.exit(1);
|
|
238
|
+
}
|
|
239
|
+
const html = getDefaultHtmlTemplate(entry).replace("/__hypen__/main.js", "./main.js");
|
|
240
|
+
writeFileSync(join(resolvedOutDir, "index.html"), html);
|
|
241
|
+
console.log(` Build complete!
|
|
242
|
+
`);
|
|
243
|
+
console.log(` Files:`);
|
|
244
|
+
for (const output of result.outputs) {
|
|
245
|
+
console.log(` ${output.path}`);
|
|
246
|
+
}
|
|
247
|
+
console.log();
|
|
248
|
+
}
|
|
249
|
+
var hypen, dev_bun_default;
|
|
250
|
+
var init_dev_bun = __esm(() => {
|
|
251
|
+
hypen = {
|
|
252
|
+
dev,
|
|
253
|
+
build
|
|
254
|
+
};
|
|
255
|
+
dev_bun_default = hypen;
|
|
256
|
+
});
|
|
257
|
+
|
|
258
|
+
// src/dev-node.ts
|
|
259
|
+
var exports_dev_node = {};
|
|
260
|
+
__export(exports_dev_node, {
|
|
261
|
+
hypen: () => hypen2,
|
|
262
|
+
dev: () => dev2,
|
|
263
|
+
default: () => dev_node_default,
|
|
264
|
+
build: () => build2
|
|
265
|
+
});
|
|
266
|
+
import { createServer } from "http";
|
|
267
|
+
import { join as join2, resolve as resolve2, extname } from "path";
|
|
268
|
+
import { existsSync as existsSync2, readFileSync as readFileSync2, writeFileSync as writeFileSync2, mkdirSync as mkdirSync2, watch } from "fs";
|
|
269
|
+
import {
|
|
270
|
+
discoverComponents as discoverComponents2,
|
|
271
|
+
generateComponentsCode as generateComponentsCode2
|
|
272
|
+
} from "@hypen-space/core/discovery";
|
|
273
|
+
async function getEsbuild() {
|
|
274
|
+
if (!esbuild) {
|
|
275
|
+
try {
|
|
276
|
+
esbuild = await import("esbuild");
|
|
277
|
+
} catch {
|
|
278
|
+
throw new Error("esbuild is required for Node.js support. Install it with: npm install esbuild");
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
return esbuild;
|
|
282
|
+
}
|
|
283
|
+
function getDefaultHtmlTemplate2(entry) {
|
|
284
|
+
return `<!DOCTYPE html>
|
|
285
|
+
<html lang="en">
|
|
286
|
+
<head>
|
|
287
|
+
<meta charset="UTF-8">
|
|
288
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
289
|
+
<title>Hypen App</title>
|
|
290
|
+
<style>
|
|
291
|
+
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
292
|
+
body { font-family: system-ui, -apple-system, sans-serif; }
|
|
293
|
+
</style>
|
|
294
|
+
</head>
|
|
295
|
+
<body>
|
|
296
|
+
<div id="app"></div>
|
|
297
|
+
<script type="module" src="/__hypen__/main.js"></script>
|
|
298
|
+
</body>
|
|
299
|
+
</html>
|
|
300
|
+
`;
|
|
301
|
+
}
|
|
302
|
+
function generateMainEntry2(entry, componentsPath, debug) {
|
|
303
|
+
return `/**
|
|
304
|
+
* Auto-generated Hypen entry point
|
|
305
|
+
*/
|
|
306
|
+
import { renderWithComponents } from "@hypen-space/core";
|
|
307
|
+
import * as components from "${componentsPath}";
|
|
308
|
+
|
|
309
|
+
const app = await renderWithComponents(
|
|
310
|
+
components,
|
|
311
|
+
"${entry}",
|
|
312
|
+
"#app",
|
|
313
|
+
{ debug: ${debug} }
|
|
314
|
+
);
|
|
315
|
+
|
|
316
|
+
// Hot reload support
|
|
317
|
+
if (import.meta.hot) {
|
|
318
|
+
import.meta.hot.accept();
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
export default app;
|
|
322
|
+
`;
|
|
323
|
+
}
|
|
324
|
+
async function transpileTS(code, filename) {
|
|
325
|
+
const es = await getEsbuild();
|
|
326
|
+
const result = await es.transform(code, {
|
|
327
|
+
loader: "ts",
|
|
328
|
+
sourcefile: filename,
|
|
329
|
+
format: "esm",
|
|
330
|
+
target: "es2020"
|
|
331
|
+
});
|
|
332
|
+
return result.code;
|
|
333
|
+
}
|
|
334
|
+
async function dev2(options) {
|
|
335
|
+
const {
|
|
336
|
+
components: componentsDir,
|
|
337
|
+
entry,
|
|
338
|
+
port = 3000,
|
|
339
|
+
hot = true,
|
|
340
|
+
debug = false,
|
|
341
|
+
htmlTemplate,
|
|
342
|
+
outDir = ".hypen",
|
|
343
|
+
onStart,
|
|
344
|
+
onComponentsChange
|
|
345
|
+
} = options;
|
|
346
|
+
await getEsbuild();
|
|
347
|
+
const log = debug ? (...args) => console.log("[hypen:dev]", ...args) : () => {};
|
|
348
|
+
const resolvedComponentsDir = resolve2(componentsDir);
|
|
349
|
+
const resolvedOutDir = resolve2(outDir);
|
|
350
|
+
if (!existsSync2(resolvedOutDir)) {
|
|
351
|
+
mkdirSync2(resolvedOutDir, { recursive: true });
|
|
352
|
+
}
|
|
353
|
+
log("Components directory:", resolvedComponentsDir);
|
|
354
|
+
log("Output directory:", resolvedOutDir);
|
|
355
|
+
const generateComponents = async () => {
|
|
356
|
+
log("Generating components...");
|
|
357
|
+
const code = await generateComponentsCode2(resolvedComponentsDir, { debug });
|
|
358
|
+
const componentsPath2 = join2(resolvedOutDir, "components.generated.ts");
|
|
359
|
+
writeFileSync2(componentsPath2, code);
|
|
360
|
+
log("Generated:", componentsPath2);
|
|
361
|
+
return componentsPath2;
|
|
362
|
+
};
|
|
363
|
+
const generateMain = (componentsPath2) => {
|
|
364
|
+
log("Generating main entry...");
|
|
365
|
+
const code = generateMainEntry2(entry, componentsPath2, debug);
|
|
366
|
+
const mainPath = join2(resolvedOutDir, "main.ts");
|
|
367
|
+
writeFileSync2(mainPath, code);
|
|
368
|
+
log("Generated:", mainPath);
|
|
369
|
+
return mainPath;
|
|
370
|
+
};
|
|
371
|
+
const componentsPath = await generateComponents();
|
|
372
|
+
generateMain(componentsPath);
|
|
373
|
+
let watcher = null;
|
|
374
|
+
if (hot && existsSync2(resolvedComponentsDir)) {
|
|
375
|
+
watcher = watch(resolvedComponentsDir, { recursive: true }, async (eventType, filename) => {
|
|
376
|
+
if (filename && (filename.endsWith(".hypen") || filename.endsWith(".ts"))) {
|
|
377
|
+
log("File changed:", filename);
|
|
378
|
+
await generateComponents();
|
|
379
|
+
const components = await discoverComponents2(resolvedComponentsDir);
|
|
380
|
+
onComponentsChange?.(components);
|
|
381
|
+
}
|
|
382
|
+
});
|
|
383
|
+
}
|
|
384
|
+
const html = htmlTemplate ? readFileSync2(htmlTemplate, "utf-8") : getDefaultHtmlTemplate2(entry);
|
|
385
|
+
const server = createServer(async (req, res) => {
|
|
386
|
+
const url = new URL(req.url || "/", `http://localhost:${port}`);
|
|
387
|
+
const pathname = url.pathname;
|
|
388
|
+
log("Request:", pathname);
|
|
389
|
+
try {
|
|
390
|
+
if (pathname === "/" || pathname === "/index.html") {
|
|
391
|
+
res.writeHead(200, { "Content-Type": "text/html" });
|
|
392
|
+
res.end(html);
|
|
393
|
+
return;
|
|
394
|
+
}
|
|
395
|
+
if (pathname.startsWith("/__hypen__/")) {
|
|
396
|
+
const fileName = pathname.replace("/__hypen__/", "");
|
|
397
|
+
const filePath = join2(resolvedOutDir, fileName.replace(/\.js$/, ".ts"));
|
|
398
|
+
if (existsSync2(filePath)) {
|
|
399
|
+
const code = readFileSync2(filePath, "utf-8");
|
|
400
|
+
const js = await transpileTS(code, filePath);
|
|
401
|
+
res.writeHead(200, { "Content-Type": "application/javascript" });
|
|
402
|
+
res.end(js);
|
|
403
|
+
return;
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
if (pathname.endsWith(".ts") || pathname.endsWith(".js")) {
|
|
407
|
+
const possiblePaths = [
|
|
408
|
+
join2(resolvedComponentsDir, pathname),
|
|
409
|
+
join2(process.cwd(), pathname.slice(1))
|
|
410
|
+
];
|
|
411
|
+
for (const filePath of possiblePaths) {
|
|
412
|
+
if (existsSync2(filePath)) {
|
|
413
|
+
const code = readFileSync2(filePath, "utf-8");
|
|
414
|
+
const js = await transpileTS(code, filePath);
|
|
415
|
+
res.writeHead(200, { "Content-Type": "application/javascript" });
|
|
416
|
+
res.end(js);
|
|
417
|
+
return;
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
const ext = extname(pathname);
|
|
422
|
+
if (ext && MIME_TYPES[ext]) {
|
|
423
|
+
const filePath = join2(process.cwd(), pathname.slice(1));
|
|
424
|
+
if (existsSync2(filePath)) {
|
|
425
|
+
const content = readFileSync2(filePath);
|
|
426
|
+
res.writeHead(200, { "Content-Type": MIME_TYPES[ext] });
|
|
427
|
+
res.end(content);
|
|
428
|
+
return;
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
res.writeHead(404, { "Content-Type": "text/plain" });
|
|
432
|
+
res.end("Not Found");
|
|
433
|
+
} catch (error) {
|
|
434
|
+
log("Error:", error);
|
|
435
|
+
res.writeHead(500, { "Content-Type": "text/plain" });
|
|
436
|
+
res.end(`Server Error: ${error}`);
|
|
437
|
+
}
|
|
438
|
+
});
|
|
439
|
+
server.listen(port);
|
|
440
|
+
const serverUrl = `http://localhost:${port}`;
|
|
441
|
+
console.log(`
|
|
442
|
+
Hypen Dev Server (Node.js)
|
|
443
|
+
`);
|
|
444
|
+
console.log(` Local: ${serverUrl}`);
|
|
445
|
+
console.log(` Entry: ${entry}`);
|
|
446
|
+
console.log(` Components: ${resolvedComponentsDir}
|
|
447
|
+
`);
|
|
448
|
+
onStart?.(serverUrl);
|
|
449
|
+
return {
|
|
450
|
+
url: serverUrl,
|
|
451
|
+
stop: () => {
|
|
452
|
+
watcher?.close();
|
|
453
|
+
server.close();
|
|
454
|
+
}
|
|
455
|
+
};
|
|
456
|
+
}
|
|
457
|
+
async function build2(options) {
|
|
458
|
+
const {
|
|
459
|
+
components: componentsDir,
|
|
460
|
+
entry,
|
|
461
|
+
outDir = "dist",
|
|
462
|
+
minify = true,
|
|
463
|
+
sourcemap = false
|
|
464
|
+
} = options;
|
|
465
|
+
const es = await getEsbuild();
|
|
466
|
+
const resolvedComponentsDir = resolve2(componentsDir);
|
|
467
|
+
const resolvedOutDir = resolve2(outDir);
|
|
468
|
+
console.log(`
|
|
469
|
+
Hypen Build (Node.js)
|
|
470
|
+
`);
|
|
471
|
+
console.log(` Entry: ${entry}`);
|
|
472
|
+
console.log(` Components: ${resolvedComponentsDir}`);
|
|
473
|
+
console.log(` Output: ${resolvedOutDir}
|
|
474
|
+
`);
|
|
475
|
+
if (!existsSync2(resolvedOutDir)) {
|
|
476
|
+
mkdirSync2(resolvedOutDir, { recursive: true });
|
|
477
|
+
}
|
|
478
|
+
const code = await generateComponentsCode2(resolvedComponentsDir);
|
|
479
|
+
const tempDir = join2(resolvedOutDir, ".temp");
|
|
480
|
+
if (!existsSync2(tempDir)) {
|
|
481
|
+
mkdirSync2(tempDir, { recursive: true });
|
|
482
|
+
}
|
|
483
|
+
const componentsPath = join2(tempDir, "components.generated.ts");
|
|
484
|
+
writeFileSync2(componentsPath, code);
|
|
485
|
+
const mainCode = generateMainEntry2(entry, componentsPath, false);
|
|
486
|
+
const mainPath = join2(tempDir, "main.ts");
|
|
487
|
+
writeFileSync2(mainPath, mainCode);
|
|
488
|
+
try {
|
|
489
|
+
await es.build({
|
|
490
|
+
entryPoints: [mainPath],
|
|
491
|
+
bundle: true,
|
|
492
|
+
outdir: resolvedOutDir,
|
|
493
|
+
minify,
|
|
494
|
+
sourcemap,
|
|
495
|
+
format: "esm",
|
|
496
|
+
target: "es2020",
|
|
497
|
+
platform: "browser"
|
|
498
|
+
});
|
|
499
|
+
} catch (error) {
|
|
500
|
+
console.error("Build failed:", error);
|
|
501
|
+
process.exit(1);
|
|
502
|
+
}
|
|
503
|
+
const html = getDefaultHtmlTemplate2(entry).replace("/__hypen__/main.js", "./main.js");
|
|
504
|
+
writeFileSync2(join2(resolvedOutDir, "index.html"), html);
|
|
505
|
+
console.log(` Build complete!
|
|
506
|
+
`);
|
|
507
|
+
console.log(` Files:`);
|
|
508
|
+
console.log(` ${join2(resolvedOutDir, "main.js")}`);
|
|
509
|
+
console.log(` ${join2(resolvedOutDir, "index.html")}`);
|
|
510
|
+
console.log();
|
|
511
|
+
}
|
|
512
|
+
var esbuild = null, MIME_TYPES, hypen2, dev_node_default;
|
|
513
|
+
var init_dev_node = __esm(() => {
|
|
514
|
+
MIME_TYPES = {
|
|
515
|
+
".html": "text/html",
|
|
516
|
+
".js": "application/javascript",
|
|
517
|
+
".mjs": "application/javascript",
|
|
518
|
+
".ts": "application/javascript",
|
|
519
|
+
".css": "text/css",
|
|
520
|
+
".json": "application/json",
|
|
521
|
+
".wasm": "application/wasm",
|
|
522
|
+
".png": "image/png",
|
|
523
|
+
".jpg": "image/jpeg",
|
|
524
|
+
".svg": "image/svg+xml"
|
|
525
|
+
};
|
|
526
|
+
hypen2 = {
|
|
527
|
+
dev: dev2,
|
|
528
|
+
build: build2
|
|
529
|
+
};
|
|
530
|
+
dev_node_default = hypen2;
|
|
531
|
+
});
|
|
532
|
+
|
|
533
|
+
// src/dev.ts
|
|
534
|
+
var exports_dev = {};
|
|
535
|
+
__export(exports_dev, {
|
|
536
|
+
hypen: () => hypen3,
|
|
537
|
+
dev: () => dev3,
|
|
538
|
+
default: () => dev_default,
|
|
539
|
+
build: () => build3
|
|
540
|
+
});
|
|
541
|
+
function isBun() {
|
|
542
|
+
return typeof globalThis.Bun !== "undefined";
|
|
543
|
+
}
|
|
544
|
+
async function getImplementation() {
|
|
545
|
+
if (isBun()) {
|
|
546
|
+
return Promise.resolve().then(() => (init_dev_bun(), exports_dev_bun));
|
|
547
|
+
} else {
|
|
548
|
+
return Promise.resolve().then(() => (init_dev_node(), exports_dev_node));
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
async function dev3(options) {
|
|
552
|
+
const impl = await getImplementation();
|
|
553
|
+
return impl.dev(options);
|
|
554
|
+
}
|
|
555
|
+
async function build3(options) {
|
|
556
|
+
const impl = await getImplementation();
|
|
557
|
+
return impl.build(options);
|
|
558
|
+
}
|
|
559
|
+
var hypen3, dev_default;
|
|
560
|
+
var init_dev = __esm(() => {
|
|
561
|
+
hypen3 = {
|
|
562
|
+
dev: dev3,
|
|
563
|
+
build: build3
|
|
564
|
+
};
|
|
565
|
+
dev_default = hypen3;
|
|
566
|
+
});
|
|
567
|
+
|
|
568
|
+
// src/index.ts
|
|
569
|
+
init_dev();
|
|
570
|
+
init_dev_bun();
|
|
571
|
+
init_dev_node();
|
|
572
|
+
export {
|
|
573
|
+
exports_dev_node as node,
|
|
574
|
+
hypen3 as hypen,
|
|
575
|
+
dev3 as dev,
|
|
576
|
+
exports_dev_bun as bun,
|
|
577
|
+
build3 as build
|
|
578
|
+
};
|
|
579
|
+
|
|
580
|
+
//# debugId=D24177954522F39064756E2164756E21
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/dev-bun.ts", "../src/dev-node.ts", "../src/dev.ts", "../src/index.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"/**\n * Zero-Config Development Server\n *\n * Simple API for starting a Hypen development server.\n *\n * Usage:\n * import { dev } from \"@hypen-space/cli/dev\";\n *\n * await dev({\n * components: \"./src/components\",\n * entry: \"App\",\n * });\n */\n\nimport { join, resolve } from \"path\";\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from \"fs\";\nimport {\n discoverComponents,\n watchComponents,\n generateComponentsCode,\n type DiscoveredComponent,\n} from \"@hypen-space/core/discovery\";\n\nexport interface DevOptions {\n /**\n * Path to components directory\n */\n components: string;\n\n /**\n * Entry component name (e.g., \"App\")\n */\n entry: string;\n\n /**\n * Development server port\n * Default: 3000\n */\n port?: number;\n\n /**\n * Enable hot module reloading\n * Default: true\n */\n hot?: boolean;\n\n /**\n * Enable debug logging\n * Default: false\n */\n debug?: boolean;\n\n /**\n * Custom HTML template path\n */\n htmlTemplate?: string;\n\n /**\n * Output directory for generated files\n * Default: \".hypen\"\n */\n outDir?: string;\n\n /**\n * Callback when server starts\n */\n onStart?: (url: string) => void;\n\n /**\n * Callback when components change\n */\n onComponentsChange?: (components: DiscoveredComponent[]) => void;\n}\n\nexport interface BuildOptions {\n /**\n * Path to components directory\n */\n components: string;\n\n /**\n * Entry component name\n */\n entry: string;\n\n /**\n * Output directory\n * Default: \"dist\"\n */\n outDir?: string;\n\n /**\n * Enable minification\n * Default: true\n */\n minify?: boolean;\n\n /**\n * Enable source maps\n * Default: false\n */\n sourcemap?: boolean;\n}\n\n/**\n * Default HTML template for development\n */\nfunction getDefaultHtmlTemplate(entry: string): string {\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Hypen App</title>\n <style>\n * { margin: 0; padding: 0; box-sizing: border-box; }\n body { font-family: system-ui, -apple-system, sans-serif; }\n </style>\n</head>\n<body>\n <div id=\"app\"></div>\n <script type=\"module\" src=\"/__hypen__/main.js\"></script>\n</body>\n</html>\n`;\n}\n\n/**\n * Generate the main entry file\n */\nfunction generateMainEntry(\n entry: string,\n componentsPath: string,\n debug: boolean\n): string {\n return `/**\n * Auto-generated Hypen entry point\n */\nimport { renderWithComponents } from \"@hypen-space/core\";\nimport * as components from \"${componentsPath}\";\n\nconst app = await renderWithComponents(\n components,\n \"${entry}\",\n \"#app\",\n { debug: ${debug} }\n);\n\n// Hot reload support\nif (import.meta.hot) {\n import.meta.hot.accept();\n}\n\nexport default app;\n`;\n}\n\n/**\n * Start a development server\n */\nexport async function dev(options: DevOptions): Promise<{\n url: string;\n stop: () => void;\n}> {\n const {\n components: componentsDir,\n entry,\n port = 3000,\n hot = true,\n debug = false,\n htmlTemplate,\n outDir = \".hypen\",\n onStart,\n onComponentsChange,\n } = options;\n\n const log = debug\n ? (...args: unknown[]) => console.log(\"[hypen:dev]\", ...args)\n : () => {};\n\n const resolvedComponentsDir = resolve(componentsDir);\n const resolvedOutDir = resolve(outDir);\n\n // Ensure output directory exists\n if (!existsSync(resolvedOutDir)) {\n mkdirSync(resolvedOutDir, { recursive: true });\n }\n\n log(\"Components directory:\", resolvedComponentsDir);\n log(\"Output directory:\", resolvedOutDir);\n\n // Generate initial components\n const generateComponents = async () => {\n log(\"Generating components...\");\n const code = await generateComponentsCode(resolvedComponentsDir, { debug });\n const componentsPath = join(resolvedOutDir, \"components.generated.ts\");\n writeFileSync(componentsPath, code);\n log(\"Generated:\", componentsPath);\n return componentsPath;\n };\n\n // Generate main entry\n const generateMain = (componentsPath: string) => {\n log(\"Generating main entry...\");\n const code = generateMainEntry(entry, componentsPath, debug);\n const mainPath = join(resolvedOutDir, \"main.ts\");\n writeFileSync(mainPath, code);\n log(\"Generated:\", mainPath);\n return mainPath;\n };\n\n // Initial generation\n const componentsPath = await generateComponents();\n const mainPath = generateMain(componentsPath);\n\n // Watch for changes\n let watcher: { stop: () => void } | null = null;\n\n if (hot) {\n watcher = watchComponents(resolvedComponentsDir, {\n debug,\n onChange: async (components) => {\n log(\"Components changed, regenerating...\");\n await generateComponents();\n onComponentsChange?.(components);\n },\n });\n }\n\n // Get HTML template\n const html = htmlTemplate\n ? readFileSync(htmlTemplate, \"utf-8\")\n : getDefaultHtmlTemplate(entry);\n\n // Create Bun server\n const server = Bun.serve({\n port,\n async fetch(req) {\n const url = new URL(req.url);\n const pathname = url.pathname;\n\n log(\"Request:\", pathname);\n\n // Serve HTML for root\n if (pathname === \"/\" || pathname === \"/index.html\") {\n return new Response(html, {\n headers: { \"Content-Type\": \"text/html\" },\n });\n }\n\n // Serve generated files\n if (pathname.startsWith(\"/__hypen__/\")) {\n const fileName = pathname.replace(\"/__hypen__/\", \"\");\n const filePath = join(resolvedOutDir, fileName.replace(/\\.js$/, \".ts\"));\n\n if (existsSync(filePath)) {\n // Transpile TypeScript on-the-fly\n const transpiler = new Bun.Transpiler({ loader: \"ts\" });\n const code = readFileSync(filePath, \"utf-8\");\n const js = transpiler.transformSync(code);\n\n return new Response(js, {\n headers: { \"Content-Type\": \"application/javascript\" },\n });\n }\n }\n\n // Serve static files from components directory\n if (pathname.endsWith(\".ts\") || pathname.endsWith(\".js\")) {\n // Try to resolve from components directory\n const possiblePaths = [\n join(resolvedComponentsDir, pathname),\n join(process.cwd(), pathname.slice(1)),\n ];\n\n for (const filePath of possiblePaths) {\n if (existsSync(filePath)) {\n const transpiler = new Bun.Transpiler({ loader: \"ts\" });\n const code = readFileSync(filePath, \"utf-8\");\n const js = transpiler.transformSync(code);\n\n return new Response(js, {\n headers: { \"Content-Type\": \"application/javascript\" },\n });\n }\n }\n }\n\n // 404\n return new Response(\"Not Found\", { status: 404 });\n },\n });\n\n const serverUrl = `http://localhost:${port}`;\n\n console.log(`\\n Hypen Dev Server\\n`);\n console.log(` Local: ${serverUrl}`);\n console.log(` Entry: ${entry}`);\n console.log(` Components: ${resolvedComponentsDir}\\n`);\n\n onStart?.(serverUrl);\n\n return {\n url: serverUrl,\n stop: () => {\n watcher?.stop();\n server.stop();\n },\n };\n}\n\n/**\n * Build for production\n */\nexport async function build(options: BuildOptions): Promise<void> {\n const {\n components: componentsDir,\n entry,\n outDir = \"dist\",\n minify = true,\n sourcemap = false,\n } = options;\n\n const resolvedComponentsDir = resolve(componentsDir);\n const resolvedOutDir = resolve(outDir);\n\n console.log(`\\n Hypen Build\\n`);\n console.log(` Entry: ${entry}`);\n console.log(` Components: ${resolvedComponentsDir}`);\n console.log(` Output: ${resolvedOutDir}\\n`);\n\n // Ensure output directory exists\n if (!existsSync(resolvedOutDir)) {\n mkdirSync(resolvedOutDir, { recursive: true });\n }\n\n // Generate components\n const code = await generateComponentsCode(resolvedComponentsDir);\n const tempDir = join(resolvedOutDir, \".temp\");\n\n if (!existsSync(tempDir)) {\n mkdirSync(tempDir, { recursive: true });\n }\n\n const componentsPath = join(tempDir, \"components.generated.ts\");\n writeFileSync(componentsPath, code);\n\n // Generate main entry\n const mainCode = generateMainEntry(entry, componentsPath, false);\n const mainPath = join(tempDir, \"main.ts\");\n writeFileSync(mainPath, mainCode);\n\n // Bundle with Bun\n const result = await Bun.build({\n entrypoints: [mainPath],\n outdir: resolvedOutDir,\n minify,\n sourcemap: sourcemap ? \"external\" : \"none\",\n target: \"browser\",\n format: \"esm\",\n });\n\n if (!result.success) {\n console.error(\"Build failed:\");\n for (const log of result.logs) {\n console.error(log);\n }\n process.exit(1);\n }\n\n // Generate HTML\n const html = getDefaultHtmlTemplate(entry).replace(\n \"/__hypen__/main.js\",\n \"./main.js\"\n );\n writeFileSync(join(resolvedOutDir, \"index.html\"), html);\n\n console.log(` Build complete!\\n`);\n console.log(` Files:`);\n for (const output of result.outputs) {\n console.log(` ${output.path}`);\n }\n console.log();\n}\n\n/**\n * Main hypen object for easy imports\n */\nexport const hypen = {\n dev,\n build,\n};\n\nexport default hypen;\n",
|
|
6
|
+
"/**\n * Node.js-compatible Development Server\n *\n * Uses http.createServer() and esbuild for Node.js environments.\n */\n\nimport { createServer, type IncomingMessage, type ServerResponse } from \"http\";\nimport { join, resolve, extname } from \"path\";\nimport { existsSync, readFileSync, writeFileSync, mkdirSync, watch } from \"fs\";\nimport {\n discoverComponents,\n generateComponentsCode,\n type DiscoveredComponent,\n} from \"@hypen-space/core/discovery\";\n\n// Lazy load esbuild to avoid issues if not installed\nlet esbuild: typeof import(\"esbuild\") | null = null;\n\nasync function getEsbuild() {\n if (!esbuild) {\n try {\n esbuild = await import(\"esbuild\");\n } catch {\n throw new Error(\n \"esbuild is required for Node.js support. Install it with: npm install esbuild\"\n );\n }\n }\n return esbuild;\n}\n\nexport interface DevOptions {\n components: string;\n entry: string;\n port?: number;\n hot?: boolean;\n debug?: boolean;\n htmlTemplate?: string;\n outDir?: string;\n onStart?: (url: string) => void;\n onComponentsChange?: (components: DiscoveredComponent[]) => void;\n}\n\nexport interface BuildOptions {\n components: string;\n entry: string;\n outDir?: string;\n minify?: boolean;\n sourcemap?: boolean;\n}\n\n/**\n * Default HTML template for development\n */\nfunction getDefaultHtmlTemplate(entry: string): string {\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Hypen App</title>\n <style>\n * { margin: 0; padding: 0; box-sizing: border-box; }\n body { font-family: system-ui, -apple-system, sans-serif; }\n </style>\n</head>\n<body>\n <div id=\"app\"></div>\n <script type=\"module\" src=\"/__hypen__/main.js\"></script>\n</body>\n</html>\n`;\n}\n\n/**\n * Generate the main entry file\n */\nfunction generateMainEntry(\n entry: string,\n componentsPath: string,\n debug: boolean\n): string {\n return `/**\n * Auto-generated Hypen entry point\n */\nimport { renderWithComponents } from \"@hypen-space/core\";\nimport * as components from \"${componentsPath}\";\n\nconst app = await renderWithComponents(\n components,\n \"${entry}\",\n \"#app\",\n { debug: ${debug} }\n);\n\n// Hot reload support\nif (import.meta.hot) {\n import.meta.hot.accept();\n}\n\nexport default app;\n`;\n}\n\n/**\n * MIME types for common file extensions\n */\nconst MIME_TYPES: Record<string, string> = {\n \".html\": \"text/html\",\n \".js\": \"application/javascript\",\n \".mjs\": \"application/javascript\",\n \".ts\": \"application/javascript\",\n \".css\": \"text/css\",\n \".json\": \"application/json\",\n \".wasm\": \"application/wasm\",\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".svg\": \"image/svg+xml\",\n};\n\n/**\n * Transpile TypeScript to JavaScript using esbuild\n */\nasync function transpileTS(code: string, filename: string): Promise<string> {\n const es = await getEsbuild();\n const result = await es.transform(code, {\n loader: \"ts\",\n sourcefile: filename,\n format: \"esm\",\n target: \"es2020\",\n });\n return result.code;\n}\n\n/**\n * Start a development server (Node.js version)\n */\nexport async function dev(options: DevOptions): Promise<{\n url: string;\n stop: () => void;\n}> {\n const {\n components: componentsDir,\n entry,\n port = 3000,\n hot = true,\n debug = false,\n htmlTemplate,\n outDir = \".hypen\",\n onStart,\n onComponentsChange,\n } = options;\n\n // Verify esbuild is available\n await getEsbuild();\n\n const log = debug\n ? (...args: unknown[]) => console.log(\"[hypen:dev]\", ...args)\n : () => {};\n\n const resolvedComponentsDir = resolve(componentsDir);\n const resolvedOutDir = resolve(outDir);\n\n // Ensure output directory exists\n if (!existsSync(resolvedOutDir)) {\n mkdirSync(resolvedOutDir, { recursive: true });\n }\n\n log(\"Components directory:\", resolvedComponentsDir);\n log(\"Output directory:\", resolvedOutDir);\n\n // Generate initial components\n const generateComponents = async () => {\n log(\"Generating components...\");\n const code = await generateComponentsCode(resolvedComponentsDir, { debug });\n const componentsPath = join(resolvedOutDir, \"components.generated.ts\");\n writeFileSync(componentsPath, code);\n log(\"Generated:\", componentsPath);\n return componentsPath;\n };\n\n // Generate main entry\n const generateMain = (componentsPath: string) => {\n log(\"Generating main entry...\");\n const code = generateMainEntry(entry, componentsPath, debug);\n const mainPath = join(resolvedOutDir, \"main.ts\");\n writeFileSync(mainPath, code);\n log(\"Generated:\", mainPath);\n return mainPath;\n };\n\n // Initial generation\n const componentsPath = await generateComponents();\n generateMain(componentsPath);\n\n // Watch for changes\n let watcher: ReturnType<typeof watch> | null = null;\n\n if (hot && existsSync(resolvedComponentsDir)) {\n watcher = watch(\n resolvedComponentsDir,\n { recursive: true },\n async (eventType, filename) => {\n if (\n filename &&\n (filename.endsWith(\".hypen\") || filename.endsWith(\".ts\"))\n ) {\n log(\"File changed:\", filename);\n await generateComponents();\n const components = await discoverComponents(resolvedComponentsDir);\n onComponentsChange?.(components);\n }\n }\n );\n }\n\n // Get HTML template\n const html = htmlTemplate\n ? readFileSync(htmlTemplate, \"utf-8\")\n : getDefaultHtmlTemplate(entry);\n\n // Create Node.js HTTP server\n const server = createServer(async (req: IncomingMessage, res: ServerResponse) => {\n const url = new URL(req.url || \"/\", `http://localhost:${port}`);\n const pathname = url.pathname;\n\n log(\"Request:\", pathname);\n\n try {\n // Serve HTML for root\n if (pathname === \"/\" || pathname === \"/index.html\") {\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n res.end(html);\n return;\n }\n\n // Serve generated files\n if (pathname.startsWith(\"/__hypen__/\")) {\n const fileName = pathname.replace(\"/__hypen__/\", \"\");\n const filePath = join(resolvedOutDir, fileName.replace(/\\.js$/, \".ts\"));\n\n if (existsSync(filePath)) {\n const code = readFileSync(filePath, \"utf-8\");\n const js = await transpileTS(code, filePath);\n\n res.writeHead(200, { \"Content-Type\": \"application/javascript\" });\n res.end(js);\n return;\n }\n }\n\n // Serve static files from components directory\n if (pathname.endsWith(\".ts\") || pathname.endsWith(\".js\")) {\n const possiblePaths = [\n join(resolvedComponentsDir, pathname),\n join(process.cwd(), pathname.slice(1)),\n ];\n\n for (const filePath of possiblePaths) {\n if (existsSync(filePath)) {\n const code = readFileSync(filePath, \"utf-8\");\n const js = await transpileTS(code, filePath);\n\n res.writeHead(200, { \"Content-Type\": \"application/javascript\" });\n res.end(js);\n return;\n }\n }\n }\n\n // Serve other static files\n const ext = extname(pathname);\n if (ext && MIME_TYPES[ext]) {\n const filePath = join(process.cwd(), pathname.slice(1));\n if (existsSync(filePath)) {\n const content = readFileSync(filePath);\n res.writeHead(200, { \"Content-Type\": MIME_TYPES[ext] });\n res.end(content);\n return;\n }\n }\n\n // 404\n res.writeHead(404, { \"Content-Type\": \"text/plain\" });\n res.end(\"Not Found\");\n } catch (error) {\n log(\"Error:\", error);\n res.writeHead(500, { \"Content-Type\": \"text/plain\" });\n res.end(`Server Error: ${error}`);\n }\n });\n\n server.listen(port);\n\n const serverUrl = `http://localhost:${port}`;\n\n console.log(`\\n Hypen Dev Server (Node.js)\\n`);\n console.log(` Local: ${serverUrl}`);\n console.log(` Entry: ${entry}`);\n console.log(` Components: ${resolvedComponentsDir}\\n`);\n\n onStart?.(serverUrl);\n\n return {\n url: serverUrl,\n stop: () => {\n watcher?.close();\n server.close();\n },\n };\n}\n\n/**\n * Build for production (Node.js version)\n */\nexport async function build(options: BuildOptions): Promise<void> {\n const {\n components: componentsDir,\n entry,\n outDir = \"dist\",\n minify = true,\n sourcemap = false,\n } = options;\n\n const es = await getEsbuild();\n const resolvedComponentsDir = resolve(componentsDir);\n const resolvedOutDir = resolve(outDir);\n\n console.log(`\\n Hypen Build (Node.js)\\n`);\n console.log(` Entry: ${entry}`);\n console.log(` Components: ${resolvedComponentsDir}`);\n console.log(` Output: ${resolvedOutDir}\\n`);\n\n // Ensure output directory exists\n if (!existsSync(resolvedOutDir)) {\n mkdirSync(resolvedOutDir, { recursive: true });\n }\n\n // Generate components\n const code = await generateComponentsCode(resolvedComponentsDir);\n const tempDir = join(resolvedOutDir, \".temp\");\n\n if (!existsSync(tempDir)) {\n mkdirSync(tempDir, { recursive: true });\n }\n\n const componentsPath = join(tempDir, \"components.generated.ts\");\n writeFileSync(componentsPath, code);\n\n // Generate main entry\n const mainCode = generateMainEntry(entry, componentsPath, false);\n const mainPath = join(tempDir, \"main.ts\");\n writeFileSync(mainPath, mainCode);\n\n // Bundle with esbuild\n try {\n await es.build({\n entryPoints: [mainPath],\n bundle: true,\n outdir: resolvedOutDir,\n minify,\n sourcemap,\n format: \"esm\",\n target: \"es2020\",\n platform: \"browser\",\n });\n } catch (error) {\n console.error(\"Build failed:\", error);\n process.exit(1);\n }\n\n // Generate HTML\n const html = getDefaultHtmlTemplate(entry).replace(\n \"/__hypen__/main.js\",\n \"./main.js\"\n );\n writeFileSync(join(resolvedOutDir, \"index.html\"), html);\n\n console.log(` Build complete!\\n`);\n console.log(` Files:`);\n console.log(` ${join(resolvedOutDir, \"main.js\")}`);\n console.log(` ${join(resolvedOutDir, \"index.html\")}`);\n console.log();\n}\n\n/**\n * Main hypen object for easy imports\n */\nexport const hypen = {\n dev,\n build,\n};\n\nexport default hypen;\n",
|
|
7
|
+
"/**\n * Unified Development Server\n *\n * Automatically detects runtime (Bun vs Node.js) and uses the appropriate implementation.\n *\n * Usage:\n * import { dev, build } from \"@hypen-space/cli/dev\";\n *\n * await dev({\n * components: \"./src/components\",\n * entry: \"App\",\n * });\n */\n\nimport type { DiscoveredComponent } from \"@hypen-space/core/discovery\";\n\nexport interface DevOptions {\n /**\n * Path to components directory\n */\n components: string;\n\n /**\n * Entry component name (e.g., \"App\")\n */\n entry: string;\n\n /**\n * Development server port\n * Default: 3000\n */\n port?: number;\n\n /**\n * Enable hot module reloading\n * Default: true\n */\n hot?: boolean;\n\n /**\n * Enable debug logging\n * Default: false\n */\n debug?: boolean;\n\n /**\n * Custom HTML template path\n */\n htmlTemplate?: string;\n\n /**\n * Output directory for generated files\n * Default: \".hypen\"\n */\n outDir?: string;\n\n /**\n * Callback when server starts\n */\n onStart?: (url: string) => void;\n\n /**\n * Callback when components change\n */\n onComponentsChange?: (components: DiscoveredComponent[]) => void;\n}\n\nexport interface BuildOptions {\n /**\n * Path to components directory\n */\n components: string;\n\n /**\n * Entry component name\n */\n entry: string;\n\n /**\n * Output directory\n * Default: \"dist\"\n */\n outDir?: string;\n\n /**\n * Enable minification\n * Default: true\n */\n minify?: boolean;\n\n /**\n * Enable source maps\n * Default: false\n */\n sourcemap?: boolean;\n}\n\n/**\n * Detect if running in Bun\n */\nfunction isBun(): boolean {\n return typeof globalThis.Bun !== \"undefined\";\n}\n\n/**\n * Get the appropriate implementation based on runtime\n */\nasync function getImplementation() {\n if (isBun()) {\n return import(\"./dev-bun.js\");\n } else {\n return import(\"./dev-node.js\");\n }\n}\n\n/**\n * Start a development server\n *\n * Automatically uses Bun.serve() in Bun or http.createServer() in Node.js\n */\nexport async function dev(options: DevOptions): Promise<{\n url: string;\n stop: () => void;\n}> {\n const impl = await getImplementation();\n return impl.dev(options);\n}\n\n/**\n * Build for production\n *\n * Automatically uses Bun.build() in Bun or esbuild in Node.js\n */\nexport async function build(options: BuildOptions): Promise<void> {\n const impl = await getImplementation();\n return impl.build(options);\n}\n\n/**\n * Main hypen object for easy imports\n */\nexport const hypen = {\n dev,\n build,\n};\n\nexport default hypen;\n",
|
|
8
|
+
"/**\n * @hypen-space/cli\n *\n * CLI tools for creating and managing Hypen applications.\n * Works with both Bun and Node.js runtimes.\n */\n\n// Unified API (auto-detects runtime)\nexport { dev, build, hypen } from \"./dev.js\";\nexport type { DevOptions, BuildOptions } from \"./dev.js\";\n\n// Direct access to runtime-specific implementations\nexport * as bun from \"./dev-bun.js\";\nexport * as node from \"./dev-node.js\";\n"
|
|
9
|
+
],
|
|
10
|
+
"mappings": "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",
|
|
11
|
+
"debugId": "D24177954522F39064756E2164756E21",
|
|
12
|
+
"names": []
|
|
13
|
+
}
|