@djangocfg/nextjs 2.1.542 → 2.1.544

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.
@@ -1,5 +1,5 @@
1
1
  import { NextResponse } from 'next/server';
2
- import { H as HealthResponse } from '../types-l9x1Rkmf.mjs';
2
+ import { H as HealthResponse } from '../types-CMxSgWnS.mjs';
3
3
 
4
4
  /**
5
5
  * Health check types
@@ -14,7 +14,7 @@ function createHealthHandler(config = {}) {
14
14
  if (!result) {
15
15
  status = "error";
16
16
  }
17
- } catch (error) {
17
+ } catch {
18
18
  checkResults[check.name] = false;
19
19
  status = "error";
20
20
  }
@@ -25,7 +25,10 @@ function createHealthHandler(config = {}) {
25
25
  timestamp: (/* @__PURE__ */ new Date()).toISOString(),
26
26
  uptime: process.uptime(),
27
27
  ...version && { version },
28
- ...Object.keys(checkResults).length > 0 && { checks: checkResults },
28
+ ...checks.length > 0 && {
29
+ checks: checkResults,
30
+ durationMs: Date.now() - startTime
31
+ },
29
32
  ...customData
30
33
  };
31
34
  const statusCode = status === "ok" ? 200 : 503;
@@ -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/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":[]}
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 {\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 ...(checks.length > 0 && {\n checks: checkResults,\n durationMs: Date.now() - startTime,\n }),\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,QAAQ;AACN,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,SAAS,KAAK;AAAA,QACvB,QAAQ;AAAA,QACR,YAAY,KAAK,IAAI,IAAI;AAAA,MAC3B;AAAA,MACA,GAAG;AAAA,IACL;AAEA,UAAM,aAAa,WAAW,OAAO,MAAM;AAE3C,WAAO,aAAa,KAAK,UAAU,EAAE,QAAQ,WAAW,CAAC;AAAA,EAC3D;AACF;","names":[]}
@@ -21,17 +21,17 @@ declare const DEFAULT_LOCALE: LocaleCode;
21
21
  declare function createRouting(config?: Partial<I18nConfig>): {
22
22
  locales: string[];
23
23
  defaultLocale: string;
24
- localePrefix?: next_intl_routing.LocalePrefix<string[], "always" | "as-needed" | "never">;
25
- domains?: never;
24
+ localePrefix?: next_intl_routing.LocalePrefix<string[], "always" | "as-needed" | "never"> | undefined;
25
+ domains?: undefined;
26
26
  localeCookie?: boolean | {
27
- maxAge?: number | undefined;
28
- priority?: "low" | "medium" | "high" | undefined;
29
- domain?: string | undefined;
30
- path?: string | undefined;
31
- secure?: boolean | undefined;
32
- sameSite?: true | false | "lax" | "strict" | "none" | undefined;
33
- partitioned?: boolean | undefined;
34
- name?: string;
27
+ maxAge?: number | undefined | undefined;
28
+ priority?: "low" | "medium" | "high" | undefined | undefined;
29
+ domain?: string | undefined | undefined;
30
+ path?: string | undefined | undefined;
31
+ secure?: boolean | undefined | undefined;
32
+ sameSite?: true | false | "lax" | "strict" | "none" | undefined | undefined;
33
+ partitioned?: boolean | undefined | undefined;
34
+ name?: string | undefined;
35
35
  };
36
36
  alternateLinks?: boolean;
37
37
  localeDetection?: boolean;
@@ -43,17 +43,17 @@ declare function createRouting(config?: Partial<I18nConfig>): {
43
43
  declare const routing: {
44
44
  locales: string[];
45
45
  defaultLocale: string;
46
- localePrefix?: next_intl_routing.LocalePrefix<string[], "always" | "as-needed" | "never">;
47
- domains?: never;
46
+ localePrefix?: next_intl_routing.LocalePrefix<string[], "always" | "as-needed" | "never"> | undefined;
47
+ domains?: undefined;
48
48
  localeCookie?: boolean | {
49
- maxAge?: number | undefined;
50
- priority?: "low" | "medium" | "high" | undefined;
51
- domain?: string | undefined;
52
- path?: string | undefined;
53
- secure?: boolean | undefined;
54
- sameSite?: true | false | "lax" | "strict" | "none" | undefined;
55
- partitioned?: boolean | undefined;
56
- name?: string;
49
+ maxAge?: number | undefined | undefined;
50
+ priority?: "low" | "medium" | "high" | undefined | undefined;
51
+ domain?: string | undefined | undefined;
52
+ path?: string | undefined | undefined;
53
+ secure?: boolean | undefined | undefined;
54
+ sameSite?: true | false | "lax" | "strict" | "none" | undefined | undefined;
55
+ partitioned?: boolean | undefined | undefined;
56
+ name?: string | undefined;
57
57
  };
58
58
  alternateLinks?: boolean;
59
59
  localeDetection?: boolean;
@@ -78,8 +78,8 @@ declare function generateLocalizedMetadata(params: Promise<LocaleParams> | Local
78
78
  descriptionKey?: string;
79
79
  namespace?: string;
80
80
  }): Promise<{
81
- title: string;
82
- description: string;
81
+ title: string | undefined;
82
+ description: string | undefined;
83
83
  alternates: {
84
84
  languages: {
85
85
  [x: string]: string;
package/dist/index.d.mts CHANGED
@@ -4,7 +4,7 @@ export { BreadcrumbItem, MenuGroup, MenuItem, NavGroup, NavGroupWithRoutes, Navi
4
4
  export { BaseNextConfigOptions, CSP_BASELINE_VENDORS, CSP_VENDOR_PRESETS, CompressionPluginOptions, CspOrigins, CspVendor, DEFAULT_OPTIMIZE_PACKAGES, DEFAULT_TRANSPILE_PACKAGES, DJANGOCFG_PACKAGES, DJANGO_CFG_BANNER, DevStartupPlugin, DevStartupPluginOptions, InstallOptions, InstallProgress, MissingPackage, OPTIONAL_PACKAGES, PACKAGE_NAME, PEER_DEPENDENCIES, PackageDefinition, PackageVersion, UpdateOptions, addCompressionPlugins, buildInstallCommand, buildSingleInstallCommand, checkAndInstallPackages, checkAndUpdatePackages, checkForUpdate, checkForUpdates, checkPackages, createBaseNextConfig, deepMerge, detectPackageManager, fetchLatestVersion, getApiUrl, getBasePath, getCurrentVersion, getInstalledVersion, getMissingPackages, getOutdatedPackages, getPackagesForContext, getSiteUrl, getUpdateCommand, installPackages, installPackagesWithProgress, isCI, isCompressionAvailable, isDev, isPackageInstalled, isProduction, isStaticBuild, printVersionInfo, resetDevStartupState, resetInstallerPreferences, resetUpdaterPreferences, resolveCspVendors, updatePackagesWithProgress } from './config/index.mjs';
5
5
  export { A as AI_DOCS_HINT, a as AI_HINT, M as MCP_API_URL, b as MCP_BASE_URL, c as MCP_SERVER_URL } from './constants-BDS8GXHN.mjs';
6
6
  export { DjangoCfgDocsClient, McpConfig, SearchOptions, SearchResult, getDocs, getInfo, getMcpConfig, search } from './ai/index.mjs';
7
- export { C as ChangeFreq, E as ErrorPageConfig, H as HealthResponse, S as SitemapConfig, a as SitemapUrl } from './types-l9x1Rkmf.mjs';
7
+ export { C as ChangeFreq, E as ErrorPageConfig, H as HealthResponse, S as SitemapConfig, a as SitemapUrl } from './types-CMxSgWnS.mjs';
8
8
  import 'next';
9
9
  import 'next/server';
10
10
  import 'lucide-react';
package/dist/index.mjs CHANGED
@@ -190,7 +190,7 @@ function createHealthHandler(config = {}) {
190
190
  if (!result) {
191
191
  status = "error";
192
192
  }
193
- } catch (error) {
193
+ } catch {
194
194
  checkResults[check.name] = false;
195
195
  status = "error";
196
196
  }
@@ -201,7 +201,10 @@ function createHealthHandler(config = {}) {
201
201
  timestamp: (/* @__PURE__ */ new Date()).toISOString(),
202
202
  uptime: process.uptime(),
203
203
  ...version && { version },
204
- ...Object.keys(checkResults).length > 0 && { checks: checkResults },
204
+ ...checks.length > 0 && {
205
+ checks: checkResults,
206
+ durationMs: Date.now() - startTime
207
+ },
205
208
  ...customData
206
209
  };
207
210
  const statusCode = status === "ok" ? 200 : 503;
@@ -620,7 +623,7 @@ function addCompressionPlugins(config, options = {}) {
620
623
  );
621
624
  }
622
625
  return true;
623
- } catch (error) {
626
+ } catch {
624
627
  return false;
625
628
  }
626
629
  }
@@ -831,7 +834,7 @@ async function installSinglePackage(pkg, pm, index, total) {
831
834
  const spinner = createSpinner(`${chalk.dim(progress)} Installing ${chalk.cyan(pkg.name)}...`);
832
835
  spinner.start();
833
836
  return new Promise((resolve) => {
834
- const [cmd, ...args] = command.split(" ");
837
+ const [cmd = pm, ...args] = command.split(" ");
835
838
  const proc = spawn(cmd, args, {
836
839
  shell: true,
837
840
  cwd: process.cwd(),
@@ -867,13 +870,13 @@ async function installPackagesWithProgress(packages) {
867
870
  console.log(chalk.bold(` Installing ${total} package${total > 1 ? "s" : ""}...`));
868
871
  console.log("");
869
872
  let successCount = 0;
870
- let failedPackages = [];
871
- for (let i = 0; i < packages.length; i++) {
872
- const success = await installSinglePackage(packages[i], pm, i, total);
873
+ const failedPackages = [];
874
+ for (const [i, pkg] of packages.entries()) {
875
+ const success = await installSinglePackage(pkg, pm, i, total);
873
876
  if (success) {
874
877
  successCount++;
875
878
  } else {
876
- failedPackages.push(packages[i].name);
879
+ failedPackages.push(pkg.name);
877
880
  }
878
881
  }
879
882
  console.log("");
@@ -1238,12 +1241,12 @@ async function updatePackagesWithProgress(packages) {
1238
1241
  console.log("");
1239
1242
  let successCount = 0;
1240
1243
  const failedPackages = [];
1241
- for (let i = 0; i < packages.length; i++) {
1242
- const success = await updateSinglePackage(packages[i], pm, i, total);
1244
+ for (const [i, pkg] of packages.entries()) {
1245
+ const success = await updateSinglePackage(pkg, pm, i, total);
1243
1246
  if (success) {
1244
1247
  successCount++;
1245
1248
  } else {
1246
- failedPackages.push(packages[i].name);
1249
+ failedPackages.push(pkg.name);
1247
1250
  }
1248
1251
  }
1249
1252
  console.log("");
@@ -1499,22 +1502,17 @@ function resetDevStartupState() {
1499
1502
  }
1500
1503
 
1501
1504
  // src/config/utils/deepMerge.ts
1505
+ function isPlainObject(value) {
1506
+ return typeof value === "object" && value !== null && !Array.isArray(value);
1507
+ }
1502
1508
  function deepMerge(target, source) {
1503
1509
  const output = { ...target };
1504
- for (const key in source) {
1505
- if (source[key] === void 0) continue;
1506
- if (Array.isArray(source[key])) {
1507
- output[key] = source[key];
1508
- } else if (source[key] && typeof source[key] === "object" && !Array.isArray(source[key])) {
1509
- const targetValue = output[key];
1510
- if (targetValue && typeof targetValue === "object" && !Array.isArray(targetValue)) {
1511
- output[key] = deepMerge(targetValue, source[key]);
1512
- } else {
1513
- output[key] = source[key];
1514
- }
1515
- } else {
1516
- output[key] = source[key];
1517
- }
1510
+ for (const key of Object.keys(source)) {
1511
+ const sourceValue = source[key];
1512
+ if (sourceValue === void 0) continue;
1513
+ const targetValue = output[key];
1514
+ const merged = isPlainObject(sourceValue) && isPlainObject(targetValue) ? deepMerge(targetValue, sourceValue) : sourceValue;
1515
+ output[key] = merged;
1518
1516
  }
1519
1517
  return output;
1520
1518
  }
@@ -1724,23 +1722,28 @@ function createBaseNextConfig(options = {}) {
1724
1722
  return config;
1725
1723
  }
1726
1724
  };
1727
- const {
1728
- i18n: i18nOptions,
1729
- pwa: pwaOptions,
1730
- transpilePackages,
1731
- optimizePackageImports,
1732
- isDefaultCfgAdmin,
1733
- checkUpdates,
1734
- autoUpdate,
1735
- forceCheckWorkspace,
1736
- checkPackages: checkPackages2,
1737
- autoInstall,
1738
- allowIframeFrom,
1739
- dpop,
1740
- stripe,
1741
- csp,
1742
- ...nextConfigOptions
1743
- } = options;
1725
+ const { i18n: i18nOptions, pwa: pwaOptions } = options;
1726
+ const DJANGOCFG_ONLY_KEYS = [
1727
+ "i18n",
1728
+ "pwa",
1729
+ "transpilePackages",
1730
+ "optimizePackageImports",
1731
+ "isDefaultCfgAdmin",
1732
+ "checkUpdates",
1733
+ "autoUpdate",
1734
+ "forceCheckWorkspace",
1735
+ "checkPackages",
1736
+ "autoInstall",
1737
+ "allowIframeFrom",
1738
+ "dpop",
1739
+ "stripe",
1740
+ "csp"
1741
+ ];
1742
+ const nextConfigOptions = Object.fromEntries(
1743
+ Object.entries(options).filter(
1744
+ ([key]) => !DJANGOCFG_ONLY_KEYS.includes(key)
1745
+ )
1746
+ );
1744
1747
  let finalConfig = deepMerge(baseConfig, nextConfigOptions);
1745
1748
  if (pwaOptions) {
1746
1749
  finalConfig = withPWA(finalConfig, pwaOptions);