@sigx/cli 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 +1 -1
- package/dist/commands/create.js +201 -181
- package/dist/commands/create.js.map +1 -1
- package/dist/templates/basic/package.json +3 -3
- package/dist/templates/basic-daisyui/package.json +4 -4
- package/dist/templates/basic-tailwind/package.json +3 -3
- package/dist/templates/lynx/gitignore +30 -0
- package/dist/templates/lynx/package.json +16 -16
- package/dist/templates/lynx/src/main.thread.tsx +1 -1
- package/dist/templates/lynx-daisyui/gitignore +30 -0
- package/dist/templates/lynx-daisyui/package.json +17 -17
- package/dist/templates/lynx-daisyui/src/main.thread.tsx +1 -1
- package/dist/templates/lynx-tailwind/gitignore +30 -0
- package/dist/templates/lynx-tailwind/package.json +16 -16
- package/dist/templates/lynx-tailwind/src/main.thread.tsx +1 -1
- package/dist/templates/ssg/package.json +6 -6
- package/dist/templates/ssg-daisyui/package.json +7 -7
- package/dist/templates/ssg-tailwind/package.json +6 -6
- package/dist/templates/ssr/package.json +5 -5
- package/dist/templates/ssr-daisyui/package.json +6 -6
- package/dist/templates/ssr-tailwind/package.json +5 -5
- package/package.json +2 -2
- package/templates/basic/package.json +3 -3
- package/templates/basic-daisyui/package.json +4 -4
- package/templates/basic-tailwind/package.json +3 -3
- package/templates/lynx/gitignore +30 -0
- package/templates/lynx/package.json +16 -16
- package/templates/lynx/src/main.thread.tsx +1 -1
- package/templates/lynx-daisyui/gitignore +30 -0
- package/templates/lynx-daisyui/package.json +17 -17
- package/templates/lynx-daisyui/src/main.thread.tsx +1 -1
- package/templates/lynx-tailwind/gitignore +30 -0
- package/templates/lynx-tailwind/package.json +16 -16
- package/templates/lynx-tailwind/src/main.thread.tsx +1 -1
- package/templates/ssg/package.json +6 -6
- package/templates/ssg-daisyui/package.json +7 -7
- package/templates/ssg-tailwind/package.json +6 -6
- package/templates/ssr/package.json +5 -5
- package/templates/ssr-daisyui/package.json +6 -6
- package/templates/ssr-tailwind/package.json +5 -5
package/README.md
CHANGED
|
@@ -8,7 +8,7 @@ npm i -D @sigx/cli
|
|
|
8
8
|
npx sigx <command>
|
|
9
9
|
```
|
|
10
10
|
|
|
11
|
-
After scaffolding with `npm create sigx@latest`, the generated project depends on `@sigx/cli` directly. The `sigx` binary is the entry point for everything: scaffolding, dev servers, builds, previews, and platform-specific commands provided by plugins.
|
|
11
|
+
After scaffolding with `npm create @sigx@latest`, the generated project depends on `@sigx/cli` directly. The `sigx` binary is the entry point for everything: scaffolding, dev servers, builds, previews, and platform-specific commands provided by plugins.
|
|
12
12
|
|
|
13
13
|
## Commands
|
|
14
14
|
|
package/dist/commands/create.js
CHANGED
|
@@ -119,7 +119,7 @@ function copyDirectory(src, dest, projectName) {
|
|
|
119
119
|
const entries = readdirSync(src);
|
|
120
120
|
for (const entry of entries) {
|
|
121
121
|
const srcPath = join(src, entry);
|
|
122
|
-
const destPath = join(dest, entry);
|
|
122
|
+
const destPath = join(dest, entry === "gitignore" ? ".gitignore" : entry);
|
|
123
123
|
if (statSync(srcPath).isDirectory()) copyDirectory(srcPath, destPath, projectName);
|
|
124
124
|
else if (isTextExtension(entry)) {
|
|
125
125
|
let content = readFileSync(srcPath, "utf-8");
|
|
@@ -172,6 +172,182 @@ function scaffoldProject(opts) {
|
|
|
172
172
|
patchWorkspaceDeps(targetDir);
|
|
173
173
|
return { ok: true };
|
|
174
174
|
}
|
|
175
|
+
var projectTypeLabel = (t) => {
|
|
176
|
+
switch (t) {
|
|
177
|
+
case "basic": return "Basic SPA";
|
|
178
|
+
case "ssr": return "SSR";
|
|
179
|
+
case "ssg": return "SSG";
|
|
180
|
+
case "lynx": return "Lynx (Native)";
|
|
181
|
+
}
|
|
182
|
+
};
|
|
183
|
+
var stylingLabel = (s) => {
|
|
184
|
+
switch (s) {
|
|
185
|
+
case "none": return "None";
|
|
186
|
+
case "tailwind": return "Tailwind CSS";
|
|
187
|
+
case "daisyui": return "Tailwind + Daisy UI";
|
|
188
|
+
}
|
|
189
|
+
};
|
|
190
|
+
var StepName = component(({ props }) => () => /* @__PURE__ */ jsxs("box", { children: [
|
|
191
|
+
/* @__PURE__ */ jsx("text", {
|
|
192
|
+
color: "gray",
|
|
193
|
+
children: " Step 1 of 3"
|
|
194
|
+
}),
|
|
195
|
+
/* @__PURE__ */ jsx("br", {}),
|
|
196
|
+
/* @__PURE__ */ jsx("br", {}),
|
|
197
|
+
/* @__PURE__ */ jsx("text", {
|
|
198
|
+
color: "white",
|
|
199
|
+
children: " What is your project called?"
|
|
200
|
+
}),
|
|
201
|
+
/* @__PURE__ */ jsx("br", {}),
|
|
202
|
+
/* @__PURE__ */ jsx("br", {}),
|
|
203
|
+
/* @__PURE__ */ jsx(Input, {
|
|
204
|
+
model: () => props.state.projectName,
|
|
205
|
+
label: " Project Name ",
|
|
206
|
+
placeholder: "my-sigx-app",
|
|
207
|
+
autofocus: true,
|
|
208
|
+
onSubmit: props.onSubmit
|
|
209
|
+
}),
|
|
210
|
+
/* @__PURE__ */ jsx("br", {}),
|
|
211
|
+
/* @__PURE__ */ jsx("text", {
|
|
212
|
+
color: "gray",
|
|
213
|
+
children: " Press Enter to continue"
|
|
214
|
+
})
|
|
215
|
+
] }), { name: "StepName" });
|
|
216
|
+
var StepType = component(({ props }) => () => /* @__PURE__ */ jsxs("box", { children: [
|
|
217
|
+
/* @__PURE__ */ jsx("text", {
|
|
218
|
+
color: "gray",
|
|
219
|
+
children: " Step 2 of 3"
|
|
220
|
+
}),
|
|
221
|
+
/* @__PURE__ */ jsx("br", {}),
|
|
222
|
+
/* @__PURE__ */ jsx("br", {}),
|
|
223
|
+
/* @__PURE__ */ jsx("text", {
|
|
224
|
+
color: "white",
|
|
225
|
+
children: " What type of project?"
|
|
226
|
+
}),
|
|
227
|
+
/* @__PURE__ */ jsx("br", {}),
|
|
228
|
+
/* @__PURE__ */ jsx("br", {}),
|
|
229
|
+
/* @__PURE__ */ jsx(Select, {
|
|
230
|
+
model: () => props.state.projectType,
|
|
231
|
+
label: " Project Type ",
|
|
232
|
+
options: projectTypeOptions,
|
|
233
|
+
showDescription: true,
|
|
234
|
+
autofocus: true,
|
|
235
|
+
onSubmit: props.onSubmit
|
|
236
|
+
}),
|
|
237
|
+
/* @__PURE__ */ jsx("br", {}),
|
|
238
|
+
/* @__PURE__ */ jsx("text", {
|
|
239
|
+
color: "gray",
|
|
240
|
+
children: " ↑/↓ navigate · Enter select"
|
|
241
|
+
})
|
|
242
|
+
] }), { name: "StepType" });
|
|
243
|
+
var StepStyling = component(({ props }) => () => /* @__PURE__ */ jsxs("box", { children: [
|
|
244
|
+
/* @__PURE__ */ jsx("text", {
|
|
245
|
+
color: "gray",
|
|
246
|
+
children: " Step 3 of 3"
|
|
247
|
+
}),
|
|
248
|
+
/* @__PURE__ */ jsx("br", {}),
|
|
249
|
+
/* @__PURE__ */ jsx("br", {}),
|
|
250
|
+
/* @__PURE__ */ jsx("text", {
|
|
251
|
+
color: "white",
|
|
252
|
+
children: " Choose a styling approach:"
|
|
253
|
+
}),
|
|
254
|
+
/* @__PURE__ */ jsx("br", {}),
|
|
255
|
+
/* @__PURE__ */ jsx("br", {}),
|
|
256
|
+
/* @__PURE__ */ jsx(Select, {
|
|
257
|
+
model: () => props.state.styling,
|
|
258
|
+
label: " Styling ",
|
|
259
|
+
options: props.state.projectType === "lynx" ? lynxStylingOptions : webStylingOptions,
|
|
260
|
+
showDescription: true,
|
|
261
|
+
autofocus: true,
|
|
262
|
+
onSubmit: props.onSubmit
|
|
263
|
+
}),
|
|
264
|
+
/* @__PURE__ */ jsx("br", {}),
|
|
265
|
+
/* @__PURE__ */ jsx("text", {
|
|
266
|
+
color: "gray",
|
|
267
|
+
children: " ↑/↓ navigate · Enter select"
|
|
268
|
+
})
|
|
269
|
+
] }), { name: "StepStyling" });
|
|
270
|
+
var StepCreating = component(({ props }) => () => /* @__PURE__ */ jsxs("box", { children: [
|
|
271
|
+
/* @__PURE__ */ jsx("br", {}),
|
|
272
|
+
/* @__PURE__ */ jsx("text", {
|
|
273
|
+
color: "yellow",
|
|
274
|
+
children: " Creating project..."
|
|
275
|
+
}),
|
|
276
|
+
/* @__PURE__ */ jsx("br", {}),
|
|
277
|
+
/* @__PURE__ */ jsx(ProgressBar, {
|
|
278
|
+
value: props.state.progress,
|
|
279
|
+
max: 100,
|
|
280
|
+
width: 40,
|
|
281
|
+
color: "green"
|
|
282
|
+
})
|
|
283
|
+
] }), { name: "StepCreating" });
|
|
284
|
+
var StepDone = component(({ props }) => () => /* @__PURE__ */ jsxs("box", { children: [
|
|
285
|
+
/* @__PURE__ */ jsx("br", {}),
|
|
286
|
+
/* @__PURE__ */ jsxs("text", {
|
|
287
|
+
color: "green",
|
|
288
|
+
children: [
|
|
289
|
+
" ✓ Project \"",
|
|
290
|
+
props.state.projectName,
|
|
291
|
+
"\" created!"
|
|
292
|
+
]
|
|
293
|
+
}),
|
|
294
|
+
/* @__PURE__ */ jsx("br", {}),
|
|
295
|
+
/* @__PURE__ */ jsx("br", {}),
|
|
296
|
+
/* @__PURE__ */ jsxs("text", {
|
|
297
|
+
color: "gray",
|
|
298
|
+
children: [" Type: ", projectTypeLabel(props.state.projectType)]
|
|
299
|
+
}),
|
|
300
|
+
/* @__PURE__ */ jsx("br", {}),
|
|
301
|
+
/* @__PURE__ */ jsxs("text", {
|
|
302
|
+
color: "gray",
|
|
303
|
+
children: [" Styling: ", stylingLabel(props.state.styling)]
|
|
304
|
+
}),
|
|
305
|
+
/* @__PURE__ */ jsx("br", {}),
|
|
306
|
+
/* @__PURE__ */ jsx("br", {}),
|
|
307
|
+
/* @__PURE__ */ jsx("text", {
|
|
308
|
+
color: "white",
|
|
309
|
+
children: " Next steps:"
|
|
310
|
+
}),
|
|
311
|
+
/* @__PURE__ */ jsx("br", {}),
|
|
312
|
+
/* @__PURE__ */ jsx("br", {}),
|
|
313
|
+
/* @__PURE__ */ jsxs("text", {
|
|
314
|
+
color: "cyan",
|
|
315
|
+
children: [" cd ", props.state.projectName]
|
|
316
|
+
}),
|
|
317
|
+
/* @__PURE__ */ jsx("br", {}),
|
|
318
|
+
/* @__PURE__ */ jsx("text", {
|
|
319
|
+
color: "cyan",
|
|
320
|
+
children: " pnpm install"
|
|
321
|
+
}),
|
|
322
|
+
/* @__PURE__ */ jsx("br", {}),
|
|
323
|
+
/* @__PURE__ */ jsxs("text", {
|
|
324
|
+
color: "cyan",
|
|
325
|
+
children: [" ", props.state.projectType === "lynx" ? "sigx dev" : "pnpm dev"]
|
|
326
|
+
}),
|
|
327
|
+
/* @__PURE__ */ jsx("br", {}),
|
|
328
|
+
/* @__PURE__ */ jsx("br", {}),
|
|
329
|
+
/* @__PURE__ */ jsx(Button, {
|
|
330
|
+
label: "Exit",
|
|
331
|
+
onClick: props.onExit
|
|
332
|
+
})
|
|
333
|
+
] }), { name: "StepDone" });
|
|
334
|
+
var ErrorScreen = component(({ props }) => () => /* @__PURE__ */ jsxs("box", {
|
|
335
|
+
border: "double",
|
|
336
|
+
borderColor: "red",
|
|
337
|
+
label: " Error ",
|
|
338
|
+
children: [
|
|
339
|
+
/* @__PURE__ */ jsxs("text", {
|
|
340
|
+
color: "red",
|
|
341
|
+
children: [" ", props.message]
|
|
342
|
+
}),
|
|
343
|
+
/* @__PURE__ */ jsx("br", {}),
|
|
344
|
+
/* @__PURE__ */ jsx("br", {}),
|
|
345
|
+
/* @__PURE__ */ jsx(Button, {
|
|
346
|
+
label: "Exit",
|
|
347
|
+
onClick: props.onExit
|
|
348
|
+
})
|
|
349
|
+
]
|
|
350
|
+
}), { name: "ErrorScreen" });
|
|
175
351
|
var CreateSigx = component(() => {
|
|
176
352
|
const state = signal({
|
|
177
353
|
step: "name",
|
|
@@ -209,193 +385,37 @@ var CreateSigx = component(() => {
|
|
|
209
385
|
process.exit(0);
|
|
210
386
|
};
|
|
211
387
|
return () => {
|
|
212
|
-
if (state.error) return /* @__PURE__ */
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
label: " Error ",
|
|
216
|
-
children: [
|
|
217
|
-
/* @__PURE__ */ jsxs("text", {
|
|
218
|
-
color: "red",
|
|
219
|
-
children: [" ", state.error]
|
|
220
|
-
}),
|
|
221
|
-
/* @__PURE__ */ jsx("br", {}),
|
|
222
|
-
/* @__PURE__ */ jsx("br", {}),
|
|
223
|
-
/* @__PURE__ */ jsx(Button, {
|
|
224
|
-
label: "Exit",
|
|
225
|
-
onClick: handleExit
|
|
226
|
-
})
|
|
227
|
-
]
|
|
388
|
+
if (state.error) return /* @__PURE__ */ jsx(ErrorScreen, {
|
|
389
|
+
message: state.error,
|
|
390
|
+
onExit: handleExit
|
|
228
391
|
});
|
|
229
|
-
const projectTypeLabel = (t) => {
|
|
230
|
-
switch (t) {
|
|
231
|
-
case "basic": return "Basic SPA";
|
|
232
|
-
case "ssr": return "SSR";
|
|
233
|
-
case "ssg": return "SSG";
|
|
234
|
-
case "lynx": return "Lynx (Native)";
|
|
235
|
-
}
|
|
236
|
-
};
|
|
237
|
-
const stylingLabel = (s) => {
|
|
238
|
-
switch (s) {
|
|
239
|
-
case "none": return "None";
|
|
240
|
-
case "tailwind": return "Tailwind CSS";
|
|
241
|
-
case "daisyui": return "Tailwind + Daisy UI";
|
|
242
|
-
}
|
|
243
|
-
};
|
|
244
|
-
const stepContent = (() => {
|
|
245
|
-
switch (state.step) {
|
|
246
|
-
case "name": return /* @__PURE__ */ jsxs("box", { children: [
|
|
247
|
-
/* @__PURE__ */ jsx("text", {
|
|
248
|
-
color: "gray",
|
|
249
|
-
children: " Step 1 of 3"
|
|
250
|
-
}),
|
|
251
|
-
/* @__PURE__ */ jsx("br", {}),
|
|
252
|
-
/* @__PURE__ */ jsx("br", {}),
|
|
253
|
-
/* @__PURE__ */ jsx("text", {
|
|
254
|
-
color: "white",
|
|
255
|
-
children: " What is your project called?"
|
|
256
|
-
}),
|
|
257
|
-
/* @__PURE__ */ jsx("br", {}),
|
|
258
|
-
/* @__PURE__ */ jsx("br", {}),
|
|
259
|
-
/* @__PURE__ */ jsx(Input, {
|
|
260
|
-
model: () => state.projectName,
|
|
261
|
-
label: " Project Name ",
|
|
262
|
-
placeholder: "my-sigx-app",
|
|
263
|
-
autofocus: true,
|
|
264
|
-
onSubmit: handleNameSubmit
|
|
265
|
-
}),
|
|
266
|
-
/* @__PURE__ */ jsx("br", {}),
|
|
267
|
-
/* @__PURE__ */ jsx("text", {
|
|
268
|
-
color: "gray",
|
|
269
|
-
children: " Press Enter to continue"
|
|
270
|
-
})
|
|
271
|
-
] });
|
|
272
|
-
case "type": return /* @__PURE__ */ jsxs("box", { children: [
|
|
273
|
-
/* @__PURE__ */ jsx("text", {
|
|
274
|
-
color: "gray",
|
|
275
|
-
children: " Step 2 of 3"
|
|
276
|
-
}),
|
|
277
|
-
/* @__PURE__ */ jsx("br", {}),
|
|
278
|
-
/* @__PURE__ */ jsx("br", {}),
|
|
279
|
-
/* @__PURE__ */ jsx("text", {
|
|
280
|
-
color: "white",
|
|
281
|
-
children: " What type of project?"
|
|
282
|
-
}),
|
|
283
|
-
/* @__PURE__ */ jsx("br", {}),
|
|
284
|
-
/* @__PURE__ */ jsx("br", {}),
|
|
285
|
-
/* @__PURE__ */ jsx(Select, {
|
|
286
|
-
model: () => state.projectType,
|
|
287
|
-
label: " Project Type ",
|
|
288
|
-
options: projectTypeOptions,
|
|
289
|
-
showDescription: true,
|
|
290
|
-
autofocus: true,
|
|
291
|
-
onSubmit: handleTypeSubmit
|
|
292
|
-
}),
|
|
293
|
-
/* @__PURE__ */ jsx("br", {}),
|
|
294
|
-
/* @__PURE__ */ jsx("text", {
|
|
295
|
-
color: "gray",
|
|
296
|
-
children: " ↑/↓ navigate · Enter select"
|
|
297
|
-
})
|
|
298
|
-
] });
|
|
299
|
-
case "styling": return /* @__PURE__ */ jsxs("box", { children: [
|
|
300
|
-
/* @__PURE__ */ jsx("text", {
|
|
301
|
-
color: "gray",
|
|
302
|
-
children: " Step 3 of 3"
|
|
303
|
-
}),
|
|
304
|
-
/* @__PURE__ */ jsx("br", {}),
|
|
305
|
-
/* @__PURE__ */ jsx("br", {}),
|
|
306
|
-
/* @__PURE__ */ jsx("text", {
|
|
307
|
-
color: "white",
|
|
308
|
-
children: " Choose a styling approach:"
|
|
309
|
-
}),
|
|
310
|
-
/* @__PURE__ */ jsx("br", {}),
|
|
311
|
-
/* @__PURE__ */ jsx("br", {}),
|
|
312
|
-
/* @__PURE__ */ jsx(Select, {
|
|
313
|
-
model: () => state.styling,
|
|
314
|
-
label: " Styling ",
|
|
315
|
-
options: state.projectType === "lynx" ? lynxStylingOptions : webStylingOptions,
|
|
316
|
-
showDescription: true,
|
|
317
|
-
autofocus: true,
|
|
318
|
-
onSubmit: handleStylingSubmit
|
|
319
|
-
}),
|
|
320
|
-
/* @__PURE__ */ jsx("br", {}),
|
|
321
|
-
/* @__PURE__ */ jsx("text", {
|
|
322
|
-
color: "gray",
|
|
323
|
-
children: " ↑/↓ navigate · Enter select"
|
|
324
|
-
})
|
|
325
|
-
] });
|
|
326
|
-
case "creating": return /* @__PURE__ */ jsxs("box", { children: [
|
|
327
|
-
/* @__PURE__ */ jsx("br", {}),
|
|
328
|
-
/* @__PURE__ */ jsx("text", {
|
|
329
|
-
color: "yellow",
|
|
330
|
-
children: " Creating project..."
|
|
331
|
-
}),
|
|
332
|
-
/* @__PURE__ */ jsx("br", {}),
|
|
333
|
-
/* @__PURE__ */ jsx(ProgressBar, {
|
|
334
|
-
value: state.progress,
|
|
335
|
-
max: 100,
|
|
336
|
-
width: 40,
|
|
337
|
-
color: "green"
|
|
338
|
-
})
|
|
339
|
-
] });
|
|
340
|
-
case "done": return /* @__PURE__ */ jsxs("box", { children: [
|
|
341
|
-
/* @__PURE__ */ jsx("br", {}),
|
|
342
|
-
/* @__PURE__ */ jsxs("text", {
|
|
343
|
-
color: "green",
|
|
344
|
-
children: [
|
|
345
|
-
" ✓ Project \"",
|
|
346
|
-
state.projectName,
|
|
347
|
-
"\" created!"
|
|
348
|
-
]
|
|
349
|
-
}),
|
|
350
|
-
/* @__PURE__ */ jsx("br", {}),
|
|
351
|
-
/* @__PURE__ */ jsx("br", {}),
|
|
352
|
-
/* @__PURE__ */ jsxs("text", {
|
|
353
|
-
color: "gray",
|
|
354
|
-
children: [" Type: ", projectTypeLabel(state.projectType)]
|
|
355
|
-
}),
|
|
356
|
-
/* @__PURE__ */ jsx("br", {}),
|
|
357
|
-
/* @__PURE__ */ jsxs("text", {
|
|
358
|
-
color: "gray",
|
|
359
|
-
children: [" Styling: ", stylingLabel(state.styling)]
|
|
360
|
-
}),
|
|
361
|
-
/* @__PURE__ */ jsx("br", {}),
|
|
362
|
-
/* @__PURE__ */ jsx("br", {}),
|
|
363
|
-
/* @__PURE__ */ jsx("text", {
|
|
364
|
-
color: "white",
|
|
365
|
-
children: " Next steps:"
|
|
366
|
-
}),
|
|
367
|
-
/* @__PURE__ */ jsx("br", {}),
|
|
368
|
-
/* @__PURE__ */ jsx("br", {}),
|
|
369
|
-
/* @__PURE__ */ jsxs("text", {
|
|
370
|
-
color: "cyan",
|
|
371
|
-
children: [" cd ", state.projectName]
|
|
372
|
-
}),
|
|
373
|
-
/* @__PURE__ */ jsx("br", {}),
|
|
374
|
-
/* @__PURE__ */ jsx("text", {
|
|
375
|
-
color: "cyan",
|
|
376
|
-
children: " pnpm install"
|
|
377
|
-
}),
|
|
378
|
-
/* @__PURE__ */ jsx("br", {}),
|
|
379
|
-
/* @__PURE__ */ jsxs("text", {
|
|
380
|
-
color: "cyan",
|
|
381
|
-
children: [" ", state.projectType === "lynx" ? "sigx dev" : "pnpm dev"]
|
|
382
|
-
}),
|
|
383
|
-
/* @__PURE__ */ jsx("br", {}),
|
|
384
|
-
/* @__PURE__ */ jsx("br", {}),
|
|
385
|
-
/* @__PURE__ */ jsx(Button, {
|
|
386
|
-
label: "Exit",
|
|
387
|
-
onClick: handleExit
|
|
388
|
-
})
|
|
389
|
-
] });
|
|
390
|
-
}
|
|
391
|
-
})();
|
|
392
392
|
return /* @__PURE__ */ jsxs("box", { children: [
|
|
393
393
|
/* @__PURE__ */ jsx("text", {
|
|
394
394
|
color: "cyan",
|
|
395
395
|
children: " ⚡ Create SignalX App"
|
|
396
396
|
}),
|
|
397
397
|
/* @__PURE__ */ jsx("br", {}),
|
|
398
|
-
|
|
398
|
+
(() => {
|
|
399
|
+
switch (state.step) {
|
|
400
|
+
case "name": return /* @__PURE__ */ jsx(StepName, {
|
|
401
|
+
state,
|
|
402
|
+
onSubmit: handleNameSubmit
|
|
403
|
+
});
|
|
404
|
+
case "type": return /* @__PURE__ */ jsx(StepType, {
|
|
405
|
+
state,
|
|
406
|
+
onSubmit: handleTypeSubmit
|
|
407
|
+
});
|
|
408
|
+
case "styling": return /* @__PURE__ */ jsx(StepStyling, {
|
|
409
|
+
state,
|
|
410
|
+
onSubmit: handleStylingSubmit
|
|
411
|
+
});
|
|
412
|
+
case "creating": return /* @__PURE__ */ jsx(StepCreating, { state });
|
|
413
|
+
case "done": return /* @__PURE__ */ jsx(StepDone, {
|
|
414
|
+
state,
|
|
415
|
+
onExit: handleExit
|
|
416
|
+
});
|
|
417
|
+
}
|
|
418
|
+
})()
|
|
399
419
|
] });
|
|
400
420
|
};
|
|
401
421
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.js","names":[],"sources":["../../src/commands/create.tsx"],"sourcesContent":["/** @jsxImportSource @sigx/terminal */\nimport { signal, component, defineApp, Input, Button, ProgressBar, Select } from '@sigx/terminal';\nimport { existsSync, mkdirSync, readdirSync, statSync, writeFileSync, readFileSync } from 'fs';\nimport { dirname, resolve, join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\ntype Step = 'name' | 'type' | 'styling' | 'creating' | 'done';\ntype ProjectType = 'basic' | 'ssr' | 'ssg' | 'lynx';\ntype Styling = 'none' | 'tailwind' | 'daisyui';\n\n// Parse CLI args (supports both interactive default and --flag headless mode).\nconst rawArgs = process.argv.slice(2);\nfunction getFlag(name: string): string | undefined {\n const eq = rawArgs.find(a => a.startsWith(`--${name}=`));\n if (eq) return eq.slice(name.length + 3);\n const idx = rawArgs.indexOf(`--${name}`);\n if (idx !== -1 && rawArgs[idx + 1] && !rawArgs[idx + 1].startsWith('-')) return rawArgs[idx + 1];\n return undefined;\n}\nfunction hasFlag(name: string, short?: string): boolean {\n return rawArgs.includes(`--${name}`) || (short ? rawArgs.includes(`-${short}`) : false);\n}\nconst positionalArgs = rawArgs.filter(a => !a.startsWith('-') && a !== 'create');\nconst argProjectName = positionalArgs[0] || '';\nconst argType = getFlag('type') as ProjectType | undefined;\nconst argStyling = getFlag('styling') as Styling | undefined;\nconst flagYes = hasFlag('yes', 'y');\nconst isNonInteractive = !process.stdout.isTTY || !process.stdin.isTTY || flagYes\n || Boolean(argType && argProjectName);\n\nconst projectTypeOptions = [\n { value: 'basic' as ProjectType, label: 'Basic SPA', description: 'Simple single-page application (web)' },\n { value: 'ssr' as ProjectType, label: 'SSR', description: 'Server-side rendering with Express (web)' },\n { value: 'ssg' as ProjectType, label: 'SSG', description: 'Static site with file-based routing & MDX (web)' },\n { value: 'lynx' as ProjectType, label: 'Lynx', description: 'Native mobile app with Lynx runtime' },\n];\n\nconst webStylingOptions = [\n { value: 'none' as Styling, label: 'None', description: 'No CSS framework' },\n { value: 'tailwind' as Styling, label: 'Tailwind CSS', description: 'Utility-first CSS framework' },\n { value: 'daisyui' as Styling, label: 'Tailwind + Daisy UI', description: 'Tailwind with component library' },\n];\n\nconst lynxStylingOptions = [\n { value: 'none' as Styling, label: 'None', description: 'No CSS framework' },\n { value: 'tailwind' as Styling, label: 'Tailwind CSS', description: 'Tailwind with Lynx preset' },\n { value: 'daisyui' as Styling, label: 'Tailwind + Daisy UI', description: 'Lynx + @sigx/lynx-daisyui components' },\n];\n\nconst TEXT_EXTS = new Set([\n 'ts', 'tsx', 'js', 'jsx', 'mjs', 'cjs', 'mts', 'cts',\n 'json', 'json5', 'jsonc',\n 'md', 'mdx', 'txt',\n 'html', 'htm', 'css', 'scss', 'sass', 'less',\n 'yml', 'yaml', 'toml', 'xml', 'svg',\n 'gitignore', 'gitattributes', 'editorconfig', 'npmrc', 'nvmrc', 'env',\n]);\n\nfunction isTextExtension(filename: string): boolean {\n // Dotfiles: name after leading dot (.gitignore → \"gitignore\").\n const ext = filename.startsWith('.')\n ? filename.slice(1).toLowerCase()\n : filename.split('.').pop()?.toLowerCase() ?? '';\n return TEXT_EXTS.has(ext);\n}\n\nfunction copyDirectory(src: string, dest: string, projectName: string) {\n if (!existsSync(dest)) {\n mkdirSync(dest, { recursive: true });\n }\n\n const entries = readdirSync(src);\n for (const entry of entries) {\n const srcPath = join(src, entry);\n const destPath = join(dest, entry);\n const stat = statSync(srcPath);\n\n if (stat.isDirectory()) {\n copyDirectory(srcPath, destPath, projectName);\n } else if (isTextExtension(entry)) {\n let content = readFileSync(srcPath, 'utf-8');\n content = content.replace(/\\{\\{projectName\\}\\}/g, projectName);\n writeFileSync(destPath, content);\n } else {\n // Binary asset — copy bytes verbatim. Reading as UTF-8 would corrupt\n // non-ASCII bytes (e.g. PNG magic 0x89 → U+FFFD).\n writeFileSync(destPath, readFileSync(srcPath));\n }\n }\n}\n\n/**\n * Detect if the target directory is inside a pnpm workspace that includes @sigx packages.\n * If so, rewrite @sigx/* dependency versions to workspace:* in package.json.\n */\nfunction patchWorkspaceDeps(targetDir: string) {\n const pkgPath = join(targetDir, 'package.json');\n if (!existsSync(pkgPath)) return;\n\n // Walk up to find pnpm-workspace.yaml\n let dir = dirname(targetDir);\n let isWorkspace = false;\n for (let i = 0; i < 10; i++) {\n if (existsSync(join(dir, 'pnpm-workspace.yaml'))) {\n isWorkspace = true;\n break;\n }\n const parent = dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n if (!isWorkspace) return;\n\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));\n for (const section of ['dependencies', 'devDependencies'] as const) {\n if (!pkg[section]) continue;\n for (const dep of Object.keys(pkg[section])) {\n if (dep.startsWith('@sigx/')) {\n pkg[section][dep] = 'workspace:*';\n }\n }\n }\n writeFileSync(pkgPath, JSON.stringify(pkg, null, 4) + '\\n');\n}\n\nfunction scaffoldProject(opts: {\n projectName: string;\n projectType: ProjectType;\n styling: Styling;\n}): { ok: true } | { ok: false; error: string } {\n const targetDir = resolve(process.cwd(), opts.projectName);\n let templateName: string;\n if (opts.projectType === 'lynx') {\n templateName = opts.styling !== 'none' ? `lynx-${opts.styling}` : 'lynx';\n } else {\n templateName = opts.styling !== 'none' ? `${opts.projectType}-${opts.styling}` : opts.projectType;\n }\n const templateDir = resolve(__dirname, '..', 'templates', templateName);\n if (existsSync(targetDir)) return { ok: false, error: `Directory \"${opts.projectName}\" already exists!` };\n if (!existsSync(templateDir)) return { ok: false, error: `Template \"${templateName}\" not found at ${templateDir}` };\n copyDirectory(templateDir, targetDir, opts.projectName);\n patchWorkspaceDeps(targetDir);\n return { ok: true };\n}\n\nconst CreateSigx = component(() => {\n const state = signal({\n step: 'name' as Step,\n projectName: argProjectName || 'my-sigx-app',\n projectType: 'basic' as ProjectType,\n styling: 'none' as Styling,\n progress: 0,\n error: '',\n });\n\n const createProject = () => {\n state.step = 'creating';\n state.progress = 30;\n const result = scaffoldProject({\n projectName: state.projectName,\n projectType: state.projectType,\n styling: state.styling,\n });\n if (!result.ok) {\n state.error = result.error;\n return;\n }\n state.progress = 100;\n state.step = 'done';\n };\n\n const handleNameSubmit = () => {\n if (state.projectName.trim()) {\n state.step = 'type';\n }\n };\n\n const handleTypeSubmit = () => {\n state.step = 'styling';\n };\n\n const handleStylingSubmit = () => {\n createProject();\n };\n\n const handleExit = () => {\n process.exit(0);\n };\n\n return () => {\n if (state.error) {\n return (\n <box border=\"double\" borderColor=\"red\" label=\" Error \">\n <text color=\"red\"> {state.error}</text>\n <br />\n <br />\n <Button label=\"Exit\" onClick={handleExit} />\n </box>\n );\n }\n\n const projectTypeLabel = (t: ProjectType) => {\n switch (t) {\n case 'basic': return 'Basic SPA';\n case 'ssr': return 'SSR';\n case 'ssg': return 'SSG';\n case 'lynx': return 'Lynx (Native)';\n }\n };\n\n const stylingLabel = (s: Styling) => {\n switch (s) {\n case 'none': return 'None';\n case 'tailwind': return 'Tailwind CSS';\n case 'daisyui': return 'Tailwind + Daisy UI';\n }\n };\n\n // Render step-specific content as a single element to avoid\n // multiple conditional children causing duplicate nodes\n const stepContent = (() => {\n switch (state.step) {\n case 'name':\n return (\n <box>\n <text color=\"gray\"> Step 1 of 3</text>\n <br />\n <br />\n <text color=\"white\"> What is your project called?</text>\n <br />\n <br />\n <Input\n model={() => state.projectName}\n label=\" Project Name \"\n placeholder=\"my-sigx-app\"\n autofocus\n onSubmit={handleNameSubmit}\n />\n <br />\n <text color=\"gray\"> Press Enter to continue</text>\n </box>\n );\n case 'type':\n return (\n <box>\n <text color=\"gray\"> Step 2 of 3</text>\n <br />\n <br />\n <text color=\"white\"> What type of project?</text>\n <br />\n <br />\n <Select\n model={() => state.projectType}\n label=\" Project Type \"\n options={projectTypeOptions}\n showDescription\n autofocus\n onSubmit={handleTypeSubmit}\n />\n <br />\n <text color=\"gray\"> ↑/↓ navigate · Enter select</text>\n </box>\n );\n case 'styling':\n return (\n <box>\n <text color=\"gray\"> Step 3 of 3</text>\n <br />\n <br />\n <text color=\"white\"> Choose a styling approach:</text>\n <br />\n <br />\n <Select\n model={() => state.styling}\n label=\" Styling \"\n options={state.projectType === 'lynx' ? lynxStylingOptions : webStylingOptions}\n showDescription\n autofocus\n onSubmit={handleStylingSubmit}\n />\n <br />\n <text color=\"gray\"> ↑/↓ navigate · Enter select</text>\n </box>\n );\n case 'creating':\n return (\n <box>\n <br />\n <text color=\"yellow\"> Creating project...</text>\n <br />\n <ProgressBar value={state.progress} max={100} width={40} color=\"green\" />\n </box>\n );\n case 'done':\n return (\n <box>\n <br />\n <text color=\"green\"> ✓ Project \"{state.projectName}\" created!</text>\n <br />\n <br />\n <text color=\"gray\"> Type: {projectTypeLabel(state.projectType)}</text>\n <br />\n <text color=\"gray\"> Styling: {stylingLabel(state.styling)}</text>\n <br />\n <br />\n <text color=\"white\"> Next steps:</text>\n <br />\n <br />\n <text color=\"cyan\"> cd {state.projectName}</text>\n <br />\n <text color=\"cyan\"> pnpm install</text>\n <br />\n <text color=\"cyan\"> {state.projectType === 'lynx' ? 'sigx dev' : 'pnpm dev'}</text>\n <br />\n <br />\n <Button label=\"Exit\" onClick={handleExit} />\n </box>\n );\n }\n })();\n\n return (\n <box>\n <text color=\"cyan\"> ⚡ Create SignalX App</text>\n <br />\n {stepContent}\n </box>\n );\n };\n});\n\nfunction runHeadless(): number {\n const validTypes: ProjectType[] = ['basic', 'ssr', 'ssg', 'lynx'];\n const validStyling: Styling[] = ['none', 'tailwind', 'daisyui'];\n\n const projectName = argProjectName || 'my-sigx-app';\n const projectType: ProjectType = argType ?? 'basic';\n const styling: Styling = argStyling ?? 'none';\n\n if (!validTypes.includes(projectType)) {\n console.error(`Error: --type must be one of ${validTypes.join(', ')}`);\n return 2;\n }\n if (!validStyling.includes(styling)) {\n console.error(`Error: --styling must be one of ${validStyling.join(', ')}`);\n return 2;\n }\n\n console.log(`\\n ⚡ Creating SignalX app \"${projectName}\"`);\n console.log(` type: ${projectType}`);\n console.log(` styling: ${styling}\\n`);\n\n const result = scaffoldProject({ projectName, projectType, styling });\n if (!result.ok) {\n console.error(`Error: ${result.error}`);\n return 1;\n }\n\n console.log(` ✓ Project created\\n`);\n console.log(` Next steps:`);\n console.log(` cd ${projectName}`);\n console.log(` pnpm install`);\n console.log(` ${projectType === 'lynx' ? 'sigx dev' : 'pnpm dev'}\\n`);\n return 0;\n}\n\nexport function runCreate() {\n if (isNonInteractive) {\n process.exit(runHeadless());\n }\n defineApp(<CreateSigx />).mount({ clearConsole: true });\n // Keep process alive for TUI\n setInterval(() => { }, 10000);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"create.js","names":[],"sources":["../../src/commands/create.tsx"],"sourcesContent":["/** @jsxImportSource @sigx/terminal */\nimport { signal, component, defineApp, Input, Button, ProgressBar, Select, type Define } from '@sigx/terminal';\nimport { existsSync, mkdirSync, readdirSync, statSync, writeFileSync, readFileSync } from 'fs';\nimport { dirname, resolve, join } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\ntype Step = 'name' | 'type' | 'styling' | 'creating' | 'done';\ntype ProjectType = 'basic' | 'ssr' | 'ssg' | 'lynx';\ntype Styling = 'none' | 'tailwind' | 'daisyui';\n\n// Parse CLI args (supports both interactive default and --flag headless mode).\nconst rawArgs = process.argv.slice(2);\nfunction getFlag(name: string): string | undefined {\n const eq = rawArgs.find(a => a.startsWith(`--${name}=`));\n if (eq) return eq.slice(name.length + 3);\n const idx = rawArgs.indexOf(`--${name}`);\n if (idx !== -1 && rawArgs[idx + 1] && !rawArgs[idx + 1].startsWith('-')) return rawArgs[idx + 1];\n return undefined;\n}\nfunction hasFlag(name: string, short?: string): boolean {\n return rawArgs.includes(`--${name}`) || (short ? rawArgs.includes(`-${short}`) : false);\n}\nconst positionalArgs = rawArgs.filter(a => !a.startsWith('-') && a !== 'create');\nconst argProjectName = positionalArgs[0] || '';\nconst argType = getFlag('type') as ProjectType | undefined;\nconst argStyling = getFlag('styling') as Styling | undefined;\nconst flagYes = hasFlag('yes', 'y');\nconst isNonInteractive = !process.stdout.isTTY || !process.stdin.isTTY || flagYes\n || Boolean(argType && argProjectName);\n\nconst projectTypeOptions = [\n { value: 'basic' as ProjectType, label: 'Basic SPA', description: 'Simple single-page application (web)' },\n { value: 'ssr' as ProjectType, label: 'SSR', description: 'Server-side rendering with Express (web)' },\n { value: 'ssg' as ProjectType, label: 'SSG', description: 'Static site with file-based routing & MDX (web)' },\n { value: 'lynx' as ProjectType, label: 'Lynx', description: 'Native mobile app with Lynx runtime' },\n];\n\nconst webStylingOptions = [\n { value: 'none' as Styling, label: 'None', description: 'No CSS framework' },\n { value: 'tailwind' as Styling, label: 'Tailwind CSS', description: 'Utility-first CSS framework' },\n { value: 'daisyui' as Styling, label: 'Tailwind + Daisy UI', description: 'Tailwind with component library' },\n];\n\nconst lynxStylingOptions = [\n { value: 'none' as Styling, label: 'None', description: 'No CSS framework' },\n { value: 'tailwind' as Styling, label: 'Tailwind CSS', description: 'Tailwind with Lynx preset' },\n { value: 'daisyui' as Styling, label: 'Tailwind + Daisy UI', description: 'Lynx + @sigx/lynx-daisyui components' },\n];\n\nconst TEXT_EXTS = new Set([\n 'ts', 'tsx', 'js', 'jsx', 'mjs', 'cjs', 'mts', 'cts',\n 'json', 'json5', 'jsonc',\n 'md', 'mdx', 'txt',\n 'html', 'htm', 'css', 'scss', 'sass', 'less',\n 'yml', 'yaml', 'toml', 'xml', 'svg',\n 'gitignore', 'gitattributes', 'editorconfig', 'npmrc', 'nvmrc', 'env',\n]);\n\nfunction isTextExtension(filename: string): boolean {\n // Dotfiles: name after leading dot (.gitignore → \"gitignore\").\n const ext = filename.startsWith('.')\n ? filename.slice(1).toLowerCase()\n : filename.split('.').pop()?.toLowerCase() ?? '';\n return TEXT_EXTS.has(ext);\n}\n\nfunction copyDirectory(src: string, dest: string, projectName: string) {\n if (!existsSync(dest)) {\n mkdirSync(dest, { recursive: true });\n }\n\n const entries = readdirSync(src);\n for (const entry of entries) {\n const srcPath = join(src, entry);\n // Templates ship `gitignore` (no leading dot) because npm strips\n // `.gitignore` from the published tarball. Rename on copy so the\n // generated project has a real `.gitignore`.\n const destName = entry === 'gitignore' ? '.gitignore' : entry;\n const destPath = join(dest, destName);\n const stat = statSync(srcPath);\n\n if (stat.isDirectory()) {\n copyDirectory(srcPath, destPath, projectName);\n } else if (isTextExtension(entry)) {\n let content = readFileSync(srcPath, 'utf-8');\n content = content.replace(/\\{\\{projectName\\}\\}/g, projectName);\n writeFileSync(destPath, content);\n } else {\n // Binary asset — copy bytes verbatim. Reading as UTF-8 would corrupt\n // non-ASCII bytes (e.g. PNG magic 0x89 → U+FFFD).\n writeFileSync(destPath, readFileSync(srcPath));\n }\n }\n}\n\n/**\n * Detect if the target directory is inside a pnpm workspace that includes @sigx packages.\n * If so, rewrite @sigx/* dependency versions to workspace:* in package.json.\n */\nfunction patchWorkspaceDeps(targetDir: string) {\n const pkgPath = join(targetDir, 'package.json');\n if (!existsSync(pkgPath)) return;\n\n // Walk up to find pnpm-workspace.yaml\n let dir = dirname(targetDir);\n let isWorkspace = false;\n for (let i = 0; i < 10; i++) {\n if (existsSync(join(dir, 'pnpm-workspace.yaml'))) {\n isWorkspace = true;\n break;\n }\n const parent = dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n if (!isWorkspace) return;\n\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));\n for (const section of ['dependencies', 'devDependencies'] as const) {\n if (!pkg[section]) continue;\n for (const dep of Object.keys(pkg[section])) {\n if (dep.startsWith('@sigx/')) {\n pkg[section][dep] = 'workspace:*';\n }\n }\n }\n writeFileSync(pkgPath, JSON.stringify(pkg, null, 4) + '\\n');\n}\n\nfunction scaffoldProject(opts: {\n projectName: string;\n projectType: ProjectType;\n styling: Styling;\n}): { ok: true } | { ok: false; error: string } {\n const targetDir = resolve(process.cwd(), opts.projectName);\n let templateName: string;\n if (opts.projectType === 'lynx') {\n templateName = opts.styling !== 'none' ? `lynx-${opts.styling}` : 'lynx';\n } else {\n templateName = opts.styling !== 'none' ? `${opts.projectType}-${opts.styling}` : opts.projectType;\n }\n const templateDir = resolve(__dirname, '..', 'templates', templateName);\n if (existsSync(targetDir)) return { ok: false, error: `Directory \"${opts.projectName}\" already exists!` };\n if (!existsSync(templateDir)) return { ok: false, error: `Template \"${templateName}\" not found at ${templateDir}` };\n copyDirectory(templateDir, targetDir, opts.projectName);\n patchWorkspaceDeps(targetDir);\n return { ok: true };\n}\n\ntype CreateState = {\n step: Step;\n projectName: string;\n projectType: ProjectType;\n styling: Styling;\n progress: number;\n error: string;\n};\n\nconst projectTypeLabel = (t: ProjectType): string => {\n switch (t) {\n case 'basic': return 'Basic SPA';\n case 'ssr': return 'SSR';\n case 'ssg': return 'SSG';\n case 'lynx': return 'Lynx (Native)';\n }\n};\n\nconst stylingLabel = (s: Styling): string => {\n switch (s) {\n case 'none': return 'None';\n case 'tailwind': return 'Tailwind CSS';\n case 'daisyui': return 'Tailwind + Daisy UI';\n }\n};\n\n// Each step is its own component so the reconciler sees a different\n// component type at the step slot on every transition. That forces a\n// clean unmount/remount of the focusable inside (Input/Select/Button),\n// which avoids the previous step's key handler lingering and re-firing\n// the submit chain on the next Enter press.\n\nconst StepName = component<\n Define.Prop<\"state\", CreateState, true> &\n Define.Prop<\"onSubmit\", () => void, true>\n>(({ props }) => () => (\n <box>\n <text color=\"gray\"> Step 1 of 3</text>\n <br />\n <br />\n <text color=\"white\"> What is your project called?</text>\n <br />\n <br />\n <Input\n model={() => props.state.projectName}\n label=\" Project Name \"\n placeholder=\"my-sigx-app\"\n autofocus\n onSubmit={props.onSubmit}\n />\n <br />\n <text color=\"gray\"> Press Enter to continue</text>\n </box>\n), { name: 'StepName' });\n\nconst StepType = component<\n Define.Prop<\"state\", CreateState, true> &\n Define.Prop<\"onSubmit\", () => void, true>\n>(({ props }) => () => (\n <box>\n <text color=\"gray\"> Step 2 of 3</text>\n <br />\n <br />\n <text color=\"white\"> What type of project?</text>\n <br />\n <br />\n <Select\n model={() => props.state.projectType}\n label=\" Project Type \"\n options={projectTypeOptions}\n showDescription\n autofocus\n onSubmit={props.onSubmit}\n />\n <br />\n <text color=\"gray\"> ↑/↓ navigate · Enter select</text>\n </box>\n), { name: 'StepType' });\n\nconst StepStyling = component<\n Define.Prop<\"state\", CreateState, true> &\n Define.Prop<\"onSubmit\", () => void, true>\n>(({ props }) => () => (\n <box>\n <text color=\"gray\"> Step 3 of 3</text>\n <br />\n <br />\n <text color=\"white\"> Choose a styling approach:</text>\n <br />\n <br />\n <Select\n model={() => props.state.styling}\n label=\" Styling \"\n options={props.state.projectType === 'lynx' ? lynxStylingOptions : webStylingOptions}\n showDescription\n autofocus\n onSubmit={props.onSubmit}\n />\n <br />\n <text color=\"gray\"> ↑/↓ navigate · Enter select</text>\n </box>\n), { name: 'StepStyling' });\n\nconst StepCreating = component<\n Define.Prop<\"state\", CreateState, true>\n>(({ props }) => () => (\n <box>\n <br />\n <text color=\"yellow\"> Creating project...</text>\n <br />\n <ProgressBar value={props.state.progress} max={100} width={40} color=\"green\" />\n </box>\n), { name: 'StepCreating' });\n\nconst StepDone = component<\n Define.Prop<\"state\", CreateState, true> &\n Define.Prop<\"onExit\", () => void, true>\n>(({ props }) => () => (\n <box>\n <br />\n <text color=\"green\"> ✓ Project \"{props.state.projectName}\" created!</text>\n <br />\n <br />\n <text color=\"gray\"> Type: {projectTypeLabel(props.state.projectType)}</text>\n <br />\n <text color=\"gray\"> Styling: {stylingLabel(props.state.styling)}</text>\n <br />\n <br />\n <text color=\"white\"> Next steps:</text>\n <br />\n <br />\n <text color=\"cyan\"> cd {props.state.projectName}</text>\n <br />\n <text color=\"cyan\"> pnpm install</text>\n <br />\n <text color=\"cyan\"> {props.state.projectType === 'lynx' ? 'sigx dev' : 'pnpm dev'}</text>\n <br />\n <br />\n <Button label=\"Exit\" onClick={props.onExit} />\n </box>\n), { name: 'StepDone' });\n\nconst ErrorScreen = component<\n Define.Prop<\"message\", string, true> &\n Define.Prop<\"onExit\", () => void, true>\n>(({ props }) => () => (\n <box border=\"double\" borderColor=\"red\" label=\" Error \">\n <text color=\"red\"> {props.message}</text>\n <br />\n <br />\n <Button label=\"Exit\" onClick={props.onExit} />\n </box>\n), { name: 'ErrorScreen' });\n\nconst CreateSigx = component(() => {\n const state = signal<CreateState>({\n step: 'name' as Step,\n projectName: argProjectName || 'my-sigx-app',\n projectType: 'basic' as ProjectType,\n styling: 'none' as Styling,\n progress: 0,\n error: '',\n });\n\n const createProject = () => {\n state.step = 'creating';\n state.progress = 30;\n const result = scaffoldProject({\n projectName: state.projectName,\n projectType: state.projectType,\n styling: state.styling,\n });\n if (!result.ok) {\n state.error = result.error;\n return;\n }\n state.progress = 100;\n state.step = 'done';\n };\n\n const handleNameSubmit = () => {\n if (state.projectName.trim()) {\n state.step = 'type';\n }\n };\n\n const handleTypeSubmit = () => {\n state.step = 'styling';\n };\n\n const handleStylingSubmit = () => {\n createProject();\n };\n\n const handleExit = () => {\n process.exit(0);\n };\n\n return () => {\n if (state.error) {\n return <ErrorScreen message={state.error} onExit={handleExit} />;\n }\n\n return (\n <box>\n <text color=\"cyan\"> ⚡ Create SignalX App</text>\n <br />\n {(() => {\n switch (state.step) {\n case 'name': return <StepName state={state} onSubmit={handleNameSubmit} />;\n case 'type': return <StepType state={state} onSubmit={handleTypeSubmit} />;\n case 'styling': return <StepStyling state={state} onSubmit={handleStylingSubmit} />;\n case 'creating': return <StepCreating state={state} />;\n case 'done': return <StepDone state={state} onExit={handleExit} />;\n }\n })()}\n </box>\n );\n };\n});\n\nfunction runHeadless(): number {\n const validTypes: ProjectType[] = ['basic', 'ssr', 'ssg', 'lynx'];\n const validStyling: Styling[] = ['none', 'tailwind', 'daisyui'];\n\n const projectName = argProjectName || 'my-sigx-app';\n const projectType: ProjectType = argType ?? 'basic';\n const styling: Styling = argStyling ?? 'none';\n\n if (!validTypes.includes(projectType)) {\n console.error(`Error: --type must be one of ${validTypes.join(', ')}`);\n return 2;\n }\n if (!validStyling.includes(styling)) {\n console.error(`Error: --styling must be one of ${validStyling.join(', ')}`);\n return 2;\n }\n\n console.log(`\\n ⚡ Creating SignalX app \"${projectName}\"`);\n console.log(` type: ${projectType}`);\n console.log(` styling: ${styling}\\n`);\n\n const result = scaffoldProject({ projectName, projectType, styling });\n if (!result.ok) {\n console.error(`Error: ${result.error}`);\n return 1;\n }\n\n console.log(` ✓ Project created\\n`);\n console.log(` Next steps:`);\n console.log(` cd ${projectName}`);\n console.log(` pnpm install`);\n console.log(` ${projectType === 'lynx' ? 'sigx dev' : 'pnpm dev'}\\n`);\n return 0;\n}\n\nexport function runCreate() {\n if (isNonInteractive) {\n process.exit(runHeadless());\n }\n defineApp(<CreateSigx />).mount({ clearConsole: true });\n // Keep process alive for TUI\n setInterval(() => { }, 10000);\n}\n"],"mappings":"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"}
|
|
@@ -9,15 +9,15 @@
|
|
|
9
9
|
"preview": "vite preview"
|
|
10
10
|
},
|
|
11
11
|
"dependencies": {
|
|
12
|
-
"sigx": "
|
|
13
|
-
"@sigx/daisyui": "
|
|
12
|
+
"sigx": "latest",
|
|
13
|
+
"@sigx/daisyui": "latest"
|
|
14
14
|
},
|
|
15
15
|
"devDependencies": {
|
|
16
|
-
"@sigx/vite": "
|
|
16
|
+
"@sigx/vite": "latest",
|
|
17
17
|
"vite": "^8.0.3",
|
|
18
18
|
"typescript": "^5.9.3",
|
|
19
19
|
"tailwindcss": "^4.1.0",
|
|
20
20
|
"@tailwindcss/vite": "^4.2.2",
|
|
21
21
|
"daisyui": "^5.0.0"
|
|
22
22
|
}
|
|
23
|
-
}
|
|
23
|
+
}
|
|
@@ -9,13 +9,13 @@
|
|
|
9
9
|
"preview": "vite preview"
|
|
10
10
|
},
|
|
11
11
|
"dependencies": {
|
|
12
|
-
"sigx": "
|
|
12
|
+
"sigx": "latest"
|
|
13
13
|
},
|
|
14
14
|
"devDependencies": {
|
|
15
|
-
"@sigx/vite": "
|
|
15
|
+
"@sigx/vite": "latest",
|
|
16
16
|
"vite": "^8.0.3",
|
|
17
17
|
"typescript": "^5.9.3",
|
|
18
18
|
"tailwindcss": "^4.1.0",
|
|
19
19
|
"@tailwindcss/vite": "^4.2.2"
|
|
20
20
|
}
|
|
21
|
-
}
|
|
21
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Dependencies
|
|
2
|
+
node_modules/
|
|
3
|
+
|
|
4
|
+
# Build output (rspeedy / TypeScript)
|
|
5
|
+
dist/
|
|
6
|
+
.rspeedy/
|
|
7
|
+
.sigx/
|
|
8
|
+
*.tsbuildinfo
|
|
9
|
+
*.local
|
|
10
|
+
|
|
11
|
+
# Generated native projects — emitted by `sigx prebuild` from
|
|
12
|
+
# sigx.lynx.config.ts + auto-linked @sigx/lynx-* modules.
|
|
13
|
+
# Regenerated on demand; do not commit.
|
|
14
|
+
android/
|
|
15
|
+
ios/
|
|
16
|
+
|
|
17
|
+
# Logs
|
|
18
|
+
*.log
|
|
19
|
+
npm-debug.log*
|
|
20
|
+
pnpm-debug.log*
|
|
21
|
+
yarn-debug.log*
|
|
22
|
+
yarn-error.log*
|
|
23
|
+
|
|
24
|
+
# OS / editor
|
|
25
|
+
.DS_Store
|
|
26
|
+
Thumbs.db
|
|
27
|
+
.vscode/
|
|
28
|
+
.idea/
|
|
29
|
+
*.swp
|
|
30
|
+
*.swo
|
|
@@ -10,24 +10,24 @@
|
|
|
10
10
|
"prebuild": "sigx prebuild"
|
|
11
11
|
},
|
|
12
12
|
"dependencies": {
|
|
13
|
-
"@sigx/lynx": "
|
|
14
|
-
"@sigx/lynx-runtime": "
|
|
15
|
-
"@sigx/lynx-runtime-main": "
|
|
16
|
-
"@sigx/lynx-core": "
|
|
17
|
-
"@sigx/reactivity": "
|
|
18
|
-
"@sigx/runtime-core": "
|
|
19
|
-
"@sigx/lynx-storage": "
|
|
20
|
-
"@sigx/lynx-clipboard": "
|
|
21
|
-
"@sigx/lynx-haptics": "
|
|
22
|
-
"@sigx/lynx-device-info": "
|
|
23
|
-
"@sigx/lynx-network": "
|
|
24
|
-
"@sigx/lynx-websocket": "
|
|
13
|
+
"@sigx/lynx": "latest",
|
|
14
|
+
"@sigx/lynx-runtime": "latest",
|
|
15
|
+
"@sigx/lynx-runtime-main": "latest",
|
|
16
|
+
"@sigx/lynx-core": "latest",
|
|
17
|
+
"@sigx/reactivity": "latest",
|
|
18
|
+
"@sigx/runtime-core": "latest",
|
|
19
|
+
"@sigx/lynx-storage": "latest",
|
|
20
|
+
"@sigx/lynx-clipboard": "latest",
|
|
21
|
+
"@sigx/lynx-haptics": "latest",
|
|
22
|
+
"@sigx/lynx-device-info": "latest",
|
|
23
|
+
"@sigx/lynx-network": "latest",
|
|
24
|
+
"@sigx/lynx-websocket": "latest"
|
|
25
25
|
},
|
|
26
26
|
"devDependencies": {
|
|
27
|
-
"@sigx/cli": "
|
|
28
|
-
"@sigx/lynx-cli": "
|
|
29
|
-
"@sigx/lynx-plugin": "
|
|
30
|
-
"@sigx/lynx-dev-client": "
|
|
27
|
+
"@sigx/cli": "latest",
|
|
28
|
+
"@sigx/lynx-cli": "latest",
|
|
29
|
+
"@sigx/lynx-plugin": "latest",
|
|
30
|
+
"@sigx/lynx-dev-client": "latest",
|
|
31
31
|
"@lynx-js/rspeedy": ">=0.1.0",
|
|
32
32
|
"@lynx-js/css-extract-webpack-plugin": ">=0.1.0",
|
|
33
33
|
"@lynx-js/template-webpack-plugin": ">=0.1.0",
|