@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.
- package/README.md +3 -2
- package/dist/config/index.d.mts +32 -16
- package/dist/config/index.mjs +58 -45
- package/dist/config/index.mjs.map +1 -1
- package/dist/health/index.d.mts +1 -1
- package/dist/health/index.mjs +5 -2
- package/dist/health/index.mjs.map +1 -1
- package/dist/i18n/routing.d.mts +20 -20
- package/dist/i18n/server.d.mts +2 -2
- package/dist/index.d.mts +1 -1
- package/dist/index.mjs +63 -47
- package/dist/index.mjs.map +1 -1
- package/dist/pwa/index.mjs +6 -5
- package/dist/pwa/index.mjs.map +1 -1
- package/dist/pwa/manifest.d.mts +1 -1
- package/dist/pwa/manifest.mjs +6 -5
- package/dist/pwa/manifest.mjs.map +1 -1
- package/dist/pwa/worker/index.mjs.map +1 -1
- package/dist/sitemap/index.d.mts +1 -1
- package/dist/{types-l9x1Rkmf.d.mts → types-CMxSgWnS.d.mts} +2 -0
- package/package.json +9 -9
- package/src/config/constants.ts +21 -4
- package/src/config/createNextConfig.ts +51 -28
- package/src/config/csp.ts +8 -5
- package/src/config/packages/installer.ts +11 -7
- package/src/config/packages/updater.ts +6 -6
- package/src/config/plugins/compression.ts +1 -1
- package/src/config/utils/deepMerge.ts +25 -21
- package/src/config/utils/version.ts +3 -3
- package/src/health/route.ts +5 -2
- package/src/pwa/manifest.ts +11 -8
- package/src/pwa/worker/index.ts +9 -7
- package/src/types.ts +2 -0
package/dist/health/index.d.mts
CHANGED
package/dist/health/index.mjs
CHANGED
|
@@ -14,7 +14,7 @@ function createHealthHandler(config = {}) {
|
|
|
14
14
|
if (!result) {
|
|
15
15
|
status = "error";
|
|
16
16
|
}
|
|
17
|
-
} catch
|
|
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
|
-
...
|
|
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
|
|
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":[]}
|
package/dist/i18n/routing.d.mts
CHANGED
|
@@ -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?:
|
|
24
|
+
localePrefix?: next_intl_routing.LocalePrefix<string[], "always" | "as-needed" | "never"> | undefined;
|
|
25
|
+
domains?: undefined;
|
|
26
26
|
localeCookie?: boolean | {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
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?:
|
|
46
|
+
localePrefix?: next_intl_routing.LocalePrefix<string[], "always" | "as-needed" | "never"> | undefined;
|
|
47
|
+
domains?: undefined;
|
|
48
48
|
localeCookie?: boolean | {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
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;
|
package/dist/i18n/server.d.mts
CHANGED
|
@@ -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-
|
|
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
|
|
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
|
-
...
|
|
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
|
|
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
|
-
|
|
858
|
-
for (
|
|
859
|
-
const success = await installSinglePackage(
|
|
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(
|
|
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 (
|
|
1229
|
-
const success = await updateSinglePackage(
|
|
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(
|
|
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
|
|
1492
|
-
|
|
1493
|
-
if (
|
|
1494
|
-
|
|
1495
|
-
|
|
1496
|
-
|
|
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
|
|
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
|
-
|
|
1716
|
-
|
|
1717
|
-
|
|
1718
|
-
|
|
1719
|
-
|
|
1720
|
-
|
|
1721
|
-
|
|
1722
|
-
|
|
1723
|
-
|
|
1724
|
-
|
|
1725
|
-
|
|
1726
|
-
|
|
1727
|
-
|
|
1728
|
-
|
|
1729
|
-
|
|
1730
|
-
|
|
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);
|