@mayrlabs/setup-project 0.1.1 → 0.1.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/CHANGELOG.md +12 -0
- package/dist/index.js +571 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +619 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +6 -3
package/CHANGELOG.md
CHANGED
package/dist/index.js
ADDED
|
@@ -0,0 +1,571 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* MayR Labs CLI
|
|
5
|
+
* Build. Ship. Repeat intelligently.
|
|
6
|
+
*
|
|
7
|
+
* (c) 2026 MayR Labs
|
|
8
|
+
* https://mayrlabs.com
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
"use strict";
|
|
12
|
+
var __create = Object.create;
|
|
13
|
+
var __defProp = Object.defineProperty;
|
|
14
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
15
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
16
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
17
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
18
|
+
var __copyProps = (to, from, except, desc) => {
|
|
19
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
20
|
+
for (let key of __getOwnPropNames(from))
|
|
21
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
22
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
23
|
+
}
|
|
24
|
+
return to;
|
|
25
|
+
};
|
|
26
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
27
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
28
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
29
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
30
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
31
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
32
|
+
mod
|
|
33
|
+
));
|
|
34
|
+
|
|
35
|
+
// src/index.ts
|
|
36
|
+
var import_prompts6 = require("@clack/prompts");
|
|
37
|
+
var import_picocolors = __toESM(require("picocolors"));
|
|
38
|
+
var import_commander = require("commander");
|
|
39
|
+
|
|
40
|
+
// src/services/husky.ts
|
|
41
|
+
var import_prompts = require("@clack/prompts");
|
|
42
|
+
|
|
43
|
+
// src/utils/pm.ts
|
|
44
|
+
var import_execa = require("execa");
|
|
45
|
+
async function getPackageManager() {
|
|
46
|
+
const userAgent = process.env.npm_config_user_agent;
|
|
47
|
+
if (userAgent) {
|
|
48
|
+
if (userAgent.startsWith("yarn")) return "yarn";
|
|
49
|
+
if (userAgent.startsWith("pnpm")) return "pnpm";
|
|
50
|
+
if (userAgent.startsWith("bun")) return "bun";
|
|
51
|
+
}
|
|
52
|
+
return "npm";
|
|
53
|
+
}
|
|
54
|
+
async function installPackages(packages, dev = false) {
|
|
55
|
+
const pm = await getPackageManager();
|
|
56
|
+
const args = [];
|
|
57
|
+
if (pm === "npm") {
|
|
58
|
+
args.push("install");
|
|
59
|
+
if (dev) args.push("--save-dev");
|
|
60
|
+
} else if (pm === "yarn") {
|
|
61
|
+
args.push("add");
|
|
62
|
+
if (dev) args.push("-D");
|
|
63
|
+
} else if (pm === "pnpm") {
|
|
64
|
+
args.push("add");
|
|
65
|
+
if (dev) args.push("-D");
|
|
66
|
+
} else if (pm === "bun") {
|
|
67
|
+
args.push("add");
|
|
68
|
+
if (dev) args.push("-d");
|
|
69
|
+
}
|
|
70
|
+
await (0, import_execa.execa)(pm, [...args, ...packages]);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// src/services/husky.ts
|
|
74
|
+
var import_execa2 = require("execa");
|
|
75
|
+
var import_fs_extra = __toESM(require("fs-extra"));
|
|
76
|
+
async function promptHusky(config) {
|
|
77
|
+
const hookType = await (0, import_prompts.select)({
|
|
78
|
+
message: "What pre-commit hook would you like to use?",
|
|
79
|
+
options: [
|
|
80
|
+
{ value: "lint-staged", label: "lint-staged" },
|
|
81
|
+
{ value: "custom", label: "Custom script" },
|
|
82
|
+
{ value: "none", label: "None" }
|
|
83
|
+
]
|
|
84
|
+
});
|
|
85
|
+
config.huskyHookType = hookType;
|
|
86
|
+
if (hookType === "lint-staged") {
|
|
87
|
+
config.lintStaged = true;
|
|
88
|
+
} else if (hookType === "custom") {
|
|
89
|
+
const script = await (0, import_prompts.text)({
|
|
90
|
+
message: "Enter your custom pre-commit script:",
|
|
91
|
+
placeholder: "npm test",
|
|
92
|
+
validate(value) {
|
|
93
|
+
if (value.length === 0) return "Value is required!";
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
config.huskyCustomScript = script;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
async function installHusky(config) {
|
|
100
|
+
await installPackages(["husky"], true);
|
|
101
|
+
try {
|
|
102
|
+
await (0, import_execa2.execa)("npx", ["husky", "init"]);
|
|
103
|
+
} catch (e) {
|
|
104
|
+
await (0, import_execa2.execa)("npm", ["pkg", "set", "scripts.prepare=husky"]);
|
|
105
|
+
await (0, import_execa2.execa)("npm", ["run", "prepare"]);
|
|
106
|
+
}
|
|
107
|
+
if (config.huskyHookType === "lint-staged") {
|
|
108
|
+
await import_fs_extra.default.outputFile(".husky/pre-commit", "npx lint-staged\n", {
|
|
109
|
+
mode: 493
|
|
110
|
+
});
|
|
111
|
+
} else if (config.huskyHookType === "custom" && config.huskyCustomScript) {
|
|
112
|
+
await import_fs_extra.default.outputFile(".husky/pre-commit", `${config.huskyCustomScript}
|
|
113
|
+
`, {
|
|
114
|
+
mode: 493
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// src/services/formatter.ts
|
|
120
|
+
var import_prompts2 = require("@clack/prompts");
|
|
121
|
+
var import_fs_extra2 = __toESM(require("fs-extra"));
|
|
122
|
+
async function promptFormatter(config) {
|
|
123
|
+
if (!config.formatterChoice) {
|
|
124
|
+
const formatter = await (0, import_prompts2.select)({
|
|
125
|
+
message: "Select a formatter:",
|
|
126
|
+
options: [
|
|
127
|
+
{ value: "prettier", label: "Prettier" },
|
|
128
|
+
{ value: "oxfmt", label: "Oxfmt" }
|
|
129
|
+
]
|
|
130
|
+
});
|
|
131
|
+
config.formatterChoice = formatter;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
async function installFormatter(config) {
|
|
135
|
+
if (config.formatterChoice === "prettier") {
|
|
136
|
+
await installPackages(["prettier"], true);
|
|
137
|
+
const configContent = {
|
|
138
|
+
semi: true,
|
|
139
|
+
singleQuote: true,
|
|
140
|
+
trailingComma: "all",
|
|
141
|
+
printWidth: 80,
|
|
142
|
+
tabWidth: 2
|
|
143
|
+
};
|
|
144
|
+
await import_fs_extra2.default.writeJson(".prettierrc", configContent, { spaces: 2 });
|
|
145
|
+
} else if (config.formatterChoice === "oxfmt") {
|
|
146
|
+
await installPackages(["oxfmt"], true);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// src/services/linter.ts
|
|
151
|
+
var import_prompts3 = require("@clack/prompts");
|
|
152
|
+
var import_fs_extra3 = __toESM(require("fs-extra"));
|
|
153
|
+
async function promptLinter(config) {
|
|
154
|
+
if (!config.linterChoice) {
|
|
155
|
+
const linter = await (0, import_prompts3.select)({
|
|
156
|
+
message: "Select a linter:",
|
|
157
|
+
options: [
|
|
158
|
+
{ value: "eslint", label: "ESLint" },
|
|
159
|
+
{ value: "oxlint", label: "Oxlint" }
|
|
160
|
+
]
|
|
161
|
+
});
|
|
162
|
+
config.linterChoice = linter;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
async function installLinter(config) {
|
|
166
|
+
if (config.linterChoice === "eslint") {
|
|
167
|
+
await installPackages(["eslint"], true);
|
|
168
|
+
const configContent = {
|
|
169
|
+
extends: ["eslint:recommended"],
|
|
170
|
+
env: {
|
|
171
|
+
node: true,
|
|
172
|
+
es2021: true
|
|
173
|
+
},
|
|
174
|
+
parserOptions: {
|
|
175
|
+
ecmaVersion: "latest",
|
|
176
|
+
sourceType: "module"
|
|
177
|
+
}
|
|
178
|
+
};
|
|
179
|
+
await import_fs_extra3.default.writeJson(".eslintrc.json", configContent, { spaces: 2 });
|
|
180
|
+
} else if (config.linterChoice === "oxlint") {
|
|
181
|
+
await installPackages(["oxlint"], true);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
// src/services/lint-staged.ts
|
|
186
|
+
var import_prompts4 = require("@clack/prompts");
|
|
187
|
+
var import_fs_extra4 = __toESM(require("fs-extra"));
|
|
188
|
+
async function promptLintStaged(config) {
|
|
189
|
+
const lintExtensions = await (0, import_prompts4.multiselect)({
|
|
190
|
+
message: "Select extensions to lint:",
|
|
191
|
+
options: [
|
|
192
|
+
{ value: "js", label: "js" },
|
|
193
|
+
{ value: "ts", label: "ts" },
|
|
194
|
+
{ value: "jsx", label: "jsx" },
|
|
195
|
+
{ value: "tsx", label: "tsx" },
|
|
196
|
+
{ value: "html", label: "html" },
|
|
197
|
+
{ value: "vue", label: "vue" },
|
|
198
|
+
{ value: "svelte", label: "svelte" }
|
|
199
|
+
],
|
|
200
|
+
required: false
|
|
201
|
+
});
|
|
202
|
+
const formatExtensions = await (0, import_prompts4.multiselect)({
|
|
203
|
+
message: "Select extensions to format:",
|
|
204
|
+
options: [
|
|
205
|
+
{ value: "md", label: "md" },
|
|
206
|
+
{ value: "css", label: "css" },
|
|
207
|
+
{ value: "scss", label: "scss" },
|
|
208
|
+
{ value: "json", label: "json" },
|
|
209
|
+
{ value: "yaml", label: "yaml" },
|
|
210
|
+
{ value: "html", label: "html" },
|
|
211
|
+
{ value: "js", label: "js" },
|
|
212
|
+
{ value: "ts", label: "ts" },
|
|
213
|
+
{ value: "jsx", label: "jsx" },
|
|
214
|
+
{ value: "tsx", label: "tsx" },
|
|
215
|
+
{ value: "vue", label: "vue" },
|
|
216
|
+
{ value: "svelte", label: "svelte" }
|
|
217
|
+
],
|
|
218
|
+
required: false
|
|
219
|
+
});
|
|
220
|
+
config.lintStagedLintExtensions = lintExtensions;
|
|
221
|
+
config.lintStagedFormatExtensions = formatExtensions;
|
|
222
|
+
if (lintExtensions.length > 0 && !config.linterChoice) {
|
|
223
|
+
await promptLinter(config);
|
|
224
|
+
config.linter = true;
|
|
225
|
+
}
|
|
226
|
+
if (formatExtensions.length > 0 && !config.formatterChoice) {
|
|
227
|
+
await promptFormatter(config);
|
|
228
|
+
config.formatter = true;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
async function installLintStaged(config) {
|
|
232
|
+
await installPackages(["lint-staged"], true);
|
|
233
|
+
const lintStagedConfig = {};
|
|
234
|
+
const lintExts = config.lintStagedLintExtensions || [];
|
|
235
|
+
const formatExts = config.lintStagedFormatExtensions || [];
|
|
236
|
+
if (lintExts.length > 0) {
|
|
237
|
+
await installLinter(config);
|
|
238
|
+
const glob = `*.{${lintExts.join(",")}}`;
|
|
239
|
+
if (config.linterChoice === "oxlint") {
|
|
240
|
+
lintStagedConfig[glob] = ["npx oxlint --fix"];
|
|
241
|
+
} else {
|
|
242
|
+
lintStagedConfig[glob] = ["eslint --fix"];
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
if (formatExts.length > 0) {
|
|
246
|
+
await installFormatter(config);
|
|
247
|
+
const glob = `*.{${formatExts.join(",")}}`;
|
|
248
|
+
if (config.formatterChoice === "oxfmt") {
|
|
249
|
+
lintStagedConfig[glob] = ["npx oxfmt"];
|
|
250
|
+
} else {
|
|
251
|
+
lintStagedConfig[glob] = ["prettier --write"];
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
await import_fs_extra4.default.writeJson(".lintstagedrc", lintStagedConfig, { spaces: 2 });
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
// src/services/env.ts
|
|
258
|
+
var import_prompts5 = require("@clack/prompts");
|
|
259
|
+
var import_fs_extra5 = __toESM(require("fs-extra"));
|
|
260
|
+
var import_path = __toESM(require("path"));
|
|
261
|
+
async function promptEnv(config) {
|
|
262
|
+
const variant = await (0, import_prompts5.select)({
|
|
263
|
+
message: "Which @t3-oss/env variant?",
|
|
264
|
+
options: [
|
|
265
|
+
{ value: "@t3-oss/env-nextjs", label: "Next.js" },
|
|
266
|
+
{ value: "@t3-oss/env-nuxt", label: "Nuxt" },
|
|
267
|
+
{ value: "@t3-oss/env-core", label: "Core" }
|
|
268
|
+
]
|
|
269
|
+
});
|
|
270
|
+
config.envVariant = variant;
|
|
271
|
+
const validator = await (0, import_prompts5.select)({
|
|
272
|
+
message: "Which validator?",
|
|
273
|
+
options: [
|
|
274
|
+
{ value: "zod", label: "Zod" },
|
|
275
|
+
{ value: "valibot", label: "Valibot" },
|
|
276
|
+
{ value: "arktype", label: "Arktype" }
|
|
277
|
+
]
|
|
278
|
+
});
|
|
279
|
+
config.envValidator = validator;
|
|
280
|
+
const installPresets = await (0, import_prompts5.confirm)({
|
|
281
|
+
message: "Install presets?"
|
|
282
|
+
});
|
|
283
|
+
config.envInstallPresets = installPresets;
|
|
284
|
+
if (installPresets) {
|
|
285
|
+
const presets = await (0, import_prompts5.multiselect)({
|
|
286
|
+
message: "Select preset to extend:",
|
|
287
|
+
options: [
|
|
288
|
+
{ value: "netlify", label: "Netlify" },
|
|
289
|
+
{ value: "vercel", label: "Vercel" },
|
|
290
|
+
{ value: "neonVercel", label: "Neon (Vercel)" },
|
|
291
|
+
{ value: "supabaseVercel", label: "Supabase (Vercel)" },
|
|
292
|
+
{ value: "uploadThing", label: "UploadThing" },
|
|
293
|
+
{ value: "render", label: "Render" },
|
|
294
|
+
{ value: "railway", label: "Railway" },
|
|
295
|
+
{ value: "fly.io", label: "Fly.io" },
|
|
296
|
+
{ value: "upstashRedis", label: "Upstash Redis" },
|
|
297
|
+
{ value: "coolify", label: "Coolify" },
|
|
298
|
+
{ value: "vite", label: "Vite" },
|
|
299
|
+
{ value: "wxt", label: "WXT" }
|
|
300
|
+
],
|
|
301
|
+
required: false
|
|
302
|
+
});
|
|
303
|
+
config.envPresets = presets;
|
|
304
|
+
}
|
|
305
|
+
const split = await (0, import_prompts5.select)({
|
|
306
|
+
message: "Split or Joined env files?",
|
|
307
|
+
options: [
|
|
308
|
+
{ value: "split", label: "Split (env/server.ts, env/client.ts)" },
|
|
309
|
+
{ value: "joined", label: "Joined (env.ts)" }
|
|
310
|
+
]
|
|
311
|
+
});
|
|
312
|
+
config.envSplit = split;
|
|
313
|
+
const location = await (0, import_prompts5.text)({
|
|
314
|
+
message: "Where should the environment files be created?",
|
|
315
|
+
initialValue: "src/lib",
|
|
316
|
+
placeholder: "src/lib"
|
|
317
|
+
});
|
|
318
|
+
config.envLocation = location;
|
|
319
|
+
}
|
|
320
|
+
async function installEnv(config) {
|
|
321
|
+
await installPackages([config.envVariant, config.envValidator], true);
|
|
322
|
+
if (config.envInstallPresets) {
|
|
323
|
+
const presetPackage = `@t3-oss/env-core/presets-${config.envValidator}`;
|
|
324
|
+
await installPackages([presetPackage], true);
|
|
325
|
+
}
|
|
326
|
+
const targetDir = config.envLocation;
|
|
327
|
+
await import_fs_extra5.default.ensureDir(targetDir);
|
|
328
|
+
const presetImport = config.envPresets && config.envPresets.length > 0 ? `// Presets: ${config.envPresets.join(", ")}
|
|
329
|
+
` : "";
|
|
330
|
+
const content = `import { createEnv } from "${config.envVariant}";
|
|
331
|
+
import { ${config.envValidator} } from "${config.envValidator}";
|
|
332
|
+
|
|
333
|
+
${presetImport}`;
|
|
334
|
+
if (config.envSplit === "split") {
|
|
335
|
+
await import_fs_extra5.default.outputFile(
|
|
336
|
+
import_path.default.join(targetDir, "env/server.ts"),
|
|
337
|
+
`${content}
|
|
338
|
+
// Server env definition
|
|
339
|
+
export const env = createEnv({
|
|
340
|
+
server: {
|
|
341
|
+
// ...
|
|
342
|
+
},
|
|
343
|
+
experimental__runtimeEnv: process.env
|
|
344
|
+
});`
|
|
345
|
+
);
|
|
346
|
+
await import_fs_extra5.default.outputFile(
|
|
347
|
+
import_path.default.join(targetDir, "env/client.ts"),
|
|
348
|
+
`${content}
|
|
349
|
+
// Client env definition
|
|
350
|
+
export const env = createEnv({
|
|
351
|
+
client: {
|
|
352
|
+
// ...
|
|
353
|
+
},
|
|
354
|
+
experimental__runtimeEnv: {
|
|
355
|
+
// ...
|
|
356
|
+
}
|
|
357
|
+
});`
|
|
358
|
+
);
|
|
359
|
+
} else {
|
|
360
|
+
await import_fs_extra5.default.outputFile(
|
|
361
|
+
import_path.default.join(targetDir, "env.ts"),
|
|
362
|
+
`${content}
|
|
363
|
+
// Joined env definition
|
|
364
|
+
export const env = createEnv({
|
|
365
|
+
server: {
|
|
366
|
+
// ...
|
|
367
|
+
},
|
|
368
|
+
client: {
|
|
369
|
+
// ...
|
|
370
|
+
},
|
|
371
|
+
experimental__runtimeEnv: {
|
|
372
|
+
// ...
|
|
373
|
+
}
|
|
374
|
+
});`
|
|
375
|
+
);
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
// src/utils/git.ts
|
|
380
|
+
var import_execa3 = require("execa");
|
|
381
|
+
async function isGitRepository() {
|
|
382
|
+
try {
|
|
383
|
+
await (0, import_execa3.execa)("git", ["rev-parse", "--is-inside-work-tree"]);
|
|
384
|
+
return true;
|
|
385
|
+
} catch {
|
|
386
|
+
return false;
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
async function isGitDirty() {
|
|
390
|
+
try {
|
|
391
|
+
const { stdout } = await (0, import_execa3.execa)("git", ["status", "--porcelain"]);
|
|
392
|
+
return stdout.length > 0;
|
|
393
|
+
} catch {
|
|
394
|
+
return false;
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
async function commitChanges(message) {
|
|
398
|
+
await (0, import_execa3.execa)("git", ["add", "."]);
|
|
399
|
+
await (0, import_execa3.execa)("git", ["commit", "-m", message]);
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
// package.json
|
|
403
|
+
var package_default = {
|
|
404
|
+
name: "@mayrlabs/setup-project",
|
|
405
|
+
version: "0.1.3",
|
|
406
|
+
description: "Interactive CLI to setup project tools",
|
|
407
|
+
private: false,
|
|
408
|
+
publishConfig: {
|
|
409
|
+
access: "public"
|
|
410
|
+
},
|
|
411
|
+
keywords: [
|
|
412
|
+
"setup",
|
|
413
|
+
"cli",
|
|
414
|
+
"scaffold",
|
|
415
|
+
"husky",
|
|
416
|
+
"prettier",
|
|
417
|
+
"eslint"
|
|
418
|
+
],
|
|
419
|
+
bin: {
|
|
420
|
+
"setup-project": "dist/index.js"
|
|
421
|
+
},
|
|
422
|
+
files: [
|
|
423
|
+
"dist",
|
|
424
|
+
"README.md",
|
|
425
|
+
"CHANGELOG.md",
|
|
426
|
+
"package.json"
|
|
427
|
+
],
|
|
428
|
+
homepage: "https://github.com/MayR-Labs/mayrlabs-js/tree/main/packages/setup-project#readme",
|
|
429
|
+
bugs: {
|
|
430
|
+
url: "https://github.com/MayR-Labs/mayrlabs-js/issues"
|
|
431
|
+
},
|
|
432
|
+
repository: {
|
|
433
|
+
type: "git",
|
|
434
|
+
url: "git+https://github.com/MayR-Labs/mayrlabs-js.git",
|
|
435
|
+
directory: "packages/setup-project"
|
|
436
|
+
},
|
|
437
|
+
license: "MIT",
|
|
438
|
+
author: "Aghogho Meyoron <youngmayor.dev@gmail.com>",
|
|
439
|
+
type: "commonjs",
|
|
440
|
+
main: "dist/index.js",
|
|
441
|
+
scripts: {
|
|
442
|
+
build: "tsup",
|
|
443
|
+
demo: "tsx src/index.ts",
|
|
444
|
+
prepublishOnly: "npm run build"
|
|
445
|
+
},
|
|
446
|
+
dependencies: {
|
|
447
|
+
"@clack/prompts": "^0.7.0",
|
|
448
|
+
commander: "^11.1.0",
|
|
449
|
+
execa: "^8.0.1",
|
|
450
|
+
"fs-extra": "^11.2.0",
|
|
451
|
+
picocolors: "^1.0.0",
|
|
452
|
+
zod: "^3.22.4"
|
|
453
|
+
},
|
|
454
|
+
devDependencies: {
|
|
455
|
+
"@types/fs-extra": "^11.0.4",
|
|
456
|
+
"@types/node": "^20.11.16",
|
|
457
|
+
tsup: "^8.5.1",
|
|
458
|
+
typescript: "^5.3.3"
|
|
459
|
+
}
|
|
460
|
+
};
|
|
461
|
+
|
|
462
|
+
// src/index.ts
|
|
463
|
+
async function main() {
|
|
464
|
+
(0, import_prompts6.intro)(import_picocolors.default.bgCyan(import_picocolors.default.black(" @mayrlabs/setup-project ")));
|
|
465
|
+
if (await isGitRepository()) {
|
|
466
|
+
if (await isGitDirty()) {
|
|
467
|
+
const shouldCommit = await (0, import_prompts6.confirm)({
|
|
468
|
+
message: "Your working directory is dirty. Would you like to commit changes before proceeding?"
|
|
469
|
+
});
|
|
470
|
+
if (shouldCommit) {
|
|
471
|
+
const message = await import("@clack/prompts").then(
|
|
472
|
+
(m) => m.text({
|
|
473
|
+
message: "Enter commit message:",
|
|
474
|
+
placeholder: "wip: pre-setup commit",
|
|
475
|
+
validate(value) {
|
|
476
|
+
if (value.length === 0) return "Commit message is required";
|
|
477
|
+
}
|
|
478
|
+
})
|
|
479
|
+
);
|
|
480
|
+
if (typeof message === "string") {
|
|
481
|
+
const s2 = (0, import_prompts6.spinner)();
|
|
482
|
+
s2.start("Committing changes...");
|
|
483
|
+
await commitChanges(message);
|
|
484
|
+
s2.stop("Changes committed.");
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
const tools = await (0, import_prompts6.multiselect)({
|
|
490
|
+
message: "Select tools to configure:",
|
|
491
|
+
options: [
|
|
492
|
+
{ value: "husky", label: "Husky" },
|
|
493
|
+
{ value: "formatter", label: "Formatter (Prettier/Oxfmt)" },
|
|
494
|
+
{ value: "linter", label: "Linter (Eslint/Oxlint)" },
|
|
495
|
+
{ value: "lint-staged", label: "Lint-staged" },
|
|
496
|
+
{ value: "env", label: "Env Validation (@t3-oss/env)" }
|
|
497
|
+
],
|
|
498
|
+
required: false
|
|
499
|
+
});
|
|
500
|
+
if ((0, import_prompts6.isCancel)(tools)) {
|
|
501
|
+
(0, import_prompts6.cancel)("Operation cancelled.");
|
|
502
|
+
process.exit(0);
|
|
503
|
+
}
|
|
504
|
+
const selectedTools = tools;
|
|
505
|
+
const config = {
|
|
506
|
+
husky: selectedTools.includes("husky"),
|
|
507
|
+
formatter: selectedTools.includes("formatter"),
|
|
508
|
+
linter: selectedTools.includes("linter"),
|
|
509
|
+
lintStaged: selectedTools.includes("lint-staged"),
|
|
510
|
+
env: selectedTools.includes("env")
|
|
511
|
+
};
|
|
512
|
+
if (config.husky) await promptHusky(config);
|
|
513
|
+
if (config.formatter) await promptFormatter(config);
|
|
514
|
+
if (config.linter) await promptLinter(config);
|
|
515
|
+
if (config.lintStaged) await promptLintStaged(config);
|
|
516
|
+
if (config.env) await promptEnv(config);
|
|
517
|
+
let summary = "The following actions will be performed:\n\n";
|
|
518
|
+
if (config.husky) summary += "- Install and configure Husky\n";
|
|
519
|
+
if (config.formatter)
|
|
520
|
+
summary += `- Install and configure ${config.formatterChoice}
|
|
521
|
+
`;
|
|
522
|
+
if (config.linter)
|
|
523
|
+
summary += `- Install and configure ${config.linterChoice}
|
|
524
|
+
`;
|
|
525
|
+
if (config.lintStaged) summary += "- Install and configure Lint-staged\n";
|
|
526
|
+
if (config.env) summary += "- Install and configure @t3-oss/env\n";
|
|
527
|
+
(0, import_prompts6.note)(summary, "Configuration Summary");
|
|
528
|
+
const proceed = await (0, import_prompts6.confirm)({
|
|
529
|
+
message: "Do you want to proceed with the installation?"
|
|
530
|
+
});
|
|
531
|
+
if (!proceed || (0, import_prompts6.isCancel)(proceed)) {
|
|
532
|
+
(0, import_prompts6.cancel)("Installation cancelled. Configuration saved.");
|
|
533
|
+
process.exit(0);
|
|
534
|
+
}
|
|
535
|
+
const s = (0, import_prompts6.spinner)();
|
|
536
|
+
if (config.husky) {
|
|
537
|
+
s.start("Setting up Husky...");
|
|
538
|
+
await installHusky(config);
|
|
539
|
+
s.stop("Husky setup complete.");
|
|
540
|
+
}
|
|
541
|
+
if (config.formatter) {
|
|
542
|
+
s.start(`Setting up ${config.formatterChoice}...`);
|
|
543
|
+
await installFormatter(config);
|
|
544
|
+
s.stop(`${config.formatterChoice} setup complete.`);
|
|
545
|
+
}
|
|
546
|
+
if (config.linter) {
|
|
547
|
+
s.start(`Setting up ${config.linterChoice}...`);
|
|
548
|
+
await installLinter(config);
|
|
549
|
+
s.stop(`${config.linterChoice} setup complete.`);
|
|
550
|
+
}
|
|
551
|
+
if (config.lintStaged) {
|
|
552
|
+
s.start("Setting up Lint-staged...");
|
|
553
|
+
await installLintStaged(config);
|
|
554
|
+
s.stop("Lint-staged setup complete.");
|
|
555
|
+
}
|
|
556
|
+
if (config.env) {
|
|
557
|
+
s.start("Setting up Env Validation...");
|
|
558
|
+
await installEnv(config);
|
|
559
|
+
s.stop("Env Validation setup complete.");
|
|
560
|
+
}
|
|
561
|
+
(0, import_prompts6.outro)(import_picocolors.default.green("Setup complete!"));
|
|
562
|
+
}
|
|
563
|
+
import_commander.program.name("setup-project").description("Interactive setup for common project tools").version(package_default.version).action(main);
|
|
564
|
+
import_commander.program.parse();
|
|
565
|
+
|
|
566
|
+
/**
|
|
567
|
+
* Built with discipline by MayR Labs.
|
|
568
|
+
* Software should feel intentional.
|
|
569
|
+
*/
|
|
570
|
+
|
|
571
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/services/husky.ts","../src/utils/pm.ts","../src/services/formatter.ts","../src/services/linter.ts","../src/services/lint-staged.ts","../src/services/env.ts","../src/utils/git.ts","../package.json"],"sourcesContent":["#!/usr/bin/env node\n\nimport {\n intro,\n outro,\n multiselect,\n isCancel,\n cancel,\n note,\n confirm,\n spinner,\n} from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { program } from \"commander\";\nimport { promptHusky, installHusky } from \"@/services/husky\";\nimport { promptFormatter, installFormatter } from \"@/services/formatter\";\nimport { promptLinter, installLinter } from \"@/services/linter\";\nimport { promptLintStaged, installLintStaged } from \"@/services/lint-staged\";\nimport { promptEnv, installEnv } from \"@/services/env\";\nimport { isGitDirty, commitChanges, isGitRepository } from \"@/utils/git\";\nimport packageJson from \"../package.json\";\n\nasync function main() {\n intro(pc.bgCyan(pc.black(\" @mayrlabs/setup-project \")));\n\n // 1. Git Check\n if (await isGitRepository()) {\n if (await isGitDirty()) {\n const shouldCommit = await confirm({\n message:\n \"Your working directory is dirty. Would you like to commit changes before proceeding?\",\n });\n\n if (shouldCommit) {\n const message = await import(\"@clack/prompts\").then((m) =>\n m.text({\n message: \"Enter commit message:\",\n placeholder: \"wip: pre-setup commit\",\n validate(value) {\n if (value.length === 0) return \"Commit message is required\";\n },\n }),\n );\n\n if (typeof message === \"string\") {\n const s = spinner();\n s.start(\"Committing changes...\");\n await commitChanges(message);\n s.stop(\"Changes committed.\");\n }\n }\n }\n }\n\n // 2. Survey Phase\n const tools = await multiselect({\n message: \"Select tools to configure:\",\n options: [\n { value: \"husky\", label: \"Husky\" },\n { value: \"formatter\", label: \"Formatter (Prettier/Oxfmt)\" },\n { value: \"linter\", label: \"Linter (Eslint/Oxlint)\" },\n { value: \"lint-staged\", label: \"Lint-staged\" },\n { value: \"env\", label: \"Env Validation (@t3-oss/env)\" },\n ],\n required: false,\n });\n\n if (isCancel(tools)) {\n cancel(\"Operation cancelled.\");\n process.exit(0);\n }\n\n const selectedTools = tools as string[];\n const config: any = {\n husky: selectedTools.includes(\"husky\"),\n formatter: selectedTools.includes(\"formatter\"),\n linter: selectedTools.includes(\"linter\"),\n lintStaged: selectedTools.includes(\"lint-staged\"),\n env: selectedTools.includes(\"env\"),\n };\n\n // Run Prompts\n if (config.husky) await promptHusky(config);\n if (config.formatter) await promptFormatter(config);\n if (config.linter) await promptLinter(config);\n if (config.lintStaged) await promptLintStaged(config);\n if (config.env) await promptEnv(config);\n\n // 3. Summary & Confirmation\n let summary = \"The following actions will be performed:\\n\\n\";\n if (config.husky) summary += \"- Install and configure Husky\\n\";\n if (config.formatter)\n summary += `- Install and configure ${config.formatterChoice}\\n`;\n if (config.linter)\n summary += `- Install and configure ${config.linterChoice}\\n`;\n if (config.lintStaged) summary += \"- Install and configure Lint-staged\\n\";\n if (config.env) summary += \"- Install and configure @t3-oss/env\\n\";\n\n note(summary, \"Configuration Summary\");\n\n const proceed = await confirm({\n message: \"Do you want to proceed with the installation?\",\n });\n\n if (!proceed || isCancel(proceed)) {\n cancel(\"Installation cancelled. Configuration saved.\");\n process.exit(0);\n }\n\n // 5. Execution Phase\n const s = spinner();\n\n if (config.husky) {\n s.start(\"Setting up Husky...\");\n await installHusky(config);\n s.stop(\"Husky setup complete.\");\n }\n\n if (config.formatter) {\n s.start(`Setting up ${config.formatterChoice}...`);\n await installFormatter(config);\n s.stop(`${config.formatterChoice} setup complete.`);\n }\n\n if (config.linter) {\n s.start(`Setting up ${config.linterChoice}...`);\n await installLinter(config);\n s.stop(`${config.linterChoice} setup complete.`);\n }\n\n // specific check because husky might have enabled it\n if (config.lintStaged) {\n s.start(\"Setting up Lint-staged...\");\n await installLintStaged(config);\n s.stop(\"Lint-staged setup complete.\");\n }\n\n if (config.env) {\n s.start(\"Setting up Env Validation...\");\n await installEnv(config);\n s.stop(\"Env Validation setup complete.\");\n }\n\n outro(pc.green(\"Setup complete!\"));\n}\n\nprogram\n .name(\"setup-project\")\n .description(\"Interactive setup for common project tools\")\n .version(packageJson.version)\n .action(main);\n\nprogram.parse();\n","import { select, text } from \"@clack/prompts\";\nimport { installPackages } from \"@/utils/pm\";\nimport { execa } from \"execa\";\nimport fs from \"fs-extra\";\n\nexport async function promptHusky(config: any) {\n const hookType = (await select({\n message: \"What pre-commit hook would you like to use?\",\n options: [\n { value: \"lint-staged\", label: \"lint-staged\" },\n { value: \"custom\", label: \"Custom script\" },\n { value: \"none\", label: \"None\" },\n ],\n })) as string;\n\n config.huskyHookType = hookType;\n\n if (hookType === \"lint-staged\") {\n config.lintStaged = true; // Implicitly enable lint-staged\n } else if (hookType === \"custom\") {\n const script = await text({\n message: \"Enter your custom pre-commit script:\",\n placeholder: \"npm test\",\n validate(value: string) {\n if (value.length === 0) return \"Value is required!\";\n },\n });\n\n config.huskyCustomScript = script;\n }\n}\n\nexport async function installHusky(config: any) {\n // Install husky\n await installPackages([\"husky\"], true);\n\n // Init husky\n try {\n await execa(\"npx\", [\"husky\", \"init\"]);\n } catch (e) {\n await execa(\"npm\", [\"pkg\", \"set\", \"scripts.prepare=husky\"]);\n await execa(\"npm\", [\"run\", \"prepare\"]);\n }\n\n if (config.huskyHookType === \"lint-staged\") {\n await fs.outputFile(\".husky/pre-commit\", \"npx lint-staged\\n\", {\n mode: 0o755,\n });\n } else if (config.huskyHookType === \"custom\" && config.huskyCustomScript) {\n await fs.outputFile(\".husky/pre-commit\", `${config.huskyCustomScript}\\n`, {\n mode: 0o755,\n });\n }\n}\n","import { execa } from \"execa\";\n\nexport type PackageManager = \"npm\" | \"yarn\" | \"pnpm\" | \"bun\";\n\nexport async function getPackageManager(): Promise<PackageManager> {\n const userAgent = process.env.npm_config_user_agent;\n\n if (userAgent) {\n if (userAgent.startsWith(\"yarn\")) return \"yarn\";\n if (userAgent.startsWith(\"pnpm\")) return \"pnpm\";\n if (userAgent.startsWith(\"bun\")) return \"bun\";\n }\n\n return \"npm\";\n}\n\nexport async function installPackages(\n packages: string[],\n dev: boolean = false,\n) {\n const pm = await getPackageManager();\n const args = [];\n\n if (pm === \"npm\") {\n args.push(\"install\");\n if (dev) args.push(\"--save-dev\");\n } else if (pm === \"yarn\") {\n args.push(\"add\");\n if (dev) args.push(\"-D\");\n } else if (pm === \"pnpm\") {\n args.push(\"add\");\n if (dev) args.push(\"-D\");\n } else if (pm === \"bun\") {\n args.push(\"add\");\n if (dev) args.push(\"-d\");\n }\n\n await execa(pm, [...args, ...packages]);\n}\n\nexport async function runCommand(command: string, args: string[]) {\n const pm = await getPackageManager();\n let cmd: string = pm;\n let cmdArgs = args;\n\n if (pm === \"npm\") {\n cmd = \"npm\";\n cmdArgs = [\"run\", command, ...args];\n\n // special case for npx/exec\n if (command === \"exec\") {\n cmd = \"npx\";\n cmdArgs = args;\n }\n } else if (pm === \"yarn\") {\n cmd = \"yarn\";\n cmdArgs = [command, ...args];\n } else if (pm === \"pnpm\") {\n cmd = \"pnpm\";\n cmdArgs = [command, ...args];\n if (command === \"exec\") {\n cmd = \"pnpm\";\n cmdArgs = [\"exec\", ...args];\n }\n } else if (pm === \"bun\") {\n cmd = \"bun\";\n cmdArgs = [command, ...args];\n }\n\n // Normalize execute command\n if (command === \"execute\") {\n if (pm === \"npm\") {\n cmd = \"npx\";\n cmdArgs = args;\n } else if (pm === \"yarn\") {\n cmd = \"yarn\";\n cmdArgs = [\"exec\", ...args]; // or just yarn <cmd>\n // yarn doesn't always need exec, but for safety\n cmd = \"yarn\";\n cmdArgs = args;\n } else if (pm === \"pnpm\") {\n cmd = \"pnpm\";\n cmdArgs = [\"exec\", ...args];\n } else if (pm === \"bun\") {\n cmd = \"bun\";\n cmdArgs = [\"x\", ...args];\n }\n }\n\n await execa(cmd, cmdArgs);\n}\n","import { select } from \"@clack/prompts\";\nimport { installPackages } from \"@/utils/pm\";\nimport fs from \"fs-extra\";\n\nexport async function promptFormatter(config: any) {\n if (!config.formatterChoice) {\n const formatter = (await select({\n message: \"Select a formatter:\",\n options: [\n { value: \"prettier\", label: \"Prettier\" },\n { value: \"oxfmt\", label: \"Oxfmt\" },\n ],\n })) as string;\n config.formatterChoice = formatter;\n }\n}\n\nexport async function installFormatter(config: any) {\n if (config.formatterChoice === \"prettier\") {\n await installPackages([\"prettier\"], true);\n const configContent = {\n semi: true,\n singleQuote: true,\n trailingComma: \"all\",\n printWidth: 80,\n tabWidth: 2,\n };\n await fs.writeJson(\".prettierrc\", configContent, { spaces: 2 });\n } else if (config.formatterChoice === \"oxfmt\") {\n await installPackages([\"oxfmt\"], true);\n }\n}\n","import { select } from \"@clack/prompts\";\nimport { installPackages } from \"@/utils/pm\";\nimport fs from \"fs-extra\";\n\nexport async function promptLinter(config: any) {\n if (!config.linterChoice) {\n const linter = (await select({\n message: \"Select a linter:\",\n options: [\n { value: \"eslint\", label: \"ESLint\" },\n { value: \"oxlint\", label: \"Oxlint\" },\n ],\n })) as string;\n config.linterChoice = linter;\n }\n}\n\nexport async function installLinter(config: any) {\n if (config.linterChoice === \"eslint\") {\n await installPackages([\"eslint\"], true);\n const configContent = {\n extends: [\"eslint:recommended\"],\n env: {\n node: true,\n es2021: true,\n },\n parserOptions: {\n ecmaVersion: \"latest\",\n sourceType: \"module\",\n },\n };\n await fs.writeJson(\".eslintrc.json\", configContent, { spaces: 2 });\n } else if (config.linterChoice === \"oxlint\") {\n await installPackages([\"oxlint\"], true);\n }\n}\n","import { multiselect, select } from \"@clack/prompts\";\nimport { installPackages } from \"@/utils/pm\";\nimport { promptFormatter, installFormatter } from \"@/services/formatter\";\nimport { promptLinter, installLinter } from \"@/services/linter\";\nimport fs from \"fs-extra\";\n\nexport async function promptLintStaged(config: any) {\n const lintExtensions = await multiselect({\n message: \"Select extensions to lint:\",\n options: [\n { value: \"js\", label: \"js\" },\n { value: \"ts\", label: \"ts\" },\n { value: \"jsx\", label: \"jsx\" },\n { value: \"tsx\", label: \"tsx\" },\n { value: \"html\", label: \"html\" },\n { value: \"vue\", label: \"vue\" },\n { value: \"svelte\", label: \"svelte\" },\n ],\n required: false,\n });\n\n const formatExtensions = await multiselect({\n message: \"Select extensions to format:\",\n options: [\n { value: \"md\", label: \"md\" },\n { value: \"css\", label: \"css\" },\n { value: \"scss\", label: \"scss\" },\n { value: \"json\", label: \"json\" },\n { value: \"yaml\", label: \"yaml\" },\n { value: \"html\", label: \"html\" },\n { value: \"js\", label: \"js\" },\n { value: \"ts\", label: \"ts\" },\n { value: \"jsx\", label: \"jsx\" },\n { value: \"tsx\", label: \"tsx\" },\n { value: \"vue\", label: \"vue\" },\n { value: \"svelte\", label: \"svelte\" },\n ],\n required: false,\n });\n\n config.lintStagedLintExtensions = lintExtensions;\n config.lintStagedFormatExtensions = formatExtensions;\n\n // Trigger prompt for dependencies if extensions are selected\n if ((lintExtensions as string[]).length > 0 && !config.linterChoice) {\n // Ask prompts immediately so config is captured\n await promptLinter(config);\n config.linter = true; // Ensure it gets installed\n }\n\n if ((formatExtensions as string[]).length > 0 && !config.formatterChoice) {\n await promptFormatter(config);\n config.formatter = true; // Ensure it gets installed\n }\n}\n\nexport async function installLintStaged(config: any) {\n await installPackages([\"lint-staged\"], true);\n\n const lintStagedConfig: any = {};\n const lintExts = (config.lintStagedLintExtensions as string[]) || [];\n const formatExts = (config.lintStagedFormatExtensions as string[]) || [];\n\n // Ensure dependencies are installed (idempotent)\n if (lintExts.length > 0) {\n await installLinter(config);\n\n const glob = `*.{${lintExts.join(\",\")}}`;\n if (config.linterChoice === \"oxlint\") {\n // oxlint might not fix everything or support all exts, but generic logic here\n lintStagedConfig[glob] = [\"npx oxlint --fix\"];\n } else {\n lintStagedConfig[glob] = [\"eslint --fix\"];\n }\n }\n\n if (formatExts.length > 0) {\n await installFormatter(config);\n\n const glob = `*.{${formatExts.join(\",\")}}`;\n if (config.formatterChoice === \"oxfmt\") {\n // Filter exts supported by oxfmt if needed, or assume it handles them\n lintStagedConfig[glob] = [\"npx oxfmt\"];\n } else {\n lintStagedConfig[glob] = [\"prettier --write\"];\n }\n }\n\n await fs.writeJson(\".lintstagedrc\", lintStagedConfig, { spaces: 2 });\n}\n","import { select, confirm, text, multiselect } from \"@clack/prompts\";\nimport { installPackages } from \"@/utils/pm\";\nimport fs from \"fs-extra\";\nimport path from \"path\";\n\nexport async function promptEnv(config: any) {\n const variant = (await select({\n message: \"Which @t3-oss/env variant?\",\n options: [\n { value: \"@t3-oss/env-nextjs\", label: \"Next.js\" },\n { value: \"@t3-oss/env-nuxt\", label: \"Nuxt\" },\n { value: \"@t3-oss/env-core\", label: \"Core\" },\n ],\n })) as string;\n config.envVariant = variant;\n\n const validator = (await select({\n message: \"Which validator?\",\n options: [\n { value: \"zod\", label: \"Zod\" },\n { value: \"valibot\", label: \"Valibot\" },\n { value: \"arktype\", label: \"Arktype\" },\n ],\n })) as string;\n config.envValidator = validator;\n\n const installPresets = await confirm({\n message: \"Install presets?\",\n });\n config.envInstallPresets = installPresets;\n\n if (installPresets) {\n const presets = await multiselect({\n message: \"Select preset to extend:\",\n options: [\n { value: \"netlify\", label: \"Netlify\" },\n { value: \"vercel\", label: \"Vercel\" },\n { value: \"neonVercel\", label: \"Neon (Vercel)\" },\n { value: \"supabaseVercel\", label: \"Supabase (Vercel)\" },\n { value: \"uploadThing\", label: \"UploadThing\" },\n { value: \"render\", label: \"Render\" },\n { value: \"railway\", label: \"Railway\" },\n { value: \"fly.io\", label: \"Fly.io\" },\n { value: \"upstashRedis\", label: \"Upstash Redis\" },\n { value: \"coolify\", label: \"Coolify\" },\n { value: \"vite\", label: \"Vite\" },\n { value: \"wxt\", label: \"WXT\" },\n ],\n required: false,\n });\n config.envPresets = presets;\n }\n\n const split = await select({\n message: \"Split or Joined env files?\",\n options: [\n { value: \"split\", label: \"Split (env/server.ts, env/client.ts)\" },\n { value: \"joined\", label: \"Joined (env.ts)\" },\n ],\n });\n config.envSplit = split;\n\n const location = await text({\n message: \"Where should the environment files be created?\",\n initialValue: \"src/lib\",\n placeholder: \"src/lib\",\n });\n config.envLocation = location;\n}\n\nexport async function installEnv(config: any) {\n await installPackages([config.envVariant, config.envValidator], true);\n\n if (config.envInstallPresets) {\n const presetPackage = `@t3-oss/env-core/presets-${config.envValidator}`;\n await installPackages([presetPackage], true);\n }\n\n const targetDir = config.envLocation as string;\n await fs.ensureDir(targetDir);\n\n const presetImport =\n config.envPresets && config.envPresets.length > 0\n ? `// Presets: ${config.envPresets.join(\", \")}\\n`\n : \"\";\n\n const content = `import { createEnv } from \"${config.envVariant}\";\\nimport { ${config.envValidator} } from \"${config.envValidator}\";\\n\\n${presetImport}`;\n\n if (config.envSplit === \"split\") {\n await fs.outputFile(\n path.join(targetDir, \"env/server.ts\"),\n `${content}\\n// Server env definition\\nexport const env = createEnv({\\n server: {\\n // ...\\n },\\n experimental__runtimeEnv: process.env\\n});`,\n );\n await fs.outputFile(\n path.join(targetDir, \"env/client.ts\"),\n `${content}\\n// Client env definition\\nexport const env = createEnv({\\n client: {\\n // ...\\n },\\n experimental__runtimeEnv: {\\n // ...\\n }\\n});`,\n );\n } else {\n await fs.outputFile(\n path.join(targetDir, \"env.ts\"),\n `${content}\\n// Joined env definition\\nexport const env = createEnv({\\n server: {\\n // ...\\n },\\n client: {\\n // ...\\n },\\n experimental__runtimeEnv: {\\n // ...\\n }\\n});`,\n );\n }\n}\n","import { execa } from \"execa\";\n\nexport async function isGitRepository(): Promise<boolean> {\n try {\n await execa(\"git\", [\"rev-parse\", \"--is-inside-work-tree\"]);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function isGitDirty(): Promise<boolean> {\n try {\n const { stdout } = await execa(\"git\", [\"status\", \"--porcelain\"]);\n return stdout.length > 0;\n } catch {\n return false;\n }\n}\n\nexport async function commitChanges(message: string): Promise<void> {\n await execa(\"git\", [\"add\", \".\"]);\n await execa(\"git\", [\"commit\", \"-m\", message]);\n}\n","{\n \"name\": \"@mayrlabs/setup-project\",\n \"version\": \"0.1.3\",\n \"description\": \"Interactive CLI to setup project tools\",\n \"private\": false,\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"keywords\": [\n \"setup\",\n \"cli\",\n \"scaffold\",\n \"husky\",\n \"prettier\",\n \"eslint\"\n ],\n \"bin\": {\n \"setup-project\": \"dist/index.js\"\n },\n \"files\": [\n \"dist\",\n \"README.md\",\n \"CHANGELOG.md\",\n \"package.json\"\n ],\n \"homepage\": \"https://github.com/MayR-Labs/mayrlabs-js/tree/main/packages/setup-project#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/MayR-Labs/mayrlabs-js/issues\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/MayR-Labs/mayrlabs-js.git\",\n \"directory\": \"packages/setup-project\"\n },\n \"license\": \"MIT\",\n \"author\": \"Aghogho Meyoron <youngmayor.dev@gmail.com>\",\n \"type\": \"commonjs\",\n \"main\": \"dist/index.js\",\n \"scripts\": {\n \"build\": \"tsup\",\n \"demo\": \"tsx src/index.ts\",\n \"prepublishOnly\": \"npm run build\"\n },\n \"dependencies\": {\n \"@clack/prompts\": \"^0.7.0\",\n \"commander\": \"^11.1.0\",\n \"execa\": \"^8.0.1\",\n \"fs-extra\": \"^11.2.0\",\n \"picocolors\": \"^1.0.0\",\n \"zod\": \"^3.22.4\"\n },\n \"devDependencies\": {\n \"@types/fs-extra\": \"^11.0.4\",\n \"@types/node\": \"^20.11.16\",\n \"tsup\": \"^8.5.1\",\n \"typescript\": \"^5.3.3\"\n }\n}\n"],"mappings":"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","names":["import_prompts","import_execa","fs","import_prompts","import_fs_extra","fs","import_prompts","import_fs_extra","fs","import_prompts","import_fs_extra","fs","import_prompts","import_fs_extra","fs","path","import_execa","pc","s"]}
|