betterstart-cli 0.0.89 → 0.0.90

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.
@@ -198,6 +198,41 @@ function applyAdminNamespaceToPath(filePath, namespaceValue) {
198
198
  const namespacedPath = replaceAdminDashToken(protectedNamespace.value, namespace);
199
199
  return protectedNamespace.restore(namespacedPath);
200
200
  }
201
+ var MODULE_SPECIFIER_PATTERN = /(\bfrom\s*|\bimport\s*|\brequire\s*\(\s*|\bimport\s*\(\s*)(['"])([^'"\n]+)\2/g;
202
+ var EXTERNAL_PACKAGE_PATTERN = /^(?:@[a-z0-9-~][a-z0-9-._~]*\/)?[a-z0-9-~][a-z0-9-._~]*(?:\/[^'"]*)?$/;
203
+ function isExternalModuleSpecifier(specifier) {
204
+ if (specifier.startsWith(".") || specifier.startsWith("/")) {
205
+ return false;
206
+ }
207
+ if (new RegExp(`^@${DEFAULT_ADMIN_NAMESPACE}(?:/|$)`).test(specifier)) {
208
+ return false;
209
+ }
210
+ return EXTERNAL_PACKAGE_PATTERN.test(specifier);
211
+ }
212
+ function protectExternalModuleSpecifiers(content) {
213
+ const replacements = [];
214
+ const protectedContent = content.replace(
215
+ MODULE_SPECIFIER_PATTERN,
216
+ (match, prefix, quote, specifier) => {
217
+ if (!isExternalModuleSpecifier(specifier)) {
218
+ return match;
219
+ }
220
+ const token = `__BETTERSTART_EXTERNAL_MODULE_${replacements.length}__`;
221
+ replacements.push([token, specifier]);
222
+ return `${prefix}${quote}${token}${quote}`;
223
+ }
224
+ );
225
+ return {
226
+ content: protectedContent,
227
+ restore(value) {
228
+ let restored = value;
229
+ for (const [token, specifier] of replacements) {
230
+ restored = restored.replaceAll(token, specifier);
231
+ }
232
+ return restored;
233
+ }
234
+ };
235
+ }
201
236
  function protectAdminRoleLiterals(content) {
202
237
  const protectedValues = [
203
238
  "UserRole.ADMIN",
@@ -230,7 +265,8 @@ function protectAdminRoleLiterals(content) {
230
265
  }
231
266
  function applyAdminNamespaceToContent(content, namespaceValue) {
232
267
  const namespace = resolveAdminNamespace(namespaceValue);
233
- const { content: protectedContent, restore } = protectAdminRoleLiterals(content);
268
+ const { content: externalSafeContent, restore: restoreExternalModules } = protectExternalModuleSpecifiers(content);
269
+ const { content: protectedContent, restore } = protectAdminRoleLiterals(externalSafeContent);
234
270
  const canonicalContent = protectedContent.replaceAll("MediaListParams", `${namespace.pascal}MediaQuery`).replaceAll("MediaListResult", `${namespace.pascal}MediaPage`).replaceAll(
235
271
  `${namespace.pascal}MediaQuery, ${namespace.pascal}MediaPage`,
236
272
  `${namespace.pascal}MediaPage, ${namespace.pascal}MediaQuery`
@@ -252,7 +288,7 @@ function applyAdminNamespaceToContent(content, namespaceValue) {
252
288
  ),
253
289
  namespace
254
290
  );
255
- return restore(protectedNamespace.restore(namespacedContent));
291
+ return restoreExternalModules(restore(protectedNamespace.restore(namespacedContent)));
256
292
  }
257
293
 
258
294
  // adapters/next/template-reader.ts
@@ -303,4 +339,4 @@ export {
303
339
  readNamespacedTemplate,
304
340
  namespacedTemplatePath
305
341
  };
306
- //# sourceMappingURL=chunk-M4S53A4X.js.map
342
+ //# sourceMappingURL=chunk-3CLINNJL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../adapters/next/template-reader.ts","../core-engine/utils/cli-root.ts","../core-engine/utils/string.ts","../adapters/next/config/namespace.ts"],"sourcesContent":["import fs from 'node:fs'\nimport path from 'node:path'\nimport { resolveCliAssetPath } from '@core-engine/utils/cli-root.js'\nimport {\n applyAdminNamespaceToContent,\n applyAdminNamespaceToPath\n} from '@next-adapter/config/namespace.js'\n\n/**\n * Read a Next init template file by its relative path.\n * Used by scaffolders and update-component to get template content.\n */\nexport function readTemplate(relativePath: string): string {\n return fs.readFileSync(\n path.join(resolveCliAssetPath('adapters', 'next', 'templates', 'init'), relativePath),\n 'utf-8'\n )\n}\n\nexport function applyNextCacheApiForVersion(content: string, nextMajorVersion: number): string {\n if (nextMajorVersion >= 16) {\n return content\n }\n\n return content\n .replace(\n /import \\{ cacheLife, cacheTag \\} from 'next\\/cache'\\n/g,\n \"import { unstable_cacheTag as cacheTag } from 'next/cache'\\n\"\n )\n .replace(/\\n {2}cacheLife\\('max'\\)/g, '')\n .replace(\n /import \\{ updateTag \\} from 'next\\/cache'\\n/g,\n \"import { revalidateTag } from 'next/cache'\\n\"\n )\n .replace(/revalidateTag\\(([^,\\n]+), \\{ expire: 0 \\}\\)/g, 'revalidateTag($1)')\n .replace(/\\bupdateTag\\(/g, 'revalidateTag(')\n}\n\nexport function readNamespacedTemplate(relativePath: string, namespace: string): string {\n return applyAdminNamespaceToContent(readTemplate(relativePath), namespace)\n}\n\nexport function namespacedTemplatePath(relativePath: string, namespace: string): string {\n return applyAdminNamespaceToPath(relativePath, namespace)\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\n\n/**\n * Find the CLI package root by looking for package.json with our name.\n * Works both from source (src/) and built (dist/) locations.\n */\nexport function findCliRoot(): string {\n let dir = new URL('.', import.meta.url).pathname\n for (let i = 0; i < 5; i++) {\n const pkgPath = path.join(dir, 'package.json')\n if (fs.existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'))\n if (pkg.name === 'betterstart-cli') {\n return dir\n }\n } catch {\n // continue\n }\n }\n dir = path.dirname(dir)\n }\n // Fallback: assume 2 levels up from dist/\n return path.resolve(new URL('.', import.meta.url).pathname, '..', '..')\n}\n\nexport function resolveCliAssetPath(...segments: string[]): string {\n const root = findCliRoot()\n const builtPath = path.join(root, 'dist', 'assets', ...segments)\n if (fs.existsSync(builtPath)) {\n return builtPath\n }\n\n return path.join(root, ...segments)\n}\n","/**\n * Shared string helpers used across all generators.\n */\n\nexport function toPascalCase(str: string): string {\n return str\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .split(/[-_\\s]+/)\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase())\n .join('')\n}\n\nexport function toCamelCase(str: string): string {\n const p = toPascalCase(str)\n return p.charAt(0).toLowerCase() + p.slice(1)\n}\n\nexport function singularize(str: string): string {\n if (str.endsWith('ies')) return `${str.slice(0, -3)}y`\n if (str.endsWith('ves')) return `${str.slice(0, -3)}f`\n if (\n str.endsWith('sses') ||\n str.endsWith('xes') ||\n str.endsWith('ches') ||\n str.endsWith('shes') ||\n str.endsWith('zes')\n )\n return str.slice(0, -2)\n if (str.endsWith('s') && !str.endsWith('ss')) return str.slice(0, -1)\n return str\n}\n\nexport function pluralize(str: string): string {\n if (str.endsWith('s') && !str.endsWith('ss')) return str\n if (str.endsWith('y') && !['ay', 'ey', 'iy', 'oy', 'uy'].some((v) => str.endsWith(v)))\n return `${str.slice(0, -1)}ies`\n if (str.endsWith('s') || str.endsWith('x') || str.endsWith('ch') || str.endsWith('sh'))\n return `${str}es`\n return `${str}s`\n}\n\nexport function toKebabCase(str: string): string {\n return str\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .replace(/[\\s_]+/g, '-')\n .toLowerCase()\n}\n\nexport function toScreamingSnake(str: string): string {\n return str\n .replace(/([a-z])([A-Z])/g, '$1_$2')\n .replace(/[\\s-]+/g, '_')\n .toUpperCase()\n}\n\nexport function quotePropertyName(name: string): string {\n return /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(name) ? name : `'${name}'`\n}\n\nexport function singularizeLabel(label: string): string {\n const words = label.split(' ')\n const lastWord = words[words.length - 1]\n words[words.length - 1] = singularize(lastWord.toLowerCase())\n words[words.length - 1] =\n words[words.length - 1].charAt(0).toUpperCase() + words[words.length - 1].slice(1)\n return words.join(' ')\n}\n","import type { BetterstartNextPaths } from '@core-engine/config/types.js'\nimport { toCamelCase, toPascalCase, toScreamingSnake } from '@core-engine/utils/string.js'\n\nexport const DEFAULT_ADMIN_NAMESPACE = 'admin'\n\nconst NAMESPACE_PATTERN = /^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/\n\nexport interface AdminNamespace {\n segment: string\n alias: string\n camel: string\n pascal: string\n screaming: string\n routePath: string\n apiPath: string\n cssRootClass: string\n globalsFile: string\n routeGroup: string\n}\n\nexport function validateAdminNamespace(value: string): string {\n const segment = value.trim()\n\n if (!NAMESPACE_PATTERN.test(segment)) {\n throw new Error(\n 'Namespace must be one lowercase kebab-case segment starting with a letter, for example \"admin\" or \"admin-panel\".'\n )\n }\n\n return segment\n}\n\nexport function validateAdminDashboardPath(value: string): string {\n const input = value.trim()\n const segment = input.startsWith('/') ? input.slice(1) : input\n\n if (input.startsWith('/') && input !== `/${segment}`) {\n throw new Error(\n 'Dashboard path must be one lowercase kebab-case segment starting with a letter, for example \"/admin\" or \"/admin-panel\".'\n )\n }\n\n try {\n return validateAdminNamespace(segment)\n } catch {\n throw new Error(\n 'Dashboard path must be one lowercase kebab-case segment starting with a letter, for example \"/admin\" or \"/admin-panel\".'\n )\n }\n}\n\nexport function resolveAdminNamespace(value = DEFAULT_ADMIN_NAMESPACE): AdminNamespace {\n const segment = validateAdminNamespace(value)\n const pascal = toPascalCase(segment)\n\n return {\n segment,\n alias: `@${segment}`,\n camel: toCamelCase(segment),\n pascal,\n screaming: toScreamingSnake(segment),\n routePath: `/${segment}`,\n apiPath: `/api/${segment}`,\n cssRootClass: `${segment}-root`,\n globalsFile: `${segment}-globals.css`,\n routeGroup: `(${segment})`\n }\n}\n\nexport function deriveNamespacePaths(\n namespaceValue: string,\n srcDir: boolean\n): BetterstartNextPaths {\n const namespace = resolveAdminNamespace(namespaceValue)\n const appBase = srcDir ? './src/app' : './app'\n\n return {\n admin: `./${namespace.segment}`,\n schemas: `./${namespace.segment}/schemas`,\n pages: `${appBase}/${namespace.routeGroup}/${namespace.segment}/(authenticated)`,\n login: `${appBase}/${namespace.routeGroup}/${namespace.segment}/(auth)/login`,\n api: `${appBase}/${namespace.routeGroup}/api/${namespace.segment}`\n }\n}\n\nexport function deriveMigrationsDir(namespaceValue: string): string {\n const namespace = resolveAdminNamespace(namespaceValue)\n return `./${namespace.segment}/lib/db/migrations`\n}\n\nfunction replaceAdminDashToken(value: string, namespace: AdminNamespace): string {\n return value.replaceAll('admin-', `${namespace.segment}-`)\n}\n\nfunction replaceAdminScreamingToken(value: string, namespace: AdminNamespace): string {\n return value.replaceAll('ADMIN_', `${namespace.screaming}_`)\n}\n\nfunction replaceAdminPascalToken(value: string, namespace: AdminNamespace): string {\n return value.replaceAll('Admin', namespace.pascal)\n}\n\nfunction replaceAdminCamelToken(value: string, namespace: AdminNamespace): string {\n return value.replace(/\\badmin(?=[A-Z])/g, namespace.camel)\n}\n\nfunction protectExistingNamespaceLiterals(\n value: string,\n namespace: AdminNamespace\n): {\n value: string\n restore: (output: string) => string\n} {\n if (namespace.segment === DEFAULT_ADMIN_NAMESPACE) {\n return {\n value,\n restore(output: string): string {\n return output\n }\n }\n }\n\n const literals = Array.from(\n new Set([\n namespace.alias,\n namespace.apiPath,\n namespace.routePath,\n namespace.routeGroup,\n namespace.cssRootClass,\n namespace.globalsFile,\n `${namespace.segment}/`,\n `${namespace.segment}-`,\n namespace.screaming,\n namespace.pascal,\n namespace.camel\n ])\n ).sort((a, b) => b.length - a.length)\n\n const replacements: Array<[string, string]> = []\n let protectedValue = value\n\n for (const [index, literal] of literals.entries()) {\n if (!protectedValue.includes(literal)) {\n continue\n }\n\n const token = `__BSTART_NS_${index}__`\n protectedValue = protectedValue.replaceAll(literal, token)\n replacements.push([token, literal])\n }\n\n return {\n value: protectedValue,\n restore(output: string): string {\n let restored = output\n for (const [token, literal] of replacements) {\n restored = restored.replaceAll(token, literal)\n }\n return restored\n }\n }\n}\n\nexport function applyAdminNamespaceToPath(filePath: string, namespaceValue: string): string {\n const namespace = resolveAdminNamespace(namespaceValue)\n\n const canonicalPath = filePath\n .replaceAll('lib/actions/auth/middleware.ts', 'lib/actions/auth/session.ts')\n .replaceAll('lib/actions/auth/auth.ts', 'lib/actions/auth/server.ts')\n .replaceAll('lib/actions/r2/r2.ts', 'lib/actions/r2/provider.ts')\n .replaceAll('lib/actions/resend/resend.ts', 'lib/actions/resend/provider.ts')\n .replaceAll(\n 'lib/actions/mailchimp/mailchimp.ts',\n 'lib/actions/mailchimp/add-to-mailchimp-audience.ts'\n )\n .replaceAll('(admin)', namespace.routeGroup)\n .replace(/@admin(?=\\/|$)/g, namespace.alias)\n .replace(/\\/api\\/admin(?=\\/|$)/g, namespace.apiPath)\n .replace(/(^|\\/)admin(?=\\/|$)/g, `$1${namespace.segment}`)\n\n const protectedNamespace = protectExistingNamespaceLiterals(canonicalPath, namespace)\n const namespacedPath = replaceAdminDashToken(protectedNamespace.value, namespace)\n\n return protectedNamespace.restore(namespacedPath)\n}\n\nconst MODULE_SPECIFIER_PATTERN =\n /(\\bfrom\\s*|\\bimport\\s*|\\brequire\\s*\\(\\s*|\\bimport\\s*\\(\\s*)(['\"])([^'\"\\n]+)\\2/g\n\nconst EXTERNAL_PACKAGE_PATTERN =\n /^(?:@[a-z0-9-~][a-z0-9-._~]*\\/)?[a-z0-9-~][a-z0-9-._~]*(?:\\/[^'\"]*)?$/\n\nfunction isExternalModuleSpecifier(specifier: string): boolean {\n if (specifier.startsWith('.') || specifier.startsWith('/')) {\n return false\n }\n\n if (new RegExp(`^@${DEFAULT_ADMIN_NAMESPACE}(?:/|$)`).test(specifier)) {\n return false\n }\n\n return EXTERNAL_PACKAGE_PATTERN.test(specifier)\n}\n\nfunction protectExternalModuleSpecifiers(content: string): {\n content: string\n restore: (value: string) => string\n} {\n const replacements: Array<[string, string]> = []\n\n const protectedContent = content.replace(\n MODULE_SPECIFIER_PATTERN,\n (match, prefix: string, quote: string, specifier: string) => {\n if (!isExternalModuleSpecifier(specifier)) {\n return match\n }\n\n const token = `__BETTERSTART_EXTERNAL_MODULE_${replacements.length}__`\n replacements.push([token, specifier])\n return `${prefix}${quote}${token}${quote}`\n }\n )\n\n return {\n content: protectedContent,\n restore(value: string): string {\n let restored = value\n for (const [token, specifier] of replacements) {\n restored = restored.replaceAll(token, specifier)\n }\n return restored\n }\n }\n}\n\nfunction protectAdminRoleLiterals(content: string): {\n content: string\n restore: (value: string) => string\n} {\n const protectedValues = [\n 'UserRole.ADMIN',\n \"'admin'\",\n '\"admin\"',\n '`admin`',\n '>Admin</SelectItem>',\n 'Manage admin users and roles'\n ]\n\n const replacements: Array<[string, string]> = []\n let protectedContent = content\n\n for (const [index, value] of protectedValues.entries()) {\n if (!protectedContent.includes(value)) {\n continue\n }\n\n const token = `__BETTERSTART_NAMESPACE_PROTECTED_${index}__`\n protectedContent = protectedContent.replaceAll(value, token)\n replacements.push([token, value])\n }\n\n return {\n content: protectedContent,\n restore(value: string): string {\n let restored = value\n for (const [token, original] of replacements) {\n restored = restored.replaceAll(token, original)\n }\n return restored\n }\n }\n}\n\nexport function applyAdminNamespaceToContent(content: string, namespaceValue: string): string {\n const namespace = resolveAdminNamespace(namespaceValue)\n const { content: externalSafeContent, restore: restoreExternalModules } =\n protectExternalModuleSpecifiers(content)\n const { content: protectedContent, restore } = protectAdminRoleLiterals(externalSafeContent)\n\n const canonicalContent = protectedContent\n .replaceAll('MediaListParams', `${namespace.pascal}MediaQuery`)\n .replaceAll('MediaListResult', `${namespace.pascal}MediaPage`)\n .replaceAll(\n `${namespace.pascal}MediaQuery, ${namespace.pascal}MediaPage`,\n `${namespace.pascal}MediaPage, ${namespace.pascal}MediaQuery`\n )\n .replaceAll('UserData', 'User')\n .replaceAll('UsersResponse', 'UsersPage')\n .replaceAll('SettingData', 'Setting')\n .replaceAll('UpsertSettingInput', 'SettingUpsertInput')\n .replaceAll('UpsertSettingResult', 'SettingUpsertResult')\n .replace(/\\bAdminThemeProvider\\b/g, `${namespace.pascal}ThemeProvider`)\n .replace(/\\bAdminThemeContext\\b/g, `${namespace.pascal}ThemeContext`)\n .replace(\n /import\\s+\\{\\s*admin\\s*\\}\\s+from\\s+(['\"])@admin\\/utils\\/app\\/admin\\1/g,\n (_match, quote: string) =>\n `import { ${namespace.camel} } from ${quote}${namespace.alias}/utils/app/${namespace.camel}${quote}`\n )\n .replace(/\\badmin(?=\\.name\\b)/g, namespace.camel)\n .replaceAll('@admin/auth/middleware', `${namespace.alias}/auth/session`)\n .replaceAll('@admin/auth/auth', `${namespace.alias}/auth/server`)\n .replaceAll('@admin/auth/client', `${namespace.alias}/auth/client`)\n .replace(/@admin\\/auth(?=['\"`\\s)]|$)/g, `${namespace.alias}/auth/server`)\n .replaceAll(\n \"import { auth, type User } from './auth'\",\n \"import { auth, type User } from './server'\"\n )\n .replace(/@admin(?=\\/|$)/g, namespace.alias)\n .replace(/\\/api\\/admin(?=\\/|['\"`]|$)/g, namespace.apiPath)\n .replace(/(^|\\/)admin(?=\\/|['\"`]|$)/g, `$1${namespace.segment}`)\n .replaceAll('(admin)', namespace.routeGroup)\n\n const protectedNamespace = protectExistingNamespaceLiterals(canonicalContent, namespace)\n const namespacedContent = replaceAdminCamelToken(\n replaceAdminPascalToken(\n replaceAdminScreamingToken(\n replaceAdminDashToken(protectedNamespace.value, namespace),\n namespace\n ),\n namespace\n ),\n namespace\n )\n\n return restoreExternalModules(restore(protectedNamespace.restore(namespacedContent)))\n}\n"],"mappings":"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","names":["fs","path","fs","path"]}
package/dist/cli.js CHANGED
@@ -18,7 +18,7 @@ import {
18
18
  toPascalCase,
19
19
  validateAdminDashboardPath,
20
20
  validateAdminNamespace
21
- } from "./chunk-M4S53A4X.js";
21
+ } from "./chunk-3CLINNJL.js";
22
22
 
23
23
  // cli.ts
24
24
  import { readFileSync } from "fs";
@@ -27759,7 +27759,7 @@ async function runInitCommand(name, options) {
27759
27759
  const drizzleConfigPath = path52.join(cwd, "drizzle.config.ts");
27760
27760
  if (!dbFiles.includes("drizzle.config.ts") && fs41.existsSync(drizzleConfigPath)) {
27761
27761
  if (forceMode) {
27762
- const { readNamespacedTemplate } = await import("./template-reader-X6KFP7B3.js");
27762
+ const { readNamespacedTemplate } = await import("./template-reader-PVN53GS7.js");
27763
27763
  fs41.writeFileSync(
27764
27764
  drizzleConfigPath,
27765
27765
  readNamespacedTemplate("drizzle.config.ts", namespace),
@@ -27772,7 +27772,7 @@ async function runInitCommand(name, options) {
27772
27772
  initialValue: true
27773
27773
  });
27774
27774
  if (!p25.isCancel(overwrite) && overwrite) {
27775
- const { readNamespacedTemplate } = await import("./template-reader-X6KFP7B3.js");
27775
+ const { readNamespacedTemplate } = await import("./template-reader-PVN53GS7.js");
27776
27776
  fs41.writeFileSync(
27777
27777
  drizzleConfigPath,
27778
27778
  readNamespacedTemplate("drizzle.config.ts", namespace),
@@ -3,11 +3,11 @@ import {
3
3
  namespacedTemplatePath,
4
4
  readNamespacedTemplate,
5
5
  readTemplate
6
- } from "./chunk-M4S53A4X.js";
6
+ } from "./chunk-3CLINNJL.js";
7
7
  export {
8
8
  applyNextCacheApiForVersion,
9
9
  namespacedTemplatePath,
10
10
  readNamespacedTemplate,
11
11
  readTemplate
12
12
  };
13
- //# sourceMappingURL=template-reader-X6KFP7B3.js.map
13
+ //# sourceMappingURL=template-reader-PVN53GS7.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "betterstart-cli",
3
- "version": "0.0.89",
3
+ "version": "0.0.90",
4
4
  "description": "Scaffold a preset- and integration-based Admin into any Next.js 16 application",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../adapters/next/template-reader.ts","../core-engine/utils/cli-root.ts","../core-engine/utils/string.ts","../adapters/next/config/namespace.ts"],"sourcesContent":["import fs from 'node:fs'\nimport path from 'node:path'\nimport { resolveCliAssetPath } from '@core-engine/utils/cli-root.js'\nimport {\n applyAdminNamespaceToContent,\n applyAdminNamespaceToPath\n} from '@next-adapter/config/namespace.js'\n\n/**\n * Read a Next init template file by its relative path.\n * Used by scaffolders and update-component to get template content.\n */\nexport function readTemplate(relativePath: string): string {\n return fs.readFileSync(\n path.join(resolveCliAssetPath('adapters', 'next', 'templates', 'init'), relativePath),\n 'utf-8'\n )\n}\n\nexport function applyNextCacheApiForVersion(content: string, nextMajorVersion: number): string {\n if (nextMajorVersion >= 16) {\n return content\n }\n\n return content\n .replace(\n /import \\{ cacheLife, cacheTag \\} from 'next\\/cache'\\n/g,\n \"import { unstable_cacheTag as cacheTag } from 'next/cache'\\n\"\n )\n .replace(/\\n {2}cacheLife\\('max'\\)/g, '')\n .replace(\n /import \\{ updateTag \\} from 'next\\/cache'\\n/g,\n \"import { revalidateTag } from 'next/cache'\\n\"\n )\n .replace(/revalidateTag\\(([^,\\n]+), \\{ expire: 0 \\}\\)/g, 'revalidateTag($1)')\n .replace(/\\bupdateTag\\(/g, 'revalidateTag(')\n}\n\nexport function readNamespacedTemplate(relativePath: string, namespace: string): string {\n return applyAdminNamespaceToContent(readTemplate(relativePath), namespace)\n}\n\nexport function namespacedTemplatePath(relativePath: string, namespace: string): string {\n return applyAdminNamespaceToPath(relativePath, namespace)\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\n\n/**\n * Find the CLI package root by looking for package.json with our name.\n * Works both from source (src/) and built (dist/) locations.\n */\nexport function findCliRoot(): string {\n let dir = new URL('.', import.meta.url).pathname\n for (let i = 0; i < 5; i++) {\n const pkgPath = path.join(dir, 'package.json')\n if (fs.existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'))\n if (pkg.name === 'betterstart-cli') {\n return dir\n }\n } catch {\n // continue\n }\n }\n dir = path.dirname(dir)\n }\n // Fallback: assume 2 levels up from dist/\n return path.resolve(new URL('.', import.meta.url).pathname, '..', '..')\n}\n\nexport function resolveCliAssetPath(...segments: string[]): string {\n const root = findCliRoot()\n const builtPath = path.join(root, 'dist', 'assets', ...segments)\n if (fs.existsSync(builtPath)) {\n return builtPath\n }\n\n return path.join(root, ...segments)\n}\n","/**\n * Shared string helpers used across all generators.\n */\n\nexport function toPascalCase(str: string): string {\n return str\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .split(/[-_\\s]+/)\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase())\n .join('')\n}\n\nexport function toCamelCase(str: string): string {\n const p = toPascalCase(str)\n return p.charAt(0).toLowerCase() + p.slice(1)\n}\n\nexport function singularize(str: string): string {\n if (str.endsWith('ies')) return `${str.slice(0, -3)}y`\n if (str.endsWith('ves')) return `${str.slice(0, -3)}f`\n if (\n str.endsWith('sses') ||\n str.endsWith('xes') ||\n str.endsWith('ches') ||\n str.endsWith('shes') ||\n str.endsWith('zes')\n )\n return str.slice(0, -2)\n if (str.endsWith('s') && !str.endsWith('ss')) return str.slice(0, -1)\n return str\n}\n\nexport function pluralize(str: string): string {\n if (str.endsWith('s') && !str.endsWith('ss')) return str\n if (str.endsWith('y') && !['ay', 'ey', 'iy', 'oy', 'uy'].some((v) => str.endsWith(v)))\n return `${str.slice(0, -1)}ies`\n if (str.endsWith('s') || str.endsWith('x') || str.endsWith('ch') || str.endsWith('sh'))\n return `${str}es`\n return `${str}s`\n}\n\nexport function toKebabCase(str: string): string {\n return str\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .replace(/[\\s_]+/g, '-')\n .toLowerCase()\n}\n\nexport function toScreamingSnake(str: string): string {\n return str\n .replace(/([a-z])([A-Z])/g, '$1_$2')\n .replace(/[\\s-]+/g, '_')\n .toUpperCase()\n}\n\nexport function quotePropertyName(name: string): string {\n return /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(name) ? name : `'${name}'`\n}\n\nexport function singularizeLabel(label: string): string {\n const words = label.split(' ')\n const lastWord = words[words.length - 1]\n words[words.length - 1] = singularize(lastWord.toLowerCase())\n words[words.length - 1] =\n words[words.length - 1].charAt(0).toUpperCase() + words[words.length - 1].slice(1)\n return words.join(' ')\n}\n","import type { BetterstartNextPaths } from '@core-engine/config/types.js'\nimport { toCamelCase, toPascalCase, toScreamingSnake } from '@core-engine/utils/string.js'\n\nexport const DEFAULT_ADMIN_NAMESPACE = 'admin'\n\nconst NAMESPACE_PATTERN = /^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/\n\nexport interface AdminNamespace {\n segment: string\n alias: string\n camel: string\n pascal: string\n screaming: string\n routePath: string\n apiPath: string\n cssRootClass: string\n globalsFile: string\n routeGroup: string\n}\n\nexport function validateAdminNamespace(value: string): string {\n const segment = value.trim()\n\n if (!NAMESPACE_PATTERN.test(segment)) {\n throw new Error(\n 'Namespace must be one lowercase kebab-case segment starting with a letter, for example \"admin\" or \"admin-panel\".'\n )\n }\n\n return segment\n}\n\nexport function validateAdminDashboardPath(value: string): string {\n const input = value.trim()\n const segment = input.startsWith('/') ? input.slice(1) : input\n\n if (input.startsWith('/') && input !== `/${segment}`) {\n throw new Error(\n 'Dashboard path must be one lowercase kebab-case segment starting with a letter, for example \"/admin\" or \"/admin-panel\".'\n )\n }\n\n try {\n return validateAdminNamespace(segment)\n } catch {\n throw new Error(\n 'Dashboard path must be one lowercase kebab-case segment starting with a letter, for example \"/admin\" or \"/admin-panel\".'\n )\n }\n}\n\nexport function resolveAdminNamespace(value = DEFAULT_ADMIN_NAMESPACE): AdminNamespace {\n const segment = validateAdminNamespace(value)\n const pascal = toPascalCase(segment)\n\n return {\n segment,\n alias: `@${segment}`,\n camel: toCamelCase(segment),\n pascal,\n screaming: toScreamingSnake(segment),\n routePath: `/${segment}`,\n apiPath: `/api/${segment}`,\n cssRootClass: `${segment}-root`,\n globalsFile: `${segment}-globals.css`,\n routeGroup: `(${segment})`\n }\n}\n\nexport function deriveNamespacePaths(\n namespaceValue: string,\n srcDir: boolean\n): BetterstartNextPaths {\n const namespace = resolveAdminNamespace(namespaceValue)\n const appBase = srcDir ? './src/app' : './app'\n\n return {\n admin: `./${namespace.segment}`,\n schemas: `./${namespace.segment}/schemas`,\n pages: `${appBase}/${namespace.routeGroup}/${namespace.segment}/(authenticated)`,\n login: `${appBase}/${namespace.routeGroup}/${namespace.segment}/(auth)/login`,\n api: `${appBase}/${namespace.routeGroup}/api/${namespace.segment}`\n }\n}\n\nexport function deriveMigrationsDir(namespaceValue: string): string {\n const namespace = resolveAdminNamespace(namespaceValue)\n return `./${namespace.segment}/lib/db/migrations`\n}\n\nfunction replaceAdminDashToken(value: string, namespace: AdminNamespace): string {\n return value.replaceAll('admin-', `${namespace.segment}-`)\n}\n\nfunction replaceAdminScreamingToken(value: string, namespace: AdminNamespace): string {\n return value.replaceAll('ADMIN_', `${namespace.screaming}_`)\n}\n\nfunction replaceAdminPascalToken(value: string, namespace: AdminNamespace): string {\n return value.replaceAll('Admin', namespace.pascal)\n}\n\nfunction replaceAdminCamelToken(value: string, namespace: AdminNamespace): string {\n return value.replace(/\\badmin(?=[A-Z])/g, namespace.camel)\n}\n\nfunction protectExistingNamespaceLiterals(\n value: string,\n namespace: AdminNamespace\n): {\n value: string\n restore: (output: string) => string\n} {\n if (namespace.segment === DEFAULT_ADMIN_NAMESPACE) {\n return {\n value,\n restore(output: string): string {\n return output\n }\n }\n }\n\n const literals = Array.from(\n new Set([\n namespace.alias,\n namespace.apiPath,\n namespace.routePath,\n namespace.routeGroup,\n namespace.cssRootClass,\n namespace.globalsFile,\n `${namespace.segment}/`,\n `${namespace.segment}-`,\n namespace.screaming,\n namespace.pascal,\n namespace.camel\n ])\n ).sort((a, b) => b.length - a.length)\n\n const replacements: Array<[string, string]> = []\n let protectedValue = value\n\n for (const [index, literal] of literals.entries()) {\n if (!protectedValue.includes(literal)) {\n continue\n }\n\n const token = `__BSTART_NS_${index}__`\n protectedValue = protectedValue.replaceAll(literal, token)\n replacements.push([token, literal])\n }\n\n return {\n value: protectedValue,\n restore(output: string): string {\n let restored = output\n for (const [token, literal] of replacements) {\n restored = restored.replaceAll(token, literal)\n }\n return restored\n }\n }\n}\n\nexport function applyAdminNamespaceToPath(filePath: string, namespaceValue: string): string {\n const namespace = resolveAdminNamespace(namespaceValue)\n\n const canonicalPath = filePath\n .replaceAll('lib/actions/auth/middleware.ts', 'lib/actions/auth/session.ts')\n .replaceAll('lib/actions/auth/auth.ts', 'lib/actions/auth/server.ts')\n .replaceAll('lib/actions/r2/r2.ts', 'lib/actions/r2/provider.ts')\n .replaceAll('lib/actions/resend/resend.ts', 'lib/actions/resend/provider.ts')\n .replaceAll(\n 'lib/actions/mailchimp/mailchimp.ts',\n 'lib/actions/mailchimp/add-to-mailchimp-audience.ts'\n )\n .replaceAll('(admin)', namespace.routeGroup)\n .replace(/@admin(?=\\/|$)/g, namespace.alias)\n .replace(/\\/api\\/admin(?=\\/|$)/g, namespace.apiPath)\n .replace(/(^|\\/)admin(?=\\/|$)/g, `$1${namespace.segment}`)\n\n const protectedNamespace = protectExistingNamespaceLiterals(canonicalPath, namespace)\n const namespacedPath = replaceAdminDashToken(protectedNamespace.value, namespace)\n\n return protectedNamespace.restore(namespacedPath)\n}\n\nfunction protectAdminRoleLiterals(content: string): {\n content: string\n restore: (value: string) => string\n} {\n const protectedValues = [\n 'UserRole.ADMIN',\n \"'admin'\",\n '\"admin\"',\n '`admin`',\n '>Admin</SelectItem>',\n 'Manage admin users and roles'\n ]\n\n const replacements: Array<[string, string]> = []\n let protectedContent = content\n\n for (const [index, value] of protectedValues.entries()) {\n if (!protectedContent.includes(value)) {\n continue\n }\n\n const token = `__BETTERSTART_NAMESPACE_PROTECTED_${index}__`\n protectedContent = protectedContent.replaceAll(value, token)\n replacements.push([token, value])\n }\n\n return {\n content: protectedContent,\n restore(value: string): string {\n let restored = value\n for (const [token, original] of replacements) {\n restored = restored.replaceAll(token, original)\n }\n return restored\n }\n }\n}\n\nexport function applyAdminNamespaceToContent(content: string, namespaceValue: string): string {\n const namespace = resolveAdminNamespace(namespaceValue)\n const { content: protectedContent, restore } = protectAdminRoleLiterals(content)\n\n const canonicalContent = protectedContent\n .replaceAll('MediaListParams', `${namespace.pascal}MediaQuery`)\n .replaceAll('MediaListResult', `${namespace.pascal}MediaPage`)\n .replaceAll(\n `${namespace.pascal}MediaQuery, ${namespace.pascal}MediaPage`,\n `${namespace.pascal}MediaPage, ${namespace.pascal}MediaQuery`\n )\n .replaceAll('UserData', 'User')\n .replaceAll('UsersResponse', 'UsersPage')\n .replaceAll('SettingData', 'Setting')\n .replaceAll('UpsertSettingInput', 'SettingUpsertInput')\n .replaceAll('UpsertSettingResult', 'SettingUpsertResult')\n .replace(/\\bAdminThemeProvider\\b/g, `${namespace.pascal}ThemeProvider`)\n .replace(/\\bAdminThemeContext\\b/g, `${namespace.pascal}ThemeContext`)\n .replace(\n /import\\s+\\{\\s*admin\\s*\\}\\s+from\\s+(['\"])@admin\\/utils\\/app\\/admin\\1/g,\n (_match, quote: string) =>\n `import { ${namespace.camel} } from ${quote}${namespace.alias}/utils/app/${namespace.camel}${quote}`\n )\n .replace(/\\badmin(?=\\.name\\b)/g, namespace.camel)\n .replaceAll('@admin/auth/middleware', `${namespace.alias}/auth/session`)\n .replaceAll('@admin/auth/auth', `${namespace.alias}/auth/server`)\n .replaceAll('@admin/auth/client', `${namespace.alias}/auth/client`)\n .replace(/@admin\\/auth(?=['\"`\\s)]|$)/g, `${namespace.alias}/auth/server`)\n .replaceAll(\n \"import { auth, type User } from './auth'\",\n \"import { auth, type User } from './server'\"\n )\n .replace(/@admin(?=\\/|$)/g, namespace.alias)\n .replace(/\\/api\\/admin(?=\\/|['\"`]|$)/g, namespace.apiPath)\n .replace(/(^|\\/)admin(?=\\/|['\"`]|$)/g, `$1${namespace.segment}`)\n .replaceAll('(admin)', namespace.routeGroup)\n\n const protectedNamespace = protectExistingNamespaceLiterals(canonicalContent, namespace)\n const namespacedContent = replaceAdminCamelToken(\n replaceAdminPascalToken(\n replaceAdminScreamingToken(\n replaceAdminDashToken(protectedNamespace.value, namespace),\n namespace\n ),\n namespace\n ),\n namespace\n )\n\n return restore(protectedNamespace.restore(namespacedContent))\n}\n"],"mappings":"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","names":["fs","path","fs","path"]}