@djangocfg/nextjs 2.1.541 → 2.1.543

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
+ name?: string | undefined;
28
+ maxAge?: number | undefined | undefined;
29
+ priority?: "low" | "medium" | "high" | undefined | undefined;
30
+ domain?: string | undefined | undefined;
31
+ path?: string | undefined | undefined;
32
+ secure?: boolean | undefined | undefined;
33
+ sameSite?: true | false | "lax" | "strict" | "none" | undefined | undefined;
34
+ partitioned?: boolean | undefined | 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
+ name?: string | undefined;
50
+ maxAge?: number | undefined | undefined;
51
+ priority?: "low" | "medium" | "high" | undefined | undefined;
52
+ domain?: string | undefined | undefined;
53
+ path?: string | undefined | undefined;
54
+ secure?: boolean | undefined | undefined;
55
+ sameSite?: true | false | "lax" | "strict" | "none" | undefined | undefined;
56
+ partitioned?: boolean | undefined | 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;
@@ -309,7 +312,6 @@ var DJANGOCFG_PACKAGES = [
309
312
  "@djangocfg/layouts",
310
313
  "@djangocfg/nextjs",
311
314
  "@djangocfg/api",
312
- "@djangocfg/centrifugo",
313
315
  "@djangocfg/eslint-config",
314
316
  "@djangocfg/typescript-config"
315
317
  ];
@@ -317,12 +319,26 @@ var DEFAULT_TRANSPILE_PACKAGES = [
317
319
  "@djangocfg/i18n",
318
320
  "@djangocfg/ui-core",
319
321
  "@djangocfg/layouts",
320
- "@djangocfg/ui-tools",
321
322
  "@djangocfg/api",
322
323
  "@djangocfg/analytics",
323
- "@djangocfg/centrifugo",
324
324
  "@djangocfg/devtools",
325
- "@djangocfg/payments"
325
+ "@djangocfg/payments",
326
+ "@djangocfg/widget-agent",
327
+ "@djangocfg/widget-avatar",
328
+ "@djangocfg/widget-charts",
329
+ "@djangocfg/widget-chat",
330
+ "@djangocfg/widget-code",
331
+ "@djangocfg/widget-data",
332
+ "@djangocfg/widget-diagram",
333
+ "@djangocfg/widget-editor",
334
+ "@djangocfg/widget-forms",
335
+ "@djangocfg/widget-kit",
336
+ "@djangocfg/widget-map",
337
+ "@djangocfg/widget-media",
338
+ "@djangocfg/widget-ogimage",
339
+ "@djangocfg/widget-overlay",
340
+ "@djangocfg/widget-player",
341
+ "@djangocfg/widget-visual"
326
342
  ];
327
343
  var DEFAULT_OPTIMIZE_PACKAGES = [
328
344
  "@djangocfg/ui-core",
@@ -607,7 +623,7 @@ function addCompressionPlugins(config, options = {}) {
607
623
  );
608
624
  }
609
625
  return true;
610
- } catch (error) {
626
+ } catch {
611
627
  return false;
612
628
  }
613
629
  }
@@ -818,7 +834,7 @@ async function installSinglePackage(pkg, pm, index, total) {
818
834
  const spinner = createSpinner(`${chalk.dim(progress)} Installing ${chalk.cyan(pkg.name)}...`);
819
835
  spinner.start();
820
836
  return new Promise((resolve) => {
821
- const [cmd, ...args] = command.split(" ");
837
+ const [cmd = pm, ...args] = command.split(" ");
822
838
  const proc = spawn(cmd, args, {
823
839
  shell: true,
824
840
  cwd: process.cwd(),
@@ -854,13 +870,13 @@ async function installPackagesWithProgress(packages) {
854
870
  console.log(chalk.bold(` Installing ${total} package${total > 1 ? "s" : ""}...`));
855
871
  console.log("");
856
872
  let successCount = 0;
857
- let failedPackages = [];
858
- for (let i = 0; i < packages.length; i++) {
859
- 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);
860
876
  if (success) {
861
877
  successCount++;
862
878
  } else {
863
- failedPackages.push(packages[i].name);
879
+ failedPackages.push(pkg.name);
864
880
  }
865
881
  }
866
882
  console.log("");
@@ -1225,12 +1241,12 @@ async function updatePackagesWithProgress(packages) {
1225
1241
  console.log("");
1226
1242
  let successCount = 0;
1227
1243
  const failedPackages = [];
1228
- for (let i = 0; i < packages.length; i++) {
1229
- 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);
1230
1246
  if (success) {
1231
1247
  successCount++;
1232
1248
  } else {
1233
- failedPackages.push(packages[i].name);
1249
+ failedPackages.push(pkg.name);
1234
1250
  }
1235
1251
  }
1236
1252
  console.log("");
@@ -1486,22 +1502,17 @@ function resetDevStartupState() {
1486
1502
  }
1487
1503
 
1488
1504
  // src/config/utils/deepMerge.ts
1505
+ function isPlainObject(value) {
1506
+ return typeof value === "object" && value !== null && !Array.isArray(value);
1507
+ }
1489
1508
  function deepMerge(target, source) {
1490
1509
  const output = { ...target };
1491
- for (const key in source) {
1492
- if (source[key] === void 0) continue;
1493
- if (Array.isArray(source[key])) {
1494
- output[key] = source[key];
1495
- } else if (source[key] && typeof source[key] === "object" && !Array.isArray(source[key])) {
1496
- const targetValue = output[key];
1497
- if (targetValue && typeof targetValue === "object" && !Array.isArray(targetValue)) {
1498
- output[key] = deepMerge(targetValue, source[key]);
1499
- } else {
1500
- output[key] = source[key];
1501
- }
1502
- } else {
1503
- output[key] = source[key];
1504
- }
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;
1505
1516
  }
1506
1517
  return output;
1507
1518
  }
@@ -1590,7 +1601,7 @@ function createBaseNextConfig(options = {}) {
1590
1601
  "style-src 'self' 'unsafe-inline'",
1591
1602
  imgSrc,
1592
1603
  `font-src 'self' data:${extraFont}`,
1593
- // API/websocket calls go cross-origin to Django/Centrifugo.
1604
+ // API calls go cross-origin to Django.
1594
1605
  connectSrc,
1595
1606
  // Declared vendors (Stripe Elements/Checkout, video embeds…) and any
1596
1607
  // app-declared trusted origins mount iframes; add their hosts here.
@@ -1711,23 +1722,28 @@ function createBaseNextConfig(options = {}) {
1711
1722
  return config;
1712
1723
  }
1713
1724
  };
1714
- const {
1715
- i18n: i18nOptions,
1716
- pwa: pwaOptions,
1717
- transpilePackages,
1718
- optimizePackageImports,
1719
- isDefaultCfgAdmin,
1720
- checkUpdates,
1721
- autoUpdate,
1722
- forceCheckWorkspace,
1723
- checkPackages: checkPackages2,
1724
- autoInstall,
1725
- allowIframeFrom,
1726
- dpop,
1727
- stripe,
1728
- csp,
1729
- ...nextConfigOptions
1730
- } = 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
+ );
1731
1747
  let finalConfig = deepMerge(baseConfig, nextConfigOptions);
1732
1748
  if (pwaOptions) {
1733
1749
  finalConfig = withPWA(finalConfig, pwaOptions);