@carlonicora/nextjs-jsonapi 3.3.1 → 3.3.2

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.
Files changed (70) hide show
  1. package/dist/{BlockNoteEditor-G5A34EXN.mjs → BlockNoteEditor-SDVXTZRC.mjs} +5 -5
  2. package/dist/{BlockNoteEditor-JLMXCPGB.js → BlockNoteEditor-VV6DRWSA.js} +20 -20
  3. package/dist/{BlockNoteEditor-JLMXCPGB.js.map → BlockNoteEditor-VV6DRWSA.js.map} +1 -1
  4. package/dist/{JsonApiRequest-2OQCZAK6.mjs → JsonApiRequest-ADNIGXTP.mjs} +2 -2
  5. package/dist/JsonApiRequest-WWGSGV2I.js +26 -0
  6. package/dist/{JsonApiRequest-6TYNBVUL.js.map → JsonApiRequest-WWGSGV2I.js.map} +1 -1
  7. package/dist/billing/index.js +399 -399
  8. package/dist/billing/index.mjs +4 -4
  9. package/dist/{chunk-5AKDE5UW.js → chunk-4I3UORNT.js} +941 -938
  10. package/dist/chunk-4I3UORNT.js.map +1 -0
  11. package/dist/{chunk-PGARO3JT.mjs → chunk-KW6LYVFJ.mjs} +8 -7
  12. package/dist/chunk-KW6LYVFJ.mjs.map +1 -0
  13. package/dist/{chunk-UYENG3GT.js → chunk-OHG2YWNA.js} +22 -27
  14. package/dist/chunk-OHG2YWNA.js.map +1 -0
  15. package/dist/{chunk-LCMVARSP.mjs → chunk-RUEY6XSS.mjs} +8 -13
  16. package/dist/chunk-RUEY6XSS.mjs.map +1 -0
  17. package/dist/{chunk-CMGXH5SA.mjs → chunk-RVASYIQG.mjs} +47 -3
  18. package/dist/chunk-RVASYIQG.mjs.map +1 -0
  19. package/dist/{chunk-YKFXQOQA.js → chunk-S2C5V2XZ.js} +33 -32
  20. package/dist/chunk-S2C5V2XZ.js.map +1 -0
  21. package/dist/{chunk-PFAZPP54.js → chunk-W42MYR3Y.js} +59 -15
  22. package/dist/chunk-W42MYR3Y.js.map +1 -0
  23. package/dist/{chunk-O4LTJAAM.mjs → chunk-WPF4NFVV.mjs} +15 -12
  24. package/dist/{chunk-O4LTJAAM.mjs.map → chunk-WPF4NFVV.mjs.map} +1 -1
  25. package/dist/client/index.js +5 -5
  26. package/dist/client/index.mjs +4 -4
  27. package/dist/components/index.js +5 -5
  28. package/dist/components/index.mjs +4 -4
  29. package/dist/contexts/index.js +5 -5
  30. package/dist/contexts/index.mjs +4 -4
  31. package/dist/core/index.d.mts +59 -1
  32. package/dist/core/index.d.ts +59 -1
  33. package/dist/core/index.js +5 -3
  34. package/dist/core/index.js.map +1 -1
  35. package/dist/core/index.mjs +4 -2
  36. package/dist/features/help/index.js +38 -38
  37. package/dist/features/help/index.mjs +4 -4
  38. package/dist/features/tokenusage/index.js +102 -102
  39. package/dist/features/tokenusage/index.mjs +4 -4
  40. package/dist/index.d.mts +1 -1
  41. package/dist/index.d.ts +1 -1
  42. package/dist/index.js +6 -4
  43. package/dist/index.js.map +1 -1
  44. package/dist/index.mjs +5 -3
  45. package/dist/server/index.js +15 -14
  46. package/dist/server/index.js.map +1 -1
  47. package/dist/server/index.mjs +5 -4
  48. package/dist/server/index.mjs.map +1 -1
  49. package/package.json +1 -1
  50. package/src/client/JsonApiClient.ts +3 -2
  51. package/src/client/config.ts +5 -10
  52. package/src/components/forms/FormPlaceAutocomplete.tsx +2 -1
  53. package/src/core/env.ts +73 -0
  54. package/src/core/index.ts +1 -0
  55. package/src/features/auth/utils/AuthCookies.ts +2 -1
  56. package/src/features/company/components/forms/CompanyEditor.tsx +2 -1
  57. package/src/hooks/usePushNotifications.ts +2 -1
  58. package/src/hooks/useSocket.ts +4 -3
  59. package/src/server/JsonApiServer.ts +3 -2
  60. package/src/unified/JsonApiRequest.ts +3 -2
  61. package/dist/JsonApiRequest-6TYNBVUL.js +0 -26
  62. package/dist/chunk-5AKDE5UW.js.map +0 -1
  63. package/dist/chunk-CMGXH5SA.mjs.map +0 -1
  64. package/dist/chunk-LCMVARSP.mjs.map +0 -1
  65. package/dist/chunk-PFAZPP54.js.map +0 -1
  66. package/dist/chunk-PGARO3JT.mjs.map +0 -1
  67. package/dist/chunk-UYENG3GT.js.map +0 -1
  68. package/dist/chunk-YKFXQOQA.js.map +0 -1
  69. /package/dist/{BlockNoteEditor-G5A34EXN.mjs.map → BlockNoteEditor-SDVXTZRC.mjs.map} +0 -0
  70. /package/dist/{JsonApiRequest-2OQCZAK6.mjs.map → JsonApiRequest-ADNIGXTP.mjs.map} +0 -0
@@ -2,6 +2,49 @@
2
2
 
3
3
  var _chunk7QVYU63Ejs = require('./chunk-7QVYU63E.js');
4
4
 
5
+ // src/core/env.ts
6
+ var ENV = {
7
+ /** Public API base URL (NEXT_PUBLIC_API_URL). Empty when unset. */
8
+ get API_URL() {
9
+ return _nullishCoalesce(process.env.NEXT_PUBLIC_API_URL, () => ( ""));
10
+ },
11
+ /** Public app base URL (NEXT_PUBLIC_ADDRESS). Empty when unset. */
12
+ get APP_URL() {
13
+ return _nullishCoalesce(process.env.NEXT_PUBLIC_ADDRESS, () => ( ""));
14
+ },
15
+ /**
16
+ * Alternative app base URL (NEXT_PUBLIC_APP_URL), used only by
17
+ * `client/config.ts`'s `getAppUrl()` before it falls back to
18
+ * `window.location.origin`. Empty when unset.
19
+ */
20
+ get APP_URL_ALTERNATE() {
21
+ return _nullishCoalesce(process.env.NEXT_PUBLIC_APP_URL, () => ( ""));
22
+ },
23
+ /** Web-push VAPID public key (NEXT_PUBLIC_VAPID_PUBLIC_KEY). Empty when unset. */
24
+ get VAPID_PUBLIC_KEY() {
25
+ return _nullishCoalesce(process.env.NEXT_PUBLIC_VAPID_PUBLIC_KEY, () => ( ""));
26
+ },
27
+ /** Google Maps JS key (NEXT_PUBLIC_GOOGLE_MAPS_API_KEY). Empty disables autocomplete. */
28
+ get GOOGLE_MAPS_API_KEY() {
29
+ return _nullishCoalesce(process.env.NEXT_PUBLIC_GOOGLE_MAPS_API_KEY, () => ( ""));
30
+ },
31
+ /**
32
+ * NEXT_PUBLIC_PRIVATE_INSTALLATION === "true", case-insensitively
33
+ * (default false). A private installation is a single-tenant deployment.
34
+ */
35
+ get PRIVATE_INSTALLATION() {
36
+ return _optionalChain([process, 'access', _ => _.env, 'access', _2 => _2.NEXT_PUBLIC_PRIVATE_INSTALLATION, 'optionalAccess', _3 => _3.toLowerCase, 'call', _4 => _4()]) === "true";
37
+ },
38
+ /** NODE_ENV === "production" — set by the Next build, not by `.env`. */
39
+ get IS_PRODUCTION() {
40
+ return process.env.NODE_ENV === "production";
41
+ },
42
+ /** NODE_ENV === "development" — gates verbose client-side diagnostics. */
43
+ get IS_DEVELOPMENT() {
44
+ return process.env.NODE_ENV === "development";
45
+ }
46
+ };
47
+
5
48
  // src/core/registry/DataClassRegistry.ts
6
49
  var DataClassRegistry = (_class = class {
7
50
  static {
@@ -169,14 +212,14 @@ async function translateResponse(params) {
169
212
  response.ok = params.apiResponse.ok;
170
213
  response.response = params.apiResponse.status;
171
214
  if (!params.apiResponse.ok) {
172
- response.error = _nullishCoalesce(_nullishCoalesce(_optionalChain([params, 'access', _ => _.apiResponse, 'optionalAccess', _2 => _2.data, 'optionalAccess', _3 => _3.message]), () => ( _optionalChain([params, 'access', _4 => _4.apiResponse, 'optionalAccess', _5 => _5.data, 'optionalAccess', _6 => _6.error]))), () => ( params.apiResponse.statusText));
215
+ response.error = _nullishCoalesce(_nullishCoalesce(_optionalChain([params, 'access', _5 => _5.apiResponse, 'optionalAccess', _6 => _6.data, 'optionalAccess', _7 => _7.message]), () => ( _optionalChain([params, 'access', _8 => _8.apiResponse, 'optionalAccess', _9 => _9.data, 'optionalAccess', _10 => _10.error]))), () => ( params.apiResponse.statusText));
173
216
  response.raw = params.apiResponse.data;
174
217
  return response;
175
218
  }
176
219
  if (params.apiResponse.status === 204) return response;
177
220
  if (params.apiResponse.data === void 0 || params.apiResponse.data === null) return response;
178
221
  response.raw = params.apiResponse.data;
179
- if (_optionalChain([params, 'access', _7 => _7.apiResponse, 'access', _8 => _8.data, 'optionalAccess', _9 => _9.meta])) {
222
+ if (_optionalChain([params, 'access', _11 => _11.apiResponse, 'access', _12 => _12.data, 'optionalAccess', _13 => _13.meta])) {
180
223
  response.meta = params.apiResponse.data.meta;
181
224
  }
182
225
  try {
@@ -285,10 +328,10 @@ async function makeRequest(params) {
285
328
  }
286
329
  _chunk7QVYU63Ejs.__name.call(void 0, makeRequest, "makeRequest");
287
330
  function getApiUrl() {
288
- if (_optionalChain([_staticConfig, 'optionalAccess', _10 => _10.apiUrl])) {
331
+ if (_optionalChain([_staticConfig, 'optionalAccess', _14 => _14.apiUrl])) {
289
332
  return _staticConfig.apiUrl;
290
333
  }
291
- const envUrl = process.env.NEXT_PUBLIC_API_URL;
334
+ const envUrl = ENV.API_URL;
292
335
  if (!envUrl) {
293
336
  throw new Error("API URL not configured. Use configureJsonApi() or set NEXT_PUBLIC_API_URL environment variable.");
294
337
  }
@@ -296,10 +339,10 @@ function getApiUrl() {
296
339
  }
297
340
  _chunk7QVYU63Ejs.__name.call(void 0, getApiUrl, "getApiUrl");
298
341
  function getAppUrl() {
299
- if (_optionalChain([_staticConfig, 'optionalAccess', _11 => _11.appUrl])) {
342
+ if (_optionalChain([_staticConfig, 'optionalAccess', _15 => _15.appUrl])) {
300
343
  return _staticConfig.appUrl;
301
344
  }
302
- const envUrl = process.env.NEXT_PUBLIC_ADDRESS;
345
+ const envUrl = ENV.APP_URL;
303
346
  if (!envUrl) {
304
347
  throw new Error(
305
348
  "App URL not configured. Use configureJsonApi({ appUrl }) or set NEXT_PUBLIC_ADDRESS environment variable."
@@ -309,11 +352,11 @@ function getAppUrl() {
309
352
  }
310
353
  _chunk7QVYU63Ejs.__name.call(void 0, getAppUrl, "getAppUrl");
311
354
  function getTrackablePages() {
312
- return _nullishCoalesce(_optionalChain([_staticConfig, 'optionalAccess', _12 => _12.trackablePages]), () => ( []));
355
+ return _nullishCoalesce(_optionalChain([_staticConfig, 'optionalAccess', _16 => _16.trackablePages]), () => ( []));
313
356
  }
314
357
  _chunk7QVYU63Ejs.__name.call(void 0, getTrackablePages, "getTrackablePages");
315
358
  function runBootstrapper() {
316
- if (_optionalChain([_staticConfig, 'optionalAccess', _13 => _13.bootstrapper])) {
359
+ if (_optionalChain([_staticConfig, 'optionalAccess', _17 => _17.bootstrapper])) {
317
360
  _staticConfig.bootstrapper();
318
361
  }
319
362
  }
@@ -334,7 +377,7 @@ async function JsonApiGet(params) {
334
377
  cache: params.classKey.cache,
335
378
  companyId: params.companyId,
336
379
  language: params.language,
337
- additionalHeaders: _optionalChain([_staticConfig, 'optionalAccess', _14 => _14.additionalHeaders])
380
+ additionalHeaders: _optionalChain([_staticConfig, 'optionalAccess', _18 => _18.additionalHeaders])
338
381
  });
339
382
  return translateResponse({
340
383
  classKey: params.classKey,
@@ -369,7 +412,7 @@ async function JsonApiPost(params) {
369
412
  files: params.files,
370
413
  companyId: params.companyId,
371
414
  language: params.language,
372
- additionalHeaders: _optionalChain([_staticConfig, 'optionalAccess', _15 => _15.additionalHeaders])
415
+ additionalHeaders: _optionalChain([_staticConfig, 'optionalAccess', _19 => _19.additionalHeaders])
373
416
  });
374
417
  return translateResponse({
375
418
  classKey: _nullishCoalesce(params.responseType, () => ( params.classKey)),
@@ -396,7 +439,7 @@ async function JsonApiPut(params) {
396
439
  files: params.files,
397
440
  companyId: params.companyId,
398
441
  language: params.language,
399
- additionalHeaders: _optionalChain([_staticConfig, 'optionalAccess', _16 => _16.additionalHeaders])
442
+ additionalHeaders: _optionalChain([_staticConfig, 'optionalAccess', _20 => _20.additionalHeaders])
400
443
  });
401
444
  return translateResponse({
402
445
  classKey: _nullishCoalesce(params.responseType, () => ( params.classKey)),
@@ -423,7 +466,7 @@ async function JsonApiPatch(params) {
423
466
  files: params.files,
424
467
  companyId: params.companyId,
425
468
  language: params.language,
426
- additionalHeaders: _optionalChain([_staticConfig, 'optionalAccess', _17 => _17.additionalHeaders])
469
+ additionalHeaders: _optionalChain([_staticConfig, 'optionalAccess', _21 => _21.additionalHeaders])
427
470
  });
428
471
  return translateResponse({
429
472
  classKey: _nullishCoalesce(params.responseType, () => ( params.classKey)),
@@ -442,7 +485,7 @@ async function JsonApiDelete(params) {
442
485
  token,
443
486
  companyId: params.companyId,
444
487
  language: params.language,
445
- additionalHeaders: _optionalChain([_staticConfig, 'optionalAccess', _18 => _18.additionalHeaders])
488
+ additionalHeaders: _optionalChain([_staticConfig, 'optionalAccess', _22 => _22.additionalHeaders])
446
489
  });
447
490
  return translateResponse({
448
491
  classKey: _nullishCoalesce(params.responseType, () => ( params.classKey)),
@@ -473,5 +516,6 @@ _chunk7QVYU63Ejs.__name.call(void 0, JsonApiDelete, "JsonApiDelete");
473
516
 
474
517
 
475
518
 
476
- exports.DataClassRegistry = DataClassRegistry; exports.JsonApiDataFactory = JsonApiDataFactory; exports.setBootstrapper = setBootstrapper; exports.getBootstrapper = getBootstrapper; exports.tryBootstrap = tryBootstrap; exports.hasBootstrapper = hasBootstrapper; exports.resetBootstrapStore = resetBootstrapStore; exports.translateData = translateData; exports.translateResponse = translateResponse; exports.configureJsonApi = configureJsonApi; exports.getApiUrl = getApiUrl; exports.getAppUrl = getAppUrl; exports.getTrackablePages = getTrackablePages; exports.buildUrl = buildUrl; exports.JsonApiGet = JsonApiGet; exports.JsonApiPost = JsonApiPost; exports.JsonApiPut = JsonApiPut; exports.JsonApiPatch = JsonApiPatch; exports.JsonApiDelete = JsonApiDelete;
477
- //# sourceMappingURL=chunk-PFAZPP54.js.map
519
+
520
+ exports.ENV = ENV; exports.DataClassRegistry = DataClassRegistry; exports.JsonApiDataFactory = JsonApiDataFactory; exports.setBootstrapper = setBootstrapper; exports.getBootstrapper = getBootstrapper; exports.tryBootstrap = tryBootstrap; exports.hasBootstrapper = hasBootstrapper; exports.resetBootstrapStore = resetBootstrapStore; exports.translateData = translateData; exports.translateResponse = translateResponse; exports.configureJsonApi = configureJsonApi; exports.getApiUrl = getApiUrl; exports.getAppUrl = getAppUrl; exports.getTrackablePages = getTrackablePages; exports.buildUrl = buildUrl; exports.JsonApiGet = JsonApiGet; exports.JsonApiPost = JsonApiPost; exports.JsonApiPut = JsonApiPut; exports.JsonApiPatch = JsonApiPatch; exports.JsonApiDelete = JsonApiDelete;
521
+ //# sourceMappingURL=chunk-W42MYR3Y.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/nextjs-jsonapi/nextjs-jsonapi/dist/chunk-W42MYR3Y.js","../src/core/env.ts","../src/core/registry/DataClassRegistry.ts","../src/core/factories/JsonApiDataFactory.ts","../src/core/registry/bootstrapStore.ts","../src/core/utils/translateResponse.ts","../src/unified/JsonApiRequest.ts"],"names":[],"mappings":"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","file":"/home/runner/work/nextjs-jsonapi/nextjs-jsonapi/dist/chunk-W42MYR3Y.js","sourcesContent":[null,"/**\n * The single place in this package that reads `process.env`.\n *\n * Everything else imports {@link ENV}. Centralising the reads keeps every\n * default in one place — the same contract `base.config.ts` provides on the\n * NestJS side — instead of scattering `process.env.X || \"…\"` across hooks,\n * clients and components where the fallbacks silently drift apart.\n *\n * WHY THE READS MUST STAY LITERAL: Next.js inlines `NEXT_PUBLIC_*` by textual\n * substitution at build time, replacing the exact expression\n * `process.env.NEXT_PUBLIC_FOO` with a string literal. A computed lookup\n * (`process.env[key]`) is NOT substituted and reads as `undefined` in the\n * browser bundle. Every entry below therefore spells its variable out in full,\n * and new entries must do the same.\n *\n * WHY GETTERS AND NOT PLAIN PROPERTIES: every call site this replaced read\n * `process.env` at CALL time, not at import time. A plain property would freeze\n * the value when the module is first imported, which breaks any consumer that\n * assigns the variable after boot — the package's own tests do exactly that.\n * Getters keep the read lazy while leaving the expression literal, so the build\n * time substitution still applies.\n *\n * Because that substitution happens before the code runs, no reference to\n * `process` survives into the client bundle — so this module is safe to import\n * from client components, server components, route handlers and middleware\n * alike. It deliberately carries no `\"use client\"` directive for that reason.\n *\n * Values are normalised (empty string rather than `undefined`, booleans rather\n * than string comparisons) so callers never repeat the parsing. Callers that\n * must distinguish \"unset\" from \"set to empty\" — the URL getters, which throw a\n * configuration error — check for an empty string.\n */\nexport const ENV = {\n /** Public API base URL (NEXT_PUBLIC_API_URL). Empty when unset. */\n get API_URL(): string {\n return process.env.NEXT_PUBLIC_API_URL ?? \"\";\n },\n /** Public app base URL (NEXT_PUBLIC_ADDRESS). Empty when unset. */\n get APP_URL(): string {\n return process.env.NEXT_PUBLIC_ADDRESS ?? \"\";\n },\n /**\n * Alternative app base URL (NEXT_PUBLIC_APP_URL), used only by\n * `client/config.ts`'s `getAppUrl()` before it falls back to\n * `window.location.origin`. Empty when unset.\n */\n get APP_URL_ALTERNATE(): string {\n return process.env.NEXT_PUBLIC_APP_URL ?? \"\";\n },\n /** Web-push VAPID public key (NEXT_PUBLIC_VAPID_PUBLIC_KEY). Empty when unset. */\n get VAPID_PUBLIC_KEY(): string {\n return process.env.NEXT_PUBLIC_VAPID_PUBLIC_KEY ?? \"\";\n },\n /** Google Maps JS key (NEXT_PUBLIC_GOOGLE_MAPS_API_KEY). Empty disables autocomplete. */\n get GOOGLE_MAPS_API_KEY(): string {\n return process.env.NEXT_PUBLIC_GOOGLE_MAPS_API_KEY ?? \"\";\n },\n /**\n * NEXT_PUBLIC_PRIVATE_INSTALLATION === \"true\", case-insensitively\n * (default false). A private installation is a single-tenant deployment.\n */\n get PRIVATE_INSTALLATION(): boolean {\n return process.env.NEXT_PUBLIC_PRIVATE_INSTALLATION?.toLowerCase() === \"true\";\n },\n /** NODE_ENV === \"production\" — set by the Next build, not by `.env`. */\n get IS_PRODUCTION(): boolean {\n return process.env.NODE_ENV === \"production\";\n },\n /** NODE_ENV === \"development\" — gates verbose client-side diagnostics. */\n get IS_DEVELOPMENT(): boolean {\n return process.env.NODE_ENV === \"development\";\n },\n};\n","import { ApiDataInterface } from \"../interfaces/ApiDataInterface\";\nimport { ApiRequestDataTypeInterface } from \"../interfaces/ApiRequestDataTypeInterface\";\n\nexport class DataClassRegistry {\n // Use Map with string key (module.name) for reliable lookup\n // String keys are stable across HMR and module re-evaluations\n // Note: WeakMap with object identity was tried but fails during Next.js navigation\n // because module re-evaluation creates new object instances with different identity\n private static _map = new Map<string, { new (): ApiDataInterface }>();\n\n public static registerObjectClass(\n key: ApiRequestDataTypeInterface,\n classConstructor: { new (): ApiDataInterface },\n ): void {\n const classKey = key.name;\n if (!this._map.has(classKey)) {\n this._map.set(classKey, classConstructor);\n }\n }\n\n public static get(classKey: ApiRequestDataTypeInterface): {\n new (): ApiDataInterface;\n } {\n const response = this._map.get(classKey.name);\n if (!response) {\n throw new Error(\n `Class not registered for key: ${typeof classKey === \"string\" ? classKey : classKey.name}. Ensure bootstrap() was called.`,\n );\n }\n\n return response;\n }\n\n /**\n * Get class constructor by JSON:API type name.\n * Used for polymorphic rehydration where the type is determined at runtime.\n */\n public static getByJsonApiType(typeName: string): { new (): ApiDataInterface } | undefined {\n return this._map.get(typeName);\n }\n\n /**\n * Bootstrap the registry with all modules.\n * This is a convenience method for apps to register all their modules at once.\n *\n * @param modules - An object with module definitions (like the app's Modules class)\n */\n public static bootstrap(modules: Record<string, ApiRequestDataTypeInterface>): void {\n Object.values(modules).forEach((module) => {\n if (module && module.model) {\n this.registerObjectClass(module, module.model);\n }\n });\n }\n\n /**\n * Clear all registered classes. Useful for testing.\n */\n public static clear(): void {\n this._map.clear();\n }\n}\n\n// Export alias for backward compatibility\nexport { DataClassRegistry as DataClass };\n","import { ApiDataInterface } from \"../interfaces/ApiDataInterface\";\nimport { ApiRequestDataTypeInterface } from \"../interfaces/ApiRequestDataTypeInterface\";\nimport { DataClassRegistry } from \"../registry/DataClassRegistry\";\n\nexport class JsonApiDataFactory {\n public static create(classKey: ApiRequestDataTypeInterface, data: any): any {\n const factoryClass = DataClassRegistry.get(classKey);\n\n const instance = new factoryClass() as ApiDataInterface;\n const result = instance.createJsonApi(data);\n return result;\n }\n}\n","/**\n * Centralized bootstrap store accessible from ModuleRegistry.\n * This file has NO external dependencies to avoid circular imports.\n *\n * The bootstrap store allows ModuleRegistry to call the app's bootstrapper\n * when modules are accessed before bootstrap() was called, providing\n * self-healing behavior for module evaluation order issues.\n *\n * IMPORTANT: We use globalThis to persist state across HMR/Turbopack\n * module re-evaluations in development mode. Without this, the bootstrapper\n * reference would be lost when modules are hot-reloaded, causing\n * \"Module not registered\" errors during navigation.\n */\n\ntype BootstrapperFn = () => void;\n\n// Symbol key to avoid conflicts with other globals\nconst BOOTSTRAP_KEY = Symbol.for(\"nextjs-jsonapi:bootstrapper\");\nconst BOOTSTRAP_ATTEMPTED_KEY = Symbol.for(\"nextjs-jsonapi:bootstrapAttempted\");\n\n// Use globalThis to persist across HMR reloads\nconst globalStore = globalThis as unknown as {\n [BOOTSTRAP_KEY]?: BootstrapperFn | null;\n [BOOTSTRAP_ATTEMPTED_KEY]?: boolean;\n};\n\n// Initialize from global if not set\nif (globalStore[BOOTSTRAP_KEY] === undefined) {\n globalStore[BOOTSTRAP_KEY] = null;\n}\nif (globalStore[BOOTSTRAP_ATTEMPTED_KEY] === undefined) {\n globalStore[BOOTSTRAP_ATTEMPTED_KEY] = false;\n}\n\n// Getters/setters that use the global store\nfunction getBootstrapperInternal(): BootstrapperFn | null {\n return globalStore[BOOTSTRAP_KEY] ?? null;\n}\n\nfunction setBootstrapperInternal(fn: BootstrapperFn | null): void {\n globalStore[BOOTSTRAP_KEY] = fn;\n}\n\nfunction getBootstrapAttempted(): boolean {\n return globalStore[BOOTSTRAP_ATTEMPTED_KEY] ?? false;\n}\n\nfunction setBootstrapAttempted(value: boolean): void {\n globalStore[BOOTSTRAP_ATTEMPTED_KEY] = value;\n}\n\n/**\n * Register the bootstrapper function.\n * Called by configureJsonApi() from client/config, client/JsonApiClient, or unified/JsonApiRequest.\n */\nexport function setBootstrapper(fn: BootstrapperFn): void {\n setBootstrapperInternal(fn);\n}\n\n/**\n * Get the registered bootstrapper function.\n * Returns null if no bootstrapper has been registered.\n */\nexport function getBootstrapper(): BootstrapperFn | null {\n return getBootstrapperInternal();\n}\n\n/**\n * Attempt to run the bootstrapper if one is registered.\n * Returns true if bootstrapper was executed, false if not available.\n * Safe to call multiple times - bootstrapper is expected to be idempotent.\n */\nexport function tryBootstrap(): boolean {\n const bootstrapper = getBootstrapperInternal();\n const attempted = getBootstrapAttempted();\n\n if (attempted && !bootstrapper) {\n // Already tried and no bootstrapper available\n return false;\n }\n setBootstrapAttempted(true);\n\n if (bootstrapper) {\n bootstrapper();\n return true;\n }\n return false;\n}\n\n/**\n * Check if a bootstrapper has been registered.\n */\nexport function hasBootstrapper(): boolean {\n return getBootstrapperInternal() !== null;\n}\n\n/**\n * Reset the bootstrap store. Useful for testing.\n */\nexport function resetBootstrapStore(): void {\n setBootstrapperInternal(null);\n setBootstrapAttempted(false);\n}\n","import { ApiData } from \"../interfaces/ApiData\";\nimport { ApiDataInterface } from \"../interfaces/ApiDataInterface\";\nimport { ApiRequestDataTypeInterface } from \"../interfaces/ApiRequestDataTypeInterface\";\nimport { ApiResponseInterface } from \"../interfaces/ApiResponseInterface\";\nimport { DataClassRegistry } from \"../registry/DataClassRegistry\";\n\n/**\n * Translates raw JSON:API data into typed objects.\n * Does not require API response metadata.\n */\nexport function translateData<T extends ApiDataInterface>(params: {\n classKey: ApiRequestDataTypeInterface;\n data: any;\n}): T | T[] {\n const factoryClass = DataClassRegistry.get(params.classKey);\n\n if (!factoryClass) {\n throw new Error(\n `Class not registered for key: ${typeof params.classKey === \"string\" ? params.classKey : params.classKey.name}`,\n );\n }\n\n const included: any = params.data.included ?? [];\n\n if (Array.isArray(params.data.data)) {\n const responseData: T[] = [];\n\n for (const data of params.data.data) {\n const object = new factoryClass();\n object.rehydrate({ jsonApi: data, included: included, allData: params.data.data });\n responseData.push(object as T);\n }\n\n return responseData as T[];\n } else {\n const responseData = new factoryClass();\n responseData.rehydrate({\n jsonApi: params.data.data,\n included: included,\n });\n\n return responseData as T;\n }\n}\n\n/**\n * Translates a full API response into a typed ApiResponseInterface.\n * Includes pagination support.\n */\nexport async function translateResponse<T extends ApiDataInterface>(params: {\n classKey: ApiRequestDataTypeInterface;\n apiResponse: ApiData;\n companyId?: string;\n language: string;\n paginationHandler?: (endpoint: string) => Promise<ApiResponseInterface>;\n}): Promise<ApiResponseInterface> {\n const response: ApiResponseInterface = {\n ok: true,\n response: 0,\n data: [],\n error: \"\",\n };\n\n const factoryClass = DataClassRegistry.get(params.classKey);\n\n if (!factoryClass) {\n throw new Error(\n `Class not registered for key: ${typeof params.classKey === \"string\" ? params.classKey : params.classKey.name}`,\n );\n }\n\n response.ok = params.apiResponse.ok;\n response.response = params.apiResponse.status;\n\n if (!params.apiResponse.ok) {\n // `statusText` is empty over HTTP/2 (the reason phrase was removed from the protocol), so the\n // body is the only reliable source of error text. APIs in this stack use either key.\n response.error =\n params.apiResponse?.data?.message ?? params.apiResponse?.data?.error ?? params.apiResponse.statusText;\n response.raw = params.apiResponse.data;\n return response;\n }\n\n if (params.apiResponse.status === 204) return response;\n\n // A success with no body (e.g. a 200 from a handler that sends nothing —\n // @HttpCode is inert when a controller injects @Res, so \"204\" endpoints can\n // arrive as empty 200s) translates to an empty success, not a crash on\n // `.included` below.\n if (params.apiResponse.data === undefined || params.apiResponse.data === null) return response;\n\n response.raw = params.apiResponse.data;\n\n // Extract meta from JSON:API response\n if (params.apiResponse.data?.meta) {\n response.meta = params.apiResponse.data.meta;\n }\n\n try {\n // Check if response is JSON:API formatted (has a 'data' property)\n // If not, return the raw response data directly (e.g., { url: \"...\" } or { clientSecret: \"...\" })\n if (\n params.apiResponse.data &&\n typeof params.apiResponse.data === \"object\" &&\n !Array.isArray(params.apiResponse.data) &&\n params.apiResponse.data.data === undefined\n ) {\n response.data = params.apiResponse.data;\n return response;\n }\n\n const included: any = params.apiResponse.data.included ?? [];\n\n if (params.apiResponse.data.links) {\n response.self = params.apiResponse.data.links.self;\n\n if (params.apiResponse.data.links.next && params.paginationHandler) {\n response.next = params.apiResponse.data.links.next;\n response.nextPage = async () => params.paginationHandler!(params.apiResponse.data.links.next);\n }\n\n if (params.apiResponse.data.links.prev && params.paginationHandler) {\n response.prev = params.apiResponse.data.links.prev;\n response.prevPage = async () => params.paginationHandler!(params.apiResponse.data.links.prev);\n }\n }\n\n if (Array.isArray(params.apiResponse.data.data)) {\n const responseData: T[] = [];\n\n for (const data of params.apiResponse.data.data) {\n const object = new factoryClass();\n object.rehydrate({ jsonApi: data, included: included, allData: params.apiResponse.data.data });\n responseData.push(object as T);\n }\n\n response.data = responseData;\n } else {\n const responseData = new factoryClass();\n responseData.rehydrate({\n jsonApi: params.apiResponse.data.data,\n included: included,\n });\n\n response.data = responseData;\n }\n } catch (e) {\n console.error(e);\n }\n\n return response;\n}\n","import { ENV } from \"../core/env\";\nimport { JsonApiDataFactory } from \"../core/factories/JsonApiDataFactory\";\nimport { ApiData } from \"../core/interfaces/ApiData\";\nimport { ApiRequestDataTypeInterface } from \"../core/interfaces/ApiRequestDataTypeInterface\";\nimport { ApiResponseInterface } from \"../core/interfaces/ApiResponseInterface\";\nimport { setBootstrapper } from \"../core/registry/bootstrapStore\";\nimport { translateResponse } from \"../core/utils/translateResponse\";\nimport { ModuleWithPermissions } from \"../permissions/types\";\n\n// Type definitions for dynamically imported functions (avoiding typeof import to prevent bundling)\ntype DirectFetchFn = (params: {\n method: string;\n url: string;\n token?: string;\n body?: any;\n files?: { [key: string]: File | Blob } | File | Blob;\n companyId?: string;\n language: string;\n additionalHeaders?: Record<string, string>;\n}) => Promise<ApiData>;\n\ntype ServerRequestFn = (params: {\n method: string;\n url: string;\n token?: string;\n cache?: string;\n body?: any;\n files?: { [key: string]: File | Blob } | File | Blob;\n companyId?: string;\n language: string;\n additionalHeaders?: Record<string, string>;\n}) => Promise<ApiData>;\n\ntype GetTokenFn = () => Promise<string | undefined>;\n\n// These will be dynamically imported based on environment\nlet _directFetch: DirectFetchFn;\nlet _serverRequest: ServerRequestFn;\nlet _getClientToken: GetTokenFn;\nlet _getServerToken: GetTokenFn;\n\n// Config storage for non-React contexts\nlet _staticConfig: {\n apiUrl: string;\n appUrl?: string;\n trackablePages?: ModuleWithPermissions[];\n bootstrapper?: () => void;\n additionalHeaders?: Record<string, string>;\n} | null = null;\n\n/**\n * Configure the JSON:API client for non-React contexts (e.g., server components).\n * For React contexts, use JsonApiProvider instead.\n */\nexport function configureJsonApi(config: {\n apiUrl: string;\n appUrl?: string;\n trackablePages?: ModuleWithPermissions[];\n bootstrapper?: () => void;\n additionalHeaders?: Record<string, string>;\n}): void {\n _staticConfig = config;\n // Register and call bootstrapper to register all modules\n if (config.bootstrapper) {\n setBootstrapper(config.bootstrapper);\n config.bootstrapper();\n }\n}\n\nasync function getToken(): Promise<string | undefined> {\n if (typeof window === \"undefined\") {\n // Server-side\n if (!_getServerToken) {\n const serverModule = await import(\"../server/token\");\n _getServerToken = serverModule.getServerToken;\n }\n return _getServerToken();\n } else {\n // Client-side\n if (!_getClientToken) {\n const clientModule = await import(\"../client/token\");\n _getClientToken = clientModule.getClientToken;\n }\n return _getClientToken();\n }\n}\n\nasync function makeRequest(params: {\n method: string;\n url: string;\n token?: string;\n cache?: string;\n body?: any;\n files?: { [key: string]: File | Blob } | File | Blob;\n companyId?: string;\n language: string;\n additionalHeaders?: Record<string, string>;\n}): Promise<ApiData> {\n if (typeof window !== \"undefined\") {\n // Client-side: use direct fetch\n if (!_directFetch) {\n const clientModule = await import(\"../client/request\");\n _directFetch = clientModule.directFetch;\n }\n return _directFetch({\n method: params.method,\n url: params.url,\n token: params.token,\n body: params.body,\n files: params.files,\n companyId: params.companyId,\n language: params.language,\n additionalHeaders: params.additionalHeaders,\n });\n } else {\n // Server-side: use server request with caching\n if (!_serverRequest) {\n const serverModule = await import(\"../server/request\");\n _serverRequest = serverModule.serverRequest;\n }\n return _serverRequest({\n method: params.method,\n url: params.url,\n token: params.token,\n cache: params.cache,\n body: params.body,\n files: params.files,\n companyId: params.companyId,\n language: params.language,\n additionalHeaders: params.additionalHeaders,\n });\n }\n}\n\nexport function getApiUrl(): string {\n if (_staticConfig?.apiUrl) {\n return _staticConfig.apiUrl;\n }\n // Fallback to environment variable\n const envUrl = ENV.API_URL;\n if (!envUrl) {\n throw new Error(\"API URL not configured. Use configureJsonApi() or set NEXT_PUBLIC_API_URL environment variable.\");\n }\n return envUrl;\n}\n\nexport function getAppUrl(): string {\n if (_staticConfig?.appUrl) {\n return _staticConfig.appUrl;\n }\n // Fallback to environment variable\n const envUrl = ENV.APP_URL;\n if (!envUrl) {\n throw new Error(\n \"App URL not configured. Use configureJsonApi({ appUrl }) or set NEXT_PUBLIC_ADDRESS environment variable.\",\n );\n }\n return envUrl.trim().replace(/\\/+$/, \"\");\n}\n\nexport function getTrackablePages(): ModuleWithPermissions[] {\n return _staticConfig?.trackablePages ?? [];\n}\n\nfunction runBootstrapper(): void {\n if (_staticConfig?.bootstrapper) {\n _staticConfig.bootstrapper();\n }\n}\n\n/**\n * Resolve the final request URL for an endpoint.\n *\n * - `endpoint` starting with \"http\" is always passed through unchanged (existing behaviour).\n * - Otherwise, an explicit `baseUrl` (per-call override) takes precedence over the global\n * `getApiUrl()` resolution. Omitting `baseUrl` preserves today's behaviour exactly.\n */\nexport function buildUrl(endpoint: string, baseUrl?: string): string {\n if (endpoint.startsWith(\"http\")) return endpoint;\n const apiUrl = baseUrl ?? getApiUrl();\n return `${apiUrl}${endpoint}`;\n}\n\nexport async function JsonApiGet(params: {\n classKey: ApiRequestDataTypeInterface;\n endpoint: string;\n companyId?: string;\n language: string;\n token?: string;\n baseUrl?: string;\n}): Promise<ApiResponseInterface> {\n runBootstrapper();\n const token = params.token ?? (await getToken());\n\n const apiResponse = await makeRequest({\n method: \"GET\",\n url: buildUrl(params.endpoint, params.baseUrl),\n token,\n cache: params.classKey.cache,\n companyId: params.companyId,\n language: params.language,\n additionalHeaders: _staticConfig?.additionalHeaders,\n });\n\n return translateResponse({\n classKey: params.classKey,\n apiResponse,\n companyId: params.companyId,\n language: params.language,\n paginationHandler: async (endpoint: string) =>\n JsonApiGet({\n classKey: params.classKey,\n endpoint,\n companyId: params.companyId,\n language: params.language,\n token: params.token,\n baseUrl: params.baseUrl,\n }),\n });\n}\n\nexport async function JsonApiPost(params: {\n classKey: ApiRequestDataTypeInterface;\n endpoint: string;\n companyId?: string;\n body?: any;\n overridesJsonApiCreation?: boolean;\n files?: { [key: string]: File | Blob } | File | Blob;\n language: string;\n responseType?: ApiRequestDataTypeInterface;\n token?: string;\n baseUrl?: string;\n}): Promise<ApiResponseInterface> {\n runBootstrapper();\n const token = params.token ?? (await getToken());\n\n let body = params.body;\n if (!body) {\n body = {};\n } else if (params.overridesJsonApiCreation !== true) {\n body = JsonApiDataFactory.create(params.classKey, body);\n }\n\n const apiResponse = await makeRequest({\n method: \"POST\",\n url: buildUrl(params.endpoint, params.baseUrl),\n token,\n body,\n files: params.files,\n companyId: params.companyId,\n language: params.language,\n additionalHeaders: _staticConfig?.additionalHeaders,\n });\n\n return translateResponse({\n classKey: params.responseType ?? params.classKey,\n apiResponse,\n companyId: params.companyId,\n language: params.language,\n });\n}\n\nexport async function JsonApiPut(params: {\n classKey: ApiRequestDataTypeInterface;\n endpoint: string;\n companyId?: string;\n body?: any;\n files?: { [key: string]: File | Blob } | File | Blob;\n language: string;\n responseType?: ApiRequestDataTypeInterface;\n token?: string;\n baseUrl?: string;\n}): Promise<ApiResponseInterface> {\n runBootstrapper();\n const token = params.token ?? (await getToken());\n\n let body = params.body;\n if (!body) {\n body = {};\n } else {\n body = JsonApiDataFactory.create(params.classKey, body);\n }\n\n const apiResponse = await makeRequest({\n method: \"PUT\",\n url: buildUrl(params.endpoint, params.baseUrl),\n token,\n body,\n files: params.files,\n companyId: params.companyId,\n language: params.language,\n additionalHeaders: _staticConfig?.additionalHeaders,\n });\n\n return translateResponse({\n classKey: params.responseType ?? params.classKey,\n apiResponse,\n companyId: params.companyId,\n language: params.language,\n });\n}\n\nexport async function JsonApiPatch(params: {\n classKey: ApiRequestDataTypeInterface;\n endpoint: string;\n companyId?: string;\n body?: any;\n files?: { [key: string]: File | Blob } | File | Blob;\n overridesJsonApiCreation?: boolean;\n responseType?: ApiRequestDataTypeInterface;\n language: string;\n token?: string;\n baseUrl?: string;\n}): Promise<ApiResponseInterface> {\n runBootstrapper();\n const token = params.token ?? (await getToken());\n\n let body = params.body;\n if (!body) {\n body = {};\n } else if (params.overridesJsonApiCreation !== true) {\n body = JsonApiDataFactory.create(params.classKey, body);\n }\n\n const apiResponse = await makeRequest({\n method: \"PATCH\",\n url: buildUrl(params.endpoint, params.baseUrl),\n token,\n body,\n files: params.files,\n companyId: params.companyId,\n language: params.language,\n additionalHeaders: _staticConfig?.additionalHeaders,\n });\n\n return translateResponse({\n classKey: params.responseType ?? params.classKey,\n apiResponse,\n companyId: params.companyId,\n language: params.language,\n });\n}\n\nexport async function JsonApiDelete(params: {\n classKey: ApiRequestDataTypeInterface;\n endpoint: string;\n companyId?: string;\n language: string;\n responseType?: ApiRequestDataTypeInterface;\n token?: string;\n baseUrl?: string;\n}): Promise<ApiResponseInterface> {\n runBootstrapper();\n const token = params.token ?? (await getToken());\n\n const apiResponse = await makeRequest({\n method: \"DELETE\",\n url: buildUrl(params.endpoint, params.baseUrl),\n token,\n companyId: params.companyId,\n language: params.language,\n additionalHeaders: _staticConfig?.additionalHeaders,\n });\n\n return translateResponse({\n classKey: params.responseType ?? params.classKey,\n apiResponse,\n companyId: params.companyId,\n language: params.language,\n });\n}\n"]}
@@ -20,7 +20,7 @@ import {
20
20
  useI18nLocale,
21
21
  useI18nRouter,
22
22
  useI18nTranslations
23
- } from "./chunk-LCMVARSP.mjs";
23
+ } from "./chunk-RUEY6XSS.mjs";
24
24
  import {
25
25
  AVAILABLE_OAUTH_SCOPES,
26
26
  AiConnectionService,
@@ -70,7 +70,10 @@ import {
70
70
  useIsMobile,
71
71
  validateItalianTaxCode,
72
72
  validatePartitaIva
73
- } from "./chunk-PGARO3JT.mjs";
73
+ } from "./chunk-KW6LYVFJ.mjs";
74
+ import {
75
+ ENV
76
+ } from "./chunk-RVASYIQG.mjs";
74
77
  import {
75
78
  JsonApiContext
76
79
  } from "./chunk-VOXD3ZLY.mjs";
@@ -10222,7 +10225,7 @@ import { useRef as useRef17 } from "react";
10222
10225
  import dynamic from "next/dynamic";
10223
10226
  import React17 from "react";
10224
10227
  import { jsx as jsx88 } from "react/jsx-runtime";
10225
- var BlockNoteEditor = dynamic(() => import("./BlockNoteEditor-G5A34EXN.mjs"), {
10228
+ var BlockNoteEditor = dynamic(() => import("./BlockNoteEditor-SDVXTZRC.mjs"), {
10226
10229
  ssr: false
10227
10230
  });
10228
10231
  var BlockNoteEditorContainer = React17.memo(/* @__PURE__ */ __name(function EditorContainer(props) {
@@ -10919,7 +10922,7 @@ function FormPlaceAutocomplete({
10919
10922
  const debounceRef = useRef18(null);
10920
10923
  const containerRef = useRef18(null);
10921
10924
  useEffect20(() => {
10922
- const key = process.env.NEXT_PUBLIC_GOOGLE_MAPS_API_KEY;
10925
+ const key = ENV.GOOGLE_MAPS_API_KEY;
10923
10926
  if (!key) {
10924
10927
  console.error("Google Maps API key not found. Please set NEXT_PUBLIC_GOOGLE_MAPS_API_KEY environment variable.");
10925
10928
  setLoadError(true);
@@ -12449,7 +12452,7 @@ function CompanyEditorInternal({
12449
12452
  const t = useTranslations37();
12450
12453
  const fiscalRef = useRef21(null);
12451
12454
  const addressComponentsRef = useRef21({});
12452
- const canAccessFeatures = hasRole(getRoleId().Administrator) || hasRole(getRoleId().CompanyAdministrator) && process.env.NEXT_PUBLIC_PRIVATE_INSTALLATION?.toLowerCase() === "true";
12455
+ const canAccessFeatures = hasRole(getRoleId().Administrator) || hasRole(getRoleId().CompanyAdministrator) && ENV.PRIVATE_INSTALLATION;
12453
12456
  const handleDialogOpenChange = useCallback21(
12454
12457
  (open) => {
12455
12458
  if (open && features.length === 0 && canAccessFeatures) {
@@ -14446,7 +14449,7 @@ function usePushNotifications() {
14446
14449
  if (permission !== "granted") {
14447
14450
  return;
14448
14451
  }
14449
- const vapidPublicKey = (process.env.NEXT_PUBLIC_VAPID_PUBLIC_KEY || "").trim();
14452
+ const vapidPublicKey = ENV.VAPID_PUBLIC_KEY.trim();
14450
14453
  if (!vapidPublicKey) {
14451
14454
  return;
14452
14455
  }
@@ -14493,7 +14496,7 @@ function useSocket({ token }) {
14493
14496
  const socketRef = useRef26(null);
14494
14497
  useEffect37(() => {
14495
14498
  if (!token) return;
14496
- const globalSocketKey = `__socket_${process.env.NEXT_PUBLIC_API_URL?.replace(/[^a-zA-Z0-9]/g, "_")}`;
14499
+ const globalSocketKey = `__socket_${ENV.API_URL.replace(/[^a-zA-Z0-9]/g, "_")}`;
14497
14500
  if (typeof window !== "undefined") {
14498
14501
  const _allSocketKeys = Object.keys(window).filter((key) => key.startsWith("__socket_"));
14499
14502
  const existingSocket = window[globalSocketKey];
@@ -14519,7 +14522,7 @@ function useSocket({ token }) {
14519
14522
  }
14520
14523
  shouldConnect.current = false;
14521
14524
  try {
14522
- currentSocket = io(process.env.NEXT_PUBLIC_API_URL, {
14525
+ currentSocket = io(ENV.API_URL, {
14523
14526
  auth: { token },
14524
14527
  transports: ["websocket"],
14525
14528
  timeout: 2e4
@@ -14574,7 +14577,7 @@ function useSocket({ token }) {
14574
14577
  return () => {
14575
14578
  shouldConnect.current = true;
14576
14579
  if (currentSocket) {
14577
- if (process.env.NODE_ENV === "development") {
14580
+ if (ENV.IS_DEVELOPMENT) {
14578
14581
  currentSocket.off("connect", handleConnect);
14579
14582
  currentSocket.off("disconnect", handleDisconnect);
14580
14583
  currentSocket.off("message", handleMessage);
@@ -16040,7 +16043,7 @@ function useJsonApiGet(params) {
16040
16043
  setLoading(true);
16041
16044
  setError(null);
16042
16045
  try {
16043
- const { JsonApiGet } = await import("./JsonApiRequest-2OQCZAK6.mjs");
16046
+ const { JsonApiGet } = await import("./JsonApiRequest-ADNIGXTP.mjs");
16044
16047
  const language = navigator.language.split("-")[0] || "en";
16045
16048
  const apiResponse = await JsonApiGet({
16046
16049
  classKey: params.classKey,
@@ -16145,7 +16148,7 @@ function useJsonApiMutation(config) {
16145
16148
  setLoading(true);
16146
16149
  setError(null);
16147
16150
  try {
16148
- const { JsonApiPost, JsonApiPut, JsonApiPatch, JsonApiDelete } = await import("./JsonApiRequest-2OQCZAK6.mjs");
16151
+ const { JsonApiPost, JsonApiPut, JsonApiPatch, JsonApiDelete } = await import("./JsonApiRequest-ADNIGXTP.mjs");
16149
16152
  const language = navigator.language.split("-")[0] || "en";
16150
16153
  let apiResponse;
16151
16154
  switch (config.method) {
@@ -25439,4 +25442,4 @@ export {
25439
25442
  useOAuthClients,
25440
25443
  useOAuthClient
25441
25444
  };
25442
- //# sourceMappingURL=chunk-O4LTJAAM.mjs.map
25445
+ //# sourceMappingURL=chunk-WPF4NFVV.mjs.map