create-next-pro-cli 0.1.19 â 0.1.21
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 +18 -0
- package/create-next-pro-completion.sh +1 -1
- package/dist/bin.bun.js +168 -17
- package/dist/bin.node.js +193 -22
- package/dist/bin.node.js.map +1 -1
- package/package.json +1 -1
- package/templates/Api/route.ts +5 -0
- package/templates/Lib/index.ts +1 -0
- package/templates/Lib/item.ts +3 -0
- package/templates/Projects/default/src/app/api/hello/route.ts +5 -0
- package/templates/Projects/default/src/lib/sample/example.ts +3 -0
- package/templates/Projects/default/src/lib/sample/index.ts +3 -0
package/README.md
CHANGED
|
@@ -92,6 +92,24 @@ create-next-pro addcomponent MyComponent -P MyPage
|
|
|
92
92
|
create-next-pro addcomponent MyComponent -P ParentPage.ChildPage
|
|
93
93
|
```
|
|
94
94
|
|
|
95
|
+
### Create a library
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
create-next-pro addlib mylib
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### Add a file to a library
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
create-next-pro addlib mylib.foo
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### Create an API route
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
create-next-pro addapi hello
|
|
111
|
+
```
|
|
112
|
+
|
|
95
113
|
### Remove a page
|
|
96
114
|
|
|
97
115
|
```bash
|
|
@@ -4,7 +4,7 @@ _create_next_pro_complete() {
|
|
|
4
4
|
COMPREPLY=()
|
|
5
5
|
cur="${COMP_WORDS[COMP_CWORD]}"
|
|
6
6
|
prev="${COMP_WORDS[COMP_CWORD-1]}"
|
|
7
|
-
opts="addpage addcomponent rmpage"
|
|
7
|
+
opts="addpage addcomponent addlib addapi rmpage"
|
|
8
8
|
|
|
9
9
|
# Autocomplete commands
|
|
10
10
|
if [[ ${COMP_CWORD} == 1 ]]; then
|
package/dist/bin.bun.js
CHANGED
|
@@ -4937,7 +4937,7 @@ var require_prompts3 = __commonJS((exports, module) => {
|
|
|
4937
4937
|
});
|
|
4938
4938
|
|
|
4939
4939
|
// src/index.ts
|
|
4940
|
-
var
|
|
4940
|
+
var import_prompts7 = __toESM(require_prompts3(), 1);
|
|
4941
4941
|
import fs from "fs";
|
|
4942
4942
|
import os from "os";
|
|
4943
4943
|
import path from "path";
|
|
@@ -5021,7 +5021,7 @@ async function addComponent(args) {
|
|
|
5021
5021
|
}
|
|
5022
5022
|
const useI18n = !!config.useI18n;
|
|
5023
5023
|
const componentNameUpper = capitalize(componentName);
|
|
5024
|
-
const templatePath = join2(import.meta.
|
|
5024
|
+
const templatePath = join2(new URL("..", import.meta.url).pathname, "..", "templates", "Component");
|
|
5025
5025
|
let messagesPath = null;
|
|
5026
5026
|
if (useI18n) {
|
|
5027
5027
|
messagesPath = join2(process.cwd(), "messages");
|
|
@@ -5190,7 +5190,7 @@ async function addPage(args) {
|
|
|
5190
5190
|
const entries = await readdir2(messagesPath, { withFileTypes: true });
|
|
5191
5191
|
locales = entries.filter((e) => e.isDirectory()).map((e) => e.name);
|
|
5192
5192
|
}
|
|
5193
|
-
const templatePath = join3(import.meta.
|
|
5193
|
+
const templatePath = join3(new URL("..", import.meta.url).pathname, "..", "templates", "Page");
|
|
5194
5194
|
let uiPageDir, localePagePath, jsonFileName;
|
|
5195
5195
|
if (parentName && childName) {
|
|
5196
5196
|
uiPageDir = join3(process.cwd(), "src", "ui", parentName, childName);
|
|
@@ -5305,20 +5305,161 @@ async function rmPage(args) {
|
|
|
5305
5305
|
console.log(`\u2705 Page "${pageName}" deleted.`);
|
|
5306
5306
|
}
|
|
5307
5307
|
|
|
5308
|
-
// src/
|
|
5309
|
-
|
|
5308
|
+
// src/lib/addLib.ts
|
|
5309
|
+
var import_prompts4 = __toESM(require_prompts3(), 1);
|
|
5310
5310
|
import { join as join5 } from "path";
|
|
5311
|
+
import { mkdir as mkdir3, readFile as readFile4, writeFile as writeFile4 } from "fs/promises";
|
|
5311
5312
|
import { existsSync as existsSync5 } from "fs";
|
|
5313
|
+
async function addLib(args) {
|
|
5314
|
+
let libArg = args[1];
|
|
5315
|
+
if (!libArg || libArg.startsWith("-")) {
|
|
5316
|
+
const response = await import_prompts4.default.prompt({
|
|
5317
|
+
type: "text",
|
|
5318
|
+
name: "libArg",
|
|
5319
|
+
message: "\uD83D\uDCE6 Lib name to add:",
|
|
5320
|
+
validate: (name) => name ? true : "Lib name is required"
|
|
5321
|
+
});
|
|
5322
|
+
libArg = response.libArg;
|
|
5323
|
+
}
|
|
5324
|
+
let libName = libArg;
|
|
5325
|
+
let fileName = null;
|
|
5326
|
+
if (libArg.includes(".")) {
|
|
5327
|
+
[libName, fileName] = libArg.split(".");
|
|
5328
|
+
}
|
|
5329
|
+
const config = await loadConfig();
|
|
5330
|
+
if (!config) {
|
|
5331
|
+
console.error("\u274C Configuration file cnp.config.json not found. Run this command from the project root.");
|
|
5332
|
+
return;
|
|
5333
|
+
}
|
|
5334
|
+
const libDir = join5(process.cwd(), "src", "lib", libName);
|
|
5335
|
+
if (!existsSync5(libDir)) {
|
|
5336
|
+
await mkdir3(libDir, { recursive: true });
|
|
5337
|
+
}
|
|
5338
|
+
const templateDir = join5(import.meta.dir, "..", "..", "templates", "Lib");
|
|
5339
|
+
const indexTemplate = join5(templateDir, "index.ts");
|
|
5340
|
+
const fileTemplate = join5(templateDir, "item.ts");
|
|
5341
|
+
const indexPath = join5(libDir, "index.ts");
|
|
5342
|
+
if (!existsSync5(indexPath)) {
|
|
5343
|
+
if (existsSync5(indexTemplate)) {
|
|
5344
|
+
const content = await readFile4(indexTemplate, "utf-8");
|
|
5345
|
+
await writeFile4(indexPath, content);
|
|
5346
|
+
} else {
|
|
5347
|
+
await writeFile4(indexPath, `export {}
|
|
5348
|
+
`);
|
|
5349
|
+
}
|
|
5350
|
+
console.log(`\uD83D\uDCC4 File created: ${indexPath}`);
|
|
5351
|
+
}
|
|
5352
|
+
if (fileName) {
|
|
5353
|
+
const filePath = join5(libDir, `${fileName}.ts`);
|
|
5354
|
+
if (!existsSync5(filePath)) {
|
|
5355
|
+
if (existsSync5(fileTemplate)) {
|
|
5356
|
+
let content = await readFile4(fileTemplate, "utf-8");
|
|
5357
|
+
content = content.replace(/template/g, fileName).replace(/Template/g, capitalize(fileName));
|
|
5358
|
+
await writeFile4(filePath, content);
|
|
5359
|
+
} else {
|
|
5360
|
+
await writeFile4(filePath, `export function ${fileName}() {
|
|
5361
|
+
// TODO: implement
|
|
5362
|
+
}
|
|
5363
|
+
`);
|
|
5364
|
+
}
|
|
5365
|
+
console.log(`\uD83D\uDCC4 File created: ${filePath}`);
|
|
5366
|
+
}
|
|
5367
|
+
let indexContent = await readFile4(indexPath, "utf-8");
|
|
5368
|
+
const importLine = `import { ${fileName} } from "./${fileName}";`;
|
|
5369
|
+
const importRegex = new RegExp(`import\\s*{\\s*${fileName}\\s*}\\s*from\\s*"\\./${fileName}";`);
|
|
5370
|
+
const exportRegex = /export\s*{([^}]*)}/m;
|
|
5371
|
+
const imports = [];
|
|
5372
|
+
const exportsSet = [];
|
|
5373
|
+
for (const line of indexContent.split(`
|
|
5374
|
+
`)) {
|
|
5375
|
+
if (line.startsWith("import")) {
|
|
5376
|
+
imports.push(line);
|
|
5377
|
+
} else if (line.startsWith("export")) {
|
|
5378
|
+
const match = line.match(exportRegex);
|
|
5379
|
+
if (match && match[1]) {
|
|
5380
|
+
exportsSet.push(...match[1].split(",").map((s) => s.trim()).filter(Boolean));
|
|
5381
|
+
}
|
|
5382
|
+
}
|
|
5383
|
+
}
|
|
5384
|
+
if (!imports.some((l) => importRegex.test(l))) {
|
|
5385
|
+
imports.push(importLine);
|
|
5386
|
+
}
|
|
5387
|
+
if (!exportsSet.includes(fileName)) {
|
|
5388
|
+
exportsSet.push(fileName);
|
|
5389
|
+
}
|
|
5390
|
+
indexContent = imports.join(`
|
|
5391
|
+
`) + `
|
|
5392
|
+
|
|
5393
|
+
export { ` + exportsSet.join(", ") + ` };
|
|
5394
|
+
`;
|
|
5395
|
+
await writeFile4(indexPath, indexContent);
|
|
5396
|
+
console.log(`\u270F\uFE0F Updated index: ${indexPath}`);
|
|
5397
|
+
}
|
|
5398
|
+
console.log(`\u2705 Lib "${libName}"${fileName ? ` with module ${fileName}` : ""} added.`);
|
|
5399
|
+
}
|
|
5400
|
+
|
|
5401
|
+
// src/lib/addApi.ts
|
|
5402
|
+
var import_prompts5 = __toESM(require_prompts3(), 1);
|
|
5403
|
+
import { join as join6 } from "path";
|
|
5404
|
+
import { mkdir as mkdir4, readFile as readFile5, writeFile as writeFile5 } from "fs/promises";
|
|
5405
|
+
import { existsSync as existsSync6 } from "fs";
|
|
5406
|
+
async function addApi(args) {
|
|
5407
|
+
let apiName = args[1];
|
|
5408
|
+
if (!apiName || apiName.startsWith("-")) {
|
|
5409
|
+
const response = await import_prompts5.default.prompt({
|
|
5410
|
+
type: "text",
|
|
5411
|
+
name: "apiName",
|
|
5412
|
+
message: "\uD83D\uDD0C API route name to add:",
|
|
5413
|
+
validate: (name) => name ? true : "API route name is required"
|
|
5414
|
+
});
|
|
5415
|
+
apiName = response.apiName;
|
|
5416
|
+
}
|
|
5417
|
+
const config = await loadConfig();
|
|
5418
|
+
if (!config) {
|
|
5419
|
+
console.error("\u274C Configuration file cnp.config.json not found. Run this command from the project root.");
|
|
5420
|
+
return;
|
|
5421
|
+
}
|
|
5422
|
+
const apiDir = join6(process.cwd(), "src", "app", "api", apiName);
|
|
5423
|
+
if (!existsSync6(apiDir)) {
|
|
5424
|
+
await mkdir4(apiDir, { recursive: true });
|
|
5425
|
+
}
|
|
5426
|
+
const templateDir = join6(import.meta.dir, "..", "..", "templates", "Api");
|
|
5427
|
+
const routeTemplate = join6(templateDir, "route.ts");
|
|
5428
|
+
const routePath = join6(apiDir, "route.ts");
|
|
5429
|
+
if (!existsSync6(routePath)) {
|
|
5430
|
+
if (existsSync6(routeTemplate)) {
|
|
5431
|
+
let content = await readFile5(routeTemplate, "utf-8");
|
|
5432
|
+
content = content.replace(/template/g, apiName);
|
|
5433
|
+
await writeFile5(routePath, content);
|
|
5434
|
+
} else {
|
|
5435
|
+
await writeFile5(routePath, `import { NextResponse } from "next/server";
|
|
5436
|
+
|
|
5437
|
+
export async function GET() {
|
|
5438
|
+
return NextResponse.json({ message: "Hello from ${apiName}" });
|
|
5439
|
+
}
|
|
5440
|
+
`);
|
|
5441
|
+
}
|
|
5442
|
+
console.log(`\uD83D\uDCC4 File created: ${routePath}`);
|
|
5443
|
+
} else {
|
|
5444
|
+
console.log(`\u2139\uFE0F File already exists: ${routePath}`);
|
|
5445
|
+
}
|
|
5446
|
+
console.log(`\u2705 API route "${apiName}" added.`);
|
|
5447
|
+
}
|
|
5448
|
+
|
|
5449
|
+
// src/scaffold.ts
|
|
5450
|
+
import { cp, mkdir as mkdir5, rm, writeFile as writeFile6, readFile as readFile6 } from "fs/promises";
|
|
5451
|
+
import { join as join7 } from "path";
|
|
5452
|
+
import { existsSync as existsSync7 } from "fs";
|
|
5312
5453
|
import { fileURLToPath } from "url";
|
|
5313
5454
|
var RED = "\x1B[31m";
|
|
5314
5455
|
var GREEN = "\x1B[32m";
|
|
5315
5456
|
var CYAN = "\x1B[36m";
|
|
5316
5457
|
var RESET = "\x1B[0m";
|
|
5317
5458
|
async function scaffoldProject(options) {
|
|
5318
|
-
const targetPath =
|
|
5459
|
+
const targetPath = join7(process.cwd(), options.projectName);
|
|
5319
5460
|
const __dirname2 = new URL(".", import.meta.url);
|
|
5320
|
-
const templatePath =
|
|
5321
|
-
if (
|
|
5461
|
+
const templatePath = join7(fileURLToPath(__dirname2), "..", "templates", "Projects", "default");
|
|
5462
|
+
if (existsSync7(targetPath)) {
|
|
5322
5463
|
if (options.force) {
|
|
5323
5464
|
console.warn("\u26A0\uFE0F Target directory already exists, removing...");
|
|
5324
5465
|
await rm(targetPath, { recursive: true, force: true });
|
|
@@ -5329,19 +5470,19 @@ async function scaffoldProject(options) {
|
|
|
5329
5470
|
}
|
|
5330
5471
|
try {
|
|
5331
5472
|
console.log("Creating project directory...");
|
|
5332
|
-
await
|
|
5473
|
+
await mkdir5(targetPath, { recursive: true });
|
|
5333
5474
|
console.log("Copying files from template...");
|
|
5334
5475
|
await cp(templatePath, targetPath, { recursive: true });
|
|
5335
|
-
const pkgPath =
|
|
5336
|
-
if (
|
|
5337
|
-
const pkg = JSON.parse(await
|
|
5476
|
+
const pkgPath = join7(targetPath, "package.json");
|
|
5477
|
+
if (existsSync7(pkgPath)) {
|
|
5478
|
+
const pkg = JSON.parse(await readFile6(pkgPath, "utf-8"));
|
|
5338
5479
|
pkg.dependencies = pkg.dependencies || {};
|
|
5339
5480
|
if (options.useI18n) {
|
|
5340
5481
|
pkg.dependencies["next-intl"] = pkg.dependencies["next-intl"] || "^4.3.5";
|
|
5341
5482
|
}
|
|
5342
|
-
await
|
|
5483
|
+
await writeFile6(pkgPath, JSON.stringify(pkg, null, 2));
|
|
5343
5484
|
}
|
|
5344
|
-
await
|
|
5485
|
+
await writeFile6(join7(targetPath, "cnp.config.json"), JSON.stringify(options, null, 2));
|
|
5345
5486
|
console.log("Project setup complete!");
|
|
5346
5487
|
console.log("");
|
|
5347
5488
|
console.log("To get started:");
|
|
@@ -5380,9 +5521,9 @@ async function createProject(nameArg, force) {
|
|
|
5380
5521
|
}
|
|
5381
5522
|
|
|
5382
5523
|
// src/lib/createProjectWithPrompt.ts
|
|
5383
|
-
var
|
|
5524
|
+
var import_prompts6 = __toESM(require_prompts3(), 1);
|
|
5384
5525
|
async function createProjectWithPrompt() {
|
|
5385
|
-
const response = await
|
|
5526
|
+
const response = await import_prompts6.default.prompt([
|
|
5386
5527
|
{
|
|
5387
5528
|
type: "text",
|
|
5388
5529
|
name: "projectName",
|
|
@@ -5500,7 +5641,7 @@ async function onboarding() {
|
|
|
5500
5641
|
const pkg = JSON.parse(packageJson);
|
|
5501
5642
|
console.log(`\uD83D\uDE80 Welcome to create-next-pro v${pkg.version}
|
|
5502
5643
|
`);
|
|
5503
|
-
const res = await
|
|
5644
|
+
const res = await import_prompts7.default([
|
|
5504
5645
|
{
|
|
5505
5646
|
type: "select",
|
|
5506
5647
|
name: "shell",
|
|
@@ -5544,6 +5685,8 @@ Usage:
|
|
|
5544
5685
|
create-next-pro <project-name> [--force]
|
|
5545
5686
|
create-next-pro addpage [options]
|
|
5546
5687
|
create-next-pro addcomponent [options]
|
|
5688
|
+
create-next-pro addlib [name]
|
|
5689
|
+
create-next-pro addapi [name]
|
|
5547
5690
|
create-next-pro rmpage [options]
|
|
5548
5691
|
|
|
5549
5692
|
Options:
|
|
@@ -5584,6 +5727,14 @@ async function main() {
|
|
|
5584
5727
|
addPage(args);
|
|
5585
5728
|
return;
|
|
5586
5729
|
}
|
|
5730
|
+
if (args[0] === "addlib") {
|
|
5731
|
+
addLib(args);
|
|
5732
|
+
return;
|
|
5733
|
+
}
|
|
5734
|
+
if (args[0] === "addapi") {
|
|
5735
|
+
addApi(args);
|
|
5736
|
+
return;
|
|
5737
|
+
}
|
|
5587
5738
|
if (args[0] === "rmpage") {
|
|
5588
5739
|
rmPage(args);
|
|
5589
5740
|
return;
|
package/dist/bin.node.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
import fs from "fs";
|
|
5
5
|
import os from "os";
|
|
6
6
|
import path from "path";
|
|
7
|
-
import
|
|
7
|
+
import prompts7 from "prompts";
|
|
8
8
|
import { fileURLToPath as fileURLToPath2 } from "url";
|
|
9
9
|
import { dirname, resolve } from "path";
|
|
10
10
|
|
|
@@ -87,8 +87,7 @@ async function addComponent(args) {
|
|
|
87
87
|
const useI18n = !!config.useI18n;
|
|
88
88
|
const componentNameUpper = capitalize(componentName);
|
|
89
89
|
const templatePath = join2(
|
|
90
|
-
import.meta.
|
|
91
|
-
"..",
|
|
90
|
+
new URL("..", import.meta.url).pathname,
|
|
92
91
|
"..",
|
|
93
92
|
"templates",
|
|
94
93
|
"Component"
|
|
@@ -97,7 +96,9 @@ async function addComponent(args) {
|
|
|
97
96
|
if (useI18n) {
|
|
98
97
|
messagesPath = join2(process.cwd(), "messages");
|
|
99
98
|
if (!existsSync2(messagesPath)) {
|
|
100
|
-
console.error(
|
|
99
|
+
console.error(
|
|
100
|
+
"\u274C Messages directory missing. Ensure i18n was configured."
|
|
101
|
+
);
|
|
101
102
|
return;
|
|
102
103
|
}
|
|
103
104
|
}
|
|
@@ -242,7 +243,9 @@ async function addPage(args) {
|
|
|
242
243
|
}
|
|
243
244
|
const config = await loadConfig();
|
|
244
245
|
if (!config) {
|
|
245
|
-
console.error(
|
|
246
|
+
console.error(
|
|
247
|
+
"\u274C Configuration file cnp.config.json not found. Run this command from the project root."
|
|
248
|
+
);
|
|
246
249
|
return;
|
|
247
250
|
}
|
|
248
251
|
const useI18n = !!config.useI18n;
|
|
@@ -258,13 +261,20 @@ async function addPage(args) {
|
|
|
258
261
|
if (useI18n) {
|
|
259
262
|
messagesPath = join3(process.cwd(), "messages");
|
|
260
263
|
if (!existsSync3(messagesPath)) {
|
|
261
|
-
console.error(
|
|
264
|
+
console.error(
|
|
265
|
+
"\u274C Messages directory missing. Ensure i18n was configured."
|
|
266
|
+
);
|
|
262
267
|
return;
|
|
263
268
|
}
|
|
264
269
|
const entries = await readdir2(messagesPath, { withFileTypes: true });
|
|
265
270
|
locales = entries.filter((e) => e.isDirectory()).map((e) => e.name);
|
|
266
271
|
}
|
|
267
|
-
const templatePath = join3(
|
|
272
|
+
const templatePath = join3(
|
|
273
|
+
new URL("..", import.meta.url).pathname,
|
|
274
|
+
"..",
|
|
275
|
+
"templates",
|
|
276
|
+
"Page"
|
|
277
|
+
);
|
|
268
278
|
let uiPageDir, localePagePath, jsonFileName;
|
|
269
279
|
if (parentName && childName) {
|
|
270
280
|
uiPageDir = join3(process.cwd(), "src", "ui", parentName, childName);
|
|
@@ -387,26 +397,177 @@ async function rmPage(args) {
|
|
|
387
397
|
console.log(`\u2705 Page "${pageName}" deleted.`);
|
|
388
398
|
}
|
|
389
399
|
|
|
390
|
-
// src/
|
|
391
|
-
import { cp, mkdir as mkdir3, rm, writeFile as writeFile4, readFile as readFile4 } from "fs/promises";
|
|
400
|
+
// src/lib/addLib.ts
|
|
392
401
|
import { join as join5 } from "path";
|
|
402
|
+
import { mkdir as mkdir3, readFile as readFile4, writeFile as writeFile4 } from "fs/promises";
|
|
403
|
+
import prompts4 from "prompts";
|
|
393
404
|
import { existsSync as existsSync5 } from "fs";
|
|
405
|
+
async function addLib(args) {
|
|
406
|
+
let libArg = args[1];
|
|
407
|
+
if (!libArg || libArg.startsWith("-")) {
|
|
408
|
+
const response = await prompts4.prompt({
|
|
409
|
+
type: "text",
|
|
410
|
+
name: "libArg",
|
|
411
|
+
message: "\u{1F4E6} Lib name to add:",
|
|
412
|
+
validate: (name) => name ? true : "Lib name is required"
|
|
413
|
+
});
|
|
414
|
+
libArg = response.libArg;
|
|
415
|
+
}
|
|
416
|
+
let libName = libArg;
|
|
417
|
+
let fileName = null;
|
|
418
|
+
if (libArg.includes(".")) {
|
|
419
|
+
[libName, fileName] = libArg.split(".");
|
|
420
|
+
}
|
|
421
|
+
const config = await loadConfig();
|
|
422
|
+
if (!config) {
|
|
423
|
+
console.error(
|
|
424
|
+
"\u274C Configuration file cnp.config.json not found. Run this command from the project root."
|
|
425
|
+
);
|
|
426
|
+
return;
|
|
427
|
+
}
|
|
428
|
+
const libDir = join5(process.cwd(), "src", "lib", libName);
|
|
429
|
+
if (!existsSync5(libDir)) {
|
|
430
|
+
await mkdir3(libDir, { recursive: true });
|
|
431
|
+
}
|
|
432
|
+
const templateDir = join5(import.meta.dir, "..", "..", "templates", "Lib");
|
|
433
|
+
const indexTemplate = join5(templateDir, "index.ts");
|
|
434
|
+
const fileTemplate = join5(templateDir, "item.ts");
|
|
435
|
+
const indexPath = join5(libDir, "index.ts");
|
|
436
|
+
if (!existsSync5(indexPath)) {
|
|
437
|
+
if (existsSync5(indexTemplate)) {
|
|
438
|
+
const content = await readFile4(indexTemplate, "utf-8");
|
|
439
|
+
await writeFile4(indexPath, content);
|
|
440
|
+
} else {
|
|
441
|
+
await writeFile4(indexPath, "export {}\n");
|
|
442
|
+
}
|
|
443
|
+
console.log(`\u{1F4C4} File created: ${indexPath}`);
|
|
444
|
+
}
|
|
445
|
+
if (fileName) {
|
|
446
|
+
const filePath = join5(libDir, `${fileName}.ts`);
|
|
447
|
+
if (!existsSync5(filePath)) {
|
|
448
|
+
if (existsSync5(fileTemplate)) {
|
|
449
|
+
let content = await readFile4(fileTemplate, "utf-8");
|
|
450
|
+
content = content.replace(/template/g, fileName).replace(/Template/g, capitalize(fileName));
|
|
451
|
+
await writeFile4(filePath, content);
|
|
452
|
+
} else {
|
|
453
|
+
await writeFile4(
|
|
454
|
+
filePath,
|
|
455
|
+
`export function ${fileName}() {
|
|
456
|
+
// TODO: implement
|
|
457
|
+
}
|
|
458
|
+
`
|
|
459
|
+
);
|
|
460
|
+
}
|
|
461
|
+
console.log(`\u{1F4C4} File created: ${filePath}`);
|
|
462
|
+
}
|
|
463
|
+
let indexContent = await readFile4(indexPath, "utf-8");
|
|
464
|
+
const importLine = `import { ${fileName} } from "./${fileName}";`;
|
|
465
|
+
const importRegex = new RegExp(
|
|
466
|
+
`import\\s*{\\s*${fileName}\\s*}\\s*from\\s*"\\./${fileName}";`
|
|
467
|
+
);
|
|
468
|
+
const exportRegex = /export\s*{([^}]*)}/m;
|
|
469
|
+
const imports = [];
|
|
470
|
+
const exportsSet = [];
|
|
471
|
+
for (const line of indexContent.split("\n")) {
|
|
472
|
+
if (line.startsWith("import")) {
|
|
473
|
+
imports.push(line);
|
|
474
|
+
} else if (line.startsWith("export")) {
|
|
475
|
+
const match = line.match(exportRegex);
|
|
476
|
+
if (match && match[1]) {
|
|
477
|
+
exportsSet.push(
|
|
478
|
+
...match[1].split(",").map((s) => s.trim()).filter(Boolean)
|
|
479
|
+
);
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
if (!imports.some((l) => importRegex.test(l))) {
|
|
484
|
+
imports.push(importLine);
|
|
485
|
+
}
|
|
486
|
+
if (!exportsSet.includes(fileName)) {
|
|
487
|
+
exportsSet.push(fileName);
|
|
488
|
+
}
|
|
489
|
+
indexContent = imports.join("\n") + "\n\nexport { " + exportsSet.join(", ") + " };\n";
|
|
490
|
+
await writeFile4(indexPath, indexContent);
|
|
491
|
+
console.log(`\u270F\uFE0F Updated index: ${indexPath}`);
|
|
492
|
+
}
|
|
493
|
+
console.log(
|
|
494
|
+
`\u2705 Lib "${libName}"${fileName ? ` with module ${fileName}` : ""} added.`
|
|
495
|
+
);
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
// src/lib/addApi.ts
|
|
499
|
+
import { join as join6 } from "path";
|
|
500
|
+
import { mkdir as mkdir4, readFile as readFile5, writeFile as writeFile5 } from "fs/promises";
|
|
501
|
+
import prompts5 from "prompts";
|
|
502
|
+
import { existsSync as existsSync6 } from "fs";
|
|
503
|
+
async function addApi(args) {
|
|
504
|
+
let apiName = args[1];
|
|
505
|
+
if (!apiName || apiName.startsWith("-")) {
|
|
506
|
+
const response = await prompts5.prompt({
|
|
507
|
+
type: "text",
|
|
508
|
+
name: "apiName",
|
|
509
|
+
message: "\u{1F50C} API route name to add:",
|
|
510
|
+
validate: (name) => name ? true : "API route name is required"
|
|
511
|
+
});
|
|
512
|
+
apiName = response.apiName;
|
|
513
|
+
}
|
|
514
|
+
const config = await loadConfig();
|
|
515
|
+
if (!config) {
|
|
516
|
+
console.error(
|
|
517
|
+
"\u274C Configuration file cnp.config.json not found. Run this command from the project root."
|
|
518
|
+
);
|
|
519
|
+
return;
|
|
520
|
+
}
|
|
521
|
+
const apiDir = join6(process.cwd(), "src", "app", "api", apiName);
|
|
522
|
+
if (!existsSync6(apiDir)) {
|
|
523
|
+
await mkdir4(apiDir, { recursive: true });
|
|
524
|
+
}
|
|
525
|
+
const templateDir = join6(import.meta.dir, "..", "..", "templates", "Api");
|
|
526
|
+
const routeTemplate = join6(templateDir, "route.ts");
|
|
527
|
+
const routePath = join6(apiDir, "route.ts");
|
|
528
|
+
if (!existsSync6(routePath)) {
|
|
529
|
+
if (existsSync6(routeTemplate)) {
|
|
530
|
+
let content = await readFile5(routeTemplate, "utf-8");
|
|
531
|
+
content = content.replace(/template/g, apiName);
|
|
532
|
+
await writeFile5(routePath, content);
|
|
533
|
+
} else {
|
|
534
|
+
await writeFile5(
|
|
535
|
+
routePath,
|
|
536
|
+
`import { NextResponse } from "next/server";
|
|
537
|
+
|
|
538
|
+
export async function GET() {
|
|
539
|
+
return NextResponse.json({ message: "Hello from ${apiName}" });
|
|
540
|
+
}
|
|
541
|
+
`
|
|
542
|
+
);
|
|
543
|
+
}
|
|
544
|
+
console.log(`\u{1F4C4} File created: ${routePath}`);
|
|
545
|
+
} else {
|
|
546
|
+
console.log(`\u2139\uFE0F File already exists: ${routePath}`);
|
|
547
|
+
}
|
|
548
|
+
console.log(`\u2705 API route "${apiName}" added.`);
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
// src/scaffold.ts
|
|
552
|
+
import { cp, mkdir as mkdir5, rm, writeFile as writeFile6, readFile as readFile6 } from "fs/promises";
|
|
553
|
+
import { join as join7 } from "path";
|
|
554
|
+
import { existsSync as existsSync7 } from "fs";
|
|
394
555
|
import { fileURLToPath } from "url";
|
|
395
556
|
var RED = "\x1B[31m";
|
|
396
557
|
var GREEN = "\x1B[32m";
|
|
397
558
|
var CYAN = "\x1B[36m";
|
|
398
559
|
var RESET = "\x1B[0m";
|
|
399
560
|
async function scaffoldProject(options) {
|
|
400
|
-
const targetPath =
|
|
561
|
+
const targetPath = join7(process.cwd(), options.projectName);
|
|
401
562
|
const __dirname2 = new URL(".", import.meta.url);
|
|
402
|
-
const templatePath =
|
|
563
|
+
const templatePath = join7(
|
|
403
564
|
fileURLToPath(__dirname2),
|
|
404
565
|
"..",
|
|
405
566
|
"templates",
|
|
406
567
|
"Projects",
|
|
407
568
|
"default"
|
|
408
569
|
);
|
|
409
|
-
if (
|
|
570
|
+
if (existsSync7(targetPath)) {
|
|
410
571
|
if (options.force) {
|
|
411
572
|
console.warn("\u26A0\uFE0F Target directory already exists, removing...");
|
|
412
573
|
await rm(targetPath, { recursive: true, force: true });
|
|
@@ -419,20 +580,20 @@ async function scaffoldProject(options) {
|
|
|
419
580
|
}
|
|
420
581
|
try {
|
|
421
582
|
console.log("Creating project directory...");
|
|
422
|
-
await
|
|
583
|
+
await mkdir5(targetPath, { recursive: true });
|
|
423
584
|
console.log("Copying files from template...");
|
|
424
585
|
await cp(templatePath, targetPath, { recursive: true });
|
|
425
|
-
const pkgPath =
|
|
426
|
-
if (
|
|
427
|
-
const pkg = JSON.parse(await
|
|
586
|
+
const pkgPath = join7(targetPath, "package.json");
|
|
587
|
+
if (existsSync7(pkgPath)) {
|
|
588
|
+
const pkg = JSON.parse(await readFile6(pkgPath, "utf-8"));
|
|
428
589
|
pkg.dependencies = pkg.dependencies || {};
|
|
429
590
|
if (options.useI18n) {
|
|
430
591
|
pkg.dependencies["next-intl"] = pkg.dependencies["next-intl"] || "^4.3.5";
|
|
431
592
|
}
|
|
432
|
-
await
|
|
593
|
+
await writeFile6(pkgPath, JSON.stringify(pkg, null, 2));
|
|
433
594
|
}
|
|
434
|
-
await
|
|
435
|
-
|
|
595
|
+
await writeFile6(
|
|
596
|
+
join7(targetPath, "cnp.config.json"),
|
|
436
597
|
JSON.stringify(options, null, 2)
|
|
437
598
|
);
|
|
438
599
|
console.log("Project setup complete!");
|
|
@@ -479,9 +640,9 @@ async function createProject(nameArg, force) {
|
|
|
479
640
|
}
|
|
480
641
|
|
|
481
642
|
// src/lib/createProjectWithPrompt.ts
|
|
482
|
-
import
|
|
643
|
+
import prompts6 from "prompts";
|
|
483
644
|
async function createProjectWithPrompt() {
|
|
484
|
-
const response = await
|
|
645
|
+
const response = await prompts6.prompt([
|
|
485
646
|
{
|
|
486
647
|
type: "text",
|
|
487
648
|
name: "projectName",
|
|
@@ -601,7 +762,7 @@ async function onboarding() {
|
|
|
601
762
|
const pkg = JSON.parse(packageJson);
|
|
602
763
|
console.log(`\u{1F680} Welcome to create-next-pro v${pkg.version}
|
|
603
764
|
`);
|
|
604
|
-
const res = await
|
|
765
|
+
const res = await prompts7(
|
|
605
766
|
[
|
|
606
767
|
{
|
|
607
768
|
type: "select",
|
|
@@ -648,6 +809,8 @@ Usage:
|
|
|
648
809
|
create-next-pro <project-name> [--force]
|
|
649
810
|
create-next-pro addpage [options]
|
|
650
811
|
create-next-pro addcomponent [options]
|
|
812
|
+
create-next-pro addlib [name]
|
|
813
|
+
create-next-pro addapi [name]
|
|
651
814
|
create-next-pro rmpage [options]
|
|
652
815
|
|
|
653
816
|
Options:
|
|
@@ -686,6 +849,14 @@ async function main() {
|
|
|
686
849
|
addPage(args);
|
|
687
850
|
return;
|
|
688
851
|
}
|
|
852
|
+
if (args[0] === "addlib") {
|
|
853
|
+
addLib(args);
|
|
854
|
+
return;
|
|
855
|
+
}
|
|
856
|
+
if (args[0] === "addapi") {
|
|
857
|
+
addApi(args);
|
|
858
|
+
return;
|
|
859
|
+
}
|
|
689
860
|
if (args[0] === "rmpage") {
|
|
690
861
|
rmPage(args);
|
|
691
862
|
return;
|
package/dist/bin.node.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/lib/addComponent.ts","../src/lib/utils.ts","../src/lib/addPage.ts","../src/lib/rmPage.ts","../src/scaffold.ts","../src/lib/createProject.ts","../src/lib/createProjectWithPrompt.ts","../bin.node.ts"],"sourcesContent":["// src/index.ts\n\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport prompts from \"prompts\";\nimport { fileURLToPath } from \"node:url\";\nimport { dirname, resolve } from \"node:path\";\n\nimport { addComponent } from \"./lib/addComponent\";\nimport { addPage } from \"./lib/addPage\";\nimport { rmPage } from \"./lib/rmPage\";\nimport { createProject } from \"./lib/createProject\";\nimport { createProjectWithPrompt } from \"./lib/createProjectWithPrompt\";\n\ntype Cfg = {\n version: 1;\n shell: \"bash\" | \"zsh\";\n completionInstalled: boolean;\n createdAt: string;\n updatedAt: string;\n};\n\nconst CONFIG_DIR = process.env.XDG_CONFIG_HOME\n ? path.join(process.env.XDG_CONFIG_HOME, \"create-next-pro\")\n : path.join(os.homedir(), \".config\", \"create-next-pro\");\nconst CONFIG_FILE = path.join(CONFIG_DIR, \"config.json\");\n\nfunction readCfg(): Cfg | null {\n try {\n return JSON.parse(fs.readFileSync(CONFIG_FILE, \"utf8\")) as Cfg;\n } catch {\n return null;\n }\n}\nfunction writeCfg(cfg: Cfg) {\n fs.mkdirSync(CONFIG_DIR, { recursive: true });\n fs.writeFileSync(CONFIG_FILE, JSON.stringify(cfg, null, 2));\n}\nfunction rcFile(shell: \"bash\" | \"zsh\") {\n return path.join(os.homedir(), shell === \"zsh\" ? \".zshrc\" : \".bashrc\");\n}\nfunction ensureLineInRc(file: string, line: string) {\n try {\n const cur = fs.existsSync(file) ? fs.readFileSync(file, \"utf8\") : \"\";\n if (!cur.includes(line)) fs.appendFileSync(file, `\\n${line}\\n`);\n } catch {\n /* ignore */\n }\n}\nasync function installCompletion(shell: \"bash\" | \"zsh\") {\n // Lit le script dâauto-complÊtion depuis le package (racine du package)\n const __dirname = path.dirname(fileURLToPath(import.meta.url));\n const completionSrc = path.resolve(\n __dirname,\n \"../create-next-pro-completion.sh\",\n );\n const completionDst = path.join(CONFIG_DIR, \"completion.sh\");\n fs.mkdirSync(CONFIG_DIR, { recursive: true });\n fs.copyFileSync(completionSrc, completionDst);\n ensureLineInRc(rcFile(shell), `source \"${completionDst}\"`);\n}\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\nconst packageJsonPath = resolve(__dirname, \"../package.json\");\nconst packageJson = fs.readFileSync(packageJsonPath, \"utf8\");\n\nasync function onboarding(): Promise<Cfg> {\n const pkg = JSON.parse(packageJson);\n console.log(`đ Welcome to create-next-pro v${pkg.version}\\n`);\n const res = await prompts(\n [\n {\n type: \"select\",\n name: \"shell\",\n message: \"Which shell do you use?\",\n choices: [\n { title: \"zsh\", value: \"zsh\" },\n { title: \"bash\", value: \"bash\" },\n ],\n initial: (os.userInfo().shell || \"\").includes(\"zsh\") ? 0 : 1,\n },\n {\n type: \"toggle\",\n name: \"completion\",\n message: \"Install autocompletion?\",\n initial: true,\n active: \"Yes\",\n inactive: \"No\",\n },\n ],\n { onCancel: () => process.exit(1) },\n );\n\n const cfg: Cfg = {\n version: 1,\n shell: res.shell,\n completionInstalled: !!res.completion,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n if (cfg.completionInstalled) await installCompletion(cfg.shell);\n writeCfg(cfg);\n console.log(\"\\nâ
Configuration saved.\");\n console.log(\"you can now use the CLI ! ex : create-next-pro <project-name>\");\n console.log(\n \"For more information, visit: https://github.com/Rising-Corporation/create-next-pro-cli\",\n );\n console.log(\"Happy coding! đ\");\n return cfg;\n}\nfunction showHelp() {\n console.log(`create-next-pro\n\nUsage:\n create-next-pro <project-name> [--force]\n create-next-pro addpage [options]\n create-next-pro addcomponent [options]\n create-next-pro rmpage [options]\n\nOptions:\n --help Show this help message\n --reconfigure Run the configuration assistant again\n`);\n}\n\nfunction showVersion() {\n const pkg = JSON.parse(packageJson);\n console.log(`v${pkg.version}`);\n}\n\n/**\n * Main CLI entry point for create-next-pro.\n *\n * Note: For now, the project behaves as if --force is always enabled and no creation prompt is taken into account.\n * All actions are performed directly without confirmation.\n */\nexport async function main() {\n let args: string[];\n if (typeof Bun !== \"undefined\") {\n args = Bun.argv.slice(2);\n } else if (typeof process !== \"undefined\" && process.argv) {\n args = process.argv.slice(2);\n } else {\n args = [];\n }\n\n if (args.includes(\"--help\")) return showHelp();\n if (args.includes(\"--version\") || args.includes(\"-v\")) return showVersion();\n if (args.includes(\"--reconfigure\") || !readCfg()) {\n await onboarding();\n return;\n }\n\n const force = args.includes(\"--force\");\n // For now, --force is always considered enabled but do not overwrite existing projects\n // WARNING: if you enable --force it will overwrite existing projects. This is a temporary setting for development purposes.\n // const force = true;\n\n // If addpage is called without options, add default flags -LPl\n if (args[0] === \"addpage\" && args.length === 1) {\n args.push(\"-LPl\");\n }\n\n /**\n * Handle addcomponent command: create a component in the correct location and update translation JSON.\n */\n if (args[0] === \"addcomponent\") {\n addComponent(args);\n return;\n }\n\n /**\n * Handle addpage command: create a page (nested or not) and update translation JSON.\n */\n if (args[0] === \"addpage\") {\n addPage(args);\n return;\n }\n\n /**\n * Handle rmpage command: remove a page and all related files/folders.\n */\n if (args[0] === \"rmpage\") {\n rmPage(args);\n return;\n }\n\n /**\n * Handle direct project creation if a name argument is provided.\n */\n const nameArg = args.find((arg) => !arg.startsWith(\"--\"));\n\n if (nameArg) {\n createProject(nameArg, force);\n return;\n }\n\n /**\n * Interactive prompt for project creation (not currently used, see note above).\n */\n await createProjectWithPrompt();\n}\n","import { join } from \"node:path\";\nimport { mkdir, readFile, writeFile, readdir } from \"node:fs/promises\";\nimport prompts from \"prompts\";\n\nimport { capitalize, loadConfig } from \"./utils\";\n\nimport { existsSync, statSync } from \"node:fs\";\n\nexport async function addComponent(args: string[]) {\n let componentName = args[1];\n let pageScope = null;\n let pageIndex = args.findIndex((arg) => arg === \"-P\" || arg === \"--page\");\n if (pageIndex !== -1 && args[pageIndex + 1]) {\n pageScope = args[pageIndex + 1];\n }\n\n // Handle nested pageScope (e.g. ParentPage.ChildPage)\n let nestedPath = null;\n if (pageScope && pageScope.includes(\".\")) {\n nestedPath = join(...pageScope.split(\".\"));\n }\n\n if (!componentName || componentName.startsWith(\"-\")) {\n // Si le nom n'est pas fourni ou est une option, demander via prompt\n const response = await prompts.prompt({\n type: \"text\",\n name: \"componentName\",\n message: \"đ§Š Component name to add:\",\n validate: (name: string) => (name ? true : \"Component name is required\"),\n });\n componentName = response.componentName;\n }\n\n const config = await loadConfig();\n if (!config) {\n console.error(\n \"â Configuration file cnp.config.json not found. Run this command from the project root.\"\n );\n return;\n }\n const useI18n = !!config.useI18n;\n\n const componentNameUpper = capitalize(componentName);\n const templatePath = join(\n import.meta.dir,\n \"..\",\n \"..\",\n \"templates\",\n \"Component\"\n );\n let messagesPath: string | null = null;\n if (useI18n) {\n messagesPath = join(process.cwd(), \"messages\");\n if (!existsSync(messagesPath)) {\n console.error(\"â Messages directory missing. Ensure i18n was configured.\");\n return;\n }\n }\n\n // Determine target path for the component\n let componentTargetPath;\n let translationKey;\n if (pageScope) {\n if (nestedPath) {\n componentTargetPath = join(process.cwd(), \"src\", \"ui\", nestedPath);\n translationKey = pageScope;\n } else {\n componentTargetPath = join(process.cwd(), \"src\", \"ui\", pageScope);\n translationKey = pageScope;\n }\n } else {\n componentTargetPath = join(process.cwd(), \"src\", \"ui\", \"_global\");\n translationKey = \"_global_ui\";\n }\n if (!existsSync(componentTargetPath)) {\n await mkdir(componentTargetPath, { recursive: true });\n }\n const componentFile = join(componentTargetPath, `${componentNameUpper}.tsx`);\n\n // Read and adapt the TSX template\n const templateComponentPath = join(templatePath, \"Component.tsx\");\n if (existsSync(templateComponentPath)) {\n let content = await readFile(templateComponentPath, \"utf-8\");\n // Remplacement du nom du component et de la clÊ de traduction\n content = content\n .replace(/Component/g, componentNameUpper)\n .replace(/componentPage/g, translationKey);\n await writeFile(componentFile, content);\n console.log(`đ File created: ${componentFile}`);\n } else {\n console.error(\n \"â Template Component.tsx introuvable :\",\n templateComponentPath\n );\n }\n\n\n if (useI18n && messagesPath) {\n const entries = await readdir(messagesPath, { withFileTypes: true });\n const langDirs = entries.filter((e) => e.isDirectory()).map((e) => e.name);\n const jsonTemplate = join(templatePath, \"component.json\");\n if (!existsSync(jsonTemplate)) {\n console.error(\"â Template component.json not found:\", jsonTemplate);\n return;\n\n }\n const jsonContent = await readFile(jsonTemplate, \"utf-8\");\n const parsed = JSON.parse(jsonContent);\n\n for (const locale of langDirs) {\n // Only process if messages/<locale> is a directory\n const localeDir = join(messagesPath, locale);\n if (!existsSync(localeDir) || !statSync(localeDir).isDirectory())\n continue;\n let jsonTarget;\n if (pageScope) {\n jsonTarget = join(messagesPath, locale, `${pageScope}.json`);\n } else {\n jsonTarget = join(messagesPath, locale, `_global_ui.json`);\n }\n\n let current: Record<string, any> = {};\n if (existsSync(jsonTarget)) {\n const jsonFile = await readFile(jsonTarget, \"utf-8\");\n current = JSON.parse(jsonFile) as Record<string, any>;\n }\n current[componentNameUpper] = parsed;\n await writeFile(jsonTarget, JSON.stringify(current, null, 2));\n }\n } else {\n console.log(\"âšī¸ Skipping translation entries; next-intl not enabled.\");\n }\n\n console.log(\n `â
Component \"${componentNameUpper}\" added ${\n pageScope ? `to page ${pageScope}` : \"globally\"\n }${useI18n ? \" with localized messages\" : \"\"}.`\n );\n}\n","import { readFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\n/**\n * Capitalize the first letter of a string.\n */\nexport function capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\nexport interface CNPConfig {\n useI18n?: boolean;\n [key: string]: any;\n}\n\n/**\n * Load CLI configuration from the project root.\n * Returns null if the configuration file is missing or invalid.\n */\nexport async function loadConfig(): Promise<CNPConfig | null> {\n const configPath = join(process.cwd(), \"cnp.config.json\");\n if (!existsSync(configPath)) return null;\n try {\n const raw = await readFile(configPath, \"utf-8\");\n return JSON.parse(raw) as CNPConfig;\n } catch {\n return null;\n }\n}\n\n/**\n * Map a key to its corresponding file name for page/component templates.\n * @param key string\n * @returns file name string\n */\nexport function toFileName(key: string): string {\n switch (key) {\n case \"layout\":\n return \"layout.tsx\";\n case \"page\":\n return \"page.tsx\";\n case \"loading\":\n return \"loading.tsx\";\n case \"not-found\":\n return \"not-found.tsx\";\n case \"error\":\n return \"error.tsx\";\n case \"global-error\":\n return \"global-error.tsx\";\n case \"route\":\n return \"route.ts\";\n case \"template\":\n return \"template.tsx\";\n case \"default\":\n return \"default.tsx\";\n default:\n return `${key}.tsx`;\n }\n}\n","import { join } from \"node:path\";\nimport { mkdir, readFile, writeFile, readdir } from \"node:fs/promises\";\nimport prompts from \"prompts\";\n\nimport { capitalize, toFileName, loadConfig } from \"./utils\";\n\nimport { existsSync, statSync } from \"node:fs\";\n\nexport async function addPage(args: string[]) {\n let pageName = args[1];\n if (!pageName || pageName.startsWith(\"-\")) {\n const response = await prompts.prompt({\n type: \"text\",\n name: \"pageName\",\n message: \"đ Page name to add:\",\n validate: (name: string) => (name ? true : \"Page name is required\"),\n });\n pageName = response.pageName;\n }\n\n // Handle nested pages\n let parentName = null;\n let childName = null;\n if (pageName.includes(\".\")) {\n [parentName, childName] = pageName.split(\".\");\n }\n\n let shortFlags = args.find((arg) => /^-[A-Za-z]+$/.test(arg));\n let longFlags = new Set(args.filter((a) => a.startsWith(\"--\")));\n const flags = new Set<string>();\n\n if (!shortFlags && Array.from(longFlags).length === 0) {\n shortFlags = \"-LPl\";\n }\n\n if (shortFlags) {\n for (const char of shortFlags.slice(1)) {\n switch (char) {\n case \"L\":\n flags.add(\"layout\");\n break;\n case \"P\":\n flags.add(\"page\");\n break;\n case \"l\":\n flags.add(\"loading\");\n break;\n case \"n\":\n flags.add(\"not-found\");\n break;\n case \"e\":\n flags.add(\"error\");\n break;\n case \"g\":\n flags.add(\"global-error\");\n break;\n case \"r\":\n flags.add(\"route\");\n break;\n case \"t\":\n flags.add(\"template\");\n break;\n case \"d\":\n flags.add(\"default\");\n break;\n }\n }\n }\n\n for (const flag of [\n \"layout\",\n \"page\",\n \"loading\",\n \"not-found\",\n \"error\",\n \"global-error\",\n \"route\",\n \"template\",\n \"default\",\n ]) {\n if (longFlags.has(\"--\" + flag)) flags.add(flag);\n }\n\n const config = await loadConfig();\n if (!config) {\n console.error(\"â Configuration file cnp.config.json not found. Run this command from the project root.\");\n return;\n }\n const useI18n = !!config.useI18n;\n\n const srcSegments = [\"src\", \"app\"];\n if (useI18n) srcSegments.push(\"[locale]\");\n const srcPath = join(process.cwd(), ...srcSegments);\n if (!existsSync(srcPath)) {\n console.error(`â Expected directory not found: ${srcPath}`);\n return;\n }\n\n let messagesPath: string | null = null;\n let locales: string[] = [];\n if (useI18n) {\n messagesPath = join(process.cwd(), \"messages\");\n if (!existsSync(messagesPath)) {\n console.error(\"â Messages directory missing. Ensure i18n was configured.\");\n return;\n }\n const entries = await readdir(messagesPath, { withFileTypes: true });\n locales = entries.filter((e) => e.isDirectory()).map((e) => e.name);\n }\n\n const templatePath = join(import.meta.dir, \"..\", \"..\", \"templates\", \"Page\");\n\n // Create folders/files for nested or simple page\n let uiPageDir, localePagePath, jsonFileName;\n if (parentName && childName) {\n uiPageDir = join(process.cwd(), \"src\", \"ui\", parentName, childName);\n localePagePath = join(srcPath, parentName, childName);\n jsonFileName = parentName;\n } else {\n uiPageDir = join(process.cwd(), \"src\", \"ui\", pageName);\n localePagePath = join(srcPath, pageName);\n jsonFileName = pageName;\n }\n if (!existsSync(uiPageDir)) {\n await mkdir(uiPageDir, { recursive: true });\n }\n const uiPageFile = join(uiPageDir, \"page-ui.tsx\");\n const uiPageTemplate = join(templatePath, \"page-ui.tsx\");\n if (existsSync(uiPageTemplate)) {\n let uiContent = await readFile(uiPageTemplate, \"utf-8\");\n uiContent = uiContent\n .replace(/template/g, childName || pageName)\n .replace(/Template/g, capitalize(childName || pageName));\n await writeFile(uiPageFile, uiContent);\n console.log(`đ File created: ${uiPageFile}`);\n } else {\n console.warn(\"â ī¸ Template page-ui.tsx manquant.\");\n }\n if (!existsSync(localePagePath)) {\n await mkdir(localePagePath, { recursive: true });\n }\n for (const flag of flags) {\n const filename = toFileName(flag);\n const src = join(templatePath, filename);\n const dst = join(localePagePath, filename);\n if (!existsSync(src)) {\n console.warn(`â ī¸ Missing template file: ${filename}`);\n continue;\n }\n const content = await readFile(src, \"utf-8\");\n const replaced = content\n .replace(/template/g, childName || pageName)\n .replace(/Template/g, capitalize(childName || pageName));\n await writeFile(dst, replaced);\n console.log(`đ File created: ${dst}`);\n }\n\n if (useI18n && messagesPath) {\n const jsonTemplate = join(templatePath, \"page.json\");\n if (!existsSync(jsonTemplate)) {\n console.warn(\"â ī¸ Missing template page.json.\");\n\n } else {\n const content = await readFile(jsonTemplate, \"utf-8\");\n const replaced = content\n .replace(/template/g, childName || pageName)\n .replace(/Template/g, capitalize(childName || pageName));\n for (const locale of locales) {\n // Only process if messages/<locale> is a directory\n const localeDir = join(messagesPath, locale);\n if (!existsSync(localeDir) || !statSync(localeDir).isDirectory())\n continue;\n const jsonTarget = join(messagesPath, locale, `${jsonFileName}.json`);\n let current: Record<string, any> = {};\n if (existsSync(jsonTarget)) {\n const jsonFile = await readFile(jsonTarget, \"utf-8\");\n try {\n current = JSON.parse(jsonFile) as Record<string, any>;\n } catch {\n current = {};\n }\n }\n if (parentName && childName) {\n current[childName] = JSON.parse(replaced);\n } else {\n // fichier simple\n current = JSON.parse(replaced);\n }\n await writeFile(jsonTarget, JSON.stringify(current, null, 2));\n }\n }\n } else {\n console.log(\"âšī¸ Skipping translation templates; next-intl not enabled.\");\n }\n\n console.log(\n `â
Page \"${pageName}\" with templates added${\n useI18n ? \" for each locale\" : \"\"\n }.`\n );\n}\n","import { join } from \"node:path\";\nimport { writeFile, readdir } from \"node:fs/promises\";\nimport prompts from \"prompts\";\nimport { existsSync } from \"node:fs\";\n\nexport async function rmPage(args: string[]) {\n let pageName = args[1];\n if (!pageName || pageName.startsWith(\"-\")) {\n const response = await prompts.prompt({\n type: \"text\",\n name: \"pageName\",\n message: \"đī¸ Page name to remove:\",\n validate: (name: string) => (name ? true : \"Page name is required\"),\n });\n pageName = response.pageName;\n }\n\n // Remove translation files messages/<lang>/<PageName>.json\n const messagesPath = join(process.cwd(), \"messages\");\n const entries = await readdir(messagesPath, { withFileTypes: true });\n const langDirs = entries.filter((e) => e.isDirectory()).map((e) => e.name);\n for (const locale of langDirs) {\n const jsonTarget = join(messagesPath, locale, `${pageName}.json`);\n if (existsSync(jsonTarget)) {\n await writeFile(jsonTarget, \"\");\n await import(\"node:child_process\").then((cp) =>\n cp.execSync(`rm -f '${jsonTarget}'`)\n );\n console.log(`đī¸ Deleted: ${jsonTarget}`);\n }\n }\n\n // Remove folder src/ui/<PageName>\n const uiPageDir = join(process.cwd(), \"src\", \"ui\", pageName);\n if (existsSync(uiPageDir)) {\n await import(\"node:child_process\").then((cp) =>\n cp.execSync(`rm -rf '${uiPageDir}'`)\n );\n console.log(`đī¸ Deleted: ${uiPageDir}`);\n }\n\n // Remove folder src/app/[locale]/<PageName>\n const appLocaleDir = join(process.cwd(), \"src\", \"app\", \"[locale]\", pageName);\n if (existsSync(appLocaleDir)) {\n await import(\"node:child_process\").then((cp) =>\n cp.execSync(`rm -rf '${appLocaleDir}'`)\n );\n console.log(`đī¸ Deleted: ${appLocaleDir}`);\n }\n\n console.log(`â
Page \"${pageName}\" deleted.`);\n}\n","// src/scaffold.ts\n\nimport { cp, mkdir, rm, writeFile, readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { existsSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\n\nconst RED = \"\\x1b[31m\";\nconst GREEN = \"\\x1b[32m\";\nconst YELLOW = \"\\x1b[33m\";\nconst BLUE = \"\\x1b[34m\";\nconst CYAN = \"\\x1b[36m\";\nconst RESET = \"\\x1b[0m\";\n\n/**\n * Options for scaffolding a Next.js project.\n */\ninterface ScaffoldOptions {\n projectName: string;\n useTypescript: boolean;\n useEslint: boolean;\n useTailwind: boolean;\n useSrcDir: boolean;\n useTurbopack: boolean;\n useI18n: boolean;\n customAlias: boolean;\n importAlias: string;\n force?: boolean;\n}\n\n/**\n * Scaffold a new Next.js project based on provided options.\n *\n * - Copies the default template to the target directory\n * - Removes the target directory if it exists and --force is set\n * - Optionally customizes the structure in future (e.g. remove unused files)\n *\n * @param options ScaffoldOptions for the project\n */\nexport async function scaffoldProject(options: ScaffoldOptions) {\n const targetPath = join(process.cwd(), options.projectName);\n\n const __dirname = new URL(\".\", import.meta.url); // or :\n // const __dirname = path.dirname(fileURLToPath(import.meta.url));\n const templatePath = join(\n fileURLToPath(__dirname),\n \"..\",\n \"templates\",\n \"Projects\",\n \"default\",\n );\n\n // Check if target directory exists\n if (existsSync(targetPath)) {\n if (options.force) {\n console.warn(\"â ī¸ Target directory already exists, removing...\");\n await rm(targetPath, { recursive: true, force: true });\n } else {\n console.error(\n `${RED}[X] Target directory already exists. Use --force to overwrite.${RESET}`,\n );\n process.exit(1);\n }\n }\n\n try {\n console.log(\"Creating project directory...\");\n await mkdir(targetPath, { recursive: true });\n\n console.log(\"Copying files from template...\");\n await cp(templatePath, targetPath, { recursive: true });\n\n // Apply configuration: add dependencies or files based on prompt choices\n const pkgPath = join(targetPath, \"package.json\");\n if (existsSync(pkgPath)) {\n const pkg = JSON.parse(await readFile(pkgPath, \"utf-8\"));\n pkg.dependencies = pkg.dependencies || {};\n if (options.useI18n) {\n pkg.dependencies[\"next-intl\"] =\n pkg.dependencies[\"next-intl\"] || \"^4.3.5\";\n }\n await writeFile(pkgPath, JSON.stringify(pkg, null, 2));\n }\n\n // Write CLI configuration to project root\n await writeFile(\n join(targetPath, \"cnp.config.json\"),\n JSON.stringify(options, null, 2),\n );\n\n console.log(\"Project setup complete!\");\n console.log(\"\");\n console.log(\"To get started:\");\n console.log(` ${GREEN}cd ${options.projectName}${RESET}`);\n console.log(\"\");\n console.log(\n \"Then install dependencies and launch the dev server with your preferred tool:\",\n );\n\n console.log(` ${GREEN}bun install && bun dev${RESET}`);\n console.log(` ${GREEN}npm install && npm run dev${RESET}`);\n console.log(` ${GREEN}pnpm install && pnpm run dev${RESET}`);\n console.log(\"\");\n console.log(\"Documentation and examples can be found at:\");\n console.log(\n ` ${CYAN}https://github.com/Rising-Corporation/create-next-pro-cli${RESET}`,\n );\n console.log(\n \"_-`'-_-'`_`'-_-'`_`'-_-'`_`'-_-'`_`'-_-'`_`'-_-'`_`'-_-'`_`'-_-'`-_\",\n );\n } catch (err) {\n // Affiche une croix ASCII et le texte en rouge si le terminal le supporte\n\n console.error(` ${RED}[X] Error during project creation:${RESET}`, err);\n process.exit(1);\n }\n}\n","import { scaffoldProject } from \"../scaffold\";\nexport async function createProject(nameArg: string, force: boolean) {\n const response = {\n projectName: nameArg,\n useTypescript: true,\n useEslint: true,\n useTailwind: true,\n useSrcDir: true,\n useTurbopack: true,\n useI18n: true,\n customAlias: true,\n importAlias: \"@/*\",\n force,\n };\n\n console.log(`Creating project \"${response.projectName}\"...`);\n await scaffoldProject(response);\n}\n","import { scaffoldProject } from \"../scaffold\";\nimport prompts from \"prompts\";\nexport async function createProjectWithPrompt() {\n const response = await prompts.prompt([\n {\n type: \"text\",\n name: \"projectName\",\n message: \"Project name:\",\n initial: \"my-next-app\",\n },\n {\n type: \"toggle\",\n name: \"useTypescript\",\n message: \"â Use TypeScript?\",\n initial: true,\n active: \"Yes\",\n inactive: \"No\",\n },\n {\n type: \"toggle\",\n name: \"useEslint\",\n message: \"â Use ESLint?\",\n initial: true,\n active: \"Yes\",\n inactive: \"No\",\n },\n {\n type: \"toggle\",\n name: \"useTailwind\",\n message: \"â Use Tailwind CSS?\",\n initial: true,\n active: \"Yes\",\n inactive: \"No\",\n },\n {\n type: \"toggle\",\n name: \"useSrcDir\",\n message: \"â Use `src/` directory?\",\n initial: true,\n active: \"Yes\",\n inactive: \"No\",\n },\n {\n type: \"toggle\",\n name: \"useTurbopack\",\n message: \"â Use Turbopack for `next dev`?\",\n initial: true,\n active: \"Yes\",\n inactive: \"No\",\n },\n {\n type: \"toggle\",\n name: \"useI18n\",\n message: \"â Use i18n with next-intl for translations?\",\n initial: true,\n active: \"Yes\",\n inactive: \"No\",\n },\n {\n type: \"toggle\",\n name: \"customAlias\",\n message: \"â Customize import alias (`@/*` by default)?\",\n initial: true,\n active: \"Yes\",\n inactive: \"No\",\n },\n {\n type: (prev: boolean) => (prev ? \"text\" : null),\n name: \"importAlias\",\n message: \"â What import alias would you like?\",\n initial: \"@core/*\",\n },\n ]);\n\n console.log(\"\\nYour choices:\");\n console.log(response);\n\n await scaffoldProject(response);\n}\n","#!/usr/bin/env node\nimport { main } from \"./src/index\";\nmain();\n"],"mappings":"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","names":["prompts","fileURLToPath","join","readFile","existsSync","join","readFile","join","mkdir","readFile","writeFile","readdir","prompts","existsSync","statSync","prompts","join","readdir","mkdir","readFile","writeFile","join","writeFile","readdir","prompts","existsSync","cp","mkdir","writeFile","readFile","join","existsSync","join","__dirname","existsSync","mkdir","readFile","writeFile","prompts","__dirname","fileURLToPath","prompts"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/lib/addComponent.ts","../src/lib/utils.ts","../src/lib/addPage.ts","../src/lib/rmPage.ts","../src/lib/addLib.ts","../src/lib/addApi.ts","../src/scaffold.ts","../src/lib/createProject.ts","../src/lib/createProjectWithPrompt.ts","../bin.node.ts"],"sourcesContent":["// src/index.ts\n\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport prompts from \"prompts\";\nimport { fileURLToPath } from \"node:url\";\nimport { dirname, resolve } from \"node:path\";\n\nimport { addComponent } from \"./lib/addComponent\";\nimport { addPage } from \"./lib/addPage\";\nimport { rmPage } from \"./lib/rmPage\";\nimport { addLib } from \"./lib/addLib\";\nimport { addApi } from \"./lib/addApi\";\nimport { createProject } from \"./lib/createProject\";\nimport { createProjectWithPrompt } from \"./lib/createProjectWithPrompt\";\n\ntype Cfg = {\n version: 1;\n shell: \"bash\" | \"zsh\";\n completionInstalled: boolean;\n createdAt: string;\n updatedAt: string;\n};\n\nconst CONFIG_DIR = process.env.XDG_CONFIG_HOME\n ? path.join(process.env.XDG_CONFIG_HOME, \"create-next-pro\")\n : path.join(os.homedir(), \".config\", \"create-next-pro\");\nconst CONFIG_FILE = path.join(CONFIG_DIR, \"config.json\");\n\nfunction readCfg(): Cfg | null {\n try {\n return JSON.parse(fs.readFileSync(CONFIG_FILE, \"utf8\")) as Cfg;\n } catch {\n return null;\n }\n}\nfunction writeCfg(cfg: Cfg) {\n fs.mkdirSync(CONFIG_DIR, { recursive: true });\n fs.writeFileSync(CONFIG_FILE, JSON.stringify(cfg, null, 2));\n}\nfunction rcFile(shell: \"bash\" | \"zsh\") {\n return path.join(os.homedir(), shell === \"zsh\" ? \".zshrc\" : \".bashrc\");\n}\nfunction ensureLineInRc(file: string, line: string) {\n try {\n const cur = fs.existsSync(file) ? fs.readFileSync(file, \"utf8\") : \"\";\n if (!cur.includes(line)) fs.appendFileSync(file, `\\n${line}\\n`);\n } catch {\n /* ignore */\n }\n}\nasync function installCompletion(shell: \"bash\" | \"zsh\") {\n // Lit le script dâauto-complÊtion depuis le package (racine du package)\n const __dirname = path.dirname(fileURLToPath(import.meta.url));\n const completionSrc = path.resolve(\n __dirname,\n \"../create-next-pro-completion.sh\",\n );\n const completionDst = path.join(CONFIG_DIR, \"completion.sh\");\n fs.mkdirSync(CONFIG_DIR, { recursive: true });\n fs.copyFileSync(completionSrc, completionDst);\n ensureLineInRc(rcFile(shell), `source \"${completionDst}\"`);\n}\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\nconst packageJsonPath = resolve(__dirname, \"../package.json\");\nconst packageJson = fs.readFileSync(packageJsonPath, \"utf8\");\n\nasync function onboarding(): Promise<Cfg> {\n const pkg = JSON.parse(packageJson);\n console.log(`đ Welcome to create-next-pro v${pkg.version}\\n`);\n const res = await prompts(\n [\n {\n type: \"select\",\n name: \"shell\",\n message: \"Which shell do you use?\",\n choices: [\n { title: \"zsh\", value: \"zsh\" },\n { title: \"bash\", value: \"bash\" },\n ],\n initial: (os.userInfo().shell || \"\").includes(\"zsh\") ? 0 : 1,\n },\n {\n type: \"toggle\",\n name: \"completion\",\n message: \"Install autocompletion?\",\n initial: true,\n active: \"Yes\",\n inactive: \"No\",\n },\n ],\n { onCancel: () => process.exit(1) },\n );\n\n const cfg: Cfg = {\n version: 1,\n shell: res.shell,\n completionInstalled: !!res.completion,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n if (cfg.completionInstalled) await installCompletion(cfg.shell);\n writeCfg(cfg);\n console.log(\"\\nâ
Configuration saved.\");\n console.log(\"you can now use the CLI ! ex : create-next-pro <project-name>\");\n console.log(\n \"For more information, visit: https://github.com/Rising-Corporation/create-next-pro-cli\",\n );\n console.log(\"Happy coding! đ\");\n return cfg;\n}\nfunction showHelp() {\n console.log(`create-next-pro\n\nUsage:\n create-next-pro <project-name> [--force]\n create-next-pro addpage [options]\n create-next-pro addcomponent [options]\n create-next-pro addlib [name]\n create-next-pro addapi [name]\n create-next-pro rmpage [options]\n\nOptions:\n --help Show this help message\n --reconfigure Run the configuration assistant again\n`);\n}\n\nfunction showVersion() {\n const pkg = JSON.parse(packageJson);\n console.log(`v${pkg.version}`);\n}\n\n/**\n * Main CLI entry point for create-next-pro.\n *\n * Note: For now, the project behaves as if --force is always enabled and no creation prompt is taken into account.\n * All actions are performed directly without confirmation.\n */\nexport async function main() {\n let args: string[];\n if (typeof Bun !== \"undefined\") {\n args = Bun.argv.slice(2);\n } else if (typeof process !== \"undefined\" && process.argv) {\n args = process.argv.slice(2);\n } else {\n args = [];\n }\n\n if (args.includes(\"--help\")) return showHelp();\n if (args.includes(\"--version\") || args.includes(\"-v\")) return showVersion();\n if (args.includes(\"--reconfigure\") || !readCfg()) {\n await onboarding();\n return;\n }\n\n const force = args.includes(\"--force\");\n // For now, --force is always considered enabled but do not overwrite existing projects\n // WARNING: if you enable --force it will overwrite existing projects. This is a temporary setting for development purposes.\n // const force = true;\n\n // If addpage is called without options, add default flags -LPl\n if (args[0] === \"addpage\" && args.length === 1) {\n args.push(\"-LPl\");\n }\n\n /**\n * Handle addcomponent command: create a component in the correct location and update translation JSON.\n */\n if (args[0] === \"addcomponent\") {\n addComponent(args);\n return;\n }\n\n /**\n * Handle addpage command: create a page (nested or not) and update translation JSON.\n */\n if (args[0] === \"addpage\") {\n addPage(args);\n return;\n }\n\n /**\n * Handle addlib command: scaffold a library folder and files.\n */\n if (args[0] === \"addlib\") {\n addLib(args);\n return;\n }\n\n /**\n * Handle addapi command: scaffold an API route.\n */\n if (args[0] === \"addapi\") {\n addApi(args);\n return;\n }\n\n /**\n * Handle rmpage command: remove a page and all related files/folders.\n */\n if (args[0] === \"rmpage\") {\n rmPage(args);\n return;\n }\n\n /**\n * Handle direct project creation if a name argument is provided.\n */\n const nameArg = args.find((arg) => !arg.startsWith(\"--\"));\n\n if (nameArg) {\n createProject(nameArg, force);\n return;\n }\n\n /**\n * Interactive prompt for project creation (not currently used, see note above).\n */\n await createProjectWithPrompt();\n}\n","import { join } from \"node:path\";\nimport { mkdir, readFile, writeFile, readdir } from \"node:fs/promises\";\nimport prompts from \"prompts\";\n\nimport { capitalize, loadConfig } from \"./utils\";\n\nimport { existsSync, statSync } from \"node:fs\";\n\nexport async function addComponent(args: string[]) {\n let componentName = args[1];\n let pageScope = null;\n let pageIndex = args.findIndex((arg) => arg === \"-P\" || arg === \"--page\");\n if (pageIndex !== -1 && args[pageIndex + 1]) {\n pageScope = args[pageIndex + 1];\n }\n\n // Handle nested pageScope (e.g. ParentPage.ChildPage)\n let nestedPath = null;\n if (pageScope && pageScope.includes(\".\")) {\n nestedPath = join(...pageScope.split(\".\"));\n }\n\n if (!componentName || componentName.startsWith(\"-\")) {\n // Si le nom n'est pas fourni ou est une option, demander via prompt\n const response = await prompts.prompt({\n type: \"text\",\n name: \"componentName\",\n message: \"đ§Š Component name to add:\",\n validate: (name: string) => (name ? true : \"Component name is required\"),\n });\n componentName = response.componentName;\n }\n\n const config = await loadConfig();\n if (!config) {\n console.error(\n \"â Configuration file cnp.config.json not found. Run this command from the project root.\",\n );\n return;\n }\n const useI18n = !!config.useI18n;\n\n const componentNameUpper = capitalize(componentName);\n const templatePath = join(\n new URL(\"..\", import.meta.url).pathname,\n \"..\",\n \"templates\",\n \"Component\",\n );\n let messagesPath: string | null = null;\n if (useI18n) {\n messagesPath = join(process.cwd(), \"messages\");\n if (!existsSync(messagesPath)) {\n console.error(\n \"â Messages directory missing. Ensure i18n was configured.\",\n );\n return;\n }\n }\n\n // Determine target path for the component\n let componentTargetPath;\n let translationKey;\n if (pageScope) {\n if (nestedPath) {\n componentTargetPath = join(process.cwd(), \"src\", \"ui\", nestedPath);\n translationKey = pageScope;\n } else {\n componentTargetPath = join(process.cwd(), \"src\", \"ui\", pageScope);\n translationKey = pageScope;\n }\n } else {\n componentTargetPath = join(process.cwd(), \"src\", \"ui\", \"_global\");\n translationKey = \"_global_ui\";\n }\n if (!existsSync(componentTargetPath)) {\n await mkdir(componentTargetPath, { recursive: true });\n }\n const componentFile = join(componentTargetPath, `${componentNameUpper}.tsx`);\n\n // Read and adapt the TSX template\n const templateComponentPath = join(templatePath, \"Component.tsx\");\n if (existsSync(templateComponentPath)) {\n let content = await readFile(templateComponentPath, \"utf-8\");\n // Remplacement du nom du component et de la clÊ de traduction\n content = content\n .replace(/Component/g, componentNameUpper)\n .replace(/componentPage/g, translationKey);\n await writeFile(componentFile, content);\n console.log(`đ File created: ${componentFile}`);\n } else {\n console.error(\n \"â Template Component.tsx introuvable :\",\n templateComponentPath,\n );\n }\n\n if (useI18n && messagesPath) {\n const entries = await readdir(messagesPath, { withFileTypes: true });\n const langDirs = entries.filter((e) => e.isDirectory()).map((e) => e.name);\n const jsonTemplate = join(templatePath, \"component.json\");\n if (!existsSync(jsonTemplate)) {\n console.error(\"â Template component.json not found:\", jsonTemplate);\n return;\n }\n const jsonContent = await readFile(jsonTemplate, \"utf-8\");\n const parsed = JSON.parse(jsonContent);\n\n for (const locale of langDirs) {\n // Only process if messages/<locale> is a directory\n const localeDir = join(messagesPath, locale);\n if (!existsSync(localeDir) || !statSync(localeDir).isDirectory())\n continue;\n let jsonTarget;\n if (pageScope) {\n jsonTarget = join(messagesPath, locale, `${pageScope}.json`);\n } else {\n jsonTarget = join(messagesPath, locale, `_global_ui.json`);\n }\n\n let current: Record<string, any> = {};\n if (existsSync(jsonTarget)) {\n const jsonFile = await readFile(jsonTarget, \"utf-8\");\n current = JSON.parse(jsonFile) as Record<string, any>;\n }\n current[componentNameUpper] = parsed;\n await writeFile(jsonTarget, JSON.stringify(current, null, 2));\n }\n } else {\n console.log(\"âšī¸ Skipping translation entries; next-intl not enabled.\");\n }\n\n console.log(\n `â
Component \"${componentNameUpper}\" added ${\n pageScope ? `to page ${pageScope}` : \"globally\"\n }${useI18n ? \" with localized messages\" : \"\"}.`,\n );\n}\n","import { readFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\n/**\n * Capitalize the first letter of a string.\n */\nexport function capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\nexport interface CNPConfig {\n useI18n?: boolean;\n [key: string]: any;\n}\n\n/**\n * Load CLI configuration from the project root.\n * Returns null if the configuration file is missing or invalid.\n */\nexport async function loadConfig(): Promise<CNPConfig | null> {\n const configPath = join(process.cwd(), \"cnp.config.json\");\n if (!existsSync(configPath)) return null;\n try {\n const raw = await readFile(configPath, \"utf-8\");\n return JSON.parse(raw) as CNPConfig;\n } catch {\n return null;\n }\n}\n\n/**\n * Map a key to its corresponding file name for page/component templates.\n * @param key string\n * @returns file name string\n */\nexport function toFileName(key: string): string {\n switch (key) {\n case \"layout\":\n return \"layout.tsx\";\n case \"page\":\n return \"page.tsx\";\n case \"loading\":\n return \"loading.tsx\";\n case \"not-found\":\n return \"not-found.tsx\";\n case \"error\":\n return \"error.tsx\";\n case \"global-error\":\n return \"global-error.tsx\";\n case \"route\":\n return \"route.ts\";\n case \"template\":\n return \"template.tsx\";\n case \"default\":\n return \"default.tsx\";\n default:\n return `${key}.tsx`;\n }\n}\n","import { join } from \"node:path\";\nimport { mkdir, readFile, writeFile, readdir } from \"node:fs/promises\";\nimport prompts from \"prompts\";\n\nimport { capitalize, toFileName, loadConfig } from \"./utils\";\n\nimport { existsSync, statSync } from \"node:fs\";\n\nexport async function addPage(args: string[]) {\n let pageName = args[1];\n if (!pageName || pageName.startsWith(\"-\")) {\n const response = await prompts.prompt({\n type: \"text\",\n name: \"pageName\",\n message: \"đ Page name to add:\",\n validate: (name: string) => (name ? true : \"Page name is required\"),\n });\n pageName = response.pageName;\n }\n\n // Handle nested pages\n let parentName = null;\n let childName = null;\n if (pageName.includes(\".\")) {\n [parentName, childName] = pageName.split(\".\");\n }\n\n let shortFlags = args.find((arg) => /^-[A-Za-z]+$/.test(arg));\n let longFlags = new Set(args.filter((a) => a.startsWith(\"--\")));\n const flags = new Set<string>();\n\n if (!shortFlags && Array.from(longFlags).length === 0) {\n shortFlags = \"-LPl\";\n }\n\n if (shortFlags) {\n for (const char of shortFlags.slice(1)) {\n switch (char) {\n case \"L\":\n flags.add(\"layout\");\n break;\n case \"P\":\n flags.add(\"page\");\n break;\n case \"l\":\n flags.add(\"loading\");\n break;\n case \"n\":\n flags.add(\"not-found\");\n break;\n case \"e\":\n flags.add(\"error\");\n break;\n case \"g\":\n flags.add(\"global-error\");\n break;\n case \"r\":\n flags.add(\"route\");\n break;\n case \"t\":\n flags.add(\"template\");\n break;\n case \"d\":\n flags.add(\"default\");\n break;\n }\n }\n }\n\n for (const flag of [\n \"layout\",\n \"page\",\n \"loading\",\n \"not-found\",\n \"error\",\n \"global-error\",\n \"route\",\n \"template\",\n \"default\",\n ]) {\n if (longFlags.has(\"--\" + flag)) flags.add(flag);\n }\n\n const config = await loadConfig();\n if (!config) {\n console.error(\n \"â Configuration file cnp.config.json not found. Run this command from the project root.\",\n );\n return;\n }\n const useI18n = !!config.useI18n;\n\n const srcSegments = [\"src\", \"app\"];\n if (useI18n) srcSegments.push(\"[locale]\");\n const srcPath = join(process.cwd(), ...srcSegments);\n if (!existsSync(srcPath)) {\n console.error(`â Expected directory not found: ${srcPath}`);\n return;\n }\n\n let messagesPath: string | null = null;\n let locales: string[] = [];\n if (useI18n) {\n messagesPath = join(process.cwd(), \"messages\");\n if (!existsSync(messagesPath)) {\n console.error(\n \"â Messages directory missing. Ensure i18n was configured.\",\n );\n return;\n }\n const entries = await readdir(messagesPath, { withFileTypes: true });\n locales = entries.filter((e) => e.isDirectory()).map((e) => e.name);\n }\n\n const templatePath = join(\n new URL(\"..\", import.meta.url).pathname,\n \"..\",\n \"templates\",\n \"Page\",\n );\n\n // Create folders/files for nested or simple page\n let uiPageDir, localePagePath, jsonFileName;\n if (parentName && childName) {\n uiPageDir = join(process.cwd(), \"src\", \"ui\", parentName, childName);\n localePagePath = join(srcPath, parentName, childName);\n jsonFileName = parentName;\n } else {\n uiPageDir = join(process.cwd(), \"src\", \"ui\", pageName);\n localePagePath = join(srcPath, pageName);\n jsonFileName = pageName;\n }\n if (!existsSync(uiPageDir)) {\n await mkdir(uiPageDir, { recursive: true });\n }\n const uiPageFile = join(uiPageDir, \"page-ui.tsx\");\n const uiPageTemplate = join(templatePath, \"page-ui.tsx\");\n if (existsSync(uiPageTemplate)) {\n let uiContent = await readFile(uiPageTemplate, \"utf-8\");\n uiContent = uiContent\n .replace(/template/g, childName || pageName)\n .replace(/Template/g, capitalize(childName || pageName));\n await writeFile(uiPageFile, uiContent);\n console.log(`đ File created: ${uiPageFile}`);\n } else {\n console.warn(\"â ī¸ Template page-ui.tsx manquant.\");\n }\n if (!existsSync(localePagePath)) {\n await mkdir(localePagePath, { recursive: true });\n }\n for (const flag of flags) {\n const filename = toFileName(flag);\n const src = join(templatePath, filename);\n const dst = join(localePagePath, filename);\n if (!existsSync(src)) {\n console.warn(`â ī¸ Missing template file: ${filename}`);\n continue;\n }\n const content = await readFile(src, \"utf-8\");\n const replaced = content\n .replace(/template/g, childName || pageName)\n .replace(/Template/g, capitalize(childName || pageName));\n await writeFile(dst, replaced);\n console.log(`đ File created: ${dst}`);\n }\n\n if (useI18n && messagesPath) {\n const jsonTemplate = join(templatePath, \"page.json\");\n if (!existsSync(jsonTemplate)) {\n console.warn(\"â ī¸ Missing template page.json.\");\n } else {\n const content = await readFile(jsonTemplate, \"utf-8\");\n const replaced = content\n .replace(/template/g, childName || pageName)\n .replace(/Template/g, capitalize(childName || pageName));\n for (const locale of locales) {\n // Only process if messages/<locale> is a directory\n const localeDir = join(messagesPath, locale);\n if (!existsSync(localeDir) || !statSync(localeDir).isDirectory())\n continue;\n const jsonTarget = join(messagesPath, locale, `${jsonFileName}.json`);\n let current: Record<string, any> = {};\n if (existsSync(jsonTarget)) {\n const jsonFile = await readFile(jsonTarget, \"utf-8\");\n try {\n current = JSON.parse(jsonFile) as Record<string, any>;\n } catch {\n current = {};\n }\n }\n if (parentName && childName) {\n current[childName] = JSON.parse(replaced);\n } else {\n // fichier simple\n current = JSON.parse(replaced);\n }\n await writeFile(jsonTarget, JSON.stringify(current, null, 2));\n }\n }\n } else {\n console.log(\"âšī¸ Skipping translation templates; next-intl not enabled.\");\n }\n\n console.log(\n `â
Page \"${pageName}\" with templates added${\n useI18n ? \" for each locale\" : \"\"\n }.`,\n );\n}\n","import { join } from \"node:path\";\nimport { writeFile, readdir } from \"node:fs/promises\";\nimport prompts from \"prompts\";\nimport { existsSync } from \"node:fs\";\n\nexport async function rmPage(args: string[]) {\n let pageName = args[1];\n if (!pageName || pageName.startsWith(\"-\")) {\n const response = await prompts.prompt({\n type: \"text\",\n name: \"pageName\",\n message: \"đī¸ Page name to remove:\",\n validate: (name: string) => (name ? true : \"Page name is required\"),\n });\n pageName = response.pageName;\n }\n\n // Remove translation files messages/<lang>/<PageName>.json\n const messagesPath = join(process.cwd(), \"messages\");\n const entries = await readdir(messagesPath, { withFileTypes: true });\n const langDirs = entries.filter((e) => e.isDirectory()).map((e) => e.name);\n for (const locale of langDirs) {\n const jsonTarget = join(messagesPath, locale, `${pageName}.json`);\n if (existsSync(jsonTarget)) {\n await writeFile(jsonTarget, \"\");\n await import(\"node:child_process\").then((cp) =>\n cp.execSync(`rm -f '${jsonTarget}'`)\n );\n console.log(`đī¸ Deleted: ${jsonTarget}`);\n }\n }\n\n // Remove folder src/ui/<PageName>\n const uiPageDir = join(process.cwd(), \"src\", \"ui\", pageName);\n if (existsSync(uiPageDir)) {\n await import(\"node:child_process\").then((cp) =>\n cp.execSync(`rm -rf '${uiPageDir}'`)\n );\n console.log(`đī¸ Deleted: ${uiPageDir}`);\n }\n\n // Remove folder src/app/[locale]/<PageName>\n const appLocaleDir = join(process.cwd(), \"src\", \"app\", \"[locale]\", pageName);\n if (existsSync(appLocaleDir)) {\n await import(\"node:child_process\").then((cp) =>\n cp.execSync(`rm -rf '${appLocaleDir}'`)\n );\n console.log(`đī¸ Deleted: ${appLocaleDir}`);\n }\n\n console.log(`â
Page \"${pageName}\" deleted.`);\n}\n","import { join } from \"node:path\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport prompts from \"prompts\";\nimport { existsSync } from \"node:fs\";\n\nimport { loadConfig, capitalize } from \"./utils\";\n\nexport async function addLib(args: string[]) {\n let libArg = args[1];\n if (!libArg || libArg.startsWith(\"-\")) {\n const response = await prompts.prompt({\n type: \"text\",\n name: \"libArg\",\n message: \"đĻ Lib name to add:\",\n validate: (name: string) => (name ? true : \"Lib name is required\"),\n });\n libArg = response.libArg;\n }\n\n let libName = libArg;\n let fileName: string | null = null;\n if (libArg.includes(\".\")) {\n [libName, fileName] = libArg.split(\".\");\n }\n\n const config = await loadConfig();\n if (!config) {\n console.error(\n \"â Configuration file cnp.config.json not found. Run this command from the project root.\",\n );\n return;\n }\n\n const libDir = join(process.cwd(), \"src\", \"lib\", libName);\n if (!existsSync(libDir)) {\n await mkdir(libDir, { recursive: true });\n }\n\n const templateDir = join(import.meta.dir, \"..\", \"..\", \"templates\", \"Lib\");\n const indexTemplate = join(templateDir, \"index.ts\");\n const fileTemplate = join(templateDir, \"item.ts\");\n\n const indexPath = join(libDir, \"index.ts\");\n if (!existsSync(indexPath)) {\n if (existsSync(indexTemplate)) {\n const content = await readFile(indexTemplate, \"utf-8\");\n await writeFile(indexPath, content);\n } else {\n await writeFile(indexPath, \"export {}\\n\");\n }\n console.log(`đ File created: ${indexPath}`);\n }\n\n if (fileName) {\n const filePath = join(libDir, `${fileName}.ts`);\n if (!existsSync(filePath)) {\n if (existsSync(fileTemplate)) {\n let content = await readFile(fileTemplate, \"utf-8\");\n content = content\n .replace(/template/g, fileName)\n .replace(/Template/g, capitalize(fileName));\n await writeFile(filePath, content);\n } else {\n await writeFile(\n filePath,\n `export function ${fileName}() {\\n // TODO: implement\\n}\\n`,\n );\n }\n console.log(`đ File created: ${filePath}`);\n }\n\n let indexContent = await readFile(indexPath, \"utf-8\");\n const importLine = `import { ${fileName} } from \"./${fileName}\";`;\n const importRegex = new RegExp(\n `import\\\\s*{\\\\s*${fileName}\\\\s*}\\\\s*from\\\\s*\"\\\\./${fileName}\";`,\n );\n const exportRegex = /export\\s*{([^}]*)}/m;\n\n const imports: string[] = [];\n const exportsSet: string[] = [];\n for (const line of indexContent.split(\"\\n\")) {\n if (line.startsWith(\"import\")) {\n imports.push(line);\n } else if (line.startsWith(\"export\")) {\n const match = line.match(exportRegex);\n if (match && match[1]) {\n exportsSet.push(\n ...match[1]\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean),\n );\n }\n }\n }\n\n if (!imports.some((l) => importRegex.test(l))) {\n imports.push(importLine);\n }\n if (!exportsSet.includes(fileName)) {\n exportsSet.push(fileName);\n }\n\n indexContent =\n imports.join(\"\\n\") +\n \"\\n\\nexport { \" +\n exportsSet.join(\", \") +\n \" };\\n\";\n await writeFile(indexPath, indexContent);\n console.log(`âī¸ Updated index: ${indexPath}`);\n }\n\n console.log(\n `â
Lib \"${libName}\"${fileName ? ` with module ${fileName}` : \"\"} added.`,\n );\n}\n","import { join } from \"node:path\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport prompts from \"prompts\";\nimport { existsSync } from \"node:fs\";\n\nimport { loadConfig } from \"./utils\";\n\nexport async function addApi(args: string[]) {\n let apiName = args[1];\n if (!apiName || apiName.startsWith(\"-\")) {\n const response = await prompts.prompt({\n type: \"text\",\n name: \"apiName\",\n message: \"đ API route name to add:\",\n validate: (name: string) => (name ? true : \"API route name is required\"),\n });\n apiName = response.apiName;\n }\n\n const config = await loadConfig();\n if (!config) {\n console.error(\n \"â Configuration file cnp.config.json not found. Run this command from the project root.\",\n );\n return;\n }\n\n const apiDir = join(process.cwd(), \"src\", \"app\", \"api\", apiName);\n if (!existsSync(apiDir)) {\n await mkdir(apiDir, { recursive: true });\n }\n\n const templateDir = join(import.meta.dir, \"..\", \"..\", \"templates\", \"Api\");\n const routeTemplate = join(templateDir, \"route.ts\");\n const routePath = join(apiDir, \"route.ts\");\n\n if (!existsSync(routePath)) {\n if (existsSync(routeTemplate)) {\n let content = await readFile(routeTemplate, \"utf-8\");\n content = content.replace(/template/g, apiName);\n await writeFile(routePath, content);\n } else {\n await writeFile(\n routePath,\n `import { NextResponse } from \\\"next/server\\\";\\n\\nexport async function GET() {\\n return NextResponse.json({ message: \\\"Hello from ${apiName}\\\" });\\n}\\n`,\n );\n }\n console.log(`đ File created: ${routePath}`);\n } else {\n console.log(`âšī¸ File already exists: ${routePath}`);\n }\n\n console.log(`â
API route \"${apiName}\" added.`);\n}\n","// src/scaffold.ts\n\nimport { cp, mkdir, rm, writeFile, readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { existsSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\n\nconst RED = \"\\x1b[31m\";\nconst GREEN = \"\\x1b[32m\";\nconst YELLOW = \"\\x1b[33m\";\nconst BLUE = \"\\x1b[34m\";\nconst CYAN = \"\\x1b[36m\";\nconst RESET = \"\\x1b[0m\";\n\n/**\n * Options for scaffolding a Next.js project.\n */\ninterface ScaffoldOptions {\n projectName: string;\n useTypescript: boolean;\n useEslint: boolean;\n useTailwind: boolean;\n useSrcDir: boolean;\n useTurbopack: boolean;\n useI18n: boolean;\n customAlias: boolean;\n importAlias: string;\n force?: boolean;\n}\n\n/**\n * Scaffold a new Next.js project based on provided options.\n *\n * - Copies the default template to the target directory\n * - Removes the target directory if it exists and --force is set\n * - Optionally customizes the structure in future (e.g. remove unused files)\n *\n * @param options ScaffoldOptions for the project\n */\nexport async function scaffoldProject(options: ScaffoldOptions) {\n const targetPath = join(process.cwd(), options.projectName);\n\n const __dirname = new URL(\".\", import.meta.url); // or :\n // const __dirname = path.dirname(fileURLToPath(import.meta.url));\n const templatePath = join(\n fileURLToPath(__dirname),\n \"..\",\n \"templates\",\n \"Projects\",\n \"default\",\n );\n\n // Check if target directory exists\n if (existsSync(targetPath)) {\n if (options.force) {\n console.warn(\"â ī¸ Target directory already exists, removing...\");\n await rm(targetPath, { recursive: true, force: true });\n } else {\n console.error(\n `${RED}[X] Target directory already exists. Use --force to overwrite.${RESET}`,\n );\n process.exit(1);\n }\n }\n\n try {\n console.log(\"Creating project directory...\");\n await mkdir(targetPath, { recursive: true });\n\n console.log(\"Copying files from template...\");\n await cp(templatePath, targetPath, { recursive: true });\n\n // Apply configuration: add dependencies or files based on prompt choices\n const pkgPath = join(targetPath, \"package.json\");\n if (existsSync(pkgPath)) {\n const pkg = JSON.parse(await readFile(pkgPath, \"utf-8\"));\n pkg.dependencies = pkg.dependencies || {};\n if (options.useI18n) {\n pkg.dependencies[\"next-intl\"] =\n pkg.dependencies[\"next-intl\"] || \"^4.3.5\";\n }\n await writeFile(pkgPath, JSON.stringify(pkg, null, 2));\n }\n\n // Write CLI configuration to project root\n await writeFile(\n join(targetPath, \"cnp.config.json\"),\n JSON.stringify(options, null, 2),\n );\n\n console.log(\"Project setup complete!\");\n console.log(\"\");\n console.log(\"To get started:\");\n console.log(` ${GREEN}cd ${options.projectName}${RESET}`);\n console.log(\"\");\n console.log(\n \"Then install dependencies and launch the dev server with your preferred tool:\",\n );\n\n console.log(` ${GREEN}bun install && bun dev${RESET}`);\n console.log(` ${GREEN}npm install && npm run dev${RESET}`);\n console.log(` ${GREEN}pnpm install && pnpm run dev${RESET}`);\n console.log(\"\");\n console.log(\"Documentation and examples can be found at:\");\n console.log(\n ` ${CYAN}https://github.com/Rising-Corporation/create-next-pro-cli${RESET}`,\n );\n console.log(\n \"_-`'-_-'`_`'-_-'`_`'-_-'`_`'-_-'`_`'-_-'`_`'-_-'`_`'-_-'`_`'-_-'`-_\",\n );\n } catch (err) {\n // Affiche une croix ASCII et le texte en rouge si le terminal le supporte\n\n console.error(` ${RED}[X] Error during project creation:${RESET}`, err);\n process.exit(1);\n }\n}\n","import { scaffoldProject } from \"../scaffold\";\nexport async function createProject(nameArg: string, force: boolean) {\n const response = {\n projectName: nameArg,\n useTypescript: true,\n useEslint: true,\n useTailwind: true,\n useSrcDir: true,\n useTurbopack: true,\n useI18n: true,\n customAlias: true,\n importAlias: \"@/*\",\n force,\n };\n\n console.log(`Creating project \"${response.projectName}\"...`);\n await scaffoldProject(response);\n}\n","import { scaffoldProject } from \"../scaffold\";\nimport prompts from \"prompts\";\nexport async function createProjectWithPrompt() {\n const response = await prompts.prompt([\n {\n type: \"text\",\n name: \"projectName\",\n message: \"Project name:\",\n initial: \"my-next-app\",\n },\n {\n type: \"toggle\",\n name: \"useTypescript\",\n message: \"â Use TypeScript?\",\n initial: true,\n active: \"Yes\",\n inactive: \"No\",\n },\n {\n type: \"toggle\",\n name: \"useEslint\",\n message: \"â Use ESLint?\",\n initial: true,\n active: \"Yes\",\n inactive: \"No\",\n },\n {\n type: \"toggle\",\n name: \"useTailwind\",\n message: \"â Use Tailwind CSS?\",\n initial: true,\n active: \"Yes\",\n inactive: \"No\",\n },\n {\n type: \"toggle\",\n name: \"useSrcDir\",\n message: \"â Use `src/` directory?\",\n initial: true,\n active: \"Yes\",\n inactive: \"No\",\n },\n {\n type: \"toggle\",\n name: \"useTurbopack\",\n message: \"â Use Turbopack for `next dev`?\",\n initial: true,\n active: \"Yes\",\n inactive: \"No\",\n },\n {\n type: \"toggle\",\n name: \"useI18n\",\n message: \"â Use i18n with next-intl for translations?\",\n initial: true,\n active: \"Yes\",\n inactive: \"No\",\n },\n {\n type: \"toggle\",\n name: \"customAlias\",\n message: \"â Customize import alias (`@/*` by default)?\",\n initial: true,\n active: \"Yes\",\n inactive: \"No\",\n },\n {\n type: (prev: boolean) => (prev ? \"text\" : null),\n name: \"importAlias\",\n message: \"â What import alias would you like?\",\n initial: \"@core/*\",\n },\n ]);\n\n console.log(\"\\nYour choices:\");\n console.log(response);\n\n await scaffoldProject(response);\n}\n","#!/usr/bin/env node\nimport { main } from \"./src/index\";\nmain();\n"],"mappings":"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","names":["prompts","fileURLToPath","join","readFile","existsSync","join","readFile","join","mkdir","readFile","writeFile","readdir","prompts","existsSync","statSync","prompts","join","readdir","mkdir","readFile","writeFile","join","writeFile","readdir","prompts","existsSync","cp","join","mkdir","readFile","writeFile","prompts","existsSync","prompts","join","existsSync","mkdir","readFile","writeFile","join","mkdir","readFile","writeFile","prompts","existsSync","prompts","join","existsSync","mkdir","readFile","writeFile","mkdir","writeFile","readFile","join","existsSync","join","__dirname","existsSync","mkdir","readFile","writeFile","prompts","__dirname","fileURLToPath","prompts"]}
|
package/package.json
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|