@blamejs/core 0.7.18 → 0.7.19
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/CHANGELOG.md +425 -423
- package/README.md +150 -150
- package/bin/blamejs.js +0 -0
- package/index.js +310 -308
- package/lib/api-key.js +660 -660
- package/lib/api-snapshot.js +338 -338
- package/lib/app-shutdown.js +385 -385
- package/lib/app.js +365 -365
- package/lib/archive.js +250 -250
- package/lib/atomic-file.js +544 -544
- package/lib/audit-chain.js +177 -177
- package/lib/audit-sign.js +344 -344
- package/lib/audit-tools.js +677 -677
- package/lib/audit.js +766 -766
- package/lib/auth/jwt-external.js +365 -0
- package/lib/auth/jwt.js +337 -311
- package/lib/auth/lockout.js +436 -436
- package/lib/auth/oauth.js +721 -721
- package/lib/auth/passkey.js +181 -181
- package/lib/auth/password.js +628 -594
- package/lib/backup/bundle.js +217 -217
- package/lib/backup/crypto.js +176 -176
- package/lib/backup/index.js +515 -515
- package/lib/backup/manifest.js +282 -282
- package/lib/break-glass.js +1338 -1338
- package/lib/bundler.js +441 -441
- package/lib/cache-redis.js +256 -256
- package/lib/cache.js +1206 -1206
- package/lib/canonical-json.js +115 -115
- package/lib/chain-writer.js +234 -234
- package/lib/cli-helpers.js +206 -206
- package/lib/cli.js +2334 -2334
- package/lib/cluster-provider-db.js +317 -317
- package/lib/cluster-storage.js +226 -226
- package/lib/cluster.js +703 -703
- package/lib/config-drift.js +301 -301
- package/lib/consent.js +222 -222
- package/lib/constants.js +191 -191
- package/lib/cookies.js +315 -315
- package/lib/credential-hash.js +322 -322
- package/lib/crypto.js +266 -266
- package/lib/csv.js +275 -275
- package/lib/db-declare-row-policy.js +267 -267
- package/lib/db-declare-view.js +420 -420
- package/lib/db-query.js +406 -406
- package/lib/db-schema.js +319 -319
- package/lib/db.js +1288 -1288
- package/lib/deprecate.js +222 -222
- package/lib/dev.js +335 -335
- package/lib/dual-control.js +473 -473
- package/lib/error-page.js +420 -420
- package/lib/external-db-migrate.js +441 -441
- package/lib/external-db.js +1061 -1061
- package/lib/file-type.js +273 -273
- package/lib/forms.js +422 -422
- package/lib/framework-error.js +293 -293
- package/lib/framework-schema.js +717 -717
- package/lib/handlers.js +350 -350
- package/lib/http-client-cookie-jar.js +508 -508
- package/lib/http-client.js +1195 -1195
- package/lib/i18n.js +878 -878
- package/lib/jobs.js +185 -185
- package/lib/log-stream-cloudwatch.js +369 -369
- package/lib/log-stream-local.js +146 -146
- package/lib/log-stream-otlp-grpc.js +410 -410
- package/lib/log-stream-otlp.js +286 -286
- package/lib/log-stream-syslog.js +302 -302
- package/lib/log-stream-webhook.js +199 -199
- package/lib/log-stream.js +330 -330
- package/lib/log.js +500 -500
- package/lib/mail-bounce.js +528 -528
- package/lib/mail-dkim.js +369 -369
- package/lib/mail.js +981 -981
- package/lib/metrics.js +683 -683
- package/lib/middleware/api-encrypt.js +936 -936
- package/lib/middleware/attach-user.js +157 -157
- package/lib/middleware/bearer-auth.js +152 -0
- package/lib/middleware/body-parser.js +1170 -1170
- package/lib/middleware/bot-guard.js +178 -178
- package/lib/middleware/compression.js +452 -452
- package/lib/middleware/cors.js +314 -314
- package/lib/middleware/csp-nonce.js +348 -348
- package/lib/middleware/csrf-protect.js +316 -316
- package/lib/middleware/db-role-for.js +264 -264
- package/lib/middleware/health.js +392 -392
- package/lib/middleware/index.js +82 -79
- package/lib/middleware/rate-limit.js +358 -358
- package/lib/middleware/request-id.js +61 -61
- package/lib/middleware/request-log.js +168 -168
- package/lib/middleware/require-auth.js +104 -104
- package/lib/middleware/security-headers.js +116 -116
- package/lib/middleware/sse.js +166 -166
- package/lib/migrations.js +383 -383
- package/lib/mtls-ca.js +518 -518
- package/lib/mtls-engine-default.js +481 -481
- package/lib/network-dns.js +632 -632
- package/lib/network-heartbeat.js +290 -290
- package/lib/network-nts.js +574 -574
- package/lib/network-proxy.js +265 -265
- package/lib/network-tls.js +328 -328
- package/lib/network.js +233 -233
- package/lib/notify.js +612 -612
- package/lib/ntp-check.js +229 -229
- package/lib/numeric-bounds.js +111 -111
- package/lib/object-store/azure-blob-bucket-ops.js +349 -349
- package/lib/object-store/azure-blob.js +488 -488
- package/lib/object-store/gcs-bucket-ops.js +351 -351
- package/lib/object-store/gcs.js +519 -519
- package/lib/object-store/http-put.js +153 -153
- package/lib/object-store/index.js +197 -197
- package/lib/object-store/sigv4-bucket-ops.js +1092 -1092
- package/lib/object-store/sigv4.js +903 -903
- package/lib/observability.js +151 -151
- package/lib/otel-export.js +269 -269
- package/lib/pagination.js +464 -464
- package/lib/parsers/index.js +80 -80
- package/lib/parsers/safe-env.js +642 -642
- package/lib/parsers/safe-ini.js +292 -292
- package/lib/parsers/safe-toml.js +784 -784
- package/lib/parsers/safe-xml.js +390 -390
- package/lib/parsers/safe-yaml.js +1015 -1015
- package/lib/permissions.js +708 -708
- package/lib/pqc-agent.js +87 -87
- package/lib/pqc-gate.js +279 -279
- package/lib/protobuf-encoder.js +190 -190
- package/lib/protocol-dispatcher.js +161 -161
- package/lib/pubsub-redis.js +167 -167
- package/lib/pubsub.js +429 -429
- package/lib/queue-local.js +476 -476
- package/lib/queue-redis.js +745 -745
- package/lib/queue-sqs.js +319 -319
- package/lib/queue.js +695 -695
- package/lib/redis-client.js +519 -519
- package/lib/request-helpers.js +340 -340
- package/lib/restore-bundle.js +237 -237
- package/lib/restore-rollback.js +259 -259
- package/lib/restore.js +409 -409
- package/lib/retry.js +376 -376
- package/lib/router.js +748 -748
- package/lib/safe-async.js +735 -735
- package/lib/safe-buffer.js +237 -237
- package/lib/safe-json.js +541 -541
- package/lib/safe-schema.js +1266 -1266
- package/lib/safe-url.js +159 -159
- package/lib/scheduler.js +706 -706
- package/lib/security-assert.js +373 -373
- package/lib/seeders.js +618 -618
- package/lib/session.js +535 -478
- package/lib/slug.js +269 -269
- package/lib/ssrf-guard.js +401 -401
- package/lib/storage.js +471 -471
- package/lib/subject.js +281 -281
- package/lib/template.js +791 -791
- package/lib/testing.js +798 -798
- package/lib/time.js +310 -310
- package/lib/totp.js +302 -302
- package/lib/tracing.js +494 -494
- package/lib/uuid.js +132 -132
- package/lib/validate-opts.js +340 -340
- package/lib/vault/index.js +308 -308
- package/lib/vault/rotate.js +784 -784
- package/lib/vault/wrap.js +296 -296
- package/lib/vendor/noble-ciphers.cjs +9 -9
- package/lib/webhook.js +595 -595
- package/lib/websocket.js +1048 -1048
- package/package.json +77 -77
- package/sbom.cyclonedx.json +7 -7
package/lib/validate-opts.js
CHANGED
|
@@ -1,340 +1,340 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* validate-opts — shared call-site helper for primitive create() functions
|
|
4
|
-
* that throws on unknown / bad-shape opts at config time.
|
|
5
|
-
*
|
|
6
|
-
* Catches silent operator typos: `cors({ allowedOrigins: [] })` (wrong
|
|
7
|
-
* key name) currently looks like config but does nothing — the primitive
|
|
8
|
-
* sees opts.origins as undefined and falls back to defaults. With this
|
|
9
|
-
* helper the create() throws at boot with a clear message instead of
|
|
10
|
-
* the typo silently weakening the operator's setup.
|
|
11
|
-
*
|
|
12
|
-
* var validateOpts = require("./validate-opts");
|
|
13
|
-
*
|
|
14
|
-
* function create(opts) {
|
|
15
|
-
* opts = opts || {};
|
|
16
|
-
* validateOpts(opts, [
|
|
17
|
-
* "origins", "siteOrigin", "methods", "headers",
|
|
18
|
-
* "exposeHeaders", "credentials", "maxAgeSeconds", "refuseUnknown",
|
|
19
|
-
* ], "middleware.cors");
|
|
20
|
-
* ...
|
|
21
|
-
* }
|
|
22
|
-
*
|
|
23
|
-
* The exported `optional(...)` form lets a primitive accept a
|
|
24
|
-
* sparsely-populated opts object and only validate keys that ARE present.
|
|
25
|
-
*
|
|
26
|
-
* Throws a plain Error with a code-shaped message — primitives that want
|
|
27
|
-
* a typed error wrap the call.
|
|
28
|
-
*/
|
|
29
|
-
|
|
30
|
-
function _format(primitive, unknownKey, allowedKeys) {
|
|
31
|
-
return primitive + ": unknown option '" + unknownKey + "'. " +
|
|
32
|
-
"Allowed keys: " + allowedKeys.slice().sort().join(", ") + ".";
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
function check(opts, allowedKeys, primitive) {
|
|
36
|
-
if (opts == null) return;
|
|
37
|
-
if (typeof opts !== "object") {
|
|
38
|
-
throw new Error(primitive + ": opts must be an object (got " + typeof opts + ")");
|
|
39
|
-
}
|
|
40
|
-
if (!Array.isArray(allowedKeys) || allowedKeys.length === 0) {
|
|
41
|
-
throw new Error("validate-opts: allowedKeys must be a non-empty array");
|
|
42
|
-
}
|
|
43
|
-
if (typeof primitive !== "string" || primitive.length === 0) {
|
|
44
|
-
throw new Error("validate-opts: primitive name must be a non-empty string");
|
|
45
|
-
}
|
|
46
|
-
var allowSet = Object.create(null);
|
|
47
|
-
for (var i = 0; i < allowedKeys.length; i++) allowSet[allowedKeys[i]] = true;
|
|
48
|
-
var keys = Object.keys(opts);
|
|
49
|
-
for (var j = 0; j < keys.length; j++) {
|
|
50
|
-
if (!allowSet[keys[j]]) {
|
|
51
|
-
throw new Error(_format(primitive, keys[j], allowedKeys));
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
// auditShape — operator-supplied `opts.audit` must expose a
|
|
57
|
-
// `safeEmit` function. 10+ primitive create() functions previously
|
|
58
|
-
// inlined the same shape check + throw. Centralized here so every
|
|
59
|
-
// consumer has one validation contract.
|
|
60
|
-
function auditShape(audit, callerLabel, errorClass, code) {
|
|
61
|
-
if (audit === undefined || audit === null) return audit;
|
|
62
|
-
if (typeof audit !== "object" || typeof audit.safeEmit !== "function") {
|
|
63
|
-
var msg = (callerLabel || "audit") +
|
|
64
|
-
": audit must be a b.audit-shaped object (safeEmit fn)";
|
|
65
|
-
if (errorClass && errorClass.factory) {
|
|
66
|
-
throw errorClass.factory(code || "BAD_OPT", msg);
|
|
67
|
-
}
|
|
68
|
-
if (typeof errorClass === "function") {
|
|
69
|
-
throw new errorClass(code || "audit/bad-shape", msg);
|
|
70
|
-
}
|
|
71
|
-
throw new Error(msg);
|
|
72
|
-
}
|
|
73
|
-
return audit;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
// _throw — shared error-emission for the optional* validators. Routes
|
|
77
|
-
// through the caller's framework-error class when supplied, falls back
|
|
78
|
-
// to plain Error so this helper itself stays decoupled from any one
|
|
79
|
-
// error hierarchy.
|
|
80
|
-
function _throw(errorClass, code, msg, defaultCode) {
|
|
81
|
-
if (errorClass && errorClass.factory) {
|
|
82
|
-
throw errorClass.factory(code || "BAD_OPT", msg);
|
|
83
|
-
}
|
|
84
|
-
if (typeof errorClass === "function") {
|
|
85
|
-
throw new errorClass(code || defaultCode, msg);
|
|
86
|
-
}
|
|
87
|
-
throw new Error(msg);
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
// optionalBoolean / optionalPositiveInt / optionalFiniteNonNegative /
|
|
91
|
-
// optionalPositiveFinite / optionalFunction — opt-time type assertions
|
|
92
|
-
// for fields that may be omitted. Each returns the value unchanged when
|
|
93
|
-
// undefined or null (preserving the caller's "absent → use default"
|
|
94
|
-
// semantics) and throws on any other shape.
|
|
95
|
-
//
|
|
96
|
-
// 10+ primitive create() functions previously rolled identical
|
|
97
|
-
// `if (opts.X !== undefined && typeof opts.X !== "Y") throw`
|
|
98
|
-
// sequences. Centralizing the throw here keeps the operator-facing
|
|
99
|
-
// message format consistent and gives the codebase-pattern catalog one
|
|
100
|
-
// place to point new authors at.
|
|
101
|
-
|
|
102
|
-
function optionalBoolean(value, label, errorClass, code) {
|
|
103
|
-
if (value === undefined || value === null) return value;
|
|
104
|
-
if (typeof value !== "boolean") {
|
|
105
|
-
_throw(errorClass, code, (label || "opt") + " must be a boolean, got " + typeof value,
|
|
106
|
-
"validate-opts/bad-boolean");
|
|
107
|
-
}
|
|
108
|
-
return value;
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
function optionalPositiveInt(value, label, errorClass, code) {
|
|
112
|
-
if (value === undefined || value === null) return value;
|
|
113
|
-
if (typeof value !== "number" || !isFinite(value) || value < 1 || Math.floor(value) !== value) {
|
|
114
|
-
_throw(errorClass, code, (label || "opt") +
|
|
115
|
-
" must be a positive integer (>= 1, finite), got " +
|
|
116
|
-
(typeof value === "number" ? String(value) : typeof value),
|
|
117
|
-
"validate-opts/bad-positive-int");
|
|
118
|
-
}
|
|
119
|
-
return value;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
function optionalFiniteNonNegative(value, label, errorClass, code) {
|
|
123
|
-
if (value === undefined || value === null) return value;
|
|
124
|
-
if (typeof value !== "number" || !isFinite(value) || value < 0) {
|
|
125
|
-
_throw(errorClass, code, (label || "opt") +
|
|
126
|
-
" must be a non-negative finite number, got " +
|
|
127
|
-
(typeof value === "number" ? String(value) : typeof value),
|
|
128
|
-
"validate-opts/bad-non-negative-finite");
|
|
129
|
-
}
|
|
130
|
-
return value;
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
function optionalPositiveFinite(value, label, errorClass, code) {
|
|
134
|
-
if (value === undefined || value === null) return value;
|
|
135
|
-
if (typeof value !== "number" || !isFinite(value) || value <= 0) {
|
|
136
|
-
_throw(errorClass, code, (label || "opt") +
|
|
137
|
-
" must be a positive finite number (> 0), got " +
|
|
138
|
-
(typeof value === "number" ? String(value) : typeof value),
|
|
139
|
-
"validate-opts/bad-positive-finite");
|
|
140
|
-
}
|
|
141
|
-
return value;
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
function optionalFunction(value, label, errorClass, code) {
|
|
145
|
-
if (value === undefined || value === null) return value;
|
|
146
|
-
if (typeof value !== "function") {
|
|
147
|
-
_throw(errorClass, code, (label || "opt") + " must be a function, got " + typeof value,
|
|
148
|
-
"validate-opts/bad-function");
|
|
149
|
-
}
|
|
150
|
-
return value;
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
// applyDefaults — resolve every key in DEFAULTS against opts. For each
|
|
154
|
-
// key, the operator's value (if not undefined) wins; otherwise the
|
|
155
|
-
// default is used. Returns a new plain object — NOT a frozen one, so
|
|
156
|
-
// the create() function can layer additional resolved fields if it
|
|
157
|
-
// needs them. 5+ primitives previously rolled their own
|
|
158
|
-
// `var X = (opts.X === undefined) ? DEFAULTS.X : opts.X;` cascade
|
|
159
|
-
// across 5–10 lines per call site; this collapses them all to one.
|
|
160
|
-
//
|
|
161
|
-
// Operator-supplied keys that aren't in DEFAULTS are dropped — use
|
|
162
|
-
// validateOpts(opts, ALLOWED_KEYS, label) at the boundary FIRST to
|
|
163
|
-
// reject typos before this resolves. Pass-through behavior would let
|
|
164
|
-
// `{ ttllMs: 5000 }` silently apply the default ttlMs without warning.
|
|
165
|
-
function applyDefaults(opts, defaults) {
|
|
166
|
-
if (defaults === null || typeof defaults !== "object") {
|
|
167
|
-
throw new Error("validate-opts.applyDefaults: defaults must be an object");
|
|
168
|
-
}
|
|
169
|
-
opts = opts || {};
|
|
170
|
-
var out = {};
|
|
171
|
-
var keys = Object.keys(defaults);
|
|
172
|
-
for (var i = 0; i < keys.length; i++) {
|
|
173
|
-
var k = keys[i];
|
|
174
|
-
out[k] = (opts[k] === undefined) ? defaults[k] : opts[k];
|
|
175
|
-
}
|
|
176
|
-
return out;
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
// requireObject — every primitive's `_validate*Opts(opts)` function
|
|
180
|
-
// previously started with the same `if (!opts || typeof opts !== "object")
|
|
181
|
-
// throw _err(...)` prelude. Centralized here so the contract is one
|
|
182
|
-
// definition. Throws on null / undefined / non-object; returns opts on
|
|
183
|
-
// success.
|
|
184
|
-
function requireObject(opts, callerLabel, errorClass, code) {
|
|
185
|
-
if (!opts || typeof opts !== "object") {
|
|
186
|
-
var msg = (callerLabel || "opts") + ": opts must be an object, got " +
|
|
187
|
-
(opts === null ? "null" : typeof opts);
|
|
188
|
-
_throw(errorClass, code, msg, "validate-opts/bad-object");
|
|
189
|
-
}
|
|
190
|
-
return opts;
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
function optionalNonEmptyString(value, label, errorClass, code) {
|
|
194
|
-
if (value === undefined || value === null) return value;
|
|
195
|
-
if (typeof value !== "string" || value.length === 0) {
|
|
196
|
-
_throw(errorClass, code, (label || "opt") +
|
|
197
|
-
" must be a non-empty string, got " +
|
|
198
|
-
(typeof value === "string" ? "empty string" : typeof value),
|
|
199
|
-
"validate-opts/bad-non-empty-string");
|
|
200
|
-
}
|
|
201
|
-
return value;
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
// requireNonEmptyString — required-field counterpart to
|
|
205
|
-
// optionalNonEmptyString. Throws on undefined / null / empty / non-
|
|
206
|
-
// string. The dozens of `if (typeof opts.X !== "string" ||
|
|
207
|
-
// opts.X.length === 0) throw` sites every primitive's create() rolled
|
|
208
|
-
// at the top of validation collapse to one call here.
|
|
209
|
-
function requireNonEmptyString(value, label, errorClass, code) {
|
|
210
|
-
if (typeof value !== "string" || value.length === 0) {
|
|
211
|
-
var got = value === undefined ? "undefined"
|
|
212
|
-
: value === null ? "null"
|
|
213
|
-
: typeof value === "string" ? "empty string"
|
|
214
|
-
: typeof value;
|
|
215
|
-
_throw(errorClass, code, (label || "opt") +
|
|
216
|
-
" must be a non-empty string, got " + got,
|
|
217
|
-
"validate-opts/missing-non-empty-string");
|
|
218
|
-
}
|
|
219
|
-
return value;
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
// optionalNonEmptyStringArray — required-shape validator for optional
|
|
223
|
-
// array-of-non-empty-strings opts (scopes / allowedFileTypes / dependsOn /
|
|
224
|
-
// rtlLanguages / eagerLocales / etc.). Replaces the recurring four-line
|
|
225
|
-
// cascade `if (opts.X !== undefined) { if (!Array.isArray) throw; for
|
|
226
|
-
// (i...) if (typeof !== "string" || === "") throw }` that 5+ primitives
|
|
227
|
-
// previously rolled by hand.
|
|
228
|
-
//
|
|
229
|
-
// undefined / null → returns the value unchanged (caller can default).
|
|
230
|
-
// non-array → throws via errorClass with the provided code.
|
|
231
|
-
// any non-string or empty-string element → throws with index-pointing message.
|
|
232
|
-
function optionalNonEmptyStringArray(value, label, errorClass, code) {
|
|
233
|
-
if (value === undefined || value === null) return value;
|
|
234
|
-
if (!Array.isArray(value)) {
|
|
235
|
-
_throw(errorClass, code, (label || "opt") +
|
|
236
|
-
" must be an array of non-empty strings, got " + typeof value,
|
|
237
|
-
"validate-opts/bad-string-array");
|
|
238
|
-
}
|
|
239
|
-
for (var i = 0; i < value.length; i += 1) {
|
|
240
|
-
if (typeof value[i] !== "string" || value[i].length === 0) {
|
|
241
|
-
_throw(errorClass, code, (label || "opt") +
|
|
242
|
-
"[" + i + "] must be a non-empty string",
|
|
243
|
-
"validate-opts/bad-string-array-element");
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
return value;
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
// optionalObjectWithMethod — required-shape validator for optional opts
|
|
250
|
-
// that accept a "duck-typed handle": an object that exposes a specific
|
|
251
|
-
// method. Replaces the recurring `if (opts.X !== undefined && opts.X !==
|
|
252
|
-
// null) { if (typeof opts.X !== "object" || typeof opts.X.method !==
|
|
253
|
-
// "function") throw ... }` cascade shared by file-upload (permissions),
|
|
254
|
-
// notify (queue), seeders (db), webhook (nonceStore), and others.
|
|
255
|
-
//
|
|
256
|
-
// undefined / null → returns the value unchanged (caller can default).
|
|
257
|
-
// non-object OR missing method → throws via errorClass with the operator-
|
|
258
|
-
// facing description (e.g. "must be a b.permissions instance (check fn)").
|
|
259
|
-
function optionalObjectWithMethod(value, method, label, errorClass, code, description) {
|
|
260
|
-
if (value === undefined || value === null) return value;
|
|
261
|
-
if (typeof value !== "object" || typeof value[method] !== "function") {
|
|
262
|
-
_throw(errorClass, code, (label || "opt") + " " +
|
|
263
|
-
(description || ("must expose " + method + "() method")),
|
|
264
|
-
"validate-opts/bad-shaped-handle");
|
|
265
|
-
}
|
|
266
|
-
return value;
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
// optionalPlainObject — required-shape validator for optional opts that
|
|
270
|
-
// accept a plain object (not array, not null when undefined-meaning-absent
|
|
271
|
-
// is intended). Replaces the recurring `if (X !== undefined && X !== null)
|
|
272
|
-
// { if (typeof X !== "object" || Array.isArray(X)) throw }` cascade
|
|
273
|
-
// shared by api-key (metadata), db-declare-view, db-declare-row-policy,
|
|
274
|
-
// and static.js (contentSafety).
|
|
275
|
-
//
|
|
276
|
-
// undefined / null → returns the value unchanged (caller can default).
|
|
277
|
-
// non-object OR array → throws via errorClass with the operator-facing
|
|
278
|
-
// description (e.g. "metadata must be a plain object or null").
|
|
279
|
-
function optionalPlainObject(value, label, errorClass, code, description) {
|
|
280
|
-
if (value === undefined || value === null) return value;
|
|
281
|
-
if (typeof value !== "object" || Array.isArray(value)) {
|
|
282
|
-
_throw(errorClass, code, (label || "opt") + " " +
|
|
283
|
-
(description || "must be a plain object or null"),
|
|
284
|
-
"validate-opts/bad-plain-object");
|
|
285
|
-
}
|
|
286
|
-
return value;
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
// makeAuditEmitter — closure factory parallel to safeAsync.makeDropCallback.
|
|
290
|
-
// Replaces the per-file `function _emit(action, info) { if (!audit) return;
|
|
291
|
-
// try { audit.safeEmit(Object.assign({ action: action }, info || {})); }
|
|
292
|
-
// catch (_e) { /* audit best-effort */ } }` boilerplate that 5 primitives
|
|
293
|
-
// previously rolled by hand (api-key / cache / notify / permissions /
|
|
294
|
-
// sigv4-bucket-ops).
|
|
295
|
-
//
|
|
296
|
-
// audit may be null/undefined — returns a no-op emitter in that case so
|
|
297
|
-
// callers don't need to null-check at every call site.
|
|
298
|
-
//
|
|
299
|
-
// var _emit = validateOpts.makeAuditEmitter(opts.audit);
|
|
300
|
-
// _emit("apikey.create", { actor: ..., resource: ..., outcome: "success" });
|
|
301
|
-
function makeAuditEmitter(audit) {
|
|
302
|
-
if (!audit || typeof audit.safeEmit !== "function") {
|
|
303
|
-
return function _noopEmit() {};
|
|
304
|
-
}
|
|
305
|
-
return function _emit(action, info) {
|
|
306
|
-
try { audit.safeEmit(Object.assign({ action: action }, info || {})); }
|
|
307
|
-
catch (_e) { /* audit best-effort — never break the caller */ }
|
|
308
|
-
};
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
// observabilityShape — operator-supplied `opts.observability` must
|
|
312
|
-
// expose an `event` function. Parallel to auditShape; the n=1 catalog
|
|
313
|
-
// tracks both inline-shape regexes.
|
|
314
|
-
function observabilityShape(observability, callerLabel, errorClass, code) {
|
|
315
|
-
if (observability === undefined || observability === null) return observability;
|
|
316
|
-
if (typeof observability !== "object" || typeof observability.event !== "function") {
|
|
317
|
-
var msg = (callerLabel || "observability") +
|
|
318
|
-
": observability must be a b.observability-shaped object (event fn)";
|
|
319
|
-
_throw(errorClass, code, msg, "observability/bad-shape");
|
|
320
|
-
}
|
|
321
|
-
return observability;
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
module.exports = check;
|
|
325
|
-
module.exports.check = check;
|
|
326
|
-
module.exports.auditShape = auditShape;
|
|
327
|
-
module.exports.optionalBoolean = optionalBoolean;
|
|
328
|
-
module.exports.optionalPositiveInt = optionalPositiveInt;
|
|
329
|
-
module.exports.optionalFiniteNonNegative = optionalFiniteNonNegative;
|
|
330
|
-
module.exports.optionalPositiveFinite = optionalPositiveFinite;
|
|
331
|
-
module.exports.optionalFunction = optionalFunction;
|
|
332
|
-
module.exports.optionalNonEmptyString = optionalNonEmptyString;
|
|
333
|
-
module.exports.optionalNonEmptyStringArray = optionalNonEmptyStringArray;
|
|
334
|
-
module.exports.optionalObjectWithMethod = optionalObjectWithMethod;
|
|
335
|
-
module.exports.optionalPlainObject = optionalPlainObject;
|
|
336
|
-
module.exports.requireNonEmptyString = requireNonEmptyString;
|
|
337
|
-
module.exports.observabilityShape = observabilityShape;
|
|
338
|
-
module.exports.requireObject = requireObject;
|
|
339
|
-
module.exports.applyDefaults = applyDefaults;
|
|
340
|
-
module.exports.makeAuditEmitter = makeAuditEmitter;
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* validate-opts — shared call-site helper for primitive create() functions
|
|
4
|
+
* that throws on unknown / bad-shape opts at config time.
|
|
5
|
+
*
|
|
6
|
+
* Catches silent operator typos: `cors({ allowedOrigins: [] })` (wrong
|
|
7
|
+
* key name) currently looks like config but does nothing — the primitive
|
|
8
|
+
* sees opts.origins as undefined and falls back to defaults. With this
|
|
9
|
+
* helper the create() throws at boot with a clear message instead of
|
|
10
|
+
* the typo silently weakening the operator's setup.
|
|
11
|
+
*
|
|
12
|
+
* var validateOpts = require("./validate-opts");
|
|
13
|
+
*
|
|
14
|
+
* function create(opts) {
|
|
15
|
+
* opts = opts || {};
|
|
16
|
+
* validateOpts(opts, [
|
|
17
|
+
* "origins", "siteOrigin", "methods", "headers",
|
|
18
|
+
* "exposeHeaders", "credentials", "maxAgeSeconds", "refuseUnknown",
|
|
19
|
+
* ], "middleware.cors");
|
|
20
|
+
* ...
|
|
21
|
+
* }
|
|
22
|
+
*
|
|
23
|
+
* The exported `optional(...)` form lets a primitive accept a
|
|
24
|
+
* sparsely-populated opts object and only validate keys that ARE present.
|
|
25
|
+
*
|
|
26
|
+
* Throws a plain Error with a code-shaped message — primitives that want
|
|
27
|
+
* a typed error wrap the call.
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
function _format(primitive, unknownKey, allowedKeys) {
|
|
31
|
+
return primitive + ": unknown option '" + unknownKey + "'. " +
|
|
32
|
+
"Allowed keys: " + allowedKeys.slice().sort().join(", ") + ".";
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function check(opts, allowedKeys, primitive) {
|
|
36
|
+
if (opts == null) return;
|
|
37
|
+
if (typeof opts !== "object") {
|
|
38
|
+
throw new Error(primitive + ": opts must be an object (got " + typeof opts + ")");
|
|
39
|
+
}
|
|
40
|
+
if (!Array.isArray(allowedKeys) || allowedKeys.length === 0) {
|
|
41
|
+
throw new Error("validate-opts: allowedKeys must be a non-empty array");
|
|
42
|
+
}
|
|
43
|
+
if (typeof primitive !== "string" || primitive.length === 0) {
|
|
44
|
+
throw new Error("validate-opts: primitive name must be a non-empty string");
|
|
45
|
+
}
|
|
46
|
+
var allowSet = Object.create(null);
|
|
47
|
+
for (var i = 0; i < allowedKeys.length; i++) allowSet[allowedKeys[i]] = true;
|
|
48
|
+
var keys = Object.keys(opts);
|
|
49
|
+
for (var j = 0; j < keys.length; j++) {
|
|
50
|
+
if (!allowSet[keys[j]]) {
|
|
51
|
+
throw new Error(_format(primitive, keys[j], allowedKeys));
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// auditShape — operator-supplied `opts.audit` must expose a
|
|
57
|
+
// `safeEmit` function. 10+ primitive create() functions previously
|
|
58
|
+
// inlined the same shape check + throw. Centralized here so every
|
|
59
|
+
// consumer has one validation contract.
|
|
60
|
+
function auditShape(audit, callerLabel, errorClass, code) {
|
|
61
|
+
if (audit === undefined || audit === null) return audit;
|
|
62
|
+
if (typeof audit !== "object" || typeof audit.safeEmit !== "function") {
|
|
63
|
+
var msg = (callerLabel || "audit") +
|
|
64
|
+
": audit must be a b.audit-shaped object (safeEmit fn)";
|
|
65
|
+
if (errorClass && errorClass.factory) {
|
|
66
|
+
throw errorClass.factory(code || "BAD_OPT", msg);
|
|
67
|
+
}
|
|
68
|
+
if (typeof errorClass === "function") {
|
|
69
|
+
throw new errorClass(code || "audit/bad-shape", msg);
|
|
70
|
+
}
|
|
71
|
+
throw new Error(msg);
|
|
72
|
+
}
|
|
73
|
+
return audit;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// _throw — shared error-emission for the optional* validators. Routes
|
|
77
|
+
// through the caller's framework-error class when supplied, falls back
|
|
78
|
+
// to plain Error so this helper itself stays decoupled from any one
|
|
79
|
+
// error hierarchy.
|
|
80
|
+
function _throw(errorClass, code, msg, defaultCode) {
|
|
81
|
+
if (errorClass && errorClass.factory) {
|
|
82
|
+
throw errorClass.factory(code || "BAD_OPT", msg);
|
|
83
|
+
}
|
|
84
|
+
if (typeof errorClass === "function") {
|
|
85
|
+
throw new errorClass(code || defaultCode, msg);
|
|
86
|
+
}
|
|
87
|
+
throw new Error(msg);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// optionalBoolean / optionalPositiveInt / optionalFiniteNonNegative /
|
|
91
|
+
// optionalPositiveFinite / optionalFunction — opt-time type assertions
|
|
92
|
+
// for fields that may be omitted. Each returns the value unchanged when
|
|
93
|
+
// undefined or null (preserving the caller's "absent → use default"
|
|
94
|
+
// semantics) and throws on any other shape.
|
|
95
|
+
//
|
|
96
|
+
// 10+ primitive create() functions previously rolled identical
|
|
97
|
+
// `if (opts.X !== undefined && typeof opts.X !== "Y") throw`
|
|
98
|
+
// sequences. Centralizing the throw here keeps the operator-facing
|
|
99
|
+
// message format consistent and gives the codebase-pattern catalog one
|
|
100
|
+
// place to point new authors at.
|
|
101
|
+
|
|
102
|
+
function optionalBoolean(value, label, errorClass, code) {
|
|
103
|
+
if (value === undefined || value === null) return value;
|
|
104
|
+
if (typeof value !== "boolean") {
|
|
105
|
+
_throw(errorClass, code, (label || "opt") + " must be a boolean, got " + typeof value,
|
|
106
|
+
"validate-opts/bad-boolean");
|
|
107
|
+
}
|
|
108
|
+
return value;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function optionalPositiveInt(value, label, errorClass, code) {
|
|
112
|
+
if (value === undefined || value === null) return value;
|
|
113
|
+
if (typeof value !== "number" || !isFinite(value) || value < 1 || Math.floor(value) !== value) {
|
|
114
|
+
_throw(errorClass, code, (label || "opt") +
|
|
115
|
+
" must be a positive integer (>= 1, finite), got " +
|
|
116
|
+
(typeof value === "number" ? String(value) : typeof value),
|
|
117
|
+
"validate-opts/bad-positive-int");
|
|
118
|
+
}
|
|
119
|
+
return value;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function optionalFiniteNonNegative(value, label, errorClass, code) {
|
|
123
|
+
if (value === undefined || value === null) return value;
|
|
124
|
+
if (typeof value !== "number" || !isFinite(value) || value < 0) {
|
|
125
|
+
_throw(errorClass, code, (label || "opt") +
|
|
126
|
+
" must be a non-negative finite number, got " +
|
|
127
|
+
(typeof value === "number" ? String(value) : typeof value),
|
|
128
|
+
"validate-opts/bad-non-negative-finite");
|
|
129
|
+
}
|
|
130
|
+
return value;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
function optionalPositiveFinite(value, label, errorClass, code) {
|
|
134
|
+
if (value === undefined || value === null) return value;
|
|
135
|
+
if (typeof value !== "number" || !isFinite(value) || value <= 0) {
|
|
136
|
+
_throw(errorClass, code, (label || "opt") +
|
|
137
|
+
" must be a positive finite number (> 0), got " +
|
|
138
|
+
(typeof value === "number" ? String(value) : typeof value),
|
|
139
|
+
"validate-opts/bad-positive-finite");
|
|
140
|
+
}
|
|
141
|
+
return value;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
function optionalFunction(value, label, errorClass, code) {
|
|
145
|
+
if (value === undefined || value === null) return value;
|
|
146
|
+
if (typeof value !== "function") {
|
|
147
|
+
_throw(errorClass, code, (label || "opt") + " must be a function, got " + typeof value,
|
|
148
|
+
"validate-opts/bad-function");
|
|
149
|
+
}
|
|
150
|
+
return value;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// applyDefaults — resolve every key in DEFAULTS against opts. For each
|
|
154
|
+
// key, the operator's value (if not undefined) wins; otherwise the
|
|
155
|
+
// default is used. Returns a new plain object — NOT a frozen one, so
|
|
156
|
+
// the create() function can layer additional resolved fields if it
|
|
157
|
+
// needs them. 5+ primitives previously rolled their own
|
|
158
|
+
// `var X = (opts.X === undefined) ? DEFAULTS.X : opts.X;` cascade
|
|
159
|
+
// across 5–10 lines per call site; this collapses them all to one.
|
|
160
|
+
//
|
|
161
|
+
// Operator-supplied keys that aren't in DEFAULTS are dropped — use
|
|
162
|
+
// validateOpts(opts, ALLOWED_KEYS, label) at the boundary FIRST to
|
|
163
|
+
// reject typos before this resolves. Pass-through behavior would let
|
|
164
|
+
// `{ ttllMs: 5000 }` silently apply the default ttlMs without warning.
|
|
165
|
+
function applyDefaults(opts, defaults) {
|
|
166
|
+
if (defaults === null || typeof defaults !== "object") {
|
|
167
|
+
throw new Error("validate-opts.applyDefaults: defaults must be an object");
|
|
168
|
+
}
|
|
169
|
+
opts = opts || {};
|
|
170
|
+
var out = {};
|
|
171
|
+
var keys = Object.keys(defaults);
|
|
172
|
+
for (var i = 0; i < keys.length; i++) {
|
|
173
|
+
var k = keys[i];
|
|
174
|
+
out[k] = (opts[k] === undefined) ? defaults[k] : opts[k];
|
|
175
|
+
}
|
|
176
|
+
return out;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// requireObject — every primitive's `_validate*Opts(opts)` function
|
|
180
|
+
// previously started with the same `if (!opts || typeof opts !== "object")
|
|
181
|
+
// throw _err(...)` prelude. Centralized here so the contract is one
|
|
182
|
+
// definition. Throws on null / undefined / non-object; returns opts on
|
|
183
|
+
// success.
|
|
184
|
+
function requireObject(opts, callerLabel, errorClass, code) {
|
|
185
|
+
if (!opts || typeof opts !== "object") {
|
|
186
|
+
var msg = (callerLabel || "opts") + ": opts must be an object, got " +
|
|
187
|
+
(opts === null ? "null" : typeof opts);
|
|
188
|
+
_throw(errorClass, code, msg, "validate-opts/bad-object");
|
|
189
|
+
}
|
|
190
|
+
return opts;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
function optionalNonEmptyString(value, label, errorClass, code) {
|
|
194
|
+
if (value === undefined || value === null) return value;
|
|
195
|
+
if (typeof value !== "string" || value.length === 0) {
|
|
196
|
+
_throw(errorClass, code, (label || "opt") +
|
|
197
|
+
" must be a non-empty string, got " +
|
|
198
|
+
(typeof value === "string" ? "empty string" : typeof value),
|
|
199
|
+
"validate-opts/bad-non-empty-string");
|
|
200
|
+
}
|
|
201
|
+
return value;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
// requireNonEmptyString — required-field counterpart to
|
|
205
|
+
// optionalNonEmptyString. Throws on undefined / null / empty / non-
|
|
206
|
+
// string. The dozens of `if (typeof opts.X !== "string" ||
|
|
207
|
+
// opts.X.length === 0) throw` sites every primitive's create() rolled
|
|
208
|
+
// at the top of validation collapse to one call here.
|
|
209
|
+
function requireNonEmptyString(value, label, errorClass, code) {
|
|
210
|
+
if (typeof value !== "string" || value.length === 0) {
|
|
211
|
+
var got = value === undefined ? "undefined"
|
|
212
|
+
: value === null ? "null"
|
|
213
|
+
: typeof value === "string" ? "empty string"
|
|
214
|
+
: typeof value;
|
|
215
|
+
_throw(errorClass, code, (label || "opt") +
|
|
216
|
+
" must be a non-empty string, got " + got,
|
|
217
|
+
"validate-opts/missing-non-empty-string");
|
|
218
|
+
}
|
|
219
|
+
return value;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
// optionalNonEmptyStringArray — required-shape validator for optional
|
|
223
|
+
// array-of-non-empty-strings opts (scopes / allowedFileTypes / dependsOn /
|
|
224
|
+
// rtlLanguages / eagerLocales / etc.). Replaces the recurring four-line
|
|
225
|
+
// cascade `if (opts.X !== undefined) { if (!Array.isArray) throw; for
|
|
226
|
+
// (i...) if (typeof !== "string" || === "") throw }` that 5+ primitives
|
|
227
|
+
// previously rolled by hand.
|
|
228
|
+
//
|
|
229
|
+
// undefined / null → returns the value unchanged (caller can default).
|
|
230
|
+
// non-array → throws via errorClass with the provided code.
|
|
231
|
+
// any non-string or empty-string element → throws with index-pointing message.
|
|
232
|
+
function optionalNonEmptyStringArray(value, label, errorClass, code) {
|
|
233
|
+
if (value === undefined || value === null) return value;
|
|
234
|
+
if (!Array.isArray(value)) {
|
|
235
|
+
_throw(errorClass, code, (label || "opt") +
|
|
236
|
+
" must be an array of non-empty strings, got " + typeof value,
|
|
237
|
+
"validate-opts/bad-string-array");
|
|
238
|
+
}
|
|
239
|
+
for (var i = 0; i < value.length; i += 1) {
|
|
240
|
+
if (typeof value[i] !== "string" || value[i].length === 0) {
|
|
241
|
+
_throw(errorClass, code, (label || "opt") +
|
|
242
|
+
"[" + i + "] must be a non-empty string",
|
|
243
|
+
"validate-opts/bad-string-array-element");
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
return value;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
// optionalObjectWithMethod — required-shape validator for optional opts
|
|
250
|
+
// that accept a "duck-typed handle": an object that exposes a specific
|
|
251
|
+
// method. Replaces the recurring `if (opts.X !== undefined && opts.X !==
|
|
252
|
+
// null) { if (typeof opts.X !== "object" || typeof opts.X.method !==
|
|
253
|
+
// "function") throw ... }` cascade shared by file-upload (permissions),
|
|
254
|
+
// notify (queue), seeders (db), webhook (nonceStore), and others.
|
|
255
|
+
//
|
|
256
|
+
// undefined / null → returns the value unchanged (caller can default).
|
|
257
|
+
// non-object OR missing method → throws via errorClass with the operator-
|
|
258
|
+
// facing description (e.g. "must be a b.permissions instance (check fn)").
|
|
259
|
+
function optionalObjectWithMethod(value, method, label, errorClass, code, description) {
|
|
260
|
+
if (value === undefined || value === null) return value;
|
|
261
|
+
if (typeof value !== "object" || typeof value[method] !== "function") {
|
|
262
|
+
_throw(errorClass, code, (label || "opt") + " " +
|
|
263
|
+
(description || ("must expose " + method + "() method")),
|
|
264
|
+
"validate-opts/bad-shaped-handle");
|
|
265
|
+
}
|
|
266
|
+
return value;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
// optionalPlainObject — required-shape validator for optional opts that
|
|
270
|
+
// accept a plain object (not array, not null when undefined-meaning-absent
|
|
271
|
+
// is intended). Replaces the recurring `if (X !== undefined && X !== null)
|
|
272
|
+
// { if (typeof X !== "object" || Array.isArray(X)) throw }` cascade
|
|
273
|
+
// shared by api-key (metadata), db-declare-view, db-declare-row-policy,
|
|
274
|
+
// and static.js (contentSafety).
|
|
275
|
+
//
|
|
276
|
+
// undefined / null → returns the value unchanged (caller can default).
|
|
277
|
+
// non-object OR array → throws via errorClass with the operator-facing
|
|
278
|
+
// description (e.g. "metadata must be a plain object or null").
|
|
279
|
+
function optionalPlainObject(value, label, errorClass, code, description) {
|
|
280
|
+
if (value === undefined || value === null) return value;
|
|
281
|
+
if (typeof value !== "object" || Array.isArray(value)) {
|
|
282
|
+
_throw(errorClass, code, (label || "opt") + " " +
|
|
283
|
+
(description || "must be a plain object or null"),
|
|
284
|
+
"validate-opts/bad-plain-object");
|
|
285
|
+
}
|
|
286
|
+
return value;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
// makeAuditEmitter — closure factory parallel to safeAsync.makeDropCallback.
|
|
290
|
+
// Replaces the per-file `function _emit(action, info) { if (!audit) return;
|
|
291
|
+
// try { audit.safeEmit(Object.assign({ action: action }, info || {})); }
|
|
292
|
+
// catch (_e) { /* audit best-effort */ } }` boilerplate that 5 primitives
|
|
293
|
+
// previously rolled by hand (api-key / cache / notify / permissions /
|
|
294
|
+
// sigv4-bucket-ops).
|
|
295
|
+
//
|
|
296
|
+
// audit may be null/undefined — returns a no-op emitter in that case so
|
|
297
|
+
// callers don't need to null-check at every call site.
|
|
298
|
+
//
|
|
299
|
+
// var _emit = validateOpts.makeAuditEmitter(opts.audit);
|
|
300
|
+
// _emit("apikey.create", { actor: ..., resource: ..., outcome: "success" });
|
|
301
|
+
function makeAuditEmitter(audit) {
|
|
302
|
+
if (!audit || typeof audit.safeEmit !== "function") {
|
|
303
|
+
return function _noopEmit() {};
|
|
304
|
+
}
|
|
305
|
+
return function _emit(action, info) {
|
|
306
|
+
try { audit.safeEmit(Object.assign({ action: action }, info || {})); }
|
|
307
|
+
catch (_e) { /* audit best-effort — never break the caller */ }
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
// observabilityShape — operator-supplied `opts.observability` must
|
|
312
|
+
// expose an `event` function. Parallel to auditShape; the n=1 catalog
|
|
313
|
+
// tracks both inline-shape regexes.
|
|
314
|
+
function observabilityShape(observability, callerLabel, errorClass, code) {
|
|
315
|
+
if (observability === undefined || observability === null) return observability;
|
|
316
|
+
if (typeof observability !== "object" || typeof observability.event !== "function") {
|
|
317
|
+
var msg = (callerLabel || "observability") +
|
|
318
|
+
": observability must be a b.observability-shaped object (event fn)";
|
|
319
|
+
_throw(errorClass, code, msg, "observability/bad-shape");
|
|
320
|
+
}
|
|
321
|
+
return observability;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
module.exports = check;
|
|
325
|
+
module.exports.check = check;
|
|
326
|
+
module.exports.auditShape = auditShape;
|
|
327
|
+
module.exports.optionalBoolean = optionalBoolean;
|
|
328
|
+
module.exports.optionalPositiveInt = optionalPositiveInt;
|
|
329
|
+
module.exports.optionalFiniteNonNegative = optionalFiniteNonNegative;
|
|
330
|
+
module.exports.optionalPositiveFinite = optionalPositiveFinite;
|
|
331
|
+
module.exports.optionalFunction = optionalFunction;
|
|
332
|
+
module.exports.optionalNonEmptyString = optionalNonEmptyString;
|
|
333
|
+
module.exports.optionalNonEmptyStringArray = optionalNonEmptyStringArray;
|
|
334
|
+
module.exports.optionalObjectWithMethod = optionalObjectWithMethod;
|
|
335
|
+
module.exports.optionalPlainObject = optionalPlainObject;
|
|
336
|
+
module.exports.requireNonEmptyString = requireNonEmptyString;
|
|
337
|
+
module.exports.observabilityShape = observabilityShape;
|
|
338
|
+
module.exports.requireObject = requireObject;
|
|
339
|
+
module.exports.applyDefaults = applyDefaults;
|
|
340
|
+
module.exports.makeAuditEmitter = makeAuditEmitter;
|