@carlonicora/nextjs-jsonapi 4.0.1 → 4.0.3

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 (37) hide show
  1. package/README.md +111 -49
  2. package/dist/next-config/index.js +7 -4
  3. package/dist/next-config/index.js.map +1 -1
  4. package/dist/next-config/index.mjs +7 -4
  5. package/dist/next-config/index.mjs.map +1 -1
  6. package/dist/scripts/generate-web-module/__tests__/loading.spec.d.ts +2 -0
  7. package/dist/scripts/generate-web-module/__tests__/loading.spec.d.ts.map +1 -0
  8. package/dist/scripts/generate-web-module/__tests__/loading.spec.js +65 -0
  9. package/dist/scripts/generate-web-module/__tests__/loading.spec.js.map +1 -0
  10. package/dist/scripts/generate-web-module/generator.d.ts.map +1 -1
  11. package/dist/scripts/generate-web-module/generator.js +12 -1
  12. package/dist/scripts/generate-web-module/generator.js.map +1 -1
  13. package/dist/scripts/generate-web-module/templates/index.d.ts +1 -1
  14. package/dist/scripts/generate-web-module/templates/index.d.ts.map +1 -1
  15. package/dist/scripts/generate-web-module/templates/index.js +2 -1
  16. package/dist/scripts/generate-web-module/templates/index.js.map +1 -1
  17. package/dist/scripts/generate-web-module/templates/pages/index.d.ts +1 -0
  18. package/dist/scripts/generate-web-module/templates/pages/index.d.ts.map +1 -1
  19. package/dist/scripts/generate-web-module/templates/pages/index.js +3 -1
  20. package/dist/scripts/generate-web-module/templates/pages/index.js.map +1 -1
  21. package/dist/scripts/generate-web-module/templates/pages/loading.template.d.ts +18 -0
  22. package/dist/scripts/generate-web-module/templates/pages/loading.template.d.ts.map +1 -0
  23. package/dist/scripts/generate-web-module/templates/pages/loading.template.js +28 -0
  24. package/dist/scripts/generate-web-module/templates/pages/loading.template.js.map +1 -0
  25. package/dist/scripts/generate-web-module/transformers/import-resolver.d.ts +2 -0
  26. package/dist/scripts/generate-web-module/transformers/import-resolver.d.ts.map +1 -1
  27. package/dist/scripts/generate-web-module/transformers/import-resolver.js +2 -0
  28. package/dist/scripts/generate-web-module/transformers/import-resolver.js.map +1 -1
  29. package/package.json +5 -5
  30. package/scripts/generate-web-module/__tests__/loading.spec.ts +34 -0
  31. package/scripts/generate-web-module/generator.ts +15 -1
  32. package/scripts/generate-web-module/templates/index.ts +1 -1
  33. package/scripts/generate-web-module/templates/pages/index.ts +1 -0
  34. package/scripts/generate-web-module/templates/pages/loading.template.ts +25 -0
  35. package/scripts/generate-web-module/transformers/import-resolver.ts +4 -0
  36. package/src/next-config/__tests__/createNextConfig.test.ts +2 -1
  37. package/src/next-config/index.ts +7 -4
package/README.md CHANGED
@@ -5,6 +5,7 @@ A comprehensive Next.js package providing JSON:API compliant client with unified
5
5
  ## Table of Contents
6
6
 
7
7
  - [Features](#features)
8
+ - [What Changed in 4.0](#what-changed-in-40)
8
9
  - [Architecture](#architecture)
9
10
  - [Installation](#installation)
10
11
  - [Quick Start](#quick-start)
@@ -33,20 +34,39 @@ A comprehensive Next.js package providing JSON:API compliant client with unified
33
34
 
34
35
  ## Architecture
35
36
 
36
- The library is organized into eight entry points:
37
+ The library is organized into these entry points (the `exports` map in `package.json`):
37
38
 
38
39
  ```
39
40
  @carlonicora/nextjs-jsonapi
40
- ├── (main) # Unified API (auto-detects environment)
41
- ├── /core # Interfaces, factories, registries, and utilities
42
- ├── /client # React hooks and client-side utilities
43
- ├── /server # Server-side requests and caching
44
- ├── /permissions # Permission checking utilities
45
- ├── /features # Built-in feature modules (S3, etc.)
46
- ├── /utils # Utility functions (cn, useIsMobile, etc.)
47
- └── /shadcnui # 44 shadcn/ui components
41
+ ├── (main) # Unified API, configuration functions, and everything in /core
42
+ ├── /core # Interfaces, factories, registries, permissions, feature modules, and utilities
43
+ ├── /server # Server-side requests, ServerSession, and cache tag helpers
44
+ ├── /cached-get # cachedServerGet: the token-free "use cache" GET (server only)
45
+ ├── /client # React hooks and client-side utilities
46
+ ├── /components # Library components and the 44 shadcn/ui components
47
+ ├── /contexts # React providers (SessionProvider, ViewportProvider, SocketProvider, ...)
48
+ ├── /contexts/styles.css # Stylesheet for the contexts entry
49
+ ├── /testing # Test utilities (mock providers, render helpers)
50
+ ├── /billing # Stripe billing components (kept apart so Stripe.js is not loaded globally)
51
+ ├── /help # Help feature, client components
52
+ ├── /help/server # Help feature, server-safe constants and types
53
+ ├── /tokenusage # Token-usage admin feature, client components
54
+ ├── /analytics # Analytics feature, client components
55
+ ├── /analytics/server # Analytics feature, server page components
56
+ └── /next-config # createNextConfig for next.config.js
48
57
  ```
49
58
 
59
+ ## What Changed in 4.0
60
+
61
+ 4.0 makes the library work under Next 16.4 Cache Components. The full recipe, with the breaking changes and the order of work, is in [docs/migrating-to-4.0.md](docs/migrating-to-4.0.md). In short:
62
+
63
+ - **Cache Components**: `createNextConfig` turns on `cacheComponents` and `partialPrefetching`. The app frame renders in the static shell while the session streams in behind it.
64
+ - **Session**: `ServerSession.read()` (`/server`) returns a `Promise<SessionSnapshot>` built from cookies and headers. Call it without awaiting and hand the promise to `SessionProvider` (`/contexts`); `useSession()` unwraps it, so its caller sits behind its own `<Suspense>`.
65
+ - **Providers take `session`**: `ViewportProvider`, `SocketProvider` (`/contexts`) and `SidebarProvider` (`/components`) accept `session?: Promise<SessionSnapshot>`. The old props (`token`, `initialIsMobile`, `defaultOpen`) still work.
66
+ - **`createNextConfig`** from `/next-config`: `cspRemove` is gone. Third parties in the CSP come from `services` (`"stripe" | "googleMaps" | "turnstile" | "discord" | "googleFonts"`); anything else goes in `csp`.
67
+ - **Caching**: a module's `cache` value is a `cacheLife` profile name or a tag. A cached server GET goes through `cachedServerGet` (`/cached-get`), a `"use cache"` function that never sends the token. See [Cache Profiles](#cache-profiles).
68
+ - **`configureI18n` requires `getLocale`**: pass next-intl's `getLocale` from `next-intl/server`; the library no longer imports next-intl itself.
69
+
50
70
  ## Installation
51
71
 
52
72
  ```bash
@@ -125,9 +145,9 @@ git submodule update --init --recursive
125
145
 
126
146
  | Package | Version | Required | Purpose |
127
147
  | ----------------- | -------- | -------- | ----------------------------------- |
128
- | `next` | >=14.0.0 | Yes | Next.js framework |
129
- | `react` | >=18.0.0 | Yes | React library |
130
- | `react-dom` | >=18.0.0 | Yes | React DOM |
148
+ | `next` | >=16.4.0 | Yes | Next.js framework |
149
+ | `react` | >=19.3.0 | Yes | React library |
150
+ | `react-dom` | >=19.3.0 | Yes | React DOM |
131
151
  | `react-hook-form` | >=7.0.0 | Optional | Form handling (for form components) |
132
152
 
133
153
  ## Quick Start
@@ -154,7 +174,7 @@ Create a bootstrapper that registers all modules for both the ModuleRegistry (fo
154
174
  ```typescript
155
175
  // src/config/Bootstrapper.ts
156
176
  import { DataClassRegistry, FieldSelector, ModuleRegistry } from "@carlonicora/nextjs-jsonapi/core";
157
- import { ModuleWithPermissions } from "@carlonicora/nextjs-jsonapi/permissions";
177
+ import { ModuleWithPermissions } from "@carlonicora/nextjs-jsonapi/core";
158
178
  import { S3Module } from "@carlonicora/nextjs-jsonapi/core";
159
179
 
160
180
  // Import your module definitions
@@ -368,23 +388,40 @@ import {
368
388
  Server-side request utilities:
369
389
 
370
390
  ```typescript
371
- import { serverRequest, getServerToken, getCacheProfile } from "@carlonicora/nextjs-jsonapi/server";
391
+ import {
392
+ serverRequest,
393
+ getServerToken,
394
+ ServerSession, // read(), isLogged(), checkPermission(), ...
395
+ invalidateCacheTag,
396
+ invalidateCacheTags,
397
+ updateCacheTag,
398
+ CACHE_PROFILES,
399
+ } from "@carlonicora/nextjs-jsonapi/server";
372
400
  ```
373
401
 
374
- ### Permissions (`/permissions`)
402
+ ### Cached GET (`/cached-get`)
375
403
 
376
- Permission checking utilities:
404
+ The token-free `"use cache"` GET. It resolves to the real function under the `react-server` condition only; every other bundle gets a stub that throws. `serverRequest` calls it for you (see [Cache Profiles](#cache-profiles)).
405
+
406
+ ```typescript
407
+ import { cachedServerGet, statusFromDigest } from "@carlonicora/nextjs-jsonapi/cached-get";
408
+ ```
409
+
410
+ ### Permissions (in `/core`)
411
+
412
+ Permission checking utilities are exported from `/core` (and the main entry):
377
413
 
378
414
  ```typescript
379
415
  import {
380
- checkPermission,
416
+ checkPermissions,
417
+ Action,
381
418
  type PermissionCheck,
382
419
  type ModuleWithPermissions,
383
420
  type ModuleFactory,
384
- } from "@carlonicora/nextjs-jsonapi/permissions";
421
+ } from "@carlonicora/nextjs-jsonapi/core";
385
422
  ```
386
423
 
387
- ### Features (`/features`)
424
+ ### Feature Modules (in `/core`)
388
425
 
389
426
  Built-in feature modules that can be used directly in your application:
390
427
 
@@ -412,7 +449,7 @@ await fetch(s3Response.url, {
412
449
  });
413
450
  ```
414
451
 
415
- ### Utils (`/utils`)
452
+ ### Utilities (in `/core`)
416
453
 
417
454
  Utility functions:
418
455
 
@@ -423,12 +460,12 @@ import {
423
460
  useComposedRefs, // Hook for composing refs
424
461
  useIsMobile, // Mobile detection hook
425
462
  type ClassValue, // Type for cn function
426
- } from "@carlonicora/nextjs-jsonapi/utils";
463
+ } from "@carlonicora/nextjs-jsonapi/core";
427
464
  ```
428
465
 
429
- ### shadcn/ui (`/shadcnui`)
466
+ ### Components (`/components`)
430
467
 
431
- All shadcn/ui components (requires `"use client"`):
468
+ The library's own components plus all shadcn/ui components (requires `"use client"`):
432
469
 
433
470
  ```typescript
434
471
  import {
@@ -555,9 +592,24 @@ import {
555
592
  KanbanItem, // Drag-and-drop Kanban board
556
593
  Link, // next-intl compatible Link
557
594
  MultiSelect, // Multi-select dropdown
558
- } from "@carlonicora/nextjs-jsonapi/shadcnui";
595
+ } from "@carlonicora/nextjs-jsonapi/components";
559
596
  ```
560
597
 
598
+ ### Other Entry Points
599
+
600
+ | Entry point | What it holds |
601
+ | ---------------------- | ----------------------------------------------------------------------------------------------- |
602
+ | `/contexts` | React providers: `SessionProvider`/`useSession`, `ViewportProvider`, `SocketProvider`, and more |
603
+ | `/contexts/styles.css` | Stylesheet shipped with the contexts entry |
604
+ | `/testing` | `MockJsonApiProvider`, `renderWithProviders`, `createMockApiData`, `createMockResponse`, ... |
605
+ | `/billing` | Stripe billing components and contexts |
606
+ | `/help` | Help feature client components (`HelpProvider`, `HelpHeader`, ...) |
607
+ | `/help/server` | Server-safe `HELP_MODES` and help article types |
608
+ | `/tokenusage` | Token-usage admin feature client components |
609
+ | `/analytics` | Analytics feature client components (`AnalyticsTracker`, ...) |
610
+ | `/analytics/server` | `AnalyticsAdminPage`, `AnalyticsJourneyPage` server components |
611
+ | `/next-config` | `createNextConfig` for `next.config.js` (see [docs/migrating-to-4.0.md](docs/migrating-to-4.0.md)) |
612
+
561
613
  ## Unified API
562
614
 
563
615
  The unified API automatically detects whether code is running on the server or client and uses the appropriate request method.
@@ -689,54 +741,64 @@ const result = await mutate({
689
741
  For server components or API routes, use the server module directly:
690
742
 
691
743
  ```typescript
692
- import { serverRequest, getServerToken, getCacheProfile } from "@carlonicora/nextjs-jsonapi/server";
693
-
694
- export async function getArticle(id: string) {
695
- const token = await getServerToken();
744
+ import { serverRequest, getServerToken } from "@carlonicora/nextjs-jsonapi/server";
696
745
 
697
- const data = await serverRequest({
746
+ // Per-user data: no `cache`, so this is a plain uncached fetch that sends the token
747
+ export async function getMyArticle(id: string) {
748
+ return serverRequest({
698
749
  method: "GET",
699
750
  url: `${process.env.NEXT_PUBLIC_API_URL}/articles/${id}`,
700
- token,
701
- cache: getCacheProfile("articles"), // Get cache settings
751
+ token: await getServerToken(),
702
752
  language: "en",
703
753
  });
754
+ }
704
755
 
705
- return data;
756
+ // Shared data: a GET with `cache` goes through cachedServerGet and never sends the token
757
+ export async function getPublicArticle(id: string) {
758
+ return serverRequest({
759
+ method: "GET",
760
+ url: `${process.env.NEXT_PUBLIC_API_URL}/articles/${id}`,
761
+ cache: "articles", // a cacheLife profile name, or a tag
762
+ language: "en",
763
+ });
706
764
  }
707
765
  ```
708
766
 
709
767
  ### Cache Profiles
710
768
 
711
- The library supports Next.js 16+ caching via `cacheLife()` and `cacheTag()`:
769
+ A module's `cache` value decides how a server-side GET is cached. Every GET with a `cache` value runs inside `cachedServerGet`, a `"use cache"` function:
770
+
771
+ - a built-in `cacheLife` profile name (`"seconds"`, `"minutes"`, `"hours"`, `"days"`, `"weeks"`, `"max"`, `"default"`) → `cacheLife(profile)`;
772
+ - any other value is a tag → `cacheTag(value)` + `cacheLife("max")`, so the entry lives until you invalidate the tag.
712
773
 
713
774
  ```typescript
714
775
  // In your module definition
715
- export const Modules = {
716
- Article: {
717
- type: "articles",
718
- cache: "articles", // Profile name for caching
719
- factory: (data: any) => data,
720
- },
721
- };
776
+ const ArticleModule = (factory: ModuleFactory) =>
777
+ factory({ name: "articles", model: Article, cache: "articles" }); // tag
722
778
 
723
- // The cache profile is automatically applied when using JsonApiGet
724
- // on the server side
779
+ // JsonApiGet on the server applies it automatically, and does not read the token
780
+ // cookie for a cached module
781
+
782
+ // After a write, expire the tag
783
+ await updateCacheTag("articles"); // Server Actions: the same request reads fresh data
784
+ await invalidateCacheTag("articles"); // elsewhere: stale-while-revalidate
725
785
  ```
726
786
 
787
+ The cached path is token-free: the arguments are the cache key, so the request goes out without `Authorization`. An endpoint that needs a token is per-user and its module must not set `cache`. A failed response is thrown, not stored; its status travels in `error.digest` as `HTTP_<status>` and `statusFromDigest` reads it back.
788
+
727
789
  ## Permissions
728
790
 
729
791
  Check user permissions for protected resources:
730
792
 
731
793
  ```typescript
732
- import { checkPermission } from "@carlonicora/nextjs-jsonapi/permissions";
794
+ import { Action, checkPermissions, Modules } from "@carlonicora/nextjs-jsonapi/core";
733
795
 
734
796
  // Check if user has permission
735
- const canEdit = checkPermission({
797
+ const canEdit = checkPermissions({
798
+ module: Modules.Article,
799
+ action: Action.Update,
736
800
  user: currentUser,
737
- action: "edit",
738
- resource: "articles",
739
- resourceId: article.id,
801
+ data: article,
740
802
  });
741
803
 
742
804
  if (!canEdit) {
@@ -817,8 +879,8 @@ import {
817
879
  DialogContent,
818
880
  DialogHeader,
819
881
  DialogTitle,
820
- } from "@carlonicora/nextjs-jsonapi/shadcnui";
821
- import { cn } from "@carlonicora/nextjs-jsonapi/utils";
882
+ } from "@carlonicora/nextjs-jsonapi/components";
883
+ import { cn } from "@carlonicora/nextjs-jsonapi/core";
822
884
 
823
885
  export function ArticleCard({ article, className }) {
824
886
  return (
@@ -178,12 +178,15 @@ function createNextConfig(options) {
178
178
  serverActions: {
179
179
  bodySizeLimit: "5mb"
180
180
  },
181
- // Required by `unauthorized()` (next/navigation), which ServerSession.checkPermission
182
- // calls to deny access. Without this flag the function throws a plain Error instead of
183
- // rendering the nearest unauthorized.tsx.
181
+ // Required by `unauthorized()` (next/navigation): without this flag it throws a plain
182
+ // Error instead of rendering the nearest unauthorized.tsx. The flag is for app code that
183
+ // calls it; ServerSession.checkPermission does not, it still does `redirect("/401")`.
184
184
  authInterrupts: _nullishCoalesce(options.authInterrupts, () => ( true)),
185
185
  turbopackGc: true,
186
- turbopackLazyDynamicImports: true,
186
+ // No turbopackLazyDynamicImports: in `next dev` it leaves this package's lazily
187
+ // imported request module unactivated ("Lazily compiled dynamic import of ...
188
+ // JsonApiRequest ... was not activated"), so every client-side read returns
189
+ // nothing. Seen with the package installed from npm; production builds are unaffected.
187
190
  ...reactCompiler ? { turbopackRustReactCompiler: true } : {}
188
191
  },
189
192
  allowedDevOrigins: options.devOrigins,
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/nextjs-jsonapi/nextjs-jsonapi/dist/next-config/index.js","../../src/next-config/csp.ts","../../src/next-config/headers.ts","../../src/next-config/index.ts"],"names":[],"mappings":"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","file":"/home/runner/work/nextjs-jsonapi/nextjs-jsonapi/dist/next-config/index.js","sourcesContent":[null,"// Runtime imports: none. next.config.js loads this at RUNTIME under `next start`\n// in an image installed with --prod, so it may import only Node built-ins.\n\nexport type CspDirective =\n \"script-src\" | \"style-src\" | \"img-src\" | \"font-src\" | \"connect-src\" | \"frame-src\" | \"worker-src\";\n\n/**\n * Third-party services an app may load. Each one adds its hosts to the\n * directives it needs; nothing is allowed unless the app names it.\n *\n * - `stripe`: the billing feature (`@carlonicora/nextjs-jsonapi/billing`).\n * - `googleMaps`: `FormPlaceAutocomplete` (Places API) and Maps JS/static tiles.\n * - `turnstile`: Cloudflare Turnstile widgets (contact and waitlist forms).\n * - `discord`: Discord avatars shown for users who log in with Discord.\n * - `googleFonts`: fonts linked at runtime from Google Fonts. Not needed for\n * `next/font/google`, which self-hosts at build time.\n */\nexport type CspService = \"stripe\" | \"googleMaps\" | \"turnstile\" | \"discord\" | \"googleFonts\";\n\nexport interface CspOptions {\n services?: CspService[];\n csp?: Partial<Record<CspDirective, string[]>>;\n}\n\nconst SERVICE_SOURCES: Record<CspService, Partial<Record<CspDirective, string[]>>> = {\n stripe: {\n \"script-src\": [\"https://js.stripe.com\"],\n \"img-src\": [\"https://*.stripe.com\"],\n \"connect-src\": [\"https://api.stripe.com\"],\n \"frame-src\": [\"https://js.stripe.com\", \"https://hooks.stripe.com\"],\n },\n googleMaps: {\n \"script-src\": [\"https://maps.googleapis.com\"],\n \"img-src\": [\"https://maps.googleapis.com\", \"https://maps.gstatic.com\"],\n \"connect-src\": [\"https://maps.googleapis.com\", \"https://places.googleapis.com\"],\n },\n turnstile: {\n \"script-src\": [\"https://challenges.cloudflare.com\"],\n \"connect-src\": [\"https://challenges.cloudflare.com\"],\n \"frame-src\": [\"https://challenges.cloudflare.com\"],\n },\n discord: {\n \"img-src\": [\"https://cdn.discordapp.com\"],\n },\n googleFonts: {\n \"style-src\": [\"https://fonts.googleapis.com\"],\n \"font-src\": [\"https://fonts.gstatic.com\"],\n },\n};\n\nfunction listImageSources(env: NodeJS.ProcessEnv): string[] {\n return env.IMAGE_SOURCES ? env.IMAGE_SOURCES.split(\",\").map((s) => s.trim()) : [];\n}\n\n// Build CSP directives\n// Note: 'unsafe-inline' and 'unsafe-eval' needed for Next.js dev mode and some runtime features\n// In production, consider using nonces for stricter CSP\nexport function buildCsp(options: CspOptions, env: NodeJS.ProcessEnv): string {\n const apiUrl = env.NEXT_PUBLIC_API_URL || \"\";\n const imageSources = listImageSources(env);\n const services = options.services ?? [];\n\n // Each fetch directive: what Next itself needs, then the named services, then\n // the app's extras, then the sources derived from the env.\n const fetchDirectives: Record<CspDirective, { base: string[]; fromEnv: string[] }> = {\n // Scripts: self, and unsafe-inline/eval for Next.js\n \"script-src\": { base: [\"'self'\", \"'unsafe-inline'\", \"'unsafe-eval'\"], fromEnv: [] },\n // Styles: self and unsafe-inline for styled-components/emotion\n \"style-src\": { base: [\"'self'\", \"'unsafe-inline'\"], fromEnv: [] },\n // Images: self, data URIs, blobs, and configured image sources\n \"img-src\": { base: [\"'self'\", \"data:\", \"blob:\"], fromEnv: imageSources },\n // Fonts: self\n \"font-src\": { base: [\"'self'\"], fromEnv: [] },\n // Connect: self, API (http + ws for socket.io), and storage (for uploads)\n \"connect-src\": {\n base: [\"'self'\"],\n fromEnv: [\n apiUrl,\n // Add WebSocket URL for socket.io (convert http->ws, https->wss)\n apiUrl.replace(/^http/, \"ws\"),\n env.NEXT_PUBLIC_ADDRESS || \"\",\n ...imageSources,\n ],\n },\n // Frames: self\n \"frame-src\": { base: [\"'self'\"], fromEnv: [] },\n // Worker sources: self and blob (for Web Workers with dynamic imports)\n \"worker-src\": { base: [\"'self'\", \"blob:\"], fromEnv: [] },\n };\n\n const directive = (name: CspDirective): string => {\n const { base, fromEnv } = fetchDirectives[name];\n const fromServices = services.flatMap((service) => SERVICE_SOURCES[service][name] ?? []);\n const sources = [...base, ...fromServices, ...(options.csp?.[name] ?? []), ...fromEnv].filter(\n (source) => source !== \"\",\n );\n return [name, ...new Set(sources)].join(\" \");\n };\n\n return [\n \"default-src 'self'\",\n directive(\"script-src\"),\n directive(\"style-src\"),\n directive(\"img-src\"),\n directive(\"font-src\"),\n directive(\"connect-src\"),\n directive(\"frame-src\"),\n // Frame ancestors: deny embedding (equivalent to X-Frame-Options: DENY)\n \"frame-ancestors 'none'\",\n // Form actions: only self\n \"form-action 'self'\",\n // Base URI: only self\n \"base-uri 'self'\",\n // Object sources: none (no plugins)\n \"object-src 'none'\",\n directive(\"worker-src\"),\n // Upgrade insecure requests in production.\n //\n // NOT under E2E_BUILD: the e2e harness runs a PRODUCTION build (for speed)\n // and serves it over plain http on a custom hostname. With this directive\n // the browser rewrites every /_next/static asset to https, which nothing is\n // listening on — every chunk fails with ERR_SSL_PROTOCOL_ERROR, the page\n // never hydrates, and each spec sees only server-rendered markup.\n env.NODE_ENV === \"production\" && env.E2E_BUILD !== \"true\" ? \"upgrade-insecure-requests\" : \"\",\n ]\n .filter(Boolean)\n .join(\"; \");\n}\n","// Runtime imports: relative only. See csp.ts.\nimport { buildCsp, type CspOptions } from \"./csp\";\n\nexport interface SecurityHeaderOptions extends CspOptions {\n permissionsPolicy?: { camera?: \"none\" | \"self\" };\n}\n\nexport interface HeaderRule {\n source: string;\n headers: { key: string; value: string }[];\n}\n\nexport function buildSecurityHeaders(options: SecurityHeaderOptions, env: NodeJS.ProcessEnv): HeaderRule[] {\n const camera = options.permissionsPolicy?.camera === \"none\" ? \"\" : \"self\";\n\n return [\n {\n // Apply to all routes\n source: \"/:path*\",\n headers: [\n // Content Security Policy - prevents XSS attacks\n {\n key: \"Content-Security-Policy\",\n value: buildCsp(options, env),\n },\n // X-Frame-Options - prevents clickjacking (backup for older browsers)\n {\n key: \"X-Frame-Options\",\n value: \"DENY\",\n },\n // X-Content-Type-Options - prevents MIME sniffing\n {\n key: \"X-Content-Type-Options\",\n value: \"nosniff\",\n },\n // Strict-Transport-Security - enforces HTTPS (1 year, include subdomains).\n // Omitted under E2E_BUILD for the same reason as upgrade-insecure-requests:\n // the suite speaks plain http, and an HSTS pin would force https on every\n // later request to this host from the same browser profile.\n ...(env.E2E_BUILD === \"true\"\n ? []\n : [\n {\n key: \"Strict-Transport-Security\",\n value: \"max-age=31536000; includeSubDomains\",\n },\n ]),\n // Referrer-Policy - controls referrer information\n {\n key: \"Referrer-Policy\",\n value: \"strict-origin-when-cross-origin\",\n },\n // Permissions-Policy - restricts browser features\n {\n key: \"Permissions-Policy\",\n value: `camera=(${camera}), microphone=(), geolocation=()`,\n },\n ],\n },\n ];\n}\n","// Shared next.config for the nja fleet. Apps wrap the result with their own\n// plugins: `withNextIntl(withMDX(createNextConfig({...})))`.\n//\n// next.config.js is loaded at RUNTIME by `next start`, and the production image\n// installs with --prod. This entry may therefore import only Node built-ins at\n// runtime: never next-intl, @next/mdx, serwist or any devDependency. `next` is\n// imported for its types only.\nimport type { NextConfig } from \"next\";\nimport { buildCsp, type CspDirective, type CspService } from \"./csp\";\nimport { buildSecurityHeaders } from \"./headers\";\n\nexport { buildCsp };\nexport type { CspDirective, CspService };\n\nexport interface NjaNextConfigOptions {\n devOrigins: string[];\n /** Third-party services the app loads; each adds its own hosts to the CSP. Nothing is allowed by default. */\n services?: CspService[];\n /** Extra CSP sources per directive, for hosts no named service covers. */\n csp?: Partial<Record<CspDirective, string[]>>;\n env?: Record<string, string>;\n imageMinimumCacheTTL?: number;\n permissionsPolicy?: { camera?: \"none\" | \"self\" };\n mdx?: boolean;\n serwist?: boolean;\n securityHeaders?: boolean;\n authInterrupts?: boolean;\n reactCompiler?: boolean;\n rewrites?: NextConfig[\"rewrites\"];\n extend?: (config: NextConfig) => NextConfig;\n}\n\ntype RemotePattern = { protocol: \"http\" | \"https\"; hostname: string; port?: string };\n\nfunction parseImageSources(env: NodeJS.ProcessEnv): RemotePattern[] {\n return env.IMAGE_SOURCES\n ? env.IMAGE_SOURCES.split(\",\").map((url) => {\n const { hostname, protocol, port } = new URL(url.trim());\n return {\n protocol: protocol.replace(\":\", \"\") as RemotePattern[\"protocol\"],\n hostname,\n port: port || undefined,\n };\n })\n : [];\n}\n\nexport function createNextConfig(options: NjaNextConfigOptions): NextConfig {\n const env = process.env;\n const reactCompiler = options.reactCompiler === true;\n\n const config: NextConfig = {\n // The e2e stack (scripts/e2e.sh) runs a PRODUCTION build of this app while a\n // `next dev` server may still be running against the same worktree. `next\n // build` and `next dev` share `.next`, so a build performed underneath a live\n // dev server clobbers it and that dev server then 404s every route. Giving\n // the e2e build its own directory keeps the two independent. E2E_BUILD must\n // be set for `next build` AND for `next start`, or `start` looks in `.next`\n // and serves someone else's output.\n ...(env.E2E_BUILD === \"true\" ? { distDir: \".next-e2e\" } : {}),\n cacheComponents: true,\n partialPrefetching: true,\n reactCompiler,\n experimental: {\n serverActions: {\n bodySizeLimit: \"5mb\",\n },\n // Required by `unauthorized()` (next/navigation), which ServerSession.checkPermission\n // calls to deny access. Without this flag the function throws a plain Error instead of\n // rendering the nearest unauthorized.tsx.\n authInterrupts: options.authInterrupts ?? true,\n turbopackGc: true,\n turbopackLazyDynamicImports: true,\n ...(reactCompiler ? { turbopackRustReactCompiler: true } : {}),\n },\n allowedDevOrigins: options.devOrigins,\n pageExtensions: options.mdx ? [\"ts\", \"tsx\", \"mdx\"] : [\"ts\", \"tsx\"],\n images: {\n minimumCacheTTL: options.imageMinimumCacheTTL ?? 60,\n remotePatterns: parseImageSources(env),\n dangerouslyAllowLocalIP: true,\n },\n poweredByHeader: false,\n reactStrictMode: false,\n env: {\n NEXT_PUBLIC_API_URL: env.NEXT_PUBLIC_API_URL ?? \"\",\n NEXT_PUBLIC_ADDRESS: env.NEXT_PUBLIC_ADDRESS ?? \"\",\n NEXT_PUBLIC_VAPID_PUBLIC_KEY: env.NEXT_PUBLIC_VAPID_PUBLIC_KEY ?? \"\",\n NEXT_PUBLIC_GOOGLE_MAPS_API_KEY: env.NEXT_PUBLIC_GOOGLE_MAPS_API_KEY ?? \"\",\n ...options.env,\n },\n // Inlined replacement for @serwist/turbopack's withSerwist wrapper, which\n // does nothing but append these two entries. Requiring the package here\n // instead CRASHES production: it is a devDependency, next.config.js is loaded\n // at RUNTIME by `next start`, and the web-production image installs with\n // --prod. Do not re-add a require of any devDependency to this file.\n ...(options.serwist ? { serverExternalPackages: [\"esbuild\", \"esbuild-wasm\"] } : {}),\n // Next 16 builds AND serves dev with Turbopack, so this is what pins yjs to a\n // single instance in both modes.\n turbopack: {\n resolveAlias: {\n yjs: \"./node_modules/yjs\",\n },\n },\n };\n\n if (options.securityHeaders !== false) {\n config.headers = async () => buildSecurityHeaders(options, process.env);\n }\n\n if (options.rewrites) config.rewrites = options.rewrites;\n\n return options.extend ? options.extend(config) : config;\n}\n"]}
1
+ {"version":3,"sources":["/home/runner/work/nextjs-jsonapi/nextjs-jsonapi/dist/next-config/index.js","../../src/next-config/csp.ts","../../src/next-config/headers.ts","../../src/next-config/index.ts"],"names":[],"mappings":"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","file":"/home/runner/work/nextjs-jsonapi/nextjs-jsonapi/dist/next-config/index.js","sourcesContent":[null,"// Runtime imports: none. next.config.js loads this at RUNTIME under `next start`\n// in an image installed with --prod, so it may import only Node built-ins.\n\nexport type CspDirective =\n \"script-src\" | \"style-src\" | \"img-src\" | \"font-src\" | \"connect-src\" | \"frame-src\" | \"worker-src\";\n\n/**\n * Third-party services an app may load. Each one adds its hosts to the\n * directives it needs; nothing is allowed unless the app names it.\n *\n * - `stripe`: the billing feature (`@carlonicora/nextjs-jsonapi/billing`).\n * - `googleMaps`: `FormPlaceAutocomplete` (Places API) and Maps JS/static tiles.\n * - `turnstile`: Cloudflare Turnstile widgets (contact and waitlist forms).\n * - `discord`: Discord avatars shown for users who log in with Discord.\n * - `googleFonts`: fonts linked at runtime from Google Fonts. Not needed for\n * `next/font/google`, which self-hosts at build time.\n */\nexport type CspService = \"stripe\" | \"googleMaps\" | \"turnstile\" | \"discord\" | \"googleFonts\";\n\nexport interface CspOptions {\n services?: CspService[];\n csp?: Partial<Record<CspDirective, string[]>>;\n}\n\nconst SERVICE_SOURCES: Record<CspService, Partial<Record<CspDirective, string[]>>> = {\n stripe: {\n \"script-src\": [\"https://js.stripe.com\"],\n \"img-src\": [\"https://*.stripe.com\"],\n \"connect-src\": [\"https://api.stripe.com\"],\n \"frame-src\": [\"https://js.stripe.com\", \"https://hooks.stripe.com\"],\n },\n googleMaps: {\n \"script-src\": [\"https://maps.googleapis.com\"],\n \"img-src\": [\"https://maps.googleapis.com\", \"https://maps.gstatic.com\"],\n \"connect-src\": [\"https://maps.googleapis.com\", \"https://places.googleapis.com\"],\n },\n turnstile: {\n \"script-src\": [\"https://challenges.cloudflare.com\"],\n \"connect-src\": [\"https://challenges.cloudflare.com\"],\n \"frame-src\": [\"https://challenges.cloudflare.com\"],\n },\n discord: {\n \"img-src\": [\"https://cdn.discordapp.com\"],\n },\n googleFonts: {\n \"style-src\": [\"https://fonts.googleapis.com\"],\n \"font-src\": [\"https://fonts.gstatic.com\"],\n },\n};\n\nfunction listImageSources(env: NodeJS.ProcessEnv): string[] {\n return env.IMAGE_SOURCES ? env.IMAGE_SOURCES.split(\",\").map((s) => s.trim()) : [];\n}\n\n// Build CSP directives\n// Note: 'unsafe-inline' and 'unsafe-eval' needed for Next.js dev mode and some runtime features\n// In production, consider using nonces for stricter CSP\nexport function buildCsp(options: CspOptions, env: NodeJS.ProcessEnv): string {\n const apiUrl = env.NEXT_PUBLIC_API_URL || \"\";\n const imageSources = listImageSources(env);\n const services = options.services ?? [];\n\n // Each fetch directive: what Next itself needs, then the named services, then\n // the app's extras, then the sources derived from the env.\n const fetchDirectives: Record<CspDirective, { base: string[]; fromEnv: string[] }> = {\n // Scripts: self, and unsafe-inline/eval for Next.js\n \"script-src\": { base: [\"'self'\", \"'unsafe-inline'\", \"'unsafe-eval'\"], fromEnv: [] },\n // Styles: self and unsafe-inline for styled-components/emotion\n \"style-src\": { base: [\"'self'\", \"'unsafe-inline'\"], fromEnv: [] },\n // Images: self, data URIs, blobs, and configured image sources\n \"img-src\": { base: [\"'self'\", \"data:\", \"blob:\"], fromEnv: imageSources },\n // Fonts: self\n \"font-src\": { base: [\"'self'\"], fromEnv: [] },\n // Connect: self, API (http + ws for socket.io), and storage (for uploads)\n \"connect-src\": {\n base: [\"'self'\"],\n fromEnv: [\n apiUrl,\n // Add WebSocket URL for socket.io (convert http->ws, https->wss)\n apiUrl.replace(/^http/, \"ws\"),\n env.NEXT_PUBLIC_ADDRESS || \"\",\n ...imageSources,\n ],\n },\n // Frames: self\n \"frame-src\": { base: [\"'self'\"], fromEnv: [] },\n // Worker sources: self and blob (for Web Workers with dynamic imports)\n \"worker-src\": { base: [\"'self'\", \"blob:\"], fromEnv: [] },\n };\n\n const directive = (name: CspDirective): string => {\n const { base, fromEnv } = fetchDirectives[name];\n const fromServices = services.flatMap((service) => SERVICE_SOURCES[service][name] ?? []);\n const sources = [...base, ...fromServices, ...(options.csp?.[name] ?? []), ...fromEnv].filter(\n (source) => source !== \"\",\n );\n return [name, ...new Set(sources)].join(\" \");\n };\n\n return [\n \"default-src 'self'\",\n directive(\"script-src\"),\n directive(\"style-src\"),\n directive(\"img-src\"),\n directive(\"font-src\"),\n directive(\"connect-src\"),\n directive(\"frame-src\"),\n // Frame ancestors: deny embedding (equivalent to X-Frame-Options: DENY)\n \"frame-ancestors 'none'\",\n // Form actions: only self\n \"form-action 'self'\",\n // Base URI: only self\n \"base-uri 'self'\",\n // Object sources: none (no plugins)\n \"object-src 'none'\",\n directive(\"worker-src\"),\n // Upgrade insecure requests in production.\n //\n // NOT under E2E_BUILD: the e2e harness runs a PRODUCTION build (for speed)\n // and serves it over plain http on a custom hostname. With this directive\n // the browser rewrites every /_next/static asset to https, which nothing is\n // listening on — every chunk fails with ERR_SSL_PROTOCOL_ERROR, the page\n // never hydrates, and each spec sees only server-rendered markup.\n env.NODE_ENV === \"production\" && env.E2E_BUILD !== \"true\" ? \"upgrade-insecure-requests\" : \"\",\n ]\n .filter(Boolean)\n .join(\"; \");\n}\n","// Runtime imports: relative only. See csp.ts.\nimport { buildCsp, type CspOptions } from \"./csp\";\n\nexport interface SecurityHeaderOptions extends CspOptions {\n permissionsPolicy?: { camera?: \"none\" | \"self\" };\n}\n\nexport interface HeaderRule {\n source: string;\n headers: { key: string; value: string }[];\n}\n\nexport function buildSecurityHeaders(options: SecurityHeaderOptions, env: NodeJS.ProcessEnv): HeaderRule[] {\n const camera = options.permissionsPolicy?.camera === \"none\" ? \"\" : \"self\";\n\n return [\n {\n // Apply to all routes\n source: \"/:path*\",\n headers: [\n // Content Security Policy - prevents XSS attacks\n {\n key: \"Content-Security-Policy\",\n value: buildCsp(options, env),\n },\n // X-Frame-Options - prevents clickjacking (backup for older browsers)\n {\n key: \"X-Frame-Options\",\n value: \"DENY\",\n },\n // X-Content-Type-Options - prevents MIME sniffing\n {\n key: \"X-Content-Type-Options\",\n value: \"nosniff\",\n },\n // Strict-Transport-Security - enforces HTTPS (1 year, include subdomains).\n // Omitted under E2E_BUILD for the same reason as upgrade-insecure-requests:\n // the suite speaks plain http, and an HSTS pin would force https on every\n // later request to this host from the same browser profile.\n ...(env.E2E_BUILD === \"true\"\n ? []\n : [\n {\n key: \"Strict-Transport-Security\",\n value: \"max-age=31536000; includeSubDomains\",\n },\n ]),\n // Referrer-Policy - controls referrer information\n {\n key: \"Referrer-Policy\",\n value: \"strict-origin-when-cross-origin\",\n },\n // Permissions-Policy - restricts browser features\n {\n key: \"Permissions-Policy\",\n value: `camera=(${camera}), microphone=(), geolocation=()`,\n },\n ],\n },\n ];\n}\n","// Shared next.config for the nja fleet. Apps wrap the result with their own\n// plugins: `withNextIntl(withMDX(createNextConfig({...})))`.\n//\n// next.config.js is loaded at RUNTIME by `next start`, and the production image\n// installs with --prod. This entry may therefore import only Node built-ins at\n// runtime: never next-intl, @next/mdx, serwist or any devDependency. `next` is\n// imported for its types only.\nimport type { NextConfig } from \"next\";\nimport { buildCsp, type CspDirective, type CspService } from \"./csp\";\nimport { buildSecurityHeaders } from \"./headers\";\n\nexport { buildCsp };\nexport type { CspDirective, CspService };\n\nexport interface NjaNextConfigOptions {\n devOrigins: string[];\n /** Third-party services the app loads; each adds its own hosts to the CSP. Nothing is allowed by default. */\n services?: CspService[];\n /** Extra CSP sources per directive, for hosts no named service covers. */\n csp?: Partial<Record<CspDirective, string[]>>;\n env?: Record<string, string>;\n imageMinimumCacheTTL?: number;\n permissionsPolicy?: { camera?: \"none\" | \"self\" };\n mdx?: boolean;\n serwist?: boolean;\n securityHeaders?: boolean;\n authInterrupts?: boolean;\n reactCompiler?: boolean;\n rewrites?: NextConfig[\"rewrites\"];\n extend?: (config: NextConfig) => NextConfig;\n}\n\ntype RemotePattern = { protocol: \"http\" | \"https\"; hostname: string; port?: string };\n\nfunction parseImageSources(env: NodeJS.ProcessEnv): RemotePattern[] {\n return env.IMAGE_SOURCES\n ? env.IMAGE_SOURCES.split(\",\").map((url) => {\n const { hostname, protocol, port } = new URL(url.trim());\n return {\n protocol: protocol.replace(\":\", \"\") as RemotePattern[\"protocol\"],\n hostname,\n port: port || undefined,\n };\n })\n : [];\n}\n\nexport function createNextConfig(options: NjaNextConfigOptions): NextConfig {\n const env = process.env;\n const reactCompiler = options.reactCompiler === true;\n\n const config: NextConfig = {\n // The e2e stack (scripts/e2e.sh) runs a PRODUCTION build of this app while a\n // `next dev` server may still be running against the same worktree. `next\n // build` and `next dev` share `.next`, so a build performed underneath a live\n // dev server clobbers it and that dev server then 404s every route. Giving\n // the e2e build its own directory keeps the two independent. E2E_BUILD must\n // be set for `next build` AND for `next start`, or `start` looks in `.next`\n // and serves someone else's output.\n ...(env.E2E_BUILD === \"true\" ? { distDir: \".next-e2e\" } : {}),\n cacheComponents: true,\n partialPrefetching: true,\n reactCompiler,\n experimental: {\n serverActions: {\n bodySizeLimit: \"5mb\",\n },\n // Required by `unauthorized()` (next/navigation): without this flag it throws a plain\n // Error instead of rendering the nearest unauthorized.tsx. The flag is for app code that\n // calls it; ServerSession.checkPermission does not, it still does `redirect(\"/401\")`.\n authInterrupts: options.authInterrupts ?? true,\n turbopackGc: true,\n // No turbopackLazyDynamicImports: in `next dev` it leaves this package's lazily\n // imported request module unactivated (\"Lazily compiled dynamic import of ...\n // JsonApiRequest ... was not activated\"), so every client-side read returns\n // nothing. Seen with the package installed from npm; production builds are unaffected.\n ...(reactCompiler ? { turbopackRustReactCompiler: true } : {}),\n },\n allowedDevOrigins: options.devOrigins,\n pageExtensions: options.mdx ? [\"ts\", \"tsx\", \"mdx\"] : [\"ts\", \"tsx\"],\n images: {\n minimumCacheTTL: options.imageMinimumCacheTTL ?? 60,\n remotePatterns: parseImageSources(env),\n dangerouslyAllowLocalIP: true,\n },\n poweredByHeader: false,\n reactStrictMode: false,\n env: {\n NEXT_PUBLIC_API_URL: env.NEXT_PUBLIC_API_URL ?? \"\",\n NEXT_PUBLIC_ADDRESS: env.NEXT_PUBLIC_ADDRESS ?? \"\",\n NEXT_PUBLIC_VAPID_PUBLIC_KEY: env.NEXT_PUBLIC_VAPID_PUBLIC_KEY ?? \"\",\n NEXT_PUBLIC_GOOGLE_MAPS_API_KEY: env.NEXT_PUBLIC_GOOGLE_MAPS_API_KEY ?? \"\",\n ...options.env,\n },\n // Inlined replacement for @serwist/turbopack's withSerwist wrapper, which\n // does nothing but append these two entries. Requiring the package here\n // instead CRASHES production: it is a devDependency, next.config.js is loaded\n // at RUNTIME by `next start`, and the web-production image installs with\n // --prod. Do not re-add a require of any devDependency to this file.\n ...(options.serwist ? { serverExternalPackages: [\"esbuild\", \"esbuild-wasm\"] } : {}),\n // Next 16 builds AND serves dev with Turbopack, so this is what pins yjs to a\n // single instance in both modes.\n turbopack: {\n resolveAlias: {\n yjs: \"./node_modules/yjs\",\n },\n },\n };\n\n if (options.securityHeaders !== false) {\n config.headers = async () => buildSecurityHeaders(options, process.env);\n }\n\n if (options.rewrites) config.rewrites = options.rewrites;\n\n return options.extend ? options.extend(config) : config;\n}\n"]}
@@ -178,12 +178,15 @@ function createNextConfig(options) {
178
178
  serverActions: {
179
179
  bodySizeLimit: "5mb"
180
180
  },
181
- // Required by `unauthorized()` (next/navigation), which ServerSession.checkPermission
182
- // calls to deny access. Without this flag the function throws a plain Error instead of
183
- // rendering the nearest unauthorized.tsx.
181
+ // Required by `unauthorized()` (next/navigation): without this flag it throws a plain
182
+ // Error instead of rendering the nearest unauthorized.tsx. The flag is for app code that
183
+ // calls it; ServerSession.checkPermission does not, it still does `redirect("/401")`.
184
184
  authInterrupts: options.authInterrupts ?? true,
185
185
  turbopackGc: true,
186
- turbopackLazyDynamicImports: true,
186
+ // No turbopackLazyDynamicImports: in `next dev` it leaves this package's lazily
187
+ // imported request module unactivated ("Lazily compiled dynamic import of ...
188
+ // JsonApiRequest ... was not activated"), so every client-side read returns
189
+ // nothing. Seen with the package installed from npm; production builds are unaffected.
187
190
  ...reactCompiler ? { turbopackRustReactCompiler: true } : {}
188
191
  },
189
192
  allowedDevOrigins: options.devOrigins,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/next-config/csp.ts","../../src/next-config/headers.ts","../../src/next-config/index.ts"],"sourcesContent":["// Runtime imports: none. next.config.js loads this at RUNTIME under `next start`\n// in an image installed with --prod, so it may import only Node built-ins.\n\nexport type CspDirective =\n \"script-src\" | \"style-src\" | \"img-src\" | \"font-src\" | \"connect-src\" | \"frame-src\" | \"worker-src\";\n\n/**\n * Third-party services an app may load. Each one adds its hosts to the\n * directives it needs; nothing is allowed unless the app names it.\n *\n * - `stripe`: the billing feature (`@carlonicora/nextjs-jsonapi/billing`).\n * - `googleMaps`: `FormPlaceAutocomplete` (Places API) and Maps JS/static tiles.\n * - `turnstile`: Cloudflare Turnstile widgets (contact and waitlist forms).\n * - `discord`: Discord avatars shown for users who log in with Discord.\n * - `googleFonts`: fonts linked at runtime from Google Fonts. Not needed for\n * `next/font/google`, which self-hosts at build time.\n */\nexport type CspService = \"stripe\" | \"googleMaps\" | \"turnstile\" | \"discord\" | \"googleFonts\";\n\nexport interface CspOptions {\n services?: CspService[];\n csp?: Partial<Record<CspDirective, string[]>>;\n}\n\nconst SERVICE_SOURCES: Record<CspService, Partial<Record<CspDirective, string[]>>> = {\n stripe: {\n \"script-src\": [\"https://js.stripe.com\"],\n \"img-src\": [\"https://*.stripe.com\"],\n \"connect-src\": [\"https://api.stripe.com\"],\n \"frame-src\": [\"https://js.stripe.com\", \"https://hooks.stripe.com\"],\n },\n googleMaps: {\n \"script-src\": [\"https://maps.googleapis.com\"],\n \"img-src\": [\"https://maps.googleapis.com\", \"https://maps.gstatic.com\"],\n \"connect-src\": [\"https://maps.googleapis.com\", \"https://places.googleapis.com\"],\n },\n turnstile: {\n \"script-src\": [\"https://challenges.cloudflare.com\"],\n \"connect-src\": [\"https://challenges.cloudflare.com\"],\n \"frame-src\": [\"https://challenges.cloudflare.com\"],\n },\n discord: {\n \"img-src\": [\"https://cdn.discordapp.com\"],\n },\n googleFonts: {\n \"style-src\": [\"https://fonts.googleapis.com\"],\n \"font-src\": [\"https://fonts.gstatic.com\"],\n },\n};\n\nfunction listImageSources(env: NodeJS.ProcessEnv): string[] {\n return env.IMAGE_SOURCES ? env.IMAGE_SOURCES.split(\",\").map((s) => s.trim()) : [];\n}\n\n// Build CSP directives\n// Note: 'unsafe-inline' and 'unsafe-eval' needed for Next.js dev mode and some runtime features\n// In production, consider using nonces for stricter CSP\nexport function buildCsp(options: CspOptions, env: NodeJS.ProcessEnv): string {\n const apiUrl = env.NEXT_PUBLIC_API_URL || \"\";\n const imageSources = listImageSources(env);\n const services = options.services ?? [];\n\n // Each fetch directive: what Next itself needs, then the named services, then\n // the app's extras, then the sources derived from the env.\n const fetchDirectives: Record<CspDirective, { base: string[]; fromEnv: string[] }> = {\n // Scripts: self, and unsafe-inline/eval for Next.js\n \"script-src\": { base: [\"'self'\", \"'unsafe-inline'\", \"'unsafe-eval'\"], fromEnv: [] },\n // Styles: self and unsafe-inline for styled-components/emotion\n \"style-src\": { base: [\"'self'\", \"'unsafe-inline'\"], fromEnv: [] },\n // Images: self, data URIs, blobs, and configured image sources\n \"img-src\": { base: [\"'self'\", \"data:\", \"blob:\"], fromEnv: imageSources },\n // Fonts: self\n \"font-src\": { base: [\"'self'\"], fromEnv: [] },\n // Connect: self, API (http + ws for socket.io), and storage (for uploads)\n \"connect-src\": {\n base: [\"'self'\"],\n fromEnv: [\n apiUrl,\n // Add WebSocket URL for socket.io (convert http->ws, https->wss)\n apiUrl.replace(/^http/, \"ws\"),\n env.NEXT_PUBLIC_ADDRESS || \"\",\n ...imageSources,\n ],\n },\n // Frames: self\n \"frame-src\": { base: [\"'self'\"], fromEnv: [] },\n // Worker sources: self and blob (for Web Workers with dynamic imports)\n \"worker-src\": { base: [\"'self'\", \"blob:\"], fromEnv: [] },\n };\n\n const directive = (name: CspDirective): string => {\n const { base, fromEnv } = fetchDirectives[name];\n const fromServices = services.flatMap((service) => SERVICE_SOURCES[service][name] ?? []);\n const sources = [...base, ...fromServices, ...(options.csp?.[name] ?? []), ...fromEnv].filter(\n (source) => source !== \"\",\n );\n return [name, ...new Set(sources)].join(\" \");\n };\n\n return [\n \"default-src 'self'\",\n directive(\"script-src\"),\n directive(\"style-src\"),\n directive(\"img-src\"),\n directive(\"font-src\"),\n directive(\"connect-src\"),\n directive(\"frame-src\"),\n // Frame ancestors: deny embedding (equivalent to X-Frame-Options: DENY)\n \"frame-ancestors 'none'\",\n // Form actions: only self\n \"form-action 'self'\",\n // Base URI: only self\n \"base-uri 'self'\",\n // Object sources: none (no plugins)\n \"object-src 'none'\",\n directive(\"worker-src\"),\n // Upgrade insecure requests in production.\n //\n // NOT under E2E_BUILD: the e2e harness runs a PRODUCTION build (for speed)\n // and serves it over plain http on a custom hostname. With this directive\n // the browser rewrites every /_next/static asset to https, which nothing is\n // listening on — every chunk fails with ERR_SSL_PROTOCOL_ERROR, the page\n // never hydrates, and each spec sees only server-rendered markup.\n env.NODE_ENV === \"production\" && env.E2E_BUILD !== \"true\" ? \"upgrade-insecure-requests\" : \"\",\n ]\n .filter(Boolean)\n .join(\"; \");\n}\n","// Runtime imports: relative only. See csp.ts.\nimport { buildCsp, type CspOptions } from \"./csp\";\n\nexport interface SecurityHeaderOptions extends CspOptions {\n permissionsPolicy?: { camera?: \"none\" | \"self\" };\n}\n\nexport interface HeaderRule {\n source: string;\n headers: { key: string; value: string }[];\n}\n\nexport function buildSecurityHeaders(options: SecurityHeaderOptions, env: NodeJS.ProcessEnv): HeaderRule[] {\n const camera = options.permissionsPolicy?.camera === \"none\" ? \"\" : \"self\";\n\n return [\n {\n // Apply to all routes\n source: \"/:path*\",\n headers: [\n // Content Security Policy - prevents XSS attacks\n {\n key: \"Content-Security-Policy\",\n value: buildCsp(options, env),\n },\n // X-Frame-Options - prevents clickjacking (backup for older browsers)\n {\n key: \"X-Frame-Options\",\n value: \"DENY\",\n },\n // X-Content-Type-Options - prevents MIME sniffing\n {\n key: \"X-Content-Type-Options\",\n value: \"nosniff\",\n },\n // Strict-Transport-Security - enforces HTTPS (1 year, include subdomains).\n // Omitted under E2E_BUILD for the same reason as upgrade-insecure-requests:\n // the suite speaks plain http, and an HSTS pin would force https on every\n // later request to this host from the same browser profile.\n ...(env.E2E_BUILD === \"true\"\n ? []\n : [\n {\n key: \"Strict-Transport-Security\",\n value: \"max-age=31536000; includeSubDomains\",\n },\n ]),\n // Referrer-Policy - controls referrer information\n {\n key: \"Referrer-Policy\",\n value: \"strict-origin-when-cross-origin\",\n },\n // Permissions-Policy - restricts browser features\n {\n key: \"Permissions-Policy\",\n value: `camera=(${camera}), microphone=(), geolocation=()`,\n },\n ],\n },\n ];\n}\n","// Shared next.config for the nja fleet. Apps wrap the result with their own\n// plugins: `withNextIntl(withMDX(createNextConfig({...})))`.\n//\n// next.config.js is loaded at RUNTIME by `next start`, and the production image\n// installs with --prod. This entry may therefore import only Node built-ins at\n// runtime: never next-intl, @next/mdx, serwist or any devDependency. `next` is\n// imported for its types only.\nimport type { NextConfig } from \"next\";\nimport { buildCsp, type CspDirective, type CspService } from \"./csp\";\nimport { buildSecurityHeaders } from \"./headers\";\n\nexport { buildCsp };\nexport type { CspDirective, CspService };\n\nexport interface NjaNextConfigOptions {\n devOrigins: string[];\n /** Third-party services the app loads; each adds its own hosts to the CSP. Nothing is allowed by default. */\n services?: CspService[];\n /** Extra CSP sources per directive, for hosts no named service covers. */\n csp?: Partial<Record<CspDirective, string[]>>;\n env?: Record<string, string>;\n imageMinimumCacheTTL?: number;\n permissionsPolicy?: { camera?: \"none\" | \"self\" };\n mdx?: boolean;\n serwist?: boolean;\n securityHeaders?: boolean;\n authInterrupts?: boolean;\n reactCompiler?: boolean;\n rewrites?: NextConfig[\"rewrites\"];\n extend?: (config: NextConfig) => NextConfig;\n}\n\ntype RemotePattern = { protocol: \"http\" | \"https\"; hostname: string; port?: string };\n\nfunction parseImageSources(env: NodeJS.ProcessEnv): RemotePattern[] {\n return env.IMAGE_SOURCES\n ? env.IMAGE_SOURCES.split(\",\").map((url) => {\n const { hostname, protocol, port } = new URL(url.trim());\n return {\n protocol: protocol.replace(\":\", \"\") as RemotePattern[\"protocol\"],\n hostname,\n port: port || undefined,\n };\n })\n : [];\n}\n\nexport function createNextConfig(options: NjaNextConfigOptions): NextConfig {\n const env = process.env;\n const reactCompiler = options.reactCompiler === true;\n\n const config: NextConfig = {\n // The e2e stack (scripts/e2e.sh) runs a PRODUCTION build of this app while a\n // `next dev` server may still be running against the same worktree. `next\n // build` and `next dev` share `.next`, so a build performed underneath a live\n // dev server clobbers it and that dev server then 404s every route. Giving\n // the e2e build its own directory keeps the two independent. E2E_BUILD must\n // be set for `next build` AND for `next start`, or `start` looks in `.next`\n // and serves someone else's output.\n ...(env.E2E_BUILD === \"true\" ? { distDir: \".next-e2e\" } : {}),\n cacheComponents: true,\n partialPrefetching: true,\n reactCompiler,\n experimental: {\n serverActions: {\n bodySizeLimit: \"5mb\",\n },\n // Required by `unauthorized()` (next/navigation), which ServerSession.checkPermission\n // calls to deny access. Without this flag the function throws a plain Error instead of\n // rendering the nearest unauthorized.tsx.\n authInterrupts: options.authInterrupts ?? true,\n turbopackGc: true,\n turbopackLazyDynamicImports: true,\n ...(reactCompiler ? { turbopackRustReactCompiler: true } : {}),\n },\n allowedDevOrigins: options.devOrigins,\n pageExtensions: options.mdx ? [\"ts\", \"tsx\", \"mdx\"] : [\"ts\", \"tsx\"],\n images: {\n minimumCacheTTL: options.imageMinimumCacheTTL ?? 60,\n remotePatterns: parseImageSources(env),\n dangerouslyAllowLocalIP: true,\n },\n poweredByHeader: false,\n reactStrictMode: false,\n env: {\n NEXT_PUBLIC_API_URL: env.NEXT_PUBLIC_API_URL ?? \"\",\n NEXT_PUBLIC_ADDRESS: env.NEXT_PUBLIC_ADDRESS ?? \"\",\n NEXT_PUBLIC_VAPID_PUBLIC_KEY: env.NEXT_PUBLIC_VAPID_PUBLIC_KEY ?? \"\",\n NEXT_PUBLIC_GOOGLE_MAPS_API_KEY: env.NEXT_PUBLIC_GOOGLE_MAPS_API_KEY ?? \"\",\n ...options.env,\n },\n // Inlined replacement for @serwist/turbopack's withSerwist wrapper, which\n // does nothing but append these two entries. Requiring the package here\n // instead CRASHES production: it is a devDependency, next.config.js is loaded\n // at RUNTIME by `next start`, and the web-production image installs with\n // --prod. Do not re-add a require of any devDependency to this file.\n ...(options.serwist ? { serverExternalPackages: [\"esbuild\", \"esbuild-wasm\"] } : {}),\n // Next 16 builds AND serves dev with Turbopack, so this is what pins yjs to a\n // single instance in both modes.\n turbopack: {\n resolveAlias: {\n yjs: \"./node_modules/yjs\",\n },\n },\n };\n\n if (options.securityHeaders !== false) {\n config.headers = async () => buildSecurityHeaders(options, process.env);\n }\n\n if (options.rewrites) config.rewrites = options.rewrites;\n\n return options.extend ? options.extend(config) : config;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/next-config/csp.ts","../../src/next-config/headers.ts","../../src/next-config/index.ts"],"sourcesContent":["// Runtime imports: none. next.config.js loads this at RUNTIME under `next start`\n// in an image installed with --prod, so it may import only Node built-ins.\n\nexport type CspDirective =\n \"script-src\" | \"style-src\" | \"img-src\" | \"font-src\" | \"connect-src\" | \"frame-src\" | \"worker-src\";\n\n/**\n * Third-party services an app may load. Each one adds its hosts to the\n * directives it needs; nothing is allowed unless the app names it.\n *\n * - `stripe`: the billing feature (`@carlonicora/nextjs-jsonapi/billing`).\n * - `googleMaps`: `FormPlaceAutocomplete` (Places API) and Maps JS/static tiles.\n * - `turnstile`: Cloudflare Turnstile widgets (contact and waitlist forms).\n * - `discord`: Discord avatars shown for users who log in with Discord.\n * - `googleFonts`: fonts linked at runtime from Google Fonts. Not needed for\n * `next/font/google`, which self-hosts at build time.\n */\nexport type CspService = \"stripe\" | \"googleMaps\" | \"turnstile\" | \"discord\" | \"googleFonts\";\n\nexport interface CspOptions {\n services?: CspService[];\n csp?: Partial<Record<CspDirective, string[]>>;\n}\n\nconst SERVICE_SOURCES: Record<CspService, Partial<Record<CspDirective, string[]>>> = {\n stripe: {\n \"script-src\": [\"https://js.stripe.com\"],\n \"img-src\": [\"https://*.stripe.com\"],\n \"connect-src\": [\"https://api.stripe.com\"],\n \"frame-src\": [\"https://js.stripe.com\", \"https://hooks.stripe.com\"],\n },\n googleMaps: {\n \"script-src\": [\"https://maps.googleapis.com\"],\n \"img-src\": [\"https://maps.googleapis.com\", \"https://maps.gstatic.com\"],\n \"connect-src\": [\"https://maps.googleapis.com\", \"https://places.googleapis.com\"],\n },\n turnstile: {\n \"script-src\": [\"https://challenges.cloudflare.com\"],\n \"connect-src\": [\"https://challenges.cloudflare.com\"],\n \"frame-src\": [\"https://challenges.cloudflare.com\"],\n },\n discord: {\n \"img-src\": [\"https://cdn.discordapp.com\"],\n },\n googleFonts: {\n \"style-src\": [\"https://fonts.googleapis.com\"],\n \"font-src\": [\"https://fonts.gstatic.com\"],\n },\n};\n\nfunction listImageSources(env: NodeJS.ProcessEnv): string[] {\n return env.IMAGE_SOURCES ? env.IMAGE_SOURCES.split(\",\").map((s) => s.trim()) : [];\n}\n\n// Build CSP directives\n// Note: 'unsafe-inline' and 'unsafe-eval' needed for Next.js dev mode and some runtime features\n// In production, consider using nonces for stricter CSP\nexport function buildCsp(options: CspOptions, env: NodeJS.ProcessEnv): string {\n const apiUrl = env.NEXT_PUBLIC_API_URL || \"\";\n const imageSources = listImageSources(env);\n const services = options.services ?? [];\n\n // Each fetch directive: what Next itself needs, then the named services, then\n // the app's extras, then the sources derived from the env.\n const fetchDirectives: Record<CspDirective, { base: string[]; fromEnv: string[] }> = {\n // Scripts: self, and unsafe-inline/eval for Next.js\n \"script-src\": { base: [\"'self'\", \"'unsafe-inline'\", \"'unsafe-eval'\"], fromEnv: [] },\n // Styles: self and unsafe-inline for styled-components/emotion\n \"style-src\": { base: [\"'self'\", \"'unsafe-inline'\"], fromEnv: [] },\n // Images: self, data URIs, blobs, and configured image sources\n \"img-src\": { base: [\"'self'\", \"data:\", \"blob:\"], fromEnv: imageSources },\n // Fonts: self\n \"font-src\": { base: [\"'self'\"], fromEnv: [] },\n // Connect: self, API (http + ws for socket.io), and storage (for uploads)\n \"connect-src\": {\n base: [\"'self'\"],\n fromEnv: [\n apiUrl,\n // Add WebSocket URL for socket.io (convert http->ws, https->wss)\n apiUrl.replace(/^http/, \"ws\"),\n env.NEXT_PUBLIC_ADDRESS || \"\",\n ...imageSources,\n ],\n },\n // Frames: self\n \"frame-src\": { base: [\"'self'\"], fromEnv: [] },\n // Worker sources: self and blob (for Web Workers with dynamic imports)\n \"worker-src\": { base: [\"'self'\", \"blob:\"], fromEnv: [] },\n };\n\n const directive = (name: CspDirective): string => {\n const { base, fromEnv } = fetchDirectives[name];\n const fromServices = services.flatMap((service) => SERVICE_SOURCES[service][name] ?? []);\n const sources = [...base, ...fromServices, ...(options.csp?.[name] ?? []), ...fromEnv].filter(\n (source) => source !== \"\",\n );\n return [name, ...new Set(sources)].join(\" \");\n };\n\n return [\n \"default-src 'self'\",\n directive(\"script-src\"),\n directive(\"style-src\"),\n directive(\"img-src\"),\n directive(\"font-src\"),\n directive(\"connect-src\"),\n directive(\"frame-src\"),\n // Frame ancestors: deny embedding (equivalent to X-Frame-Options: DENY)\n \"frame-ancestors 'none'\",\n // Form actions: only self\n \"form-action 'self'\",\n // Base URI: only self\n \"base-uri 'self'\",\n // Object sources: none (no plugins)\n \"object-src 'none'\",\n directive(\"worker-src\"),\n // Upgrade insecure requests in production.\n //\n // NOT under E2E_BUILD: the e2e harness runs a PRODUCTION build (for speed)\n // and serves it over plain http on a custom hostname. With this directive\n // the browser rewrites every /_next/static asset to https, which nothing is\n // listening on — every chunk fails with ERR_SSL_PROTOCOL_ERROR, the page\n // never hydrates, and each spec sees only server-rendered markup.\n env.NODE_ENV === \"production\" && env.E2E_BUILD !== \"true\" ? \"upgrade-insecure-requests\" : \"\",\n ]\n .filter(Boolean)\n .join(\"; \");\n}\n","// Runtime imports: relative only. See csp.ts.\nimport { buildCsp, type CspOptions } from \"./csp\";\n\nexport interface SecurityHeaderOptions extends CspOptions {\n permissionsPolicy?: { camera?: \"none\" | \"self\" };\n}\n\nexport interface HeaderRule {\n source: string;\n headers: { key: string; value: string }[];\n}\n\nexport function buildSecurityHeaders(options: SecurityHeaderOptions, env: NodeJS.ProcessEnv): HeaderRule[] {\n const camera = options.permissionsPolicy?.camera === \"none\" ? \"\" : \"self\";\n\n return [\n {\n // Apply to all routes\n source: \"/:path*\",\n headers: [\n // Content Security Policy - prevents XSS attacks\n {\n key: \"Content-Security-Policy\",\n value: buildCsp(options, env),\n },\n // X-Frame-Options - prevents clickjacking (backup for older browsers)\n {\n key: \"X-Frame-Options\",\n value: \"DENY\",\n },\n // X-Content-Type-Options - prevents MIME sniffing\n {\n key: \"X-Content-Type-Options\",\n value: \"nosniff\",\n },\n // Strict-Transport-Security - enforces HTTPS (1 year, include subdomains).\n // Omitted under E2E_BUILD for the same reason as upgrade-insecure-requests:\n // the suite speaks plain http, and an HSTS pin would force https on every\n // later request to this host from the same browser profile.\n ...(env.E2E_BUILD === \"true\"\n ? []\n : [\n {\n key: \"Strict-Transport-Security\",\n value: \"max-age=31536000; includeSubDomains\",\n },\n ]),\n // Referrer-Policy - controls referrer information\n {\n key: \"Referrer-Policy\",\n value: \"strict-origin-when-cross-origin\",\n },\n // Permissions-Policy - restricts browser features\n {\n key: \"Permissions-Policy\",\n value: `camera=(${camera}), microphone=(), geolocation=()`,\n },\n ],\n },\n ];\n}\n","// Shared next.config for the nja fleet. Apps wrap the result with their own\n// plugins: `withNextIntl(withMDX(createNextConfig({...})))`.\n//\n// next.config.js is loaded at RUNTIME by `next start`, and the production image\n// installs with --prod. This entry may therefore import only Node built-ins at\n// runtime: never next-intl, @next/mdx, serwist or any devDependency. `next` is\n// imported for its types only.\nimport type { NextConfig } from \"next\";\nimport { buildCsp, type CspDirective, type CspService } from \"./csp\";\nimport { buildSecurityHeaders } from \"./headers\";\n\nexport { buildCsp };\nexport type { CspDirective, CspService };\n\nexport interface NjaNextConfigOptions {\n devOrigins: string[];\n /** Third-party services the app loads; each adds its own hosts to the CSP. Nothing is allowed by default. */\n services?: CspService[];\n /** Extra CSP sources per directive, for hosts no named service covers. */\n csp?: Partial<Record<CspDirective, string[]>>;\n env?: Record<string, string>;\n imageMinimumCacheTTL?: number;\n permissionsPolicy?: { camera?: \"none\" | \"self\" };\n mdx?: boolean;\n serwist?: boolean;\n securityHeaders?: boolean;\n authInterrupts?: boolean;\n reactCompiler?: boolean;\n rewrites?: NextConfig[\"rewrites\"];\n extend?: (config: NextConfig) => NextConfig;\n}\n\ntype RemotePattern = { protocol: \"http\" | \"https\"; hostname: string; port?: string };\n\nfunction parseImageSources(env: NodeJS.ProcessEnv): RemotePattern[] {\n return env.IMAGE_SOURCES\n ? env.IMAGE_SOURCES.split(\",\").map((url) => {\n const { hostname, protocol, port } = new URL(url.trim());\n return {\n protocol: protocol.replace(\":\", \"\") as RemotePattern[\"protocol\"],\n hostname,\n port: port || undefined,\n };\n })\n : [];\n}\n\nexport function createNextConfig(options: NjaNextConfigOptions): NextConfig {\n const env = process.env;\n const reactCompiler = options.reactCompiler === true;\n\n const config: NextConfig = {\n // The e2e stack (scripts/e2e.sh) runs a PRODUCTION build of this app while a\n // `next dev` server may still be running against the same worktree. `next\n // build` and `next dev` share `.next`, so a build performed underneath a live\n // dev server clobbers it and that dev server then 404s every route. Giving\n // the e2e build its own directory keeps the two independent. E2E_BUILD must\n // be set for `next build` AND for `next start`, or `start` looks in `.next`\n // and serves someone else's output.\n ...(env.E2E_BUILD === \"true\" ? { distDir: \".next-e2e\" } : {}),\n cacheComponents: true,\n partialPrefetching: true,\n reactCompiler,\n experimental: {\n serverActions: {\n bodySizeLimit: \"5mb\",\n },\n // Required by `unauthorized()` (next/navigation): without this flag it throws a plain\n // Error instead of rendering the nearest unauthorized.tsx. The flag is for app code that\n // calls it; ServerSession.checkPermission does not, it still does `redirect(\"/401\")`.\n authInterrupts: options.authInterrupts ?? true,\n turbopackGc: true,\n // No turbopackLazyDynamicImports: in `next dev` it leaves this package's lazily\n // imported request module unactivated (\"Lazily compiled dynamic import of ...\n // JsonApiRequest ... was not activated\"), so every client-side read returns\n // nothing. Seen with the package installed from npm; production builds are unaffected.\n ...(reactCompiler ? { turbopackRustReactCompiler: true } : {}),\n },\n allowedDevOrigins: options.devOrigins,\n pageExtensions: options.mdx ? [\"ts\", \"tsx\", \"mdx\"] : [\"ts\", \"tsx\"],\n images: {\n minimumCacheTTL: options.imageMinimumCacheTTL ?? 60,\n remotePatterns: parseImageSources(env),\n dangerouslyAllowLocalIP: true,\n },\n poweredByHeader: false,\n reactStrictMode: false,\n env: {\n NEXT_PUBLIC_API_URL: env.NEXT_PUBLIC_API_URL ?? \"\",\n NEXT_PUBLIC_ADDRESS: env.NEXT_PUBLIC_ADDRESS ?? \"\",\n NEXT_PUBLIC_VAPID_PUBLIC_KEY: env.NEXT_PUBLIC_VAPID_PUBLIC_KEY ?? \"\",\n NEXT_PUBLIC_GOOGLE_MAPS_API_KEY: env.NEXT_PUBLIC_GOOGLE_MAPS_API_KEY ?? \"\",\n ...options.env,\n },\n // Inlined replacement for @serwist/turbopack's withSerwist wrapper, which\n // does nothing but append these two entries. Requiring the package here\n // instead CRASHES production: it is a devDependency, next.config.js is loaded\n // at RUNTIME by `next start`, and the web-production image installs with\n // --prod. Do not re-add a require of any devDependency to this file.\n ...(options.serwist ? { serverExternalPackages: [\"esbuild\", \"esbuild-wasm\"] } : {}),\n // Next 16 builds AND serves dev with Turbopack, so this is what pins yjs to a\n // single instance in both modes.\n turbopack: {\n resolveAlias: {\n yjs: \"./node_modules/yjs\",\n },\n },\n };\n\n if (options.securityHeaders !== false) {\n config.headers = async () => buildSecurityHeaders(options, process.env);\n }\n\n if (options.rewrites) config.rewrites = options.rewrites;\n\n return options.extend ? options.extend(config) : config;\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=loading.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loading.spec.d.ts","sourceRoot":"","sources":["../../../../scripts/generate-web-module/__tests__/loading.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const vitest_1 = require("vitest");
37
+ const path = __importStar(require("path"));
38
+ const fixtures_1 = require("./fixtures");
39
+ const loading_template_1 = require("../templates/pages/loading.template");
40
+ const list_page_template_1 = require("../templates/pages/list-page.template");
41
+ const detail_page_template_1 = require("../templates/pages/detail-page.template");
42
+ const import_resolver_1 = require("../transformers/import-resolver");
43
+ (0, vitest_1.describe)("loading template", () => {
44
+ (0, vitest_1.it)("renders PageSkeleton verbatim, matching the app convention", () => {
45
+ (0, vitest_1.expect)((0, loading_template_1.generateLoadingTemplate)()).toBe(`import { PageSkeleton } from "@/features/common/components/skeletons/PageSkeleton";
46
+
47
+ export default function Loading() {
48
+ return <PageSkeleton />;
49
+ }
50
+ `);
51
+ });
52
+ (0, vitest_1.it)("places a loading.tsx next to every generated page.tsx", () => {
53
+ const paths = (0, import_resolver_1.buildFilePaths)((0, fixtures_1.makeFrontendData)(), "/repo");
54
+ (0, vitest_1.expect)(paths.listLoading).toBe(path.join(path.dirname(paths.listPage), "loading.tsx"));
55
+ (0, vitest_1.expect)(paths.detailLoading).toBe(path.join(path.dirname(paths.detailPage), "loading.tsx"));
56
+ (0, vitest_1.expect)(paths.listLoading).toBe("/repo/apps/web/src/app/[locale]/(main)/(features)/widgets/loading.tsx");
57
+ (0, vitest_1.expect)(paths.detailLoading).toBe("/repo/apps/web/src/app/[locale]/(main)/(features)/widgets/[id]/loading.tsx");
58
+ });
59
+ (0, vitest_1.it)("both generated pages await data, so both segments need a loading file", () => {
60
+ const data = (0, fixtures_1.makeFrontendData)();
61
+ (0, vitest_1.expect)((0, list_page_template_1.generateListPageTemplate)(data)).toMatch(/export default async function[\s\S]*await /);
62
+ (0, vitest_1.expect)((0, detail_page_template_1.generateDetailPageTemplate)(data)).toMatch(/export default async function[\s\S]*await /);
63
+ });
64
+ });
65
+ //# sourceMappingURL=loading.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loading.spec.js","sourceRoot":"","sources":["../../../../scripts/generate-web-module/__tests__/loading.spec.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,mCAA8C;AAC9C,2CAA6B;AAC7B,yCAA8C;AAC9C,0EAA8E;AAC9E,8EAAiF;AACjF,kFAAqF;AACrF,qEAAiE;AAEjE,IAAA,iBAAQ,EAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,IAAA,WAAE,EAAC,4DAA4D,EAAE,GAAG,EAAE;QACpE,IAAA,eAAM,EAAC,IAAA,0CAAuB,GAAE,CAAC,CAAC,IAAI,CACpC;;;;;CAKL,CACI,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,KAAK,GAAG,IAAA,gCAAc,EAAC,IAAA,2BAAgB,GAAE,EAAE,OAAO,CAAC,CAAC;QAC1D,IAAA,eAAM,EAAC,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC;QACvF,IAAA,eAAM,EAAC,KAAK,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC;QAC3F,IAAA,eAAM,EAAC,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,uEAAuE,CAAC,CAAC;QACxG,IAAA,eAAM,EAAC,KAAK,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,4EAA4E,CAAC,CAAC;IACjH,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,uEAAuE,EAAE,GAAG,EAAE;QAC/E,MAAM,IAAI,GAAG,IAAA,2BAAgB,GAAE,CAAC;QAChC,IAAA,eAAM,EAAC,IAAA,6CAAwB,EAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,4CAA4C,CAAC,CAAC;QAC7F,IAAA,eAAM,EAAC,IAAA,iDAA0B,EAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,4CAA4C,CAAC,CAAC;IACjG,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../../scripts/generate-web-module/generator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA8BH,OAAO,EAAuC,wBAAwB,EAAwB,MAAM,SAAS,CAAC;AAI9G;;;;;GAKG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,OAAO,CAAC,CAoG3F;AA8SD,eAAe,iBAAiB,CAAC"}
1
+ {"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../../scripts/generate-web-module/generator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA+BH,OAAO,EAAuC,wBAAwB,EAAwB,MAAM,SAAS,CAAC;AAI9G;;;;;GAKG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,OAAO,CAAC,CAoG3F;AA2TD,eAAe,iBAAiB,CAAC"}
@@ -353,17 +353,28 @@ function generateAllFiles(data, schema) {
353
353
  content: (0, templates_1.generateModuleTemplate)(data),
354
354
  type: "module",
355
355
  });
356
- // Pages (2 files)
356
+ // Pages (2 files) + a loading.tsx next to each: both pages await data, and
357
+ // under Cache Components every data-fetching segment owns its own boundary.
357
358
  files.push({
358
359
  path: paths.listPage,
359
360
  content: (0, templates_1.generateListPageTemplate)(data),
360
361
  type: "page",
361
362
  });
363
+ files.push({
364
+ path: paths.listLoading,
365
+ content: (0, templates_1.generateLoadingTemplate)(),
366
+ type: "page",
367
+ });
362
368
  files.push({
363
369
  path: paths.detailPage,
364
370
  content: (0, templates_1.generateDetailPageTemplate)(data),
365
371
  type: "page",
366
372
  });
373
+ files.push({
374
+ path: paths.detailLoading,
375
+ content: (0, templates_1.generateLoadingTemplate)(),
376
+ type: "page",
377
+ });
367
378
  return files;
368
379
  }
369
380
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../scripts/generate-web-module/generator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../scripts/generate-web-module/generator.ts"],"names":[],"mappings":"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"}
@@ -8,5 +8,5 @@ export { generateEditorTemplate, generateDeleterTemplate, generateSelectorTempla
8
8
  export { generateContextTemplate } from "./context.template";
9
9
  export { generateTableHookTemplate } from "./table-hook.template";
10
10
  export { generateModuleTemplate } from "./module.template";
11
- export { generateListPageTemplate, generateDetailPageTemplate } from "./pages";
11
+ export { generateListPageTemplate, generateDetailPageTemplate, generateLoadingTemplate } from "./pages";
12
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../scripts/generate-web-module/templates/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,yBAAyB,EACzB,qBAAqB,EACrB,uBAAuB,EACvB,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,QAAQ,CAAC;AAGhB,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,wBAAwB,EACxB,6BAA6B,EAC7B,oBAAoB,EACpB,uBAAuB,EACvB,yBAAyB,EACzB,6BAA6B,GAC9B,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAG3D,OAAO,EAAE,wBAAwB,EAAE,0BAA0B,EAAE,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../scripts/generate-web-module/templates/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,yBAAyB,EACzB,qBAAqB,EACrB,uBAAuB,EACvB,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,QAAQ,CAAC;AAGhB,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,wBAAwB,EACxB,6BAA6B,EAC7B,oBAAoB,EACpB,uBAAuB,EACvB,yBAAyB,EACzB,6BAA6B,GAC9B,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAG3D,OAAO,EAAE,wBAAwB,EAAE,0BAA0B,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAC"}
@@ -5,7 +5,7 @@
5
5
  * Exports all template generators.
6
6
  */
7
7
  Object.defineProperty(exports, "__esModule", { value: true });
8
- exports.generateDetailPageTemplate = exports.generateListPageTemplate = exports.generateModuleTemplate = exports.generateTableHookTemplate = exports.generateContextTemplate = exports.generateListContainerTemplate = exports.generateContainerTemplate = exports.generateContentTemplate = exports.generateListTemplate = exports.generateMultiSelectorTemplate = exports.generateSelectorTemplate = exports.generateDeleterTemplate = exports.generateEditorTemplate = exports.generateAliasesTemplate = exports.generateFieldsTemplate = exports.generateServiceTemplate = exports.generateModelTemplate = exports.generateInterfaceTemplate = void 0;
8
+ exports.generateLoadingTemplate = exports.generateDetailPageTemplate = exports.generateListPageTemplate = exports.generateModuleTemplate = exports.generateTableHookTemplate = exports.generateContextTemplate = exports.generateListContainerTemplate = exports.generateContainerTemplate = exports.generateContentTemplate = exports.generateListTemplate = exports.generateMultiSelectorTemplate = exports.generateSelectorTemplate = exports.generateDeleterTemplate = exports.generateEditorTemplate = exports.generateAliasesTemplate = exports.generateFieldsTemplate = exports.generateServiceTemplate = exports.generateModelTemplate = exports.generateInterfaceTemplate = void 0;
9
9
  // Data layer templates
10
10
  var data_1 = require("./data");
11
11
  Object.defineProperty(exports, "generateInterfaceTemplate", { enumerable: true, get: function () { return data_1.generateInterfaceTemplate; } });
@@ -34,4 +34,5 @@ Object.defineProperty(exports, "generateModuleTemplate", { enumerable: true, get
34
34
  var pages_1 = require("./pages");
35
35
  Object.defineProperty(exports, "generateListPageTemplate", { enumerable: true, get: function () { return pages_1.generateListPageTemplate; } });
36
36
  Object.defineProperty(exports, "generateDetailPageTemplate", { enumerable: true, get: function () { return pages_1.generateDetailPageTemplate; } });
37
+ Object.defineProperty(exports, "generateLoadingTemplate", { enumerable: true, get: function () { return pages_1.generateLoadingTemplate; } });
37
38
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../scripts/generate-web-module/templates/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH,uBAAuB;AACvB,+BAMgB;AALd,iHAAA,yBAAyB,OAAA;AACzB,6GAAA,qBAAqB,OAAA;AACrB,+GAAA,uBAAuB,OAAA;AACvB,8GAAA,sBAAsB,OAAA;AACtB,+GAAA,uBAAuB,OAAA;AAGzB,sBAAsB;AACtB,2CASsB;AARpB,oHAAA,sBAAsB,OAAA;AACtB,qHAAA,uBAAuB,OAAA;AACvB,sHAAA,wBAAwB,OAAA;AACxB,2HAAA,6BAA6B,OAAA;AAC7B,kHAAA,oBAAoB,OAAA;AACpB,qHAAA,uBAAuB,OAAA;AACvB,uHAAA,yBAAyB,OAAA;AACzB,2HAAA,6BAA6B,OAAA;AAG/B,mCAAmC;AACnC,uDAA6D;AAApD,2HAAA,uBAAuB,OAAA;AAChC,6DAAkE;AAAzD,gIAAA,yBAAyB,OAAA;AAClC,qDAA2D;AAAlD,yHAAA,sBAAsB,OAAA;AAE/B,iBAAiB;AACjB,iCAA+E;AAAtE,iHAAA,wBAAwB,OAAA;AAAE,mHAAA,0BAA0B,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../scripts/generate-web-module/templates/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH,uBAAuB;AACvB,+BAMgB;AALd,iHAAA,yBAAyB,OAAA;AACzB,6GAAA,qBAAqB,OAAA;AACrB,+GAAA,uBAAuB,OAAA;AACvB,8GAAA,sBAAsB,OAAA;AACtB,+GAAA,uBAAuB,OAAA;AAGzB,sBAAsB;AACtB,2CASsB;AARpB,oHAAA,sBAAsB,OAAA;AACtB,qHAAA,uBAAuB,OAAA;AACvB,sHAAA,wBAAwB,OAAA;AACxB,2HAAA,6BAA6B,OAAA;AAC7B,kHAAA,oBAAoB,OAAA;AACpB,qHAAA,uBAAuB,OAAA;AACvB,uHAAA,yBAAyB,OAAA;AACzB,2HAAA,6BAA6B,OAAA;AAG/B,mCAAmC;AACnC,uDAA6D;AAApD,2HAAA,uBAAuB,OAAA;AAChC,6DAAkE;AAAzD,gIAAA,yBAAyB,OAAA;AAClC,qDAA2D;AAAlD,yHAAA,sBAAsB,OAAA;AAE/B,iBAAiB;AACjB,iCAAwG;AAA/F,iHAAA,wBAAwB,OAAA;AAAE,mHAAA,0BAA0B,OAAA;AAAE,gHAAA,uBAAuB,OAAA"}
@@ -5,4 +5,5 @@
5
5
  */
6
6
  export { generateListPageTemplate } from "./list-page.template";
7
7
  export { generateDetailPageTemplate } from "./detail-page.template";
8
+ export { generateLoadingTemplate } from "./loading.template";
8
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../scripts/generate-web-module/templates/pages/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../scripts/generate-web-module/templates/pages/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -5,9 +5,11 @@
5
5
  * Exports all page template generators.
6
6
  */
7
7
  Object.defineProperty(exports, "__esModule", { value: true });
8
- exports.generateDetailPageTemplate = exports.generateListPageTemplate = void 0;
8
+ exports.generateLoadingTemplate = exports.generateDetailPageTemplate = exports.generateListPageTemplate = void 0;
9
9
  var list_page_template_1 = require("./list-page.template");
10
10
  Object.defineProperty(exports, "generateListPageTemplate", { enumerable: true, get: function () { return list_page_template_1.generateListPageTemplate; } });
11
11
  var detail_page_template_1 = require("./detail-page.template");
12
12
  Object.defineProperty(exports, "generateDetailPageTemplate", { enumerable: true, get: function () { return detail_page_template_1.generateDetailPageTemplate; } });
13
+ var loading_template_1 = require("./loading.template");
14
+ Object.defineProperty(exports, "generateLoadingTemplate", { enumerable: true, get: function () { return loading_template_1.generateLoadingTemplate; } });
13
15
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../scripts/generate-web-module/templates/pages/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH,2DAAgE;AAAvD,8HAAA,wBAAwB,OAAA;AACjC,+DAAoE;AAA3D,kIAAA,0BAA0B,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../scripts/generate-web-module/templates/pages/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH,2DAAgE;AAAvD,8HAAA,wBAAwB,OAAA;AACjC,+DAAoE;AAA3D,kIAAA,0BAA0B,OAAA;AACnC,uDAA6D;AAApD,2HAAA,uBAAuB,OAAA"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Loading Template
3
+ *
4
+ * Generates the loading.tsx that sits next to every generated page.tsx that
5
+ * awaits data. Under Cache Components each data-fetching route segment owns its
6
+ * own Suspense boundary; a boundary in a parent segment does nothing for a
7
+ * client navigation between siblings.
8
+ *
9
+ * Content matches the app convention verbatim (PageSkeleton from the app's
10
+ * common skeletons).
11
+ */
12
+ /**
13
+ * Generate the loading file content
14
+ *
15
+ * @returns Generated file content
16
+ */
17
+ export declare function generateLoadingTemplate(): string;
18
+ //# sourceMappingURL=loading.template.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loading.template.d.ts","sourceRoot":"","sources":["../../../../../scripts/generate-web-module/templates/pages/loading.template.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH;;;;GAIG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CAOhD"}
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ /**
3
+ * Loading Template
4
+ *
5
+ * Generates the loading.tsx that sits next to every generated page.tsx that
6
+ * awaits data. Under Cache Components each data-fetching route segment owns its
7
+ * own Suspense boundary; a boundary in a parent segment does nothing for a
8
+ * client navigation between siblings.
9
+ *
10
+ * Content matches the app convention verbatim (PageSkeleton from the app's
11
+ * common skeletons).
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.generateLoadingTemplate = generateLoadingTemplate;
15
+ /**
16
+ * Generate the loading file content
17
+ *
18
+ * @returns Generated file content
19
+ */
20
+ function generateLoadingTemplate() {
21
+ return `import { PageSkeleton } from "@/features/common/components/skeletons/PageSkeleton";
22
+
23
+ export default function Loading() {
24
+ return <PageSkeleton />;
25
+ }
26
+ `;
27
+ }
28
+ //# sourceMappingURL=loading.template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loading.template.js","sourceRoot":"","sources":["../../../../../scripts/generate-web-module/templates/pages/loading.template.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;AAOH,0DAOC;AAZD;;;;GAIG;AACH,SAAgB,uBAAuB;IACrC,OAAO;;;;;CAKR,CAAC;AACF,CAAC"}
@@ -85,7 +85,9 @@ export interface ModuleFilePaths {
85
85
  tableHook: string;
86
86
  module: string;
87
87
  listPage: string;
88
+ listLoading: string;
88
89
  detailPage: string;
90
+ detailLoading: string;
89
91
  }
90
92
  /**
91
93
  * Build all file paths for a module from template data
@@ -1 +1 @@
1
- {"version":3,"file":"import-resolver.d.ts","sourceRoot":"","sources":["../../../../scripts/generate-web-module/transformers/import-resolver.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAIhH;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,aAAa,EAAE,oBAAoB,EAAE,EACrC,cAAc,EAAE,OAAO,GACtB,gBAAgB,CAMlB;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,aAAa,EAAE,oBAAoB,EAAE,GAAG,MAAM,EAAE,CAWjF;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,aAAa,EAAE,oBAAoB,EAAE,GAAG,MAAM,EAAE,CAmBpF;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,cAAc,EAAE,OAAO,GAAG,MAAM,EAAE,CAgBrE;AAeD;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf,MAAM,CAKR;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,oBAAoB,GAAG,MAAM,CAGzE;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAK5E;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,oBAAoB,EAC1B,QAAQ,GAAE,MAAW,GACpB,eAAe,CAqCjB;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CA0B5E"}
1
+ {"version":3,"file":"import-resolver.d.ts","sourceRoot":"","sources":["../../../../scripts/generate-web-module/transformers/import-resolver.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAIhH;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,aAAa,EAAE,oBAAoB,EAAE,EACrC,cAAc,EAAE,OAAO,GACtB,gBAAgB,CAMlB;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,aAAa,EAAE,oBAAoB,EAAE,GAAG,MAAM,EAAE,CAWjF;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,aAAa,EAAE,oBAAoB,EAAE,GAAG,MAAM,EAAE,CAmBpF;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,cAAc,EAAE,OAAO,GAAG,MAAM,EAAE,CAgBrE;AAeD;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf,MAAM,CAKR;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,oBAAoB,GAAG,MAAM,CAGzE;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAK5E;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,oBAAoB,EAC1B,QAAQ,GAAE,MAAW,GACpB,eAAe,CAuCjB;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CA0B5E"}
@@ -177,7 +177,9 @@ function buildFilePaths(data, rootPath = "") {
177
177
  module: `${basePath}/${names.pascalCase}Module.ts`,
178
178
  // Pages
179
179
  listPage: `${pagePath}/page.tsx`,
180
+ listLoading: `${pagePath}/loading.tsx`,
180
181
  detailPage: `${pagePath}/[id]/page.tsx`,
182
+ detailLoading: `${pagePath}/[id]/loading.tsx`,
181
183
  };
182
184
  }
183
185
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"import-resolver.js","sourceRoot":"","sources":["../../../../scripts/generate-web-module/transformers/import-resolver.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAaH,sDASC;AAQD,8CAWC;AAQD,oDAmBC;AAQD,kDAgBC;AAuBD,sDASC;AAQD,0DAGC;AASD,wCAKC;AAQD,0CAEC;AAiCD,wCAwCC;AASD,kDA0BC;AAxQD,sEAA8D;AAC9D,yDAA4D;AAE5D;;;;;;GAMG;AACH,SAAgB,qBAAqB,CACnC,aAAqC,EACrC,cAAuB;IAEvB,OAAO;QACL,MAAM,EAAE,iBAAiB,CAAC,aAAa,CAAC;QACxC,SAAS,EAAE,oBAAoB,CAAC,aAAa,CAAC;QAC9C,OAAO,EAAE,mBAAmB,CAAC,cAAc,CAAC;KAC7C,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,SAAgB,iBAAiB,CAAC,aAAqC;IACrE,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,aAAa,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QAC5B,qCAAqC;QACrC,OAAO,CAAC,IAAI,CACV,YAAY,GAAG,CAAC,aAAa,YAAY,GAAG,CAAC,mBAAmB,IAAI,CACrE,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,cAAc;AAC9C,CAAC;AAED;;;;;GAKG;AACH,SAAgB,oBAAoB,CAAC,aAAqC;IACxE,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,aAAa,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QAC5B,8CAA8C;QAC9C,IAAI,GAAG,CAAC,OAAO,KAAK,oCAAc,EAAE,CAAC;YACnC,OAAO;QACT,CAAC;QAED,6EAA6E;QAC7E,MAAM,aAAa,GAAG,GAAG,CAAC,MAAM;YAC9B,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,UAAU;YACvB,CAAC,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,eAAe,CAAC,CAAC;QAC/E,OAAO,CAAC,IAAI,CACV,UAAU,aAAa,UAAU,GAAG,CAAC,UAAU,IAAI,CACpD,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,cAAc;AAC9C,CAAC;AAED;;;;;GAKG;AACH,SAAgB,mBAAmB,CAAC,cAAuB;IACzD,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,6BAA6B;IAC7B,OAAO,CAAC,IAAI,CACV,qEAAqE,CACtE,CAAC;IAEF,8BAA8B;IAC9B,IAAI,cAAc,EAAE,CAAC;QACnB,OAAO,CAAC,IAAI,CACV,6FAA6F,CAC9F,CAAC;IACJ,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;GAMG;AACH,SAAS,mBAAmB,CAAC,SAAiB;IAC5C,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACtC,2FAA2F;IAC3F,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACrC,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,qBAAqB,CACnC,SAAiB,EACjB,UAAkB,EAClB,QAAgB;IAEhB,MAAM,KAAK,GAAG,IAAA,8BAAW,EAAC,UAAU,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;IAC9C,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9C,OAAO,cAAc,UAAU,GAAG,KAAK,SAAS,QAAQ,EAAE,CAAC;AAC7D,CAAC;AAED;;;;;GAKG;AACH,SAAgB,uBAAuB,CAAC,GAAyB;IAC/D,MAAM,aAAa,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,eAAe,CAAC;IACtF,OAAO,cAAc,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,UAAU,qBAAqB,aAAa,EAAE,CAAC;AAC3F,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,cAAc,CAAC,SAAiB,EAAE,UAAkB;IAClE,MAAM,KAAK,GAAG,IAAA,8BAAW,EAAC,UAAU,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;IAC9C,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9C,OAAO,yBAAyB,UAAU,GAAG,KAAK,EAAE,CAAC;AACvD,CAAC;AAED;;;;;GAKG;AACH,SAAgB,eAAe,CAAC,WAAmB;IACjD,OAAO,+CAA+C,WAAW,EAAE,CAAC;AACtE,CAAC;AA0BD;;;;;;GAMG;AACH,SAAgB,cAAc,CAC5B,IAA0B,EAC1B,WAAmB,EAAE;IAErB,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;IAClC,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9C,MAAM,MAAM,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;IAC9C,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9C,MAAM,QAAQ,GAAG,GAAG,MAAM,yBAAyB,UAAU,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;IAClF,MAAM,QAAQ,GAAG,GAAG,MAAM,+CAA+C,KAAK,CAAC,WAAW,EAAE,CAAC;IAE7F,OAAO;QACL,aAAa;QACb,SAAS,EAAE,GAAG,QAAQ,SAAS,KAAK,CAAC,UAAU,cAAc;QAC7D,KAAK,EAAE,GAAG,QAAQ,SAAS,KAAK,CAAC,UAAU,KAAK;QAChD,OAAO,EAAE,GAAG,QAAQ,SAAS,KAAK,CAAC,UAAU,YAAY;QACzD,MAAM,EAAE,GAAG,QAAQ,SAAS,KAAK,CAAC,UAAU,WAAW;QACvD,OAAO,EAAE,GAAG,QAAQ,SAAS,KAAK,CAAC,UAAU,YAAY;QAEzD,aAAa;QACb,MAAM,EAAE,GAAG,QAAQ,qBAAqB,KAAK,CAAC,UAAU,YAAY;QACpE,OAAO,EAAE,GAAG,QAAQ,qBAAqB,KAAK,CAAC,UAAU,aAAa;QACtE,QAAQ,EAAE,GAAG,QAAQ,qBAAqB,KAAK,CAAC,UAAU,cAAc;QACxE,aAAa,EAAE,GAAG,QAAQ,qBAAqB,KAAK,CAAC,UAAU,mBAAmB;QAClF,IAAI,EAAE,GAAG,QAAQ,qBAAqB,KAAK,CAAC,UAAU,UAAU;QAChE,OAAO,EAAE,GAAG,QAAQ,uBAAuB,KAAK,CAAC,UAAU,aAAa;QACxE,SAAS,EAAE,GAAG,QAAQ,0BAA0B,KAAK,CAAC,UAAU,eAAe;QAC/E,aAAa,EAAE,GAAG,QAAQ,0BAA0B,KAAK,CAAC,UAAU,mBAAmB;QAEvF,kBAAkB;QAClB,OAAO,EAAE,GAAG,QAAQ,aAAa,KAAK,CAAC,UAAU,aAAa;QAC9D,SAAS,EAAE,GAAG,QAAQ,aAAa,KAAK,CAAC,UAAU,oBAAoB;QAEvE,SAAS;QACT,MAAM,EAAE,GAAG,QAAQ,IAAI,KAAK,CAAC,UAAU,WAAW;QAElD,QAAQ;QACR,QAAQ,EAAE,GAAG,QAAQ,WAAW;QAChC,UAAU,EAAE,GAAG,QAAQ,gBAAgB;KACxC,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,mBAAmB,CAAC,QAAgB,EAAE,MAAc;IAClE,yCAAyC;IACzC,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,0BAA0B;IAC1B,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAElC,qBAAqB;IACrB,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACpE,IAAI,SAAS,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;YAChC,YAAY,EAAE,CAAC;QACjB,CAAC;aAAM,CAAC;YACN,MAAM;QACR,CAAC;IACH,CAAC;IAED,sBAAsB;IACtB,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,GAAG,YAAY,GAAG,CAAC,CAAC,CAAC,yBAAyB;IAC9E,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAE1D,OAAO,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC1C,CAAC"}
1
+ {"version":3,"file":"import-resolver.js","sourceRoot":"","sources":["../../../../scripts/generate-web-module/transformers/import-resolver.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@carlonicora/nextjs-jsonapi",
3
- "version": "4.0.1",
3
+ "version": "4.0.3",
4
4
  "description": "Next.js JSON:API client with server/client support and caching",
5
5
  "author": "Carlo Nicora",
6
6
  "license": "GPL-3.0-or-later",
@@ -114,10 +114,10 @@
114
114
  "@stripe/react-stripe-js": ">=6.8.0",
115
115
  "@stripe/stripe-js": ">=9.13.0",
116
116
  "@tanstack/react-table": ">=8.0.0",
117
- "next": ">=14.0.0",
118
- "next-intl": ">=3.0.0",
119
- "react": ">=18.0.0",
120
- "react-dom": ">=18.0.0",
117
+ "next": ">=16.4.0",
118
+ "next-intl": ">=4.0.0",
119
+ "react": ">=19.3.0",
120
+ "react-dom": ">=19.3.0",
121
121
  "react-hook-form": ">=7.0.0"
122
122
  },
123
123
  "peerDependenciesMeta": {
@@ -0,0 +1,34 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import * as path from "path";
3
+ import { makeFrontendData } from "./fixtures";
4
+ import { generateLoadingTemplate } from "../templates/pages/loading.template";
5
+ import { generateListPageTemplate } from "../templates/pages/list-page.template";
6
+ import { generateDetailPageTemplate } from "../templates/pages/detail-page.template";
7
+ import { buildFilePaths } from "../transformers/import-resolver";
8
+
9
+ describe("loading template", () => {
10
+ it("renders PageSkeleton verbatim, matching the app convention", () => {
11
+ expect(generateLoadingTemplate()).toBe(
12
+ `import { PageSkeleton } from "@/features/common/components/skeletons/PageSkeleton";
13
+
14
+ export default function Loading() {
15
+ return <PageSkeleton />;
16
+ }
17
+ `,
18
+ );
19
+ });
20
+
21
+ it("places a loading.tsx next to every generated page.tsx", () => {
22
+ const paths = buildFilePaths(makeFrontendData(), "/repo");
23
+ expect(paths.listLoading).toBe(path.join(path.dirname(paths.listPage), "loading.tsx"));
24
+ expect(paths.detailLoading).toBe(path.join(path.dirname(paths.detailPage), "loading.tsx"));
25
+ expect(paths.listLoading).toBe("/repo/apps/web/src/app/[locale]/(main)/(features)/widgets/loading.tsx");
26
+ expect(paths.detailLoading).toBe("/repo/apps/web/src/app/[locale]/(main)/(features)/widgets/[id]/loading.tsx");
27
+ });
28
+
29
+ it("both generated pages await data, so both segments need a loading file", () => {
30
+ const data = makeFrontendData();
31
+ expect(generateListPageTemplate(data)).toMatch(/export default async function[\s\S]*await /);
32
+ expect(generateDetailPageTemplate(data)).toMatch(/export default async function[\s\S]*await /);
33
+ });
34
+ });
@@ -19,6 +19,7 @@ import {
19
19
  generateListContainerTemplate,
20
20
  generateListPageTemplate,
21
21
  generateListTemplate,
22
+ generateLoadingTemplate,
22
23
  generateModelTemplate,
23
24
  generateModuleTemplate,
24
25
  generateMultiSelectorTemplate,
@@ -391,19 +392,32 @@ function generateAllFiles(data: FrontendTemplateData, schema: JsonModuleDefiniti
391
392
  type: "module",
392
393
  });
393
394
 
394
- // Pages (2 files)
395
+ // Pages (2 files) + a loading.tsx next to each: both pages await data, and
396
+ // under Cache Components every data-fetching segment owns its own boundary.
395
397
  files.push({
396
398
  path: paths.listPage,
397
399
  content: generateListPageTemplate(data),
398
400
  type: "page",
399
401
  });
400
402
 
403
+ files.push({
404
+ path: paths.listLoading,
405
+ content: generateLoadingTemplate(),
406
+ type: "page",
407
+ });
408
+
401
409
  files.push({
402
410
  path: paths.detailPage,
403
411
  content: generateDetailPageTemplate(data),
404
412
  type: "page",
405
413
  });
406
414
 
415
+ files.push({
416
+ path: paths.detailLoading,
417
+ content: generateLoadingTemplate(),
418
+ type: "page",
419
+ });
420
+
407
421
  return files;
408
422
  }
409
423
 
@@ -31,4 +31,4 @@ export { generateTableHookTemplate } from "./table-hook.template";
31
31
  export { generateModuleTemplate } from "./module.template";
32
32
 
33
33
  // Page templates
34
- export { generateListPageTemplate, generateDetailPageTemplate } from "./pages";
34
+ export { generateListPageTemplate, generateDetailPageTemplate, generateLoadingTemplate } from "./pages";
@@ -6,3 +6,4 @@
6
6
 
7
7
  export { generateListPageTemplate } from "./list-page.template";
8
8
  export { generateDetailPageTemplate } from "./detail-page.template";
9
+ export { generateLoadingTemplate } from "./loading.template";
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Loading Template
3
+ *
4
+ * Generates the loading.tsx that sits next to every generated page.tsx that
5
+ * awaits data. Under Cache Components each data-fetching route segment owns its
6
+ * own Suspense boundary; a boundary in a parent segment does nothing for a
7
+ * client navigation between siblings.
8
+ *
9
+ * Content matches the app convention verbatim (PageSkeleton from the app's
10
+ * common skeletons).
11
+ */
12
+
13
+ /**
14
+ * Generate the loading file content
15
+ *
16
+ * @returns Generated file content
17
+ */
18
+ export function generateLoadingTemplate(): string {
19
+ return `import { PageSkeleton } from "@/features/common/components/skeletons/PageSkeleton";
20
+
21
+ export default function Loading() {
22
+ return <PageSkeleton />;
23
+ }
24
+ `;
25
+ }
@@ -184,7 +184,9 @@ export interface ModuleFilePaths {
184
184
  tableHook: string;
185
185
  module: string;
186
186
  listPage: string;
187
+ listLoading: string;
187
188
  detailPage: string;
189
+ detailLoading: string;
188
190
  }
189
191
 
190
192
  /**
@@ -232,7 +234,9 @@ export function buildFilePaths(
232
234
 
233
235
  // Pages
234
236
  listPage: `${pagePath}/page.tsx`,
237
+ listLoading: `${pagePath}/loading.tsx`,
235
238
  detailPage: `${pagePath}/[id]/page.tsx`,
239
+ detailLoading: `${pagePath}/[id]/loading.tsx`,
236
240
  };
237
241
  }
238
242
 
@@ -124,11 +124,12 @@ describe("createNextConfig: behaviour", () => {
124
124
  expect.objectContaining({
125
125
  authInterrupts: true,
126
126
  turbopackGc: true,
127
- turbopackLazyDynamicImports: true,
128
127
  serverActions: { bodySizeLimit: "5mb" },
129
128
  }),
130
129
  );
131
130
  expect(config.experimental).not.toHaveProperty("useCache");
131
+ // Breaks client-side reads of this package in `next dev` (unactivated lazy import).
132
+ expect(config.experimental).not.toHaveProperty("turbopackLazyDynamicImports");
132
133
  });
133
134
 
134
135
  it("derives pageExtensions, serverExternalPackages and images from the options and env", () => {
@@ -65,12 +65,15 @@ export function createNextConfig(options: NjaNextConfigOptions): NextConfig {
65
65
  serverActions: {
66
66
  bodySizeLimit: "5mb",
67
67
  },
68
- // Required by `unauthorized()` (next/navigation), which ServerSession.checkPermission
69
- // calls to deny access. Without this flag the function throws a plain Error instead of
70
- // rendering the nearest unauthorized.tsx.
68
+ // Required by `unauthorized()` (next/navigation): without this flag it throws a plain
69
+ // Error instead of rendering the nearest unauthorized.tsx. The flag is for app code that
70
+ // calls it; ServerSession.checkPermission does not, it still does `redirect("/401")`.
71
71
  authInterrupts: options.authInterrupts ?? true,
72
72
  turbopackGc: true,
73
- turbopackLazyDynamicImports: true,
73
+ // No turbopackLazyDynamicImports: in `next dev` it leaves this package's lazily
74
+ // imported request module unactivated ("Lazily compiled dynamic import of ...
75
+ // JsonApiRequest ... was not activated"), so every client-side read returns
76
+ // nothing. Seen with the package installed from npm; production builds are unaffected.
74
77
  ...(reactCompiler ? { turbopackRustReactCompiler: true } : {}),
75
78
  },
76
79
  allowedDevOrigins: options.devOrigins,