@yousxlfs/next-arch 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -30,13 +30,17 @@ function assertValidSliceName(name) {
30
30
  import path from "path";
31
31
  import { fileURLToPath } from "url";
32
32
  import fs from "fs-extra";
33
+ var PACKAGE_NAMES = /* @__PURE__ */ new Set(["next-arch", "@yousxlfs/next-arch"]);
34
+ function isNextArchPackage(pkg) {
35
+ return typeof pkg.name === "string" && PACKAGE_NAMES.has(pkg.name);
36
+ }
33
37
  function findPackageRoot(startDir) {
34
38
  let current = startDir;
35
39
  while (current !== path.dirname(current)) {
36
40
  const packageJsonPath = path.join(current, "package.json");
37
41
  if (fs.existsSync(packageJsonPath)) {
38
42
  const pkg = JSON.parse(fs.readFileSync(packageJsonPath, "utf8"));
39
- if (pkg.name === "next-arch") {
43
+ if (isNextArchPackage(pkg)) {
40
44
  return current;
41
45
  }
42
46
  }
@@ -229,7 +233,7 @@ async function initCommand(projectName, options = {}) {
229
233
 
230
234
  // src/index.ts
231
235
  console.log(chalk.blue("Next Architecture CLI"));
232
- program.name("next-arch").description("CLI for Next.js Feature-Sliced Architecture").version("0.1.0");
236
+ program.name("next-arch").description("CLI for Next.js Feature-Sliced Architecture").version("0.1.1");
233
237
  program.command("init <projectName>").description("Create a new project with Next Architecture").option("-C, --cwd <path>", "directory where the project folder will be created").action(async (projectName, options) => {
234
238
  try {
235
239
  await initCommand(projectName, { cwd: options.cwd });
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/commands/generate.ts","../src/lib/naming.ts","../src/lib/paths.ts","../src/commands/init.ts","../src/lib/copy.ts"],"sourcesContent":["import { program } from 'commander';\nimport { cancel, log, outro } from '@clack/prompts';\nimport chalk from 'chalk';\nimport path from 'path';\nimport { generateCommand } from './commands/generate.js';\nimport { initCommand } from './commands/init.js';\n\nconsole.log(chalk.blue('Next Architecture CLI'));\n\nprogram\n .name('next-arch')\n .description('CLI for Next.js Feature-Sliced Architecture')\n .version('0.1.0');\n\nprogram\n .command('init <projectName>')\n .description('Create a new project with Next Architecture')\n .option('-C, --cwd <path>', 'directory where the project folder will be created')\n .action(async (projectName: string, options: { cwd?: string }) => {\n try {\n await initCommand(projectName, { cwd: options.cwd });\n } catch (error) {\n cancel(error instanceof Error ? error.message : 'Init failed');\n process.exit(1);\n }\n });\n\nprogram\n .command('generate <type> <name>')\n .alias('g')\n .description('Generate feature, widget, entity, or view')\n .option('-C, --cwd <path>', 'path to Next.js project root (default: current directory)')\n .option('-f, --force', 'overwrite existing slice')\n .action(async (type: string, name: string, options: { cwd?: string; force?: boolean }) => {\n try {\n const projectRoot = options.cwd ? path.resolve(options.cwd) : process.cwd();\n await generateCommand(type, name, projectRoot, { force: options.force });\n outro('Done!');\n } catch (error) {\n cancel(error instanceof Error ? error.message : 'Generate failed');\n process.exit(1);\n }\n });\n\nprogram.parseAsync(process.argv).catch((error: unknown) => {\n log.error(error instanceof Error ? error.message : 'Unexpected error');\n process.exit(1);\n});\n","import { log } from '@clack/prompts';\nimport fs from 'fs-extra';\nimport path from 'path';\nimport { assertValidSliceName, toKebabCase, toPascalCase } from '../lib/naming.js';\nimport { resolveTemplatesDir } from '../lib/paths.js';\n\nconst SLICE_TYPES = ['feature', 'view', 'widget', 'entity'] as const;\ntype SliceType = (typeof SLICE_TYPES)[number];\n\nconst TARGET_DIRS: Record<SliceType, string> = {\n feature: 'features',\n view: 'views',\n widget: 'widgets',\n entity: 'entities',\n};\n\nfunction isSliceType(value: string): value is SliceType {\n return SLICE_TYPES.includes(value as SliceType);\n}\n\nfunction assertNextProject(cwd: string): void {\n const packageJson = path.join(cwd, 'package.json');\n const srcDir = path.join(cwd, 'src');\n\n if (!fs.existsSync(packageJson) || !fs.existsSync(srcDir)) {\n throw new Error('Run this command from the root of a Next Architecture project.');\n }\n}\n\nasync function renderTemplateDir(\n templateDir: string,\n targetDir: string,\n replacements: Record<string, string>,\n): Promise<string[]> {\n const created: string[] = [];\n\n if (!(await fs.pathExists(templateDir))) {\n throw new Error(`Template \"${path.basename(templateDir)}\" not found.`);\n }\n\n const entries = await fs.readdir(templateDir, { withFileTypes: true });\n\n for (const entry of entries) {\n const sourcePath = path.join(templateDir, entry.name);\n const renderedName = Object.entries(replacements).reduce(\n (name, [from, to]) => name.replaceAll(from, to),\n entry.name,\n );\n const targetPath = path.join(targetDir, renderedName);\n\n if (entry.isDirectory()) {\n await fs.ensureDir(targetPath);\n created.push(...(await renderTemplateDir(sourcePath, targetPath, replacements)));\n continue;\n }\n\n await fs.ensureDir(path.dirname(targetPath));\n let content = await fs.readFile(sourcePath, 'utf8');\n for (const [from, to] of Object.entries(replacements)) {\n content = content.replaceAll(from, to);\n }\n await fs.writeFile(targetPath, content);\n created.push(path.relative(process.cwd(), targetPath));\n }\n\n return created;\n}\n\nexport async function generateCommand(\n type: string,\n name: string,\n projectRoot = process.cwd(),\n options: { force?: boolean } = {},\n): Promise<void> {\n const root = path.resolve(projectRoot);\n assertNextProject(root);\n assertValidSliceName(name);\n\n if (!isSliceType(type)) {\n throw new Error(`Unknown type \"${type}\". Use: ${SLICE_TYPES.join(', ')}`);\n }\n\n const pascalName = toPascalCase(name);\n const kebabName = toKebabCase(name);\n const templatesDir = resolveTemplatesDir();\n const templateDir = path.join(templatesDir, type);\n const targetDir = path.join(root, 'src', TARGET_DIRS[type], kebabName);\n\n const previousCwd = process.cwd();\n process.chdir(root);\n\n try {\n if (await fs.pathExists(targetDir)) {\n if (!options.force) {\n throw new Error(\n `\"${type}\" \"${kebabName}\" already exists at ${targetDir}. Use --force to overwrite.`,\n );\n }\n await fs.remove(targetDir);\n }\n\n const replacements = {\n '{{Name}}': pascalName,\n '{{name}}': kebabName,\n };\n\n const created = await renderTemplateDir(templateDir, targetDir, replacements);\n\n log.success(`Created ${type} \"${kebabName}\" in ${root}`);\n for (const file of created) {\n log.info(` ${file}`);\n }\n\n if (type === 'view') {\n log.info(`Add to a route: import { ${pascalName} } from '@/views/${kebabName}';`);\n }\n } finally {\n process.chdir(previousCwd);\n }\n}\n","export function toPascalCase(value: string): string {\n return value\n .replace(/[-_/]+/g, ' ')\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n .split(' ')\n .filter(Boolean)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1).toLowerCase())\n .join('');\n}\n\nexport function toKebabCase(value: string): string {\n return value\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .replace(/[\\s_]+/g, '-')\n .toLowerCase();\n}\n\nexport function assertValidSliceName(name: string): void {\n if (!/^[a-zA-Z][a-zA-Z0-9_-]*$/.test(name)) {\n throw new Error(\n 'Name must start with a letter and contain only letters, numbers, hyphens, or underscores.',\n );\n }\n}\n","import path from 'path';\nimport { fileURLToPath } from 'url';\nimport fs from 'fs-extra';\n\nfunction findPackageRoot(startDir: string): string {\n let current = startDir;\n\n while (current !== path.dirname(current)) {\n const packageJsonPath = path.join(current, 'package.json');\n if (fs.existsSync(packageJsonPath)) {\n const pkg = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8')) as { name?: string };\n if (pkg.name === 'next-arch') {\n return current;\n }\n }\n current = path.dirname(current);\n }\n\n throw new Error('next-arch package root not found.');\n}\n\nexport function getPackageRoot(): string {\n return findPackageRoot(path.dirname(fileURLToPath(import.meta.url)));\n}\n\nexport function resolveTemplatesDir(): string {\n const templatesDir = path.join(getPackageRoot(), 'templates');\n if (!fs.existsSync(templatesDir)) {\n throw new Error('Templates directory not found. Reinstall next-arch.');\n }\n return templatesDir;\n}\n\nexport function resolveAppTemplateDir(): string {\n const appTemplate = path.join(resolveTemplatesDir(), 'app');\n if (!fs.existsSync(path.join(appTemplate, 'package.json'))) {\n throw new Error('App template not found. Reinstall next-arch.');\n }\n return appTemplate;\n}\n","import { confirm, intro, log, outro } from '@clack/prompts';\nimport fs from 'fs-extra';\nimport path from 'path';\nimport { copyProjectTemplate } from '../lib/copy.js';\nimport { getPackageRoot, resolveAppTemplateDir } from '../lib/paths.js';\n\nasync function resolveEslintPluginSource(): Promise<string> {\n const packageRoot = getPackageRoot();\n const candidates = [\n path.join(packageRoot, 'vendor', 'eslint-plugin-next-arch'),\n path.resolve(packageRoot, '..', '..', 'packages', 'eslint-plugin-next-arch'),\n ];\n\n for (const candidate of candidates) {\n if (await fs.pathExists(path.join(candidate, 'dist', 'index.js'))) {\n return candidate;\n }\n }\n\n throw new Error(\n 'eslint-plugin-next-arch is not available. Reinstall next-arch or run \"pnpm build\" in the monorepo.',\n );\n}\n\nasync function bundleEslintPlugin(targetDir: string): Promise<void> {\n const pluginSource = await resolveEslintPluginSource();\n const pluginTarget = path.join(targetDir, 'vendor', 'eslint-plugin-next-arch');\n\n await fs.ensureDir(pluginTarget);\n await fs.copy(path.join(pluginSource, 'dist'), path.join(pluginTarget, 'dist'));\n await fs.copy(path.join(pluginSource, 'package.json'), path.join(pluginTarget, 'package.json'));\n}\n\nasync function patchPackageJson(targetDir: string, projectName: string): Promise<void> {\n const packageJsonPath = path.join(targetDir, 'package.json');\n const pkg = JSON.parse(await fs.readFile(packageJsonPath, 'utf8')) as {\n name: string;\n scripts?: Record<string, string>;\n devDependencies?: Record<string, string>;\n };\n\n pkg.name = projectName;\n delete pkg.scripts?.arch;\n if (pkg.devDependencies) {\n pkg.devDependencies['eslint-plugin-next-arch'] = 'file:./vendor/eslint-plugin-next-arch';\n }\n\n await fs.writeFile(packageJsonPath, `${JSON.stringify(pkg, null, 2)}\\n`);\n}\n\nexport async function initCommand(\n projectName: string,\n options: { cwd?: string } = {},\n): Promise<void> {\n const baseDir = path.resolve(options.cwd ?? process.cwd());\n intro('Creating new Next Architecture project...');\n\n const targetDir = path.join(baseDir, projectName);\n const templateDir = resolveAppTemplateDir();\n\n if (await fs.pathExists(targetDir)) {\n const shouldContinue = await confirm({\n message: 'Directory already exists. Continue and merge files?',\n });\n\n if (!shouldContinue) {\n outro('Cancelled');\n return;\n }\n }\n\n log.info(`Copying template from ${path.basename(templateDir)}...`);\n await copyProjectTemplate(templateDir, targetDir);\n await bundleEslintPlugin(targetDir);\n await patchPackageJson(targetDir, projectName);\n await fs.writeFile(path.join(targetDir, '.npmrc'), 'ignore-workspace=true\\n');\n\n log.success(`Project \"${projectName}\" created`);\n log.info(` cd ${projectName}`);\n log.info(' pnpm install');\n log.info(' pnpm dev');\n outro('Done!');\n}\n","import fs from 'fs-extra';\nimport path from 'path';\n\nconst EXCLUDED_DIRS = new Set(['node_modules', '.next', '.turbo', 'dist']);\n\nexport async function copyProjectTemplate(\n sourceDir: string,\n targetDir: string,\n): Promise<void> {\n await fs.copy(sourceDir, targetDir, {\n filter(src) {\n const relative = path.relative(sourceDir, src);\n if (!relative) return true;\n\n return !relative.split(path.sep).some((part) => EXCLUDED_DIRS.has(part));\n },\n });\n}\n\nexport async function replaceInFile(\n filePath: string,\n replacements: Record<string, string>,\n): Promise<void> {\n if (!(await fs.pathExists(filePath))) return;\n\n let content = await fs.readFile(filePath, 'utf8');\n for (const [from, to] of Object.entries(replacements)) {\n content = content.replaceAll(from, to);\n }\n await fs.writeFile(filePath, content);\n}\n"],"mappings":"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","names":["log","outro","path","fs","path","path","fs","log","fs","path","fs","path","path","fs","log","path","outro","log"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/commands/generate.ts","../src/lib/naming.ts","../src/lib/paths.ts","../src/commands/init.ts","../src/lib/copy.ts"],"sourcesContent":["import { program } from 'commander';\nimport { cancel, log, outro } from '@clack/prompts';\nimport chalk from 'chalk';\nimport path from 'path';\nimport { generateCommand } from './commands/generate.js';\nimport { initCommand } from './commands/init.js';\n\nconsole.log(chalk.blue('Next Architecture CLI'));\n\nprogram\n .name('next-arch')\n .description('CLI for Next.js Feature-Sliced Architecture')\n .version('0.1.1');\n\nprogram\n .command('init <projectName>')\n .description('Create a new project with Next Architecture')\n .option('-C, --cwd <path>', 'directory where the project folder will be created')\n .action(async (projectName: string, options: { cwd?: string }) => {\n try {\n await initCommand(projectName, { cwd: options.cwd });\n } catch (error) {\n cancel(error instanceof Error ? error.message : 'Init failed');\n process.exit(1);\n }\n });\n\nprogram\n .command('generate <type> <name>')\n .alias('g')\n .description('Generate feature, widget, entity, or view')\n .option('-C, --cwd <path>', 'path to Next.js project root (default: current directory)')\n .option('-f, --force', 'overwrite existing slice')\n .action(async (type: string, name: string, options: { cwd?: string; force?: boolean }) => {\n try {\n const projectRoot = options.cwd ? path.resolve(options.cwd) : process.cwd();\n await generateCommand(type, name, projectRoot, { force: options.force });\n outro('Done!');\n } catch (error) {\n cancel(error instanceof Error ? error.message : 'Generate failed');\n process.exit(1);\n }\n });\n\nprogram.parseAsync(process.argv).catch((error: unknown) => {\n log.error(error instanceof Error ? error.message : 'Unexpected error');\n process.exit(1);\n});\n","import { log } from '@clack/prompts';\nimport fs from 'fs-extra';\nimport path from 'path';\nimport { assertValidSliceName, toKebabCase, toPascalCase } from '../lib/naming.js';\nimport { resolveTemplatesDir } from '../lib/paths.js';\n\nconst SLICE_TYPES = ['feature', 'view', 'widget', 'entity'] as const;\ntype SliceType = (typeof SLICE_TYPES)[number];\n\nconst TARGET_DIRS: Record<SliceType, string> = {\n feature: 'features',\n view: 'views',\n widget: 'widgets',\n entity: 'entities',\n};\n\nfunction isSliceType(value: string): value is SliceType {\n return SLICE_TYPES.includes(value as SliceType);\n}\n\nfunction assertNextProject(cwd: string): void {\n const packageJson = path.join(cwd, 'package.json');\n const srcDir = path.join(cwd, 'src');\n\n if (!fs.existsSync(packageJson) || !fs.existsSync(srcDir)) {\n throw new Error('Run this command from the root of a Next Architecture project.');\n }\n}\n\nasync function renderTemplateDir(\n templateDir: string,\n targetDir: string,\n replacements: Record<string, string>,\n): Promise<string[]> {\n const created: string[] = [];\n\n if (!(await fs.pathExists(templateDir))) {\n throw new Error(`Template \"${path.basename(templateDir)}\" not found.`);\n }\n\n const entries = await fs.readdir(templateDir, { withFileTypes: true });\n\n for (const entry of entries) {\n const sourcePath = path.join(templateDir, entry.name);\n const renderedName = Object.entries(replacements).reduce(\n (name, [from, to]) => name.replaceAll(from, to),\n entry.name,\n );\n const targetPath = path.join(targetDir, renderedName);\n\n if (entry.isDirectory()) {\n await fs.ensureDir(targetPath);\n created.push(...(await renderTemplateDir(sourcePath, targetPath, replacements)));\n continue;\n }\n\n await fs.ensureDir(path.dirname(targetPath));\n let content = await fs.readFile(sourcePath, 'utf8');\n for (const [from, to] of Object.entries(replacements)) {\n content = content.replaceAll(from, to);\n }\n await fs.writeFile(targetPath, content);\n created.push(path.relative(process.cwd(), targetPath));\n }\n\n return created;\n}\n\nexport async function generateCommand(\n type: string,\n name: string,\n projectRoot = process.cwd(),\n options: { force?: boolean } = {},\n): Promise<void> {\n const root = path.resolve(projectRoot);\n assertNextProject(root);\n assertValidSliceName(name);\n\n if (!isSliceType(type)) {\n throw new Error(`Unknown type \"${type}\". Use: ${SLICE_TYPES.join(', ')}`);\n }\n\n const pascalName = toPascalCase(name);\n const kebabName = toKebabCase(name);\n const templatesDir = resolveTemplatesDir();\n const templateDir = path.join(templatesDir, type);\n const targetDir = path.join(root, 'src', TARGET_DIRS[type], kebabName);\n\n const previousCwd = process.cwd();\n process.chdir(root);\n\n try {\n if (await fs.pathExists(targetDir)) {\n if (!options.force) {\n throw new Error(\n `\"${type}\" \"${kebabName}\" already exists at ${targetDir}. Use --force to overwrite.`,\n );\n }\n await fs.remove(targetDir);\n }\n\n const replacements = {\n '{{Name}}': pascalName,\n '{{name}}': kebabName,\n };\n\n const created = await renderTemplateDir(templateDir, targetDir, replacements);\n\n log.success(`Created ${type} \"${kebabName}\" in ${root}`);\n for (const file of created) {\n log.info(` ${file}`);\n }\n\n if (type === 'view') {\n log.info(`Add to a route: import { ${pascalName} } from '@/views/${kebabName}';`);\n }\n } finally {\n process.chdir(previousCwd);\n }\n}\n","export function toPascalCase(value: string): string {\n return value\n .replace(/[-_/]+/g, ' ')\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n .split(' ')\n .filter(Boolean)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1).toLowerCase())\n .join('');\n}\n\nexport function toKebabCase(value: string): string {\n return value\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .replace(/[\\s_]+/g, '-')\n .toLowerCase();\n}\n\nexport function assertValidSliceName(name: string): void {\n if (!/^[a-zA-Z][a-zA-Z0-9_-]*$/.test(name)) {\n throw new Error(\n 'Name must start with a letter and contain only letters, numbers, hyphens, or underscores.',\n );\n }\n}\n","import path from 'path';\nimport { fileURLToPath } from 'url';\nimport fs from 'fs-extra';\n\nconst PACKAGE_NAMES = new Set(['next-arch', '@yousxlfs/next-arch']);\n\nfunction isNextArchPackage(pkg: { name?: string }): boolean {\n return typeof pkg.name === 'string' && PACKAGE_NAMES.has(pkg.name);\n}\n\nfunction findPackageRoot(startDir: string): string {\n let current = startDir;\n\n while (current !== path.dirname(current)) {\n const packageJsonPath = path.join(current, 'package.json');\n if (fs.existsSync(packageJsonPath)) {\n const pkg = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8')) as { name?: string };\n if (isNextArchPackage(pkg)) {\n return current;\n }\n }\n current = path.dirname(current);\n }\n\n throw new Error('next-arch package root not found.');\n}\n\nexport function getPackageRoot(): string {\n return findPackageRoot(path.dirname(fileURLToPath(import.meta.url)));\n}\n\nexport function resolveTemplatesDir(): string {\n const templatesDir = path.join(getPackageRoot(), 'templates');\n if (!fs.existsSync(templatesDir)) {\n throw new Error('Templates directory not found. Reinstall next-arch.');\n }\n return templatesDir;\n}\n\nexport function resolveAppTemplateDir(): string {\n const appTemplate = path.join(resolveTemplatesDir(), 'app');\n if (!fs.existsSync(path.join(appTemplate, 'package.json'))) {\n throw new Error('App template not found. Reinstall next-arch.');\n }\n return appTemplate;\n}\n","import { confirm, intro, log, outro } from '@clack/prompts';\nimport fs from 'fs-extra';\nimport path from 'path';\nimport { copyProjectTemplate } from '../lib/copy.js';\nimport { getPackageRoot, resolveAppTemplateDir } from '../lib/paths.js';\n\nasync function resolveEslintPluginSource(): Promise<string> {\n const packageRoot = getPackageRoot();\n const candidates = [\n path.join(packageRoot, 'vendor', 'eslint-plugin-next-arch'),\n path.resolve(packageRoot, '..', '..', 'packages', 'eslint-plugin-next-arch'),\n ];\n\n for (const candidate of candidates) {\n if (await fs.pathExists(path.join(candidate, 'dist', 'index.js'))) {\n return candidate;\n }\n }\n\n throw new Error(\n 'eslint-plugin-next-arch is not available. Reinstall next-arch or run \"pnpm build\" in the monorepo.',\n );\n}\n\nasync function bundleEslintPlugin(targetDir: string): Promise<void> {\n const pluginSource = await resolveEslintPluginSource();\n const pluginTarget = path.join(targetDir, 'vendor', 'eslint-plugin-next-arch');\n\n await fs.ensureDir(pluginTarget);\n await fs.copy(path.join(pluginSource, 'dist'), path.join(pluginTarget, 'dist'));\n await fs.copy(path.join(pluginSource, 'package.json'), path.join(pluginTarget, 'package.json'));\n}\n\nasync function patchPackageJson(targetDir: string, projectName: string): Promise<void> {\n const packageJsonPath = path.join(targetDir, 'package.json');\n const pkg = JSON.parse(await fs.readFile(packageJsonPath, 'utf8')) as {\n name: string;\n scripts?: Record<string, string>;\n devDependencies?: Record<string, string>;\n };\n\n pkg.name = projectName;\n delete pkg.scripts?.arch;\n if (pkg.devDependencies) {\n pkg.devDependencies['eslint-plugin-next-arch'] = 'file:./vendor/eslint-plugin-next-arch';\n }\n\n await fs.writeFile(packageJsonPath, `${JSON.stringify(pkg, null, 2)}\\n`);\n}\n\nexport async function initCommand(\n projectName: string,\n options: { cwd?: string } = {},\n): Promise<void> {\n const baseDir = path.resolve(options.cwd ?? process.cwd());\n intro('Creating new Next Architecture project...');\n\n const targetDir = path.join(baseDir, projectName);\n const templateDir = resolveAppTemplateDir();\n\n if (await fs.pathExists(targetDir)) {\n const shouldContinue = await confirm({\n message: 'Directory already exists. Continue and merge files?',\n });\n\n if (!shouldContinue) {\n outro('Cancelled');\n return;\n }\n }\n\n log.info(`Copying template from ${path.basename(templateDir)}...`);\n await copyProjectTemplate(templateDir, targetDir);\n await bundleEslintPlugin(targetDir);\n await patchPackageJson(targetDir, projectName);\n await fs.writeFile(path.join(targetDir, '.npmrc'), 'ignore-workspace=true\\n');\n\n log.success(`Project \"${projectName}\" created`);\n log.info(` cd ${projectName}`);\n log.info(' pnpm install');\n log.info(' pnpm dev');\n outro('Done!');\n}\n","import fs from 'fs-extra';\nimport path from 'path';\n\nconst EXCLUDED_DIRS = new Set(['node_modules', '.next', '.turbo', 'dist']);\n\nexport async function copyProjectTemplate(\n sourceDir: string,\n targetDir: string,\n): Promise<void> {\n await fs.copy(sourceDir, targetDir, {\n filter(src) {\n const relative = path.relative(sourceDir, src);\n if (!relative) return true;\n\n return !relative.split(path.sep).some((part) => EXCLUDED_DIRS.has(part));\n },\n });\n}\n\nexport async function replaceInFile(\n filePath: string,\n replacements: Record<string, string>,\n): Promise<void> {\n if (!(await fs.pathExists(filePath))) return;\n\n let content = await fs.readFile(filePath, 'utf8');\n for (const [from, to] of Object.entries(replacements)) {\n content = content.replaceAll(from, to);\n }\n await fs.writeFile(filePath, content);\n}\n"],"mappings":"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","names":["log","outro","path","fs","path","path","fs","log","fs","path","fs","path","path","fs","log","path","outro","log"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yousxlfs/next-arch",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "CLI for scaffolding Next.js 16 projects with Feature-Sliced Design",
5
5
  "author": "yousxlfs",
6
6
  "license": "MIT",