velocious 1.0.692 → 1.0.693

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 (93) hide show
  1. package/README.md +5 -0
  2. package/build/background-jobs/scheduled-enqueue-bound.js +18 -0
  3. package/build/background-jobs/scheduled-enqueue-timeout-error.js +25 -0
  4. package/build/background-jobs/scheduler.js +121 -4
  5. package/build/cli/commands/mcp.js +7 -0
  6. package/build/cli/index.js +1 -1
  7. package/build/configuration-types.js +2 -0
  8. package/build/configuration.js +16 -1
  9. package/build/database/advisory-lock-bound.js +16 -0
  10. package/build/database/drivers/base.js +23 -2
  11. package/build/database/drivers/pgsql/index.js +27 -4
  12. package/build/environment-handlers/base.js +9 -0
  13. package/build/environment-handlers/node/cli/commands/mcp.js +87 -0
  14. package/build/environment-handlers/node.js +10 -0
  15. package/build/mcp/dispatcher.js +271 -0
  16. package/build/mcp/json-rpc-server.js +167 -0
  17. package/build/mcp/manifest-tools.js +310 -0
  18. package/build/routes/catch-all-route.js +58 -0
  19. package/build/routes/resolver.js +21 -8
  20. package/build/routes/root-route.js +26 -1
  21. package/build/src/background-jobs/scheduled-enqueue-bound.d.ts +15 -0
  22. package/build/src/background-jobs/scheduled-enqueue-bound.d.ts.map +1 -0
  23. package/build/src/background-jobs/scheduled-enqueue-bound.js +17 -0
  24. package/build/src/background-jobs/scheduled-enqueue-timeout-error.d.ts +24 -0
  25. package/build/src/background-jobs/scheduled-enqueue-timeout-error.d.ts.map +1 -0
  26. package/build/src/background-jobs/scheduled-enqueue-timeout-error.js +23 -0
  27. package/build/src/background-jobs/scheduler.d.ts +40 -0
  28. package/build/src/background-jobs/scheduler.d.ts.map +1 -1
  29. package/build/src/background-jobs/scheduler.js +111 -5
  30. package/build/src/cli/commands/mcp.d.ts +5 -0
  31. package/build/src/cli/commands/mcp.d.ts.map +1 -0
  32. package/build/src/cli/commands/mcp.js +7 -0
  33. package/build/src/cli/index.js +2 -2
  34. package/build/src/configuration-types.d.ts +10 -0
  35. package/build/src/configuration-types.d.ts.map +1 -1
  36. package/build/src/configuration-types.js +3 -1
  37. package/build/src/configuration.d.ts.map +1 -1
  38. package/build/src/configuration.js +13 -2
  39. package/build/src/database/advisory-lock-bound.d.ts +15 -0
  40. package/build/src/database/advisory-lock-bound.d.ts.map +1 -0
  41. package/build/src/database/advisory-lock-bound.js +16 -0
  42. package/build/src/database/drivers/base.d.ts +13 -1
  43. package/build/src/database/drivers/base.d.ts.map +1 -1
  44. package/build/src/database/drivers/base.js +23 -3
  45. package/build/src/database/drivers/pgsql/index.d.ts +15 -3
  46. package/build/src/database/drivers/pgsql/index.d.ts.map +1 -1
  47. package/build/src/database/drivers/pgsql/index.js +23 -5
  48. package/build/src/environment-handlers/base.d.ts +6 -0
  49. package/build/src/environment-handlers/base.d.ts.map +1 -1
  50. package/build/src/environment-handlers/base.js +9 -1
  51. package/build/src/environment-handlers/node/cli/commands/mcp.d.ts +19 -0
  52. package/build/src/environment-handlers/node/cli/commands/mcp.d.ts.map +1 -0
  53. package/build/src/environment-handlers/node/cli/commands/mcp.js +70 -0
  54. package/build/src/environment-handlers/node.d.ts +6 -0
  55. package/build/src/environment-handlers/node.d.ts.map +1 -1
  56. package/build/src/environment-handlers/node.js +10 -1
  57. package/build/src/mcp/dispatcher.d.ts +133 -0
  58. package/build/src/mcp/dispatcher.d.ts.map +1 -0
  59. package/build/src/mcp/dispatcher.js +232 -0
  60. package/build/src/mcp/json-rpc-server.d.ts +47 -0
  61. package/build/src/mcp/json-rpc-server.d.ts.map +1 -0
  62. package/build/src/mcp/json-rpc-server.js +142 -0
  63. package/build/src/mcp/manifest-tools.d.ts +76 -0
  64. package/build/src/mcp/manifest-tools.d.ts.map +1 -0
  65. package/build/src/mcp/manifest-tools.js +273 -0
  66. package/build/src/routes/catch-all-route.d.ts +48 -0
  67. package/build/src/routes/catch-all-route.d.ts.map +1 -0
  68. package/build/src/routes/catch-all-route.js +50 -0
  69. package/build/src/routes/resolver.d.ts.map +1 -1
  70. package/build/src/routes/resolver.js +23 -9
  71. package/build/src/routes/root-route.d.ts +15 -1
  72. package/build/src/routes/root-route.d.ts.map +1 -1
  73. package/build/src/routes/root-route.js +24 -2
  74. package/package.json +1 -1
  75. package/src/background-jobs/scheduled-enqueue-bound.js +18 -0
  76. package/src/background-jobs/scheduled-enqueue-timeout-error.js +25 -0
  77. package/src/background-jobs/scheduler.js +121 -4
  78. package/src/cli/commands/mcp.js +7 -0
  79. package/src/cli/index.js +1 -1
  80. package/src/configuration-types.js +2 -0
  81. package/src/configuration.js +16 -1
  82. package/src/database/advisory-lock-bound.js +16 -0
  83. package/src/database/drivers/base.js +23 -2
  84. package/src/database/drivers/pgsql/index.js +27 -4
  85. package/src/environment-handlers/base.js +9 -0
  86. package/src/environment-handlers/node/cli/commands/mcp.js +87 -0
  87. package/src/environment-handlers/node.js +10 -0
  88. package/src/mcp/dispatcher.js +271 -0
  89. package/src/mcp/json-rpc-server.js +167 -0
  90. package/src/mcp/manifest-tools.js +310 -0
  91. package/src/routes/catch-all-route.js +58 -0
  92. package/src/routes/resolver.js +21 -8
  93. package/src/routes/root-route.js +26 -1
@@ -0,0 +1,76 @@
1
+ export type ManifestCommandEntry = {
2
+ /**
3
+ * - Declared typed command arguments.
4
+ */
5
+ args?: Array<{
6
+ name: string;
7
+ type: string;
8
+ }>;
9
+ /**
10
+ * - Command method name.
11
+ */
12
+ methodName: string;
13
+ /**
14
+ * - Manifest command path (member paths carry `<id>`).
15
+ */
16
+ path?: string;
17
+ /**
18
+ * - Declared JSDoc return type.
19
+ */
20
+ returnType?: string | null;
21
+ /**
22
+ * - Command scope.
23
+ */
24
+ scope: "collection" | "member";
25
+ };
26
+ export type ManifestResourceEntry = {
27
+ /**
28
+ * - Scope-keyed custom command entries.
29
+ */
30
+ commands?: Record<string, ManifestCommandEntry[]>;
31
+ /**
32
+ * - Scope-keyed built-in command maps (methodName → slug).
33
+ */
34
+ builtInCommands?: Record<string, Record<string, string>>;
35
+ /**
36
+ * - Backend model name.
37
+ */
38
+ modelName: string;
39
+ /**
40
+ * - Primary key attribute name(s).
41
+ */
42
+ primaryKey?: string | string[];
43
+ };
44
+ export type ApiManifest = Record<string, unknown> & {
45
+ formatVersion?: number;
46
+ resources?: Record<string, unknown>;
47
+ };
48
+ /**
49
+ * Generates MCP tool definitions from a frontend-model API manifest.
50
+ * Every built-in and custom command of every manifest resource becomes one tool;
51
+ * one meta tool exposes the raw manifest for discovery.
52
+ * @param {ApiManifest} manifest - Manifest from `configuration.getApiManifest()`.
53
+ * @returns {Record<string, unknown>[]} - MCP `tools/list` tool definitions.
54
+ */
55
+ export declare function generateMcpTools(manifest: ApiManifest): Record<string, unknown>[];
56
+ /**
57
+ * Parses one MCP tool name back into its manifest model key and command method name.
58
+ * @param {object} args - Arguments.
59
+ * @param {string} args.toolName - MCP tool name.
60
+ * @param {ApiManifest} args.manifest - Manifest from `configuration.getApiManifest()`.
61
+ * @returns {{commandName: string, modelKey: string, scope: "collection" | "member"} | null} - Command identity, or null when unknown.
62
+ */
63
+ export declare function parseMcpToolName({ manifest, toolName }: {
64
+ toolName: string;
65
+ manifest: ApiManifest;
66
+ }): {
67
+ commandName: string;
68
+ modelKey: string;
69
+ scope: "collection" | "member";
70
+ } | null;
71
+ /**
72
+ * Runs the metaToolName helper.
73
+ * @returns {string} - The meta tool name.
74
+ */
75
+ export declare function metaToolName(): string;
76
+ //# sourceMappingURL=manifest-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest-tools.d.ts","sourceRoot":"","sources":["../../../src/mcp/manifest-tools.js"],"names":[],"mappings":"AAGG,YAAkB,oBAAoB,GACtC;;;;IAAiD,IAAI,AAArD,CACA,EADW,KAAK,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAC,CAAC,CAC9C;;;;IAAmB,UAAU,EAAlB,MAAM,CACjB;;;;IAAoB,IAAI,AAAxB,CACA,EADW,MAAM,CACjB;;;;IAA2B,UAAU,AAArC,CACA,EADW,MAAM,GAAG,IAAI,CACxB;;;;IAAoC,KAAK,EAA9B,YAAY,GAAG,QAAQ,CACpC;CAAA,CAAA;AAGE,YAAkB,qBAAqB,GACvC;;;;IAAoD,QAAQ,AAA5D,CACA,EADW,MAAM,CAAC,MAAM,EAAE,oBAAoB,EAAE,CAAC,CACjD;;;;IAAoD,eAAe,AAAnE,CACA,EADW,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CACjD;;;;IAAmB,SAAS,EAAjB,MAAM,CACjB;;;;IAA+B,UAAU,AAAzC,CACF,EADa,MAAM,GAAG,MAAM,EAAE,CAC9B;CAAA,CAAA;AAGE,YAAmG,WAAW,GAApG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAC,CAAa;AA4KjH;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAH9B,WAG8B,GAF5B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAqCrC;AAsCD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,EAAC,QAAQ,EAAE,QAAQ,EAAC,EAJlD;IAAqB,QAAQ,EAArB,MAAM,CACd;IAA0B,QAAQ,EAA1B,WAAW,CACnB;CAEkD,GAFxC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,YAAY,GAAG,QAAQ,CAAA;CAAC,GAAG,IAAI,CA0B1F;AAED;;;GAGG;AACH,wBAAgB,YAAY,IAFf,MAAM,CAEqC"}
@@ -0,0 +1,273 @@
1
+ // @ts-check
2
+ /**
3
+ * @typedef {object} ManifestCommandEntry
4
+ * @property {Array<{name: string, type: string}>} [args] - Declared typed command arguments.
5
+ * @property {string} methodName - Command method name.
6
+ * @property {string} [path] - Manifest command path (member paths carry `<id>`).
7
+ * @property {string | null} [returnType] - Declared JSDoc return type.
8
+ * @property {"collection" | "member"} scope - Command scope.
9
+ */
10
+ /**
11
+ * @typedef {object} ManifestResourceEntry
12
+ * @property {Record<string, ManifestCommandEntry[]>} [commands] - Scope-keyed custom command entries.
13
+ * @property {Record<string, Record<string, string>>} [builtInCommands] - Scope-keyed built-in command maps (methodName → slug).
14
+ * @property {string} modelName - Backend model name.
15
+ * @property {string | string[]} [primaryKey] - Primary key attribute name(s).
16
+ */
17
+ /**
18
+ * @typedef {Record<string, unknown> & {formatVersion?: number, resources?: Record<string, unknown>}} ApiManifest
19
+ */
20
+ import inflection from "inflection";
21
+ const MCP_TOOL_NAME_PATTERN = /^[a-z0-9_]+$/;
22
+ /** @type {Record<string, string>} */
23
+ const BUILT_IN_COMMAND_DESCRIPTIONS = {
24
+ attach: "Attach a file attachment to one record.",
25
+ attachmentList: "List the attachments of one record.",
26
+ create: "Create one record with `attributes` (and optional `nestedAttributes`).",
27
+ destroy: "Destroy one record by primary key `id`.",
28
+ download: "Download one attachment of one record.",
29
+ find: "Find one record by primary key `id`.",
30
+ index: "List records with optional `where`, `searches`, `sort`, `limit`, `offset`, `page`, `perPage`, `preload`, `select`, `count`, `pluck`, `distinct`, `group`, `joins`, and `queryData`.",
31
+ update: "Update one record by primary key `id` with `attributes` (and optional `nestedAttributes`).",
32
+ url: "Resolve the download URL of one attachment of one record."
33
+ };
34
+ const META_TOOL_NAME = "frontend_model_api_manifest";
35
+ const META_TOOL_DESCRIPTION = "Return the full frontend-model API manifest (all resources, attributes, abilities, and commands) so callers can discover the available model commands.";
36
+ /**
37
+ * Maps one JSDoc type string from command metadata to a JSON Schema fragment.
38
+ * @param {string} type - JSDoc type string (for example `string`, `number`, `{id: number}`).
39
+ * @returns {{items?: {type: string}, type: string}} - JSON Schema type fragment.
40
+ */
41
+ function jsonSchemaTypeForJSDocType(type) {
42
+ const normalizedType = type.trim();
43
+ if (normalizedType === "number" || normalizedType === "integer")
44
+ return { type: "number" };
45
+ if (normalizedType === "boolean")
46
+ return { type: "boolean" };
47
+ if (normalizedType.startsWith("Array<") || normalizedType.endsWith("[]"))
48
+ return { items: { type: "string" }, type: "array" };
49
+ return { type: "string" };
50
+ }
51
+ /**
52
+ * Builds the MCP tool name for one model command.
53
+ * @param {object} args - Arguments.
54
+ * @param {string} args.modelKey - Manifest resource key (configured model name).
55
+ * @param {string} args.commandName - Command method name.
56
+ * @param {"collection" | "member"} args.scope - Command scope.
57
+ * @returns {string} - MCP tool name.
58
+ */
59
+ function mcpToolName({ commandName, modelKey, scope }) {
60
+ const modelPart = inflection.underscore(modelKey).toLowerCase();
61
+ const commandPart = inflection.underscore(commandName).toLowerCase();
62
+ const scopePart = scope === "member" ? "_by_id" : "";
63
+ return `${modelPart}_${commandPart}${scopePart}`;
64
+ }
65
+ /**
66
+ * Builds the primary key input properties for one manifest resource.
67
+ * @param {string | string[] | undefined} primaryKey - Resource primary key attribute name(s).
68
+ * @returns {Record<string, {description: string, type: string}>} - Primary key JSON Schema properties.
69
+ */
70
+ function primaryKeyProperties(primaryKey) {
71
+ const keyAttributes = Array.isArray(primaryKey) ? primaryKey : [primaryKey || "id"];
72
+ /** @type {Record<string, {description: string, type: string}>} */
73
+ const properties = {};
74
+ for (const keyAttribute of keyAttributes) {
75
+ properties[keyAttribute] = { description: `Primary key attribute \`${keyAttribute}\` of the record.`, type: "string" };
76
+ }
77
+ return properties;
78
+ }
79
+ /**
80
+ * Builds the fixed input schema for one built-in command.
81
+ * @param {object} args - Arguments.
82
+ * @param {string} args.commandName - Built-in command name.
83
+ * @param {string | string[] | undefined} args.primaryKey - Resource primary key attribute name(s).
84
+ * @returns {Record<string, unknown>} - JSON Schema object for the tool input.
85
+ */
86
+ function builtInCommandInputSchema({ commandName, primaryKey }) {
87
+ if (commandName === "index") {
88
+ return {
89
+ additionalProperties: false,
90
+ properties: {
91
+ count: { description: "Return only the count of matching records.", type: "boolean" },
92
+ distinct: { description: "Apply DISTINCT to the index query.", type: "boolean" },
93
+ group: { description: "Group the index query by attribute names or relationship-path descriptors.", type: "object" },
94
+ joins: { description: "Relationship-path join descriptors.", type: "object" },
95
+ limit: { description: "Maximum number of records to return.", type: "number" },
96
+ offset: { description: "Number of records to skip.", type: "number" },
97
+ page: { description: "1-based page number (combine with `perPage`).", type: "number" },
98
+ perPage: { description: "Records per page.", type: "number" },
99
+ pluck: { description: "Attribute names or relationship-path descriptors to pluck instead of full records.", type: "array" },
100
+ preload: { description: "Relationship preload descriptors.", type: "object" },
101
+ queryData: { description: "Structured query-data descriptor.", type: "object" },
102
+ searches: { description: "Search descriptors (path/column/operator/value).", type: "array" },
103
+ select: { description: "Selected attribute names per model.", type: "object" },
104
+ selectsExtra: { description: "Extra selected attributes.", type: "object" },
105
+ sort: { description: "Sort definitions (column or relationship-path descriptors).", type: "array" },
106
+ where: { description: "Attribute filter hash.", type: "object" },
107
+ withCount: { description: "Include the total count alongside records.", type: "boolean" }
108
+ },
109
+ type: "object"
110
+ };
111
+ }
112
+ if (commandName === "create") {
113
+ return {
114
+ additionalProperties: false,
115
+ properties: {
116
+ attributes: { description: "Writable attribute values for the new record.", type: "object" },
117
+ nestedAttributes: { description: "Nested relationship attribute payloads.", type: "object" }
118
+ },
119
+ required: ["attributes"],
120
+ type: "object"
121
+ };
122
+ }
123
+ if (commandName === "update") {
124
+ const idProperties = primaryKeyProperties(primaryKey);
125
+ return {
126
+ additionalProperties: false,
127
+ properties: {
128
+ attributes: { description: "Writable attribute values to apply.", type: "object" },
129
+ ...idProperties,
130
+ nestedAttributes: { description: "Nested relationship attribute payloads.", type: "object" }
131
+ },
132
+ required: [...Object.keys(idProperties), "attributes"],
133
+ type: "object"
134
+ };
135
+ }
136
+ // find / destroy / attach / download / url / attachmentList are id-addressed
137
+ const idProperties = primaryKeyProperties(primaryKey);
138
+ return {
139
+ additionalProperties: false,
140
+ properties: { ...idProperties },
141
+ required: [...Object.keys(idProperties)],
142
+ type: "object"
143
+ };
144
+ }
145
+ /**
146
+ * Builds the input schema for one custom command from its manifest argument metadata.
147
+ * @param {object} args - Arguments.
148
+ * @param {ManifestCommandEntry} args.entry - Manifest command entry.
149
+ * @param {string | string[] | undefined} args.primaryKey - Resource primary key attribute name(s).
150
+ * @returns {Record<string, unknown>} - JSON Schema object for the tool input.
151
+ */
152
+ function customCommandInputSchema({ entry, primaryKey }) {
153
+ const commandArgs = entry.args || [];
154
+ /** @type {Record<string, {description?: string, items?: {items?: {type: string}, type: string}, type: string}>} */
155
+ const properties = {};
156
+ for (const commandArg of commandArgs) {
157
+ properties[commandArg.name] = jsonSchemaTypeForJSDocType(commandArg.type);
158
+ }
159
+ if (entry.scope === "member") {
160
+ for (const [keyAttribute, keySchema] of Object.entries(primaryKeyProperties(primaryKey))) {
161
+ if (!properties[keyAttribute])
162
+ properties[keyAttribute] = keySchema;
163
+ }
164
+ }
165
+ return {
166
+ additionalProperties: true,
167
+ properties,
168
+ type: "object"
169
+ };
170
+ }
171
+ /**
172
+ * Generates MCP tool definitions from a frontend-model API manifest.
173
+ * Every built-in and custom command of every manifest resource becomes one tool;
174
+ * one meta tool exposes the raw manifest for discovery.
175
+ * @param {ApiManifest} manifest - Manifest from `configuration.getApiManifest()`.
176
+ * @returns {Record<string, unknown>[]} - MCP `tools/list` tool definitions.
177
+ */
178
+ export function generateMcpTools(manifest) {
179
+ const resources = manifest.resources;
180
+ const tools = [];
181
+ if (!resources)
182
+ return [buildMetaTool()];
183
+ for (const modelKey of Object.keys(resources).sort()) {
184
+ const resource = /** @type {ManifestResourceEntry} */ (resources[modelKey]);
185
+ const commands = resource.commands || {};
186
+ const builtInCommands = resource.builtInCommands || {};
187
+ for (const scope of /** @type {Array<"collection" | "member">} */ (["collection", "member"])) {
188
+ for (const entry of scopeCommandEntries({ builtInCommands, commands, scope })) {
189
+ const commandName = entry.methodName;
190
+ const isBuiltIn = entry.isBuiltIn;
191
+ const name = mcpToolName({ commandName, modelKey, scope });
192
+ if (!MCP_TOOL_NAME_PATTERN.test(name))
193
+ continue;
194
+ tools.push({
195
+ description: isBuiltIn
196
+ ? `${BUILT_IN_COMMAND_DESCRIPTIONS[commandName] || `Run the built-in \`${commandName}\` command on \`${resource.modelName}\`.`} Model: \`${resource.modelName}\`.`
197
+ : `Custom command \`${commandName}\` on model \`${resource.modelName}\`${entry.returnType ? ` (returns ${entry.returnType})` : ""}.`,
198
+ inputSchema: isBuiltIn
199
+ ? builtInCommandInputSchema({ commandName, primaryKey: resource.primaryKey })
200
+ : customCommandInputSchema({ entry, primaryKey: resource.primaryKey }),
201
+ name
202
+ });
203
+ }
204
+ }
205
+ }
206
+ tools.push(buildMetaTool());
207
+ return tools;
208
+ }
209
+ /**
210
+ * Merges the manifest's built-in command names and custom command entries for
211
+ * one scope into a single deterministic command-entry list.
212
+ * @param {object} args - Arguments.
213
+ * @param {Record<string, Record<string, string>>} args.builtInCommands - Scope-keyed built-in command maps.
214
+ * @param {Record<string, ManifestCommandEntry[]>} args.commands - Scope-keyed custom command entries.
215
+ * @param {"collection" | "member"} args.scope - Command scope.
216
+ * @returns {Array<ManifestCommandEntry & {isBuiltIn: boolean}>} - Combined command entries.
217
+ */
218
+ function scopeCommandEntries({ builtInCommands, commands, scope }) {
219
+ /** @type {Array<ManifestCommandEntry & {isBuiltIn: boolean}>} */
220
+ const entries = [];
221
+ for (const commandName of Object.keys(builtInCommands[scope] || {})) {
222
+ entries.push({ isBuiltIn: true, methodName: commandName, scope });
223
+ }
224
+ for (const entry of commands[scope] || []) {
225
+ entries.push({ ...entry, isBuiltIn: false });
226
+ }
227
+ return entries.sort((a, b) => a.methodName.localeCompare(b.methodName));
228
+ }
229
+ /**
230
+ * Builds the manifest discovery meta tool.
231
+ * @returns {Record<string, unknown>} - MCP tool definition.
232
+ */
233
+ function buildMetaTool() {
234
+ return {
235
+ description: META_TOOL_DESCRIPTION,
236
+ inputSchema: { additionalProperties: false, properties: {}, type: "object" },
237
+ name: META_TOOL_NAME
238
+ };
239
+ }
240
+ /**
241
+ * Parses one MCP tool name back into its manifest model key and command method name.
242
+ * @param {object} args - Arguments.
243
+ * @param {string} args.toolName - MCP tool name.
244
+ * @param {ApiManifest} args.manifest - Manifest from `configuration.getApiManifest()`.
245
+ * @returns {{commandName: string, modelKey: string, scope: "collection" | "member"} | null} - Command identity, or null when unknown.
246
+ */
247
+ export function parseMcpToolName({ manifest, toolName }) {
248
+ if (toolName === META_TOOL_NAME)
249
+ return null;
250
+ const resources = manifest.resources;
251
+ if (!resources)
252
+ return null;
253
+ for (const modelKey of Object.keys(resources)) {
254
+ const resource = /** @type {ManifestResourceEntry} */ (resources[modelKey]);
255
+ const commands = resource.commands || {};
256
+ const builtInCommands = resource.builtInCommands || {};
257
+ for (const scope of /** @type {Array<"collection" | "member">} */ (["collection", "member"])) {
258
+ const commandNames = [...Object.keys(builtInCommands[scope] || {}), ...(commands[scope] || []).map((entry) => entry.methodName)];
259
+ for (const commandName of commandNames) {
260
+ if (mcpToolName({ commandName, modelKey, scope }) === toolName) {
261
+ return { commandName, modelKey, scope };
262
+ }
263
+ }
264
+ }
265
+ }
266
+ return null;
267
+ }
268
+ /**
269
+ * Runs the metaToolName helper.
270
+ * @returns {string} - The meta tool name.
271
+ */
272
+ export function metaToolName() { return META_TOOL_NAME; }
273
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFuaWZlc3QtdG9vbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbWNwL21hbmlmZXN0LXRvb2xzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWjs7Ozs7OztHQU9HO0FBRUg7Ozs7OztHQU1HO0FBRUg7O0dBRUc7QUFFSCxPQUFPLFVBQVUsTUFBTSxZQUFZLENBQUE7QUFFbkMsTUFBTSxxQkFBcUIsR0FBRyxjQUFjLENBQUE7QUFFNUMscUNBQXFDO0FBQ3JDLE1BQU0sNkJBQTZCLEdBQUc7SUFDcEMsTUFBTSxFQUFFLHlDQUF5QztJQUNqRCxjQUFjLEVBQUUscUNBQXFDO0lBQ3JELE1BQU0sRUFBRSx3RUFBd0U7SUFDaEYsT0FBTyxFQUFFLHlDQUF5QztJQUNsRCxRQUFRLEVBQUUsd0NBQXdDO0lBQ2xELElBQUksRUFBRSxzQ0FBc0M7SUFDNUMsS0FBSyxFQUFFLHFMQUFxTDtJQUM1TCxNQUFNLEVBQUUsNEZBQTRGO0lBQ3BHLEdBQUcsRUFBRSwyREFBMkQ7Q0FDakUsQ0FBQTtBQUVELE1BQU0sY0FBYyxHQUFHLDZCQUE2QixDQUFBO0FBQ3BELE1BQU0scUJBQXFCLEdBQUcsd0pBQXdKLENBQUE7QUFFdEw7Ozs7R0FJRztBQUNILFNBQVMsMEJBQTBCLENBQUMsSUFBSTtJQUN0QyxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUE7SUFFbEMsSUFBSSxjQUFjLEtBQUssUUFBUSxJQUFJLGNBQWMsS0FBSyxTQUFTO1FBQUUsT0FBTyxFQUFDLElBQUksRUFBRSxRQUFRLEVBQUMsQ0FBQTtJQUN4RixJQUFJLGNBQWMsS0FBSyxTQUFTO1FBQUUsT0FBTyxFQUFDLElBQUksRUFBRSxTQUFTLEVBQUMsQ0FBQTtJQUMxRCxJQUFJLGNBQWMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksY0FBYyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFBRSxPQUFPLEVBQUMsS0FBSyxF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UUFFdEQsS0FBSyxNQUFNLEtBQUssSUFBSSw2Q0FBNkMsQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUM3RixNQUFNLFlBQVksR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFBO1lBRWhJLEtBQUssTUFBTSxXQUFXLElBQUksWUFBWSxFQUFFLENBQUM7Z0JBQ3ZDLElBQUksV0FBVyxDQUFDLEVBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUMsQ0FBQyxLQUFLLFFBQVEsRUFBRSxDQUFDO29CQUM3RCxPQUFPLEVBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUMsQ0FBQTtnQkFDdkMsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFBO0FBQ2IsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSxZQUFZLEtBQUssT0FBTyxjQUFjLENBQUEsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gTWFuaWZlc3RDb21tYW5kRW50cnlcbiAqIEBwcm9wZXJ0eSB7QXJyYXk8e25hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nfT59IFthcmdzXSAtIERlY2xhcmVkIHR5cGVkIGNvbW1hbmQgYXJndW1lbnRzLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1ldGhvZE5hbWUgLSBDb21tYW5kIG1ldGhvZCBuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtwYXRoXSAtIE1hbmlmZXN0IGNvbW1hbmQgcGF0aCAobWVtYmVyIHBhdGhzIGNhcnJ5IGA8aWQ+YCkuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IFtyZXR1cm5UeXBlXSAtIERlY2xhcmVkIEpTRG9jIHJldHVybiB0eXBlLlxuICogQHByb3BlcnR5IHtcImNvbGxlY3Rpb25cIiB8IFwibWVtYmVyXCJ9IHNjb3BlIC0gQ29tbWFuZCBzY29wZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE1hbmlmZXN0UmVzb3VyY2VFbnRyeVxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBNYW5pZmVzdENvbW1hbmRFbnRyeVtdPn0gW2NvbW1hbmRzXSAtIFNjb3BlLWtleWVkIGN1c3RvbSBjb21tYW5kIGVudHJpZXMuXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+fSBbYnVpbHRJbkNvbW1hbmRzXSAtIFNjb3BlLWtleWVkIGJ1aWx0LWluIGNvbW1hbmQgbWFwcyAobWV0aG9kTmFtZSDihpIgc2x1ZykuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbW9kZWxOYW1lIC0gQmFja2VuZCBtb2RlbCBuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBzdHJpbmdbXX0gW3ByaW1hcnlLZXldIC0gUHJpbWFyeSBrZXkgYXR0cmlidXRlIG5hbWUocykuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7UmVjb3JkPHN0cmluZywgdW5rbm93bj4gJiB7Zm9ybWF0VmVyc2lvbj86IG51bWJlciwgcmVzb3VyY2VzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj59fSBBcGlNYW5pZmVzdFxuICovXG5cbmltcG9ydCBpbmZsZWN0aW9uIGZyb20gXCJpbmZsZWN0aW9uXCJcblxuY29uc3QgTUNQX1RPT0xfTkFNRV9QQVRURVJOID0gL15bYS16MC05X10rJC9cblxuLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSAqL1xuY29uc3QgQlVJTFRfSU5fQ09NTUFORF9ERVNDUklQVElPTlMgPSB7XG4gIGF0dGFjaDogXCJBdHRhY2ggYSBmaWxlIGF0dGFjaG1lbnQgdG8gb25lIHJlY29yZC5cIixcbiAgYXR0YWNobWVudExpc3Q6IFwiTGlzdCB0aGUgYXR0YWNobWVudHMgb2Ygb25lIHJlY29yZC5cIixcbiAgY3JlYXRlOiBcIkNyZWF0ZSBvbmUgcmVjb3JkIHdpdGggYGF0dHJpYnV0ZXNgIChhbmQgb3B0aW9uYWwgYG5lc3RlZEF0dHJpYnV0ZXNgKS5cIixcbiAgZGVzdHJveTogXCJEZXN0cm95IG9uZSByZWNvcmQgYnkgcHJpbWFyeSBrZXkgYGlkYC5cIixcbiAgZG93bmxvYWQ6IFwiRG93bmxvYWQgb25lIGF0dGFjaG1lbnQgb2Ygb25lIHJlY29yZC5cIixcbiAgZmluZDogXCJGaW5kIG9uZSByZWNvcmQgYnkgcHJpbWFyeSBrZXkgYGlkYC5cIixcbiAgaW5kZXg6IFwiTGlzdCByZWNvcmRzIHdpdGggb3B0aW9uYWwgYHdoZXJlYCwgYHNlYXJjaGVzYCwgYHNvcnRgLCBgbGltaXRgLCBgb2Zmc2V0YCwgYHBhZ2VgLCBgcGVyUGFnZWAsIGBwcmVsb2FkYCwgYHNlbGVjdGAsIGBjb3VudGAsIGBwbHVja2AsIGBkaXN0aW5jdGAsIGBncm91cGAsIGBqb2luc2AsIGFuZCBgcXVlcnlEYXRhYC5cIixcbiAgdXBkYXRlOiBcIlVwZGF0ZSBvbmUgcmVjb3JkIGJ5IHByaW1hcnkga2V5IGBpZGAgd2l0aCBgYXR0cmlidXRlc2AgKGFuZCBvcHRpb25hbCBgbmVzdGVkQXR0cmlidXRlc2ApLlwiLFxuICB1cmw6IFwiUmVzb2x2ZSB0aGUgZG93bmxvYWQgVVJMIG9mIG9uZSBhdHRhY2htZW50IG9mIG9uZSByZWNvcmQuXCJcbn1cblxuY29uc3QgTUVUQV9UT09MX05BTUUgPSBcImZyb250ZW5kX21vZGVsX2FwaV9tYW5pZmVzdFwiXG5jb25zdCBNRVRBX1RPT0xfREVTQ1JJUFRJT04gPSBcIlJldHVybiB0aGUgZnVsbCBmcm9udGVuZC1tb2RlbCBBUEkgbWFuaWZlc3QgKGFsbCByZXNvdXJjZXMsIGF0dHJpYnV0ZXMsIGFiaWxpdGllcywgYW5kIGNvbW1hbmRzKSBzbyBjYWxsZXJzIGNhbiBkaXNjb3ZlciB0aGUgYXZhaWxhYmxlIG1vZGVsIGNvbW1hbmRzLlwiXG5cbi8qKlxuICogTWFwcyBvbmUgSlNEb2MgdHlwZSBzdHJpbmcgZnJvbSBjb21tYW5kIG1ldGFkYXRhIHRvIGEgSlNPTiBTY2hlbWEgZnJhZ21lbnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIEpTRG9jIHR5cGUgc3RyaW5nIChmb3IgZXhhbXBsZSBgc3RyaW5nYCwgYG51bWJlcmAsIGB7aWQ6IG51bWJlcn1gKS5cbiAqIEByZXR1cm5zIHt7aXRlbXM/OiB7dHlwZTogc3RyaW5nfSwgdHlwZTogc3RyaW5nfX0gLSBKU09OIFNjaGVtYSB0eXBlIGZyYWdtZW50LlxuICovXG5mdW5jdGlvbiBqc29uU2NoZW1hVHlwZUZvckpTRG9jVHlwZSh0eXBlKSB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRUeXBlID0gdHlwZS50cmltKClcblxuICBpZiAobm9ybWFsaXplZFR5cGUgPT09IFwibnVtYmVyXCIgfHwgbm9ybWFsaXplZFR5cGUgPT09IFwiaW50ZWdlclwiKSByZXR1cm4ge3R5cGU6IFwibnVtYmVyXCJ9XG4gIGlmIChub3JtYWxpemVkVHlwZSA9PT0gXCJib29sZWFuXCIpIHJldHVybiB7dHlwZTogXCJib29sZWFuXCJ9XG4gIGlmIChub3JtYWxpemVkVHlwZS5zdGFydHNXaXRoKFwiQXJyYXk8XCIpIHx8IG5vcm1hbGl6ZWRUeXBlLmVuZHNXaXRoKFwiW11cIikpIHJldHVybiB7aXRlbXM6IHt0eXBlOiBcInN0cmluZ1wifSwgdHlwZTogXCJhcnJheVwifVxuXG4gIHJldHVybiB7dHlwZTogXCJzdHJpbmdcIn1cbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIE1DUCB0b29sIG5hbWUgZm9yIG9uZSBtb2RlbCBjb21tYW5kLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5tb2RlbEtleSAtIE1hbmlmZXN0IHJlc291cmNlIGtleSAoY29uZmlndXJlZCBtb2RlbCBuYW1lKS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNvbW1hbmROYW1lIC0gQ29tbWFuZCBtZXRob2QgbmFtZS5cbiAqIEBwYXJhbSB7XCJjb2xsZWN0aW9uXCIgfCBcIm1lbWJlclwifSBhcmdzLnNjb3BlIC0gQ29tbWFuZCBzY29wZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gTUNQIHRvb2wgbmFtZS5cbiAqL1xuZnVuY3Rpb24gbWNwVG9vbE5hbWUoe2NvbW1hbmROYW1lLCBtb2RlbEtleSwgc2NvcGV9KSB7XG4gIGNvbnN0IG1vZGVsUGFydCA9IGluZmxlY3Rpb24udW5kZXJzY29yZShtb2RlbEtleSkudG9Mb3dlckNhc2UoKVxuICBjb25zdCBjb21tYW5kUGFydCA9IGluZmxlY3Rpb24udW5kZXJzY29yZShjb21tYW5kTmFtZSkudG9Mb3dlckNhc2UoKVxuICBjb25zdCBzY29wZVBhcnQgPSBzY29wZSA9PT0gXCJtZW1iZXJcIiA/IFwiX2J5X2lkXCIgOiBcIlwiXG5cbiAgcmV0dXJuIGAke21vZGVsUGFydH1fJHtjb21tYW5kUGFydH0ke3Njb3BlUGFydH1gXG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBwcmltYXJ5IGtleSBpbnB1dCBwcm9wZXJ0aWVzIGZvciBvbmUgbWFuaWZlc3QgcmVzb3VyY2UuXG4gKiBAcGFyYW0ge3N0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkfSBwcmltYXJ5S2V5IC0gUmVzb3VyY2UgcHJpbWFyeSBrZXkgYXR0cmlidXRlIG5hbWUocykuXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywge2Rlc2NyaXB0aW9uOiBzdHJpbmcsIHR5cGU6IHN0cmluZ30+fSAtIFByaW1hcnkga2V5IEpTT04gU2NoZW1hIHByb3BlcnRpZXMuXG4gKi9cbmZ1bmN0aW9uIHByaW1hcnlLZXlQcm9wZXJ0aWVzKHByaW1hcnlLZXkpIHtcbiAgY29uc3Qga2V5QXR0cmlidXRlcyA9IEFycmF5LmlzQXJyYXkocHJpbWFyeUtleSkgPyBwcmltYXJ5S2V5IDogW3ByaW1hcnlLZXkgfHwgXCJpZFwiXVxuICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHtkZXNjcmlwdGlvbjogc3RyaW5nLCB0eXBlOiBzdHJpbmd9Pn0gKi9cbiAgY29uc3QgcHJvcGVydGllcyA9IHt9XG5cbiAgZm9yIChjb25zdCBrZXlBdHRyaWJ1dGUgb2Yga2V5QXR0cmlidXRlcykge1xuICAgIHByb3BlcnRpZXNba2V5QXR0cmlidXRlXSA9IHtkZXNjcmlwdGlvbjogYFByaW1hcnkga2V5IGF0dHJpYnV0ZSBcXGAke2tleUF0dHJpYnV0ZX1cXGAgb2YgdGhlIHJlY29yZC5gLCB0eXBlOiBcInN0cmluZ1wifVxuICB9XG5cbiAgcmV0dXJuIHByb3BlcnRpZXNcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIGZpeGVkIGlucHV0IHNjaGVtYSBmb3Igb25lIGJ1aWx0LWluIGNvbW1hbmQuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNvbW1hbmROYW1lIC0gQnVpbHQtaW4gY29tbWFuZCBuYW1lLlxuICogQHBhcmFtIHtzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZH0gYXJncy5wcmltYXJ5S2V5IC0gUmVzb3VyY2UgcHJpbWFyeSBrZXkgYXR0cmlidXRlIG5hbWUocykuXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IC0gSlNPTiBTY2hlbWEgb2JqZWN0IGZvciB0aGUgdG9vbCBpbnB1dC5cbiAqL1xuZnVuY3Rpb24gYnVpbHRJbkNvbW1hbmRJbnB1dFNjaGVtYSh7Y29tbWFuZE5hbWUsIHByaW1hcnlLZXl9KSB7XG4gIGlmIChjb21tYW5kTmFtZSA9PT0gXCJpbmRleFwiKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBmYWxzZSxcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgY291bnQ6IHtkZXNjcmlwdGlvbjogXCJSZXR1cm4gb25seSB0aGUgY291bnQgb2YgbWF0Y2hpbmcgcmVjb3Jkcy5cIiwgdHlwZTogXCJib29sZWFuXCJ9LFxuICAgICAgICBkaXN0aW5jdDoge2Rlc2NyaXB0aW9uOiBcIkFwcGx5IERJU1RJTkNUIHRvIHRoZSBpbmRleCBxdWVyeS5cIiwgdHlwZTogXCJib29sZWFuXCJ9LFxuICAgICAgICBncm91cDoge2Rlc2NyaXB0aW9uOiBcIkdyb3VwIHRoZSBpbmRleCBxdWVyeSBieSBhdHRyaWJ1dGUgbmFtZXMgb3IgcmVsYXRpb25zaGlwLXBhdGggZGVzY3JpcHRvcnMuXCIsIHR5cGU6IFwib2JqZWN0XCJ9LFxuICAgICAgICBqb2luczoge2Rlc2NyaXB0aW9uOiBcIlJlbGF0aW9uc2hpcC1wYXRoIGpvaW4gZGVzY3JpcHRvcnMuXCIsIHR5cGU6IFwib2JqZWN0XCJ9LFxuICAgICAgICBsaW1pdDoge2Rlc2NyaXB0aW9uOiBcIk1heGltdW0gbnVtYmVyIG9mIHJlY29yZHMgdG8gcmV0dXJuLlwiLCB0eXBlOiBcIm51bWJlclwifSxcbiAgICAgICAgb2Zmc2V0OiB7ZGVzY3JpcHRpb246IFwiTnVtYmVyIG9mIHJlY29yZHMgdG8gc2tpcC5cIiwgdHlwZTogXCJudW1iZXJcIn0sXG4gICAgICAgIHBhZ2U6IHtkZXNjcmlwdGlvbjogXCIxLWJhc2VkIHBhZ2UgbnVtYmVyIChjb21iaW5lIHdpdGggYHBlclBhZ2VgKS5cIiwgdHlwZTogXCJudW1iZXJcIn0sXG4gICAgICAgIHBlclBhZ2U6IHtkZXNjcmlwdGlvbjogXCJSZWNvcmRzIHBlciBwYWdlLlwiLCB0eXBlOiBcIm51bWJlclwifSxcbiAgICAgICAgcGx1Y2s6IHtkZXNjcmlwdGlvbjogXCJBdHRyaWJ1dGUgbmFtZXMgb3IgcmVsYXRpb25zaGlwLXBhdGggZGVzY3JpcHRvcnMgdG8gcGx1Y2sgaW5zdGVhZCBvZiBmdWxsIHJlY29yZHMuXCIsIHR5cGU6IFwiYXJyYXlcIn0sXG4gICAgICAgIHByZWxvYWQ6IHtkZXNjcmlwdGlvbjogXCJSZWxhdGlvbnNoaXAgcHJlbG9hZCBkZXNjcmlwdG9ycy5cIiwgdHlwZTogXCJvYmplY3RcIn0sXG4gICAgICAgIHF1ZXJ5RGF0YToge2Rlc2NyaXB0aW9uOiBcIlN0cnVjdHVyZWQgcXVlcnktZGF0YSBkZXNjcmlwdG9yLlwiLCB0eXBlOiBcIm9iamVjdFwifSxcbiAgICAgICAgc2VhcmNoZXM6IHtkZXNjcmlwdGlvbjogXCJTZWFyY2ggZGVzY3JpcHRvcnMgKHBhdGgvY29sdW1uL29wZXJhdG9yL3ZhbHVlKS5cIiwgdHlwZTogXCJhcnJheVwifSxcbiAgICAgICAgc2VsZWN0OiB7ZGVzY3JpcHRpb246IFwiU2VsZWN0ZWQgYXR0cmlidXRlIG5hbWVzIHBlciBtb2RlbC5cIiwgdHlwZTogXCJvYmplY3RcIn0sXG4gICAgICAgIHNlbGVjdHNFeHRyYToge2Rlc2NyaXB0aW9uOiBcIkV4dHJhIHNlbGVjdGVkIGF0dHJpYnV0ZXMuXCIsIHR5cGU6IFwib2JqZWN0XCJ9LFxuICAgICAgICBzb3J0OiB7ZGVzY3JpcHRpb246IFwiU29ydCBkZWZpbml0aW9ucyAoY29sdW1uIG9yIHJlbGF0aW9uc2hpcC1wYXRoIGRlc2NyaXB0b3JzKS5cIiwgdHlwZTogXCJhcnJheVwifSxcbiAgICAgICAgd2hlcmU6IHtkZXNjcmlwdGlvbjogXCJBdHRyaWJ1dGUgZmlsdGVyIGhhc2guXCIsIHR5cGU6IFwib2JqZWN0XCJ9LFxuICAgICAgICB3aXRoQ291bnQ6IHtkZXNjcmlwdGlvbjogXCJJbmNsdWRlIHRoZSB0b3RhbCBjb3VudCBhbG9uZ3NpZGUgcmVjb3Jkcy5cIiwgdHlwZTogXCJib29sZWFuXCJ9XG4gICAgICB9LFxuICAgICAgdHlwZTogXCJvYmplY3RcIlxuICAgIH1cbiAgfVxuXG4gIGlmIChjb21tYW5kTmFtZSA9PT0gXCJjcmVhdGVcIikge1xuICAgIHJldHVybiB7XG4gICAgICBhZGRpdGlvbmFsUHJvcGVydGllczogZmFsc2UsXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIGF0dHJpYnV0ZXM6IHtkZXNjcmlwdGlvbjogXCJXcml0YWJsZSBhdHRyaWJ1dGUgdmFsdWVzIGZvciB0aGUgbmV3IHJlY29yZC5cIiwgdHlwZTogXCJvYmplY3RcIn0sXG4gICAgICAgIG5lc3RlZEF0dHJpYnV0ZXM6IHtkZXNjcmlwdGlvbjogXCJOZXN0ZWQgcmVsYXRpb25zaGlwIGF0dHJpYnV0ZSBwYXlsb2Fkcy5cIiwgdHlwZTogXCJvYmplY3RcIn1cbiAgICAgIH0sXG4gICAgICByZXF1aXJlZDogW1wiYXR0cmlidXRlc1wiXSxcbiAgICAgIHR5cGU6IFwib2JqZWN0XCJcbiAgICB9XG4gIH1cblxuICBpZiAoY29tbWFuZE5hbWUgPT09IFwidXBkYXRlXCIpIHtcbiAgICBjb25zdCBpZFByb3BlcnRpZXMgPSBwcmltYXJ5S2V5UHJvcGVydGllcyhwcmltYXJ5S2V5KVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBmYWxzZSxcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgYXR0cmlidXRlczoge2Rlc2NyaXB0aW9uOiBcIldyaXRhYmxlIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gYXBwbHkuXCIsIHR5cGU6IFwib2JqZWN0XCJ9LFxuICAgICAgICAuLi5pZFByb3BlcnRpZXMsXG4gICAgICAgIG5lc3RlZEF0dHJpYnV0ZXM6IHtkZXNjcmlwdGlvbjogXCJOZXN0ZWQgcmVsYXRpb25zaGlwIGF0dHJpYnV0ZSBwYXlsb2Fkcy5cIiwgdHlwZTogXCJvYmplY3RcIn1cbiAgICAgIH0sXG4gICAgICByZXF1aXJlZDogWy4uLk9iamVjdC5rZXlzKGlkUHJvcGVydGllcyksIFwiYXR0cmlidXRlc1wiXSxcbiAgICAgIHR5cGU6IFwib2JqZWN0XCJcbiAgICB9XG4gIH1cblxuICAvLyBmaW5kIC8gZGVzdHJveSAvIGF0dGFjaCAvIGRvd25sb2FkIC8gdXJsIC8gYXR0YWNobWVudExpc3QgYXJlIGlkLWFkZHJlc3NlZFxuICBjb25zdCBpZFByb3BlcnRpZXMgPSBwcmltYXJ5S2V5UHJvcGVydGllcyhwcmltYXJ5S2V5KVxuXG4gIHJldHVybiB7XG4gICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IGZhbHNlLFxuICAgIHByb3BlcnRpZXM6IHsuLi5pZFByb3BlcnRpZXN9LFxuICAgIHJlcXVpcmVkOiBbLi4uT2JqZWN0LmtleXMoaWRQcm9wZXJ0aWVzKV0sXG4gICAgdHlwZTogXCJvYmplY3RcIlxuICB9XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBpbnB1dCBzY2hlbWEgZm9yIG9uZSBjdXN0b20gY29tbWFuZCBmcm9tIGl0cyBtYW5pZmVzdCBhcmd1bWVudCBtZXRhZGF0YS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICogQHBhcmFtIHtNYW5pZmVzdENvbW1hbmRFbnRyeX0gYXJncy5lbnRyeSAtIE1hbmlmZXN0IGNvbW1hbmQgZW50cnkuXG4gKiBAcGFyYW0ge3N0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkfSBhcmdzLnByaW1hcnlLZXkgLSBSZXNvdXJjZSBwcmltYXJ5IGtleSBhdHRyaWJ1dGUgbmFtZShzKS5cbiAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gLSBKU09OIFNjaGVtYSBvYmplY3QgZm9yIHRoZSB0b29sIGlucHV0LlxuICovXG5mdW5jdGlvbiBjdXN0b21Db21tYW5kSW5wdXRTY2hlbWEoe2VudHJ5LCBwcmltYXJ5S2V5fSkge1xuICBjb25zdCBjb21tYW5kQXJncyA9IGVudHJ5LmFyZ3MgfHwgW11cbiAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB7ZGVzY3JpcHRpb24/OiBzdHJpbmcsIGl0ZW1zPzoge2l0ZW1zPzoge3R5cGU6IHN0cmluZ30sIHR5cGU6IHN0cmluZ30sIHR5cGU6IHN0cmluZ30+fSAqL1xuICBjb25zdCBwcm9wZXJ0aWVzID0ge31cblxuICBmb3IgKGNvbnN0IGNvbW1hbmRBcmcgb2YgY29tbWFuZEFyZ3MpIHtcbiAgICBwcm9wZXJ0aWVzW2NvbW1hbmRBcmcubmFtZV0gPSBqc29uU2NoZW1hVHlwZUZvckpTRG9jVHlwZShjb21tYW5kQXJnLnR5cGUpXG4gIH1cblxuICBpZiAoZW50cnkuc2NvcGUgPT09IFwibWVtYmVyXCIpIHtcbiAgICBmb3IgKGNvbnN0IFtrZXlBdHRyaWJ1dGUsIGtleVNjaGVtYV0gb2YgT2JqZWN0LmVudHJpZXMocHJpbWFyeUtleVByb3BlcnRpZXMocHJpbWFyeUtleSkpKSB7XG4gICAgICBpZiAoIXByb3BlcnRpZXNba2V5QXR0cmlidXRlXSkgcHJvcGVydGllc1trZXlBdHRyaWJ1dGVdID0ga2V5U2NoZW1hXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBhZGRpdGlvbmFsUHJvcGVydGllczogdHJ1ZSxcbiAgICBwcm9wZXJ0aWVzLFxuICAgIHR5cGU6IFwib2JqZWN0XCJcbiAgfVxufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBNQ1AgdG9vbCBkZWZpbml0aW9ucyBmcm9tIGEgZnJvbnRlbmQtbW9kZWwgQVBJIG1hbmlmZXN0LlxuICogRXZlcnkgYnVpbHQtaW4gYW5kIGN1c3RvbSBjb21tYW5kIG9mIGV2ZXJ5IG1hbmlmZXN0IHJlc291cmNlIGJlY29tZXMgb25lIHRvb2w7XG4gKiBvbmUgbWV0YSB0b29sIGV4cG9zZXMgdGhlIHJhdyBtYW5pZmVzdCBmb3IgZGlzY292ZXJ5LlxuICogQHBhcmFtIHtBcGlNYW5pZmVzdH0gbWFuaWZlc3QgLSBNYW5pZmVzdCBmcm9tIGBjb25maWd1cmF0aW9uLmdldEFwaU1hbmlmZXN0KClgLlxuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIHVua25vd24+W119IC0gTUNQIGB0b29scy9saXN0YCB0b29sIGRlZmluaXRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVNY3BUb29scyhtYW5pZmVzdCkge1xuICBjb25zdCByZXNvdXJjZXMgPSBtYW5pZmVzdC5yZXNvdXJjZXNcbiAgY29uc3QgdG9vbHMgPSBbXVxuXG4gIGlmICghcmVzb3VyY2VzKSByZXR1cm4gW2J1aWxkTWV0YVRvb2woKV1cblxuICBmb3IgKGNvbnN0IG1vZGVsS2V5IG9mIE9iamVjdC5rZXlzKHJlc291cmNlcykuc29ydCgpKSB7XG4gICAgY29uc3QgcmVzb3VyY2UgPSAvKiogQHR5cGUge01hbmlmZXN0UmVzb3VyY2VFbnRyeX0gKi8gKHJlc291cmNlc1ttb2RlbEtleV0pXG4gICAgY29uc3QgY29tbWFuZHMgPSByZXNvdXJjZS5jb21tYW5kcyB8fCB7fVxuICAgIGNvbnN0IGJ1aWx0SW5Db21tYW5kcyA9IHJlc291cmNlLmJ1aWx0SW5Db21tYW5kcyB8fCB7fVxuXG4gICAgZm9yIChjb25zdCBzY29wZSBvZiAvKiogQHR5cGUge0FycmF5PFwiY29sbGVjdGlvblwiIHwgXCJtZW1iZXJcIj59ICovIChbXCJjb2xsZWN0aW9uXCIsIFwibWVtYmVyXCJdKSkge1xuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBzY29wZUNvbW1hbmRFbnRyaWVzKHtidWlsdEluQ29tbWFuZHMsIGNvbW1hbmRzLCBzY29wZX0pKSB7XG4gICAgICAgIGNvbnN0IGNvbW1hbmROYW1lID0gZW50cnkubWV0aG9kTmFtZVxuICAgICAgICBjb25zdCBpc0J1aWx0SW4gPSBlbnRyeS5pc0J1aWx0SW5cbiAgICAgICAgY29uc3QgbmFtZSA9IG1jcFRvb2xOYW1lKHtjb21tYW5kTmFtZSwgbW9kZWxLZXksIHNjb3BlfSlcblxuICAgICAgICBpZiAoIU1DUF9UT09MX05BTUVfUEFUVEVSTi50ZXN0KG5hbWUpKSBjb250aW51ZVxuXG4gICAgICAgIHRvb2xzLnB1c2goe1xuICAgICAgICAgIGRlc2NyaXB0aW9uOiBpc0J1aWx0SW5cbiAgICAgICAgICAgID8gYCR7QlVJTFRfSU5fQ09NTUFORF9ERVNDUklQVElPTlNbY29tbWFuZE5hbWVdIHx8IGBSdW4gdGhlIGJ1aWx0LWluIFxcYCR7Y29tbWFuZE5hbWV9XFxgIGNvbW1hbmQgb24gXFxgJHtyZXNvdXJjZS5tb2RlbE5hbWV9XFxgLmB9IE1vZGVsOiBcXGAke3Jlc291cmNlLm1vZGVsTmFtZX1cXGAuYFxuICAgICAgICAgICAgOiBgQ3VzdG9tIGNvbW1hbmQgXFxgJHtjb21tYW5kTmFtZX1cXGAgb24gbW9kZWwgXFxgJHtyZXNvdXJjZS5tb2RlbE5hbWV9XFxgJHtlbnRyeS5yZXR1cm5UeXBlID8gYCAocmV0dXJucyAke2VudHJ5LnJldHVyblR5cGV9KWAgOiBcIlwifS5gLFxuICAgICAgICAgIGlucHV0U2NoZW1hOiBpc0J1aWx0SW5cbiAgICAgICAgICAgID8gYnVpbHRJbkNvbW1hbmRJbnB1dFNjaGVtYSh7Y29tbWFuZE5hbWUsIHByaW1hcnlLZXk6IHJlc291cmNlLnByaW1hcnlLZXl9KVxuICAgICAgICAgICAgOiBjdXN0b21Db21tYW5kSW5wdXRTY2hlbWEoe2VudHJ5LCBwcmltYXJ5S2V5OiByZXNvdXJjZS5wcmltYXJ5S2V5fSksXG4gICAgICAgICAgbmFtZVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHRvb2xzLnB1c2goYnVpbGRNZXRhVG9vbCgpKVxuXG4gIHJldHVybiB0b29sc1xufVxuXG4vKipcbiAqIE1lcmdlcyB0aGUgbWFuaWZlc3QncyBidWlsdC1pbiBjb21tYW5kIG5hbWVzIGFuZCBjdXN0b20gY29tbWFuZCBlbnRyaWVzIGZvclxuICogb25lIHNjb3BlIGludG8gYSBzaW5nbGUgZGV0ZXJtaW5pc3RpYyBjb21tYW5kLWVudHJ5IGxpc3QuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgc3RyaW5nPj59IGFyZ3MuYnVpbHRJbkNvbW1hbmRzIC0gU2NvcGUta2V5ZWQgYnVpbHQtaW4gY29tbWFuZCBtYXBzLlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBNYW5pZmVzdENvbW1hbmRFbnRyeVtdPn0gYXJncy5jb21tYW5kcyAtIFNjb3BlLWtleWVkIGN1c3RvbSBjb21tYW5kIGVudHJpZXMuXG4gKiBAcGFyYW0ge1wiY29sbGVjdGlvblwiIHwgXCJtZW1iZXJcIn0gYXJncy5zY29wZSAtIENvbW1hbmQgc2NvcGUuXG4gKiBAcmV0dXJucyB7QXJyYXk8TWFuaWZlc3RDb21tYW5kRW50cnkgJiB7aXNCdWlsdEluOiBib29sZWFufT59IC0gQ29tYmluZWQgY29tbWFuZCBlbnRyaWVzLlxuICovXG5mdW5jdGlvbiBzY29wZUNvbW1hbmRFbnRyaWVzKHtidWlsdEluQ29tbWFuZHMsIGNvbW1hbmRzLCBzY29wZX0pIHtcbiAgLyoqIEB0eXBlIHtBcnJheTxNYW5pZmVzdENvbW1hbmRFbnRyeSAmIHtpc0J1aWx0SW46IGJvb2xlYW59Pn0gKi9cbiAgY29uc3QgZW50cmllcyA9IFtdXG5cbiAgZm9yIChjb25zdCBjb21tYW5kTmFtZSBvZiBPYmplY3Qua2V5cyhidWlsdEluQ29tbWFuZHNbc2NvcGVdIHx8IHt9KSkge1xuICAgIGVudHJpZXMucHVzaCh7aXNCdWlsdEluOiB0cnVlLCBtZXRob2ROYW1lOiBjb21tYW5kTmFtZSwgc2NvcGV9KVxuICB9XG5cbiAgZm9yIChjb25zdCBlbnRyeSBvZiBjb21tYW5kc1tzY29wZV0gfHwgW10pIHtcbiAgICBlbnRyaWVzLnB1c2goey4uLmVudHJ5LCBpc0J1aWx0SW46IGZhbHNlfSlcbiAgfVxuXG4gIHJldHVybiBlbnRyaWVzLnNvcnQoKGEsIGIpID0+IGEubWV0aG9kTmFtZS5sb2NhbGVDb21wYXJlKGIubWV0aG9kTmFtZSkpXG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBtYW5pZmVzdCBkaXNjb3ZlcnkgbWV0YSB0b29sLlxuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAtIE1DUCB0b29sIGRlZmluaXRpb24uXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkTWV0YVRvb2woKSB7XG4gIHJldHVybiB7XG4gICAgZGVzY3JpcHRpb246IE1FVEFfVE9PTF9ERVNDUklQVElPTixcbiAgICBpbnB1dFNjaGVtYToge2FkZGl0aW9uYWxQcm9wZXJ0aWVzOiBmYWxzZSwgcHJvcGVydGllczoge30sIHR5cGU6IFwib2JqZWN0XCJ9LFxuICAgIG5hbWU6IE1FVEFfVE9PTF9OQU1FXG4gIH1cbn1cblxuLyoqXG4gKiBQYXJzZXMgb25lIE1DUCB0b29sIG5hbWUgYmFjayBpbnRvIGl0cyBtYW5pZmVzdCBtb2RlbCBrZXkgYW5kIGNvbW1hbmQgbWV0aG9kIG5hbWUuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnRvb2xOYW1lIC0gTUNQIHRvb2wgbmFtZS5cbiAqIEBwYXJhbSB7QXBpTWFuaWZlc3R9IGFyZ3MubWFuaWZlc3QgLSBNYW5pZmVzdCBmcm9tIGBjb25maWd1cmF0aW9uLmdldEFwaU1hbmlmZXN0KClgLlxuICogQHJldHVybnMge3tjb21tYW5kTmFtZTogc3RyaW5nLCBtb2RlbEtleTogc3RyaW5nLCBzY29wZTogXCJjb2xsZWN0aW9uXCIgfCBcIm1lbWJlclwifSB8IG51bGx9IC0gQ29tbWFuZCBpZGVudGl0eSwgb3IgbnVsbCB3aGVuIHVua25vd24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZU1jcFRvb2xOYW1lKHttYW5pZmVzdCwgdG9vbE5hbWV9KSB7XG4gIGlmICh0b29sTmFtZSA9PT0gTUVUQV9UT09MX05BTUUpIHJldHVybiBudWxsXG5cbiAgY29uc3QgcmVzb3VyY2VzID0gbWFuaWZlc3QucmVzb3VyY2VzXG5cbiAgaWYgKCFyZXNvdXJjZXMpIHJldHVybiBudWxsXG5cbiAgZm9yIChjb25zdCBtb2RlbEtleSBvZiBPYmplY3Qua2V5cyhyZXNvdXJjZXMpKSB7XG4gICAgY29uc3QgcmVzb3VyY2UgPSAvKiogQHR5cGUge01hbmlmZXN0UmVzb3VyY2VFbnRyeX0gKi8gKHJlc291cmNlc1ttb2RlbEtleV0pXG4gICAgY29uc3QgY29tbWFuZHMgPSByZXNvdXJjZS5jb21tYW5kcyB8fCB7fVxuICAgIGNvbnN0IGJ1aWx0SW5Db21tYW5kcyA9IHJlc291cmNlLmJ1aWx0SW5Db21tYW5kcyB8fCB7fVxuXG4gICAgZm9yIChjb25zdCBzY29wZSBvZiAvKiogQHR5cGUge0FycmF5PFwiY29sbGVjdGlvblwiIHwgXCJtZW1iZXJcIj59ICovIChbXCJjb2xsZWN0aW9uXCIsIFwibWVtYmVyXCJdKSkge1xuICAgICAgY29uc3QgY29tbWFuZE5hbWVzID0gWy4uLk9iamVjdC5rZXlzKGJ1aWx0SW5Db21tYW5kc1tzY29wZV0gfHwge30pLCAuLi4oY29tbWFuZHNbc2NvcGVdIHx8IFtdKS5tYXAoKGVudHJ5KSA9PiBlbnRyeS5tZXRob2ROYW1lKV1cblxuICAgICAgZm9yIChjb25zdCBjb21tYW5kTmFtZSBvZiBjb21tYW5kTmFtZXMpIHtcbiAgICAgICAgaWYgKG1jcFRvb2xOYW1lKHtjb21tYW5kTmFtZSwgbW9kZWxLZXksIHNjb3BlfSkgPT09IHRvb2xOYW1lKSB7XG4gICAgICAgICAgcmV0dXJuIHtjb21tYW5kTmFtZSwgbW9kZWxLZXksIHNjb3BlfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cblxuLyoqXG4gKiBSdW5zIHRoZSBtZXRhVG9vbE5hbWUgaGVscGVyLlxuICogQHJldHVybnMge3N0cmluZ30gLSBUaGUgbWV0YSB0b29sIG5hbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXRhVG9vbE5hbWUoKSB7IHJldHVybiBNRVRBX1RPT0xfTkFNRSB9XG4iXX0=
@@ -0,0 +1,48 @@
1
+ export type CatchAllRouteOptions = {
2
+ /**
3
+ * - Controller name unmatched requests resolve to.
4
+ */
5
+ controller?: string;
6
+ /**
7
+ * - Action name unmatched requests resolve to.
8
+ */
9
+ action?: string;
10
+ };
11
+ /**
12
+ * Catch-all route options.
13
+ * @typedef {object} CatchAllRouteOptions
14
+ * @property {string} [controller] - Controller name unmatched requests resolve to.
15
+ * @property {string} [action] - Action name unmatched requests resolve to.
16
+ */
17
+ /**
18
+ * Application-declared catch-all route created with `route.catchAll(...)` in
19
+ * the routes file. It is not a path matcher: the resolver applies it only
20
+ * when no other route in the tree matched, replacing the built-in errors
21
+ * not-found response with the application's own controller/action (for
22
+ * example a JSON error envelope) without hand-wiring a route resolver hook.
23
+ */
24
+ export default class VelociousRouteCatchAllRoute {
25
+ /**
26
+ * Controller name unmatched requests resolve to.
27
+ * @type {string} */
28
+ controller: string;
29
+ /**
30
+ * Action name unmatched requests resolve to.
31
+ * @type {string} */
32
+ action: string;
33
+ /**
34
+ * Runs constructor.
35
+ * @param {CatchAllRouteOptions} [options] - Catch-all options.
36
+ */
37
+ constructor({ controller, action, ...restArgs }?: CatchAllRouteOptions);
38
+ /**
39
+ * Runs get human paths.
40
+ * @returns {Array<{action: string | null, method: string, path: string}>} - Route definitions for this route.
41
+ */
42
+ getHumanPaths(): Array<{
43
+ action: string | null;
44
+ method: string;
45
+ path: string;
46
+ }>;
47
+ }
48
+ //# sourceMappingURL=catch-all-route.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catch-all-route.d.ts","sourceRoot":"","sources":["../../../src/routes/catch-all-route.js"],"names":[],"mappings":"AAMG,YAAkB,oBAAoB,GACtC;;;;IAAoB,UAAU,AAA9B,CACA,EADW,MAAM,CACjB;;;;IAAoB,MAAM,AAA1B,CACF,EADa,MAAM,CACnB;CAAA,CAAA;AALD;;;;;GAKG;AAEH;;;;;;GAMG;AACH,MAAM,CAAC,OAAO,OAAO,2BAA2B;IAC9C;;wBAEoB;IACpB,UAAU,EADA,MAAM,CACN;IAEV;;wBAEoB;IACpB,MAAM,EADI,MAAM,CACV;IAEN;;;OAGG;IACH,YAAY,EAAC,UAAoB,EAAE,MAAmB,EAAE,GAAG,QAAQ,EAAC,AAFjE,CACF,EADU,oBAE8D,EAaxE;IAED;;;OAGG;IACH,aAAa,IAFA,KAAK,CAAC;QAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAC,CAAC,CAMxE;CACF"}
@@ -0,0 +1,50 @@
1
+ // @ts-check
2
+ import restArgsError from "../utils/rest-args-error.js";
3
+ /**
4
+ * Catch-all route options.
5
+ * @typedef {object} CatchAllRouteOptions
6
+ * @property {string} [controller] - Controller name unmatched requests resolve to.
7
+ * @property {string} [action] - Action name unmatched requests resolve to.
8
+ */
9
+ /**
10
+ * Application-declared catch-all route created with `route.catchAll(...)` in
11
+ * the routes file. It is not a path matcher: the resolver applies it only
12
+ * when no other route in the tree matched, replacing the built-in errors
13
+ * not-found response with the application's own controller/action (for
14
+ * example a JSON error envelope) without hand-wiring a route resolver hook.
15
+ */
16
+ export default class VelociousRouteCatchAllRoute {
17
+ /**
18
+ * Controller name unmatched requests resolve to.
19
+ * @type {string} */
20
+ controller;
21
+ /**
22
+ * Action name unmatched requests resolve to.
23
+ * @type {string} */
24
+ action;
25
+ /**
26
+ * Runs constructor.
27
+ * @param {CatchAllRouteOptions} [options] - Catch-all options.
28
+ */
29
+ constructor({ controller = "_root", action = "notFound", ...restArgs } = {}) {
30
+ restArgsError(restArgs);
31
+ if (typeof controller !== "string" || controller.length < 1) {
32
+ throw new Error(`Expected catch-all 'controller' to be a non-empty string, got: ${String(controller)}`);
33
+ }
34
+ if (typeof action !== "string" || action.length < 1) {
35
+ throw new Error(`Expected catch-all 'action' to be a non-empty string, got: ${String(action)}`);
36
+ }
37
+ this.controller = controller;
38
+ this.action = action;
39
+ }
40
+ /**
41
+ * Runs get human paths.
42
+ * @returns {Array<{action: string | null, method: string, path: string}>} - Route definitions for this route.
43
+ */
44
+ getHumanPaths() {
45
+ return [
46
+ { method: "ANY", action: this.action, path: "*" }
47
+ ];
48
+ }
49
+ }
50
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2F0Y2gtYWxsLXJvdXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3JvdXRlcy9jYXRjaC1hbGwtcm91dGUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sYUFBYSxNQUFNLDZCQUE2QixDQUFBO0FBRXZEOzs7OztHQUtHO0FBRUg7Ozs7OztHQU1HO0FBQ0gsTUFBTSxDQUFDLE9BQU8sT0FBTywyQkFBMkI7SUFDOUM7O3dCQUVvQjtJQUNwQixVQUFVLENBQUE7SUFFVjs7d0JBRW9CO0lBQ3BCLE1BQU0sQ0FBQTtJQUVOOzs7T0FHRztJQUNILFlBQVksRUFBQyxVQUFVLEdBQUcsT0FBTyxFQUFFLE1BQU0sR0FBRyxVQUFVLEVBQUUsR0FBRyxRQUFRLEVBQUMsR0FBRyxFQUFFO1FBQ3ZFLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUV2QixJQUFJLE9BQU8sVUFBVSxLQUFLLFFBQVEsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzVELE1BQU0sSUFBSSxLQUFLLENBQUMsa0VBQWtFLE1BQU0sQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDekcsQ0FBQztRQUVELElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDcEQsTUFBTSxJQUFJLEtBQUssQ0FBQyw4REFBOEQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUNqRyxDQUFDO1FBRUQsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUE7UUFDNUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUE7SUFDdEIsQ0FBQztJQUVEOzs7T0FHRztJQUNILGFBQWE7UUFDWCxPQUFPO1lBQ0wsRUFBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUM7U0FDaEQsQ0FBQTtJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgcmVzdEFyZ3NFcnJvciBmcm9tIFwiLi4vdXRpbHMvcmVzdC1hcmdzLWVycm9yLmpzXCJcblxuLyoqXG4gKiBDYXRjaC1hbGwgcm91dGUgb3B0aW9ucy5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IENhdGNoQWxsUm91dGVPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2NvbnRyb2xsZXJdIC0gQ29udHJvbGxlciBuYW1lIHVubWF0Y2hlZCByZXF1ZXN0cyByZXNvbHZlIHRvLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFthY3Rpb25dIC0gQWN0aW9uIG5hbWUgdW5tYXRjaGVkIHJlcXVlc3RzIHJlc29sdmUgdG8uXG4gKi9cblxuLyoqXG4gKiBBcHBsaWNhdGlvbi1kZWNsYXJlZCBjYXRjaC1hbGwgcm91dGUgY3JlYXRlZCB3aXRoIGByb3V0ZS5jYXRjaEFsbCguLi4pYCBpblxuICogdGhlIHJvdXRlcyBmaWxlLiBJdCBpcyBub3QgYSBwYXRoIG1hdGNoZXI6IHRoZSByZXNvbHZlciBhcHBsaWVzIGl0IG9ubHlcbiAqIHdoZW4gbm8gb3RoZXIgcm91dGUgaW4gdGhlIHRyZWUgbWF0Y2hlZCwgcmVwbGFjaW5nIHRoZSBidWlsdC1pbiBlcnJvcnNcbiAqIG5vdC1mb3VuZCByZXNwb25zZSB3aXRoIHRoZSBhcHBsaWNhdGlvbidzIG93biBjb250cm9sbGVyL2FjdGlvbiAoZm9yXG4gKiBleGFtcGxlIGEgSlNPTiBlcnJvciBlbnZlbG9wZSkgd2l0aG91dCBoYW5kLXdpcmluZyBhIHJvdXRlIHJlc29sdmVyIGhvb2suXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZlbG9jaW91c1JvdXRlQ2F0Y2hBbGxSb3V0ZSB7XG4gIC8qKlxuICAgKiBDb250cm9sbGVyIG5hbWUgdW5tYXRjaGVkIHJlcXVlc3RzIHJlc29sdmUgdG8uXG4gICAqIEB0eXBlIHtzdHJpbmd9ICovXG4gIGNvbnRyb2xsZXJcblxuICAvKipcbiAgICogQWN0aW9uIG5hbWUgdW5tYXRjaGVkIHJlcXVlc3RzIHJlc29sdmUgdG8uXG4gICAqIEB0eXBlIHtzdHJpbmd9ICovXG4gIGFjdGlvblxuXG4gIC8qKlxuICAgKiBSdW5zIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge0NhdGNoQWxsUm91dGVPcHRpb25zfSBbb3B0aW9uc10gLSBDYXRjaC1hbGwgb3B0aW9ucy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtjb250cm9sbGVyID0gXCJfcm9vdFwiLCBhY3Rpb24gPSBcIm5vdEZvdW5kXCIsIC4uLnJlc3RBcmdzfSA9IHt9KSB7XG4gICAgcmVzdEFyZ3NFcnJvcihyZXN0QXJncylcblxuICAgIGlmICh0eXBlb2YgY29udHJvbGxlciAhPT0gXCJzdHJpbmdcIiB8fCBjb250cm9sbGVyLmxlbmd0aCA8IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgY2F0Y2gtYWxsICdjb250cm9sbGVyJyB0byBiZSBhIG5vbi1lbXB0eSBzdHJpbmcsIGdvdDogJHtTdHJpbmcoY29udHJvbGxlcil9YClcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGFjdGlvbiAhPT0gXCJzdHJpbmdcIiB8fCBhY3Rpb24ubGVuZ3RoIDwgMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBjYXRjaC1hbGwgJ2FjdGlvbicgdG8gYmUgYSBub24tZW1wdHkgc3RyaW5nLCBnb3Q6ICR7U3RyaW5nKGFjdGlvbil9YClcbiAgICB9XG5cbiAgICB0aGlzLmNvbnRyb2xsZXIgPSBjb250cm9sbGVyXG4gICAgdGhpcy5hY3Rpb24gPSBhY3Rpb25cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGdldCBodW1hbiBwYXRocy5cbiAgICogQHJldHVybnMge0FycmF5PHthY3Rpb246IHN0cmluZyB8IG51bGwsIG1ldGhvZDogc3RyaW5nLCBwYXRoOiBzdHJpbmd9Pn0gLSBSb3V0ZSBkZWZpbml0aW9ucyBmb3IgdGhpcyByb3V0ZS5cbiAgICovXG4gIGdldEh1bWFuUGF0aHMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHttZXRob2Q6IFwiQU5ZXCIsIGFjdGlvbjogdGhpcy5hY3Rpb24sIHBhdGg6IFwiKlwifVxuICAgIF1cbiAgfVxufVxuIl19
@@ -1 +1 @@
1
- {"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../../src/routes/resolver.js"],"names":[],"mappings":"AAOA,OAAO,MAAM,MAAM,cAAc,CAAA;AAajC,MAAM,CAAC,OAAO,OAAO,uBAAuB;IAkBnC,aAAa;IAGb,MAAM;;;IAGN,OAAO;IACP,QAAQ;IAIR,kBAAkB;IA6BlB,wBAAwB;IAzD/B;;oCAEgC;IAChC,MAAM,EADI,MAAM,GAAG,SAAS,CACtB;IAEN;;;;;;OAMG;IACH,YAAY,EAAC,aAAa,EAAE,OAAO,EAAE,QAAQ,EAAC,EAJ3C;QAAoD,aAAa,EAAzD,OAAO,qBAAqB,EAAE,OAAO,CAC7C;QAAgI,OAAO,EAA/H,OAAO,kCAAkC,EAAE,OAAO,GAAG,OAAO,4CAA4C,EAAE,OAAO,CACzH;QAAkE,QAAQ,EAAlE,OAAO,mCAAmC,EAAE,OAAO,CAC7D;KAC6C,EAkB7C;IAED;;;OAGG;IACH,eAAe,IAFF,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAoBlC;IAEK,OAAO,kBAoKZ;IAED;;;;;OAKG;IACG,sBAAsB,CAAC,EAAC,cAAc,EAAC,EAH1C;QAAqB,cAAc,EAA3B,MAAM,CACd;KAE0C,GAFhC,OAAO,CAAC,cAAc,kBAAkB,EAAE,OAAO,CAAC,CAQ9D;IAED;;;;;OAKG;IACH,mBAAmB,CAAC,KAAK,EAJd,OAAO,iBAAiB,EAAE,OAIZ,EAAE,IAAI,EAHpB,MAGoB,GAFlB;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAC,GAAG,SAAS,CAiC1C;IAED;;;;;;OAMG;IACG,yBAAyB,CAAC,WAAW,EALhC,MAKgC,EAAE,OAAO,GAHjD;QAA0B,sBAAsB,AAAhD,CACA,EADQ,OAAO,CACf;KAEsD,GAF5C,OAAO,CAAC,OAAO,2BAA2B,EAAE,uBAAuB,GAAG,IAAI,CAAC,CAgEvF;IAED;;;;;;;OAOG;IACG,eAAe,CAAC,EAAC,MAAM,EAAE,eAAe,EAAE,SAAS,EAAC,EALvD;QAAqB,MAAM,EAAnB,MAAM,CACd;QAAwD,eAAe,EAA/D,cAAc,kBAAkB,EAAE,OAAO,CACjD;QAA+B,SAAS,EAAhC,OAAO,GAAG,MAAM,CACxB;KAEuD,GAF7C,OAAO,CAAC,IAAI,CAAC,CA0BzB;IAED;;;OAGG;IACH,UAAU,IAFG,OAAO,GAAG,MAAM,CAI5B;IAED;;;;;OAKG;IACG,kBAAkB,CAJX,CAAC,EAIW,QAAQ,EAHtB,MAAM,OAAO,CAAC,CAAC,CAGO,GAFpB,OAAO,CAAC,CAAC,CAAC,CAQtB;IAED;;;;;;OAMG;IACH,wBAAwB,CAAC,EAAC,eAAe,EAAE,SAAS,EAAC,EAJlD;QAAwD,eAAe,EAA/D,cAAc,kBAAkB,EAAE,OAAO,CACjD;QAA+B,SAAS,EAAhC,OAAO,GAAG,MAAM,CACxB;KAEkD,GAFxC,IAAI,CAShB;IAED;;;;OAIG;IACH,gBAAgB,CAAC,IAAI,EAHV,IAGU,GAFR,MAAM,CAsBlB;IAED;;;;OAIG;IACH,yBAAyB,CAAC,KAAK,EAHpB,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAGR,GAFlB,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAMzC;IAED;;;;OAIG;IACH,wBAAwB,CAAC,KAAK,EAHnB,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAGT,GAFjB,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CA6BzC;CACF"}
1
+ {"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../../src/routes/resolver.js"],"names":[],"mappings":"AAOA,OAAO,MAAM,MAAM,cAAc,CAAA;AAajC,MAAM,CAAC,OAAO,OAAO,uBAAuB;IAkBnC,aAAa;IAGb,MAAM;;;IAGN,OAAO;IACP,QAAQ;IAIR,kBAAkB;IA6BlB,wBAAwB;IAzD/B;;oCAEgC;IAChC,MAAM,EADI,MAAM,GAAG,SAAS,CACtB;IAEN;;;;;;OAMG;IACH,YAAY,EAAC,aAAa,EAAE,OAAO,EAAE,QAAQ,EAAC,EAJ3C;QAAoD,aAAa,EAAzD,OAAO,qBAAqB,EAAE,OAAO,CAC7C;QAAgI,OAAO,EAA/H,OAAO,kCAAkC,EAAE,OAAO,GAAG,OAAO,4CAA4C,EAAE,OAAO,CACzH;QAAkE,QAAQ,EAAlE,OAAO,mCAAmC,EAAE,OAAO,CAC7D;KAC6C,EAkB7C;IAED;;;OAGG;IACH,eAAe,IAFF,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAoBlC;IAEK,OAAO,kBAiLZ;IAED;;;;;OAKG;IACG,sBAAsB,CAAC,EAAC,cAAc,EAAC,EAH1C;QAAqB,cAAc,EAA3B,MAAM,CACd;KAE0C,GAFhC,OAAO,CAAC,cAAc,kBAAkB,EAAE,OAAO,CAAC,CAQ9D;IAED;;;;;OAKG;IACH,mBAAmB,CAAC,KAAK,EAJd,OAAO,iBAAiB,EAAE,OAIZ,EAAE,IAAI,EAHpB,MAGoB,GAFlB;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAC,GAAG,SAAS,CAiC1C;IAED;;;;;;OAMG;IACG,yBAAyB,CAAC,WAAW,EALhC,MAKgC,EAAE,OAAO,GAHjD;QAA0B,sBAAsB,AAAhD,CACA,EADQ,OAAO,CACf;KAEsD,GAF5C,OAAO,CAAC,OAAO,2BAA2B,EAAE,uBAAuB,GAAG,IAAI,CAAC,CAgEvF;IAED;;;;;;;OAOG;IACG,eAAe,CAAC,EAAC,MAAM,EAAE,eAAe,EAAE,SAAS,EAAC,EALvD;QAAqB,MAAM,EAAnB,MAAM,CACd;QAAwD,eAAe,EAA/D,cAAc,kBAAkB,EAAE,OAAO,CACjD;QAA+B,SAAS,EAAhC,OAAO,GAAG,MAAM,CACxB;KAEuD,GAF7C,OAAO,CAAC,IAAI,CAAC,CA0BzB;IAED;;;OAGG;IACH,UAAU,IAFG,OAAO,GAAG,MAAM,CAI5B;IAED;;;;;OAKG;IACG,kBAAkB,CAJX,CAAC,EAIW,QAAQ,EAHtB,MAAM,OAAO,CAAC,CAAC,CAGO,GAFpB,OAAO,CAAC,CAAC,CAAC,CAQtB;IAED;;;;;;OAMG;IACH,wBAAwB,CAAC,EAAC,eAAe,EAAE,SAAS,EAAC,EAJlD;QAAwD,eAAe,EAA/D,cAAc,kBAAkB,EAAE,OAAO,CACjD;QAA+B,SAAS,EAAhC,OAAO,GAAG,MAAM,CACxB;KAEkD,GAFxC,IAAI,CAShB;IAED;;;;OAIG;IACH,gBAAgB,CAAC,IAAI,EAHV,IAGU,GAFR,MAAM,CAsBlB;IAED;;;;OAIG;IACH,yBAAyB,CAAC,KAAK,EAHpB,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAGR,GAFlB,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAMzC;IAED;;;;OAIG;IACH,wBAAwB,CAAC,KAAK,EAHnB,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAGT,GAFjB,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CA6BzC;CACF"}