@cedarjs/api-server 5.0.0-canary.13895 → 5.0.0-canary.13897

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/bin.js CHANGED
@@ -388,8 +388,9 @@ var init_lambdaLoader = __esm({
388
388
  );
389
389
  }
390
390
  cedarRouteManifest.push({
391
+ id: routePath,
391
392
  path: routePath,
392
- methods: routeName === "graphql" ? ["GET", "POST", "OPTIONS"] : ["GET", "POST"],
393
+ methods: routeName === "graphql" ? ["GET", "POST", "OPTIONS"] : [],
393
394
  type: routeName === "graphql" ? "graphql" : routeName === "health" ? "health" : routeName.toLowerCase().includes("auth") ? "auth" : "function",
394
395
  entry: fnPath
395
396
  });
package/dist/cjs/bin.js CHANGED
@@ -410,8 +410,9 @@ var init_lambdaLoader = __esm({
410
410
  );
411
411
  }
412
412
  cedarRouteManifest.push({
413
+ id: routePath,
413
414
  path: routePath,
414
- methods: routeName === "graphql" ? ["GET", "POST", "OPTIONS"] : ["GET", "POST"],
415
+ methods: routeName === "graphql" ? ["GET", "POST", "OPTIONS"] : [],
415
416
  type: routeName === "graphql" ? "graphql" : routeName === "health" ? "health" : routeName.toLowerCase().includes("auth") ? "auth" : "function",
416
417
  entry: fnPath
417
418
  });
@@ -97,8 +97,9 @@ const setLambdaFunctions = async (foundFunctions) => {
97
97
  );
98
98
  }
99
99
  cedarRouteManifest.push({
100
+ id: routePath,
100
101
  path: routePath,
101
- methods: routeName === "graphql" ? ["GET", "POST", "OPTIONS"] : ["GET", "POST"],
102
+ methods: routeName === "graphql" ? ["GET", "POST", "OPTIONS"] : [],
102
103
  type: routeName === "graphql" ? "graphql" : routeName === "health" ? "health" : routeName.toLowerCase().includes("auth") ? "auth" : "function",
103
104
  entry: fnPath
104
105
  });
@@ -59,8 +59,9 @@ const setLambdaFunctions = async (foundFunctions) => {
59
59
  );
60
60
  }
61
61
  cedarRouteManifest.push({
62
+ id: routePath,
62
63
  path: routePath,
63
- methods: routeName === "graphql" ? ["GET", "POST", "OPTIONS"] : ["GET", "POST"],
64
+ methods: routeName === "graphql" ? ["GET", "POST", "OPTIONS"] : [],
64
65
  type: routeName === "graphql" ? "graphql" : routeName === "health" ? "health" : routeName.toLowerCase().includes("auth") ? "auth" : "function",
65
66
  entry: fnPath
66
67
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cedarjs/api-server",
3
- "version": "5.0.0-canary.13895+1afe7de6ad",
3
+ "version": "5.0.0-canary.13897+bacad73258",
4
4
  "description": "CedarJS's HTTP server for Serverless Functions",
5
5
  "repository": {
6
6
  "type": "git",
@@ -73,12 +73,6 @@
73
73
  "types": "./dist/cjs/bothCLIConfigHandler.d.ts",
74
74
  "default": "./dist/cjs/bothCLIConfigHandler.js"
75
75
  },
76
- "./udDispatcher": {
77
- "import": {
78
- "types": "./dist/udDispatcher.d.ts",
79
- "default": "./dist/udDispatcher.js"
80
- }
81
- },
82
76
  "./udFetchable": {
83
77
  "import": {
84
78
  "types": "./dist/udFetchable.d.ts",
@@ -135,15 +129,14 @@
135
129
  "test:watch": "vitest watch"
136
130
  },
137
131
  "dependencies": {
138
- "@cedarjs/context": "5.0.0-canary.13895",
139
- "@cedarjs/fastify-web": "5.0.0-canary.13895",
140
- "@cedarjs/internal": "5.0.0-canary.13895",
141
- "@cedarjs/project-config": "5.0.0-canary.13895",
142
- "@cedarjs/web-server": "5.0.0-canary.13895",
132
+ "@cedarjs/context": "5.0.0-canary.13897",
133
+ "@cedarjs/fastify-web": "5.0.0-canary.13897",
134
+ "@cedarjs/internal": "5.0.0-canary.13897",
135
+ "@cedarjs/project-config": "5.0.0-canary.13897",
136
+ "@cedarjs/web-server": "5.0.0-canary.13897",
143
137
  "@fastify/multipart": "9.4.0",
144
138
  "@fastify/url-data": "6.0.3",
145
139
  "@universal-deploy/node": "^0.1.6",
146
- "@universal-deploy/store": "^0.2.1",
147
140
  "ansis": "4.2.0",
148
141
  "chokidar": "3.6.0",
149
142
  "dotenv-defaults": "5.0.2",
@@ -154,14 +147,12 @@
154
147
  "picoquery": "2.5.0",
155
148
  "pretty-bytes": "5.6.0",
156
149
  "pretty-ms": "7.0.1",
157
- "rou3": "^0.8.1",
158
150
  "split2": "4.2.0",
159
- "srvx": "^0.11.9",
160
151
  "termi-link": "1.1.0",
161
152
  "yargs": "17.7.2"
162
153
  },
163
154
  "devDependencies": {
164
- "@cedarjs/framework-tools": "5.0.0-canary.13895",
155
+ "@cedarjs/framework-tools": "5.0.0-canary.13897",
165
156
  "@types/aws-lambda": "8.10.161",
166
157
  "@types/dotenv-defaults": "^5.0.0",
167
158
  "@types/split2": "4.2.3",
@@ -174,7 +165,7 @@
174
165
  "vitest": "3.2.4"
175
166
  },
176
167
  "peerDependencies": {
177
- "@cedarjs/graphql-server": "5.0.0-canary.13895"
168
+ "@cedarjs/graphql-server": "5.0.0-canary.13897"
178
169
  },
179
170
  "peerDependenciesMeta": {
180
171
  "@cedarjs/graphql-server": {
@@ -184,5 +175,5 @@
184
175
  "publishConfig": {
185
176
  "access": "public"
186
177
  },
187
- "gitHead": "1afe7de6ad2bec0d50331b5c9b4fbc8a0a57cc25"
178
+ "gitHead": "bacad7325800127ea2da2f055cdbff4e4b0a5785"
188
179
  }
@@ -1,28 +0,0 @@
1
- import type { EntryMeta } from '@universal-deploy/store';
2
- import type { Fetchable } from './udFetchable.js';
3
- export interface CedarDispatcherOptions {
4
- apiRootPath?: string;
5
- discoverFunctionsGlob?: string | string[];
6
- /**
7
- * Cache-bust token appended to dynamic ESM imports. Use this in dev to
8
- * bypass Node.js's ESM module cache after a rebuild. Production builds
9
- * should omit this.
10
- */
11
- cacheBust?: string | number;
12
- }
13
- export interface CedarDispatcherResult {
14
- fetchable: Fetchable;
15
- registrations: EntryMeta[];
16
- }
17
- /**
18
- * Shared aggregate Cedar API dispatcher used by
19
- * `cedarUniversalDeployPlugin` (via `virtual:cedar-api`).
20
- *
21
- * Discovers Cedar API functions in `api/dist/functions/`, builds a rou3 router
22
- * and a map of route names to Fetchables, then returns a single Fetchable that
23
- * routes incoming Fetch-API requests to the correct per-function handler.
24
- * Also returns the list of `EntryMeta` registrations so callers can forward
25
- * them to `@universal-deploy/store` via `addEntry()`.
26
- */
27
- export declare function buildCedarDispatcher(options?: CedarDispatcherOptions): Promise<CedarDispatcherResult>;
28
- //# sourceMappingURL=udDispatcher.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"udDispatcher.d.ts","sourceRoot":"","sources":["../../src/udDispatcher.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAUxD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAgBjD,MAAM,WAAW,sBAAsB;IACrC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,qBAAqB,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;IACzC;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;CAC5B;AAED,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,SAAS,CAAA;IACpB,aAAa,EAAE,SAAS,EAAE,CAAA;CAC3B;AA6BD;;;;;;;;;GASG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,CAAC,EAAE,sBAAsB,GAC/B,OAAO,CAAC,qBAAqB,CAAC,CAmNhC"}
@@ -1,192 +0,0 @@
1
- "use strict";
2
- var __create = Object.create;
3
- var __defProp = Object.defineProperty;
4
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
- var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
- var __hasOwnProp = Object.prototype.hasOwnProperty;
8
- var __export = (target, all) => {
9
- for (var name in all)
10
- __defProp(target, name, { get: all[name], enumerable: true });
11
- };
12
- var __copyProps = (to, from, except, desc) => {
13
- if (from && typeof from === "object" || typeof from === "function") {
14
- for (let key of __getOwnPropNames(from))
15
- if (!__hasOwnProp.call(to, key) && key !== except)
16
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
- }
18
- return to;
19
- };
20
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
- // If the importer is in node compatibility mode or this is not an ESM
22
- // file that has been converted to a CommonJS file using a Babel-
23
- // compatible transform (i.e. "__esModule" has not been set), then set
24
- // "default" to the CommonJS "module.exports" for node compatibility.
25
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
- mod
27
- ));
28
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
- var udDispatcher_exports = {};
30
- __export(udDispatcher_exports, {
31
- buildCedarDispatcher: () => buildCedarDispatcher
32
- });
33
- module.exports = __toCommonJS(udDispatcher_exports);
34
- var import_node_path = __toESM(require("node:path"), 1);
35
- var import_node_url = require("node:url");
36
- var import_fast_glob = __toESM(require("fast-glob"), 1);
37
- var import_rou3 = require("rou3");
38
- var import_runtime = require("@cedarjs/api/runtime");
39
- var import_store = require("@cedarjs/context/dist/store");
40
- var import_project_config = require("@cedarjs/project-config");
41
- var import_udFetchable = require("./udFetchable.js");
42
- const ALL_HTTP_METHODS = [
43
- "GET",
44
- "HEAD",
45
- "POST",
46
- "PUT",
47
- "DELETE",
48
- "PATCH",
49
- "OPTIONS",
50
- "CONNECT",
51
- "TRACE"
52
- ];
53
- const GRAPHQL_METHODS = ["GET", "POST", "OPTIONS"];
54
- function normalizeApiRootPath(rootPath) {
55
- let normalized = rootPath;
56
- if (!normalized.startsWith("/")) {
57
- normalized = "/" + normalized;
58
- }
59
- if (!normalized.endsWith("/")) {
60
- normalized = normalized + "/";
61
- }
62
- return normalized;
63
- }
64
- async function buildCedarDispatcher(options) {
65
- const normalizedApiRootPath = normalizeApiRootPath(
66
- options?.apiRootPath ?? "/"
67
- );
68
- const discoverFunctionsGlob = options?.discoverFunctionsGlob ?? "dist/functions/**/*.{ts,js}";
69
- const serverFunctions = import_fast_glob.default.sync(discoverFunctionsGlob, {
70
- cwd: (0, import_project_config.getPaths)().api.base,
71
- deep: 2,
72
- absolute: true
73
- });
74
- const graphqlIdx = serverFunctions.findIndex(
75
- (x) => import_node_path.default.basename(x, import_node_path.default.extname(x)) === "graphql"
76
- );
77
- if (graphqlIdx >= 0) {
78
- const [graphqlFn] = serverFunctions.splice(graphqlIdx, 1);
79
- serverFunctions.unshift(graphqlFn);
80
- }
81
- const fetchableMap = /* @__PURE__ */ new Map();
82
- const router = (0, import_rou3.createRouter)();
83
- const registrations = [];
84
- for (const fnPath of serverFunctions) {
85
- const routeName = import_node_path.default.basename(fnPath, import_node_path.default.extname(fnPath));
86
- const routePath = routeName === "graphql" ? "/graphql" : `/${routeName}`;
87
- const importUrl = options?.cacheBust ? `${(0, import_node_url.pathToFileURL)(fnPath).href}?t=${options.cacheBust}` : (0, import_node_url.pathToFileURL)(fnPath).href;
88
- const fnImport = await import(importUrl);
89
- if ("__rw_graphqlOptions" in fnImport && fnImport.__rw_graphqlOptions != null) {
90
- const { createGraphQLYoga } = await import("@cedarjs/graphql-server");
91
- const graphqlOptions = fnImport.__rw_graphqlOptions;
92
- const { yoga } = await createGraphQLYoga(graphqlOptions);
93
- const graphqlFetchable = {
94
- async fetch(request) {
95
- const cedarContext = await (0, import_runtime.buildCedarContext)(request, {
96
- authDecoder: graphqlOptions.authDecoder
97
- });
98
- const event = await (0, import_runtime.requestToLegacyEvent)(request, cedarContext);
99
- return yoga.handle(request, {
100
- request,
101
- cedarContext,
102
- event,
103
- requestContext: void 0
104
- });
105
- }
106
- };
107
- fetchableMap.set(routeName, graphqlFetchable);
108
- registrations.push({
109
- id: routePath,
110
- route: routePath,
111
- method: [...GRAPHQL_METHODS]
112
- });
113
- for (const method of GRAPHQL_METHODS) {
114
- (0, import_rou3.addRoute)(router, method, routePath, routeName);
115
- (0, import_rou3.addRoute)(router, method, `${routePath}/**`, routeName);
116
- }
117
- continue;
118
- }
119
- const cedarHandler = (() => {
120
- if ("handle" in fnImport && typeof fnImport.handle === "function") {
121
- return fnImport.handle;
122
- }
123
- if ("default" in fnImport && fnImport.default != null && "handle" in fnImport.default && typeof fnImport.default.handle === "function") {
124
- return fnImport.default.handle;
125
- }
126
- return void 0;
127
- })();
128
- if (!cedarHandler) {
129
- console.warn(
130
- routeName,
131
- "at",
132
- fnPath,
133
- "does not export a Fetch-native `handle` function and will not be served by the Universal Deploy server. Migrate to `export async function handle(request, ctx)` or use `yarn cedar serve` for legacy Lambda-shaped handler support."
134
- );
135
- continue;
136
- }
137
- const handler = cedarHandler;
138
- fetchableMap.set(routeName, (0, import_udFetchable.createCedarFetchable)(handler));
139
- registrations.push({
140
- id: routePath,
141
- route: routePath
142
- // method omitted → matches all HTTP methods per @universal-deploy/store docs
143
- });
144
- for (const method of ALL_HTTP_METHODS) {
145
- (0, import_rou3.addRoute)(router, method, routePath, routeName);
146
- (0, import_rou3.addRoute)(router, method, `${routePath}/**`, routeName);
147
- }
148
- }
149
- const fetchable = {
150
- fetch(request) {
151
- return (0, import_store.getAsyncStoreInstance)().run(
152
- /* @__PURE__ */ new Map(),
153
- async () => {
154
- const url = new URL(request.url);
155
- let routePathname = url.pathname;
156
- if (normalizedApiRootPath !== "/" && routePathname.startsWith(normalizedApiRootPath)) {
157
- routePathname = routePathname.slice(
158
- normalizedApiRootPath.length - 1
159
- );
160
- }
161
- if (!routePathname.startsWith("/")) {
162
- routePathname = "/" + routePathname;
163
- }
164
- const match = (0, import_rou3.findRoute)(router, request.method, routePathname);
165
- if (!match) {
166
- return new Response("Not Found", { status: 404 });
167
- }
168
- const matchedRouteName = match.data;
169
- const fnFetchable = fetchableMap.get(matchedRouteName);
170
- if (!fnFetchable) {
171
- return new Response("Not Found", { status: 404 });
172
- }
173
- try {
174
- return await fnFetchable.fetch(request);
175
- } catch (err) {
176
- console.error(
177
- "Unhandled error in fetch handler for route",
178
- matchedRouteName,
179
- err
180
- );
181
- return new Response("Internal Server Error", { status: 500 });
182
- }
183
- }
184
- );
185
- }
186
- };
187
- return { fetchable, registrations };
188
- }
189
- // Annotate the CommonJS export names for ESM import in node:
190
- 0 && (module.exports = {
191
- buildCedarDispatcher
192
- });
@@ -1,28 +0,0 @@
1
- import type { EntryMeta } from '@universal-deploy/store';
2
- import type { Fetchable } from './udFetchable.js';
3
- export interface CedarDispatcherOptions {
4
- apiRootPath?: string;
5
- discoverFunctionsGlob?: string | string[];
6
- /**
7
- * Cache-bust token appended to dynamic ESM imports. Use this in dev to
8
- * bypass Node.js's ESM module cache after a rebuild. Production builds
9
- * should omit this.
10
- */
11
- cacheBust?: string | number;
12
- }
13
- export interface CedarDispatcherResult {
14
- fetchable: Fetchable;
15
- registrations: EntryMeta[];
16
- }
17
- /**
18
- * Shared aggregate Cedar API dispatcher used by
19
- * `cedarUniversalDeployPlugin` (via `virtual:cedar-api`).
20
- *
21
- * Discovers Cedar API functions in `api/dist/functions/`, builds a rou3 router
22
- * and a map of route names to Fetchables, then returns a single Fetchable that
23
- * routes incoming Fetch-API requests to the correct per-function handler.
24
- * Also returns the list of `EntryMeta` registrations so callers can forward
25
- * them to `@universal-deploy/store` via `addEntry()`.
26
- */
27
- export declare function buildCedarDispatcher(options?: CedarDispatcherOptions): Promise<CedarDispatcherResult>;
28
- //# sourceMappingURL=udDispatcher.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"udDispatcher.d.ts","sourceRoot":"","sources":["../src/udDispatcher.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAUxD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAgBjD,MAAM,WAAW,sBAAsB;IACrC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,qBAAqB,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;IACzC;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;CAC5B;AAED,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,SAAS,CAAA;IACpB,aAAa,EAAE,SAAS,EAAE,CAAA;CAC3B;AA6BD;;;;;;;;;GASG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,CAAC,EAAE,sBAAsB,GAC/B,OAAO,CAAC,qBAAqB,CAAC,CAmNhC"}
@@ -1,158 +0,0 @@
1
- import path from "node:path";
2
- import { pathToFileURL } from "node:url";
3
- import fg from "fast-glob";
4
- import { addRoute, createRouter, findRoute } from "rou3";
5
- import { buildCedarContext, requestToLegacyEvent } from "@cedarjs/api/runtime";
6
- import { getAsyncStoreInstance } from "@cedarjs/context/dist/store";
7
- import { getPaths } from "@cedarjs/project-config";
8
- import { createCedarFetchable } from "./udFetchable.js";
9
- const ALL_HTTP_METHODS = [
10
- "GET",
11
- "HEAD",
12
- "POST",
13
- "PUT",
14
- "DELETE",
15
- "PATCH",
16
- "OPTIONS",
17
- "CONNECT",
18
- "TRACE"
19
- ];
20
- const GRAPHQL_METHODS = ["GET", "POST", "OPTIONS"];
21
- function normalizeApiRootPath(rootPath) {
22
- let normalized = rootPath;
23
- if (!normalized.startsWith("/")) {
24
- normalized = "/" + normalized;
25
- }
26
- if (!normalized.endsWith("/")) {
27
- normalized = normalized + "/";
28
- }
29
- return normalized;
30
- }
31
- async function buildCedarDispatcher(options) {
32
- const normalizedApiRootPath = normalizeApiRootPath(
33
- options?.apiRootPath ?? "/"
34
- );
35
- const discoverFunctionsGlob = options?.discoverFunctionsGlob ?? "dist/functions/**/*.{ts,js}";
36
- const serverFunctions = fg.sync(discoverFunctionsGlob, {
37
- cwd: getPaths().api.base,
38
- deep: 2,
39
- absolute: true
40
- });
41
- const graphqlIdx = serverFunctions.findIndex(
42
- (x) => path.basename(x, path.extname(x)) === "graphql"
43
- );
44
- if (graphqlIdx >= 0) {
45
- const [graphqlFn] = serverFunctions.splice(graphqlIdx, 1);
46
- serverFunctions.unshift(graphqlFn);
47
- }
48
- const fetchableMap = /* @__PURE__ */ new Map();
49
- const router = createRouter();
50
- const registrations = [];
51
- for (const fnPath of serverFunctions) {
52
- const routeName = path.basename(fnPath, path.extname(fnPath));
53
- const routePath = routeName === "graphql" ? "/graphql" : `/${routeName}`;
54
- const importUrl = options?.cacheBust ? `${pathToFileURL(fnPath).href}?t=${options.cacheBust}` : pathToFileURL(fnPath).href;
55
- const fnImport = await import(importUrl);
56
- if ("__rw_graphqlOptions" in fnImport && fnImport.__rw_graphqlOptions != null) {
57
- const { createGraphQLYoga } = await import("@cedarjs/graphql-server");
58
- const graphqlOptions = fnImport.__rw_graphqlOptions;
59
- const { yoga } = await createGraphQLYoga(graphqlOptions);
60
- const graphqlFetchable = {
61
- async fetch(request) {
62
- const cedarContext = await buildCedarContext(request, {
63
- authDecoder: graphqlOptions.authDecoder
64
- });
65
- const event = await requestToLegacyEvent(request, cedarContext);
66
- return yoga.handle(request, {
67
- request,
68
- cedarContext,
69
- event,
70
- requestContext: void 0
71
- });
72
- }
73
- };
74
- fetchableMap.set(routeName, graphqlFetchable);
75
- registrations.push({
76
- id: routePath,
77
- route: routePath,
78
- method: [...GRAPHQL_METHODS]
79
- });
80
- for (const method of GRAPHQL_METHODS) {
81
- addRoute(router, method, routePath, routeName);
82
- addRoute(router, method, `${routePath}/**`, routeName);
83
- }
84
- continue;
85
- }
86
- const cedarHandler = (() => {
87
- if ("handle" in fnImport && typeof fnImport.handle === "function") {
88
- return fnImport.handle;
89
- }
90
- if ("default" in fnImport && fnImport.default != null && "handle" in fnImport.default && typeof fnImport.default.handle === "function") {
91
- return fnImport.default.handle;
92
- }
93
- return void 0;
94
- })();
95
- if (!cedarHandler) {
96
- console.warn(
97
- routeName,
98
- "at",
99
- fnPath,
100
- "does not export a Fetch-native `handle` function and will not be served by the Universal Deploy server. Migrate to `export async function handle(request, ctx)` or use `yarn cedar serve` for legacy Lambda-shaped handler support."
101
- );
102
- continue;
103
- }
104
- const handler = cedarHandler;
105
- fetchableMap.set(routeName, createCedarFetchable(handler));
106
- registrations.push({
107
- id: routePath,
108
- route: routePath
109
- // method omitted → matches all HTTP methods per @universal-deploy/store docs
110
- });
111
- for (const method of ALL_HTTP_METHODS) {
112
- addRoute(router, method, routePath, routeName);
113
- addRoute(router, method, `${routePath}/**`, routeName);
114
- }
115
- }
116
- const fetchable = {
117
- fetch(request) {
118
- return getAsyncStoreInstance().run(
119
- /* @__PURE__ */ new Map(),
120
- async () => {
121
- const url = new URL(request.url);
122
- let routePathname = url.pathname;
123
- if (normalizedApiRootPath !== "/" && routePathname.startsWith(normalizedApiRootPath)) {
124
- routePathname = routePathname.slice(
125
- normalizedApiRootPath.length - 1
126
- );
127
- }
128
- if (!routePathname.startsWith("/")) {
129
- routePathname = "/" + routePathname;
130
- }
131
- const match = findRoute(router, request.method, routePathname);
132
- if (!match) {
133
- return new Response("Not Found", { status: 404 });
134
- }
135
- const matchedRouteName = match.data;
136
- const fnFetchable = fetchableMap.get(matchedRouteName);
137
- if (!fnFetchable) {
138
- return new Response("Not Found", { status: 404 });
139
- }
140
- try {
141
- return await fnFetchable.fetch(request);
142
- } catch (err) {
143
- console.error(
144
- "Unhandled error in fetch handler for route",
145
- matchedRouteName,
146
- err
147
- );
148
- return new Response("Internal Server Error", { status: 500 });
149
- }
150
- }
151
- );
152
- }
153
- };
154
- return { fetchable, registrations };
155
- }
156
- export {
157
- buildCedarDispatcher
158
- };