expo-server 0.0.0 → 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.
Files changed (158) hide show
  1. package/README.md +1 -0
  2. package/build/cjs/ImmutableRequest.d.ts +60 -0
  3. package/build/cjs/ImmutableRequest.js +160 -0
  4. package/build/cjs/ImmutableRequest.js.map +1 -0
  5. package/build/cjs/global.types.d.ts +13 -0
  6. package/build/cjs/global.types.js +3 -0
  7. package/build/cjs/global.types.js.map +1 -0
  8. package/build/cjs/index.d.ts +2 -0
  9. package/build/cjs/index.js +18 -0
  10. package/build/cjs/index.js.map +1 -0
  11. package/build/cjs/manifest.d.ts +27 -0
  12. package/build/cjs/manifest.js +3 -0
  13. package/build/cjs/manifest.js.map +1 -0
  14. package/build/cjs/middleware/rsc.d.ts +36 -0
  15. package/build/cjs/middleware/rsc.js +124 -0
  16. package/build/cjs/middleware/rsc.js.map +1 -0
  17. package/build/cjs/private.d.ts +2 -0
  18. package/build/cjs/private.js +6 -0
  19. package/build/cjs/private.js.map +1 -0
  20. package/build/cjs/runtime/api.d.ts +36 -0
  21. package/build/cjs/runtime/api.js +64 -0
  22. package/build/cjs/runtime/api.js.map +1 -0
  23. package/build/cjs/runtime/error.d.ts +19 -0
  24. package/build/cjs/runtime/error.js +69 -0
  25. package/build/cjs/runtime/error.js.map +1 -0
  26. package/build/cjs/runtime/index.d.ts +11 -0
  27. package/build/cjs/runtime/index.js +77 -0
  28. package/build/cjs/runtime/index.js.map +1 -0
  29. package/build/cjs/runtime/scope.d.ts +10 -0
  30. package/build/cjs/runtime/scope.js +12 -0
  31. package/build/cjs/runtime/scope.js.map +1 -0
  32. package/build/cjs/types.d.ts +43 -0
  33. package/build/cjs/types.js +3 -0
  34. package/build/cjs/types.js.map +1 -0
  35. package/build/cjs/utils/createReadableStreamFromReadable.d.ts +15 -0
  36. package/build/cjs/utils/createReadableStreamFromReadable.js +97 -0
  37. package/build/cjs/utils/createReadableStreamFromReadable.js.map +1 -0
  38. package/build/cjs/utils/importMetaRegistry.d.ts +3 -0
  39. package/build/cjs/utils/importMetaRegistry.js +30 -0
  40. package/build/cjs/utils/importMetaRegistry.js.map +1 -0
  41. package/build/cjs/utils/matchers.d.ts +12 -0
  42. package/build/cjs/utils/matchers.js +76 -0
  43. package/build/cjs/utils/matchers.js.map +1 -0
  44. package/build/cjs/utils/middleware.d.ts +9 -0
  45. package/build/cjs/utils/middleware.js +82 -0
  46. package/build/cjs/utils/middleware.js.map +1 -0
  47. package/build/cjs/vendor/abstract.d.ts +40 -0
  48. package/build/cjs/vendor/abstract.js +245 -0
  49. package/build/cjs/vendor/abstract.js.map +1 -0
  50. package/build/cjs/vendor/bun.d.ts +10 -0
  51. package/build/cjs/vendor/bun.js +22 -0
  52. package/build/cjs/vendor/bun.js.map +1 -0
  53. package/build/cjs/vendor/eas.d.ts +10 -0
  54. package/build/cjs/vendor/eas.js +28 -0
  55. package/build/cjs/vendor/eas.js.map +1 -0
  56. package/build/cjs/vendor/environment/common.d.ts +14 -0
  57. package/build/cjs/vendor/environment/common.js +66 -0
  58. package/build/cjs/vendor/environment/common.js.map +1 -0
  59. package/build/cjs/vendor/environment/node.d.ts +14 -0
  60. package/build/cjs/vendor/environment/node.js +55 -0
  61. package/build/cjs/vendor/environment/node.js.map +1 -0
  62. package/build/cjs/vendor/environment/workerd.d.ts +18 -0
  63. package/build/cjs/vendor/environment/workerd.js +72 -0
  64. package/build/cjs/vendor/environment/workerd.js.map +1 -0
  65. package/build/cjs/vendor/express.d.ts +14 -0
  66. package/build/cjs/vendor/express.js +100 -0
  67. package/build/cjs/vendor/express.js.map +1 -0
  68. package/build/cjs/vendor/http.d.ts +15 -0
  69. package/build/cjs/vendor/http.js +103 -0
  70. package/build/cjs/vendor/http.js.map +1 -0
  71. package/build/cjs/vendor/netlify.d.ts +15 -0
  72. package/build/cjs/vendor/netlify.js +46 -0
  73. package/build/cjs/vendor/netlify.js.map +1 -0
  74. package/build/cjs/vendor/vercel.d.ts +13 -0
  75. package/build/cjs/vendor/vercel.js +109 -0
  76. package/build/cjs/vendor/vercel.js.map +1 -0
  77. package/build/cjs/vendor/workerd.d.ts +11 -0
  78. package/build/cjs/vendor/workerd.js +22 -0
  79. package/build/cjs/vendor/workerd.js.map +1 -0
  80. package/build/mjs/ImmutableRequest.d.ts +60 -0
  81. package/build/mjs/ImmutableRequest.js +155 -0
  82. package/build/mjs/ImmutableRequest.js.map +1 -0
  83. package/build/mjs/global.types.d.ts +13 -0
  84. package/build/mjs/global.types.js +2 -0
  85. package/build/mjs/global.types.js.map +1 -0
  86. package/build/mjs/index.d.ts +2 -0
  87. package/build/mjs/index.js +2 -0
  88. package/build/mjs/index.js.map +1 -0
  89. package/build/mjs/manifest.d.ts +27 -0
  90. package/build/mjs/manifest.js +2 -0
  91. package/build/mjs/manifest.js.map +1 -0
  92. package/build/mjs/middleware/rsc.d.ts +36 -0
  93. package/build/mjs/middleware/rsc.js +119 -0
  94. package/build/mjs/middleware/rsc.js.map +1 -0
  95. package/build/mjs/private.d.ts +2 -0
  96. package/build/mjs/private.js +2 -0
  97. package/build/mjs/private.js.map +1 -0
  98. package/build/mjs/runtime/api.d.ts +36 -0
  99. package/build/mjs/runtime/api.js +56 -0
  100. package/build/mjs/runtime/api.js.map +1 -0
  101. package/build/mjs/runtime/error.d.ts +19 -0
  102. package/build/mjs/runtime/error.js +64 -0
  103. package/build/mjs/runtime/error.js.map +1 -0
  104. package/build/mjs/runtime/index.d.ts +11 -0
  105. package/build/mjs/runtime/index.js +74 -0
  106. package/build/mjs/runtime/index.js.map +1 -0
  107. package/build/mjs/runtime/scope.d.ts +10 -0
  108. package/build/mjs/runtime/scope.js +9 -0
  109. package/build/mjs/runtime/scope.js.map +1 -0
  110. package/build/mjs/types.d.ts +43 -0
  111. package/build/mjs/types.js +2 -0
  112. package/build/mjs/types.js.map +1 -0
  113. package/build/mjs/utils/createReadableStreamFromReadable.d.ts +15 -0
  114. package/build/mjs/utils/createReadableStreamFromReadable.js +93 -0
  115. package/build/mjs/utils/createReadableStreamFromReadable.js.map +1 -0
  116. package/build/mjs/utils/importMetaRegistry.d.ts +3 -0
  117. package/build/mjs/utils/importMetaRegistry.js +27 -0
  118. package/build/mjs/utils/importMetaRegistry.js.map +1 -0
  119. package/build/mjs/utils/matchers.d.ts +12 -0
  120. package/build/mjs/utils/matchers.js +69 -0
  121. package/build/mjs/utils/matchers.js.map +1 -0
  122. package/build/mjs/utils/middleware.d.ts +9 -0
  123. package/build/mjs/utils/middleware.js +79 -0
  124. package/build/mjs/utils/middleware.js.map +1 -0
  125. package/build/mjs/vendor/abstract.d.ts +40 -0
  126. package/build/mjs/vendor/abstract.js +240 -0
  127. package/build/mjs/vendor/abstract.js.map +1 -0
  128. package/build/mjs/vendor/bun.d.ts +10 -0
  129. package/build/mjs/vendor/bun.js +17 -0
  130. package/build/mjs/vendor/bun.js.map +1 -0
  131. package/build/mjs/vendor/eas.d.ts +10 -0
  132. package/build/mjs/vendor/eas.js +23 -0
  133. package/build/mjs/vendor/eas.js.map +1 -0
  134. package/build/mjs/vendor/environment/common.d.ts +14 -0
  135. package/build/mjs/vendor/environment/common.js +63 -0
  136. package/build/mjs/vendor/environment/common.js.map +1 -0
  137. package/build/mjs/vendor/environment/node.d.ts +14 -0
  138. package/build/mjs/vendor/environment/node.js +48 -0
  139. package/build/mjs/vendor/environment/node.js.map +1 -0
  140. package/build/mjs/vendor/environment/workerd.d.ts +18 -0
  141. package/build/mjs/vendor/environment/workerd.js +68 -0
  142. package/build/mjs/vendor/environment/workerd.js.map +1 -0
  143. package/build/mjs/vendor/express.d.ts +14 -0
  144. package/build/mjs/vendor/express.js +92 -0
  145. package/build/mjs/vendor/express.js.map +1 -0
  146. package/build/mjs/vendor/http.d.ts +15 -0
  147. package/build/mjs/vendor/http.js +95 -0
  148. package/build/mjs/vendor/http.js.map +1 -0
  149. package/build/mjs/vendor/netlify.d.ts +15 -0
  150. package/build/mjs/vendor/netlify.js +41 -0
  151. package/build/mjs/vendor/netlify.js.map +1 -0
  152. package/build/mjs/vendor/vercel.d.ts +13 -0
  153. package/build/mjs/vendor/vercel.js +101 -0
  154. package/build/mjs/vendor/vercel.js.map +1 -0
  155. package/build/mjs/vendor/workerd.d.ts +11 -0
  156. package/build/mjs/vendor/workerd.js +17 -0
  157. package/build/mjs/vendor/workerd.js.map +1 -0
  158. package/package.json +58 -7
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StatusError = void 0;
4
+ exports.errorToResponse = errorToResponse;
5
+ class StatusError extends Error {
6
+ status;
7
+ body;
8
+ constructor(status = 500, body, errorOptions) {
9
+ const cause = (errorOptions != null && errorOptions.cause) ??
10
+ (body != null && typeof body === 'object' && body.cause != null ? body.cause : undefined);
11
+ let message = typeof body === 'object' ? (body instanceof Error ? body.message : body.error) : body;
12
+ if (message == null) {
13
+ switch (status) {
14
+ case 400:
15
+ message = 'Bad Request';
16
+ break;
17
+ case 401:
18
+ message = 'Unauthorized';
19
+ break;
20
+ case 403:
21
+ message = 'Forbidden';
22
+ break;
23
+ case 404:
24
+ message = 'Not Found';
25
+ break;
26
+ case 500:
27
+ message = 'Internal Server Error';
28
+ break;
29
+ default:
30
+ message = 'Unknown Error';
31
+ }
32
+ }
33
+ super(message, cause ? { cause } : undefined);
34
+ this.name = 'StatusError';
35
+ this.status = status;
36
+ if (body instanceof Error) {
37
+ this.body = JSON.stringify({ error: body.message }, null, 2);
38
+ }
39
+ else {
40
+ this.body =
41
+ typeof body === 'object'
42
+ ? JSON.stringify(body, null, 2)
43
+ : (body ?? JSON.stringify({ error: message }, null, 2));
44
+ }
45
+ }
46
+ }
47
+ exports.StatusError = StatusError;
48
+ function errorToResponse(error) {
49
+ if (error instanceof StatusError) {
50
+ return new Response(error.body, {
51
+ status: error.status,
52
+ headers: {
53
+ 'Content-Type': 'application/json; charset=utf-8',
54
+ },
55
+ });
56
+ }
57
+ else if ('status' in error && typeof error.status === 'number') {
58
+ const body = 'body' in error && typeof error.body === 'string'
59
+ ? error.body
60
+ : JSON.stringify({ error: error.message }, null, 2);
61
+ return new Response(body, {
62
+ status: error.status,
63
+ });
64
+ }
65
+ else {
66
+ return new Response(`${error}`, { status: 500 });
67
+ }
68
+ }
69
+ //# sourceMappingURL=error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error.js","sourceRoot":"","sources":["../../../src/runtime/error.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { RequestAPI } from './api';
2
+ import { type ScopeDefinition } from './scope';
3
+ export interface RequestAPISetup extends RequestAPI {
4
+ origin?: string;
5
+ environment?: string | null;
6
+ waitUntil?(promise: Promise<unknown>): void;
7
+ }
8
+ type RequestContextFactory = (...args: any[]) => Partial<RequestAPISetup>;
9
+ type RequestScopeRunner<F extends RequestContextFactory> = (fn: (...args: Parameters<F>) => Promise<Response>, ...args: Parameters<F>) => Promise<Response>;
10
+ export declare function createRequestScope<F extends RequestContextFactory>(scopeDefinition: ScopeDefinition, makeRequestAPISetup: F): RequestScopeRunner<F>;
11
+ export {};
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createRequestScope = createRequestScope;
4
+ const error_1 = require("./error");
5
+ const scope_1 = require("./scope");
6
+ const importMetaRegistry_1 = require("../utils/importMetaRegistry");
7
+ function setupRuntime() {
8
+ try {
9
+ Object.defineProperty(globalThis, 'origin', {
10
+ enumerable: true,
11
+ configurable: true,
12
+ get() {
13
+ return scope_1.scopeRef.current?.getStore()?.origin || 'null';
14
+ },
15
+ });
16
+ }
17
+ catch { }
18
+ try {
19
+ Object.defineProperty(globalThis, '__ExpoImportMetaRegistry', {
20
+ enumerable: true,
21
+ configurable: true,
22
+ get() {
23
+ return importMetaRegistry_1.importMetaRegistry;
24
+ },
25
+ });
26
+ }
27
+ catch { }
28
+ }
29
+ function createRequestScope(scopeDefinition, makeRequestAPISetup) {
30
+ setupRuntime();
31
+ // NOTE(@kitten): For long-running servers, this will always be a noop. It therefore
32
+ // makes sense for us to provide a default that doesn't do anything.
33
+ function defaultWaitUntil(promise) {
34
+ promise.finally(() => { });
35
+ }
36
+ return async (run, ...args) => {
37
+ // Initialize the scope definition which is used to isolate the runtime API between
38
+ // requests. The implementation of scopes differs per runtime, and is only initialized
39
+ // once the first request is received
40
+ scope_1.scopeRef.current = scopeDefinition;
41
+ const setup = makeRequestAPISetup(...args);
42
+ const { waitUntil = defaultWaitUntil } = setup;
43
+ const scope = {
44
+ ...setup,
45
+ origin: setup.origin,
46
+ environment: setup.environment,
47
+ waitUntil,
48
+ deferTask: setup.deferTask,
49
+ };
50
+ const deferredTasks = [];
51
+ if (!scope.deferTask) {
52
+ scope.deferTask = function deferTask(fn) {
53
+ deferredTasks.push(fn);
54
+ };
55
+ }
56
+ let result;
57
+ try {
58
+ result =
59
+ scope_1.scopeRef.current != null
60
+ ? await scope_1.scopeRef.current.run(scope, () => run(...args))
61
+ : await run(...args);
62
+ }
63
+ catch (error) {
64
+ if (error != null && error instanceof Error && 'status' in error) {
65
+ return (0, error_1.errorToResponse)(error);
66
+ }
67
+ else {
68
+ throw error;
69
+ }
70
+ }
71
+ if (deferredTasks.length) {
72
+ deferredTasks.forEach((fn) => waitUntil(fn()));
73
+ }
74
+ return result;
75
+ };
76
+ }
77
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/runtime/index.ts"],"names":[],"mappings":";;AAuCA,gDAwDC;AA9FD,mCAA0C;AAC1C,mCAAyD;AACzD,oEAAiE;AAQjE,SAAS,YAAY;IACnB,IAAI,CAAC;QACH,MAAM,CAAC,cAAc,CAAC,UAAU,EAAE,QAAQ,EAAE;YAC1C,UAAU,EAAE,IAAI;YAChB,YAAY,EAAE,IAAI;YAClB,GAAG;gBACD,OAAO,gBAAQ,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE,MAAM,IAAI,MAAM,CAAC;YACxD,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IACV,IAAI,CAAC;QACH,MAAM,CAAC,cAAc,CAAC,UAAU,EAAE,0BAA0B,EAAE;YAC5D,UAAU,EAAE,IAAI;YAChB,YAAY,EAAE,IAAI;YAClB,GAAG;gBACD,OAAO,uCAAkB,CAAC;YAC5B,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;AACZ,CAAC;AASD,SAAgB,kBAAkB,CAChC,eAAgC,EAChC,mBAAsB;IAEtB,YAAY,EAAE,CAAC;IAEf,oFAAoF;IACpF,oEAAoE;IACpE,SAAS,gBAAgB,CAAC,OAAyB;QACjD,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAC5B,CAAC;IAED,OAAO,KAAK,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,EAAE;QAC5B,mFAAmF;QACnF,sFAAsF;QACtF,qCAAqC;QACrC,gBAAQ,CAAC,OAAO,GAAG,eAAe,CAAC;QAEnC,MAAM,KAAK,GAAG,mBAAmB,CAAC,GAAG,IAAI,CAAC,CAAC;QAC3C,MAAM,EAAE,SAAS,GAAG,gBAAgB,EAAE,GAAG,KAAK,CAAC;QAE/C,MAAM,KAAK,GAAG;YACZ,GAAG,KAAK;YACR,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,SAAS;YACT,SAAS,EAAE,KAAK,CAAC,SAAS;SACN,CAAC;QAEvB,MAAM,aAAa,GAA+B,EAAE,CAAC;QACrD,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;YACrB,KAAK,CAAC,SAAS,GAAG,SAAS,SAAS,CAAC,EAAE;gBACrC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACzB,CAAC,CAAC;QACJ,CAAC;QAED,IAAI,MAAgB,CAAC;QACrB,IAAI,CAAC;YACH,MAAM;gBACJ,gBAAQ,CAAC,OAAO,IAAI,IAAI;oBACtB,CAAC,CAAC,MAAM,gBAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;oBACvD,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;QAC3B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,YAAY,KAAK,IAAI,QAAQ,IAAI,KAAK,EAAE,CAAC;gBACjE,OAAO,IAAA,uBAAe,EAAC,KAAK,CAAC,CAAC;YAChC,CAAC;iBAAM,CAAC;gBACN,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;QAED,IAAI,aAAa,CAAC,MAAM,EAAE,CAAC;YACzB,aAAa,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACjD,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { RequestAPI } from './api';
2
+ export interface ScopeDefinition<Scope extends RequestAPI = any> {
3
+ getStore(): Scope | undefined;
4
+ run<R>(scope: Scope, runner: () => R): R;
5
+ run<R, TArgs extends any[]>(scope: Scope, runner: (...args: TArgs) => R, ...args: TArgs): R;
6
+ }
7
+ declare const scopeRef: {
8
+ current: ScopeDefinition<RequestAPI> | null;
9
+ };
10
+ export { scopeRef };
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.scopeRef = void 0;
4
+ // NOTE(@kitten): When multiple versions of `@expo/server` are bundled, we still want to reuse the same scope definition
5
+ const scopeSymbol = Symbol.for('expoServerRuntime');
6
+ const sharedScope = globalThis;
7
+ const scopeRef = sharedScope[scopeSymbol] ||
8
+ (sharedScope[scopeSymbol] = {
9
+ current: null,
10
+ });
11
+ exports.scopeRef = scopeRef;
12
+ //# sourceMappingURL=scope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope.js","sourceRoot":"","sources":["../../../src/runtime/scope.ts"],"names":[],"mappings":";;;AAQA,wHAAwH;AACxH,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;AACpD,MAAM,WAAW,GACf,UAAU,CAAC;AAEb,MAAM,QAAQ,GACZ,WAAW,CAAC,WAAW,CAAC;IACxB,CAAC,WAAW,CAAC,WAAW,CAAC,GAAG;QAC1B,OAAO,EAAE,IAAI;KACd,CAAC,CAAC;AAEI,4BAAQ"}
@@ -0,0 +1,43 @@
1
+ import type { _ImmutableRequest } from './ImmutableRequest';
2
+ /**
3
+ * An immutable version of the Fetch API's [`Request`](https://developer.mozilla.org/en-US/docs/Web/API/Request) object which prevents mutations to the request body and headers.
4
+ */
5
+ export interface ImmutableRequest extends _ImmutableRequest {
6
+ }
7
+ /**
8
+ * Middleware pattern type that can be a string (including named params) or a regular expression.
9
+ *
10
+ * @example
11
+ * // Exact match
12
+ * '/api'
13
+ * @example
14
+ * // Named parameters
15
+ * '/posts/[postId]' // Single dynamic segment
16
+ * '/blog/[...slug]' // Catch-all segments
17
+ * '/users/[userId]/posts/[postId]' // Multiple parameters
18
+ * @example
19
+ * // Regular expression
20
+ * /^\/api\/v\d+\/users$/
21
+ */
22
+ export type MiddlewarePattern = string | RegExp;
23
+ export type MiddlewareMatcher = {
24
+ /**
25
+ * Array of path patterns to match against. Supports exact paths, paths with named parameters, and regex patterns.
26
+ */
27
+ patterns?: MiddlewarePattern[];
28
+ /**
29
+ * HTTP methods to match (undefined = all methods)
30
+ * @example ['POST', 'PUT', 'DELETE']
31
+ */
32
+ methods?: string[];
33
+ };
34
+ /**
35
+ * Middleware function type that runs before route matching.
36
+ * Can return a Response to short-circuit the request, or void/undefined to continue.
37
+ *
38
+ * @param request - An `ImmutableRequest` with read-only headers and no body access
39
+ */
40
+ export type MiddlewareFunction = (request: ImmutableRequest) => Promise<Response | void> | Response | void;
41
+ export interface MiddlewareSettings {
42
+ matcher?: MiddlewareMatcher;
43
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Copyright © 2025 650 Industries.
3
+ * Copyright (c) Remix Software Inc. 2020-2021
4
+ * Copyright (c) Shopify Inc. 2022-2024
5
+ *
6
+ * This source code is licensed under the MIT license found in the
7
+ * LICENSE file in the root directory of this source tree.
8
+ *
9
+ * Original license https://github.com/remix-run/remix/blob/6d6caaed5dfc436242962dcb2ff9617757a11e17/LICENSE.md
10
+ * Code from https://github.com/remix-run/remix/blob/6d6caaed5dfc436242962dcb2ff9617757a11e17/packages/remix-node/stream.ts#L66
11
+ */
12
+ import type { Readable } from 'node:stream';
13
+ export declare const createReadableStreamFromReadable: (source: Readable & {
14
+ readableHighWaterMark?: number;
15
+ }) => ReadableStream<Uint8Array<ArrayBufferLike>>;
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ /**
3
+ * Copyright © 2025 650 Industries.
4
+ * Copyright (c) Remix Software Inc. 2020-2021
5
+ * Copyright (c) Shopify Inc. 2022-2024
6
+ *
7
+ * This source code is licensed under the MIT license found in the
8
+ * LICENSE file in the root directory of this source tree.
9
+ *
10
+ * Original license https://github.com/remix-run/remix/blob/6d6caaed5dfc436242962dcb2ff9617757a11e17/LICENSE.md
11
+ * Code from https://github.com/remix-run/remix/blob/6d6caaed5dfc436242962dcb2ff9617757a11e17/packages/remix-node/stream.ts#L66
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.createReadableStreamFromReadable = void 0;
15
+ const node_stream_1 = require("node:stream");
16
+ const createReadableStreamFromReadable = (source) => {
17
+ const pump = new StreamPump(source);
18
+ const stream = new ReadableStream(pump, pump);
19
+ return stream;
20
+ };
21
+ exports.createReadableStreamFromReadable = createReadableStreamFromReadable;
22
+ class StreamPump {
23
+ highWaterMark;
24
+ accumalatedSize;
25
+ stream;
26
+ controller;
27
+ constructor(stream) {
28
+ this.highWaterMark =
29
+ stream.readableHighWaterMark || new node_stream_1.Stream.Readable().readableHighWaterMark;
30
+ this.accumalatedSize = 0;
31
+ this.stream = stream;
32
+ this.enqueue = this.enqueue.bind(this);
33
+ this.error = this.error.bind(this);
34
+ this.close = this.close.bind(this);
35
+ }
36
+ size(chunk) {
37
+ return chunk?.byteLength || 0;
38
+ }
39
+ start(controller) {
40
+ this.controller = controller;
41
+ this.stream.on('data', this.enqueue);
42
+ this.stream.once('error', this.error);
43
+ this.stream.once('end', this.close);
44
+ this.stream.once('close', this.close);
45
+ }
46
+ pull() {
47
+ this.resume();
48
+ }
49
+ cancel(reason) {
50
+ if (this.stream.destroy) {
51
+ this.stream.destroy(reason);
52
+ }
53
+ this.stream.off('data', this.enqueue);
54
+ this.stream.off('error', this.error);
55
+ this.stream.off('end', this.close);
56
+ this.stream.off('close', this.close);
57
+ }
58
+ enqueue(chunk) {
59
+ if (this.controller) {
60
+ try {
61
+ const bytes = chunk instanceof Uint8Array ? chunk : Buffer.from(chunk);
62
+ const available = (this.controller.desiredSize || 0) - bytes.byteLength;
63
+ this.controller.enqueue(bytes);
64
+ if (available <= 0) {
65
+ this.pause();
66
+ }
67
+ }
68
+ catch {
69
+ this.controller.error(new Error('Could not create Buffer, chunk must be of type string or an instance of Buffer, ArrayBuffer, or Array or an Array-like Object'));
70
+ this.cancel();
71
+ }
72
+ }
73
+ }
74
+ pause() {
75
+ if (this.stream.pause) {
76
+ this.stream.pause();
77
+ }
78
+ }
79
+ resume() {
80
+ if (this.stream.readable && this.stream.resume) {
81
+ this.stream.resume();
82
+ }
83
+ }
84
+ close() {
85
+ if (this.controller) {
86
+ this.controller.close();
87
+ delete this.controller;
88
+ }
89
+ }
90
+ error(error) {
91
+ if (this.controller) {
92
+ this.controller.error(error);
93
+ delete this.controller;
94
+ }
95
+ }
96
+ }
97
+ //# sourceMappingURL=createReadableStreamFromReadable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createReadableStreamFromReadable.js","sourceRoot":"","sources":["../../../src/utils/createReadableStreamFromReadable.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare const importMetaRegistry: {
2
+ readonly url: any;
3
+ };
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.importMetaRegistry = void 0;
4
+ const DEFAULT_SCRIPT_NAME = 'file:///__main.js';
5
+ // - ./runtime/importMetaRegistry.ts (this file) -> importMetaRegistry.url
6
+ // - ./runtime/index.ts -> globalThis.__ExpoImportMetaRegistry
7
+ // - <source>
8
+ const CALL_DEPTH = 3;
9
+ function getFileName(offset = 0) {
10
+ const originalStackFormatter = Error.prepareStackTrace;
11
+ const originalStackTraceLimit = Error.stackTraceLimit;
12
+ try {
13
+ Error.stackTraceLimit = offset;
14
+ Error.prepareStackTrace = (_err, stack) => stack[offset - 1]?.getFileName();
15
+ return new Error().stack;
16
+ }
17
+ finally {
18
+ Error.prepareStackTrace = originalStackFormatter;
19
+ Error.stackTraceLimit = originalStackTraceLimit;
20
+ }
21
+ }
22
+ exports.importMetaRegistry = {
23
+ get url() {
24
+ let scriptName = getFileName(CALL_DEPTH);
25
+ if (scriptName?.[0] === '/')
26
+ scriptName = `file://${scriptName}`;
27
+ return scriptName || DEFAULT_SCRIPT_NAME;
28
+ },
29
+ };
30
+ //# sourceMappingURL=importMetaRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"importMetaRegistry.js","sourceRoot":"","sources":["../../../src/utils/importMetaRegistry.ts"],"names":[],"mappings":";;;AAAA,MAAM,mBAAmB,GAAG,mBAAmB,CAAC;AAEhD,0EAA0E;AAC1E,8DAA8D;AAC9D,aAAa;AACb,MAAM,UAAU,GAAG,CAAC,CAAC;AAErB,SAAS,WAAW,CAAC,MAAM,GAAG,CAAC;IAC7B,MAAM,sBAAsB,GAAG,KAAK,CAAC,iBAAiB,CAAC;IACvD,MAAM,uBAAuB,GAAG,KAAK,CAAC,eAAe,CAAC;IACtD,IAAI,CAAC;QACH,KAAK,CAAC,eAAe,GAAG,MAAM,CAAC;QAC/B,KAAK,CAAC,iBAAiB,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;QAC5E,OAAO,IAAI,KAAK,EAAE,CAAC,KAAY,CAAC;IAClC,CAAC;YAAS,CAAC;QACT,KAAK,CAAC,iBAAiB,GAAG,sBAAsB,CAAC;QACjD,KAAK,CAAC,eAAe,GAAG,uBAAuB,CAAC;IAClD,CAAC;AACH,CAAC;AAEY,QAAA,kBAAkB,GAAG;IAChC,IAAI,GAAG;QACL,IAAI,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;QACzC,IAAI,UAAU,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG;YAAE,UAAU,GAAG,UAAU,UAAU,EAAE,CAAC;QACjE,OAAO,UAAU,IAAI,mBAAmB,CAAC;IAC3C,CAAC;CACF,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { Route } from '../manifest';
2
+ export declare function isResponse(input: unknown): input is Response;
3
+ export declare function parseParams(request: Request, route: Route): Record<string, string>;
4
+ export declare function getRedirectRewriteLocation(url: URL, request: Request, route: Route): URL;
5
+ /** Match `[page]` -> `page`
6
+ * @privateRemarks Ported from `expo-router/src/matchers.tsx`
7
+ */
8
+ export declare function matchDynamicName(name: string): string | undefined;
9
+ /** Match `[...page]` -> `page`
10
+ * @privateRemarks Ported from `expo-router/src/matchers.tsx`
11
+ */
12
+ export declare function matchDeepDynamicRouteName(name: string): string | undefined;
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isResponse = isResponse;
4
+ exports.parseParams = parseParams;
5
+ exports.getRedirectRewriteLocation = getRedirectRewriteLocation;
6
+ exports.matchDynamicName = matchDynamicName;
7
+ exports.matchDeepDynamicRouteName = matchDeepDynamicRouteName;
8
+ function isResponse(input) {
9
+ return !!input && typeof input === 'object' && input instanceof Response;
10
+ }
11
+ function parseParams(request, route) {
12
+ const params = {};
13
+ const { pathname } = new URL(request.url);
14
+ const match = route.namedRegex.exec(pathname);
15
+ if (match?.groups) {
16
+ for (const [key, value] of Object.entries(match.groups)) {
17
+ const namedKey = route.routeKeys[key];
18
+ params[namedKey] = value;
19
+ }
20
+ }
21
+ return params;
22
+ }
23
+ function getRedirectRewriteLocation(url, request, route) {
24
+ const originalQueryParams = url.searchParams.entries();
25
+ const params = parseParams(request, route);
26
+ const target = route.page
27
+ .split('/')
28
+ .map((segment) => {
29
+ let match;
30
+ if ((match = matchDynamicName(segment))) {
31
+ const value = params[match];
32
+ delete params[match];
33
+ return typeof value === 'string'
34
+ ? value.split('/')[0] /* If we are redirecting from a catch-all route, we need to remove the extra segments */
35
+ : (value ?? segment);
36
+ }
37
+ else if ((match = matchDeepDynamicRouteName(segment))) {
38
+ const value = params[match];
39
+ delete params[match];
40
+ return value ?? segment;
41
+ }
42
+ else {
43
+ return segment;
44
+ }
45
+ })
46
+ .join('/');
47
+ const targetUrl = new URL(target, url.origin);
48
+ // NOTE: React Navigation doesn't differentiate between a path parameter
49
+ // and a search parameter. We have to preserve leftover search parameters
50
+ // to ensure we don't lose any intentional parameters with special meaning
51
+ for (const key in params)
52
+ targetUrl.searchParams.append(key, params[key]);
53
+ // NOTE(@krystofwoldrich): Query matching is not supported at the moment.
54
+ // Copy original query parameters to the target URL
55
+ for (const [key, value] of originalQueryParams) {
56
+ // NOTE(@krystofwoldrich): Params created from route overwrite existing (might be unexpected to the user)
57
+ if (!targetUrl.searchParams.has(key)) {
58
+ targetUrl.searchParams.append(key, value);
59
+ }
60
+ }
61
+ return targetUrl;
62
+ }
63
+ /** Match `[page]` -> `page`
64
+ * @privateRemarks Ported from `expo-router/src/matchers.tsx`
65
+ */
66
+ function matchDynamicName(name) {
67
+ // Don't match `...` or `[` or `]` inside the brackets
68
+ return name.match(/^\[([^[\](?:\.\.\.)]+?)\]$/)?.[1]; // eslint-disable-line no-useless-escape
69
+ }
70
+ /** Match `[...page]` -> `page`
71
+ * @privateRemarks Ported from `expo-router/src/matchers.tsx`
72
+ */
73
+ function matchDeepDynamicRouteName(name) {
74
+ return name.match(/^\[\.\.\.([^/]+?)\]$/)?.[1];
75
+ }
76
+ //# sourceMappingURL=matchers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matchers.js","sourceRoot":"","sources":["../../../src/utils/matchers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { MiddlewareFunction, MiddlewareSettings } from '../types';
2
+ export interface MiddlewareModule {
3
+ default: MiddlewareFunction;
4
+ unstable_settings?: MiddlewareSettings;
5
+ }
6
+ /**
7
+ * Determines whether middleware should run for a given request based on matcher configuration.
8
+ */
9
+ export declare function shouldRunMiddleware(request: Request, middleware: MiddlewareModule): boolean;
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.shouldRunMiddleware = shouldRunMiddleware;
4
+ const matchers_1 = require("./matchers");
5
+ /**
6
+ * Determines whether middleware should run for a given request based on matcher configuration.
7
+ */
8
+ function shouldRunMiddleware(request, middleware) {
9
+ const matcher = middleware.unstable_settings?.matcher;
10
+ // No matcher means middleware runs on all requests
11
+ if (!matcher) {
12
+ return true;
13
+ }
14
+ const url = new URL(request.url);
15
+ const pathname = url.pathname;
16
+ // Check HTTP methods, if specified
17
+ if (matcher.methods) {
18
+ const methods = matcher.methods.map((method) => method.toUpperCase());
19
+ if (methods.length === 0 || !methods.includes(request.method)) {
20
+ return false;
21
+ }
22
+ }
23
+ // Check path patterns, if specified
24
+ if (matcher.patterns) {
25
+ const patterns = Array.isArray(matcher.patterns) ? matcher.patterns : [matcher.patterns];
26
+ if (patterns.length === 0) {
27
+ return false;
28
+ }
29
+ return patterns.some((pattern) => matchesPattern(pathname, pattern));
30
+ }
31
+ // If neither methods nor patterns are specified, run middleware on all requests
32
+ return true;
33
+ }
34
+ /**
35
+ * Tests if a pathname matches a given pattern. The matching order is as follows:
36
+ *
37
+ * - Exact string
38
+ * - Named parameters (supports `[param]` and `[...param]`)
39
+ * - Regular expression
40
+ */
41
+ function matchesPattern(pathname, pattern) {
42
+ if (typeof pattern === 'string') {
43
+ if (pattern === pathname) {
44
+ return true;
45
+ }
46
+ if (hasNamedParameters(pattern)) {
47
+ return namedParamToRegex(pattern).test(pathname);
48
+ }
49
+ }
50
+ if (pattern instanceof RegExp) {
51
+ return pattern.test(pathname);
52
+ }
53
+ return false;
54
+ }
55
+ /**
56
+ * Check if a pattern contains named parameters like `[postId]` or `[...slug]`
57
+ */
58
+ function hasNamedParameters(pattern) {
59
+ return pattern.split('/').some((segment) => {
60
+ return (0, matchers_1.matchDynamicName)(segment) || (0, matchers_1.matchDeepDynamicRouteName)(segment);
61
+ });
62
+ }
63
+ /**
64
+ * Convert a pattern with named parameters to regex
65
+ */
66
+ function namedParamToRegex(pattern) {
67
+ const normalizedPattern = pattern.replace(/\/$/, '') || '/';
68
+ const segments = normalizedPattern.split('/');
69
+ const regexSegments = segments.map((segment) => {
70
+ if (!segment)
71
+ return '';
72
+ if ((0, matchers_1.matchDeepDynamicRouteName)(segment)) {
73
+ return '.+';
74
+ }
75
+ if ((0, matchers_1.matchDynamicName)(segment)) {
76
+ return '[^/]+';
77
+ }
78
+ return segment.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
79
+ });
80
+ return new RegExp(`^${regexSegments.join('/')}(?:/)?$`);
81
+ }
82
+ //# sourceMappingURL=middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../../src/utils/middleware.ts"],"names":[],"mappings":";;AAWA,kDA8BC;AAxCD,yCAAyE;AAOzE;;GAEG;AACH,SAAgB,mBAAmB,CAAC,OAAgB,EAAE,UAA4B;IAChF,MAAM,OAAO,GAAG,UAAU,CAAC,iBAAiB,EAAE,OAAO,CAAC;IAEtD,mDAAmD;IACnD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;IAE9B,mCAAmC;IACnC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;QACtE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9D,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,oCAAoC;IACpC,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrB,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACzF,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IACvE,CAAC;IAED,gFAAgF;IAChF,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;GAMG;AACH,SAAS,cAAc,CAAC,QAAgB,EAAE,OAA0B;IAClE,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC;YAChC,OAAO,iBAAiB,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAED,IAAI,OAAO,YAAY,MAAM,EAAE,CAAC;QAC9B,OAAO,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,OAAe;IACzC,OAAO,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;QACzC,OAAO,IAAA,2BAAgB,EAAC,OAAO,CAAC,IAAI,IAAA,oCAAyB,EAAC,OAAO,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,OAAe;IACxC,MAAM,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC;IAC5D,MAAM,QAAQ,GAAG,iBAAiB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9C,MAAM,aAAa,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7C,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,CAAC;QAExB,IAAI,IAAA,oCAAyB,EAAC,OAAO,CAAC,EAAE,CAAC;YACvC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,IAAA,2BAAgB,EAAC,OAAO,CAAC,EAAE,CAAC;YAC9B,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,OAAO,OAAO,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,OAAO,IAAI,MAAM,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAC1D,CAAC"}
@@ -0,0 +1,40 @@
1
+ import type { Manifest, MiddlewareInfo, Route } from '../manifest';
2
+ import { MiddlewareModule } from '../utils/middleware';
3
+ /** Internal errors class to indicate that the server has failed
4
+ * @remarks
5
+ * This should be thrown for unexpected errors, so they show up as crashes.
6
+ * Typically malformed project structure, missing manifest, html or other files.
7
+ */
8
+ export declare class ExpoError extends Error {
9
+ constructor(message: string);
10
+ static isExpoError(error: unknown): error is ExpoError;
11
+ }
12
+ type ResponseInitLike = Omit<ResponseInit, 'headers'> & {
13
+ headers: Headers;
14
+ cf?: unknown;
15
+ webSocket?: unknown;
16
+ };
17
+ type CallbackRouteType = 'html' | 'api' | 'notFoundHtml' | 'notAllowedApi';
18
+ type CallbackRoute = (Route & {
19
+ type: CallbackRouteType;
20
+ }) | {
21
+ type: null;
22
+ };
23
+ type BeforeResponseCallback = (responseInit: ResponseInitLike, route: CallbackRoute) => ResponseInitLike;
24
+ export interface RequestHandlerParams {
25
+ getHtml: (request: Request, route: Route) => Promise<string | Response | null>;
26
+ getRoutesManifest: () => Promise<Manifest | null>;
27
+ getApiRoute: (route: Route) => Promise<any>;
28
+ getMiddleware: (route: MiddlewareInfo) => Promise<MiddlewareModule>;
29
+ handleRouteError: (error: Error) => Promise<Response>;
30
+ /** Before handler response 4XX, not before unhandled error */
31
+ beforeErrorResponse?: BeforeResponseCallback;
32
+ /** Before handler responses */
33
+ beforeResponse?: BeforeResponseCallback;
34
+ /** Before handler HTML responses, not before 404 HTML */
35
+ beforeHTMLResponse?: BeforeResponseCallback;
36
+ /** Before handler API responses */
37
+ beforeAPIResponse?: BeforeResponseCallback;
38
+ }
39
+ export declare function createRequestHandler({ getRoutesManifest, getHtml, getApiRoute, handleRouteError, getMiddleware, beforeErrorResponse, beforeResponse, beforeHTMLResponse, beforeAPIResponse, }: RequestHandlerParams): (request: Request) => Promise<Response>;
40
+ export {};