@demokit-ai/next 0.0.1

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,91 @@
1
+ import { FixtureMap } from '@demokit-ai/core';
2
+ export { FixtureHandler, FixtureMap, RequestContext } from '@demokit-ai/core';
3
+ import { D as DemoScenario, a as DemoKitNextConfig } from './types-Cvq5JUP1.cjs';
4
+ export { d as DefineFixtures, e as DefineScenarios, b as DemoKitNextProviderProps, c as DemoMiddlewareConfig, M as MiddlewareResult } from './types-Cvq5JUP1.cjs';
5
+ import 'react';
6
+ import 'next/server';
7
+
8
+ /**
9
+ * Helper to define fixtures with type safety
10
+ *
11
+ * @example
12
+ * const fixtures = defineFixtures({
13
+ * 'GET /api/users': () => [
14
+ * { id: '1', name: 'Demo User' },
15
+ * ],
16
+ * 'GET /api/users/:id': ({ params }) => ({
17
+ * id: params.id,
18
+ * name: `User ${params.id}`,
19
+ * }),
20
+ * 'POST /api/users': async ({ body }) => ({
21
+ * id: crypto.randomUUID(),
22
+ * ...body,
23
+ * }),
24
+ * })
25
+ */
26
+ declare function defineFixtures<T extends FixtureMap>(fixtures: T): T;
27
+ /**
28
+ * Helper to define scenarios with type safety
29
+ *
30
+ * @example
31
+ * const scenarios = defineScenarios({
32
+ * 'empty-state': {
33
+ * 'GET /api/users': () => [],
34
+ * 'GET /api/projects': () => [],
35
+ * },
36
+ * 'error-state': {
37
+ * 'GET /api/users': () => {
38
+ * throw new Error('API Error')
39
+ * },
40
+ * },
41
+ * 'new-user': {
42
+ * 'GET /api/users': () => [
43
+ * { id: '1', name: 'Welcome, New User!', isNew: true },
44
+ * ],
45
+ * },
46
+ * })
47
+ */
48
+ declare function defineScenarios<T extends Record<string, FixtureMap>>(scenarios: T): T;
49
+ /**
50
+ * Helper to create a scenario object
51
+ *
52
+ * @example
53
+ * const emptyStateScenario = createScenario({
54
+ * name: 'empty-state',
55
+ * description: 'Shows the app with no data',
56
+ * fixtures: {
57
+ * 'GET /api/users': () => [],
58
+ * },
59
+ * })
60
+ */
61
+ declare function createScenario(scenario: DemoScenario): DemoScenario;
62
+ /**
63
+ * Merge multiple fixture maps
64
+ *
65
+ * @example
66
+ * const allFixtures = mergeFixtures(
67
+ * baseFixtures,
68
+ * usersFixtures,
69
+ * projectsFixtures
70
+ * )
71
+ */
72
+ declare function mergeFixtures(...fixtureMaps: FixtureMap[]): FixtureMap;
73
+ /**
74
+ * Create a complete DemoKit Next.js configuration
75
+ *
76
+ * @example
77
+ * // lib/demo.ts
78
+ * import { createDemoConfig, defineFixtures, defineScenarios } from '@demokit-ai/next'
79
+ *
80
+ * export const demoConfig = createDemoConfig({
81
+ * fixtures: defineFixtures({
82
+ * 'GET /api/users': () => [{ id: '1', name: 'Demo User' }],
83
+ * }),
84
+ * scenarios: defineScenarios({
85
+ * 'empty': { 'GET /api/users': () => [] },
86
+ * }),
87
+ * })
88
+ */
89
+ declare function createDemoConfig(config: DemoKitNextConfig): DemoKitNextConfig;
90
+
91
+ export { DemoKitNextConfig, DemoScenario, createDemoConfig, createScenario, defineFixtures, defineScenarios, mergeFixtures };
@@ -0,0 +1,91 @@
1
+ import { FixtureMap } from '@demokit-ai/core';
2
+ export { FixtureHandler, FixtureMap, RequestContext } from '@demokit-ai/core';
3
+ import { D as DemoScenario, a as DemoKitNextConfig } from './types-Cvq5JUP1.js';
4
+ export { d as DefineFixtures, e as DefineScenarios, b as DemoKitNextProviderProps, c as DemoMiddlewareConfig, M as MiddlewareResult } from './types-Cvq5JUP1.js';
5
+ import 'react';
6
+ import 'next/server';
7
+
8
+ /**
9
+ * Helper to define fixtures with type safety
10
+ *
11
+ * @example
12
+ * const fixtures = defineFixtures({
13
+ * 'GET /api/users': () => [
14
+ * { id: '1', name: 'Demo User' },
15
+ * ],
16
+ * 'GET /api/users/:id': ({ params }) => ({
17
+ * id: params.id,
18
+ * name: `User ${params.id}`,
19
+ * }),
20
+ * 'POST /api/users': async ({ body }) => ({
21
+ * id: crypto.randomUUID(),
22
+ * ...body,
23
+ * }),
24
+ * })
25
+ */
26
+ declare function defineFixtures<T extends FixtureMap>(fixtures: T): T;
27
+ /**
28
+ * Helper to define scenarios with type safety
29
+ *
30
+ * @example
31
+ * const scenarios = defineScenarios({
32
+ * 'empty-state': {
33
+ * 'GET /api/users': () => [],
34
+ * 'GET /api/projects': () => [],
35
+ * },
36
+ * 'error-state': {
37
+ * 'GET /api/users': () => {
38
+ * throw new Error('API Error')
39
+ * },
40
+ * },
41
+ * 'new-user': {
42
+ * 'GET /api/users': () => [
43
+ * { id: '1', name: 'Welcome, New User!', isNew: true },
44
+ * ],
45
+ * },
46
+ * })
47
+ */
48
+ declare function defineScenarios<T extends Record<string, FixtureMap>>(scenarios: T): T;
49
+ /**
50
+ * Helper to create a scenario object
51
+ *
52
+ * @example
53
+ * const emptyStateScenario = createScenario({
54
+ * name: 'empty-state',
55
+ * description: 'Shows the app with no data',
56
+ * fixtures: {
57
+ * 'GET /api/users': () => [],
58
+ * },
59
+ * })
60
+ */
61
+ declare function createScenario(scenario: DemoScenario): DemoScenario;
62
+ /**
63
+ * Merge multiple fixture maps
64
+ *
65
+ * @example
66
+ * const allFixtures = mergeFixtures(
67
+ * baseFixtures,
68
+ * usersFixtures,
69
+ * projectsFixtures
70
+ * )
71
+ */
72
+ declare function mergeFixtures(...fixtureMaps: FixtureMap[]): FixtureMap;
73
+ /**
74
+ * Create a complete DemoKit Next.js configuration
75
+ *
76
+ * @example
77
+ * // lib/demo.ts
78
+ * import { createDemoConfig, defineFixtures, defineScenarios } from '@demokit-ai/next'
79
+ *
80
+ * export const demoConfig = createDemoConfig({
81
+ * fixtures: defineFixtures({
82
+ * 'GET /api/users': () => [{ id: '1', name: 'Demo User' }],
83
+ * }),
84
+ * scenarios: defineScenarios({
85
+ * 'empty': { 'GET /api/users': () => [] },
86
+ * }),
87
+ * })
88
+ */
89
+ declare function createDemoConfig(config: DemoKitNextConfig): DemoKitNextConfig;
90
+
91
+ export { DemoKitNextConfig, DemoScenario, createDemoConfig, createScenario, defineFixtures, defineScenarios, mergeFixtures };
package/dist/index.js ADDED
@@ -0,0 +1,25 @@
1
+ // src/config.ts
2
+ function defineFixtures(fixtures) {
3
+ return fixtures;
4
+ }
5
+ function defineScenarios(scenarios) {
6
+ return scenarios;
7
+ }
8
+ function createScenario(scenario) {
9
+ return scenario;
10
+ }
11
+ function mergeFixtures(...fixtureMaps) {
12
+ return Object.assign({}, ...fixtureMaps);
13
+ }
14
+ function createDemoConfig(config) {
15
+ return {
16
+ storageKey: "demokit-mode",
17
+ cookieName: "demokit-mode",
18
+ urlParam: "demo",
19
+ ...config
20
+ };
21
+ }
22
+
23
+ export { createDemoConfig, createScenario, defineFixtures, defineScenarios, mergeFixtures };
24
+ //# sourceMappingURL=index.js.map
25
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/config.ts"],"names":[],"mappings":";AAqBO,SAAS,eAAqC,QAAA,EAAgB;AACnE,EAAA,OAAO,QAAA;AACT;AAuBO,SAAS,gBAAsD,SAAA,EAAiB;AACrF,EAAA,OAAO,SAAA;AACT;AAcO,SAAS,eAAe,QAAA,EAAsC;AACnE,EAAA,OAAO,QAAA;AACT;AAYO,SAAS,iBAAiB,WAAA,EAAuC;AACtE,EAAA,OAAO,MAAA,CAAO,MAAA,CAAO,EAAC,EAAG,GAAG,WAAW,CAAA;AACzC;AAkBO,SAAS,iBAAiB,MAAA,EAA8C;AAC7E,EAAA,OAAO;AAAA,IACL,UAAA,EAAY,cAAA;AAAA,IACZ,UAAA,EAAY,cAAA;AAAA,IACZ,QAAA,EAAU,MAAA;AAAA,IACV,GAAG;AAAA,GACL;AACF","file":"index.js","sourcesContent":["import type { FixtureMap, FixtureHandler } from '@demokit-ai/core'\nimport type { DemoKitNextConfig, DemoScenario } from './types'\n\n/**\n * Helper to define fixtures with type safety\n *\n * @example\n * const fixtures = defineFixtures({\n * 'GET /api/users': () => [\n * { id: '1', name: 'Demo User' },\n * ],\n * 'GET /api/users/:id': ({ params }) => ({\n * id: params.id,\n * name: `User ${params.id}`,\n * }),\n * 'POST /api/users': async ({ body }) => ({\n * id: crypto.randomUUID(),\n * ...body,\n * }),\n * })\n */\nexport function defineFixtures<T extends FixtureMap>(fixtures: T): T {\n return fixtures\n}\n\n/**\n * Helper to define scenarios with type safety\n *\n * @example\n * const scenarios = defineScenarios({\n * 'empty-state': {\n * 'GET /api/users': () => [],\n * 'GET /api/projects': () => [],\n * },\n * 'error-state': {\n * 'GET /api/users': () => {\n * throw new Error('API Error')\n * },\n * },\n * 'new-user': {\n * 'GET /api/users': () => [\n * { id: '1', name: 'Welcome, New User!', isNew: true },\n * ],\n * },\n * })\n */\nexport function defineScenarios<T extends Record<string, FixtureMap>>(scenarios: T): T {\n return scenarios\n}\n\n/**\n * Helper to create a scenario object\n *\n * @example\n * const emptyStateScenario = createScenario({\n * name: 'empty-state',\n * description: 'Shows the app with no data',\n * fixtures: {\n * 'GET /api/users': () => [],\n * },\n * })\n */\nexport function createScenario(scenario: DemoScenario): DemoScenario {\n return scenario\n}\n\n/**\n * Merge multiple fixture maps\n *\n * @example\n * const allFixtures = mergeFixtures(\n * baseFixtures,\n * usersFixtures,\n * projectsFixtures\n * )\n */\nexport function mergeFixtures(...fixtureMaps: FixtureMap[]): FixtureMap {\n return Object.assign({}, ...fixtureMaps)\n}\n\n/**\n * Create a complete DemoKit Next.js configuration\n *\n * @example\n * // lib/demo.ts\n * import { createDemoConfig, defineFixtures, defineScenarios } from '@demokit-ai/next'\n *\n * export const demoConfig = createDemoConfig({\n * fixtures: defineFixtures({\n * 'GET /api/users': () => [{ id: '1', name: 'Demo User' }],\n * }),\n * scenarios: defineScenarios({\n * 'empty': { 'GET /api/users': () => [] },\n * }),\n * })\n */\nexport function createDemoConfig(config: DemoKitNextConfig): DemoKitNextConfig {\n return {\n storageKey: 'demokit-mode',\n cookieName: 'demokit-mode',\n urlParam: 'demo',\n ...config,\n }\n}\n"]}
@@ -0,0 +1,111 @@
1
+ 'use strict';
2
+
3
+ var server = require('next/server');
4
+
5
+ // src/server/middleware.ts
6
+ var DEFAULT_CONFIG = {
7
+ cookieName: "demokit-mode",
8
+ urlParam: "demo",
9
+ headerName: "x-demokit-mode",
10
+ apiPaths: ["/api/"],
11
+ cookieOptions: {
12
+ maxAge: 60 * 60 * 24 * 7,
13
+ // 1 week
14
+ path: "/",
15
+ sameSite: "lax",
16
+ secure: process.env.NODE_ENV === "production"
17
+ }
18
+ };
19
+ function createDemoMiddleware(config = {}) {
20
+ const mergedConfig = { ...DEFAULT_CONFIG, ...config };
21
+ const { cookieName, urlParam, headerName, apiPaths, cookieOptions } = mergedConfig;
22
+ return function demoMiddleware2(request) {
23
+ const demoParam = request.nextUrl.searchParams.get(urlParam);
24
+ const demoCookie = request.cookies.get(cookieName);
25
+ let response = server.NextResponse.next();
26
+ let isDemoMode = false;
27
+ let scenario = null;
28
+ if (demoParam !== null) {
29
+ if (demoParam === "false" || demoParam === "0" || demoParam === "") {
30
+ response = server.NextResponse.next();
31
+ response.cookies.delete(cookieName);
32
+ isDemoMode = false;
33
+ } else if (demoParam === "true" || demoParam === "1") {
34
+ response = server.NextResponse.next();
35
+ response.cookies.set(cookieName, "true", cookieOptions);
36
+ isDemoMode = true;
37
+ } else {
38
+ response = server.NextResponse.next();
39
+ response.cookies.set(cookieName, demoParam, cookieOptions);
40
+ isDemoMode = true;
41
+ scenario = demoParam;
42
+ }
43
+ } else if (demoCookie) {
44
+ isDemoMode = true;
45
+ scenario = demoCookie.value !== "true" ? demoCookie.value : null;
46
+ }
47
+ if (isDemoMode) {
48
+ const isApiRoute = apiPaths.some(
49
+ (path) => request.nextUrl.pathname.startsWith(path)
50
+ );
51
+ if (isApiRoute) {
52
+ const requestHeaders = new Headers(request.headers);
53
+ requestHeaders.set(headerName, scenario ?? "true");
54
+ response = server.NextResponse.next({
55
+ request: {
56
+ headers: requestHeaders
57
+ }
58
+ });
59
+ if (demoParam !== null) {
60
+ if (demoParam === "false" || demoParam === "0" || demoParam === "") {
61
+ response.cookies.delete(cookieName);
62
+ } else {
63
+ response.cookies.set(
64
+ cookieName,
65
+ demoParam === "true" || demoParam === "1" ? "true" : demoParam,
66
+ cookieOptions
67
+ );
68
+ }
69
+ }
70
+ }
71
+ }
72
+ return {
73
+ isDemoMode,
74
+ scenario,
75
+ response
76
+ };
77
+ };
78
+ }
79
+ function demoMiddleware(config = {}) {
80
+ const handler = createDemoMiddleware(config);
81
+ return function middleware(request) {
82
+ return handler(request).response;
83
+ };
84
+ }
85
+ function isDemoRequest(request, config = {}) {
86
+ const { cookieName = "demokit-mode", headerName = "x-demokit-mode" } = config;
87
+ if (request.headers.get(headerName)) {
88
+ return true;
89
+ }
90
+ const cookie = request.cookies.get(cookieName);
91
+ return cookie !== void 0 && cookie.value !== "";
92
+ }
93
+ function getDemoScenario(request, config = {}) {
94
+ const { cookieName = "demokit-mode", headerName = "x-demokit-mode" } = config;
95
+ const headerValue = request.headers.get(headerName);
96
+ if (headerValue && headerValue !== "true") {
97
+ return headerValue;
98
+ }
99
+ const cookie = request.cookies.get(cookieName);
100
+ if (cookie && cookie.value !== "true") {
101
+ return cookie.value;
102
+ }
103
+ return null;
104
+ }
105
+
106
+ exports.createDemoMiddleware = createDemoMiddleware;
107
+ exports.demoMiddleware = demoMiddleware;
108
+ exports.getDemoScenario = getDemoScenario;
109
+ exports.isDemoRequest = isDemoRequest;
110
+ //# sourceMappingURL=middleware.cjs.map
111
+ //# sourceMappingURL=middleware.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/server/middleware.ts"],"names":["demoMiddleware","NextResponse"],"mappings":"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","file":"middleware.cjs","sourcesContent":["import { NextRequest, NextResponse } from 'next/server'\nimport type { DemoMiddlewareConfig, MiddlewareResult } from '../types'\n\nconst DEFAULT_CONFIG: Required<DemoMiddlewareConfig> = {\n cookieName: 'demokit-mode',\n urlParam: 'demo',\n headerName: 'x-demokit-mode',\n apiPaths: ['/api/'],\n cookieOptions: {\n maxAge: 60 * 60 * 24 * 7, // 1 week\n path: '/',\n sameSite: 'lax',\n secure: process.env.NODE_ENV === 'production',\n },\n}\n\n/**\n * Create a demo-aware middleware\n *\n * This middleware:\n * 1. Checks for demo mode URL parameter (?demo=true or ?demo=false)\n * 2. Sets/clears demo mode cookie\n * 3. Adds demo mode header to API requests\n * 4. Supports scenario switching via ?demo=scenario-name\n *\n * @example\n * // middleware.ts\n * import { createDemoMiddleware } from '@demokit-ai/next/middleware'\n *\n * const demoMiddleware = createDemoMiddleware()\n *\n * export function middleware(request: NextRequest) {\n * return demoMiddleware(request)\n * }\n *\n * export const config = {\n * matcher: ['/((?!_next/static|_next/image|favicon.ico).*)'],\n * }\n */\nexport function createDemoMiddleware(config: DemoMiddlewareConfig = {}) {\n const mergedConfig = { ...DEFAULT_CONFIG, ...config }\n const { cookieName, urlParam, headerName, apiPaths, cookieOptions } = mergedConfig\n\n return function demoMiddleware(request: NextRequest): MiddlewareResult {\n // Check for demo mode in URL param\n const demoParam = request.nextUrl.searchParams.get(urlParam)\n\n // Check for existing cookie\n const demoCookie = request.cookies.get(cookieName)\n\n let response = NextResponse.next()\n let isDemoMode = false\n let scenario: string | null = null\n\n // Handle URL param toggle\n if (demoParam !== null) {\n if (demoParam === 'false' || demoParam === '0' || demoParam === '') {\n // Disable demo mode\n response = NextResponse.next()\n response.cookies.delete(cookieName)\n isDemoMode = false\n } else if (demoParam === 'true' || demoParam === '1') {\n // Enable demo mode (no scenario)\n response = NextResponse.next()\n response.cookies.set(cookieName, 'true', cookieOptions)\n isDemoMode = true\n } else {\n // Enable with specific scenario\n response = NextResponse.next()\n response.cookies.set(cookieName, demoParam, cookieOptions)\n isDemoMode = true\n scenario = demoParam\n }\n } else if (demoCookie) {\n // Use existing cookie\n isDemoMode = true\n scenario = demoCookie.value !== 'true' ? demoCookie.value : null\n }\n\n // Add header for API routes\n if (isDemoMode) {\n const isApiRoute = apiPaths.some((path) =>\n request.nextUrl.pathname.startsWith(path)\n )\n\n if (isApiRoute) {\n const requestHeaders = new Headers(request.headers)\n requestHeaders.set(headerName, scenario ?? 'true')\n\n response = NextResponse.next({\n request: {\n headers: requestHeaders,\n },\n })\n\n // Re-set cookie if we created new response\n if (demoParam !== null) {\n if (demoParam === 'false' || demoParam === '0' || demoParam === '') {\n response.cookies.delete(cookieName)\n } else {\n response.cookies.set(\n cookieName,\n demoParam === 'true' || demoParam === '1' ? 'true' : demoParam,\n cookieOptions\n )\n }\n }\n }\n }\n\n return {\n isDemoMode,\n scenario,\n response,\n }\n }\n}\n\n/**\n * Simple middleware wrapper that just returns the response\n *\n * @example\n * import { demoMiddleware } from '@demokit-ai/next/middleware'\n * export const middleware = demoMiddleware()\n */\nexport function demoMiddleware(config: DemoMiddlewareConfig = {}) {\n const handler = createDemoMiddleware(config)\n\n return function middleware(request: NextRequest): NextResponse {\n return handler(request).response\n }\n}\n\n/**\n * Check if a request is in demo mode (from middleware or direct header check)\n */\nexport function isDemoRequest(request: NextRequest, config: DemoMiddlewareConfig = {}): boolean {\n const { cookieName = 'demokit-mode', headerName = 'x-demokit-mode' } = config\n\n // Check header first (set by middleware)\n if (request.headers.get(headerName)) {\n return true\n }\n\n // Check cookie\n const cookie = request.cookies.get(cookieName)\n return cookie !== undefined && cookie.value !== ''\n}\n\n/**\n * Get the demo scenario from a request\n */\nexport function getDemoScenario(request: NextRequest, config: DemoMiddlewareConfig = {}): string | null {\n const { cookieName = 'demokit-mode', headerName = 'x-demokit-mode' } = config\n\n // Check header first\n const headerValue = request.headers.get(headerName)\n if (headerValue && headerValue !== 'true') {\n return headerValue\n }\n\n // Check cookie\n const cookie = request.cookies.get(cookieName)\n if (cookie && cookie.value !== 'true') {\n return cookie.value\n }\n\n return null\n}\n"]}
@@ -0,0 +1,47 @@
1
+ import { NextRequest, NextResponse } from 'next/server';
2
+ import { c as DemoMiddlewareConfig, M as MiddlewareResult } from './types-Cvq5JUP1.cjs';
3
+ import '@demokit-ai/core';
4
+ import 'react';
5
+
6
+ /**
7
+ * Create a demo-aware middleware
8
+ *
9
+ * This middleware:
10
+ * 1. Checks for demo mode URL parameter (?demo=true or ?demo=false)
11
+ * 2. Sets/clears demo mode cookie
12
+ * 3. Adds demo mode header to API requests
13
+ * 4. Supports scenario switching via ?demo=scenario-name
14
+ *
15
+ * @example
16
+ * // middleware.ts
17
+ * import { createDemoMiddleware } from '@demokit-ai/next/middleware'
18
+ *
19
+ * const demoMiddleware = createDemoMiddleware()
20
+ *
21
+ * export function middleware(request: NextRequest) {
22
+ * return demoMiddleware(request)
23
+ * }
24
+ *
25
+ * export const config = {
26
+ * matcher: ['/((?!_next/static|_next/image|favicon.ico).*)'],
27
+ * }
28
+ */
29
+ declare function createDemoMiddleware(config?: DemoMiddlewareConfig): (request: NextRequest) => MiddlewareResult;
30
+ /**
31
+ * Simple middleware wrapper that just returns the response
32
+ *
33
+ * @example
34
+ * import { demoMiddleware } from '@demokit-ai/next/middleware'
35
+ * export const middleware = demoMiddleware()
36
+ */
37
+ declare function demoMiddleware(config?: DemoMiddlewareConfig): (request: NextRequest) => NextResponse;
38
+ /**
39
+ * Check if a request is in demo mode (from middleware or direct header check)
40
+ */
41
+ declare function isDemoRequest(request: NextRequest, config?: DemoMiddlewareConfig): boolean;
42
+ /**
43
+ * Get the demo scenario from a request
44
+ */
45
+ declare function getDemoScenario(request: NextRequest, config?: DemoMiddlewareConfig): string | null;
46
+
47
+ export { DemoMiddlewareConfig, MiddlewareResult, createDemoMiddleware, demoMiddleware, getDemoScenario, isDemoRequest };
@@ -0,0 +1,47 @@
1
+ import { NextRequest, NextResponse } from 'next/server';
2
+ import { c as DemoMiddlewareConfig, M as MiddlewareResult } from './types-Cvq5JUP1.js';
3
+ import '@demokit-ai/core';
4
+ import 'react';
5
+
6
+ /**
7
+ * Create a demo-aware middleware
8
+ *
9
+ * This middleware:
10
+ * 1. Checks for demo mode URL parameter (?demo=true or ?demo=false)
11
+ * 2. Sets/clears demo mode cookie
12
+ * 3. Adds demo mode header to API requests
13
+ * 4. Supports scenario switching via ?demo=scenario-name
14
+ *
15
+ * @example
16
+ * // middleware.ts
17
+ * import { createDemoMiddleware } from '@demokit-ai/next/middleware'
18
+ *
19
+ * const demoMiddleware = createDemoMiddleware()
20
+ *
21
+ * export function middleware(request: NextRequest) {
22
+ * return demoMiddleware(request)
23
+ * }
24
+ *
25
+ * export const config = {
26
+ * matcher: ['/((?!_next/static|_next/image|favicon.ico).*)'],
27
+ * }
28
+ */
29
+ declare function createDemoMiddleware(config?: DemoMiddlewareConfig): (request: NextRequest) => MiddlewareResult;
30
+ /**
31
+ * Simple middleware wrapper that just returns the response
32
+ *
33
+ * @example
34
+ * import { demoMiddleware } from '@demokit-ai/next/middleware'
35
+ * export const middleware = demoMiddleware()
36
+ */
37
+ declare function demoMiddleware(config?: DemoMiddlewareConfig): (request: NextRequest) => NextResponse;
38
+ /**
39
+ * Check if a request is in demo mode (from middleware or direct header check)
40
+ */
41
+ declare function isDemoRequest(request: NextRequest, config?: DemoMiddlewareConfig): boolean;
42
+ /**
43
+ * Get the demo scenario from a request
44
+ */
45
+ declare function getDemoScenario(request: NextRequest, config?: DemoMiddlewareConfig): string | null;
46
+
47
+ export { DemoMiddlewareConfig, MiddlewareResult, createDemoMiddleware, demoMiddleware, getDemoScenario, isDemoRequest };
@@ -0,0 +1,106 @@
1
+ import { NextResponse } from 'next/server';
2
+
3
+ // src/server/middleware.ts
4
+ var DEFAULT_CONFIG = {
5
+ cookieName: "demokit-mode",
6
+ urlParam: "demo",
7
+ headerName: "x-demokit-mode",
8
+ apiPaths: ["/api/"],
9
+ cookieOptions: {
10
+ maxAge: 60 * 60 * 24 * 7,
11
+ // 1 week
12
+ path: "/",
13
+ sameSite: "lax",
14
+ secure: process.env.NODE_ENV === "production"
15
+ }
16
+ };
17
+ function createDemoMiddleware(config = {}) {
18
+ const mergedConfig = { ...DEFAULT_CONFIG, ...config };
19
+ const { cookieName, urlParam, headerName, apiPaths, cookieOptions } = mergedConfig;
20
+ return function demoMiddleware2(request) {
21
+ const demoParam = request.nextUrl.searchParams.get(urlParam);
22
+ const demoCookie = request.cookies.get(cookieName);
23
+ let response = NextResponse.next();
24
+ let isDemoMode = false;
25
+ let scenario = null;
26
+ if (demoParam !== null) {
27
+ if (demoParam === "false" || demoParam === "0" || demoParam === "") {
28
+ response = NextResponse.next();
29
+ response.cookies.delete(cookieName);
30
+ isDemoMode = false;
31
+ } else if (demoParam === "true" || demoParam === "1") {
32
+ response = NextResponse.next();
33
+ response.cookies.set(cookieName, "true", cookieOptions);
34
+ isDemoMode = true;
35
+ } else {
36
+ response = NextResponse.next();
37
+ response.cookies.set(cookieName, demoParam, cookieOptions);
38
+ isDemoMode = true;
39
+ scenario = demoParam;
40
+ }
41
+ } else if (demoCookie) {
42
+ isDemoMode = true;
43
+ scenario = demoCookie.value !== "true" ? demoCookie.value : null;
44
+ }
45
+ if (isDemoMode) {
46
+ const isApiRoute = apiPaths.some(
47
+ (path) => request.nextUrl.pathname.startsWith(path)
48
+ );
49
+ if (isApiRoute) {
50
+ const requestHeaders = new Headers(request.headers);
51
+ requestHeaders.set(headerName, scenario ?? "true");
52
+ response = NextResponse.next({
53
+ request: {
54
+ headers: requestHeaders
55
+ }
56
+ });
57
+ if (demoParam !== null) {
58
+ if (demoParam === "false" || demoParam === "0" || demoParam === "") {
59
+ response.cookies.delete(cookieName);
60
+ } else {
61
+ response.cookies.set(
62
+ cookieName,
63
+ demoParam === "true" || demoParam === "1" ? "true" : demoParam,
64
+ cookieOptions
65
+ );
66
+ }
67
+ }
68
+ }
69
+ }
70
+ return {
71
+ isDemoMode,
72
+ scenario,
73
+ response
74
+ };
75
+ };
76
+ }
77
+ function demoMiddleware(config = {}) {
78
+ const handler = createDemoMiddleware(config);
79
+ return function middleware(request) {
80
+ return handler(request).response;
81
+ };
82
+ }
83
+ function isDemoRequest(request, config = {}) {
84
+ const { cookieName = "demokit-mode", headerName = "x-demokit-mode" } = config;
85
+ if (request.headers.get(headerName)) {
86
+ return true;
87
+ }
88
+ const cookie = request.cookies.get(cookieName);
89
+ return cookie !== void 0 && cookie.value !== "";
90
+ }
91
+ function getDemoScenario(request, config = {}) {
92
+ const { cookieName = "demokit-mode", headerName = "x-demokit-mode" } = config;
93
+ const headerValue = request.headers.get(headerName);
94
+ if (headerValue && headerValue !== "true") {
95
+ return headerValue;
96
+ }
97
+ const cookie = request.cookies.get(cookieName);
98
+ if (cookie && cookie.value !== "true") {
99
+ return cookie.value;
100
+ }
101
+ return null;
102
+ }
103
+
104
+ export { createDemoMiddleware, demoMiddleware, getDemoScenario, isDemoRequest };
105
+ //# sourceMappingURL=middleware.js.map
106
+ //# sourceMappingURL=middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/server/middleware.ts"],"names":["demoMiddleware"],"mappings":"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","file":"middleware.js","sourcesContent":["import { NextRequest, NextResponse } from 'next/server'\nimport type { DemoMiddlewareConfig, MiddlewareResult } from '../types'\n\nconst DEFAULT_CONFIG: Required<DemoMiddlewareConfig> = {\n cookieName: 'demokit-mode',\n urlParam: 'demo',\n headerName: 'x-demokit-mode',\n apiPaths: ['/api/'],\n cookieOptions: {\n maxAge: 60 * 60 * 24 * 7, // 1 week\n path: '/',\n sameSite: 'lax',\n secure: process.env.NODE_ENV === 'production',\n },\n}\n\n/**\n * Create a demo-aware middleware\n *\n * This middleware:\n * 1. Checks for demo mode URL parameter (?demo=true or ?demo=false)\n * 2. Sets/clears demo mode cookie\n * 3. Adds demo mode header to API requests\n * 4. Supports scenario switching via ?demo=scenario-name\n *\n * @example\n * // middleware.ts\n * import { createDemoMiddleware } from '@demokit-ai/next/middleware'\n *\n * const demoMiddleware = createDemoMiddleware()\n *\n * export function middleware(request: NextRequest) {\n * return demoMiddleware(request)\n * }\n *\n * export const config = {\n * matcher: ['/((?!_next/static|_next/image|favicon.ico).*)'],\n * }\n */\nexport function createDemoMiddleware(config: DemoMiddlewareConfig = {}) {\n const mergedConfig = { ...DEFAULT_CONFIG, ...config }\n const { cookieName, urlParam, headerName, apiPaths, cookieOptions } = mergedConfig\n\n return function demoMiddleware(request: NextRequest): MiddlewareResult {\n // Check for demo mode in URL param\n const demoParam = request.nextUrl.searchParams.get(urlParam)\n\n // Check for existing cookie\n const demoCookie = request.cookies.get(cookieName)\n\n let response = NextResponse.next()\n let isDemoMode = false\n let scenario: string | null = null\n\n // Handle URL param toggle\n if (demoParam !== null) {\n if (demoParam === 'false' || demoParam === '0' || demoParam === '') {\n // Disable demo mode\n response = NextResponse.next()\n response.cookies.delete(cookieName)\n isDemoMode = false\n } else if (demoParam === 'true' || demoParam === '1') {\n // Enable demo mode (no scenario)\n response = NextResponse.next()\n response.cookies.set(cookieName, 'true', cookieOptions)\n isDemoMode = true\n } else {\n // Enable with specific scenario\n response = NextResponse.next()\n response.cookies.set(cookieName, demoParam, cookieOptions)\n isDemoMode = true\n scenario = demoParam\n }\n } else if (demoCookie) {\n // Use existing cookie\n isDemoMode = true\n scenario = demoCookie.value !== 'true' ? demoCookie.value : null\n }\n\n // Add header for API routes\n if (isDemoMode) {\n const isApiRoute = apiPaths.some((path) =>\n request.nextUrl.pathname.startsWith(path)\n )\n\n if (isApiRoute) {\n const requestHeaders = new Headers(request.headers)\n requestHeaders.set(headerName, scenario ?? 'true')\n\n response = NextResponse.next({\n request: {\n headers: requestHeaders,\n },\n })\n\n // Re-set cookie if we created new response\n if (demoParam !== null) {\n if (demoParam === 'false' || demoParam === '0' || demoParam === '') {\n response.cookies.delete(cookieName)\n } else {\n response.cookies.set(\n cookieName,\n demoParam === 'true' || demoParam === '1' ? 'true' : demoParam,\n cookieOptions\n )\n }\n }\n }\n }\n\n return {\n isDemoMode,\n scenario,\n response,\n }\n }\n}\n\n/**\n * Simple middleware wrapper that just returns the response\n *\n * @example\n * import { demoMiddleware } from '@demokit-ai/next/middleware'\n * export const middleware = demoMiddleware()\n */\nexport function demoMiddleware(config: DemoMiddlewareConfig = {}) {\n const handler = createDemoMiddleware(config)\n\n return function middleware(request: NextRequest): NextResponse {\n return handler(request).response\n }\n}\n\n/**\n * Check if a request is in demo mode (from middleware or direct header check)\n */\nexport function isDemoRequest(request: NextRequest, config: DemoMiddlewareConfig = {}): boolean {\n const { cookieName = 'demokit-mode', headerName = 'x-demokit-mode' } = config\n\n // Check header first (set by middleware)\n if (request.headers.get(headerName)) {\n return true\n }\n\n // Check cookie\n const cookie = request.cookies.get(cookieName)\n return cookie !== undefined && cookie.value !== ''\n}\n\n/**\n * Get the demo scenario from a request\n */\nexport function getDemoScenario(request: NextRequest, config: DemoMiddlewareConfig = {}): string | null {\n const { cookieName = 'demokit-mode', headerName = 'x-demokit-mode' } = config\n\n // Check header first\n const headerValue = request.headers.get(headerName)\n if (headerValue && headerValue !== 'true') {\n return headerValue\n }\n\n // Check cookie\n const cookie = request.cookies.get(cookieName)\n if (cookie && cookie.value !== 'true') {\n return cookie.value\n }\n\n return null\n}\n"]}