@harperfast/harper 5.2.0-alpha.4 → 5.2.0-alpha.6
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/agent/agent.ts +152 -10
- package/agent/bestPractices.ts +58 -0
- package/agent/mcpTools.ts +122 -0
- package/agent/operations.ts +10 -1
- package/agent/registryTools.ts +117 -0
- package/agent/session.ts +16 -7
- package/agent/tools/fsTools.ts +74 -27
- package/agent/tools/inspectorTool.ts +459 -0
- package/agent/toolset.ts +27 -7
- package/agent/types.ts +2 -0
- package/components/Application.ts +566 -85
- package/components/OptionsWatcher.ts +62 -2
- package/components/Scope.ts +31 -8
- package/components/componentLoader.ts +5 -1
- package/components/componentSecrets.ts +514 -55
- package/components/deploymentRecorder.ts +7 -6
- package/components/gitCredentialHelper.js +115 -0
- package/components/gitCredentialServer.ts +251 -0
- package/components/mcp/tools/application.ts +197 -23
- package/components/mcp/tools/operations.ts +1 -1
- package/components/mcp/tools/schemas/derive.ts +6 -2
- package/components/operations.js +21 -19
- package/components/operationsValidation.js +86 -21
- package/components/secretOperations.ts +110 -30
- package/config/harperConfigEnvVars.ts +90 -5
- package/config-root.schema.json +4 -0
- package/dist/agent/agent.d.ts +24 -3
- package/dist/agent/agent.js +172 -10
- package/dist/agent/agent.js.map +1 -1
- package/dist/agent/bestPractices.d.ts +24 -0
- package/dist/agent/bestPractices.js +60 -0
- package/dist/agent/bestPractices.js.map +1 -0
- package/dist/agent/mcpTools.d.ts +24 -0
- package/dist/agent/mcpTools.js +115 -0
- package/dist/agent/mcpTools.js.map +1 -0
- package/dist/agent/operations.js +10 -1
- package/dist/agent/operations.js.map +1 -1
- package/dist/agent/registryTools.d.ts +45 -0
- package/dist/agent/registryTools.js +113 -0
- package/dist/agent/registryTools.js.map +1 -0
- package/dist/agent/session.js +16 -7
- package/dist/agent/session.js.map +1 -1
- package/dist/agent/tools/fsTools.js +70 -28
- package/dist/agent/tools/fsTools.js.map +1 -1
- package/dist/agent/tools/inspectorTool.d.ts +40 -0
- package/dist/agent/tools/inspectorTool.js +428 -0
- package/dist/agent/tools/inspectorTool.js.map +1 -0
- package/dist/agent/toolset.d.ts +16 -6
- package/dist/agent/toolset.js +17 -7
- package/dist/agent/toolset.js.map +1 -1
- package/dist/agent/types.d.ts +2 -0
- package/dist/components/Application.d.ts +73 -18
- package/dist/components/Application.js +475 -64
- package/dist/components/Application.js.map +1 -1
- package/dist/components/OptionsWatcher.d.ts +1 -1
- package/dist/components/OptionsWatcher.js +65 -2
- package/dist/components/OptionsWatcher.js.map +1 -1
- package/dist/components/Scope.d.ts +8 -6
- package/dist/components/Scope.js +22 -6
- package/dist/components/Scope.js.map +1 -1
- package/dist/components/componentLoader.js +5 -1
- package/dist/components/componentLoader.js.map +1 -1
- package/dist/components/componentSecrets.d.ts +33 -7
- package/dist/components/componentSecrets.js +473 -59
- package/dist/components/componentSecrets.js.map +1 -1
- package/dist/components/deploymentRecorder.d.ts +2 -2
- package/dist/components/deploymentRecorder.js +1 -1
- package/dist/components/deploymentRecorder.js.map +1 -1
- package/dist/components/gitCredentialHelper.d.ts +1 -0
- package/dist/components/gitCredentialHelper.js +113 -0
- package/dist/components/gitCredentialHelper.js.map +1 -0
- package/dist/components/gitCredentialServer.d.ts +33 -0
- package/dist/components/gitCredentialServer.js +236 -0
- package/dist/components/gitCredentialServer.js.map +1 -0
- package/dist/components/mcp/tools/application.d.ts +19 -0
- package/dist/components/mcp/tools/application.js +180 -22
- package/dist/components/mcp/tools/application.js.map +1 -1
- package/dist/components/mcp/tools/operations.d.ts +13 -0
- package/dist/components/mcp/tools/operations.js +1 -0
- package/dist/components/mcp/tools/operations.js.map +1 -1
- package/dist/components/mcp/tools/schemas/derive.js +6 -2
- package/dist/components/mcp/tools/schemas/derive.js.map +1 -1
- package/dist/components/operations.js +23 -21
- package/dist/components/operations.js.map +1 -1
- package/dist/components/operationsValidation.js +84 -21
- package/dist/components/operationsValidation.js.map +1 -1
- package/dist/components/secretOperations.d.ts +33 -11
- package/dist/components/secretOperations.js +90 -26
- package/dist/components/secretOperations.js.map +1 -1
- package/dist/config/harperConfigEnvVars.d.ts +21 -0
- package/dist/config/harperConfigEnvVars.js +95 -5
- package/dist/config/harperConfigEnvVars.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.js +14 -1
- package/dist/index.js.map +1 -1
- package/dist/resources/Resource.d.ts +19 -0
- package/dist/resources/Resource.js +93 -2
- package/dist/resources/Resource.js.map +1 -1
- package/dist/resources/Table.d.ts +9 -0
- package/dist/resources/Table.js +256 -50
- package/dist/resources/Table.js.map +1 -1
- package/dist/resources/analytics/read.js +28 -25
- package/dist/resources/analytics/read.js.map +1 -1
- package/dist/resources/defineResource.d.ts +180 -0
- package/dist/resources/defineResource.js +505 -0
- package/dist/resources/defineResource.js.map +1 -0
- package/dist/resources/defineTable.d.ts +221 -0
- package/dist/resources/defineTable.js +227 -0
- package/dist/resources/defineTable.js.map +1 -0
- package/dist/resources/jsonSchemaTypes.d.ts +2 -0
- package/dist/resources/jsonSchemaTypes.js +12 -4
- package/dist/resources/jsonSchemaTypes.js.map +1 -1
- package/dist/resources/openApi.js +69 -13
- package/dist/resources/openApi.js.map +1 -1
- package/dist/resources/search.js +6 -8
- package/dist/resources/search.js.map +1 -1
- package/dist/server/graphqlQuerying.js +4 -2
- package/dist/server/graphqlQuerying.js.map +1 -1
- package/dist/server/http.d.ts +12 -0
- package/dist/server/http.js +35 -15
- package/dist/server/http.js.map +1 -1
- package/dist/server/serverHelpers/serverUtilities.js +8 -5
- package/dist/server/serverHelpers/serverUtilities.js.map +1 -1
- package/dist/server/serverHelpers/uwsServer.js +23 -0
- package/dist/server/serverHelpers/uwsServer.js.map +1 -1
- package/dist/utility/errors/hdbError.d.ts +21 -0
- package/dist/utility/errors/hdbError.js +23 -1
- package/dist/utility/errors/hdbError.js.map +1 -1
- package/dist/validation/configValidator.js +22 -6
- package/dist/validation/configValidator.js.map +1 -1
- package/index.ts +33 -0
- package/npm-shrinkwrap.json +9197 -15236
- package/package.json +5 -3
- package/resources/DESIGN.md +42 -15
- package/resources/Resource.ts +99 -2
- package/resources/Table.ts +275 -71
- package/resources/analytics/read.ts +30 -25
- package/resources/defineResource.ts +651 -0
- package/resources/defineTable.ts +407 -0
- package/resources/jsonSchemaTypes.ts +12 -4
- package/resources/openApi.ts +68 -16
- package/resources/search.ts +5 -8
- package/server/graphqlQuerying.ts +4 -2
- package/server/http.ts +40 -16
- package/server/serverHelpers/serverUtilities.ts +19 -6
- package/server/serverHelpers/uwsServer.ts +24 -0
- package/studio/web/assets/{Chat-D4FIaBu7.js → Chat-CTjtL8Z4.js} +2 -2
- package/studio/web/assets/{Chat-D4FIaBu7.js.map → Chat-CTjtL8Z4.js.map} +1 -1
- package/studio/web/assets/{FloatingChat-DGUC3L4r.js → FloatingChat-CafHR4Ur.js} +4 -4
- package/studio/web/assets/{FloatingChat-DGUC3L4r.js.map → FloatingChat-CafHR4Ur.js.map} +1 -1
- package/studio/web/assets/{applications-D8Am9ikM.js → applications-Buh_q0Vj.js} +2 -2
- package/studio/web/assets/{applications-D8Am9ikM.js.map → applications-Buh_q0Vj.js.map} +1 -1
- package/studio/web/assets/{index-HGL4WHdb.js → index-0hXeECkS.js} +6 -6
- package/studio/web/assets/{index-HGL4WHdb.js.map → index-0hXeECkS.js.map} +1 -1
- package/studio/web/assets/{index.lazy-Dk5j1AoQ.js → index.lazy-B00B7VBT.js} +4 -4
- package/studio/web/assets/{index.lazy-Dk5j1AoQ.js.map → index.lazy-B00B7VBT.js.map} +1 -1
- package/studio/web/assets/{profile-7bu_CF1f.js → profile-Cg2wwYPn.js} +2 -2
- package/studio/web/assets/{profile-7bu_CF1f.js.map → profile-Cg2wwYPn.js.map} +1 -1
- package/studio/web/assets/{setComponentFile-MfYm9F94.js → setComponentFile-DCaDIvyB.js} +2 -2
- package/studio/web/assets/{setComponentFile-MfYm9F94.js.map → setComponentFile-DCaDIvyB.js.map} +1 -1
- package/studio/web/assets/{setup-SKA4UhdE.js → setup-CAVcAQjK.js} +2 -2
- package/studio/web/assets/{setup-SKA4UhdE.js.map → setup-CAVcAQjK.js.map} +1 -1
- package/studio/web/assets/{status-DetVLUxR.js → status-BRXorNdD.js} +2 -2
- package/studio/web/assets/{status-DetVLUxR.js.map → status-BRXorNdD.js.map} +1 -1
- package/studio/web/assets/{swagger-ui-react-DLeYARY2.js → swagger-ui-react-Dy1D62vO.js} +2 -2
- package/studio/web/assets/{swagger-ui-react-DLeYARY2.js.map → swagger-ui-react-Dy1D62vO.js.map} +1 -1
- package/studio/web/assets/{tsMode-DGO-jIF7.js → tsMode-A8gbL74v.js} +2 -2
- package/studio/web/assets/{tsMode-DGO-jIF7.js.map → tsMode-A8gbL74v.js.map} +1 -1
- package/studio/web/assets/{useEntityRestURL-4M2i6bo4.js → useEntityRestURL-cDodrVcQ.js} +2 -2
- package/studio/web/assets/{useEntityRestURL-4M2i6bo4.js.map → useEntityRestURL-cDodrVcQ.js.map} +1 -1
- package/studio/web/index.html +1 -1
- package/utility/errors/hdbError.ts +32 -0
- package/validation/configValidator.ts +23 -6
|
@@ -0,0 +1,505 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* The per-method request contract: `defineResource(contract, impl)` (primary, function form) and
|
|
4
|
+
* `Resource.withSchema(contract)` (class form).
|
|
5
|
+
*
|
|
6
|
+
* A resource declares a contract as runtime VALUES — `{ path, record?, get?/post?/put?/patch?/delete?:
|
|
7
|
+
* { query?, body?, response? } }` — and TypeScript DERIVES the handler types from it (the same
|
|
8
|
+
* value-first bargain `--conditions=typestrip` forces, and that `defineTable` already lives).
|
|
9
|
+
*
|
|
10
|
+
* This is a SUBSET, not a fork. A handler
|
|
11
|
+
* receives the SAME `RequestTarget` it receives today, structurally NARROWED: `target.id` is a string
|
|
12
|
+
* when the path declares `:id`, `target.get('expand')` is typed by the declared query schema, and the
|
|
13
|
+
* built-in filter/sort/limit grammar stays reachable. The enforced resource is assignable wherever the
|
|
14
|
+
* untyped resource shape goes — it still registers and serves like a plain one.
|
|
15
|
+
*
|
|
16
|
+
* The narrowed types are JUSTIFIED by runtime enforcement: each declared verb is wrapped to
|
|
17
|
+
* validate/coerce `query`/`body` before dispatch and returns a structured 400 (`ValidationError`) on
|
|
18
|
+
* failure, so by the time a handler runs the narrowed types are true. Same bargain the DOM makes; same
|
|
19
|
+
* role `Table.validate` plays for tables.
|
|
20
|
+
*
|
|
21
|
+
* ONE vocabulary. The built-in `t`/`schemaOf` builders reduce to `JsonSchemaFragment`
|
|
22
|
+
* (`resources/jsonSchemaTypes.ts`) — the identical IR `defineTable`/GraphQL fields reduce to via
|
|
23
|
+
* `attributeToFragment` — so a single declaration feeds validation, OpenAPI, and MCP. A `defineTable`
|
|
24
|
+
* projection slots straight in: `schemaOf<(typeof Track)['$insert']>({ table: Track, projection:
|
|
25
|
+
* 'insert' })` derives both the compile-time type (from the projection) and the runtime fragment (from
|
|
26
|
+
* the table's attributes).
|
|
27
|
+
*/
|
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
exports.t = void 0;
|
|
30
|
+
exports.schemaOf = schemaOf;
|
|
31
|
+
exports.projectTableFragment = projectTableFragment;
|
|
32
|
+
exports.makeSchemaClass = makeSchemaClass;
|
|
33
|
+
exports.defineResource = defineResource;
|
|
34
|
+
const jsonSchemaTypes_ts_1 = require("./jsonSchemaTypes.js");
|
|
35
|
+
const hdbError_ts_1 = require("../utility/errors/hdbError.js");
|
|
36
|
+
function makeSchema(fragment, isOptional, passthrough = false) {
|
|
37
|
+
return {
|
|
38
|
+
_fragment: fragment,
|
|
39
|
+
_optional: isOptional,
|
|
40
|
+
_passthrough: passthrough,
|
|
41
|
+
get optional() {
|
|
42
|
+
return makeSchema(fragment, true, passthrough);
|
|
43
|
+
},
|
|
44
|
+
get nullable() {
|
|
45
|
+
// `nullable: true` on the fragment is what the validator checks; the TS type gains `| null`.
|
|
46
|
+
return makeSchema({ ...fragment, nullable: true }, isOptional, passthrough);
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
function internalOf(schema) {
|
|
51
|
+
return { fragment: schema?._fragment ?? {}, isOptional: !!schema?._optional, passthrough: !!schema?._passthrough };
|
|
52
|
+
}
|
|
53
|
+
function objectFragment(props) {
|
|
54
|
+
const properties = {};
|
|
55
|
+
const required = [];
|
|
56
|
+
for (const [key, schema] of Object.entries(props)) {
|
|
57
|
+
const internal = internalOf(schema);
|
|
58
|
+
properties[key] = internal.fragment;
|
|
59
|
+
if (!internal.isOptional)
|
|
60
|
+
required.push(key);
|
|
61
|
+
}
|
|
62
|
+
const fragment = { type: 'object', properties, additionalProperties: false };
|
|
63
|
+
if (required.length)
|
|
64
|
+
fragment.required = required;
|
|
65
|
+
return fragment;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* The zero-dependency built-in schema vocabulary for query params and bodies. Every builder reduces to
|
|
69
|
+
* a `JsonSchemaFragment`, so a contract's declarations feed validation + OpenAPI + MCP from one source.
|
|
70
|
+
*/
|
|
71
|
+
exports.t = {
|
|
72
|
+
string: makeSchema({ type: 'string' }, false),
|
|
73
|
+
number: makeSchema({ type: 'number' }, false),
|
|
74
|
+
integer: makeSchema({ type: 'integer' }, false),
|
|
75
|
+
boolean: makeSchema({ type: 'boolean' }, false),
|
|
76
|
+
/** ISO-8601 timestamp; validates as a string, coerced to `Date` in bodies. */
|
|
77
|
+
date: makeSchema({ type: 'string', format: 'date-time' }, false),
|
|
78
|
+
enum: (values) => makeSchema({ type: 'string', enum: values }, false),
|
|
79
|
+
array: (item) => makeSchema({ type: 'array', items: internalOf(item).fragment }, false),
|
|
80
|
+
object: (props) => makeSchema(objectFragment(props), false),
|
|
81
|
+
};
|
|
82
|
+
/** Type-only schema for an existing TS type — an interface, or a `defineTable` projection like `(typeof Track)['$insert']`. */
|
|
83
|
+
function schemaOf(source) {
|
|
84
|
+
if (source == null)
|
|
85
|
+
return makeSchema({}, false, true);
|
|
86
|
+
return makeSchema(resolveSourceFragment(source), false);
|
|
87
|
+
}
|
|
88
|
+
function isTableLike(value) {
|
|
89
|
+
return value && Array.isArray(value.attributes);
|
|
90
|
+
}
|
|
91
|
+
function resolveSourceFragment(source) {
|
|
92
|
+
if (isTableLike(source))
|
|
93
|
+
return projectTableFragment(source, 'record');
|
|
94
|
+
if (source.table && isTableLike(source.table)) {
|
|
95
|
+
const { table, projection } = source;
|
|
96
|
+
return projectTableFragment(table, projection ?? 'record');
|
|
97
|
+
}
|
|
98
|
+
return source;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Project a table handle's attributes into a JSON-Schema object fragment for the given projection.
|
|
102
|
+
* Reuses the shared `attributeToFragment` per field (NOT a parallel translator) and applies the same
|
|
103
|
+
* inclusion/required rules as `defineTable`'s type projections and the MCP `derive` schemas:
|
|
104
|
+
* • record — all scalar fields, readonly; server-managed/PK/required fields marked required
|
|
105
|
+
* • insert — writable fields, PK optional, server-managed excluded
|
|
106
|
+
* • upsert — writable fields, PK required
|
|
107
|
+
* • patch — writable non-PK fields, all optional
|
|
108
|
+
* • query — indexed fields only, all optional
|
|
109
|
+
* Relationship and computed attributes are excluded (they aren't client-writable and their fragment
|
|
110
|
+
* type is the related table name, not a JSON type).
|
|
111
|
+
*/
|
|
112
|
+
function projectTableFragment(table, projection) {
|
|
113
|
+
const attributes = table.attributes ?? [];
|
|
114
|
+
const properties = {};
|
|
115
|
+
const required = [];
|
|
116
|
+
for (const attr of attributes) {
|
|
117
|
+
const a = attr;
|
|
118
|
+
if (a.relationship || a.computed || a.computedFromExpression)
|
|
119
|
+
continue;
|
|
120
|
+
const serverManaged = a.assignCreatedTime || a.assignUpdatedTime || a.expiresAt;
|
|
121
|
+
const isPk = a.isPrimaryKey;
|
|
122
|
+
if (projection !== 'record' && projection !== 'query' && serverManaged)
|
|
123
|
+
continue; // never client-writable
|
|
124
|
+
if (projection === 'query' && !a.indexed)
|
|
125
|
+
continue;
|
|
126
|
+
if (projection === 'patch' && isPk)
|
|
127
|
+
continue;
|
|
128
|
+
const fieldFragment = (0, jsonSchemaTypes_ts_1.attributeToFragment)(attr);
|
|
129
|
+
// Mirror Table.validate's null policy so a table-derived contract body validates identically:
|
|
130
|
+
// a column rejects `null` only when `nullable === false` (a required column). Everything else
|
|
131
|
+
// (nullable columns, PK, server-managed) accepts an explicit null.
|
|
132
|
+
if (a.nullable !== false)
|
|
133
|
+
fieldFragment.nullable = true;
|
|
134
|
+
if (a.enum)
|
|
135
|
+
fieldFragment.enum = a.enum;
|
|
136
|
+
properties[attr.name] = fieldFragment;
|
|
137
|
+
switch (projection) {
|
|
138
|
+
case 'record':
|
|
139
|
+
if (a.nullable === false || serverManaged || isPk)
|
|
140
|
+
required.push(attr.name);
|
|
141
|
+
break;
|
|
142
|
+
case 'insert':
|
|
143
|
+
if (a.nullable === false && !isPk)
|
|
144
|
+
required.push(attr.name);
|
|
145
|
+
break;
|
|
146
|
+
case 'upsert':
|
|
147
|
+
if (a.nullable === false || isPk)
|
|
148
|
+
required.push(attr.name);
|
|
149
|
+
break;
|
|
150
|
+
// patch + query: everything optional
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
const fragment = { type: 'object', properties, additionalProperties: false };
|
|
154
|
+
if (required.length)
|
|
155
|
+
fragment.required = required;
|
|
156
|
+
return fragment;
|
|
157
|
+
}
|
|
158
|
+
const BODY_VERBS = new Set(['post', 'put', 'patch']);
|
|
159
|
+
const ALL_VERBS = ['get', 'post', 'put', 'patch', 'delete'];
|
|
160
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
161
|
+
// Runtime validation.
|
|
162
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
163
|
+
const JSON_TYPE_CHECK = {
|
|
164
|
+
string: (v) => typeof v === 'string',
|
|
165
|
+
integer: (v) => typeof v === 'number' && Number.isInteger(v),
|
|
166
|
+
number: (v) => typeof v === 'number' && !Number.isNaN(v),
|
|
167
|
+
boolean: (v) => typeof v === 'boolean',
|
|
168
|
+
object: (v) => v != null && typeof v === 'object' && !Array.isArray(v),
|
|
169
|
+
array: (v) => Array.isArray(v),
|
|
170
|
+
null: (v) => v === null,
|
|
171
|
+
};
|
|
172
|
+
/** A fragment accepts `null` only when explicitly `nullable` or its type union includes `'null'`. */
|
|
173
|
+
function isNullable(fragment) {
|
|
174
|
+
return fragment.nullable === true || (Array.isArray(fragment.type) && fragment.type.includes('null'));
|
|
175
|
+
}
|
|
176
|
+
/** Validate a JSON value against a fragment (a subset of JSON Schema), pushing structured issues. Returns coerced value. */
|
|
177
|
+
function validateValue(value, fragment, path, issues) {
|
|
178
|
+
if (!fragment || fragment.type == null)
|
|
179
|
+
return value; // passthrough / untyped
|
|
180
|
+
if (value === undefined)
|
|
181
|
+
return value; // absence is enforced by the parent object's `required`
|
|
182
|
+
if (value === null) {
|
|
183
|
+
// Non-nullable is the default; only `.nullable` (fragment.nullable) or a `null` type accepts null.
|
|
184
|
+
if (!isNullable(fragment))
|
|
185
|
+
issues.push({ path, code: 'nullable', message: `${path} may not be null` });
|
|
186
|
+
return value;
|
|
187
|
+
}
|
|
188
|
+
const types = Array.isArray(fragment.type) ? fragment.type : [fragment.type];
|
|
189
|
+
const primary = types[0];
|
|
190
|
+
// Body dates arrive as ISO strings; coerce to Date when the schema calls for a date-time.
|
|
191
|
+
if (primary === 'string' && fragment.format === 'date-time' && typeof value === 'string') {
|
|
192
|
+
const d = new Date(value);
|
|
193
|
+
if (Number.isNaN(d.getTime())) {
|
|
194
|
+
issues.push({ path, code: 'format', message: `${path} must be an ISO-8601 date-time` });
|
|
195
|
+
return value;
|
|
196
|
+
}
|
|
197
|
+
value = d;
|
|
198
|
+
}
|
|
199
|
+
// A Date is a valid value ONLY for a `string`/`date-time` field (we coerced an ISO string above);
|
|
200
|
+
// it must not slip past the type check for a number/boolean/array/object schema.
|
|
201
|
+
const matches = types.some((ty) => {
|
|
202
|
+
if (ty === 'string' && fragment.format === 'date-time' && value instanceof Date)
|
|
203
|
+
return true;
|
|
204
|
+
return JSON_TYPE_CHECK[ty]?.(value) ?? true;
|
|
205
|
+
});
|
|
206
|
+
if (!matches) {
|
|
207
|
+
issues.push({ path, code: 'type', message: `${path} must be of type ${types.join(' | ')}` });
|
|
208
|
+
return value;
|
|
209
|
+
}
|
|
210
|
+
if (fragment.enum && !fragment.enum.includes(value)) {
|
|
211
|
+
issues.push({ path, code: 'enum', message: `${path} must be one of: ${fragment.enum.join(', ')}` });
|
|
212
|
+
return value;
|
|
213
|
+
}
|
|
214
|
+
if (primary === 'array' && fragment.items && Array.isArray(value)) {
|
|
215
|
+
return value.map((el, i) => validateValue(el, fragment.items, `${path}[${i}]`, issues));
|
|
216
|
+
}
|
|
217
|
+
if (primary === 'object' && fragment.properties && value && typeof value === 'object') {
|
|
218
|
+
return validateObject(value, fragment, path, issues);
|
|
219
|
+
}
|
|
220
|
+
return value;
|
|
221
|
+
}
|
|
222
|
+
function validateObject(value, fragment, path, issues) {
|
|
223
|
+
const props = fragment.properties ?? {};
|
|
224
|
+
const scope = path ? `${path}.` : '';
|
|
225
|
+
for (const key of fragment.required ?? []) {
|
|
226
|
+
// `required` is about presence; an explicit `null` is present (and rejected by the per-property
|
|
227
|
+
// nullable check below unless the field is nullable).
|
|
228
|
+
if (value[key] === undefined)
|
|
229
|
+
issues.push({ path: `${scope}${key}`, code: 'required', message: `${scope}${key} is required` });
|
|
230
|
+
}
|
|
231
|
+
for (const [key, sub] of Object.entries(props)) {
|
|
232
|
+
if (value[key] !== undefined) {
|
|
233
|
+
const coerced = validateValue(value[key], sub, `${scope}${key}`, issues);
|
|
234
|
+
if (coerced !== value[key])
|
|
235
|
+
value[key] = coerced;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
if (fragment.additionalProperties === false) {
|
|
239
|
+
for (const key of Object.keys(value)) {
|
|
240
|
+
if (!(key in props))
|
|
241
|
+
issues.push({
|
|
242
|
+
path: `${scope}${key}`,
|
|
243
|
+
code: 'unknown_property',
|
|
244
|
+
message: `${scope}${key} is not an allowed property`,
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
return value;
|
|
249
|
+
}
|
|
250
|
+
/** Validate/coerce a request body against a fragment. Returns the (possibly coerced) body. */
|
|
251
|
+
function validateBody(fragment, body, issues) {
|
|
252
|
+
if (!fragment || fragment.type == null)
|
|
253
|
+
return body;
|
|
254
|
+
if (body === undefined) {
|
|
255
|
+
// a missing body fails each declared required field
|
|
256
|
+
for (const key of fragment.required ?? [])
|
|
257
|
+
issues.push({ path: `body.${key}`, code: 'required', message: `body.${key} is required` });
|
|
258
|
+
return body;
|
|
259
|
+
}
|
|
260
|
+
// a `null` body is rejected unless the top-level body schema is nullable (validateValue handles it)
|
|
261
|
+
return validateValue(body, fragment, 'body', issues);
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Read the declared query params off the target (a URLSearchParams), validate/coerce them, and install
|
|
265
|
+
* a coercing `.get` so a handler reads the typed values (`target.get('expand')` → the coerced array),
|
|
266
|
+
* while undeclared keys still return the raw `string | null`. Pushes structured issues for
|
|
267
|
+
* required-missing / bad-enum / bad-type params.
|
|
268
|
+
*/
|
|
269
|
+
function coerceAndValidateQuery(fragment, target, issues) {
|
|
270
|
+
const props = fragment.properties ?? {};
|
|
271
|
+
const required = new Set(fragment.required ?? []);
|
|
272
|
+
const coerced = Object.create(null);
|
|
273
|
+
const rawGet = URLSearchParams.prototype.get;
|
|
274
|
+
const rawGetAll = URLSearchParams.prototype.getAll;
|
|
275
|
+
for (const [key, sub] of Object.entries(props)) {
|
|
276
|
+
const subType = Array.isArray(sub.type) ? sub.type[0] : sub.type;
|
|
277
|
+
const present = URLSearchParams.prototype.has.call(target, key);
|
|
278
|
+
if (!present) {
|
|
279
|
+
if (required.has(key))
|
|
280
|
+
issues.push({ path: `query.${key}`, code: 'required', message: `query.${key} is required` });
|
|
281
|
+
coerced[key] = undefined;
|
|
282
|
+
continue;
|
|
283
|
+
}
|
|
284
|
+
if (subType === 'array') {
|
|
285
|
+
const raw = rawGetAll.call(target, key);
|
|
286
|
+
coerced[key] = raw.map((el, i) => coerceScalar(el, sub.items, `query.${key}[${i}]`, issues));
|
|
287
|
+
}
|
|
288
|
+
else {
|
|
289
|
+
coerced[key] = coerceScalar(rawGet.call(target, key), sub, `query.${key}`, issues);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
Object.defineProperty(target, 'get', {
|
|
293
|
+
configurable: true,
|
|
294
|
+
writable: true,
|
|
295
|
+
value: function (name) {
|
|
296
|
+
return name in coerced ? coerced[name] : rawGet.call(this, name);
|
|
297
|
+
},
|
|
298
|
+
});
|
|
299
|
+
// Keep `getAll` consistent with the coercing `get`: a declared key returns its coerced value as an
|
|
300
|
+
// array (arrays pass through; a scalar is wrapped, undefined → []); undeclared keys read raw.
|
|
301
|
+
Object.defineProperty(target, 'getAll', {
|
|
302
|
+
configurable: true,
|
|
303
|
+
writable: true,
|
|
304
|
+
value: function (name) {
|
|
305
|
+
if (name in coerced) {
|
|
306
|
+
const val = coerced[name];
|
|
307
|
+
return Array.isArray(val) ? val : val === undefined ? [] : [val];
|
|
308
|
+
}
|
|
309
|
+
return rawGetAll.call(this, name);
|
|
310
|
+
},
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
/** Coerce a single query string to the fragment's scalar type and validate enum membership. */
|
|
314
|
+
function coerceScalar(raw, fragment, path, issues) {
|
|
315
|
+
if (!fragment)
|
|
316
|
+
return raw;
|
|
317
|
+
const type = Array.isArray(fragment.type) ? fragment.type[0] : fragment.type;
|
|
318
|
+
let value = raw;
|
|
319
|
+
if (type === 'integer' || type === 'number') {
|
|
320
|
+
// `Number('')`/`Number(' ')` are 0 — treat an empty/whitespace param as a type error, not a silent 0.
|
|
321
|
+
if (raw == null || raw.trim() === '') {
|
|
322
|
+
issues.push({ path, code: 'type', message: `${path} must be ${type === 'integer' ? 'an integer' : 'a number'}` });
|
|
323
|
+
return raw;
|
|
324
|
+
}
|
|
325
|
+
value = Number(raw);
|
|
326
|
+
if (Number.isNaN(value) || (type === 'integer' && !Number.isInteger(value))) {
|
|
327
|
+
issues.push({ path, code: 'type', message: `${path} must be ${type === 'integer' ? 'an integer' : 'a number'}` });
|
|
328
|
+
return raw;
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
else if (type === 'boolean') {
|
|
332
|
+
if (raw === 'true')
|
|
333
|
+
value = true;
|
|
334
|
+
else if (raw === 'false')
|
|
335
|
+
value = false;
|
|
336
|
+
else {
|
|
337
|
+
issues.push({ path, code: 'type', message: `${path} must be a boolean` });
|
|
338
|
+
return raw;
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
else if (type === 'string' && fragment.format === 'date-time') {
|
|
342
|
+
const d = new Date(raw);
|
|
343
|
+
if (Number.isNaN(d.getTime())) {
|
|
344
|
+
issues.push({ path, code: 'format', message: `${path} must be an ISO-8601 date-time` });
|
|
345
|
+
return raw;
|
|
346
|
+
}
|
|
347
|
+
value = d;
|
|
348
|
+
}
|
|
349
|
+
if (fragment.enum && !fragment.enum.includes(value)) {
|
|
350
|
+
issues.push({ path, code: 'enum', message: `${path} must be one of: ${fragment.enum.join(', ')}` });
|
|
351
|
+
}
|
|
352
|
+
return value;
|
|
353
|
+
}
|
|
354
|
+
function compileVerb(contract, verb) {
|
|
355
|
+
const vs = contract[verb];
|
|
356
|
+
const queryFragment = vs?.query ? objectFragment(vs.query) : undefined;
|
|
357
|
+
let bodyFragment;
|
|
358
|
+
if (BODY_VERBS.has(verb)) {
|
|
359
|
+
const bodySchema = vs?.body ?? (verb === 'put' ? contract.record : undefined);
|
|
360
|
+
if (bodySchema) {
|
|
361
|
+
const internal = internalOf(bodySchema);
|
|
362
|
+
if (!internal.passthrough)
|
|
363
|
+
bodyFragment = internal.fragment;
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
return { queryFragment, bodyFragment, hasBody: BODY_VERBS.has(verb) };
|
|
367
|
+
}
|
|
368
|
+
/** Build the `{ verb: { query?, body? } }` map for OpenAPI/MCP. */
|
|
369
|
+
function buildInputSchemas(contract) {
|
|
370
|
+
const inputSchemas = {};
|
|
371
|
+
for (const verb of ALL_VERBS) {
|
|
372
|
+
if (!contract[verb])
|
|
373
|
+
continue;
|
|
374
|
+
const { queryFragment, bodyFragment } = compileVerb(contract, verb);
|
|
375
|
+
const entry = {};
|
|
376
|
+
if (queryFragment)
|
|
377
|
+
entry.query = queryFragment;
|
|
378
|
+
if (bodyFragment)
|
|
379
|
+
entry.body = bodyFragment;
|
|
380
|
+
inputSchemas[verb] = entry;
|
|
381
|
+
}
|
|
382
|
+
return inputSchemas;
|
|
383
|
+
}
|
|
384
|
+
/** Build the `{ verb: responseFragment }` map (get/delete default to the record). */
|
|
385
|
+
function buildOutputSchemas(contract) {
|
|
386
|
+
const outputSchemas = {};
|
|
387
|
+
const recordFragment = contract.record ? unwrapFragment(contract.record) : undefined;
|
|
388
|
+
for (const verb of ALL_VERBS) {
|
|
389
|
+
const vs = contract[verb];
|
|
390
|
+
if (!vs)
|
|
391
|
+
continue;
|
|
392
|
+
const responseFragment = vs.response ? unwrapFragment(vs.response) : verb === 'get' ? recordFragment : undefined;
|
|
393
|
+
if (responseFragment)
|
|
394
|
+
outputSchemas[verb] = responseFragment;
|
|
395
|
+
}
|
|
396
|
+
return outputSchemas;
|
|
397
|
+
}
|
|
398
|
+
function unwrapFragment(schema) {
|
|
399
|
+
const internal = internalOf(schema);
|
|
400
|
+
return internal.passthrough ? undefined : internal.fragment;
|
|
401
|
+
}
|
|
402
|
+
/** Attach the contract metadata to a resource carrier (class or plain object). */
|
|
403
|
+
function applyContractMetadata(carrier, contract) {
|
|
404
|
+
carrier.path = contract.path;
|
|
405
|
+
carrier.requestContract = contract;
|
|
406
|
+
carrier.inputSchemas = buildInputSchemas(contract);
|
|
407
|
+
const outputSchemas = buildOutputSchemas(contract);
|
|
408
|
+
if (Object.keys(outputSchemas).length)
|
|
409
|
+
carrier.outputSchemas = { ...carrier.outputSchemas, ...outputSchemas };
|
|
410
|
+
if (contract.record) {
|
|
411
|
+
const recordFragment = unwrapFragment(contract.record);
|
|
412
|
+
if (recordFragment?.properties)
|
|
413
|
+
carrier.properties = { ...carrier.properties, ...recordFragment.properties };
|
|
414
|
+
}
|
|
415
|
+
if (contract.description && !carrier.description)
|
|
416
|
+
carrier.description = contract.description;
|
|
417
|
+
}
|
|
418
|
+
/**
|
|
419
|
+
* Wrap a verb entry so `query`/`body` are validated/coerced before dispatch, returning a structured
|
|
420
|
+
* 400 (`ValidationError`) on failure. Only acts on the HTTP shape (first arg is a `URLSearchParams` /
|
|
421
|
+
* `RequestTarget`); a programmatic `.post(record)` call passes through untouched to `original`.
|
|
422
|
+
*/
|
|
423
|
+
function wrapStaticVerb(original, compiled) {
|
|
424
|
+
const { queryFragment, bodyFragment, hasBody } = compiled;
|
|
425
|
+
return function (target, ...rest) {
|
|
426
|
+
if (target instanceof URLSearchParams) {
|
|
427
|
+
const issues = [];
|
|
428
|
+
if (queryFragment)
|
|
429
|
+
coerceAndValidateQuery(queryFragment, target, issues);
|
|
430
|
+
if (hasBody && bodyFragment)
|
|
431
|
+
rest[0] = validateBody(bodyFragment, rest[0], issues);
|
|
432
|
+
if (issues.length)
|
|
433
|
+
throw new hdbError_ts_1.ValidationError(issues);
|
|
434
|
+
}
|
|
435
|
+
return original.call(this, target, ...rest);
|
|
436
|
+
};
|
|
437
|
+
}
|
|
438
|
+
/** Install validating overrides for every declared verb onto a class's static verb entries. */
|
|
439
|
+
function installStaticVerbValidators(cls, contract) {
|
|
440
|
+
for (const verb of ALL_VERBS) {
|
|
441
|
+
if (!contract[verb])
|
|
442
|
+
continue;
|
|
443
|
+
const original = cls[verb];
|
|
444
|
+
if (typeof original !== 'function')
|
|
445
|
+
continue;
|
|
446
|
+
Object.defineProperty(cls, verb, {
|
|
447
|
+
configurable: true,
|
|
448
|
+
writable: true,
|
|
449
|
+
value: wrapStaticVerb(original, compileVerb(contract, verb)),
|
|
450
|
+
});
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
/**
|
|
454
|
+
* Build a Resource subclass carrying `contract` — its static verb entries validate before dispatch and
|
|
455
|
+
* its static metadata slots (`path`, `requestContract`, `inputSchemas`, `outputSchemas`, `properties`)
|
|
456
|
+
* feed OpenAPI/MCP. Wired as `Resource.withSchema` (see `Resource.ts`).
|
|
457
|
+
*/
|
|
458
|
+
function makeSchemaClass(BaseClass, contract) {
|
|
459
|
+
const Enforced = class extends BaseClass {
|
|
460
|
+
};
|
|
461
|
+
// The narrowed handler types (and the function form) use the converged `(target, data)` arg
|
|
462
|
+
// order. Harper's dispatch only calls instance verbs that way when `loadAsInstance === false`
|
|
463
|
+
// (the default, undefined, gives the legacy `(data, target)`), so pin it — withSchema is for custom
|
|
464
|
+
// resources, which handle their own loading. Without this the class-form types would lie about the
|
|
465
|
+
// arg order (Resource.post/put/patch dispatch, Resource.ts).
|
|
466
|
+
Enforced.loadAsInstance = false;
|
|
467
|
+
applyContractMetadata(Enforced, contract);
|
|
468
|
+
installStaticVerbValidators(Enforced, contract);
|
|
469
|
+
return Enforced;
|
|
470
|
+
}
|
|
471
|
+
/**
|
|
472
|
+
* Function-form twin of `withSchema`: wrap an object literal of verb handlers with the contract. Every
|
|
473
|
+
* declared verb is required of `impl` (a missing/misspelled verb is a type error) and undeclared extras
|
|
474
|
+
* on an inline literal are rejected. Returns a plain resource object (drop-in wherever the untyped shape
|
|
475
|
+
* goes) whose verbs validate/coerce before running the handler.
|
|
476
|
+
*/
|
|
477
|
+
function defineResource(contract, impl) {
|
|
478
|
+
if (impl.path != null && impl.path !== contract.path) {
|
|
479
|
+
throw new Error(`defineResource: impl.path (${impl.path}) does not match contract.path (${contract.path})`);
|
|
480
|
+
}
|
|
481
|
+
const resource = {};
|
|
482
|
+
// A synthetic prototype mirroring the verb methods: OpenAPI (`prototype.post !== Resource.prototype
|
|
483
|
+
// .post`, `typeof prototype.put === 'function'`) and MCP (`detectVerbs` reads the prototype) key
|
|
484
|
+
// verb presence off `.prototype`. A bare object has none, so without this a function-form resource
|
|
485
|
+
// is invisible to MCP and crashes OpenAPI's non-parameterised loop at `prototype.post`. REST still
|
|
486
|
+
// dispatches the own methods; this only advertises which verbs exist.
|
|
487
|
+
const prototype = {};
|
|
488
|
+
// carry any non-verb members of a pre-existing impl object through unchanged
|
|
489
|
+
for (const key of Object.keys(impl)) {
|
|
490
|
+
if (!ALL_VERBS.includes(key))
|
|
491
|
+
resource[key] = impl[key];
|
|
492
|
+
}
|
|
493
|
+
for (const verb of ALL_VERBS) {
|
|
494
|
+
const handler = impl[verb];
|
|
495
|
+
if (typeof handler !== 'function')
|
|
496
|
+
continue;
|
|
497
|
+
const wrapped = contract[verb] ? wrapStaticVerb(handler, compileVerb(contract, verb)) : handler; // undeclared-but-present verb: pass through unvalidated
|
|
498
|
+
resource[verb] = wrapped;
|
|
499
|
+
prototype[verb] = wrapped;
|
|
500
|
+
}
|
|
501
|
+
resource.prototype = prototype;
|
|
502
|
+
applyContractMetadata(resource, contract);
|
|
503
|
+
return resource;
|
|
504
|
+
}
|
|
505
|
+
//# sourceMappingURL=defineResource.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defineResource.js","sourceRoot":"","sources":["../../resources/defineResource.ts"],"names":[],"mappings":"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"}
|