@djangocfg/nextjs 2.1.483 → 2.1.486

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.
@@ -20,7 +20,7 @@ interface HealthConfig {
20
20
  *
21
21
  * Usage:
22
22
  * ```tsx
23
- * // app/api/health/route.ts
23
+ * // app/healthz/route.ts
24
24
  * import { createHealthHandler } from '@djangocfg/nextjs/health';
25
25
  *
26
26
  * export const GET = createHealthHandler({
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/health/route.ts"],"sourcesContent":["/**\n * Health Route Handler for Next.js App Router\n *\n * Usage:\n * ```tsx\n * // app/api/health/route.ts\n * import { createHealthHandler } from '@djangocfg/nextjs/health';\n *\n * export const GET = createHealthHandler({\n * version: process.env.NEXT_PUBLIC_APP_VERSION || '1.0.0',\n * checks: [\n * {\n * name: 'database',\n * check: async () => {\n * // Check database connection\n * return await checkDatabase();\n * },\n * },\n * ],\n * });\n * ```\n */\n\nimport { NextResponse } from 'next/server';\n\nimport type { HealthConfig, HealthResponse } from './types';\n\nexport function createHealthHandler(config: HealthConfig = {}) {\n const { version, checks = [], customData = {} } = config;\n\n return async function GET() {\n const startTime = Date.now();\n let status: 'ok' | 'error' = 'ok';\n const checkResults: Record<string, boolean> = {};\n\n // Run health checks\n if (checks.length > 0) {\n for (const check of checks) {\n try {\n const result = await check.check();\n checkResults[check.name] = result;\n if (!result) {\n status = 'error';\n }\n } catch (error) {\n checkResults[check.name] = false;\n status = 'error';\n }\n }\n }\n\n const response: HealthResponse = {\n status,\n timestamp: new Date().toISOString(),\n uptime: process.uptime(),\n ...(version && { version }),\n ...(Object.keys(checkResults).length > 0 && { checks: checkResults }),\n ...customData,\n };\n\n const statusCode = status === 'ok' ? 200 : 503;\n\n return NextResponse.json(response, { status: statusCode });\n };\n}\n\n"],"mappings":";AAuBA,SAAS,oBAAoB;AAItB,SAAS,oBAAoB,SAAuB,CAAC,GAAG;AAC7D,QAAM,EAAE,SAAS,SAAS,CAAC,GAAG,aAAa,CAAC,EAAE,IAAI;AAElD,SAAO,eAAe,MAAM;AAC1B,UAAM,YAAY,KAAK,IAAI;AAC3B,QAAI,SAAyB;AAC7B,UAAM,eAAwC,CAAC;AAG/C,QAAI,OAAO,SAAS,GAAG;AACrB,iBAAW,SAAS,QAAQ;AAC1B,YAAI;AACF,gBAAM,SAAS,MAAM,MAAM,MAAM;AACjC,uBAAa,MAAM,IAAI,IAAI;AAC3B,cAAI,CAAC,QAAQ;AACX,qBAAS;AAAA,UACX;AAAA,QACF,SAAS,OAAO;AACd,uBAAa,MAAM,IAAI,IAAI;AAC3B,mBAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAEA,UAAM,WAA2B;AAAA,MAC/B;AAAA,MACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,QAAQ,QAAQ,OAAO;AAAA,MACvB,GAAI,WAAW,EAAE,QAAQ;AAAA,MACzB,GAAI,OAAO,KAAK,YAAY,EAAE,SAAS,KAAK,EAAE,QAAQ,aAAa;AAAA,MACnE,GAAG;AAAA,IACL;AAEA,UAAM,aAAa,WAAW,OAAO,MAAM;AAE3C,WAAO,aAAa,KAAK,UAAU,EAAE,QAAQ,WAAW,CAAC;AAAA,EAC3D;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/health/route.ts"],"sourcesContent":["/**\n * Health Route Handler for Next.js App Router\n *\n * Usage:\n * ```tsx\n * // app/healthz/route.ts\n * import { createHealthHandler } from '@djangocfg/nextjs/health';\n *\n * export const GET = createHealthHandler({\n * version: process.env.NEXT_PUBLIC_APP_VERSION || '1.0.0',\n * checks: [\n * {\n * name: 'database',\n * check: async () => {\n * // Check database connection\n * return await checkDatabase();\n * },\n * },\n * ],\n * });\n * ```\n */\n\nimport { NextResponse } from 'next/server';\n\nimport type { HealthConfig, HealthResponse } from './types';\n\nexport function createHealthHandler(config: HealthConfig = {}) {\n const { version, checks = [], customData = {} } = config;\n\n return async function GET() {\n const startTime = Date.now();\n let status: 'ok' | 'error' = 'ok';\n const checkResults: Record<string, boolean> = {};\n\n // Run health checks\n if (checks.length > 0) {\n for (const check of checks) {\n try {\n const result = await check.check();\n checkResults[check.name] = result;\n if (!result) {\n status = 'error';\n }\n } catch (error) {\n checkResults[check.name] = false;\n status = 'error';\n }\n }\n }\n\n const response: HealthResponse = {\n status,\n timestamp: new Date().toISOString(),\n uptime: process.uptime(),\n ...(version && { version }),\n ...(Object.keys(checkResults).length > 0 && { checks: checkResults }),\n ...customData,\n };\n\n const statusCode = status === 'ok' ? 200 : 503;\n\n return NextResponse.json(response, { status: statusCode });\n };\n}\n"],"mappings":";AAuBA,SAAS,oBAAoB;AAItB,SAAS,oBAAoB,SAAuB,CAAC,GAAG;AAC7D,QAAM,EAAE,SAAS,SAAS,CAAC,GAAG,aAAa,CAAC,EAAE,IAAI;AAElD,SAAO,eAAe,MAAM;AAC1B,UAAM,YAAY,KAAK,IAAI;AAC3B,QAAI,SAAyB;AAC7B,UAAM,eAAwC,CAAC;AAG/C,QAAI,OAAO,SAAS,GAAG;AACrB,iBAAW,SAAS,QAAQ;AAC1B,YAAI;AACF,gBAAM,SAAS,MAAM,MAAM,MAAM;AACjC,uBAAa,MAAM,IAAI,IAAI;AAC3B,cAAI,CAAC,QAAQ;AACX,qBAAS;AAAA,UACX;AAAA,QACF,SAAS,OAAO;AACd,uBAAa,MAAM,IAAI,IAAI;AAC3B,mBAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAEA,UAAM,WAA2B;AAAA,MAC/B;AAAA,MACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,QAAQ,QAAQ,OAAO;AAAA,MACvB,GAAI,WAAW,EAAE,QAAQ;AAAA,MACzB,GAAI,OAAO,KAAK,YAAY,EAAE,SAAS,KAAK,EAAE,QAAQ,aAAa;AAAA,MACnE,GAAG;AAAA,IACL;AAEA,UAAM,aAAa,WAAW,OAAO,MAAM;AAE3C,WAAO,aAAa,KAAK,UAAU,EAAE,QAAQ,WAAW,CAAC;AAAA,EAC3D;AACF;","names":[]}
@@ -24,7 +24,6 @@ declare function createRouting(config?: Partial<I18nConfig>): {
24
24
  localePrefix?: next_intl_routing.LocalePrefix<string[], "always" | "as-needed" | "never">;
25
25
  domains?: never;
26
26
  localeCookie?: boolean | {
27
- name?: string;
28
27
  maxAge?: number | undefined;
29
28
  priority?: "low" | "medium" | "high" | undefined;
30
29
  domain?: string | undefined;
@@ -32,6 +31,7 @@ declare function createRouting(config?: Partial<I18nConfig>): {
32
31
  secure?: boolean | undefined;
33
32
  sameSite?: true | false | "lax" | "strict" | "none" | undefined;
34
33
  partitioned?: boolean | undefined;
34
+ name?: string;
35
35
  };
36
36
  alternateLinks?: boolean;
37
37
  localeDetection?: boolean;
@@ -46,7 +46,6 @@ declare const routing: {
46
46
  localePrefix?: next_intl_routing.LocalePrefix<string[], "always" | "as-needed" | "never">;
47
47
  domains?: never;
48
48
  localeCookie?: boolean | {
49
- name?: string;
50
49
  maxAge?: number | undefined;
51
50
  priority?: "low" | "medium" | "high" | undefined;
52
51
  domain?: string | undefined;
@@ -54,6 +53,7 @@ declare const routing: {
54
53
  secure?: boolean | undefined;
55
54
  sameSite?: true | false | "lax" | "strict" | "none" | undefined;
56
55
  partitioned?: boolean | undefined;
56
+ name?: string;
57
57
  };
58
58
  alternateLinks?: boolean;
59
59
  localeDetection?: boolean;
package/dist/index.mjs CHANGED
@@ -14,7 +14,7 @@ var require_package = __commonJS({
14
14
  "package.json"(exports, module) {
15
15
  module.exports = {
16
16
  name: "@djangocfg/nextjs",
17
- version: "2.1.483",
17
+ version: "2.1.486",
18
18
  description: "Next.js server utilities: sitemap, health, OG images, contact forms, navigation, config",
19
19
  keywords: [
20
20
  "nextjs",
@@ -670,6 +670,7 @@ import { createRequire } from "module";
670
670
  import { join } from "path";
671
671
 
672
672
  // src/config/utils/env.ts
673
+ import consola2 from "consola";
673
674
  var isStaticBuild = process.env.NEXT_PUBLIC_STATIC_BUILD === "true";
674
675
  var isDev = process.env.NODE_ENV === "development";
675
676
  var isProduction = !isDev;
@@ -681,6 +682,15 @@ function getBasePath(isDefaultCfgAdmin) {
681
682
  function getApiUrl() {
682
683
  return isStaticBuild ? "" : process.env.NEXT_PUBLIC_API_URL || "";
683
684
  }
685
+ function hasApiUrl() {
686
+ return isStaticBuild || Boolean(process.env.NEXT_PUBLIC_API_URL);
687
+ }
688
+ function warnIfApiUrlMissing() {
689
+ if (hasApiUrl() || isDev) return;
690
+ consola2.warn(
691
+ "NEXT_PUBLIC_API_URL is not set \u2014 API-backed features are disabled in this build.\nRequests that need it are skipped rather than sent to a relative path.\nIf this app DOES have a backend, the value must be present at BUILD time:\n \u2022 commit it to the app's `.env.production`, and check no `.dockerignore`\n rule (e.g. `**/.env*`) strips that file from the build context;\n \u2022 or pass it as a Dockerfile ARG/ENV before the build step.\nA compose `environment:` entry is too late \u2014 it only exists at runtime."
692
+ );
693
+ }
684
694
  function getSiteUrl() {
685
695
  return isStaticBuild ? "" : process.env.NEXT_PUBLIC_SITE_URL || "";
686
696
  }
@@ -859,7 +869,7 @@ Example queries:
859
869
  import chalk from "chalk";
860
870
  import { execSync, spawn } from "child_process";
861
871
  import Conf from "conf";
862
- import consola2 from "consola";
872
+ import consola3 from "consola";
863
873
  import { createInterface } from "readline";
864
874
  function createMemoryCache() {
865
875
  const store = /* @__PURE__ */ new Map();
@@ -1078,13 +1088,13 @@ async function installPackagesWithProgress(packages) {
1078
1088
  }
1079
1089
  console.log("");
1080
1090
  if (failedPackages.length === 0) {
1081
- consola2.success(`All ${total} packages installed successfully!`);
1091
+ consola3.success(`All ${total} packages installed successfully!`);
1082
1092
  return true;
1083
1093
  } else if (successCount > 0) {
1084
- consola2.warn(`${successCount}/${total} packages installed. Failed: ${failedPackages.join(", ")}`);
1094
+ consola3.warn(`${successCount}/${total} packages installed. Failed: ${failedPackages.join(", ")}`);
1085
1095
  return false;
1086
1096
  } else {
1087
- consola2.error(`Failed to install packages: ${failedPackages.join(", ")}`);
1097
+ consola3.error(`Failed to install packages: ${failedPackages.join(", ")}`);
1088
1098
  return false;
1089
1099
  }
1090
1100
  }
@@ -1095,7 +1105,7 @@ async function installPackages(packages) {
1095
1105
  if (packages.length === 0) return true;
1096
1106
  const pm = detectPackageManager();
1097
1107
  const command = buildInstallCommand(packages, pm);
1098
- consola2.info(`Installing: ${chalk.cyan(packages.map((p) => p.name).join(", "))}`);
1108
+ consola3.info(`Installing: ${chalk.cyan(packages.map((p) => p.name).join(", "))}`);
1099
1109
  const spinner = createSpinner("Installing packages...");
1100
1110
  spinner.start();
1101
1111
  return new Promise((resolve) => {
@@ -1135,7 +1145,7 @@ async function checkAndInstallPackages(options = {}) {
1135
1145
  return installPackages(toInstall);
1136
1146
  }
1137
1147
  console.log("");
1138
- consola2.box("\u{1F4E6} Missing Optional Packages");
1148
+ consola3.box("\u{1F4E6} Missing Optional Packages");
1139
1149
  console.log("");
1140
1150
  for (const pkg of toInstall) {
1141
1151
  console.log(` ${chalk.yellow("\u2022")} ${chalk.bold(pkg.name)}`);
@@ -1159,7 +1169,7 @@ async function checkAndInstallPackages(options = {}) {
1159
1169
  );
1160
1170
  if (enableAuto) {
1161
1171
  installerCache.set("autoInstall", true);
1162
- consola2.info("Auto-install enabled. Run with --no-auto-install to disable.");
1172
+ consola3.info("Auto-install enabled. Run with --no-auto-install to disable.");
1163
1173
  }
1164
1174
  }
1165
1175
  return success;
@@ -1170,7 +1180,7 @@ async function checkAndInstallPackages(options = {}) {
1170
1180
  if (skipPermanently) {
1171
1181
  const currentSkip = installerCache.get("skipPackages") || [];
1172
1182
  installerCache.set("skipPackages", [...currentSkip, ...toInstall.map((p) => p.name)]);
1173
- consola2.info("Packages added to skip list.");
1183
+ consola3.info("Packages added to skip list.");
1174
1184
  }
1175
1185
  return false;
1176
1186
  }
@@ -1178,19 +1188,19 @@ function printMissingPackagesInfo(packages) {
1178
1188
  if (packages.length === 0) return;
1179
1189
  const pm = detectPackageManager();
1180
1190
  const command = buildInstallCommand(packages, pm);
1181
- consola2.warn(`Missing optional packages: ${packages.map((p) => p.name).join(", ")}`);
1182
- consola2.info(`Install with: ${chalk.cyan(command)}`);
1191
+ consola3.warn(`Missing optional packages: ${packages.map((p) => p.name).join(", ")}`);
1192
+ consola3.info(`Install with: ${chalk.cyan(command)}`);
1183
1193
  }
1184
1194
  function resetInstallerPreferences() {
1185
1195
  installerCache.clear();
1186
- consola2.success("Installer preferences reset");
1196
+ consola3.success("Installer preferences reset");
1187
1197
  }
1188
1198
 
1189
1199
  // src/config/packages/updater.ts
1190
1200
  import chalk2 from "chalk";
1191
1201
  import { spawn as spawn2 } from "child_process";
1192
1202
  import Conf2 from "conf";
1193
- import consola3 from "consola";
1203
+ import consola4 from "consola";
1194
1204
  import { createRequire as createRequire2 } from "module";
1195
1205
  import { join as join2 } from "path";
1196
1206
  import { createInterface as createInterface2 } from "readline";
@@ -1450,13 +1460,13 @@ async function updatePackagesWithProgress(packages) {
1450
1460
  }
1451
1461
  console.log("");
1452
1462
  if (failedPackages.length === 0) {
1453
- consola3.success(`All ${total} packages updated successfully!`);
1463
+ consola4.success(`All ${total} packages updated successfully!`);
1454
1464
  return true;
1455
1465
  } else if (successCount > 0) {
1456
- consola3.warn(`${successCount}/${total} packages updated. Failed: ${failedPackages.join(", ")}`);
1466
+ consola4.warn(`${successCount}/${total} packages updated. Failed: ${failedPackages.join(", ")}`);
1457
1467
  return false;
1458
1468
  } else {
1459
- consola3.error(`Failed to update packages: ${failedPackages.join(", ")}`);
1469
+ consola4.error(`Failed to update packages: ${failedPackages.join(", ")}`);
1460
1470
  return false;
1461
1471
  }
1462
1472
  }
@@ -1481,7 +1491,7 @@ async function checkAndUpdatePackages(options = {}) {
1481
1491
  return updatePackagesWithProgress(outdated);
1482
1492
  }
1483
1493
  console.log("");
1484
- consola3.box("\u{1F4E6} Updates Available");
1494
+ consola4.box("\u{1F4E6} Updates Available");
1485
1495
  console.log("");
1486
1496
  for (const pkg of outdated) {
1487
1497
  console.log(
@@ -1500,7 +1510,7 @@ async function checkAndUpdatePackages(options = {}) {
1500
1510
  );
1501
1511
  if (enableAuto) {
1502
1512
  updaterCache.set("autoUpdate", true);
1503
- consola3.info("Auto-update enabled.");
1513
+ consola4.info("Auto-update enabled.");
1504
1514
  }
1505
1515
  }
1506
1516
  return success;
@@ -1516,19 +1526,19 @@ async function checkAndUpdatePackages(options = {}) {
1516
1526
  }
1517
1527
  }
1518
1528
  updaterCache.set("skippedVersions", skipped);
1519
- consola3.info("Versions skipped. Will prompt again for newer versions.");
1529
+ consola4.info("Versions skipped. Will prompt again for newer versions.");
1520
1530
  }
1521
1531
  return false;
1522
1532
  }
1523
1533
  function resetUpdaterPreferences() {
1524
1534
  updaterCache.clear();
1525
- consola3.success("Updater preferences reset");
1535
+ consola4.success("Updater preferences reset");
1526
1536
  }
1527
1537
 
1528
1538
  // src/config/utils/version.ts
1529
1539
  import chalk3 from "chalk";
1530
1540
  import Conf3 from "conf";
1531
- import consola4 from "consola";
1541
+ import consola5 from "consola";
1532
1542
  import semver2 from "semver";
1533
1543
  function createMemoryCache3() {
1534
1544
  const store = /* @__PURE__ */ new Map();
@@ -1620,10 +1630,10 @@ function getUpdateCommand() {
1620
1630
  async function printVersionInfo() {
1621
1631
  const { hasUpdate, currentVersion, latestVersion } = await checkForUpdate();
1622
1632
  if (!currentVersion) return;
1623
- consola4.box(`\u{1F4E6} @djangocfg/nextjs v${currentVersion}`);
1633
+ consola5.box(`\u{1F4E6} @djangocfg/nextjs v${currentVersion}`);
1624
1634
  if (hasUpdate && latestVersion) {
1625
- consola4.warn(`Update Available! ${chalk3.red(currentVersion)} \u2192 ${chalk3.green(latestVersion)}`);
1626
- consola4.info(`Run: ${chalk3.cyan(getUpdateCommand())}`);
1635
+ consola5.warn(`Update Available! ${chalk3.red(currentVersion)} \u2192 ${chalk3.green(latestVersion)}`);
1636
+ consola5.info(`Run: ${chalk3.cyan(getUpdateCommand())}`);
1627
1637
  console.log("");
1628
1638
  }
1629
1639
  }
@@ -1723,6 +1733,7 @@ function deepMerge(target, source) {
1723
1733
  // src/config/createNextConfig.ts
1724
1734
  function createBaseNextConfig(options = {}) {
1725
1735
  const basePath = getBasePath(options.isDefaultCfgAdmin);
1736
+ warnIfApiUrlMissing();
1726
1737
  const apiUrl = getApiUrl();
1727
1738
  const siteUrl = getSiteUrl();
1728
1739
  const baseConfig = {