@kiwa-test/nextjs 1.1.0 → 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.
package/dist/index.cjs ADDED
@@ -0,0 +1,1043 @@
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/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ FORBIDDEN_SYMBOL: () => FORBIDDEN_SYMBOL,
24
+ MIDDLEWARE_ACTION_SYMBOL: () => MIDDLEWARE_ACTION_SYMBOL,
25
+ NEXT_AXIS_TO_EVENTS: () => NEXT_AXIS_TO_EVENTS,
26
+ NOT_FOUND_SYMBOL: () => NOT_FOUND_SYMBOL,
27
+ PARALLEL_INTERCEPTION_SYMBOL: () => PARALLEL_INTERCEPTION_SYMBOL,
28
+ REDIRECT_SYMBOL: () => REDIRECT_SYMBOL,
29
+ RSC_ERROR_BOUNDARY_SYMBOL: () => RSC_ERROR_BOUNDARY_SYMBOL,
30
+ RSC_REDIRECT_SYMBOL: () => RSC_REDIRECT_SYMBOL,
31
+ applyHmrPatch: () => applyHmrPatch,
32
+ assertMode: () => assertMode,
33
+ captureParallelError: () => captureParallelError,
34
+ collectFidelityCoverage: () => collectFidelityCoverage,
35
+ commitTransition: () => commitTransition,
36
+ completeFastRefresh: () => completeFastRefresh,
37
+ completePartialPrerendering: () => completePartialPrerendering,
38
+ findAll: () => findAll,
39
+ findHmrBoundary: () => findHmrBoundary,
40
+ flushStreamingBoundary: () => flushStreamingBoundary,
41
+ interceptCurrentSegment: () => interceptCurrentSegment,
42
+ interceptParentSegment: () => interceptParentSegment,
43
+ interceptRootCatchall: () => interceptRootCatchall,
44
+ interruptTransition: () => interruptTransition,
45
+ invokeMiddleware: () => invokeMiddleware,
46
+ invokeParallelRoutes: () => invokeParallelRoutes,
47
+ invokeServerAction: () => invokeServerAction,
48
+ markModuleUpdated: () => markModuleUpdated,
49
+ markTransitionPending: () => markTransitionPending,
50
+ middlewareActions: () => middlewareActions,
51
+ navigateSlot: () => navigateSlot,
52
+ openDynamicHole: () => openDynamicHole,
53
+ openInterceptedModal: () => openInterceptedModal,
54
+ providerEventName: () => providerEventName,
55
+ redirectAction: () => redirectAction,
56
+ renderDefaultSlot: () => renderDefaultSlot,
57
+ renderLoadingState: () => renderLoadingState,
58
+ renderServerComponent: () => renderServerComponent,
59
+ renderStaticShell: () => renderStaticShell,
60
+ resolveAllModes: () => resolveAllModes,
61
+ resolveMode: () => resolveMode,
62
+ revalidateActionPath: () => revalidateActionPath,
63
+ revalidateActionTag: () => revalidateActionTag,
64
+ setupNextRscEnv: () => setupNextRscEnv,
65
+ startConcurrentTransition: () => startConcurrentTransition,
66
+ startInterceptionRoutes: () => startInterceptionRoutes,
67
+ startParallelRoutesAdvanced: () => startParallelRoutesAdvanced,
68
+ startPartialPrerendering: () => startPartialPrerendering,
69
+ startServerActionAdvanced: () => startServerActionAdvanced,
70
+ startTurbopackHmr: () => startTurbopackHmr,
71
+ submitFormAction: () => submitFormAction,
72
+ textContent: () => textContent
73
+ });
74
+ module.exports = __toCommonJS(index_exports);
75
+
76
+ // src/invoke-server-action.ts
77
+ var REDIRECT_SYMBOL = /* @__PURE__ */ Symbol.for("kiwa.next.redirect");
78
+ function createCookieJar(initial) {
79
+ const store = new Map(Object.entries(initial));
80
+ return {
81
+ get(name) {
82
+ return store.get(name);
83
+ },
84
+ set(name, value) {
85
+ store.set(name, value);
86
+ },
87
+ delete(name) {
88
+ store.delete(name);
89
+ },
90
+ entries() {
91
+ return Array.from(store.entries());
92
+ }
93
+ };
94
+ }
95
+ function isRedirectSignal(value) {
96
+ return typeof value === "object" && value !== null && value[REDIRECT_SYMBOL] === true;
97
+ }
98
+ async function invokeServerAction(opts) {
99
+ const headers = /* @__PURE__ */ new Map();
100
+ for (const [name, value] of Object.entries(opts.headers ?? {})) {
101
+ headers.set(name.toLowerCase(), value);
102
+ }
103
+ const env = {
104
+ cookies: createCookieJar(opts.cookies ?? {}),
105
+ headers,
106
+ revalidated: { paths: [], tags: [] },
107
+ redirect: null
108
+ };
109
+ const callArgs = [opts.formData ?? new FormData(), ...opts.args ?? []];
110
+ let result;
111
+ let error;
112
+ try {
113
+ result = await opts.action(...callArgs);
114
+ } catch (caught) {
115
+ if (isRedirectSignal(caught)) {
116
+ env.redirect = caught;
117
+ } else {
118
+ error = caught;
119
+ }
120
+ }
121
+ return { result, error, env };
122
+ }
123
+
124
+ // src/invoke-middleware.ts
125
+ var MIDDLEWARE_ACTION_SYMBOL = /* @__PURE__ */ Symbol.for("kiwa.next.middleware.action");
126
+ function buildRequest(opts) {
127
+ const url = new URL(opts.url);
128
+ const headers = /* @__PURE__ */ new Map();
129
+ for (const [name, value] of Object.entries(opts.headers ?? {})) {
130
+ headers.set(name.toLowerCase(), value);
131
+ }
132
+ const cookies = new Map(Object.entries(opts.cookies ?? {}));
133
+ return {
134
+ url: opts.url,
135
+ method: opts.method ?? "GET",
136
+ headers,
137
+ cookies,
138
+ nextUrl: {
139
+ pathname: url.pathname,
140
+ search: url.search,
141
+ searchParams: url.searchParams
142
+ },
143
+ geo: opts.geo ?? {}
144
+ };
145
+ }
146
+ var middlewareActions = {
147
+ next() {
148
+ return { [MIDDLEWARE_ACTION_SYMBOL]: true, kind: "next" };
149
+ },
150
+ redirect(url, status = 307) {
151
+ return { [MIDDLEWARE_ACTION_SYMBOL]: true, kind: "redirect", url, status };
152
+ },
153
+ rewrite(url) {
154
+ return { [MIDDLEWARE_ACTION_SYMBOL]: true, kind: "rewrite", url };
155
+ },
156
+ json(body, status = 200) {
157
+ return { [MIDDLEWARE_ACTION_SYMBOL]: true, kind: "json", body, status };
158
+ }
159
+ };
160
+ async function invokeMiddleware(opts) {
161
+ const req = buildRequest(opts);
162
+ const responseHeaders = /* @__PURE__ */ new Map();
163
+ const responseCookies = /* @__PURE__ */ new Map();
164
+ const seam = {
165
+ setHeader(name, value) {
166
+ responseHeaders.set(name.toLowerCase(), value);
167
+ },
168
+ setCookie(name, value) {
169
+ responseCookies.set(name, value);
170
+ }
171
+ };
172
+ let action = middlewareActions.next();
173
+ let error;
174
+ try {
175
+ const result = await opts.middleware(req, seam);
176
+ action = result;
177
+ } catch (caught) {
178
+ error = caught;
179
+ action = { [MIDDLEWARE_ACTION_SYMBOL]: true, kind: "noop" };
180
+ }
181
+ return {
182
+ env: {
183
+ responseHeaders,
184
+ responseCookies,
185
+ action
186
+ },
187
+ error
188
+ };
189
+ }
190
+
191
+ // src/render-server-component.ts
192
+ var NOT_FOUND_SYMBOL = /* @__PURE__ */ Symbol.for("kiwa.next.rsc.notFound");
193
+ var FORBIDDEN_SYMBOL = /* @__PURE__ */ Symbol.for("kiwa.next.rsc.forbidden");
194
+ var RSC_REDIRECT_SYMBOL = /* @__PURE__ */ Symbol.for("kiwa.next.rsc.redirect");
195
+ function isRscElement(node) {
196
+ if (typeof node !== "object" || node === null) return false;
197
+ const candidate = node;
198
+ return typeof candidate.type !== "undefined" && typeof candidate.props === "object" && candidate.props !== null;
199
+ }
200
+ function isNotFound(value) {
201
+ return typeof value === "object" && value !== null && value[NOT_FOUND_SYMBOL] === true;
202
+ }
203
+ function isForbidden(value) {
204
+ return typeof value === "object" && value !== null && value[FORBIDDEN_SYMBOL] === true;
205
+ }
206
+ function isRscRedirect(value) {
207
+ return typeof value === "object" && value !== null && value[RSC_REDIRECT_SYMBOL] === true;
208
+ }
209
+ function findAll(tree, predicate) {
210
+ const out = [];
211
+ function visit(node) {
212
+ if (Array.isArray(node)) {
213
+ node.forEach(visit);
214
+ return;
215
+ }
216
+ if (!isRscElement(node)) return;
217
+ if (predicate(node)) out.push(node);
218
+ const children = node.props.children;
219
+ if (typeof children !== "undefined") {
220
+ visit(children);
221
+ }
222
+ }
223
+ visit(tree);
224
+ return out;
225
+ }
226
+ function textContent(tree) {
227
+ const parts = [];
228
+ function visit(node) {
229
+ if (Array.isArray(node)) {
230
+ node.forEach(visit);
231
+ return;
232
+ }
233
+ if (typeof node === "string" || typeof node === "number") {
234
+ parts.push(String(node));
235
+ return;
236
+ }
237
+ if (isRscElement(node)) {
238
+ const children = node.props.children;
239
+ if (typeof children !== "undefined") visit(children);
240
+ }
241
+ }
242
+ visit(tree);
243
+ return parts.filter((p) => p.length > 0).join(" ");
244
+ }
245
+ async function renderServerComponent(opts) {
246
+ let tree = null;
247
+ let signal = null;
248
+ let error;
249
+ const props = opts.props ?? {};
250
+ try {
251
+ const result = await opts.component(props);
252
+ tree = result;
253
+ } catch (caught) {
254
+ if (isNotFound(caught) || isForbidden(caught) || isRscRedirect(caught)) {
255
+ signal = caught;
256
+ } else {
257
+ error = caught;
258
+ }
259
+ }
260
+ return { tree, signal, error };
261
+ }
262
+
263
+ // src/invoke-parallel-routes.ts
264
+ var PARALLEL_INTERCEPTION_SYMBOL = /* @__PURE__ */ Symbol.for("kiwa.next.parallel.interception");
265
+ async function renderSlot(input) {
266
+ let tree = null;
267
+ let usedDefault = false;
268
+ let error;
269
+ const interception = input.intercepting ? {
270
+ [PARALLEL_INTERCEPTION_SYMBOL]: true,
271
+ slot: input.slot,
272
+ variant: input.intercepting.variant,
273
+ url: input.intercepting.url,
274
+ distance: input.intercepting.distance ?? "sibling"
275
+ } : null;
276
+ const useDefault = input.component === null || interception?.variant === "default";
277
+ try {
278
+ if (useDefault) {
279
+ if (typeof input.defaultFallback !== "function") {
280
+ throw new Error(`slot ${input.slot}: no default.tsx fallback supplied`);
281
+ }
282
+ tree = await input.defaultFallback();
283
+ usedDefault = true;
284
+ } else if (input.component !== null) {
285
+ tree = await input.component(input.props ?? {});
286
+ }
287
+ } catch (caught) {
288
+ error = caught;
289
+ }
290
+ return { slot: input.slot, tree, usedDefault, interception, error };
291
+ }
292
+ async function invokeParallelRoutes(opts) {
293
+ let childrenTree = null;
294
+ let childrenError;
295
+ let layoutError;
296
+ try {
297
+ childrenTree = await opts.children(opts.childrenProps ?? {});
298
+ } catch (caught) {
299
+ childrenError = caught;
300
+ }
301
+ const slotResults = await Promise.all(opts.slots.map((input) => renderSlot(input)));
302
+ const slotMap = {};
303
+ for (const result of slotResults) {
304
+ slotMap[result.slot] = result.tree;
305
+ }
306
+ let tree = null;
307
+ try {
308
+ const props = {
309
+ ...opts.layoutProps ?? {},
310
+ children: childrenTree,
311
+ slots: slotMap
312
+ };
313
+ tree = await opts.layout(props);
314
+ } catch (caught) {
315
+ layoutError = caught;
316
+ }
317
+ return { tree, slotResults, childrenError, layoutError };
318
+ }
319
+
320
+ // src/setup-next-rsc-env.ts
321
+ var RSC_ERROR_BOUNDARY_SYMBOL = /* @__PURE__ */ Symbol.for("kiwa.next.rsc.errorBoundary");
322
+ var DEFAULT_STREAMING_TIMEOUT_MS = 5e3;
323
+ function buildErrorBoundary(error) {
324
+ return { [RSC_ERROR_BOUNDARY_SYMBOL]: true, error };
325
+ }
326
+ async function runWithTimeout(promise, timeoutMs) {
327
+ let timer;
328
+ const timeout = new Promise((resolve) => {
329
+ timer = setTimeout(() => resolve({ value: null, timedOut: true }), timeoutMs);
330
+ });
331
+ try {
332
+ const value = await Promise.race([
333
+ promise.then((v) => ({ value: v, timedOut: false })),
334
+ timeout
335
+ ]);
336
+ return value;
337
+ } finally {
338
+ if (timer) clearTimeout(timer);
339
+ }
340
+ }
341
+ async function collectStream(source, fallback) {
342
+ const chunks = [];
343
+ if (typeof fallback !== "undefined" && fallback !== null) {
344
+ chunks.push(fallback);
345
+ }
346
+ try {
347
+ for await (const chunk of source) {
348
+ chunks.push(chunk);
349
+ }
350
+ } catch (err) {
351
+ return { chunks, resolved: null, thrown: err };
352
+ }
353
+ const resolved = chunks.length > 0 ? chunks[chunks.length - 1] ?? null : null;
354
+ const fallbackOnly = chunks.length === 1 && fallback !== null && Object.is(chunks[0], fallback);
355
+ return { chunks, resolved: fallbackOnly ? null : resolved, thrown: void 0 };
356
+ }
357
+ async function* singleChunkSource(component, props) {
358
+ const result = await component(props);
359
+ yield result;
360
+ }
361
+ async function setupNextRscEnv(opts = {}) {
362
+ const timeoutMs = opts.streamingTimeout ?? DEFAULT_STREAMING_TIMEOUT_MS;
363
+ const fallback = opts.suspenseFallback ?? null;
364
+ if (timeoutMs <= 0 && (opts.dataSource || opts.component)) {
365
+ return {
366
+ chunks: fallback !== null ? [fallback] : [],
367
+ fallback,
368
+ resolved: null,
369
+ errorBoundary: null,
370
+ timedOut: true
371
+ };
372
+ }
373
+ if (typeof opts.injectError !== "undefined") {
374
+ return {
375
+ chunks: fallback !== null ? [fallback] : [],
376
+ fallback,
377
+ resolved: null,
378
+ errorBoundary: buildErrorBoundary(opts.injectError),
379
+ timedOut: false
380
+ };
381
+ }
382
+ if (!opts.dataSource && !opts.component) {
383
+ return {
384
+ chunks: fallback !== null ? [fallback] : [],
385
+ fallback,
386
+ resolved: null,
387
+ errorBoundary: null,
388
+ timedOut: false
389
+ };
390
+ }
391
+ const source = opts.dataSource ? opts.dataSource : singleChunkSource(opts.component, opts.props ?? {});
392
+ const { value, timedOut } = await runWithTimeout(collectStream(source, fallback), timeoutMs);
393
+ if (timedOut || value === null) {
394
+ return {
395
+ chunks: fallback !== null ? [fallback] : [],
396
+ fallback,
397
+ resolved: null,
398
+ errorBoundary: null,
399
+ timedOut: true
400
+ };
401
+ }
402
+ const { chunks, resolved, thrown } = value;
403
+ if (typeof thrown !== "undefined") {
404
+ return {
405
+ chunks,
406
+ fallback,
407
+ resolved: null,
408
+ errorBoundary: buildErrorBoundary(thrown),
409
+ timedOut: false
410
+ };
411
+ }
412
+ return {
413
+ chunks,
414
+ fallback,
415
+ resolved,
416
+ errorBoundary: null,
417
+ timedOut: false
418
+ };
419
+ }
420
+
421
+ // src/semantics/types.ts
422
+ var dialect = {
423
+ "app-router": {
424
+ "action.form_submitted": "app.server-action.form.submit",
425
+ "action.revalidate_path": "app.cache.revalidatePath",
426
+ "action.revalidate_tag": "app.cache.revalidateTag",
427
+ "action.redirected": "app.navigation.redirect",
428
+ "ppr.static_shell_rendered": "app.ppr.static-shell",
429
+ "ppr.dynamic_hole_opened": "app.ppr.dynamic-hole",
430
+ "ppr.streaming_boundary_flushed": "app.ppr.stream-boundary",
431
+ "ppr.completed": "app.ppr.complete",
432
+ "intercept.current_segment": "app.intercept.current",
433
+ "intercept.parent_segment": "app.intercept.parent",
434
+ "intercept.root_catchall": "app.intercept.root",
435
+ "intercept.modal_opened": "app.intercept.modal",
436
+ "parallel.default_rendered": "app.parallel.default",
437
+ "parallel.loading_rendered": "app.parallel.loading",
438
+ "parallel.error_boundary_captured": "app.parallel.error",
439
+ "parallel.slot_navigated": "app.parallel.navigate",
440
+ "turbopack.module_updated": "app.turbopack.module.update",
441
+ "turbopack.hmr_boundary_found": "app.turbopack.hmr.boundary",
442
+ "turbopack.hmr_applied": "app.turbopack.hmr.apply",
443
+ "turbopack.fast_refresh_completed": "app.turbopack.fast-refresh",
444
+ "transition.started": "app.transition.start",
445
+ "transition.pending": "app.transition.pending",
446
+ "transition.interrupted": "app.transition.interrupt",
447
+ "transition.committed": "app.transition.commit"
448
+ },
449
+ "pages-router": {
450
+ "action.form_submitted": "pages.api.form.submit",
451
+ "action.revalidate_path": "pages.isr.revalidate",
452
+ "action.revalidate_tag": "pages.cache.tag.noop",
453
+ "action.redirected": "pages.router.redirect",
454
+ "ppr.static_shell_rendered": "pages.ssg.shell",
455
+ "ppr.dynamic_hole_opened": "pages.ssr.dynamic-hole",
456
+ "ppr.streaming_boundary_flushed": "pages.stream.boundary",
457
+ "ppr.completed": "pages.render.complete",
458
+ "intercept.current_segment": "pages.intercept.current",
459
+ "intercept.parent_segment": "pages.intercept.parent",
460
+ "intercept.root_catchall": "pages.intercept.root",
461
+ "intercept.modal_opened": "pages.modal.open",
462
+ "parallel.default_rendered": "pages.slot.default",
463
+ "parallel.loading_rendered": "pages.slot.loading",
464
+ "parallel.error_boundary_captured": "pages.slot.error",
465
+ "parallel.slot_navigated": "pages.slot.navigate",
466
+ "turbopack.module_updated": "pages.webpack.module.update",
467
+ "turbopack.hmr_boundary_found": "pages.webpack.hmr.boundary",
468
+ "turbopack.hmr_applied": "pages.webpack.hmr.apply",
469
+ "turbopack.fast_refresh_completed": "pages.webpack.fast-refresh",
470
+ "transition.started": "pages.transition.start",
471
+ "transition.pending": "pages.transition.pending",
472
+ "transition.interrupted": "pages.transition.interrupt",
473
+ "transition.committed": "pages.transition.commit"
474
+ },
475
+ "edge-runtime": {
476
+ "action.form_submitted": "edge.action.form.submit",
477
+ "action.revalidate_path": "edge.cache.revalidatePath",
478
+ "action.revalidate_tag": "edge.cache.revalidateTag",
479
+ "action.redirected": "edge.response.redirect",
480
+ "ppr.static_shell_rendered": "edge.ppr.static-shell",
481
+ "ppr.dynamic_hole_opened": "edge.ppr.dynamic-hole",
482
+ "ppr.streaming_boundary_flushed": "edge.stream.boundary",
483
+ "ppr.completed": "edge.ppr.complete",
484
+ "intercept.current_segment": "edge.intercept.current",
485
+ "intercept.parent_segment": "edge.intercept.parent",
486
+ "intercept.root_catchall": "edge.intercept.root",
487
+ "intercept.modal_opened": "edge.modal.open",
488
+ "parallel.default_rendered": "edge.parallel.default",
489
+ "parallel.loading_rendered": "edge.parallel.loading",
490
+ "parallel.error_boundary_captured": "edge.parallel.error",
491
+ "parallel.slot_navigated": "edge.parallel.navigate",
492
+ "turbopack.module_updated": "edge.esbuild.module.update",
493
+ "turbopack.hmr_boundary_found": "edge.esbuild.hmr.boundary",
494
+ "turbopack.hmr_applied": "edge.esbuild.hmr.apply",
495
+ "turbopack.fast_refresh_completed": "edge.esbuild.fast-refresh",
496
+ "transition.started": "edge.transition.start",
497
+ "transition.pending": "edge.transition.pending",
498
+ "transition.interrupted": "edge.transition.interrupt",
499
+ "transition.committed": "edge.transition.commit"
500
+ }
501
+ };
502
+ function providerEventName(target, neutral) {
503
+ return dialect[target][neutral] ?? neutral;
504
+ }
505
+
506
+ // src/semantics/server-action-advanced.ts
507
+ function startServerActionAdvanced(input) {
508
+ if (input.actionId.length === 0) {
509
+ throw new Error("startServerActionAdvanced: actionId must not be empty");
510
+ }
511
+ return {
512
+ target: input.target,
513
+ actionId: input.actionId,
514
+ state: "idle",
515
+ form: {},
516
+ revalidatedPaths: [],
517
+ revalidatedTags: [],
518
+ redirectUrl: null,
519
+ history: []
520
+ };
521
+ }
522
+ function submitFormAction(session, form) {
523
+ if (session.state !== "idle") {
524
+ throw new Error(`submitFormAction: session is ${session.state}, not idle`);
525
+ }
526
+ session.state = "submitted";
527
+ session.form = { ...form };
528
+ return emit(session, "action.form_submitted", {
529
+ fields: Object.keys(form).join(","),
530
+ fieldCount: Object.keys(form).length
531
+ });
532
+ }
533
+ function revalidateActionPath(session, path) {
534
+ if (session.state === "idle") {
535
+ throw new Error("revalidateActionPath: form action was not submitted");
536
+ }
537
+ if (!path.startsWith("/")) {
538
+ throw new Error("revalidateActionPath: path must start with /");
539
+ }
540
+ session.state = "path-revalidated";
541
+ session.revalidatedPaths.push(path);
542
+ return emit(session, "action.revalidate_path", { path, count: session.revalidatedPaths.length });
543
+ }
544
+ function revalidateActionTag(session, tag) {
545
+ if (session.state === "idle") {
546
+ throw new Error("revalidateActionTag: form action was not submitted");
547
+ }
548
+ if (tag.length === 0) {
549
+ throw new Error("revalidateActionTag: tag must not be empty");
550
+ }
551
+ session.state = "tag-revalidated";
552
+ session.revalidatedTags.push(tag);
553
+ return emit(session, "action.revalidate_tag", { tag, count: session.revalidatedTags.length });
554
+ }
555
+ function redirectAction(session, url) {
556
+ if (session.state === "idle") {
557
+ throw new Error("redirectAction: form action was not submitted");
558
+ }
559
+ if (url.length === 0) {
560
+ throw new Error("redirectAction: url must not be empty");
561
+ }
562
+ session.state = "redirected";
563
+ session.redirectUrl = url;
564
+ return emit(session, "action.redirected", { url });
565
+ }
566
+ function emit(session, neutralEvent, metadata) {
567
+ const step = {
568
+ neutralEvent,
569
+ providerEvent: providerEventName(session.target, neutralEvent),
570
+ state: session.state,
571
+ amountCents: 0,
572
+ metadata: { target: session.target, actionId: session.actionId, ...metadata }
573
+ };
574
+ session.history.push(step);
575
+ return step;
576
+ }
577
+
578
+ // src/semantics/partial-prerendering.ts
579
+ function startPartialPrerendering(input) {
580
+ if (input.routeId.length === 0) {
581
+ throw new Error("startPartialPrerendering: routeId must not be empty");
582
+ }
583
+ return {
584
+ target: input.target,
585
+ routeId: input.routeId,
586
+ state: "idle",
587
+ shellHtml: null,
588
+ dynamicHoles: /* @__PURE__ */ new Map(),
589
+ streamedBoundaries: [],
590
+ history: []
591
+ };
592
+ }
593
+ function renderStaticShell(session, html) {
594
+ if (session.state !== "idle") {
595
+ throw new Error(`renderStaticShell: session is ${session.state}, not idle`);
596
+ }
597
+ if (html.length === 0) {
598
+ throw new Error("renderStaticShell: html must not be empty");
599
+ }
600
+ session.state = "static-shell";
601
+ session.shellHtml = html;
602
+ return emit2(session, "ppr.static_shell_rendered", { bytes: html.length });
603
+ }
604
+ function openDynamicHole(session, input) {
605
+ if (session.shellHtml === null) {
606
+ throw new Error("openDynamicHole: static shell must be rendered first");
607
+ }
608
+ if (input.holeId.length === 0) {
609
+ throw new Error("openDynamicHole: holeId must not be empty");
610
+ }
611
+ session.state = "dynamic-hole";
612
+ session.dynamicHoles.set(input.holeId, input.fallback);
613
+ return emit2(session, "ppr.dynamic_hole_opened", {
614
+ holeId: input.holeId,
615
+ fallback: input.fallback,
616
+ holeCount: session.dynamicHoles.size
617
+ });
618
+ }
619
+ function flushStreamingBoundary(session, input) {
620
+ if (!session.dynamicHoles.has(input.holeId)) {
621
+ throw new Error(`flushStreamingBoundary: ${input.holeId} is not an open dynamic hole`);
622
+ }
623
+ if (input.html.length === 0) {
624
+ throw new Error("flushStreamingBoundary: html must not be empty");
625
+ }
626
+ session.state = "streaming";
627
+ session.streamedBoundaries.push(input.holeId);
628
+ session.dynamicHoles.set(input.holeId, input.html);
629
+ return emit2(session, "ppr.streaming_boundary_flushed", {
630
+ holeId: input.holeId,
631
+ bytes: input.html.length
632
+ });
633
+ }
634
+ function completePartialPrerendering(session) {
635
+ if (session.shellHtml === null) {
636
+ throw new Error("completePartialPrerendering: static shell was not rendered");
637
+ }
638
+ session.state = "completed";
639
+ return emit2(session, "ppr.completed", {
640
+ holeCount: session.dynamicHoles.size,
641
+ streamedCount: session.streamedBoundaries.length
642
+ });
643
+ }
644
+ function emit2(session, neutralEvent, metadata) {
645
+ const step = {
646
+ neutralEvent,
647
+ providerEvent: providerEventName(session.target, neutralEvent),
648
+ state: session.state,
649
+ amountCents: 0,
650
+ metadata: { target: session.target, routeId: session.routeId, ...metadata }
651
+ };
652
+ session.history.push(step);
653
+ return step;
654
+ }
655
+
656
+ // src/semantics/interception-routes.ts
657
+ function startInterceptionRoutes(input) {
658
+ if (input.routeId.length === 0) {
659
+ throw new Error("startInterceptionRoutes: routeId must not be empty");
660
+ }
661
+ return {
662
+ target: input.target,
663
+ routeId: input.routeId,
664
+ state: "idle",
665
+ matches: [],
666
+ modalRoute: null,
667
+ history: []
668
+ };
669
+ }
670
+ function interceptCurrentSegment(session, from, to) {
671
+ return intercept(session, "(.)", "current", "intercept.current_segment", from, to);
672
+ }
673
+ function interceptParentSegment(session, from, to) {
674
+ return intercept(session, "(..)", "parent", "intercept.parent_segment", from, to);
675
+ }
676
+ function interceptRootCatchall(session, from, to) {
677
+ return intercept(session, "(...)", "root", "intercept.root_catchall", from, to);
678
+ }
679
+ function openInterceptedModal(session, modalRoute) {
680
+ if (modalRoute.length === 0) {
681
+ throw new Error("openInterceptedModal: modalRoute must not be empty");
682
+ }
683
+ if (session.matches.length === 0) {
684
+ throw new Error("openInterceptedModal: an interception match is required first");
685
+ }
686
+ session.state = "modal-open";
687
+ session.modalRoute = modalRoute;
688
+ return emit3(session, "intercept.modal_opened", {
689
+ modalRoute,
690
+ matchCount: session.matches.length
691
+ });
692
+ }
693
+ function intercept(session, matcher, state, neutralEvent, from, to) {
694
+ if (!from.startsWith("/") || !to.startsWith("/")) {
695
+ throw new Error("intercept: from and to must start with /");
696
+ }
697
+ session.state = state;
698
+ session.matches.push({ matcher, from, to });
699
+ return emit3(session, neutralEvent, { matcher, from, to });
700
+ }
701
+ function emit3(session, neutralEvent, metadata) {
702
+ const step = {
703
+ neutralEvent,
704
+ providerEvent: providerEventName(session.target, neutralEvent),
705
+ state: session.state,
706
+ amountCents: 0,
707
+ metadata: { target: session.target, routeId: session.routeId, ...metadata }
708
+ };
709
+ session.history.push(step);
710
+ return step;
711
+ }
712
+
713
+ // src/semantics/parallel-routes-advanced.ts
714
+ function startParallelRoutesAdvanced(input) {
715
+ if (input.layoutId.length === 0) {
716
+ throw new Error("startParallelRoutesAdvanced: layoutId must not be empty");
717
+ }
718
+ return {
719
+ target: input.target,
720
+ layoutId: input.layoutId,
721
+ state: "idle",
722
+ slots: /* @__PURE__ */ new Map(),
723
+ loadingSlots: /* @__PURE__ */ new Set(),
724
+ errors: [],
725
+ history: []
726
+ };
727
+ }
728
+ function renderDefaultSlot(session, slot, html) {
729
+ assertSlot(slot);
730
+ session.state = "default-rendered";
731
+ session.slots.set(slot, html);
732
+ return emit4(session, "parallel.default_rendered", { slot, html });
733
+ }
734
+ function renderLoadingState(session, slot) {
735
+ assertSlot(slot);
736
+ session.state = "loading-rendered";
737
+ session.loadingSlots.add(slot);
738
+ return emit4(session, "parallel.loading_rendered", {
739
+ slot,
740
+ loadingCount: session.loadingSlots.size
741
+ });
742
+ }
743
+ function captureParallelError(session, input) {
744
+ assertSlot(input.slot);
745
+ const message = typeof input.error === "string" ? input.error : input.error.message;
746
+ session.state = "error-captured";
747
+ session.errors.push({ slot: input.slot, message });
748
+ return emit4(session, "parallel.error_boundary_captured", {
749
+ slot: input.slot,
750
+ message,
751
+ errorCount: session.errors.length
752
+ });
753
+ }
754
+ function navigateSlot(session, input) {
755
+ assertSlot(input.slot);
756
+ if (!input.from.startsWith("/") || !input.to.startsWith("/")) {
757
+ throw new Error("navigateSlot: from and to must start with /");
758
+ }
759
+ session.state = "slot-navigated";
760
+ session.loadingSlots.delete(input.slot);
761
+ return emit4(session, "parallel.slot_navigated", input);
762
+ }
763
+ function assertSlot(slot) {
764
+ if (slot.length === 0) {
765
+ throw new Error("slot must not be empty");
766
+ }
767
+ }
768
+ function emit4(session, neutralEvent, metadata) {
769
+ const step = {
770
+ neutralEvent,
771
+ providerEvent: providerEventName(session.target, neutralEvent),
772
+ state: session.state,
773
+ amountCents: 0,
774
+ metadata: { target: session.target, layoutId: session.layoutId, ...metadata }
775
+ };
776
+ session.history.push(step);
777
+ return step;
778
+ }
779
+
780
+ // src/semantics/fidelity.ts
781
+ var NEXT_AXIS_TO_EVENTS = {
782
+ "server-action-advanced": [
783
+ "action.form_submitted",
784
+ "action.revalidate_path",
785
+ "action.revalidate_tag",
786
+ "action.redirected"
787
+ ],
788
+ "partial-prerendering": [
789
+ "ppr.static_shell_rendered",
790
+ "ppr.dynamic_hole_opened",
791
+ "ppr.streaming_boundary_flushed",
792
+ "ppr.completed"
793
+ ],
794
+ "interception-routes": [
795
+ "intercept.current_segment",
796
+ "intercept.parent_segment",
797
+ "intercept.root_catchall",
798
+ "intercept.modal_opened"
799
+ ],
800
+ "parallel-routes-advanced": [
801
+ "parallel.default_rendered",
802
+ "parallel.loading_rendered",
803
+ "parallel.error_boundary_captured",
804
+ "parallel.slot_navigated"
805
+ ],
806
+ // v1.49 advanced III
807
+ "turbopack-hmr": [
808
+ "turbopack.module_updated",
809
+ "turbopack.hmr_boundary_found",
810
+ "turbopack.hmr_applied",
811
+ "turbopack.fast_refresh_completed"
812
+ ],
813
+ "concurrent-transitions": [
814
+ "transition.started",
815
+ "transition.pending",
816
+ "transition.interrupted",
817
+ "transition.committed"
818
+ ]
819
+ };
820
+ function collectFidelityCoverage(providers = ["app-router", "pages-router", "edge-runtime"]) {
821
+ const axes = Object.keys(NEXT_AXIS_TO_EVENTS);
822
+ const rows = [];
823
+ for (const provider of providers) {
824
+ for (const axis of axes) {
825
+ const neutralEvents = NEXT_AXIS_TO_EVENTS[axis];
826
+ rows.push({
827
+ provider,
828
+ axis,
829
+ neutralEvents,
830
+ providerEvents: neutralEvents.map((event) => providerEventName(provider, event))
831
+ });
832
+ }
833
+ }
834
+ return { providers, axes, rows };
835
+ }
836
+
837
+ // src/semantics/turbopack-hmr.ts
838
+ function emit5(session, neutralEvent, metadata) {
839
+ const step = {
840
+ neutralEvent,
841
+ providerEvent: providerEventName(session.target, neutralEvent),
842
+ state: session.state,
843
+ amountCents: 0,
844
+ metadata: { sessionId: session.sessionId, ...metadata }
845
+ };
846
+ session.history.push(step);
847
+ return step;
848
+ }
849
+ function startTurbopackHmr(input) {
850
+ if (input.sessionId.length === 0) {
851
+ throw new Error("startTurbopackHmr: sessionId must not be empty");
852
+ }
853
+ return {
854
+ target: input.target,
855
+ sessionId: input.sessionId,
856
+ updatedModuleIds: [],
857
+ boundaryModuleId: null,
858
+ state: "idle",
859
+ history: []
860
+ };
861
+ }
862
+ function markModuleUpdated(session, moduleId) {
863
+ session.updatedModuleIds.push(moduleId);
864
+ session.state = "updating";
865
+ return emit5(session, "turbopack.module_updated", {
866
+ moduleId,
867
+ updateCount: session.updatedModuleIds.length
868
+ });
869
+ }
870
+ function findHmrBoundary(session, boundaryModuleId) {
871
+ if (session.state !== "updating") {
872
+ throw new Error(`findHmrBoundary: session is ${session.state}`);
873
+ }
874
+ session.boundaryModuleId = boundaryModuleId;
875
+ session.state = "boundary-found";
876
+ return emit5(session, "turbopack.hmr_boundary_found", { boundaryModuleId });
877
+ }
878
+ function applyHmrPatch(session) {
879
+ if (session.state !== "boundary-found") {
880
+ throw new Error(`applyHmrPatch: session is ${session.state}`);
881
+ }
882
+ session.state = "applied";
883
+ return emit5(session, "turbopack.hmr_applied", {
884
+ updatedModuleCount: session.updatedModuleIds.length
885
+ });
886
+ }
887
+ function completeFastRefresh(session) {
888
+ if (session.state !== "applied") {
889
+ throw new Error(`completeFastRefresh: session is ${session.state}`);
890
+ }
891
+ session.state = "refresh-completed";
892
+ return emit5(session, "turbopack.fast_refresh_completed", {
893
+ updatedModuleCount: session.updatedModuleIds.length
894
+ });
895
+ }
896
+
897
+ // src/semantics/concurrent-transitions.ts
898
+ function emit6(session, neutralEvent, metadata) {
899
+ const step = {
900
+ neutralEvent,
901
+ providerEvent: providerEventName(session.target, neutralEvent),
902
+ state: session.state,
903
+ amountCents: 0,
904
+ metadata: { transitionId: session.transitionId, ...metadata }
905
+ };
906
+ session.history.push(step);
907
+ return step;
908
+ }
909
+ function startConcurrentTransition(input) {
910
+ if (input.transitionId.length === 0) {
911
+ throw new Error("startConcurrentTransition: transitionId must not be empty");
912
+ }
913
+ const session = {
914
+ target: input.target,
915
+ transitionId: input.transitionId,
916
+ interruptions: 0,
917
+ pendingCount: 0,
918
+ state: "started",
919
+ committedValue: null,
920
+ history: []
921
+ };
922
+ emit6(session, "transition.started", { interruptions: 0 });
923
+ return session;
924
+ }
925
+ function markTransitionPending(session) {
926
+ if (session.state !== "started" && session.state !== "interrupted") {
927
+ throw new Error(`markTransitionPending: session is ${session.state}`);
928
+ }
929
+ session.state = "pending";
930
+ session.pendingCount += 1;
931
+ return emit6(session, "transition.pending", {
932
+ pendingCount: session.pendingCount
933
+ });
934
+ }
935
+ function interruptTransition(session) {
936
+ if (session.state !== "pending") {
937
+ throw new Error(`interruptTransition: session is ${session.state}`);
938
+ }
939
+ session.state = "interrupted";
940
+ session.interruptions += 1;
941
+ return emit6(session, "transition.interrupted", {
942
+ interruptions: session.interruptions
943
+ });
944
+ }
945
+ function commitTransition(session, committedValue) {
946
+ if (session.state !== "pending" && session.state !== "started") {
947
+ throw new Error(`commitTransition: session is ${session.state}`);
948
+ }
949
+ session.state = "committed";
950
+ session.committedValue = committedValue;
951
+ return emit6(session, "transition.committed", {
952
+ committedValue,
953
+ totalInterruptions: session.interruptions,
954
+ totalPending: session.pendingCount
955
+ });
956
+ }
957
+
958
+ // src/real-driver.ts
959
+ var TARGET_KEY_ENV = {
960
+ "app-router": "NEXT_APP_URL",
961
+ "pages-router": "NEXT_PAGES_URL",
962
+ "edge-runtime": "EDGE_RUNTIME_URL"
963
+ };
964
+ function resolveMode(provider, env = process.env) {
965
+ const rawMode = env.KIWA_MODE?.toLowerCase();
966
+ if (rawMode !== void 0 && rawMode !== "real" && rawMode !== "mock") {
967
+ return { provider, mode: "mock", reason: "invalid-mode" };
968
+ }
969
+ if (rawMode !== "real") {
970
+ return { provider, mode: "mock", reason: "default-mock" };
971
+ }
972
+ const keyValue = env[TARGET_KEY_ENV[provider]];
973
+ if (typeof keyValue !== "string" || keyValue.length === 0) {
974
+ return { provider, mode: "mock", reason: "missing-key" };
975
+ }
976
+ return { provider, mode: "real", reason: "kiwa-mode-real" };
977
+ }
978
+ function resolveAllModes(env = process.env) {
979
+ const providers = ["app-router", "pages-router", "edge-runtime"];
980
+ return providers.map((provider) => resolveMode(provider, env));
981
+ }
982
+ function assertMode(provider, expected, env = process.env) {
983
+ const resolved = resolveMode(provider, env);
984
+ if (resolved.mode !== expected) {
985
+ throw new Error(
986
+ `expected ${provider} in ${expected} mode but resolved ${resolved.mode} (${resolved.reason})`
987
+ );
988
+ }
989
+ }
990
+ // Annotate the CommonJS export names for ESM import in node:
991
+ 0 && (module.exports = {
992
+ FORBIDDEN_SYMBOL,
993
+ MIDDLEWARE_ACTION_SYMBOL,
994
+ NEXT_AXIS_TO_EVENTS,
995
+ NOT_FOUND_SYMBOL,
996
+ PARALLEL_INTERCEPTION_SYMBOL,
997
+ REDIRECT_SYMBOL,
998
+ RSC_ERROR_BOUNDARY_SYMBOL,
999
+ RSC_REDIRECT_SYMBOL,
1000
+ applyHmrPatch,
1001
+ assertMode,
1002
+ captureParallelError,
1003
+ collectFidelityCoverage,
1004
+ commitTransition,
1005
+ completeFastRefresh,
1006
+ completePartialPrerendering,
1007
+ findAll,
1008
+ findHmrBoundary,
1009
+ flushStreamingBoundary,
1010
+ interceptCurrentSegment,
1011
+ interceptParentSegment,
1012
+ interceptRootCatchall,
1013
+ interruptTransition,
1014
+ invokeMiddleware,
1015
+ invokeParallelRoutes,
1016
+ invokeServerAction,
1017
+ markModuleUpdated,
1018
+ markTransitionPending,
1019
+ middlewareActions,
1020
+ navigateSlot,
1021
+ openDynamicHole,
1022
+ openInterceptedModal,
1023
+ providerEventName,
1024
+ redirectAction,
1025
+ renderDefaultSlot,
1026
+ renderLoadingState,
1027
+ renderServerComponent,
1028
+ renderStaticShell,
1029
+ resolveAllModes,
1030
+ resolveMode,
1031
+ revalidateActionPath,
1032
+ revalidateActionTag,
1033
+ setupNextRscEnv,
1034
+ startConcurrentTransition,
1035
+ startInterceptionRoutes,
1036
+ startParallelRoutesAdvanced,
1037
+ startPartialPrerendering,
1038
+ startServerActionAdvanced,
1039
+ startTurbopackHmr,
1040
+ submitFormAction,
1041
+ textContent
1042
+ });
1043
+ //# sourceMappingURL=index.cjs.map