@taujs/create-taujs 0.1.5 → 0.1.7
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/dist/index.js +65 -27
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -9,8 +9,7 @@ import prompts from "prompts";
|
|
|
9
9
|
var PACKAGE_MANAGERS = {
|
|
10
10
|
npm: "npm install",
|
|
11
11
|
pnpm: "pnpm install",
|
|
12
|
-
yarn: "yarn"
|
|
13
|
-
bun: "bun install"
|
|
12
|
+
yarn: "yarn install"
|
|
14
13
|
};
|
|
15
14
|
function parseArgs() {
|
|
16
15
|
const rawArgs = process.argv.slice(2);
|
|
@@ -23,22 +22,31 @@ function parseArgs() {
|
|
|
23
22
|
}
|
|
24
23
|
return { projectName };
|
|
25
24
|
}
|
|
25
|
+
function validateProjectName(value) {
|
|
26
|
+
if (!value) return "Project name is required";
|
|
27
|
+
if (!/^[a-z0-9-_]+$/.test(value)) {
|
|
28
|
+
return "Project name can only contain lowercase letters, numbers, hyphens, and underscores";
|
|
29
|
+
}
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
26
32
|
async function main() {
|
|
27
33
|
console.log(pc.cyan("\nWelcome to \u03C4js (taujs)\n"));
|
|
28
34
|
const { projectName: argName } = parseArgs();
|
|
35
|
+
if (argName) {
|
|
36
|
+
const res = validateProjectName(argName);
|
|
37
|
+
if (res !== true) {
|
|
38
|
+
console.log(pc.red(`
|
|
39
|
+
\u2716 Invalid project name "${argName}": ${res}`));
|
|
40
|
+
process.exit(1);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
29
43
|
const questions = [
|
|
30
44
|
{
|
|
31
45
|
type: argName ? null : "text",
|
|
32
46
|
name: "projectName",
|
|
33
47
|
message: "Project name:",
|
|
34
48
|
initial: "my-taujs-app",
|
|
35
|
-
validate:
|
|
36
|
-
if (!value) return "Project name is required";
|
|
37
|
-
if (!/^[a-z0-9-_]+$/.test(value)) {
|
|
38
|
-
return "Project name can only contain lowercase letters, numbers, hyphens, and underscores";
|
|
39
|
-
}
|
|
40
|
-
return true;
|
|
41
|
-
}
|
|
49
|
+
validate: validateProjectName
|
|
42
50
|
},
|
|
43
51
|
{
|
|
44
52
|
type: "select",
|
|
@@ -47,8 +55,7 @@ async function main() {
|
|
|
47
55
|
choices: [
|
|
48
56
|
{ title: "npm", value: "npm" },
|
|
49
57
|
{ title: "pnpm", value: "pnpm" },
|
|
50
|
-
{ title: "yarn", value: "yarn" }
|
|
51
|
-
{ title: "bun", value: "bun" }
|
|
58
|
+
{ title: "yarn", value: "yarn" }
|
|
52
59
|
],
|
|
53
60
|
initial: 0
|
|
54
61
|
},
|
|
@@ -65,8 +72,21 @@ async function main() {
|
|
|
65
72
|
process.exit(1);
|
|
66
73
|
}
|
|
67
74
|
});
|
|
75
|
+
const projectName = argName ?? answers.projectName;
|
|
76
|
+
const nameRes = validateProjectName(projectName);
|
|
77
|
+
if (nameRes !== true) {
|
|
78
|
+
console.log(
|
|
79
|
+
pc.red(`
|
|
80
|
+
\u2716 Invalid project name "${projectName}": ${nameRes}`)
|
|
81
|
+
);
|
|
82
|
+
process.exit(1);
|
|
83
|
+
}
|
|
84
|
+
if (!projectName) {
|
|
85
|
+
console.log(pc.red("\n\u2716 Project name is required"));
|
|
86
|
+
process.exit(1);
|
|
87
|
+
}
|
|
68
88
|
const config = {
|
|
69
|
-
projectName
|
|
89
|
+
projectName,
|
|
70
90
|
packageManager: answers.packageManager,
|
|
71
91
|
installDeps: answers.installDeps
|
|
72
92
|
};
|
|
@@ -87,6 +107,7 @@ Creating project in ${pc.bold(targetDir)}...
|
|
|
87
107
|
await createDirectoryStructure(targetDir);
|
|
88
108
|
await generateFiles(targetDir, config);
|
|
89
109
|
console.log(pc.green("Project files created"));
|
|
110
|
+
let depsInstalled = false;
|
|
90
111
|
if (installDeps) {
|
|
91
112
|
console.log(
|
|
92
113
|
pc.cyan(`
|
|
@@ -98,6 +119,7 @@ Installing dependencies with ${packageManager}...
|
|
|
98
119
|
cwd: targetDir,
|
|
99
120
|
stdio: "inherit"
|
|
100
121
|
});
|
|
122
|
+
depsInstalled = true;
|
|
101
123
|
console.log(pc.green("\nDependencies installed"));
|
|
102
124
|
} catch (error) {
|
|
103
125
|
console.log(
|
|
@@ -107,6 +129,13 @@ Installing dependencies with ${packageManager}...
|
|
|
107
129
|
);
|
|
108
130
|
}
|
|
109
131
|
}
|
|
132
|
+
if (installDeps && !depsInstalled) {
|
|
133
|
+
console.log(
|
|
134
|
+
pc.yellow(
|
|
135
|
+
"\u26A0 Dependency install failed. Run the install command before starting the dev server.\n"
|
|
136
|
+
)
|
|
137
|
+
);
|
|
138
|
+
}
|
|
110
139
|
console.log(
|
|
111
140
|
pc.green(`
|
|
112
141
|
\u2713 Project ${pc.bold(projectName)} created successfully!
|
|
@@ -114,10 +143,12 @@ Installing dependencies with ${packageManager}...
|
|
|
114
143
|
);
|
|
115
144
|
console.log(pc.cyan("Next steps:\n"));
|
|
116
145
|
console.log(` cd ${projectName}`);
|
|
117
|
-
if (!
|
|
118
|
-
console.log(
|
|
119
|
-
}
|
|
120
|
-
|
|
146
|
+
if (!depsInstalled)
|
|
147
|
+
console.log(
|
|
148
|
+
` ${PACKAGE_MANAGERS[packageManager]}${installDeps ? " # (install failed earlier)" : ""}`
|
|
149
|
+
);
|
|
150
|
+
const pmRun = packageManager === "npm" ? "npm run" : packageManager;
|
|
151
|
+
console.log(` ${pmRun} dev
|
|
121
152
|
`);
|
|
122
153
|
console.log(pc.dim("Documentation: https://taujs.dev\n"));
|
|
123
154
|
}
|
|
@@ -135,7 +166,7 @@ async function generateFiles(targetDir, config) {
|
|
|
135
166
|
const { projectName, packageManager } = config;
|
|
136
167
|
await fs.writeJSON(
|
|
137
168
|
path.join(targetDir, "package.json"),
|
|
138
|
-
generatePackageJson(projectName
|
|
169
|
+
generatePackageJson(projectName),
|
|
139
170
|
{ spaces: 2 }
|
|
140
171
|
);
|
|
141
172
|
await fs.writeFile(path.join(targetDir, "build.ts"), generateBuildTs());
|
|
@@ -203,19 +234,19 @@ async function generateFiles(targetDir, config) {
|
|
|
203
234
|
generateFavicon()
|
|
204
235
|
);
|
|
205
236
|
}
|
|
206
|
-
function generatePackageJson(projectName
|
|
237
|
+
function generatePackageJson(projectName) {
|
|
207
238
|
return {
|
|
208
239
|
name: projectName,
|
|
209
240
|
version: "0.1.0",
|
|
210
241
|
private: true,
|
|
211
242
|
type: "module",
|
|
212
243
|
scripts: {
|
|
213
|
-
dev: "NODE_ENV=development tsx watch --ignore vite.config.ts --trace-warnings --tsconfig ./src/server/tsconfig.json ./src/server/index.ts --loglevel verbose",
|
|
244
|
+
dev: "cross-env NODE_ENV=development tsx watch --ignore vite.config.ts --trace-warnings --tsconfig ./src/server/tsconfig.json ./src/server/index.ts --loglevel verbose",
|
|
214
245
|
"build:client": "tsx build.ts",
|
|
215
|
-
"build:entry-server": "BUILD_MODE=ssr tsx build.ts",
|
|
246
|
+
"build:entry-server": "cross-env BUILD_MODE=ssr tsx build.ts",
|
|
216
247
|
"build:server": "esbuild src/server/index.ts --bundle --platform=node --format=esm --outfile=dist/server/index.js --external:fastify --external:@taujs/server --external:@taujs/react",
|
|
217
|
-
build: "tsx build.ts && BUILD_MODE=ssr tsx build.ts && esbuild src/server/index.ts --bundle --platform=node --format=esm --outfile=dist/server/index.js --external:fastify --external:@taujs/server --external:@taujs/react",
|
|
218
|
-
start: "NODE_ENV=production node dist/server/index.js",
|
|
248
|
+
build: "tsx build.ts && cross-env BUILD_MODE=ssr tsx build.ts && esbuild src/server/index.ts --bundle --platform=node --format=esm --outfile=dist/server/index.js --external:fastify --external:@taujs/server --external:@taujs/react",
|
|
249
|
+
start: "cross-env NODE_ENV=production node dist/server/index.js",
|
|
219
250
|
lint: "tsc --noEmit"
|
|
220
251
|
},
|
|
221
252
|
dependencies: {
|
|
@@ -230,6 +261,7 @@ function generatePackageJson(projectName, packageManager) {
|
|
|
230
261
|
"@types/react": "^19.0.2",
|
|
231
262
|
"@types/react-dom": "^19.0.2",
|
|
232
263
|
"@vitejs/plugin-react": "^4.6.0",
|
|
264
|
+
"cross-env": "^7.0.3",
|
|
233
265
|
tsx: "^4.19.3",
|
|
234
266
|
typescript: "^5.7.3",
|
|
235
267
|
vite: "^7.1.11"
|
|
@@ -317,8 +349,9 @@ export default defineConfig({
|
|
|
317
349
|
}),
|
|
318
350
|
// meta recommended for streaming routes for SEO/social and render timing
|
|
319
351
|
meta: {
|
|
320
|
-
title:
|
|
321
|
-
description:
|
|
352
|
+
title: "\u03C4js \u2014 Streaming",
|
|
353
|
+
description:
|
|
354
|
+
"Streaming SSR route (Suspense progressively reveals content).",
|
|
322
355
|
},
|
|
323
356
|
},
|
|
324
357
|
},
|
|
@@ -486,7 +519,7 @@ export function App() {
|
|
|
486
519
|
<header className="app-header">
|
|
487
520
|
<h1 className="app-title">\u03C4js - Composing systems, not just apps</h1>
|
|
488
521
|
<p className="app-subtitle">
|
|
489
|
-
|
|
522
|
+
Request-first application composition with explicit per-route rendering control.
|
|
490
523
|
</p>
|
|
491
524
|
</header>
|
|
492
525
|
|
|
@@ -783,8 +816,13 @@ import { App } from './App';
|
|
|
783
816
|
|
|
784
817
|
export const { renderSSR, renderStream } = createRenderer({
|
|
785
818
|
appComponent: () => <App />,
|
|
786
|
-
headContent: ({ data }) => \`
|
|
787
|
-
<meta
|
|
819
|
+
headContent: ({ data, meta }) => \`
|
|
820
|
+
<title>\${meta?.title || "\u03C4js - Composing systems, not just apps"}</title>
|
|
821
|
+
<meta name="description" content="\${
|
|
822
|
+
meta?.description ||
|
|
823
|
+
data?.message ||
|
|
824
|
+
"\u03C4js - Composing systems, not just apps"
|
|
825
|
+
}">
|
|
788
826
|
\`,
|
|
789
827
|
enableDebug: process.env.NODE_ENV === "development",
|
|
790
828
|
});
|