@flyo/nitro-next 1.1.1 → 1.3.0

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.
@@ -0,0 +1,51 @@
1
+ import { NextResponse } from 'next/server';
2
+
3
+ interface ProxyConfig {
4
+ /**
5
+ * Enable caching (if false, all caching is disabled)
6
+ * @default true
7
+ */
8
+ enabled?: boolean;
9
+ /**
10
+ * Server/CDN cache TTL in seconds
11
+ * @default 1200
12
+ */
13
+ serverCacheTtl?: number;
14
+ /**
15
+ * Client browser cache TTL in seconds
16
+ * @default 900
17
+ */
18
+ clientCacheTtl?: number;
19
+ }
20
+ /**
21
+ * Nitro Next.js Proxy Factory
22
+ *
23
+ * Creates a Next.js middleware that handles cache control headers.
24
+ *
25
+ * @example
26
+ * ```ts
27
+ * // proxy.ts (project root or src/)
28
+ * import { createProxy } from '@flyo/nitro-next/proxy';
29
+ *
30
+ * export default createProxy({
31
+ * enabled: true,
32
+ * serverCacheTtl: 1200,
33
+ * clientCacheTtl: 900,
34
+ * });
35
+ *
36
+ * // Next.js requires config to be defined directly in this file
37
+ * export const config = {
38
+ * matcher: ['/((?!_next/static|_next/image|favicon.ico).*)'],
39
+ * };
40
+ * ```
41
+ */
42
+ declare function createProxy(config?: ProxyConfig): () => NextResponse<unknown>;
43
+ /**
44
+ * Proxy matcher configuration
45
+ * Applies to all routes except Next.js internal routes
46
+ */
47
+ declare const config: {
48
+ matcher: string[];
49
+ };
50
+
51
+ export { type ProxyConfig, config, createProxy };
@@ -0,0 +1,51 @@
1
+ import { NextResponse } from 'next/server';
2
+
3
+ interface ProxyConfig {
4
+ /**
5
+ * Enable caching (if false, all caching is disabled)
6
+ * @default true
7
+ */
8
+ enabled?: boolean;
9
+ /**
10
+ * Server/CDN cache TTL in seconds
11
+ * @default 1200
12
+ */
13
+ serverCacheTtl?: number;
14
+ /**
15
+ * Client browser cache TTL in seconds
16
+ * @default 900
17
+ */
18
+ clientCacheTtl?: number;
19
+ }
20
+ /**
21
+ * Nitro Next.js Proxy Factory
22
+ *
23
+ * Creates a Next.js middleware that handles cache control headers.
24
+ *
25
+ * @example
26
+ * ```ts
27
+ * // proxy.ts (project root or src/)
28
+ * import { createProxy } from '@flyo/nitro-next/proxy';
29
+ *
30
+ * export default createProxy({
31
+ * enabled: true,
32
+ * serverCacheTtl: 1200,
33
+ * clientCacheTtl: 900,
34
+ * });
35
+ *
36
+ * // Next.js requires config to be defined directly in this file
37
+ * export const config = {
38
+ * matcher: ['/((?!_next/static|_next/image|favicon.ico).*)'],
39
+ * };
40
+ * ```
41
+ */
42
+ declare function createProxy(config?: ProxyConfig): () => NextResponse<unknown>;
43
+ /**
44
+ * Proxy matcher configuration
45
+ * Applies to all routes except Next.js internal routes
46
+ */
47
+ declare const config: {
48
+ matcher: string[];
49
+ };
50
+
51
+ export { type ProxyConfig, config, createProxy };
package/dist/proxy.js ADDED
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/proxy.ts
21
+ var proxy_exports = {};
22
+ __export(proxy_exports, {
23
+ config: () => config,
24
+ createProxy: () => createProxy
25
+ });
26
+ module.exports = __toCommonJS(proxy_exports);
27
+ var import_server = require("next/server");
28
+ function createProxy(config2 = {}) {
29
+ const {
30
+ enabled = true,
31
+ serverCacheTtl = 1200,
32
+ clientCacheTtl = 900
33
+ } = config2;
34
+ return function proxy() {
35
+ const res = import_server.NextResponse.next();
36
+ const cachingDisabled = !enabled;
37
+ if (!cachingDisabled) {
38
+ const cdn = serverCacheTtl > 0 ? `max-age=${serverCacheTtl}` : "no-store";
39
+ res.headers.set("Vercel-CDN-Cache-Control", cdn);
40
+ res.headers.set("CDN-Cache-Control", cdn);
41
+ if (clientCacheTtl > 0) {
42
+ res.headers.set("Cache-Control", `max-age=${clientCacheTtl}`);
43
+ }
44
+ } else {
45
+ res.headers.set("Vercel-CDN-Cache-Control", "no-store");
46
+ res.headers.set("CDN-Cache-Control", "no-store");
47
+ res.headers.set("Cache-Control", "no-store");
48
+ }
49
+ return res;
50
+ };
51
+ }
52
+ var config = {
53
+ matcher: ["/((?!_next/static|_next/image|favicon.ico).*)"]
54
+ };
55
+ // Annotate the CommonJS export names for ESM import in node:
56
+ 0 && (module.exports = {
57
+ config,
58
+ createProxy
59
+ });
60
+ //# sourceMappingURL=proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/proxy.ts"],"sourcesContent":["import { NextResponse } from 'next/server';\n\nexport interface ProxyConfig {\n /**\n * Enable caching (if false, all caching is disabled)\n * @default true\n */\n enabled?: boolean;\n /**\n * Server/CDN cache TTL in seconds\n * @default 1200\n */\n serverCacheTtl?: number;\n /**\n * Client browser cache TTL in seconds\n * @default 900\n */\n clientCacheTtl?: number;\n}\n\n/**\n * Nitro Next.js Proxy Factory\n * \n * Creates a Next.js middleware that handles cache control headers.\n * \n * @example\n * ```ts\n * // proxy.ts (project root or src/)\n * import { createProxy } from '@flyo/nitro-next/proxy';\n * \n * export default createProxy({\n * enabled: true,\n * serverCacheTtl: 1200,\n * clientCacheTtl: 900,\n * });\n * \n * // Next.js requires config to be defined directly in this file\n * export const config = {\n * matcher: ['/((?!_next/static|_next/image|favicon.ico).*)'],\n * };\n * ```\n */\nexport function createProxy(config: ProxyConfig = {}) {\n const {\n enabled = true,\n serverCacheTtl = 1200,\n clientCacheTtl = 900,\n } = config;\n\n return function proxy() {\n const res = NextResponse.next();\n\n // Set cache headers based on configuration\n const cachingDisabled = !enabled;\n\n if (!cachingDisabled) {\n // Production with caching enabled\n const cdn = serverCacheTtl > 0 ? `max-age=${serverCacheTtl}` : 'no-store';\n\n res.headers.set('Vercel-CDN-Cache-Control', cdn);\n res.headers.set('CDN-Cache-Control', cdn);\n\n if (clientCacheTtl > 0) {\n res.headers.set('Cache-Control', `max-age=${clientCacheTtl}`);\n }\n } else {\n // Development or live edit mode - no caching\n res.headers.set('Vercel-CDN-Cache-Control', 'no-store');\n res.headers.set('CDN-Cache-Control', 'no-store');\n res.headers.set('Cache-Control', 'no-store');\n }\n\n return res;\n };\n}\n\n\n/**\n * Proxy matcher configuration\n * Applies to all routes except Next.js internal routes\n */\nexport const config = {\n matcher: ['/((?!_next/static|_next/image|favicon.ico).*)'],\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAA6B;AA0CtB,SAAS,YAAYA,UAAsB,CAAC,GAAG;AACpD,QAAM;AAAA,IACJ,UAAU;AAAA,IACV,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,EACnB,IAAIA;AAEJ,SAAO,SAAS,QAAQ;AACtB,UAAM,MAAM,2BAAa,KAAK;AAG9B,UAAM,kBAAkB,CAAC;AAEzB,QAAI,CAAC,iBAAiB;AAEpB,YAAM,MAAM,iBAAiB,IAAI,WAAW,cAAc,KAAK;AAE/D,UAAI,QAAQ,IAAI,4BAA4B,GAAG;AAC/C,UAAI,QAAQ,IAAI,qBAAqB,GAAG;AAExC,UAAI,iBAAiB,GAAG;AACtB,YAAI,QAAQ,IAAI,iBAAiB,WAAW,cAAc,EAAE;AAAA,MAC9D;AAAA,IACF,OAAO;AAEL,UAAI,QAAQ,IAAI,4BAA4B,UAAU;AACtD,UAAI,QAAQ,IAAI,qBAAqB,UAAU;AAC/C,UAAI,QAAQ,IAAI,iBAAiB,UAAU;AAAA,IAC7C;AAEA,WAAO;AAAA,EACT;AACF;AAOO,IAAM,SAAS;AAAA,EACpB,SAAS,CAAC,+CAA+C;AAC3D;","names":["config"]}
package/dist/proxy.mjs ADDED
@@ -0,0 +1,34 @@
1
+ // src/proxy.ts
2
+ import { NextResponse } from "next/server";
3
+ function createProxy(config2 = {}) {
4
+ const {
5
+ enabled = true,
6
+ serverCacheTtl = 1200,
7
+ clientCacheTtl = 900
8
+ } = config2;
9
+ return function proxy() {
10
+ const res = NextResponse.next();
11
+ const cachingDisabled = !enabled;
12
+ if (!cachingDisabled) {
13
+ const cdn = serverCacheTtl > 0 ? `max-age=${serverCacheTtl}` : "no-store";
14
+ res.headers.set("Vercel-CDN-Cache-Control", cdn);
15
+ res.headers.set("CDN-Cache-Control", cdn);
16
+ if (clientCacheTtl > 0) {
17
+ res.headers.set("Cache-Control", `max-age=${clientCacheTtl}`);
18
+ }
19
+ } else {
20
+ res.headers.set("Vercel-CDN-Cache-Control", "no-store");
21
+ res.headers.set("CDN-Cache-Control", "no-store");
22
+ res.headers.set("Cache-Control", "no-store");
23
+ }
24
+ return res;
25
+ };
26
+ }
27
+ var config = {
28
+ matcher: ["/((?!_next/static|_next/image|favicon.ico).*)"]
29
+ };
30
+ export {
31
+ config,
32
+ createProxy
33
+ };
34
+ //# sourceMappingURL=proxy.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/proxy.ts"],"sourcesContent":["import { NextResponse } from 'next/server';\n\nexport interface ProxyConfig {\n /**\n * Enable caching (if false, all caching is disabled)\n * @default true\n */\n enabled?: boolean;\n /**\n * Server/CDN cache TTL in seconds\n * @default 1200\n */\n serverCacheTtl?: number;\n /**\n * Client browser cache TTL in seconds\n * @default 900\n */\n clientCacheTtl?: number;\n}\n\n/**\n * Nitro Next.js Proxy Factory\n * \n * Creates a Next.js middleware that handles cache control headers.\n * \n * @example\n * ```ts\n * // proxy.ts (project root or src/)\n * import { createProxy } from '@flyo/nitro-next/proxy';\n * \n * export default createProxy({\n * enabled: true,\n * serverCacheTtl: 1200,\n * clientCacheTtl: 900,\n * });\n * \n * // Next.js requires config to be defined directly in this file\n * export const config = {\n * matcher: ['/((?!_next/static|_next/image|favicon.ico).*)'],\n * };\n * ```\n */\nexport function createProxy(config: ProxyConfig = {}) {\n const {\n enabled = true,\n serverCacheTtl = 1200,\n clientCacheTtl = 900,\n } = config;\n\n return function proxy() {\n const res = NextResponse.next();\n\n // Set cache headers based on configuration\n const cachingDisabled = !enabled;\n\n if (!cachingDisabled) {\n // Production with caching enabled\n const cdn = serverCacheTtl > 0 ? `max-age=${serverCacheTtl}` : 'no-store';\n\n res.headers.set('Vercel-CDN-Cache-Control', cdn);\n res.headers.set('CDN-Cache-Control', cdn);\n\n if (clientCacheTtl > 0) {\n res.headers.set('Cache-Control', `max-age=${clientCacheTtl}`);\n }\n } else {\n // Development or live edit mode - no caching\n res.headers.set('Vercel-CDN-Cache-Control', 'no-store');\n res.headers.set('CDN-Cache-Control', 'no-store');\n res.headers.set('Cache-Control', 'no-store');\n }\n\n return res;\n };\n}\n\n\n/**\n * Proxy matcher configuration\n * Applies to all routes except Next.js internal routes\n */\nexport const config = {\n matcher: ['/((?!_next/static|_next/image|favicon.ico).*)'],\n};\n"],"mappings":";AAAA,SAAS,oBAAoB;AA0CtB,SAAS,YAAYA,UAAsB,CAAC,GAAG;AACpD,QAAM;AAAA,IACJ,UAAU;AAAA,IACV,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,EACnB,IAAIA;AAEJ,SAAO,SAAS,QAAQ;AACtB,UAAM,MAAM,aAAa,KAAK;AAG9B,UAAM,kBAAkB,CAAC;AAEzB,QAAI,CAAC,iBAAiB;AAEpB,YAAM,MAAM,iBAAiB,IAAI,WAAW,cAAc,KAAK;AAE/D,UAAI,QAAQ,IAAI,4BAA4B,GAAG;AAC/C,UAAI,QAAQ,IAAI,qBAAqB,GAAG;AAExC,UAAI,iBAAiB,GAAG;AACtB,YAAI,QAAQ,IAAI,iBAAiB,WAAW,cAAc,EAAE;AAAA,MAC9D;AAAA,IACF,OAAO;AAEL,UAAI,QAAQ,IAAI,4BAA4B,UAAU;AACtD,UAAI,QAAQ,IAAI,qBAAqB,UAAU;AAC/C,UAAI,QAAQ,IAAI,iBAAiB,UAAU;AAAA,IAC7C;AAEA,WAAO;AAAA,EACT;AACF;AAOO,IAAM,SAAS;AAAA,EACpB,SAAS,CAAC,+CAA+C;AAC3D;","names":["config"]}
package/dist/server.d.mts CHANGED
@@ -1,12 +1,42 @@
1
+ import * as react from 'react';
1
2
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
3
  import { Metadata } from 'next';
3
- import { Configuration, ConfigResponse, PagesApi, EntitiesApi, Page, Block } from '@flyo/nitro-typescript';
4
+ import { Configuration, ConfigResponse, PagesApi, EntitiesApi, Entity, Page, Block } from '@flyo/nitro-typescript';
4
5
 
5
- declare const initNitro: ({ accessToken, lang, components, showMissingComponentAlert }: {
6
+ /**
7
+ * Interface for Nitro configuration state
8
+ */
9
+ interface NitroState {
10
+ configuration: Configuration | null;
11
+ lang: string | null;
12
+ components: Record<string, any>;
13
+ showMissingComponentAlert: boolean;
14
+ liveEdit: boolean;
15
+ }
16
+ /**
17
+ * Global Nitro state - shared across server and middleware
18
+ */
19
+ declare const globalNitroState: NitroState;
20
+ /**
21
+ * Access the Nitro configuration state
22
+ * Can be used anywhere: server components, middlewares, API routes, etc.
23
+ * Must be called after initNitro() has been initialized.
24
+ *
25
+ * @throws {Error} If Nitro has not been initialized with initNitro()
26
+ *
27
+ * @example
28
+ * ```ts
29
+ * const state = getNitro();
30
+ * const { configuration, lang, components } = state;
31
+ * ```
32
+ */
33
+ declare function getNitro(): NitroState;
34
+ declare const initNitro: ({ accessToken, lang, components, showMissingComponentAlert, liveEdit, }: {
6
35
  accessToken: string;
7
36
  lang?: string;
8
37
  components?: object;
9
38
  showMissingComponentAlert?: boolean;
39
+ liveEdit?: boolean;
10
40
  }) => (() => Configuration);
11
41
  declare const getNitroConfig: () => Promise<ConfigResponse>;
12
42
  declare function getNitroPages(): PagesApi;
@@ -19,6 +49,18 @@ type RouteParams = {
19
49
  slug?: string[];
20
50
  }>;
21
51
  };
52
+ /**
53
+ * Generic route params type for entity routes
54
+ * Allows any param structure from Next.js app router
55
+ */
56
+ type EntityRouteParams<T = any> = {
57
+ params: Promise<T>;
58
+ };
59
+ /**
60
+ * Entity resolver function type
61
+ * Users provide this to resolve entities from their route params
62
+ */
63
+ type EntityResolver<T = any> = (params: Promise<T>) => Promise<Entity>;
22
64
  /**
23
65
  * NitroPage component renders all blocks from a Flyo page
24
66
  */
@@ -47,10 +89,10 @@ declare function nitroPageRoute(props: RouteParams): Promise<react_jsx_runtime.J
47
89
  * @example
48
90
  * ```ts
49
91
  * // app/[[...slug]]/page.tsx
50
- * export { nitroGenerateMetadata as generateMetadata } from '@flyo/nitro-next/server';
92
+ * export { nitroPageGenerateMetadata as generateMetadata } from '@flyo/nitro-next/server';
51
93
  * ```
52
94
  */
53
- declare function nitroGenerateMetadata(props: RouteParams): Promise<Metadata>;
95
+ declare function nitroPageGenerateMetadata(props: RouteParams): Promise<Metadata>;
54
96
  /**
55
97
  * Generate static params for all Nitro pages
56
98
  * Enables static site generation (SSG) for all pages
@@ -59,11 +101,73 @@ declare function nitroGenerateMetadata(props: RouteParams): Promise<Metadata>;
59
101
  * @example
60
102
  * ```ts
61
103
  * // app/[[...slug]]/page.tsx
62
- * export { nitroGenerateStaticParams as generateStaticParams } from '@flyo/nitro-next/server';
104
+ * export { nitroPageGenerateStaticParams as generateStaticParams } from '@flyo/nitro-next/server';
63
105
  * ```
64
106
  */
65
- declare function nitroGenerateStaticParams(): Promise<{
107
+ declare function nitroPageGenerateStaticParams(): Promise<{
66
108
  slug: string[] | undefined;
67
109
  }[]>;
110
+ /**
111
+ * Default entity route handler with custom resolver
112
+ * Flexible solution that works with any route param structure
113
+ *
114
+ * @example
115
+ * ```ts
116
+ * // app/blog/[slug]/page.tsx
117
+ * const resolver = async (params: Promise<{ slug: string }>) => {
118
+ * const { slug } = await params;
119
+ * return getNitroEntities().entityBySlug({ slug, typeId: 123 });
120
+ * };
121
+ *
122
+ * export default (props) => nitroEntityRoute(props, {
123
+ * resolver,
124
+ * render: (entity) => <h1>{entity.entity?.entity_title}</h1>
125
+ * });
126
+ * ```
127
+ *
128
+ * @example
129
+ * ```ts
130
+ * // app/items/[uniqueid]/page.tsx
131
+ * const resolver = async (params: Promise<{ uniqueid: string }>) => {
132
+ * const { uniqueid } = await params;
133
+ * return getNitroEntities().entityByUniqueid({ uniqueid });
134
+ * };
135
+ *
136
+ * export default (props) => nitroEntityRoute(props, { resolver });
137
+ * ```
138
+ *
139
+ * @example
140
+ * ```ts
141
+ * // app/custom/[whatever]/page.tsx
142
+ * const resolver = async (params: Promise<{ whatever: string }>) => {
143
+ * const { whatever } = await params;
144
+ * return getNitroEntities().entityBySlug({ slug: whatever });
145
+ * };
146
+ *
147
+ * export default (props) => nitroEntityRoute(props, { resolver });
148
+ * ```
149
+ */
150
+ declare function nitroEntityRoute<T = any>(props: EntityRouteParams<T>, options: {
151
+ resolver: EntityResolver<T>;
152
+ render?: (entity: Entity) => React.ReactNode;
153
+ }): Promise<string | number | bigint | boolean | react_jsx_runtime.JSX.Element | Iterable<react.ReactNode> | null | undefined>;
154
+ /**
155
+ * Generate metadata for Nitro entities with custom resolver
156
+ * Works with any route param structure
157
+ *
158
+ * @example
159
+ * ```ts
160
+ * // app/blog/[slug]/page.tsx
161
+ * const resolver = async (params: Promise<{ slug: string }>) => {
162
+ * const { slug } = await params;
163
+ * return getNitroEntities().entityBySlug({ slug, typeId: 123 });
164
+ * };
165
+ *
166
+ * export const generateMetadata = (props) => nitroEntityGenerateMetadata(props, { resolver });
167
+ * ```
168
+ */
169
+ declare function nitroEntityGenerateMetadata<T = any>(props: EntityRouteParams<T>, options: {
170
+ resolver: EntityResolver<T>;
171
+ }): Promise<Metadata>;
68
172
 
69
- export { NitroBlock, NitroPage, getNitroConfig, getNitroEntities, getNitroPages, initNitro, nitroGenerateMetadata, nitroGenerateStaticParams, nitroPageRoute };
173
+ export { type EntityResolver, NitroBlock, NitroPage, type NitroState, getNitro, getNitroConfig, getNitroEntities, getNitroPages, globalNitroState, initNitro, nitroEntityGenerateMetadata, nitroEntityRoute, nitroPageGenerateMetadata, nitroPageGenerateStaticParams, nitroPageRoute };
package/dist/server.d.ts CHANGED
@@ -1,12 +1,42 @@
1
+ import * as react from 'react';
1
2
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
3
  import { Metadata } from 'next';
3
- import { Configuration, ConfigResponse, PagesApi, EntitiesApi, Page, Block } from '@flyo/nitro-typescript';
4
+ import { Configuration, ConfigResponse, PagesApi, EntitiesApi, Entity, Page, Block } from '@flyo/nitro-typescript';
4
5
 
5
- declare const initNitro: ({ accessToken, lang, components, showMissingComponentAlert }: {
6
+ /**
7
+ * Interface for Nitro configuration state
8
+ */
9
+ interface NitroState {
10
+ configuration: Configuration | null;
11
+ lang: string | null;
12
+ components: Record<string, any>;
13
+ showMissingComponentAlert: boolean;
14
+ liveEdit: boolean;
15
+ }
16
+ /**
17
+ * Global Nitro state - shared across server and middleware
18
+ */
19
+ declare const globalNitroState: NitroState;
20
+ /**
21
+ * Access the Nitro configuration state
22
+ * Can be used anywhere: server components, middlewares, API routes, etc.
23
+ * Must be called after initNitro() has been initialized.
24
+ *
25
+ * @throws {Error} If Nitro has not been initialized with initNitro()
26
+ *
27
+ * @example
28
+ * ```ts
29
+ * const state = getNitro();
30
+ * const { configuration, lang, components } = state;
31
+ * ```
32
+ */
33
+ declare function getNitro(): NitroState;
34
+ declare const initNitro: ({ accessToken, lang, components, showMissingComponentAlert, liveEdit, }: {
6
35
  accessToken: string;
7
36
  lang?: string;
8
37
  components?: object;
9
38
  showMissingComponentAlert?: boolean;
39
+ liveEdit?: boolean;
10
40
  }) => (() => Configuration);
11
41
  declare const getNitroConfig: () => Promise<ConfigResponse>;
12
42
  declare function getNitroPages(): PagesApi;
@@ -19,6 +49,18 @@ type RouteParams = {
19
49
  slug?: string[];
20
50
  }>;
21
51
  };
52
+ /**
53
+ * Generic route params type for entity routes
54
+ * Allows any param structure from Next.js app router
55
+ */
56
+ type EntityRouteParams<T = any> = {
57
+ params: Promise<T>;
58
+ };
59
+ /**
60
+ * Entity resolver function type
61
+ * Users provide this to resolve entities from their route params
62
+ */
63
+ type EntityResolver<T = any> = (params: Promise<T>) => Promise<Entity>;
22
64
  /**
23
65
  * NitroPage component renders all blocks from a Flyo page
24
66
  */
@@ -47,10 +89,10 @@ declare function nitroPageRoute(props: RouteParams): Promise<react_jsx_runtime.J
47
89
  * @example
48
90
  * ```ts
49
91
  * // app/[[...slug]]/page.tsx
50
- * export { nitroGenerateMetadata as generateMetadata } from '@flyo/nitro-next/server';
92
+ * export { nitroPageGenerateMetadata as generateMetadata } from '@flyo/nitro-next/server';
51
93
  * ```
52
94
  */
53
- declare function nitroGenerateMetadata(props: RouteParams): Promise<Metadata>;
95
+ declare function nitroPageGenerateMetadata(props: RouteParams): Promise<Metadata>;
54
96
  /**
55
97
  * Generate static params for all Nitro pages
56
98
  * Enables static site generation (SSG) for all pages
@@ -59,11 +101,73 @@ declare function nitroGenerateMetadata(props: RouteParams): Promise<Metadata>;
59
101
  * @example
60
102
  * ```ts
61
103
  * // app/[[...slug]]/page.tsx
62
- * export { nitroGenerateStaticParams as generateStaticParams } from '@flyo/nitro-next/server';
104
+ * export { nitroPageGenerateStaticParams as generateStaticParams } from '@flyo/nitro-next/server';
63
105
  * ```
64
106
  */
65
- declare function nitroGenerateStaticParams(): Promise<{
107
+ declare function nitroPageGenerateStaticParams(): Promise<{
66
108
  slug: string[] | undefined;
67
109
  }[]>;
110
+ /**
111
+ * Default entity route handler with custom resolver
112
+ * Flexible solution that works with any route param structure
113
+ *
114
+ * @example
115
+ * ```ts
116
+ * // app/blog/[slug]/page.tsx
117
+ * const resolver = async (params: Promise<{ slug: string }>) => {
118
+ * const { slug } = await params;
119
+ * return getNitroEntities().entityBySlug({ slug, typeId: 123 });
120
+ * };
121
+ *
122
+ * export default (props) => nitroEntityRoute(props, {
123
+ * resolver,
124
+ * render: (entity) => <h1>{entity.entity?.entity_title}</h1>
125
+ * });
126
+ * ```
127
+ *
128
+ * @example
129
+ * ```ts
130
+ * // app/items/[uniqueid]/page.tsx
131
+ * const resolver = async (params: Promise<{ uniqueid: string }>) => {
132
+ * const { uniqueid } = await params;
133
+ * return getNitroEntities().entityByUniqueid({ uniqueid });
134
+ * };
135
+ *
136
+ * export default (props) => nitroEntityRoute(props, { resolver });
137
+ * ```
138
+ *
139
+ * @example
140
+ * ```ts
141
+ * // app/custom/[whatever]/page.tsx
142
+ * const resolver = async (params: Promise<{ whatever: string }>) => {
143
+ * const { whatever } = await params;
144
+ * return getNitroEntities().entityBySlug({ slug: whatever });
145
+ * };
146
+ *
147
+ * export default (props) => nitroEntityRoute(props, { resolver });
148
+ * ```
149
+ */
150
+ declare function nitroEntityRoute<T = any>(props: EntityRouteParams<T>, options: {
151
+ resolver: EntityResolver<T>;
152
+ render?: (entity: Entity) => React.ReactNode;
153
+ }): Promise<string | number | bigint | boolean | react_jsx_runtime.JSX.Element | Iterable<react.ReactNode> | null | undefined>;
154
+ /**
155
+ * Generate metadata for Nitro entities with custom resolver
156
+ * Works with any route param structure
157
+ *
158
+ * @example
159
+ * ```ts
160
+ * // app/blog/[slug]/page.tsx
161
+ * const resolver = async (params: Promise<{ slug: string }>) => {
162
+ * const { slug } = await params;
163
+ * return getNitroEntities().entityBySlug({ slug, typeId: 123 });
164
+ * };
165
+ *
166
+ * export const generateMetadata = (props) => nitroEntityGenerateMetadata(props, { resolver });
167
+ * ```
168
+ */
169
+ declare function nitroEntityGenerateMetadata<T = any>(props: EntityRouteParams<T>, options: {
170
+ resolver: EntityResolver<T>;
171
+ }): Promise<Metadata>;
68
172
 
69
- export { NitroBlock, NitroPage, getNitroConfig, getNitroEntities, getNitroPages, initNitro, nitroGenerateMetadata, nitroGenerateStaticParams, nitroPageRoute };
173
+ export { type EntityResolver, NitroBlock, NitroPage, type NitroState, getNitro, getNitroConfig, getNitroEntities, getNitroPages, globalNitroState, initNitro, nitroEntityGenerateMetadata, nitroEntityRoute, nitroPageGenerateMetadata, nitroPageGenerateStaticParams, nitroPageRoute };
package/dist/server.js CHANGED
@@ -22,12 +22,16 @@ var server_exports = {};
22
22
  __export(server_exports, {
23
23
  NitroBlock: () => NitroBlock,
24
24
  NitroPage: () => NitroPage,
25
+ getNitro: () => getNitro,
25
26
  getNitroConfig: () => getNitroConfig,
26
27
  getNitroEntities: () => getNitroEntities,
27
28
  getNitroPages: () => getNitroPages,
29
+ globalNitroState: () => globalNitroState,
28
30
  initNitro: () => initNitro,
29
- nitroGenerateMetadata: () => nitroGenerateMetadata,
30
- nitroGenerateStaticParams: () => nitroGenerateStaticParams,
31
+ nitroEntityGenerateMetadata: () => nitroEntityGenerateMetadata,
32
+ nitroEntityRoute: () => nitroEntityRoute,
33
+ nitroPageGenerateMetadata: () => nitroPageGenerateMetadata,
34
+ nitroPageGenerateStaticParams: () => nitroPageGenerateStaticParams,
31
35
  nitroPageRoute: () => nitroPageRoute
32
36
  });
33
37
  module.exports = __toCommonJS(server_exports);
@@ -35,32 +39,49 @@ var import_react = require("react");
35
39
  var import_navigation = require("next/navigation");
36
40
  var import_nitro_typescript = require("@flyo/nitro-typescript");
37
41
  var import_jsx_runtime = require("react/jsx-runtime");
38
- var globalConfiguration = null;
39
- var globalLang = null;
40
- var globalComponents = {};
41
- var globalShowMissingComponentAlert = false;
42
- var initNitro = ({ accessToken, lang, components, showMissingComponentAlert }) => {
43
- if (!globalConfiguration) {
44
- globalConfiguration = new import_nitro_typescript.Configuration({
42
+ var globalNitroState = {
43
+ configuration: null,
44
+ lang: null,
45
+ components: {},
46
+ showMissingComponentAlert: false,
47
+ liveEdit: false
48
+ };
49
+ function getNitro() {
50
+ if (!globalNitroState.configuration) {
51
+ throw new Error("Nitro has not been initialized. Make sure to call initNitro() first.");
52
+ }
53
+ return globalNitroState;
54
+ }
55
+ var initNitro = ({
56
+ accessToken,
57
+ lang,
58
+ components,
59
+ showMissingComponentAlert,
60
+ liveEdit
61
+ }) => {
62
+ if (!globalNitroState.configuration) {
63
+ globalNitroState.configuration = new import_nitro_typescript.Configuration({
45
64
  apiKey: accessToken
46
65
  });
47
66
  }
48
- globalLang = lang ?? null;
49
- globalComponents = components ?? {};
50
- globalShowMissingComponentAlert = showMissingComponentAlert ?? false;
51
- return () => globalConfiguration;
67
+ globalNitroState.lang = lang ?? null;
68
+ globalNitroState.components = components ?? {};
69
+ globalNitroState.showMissingComponentAlert = showMissingComponentAlert ?? liveEdit ?? false;
70
+ globalNitroState.liveEdit = liveEdit ?? false;
71
+ return () => globalNitroState.configuration;
52
72
  };
53
73
  var getNitroConfig = (0, import_react.cache)(async () => {
54
- const configApi = new import_nitro_typescript.ConfigApi(globalConfiguration);
55
- const useLang = globalLang ?? void 0;
74
+ const state = getNitro();
75
+ const configApi = new import_nitro_typescript.ConfigApi(state.configuration);
76
+ const useLang = state.lang ?? void 0;
56
77
  const config = await configApi.config({ lang: useLang });
57
78
  return config;
58
79
  });
59
80
  function getNitroPages() {
60
- return new import_nitro_typescript.PagesApi(globalConfiguration);
81
+ return new import_nitro_typescript.PagesApi(getNitro().configuration);
61
82
  }
62
83
  function getNitroEntities() {
63
- return new import_nitro_typescript.EntitiesApi(globalConfiguration);
84
+ return new import_nitro_typescript.EntitiesApi(getNitro().configuration);
64
85
  }
65
86
  var resolveNitroRoute = (0, import_react.cache)(async ({ params }) => {
66
87
  const { slug } = await params;
@@ -78,6 +99,15 @@ var resolveNitroRoute = (0, import_react.cache)(async ({ params }) => {
78
99
  }
79
100
  return { page, path, cfg };
80
101
  });
102
+ function createCachedEntityResolver(resolver) {
103
+ return (0, import_react.cache)(async ({ params }) => {
104
+ const entity = await resolver(params);
105
+ if (!entity) {
106
+ (0, import_navigation.notFound)();
107
+ }
108
+ return entity;
109
+ });
110
+ }
81
111
  function NitroPage({
82
112
  page
83
113
  }) {
@@ -98,11 +128,12 @@ function NitroBlock({
98
128
  if (!block) {
99
129
  return null;
100
130
  }
101
- const Component = block.component ? globalComponents[block.component] : void 0;
131
+ const state = getNitro();
132
+ const Component = block.component ? state.components[block.component] : void 0;
102
133
  if (Component) {
103
134
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Component, { block });
104
135
  }
105
- if (globalShowMissingComponentAlert) {
136
+ if (state.showMissingComponentAlert) {
106
137
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { border: "1px solid #fff", padding: "1rem", marginBottom: "1rem", backgroundColor: "red" }, children: [
107
138
  "Component ",
108
139
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("b", { children: block.component }),
@@ -115,33 +146,83 @@ async function nitroPageRoute(props) {
115
146
  const { page } = await resolveNitroRoute(props);
116
147
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(NitroPage, { page });
117
148
  }
118
- async function nitroGenerateMetadata(props) {
149
+ async function nitroPageGenerateMetadata(props) {
119
150
  const { page } = await resolveNitroRoute(props);
120
151
  const meta = page.meta_json;
121
152
  const title = meta?.title ?? page.title ?? "Page";
122
153
  const description = meta?.description ?? "";
154
+ const image = meta?.image ?? "";
123
155
  return {
124
156
  title,
125
- description
157
+ description,
158
+ openGraph: {
159
+ title,
160
+ description,
161
+ images: image ? [image] : [],
162
+ type: "website"
163
+ },
164
+ twitter: {
165
+ card: "summary_large_image",
166
+ title,
167
+ description,
168
+ images: image ? [image] : []
169
+ }
126
170
  };
127
171
  }
128
- async function nitroGenerateStaticParams() {
172
+ async function nitroPageGenerateStaticParams() {
129
173
  const cfg = await getNitroConfig();
130
174
  const pages = cfg.pages ?? [];
131
175
  return pages.map((path) => ({
132
176
  slug: path === "" ? void 0 : path.split("/")
133
177
  }));
134
178
  }
179
+ function nitroEntityRoute(props, options) {
180
+ const cachedResolver = createCachedEntityResolver(options.resolver);
181
+ return (async () => {
182
+ const entity = await cachedResolver(props);
183
+ if (options.render) {
184
+ return options.render(entity);
185
+ }
186
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { children: entity.entity?.entity_title });
187
+ })();
188
+ }
189
+ async function nitroEntityGenerateMetadata(props, options) {
190
+ const cachedResolver = createCachedEntityResolver(options.resolver);
191
+ const entity = await cachedResolver(props);
192
+ const title = entity.entity?.entity_title ?? "Entity";
193
+ const description = entity.entity?.entity_teaser ?? "";
194
+ const image = entity.entity?.entity_image ?? "";
195
+ return {
196
+ title,
197
+ description,
198
+ openGraph: {
199
+ title,
200
+ description,
201
+ images: image ? [image] : [],
202
+ type: "website"
203
+ },
204
+ twitter: {
205
+ card: "summary_large_image",
206
+ title,
207
+ description,
208
+ images: image ? [image] : []
209
+ }
210
+ };
211
+ }
135
212
  // Annotate the CommonJS export names for ESM import in node:
136
213
  0 && (module.exports = {
137
214
  NitroBlock,
138
215
  NitroPage,
216
+ getNitro,
139
217
  getNitroConfig,
140
218
  getNitroEntities,
141
219
  getNitroPages,
220
+ globalNitroState,
142
221
  initNitro,
143
- nitroGenerateMetadata,
144
- nitroGenerateStaticParams,
222
+ nitroEntityGenerateMetadata,
223
+ nitroEntityRoute,
224
+ nitroPageGenerateMetadata,
225
+ nitroPageGenerateStaticParams,
145
226
  nitroPageRoute
146
227
  });
147
228
  //# sourceMappingURL=server.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/server.tsx"],"sourcesContent":["import { cache } from 'react';\nimport type { Metadata } from 'next';\nimport { notFound } from 'next/navigation';\nimport {\n Page,\n Block,\n ConfigApi,\n ConfigResponse,\n Configuration,\n PagesApi,\n EntitiesApi\n} from '@flyo/nitro-typescript';\n\nlet globalConfiguration: Configuration | null = null;\nlet globalLang: string | null = null;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet globalComponents: Record<string, any> = {};\nlet globalShowMissingComponentAlert: boolean = false;\n\nexport const initNitro = ({accessToken, lang, components, showMissingComponentAlert}: {accessToken: string, lang?: string, components?: object, showMissingComponentAlert?: boolean}): ( () => Configuration ) => {\n\n if (!globalConfiguration) {\n globalConfiguration = new Configuration({\n apiKey: accessToken,\n });\n }\n\n globalLang = lang ?? null;\n globalComponents = components ?? {};\n globalShowMissingComponentAlert = showMissingComponentAlert ?? false;\n\n return () => globalConfiguration!;\n}\n\nexport const getNitroConfig = cache(async (): Promise<ConfigResponse> => {\n\n const configApi = new ConfigApi(globalConfiguration!);\n const useLang = globalLang ?? undefined;\n\n const config = await configApi.config({ lang: useLang });\n \n return config;\n});\n\nexport function getNitroPages(): PagesApi {\n return new PagesApi(globalConfiguration!);\n}\n\nexport function getNitroEntities(): EntitiesApi {\n return new EntitiesApi(globalConfiguration!);\n}\n\n/**\n * Route params type for Next.js catch-all routes\n */\ntype RouteParams = {\n params: Promise<{ slug?: string[] }>;\n};\n\n/**\n * Internal helper to resolve Nitro page from route params\n * Uses React cache to avoid duplicate fetching\n */\nconst resolveNitroRoute = cache(async ({ params }: RouteParams) => {\n const { slug } = await params;\n const path = slug?.join('/') ?? '';\n\n const cfg = await getNitroConfig();\n\n if (!cfg.pages?.includes(path)) {\n notFound();\n }\n\n const page = await getNitroPages()\n .page({ slug: path })\n .catch((error: unknown) => {\n console.error('Error fetching page:', path, error);\n notFound();\n });\n\n if (!page) {\n notFound();\n }\n\n return { page, path, cfg };\n});\n\n\n/**\n * NitroPage component renders all blocks from a Flyo page\n */\nexport function NitroPage({\n page,\n}: {\n page: Page\n}) {\n if (!page?.json || !Array.isArray(page.json)) {\n return null;\n }\n\n return (\n <>\n {page.json.map((block: Block, index: number) => (\n <NitroBlock\n key={block.uid || index}\n block={block}\n />\n ))}\n </>\n );\n}\n\nexport function NitroBlock({\n block,\n}: {\n block: Block\n}) {\n if (!block) {\n return null;\n }\n\n const Component = block.component ? globalComponents[block.component] : undefined;\n\n if (Component) {\n return <Component block={block} />;\n }\n\n if (globalShowMissingComponentAlert) {\n return (\n <div style={{ border: '1px solid #fff', padding: '1rem', marginBottom: '1rem', backgroundColor: 'red' }}>\n Component <b>{block.component}</b> not found.\n </div>\n );\n }\n\n return null;\n}\n\n/**\n * Default page route handler for Nitro pages\n * Can be re-exported directly from Next.js app routes\n * \n * @example\n * ```ts\n * // app/[[...slug]]/page.tsx\n * export { nitroPageRoute as default } from '@flyo/nitro-next/server';\n * ```\n */\nexport async function nitroPageRoute(props: RouteParams) {\n const { page } = await resolveNitroRoute(props);\n return <NitroPage page={page} />;\n}\n\n/**\n * Generate metadata for Nitro pages\n * Provides basic meta tags based on Flyo page data\n * Can be re-exported directly from Next.js app routes\n * \n * @example\n * ```ts\n * // app/[[...slug]]/page.tsx\n * export { nitroGenerateMetadata as generateMetadata } from '@flyo/nitro-next/server';\n * ```\n */\nexport async function nitroGenerateMetadata(\n props: RouteParams\n): Promise<Metadata> {\n const { page } = await resolveNitroRoute(props);\n\n // Extract meta information from page\n const meta = page.meta_json;\n \n const title = meta?.title ?? page.title ?? 'Page';\n const description = meta?.description ?? '';\n\n return {\n title,\n description,\n };\n}\n\n/**\n * Generate static params for all Nitro pages\n * Enables static site generation (SSG) for all pages\n * Can be re-exported directly from Next.js app routes\n * \n * @example\n * ```ts\n * // app/[[...slug]]/page.tsx\n * export { nitroGenerateStaticParams as generateStaticParams } from '@flyo/nitro-next/server';\n * ```\n */\nexport async function nitroGenerateStaticParams() {\n const cfg = await getNitroConfig();\n const pages = cfg.pages ?? [];\n\n return pages.map((path: string) => ({\n slug: path === '' ? undefined : path.split('/'),\n }));\n}"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/server.tsx"],"sourcesContent":["import { cache } from 'react';\nimport type { Metadata } from 'next';\nimport { notFound } from 'next/navigation';\nimport {\n Page,\n Block,\n Entity,\n ConfigApi,\n ConfigResponse,\n Configuration,\n PagesApi,\n EntitiesApi\n} from '@flyo/nitro-typescript';\n\n/**\n * Interface for Nitro configuration state\n */\nexport interface NitroState {\n configuration: Configuration | null;\n lang: string | null;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n components: Record<string, any>;\n showMissingComponentAlert: boolean;\n liveEdit: boolean;\n}\n\n/**\n * Global Nitro state - shared across server and middleware\n */\nexport const globalNitroState: NitroState = {\n configuration: null,\n lang: null,\n components: {},\n showMissingComponentAlert: false,\n liveEdit: false\n};\n\n/**\n * Access the Nitro configuration state\n * Can be used anywhere: server components, middlewares, API routes, etc.\n * Must be called after initNitro() has been initialized.\n * \n * @throws {Error} If Nitro has not been initialized with initNitro()\n * \n * @example\n * ```ts\n * const state = getNitro();\n * const { configuration, lang, components } = state;\n * ```\n */\nexport function getNitro(): NitroState {\n if (!globalNitroState.configuration) {\n throw new Error('Nitro has not been initialized. Make sure to call initNitro() first.');\n }\n return globalNitroState;\n}\n\nexport const initNitro = ({\n accessToken,\n lang,\n components,\n showMissingComponentAlert,\n liveEdit,\n}: {\n accessToken: string;\n lang?: string;\n components?: object;\n showMissingComponentAlert?: boolean;\n liveEdit?: boolean;\n}): ( () => Configuration ) => {\n\n if (!globalNitroState.configuration) {\n globalNitroState.configuration = new Configuration({\n apiKey: accessToken,\n });\n }\n\n globalNitroState.lang = lang ?? null;\n globalNitroState.components = components ?? {};\n globalNitroState.showMissingComponentAlert = showMissingComponentAlert ?? liveEdit ?? false;\n globalNitroState.liveEdit = liveEdit ?? false;\n\n return () => globalNitroState.configuration!;\n}\n\nexport const getNitroConfig = cache(async (): Promise<ConfigResponse> => {\n const state = getNitro();\n\n const configApi = new ConfigApi(state.configuration!);\n const useLang = state.lang ?? undefined;\n\n const config = await configApi.config({ lang: useLang });\n \n return config;\n});\n\nexport function getNitroPages(): PagesApi {\n return new PagesApi(getNitro().configuration!);\n}\n\nexport function getNitroEntities(): EntitiesApi {\n return new EntitiesApi(getNitro().configuration!);\n}\n\n/**\n * Route params type for Next.js catch-all routes\n */\ntype RouteParams = {\n params: Promise<{ slug?: string[] }>;\n};\n\n/**\n * Generic route params type for entity routes\n * Allows any param structure from Next.js app router\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype EntityRouteParams<T = any> = {\n params: Promise<T>;\n};\n\n/**\n * Internal helper to resolve Nitro page from route params\n * Uses React cache to avoid duplicate fetching\n */\nconst resolveNitroRoute = cache(async ({ params }: RouteParams) => {\n const { slug } = await params;\n const path = slug?.join('/') ?? '';\n\n const cfg = await getNitroConfig();\n\n if (!cfg.pages?.includes(path)) {\n notFound();\n }\n\n const page = await getNitroPages()\n .page({ slug: path })\n .catch((error: unknown) => {\n console.error('Error fetching page:', path, error);\n notFound();\n });\n\n if (!page) {\n notFound();\n }\n\n return { page, path, cfg };\n});\n\n/**\n * Entity resolver function type\n * Users provide this to resolve entities from their route params\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type EntityResolver<T = any> = (params: Promise<T>) => Promise<Entity>;\n\n/**\n * Internal helper to wrap and cache entity resolvers\n * Ensures the resolver is only called once per unique params\n */\nfunction createCachedEntityResolver<T>(\n resolver: EntityResolver<T>\n): (props: EntityRouteParams<T>) => Promise<Entity> {\n return cache(async ({ params }: EntityRouteParams<T>) => {\n const entity = await resolver(params);\n \n if (!entity) {\n notFound();\n }\n \n return entity;\n });\n}\n\n\n/**\n * NitroPage component renders all blocks from a Flyo page\n */\nexport function NitroPage({\n page,\n}: {\n page: Page\n}) {\n if (!page?.json || !Array.isArray(page.json)) {\n return null;\n }\n\n return (\n <>\n {page.json.map((block: Block, index: number) => (\n <NitroBlock\n key={block.uid || index}\n block={block}\n />\n ))}\n </>\n );\n}\n\nexport function NitroBlock({\n block,\n}: {\n block: Block\n}) {\n if (!block) {\n return null;\n }\n\n const state = getNitro();\n const Component = block.component ? state.components[block.component] : undefined;\n\n if (Component) {\n return <Component block={block} />;\n }\n\n if (state.showMissingComponentAlert) {\n return (\n <div style={{ border: '1px solid #fff', padding: '1rem', marginBottom: '1rem', backgroundColor: 'red' }}>\n Component <b>{block.component}</b> not found.\n </div>\n );\n }\n\n return null;\n}\n\n/**\n * Default page route handler for Nitro pages\n * Can be re-exported directly from Next.js app routes\n * \n * @example\n * ```ts\n * // app/[[...slug]]/page.tsx\n * export { nitroPageRoute as default } from '@flyo/nitro-next/server';\n * ```\n */\nexport async function nitroPageRoute(props: RouteParams) {\n const { page } = await resolveNitroRoute(props);\n return <NitroPage page={page} />;\n}\n\n/**\n * Generate metadata for Nitro pages\n * Provides basic meta tags based on Flyo page data\n * Can be re-exported directly from Next.js app routes\n * \n * @example\n * ```ts\n * // app/[[...slug]]/page.tsx\n * export { nitroPageGenerateMetadata as generateMetadata } from '@flyo/nitro-next/server';\n * ```\n */\nexport async function nitroPageGenerateMetadata(\n props: RouteParams\n): Promise<Metadata> {\n const { page } = await resolveNitroRoute(props);\n\n // Extract meta information from page\n const meta = page.meta_json;\n \n const title = meta?.title ?? page.title ?? 'Page';\n const description = meta?.description ?? '';\n const image = meta?.image ?? '';\n\n return {\n title,\n description,\n openGraph: {\n title,\n description,\n images: image ? [image] : [],\n type: 'website',\n },\n twitter: {\n card: 'summary_large_image',\n title,\n description,\n images: image ? [image] : [],\n },\n };\n}\n\n/**\n * Generate static params for all Nitro pages\n * Enables static site generation (SSG) for all pages\n * Can be re-exported directly from Next.js app routes\n * \n * @example\n * ```ts\n * // app/[[...slug]]/page.tsx\n * export { nitroPageGenerateStaticParams as generateStaticParams } from '@flyo/nitro-next/server';\n * ```\n */\nexport async function nitroPageGenerateStaticParams() {\n const cfg = await getNitroConfig();\n const pages = cfg.pages ?? [];\n\n return pages.map((path: string) => ({\n slug: path === '' ? undefined : path.split('/'),\n }));\n}\n\n/**\n * Default entity route handler with custom resolver\n * Flexible solution that works with any route param structure\n * \n * @example\n * ```ts\n * // app/blog/[slug]/page.tsx\n * const resolver = async (params: Promise<{ slug: string }>) => {\n * const { slug } = await params;\n * return getNitroEntities().entityBySlug({ slug, typeId: 123 });\n * };\n * \n * export default (props) => nitroEntityRoute(props, {\n * resolver,\n * render: (entity) => <h1>{entity.entity?.entity_title}</h1>\n * });\n * ```\n * \n * @example\n * ```ts\n * // app/items/[uniqueid]/page.tsx\n * const resolver = async (params: Promise<{ uniqueid: string }>) => {\n * const { uniqueid } = await params;\n * return getNitroEntities().entityByUniqueid({ uniqueid });\n * };\n * \n * export default (props) => nitroEntityRoute(props, { resolver });\n * ```\n * \n * @example\n * ```ts\n * // app/custom/[whatever]/page.tsx\n * const resolver = async (params: Promise<{ whatever: string }>) => {\n * const { whatever } = await params;\n * return getNitroEntities().entityBySlug({ slug: whatever });\n * };\n * \n * export default (props) => nitroEntityRoute(props, { resolver });\n * ```\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function nitroEntityRoute<T = any>(\n props: EntityRouteParams<T>,\n options: {\n resolver: EntityResolver<T>;\n render?: (entity: Entity) => React.ReactNode;\n }\n) {\n const cachedResolver = createCachedEntityResolver(options.resolver);\n \n return (async () => {\n const entity = await cachedResolver(props);\n \n if (options.render) {\n return options.render(entity);\n }\n\n // Default simple render - users should provide their own render function\n return <div>{entity.entity?.entity_title}</div>;\n })();\n}\n\n/**\n * Generate metadata for Nitro entities with custom resolver\n * Works with any route param structure\n * \n * @example\n * ```ts\n * // app/blog/[slug]/page.tsx\n * const resolver = async (params: Promise<{ slug: string }>) => {\n * const { slug } = await params;\n * return getNitroEntities().entityBySlug({ slug, typeId: 123 });\n * };\n * \n * export const generateMetadata = (props) => nitroEntityGenerateMetadata(props, { resolver });\n * ```\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport async function nitroEntityGenerateMetadata<T = any>(\n props: EntityRouteParams<T>,\n options: {\n resolver: EntityResolver<T>;\n }\n): Promise<Metadata> {\n const cachedResolver = createCachedEntityResolver(options.resolver);\n const entity = await cachedResolver(props);\n\n const title = entity.entity?.entity_title ?? 'Entity';\n const description = entity.entity?.entity_teaser ?? '';\n const image = entity.entity?.entity_image ?? '';\n\n return {\n title,\n description,\n openGraph: {\n title,\n description,\n images: image ? [image] : [],\n type: 'website',\n },\n twitter: {\n card: 'summary_large_image',\n title,\n description,\n images: image ? [image] : [],\n },\n };\n}"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAsB;AAEtB,wBAAyB;AACzB,8BASO;AA+KH;AA9JG,IAAM,mBAA+B;AAAA,EAC1C,eAAe;AAAA,EACf,MAAM;AAAA,EACN,YAAY,CAAC;AAAA,EACb,2BAA2B;AAAA,EAC3B,UAAU;AACZ;AAeO,SAAS,WAAuB;AACrC,MAAI,CAAC,iBAAiB,eAAe;AACnC,UAAM,IAAI,MAAM,sEAAsE;AAAA,EACxF;AACA,SAAO;AACT;AAEO,IAAM,YAAY,CAAC;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAMiC;AAE7B,MAAI,CAAC,iBAAiB,eAAe;AACnC,qBAAiB,gBAAgB,IAAI,sCAAc;AAAA,MACjD,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AAEA,mBAAiB,OAAO,QAAQ;AAChC,mBAAiB,aAAa,cAAc,CAAC;AAC7C,mBAAiB,4BAA4B,6BAA6B,YAAY;AACtF,mBAAiB,WAAW,YAAY;AAExC,SAAO,MAAM,iBAAiB;AAClC;AAEO,IAAM,qBAAiB,oBAAM,YAAqC;AACrE,QAAM,QAAQ,SAAS;AAEvB,QAAM,YAAY,IAAI,kCAAU,MAAM,aAAc;AACpD,QAAM,UAAU,MAAM,QAAQ;AAE9B,QAAM,SAAS,MAAM,UAAU,OAAO,EAAE,MAAM,QAAQ,CAAC;AAEvD,SAAO;AACX,CAAC;AAEM,SAAS,gBAA0B;AACxC,SAAO,IAAI,iCAAS,SAAS,EAAE,aAAc;AAC/C;AAEO,SAAS,mBAAgC;AAC9C,SAAO,IAAI,oCAAY,SAAS,EAAE,aAAc;AAClD;AAsBA,IAAM,wBAAoB,oBAAM,OAAO,EAAE,OAAO,MAAmB;AACjE,QAAM,EAAE,KAAK,IAAI,MAAM;AACvB,QAAM,OAAO,MAAM,KAAK,GAAG,KAAK;AAEhC,QAAM,MAAM,MAAM,eAAe;AAEjC,MAAI,CAAC,IAAI,OAAO,SAAS,IAAI,GAAG;AAC9B,oCAAS;AAAA,EACX;AAEA,QAAM,OAAO,MAAM,cAAc,EAC9B,KAAK,EAAE,MAAM,KAAK,CAAC,EACnB,MAAM,CAAC,UAAmB;AACzB,YAAQ,MAAM,wBAAwB,MAAM,KAAK;AACjD,oCAAS;AAAA,EACX,CAAC;AAEH,MAAI,CAAC,MAAM;AACT,oCAAS;AAAA,EACX;AAEA,SAAO,EAAE,MAAM,MAAM,IAAI;AAC3B,CAAC;AAaD,SAAS,2BACP,UACkD;AAClD,aAAO,oBAAM,OAAO,EAAE,OAAO,MAA4B;AACvD,UAAM,SAAS,MAAM,SAAS,MAAM;AAEpC,QAAI,CAAC,QAAQ;AACX,sCAAS;AAAA,IACX;AAEA,WAAO;AAAA,EACT,CAAC;AACH;AAMO,SAAS,UAAU;AAAA,EACxB;AACF,GAEG;AACD,MAAI,CAAC,MAAM,QAAQ,CAAC,MAAM,QAAQ,KAAK,IAAI,GAAG;AAC5C,WAAO;AAAA,EACT;AAEA,SACE,2EACG,eAAK,KAAK,IAAI,CAAC,OAAc,UAC5B;AAAA,IAAC;AAAA;AAAA,MAEC;AAAA;AAAA,IADK,MAAM,OAAO;AAAA,EAEpB,CACD,GACH;AAEJ;AAEO,SAAS,WAAW;AAAA,EACzB;AACF,GAEG;AACD,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,SAAS;AACvB,QAAM,YAAY,MAAM,YAAY,MAAM,WAAW,MAAM,SAAS,IAAI;AAExE,MAAI,WAAW;AACb,WAAO,4CAAC,aAAU,OAAc;AAAA,EAClC;AAEA,MAAI,MAAM,2BAA2B;AACnC,WACE,6CAAC,SAAI,OAAO,EAAE,QAAQ,kBAAkB,SAAS,QAAQ,cAAc,QAAQ,iBAAiB,MAAM,GAAG;AAAA;AAAA,MAC7F,4CAAC,OAAG,gBAAM,WAAU;AAAA,MAAI;AAAA,OACpC;AAAA,EAEJ;AAEA,SAAO;AACT;AAYA,eAAsB,eAAe,OAAoB;AACvD,QAAM,EAAE,KAAK,IAAI,MAAM,kBAAkB,KAAK;AAC9C,SAAO,4CAAC,aAAU,MAAY;AAChC;AAaA,eAAsB,0BACpB,OACmB;AACnB,QAAM,EAAE,KAAK,IAAI,MAAM,kBAAkB,KAAK;AAG9C,QAAM,OAAO,KAAK;AAElB,QAAM,QAAQ,MAAM,SAAS,KAAK,SAAS;AAC3C,QAAM,cAAc,MAAM,eAAe;AACzC,QAAM,QAAQ,MAAM,SAAS;AAE7B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA;AAAA,MACA,QAAQ,QAAQ,CAAC,KAAK,IAAI,CAAC;AAAA,MAC3B,MAAM;AAAA,IACR;AAAA,IACA,SAAS;AAAA,MACP,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,QAAQ,QAAQ,CAAC,KAAK,IAAI,CAAC;AAAA,IAC7B;AAAA,EACF;AACF;AAaA,eAAsB,gCAAgC;AACpD,QAAM,MAAM,MAAM,eAAe;AACjC,QAAM,QAAQ,IAAI,SAAS,CAAC;AAE5B,SAAO,MAAM,IAAI,CAAC,UAAkB;AAAA,IAClC,MAAM,SAAS,KAAK,SAAY,KAAK,MAAM,GAAG;AAAA,EAChD,EAAE;AACJ;AA2CO,SAAS,iBACd,OACA,SAIA;AACA,QAAM,iBAAiB,2BAA2B,QAAQ,QAAQ;AAElE,UAAQ,YAAY;AAClB,UAAM,SAAS,MAAM,eAAe,KAAK;AAEzC,QAAI,QAAQ,QAAQ;AAClB,aAAO,QAAQ,OAAO,MAAM;AAAA,IAC9B;AAGA,WAAO,4CAAC,SAAK,iBAAO,QAAQ,cAAa;AAAA,EAC3C,GAAG;AACL;AAkBA,eAAsB,4BACpB,OACA,SAGmB;AACnB,QAAM,iBAAiB,2BAA2B,QAAQ,QAAQ;AAClE,QAAM,SAAS,MAAM,eAAe,KAAK;AAEzC,QAAM,QAAQ,OAAO,QAAQ,gBAAgB;AAC7C,QAAM,cAAc,OAAO,QAAQ,iBAAiB;AACpD,QAAM,QAAQ,OAAO,QAAQ,gBAAgB;AAE7C,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA;AAAA,MACA,QAAQ,QAAQ,CAAC,KAAK,IAAI,CAAC;AAAA,MAC3B,MAAM;AAAA,IACR;AAAA,IACA,SAAS;AAAA,MACP,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,QAAQ,QAAQ,CAAC,KAAK,IAAI,CAAC;AAAA,IAC7B;AAAA,EACF;AACF;","names":[]}
package/dist/server.mjs CHANGED
@@ -8,32 +8,49 @@ import {
8
8
  EntitiesApi
9
9
  } from "@flyo/nitro-typescript";
10
10
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
11
- var globalConfiguration = null;
12
- var globalLang = null;
13
- var globalComponents = {};
14
- var globalShowMissingComponentAlert = false;
15
- var initNitro = ({ accessToken, lang, components, showMissingComponentAlert }) => {
16
- if (!globalConfiguration) {
17
- globalConfiguration = new Configuration({
11
+ var globalNitroState = {
12
+ configuration: null,
13
+ lang: null,
14
+ components: {},
15
+ showMissingComponentAlert: false,
16
+ liveEdit: false
17
+ };
18
+ function getNitro() {
19
+ if (!globalNitroState.configuration) {
20
+ throw new Error("Nitro has not been initialized. Make sure to call initNitro() first.");
21
+ }
22
+ return globalNitroState;
23
+ }
24
+ var initNitro = ({
25
+ accessToken,
26
+ lang,
27
+ components,
28
+ showMissingComponentAlert,
29
+ liveEdit
30
+ }) => {
31
+ if (!globalNitroState.configuration) {
32
+ globalNitroState.configuration = new Configuration({
18
33
  apiKey: accessToken
19
34
  });
20
35
  }
21
- globalLang = lang ?? null;
22
- globalComponents = components ?? {};
23
- globalShowMissingComponentAlert = showMissingComponentAlert ?? false;
24
- return () => globalConfiguration;
36
+ globalNitroState.lang = lang ?? null;
37
+ globalNitroState.components = components ?? {};
38
+ globalNitroState.showMissingComponentAlert = showMissingComponentAlert ?? liveEdit ?? false;
39
+ globalNitroState.liveEdit = liveEdit ?? false;
40
+ return () => globalNitroState.configuration;
25
41
  };
26
42
  var getNitroConfig = cache(async () => {
27
- const configApi = new ConfigApi(globalConfiguration);
28
- const useLang = globalLang ?? void 0;
43
+ const state = getNitro();
44
+ const configApi = new ConfigApi(state.configuration);
45
+ const useLang = state.lang ?? void 0;
29
46
  const config = await configApi.config({ lang: useLang });
30
47
  return config;
31
48
  });
32
49
  function getNitroPages() {
33
- return new PagesApi(globalConfiguration);
50
+ return new PagesApi(getNitro().configuration);
34
51
  }
35
52
  function getNitroEntities() {
36
- return new EntitiesApi(globalConfiguration);
53
+ return new EntitiesApi(getNitro().configuration);
37
54
  }
38
55
  var resolveNitroRoute = cache(async ({ params }) => {
39
56
  const { slug } = await params;
@@ -51,6 +68,15 @@ var resolveNitroRoute = cache(async ({ params }) => {
51
68
  }
52
69
  return { page, path, cfg };
53
70
  });
71
+ function createCachedEntityResolver(resolver) {
72
+ return cache(async ({ params }) => {
73
+ const entity = await resolver(params);
74
+ if (!entity) {
75
+ notFound();
76
+ }
77
+ return entity;
78
+ });
79
+ }
54
80
  function NitroPage({
55
81
  page
56
82
  }) {
@@ -71,11 +97,12 @@ function NitroBlock({
71
97
  if (!block) {
72
98
  return null;
73
99
  }
74
- const Component = block.component ? globalComponents[block.component] : void 0;
100
+ const state = getNitro();
101
+ const Component = block.component ? state.components[block.component] : void 0;
75
102
  if (Component) {
76
103
  return /* @__PURE__ */ jsx(Component, { block });
77
104
  }
78
- if (globalShowMissingComponentAlert) {
105
+ if (state.showMissingComponentAlert) {
79
106
  return /* @__PURE__ */ jsxs("div", { style: { border: "1px solid #fff", padding: "1rem", marginBottom: "1rem", backgroundColor: "red" }, children: [
80
107
  "Component ",
81
108
  /* @__PURE__ */ jsx("b", { children: block.component }),
@@ -88,32 +115,82 @@ async function nitroPageRoute(props) {
88
115
  const { page } = await resolveNitroRoute(props);
89
116
  return /* @__PURE__ */ jsx(NitroPage, { page });
90
117
  }
91
- async function nitroGenerateMetadata(props) {
118
+ async function nitroPageGenerateMetadata(props) {
92
119
  const { page } = await resolveNitroRoute(props);
93
120
  const meta = page.meta_json;
94
121
  const title = meta?.title ?? page.title ?? "Page";
95
122
  const description = meta?.description ?? "";
123
+ const image = meta?.image ?? "";
96
124
  return {
97
125
  title,
98
- description
126
+ description,
127
+ openGraph: {
128
+ title,
129
+ description,
130
+ images: image ? [image] : [],
131
+ type: "website"
132
+ },
133
+ twitter: {
134
+ card: "summary_large_image",
135
+ title,
136
+ description,
137
+ images: image ? [image] : []
138
+ }
99
139
  };
100
140
  }
101
- async function nitroGenerateStaticParams() {
141
+ async function nitroPageGenerateStaticParams() {
102
142
  const cfg = await getNitroConfig();
103
143
  const pages = cfg.pages ?? [];
104
144
  return pages.map((path) => ({
105
145
  slug: path === "" ? void 0 : path.split("/")
106
146
  }));
107
147
  }
148
+ function nitroEntityRoute(props, options) {
149
+ const cachedResolver = createCachedEntityResolver(options.resolver);
150
+ return (async () => {
151
+ const entity = await cachedResolver(props);
152
+ if (options.render) {
153
+ return options.render(entity);
154
+ }
155
+ return /* @__PURE__ */ jsx("div", { children: entity.entity?.entity_title });
156
+ })();
157
+ }
158
+ async function nitroEntityGenerateMetadata(props, options) {
159
+ const cachedResolver = createCachedEntityResolver(options.resolver);
160
+ const entity = await cachedResolver(props);
161
+ const title = entity.entity?.entity_title ?? "Entity";
162
+ const description = entity.entity?.entity_teaser ?? "";
163
+ const image = entity.entity?.entity_image ?? "";
164
+ return {
165
+ title,
166
+ description,
167
+ openGraph: {
168
+ title,
169
+ description,
170
+ images: image ? [image] : [],
171
+ type: "website"
172
+ },
173
+ twitter: {
174
+ card: "summary_large_image",
175
+ title,
176
+ description,
177
+ images: image ? [image] : []
178
+ }
179
+ };
180
+ }
108
181
  export {
109
182
  NitroBlock,
110
183
  NitroPage,
184
+ getNitro,
111
185
  getNitroConfig,
112
186
  getNitroEntities,
113
187
  getNitroPages,
188
+ globalNitroState,
114
189
  initNitro,
115
- nitroGenerateMetadata,
116
- nitroGenerateStaticParams,
190
+ nitroEntityGenerateMetadata,
191
+ nitroEntityRoute,
192
+ nitroPageGenerateMetadata,
193
+ nitroPageGenerateStaticParams,
117
194
  nitroPageRoute
118
195
  };
119
196
  //# sourceMappingURL=server.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/server.tsx"],"sourcesContent":["import { cache } from 'react';\nimport type { Metadata } from 'next';\nimport { notFound } from 'next/navigation';\nimport {\n Page,\n Block,\n ConfigApi,\n ConfigResponse,\n Configuration,\n PagesApi,\n EntitiesApi\n} from '@flyo/nitro-typescript';\n\nlet globalConfiguration: Configuration | null = null;\nlet globalLang: string | null = null;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet globalComponents: Record<string, any> = {};\nlet globalShowMissingComponentAlert: boolean = false;\n\nexport const initNitro = ({accessToken, lang, components, showMissingComponentAlert}: {accessToken: string, lang?: string, components?: object, showMissingComponentAlert?: boolean}): ( () => Configuration ) => {\n\n if (!globalConfiguration) {\n globalConfiguration = new Configuration({\n apiKey: accessToken,\n });\n }\n\n globalLang = lang ?? null;\n globalComponents = components ?? {};\n globalShowMissingComponentAlert = showMissingComponentAlert ?? false;\n\n return () => globalConfiguration!;\n}\n\nexport const getNitroConfig = cache(async (): Promise<ConfigResponse> => {\n\n const configApi = new ConfigApi(globalConfiguration!);\n const useLang = globalLang ?? undefined;\n\n const config = await configApi.config({ lang: useLang });\n \n return config;\n});\n\nexport function getNitroPages(): PagesApi {\n return new PagesApi(globalConfiguration!);\n}\n\nexport function getNitroEntities(): EntitiesApi {\n return new EntitiesApi(globalConfiguration!);\n}\n\n/**\n * Route params type for Next.js catch-all routes\n */\ntype RouteParams = {\n params: Promise<{ slug?: string[] }>;\n};\n\n/**\n * Internal helper to resolve Nitro page from route params\n * Uses React cache to avoid duplicate fetching\n */\nconst resolveNitroRoute = cache(async ({ params }: RouteParams) => {\n const { slug } = await params;\n const path = slug?.join('/') ?? '';\n\n const cfg = await getNitroConfig();\n\n if (!cfg.pages?.includes(path)) {\n notFound();\n }\n\n const page = await getNitroPages()\n .page({ slug: path })\n .catch((error: unknown) => {\n console.error('Error fetching page:', path, error);\n notFound();\n });\n\n if (!page) {\n notFound();\n }\n\n return { page, path, cfg };\n});\n\n\n/**\n * NitroPage component renders all blocks from a Flyo page\n */\nexport function NitroPage({\n page,\n}: {\n page: Page\n}) {\n if (!page?.json || !Array.isArray(page.json)) {\n return null;\n }\n\n return (\n <>\n {page.json.map((block: Block, index: number) => (\n <NitroBlock\n key={block.uid || index}\n block={block}\n />\n ))}\n </>\n );\n}\n\nexport function NitroBlock({\n block,\n}: {\n block: Block\n}) {\n if (!block) {\n return null;\n }\n\n const Component = block.component ? globalComponents[block.component] : undefined;\n\n if (Component) {\n return <Component block={block} />;\n }\n\n if (globalShowMissingComponentAlert) {\n return (\n <div style={{ border: '1px solid #fff', padding: '1rem', marginBottom: '1rem', backgroundColor: 'red' }}>\n Component <b>{block.component}</b> not found.\n </div>\n );\n }\n\n return null;\n}\n\n/**\n * Default page route handler for Nitro pages\n * Can be re-exported directly from Next.js app routes\n * \n * @example\n * ```ts\n * // app/[[...slug]]/page.tsx\n * export { nitroPageRoute as default } from '@flyo/nitro-next/server';\n * ```\n */\nexport async function nitroPageRoute(props: RouteParams) {\n const { page } = await resolveNitroRoute(props);\n return <NitroPage page={page} />;\n}\n\n/**\n * Generate metadata for Nitro pages\n * Provides basic meta tags based on Flyo page data\n * Can be re-exported directly from Next.js app routes\n * \n * @example\n * ```ts\n * // app/[[...slug]]/page.tsx\n * export { nitroGenerateMetadata as generateMetadata } from '@flyo/nitro-next/server';\n * ```\n */\nexport async function nitroGenerateMetadata(\n props: RouteParams\n): Promise<Metadata> {\n const { page } = await resolveNitroRoute(props);\n\n // Extract meta information from page\n const meta = page.meta_json;\n \n const title = meta?.title ?? page.title ?? 'Page';\n const description = meta?.description ?? '';\n\n return {\n title,\n description,\n };\n}\n\n/**\n * Generate static params for all Nitro pages\n * Enables static site generation (SSG) for all pages\n * Can be re-exported directly from Next.js app routes\n * \n * @example\n * ```ts\n * // app/[[...slug]]/page.tsx\n * export { nitroGenerateStaticParams as generateStaticParams } from '@flyo/nitro-next/server';\n * ```\n */\nexport async function nitroGenerateStaticParams() {\n const cfg = await getNitroConfig();\n const pages = cfg.pages ?? [];\n\n return pages.map((path: string) => ({\n slug: path === '' ? undefined : path.split('/'),\n }));\n}"],"mappings":";AAAA,SAAS,aAAa;AAEtB,SAAS,gBAAgB;AACzB;AAAA,EAGE;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AA0FH,mBAEI,KA0BF,YA5BF;AAxFJ,IAAI,sBAA4C;AAChD,IAAI,aAA4B;AAEhC,IAAI,mBAAwC,CAAC;AAC7C,IAAI,kCAA2C;AAExC,IAAM,YAAY,CAAC,EAAC,aAAa,MAAM,YAAY,0BAAyB,MAAiI;AAEhN,MAAI,CAAC,qBAAqB;AACxB,0BAAsB,IAAI,cAAc;AAAA,MACtC,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AAEA,eAAa,QAAQ;AACrB,qBAAmB,cAAc,CAAC;AAClC,oCAAkC,6BAA6B;AAE/D,SAAO,MAAM;AACjB;AAEO,IAAM,iBAAiB,MAAM,YAAqC;AAErE,QAAM,YAAY,IAAI,UAAU,mBAAoB;AACpD,QAAM,UAAU,cAAc;AAE9B,QAAM,SAAS,MAAM,UAAU,OAAO,EAAE,MAAM,QAAQ,CAAC;AAEvD,SAAO;AACX,CAAC;AAEM,SAAS,gBAA0B;AACxC,SAAO,IAAI,SAAS,mBAAoB;AAC1C;AAEO,SAAS,mBAAgC;AAC9C,SAAO,IAAI,YAAY,mBAAoB;AAC7C;AAaA,IAAM,oBAAoB,MAAM,OAAO,EAAE,OAAO,MAAmB;AACjE,QAAM,EAAE,KAAK,IAAI,MAAM;AACvB,QAAM,OAAO,MAAM,KAAK,GAAG,KAAK;AAEhC,QAAM,MAAM,MAAM,eAAe;AAEjC,MAAI,CAAC,IAAI,OAAO,SAAS,IAAI,GAAG;AAC9B,aAAS;AAAA,EACX;AAEA,QAAM,OAAO,MAAM,cAAc,EAC9B,KAAK,EAAE,MAAM,KAAK,CAAC,EACnB,MAAM,CAAC,UAAmB;AACzB,YAAQ,MAAM,wBAAwB,MAAM,KAAK;AACjD,aAAS;AAAA,EACX,CAAC;AAEH,MAAI,CAAC,MAAM;AACT,aAAS;AAAA,EACX;AAEA,SAAO,EAAE,MAAM,MAAM,IAAI;AAC3B,CAAC;AAMM,SAAS,UAAU;AAAA,EACxB;AACF,GAEG;AACD,MAAI,CAAC,MAAM,QAAQ,CAAC,MAAM,QAAQ,KAAK,IAAI,GAAG;AAC5C,WAAO;AAAA,EACT;AAEA,SACE,gCACG,eAAK,KAAK,IAAI,CAAC,OAAc,UAC5B;AAAA,IAAC;AAAA;AAAA,MAEC;AAAA;AAAA,IADK,MAAM,OAAO;AAAA,EAEpB,CACD,GACH;AAEJ;AAEO,SAAS,WAAW;AAAA,EACzB;AACF,GAEG;AACD,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,MAAM,YAAY,iBAAiB,MAAM,SAAS,IAAI;AAExE,MAAI,WAAW;AACb,WAAO,oBAAC,aAAU,OAAc;AAAA,EAClC;AAEA,MAAI,iCAAiC;AACnC,WACE,qBAAC,SAAI,OAAO,EAAE,QAAQ,kBAAkB,SAAS,QAAQ,cAAc,QAAQ,iBAAiB,MAAM,GAAG;AAAA;AAAA,MAC7F,oBAAC,OAAG,gBAAM,WAAU;AAAA,MAAI;AAAA,OACpC;AAAA,EAEJ;AAEA,SAAO;AACT;AAYA,eAAsB,eAAe,OAAoB;AACvD,QAAM,EAAE,KAAK,IAAI,MAAM,kBAAkB,KAAK;AAC9C,SAAO,oBAAC,aAAU,MAAY;AAChC;AAaA,eAAsB,sBACpB,OACmB;AACnB,QAAM,EAAE,KAAK,IAAI,MAAM,kBAAkB,KAAK;AAG9C,QAAM,OAAO,KAAK;AAElB,QAAM,QAAQ,MAAM,SAAS,KAAK,SAAS;AAC3C,QAAM,cAAc,MAAM,eAAe;AAEzC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;AAaA,eAAsB,4BAA4B;AAChD,QAAM,MAAM,MAAM,eAAe;AACjC,QAAM,QAAQ,IAAI,SAAS,CAAC;AAE5B,SAAO,MAAM,IAAI,CAAC,UAAkB;AAAA,IAClC,MAAM,SAAS,KAAK,SAAY,KAAK,MAAM,GAAG;AAAA,EAChD,EAAE;AACJ;","names":[]}
1
+ {"version":3,"sources":["../src/server.tsx"],"sourcesContent":["import { cache } from 'react';\nimport type { Metadata } from 'next';\nimport { notFound } from 'next/navigation';\nimport {\n Page,\n Block,\n Entity,\n ConfigApi,\n ConfigResponse,\n Configuration,\n PagesApi,\n EntitiesApi\n} from '@flyo/nitro-typescript';\n\n/**\n * Interface for Nitro configuration state\n */\nexport interface NitroState {\n configuration: Configuration | null;\n lang: string | null;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n components: Record<string, any>;\n showMissingComponentAlert: boolean;\n liveEdit: boolean;\n}\n\n/**\n * Global Nitro state - shared across server and middleware\n */\nexport const globalNitroState: NitroState = {\n configuration: null,\n lang: null,\n components: {},\n showMissingComponentAlert: false,\n liveEdit: false\n};\n\n/**\n * Access the Nitro configuration state\n * Can be used anywhere: server components, middlewares, API routes, etc.\n * Must be called after initNitro() has been initialized.\n * \n * @throws {Error} If Nitro has not been initialized with initNitro()\n * \n * @example\n * ```ts\n * const state = getNitro();\n * const { configuration, lang, components } = state;\n * ```\n */\nexport function getNitro(): NitroState {\n if (!globalNitroState.configuration) {\n throw new Error('Nitro has not been initialized. Make sure to call initNitro() first.');\n }\n return globalNitroState;\n}\n\nexport const initNitro = ({\n accessToken,\n lang,\n components,\n showMissingComponentAlert,\n liveEdit,\n}: {\n accessToken: string;\n lang?: string;\n components?: object;\n showMissingComponentAlert?: boolean;\n liveEdit?: boolean;\n}): ( () => Configuration ) => {\n\n if (!globalNitroState.configuration) {\n globalNitroState.configuration = new Configuration({\n apiKey: accessToken,\n });\n }\n\n globalNitroState.lang = lang ?? null;\n globalNitroState.components = components ?? {};\n globalNitroState.showMissingComponentAlert = showMissingComponentAlert ?? liveEdit ?? false;\n globalNitroState.liveEdit = liveEdit ?? false;\n\n return () => globalNitroState.configuration!;\n}\n\nexport const getNitroConfig = cache(async (): Promise<ConfigResponse> => {\n const state = getNitro();\n\n const configApi = new ConfigApi(state.configuration!);\n const useLang = state.lang ?? undefined;\n\n const config = await configApi.config({ lang: useLang });\n \n return config;\n});\n\nexport function getNitroPages(): PagesApi {\n return new PagesApi(getNitro().configuration!);\n}\n\nexport function getNitroEntities(): EntitiesApi {\n return new EntitiesApi(getNitro().configuration!);\n}\n\n/**\n * Route params type for Next.js catch-all routes\n */\ntype RouteParams = {\n params: Promise<{ slug?: string[] }>;\n};\n\n/**\n * Generic route params type for entity routes\n * Allows any param structure from Next.js app router\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype EntityRouteParams<T = any> = {\n params: Promise<T>;\n};\n\n/**\n * Internal helper to resolve Nitro page from route params\n * Uses React cache to avoid duplicate fetching\n */\nconst resolveNitroRoute = cache(async ({ params }: RouteParams) => {\n const { slug } = await params;\n const path = slug?.join('/') ?? '';\n\n const cfg = await getNitroConfig();\n\n if (!cfg.pages?.includes(path)) {\n notFound();\n }\n\n const page = await getNitroPages()\n .page({ slug: path })\n .catch((error: unknown) => {\n console.error('Error fetching page:', path, error);\n notFound();\n });\n\n if (!page) {\n notFound();\n }\n\n return { page, path, cfg };\n});\n\n/**\n * Entity resolver function type\n * Users provide this to resolve entities from their route params\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type EntityResolver<T = any> = (params: Promise<T>) => Promise<Entity>;\n\n/**\n * Internal helper to wrap and cache entity resolvers\n * Ensures the resolver is only called once per unique params\n */\nfunction createCachedEntityResolver<T>(\n resolver: EntityResolver<T>\n): (props: EntityRouteParams<T>) => Promise<Entity> {\n return cache(async ({ params }: EntityRouteParams<T>) => {\n const entity = await resolver(params);\n \n if (!entity) {\n notFound();\n }\n \n return entity;\n });\n}\n\n\n/**\n * NitroPage component renders all blocks from a Flyo page\n */\nexport function NitroPage({\n page,\n}: {\n page: Page\n}) {\n if (!page?.json || !Array.isArray(page.json)) {\n return null;\n }\n\n return (\n <>\n {page.json.map((block: Block, index: number) => (\n <NitroBlock\n key={block.uid || index}\n block={block}\n />\n ))}\n </>\n );\n}\n\nexport function NitroBlock({\n block,\n}: {\n block: Block\n}) {\n if (!block) {\n return null;\n }\n\n const state = getNitro();\n const Component = block.component ? state.components[block.component] : undefined;\n\n if (Component) {\n return <Component block={block} />;\n }\n\n if (state.showMissingComponentAlert) {\n return (\n <div style={{ border: '1px solid #fff', padding: '1rem', marginBottom: '1rem', backgroundColor: 'red' }}>\n Component <b>{block.component}</b> not found.\n </div>\n );\n }\n\n return null;\n}\n\n/**\n * Default page route handler for Nitro pages\n * Can be re-exported directly from Next.js app routes\n * \n * @example\n * ```ts\n * // app/[[...slug]]/page.tsx\n * export { nitroPageRoute as default } from '@flyo/nitro-next/server';\n * ```\n */\nexport async function nitroPageRoute(props: RouteParams) {\n const { page } = await resolveNitroRoute(props);\n return <NitroPage page={page} />;\n}\n\n/**\n * Generate metadata for Nitro pages\n * Provides basic meta tags based on Flyo page data\n * Can be re-exported directly from Next.js app routes\n * \n * @example\n * ```ts\n * // app/[[...slug]]/page.tsx\n * export { nitroPageGenerateMetadata as generateMetadata } from '@flyo/nitro-next/server';\n * ```\n */\nexport async function nitroPageGenerateMetadata(\n props: RouteParams\n): Promise<Metadata> {\n const { page } = await resolveNitroRoute(props);\n\n // Extract meta information from page\n const meta = page.meta_json;\n \n const title = meta?.title ?? page.title ?? 'Page';\n const description = meta?.description ?? '';\n const image = meta?.image ?? '';\n\n return {\n title,\n description,\n openGraph: {\n title,\n description,\n images: image ? [image] : [],\n type: 'website',\n },\n twitter: {\n card: 'summary_large_image',\n title,\n description,\n images: image ? [image] : [],\n },\n };\n}\n\n/**\n * Generate static params for all Nitro pages\n * Enables static site generation (SSG) for all pages\n * Can be re-exported directly from Next.js app routes\n * \n * @example\n * ```ts\n * // app/[[...slug]]/page.tsx\n * export { nitroPageGenerateStaticParams as generateStaticParams } from '@flyo/nitro-next/server';\n * ```\n */\nexport async function nitroPageGenerateStaticParams() {\n const cfg = await getNitroConfig();\n const pages = cfg.pages ?? [];\n\n return pages.map((path: string) => ({\n slug: path === '' ? undefined : path.split('/'),\n }));\n}\n\n/**\n * Default entity route handler with custom resolver\n * Flexible solution that works with any route param structure\n * \n * @example\n * ```ts\n * // app/blog/[slug]/page.tsx\n * const resolver = async (params: Promise<{ slug: string }>) => {\n * const { slug } = await params;\n * return getNitroEntities().entityBySlug({ slug, typeId: 123 });\n * };\n * \n * export default (props) => nitroEntityRoute(props, {\n * resolver,\n * render: (entity) => <h1>{entity.entity?.entity_title}</h1>\n * });\n * ```\n * \n * @example\n * ```ts\n * // app/items/[uniqueid]/page.tsx\n * const resolver = async (params: Promise<{ uniqueid: string }>) => {\n * const { uniqueid } = await params;\n * return getNitroEntities().entityByUniqueid({ uniqueid });\n * };\n * \n * export default (props) => nitroEntityRoute(props, { resolver });\n * ```\n * \n * @example\n * ```ts\n * // app/custom/[whatever]/page.tsx\n * const resolver = async (params: Promise<{ whatever: string }>) => {\n * const { whatever } = await params;\n * return getNitroEntities().entityBySlug({ slug: whatever });\n * };\n * \n * export default (props) => nitroEntityRoute(props, { resolver });\n * ```\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function nitroEntityRoute<T = any>(\n props: EntityRouteParams<T>,\n options: {\n resolver: EntityResolver<T>;\n render?: (entity: Entity) => React.ReactNode;\n }\n) {\n const cachedResolver = createCachedEntityResolver(options.resolver);\n \n return (async () => {\n const entity = await cachedResolver(props);\n \n if (options.render) {\n return options.render(entity);\n }\n\n // Default simple render - users should provide their own render function\n return <div>{entity.entity?.entity_title}</div>;\n })();\n}\n\n/**\n * Generate metadata for Nitro entities with custom resolver\n * Works with any route param structure\n * \n * @example\n * ```ts\n * // app/blog/[slug]/page.tsx\n * const resolver = async (params: Promise<{ slug: string }>) => {\n * const { slug } = await params;\n * return getNitroEntities().entityBySlug({ slug, typeId: 123 });\n * };\n * \n * export const generateMetadata = (props) => nitroEntityGenerateMetadata(props, { resolver });\n * ```\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport async function nitroEntityGenerateMetadata<T = any>(\n props: EntityRouteParams<T>,\n options: {\n resolver: EntityResolver<T>;\n }\n): Promise<Metadata> {\n const cachedResolver = createCachedEntityResolver(options.resolver);\n const entity = await cachedResolver(props);\n\n const title = entity.entity?.entity_title ?? 'Entity';\n const description = entity.entity?.entity_teaser ?? '';\n const image = entity.entity?.entity_image ?? '';\n\n return {\n title,\n description,\n openGraph: {\n title,\n description,\n images: image ? [image] : [],\n type: 'website',\n },\n twitter: {\n card: 'summary_large_image',\n title,\n description,\n images: image ? [image] : [],\n },\n };\n}"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flyo/nitro-next",
3
- "version": "1.1.1",
3
+ "version": "1.3.0",
4
4
  "description": "Connecting Flyo Headless Content Hub into your Next.js project.",
5
5
  "homepage": "https://dev.flyo.cloud/nitro",
6
6
  "keywords": [
@@ -35,6 +35,11 @@
35
35
  "types": "./dist/client.d.ts",
36
36
  "import": "./dist/client.mjs",
37
37
  "require": "./dist/client.js"
38
+ },
39
+ "./proxy": {
40
+ "types": "./dist/proxy.d.ts",
41
+ "import": "./dist/proxy.mjs",
42
+ "require": "./dist/proxy.js"
38
43
  }
39
44
  },
40
45
  "files": [
@@ -42,7 +47,7 @@
42
47
  ],
43
48
  "dependencies": {
44
49
  "@flyo/nitro-js-bridge": "^1.1.2",
45
- "@flyo/nitro-typescript": "^1.1.0"
50
+ "@flyo/nitro-typescript": "^1.2.0"
46
51
  },
47
52
  "peerDependencies": {
48
53
  "next": ">=16.0.4",