create-swift-rust 0.2.0
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 +33 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1104 -0
- package/dist/index.js.map +1 -0
- package/dist/smoke.test.d.ts +2 -0
- package/dist/smoke.test.d.ts.map +1 -0
- package/dist/smoke.test.js +6 -0
- package/dist/smoke.test.js.map +1 -0
- package/package.json +47 -0
package/README.md
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# create-swift-rust
|
|
2
|
+
|
|
3
|
+
Scaffold a new swift-rust project.
|
|
4
|
+
|
|
5
|
+
## Usage
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
bunx create-swift-rust@latest my-app
|
|
9
|
+
# or
|
|
10
|
+
bun create swift-rust my-app
|
|
11
|
+
# or
|
|
12
|
+
npm create swift-rust@latest my-app
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
The CLI prompts for:
|
|
16
|
+
|
|
17
|
+
1. **Project name** — directory to create.
|
|
18
|
+
2. **Rendering mode** — `ssr`, `ssr-wasm`, `ssr-htmx`, or `wasm`.
|
|
19
|
+
|
|
20
|
+
Pass `--yes` to skip the prompts and use the defaults.
|
|
21
|
+
|
|
22
|
+
## What it generates
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
my-app/
|
|
26
|
+
├── app/
|
|
27
|
+
│ ├── layout.tsx
|
|
28
|
+
│ └── page.tsx
|
|
29
|
+
├── package.json
|
|
30
|
+
├── tsconfig.json
|
|
31
|
+
├── swift-rust.config.json
|
|
32
|
+
└── .gitignore
|
|
33
|
+
```
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,1104 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { mkdir, stat, writeFile } from "node:fs/promises";
|
|
3
|
+
import { join, resolve } from "node:path";
|
|
4
|
+
import * as p from "@clack/prompts";
|
|
5
|
+
import pc from "picocolors";
|
|
6
|
+
async function pathExists(path) {
|
|
7
|
+
try {
|
|
8
|
+
await stat(path);
|
|
9
|
+
return true;
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
function isValidName(name) {
|
|
16
|
+
return /^(@[a-z0-9-~][a-z0-9-._~]*\/)?[a-z0-9-~][a-z0-9-._~]*$/.test(name);
|
|
17
|
+
}
|
|
18
|
+
function isValidAlias(alias) {
|
|
19
|
+
return /^[a-zA-Z@][a-zA-Z0-9_/*-]*$/.test(alias);
|
|
20
|
+
}
|
|
21
|
+
const HELP = `
|
|
22
|
+
${pc.bold("create-swift-rust")} - scaffold a new swift-rust project
|
|
23
|
+
|
|
24
|
+
${pc.bold("Usage")}
|
|
25
|
+
${pc.cyan("bun create swift-rust@latest")} [project-name] [options]
|
|
26
|
+
|
|
27
|
+
${pc.bold("Options")}
|
|
28
|
+
${pc.yellow("--ts, --typescript")} Use TypeScript (default)
|
|
29
|
+
${pc.yellow("--js, --javascript")} Use JavaScript
|
|
30
|
+
${pc.yellow("--tailwind")} Install Tailwind CSS
|
|
31
|
+
${pc.yellow("--no-tailwind")} Skip Tailwind CSS
|
|
32
|
+
${pc.yellow("--shadcn")} Install shadcn-style UI components (default)
|
|
33
|
+
${pc.yellow("--no-shadcn")} Skip shadcn UI components
|
|
34
|
+
${pc.yellow("--src-dir")} Use src/ under app/ (default)
|
|
35
|
+
${pc.yellow("--no-src-dir")} Use top-level app/
|
|
36
|
+
${pc.yellow("--biome")} Use Biome for linting (default)
|
|
37
|
+
${pc.yellow("--eslint")} Use ESLint for linting
|
|
38
|
+
${pc.yellow("--import-alias <prefix>")} Set import alias (default "@/*")
|
|
39
|
+
${pc.yellow("--ssr")} Server-side rendering
|
|
40
|
+
${pc.yellow("--ssr-wasm")} SSR with WASM hydration (default)
|
|
41
|
+
${pc.yellow("--ssr-htmx")} SSR with HTMX
|
|
42
|
+
${pc.yellow("--wasm")} Full WASM SPA
|
|
43
|
+
${pc.yellow("--install")} Run bun install after scaffolding
|
|
44
|
+
${pc.yellow("--no-install")} Skip bun install (default)
|
|
45
|
+
${pc.yellow("--yes, -y")} Skip prompts, use defaults
|
|
46
|
+
${pc.yellow("--help, -h")} Show this help
|
|
47
|
+
|
|
48
|
+
${pc.bold("Examples")}
|
|
49
|
+
${pc.cyan("bun create swift-rust@latest")}
|
|
50
|
+
${pc.cyan("bun create swift-rust@latest my-app --ts --tailwind --src-dir")}
|
|
51
|
+
${pc.cyan("bun create swift-rust@latest ./ --tailwind --eslint")}
|
|
52
|
+
`;
|
|
53
|
+
function parseFlags(args) {
|
|
54
|
+
const flags = {};
|
|
55
|
+
for (let i = 0; i < args.length; i++) {
|
|
56
|
+
const a = args[i];
|
|
57
|
+
if (a === undefined)
|
|
58
|
+
continue;
|
|
59
|
+
if (a === "--ts" || a === "--typescript")
|
|
60
|
+
flags.language = "ts";
|
|
61
|
+
else if (a === "--js" || a === "--javascript")
|
|
62
|
+
flags.language = "js";
|
|
63
|
+
else if (a === "--tailwind")
|
|
64
|
+
flags.tailwind = true;
|
|
65
|
+
else if (a === "--no-tailwind")
|
|
66
|
+
flags.tailwind = false;
|
|
67
|
+
else if (a === "--shadcn")
|
|
68
|
+
flags.useShadcn = true;
|
|
69
|
+
else if (a === "--no-shadcn")
|
|
70
|
+
flags.useShadcn = false;
|
|
71
|
+
else if (a === "--src-dir")
|
|
72
|
+
flags.srcDir = true;
|
|
73
|
+
else if (a === "--no-src-dir")
|
|
74
|
+
flags.srcDir = false;
|
|
75
|
+
else if (a === "--biome")
|
|
76
|
+
flags.linter = "biome";
|
|
77
|
+
else if (a === "--eslint")
|
|
78
|
+
flags.linter = "eslint";
|
|
79
|
+
else if (a === "--import-alias")
|
|
80
|
+
flags.importAlias = args[++i];
|
|
81
|
+
else if (a === "--ssr")
|
|
82
|
+
flags.renderer = "ssr";
|
|
83
|
+
else if (a === "--ssr-wasm")
|
|
84
|
+
flags.renderer = "ssr-wasm";
|
|
85
|
+
else if (a === "--ssr-htmx")
|
|
86
|
+
flags.renderer = "ssr-htmx";
|
|
87
|
+
else if (a === "--wasm")
|
|
88
|
+
flags.renderer = "wasm";
|
|
89
|
+
else if (a === "--renderer")
|
|
90
|
+
flags.renderer = args[++i];
|
|
91
|
+
else if (a === "--install")
|
|
92
|
+
flags.install = true;
|
|
93
|
+
else if (a === "--no-install")
|
|
94
|
+
flags.install = false;
|
|
95
|
+
else if (a === "--yes" || a === "-y")
|
|
96
|
+
flags.yes = true;
|
|
97
|
+
else if (a === "--help" || a === "-h")
|
|
98
|
+
flags.help = true;
|
|
99
|
+
else if (!a.startsWith("-") && !flags._name)
|
|
100
|
+
flags._name = a;
|
|
101
|
+
}
|
|
102
|
+
return flags;
|
|
103
|
+
}
|
|
104
|
+
const RENDERER_OPTIONS = [
|
|
105
|
+
{
|
|
106
|
+
value: "ssr-wasm",
|
|
107
|
+
label: "SSR + WASM hydration",
|
|
108
|
+
hint: "Default. Server-rendered HTML, WASM-hydrated interactive islands.",
|
|
109
|
+
},
|
|
110
|
+
{ value: "ssr", label: "SSR only", hint: "Server-rendered HTML, no client JavaScript at all." },
|
|
111
|
+
{
|
|
112
|
+
value: "ssr-htmx",
|
|
113
|
+
label: "SSR + HTMX",
|
|
114
|
+
hint: "Progressive enhancement with HTMX-style interactions.",
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
value: "wasm",
|
|
118
|
+
label: "Full WASM SPA",
|
|
119
|
+
hint: "Single-page app compiled entirely to WebAssembly.",
|
|
120
|
+
},
|
|
121
|
+
];
|
|
122
|
+
async function askQuestions(flags, positional) {
|
|
123
|
+
const yesMode = flags.yes === true;
|
|
124
|
+
const projectName = positional ??
|
|
125
|
+
(yesMode
|
|
126
|
+
? "my-swift-rust-app"
|
|
127
|
+
: await p.text({
|
|
128
|
+
message: "What is your project named?",
|
|
129
|
+
placeholder: "my-swift-rust-app",
|
|
130
|
+
defaultValue: "my-swift-rust-app",
|
|
131
|
+
validate: (v) => {
|
|
132
|
+
if (!v)
|
|
133
|
+
return "Project name is required";
|
|
134
|
+
if (!isValidName(v))
|
|
135
|
+
return "Invalid name. Use letters, numbers, dashes, and underscores.";
|
|
136
|
+
return undefined;
|
|
137
|
+
},
|
|
138
|
+
}));
|
|
139
|
+
if (!projectName || p.isCancel(projectName)) {
|
|
140
|
+
p.cancel("Aborted.");
|
|
141
|
+
return null;
|
|
142
|
+
}
|
|
143
|
+
let languageAnswer;
|
|
144
|
+
if (flags.language) {
|
|
145
|
+
languageAnswer = flags.language;
|
|
146
|
+
}
|
|
147
|
+
else if (yesMode) {
|
|
148
|
+
languageAnswer = "ts";
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
const languageOptions = [
|
|
152
|
+
{ value: "ts", label: "TypeScript", hint: "Type-safe, recommended" },
|
|
153
|
+
{ value: "js", label: "JavaScript", hint: "No type checking" },
|
|
154
|
+
];
|
|
155
|
+
const result = await p.select({
|
|
156
|
+
message: "Which language would you like to use?",
|
|
157
|
+
options: languageOptions,
|
|
158
|
+
initialValue: "ts",
|
|
159
|
+
});
|
|
160
|
+
languageAnswer = result;
|
|
161
|
+
}
|
|
162
|
+
if (p.isCancel(languageAnswer)) {
|
|
163
|
+
p.cancel("Aborted.");
|
|
164
|
+
return null;
|
|
165
|
+
}
|
|
166
|
+
const language = languageAnswer;
|
|
167
|
+
let renderer = flags.renderer ?? "ssr-wasm";
|
|
168
|
+
if (!flags.renderer && !yesMode) {
|
|
169
|
+
const r = (await p.select({
|
|
170
|
+
message: "Which rendering mode do you want?",
|
|
171
|
+
options: RENDERER_OPTIONS,
|
|
172
|
+
initialValue: "ssr-wasm",
|
|
173
|
+
}));
|
|
174
|
+
if (p.isCancel(r)) {
|
|
175
|
+
p.cancel("Aborted.");
|
|
176
|
+
return null;
|
|
177
|
+
}
|
|
178
|
+
renderer = r;
|
|
179
|
+
}
|
|
180
|
+
let linterAnswer;
|
|
181
|
+
if (flags.linter) {
|
|
182
|
+
linterAnswer = flags.linter;
|
|
183
|
+
}
|
|
184
|
+
else if (yesMode) {
|
|
185
|
+
linterAnswer = "biome";
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
const linterOptions = [
|
|
189
|
+
{ value: "biome", label: "Biome", hint: "Fast Rust-based all-in-one tool (recommended)" },
|
|
190
|
+
{ value: "eslint", label: "ESLint", hint: "The classic, more configurable" },
|
|
191
|
+
];
|
|
192
|
+
const result = await p.select({
|
|
193
|
+
message: "Which linter would you like to use?",
|
|
194
|
+
options: linterOptions,
|
|
195
|
+
initialValue: "biome",
|
|
196
|
+
});
|
|
197
|
+
linterAnswer = result;
|
|
198
|
+
}
|
|
199
|
+
if (p.isCancel(linterAnswer)) {
|
|
200
|
+
p.cancel("Aborted.");
|
|
201
|
+
return null;
|
|
202
|
+
}
|
|
203
|
+
const linter = linterAnswer;
|
|
204
|
+
const tailwindAnswer = typeof flags.tailwind === "boolean"
|
|
205
|
+
? flags.tailwind
|
|
206
|
+
: yesMode
|
|
207
|
+
? false
|
|
208
|
+
: ((await p.confirm({
|
|
209
|
+
message: "Would you like to use Tailwind CSS?",
|
|
210
|
+
initialValue: true,
|
|
211
|
+
})) ?? false);
|
|
212
|
+
if (p.isCancel(tailwindAnswer)) {
|
|
213
|
+
p.cancel("Aborted.");
|
|
214
|
+
return null;
|
|
215
|
+
}
|
|
216
|
+
const tailwind = tailwindAnswer === true;
|
|
217
|
+
const useShadcnAnswer = typeof flags.useShadcn === "boolean"
|
|
218
|
+
? flags.useShadcn
|
|
219
|
+
: yesMode
|
|
220
|
+
? true
|
|
221
|
+
: ((await p.confirm({
|
|
222
|
+
message: "Would you like to use shadcn-style UI components?",
|
|
223
|
+
initialValue: true,
|
|
224
|
+
})) ?? false);
|
|
225
|
+
if (p.isCancel(useShadcnAnswer)) {
|
|
226
|
+
p.cancel("Aborted.");
|
|
227
|
+
return null;
|
|
228
|
+
}
|
|
229
|
+
const useShadcn = useShadcnAnswer === true;
|
|
230
|
+
const srcDirAnswer = typeof flags.srcDir === "boolean"
|
|
231
|
+
? flags.srcDir
|
|
232
|
+
: yesMode
|
|
233
|
+
? true
|
|
234
|
+
: ((await p.confirm({
|
|
235
|
+
message: "Would you like to use a `src/` directory for your app code?",
|
|
236
|
+
initialValue: true,
|
|
237
|
+
})) ?? true);
|
|
238
|
+
if (p.isCancel(srcDirAnswer)) {
|
|
239
|
+
p.cancel("Aborted.");
|
|
240
|
+
return null;
|
|
241
|
+
}
|
|
242
|
+
const srcDir = srcDirAnswer === true;
|
|
243
|
+
const importAliasAnswer = flags.importAlias ??
|
|
244
|
+
(yesMode
|
|
245
|
+
? "@/*"
|
|
246
|
+
: (await p.text({
|
|
247
|
+
message: "Would you like to customize the import alias?",
|
|
248
|
+
placeholder: "@/*",
|
|
249
|
+
defaultValue: "@/*",
|
|
250
|
+
validate: (v) => {
|
|
251
|
+
if (!v)
|
|
252
|
+
return "Import alias is required";
|
|
253
|
+
if (!isValidAlias(v))
|
|
254
|
+
return "Invalid alias. Use letters, numbers, @, /, *, -, _.";
|
|
255
|
+
return undefined;
|
|
256
|
+
},
|
|
257
|
+
})));
|
|
258
|
+
if (p.isCancel(importAliasAnswer)) {
|
|
259
|
+
p.cancel("Aborted.");
|
|
260
|
+
return null;
|
|
261
|
+
}
|
|
262
|
+
const importAlias = importAliasAnswer;
|
|
263
|
+
if (!importAlias) {
|
|
264
|
+
p.cancel("Aborted.");
|
|
265
|
+
return null;
|
|
266
|
+
}
|
|
267
|
+
const installAnswer = typeof flags.install === "boolean"
|
|
268
|
+
? flags.install
|
|
269
|
+
: yesMode
|
|
270
|
+
? false
|
|
271
|
+
: ((await p.confirm({
|
|
272
|
+
message: "Would you like to install dependencies with `bun install`?",
|
|
273
|
+
initialValue: true,
|
|
274
|
+
})) ?? false);
|
|
275
|
+
if (p.isCancel(installAnswer)) {
|
|
276
|
+
p.cancel("Aborted.");
|
|
277
|
+
return null;
|
|
278
|
+
}
|
|
279
|
+
const install = installAnswer === true;
|
|
280
|
+
return {
|
|
281
|
+
projectName,
|
|
282
|
+
language,
|
|
283
|
+
renderer,
|
|
284
|
+
linter,
|
|
285
|
+
tailwind,
|
|
286
|
+
srcDir,
|
|
287
|
+
importAlias,
|
|
288
|
+
useShadcn,
|
|
289
|
+
install,
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
async function writeProjectFiles(target, answers) {
|
|
293
|
+
const { projectName, language, renderer, linter, tailwind, srcDir, importAlias, useShadcn } = answers;
|
|
294
|
+
const appDir = join(target, srcDir ? "app/src" : "app");
|
|
295
|
+
const componentsDir = join(target, "components");
|
|
296
|
+
const libDir = join(target, "lib");
|
|
297
|
+
const uiDir = join(componentsDir, "ui");
|
|
298
|
+
await mkdir(target, { recursive: true });
|
|
299
|
+
await mkdir(appDir, { recursive: true });
|
|
300
|
+
await mkdir(componentsDir, { recursive: true });
|
|
301
|
+
await mkdir(libDir, { recursive: true });
|
|
302
|
+
await mkdir(join(target, "public"), { recursive: true });
|
|
303
|
+
if (useShadcn) {
|
|
304
|
+
await mkdir(uiDir, { recursive: true });
|
|
305
|
+
}
|
|
306
|
+
const fileExt = (lang) => (lang === "ts" ? "ts" : "js");
|
|
307
|
+
const componentExt = (lang) => (lang === "ts" ? "tsx" : "jsx");
|
|
308
|
+
const pkg = {
|
|
309
|
+
name: projectName,
|
|
310
|
+
version: "0.1.0",
|
|
311
|
+
private: true,
|
|
312
|
+
type: "module",
|
|
313
|
+
scripts: {
|
|
314
|
+
dev: "swift-rust dev",
|
|
315
|
+
build: "swift-rust build",
|
|
316
|
+
start: "swift-rust start",
|
|
317
|
+
lint: linter === "biome" ? "biome check ." : "eslint .",
|
|
318
|
+
test: "bun test",
|
|
319
|
+
...(language === "ts" ? { typecheck: "tsc --noEmit" } : {}),
|
|
320
|
+
format: linter === "biome" ? "biome format --write ." : "prettier --write .",
|
|
321
|
+
},
|
|
322
|
+
dependencies: {
|
|
323
|
+
"swift-rust": "0.1.0",
|
|
324
|
+
react: "^19.0.0",
|
|
325
|
+
"react-dom": "^19.0.0",
|
|
326
|
+
...(useShadcn
|
|
327
|
+
? {
|
|
328
|
+
clsx: "^2.1.1",
|
|
329
|
+
"tailwind-merge": "^2.5.5",
|
|
330
|
+
"class-variance-authority": "^0.7.1",
|
|
331
|
+
"lucide-react": "^0.460.0",
|
|
332
|
+
"tw-animate-css": "^1.0.0",
|
|
333
|
+
}
|
|
334
|
+
: {}),
|
|
335
|
+
},
|
|
336
|
+
devDependencies: {
|
|
337
|
+
...(language === "ts"
|
|
338
|
+
? { typescript: "^5.6.0", "@types/react": "^19.0.0", "@types/react-dom": "^19.0.0" }
|
|
339
|
+
: {}),
|
|
340
|
+
...(linter === "biome" ? { "@biomejs/biome": "^1.9.0" } : { eslint: "^9.0.0" }),
|
|
341
|
+
...(tailwind
|
|
342
|
+
? { tailwindcss: "^4.0.0", "@tailwindcss/postcss": "^4.0.0", postcss: "^8.4.0" }
|
|
343
|
+
: {}),
|
|
344
|
+
...(useShadcn ? { shadcn: "^2.0.0" } : {}),
|
|
345
|
+
},
|
|
346
|
+
};
|
|
347
|
+
await writeFile(join(target, "package.json"), `${JSON.stringify(pkg, null, 2)}\n`);
|
|
348
|
+
const config = {
|
|
349
|
+
rendering: renderer,
|
|
350
|
+
image: { domains: [], formats: ["image/avif", "image/webp"] },
|
|
351
|
+
font: { subsets: ["latin"], display: "swap" },
|
|
352
|
+
pdf: { defaultPageSize: "A4" },
|
|
353
|
+
};
|
|
354
|
+
await writeFile(join(target, "swift-rust.config.json"), `${JSON.stringify(config, null, 2)}\n`);
|
|
355
|
+
if (language === "ts") {
|
|
356
|
+
const tsconfig = {
|
|
357
|
+
extends: "swift-rust/tsconfig.base.json",
|
|
358
|
+
compilerOptions: {
|
|
359
|
+
jsx: "preserve",
|
|
360
|
+
baseUrl: ".",
|
|
361
|
+
paths: { [importAlias]: ["./*"] },
|
|
362
|
+
},
|
|
363
|
+
include: [
|
|
364
|
+
srcDir ? "app/src/**/*" : "app/**/*",
|
|
365
|
+
"components/**/*",
|
|
366
|
+
"lib/**/*",
|
|
367
|
+
"globals.d.ts",
|
|
368
|
+
".swift-rust/types/**/*",
|
|
369
|
+
],
|
|
370
|
+
exclude: ["node_modules", "dist", ".swift-rust", ".turbo"],
|
|
371
|
+
};
|
|
372
|
+
await writeFile(join(target, "tsconfig.json"), `${JSON.stringify(tsconfig, null, 2)}\n`);
|
|
373
|
+
}
|
|
374
|
+
else {
|
|
375
|
+
const jsconfig = {
|
|
376
|
+
compilerOptions: {
|
|
377
|
+
baseUrl: ".",
|
|
378
|
+
paths: { [importAlias]: ["./*"] },
|
|
379
|
+
},
|
|
380
|
+
include: [srcDir ? "app/src/**/*" : "app/**/*", "components/**/*", "lib/**/*"],
|
|
381
|
+
};
|
|
382
|
+
await writeFile(join(target, "jsconfig.json"), `${JSON.stringify(jsconfig, null, 2)}\n`);
|
|
383
|
+
}
|
|
384
|
+
const gitignore = [
|
|
385
|
+
"node_modules/",
|
|
386
|
+
".swift-rust/",
|
|
387
|
+
"dist/",
|
|
388
|
+
".turbo/",
|
|
389
|
+
".env*.local",
|
|
390
|
+
"target/",
|
|
391
|
+
"*.log",
|
|
392
|
+
".DS_Store",
|
|
393
|
+
].join("\n");
|
|
394
|
+
await writeFile(join(target, ".gitignore"), `${gitignore}\n`);
|
|
395
|
+
if (tailwind) {
|
|
396
|
+
const postcss = `const config = {
|
|
397
|
+
plugins: {
|
|
398
|
+
"@tailwindcss/postcss": {},
|
|
399
|
+
},
|
|
400
|
+
};
|
|
401
|
+
|
|
402
|
+
export default config;
|
|
403
|
+
`;
|
|
404
|
+
await writeFile(join(target, "postcss.config.mjs"), postcss);
|
|
405
|
+
const shadcnVars = useShadcn
|
|
406
|
+
? `
|
|
407
|
+
|
|
408
|
+
/* shadcn design tokens (https://ui.shadcn.com/docs/theming) */
|
|
409
|
+
:root {
|
|
410
|
+
--ui-bg: #ffffff;
|
|
411
|
+
--ui-fg: #09090b;
|
|
412
|
+
--ui-card: #ffffff;
|
|
413
|
+
--ui-card-fg: #09090b;
|
|
414
|
+
--ui-popover: #ffffff;
|
|
415
|
+
--ui-popover-fg: #09090b;
|
|
416
|
+
--ui-primary: #18181b;
|
|
417
|
+
--ui-primary-fg: #fafafa;
|
|
418
|
+
--ui-secondary: #f4f4f5;
|
|
419
|
+
--ui-secondary-fg: #18181b;
|
|
420
|
+
--ui-muted: #f4f4f5;
|
|
421
|
+
--ui-muted-fg: #71717a;
|
|
422
|
+
--ui-accent: #f4f4f5;
|
|
423
|
+
--ui-accent-fg: #18181b;
|
|
424
|
+
--ui-destructive: #ef4444;
|
|
425
|
+
--ui-destructive-fg: #fafafa;
|
|
426
|
+
--ui-border: #e4e4e7;
|
|
427
|
+
--ui-input: #e4e4e7;
|
|
428
|
+
--ui-ring: #18181b;
|
|
429
|
+
--ui-radius: 0.5rem;
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
.dark {
|
|
433
|
+
--ui-bg: #09090b;
|
|
434
|
+
--ui-fg: #fafafa;
|
|
435
|
+
--ui-card: #09090b;
|
|
436
|
+
--ui-card-fg: #fafafa;
|
|
437
|
+
--ui-popover: #09090b;
|
|
438
|
+
--ui-popover-fg: #fafafa;
|
|
439
|
+
--ui-primary: #fafafa;
|
|
440
|
+
--ui-primary-fg: #18181b;
|
|
441
|
+
--ui-secondary: #27272a;
|
|
442
|
+
--ui-secondary-fg: #fafafa;
|
|
443
|
+
--ui-muted: #27272a;
|
|
444
|
+
--ui-muted-fg: #a1a1aa;
|
|
445
|
+
--ui-accent: #27272a;
|
|
446
|
+
--ui-accent-fg: #fafafa;
|
|
447
|
+
--ui-destructive: #7f1d1d;
|
|
448
|
+
--ui-destructive-fg: #fafafa;
|
|
449
|
+
--ui-border: #27272a;
|
|
450
|
+
--ui-input: #27272a;
|
|
451
|
+
--ui-ring: #d4d4d8;
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
@media (prefers-color-scheme: dark) {
|
|
455
|
+
:root:not(.light) {
|
|
456
|
+
--ui-bg: #09090b;
|
|
457
|
+
--ui-fg: #fafafa;
|
|
458
|
+
--ui-card: #09090b;
|
|
459
|
+
--ui-card-fg: #fafafa;
|
|
460
|
+
--ui-popover: #09090b;
|
|
461
|
+
--ui-popover-fg: #fafafa;
|
|
462
|
+
--ui-primary: #fafafa;
|
|
463
|
+
--ui-primary-fg: #18181b;
|
|
464
|
+
--ui-secondary: #27272a;
|
|
465
|
+
--ui-secondary-fg: #fafafa;
|
|
466
|
+
--ui-muted: #27272a;
|
|
467
|
+
--ui-muted-fg: #a1a1aa;
|
|
468
|
+
--ui-accent: #27272a;
|
|
469
|
+
--ui-accent-fg: #fafafa;
|
|
470
|
+
--ui-destructive: #7f1d1d;
|
|
471
|
+
--ui-destructive-fg: #fafafa;
|
|
472
|
+
--ui-border: #27272a;
|
|
473
|
+
--ui-input: #27272a;
|
|
474
|
+
--ui-ring: #d4d4d8;
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
@theme inline {
|
|
479
|
+
--color-background: var(--ui-bg);
|
|
480
|
+
--color-foreground: var(--ui-fg);
|
|
481
|
+
--color-card: var(--ui-card);
|
|
482
|
+
--color-card-foreground: var(--ui-card-fg);
|
|
483
|
+
--color-popover: var(--ui-popover);
|
|
484
|
+
--color-popover-foreground: var(--ui-popover-fg);
|
|
485
|
+
--color-primary: var(--ui-primary);
|
|
486
|
+
--color-primary-foreground: var(--ui-primary-fg);
|
|
487
|
+
--color-secondary: var(--ui-secondary);
|
|
488
|
+
--color-secondary-foreground: var(--ui-secondary-fg);
|
|
489
|
+
--color-muted: var(--ui-muted);
|
|
490
|
+
--color-muted-foreground: var(--ui-muted-fg);
|
|
491
|
+
--color-accent: var(--ui-accent);
|
|
492
|
+
--color-accent-foreground: var(--ui-accent-fg);
|
|
493
|
+
--color-destructive: var(--ui-destructive);
|
|
494
|
+
--color-destructive-foreground: var(--ui-destructive-fg);
|
|
495
|
+
--color-border: var(--ui-border);
|
|
496
|
+
--color-input: var(--ui-input);
|
|
497
|
+
--color-ring: var(--ui-ring);
|
|
498
|
+
--radius: var(--ui-radius);
|
|
499
|
+
}
|
|
500
|
+
`
|
|
501
|
+
: "";
|
|
502
|
+
const css = `@import "tailwindcss";
|
|
503
|
+
${useShadcn ? '@import "tw-animate-css";' : ""}
|
|
504
|
+
|
|
505
|
+
@theme {
|
|
506
|
+
--color-bg: #ffffff;
|
|
507
|
+
--color-fg: #09090b;
|
|
508
|
+
--color-accent: ${useShadcn ? "#f97316" : "#0070f3"};
|
|
509
|
+
--font-sans: var(--font-geist-sans), system-ui, sans-serif;
|
|
510
|
+
--font-mono: var(--font-geist-mono), ui-monospace, monospace;
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
@variant dark (&:where(.dark, .dark *));
|
|
514
|
+
|
|
515
|
+
@media (prefers-color-scheme: dark) {
|
|
516
|
+
:root:not(.light) {
|
|
517
|
+
--color-bg: #09090b;
|
|
518
|
+
--color-fg: #fafafa;
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
body {
|
|
523
|
+
background: var(--color-bg);
|
|
524
|
+
color: var(--color-fg);
|
|
525
|
+
font-family: var(--font-sans);
|
|
526
|
+
}
|
|
527
|
+
${shadcnVars}`;
|
|
528
|
+
await writeFile(join(appDir, `globals.${fileExt(language)}`), language === "ts" ? `import "./globals.css";\n` : `import "./globals.css";\n`);
|
|
529
|
+
await writeFile(join(appDir, "globals.css"), css);
|
|
530
|
+
}
|
|
531
|
+
const layoutImports = `import type { ReactNode } from "react";
|
|
532
|
+
import { Geist, Geist_Mono } from "swift-rust/font/google";
|
|
533
|
+
${tailwind ? `import "./globals.css";\n` : ""}
|
|
534
|
+
const geistSans = Geist({ subsets: ["latin"], display: "swap", variable: true });
|
|
535
|
+
const geistMono = Geist_Mono({ subsets: ["latin"], display: "swap", variable: true });
|
|
536
|
+
|
|
537
|
+
export const metadata = {
|
|
538
|
+
title: {
|
|
539
|
+
template: "%s | ${projectName}",
|
|
540
|
+
default: "${projectName}",
|
|
541
|
+
},
|
|
542
|
+
description: "Built with swift-rust — the React framework powered with Rust + Bun. 10x faster than Next.js.",
|
|
543
|
+
};
|
|
544
|
+
|
|
545
|
+
export default function RootLayout({ children }: { children: ReactNode }) {
|
|
546
|
+
return (
|
|
547
|
+
<html
|
|
548
|
+
lang="en"
|
|
549
|
+
className={\`\${geistSans.variable} \${geistMono.variable} h-full antialiased\`}
|
|
550
|
+
>
|
|
551
|
+
<head>
|
|
552
|
+
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
|
553
|
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossOrigin="anonymous" />
|
|
554
|
+
</head>
|
|
555
|
+
<body className="${tailwind ? "min-h-full flex flex-col" : ""}">${tailwind ? "{children}" : "\\n {children}\\n "}</body>
|
|
556
|
+
</html>
|
|
557
|
+
);
|
|
558
|
+
}
|
|
559
|
+
`;
|
|
560
|
+
await writeFile(join(appDir, `layout.${componentExt(language)}`), layoutImports);
|
|
561
|
+
const homePage = tailwind
|
|
562
|
+
? useShadcn
|
|
563
|
+
? `import { buttonVariants } from "@/components/ui/button";
|
|
564
|
+
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
|
|
565
|
+
import { Badge } from "@/components/ui/badge";
|
|
566
|
+
|
|
567
|
+
export default function Home() {
|
|
568
|
+
return (
|
|
569
|
+
<main className="min-h-screen flex items-center justify-center px-6 py-12">
|
|
570
|
+
<Card className="max-w-2xl w-full">
|
|
571
|
+
<CardHeader>
|
|
572
|
+
<Badge variant="secondary" className="w-fit mb-2">Welcome</Badge>
|
|
573
|
+
<CardTitle className="text-3xl sm:text-5xl">${projectName}</CardTitle>
|
|
574
|
+
<CardDescription>
|
|
575
|
+
Get started by editing <code>${srcDir ? "app/src/" : "app/"}page.${componentExt(language)}</code>.
|
|
576
|
+
</CardDescription>
|
|
577
|
+
</CardHeader>
|
|
578
|
+
<CardContent className="flex gap-2">
|
|
579
|
+
<a
|
|
580
|
+
href="https://swift-rust.dev/docs"
|
|
581
|
+
className={buttonVariants({ variant: "default" })}
|
|
582
|
+
>
|
|
583
|
+
Read the docs →
|
|
584
|
+
</a>
|
|
585
|
+
<a
|
|
586
|
+
href="https://github.com/swift-rust/swift-rust"
|
|
587
|
+
className={buttonVariants({ variant: "outline" })}
|
|
588
|
+
>
|
|
589
|
+
GitHub
|
|
590
|
+
</a>
|
|
591
|
+
</CardContent>
|
|
592
|
+
</Card>
|
|
593
|
+
</main>
|
|
594
|
+
);
|
|
595
|
+
}
|
|
596
|
+
`
|
|
597
|
+
: `export default function Home() {
|
|
598
|
+
return (
|
|
599
|
+
<main className="min-h-screen flex items-center justify-center px-6">
|
|
600
|
+
<div className="max-w-2xl text-center">
|
|
601
|
+
<div className="inline-block mb-4 px-3 py-1 text-xs font-medium rounded-full bg-accent/10 text-accent">
|
|
602
|
+
Welcome
|
|
603
|
+
</div>
|
|
604
|
+
<h1 className="text-5xl sm:text-7xl font-bold tracking-tight mb-6">
|
|
605
|
+
${projectName}
|
|
606
|
+
</h1>
|
|
607
|
+
<p className="text-lg text-fg-secondary mb-8">
|
|
608
|
+
Get started by editing <code>${srcDir ? "app/src/" : "app/"}page.${componentExt(language)}</code>.
|
|
609
|
+
</p>
|
|
610
|
+
<a
|
|
611
|
+
href="https://swift-rust.dev/docs"
|
|
612
|
+
className="inline-flex items-center gap-2 px-5 py-2.5 rounded-lg bg-fg text-bg font-medium text-sm hover:opacity-90 transition-opacity"
|
|
613
|
+
>
|
|
614
|
+
Read the docs →
|
|
615
|
+
</a>
|
|
616
|
+
</div>
|
|
617
|
+
</main>
|
|
618
|
+
);
|
|
619
|
+
}
|
|
620
|
+
`
|
|
621
|
+
: `export default function Home() {
|
|
622
|
+
return (
|
|
623
|
+
<main style={{ minHeight: "100vh", display: "flex", alignItems: "center", justifyContent: "center", padding: "2rem" }}>
|
|
624
|
+
<div style={{ maxWidth: "32rem", textAlign: "center" }}>
|
|
625
|
+
<h1>${projectName}</h1>
|
|
626
|
+
<p>Get started by editing <code>${srcDir ? "app/src/" : "app/"}page.${componentExt(language)}</code>.</p>
|
|
627
|
+
<a href="https://swift-rust.dev/docs">Read the docs →</a>
|
|
628
|
+
</div>
|
|
629
|
+
</main>
|
|
630
|
+
);
|
|
631
|
+
}
|
|
632
|
+
`;
|
|
633
|
+
await writeFile(join(appDir, `page.${componentExt(language)}`), homePage);
|
|
634
|
+
const notFoundPage = tailwind
|
|
635
|
+
? `export const metadata = { title: "Not found" };
|
|
636
|
+
|
|
637
|
+
export default function NotFound() {
|
|
638
|
+
return (
|
|
639
|
+
<main className="min-h-screen flex items-center justify-center px-6">
|
|
640
|
+
<div className="text-center">
|
|
641
|
+
<h1 className="text-6xl font-bold mb-4">404</h1>
|
|
642
|
+
<p className="text-fg-secondary">Page not found</p>
|
|
643
|
+
<a href="/" className="text-accent mt-6 inline-block">← Go home</a>
|
|
644
|
+
</div>
|
|
645
|
+
</main>
|
|
646
|
+
);
|
|
647
|
+
}
|
|
648
|
+
`
|
|
649
|
+
: `export default function NotFound() {
|
|
650
|
+
return (
|
|
651
|
+
<main>
|
|
652
|
+
<h1>404</h1>
|
|
653
|
+
<p>Page not found</p>
|
|
654
|
+
<a href="/">← Go home</a>
|
|
655
|
+
</main>
|
|
656
|
+
);
|
|
657
|
+
}
|
|
658
|
+
`;
|
|
659
|
+
await writeFile(join(appDir, `not-found.${componentExt(language)}`), notFoundPage);
|
|
660
|
+
if (linter === "biome") {
|
|
661
|
+
const biome = {
|
|
662
|
+
$schema: "https://biomejs.dev/schemas/1.9.0/schema.json",
|
|
663
|
+
vcs: { enabled: true, clientKind: "git", useIgnoreFile: true },
|
|
664
|
+
files: { ignore: [".swift-rust", "node_modules", "dist", ".turbo"] },
|
|
665
|
+
formatter: { enabled: true, indentStyle: "space", indentWidth: 2 },
|
|
666
|
+
organizeImports: { enabled: true },
|
|
667
|
+
linter: {
|
|
668
|
+
enabled: true,
|
|
669
|
+
rules: { recommended: true, a11y: { noSvgWithoutTitle: "off" } },
|
|
670
|
+
},
|
|
671
|
+
javascript: { formatter: { quoteStyle: "double", semicolons: "always" } },
|
|
672
|
+
};
|
|
673
|
+
await writeFile(join(target, "biome.json"), `${JSON.stringify(biome, null, 2)}\n`);
|
|
674
|
+
}
|
|
675
|
+
else {
|
|
676
|
+
const eslint = `import swiftRust from "eslint-config-swift-rust";
|
|
677
|
+
|
|
678
|
+
export default [
|
|
679
|
+
...swiftRust,
|
|
680
|
+
{
|
|
681
|
+
ignores: [".swift-rust/**", "node_modules/**", "dist/**", ".turbo/**"],
|
|
682
|
+
},
|
|
683
|
+
];
|
|
684
|
+
`;
|
|
685
|
+
await writeFile(join(target, "eslint.config.mjs"), eslint);
|
|
686
|
+
}
|
|
687
|
+
const readme = `# ${projectName}
|
|
688
|
+
|
|
689
|
+
Built with [swift-rust](https://swift-rust.dev) — the React framework powered with Rust + Bun. 10x faster than Next.js.
|
|
690
|
+
|
|
691
|
+
## Scripts
|
|
692
|
+
|
|
693
|
+
- \`bun run dev\` — start the dev server
|
|
694
|
+
- \`bun run build\` — build for production
|
|
695
|
+
- \`bun run start\` — start the production server
|
|
696
|
+
- \`bun run lint\` — run the linter
|
|
697
|
+
- \`bun run typecheck\` — run TypeScript checks (if TS)
|
|
698
|
+
- \`bun run test\` — run tests
|
|
699
|
+
- \`bun run format\` — format the code
|
|
700
|
+
|
|
701
|
+
## Project structure
|
|
702
|
+
|
|
703
|
+
${srcDir
|
|
704
|
+
? `\`\`\`\napp/\n src/\n layout.${componentExt(language)}\n page.${componentExt(language)}\n not-found.${componentExt(language)}\ncomponents/\nlib/\n\`\`\``
|
|
705
|
+
: `\`\`\`\napp/\n layout.${componentExt(language)}\n page.${componentExt(language)}\n not-found.${componentExt(language)}\ncomponents/\nlib/\n\`\`\``}
|
|
706
|
+
|
|
707
|
+
## Learn more
|
|
708
|
+
|
|
709
|
+
- [Documentation](https://swift-rust.dev/docs)
|
|
710
|
+
- [Examples](https://github.com/swift-rust/swift-rust/tree/main/examples)
|
|
711
|
+
- [Discord](https://discord.gg/swift-rust)
|
|
712
|
+
`;
|
|
713
|
+
await writeFile(join(target, "README.md"), readme);
|
|
714
|
+
const envExample = `# Rename to .env.local to use
|
|
715
|
+
# SWIFT_RUST_RUNTIME=/path/to/bun
|
|
716
|
+
`;
|
|
717
|
+
await writeFile(join(target, ".env.example"), envExample);
|
|
718
|
+
const favicon = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><rect width="32" height="32" rx="7" fill="#0070f3"/><path d="M8 8L16 24L24 8" stroke="white" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/><circle cx="16" cy="16" r="2.5" fill="white"/></svg>
|
|
719
|
+
`;
|
|
720
|
+
await writeFile(join(target, "public", "favicon.svg"), favicon);
|
|
721
|
+
if (useShadcn) {
|
|
722
|
+
await scaffoldShadcn({ target, uiDir, libDir, componentExt: componentExt(language), srcDir });
|
|
723
|
+
}
|
|
724
|
+
}
|
|
725
|
+
async function scaffoldShadcn(options) {
|
|
726
|
+
const { target, uiDir, libDir, componentExt, srcDir } = options;
|
|
727
|
+
const utilsContent = `import { clsx, type ClassValue } from "clsx";
|
|
728
|
+
import { twMerge } from "tailwind-merge";
|
|
729
|
+
|
|
730
|
+
export function cn(...inputs: ClassValue[]) {
|
|
731
|
+
return twMerge(clsx(inputs));
|
|
732
|
+
}
|
|
733
|
+
`;
|
|
734
|
+
const buttonContent = `import * as React from "react";
|
|
735
|
+
import { cva, type VariantProps } from "class-variance-authority";
|
|
736
|
+
import { cn } from "@/lib/utils";
|
|
737
|
+
|
|
738
|
+
const buttonVariants = cva(
|
|
739
|
+
"inline-flex items-center justify-center gap-2 rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ui-ring)] focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
|
|
740
|
+
{
|
|
741
|
+
variants: {
|
|
742
|
+
variant: {
|
|
743
|
+
default: "bg-[var(--ui-primary)] text-[var(--ui-primary-fg)] hover:opacity-90",
|
|
744
|
+
destructive: "bg-[var(--ui-destructive)] text-white hover:opacity-90",
|
|
745
|
+
outline:
|
|
746
|
+
"border border-[var(--ui-border)] bg-[var(--ui-bg)] hover:bg-[var(--ui-accent)] hover:text-[var(--ui-accent-fg)]",
|
|
747
|
+
secondary: "bg-[var(--ui-secondary)] text-[var(--ui-secondary-fg)] hover:opacity-90",
|
|
748
|
+
ghost: "hover:bg-[var(--ui-accent)] hover:text-[var(--ui-accent-fg)]",
|
|
749
|
+
link: "text-[var(--ui-primary)] underline-offset-4 hover:underline",
|
|
750
|
+
},
|
|
751
|
+
size: {
|
|
752
|
+
default: "h-9 px-4 py-2",
|
|
753
|
+
sm: "h-8 rounded-md px-3 text-xs",
|
|
754
|
+
lg: "h-10 rounded-md px-8",
|
|
755
|
+
icon: "h-9 w-9",
|
|
756
|
+
},
|
|
757
|
+
},
|
|
758
|
+
defaultVariants: {
|
|
759
|
+
variant: "default",
|
|
760
|
+
size: "default",
|
|
761
|
+
},
|
|
762
|
+
},
|
|
763
|
+
);
|
|
764
|
+
|
|
765
|
+
export interface ButtonProps
|
|
766
|
+
extends React.ButtonHTMLAttributes<HTMLButtonElement>,
|
|
767
|
+
VariantProps<typeof buttonVariants> {}
|
|
768
|
+
|
|
769
|
+
export const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(
|
|
770
|
+
({ className, variant, size, ...props }, ref) => (
|
|
771
|
+
<button ref={ref} className={cn(buttonVariants({ variant, size, className }))} {...props} />
|
|
772
|
+
),
|
|
773
|
+
);
|
|
774
|
+
Button.displayName = "Button";
|
|
775
|
+
|
|
776
|
+
export { buttonVariants };
|
|
777
|
+
`;
|
|
778
|
+
const cardContent = `import * as React from "react";
|
|
779
|
+
import { cn } from "@/lib/utils";
|
|
780
|
+
|
|
781
|
+
export const Card = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(
|
|
782
|
+
({ className, ...props }, ref) => (
|
|
783
|
+
<div
|
|
784
|
+
ref={ref}
|
|
785
|
+
className={cn(
|
|
786
|
+
"rounded-xl border border-[var(--ui-border)] bg-[var(--ui-card)] text-[var(--ui-card-fg)] shadow-sm",
|
|
787
|
+
className,
|
|
788
|
+
)}
|
|
789
|
+
{...props}
|
|
790
|
+
/>
|
|
791
|
+
),
|
|
792
|
+
);
|
|
793
|
+
Card.displayName = "Card";
|
|
794
|
+
|
|
795
|
+
export const CardHeader = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(
|
|
796
|
+
({ className, ...props }, ref) => (
|
|
797
|
+
<div ref={ref} className={cn("flex flex-col space-y-1.5 p-6", className)} {...props} />
|
|
798
|
+
),
|
|
799
|
+
);
|
|
800
|
+
CardHeader.displayName = "CardHeader";
|
|
801
|
+
|
|
802
|
+
export const CardTitle = React.forwardRef<
|
|
803
|
+
HTMLDivElement,
|
|
804
|
+
React.HTMLAttributes<HTMLDivElement>
|
|
805
|
+
>(({ className, ...props }, ref) => (
|
|
806
|
+
<div
|
|
807
|
+
ref={ref}
|
|
808
|
+
className={cn("font-semibold leading-none tracking-tight", className)}
|
|
809
|
+
{...props}
|
|
810
|
+
/>
|
|
811
|
+
));
|
|
812
|
+
CardTitle.displayName = "CardTitle";
|
|
813
|
+
|
|
814
|
+
export const CardDescription = React.forwardRef<
|
|
815
|
+
HTMLDivElement,
|
|
816
|
+
React.HTMLAttributes<HTMLDivElement>
|
|
817
|
+
>(({ className, ...props }, ref) => (
|
|
818
|
+
<div
|
|
819
|
+
ref={ref}
|
|
820
|
+
className={cn("text-sm text-[var(--ui-muted-fg)]", className)}
|
|
821
|
+
{...props}
|
|
822
|
+
/>
|
|
823
|
+
));
|
|
824
|
+
CardDescription.displayName = "CardDescription";
|
|
825
|
+
|
|
826
|
+
export const CardContent = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(
|
|
827
|
+
({ className, ...props }, ref) => (
|
|
828
|
+
<div ref={ref} className={cn("p-6 pt-0", className)} {...props} />
|
|
829
|
+
),
|
|
830
|
+
);
|
|
831
|
+
CardContent.displayName = "CardContent";
|
|
832
|
+
|
|
833
|
+
export const CardFooter = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(
|
|
834
|
+
({ className, ...props }, ref) => (
|
|
835
|
+
<div ref={ref} className={cn("flex items-center p-6 pt-0", className)} {...props} />
|
|
836
|
+
),
|
|
837
|
+
);
|
|
838
|
+
CardFooter.displayName = "CardFooter";
|
|
839
|
+
`;
|
|
840
|
+
const inputContent = `import * as React from "react";
|
|
841
|
+
import { cn } from "@/lib/utils";
|
|
842
|
+
|
|
843
|
+
export type InputProps = React.InputHTMLAttributes<HTMLInputElement>;
|
|
844
|
+
|
|
845
|
+
export const Input = React.forwardRef<HTMLInputElement, InputProps>(
|
|
846
|
+
({ className, type, ...props }, ref) => (
|
|
847
|
+
<input
|
|
848
|
+
type={type}
|
|
849
|
+
ref={ref}
|
|
850
|
+
className={cn(
|
|
851
|
+
"flex h-9 w-full rounded-md border border-[var(--ui-border)] bg-transparent px-3 py-1 text-sm shadow-sm transition-colors",
|
|
852
|
+
"file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-[var(--ui-fg)]",
|
|
853
|
+
"placeholder:text-[var(--ui-muted-fg)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ui-ring)] focus-visible:ring-offset-1",
|
|
854
|
+
"disabled:cursor-not-allowed disabled:opacity-50",
|
|
855
|
+
className,
|
|
856
|
+
)}
|
|
857
|
+
{...props}
|
|
858
|
+
/>
|
|
859
|
+
),
|
|
860
|
+
);
|
|
861
|
+
Input.displayName = "Input";
|
|
862
|
+
`;
|
|
863
|
+
const labelContent = `import * as React from "react";
|
|
864
|
+
import { cn } from "@/lib/utils";
|
|
865
|
+
|
|
866
|
+
export const Label = React.forwardRef<
|
|
867
|
+
HTMLLabelElement,
|
|
868
|
+
React.LabelHTMLAttributes<HTMLLabelElement>
|
|
869
|
+
>(({ className, ...props }, ref) => (
|
|
870
|
+
<label
|
|
871
|
+
ref={ref}
|
|
872
|
+
className={cn(
|
|
873
|
+
"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70",
|
|
874
|
+
className,
|
|
875
|
+
)}
|
|
876
|
+
{...props}
|
|
877
|
+
/>
|
|
878
|
+
));
|
|
879
|
+
Label.displayName = "Label";
|
|
880
|
+
`;
|
|
881
|
+
const badgeContent = `import * as React from "react";
|
|
882
|
+
import { cva, type VariantProps } from "class-variance-authority";
|
|
883
|
+
import { cn } from "@/lib/utils";
|
|
884
|
+
|
|
885
|
+
const badgeVariants = cva(
|
|
886
|
+
"inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-[var(--ui-ring)] focus:ring-offset-2",
|
|
887
|
+
{
|
|
888
|
+
variants: {
|
|
889
|
+
variant: {
|
|
890
|
+
default:
|
|
891
|
+
"border-transparent bg-[var(--ui-primary)] text-[var(--ui-primary-fg)] hover:opacity-90",
|
|
892
|
+
secondary:
|
|
893
|
+
"border-transparent bg-[var(--ui-secondary)] text-[var(--ui-secondary-fg)] hover:opacity-90",
|
|
894
|
+
destructive:
|
|
895
|
+
"border-transparent bg-[var(--ui-destructive)] text-white hover:opacity-90",
|
|
896
|
+
outline: "text-[var(--ui-fg)] border-[var(--ui-border)]",
|
|
897
|
+
},
|
|
898
|
+
},
|
|
899
|
+
defaultVariants: {
|
|
900
|
+
variant: "default",
|
|
901
|
+
},
|
|
902
|
+
},
|
|
903
|
+
);
|
|
904
|
+
|
|
905
|
+
export interface BadgeProps
|
|
906
|
+
extends React.HTMLAttributes<HTMLDivElement>,
|
|
907
|
+
VariantProps<typeof badgeVariants> {}
|
|
908
|
+
|
|
909
|
+
export function Badge({ className, variant, ...props }: BadgeProps) {
|
|
910
|
+
return <div className={cn(badgeVariants({ variant }), className)} {...props} />;
|
|
911
|
+
}
|
|
912
|
+
|
|
913
|
+
export { badgeVariants };
|
|
914
|
+
`;
|
|
915
|
+
const componentsJson = `{
|
|
916
|
+
"$schema": "https://ui.shadcn.com/schema.json",
|
|
917
|
+
"style": "new-york",
|
|
918
|
+
"rsc": true,
|
|
919
|
+
"tsx": ${componentExt === "tsx"},
|
|
920
|
+
"tailwind": {
|
|
921
|
+
"config": "",
|
|
922
|
+
"css": "${srcDir ? "app/src/globals.css" : "app/globals.css"}",
|
|
923
|
+
"baseColor": "zinc",
|
|
924
|
+
"cssVariables": true,
|
|
925
|
+
"prefix": ""
|
|
926
|
+
},
|
|
927
|
+
"aliases": {
|
|
928
|
+
"components": "@/components",
|
|
929
|
+
"utils": "@/lib/utils",
|
|
930
|
+
"ui": "@/components/ui",
|
|
931
|
+
"lib": "@/lib",
|
|
932
|
+
"hooks": "@/hooks"
|
|
933
|
+
},
|
|
934
|
+
"iconLibrary": "lucide"
|
|
935
|
+
}
|
|
936
|
+
`;
|
|
937
|
+
await writeFile(join(libDir, "utils.ts"), utilsContent);
|
|
938
|
+
await writeFile(join(uiDir, `button.${componentExt}`), buttonContent);
|
|
939
|
+
await writeFile(join(uiDir, `card.${componentExt}`), cardContent);
|
|
940
|
+
await writeFile(join(uiDir, `input.${componentExt}`), inputContent);
|
|
941
|
+
await writeFile(join(uiDir, `label.${componentExt}`), labelContent);
|
|
942
|
+
await writeFile(join(uiDir, `badge.${componentExt}`), badgeContent);
|
|
943
|
+
await writeFile(join(target, "components.json"), `${componentsJson}\n`);
|
|
944
|
+
}
|
|
945
|
+
async function runInstall(target) {
|
|
946
|
+
const { spawn } = await import("node:child_process");
|
|
947
|
+
return new Promise((resolve, reject) => {
|
|
948
|
+
const proc = spawn("bun", ["install"], { cwd: target, stdio: "inherit" });
|
|
949
|
+
proc.on("exit", (code) => {
|
|
950
|
+
if (code === 0)
|
|
951
|
+
resolve();
|
|
952
|
+
else
|
|
953
|
+
reject(new Error(`bun install exited with code ${code}`));
|
|
954
|
+
});
|
|
955
|
+
proc.on("error", reject);
|
|
956
|
+
});
|
|
957
|
+
}
|
|
958
|
+
const SHADCN_DEFAULT_COMPONENTS = ["button", "card", "input", "label", "badge"];
|
|
959
|
+
async function runShadcnAdd(target, components) {
|
|
960
|
+
const { spawn } = await import("node:child_process");
|
|
961
|
+
return new Promise((resolve) => {
|
|
962
|
+
const args = [
|
|
963
|
+
"--bun",
|
|
964
|
+
"shadcn@latest",
|
|
965
|
+
"add",
|
|
966
|
+
...components,
|
|
967
|
+
"--yes",
|
|
968
|
+
"--overwrite",
|
|
969
|
+
"--cwd",
|
|
970
|
+
target,
|
|
971
|
+
"--silent",
|
|
972
|
+
];
|
|
973
|
+
const proc = spawn("bunx", args, { cwd: target, stdio: "pipe" });
|
|
974
|
+
proc.on("exit", (code) => {
|
|
975
|
+
resolve(code === 0);
|
|
976
|
+
});
|
|
977
|
+
proc.on("error", () => resolve(false));
|
|
978
|
+
});
|
|
979
|
+
}
|
|
980
|
+
async function main() {
|
|
981
|
+
const args = process.argv.slice(2);
|
|
982
|
+
if (args.includes("--help") || args.includes("-h")) {
|
|
983
|
+
console.log(HELP);
|
|
984
|
+
process.exit(0);
|
|
985
|
+
}
|
|
986
|
+
const isTTY = process.stdout.isTTY === true;
|
|
987
|
+
if (!isTTY && !args.includes("--yes") && !args.includes("-y")) {
|
|
988
|
+
console.error("Non-interactive mode: pass --yes to skip prompts, or run in a terminal.");
|
|
989
|
+
process.exit(1);
|
|
990
|
+
}
|
|
991
|
+
const quiet = !isTTY;
|
|
992
|
+
const flags = parseFlags(args);
|
|
993
|
+
const positional = flags._name;
|
|
994
|
+
if (!quiet)
|
|
995
|
+
p.intro(pc.bgCyan(pc.black(" create-swift-rust ")));
|
|
996
|
+
const answers = await askQuestions(flags, positional);
|
|
997
|
+
if (!answers)
|
|
998
|
+
process.exit(1);
|
|
999
|
+
const { projectName, tailwind, linter, srcDir, install } = answers;
|
|
1000
|
+
const target = resolve(process.cwd(), projectName);
|
|
1001
|
+
if (projectName === ".") {
|
|
1002
|
+
if ((await listDir(target)).length > 0) {
|
|
1003
|
+
if (quiet) {
|
|
1004
|
+
console.error(`Target directory ${target} is not empty. Aborting.`);
|
|
1005
|
+
process.exit(1);
|
|
1006
|
+
}
|
|
1007
|
+
const proceed = await p.confirm({
|
|
1008
|
+
message: `Target directory ${pc.cyan(target)} is not empty. Continue?`,
|
|
1009
|
+
initialValue: false,
|
|
1010
|
+
});
|
|
1011
|
+
if (!proceed) {
|
|
1012
|
+
if (!quiet)
|
|
1013
|
+
p.cancel("Aborted.");
|
|
1014
|
+
process.exit(1);
|
|
1015
|
+
}
|
|
1016
|
+
}
|
|
1017
|
+
}
|
|
1018
|
+
else {
|
|
1019
|
+
if (await pathExists(target)) {
|
|
1020
|
+
if (quiet) {
|
|
1021
|
+
console.error(`Directory ${target} already exists. Aborting.`);
|
|
1022
|
+
}
|
|
1023
|
+
else {
|
|
1024
|
+
p.cancel(`Directory ${pc.red(target)} already exists.`);
|
|
1025
|
+
}
|
|
1026
|
+
process.exit(1);
|
|
1027
|
+
}
|
|
1028
|
+
}
|
|
1029
|
+
const summary = [
|
|
1030
|
+
`${pc.cyan("•")} Project: ${pc.bold(projectName === "." ? resolve(target) : projectName)}`,
|
|
1031
|
+
`${pc.cyan("•")} Language: ${answers.language === "ts" ? "TypeScript" : "JavaScript"}`,
|
|
1032
|
+
`${pc.cyan("•")} Renderer: ${answers.renderer}`,
|
|
1033
|
+
`${pc.cyan("•")} Linter: ${linter === "biome" ? "Biome" : "ESLint"}`,
|
|
1034
|
+
`${pc.cyan("•")} Tailwind: ${tailwind ? "Yes" : "No"}`,
|
|
1035
|
+
`${pc.cyan("•")} shadcn UI: ${answers.useShadcn ? "Yes" : "No"}`,
|
|
1036
|
+
`${pc.cyan("•")} src/ dir: ${srcDir ? "Yes (app/src/)" : "No"}`,
|
|
1037
|
+
`${pc.cyan("•")} Import as: ${answers.importAlias}`,
|
|
1038
|
+
`${pc.cyan("•")} Install: ${install ? "Yes" : "No"}`,
|
|
1039
|
+
].join("\n");
|
|
1040
|
+
if (quiet) {
|
|
1041
|
+
console.log(`Configuration:\n${summary}`);
|
|
1042
|
+
}
|
|
1043
|
+
else {
|
|
1044
|
+
p.log.step(`Configuration:\n${summary}`);
|
|
1045
|
+
const confirm = await p.confirm({
|
|
1046
|
+
message: "Looks good?",
|
|
1047
|
+
initialValue: true,
|
|
1048
|
+
});
|
|
1049
|
+
if (p.isCancel(confirm) || !confirm) {
|
|
1050
|
+
p.cancel("Aborted.");
|
|
1051
|
+
process.exit(1);
|
|
1052
|
+
}
|
|
1053
|
+
}
|
|
1054
|
+
console.log(`Scaffolding ${pc.cyan(projectName === "." ? "." : projectName)}…`);
|
|
1055
|
+
try {
|
|
1056
|
+
await writeProjectFiles(target, answers);
|
|
1057
|
+
console.log(`✓ Scaffolded project into ${pc.green(target)}`);
|
|
1058
|
+
let installSucceeded = false;
|
|
1059
|
+
if (install) {
|
|
1060
|
+
console.log("Running bun install…");
|
|
1061
|
+
try {
|
|
1062
|
+
await runInstall(target);
|
|
1063
|
+
console.log("✓ Installed dependencies");
|
|
1064
|
+
installSucceeded = true;
|
|
1065
|
+
}
|
|
1066
|
+
catch (_err) {
|
|
1067
|
+
console.error("Failed to install dependencies. Run `bun install` manually.");
|
|
1068
|
+
}
|
|
1069
|
+
}
|
|
1070
|
+
if (answers.useShadcn && installSucceeded) {
|
|
1071
|
+
console.log("Fetching canonical shadcn components…");
|
|
1072
|
+
const ok = await runShadcnAdd(target, SHADCN_DEFAULT_COMPONENTS);
|
|
1073
|
+
if (ok) {
|
|
1074
|
+
console.log(`✓ Added ${SHADCN_DEFAULT_COMPONENTS.length} shadcn components from the registry`);
|
|
1075
|
+
}
|
|
1076
|
+
else {
|
|
1077
|
+
const cwdArg = projectName === "." ? "." : `./${projectName}`;
|
|
1078
|
+
console.log(`${pc.yellow("!")} Could not fetch shadcn components from the registry. Using bundled shadcn-style components as a fallback. You can retry later with: ${pc.cyan(`bunx --bun shadcn@latest add ${SHADCN_DEFAULT_COMPONENTS.join(" ")} --cwd ${cwdArg}`)}`);
|
|
1079
|
+
}
|
|
1080
|
+
}
|
|
1081
|
+
const next = projectName === "." ? "bun run dev" : `cd ${projectName}\nbun run dev`;
|
|
1082
|
+
console.log(`\n${pc.green("Done!")} Next steps:\n${pc.cyan(next)}`);
|
|
1083
|
+
}
|
|
1084
|
+
catch (err) {
|
|
1085
|
+
console.error("Scaffolding failed:", err.message);
|
|
1086
|
+
process.exit(1);
|
|
1087
|
+
}
|
|
1088
|
+
}
|
|
1089
|
+
async function listDir(dir) {
|
|
1090
|
+
try {
|
|
1091
|
+
const { readdir } = await import("node:fs/promises");
|
|
1092
|
+
return await readdir(dir);
|
|
1093
|
+
}
|
|
1094
|
+
catch {
|
|
1095
|
+
return [];
|
|
1096
|
+
}
|
|
1097
|
+
}
|
|
1098
|
+
if (import.meta.main) {
|
|
1099
|
+
main().catch((err) => {
|
|
1100
|
+
console.error(err);
|
|
1101
|
+
process.exit(1);
|
|
1102
|
+
});
|
|
1103
|
+
}
|
|
1104
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"smoke.test.d.ts","sourceRoot":"","sources":["../src/smoke.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"smoke.test.js","sourceRoot":"","sources":["../src/smoke.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,KAAK,GAAG,MAAM,SAAS,CAAC;AAE/B,IAAI,CAAC,2CAA2C,EAAE,GAAG,EAAE;IACrD,MAAM,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;AAC5B,CAAC,CAAC,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "create-swift-rust",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "Create a new swift-rust project from a template.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"homepage": "https://swift-rust.dev",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/swift-rust/swift-rust.git",
|
|
10
|
+
"directory": "packages/create-swift-rust"
|
|
11
|
+
},
|
|
12
|
+
"bugs": {
|
|
13
|
+
"url": "https://github.com/swift-rust/swift-rust/issues"
|
|
14
|
+
},
|
|
15
|
+
"type": "module",
|
|
16
|
+
"main": "./dist/index.js",
|
|
17
|
+
"bin": {
|
|
18
|
+
"create-swift-rust": "./dist/index.js"
|
|
19
|
+
},
|
|
20
|
+
"files": [
|
|
21
|
+
"dist",
|
|
22
|
+
"templates"
|
|
23
|
+
],
|
|
24
|
+
"scripts": {
|
|
25
|
+
"build": "tsc -p tsconfig.json",
|
|
26
|
+
"dev": "tsc -p tsconfig.json --watch",
|
|
27
|
+
"lint": "biome check $(pwd)/src",
|
|
28
|
+
"test": "bun test",
|
|
29
|
+
"typecheck": "tsc --noEmit",
|
|
30
|
+
"clean": "rm -rf dist .turbo"
|
|
31
|
+
},
|
|
32
|
+
"engines": {
|
|
33
|
+
"node": ">=20"
|
|
34
|
+
},
|
|
35
|
+
"dependencies": {
|
|
36
|
+
"@clack/prompts": "^0.7.0",
|
|
37
|
+
"picocolors": "^1.0.1"
|
|
38
|
+
},
|
|
39
|
+
"devDependencies": {
|
|
40
|
+
"@types/bun": "^1.3.0",
|
|
41
|
+
"@types/node": "^22.0.0",
|
|
42
|
+
"typescript": "^6.0.0"
|
|
43
|
+
},
|
|
44
|
+
"publishConfig": {
|
|
45
|
+
"access": "public"
|
|
46
|
+
}
|
|
47
|
+
}
|