@ocpptools/builder 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/NOTICE +19 -0
- package/README.md +171 -2
- package/dist/errors.d.ts +18 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +73 -0
- package/dist/errors.js.map +1 -0
- package/dist/fields.d.ts +5 -0
- package/dist/fields.d.ts.map +1 -0
- package/dist/fields.js +26 -0
- package/dist/fields.js.map +1 -0
- package/dist/frame.d.ts +11 -0
- package/dist/frame.d.ts.map +1 -0
- package/dist/frame.js +100 -0
- package/dist/frame.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +207 -0
- package/dist/index.js.map +1 -0
- package/dist/json.d.ts +9 -0
- package/dist/json.d.ts.map +1 -0
- package/dist/json.js +98 -0
- package/dist/json.js.map +1 -0
- package/dist/payload.d.ts +7 -0
- package/dist/payload.d.ts.map +1 -0
- package/dist/payload.js +322 -0
- package/dist/payload.js.map +1 -0
- package/dist/schema.d.ts +18 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +119 -0
- package/dist/schema.js.map +1 -0
- package/dist/types.d.ts +87 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +4 -0
- package/dist/types.js.map +1 -0
- package/dist/version.d.ts +12 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +26 -0
- package/dist/version.js.map +1 -0
- package/package.json +55 -3
package/dist/payload.js
ADDED
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// SPDX-FileCopyrightText: 2026 Rodolfo Carrillo
|
|
3
|
+
import { applyDefaults, createEmptyPayload } from '@ocpptools/schema-utils';
|
|
4
|
+
import { issue, limitExceeded, messageOf, warning } from './errors.js';
|
|
5
|
+
import { cloneJson } from './json.js';
|
|
6
|
+
const DEFAULT_LIMITS = { maxDepth: 64, maxNodes: 10_000 };
|
|
7
|
+
function isRecord(value) {
|
|
8
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
9
|
+
}
|
|
10
|
+
function hasOwn(value, key) {
|
|
11
|
+
return Object.hasOwn(value, key);
|
|
12
|
+
}
|
|
13
|
+
function asSchema(value) {
|
|
14
|
+
return value;
|
|
15
|
+
}
|
|
16
|
+
function allowsObjectRoot(schema) {
|
|
17
|
+
if (schema === true)
|
|
18
|
+
return true;
|
|
19
|
+
if (schema === false)
|
|
20
|
+
return false;
|
|
21
|
+
const type = schema.type;
|
|
22
|
+
if (type !== undefined) {
|
|
23
|
+
const types = Array.isArray(type) ? type : [type];
|
|
24
|
+
if (!types.includes('object'))
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
if (hasOwn(schema, 'const') && !isRecord(schema.const))
|
|
28
|
+
return false;
|
|
29
|
+
if (Array.isArray(schema.enum) && !schema.enum.some((entry) => isRecord(entry)))
|
|
30
|
+
return false;
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
function matchesType(value, type) {
|
|
34
|
+
switch (type) {
|
|
35
|
+
case 'null':
|
|
36
|
+
return value === null;
|
|
37
|
+
case 'boolean':
|
|
38
|
+
return typeof value === 'boolean';
|
|
39
|
+
case 'string':
|
|
40
|
+
return typeof value === 'string';
|
|
41
|
+
case 'number':
|
|
42
|
+
return typeof value === 'number' && Number.isFinite(value);
|
|
43
|
+
case 'integer':
|
|
44
|
+
return typeof value === 'number' && Number.isInteger(value);
|
|
45
|
+
case 'array':
|
|
46
|
+
return Array.isArray(value);
|
|
47
|
+
case 'object':
|
|
48
|
+
return isRecord(value);
|
|
49
|
+
default:
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
function jsonEqual(left, right) {
|
|
54
|
+
if (left === right)
|
|
55
|
+
return true;
|
|
56
|
+
if (Array.isArray(left) && Array.isArray(right)) {
|
|
57
|
+
return (left.length === right.length && left.every((entry, index) => jsonEqual(entry, right[index])));
|
|
58
|
+
}
|
|
59
|
+
if (isRecord(left) && isRecord(right)) {
|
|
60
|
+
const leftKeys = Object.keys(left);
|
|
61
|
+
const rightKeys = Object.keys(right);
|
|
62
|
+
return (leftKeys.length === rightKeys.length &&
|
|
63
|
+
leftKeys.every((key) => hasOwn(right, key) && jsonEqual(left[key], right[key])));
|
|
64
|
+
}
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
function error(code, path, message, expected, received) {
|
|
68
|
+
return issue('payload', code, path, message, expected, received);
|
|
69
|
+
}
|
|
70
|
+
function checkValue(schema, value, path, depth, state) {
|
|
71
|
+
state.nodes += 1;
|
|
72
|
+
if (state.nodes > state.limits.maxNodes) {
|
|
73
|
+
return limitExceeded(path, 'The payload exceeds the configured node limit');
|
|
74
|
+
}
|
|
75
|
+
if (depth > state.limits.maxDepth) {
|
|
76
|
+
return limitExceeded(path, 'The payload exceeds the configured depth limit');
|
|
77
|
+
}
|
|
78
|
+
if (schema === true)
|
|
79
|
+
return undefined;
|
|
80
|
+
if (schema === false) {
|
|
81
|
+
return error('invalid-payload', path, 'The schema does not allow a value');
|
|
82
|
+
}
|
|
83
|
+
if (!isRecord(schema)) {
|
|
84
|
+
return issue('schema', 'schema-invalid', path, 'The schema is not a JSON Schema');
|
|
85
|
+
}
|
|
86
|
+
if (Array.isArray(schema.allOf) ||
|
|
87
|
+
Array.isArray(schema.anyOf) ||
|
|
88
|
+
Array.isArray(schema.oneOf) ||
|
|
89
|
+
schema.not !== undefined) {
|
|
90
|
+
state.warnings.push(warning('payload', 'unsupported-keyword', path, 'Composition keywords are not checked by the builder; use @ocpptools/validator'));
|
|
91
|
+
}
|
|
92
|
+
const type = schema.type;
|
|
93
|
+
if (type !== undefined) {
|
|
94
|
+
const types = Array.isArray(type)
|
|
95
|
+
? type
|
|
96
|
+
: [type];
|
|
97
|
+
if (types.length === 0 || !types.some((entry) => matchesType(value, entry))) {
|
|
98
|
+
return error('invalid-type', path, `The value must be ${types.join(' or ')}`, types.join(' or '), value);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
if (Array.isArray(schema.enum)) {
|
|
102
|
+
if (schema.enum.length === 0 || !schema.enum.some((entry) => jsonEqual(entry, value))) {
|
|
103
|
+
return error('invalid-enum', path, 'The value is not one of the allowed enum values', 'an enum value', value);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
if (hasOwn(schema, 'const') && !jsonEqual(schema.const, value)) {
|
|
107
|
+
return error('invalid-enum', path, 'The value does not match the const value', 'the const value', value);
|
|
108
|
+
}
|
|
109
|
+
if (isRecord(value)) {
|
|
110
|
+
const required = schema.required;
|
|
111
|
+
if (Array.isArray(required)) {
|
|
112
|
+
for (const name of required) {
|
|
113
|
+
if (typeof name === 'string' && !hasOwn(value, name)) {
|
|
114
|
+
return error('missing-required', [...path, name], `Missing required property ${name}`, 'present', 'missing');
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
const properties = schema.properties;
|
|
119
|
+
if (isRecord(properties)) {
|
|
120
|
+
for (const [name, child] of Object.entries(properties)) {
|
|
121
|
+
if (!hasOwn(value, name))
|
|
122
|
+
continue;
|
|
123
|
+
const childIssue = checkValue(asSchema(child), value[name], [...path, name], depth + 1, state);
|
|
124
|
+
if (childIssue !== undefined)
|
|
125
|
+
return childIssue;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
const minProperties = schema['minProperties'];
|
|
129
|
+
if (typeof minProperties === 'number' && Object.keys(value).length < minProperties) {
|
|
130
|
+
return error('out-of-range', path, `At least ${String(minProperties)} properties are required`);
|
|
131
|
+
}
|
|
132
|
+
const maxProperties = schema['maxProperties'];
|
|
133
|
+
if (typeof maxProperties === 'number' && Object.keys(value).length > maxProperties) {
|
|
134
|
+
return error('out-of-range', path, `At most ${String(maxProperties)} properties are allowed`);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
if (Array.isArray(value)) {
|
|
138
|
+
const minItems = schema.minItems;
|
|
139
|
+
if (typeof minItems === 'number' && value.length < minItems) {
|
|
140
|
+
return error('out-of-range', path, `At least ${String(minItems)} items are required`);
|
|
141
|
+
}
|
|
142
|
+
const maxItems = schema.maxItems;
|
|
143
|
+
if (typeof maxItems === 'number' && value.length > maxItems) {
|
|
144
|
+
return error('out-of-range', path, `At most ${String(maxItems)} items are allowed`);
|
|
145
|
+
}
|
|
146
|
+
const items = schema.items;
|
|
147
|
+
if (Array.isArray(items)) {
|
|
148
|
+
for (let index = 0; index < Math.min(items.length, value.length); index += 1) {
|
|
149
|
+
const childIssue = checkValue(items[index], value[index], [...path, index], depth + 1, state);
|
|
150
|
+
if (childIssue !== undefined)
|
|
151
|
+
return childIssue;
|
|
152
|
+
}
|
|
153
|
+
if (value.length > items.length) {
|
|
154
|
+
if (schema.additionalItems === false) {
|
|
155
|
+
return error('invalid-payload', [...path, items.length], 'Additional array items are not allowed');
|
|
156
|
+
}
|
|
157
|
+
if (schema.additionalItems !== undefined && schema.additionalItems !== true) {
|
|
158
|
+
for (let index = items.length; index < value.length; index += 1) {
|
|
159
|
+
const childIssue = checkValue(schema.additionalItems, value[index], [...path, index], depth + 1, state);
|
|
160
|
+
if (childIssue !== undefined)
|
|
161
|
+
return childIssue;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
else if (items !== undefined) {
|
|
167
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
168
|
+
const childIssue = checkValue(items, value[index], [...path, index], depth + 1, state);
|
|
169
|
+
if (childIssue !== undefined)
|
|
170
|
+
return childIssue;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
if (schema.uniqueItems === true) {
|
|
174
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
175
|
+
for (let other = index + 1; other < value.length; other += 1) {
|
|
176
|
+
if (jsonEqual(value[index], value[other])) {
|
|
177
|
+
return error('invalid-payload', [...path, other], 'Array items must be unique', 'unique items', value[other]);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
if (typeof value === 'string') {
|
|
184
|
+
const length = Array.from(value).length;
|
|
185
|
+
if (typeof schema.minLength === 'number' && length < schema.minLength) {
|
|
186
|
+
return error('too-short', path, `The string must have at least ${String(schema.minLength)} characters`);
|
|
187
|
+
}
|
|
188
|
+
if (typeof schema.maxLength === 'number' && length > schema.maxLength) {
|
|
189
|
+
return error('too-long', path, `The string must have at most ${String(schema.maxLength)} characters`);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
if (typeof value === 'number') {
|
|
193
|
+
if (typeof schema.minimum === 'number' && value < schema.minimum) {
|
|
194
|
+
return error('out-of-range', path, `The value must be at least ${String(schema.minimum)}`);
|
|
195
|
+
}
|
|
196
|
+
if (typeof schema.maximum === 'number' && value > schema.maximum) {
|
|
197
|
+
return error('out-of-range', path, `The value must be at most ${String(schema.maximum)}`);
|
|
198
|
+
}
|
|
199
|
+
if (typeof schema.exclusiveMinimum === 'number' && value <= schema.exclusiveMinimum) {
|
|
200
|
+
return error('out-of-range', path, `The value must be greater than ${String(schema.exclusiveMinimum)}`);
|
|
201
|
+
}
|
|
202
|
+
if (typeof schema.exclusiveMaximum === 'number' && value >= schema.exclusiveMaximum) {
|
|
203
|
+
return error('out-of-range', path, `The value must be less than ${String(schema.exclusiveMaximum)}`);
|
|
204
|
+
}
|
|
205
|
+
if (typeof schema.multipleOf === 'number' && schema.multipleOf > 0) {
|
|
206
|
+
const quotient = value / schema.multipleOf;
|
|
207
|
+
if (Math.abs(quotient - Math.round(quotient)) > 1e-9) {
|
|
208
|
+
return error('out-of-range', path, `The value must be a multiple of ${String(schema.multipleOf)}`);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
return undefined;
|
|
213
|
+
}
|
|
214
|
+
function checkJsonObject(value, limits) {
|
|
215
|
+
const cloned = cloneJson(value, limits);
|
|
216
|
+
if (!cloned.ok)
|
|
217
|
+
return { ok: false, error: cloned.error, warnings: [] };
|
|
218
|
+
if (!isRecord(cloned.value)) {
|
|
219
|
+
return {
|
|
220
|
+
ok: false,
|
|
221
|
+
error: error('invalid-payload', [], 'The payload must be a JSON object', 'object', value),
|
|
222
|
+
warnings: [],
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
return { ok: true, value: cloned.value, warnings: [] };
|
|
226
|
+
}
|
|
227
|
+
export async function emptyPayloadFor(loader, action, options = {}, limits = DEFAULT_LIMITS) {
|
|
228
|
+
const kind = options.kind ?? 'request';
|
|
229
|
+
const loaded = await loader.load(action, kind);
|
|
230
|
+
if (!loaded.ok)
|
|
231
|
+
return loaded;
|
|
232
|
+
const schema = loaded.value.schema;
|
|
233
|
+
if (schema === false) {
|
|
234
|
+
return {
|
|
235
|
+
ok: false,
|
|
236
|
+
error: error('invalid-payload', [], 'The schema does not allow a payload'),
|
|
237
|
+
warnings: loaded.warnings,
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
if (schema === true) {
|
|
241
|
+
return { ok: true, value: {}, warnings: loaded.warnings };
|
|
242
|
+
}
|
|
243
|
+
if (!allowsObjectRoot(schema)) {
|
|
244
|
+
return {
|
|
245
|
+
ok: false,
|
|
246
|
+
error: error('invalid-payload', [], 'The root schema must describe a JSON object'),
|
|
247
|
+
warnings: loaded.warnings,
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
let empty;
|
|
251
|
+
try {
|
|
252
|
+
empty = createEmptyPayload(schema, { fill: options.fill });
|
|
253
|
+
}
|
|
254
|
+
catch (err) {
|
|
255
|
+
return {
|
|
256
|
+
ok: false,
|
|
257
|
+
error: error('invalid-payload', [], messageOf(err, 'The empty payload failed')),
|
|
258
|
+
warnings: loaded.warnings,
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
const value = empty === undefined ? {} : empty;
|
|
262
|
+
const checked = checkJsonObject(value, limits);
|
|
263
|
+
if (!checked.ok)
|
|
264
|
+
return { ...checked, warnings: loaded.warnings };
|
|
265
|
+
return { ok: true, value: checked.value, warnings: loaded.warnings };
|
|
266
|
+
}
|
|
267
|
+
export async function buildPayloadFor(loader, action, input, options = {}, limits = DEFAULT_LIMITS) {
|
|
268
|
+
const kind = options.kind ?? 'request';
|
|
269
|
+
const loaded = await loader.load(action, kind);
|
|
270
|
+
if (!loaded.ok)
|
|
271
|
+
return loaded;
|
|
272
|
+
const cloned = checkJsonObject(input, limits);
|
|
273
|
+
if (!cloned.ok)
|
|
274
|
+
return { ...cloned, warnings: loaded.warnings };
|
|
275
|
+
let value = cloned.value;
|
|
276
|
+
let applyDefaultsOption;
|
|
277
|
+
try {
|
|
278
|
+
applyDefaultsOption = options.applyDefaults !== false;
|
|
279
|
+
}
|
|
280
|
+
catch (err) {
|
|
281
|
+
return {
|
|
282
|
+
ok: false,
|
|
283
|
+
error: error('invalid-payload', [], messageOf(err, 'The build options could not be read')),
|
|
284
|
+
warnings: loaded.warnings,
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
if (applyDefaultsOption) {
|
|
288
|
+
let defaulted;
|
|
289
|
+
try {
|
|
290
|
+
defaulted = applyDefaults(loaded.value.schema, value);
|
|
291
|
+
}
|
|
292
|
+
catch (err) {
|
|
293
|
+
return {
|
|
294
|
+
ok: false,
|
|
295
|
+
error: error('invalid-payload', [], messageOf(err, 'Defaults could not be applied')),
|
|
296
|
+
warnings: loaded.warnings,
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
if (!defaulted.ok) {
|
|
300
|
+
return {
|
|
301
|
+
ok: false,
|
|
302
|
+
error: error('invalid-payload', defaulted.error.path, defaulted.error.message),
|
|
303
|
+
warnings: loaded.warnings,
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
value = defaulted.value;
|
|
307
|
+
}
|
|
308
|
+
const bounded = checkJsonObject(value, limits);
|
|
309
|
+
if (!bounded.ok)
|
|
310
|
+
return { ...bounded, warnings: loaded.warnings };
|
|
311
|
+
const state = { limits, warnings: [], nodes: 0 };
|
|
312
|
+
const checked = checkValue(loaded.value.schema, bounded.value, [], 0, state);
|
|
313
|
+
if (checked !== undefined) {
|
|
314
|
+
return { ok: false, error: checked, warnings: [...loaded.warnings, ...state.warnings] };
|
|
315
|
+
}
|
|
316
|
+
return {
|
|
317
|
+
ok: true,
|
|
318
|
+
value: bounded.value,
|
|
319
|
+
warnings: [...loaded.warnings, ...state.warnings],
|
|
320
|
+
};
|
|
321
|
+
}
|
|
322
|
+
//# sourceMappingURL=payload.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payload.js","sourceRoot":"","sources":["../src/payload.ts"],"names":[],"mappings":"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"}
|
package/dist/schema.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { BuilderResult, BuilderSchemaRegistry, BuilderWarning, PayloadKind } from './types.js';
|
|
2
|
+
import type { OcppVersion } from '@ocpptools/core';
|
|
3
|
+
import type { ResolvedJsonSchema } from '@ocpptools/schema-utils';
|
|
4
|
+
export interface LoadedSchema {
|
|
5
|
+
readonly schema: ResolvedJsonSchema;
|
|
6
|
+
readonly warnings: readonly BuilderWarning[];
|
|
7
|
+
}
|
|
8
|
+
export declare class SchemaLoader {
|
|
9
|
+
private readonly version;
|
|
10
|
+
private readonly schemas;
|
|
11
|
+
private readonly maxDepth;
|
|
12
|
+
private readonly maxNodes;
|
|
13
|
+
private readonly cache;
|
|
14
|
+
constructor(version: OcppVersion, schemas: BuilderSchemaRegistry, maxDepth: number, maxNodes: number);
|
|
15
|
+
load(action: string, kind: PayloadKind): Promise<BuilderResult<LoadedSchema>>;
|
|
16
|
+
private loadUncached;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,qBAAqB,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACpG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,KAAK,EAAQ,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAMxE,MAAM,WAAW,YAAY;IAC5B,QAAQ,CAAC,MAAM,EAAE,kBAAkB,CAAC;IACpC,QAAQ,CAAC,QAAQ,EAAE,SAAS,cAAc,EAAE,CAAC;CAC7C;AAkBD,qBAAa,YAAY;IAIvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAN1B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA2D;gBAG/D,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,qBAAqB,EAC9B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM;IAGlC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;YAiB/D,YAAY;CA4E1B"}
|
package/dist/schema.js
ADDED
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// SPDX-FileCopyrightText: 2026 Rodolfo Carrillo
|
|
3
|
+
import { normalizeSchema, resolveRefs } from '@ocpptools/schema-utils';
|
|
4
|
+
import { schemaInvalid, schemaLoadFailed, unknownAction, messageOf } from './errors.js';
|
|
5
|
+
import { versionDefaults } from './version.js';
|
|
6
|
+
function isModuleNamespace(value) {
|
|
7
|
+
if (typeof value !== 'object' || value === null)
|
|
8
|
+
return false;
|
|
9
|
+
try {
|
|
10
|
+
return (Object.prototype.toString.call(value) === '[object Module]' ||
|
|
11
|
+
value.__esModule === true);
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
function pathOf(value) {
|
|
18
|
+
return Array.isArray(value) ? value : [];
|
|
19
|
+
}
|
|
20
|
+
export class SchemaLoader {
|
|
21
|
+
version;
|
|
22
|
+
schemas;
|
|
23
|
+
maxDepth;
|
|
24
|
+
maxNodes;
|
|
25
|
+
cache = new Map();
|
|
26
|
+
constructor(version, schemas, maxDepth, maxNodes) {
|
|
27
|
+
this.version = version;
|
|
28
|
+
this.schemas = schemas;
|
|
29
|
+
this.maxDepth = maxDepth;
|
|
30
|
+
this.maxNodes = maxNodes;
|
|
31
|
+
}
|
|
32
|
+
load(action, kind) {
|
|
33
|
+
const key = `${kind}\u0000${action}`;
|
|
34
|
+
const cached = this.cache.get(key);
|
|
35
|
+
if (cached !== undefined)
|
|
36
|
+
return cached;
|
|
37
|
+
const pending = this.loadUncached(action, kind);
|
|
38
|
+
this.cache.set(key, pending);
|
|
39
|
+
void pending.then((result) => {
|
|
40
|
+
if (!result.ok)
|
|
41
|
+
this.cache.delete(key);
|
|
42
|
+
}, () => {
|
|
43
|
+
this.cache.delete(key);
|
|
44
|
+
});
|
|
45
|
+
return pending;
|
|
46
|
+
}
|
|
47
|
+
async loadUncached(action, kind) {
|
|
48
|
+
let raw;
|
|
49
|
+
try {
|
|
50
|
+
raw = await this.schemas.get(action, kind);
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
return { ok: false, error: schemaLoadFailed(action, error), warnings: [] };
|
|
54
|
+
}
|
|
55
|
+
if (raw === undefined) {
|
|
56
|
+
return { ok: false, error: unknownAction(action), warnings: [] };
|
|
57
|
+
}
|
|
58
|
+
if (isModuleNamespace(raw)) {
|
|
59
|
+
return {
|
|
60
|
+
ok: false,
|
|
61
|
+
error: schemaInvalid('The registry returned a module namespace; return its default export'),
|
|
62
|
+
warnings: [],
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
let normalized;
|
|
66
|
+
try {
|
|
67
|
+
normalized = normalizeSchema(raw, {
|
|
68
|
+
defaultDraft: versionDefaults(this.version).defaultDraft,
|
|
69
|
+
stripUnknownKeywords: true,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
return {
|
|
74
|
+
ok: false,
|
|
75
|
+
error: schemaInvalid(messageOf(error, 'The schema could not be read')),
|
|
76
|
+
warnings: [],
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
if (!normalized.ok) {
|
|
80
|
+
return {
|
|
81
|
+
ok: false,
|
|
82
|
+
error: schemaInvalid(normalized.error.message, pathOf(normalized.error.path)),
|
|
83
|
+
warnings: [],
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
const warnings = normalized.value.warnings.map((entry) => ({
|
|
87
|
+
source: 'schema',
|
|
88
|
+
code: entry.code,
|
|
89
|
+
path: entry.path,
|
|
90
|
+
message: entry.message,
|
|
91
|
+
}));
|
|
92
|
+
let resolved;
|
|
93
|
+
try {
|
|
94
|
+
resolved = resolveRefs(normalized.value.schema, {
|
|
95
|
+
dropDefinitions: true,
|
|
96
|
+
maxDepth: this.maxDepth,
|
|
97
|
+
maxNodes: this.maxNodes,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
return {
|
|
102
|
+
ok: false,
|
|
103
|
+
error: schemaInvalid(messageOf(error, 'The schema could not be read')),
|
|
104
|
+
warnings,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
if (!resolved.ok) {
|
|
108
|
+
return {
|
|
109
|
+
ok: false,
|
|
110
|
+
error: schemaInvalid(resolved.error.ref === undefined
|
|
111
|
+
? resolved.error.message
|
|
112
|
+
: `${resolved.error.message} (${resolved.error.ref})`, pathOf(resolved.error.path)),
|
|
113
|
+
warnings,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
return { ok: true, value: { schema: resolved.value, warnings }, warnings };
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import type { CallErrorFrame, CallFrame, CallResultFrame, JsonObject, MessageIdGenerator, OcppVersion } from '@ocpptools/core';
|
|
2
|
+
import type { Field, Path } from '@ocpptools/schema-utils';
|
|
3
|
+
/** Which schema of an action to use: the request or its result. */
|
|
4
|
+
export type PayloadKind = 'request' | 'response';
|
|
5
|
+
/**
|
|
6
|
+
* Gives the builder the schema of an action. It may return a schema or a
|
|
7
|
+
* promise of one. The optional `actions` view is what the registry exposes;
|
|
8
|
+
* the builder never invents an action list.
|
|
9
|
+
*/
|
|
10
|
+
export interface BuilderSchemaRegistry {
|
|
11
|
+
get(action: string, kind: PayloadKind): unknown;
|
|
12
|
+
actions?(): Iterable<string> | AsyncIterable<string> | Promise<Iterable<string> | AsyncIterable<string>>;
|
|
13
|
+
}
|
|
14
|
+
/** Limits for schema resolution and payload checking. */
|
|
15
|
+
export interface BuilderLimits {
|
|
16
|
+
readonly maxDepth?: number;
|
|
17
|
+
readonly maxNodes?: number;
|
|
18
|
+
}
|
|
19
|
+
export interface BuilderOptions {
|
|
20
|
+
readonly version: OcppVersion;
|
|
21
|
+
readonly schemas: BuilderSchemaRegistry;
|
|
22
|
+
readonly actions?: Iterable<string> | AsyncIterable<string> | Promise<Iterable<string> | AsyncIterable<string>>;
|
|
23
|
+
readonly messageIds?: MessageIdGenerator;
|
|
24
|
+
/** Request payload examples supplied by the consumer, keyed by action. */
|
|
25
|
+
readonly examples?: Readonly<Record<string, JsonObject>>;
|
|
26
|
+
readonly schemaLimits?: BuilderLimits;
|
|
27
|
+
readonly payloadLimits?: BuilderLimits;
|
|
28
|
+
}
|
|
29
|
+
/** Where an issue belongs. */
|
|
30
|
+
export type BuilderSource = 'schema' | 'payload' | 'frame';
|
|
31
|
+
export type BuilderIssueCode = 'unknown-action' | 'schema-load-failed' | 'schema-invalid' | 'invalid-action' | 'invalid-kind' | 'invalid-payload' | 'missing-required' | 'invalid-type' | 'invalid-enum' | 'out-of-range' | 'too-long' | 'too-short' | 'invalid-message-id' | 'invalid-error-code' | 'not-json' | 'limit-exceeded' | 'serialize-failed';
|
|
32
|
+
export type BuilderWarningCode = 'unknown-draft' | 'id-conflict' | 'ignored-exclusive-bound' | 'unsupported-keyword';
|
|
33
|
+
/** A problem that stops a build. */
|
|
34
|
+
export interface BuilderIssue {
|
|
35
|
+
readonly source: BuilderSource;
|
|
36
|
+
readonly code: BuilderIssueCode;
|
|
37
|
+
readonly path: Path;
|
|
38
|
+
readonly message: string;
|
|
39
|
+
readonly expected?: string;
|
|
40
|
+
readonly received?: string;
|
|
41
|
+
}
|
|
42
|
+
/** Something the builder could not check, or a schema normalization warning. */
|
|
43
|
+
export interface BuilderWarning {
|
|
44
|
+
readonly source: 'schema' | 'payload';
|
|
45
|
+
readonly code: BuilderWarningCode;
|
|
46
|
+
readonly path: Path;
|
|
47
|
+
readonly message: string;
|
|
48
|
+
}
|
|
49
|
+
export type BuilderResult<Value> = {
|
|
50
|
+
readonly ok: true;
|
|
51
|
+
readonly value: Value;
|
|
52
|
+
readonly warnings: readonly BuilderWarning[];
|
|
53
|
+
} | {
|
|
54
|
+
readonly ok: false;
|
|
55
|
+
readonly error: BuilderIssue;
|
|
56
|
+
readonly warnings: readonly BuilderWarning[];
|
|
57
|
+
};
|
|
58
|
+
export interface FieldsOptions {
|
|
59
|
+
readonly kind?: PayloadKind;
|
|
60
|
+
readonly omit?: (path: Path) => boolean;
|
|
61
|
+
}
|
|
62
|
+
export interface EmptyPayloadOptions {
|
|
63
|
+
readonly kind?: PayloadKind;
|
|
64
|
+
readonly fill?: 'default-or-enum' | 'typed-zero';
|
|
65
|
+
}
|
|
66
|
+
export interface BuildPayloadOptions {
|
|
67
|
+
readonly kind?: PayloadKind;
|
|
68
|
+
readonly applyDefaults?: boolean;
|
|
69
|
+
}
|
|
70
|
+
export interface CallOptions {
|
|
71
|
+
readonly messageId?: string;
|
|
72
|
+
}
|
|
73
|
+
/** A schema-driven payload and frame builder. */
|
|
74
|
+
export interface Builder {
|
|
75
|
+
readonly version: OcppVersion;
|
|
76
|
+
has(action: string, kind?: PayloadKind): Promise<BuilderResult<boolean>>;
|
|
77
|
+
listActions(): Promise<BuilderResult<readonly string[]>>;
|
|
78
|
+
fields(action: string, options?: FieldsOptions): Promise<BuilderResult<Field>>;
|
|
79
|
+
emptyPayload(action: string, options?: EmptyPayloadOptions): Promise<BuilderResult<JsonObject>>;
|
|
80
|
+
buildPayload(action: string, value: unknown, options?: BuildPayloadOptions): Promise<BuilderResult<JsonObject>>;
|
|
81
|
+
buildCall(action: string, value: unknown, options?: CallOptions): Promise<BuilderResult<CallFrame>>;
|
|
82
|
+
buildResult(action: string, value: unknown, messageId: string): Promise<BuilderResult<CallResultFrame>>;
|
|
83
|
+
buildError(messageId: string, code: string, description: string, details?: JsonObject): BuilderResult<CallErrorFrame>;
|
|
84
|
+
serialize(frame: CallFrame | CallResultFrame | CallErrorFrame): BuilderResult<string>;
|
|
85
|
+
example(action: string): BuilderResult<JsonObject | undefined>;
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,gDAAgD"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type OcppVersion } from '@ocpptools/core';
|
|
2
|
+
export declare const DEFAULT_SCHEMA_MAX_DEPTH = 128;
|
|
3
|
+
export declare const DEFAULT_SCHEMA_MAX_NODES = 100000;
|
|
4
|
+
export declare const DEFAULT_PAYLOAD_MAX_DEPTH = 64;
|
|
5
|
+
export declare const DEFAULT_PAYLOAD_MAX_NODES = 10000;
|
|
6
|
+
export interface VersionDefaults {
|
|
7
|
+
readonly defaultDraft: 'draft-04' | 'draft-06';
|
|
8
|
+
}
|
|
9
|
+
export declare function versionDefaults(version: OcppVersion): VersionDefaults;
|
|
10
|
+
export declare function assertVersion(version: unknown): asserts version is OcppVersion;
|
|
11
|
+
export declare function positiveLimit(value: unknown, fallback: number, name: string): number;
|
|
12
|
+
//# sourceMappingURL=version.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAGA,OAAO,EAAgC,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEjF,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAC5C,eAAO,MAAM,wBAAwB,SAAU,CAAC;AAChD,eAAO,MAAM,yBAAyB,KAAK,CAAC;AAC5C,eAAO,MAAM,yBAAyB,QAAS,CAAC;AAEhD,MAAM,WAAW,eAAe;IAC/B,QAAQ,CAAC,YAAY,EAAE,UAAU,GAAG,UAAU,CAAC;CAC/C;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,WAAW,GAAG,eAAe,CAIrE;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,WAAW,CAM9E;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAMpF"}
|
package/dist/version.js
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// SPDX-FileCopyrightText: 2026 Rodolfo Carrillo
|
|
3
|
+
import { OCPP_VERSIONS, isOcppVersion } from '@ocpptools/core';
|
|
4
|
+
export const DEFAULT_SCHEMA_MAX_DEPTH = 128;
|
|
5
|
+
export const DEFAULT_SCHEMA_MAX_NODES = 100_000;
|
|
6
|
+
export const DEFAULT_PAYLOAD_MAX_DEPTH = 64;
|
|
7
|
+
export const DEFAULT_PAYLOAD_MAX_NODES = 10_000;
|
|
8
|
+
export function versionDefaults(version) {
|
|
9
|
+
return {
|
|
10
|
+
defaultDraft: version === '1.6' ? 'draft-04' : 'draft-06',
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export function assertVersion(version) {
|
|
14
|
+
if (!isOcppVersion(version)) {
|
|
15
|
+
throw new Error(`Unsupported OCPP version: ${String(version)}. Supported versions: ${OCPP_VERSIONS.join(' and ')}`);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export function positiveLimit(value, fallback, name) {
|
|
19
|
+
if (value === undefined)
|
|
20
|
+
return fallback;
|
|
21
|
+
if (typeof value !== 'number' || !Number.isSafeInteger(value) || value <= 0) {
|
|
22
|
+
throw new Error(`${name} must be a positive safe integer`);
|
|
23
|
+
}
|
|
24
|
+
return value;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,gDAAgD;AAEhD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAoB,MAAM,iBAAiB,CAAC;AAEjF,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAAG,CAAC;AAC5C,MAAM,CAAC,MAAM,wBAAwB,GAAG,OAAO,CAAC;AAChD,MAAM,CAAC,MAAM,yBAAyB,GAAG,EAAE,CAAC;AAC5C,MAAM,CAAC,MAAM,yBAAyB,GAAG,MAAM,CAAC;AAMhD,MAAM,UAAU,eAAe,CAAC,OAAoB;IACnD,OAAO;QACN,YAAY,EAAE,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU;KACzD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAgB;IAC7C,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CACd,6BAA6B,MAAM,CAAC,OAAO,CAAC,yBAAyB,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAClG,CAAC;IACH,CAAC;AACF,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAc,EAAE,QAAgB,EAAE,IAAY;IAC3E,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IACzC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QAC7E,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,kCAAkC,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC"}
|