@blamejs/core 0.18.46 → 0.18.48

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.
@@ -228,7 +228,7 @@ function _detectIssues(input, opts) {
228
228
  * bidiPolicy: "reject"|"audit"|"allow",
229
229
  * controlPolicy: "reject"|"audit"|"allow",
230
230
  * nullBytePolicy: "reject"|"audit"|"allow",
231
- * zeroWidthPolicy: "reject"|"strip"|"audit"|"allow",
231
+ * zeroWidthPolicy: "reject"|"audit"|"allow",
232
232
  * jinjaPolicy: "reject"|"audit"|"allow",
233
233
  * erbPolicy: "reject"|"audit"|"allow",
234
234
  * pugPolicy: "reject"|"audit"|"allow",
@@ -316,7 +316,20 @@ var INTEGRATION_FIXTURES = gateContract.identifierFixtures("Hello world", "Hello
316
316
  // factory default serve -> audit-only -> refuse chain; ctxFields names the
317
317
  // ctx fields it reads (ctx.identifier, then ctx.text) so untrusted strings on
318
318
  // either field reach the SSTI validator before any engine renders them.
319
+ // Each policy's vocabulary, so a misspelling is a boot error rather than a
320
+ // runtime surprise. Read leniently, a typo takes whichever branch is not the
321
+ // strict one: `jinjaPolicy: "rejct"` is not "allow", so the check runs, and it
322
+ // is not "reject" either, so the finding drops to a warning.
323
+ //
324
+ // The character policies are absent on purpose — they are derived for the
325
+ // whole guard family, and an entry here would shadow that derivation.
326
+ var POLICY_ENUM = gateContract.policyVocabulary([
327
+ "jinjaPolicy", "erbPolicy", "pugPolicy", "dollarBracePolicy",
328
+ "velocityDirectivePolicy",
329
+ ], gateContract.POLICY_VALUES.rejectAuditAllow);
330
+
319
331
  module.exports = gateContract.defineGuard({
332
+ enumOpts: POLICY_ENUM,
320
333
  name: "template",
321
334
  kind: "identifier",
322
335
  errorClass: GuardTemplateError,
package/lib/guard-text.js CHANGED
@@ -118,6 +118,20 @@ var COMPLIANCE_POSTURES = gateContract.compliancePostures(PROFILES, { base: 256
118
118
  // so this guard's hand-bound resolver holds a caller to the same rules the
119
119
  // generated validate() does. maxRuntimeMs is deliberately absent: zero there
120
120
  // means no runtime budget. See guard-image for the full reasoning.
121
+ // Each policy's vocabulary, so a misspelling is a boot error rather than a
122
+ // runtime surprise. Read leniently, a typo takes whichever branch is not the
123
+ // strict one: `encodingPolicy: "rejct"` is not "allow", so the check runs, and
124
+ // it is not "reject" either, so malformed UTF-8 drops to a warning.
125
+ var POLICY_ENUM = gateContract.policyVocabulary(
126
+ ["confusablePolicy", "encodingPolicy"],
127
+ gateContract.POLICY_VALUES.rejectAuditAllow);
128
+
129
+ // The same table for the entry points that bind their own resolver, with the
130
+ // family's character policies folded in — defineGuard adds those itself, a
131
+ // hand-bound resolver has to be given them.
132
+ var RESOLVER_ENUMS = Object.freeze(Object.assign({},
133
+ gateContract.charPolicyEnums(DEFAULTS, { canRepair: true }), POLICY_ENUM));
134
+
121
135
  var INT_OPTS = ["maxBytes"];
122
136
 
123
137
  // ---- Internal helpers ----
@@ -129,9 +143,13 @@ function _resolveOpts(opts) {
129
143
  defaults: DEFAULTS,
130
144
  errorClass: GuardTextError,
131
145
  errCodePrefix: "text",
132
- // Own resolver, own cap declaration — see guard-image.gate.
146
+ // Own resolver, own cap declaration — see guard-image.gate. The policy
147
+ // vocabulary comes with it for the same reason: a hand-bound resolver that
148
+ // omits it accepts `bidiPolicy: "rejct"` on gate() and validate() while the
149
+ // generated path refuses it.
133
150
  intOpts: INT_OPTS,
134
151
  nonNegativeOpts: gateContract.capKeysOf(DEFAULTS),
152
+ enumOpts: RESOLVER_ENUMS,
135
153
  });
136
154
  }
137
155
 
@@ -571,8 +589,10 @@ var INTEGRATION_FIXTURES = Object.freeze({
571
589
  // inspection surface (validate / sanitize / gate). The bespoke `gate` carries
572
590
  // the text sanitize-then-refuse chain (confusables are non-repairable).
573
591
  module.exports = gateContract.defineGuard({
592
+ enumOpts: POLICY_ENUM,
574
593
  name: "text",
575
594
  kind: "content",
595
+ charRepair: true,
576
596
  errorClass: GuardTextError,
577
597
  profiles: PROFILES,
578
598
  defaults: DEFAULTS,
package/lib/guard-time.js CHANGED
@@ -299,10 +299,10 @@ function _detectIssues(input, opts) {
299
299
  * @opts
300
300
  * profile: "strict"|"balanced"|"permissive",
301
301
  * compliancePosture: "hipaa"|"pci-dss"|"gdpr"|"soc2",
302
- * bidiPolicy: "reject"|"strip"|"audit"|"allow",
303
- * controlPolicy: "reject"|"strip"|"allow",
304
- * nullBytePolicy: "reject"|"strip"|"allow",
305
- * zeroWidthPolicy: "reject"|"strip"|"allow",
302
+ * bidiPolicy: "reject"|"audit"|"allow",
303
+ * controlPolicy: "reject"|"audit"|"allow",
304
+ * nullBytePolicy: "reject"|"audit"|"allow",
305
+ * zeroWidthPolicy: "reject"|"audit"|"allow",
306
306
  * naiveDatetimePolicy: "reject"|"audit"|"allow",
307
307
  * nonUtcOffsetPolicy: "reject"|"audit"|"allow",
308
308
  * leapSecondPolicy: "reject"|"audit"|"allow",
@@ -393,7 +393,23 @@ var INTEGRATION_FIXTURES = gateContract.identifierFixtures("2026-05-05T12:34:56Z
393
393
  // surface (validate / sanitize). The gate is the factory default — the
394
394
  // standard serve -> audit-only -> refuse chain — reading
395
395
  // ctx.identifier / ctx.timestamp / ctx.time via ctxFields.
396
+ // Each policy's vocabulary, so a misspelling is a boot error rather than a
397
+ // runtime surprise. Read leniently, a typo takes whichever branch is not the
398
+ // strict one: `naiveDatetimePolicy: "rejct"` is not "allow", so the check
399
+ // runs, and it is not "reject" either, so a zone-less timestamp drops to a
400
+ // warning.
401
+ //
402
+ // `fractionalDigitsPolicy` carries "truncate" because over-precise fractional
403
+ // seconds are the one finding here that can be repaired rather than reported.
404
+ var POLICY_ENUM = gateContract.policyVocabulary([
405
+ "naiveDatetimePolicy", "nonUtcOffsetPolicy", "leapSecondPolicy",
406
+ "dateOnlyPolicy", "timeOnlyPolicy",
407
+ ], gateContract.POLICY_VALUES.rejectAuditAllow, {
408
+ fractionalDigitsPolicy: ["reject", "truncate", "audit", "audit-only", "allow"],
409
+ });
410
+
396
411
  module.exports = gateContract.defineGuard({
412
+ enumOpts: POLICY_ENUM,
397
413
  name: "time",
398
414
  kind: "identifier",
399
415
  errorClass: GuardTimeError,
package/lib/guard-uuid.js CHANGED
@@ -286,10 +286,10 @@ function _detectIssues(input, opts) {
286
286
  * @opts
287
287
  * profile: "strict"|"balanced"|"permissive",
288
288
  * compliancePosture: "hipaa"|"pci-dss"|"gdpr"|"soc2",
289
- * bidiPolicy: "reject"|"strip"|"audit"|"allow",
290
- * controlPolicy: "reject"|"strip"|"allow",
291
- * nullBytePolicy: "reject"|"strip"|"allow",
292
- * zeroWidthPolicy: "reject"|"strip"|"allow",
289
+ * bidiPolicy: "reject"|"audit"|"allow",
290
+ * controlPolicy: "reject"|"audit"|"allow",
291
+ * nullBytePolicy: "reject"|"audit"|"allow",
292
+ * zeroWidthPolicy: "reject"|"audit"|"allow",
293
293
  * formatPolicy: "hyphenated"|"hyphenless"|"braced"|"urn"|"hyphenated-only"|"any",
294
294
  * versionPolicy: "reject-unassigned"|"audit"|"allow",
295
295
  * variantPolicy: "reject-non-rfc"|"audit"|"allow",
@@ -371,10 +371,34 @@ var INTEGRATION_FIXTURES = gateContract.identifierFixtures("550e8400-e29b-41d4-a
371
371
  // surface (validate / sanitize). The gate is the factory default — the
372
372
  // standard serve -> audit-only -> refuse chain — reading ctx.identifier ||
373
373
  // ctx.uuid via ctxFields.
374
+ // Each policy's vocabulary, so a misspelling is a boot error rather than a
375
+ // runtime surprise. Read leniently, a typo takes whichever branch is not the
376
+ // strict one: `versionPolicy: "reject-unassinged"` is not "allow", so the check
377
+ // runs, and it is not the reject spelling either, so the finding drops to a
378
+ // warning — the operator asked to refuse an unassigned version and silently got
379
+ // an audit. The values are the ones written beside each profile entry above,
380
+ // confirmed against what the code compares.
381
+ //
382
+ // `audit-only` rides with `audit` because it behaves identically here and the
383
+ // framework treats them as synonyms everywhere else; refusing it here while
384
+ // accepting it elsewhere would be a fresh disagreement between two spellings of
385
+ // one setting.
386
+ var POLICY_ENUM = gateContract.policyVocabulary([
387
+ "nilPolicy", "maxPolicy", "urnPolicy", "bracedPolicy",
388
+ ], gateContract.POLICY_VALUES.rejectAuditAllow, {
389
+ // These three name their own values because their findings are not "this
390
+ // construct appeared" but "the identifier is the wrong shape", and the
391
+ // refusal has to say which shape it wanted.
392
+ formatPolicy: ["hyphenated", "hyphenless", "braced", "urn", "hyphenated-only", "any"],
393
+ versionPolicy: ["reject-unassigned", "audit", "audit-only", "allow"],
394
+ variantPolicy: ["reject-non-rfc", "audit", "audit-only", "allow"],
395
+ });
396
+
374
397
  module.exports = gateContract.defineGuard({
375
398
  name: "uuid",
376
399
  kind: "identifier",
377
400
  errorClass: GuardUuidError,
401
+ enumOpts: POLICY_ENUM,
378
402
  profiles: PROFILES,
379
403
  defaults: DEFAULTS,
380
404
  postures: COMPLIANCE_POSTURES,
package/lib/guard-xml.js CHANGED
@@ -733,9 +733,29 @@ var INTEGRATION_FIXTURES = Object.freeze({
733
733
  // ENTITY / external / parameter-entity throwing while strip-able char-class
734
734
  // threats are repaired. The bespoke `gate` carries XML's per-policy
735
735
  // canSanitize matrix unchanged.
736
+ // Each policy's vocabulary, so a misspelling is a boot error rather than a
737
+ // runtime surprise. Read leniently, a typo takes whichever branch is not the
738
+ // strict one: `externalEntityPolicy: "rejct"` is not "allow", so the check
739
+ // runs, and it is not "reject" either, so an XXE vector drops to a warning.
740
+ //
741
+ // `xmlDsigPolicy` has no "reject": a signature block is a legitimate part of a
742
+ // signed document, so the guard reports its presence and leaves verification
743
+ // to the caller rather than refusing the document for carrying one.
744
+ //
745
+ // The character policies are absent on purpose — they are derived for the
746
+ // whole guard family, and an entry here would shadow that derivation.
747
+ var POLICY_ENUM = gateContract.policyVocabulary([
748
+ "doctypePolicy", "entityPolicy", "externalEntityPolicy", "xincludePolicy",
749
+ "processingInstrPolicy", "cdataPolicy", "schemaLocationPolicy",
750
+ ], gateContract.POLICY_VALUES.rejectAuditAllow, {
751
+ xmlDsigPolicy: ["audit", "audit-only", "allow"],
752
+ });
753
+
736
754
  var _guard = module.exports = gateContract.defineGuard({
755
+ enumOpts: POLICY_ENUM,
737
756
  name: "xml",
738
757
  kind: "content",
758
+ charRepair: true,
739
759
  errorClass: GuardXmlError,
740
760
  profiles: PROFILES,
741
761
  defaults: DEFAULTS,
package/lib/guard-yaml.js CHANGED
@@ -262,6 +262,25 @@ var COMPLIANCE_POSTURES = gateContract.compliancePostures(PROFILES, { base: 256
262
262
  // The options that are genuinely CAPS, where zero is not a setting — named once
263
263
  // so this guard's hand-bound parse() and gate() hold a caller to the same rules
264
264
  // the generated validate() does. See guard-image for the full reasoning.
265
+ // Each policy's vocabulary, so a misspelling is a boot error rather than a
266
+ // runtime surprise. Read leniently, a typo takes whichever branch is not the
267
+ // strict one: `aliasPolicy: "rejct"` is not "allow", so the check runs, and it
268
+ // is not "reject" either, so a billion-laughs alias drops to a warning.
269
+ //
270
+ // `audit-only` is absent: tagPolicy tests for "audit" exactly, and a guard
271
+ // whose policies do not all take the same values is worse than one that takes
272
+ // fewer.
273
+ var POLICY_ENUM = gateContract.policyVocabulary([
274
+ "tagPolicy", "aliasPolicy", "multiDocPolicy", "norwayPolicy",
275
+ "leadingZeroPolicy", "duplicateKeyPolicy", "mergeKeyPolicy",
276
+ ], ["reject", "audit", "allow"]);
277
+
278
+ // The same table for the entry points that bind their own resolver, with the
279
+ // family's character policies folded in — defineGuard adds those itself, a
280
+ // hand-bound resolver has to be given them.
281
+ var RESOLVER_ENUMS = Object.freeze(Object.assign({},
282
+ gateContract.charPolicyEnums(DEFAULTS, { canRepair: true }), POLICY_ENUM));
283
+
265
284
  var INT_OPTS = ["maxBytes", "maxDepth", "maxAnchors", "maxAliasDepth",
266
285
  "maxDocuments", "maxNodes", "maxScalarLength"];
267
286
 
@@ -648,9 +667,12 @@ function parse(input, opts) {
648
667
  defaults: DEFAULTS,
649
668
  errorClass: GuardYamlError,
650
669
  errCodePrefix: "yaml",
651
- // Own resolver, own cap declaration — see guard-image.gate.
670
+ // Own resolver, own cap declaration — see guard-image.gate. The policy
671
+ // vocabulary comes with it: a hand-bound resolver that omits it accepts
672
+ // `bidiPolicy: "rejct"` here while the generated path refuses it.
652
673
  intOpts: INT_OPTS,
653
674
  nonNegativeOpts: gateContract.capKeysOf(DEFAULTS),
675
+ enumOpts: RESOLVER_ENUMS,
654
676
  });
655
677
  if (typeof input !== "string") {
656
678
  throw _err("yaml.bad-input", "parse requires string input");
@@ -797,9 +819,12 @@ function gate(opts) {
797
819
  defaults: DEFAULTS,
798
820
  errorClass: GuardYamlError,
799
821
  errCodePrefix: "yaml",
800
- // Own resolver, own cap declaration — see guard-image.gate.
822
+ // Own resolver, own cap declaration — see guard-image.gate. The policy
823
+ // vocabulary comes with it: a hand-bound resolver that omits it accepts
824
+ // `bidiPolicy: "rejct"` here while the generated path refuses it.
801
825
  intOpts: INT_OPTS,
802
826
  nonNegativeOpts: gateContract.capKeysOf(DEFAULTS),
827
+ enumOpts: RESOLVER_ENUMS,
803
828
  });
804
829
  return gateContract.buildContentGate({
805
830
  name: opts.name || "guardYaml:" + (opts.profile || "default"),
@@ -811,8 +836,10 @@ function gate(opts) {
811
836
  }
812
837
 
813
838
  module.exports = gateContract.defineGuard({
839
+ enumOpts: POLICY_ENUM,
814
840
  name: "yaml",
815
841
  kind: "content",
842
+ charRepair: true,
816
843
  errorClass: GuardYamlError,
817
844
  profiles: PROFILES,
818
845
  defaults: DEFAULTS,
@@ -2086,8 +2086,13 @@ function isNullMx(mxRecords) {
2086
2086
  * Classify a DNSKEY / RRSIG algorithm number against the IANA DNS
2087
2087
  * Security Algorithm Numbers registry, flagging SHA-1-based and
2088
2088
  * other deprecated algorithms per RFC 9905 (Deprecating DNSSEC
2089
- * SHA-1 Usage), RFC 8624 (Algorithm Implementation Requirements),
2090
- * and RFC 6944 / RFC 6725 (RSAMD5 deprecation).
2089
+ * SHA-1 Usage), RFC 9904 (Algorithm Implementation Requirements,
2090
+ * which obsoletes RFC 8624), and RFC 6725 (RSAMD5 deprecation).
2091
+ *
2092
+ * `deprecated` answers "should this still be accepted", so it follows
2093
+ * the VALIDATION requirement. Where a spelling differs between signing
2094
+ * and validation — RSASHA512 is NOT RECOMMENDED to sign with but MUST
2095
+ * still validate — the `reason` names both, since one boolean cannot.
2091
2096
  *
2092
2097
  * Returns `{ algorithm, name, deprecated, reason, known }` for any
2093
2098
  * IANA-assigned number; `known: false` for unassigned numbers
@@ -2123,18 +2128,22 @@ function isNullMx(mxRecords) {
2123
2128
  // auditing DNSSEC chain-of-trust evidence know they cannot validate
2124
2129
  // the entry against a public algorithm registry.
2125
2130
  var DNSKEY_ALGORITHMS = Object.freeze({
2126
- 1: { name: "RSAMD5", deprecated: true, reason: "MD5 broken (RFC 6944 §2.1, RFC 6725)" },
2131
+ 1: { name: "RSAMD5", deprecated: true, reason: "MD5 broken; deprecated for zone signing (RFC 6725 §2.2)" },
2127
2132
  2: { name: "DH", deprecated: true, reason: "Diffie-Hellman key (RFC 2539) — never widely deployed; superseded by signature algorithms" },
2128
- 3: { name: "DSA", deprecated: true, reason: "DSA deprecated (RFC 8624 §3.1)" },
2133
+ 3: { name: "DSA", deprecated: true, reason: "DSA MUST NOT be used for signing or validation (RFC 9904 Table 2)" },
2129
2134
  4: { name: "Reserved", deprecated: true, reason: "Reserved (RFC 4034 §A.1) — not for production use" },
2130
2135
  5: { name: "RSASHA1", deprecated: true, reason: "SHA-1 deprecated (RFC 9905 §3)" },
2131
- 6: { name: "DSA-NSEC3-SHA1", deprecated: true, reason: "SHA-1 deprecated (RFC 9905 §3); DSA deprecated (RFC 8624 §3.1)" },
2136
+ 6: { name: "DSA-NSEC3-SHA1", deprecated: true, reason: "SHA-1 deprecated (RFC 9905 §3); DSA MUST NOT be used (RFC 9904 Table 2)" },
2132
2137
  7: { name: "RSASHA1-NSEC3-SHA1", deprecated: true, reason: "SHA-1 deprecated (RFC 9905 §3)" },
2133
2138
  8: { name: "RSASHA256", deprecated: false, reason: "current — RFC 5702" }, // IANA DNSKEY algorithm number
2134
2139
  9: { name: "Reserved", deprecated: true, reason: "Reserved (RFC 5155) — not for production use" },
2135
- 10: { name: "RSASHA512", deprecated: false, reason: "current RFC 5702" },
2140
+ // Not deprecated — validation is still MUST, so a caller deciding whether to
2141
+ // ACCEPT a zone must keep accepting it. But it is NOT RECOMMENDED to sign
2142
+ // with, and reporting it as plainly "current" answered a signing question
2143
+ // with the opposite of what the current RFC says.
2144
+ 10: { name: "RSASHA512", deprecated: false, reason: "defined in RFC 5702; RFC 9904 Table 2 — signing NOT RECOMMENDED, validation MUST" },
2136
2145
  11: { name: "Reserved", deprecated: true, reason: "Reserved (RFC 5155) — not for production use" },
2137
- 12: { name: "ECC-GOST", deprecated: true, reason: "deprecated (RFC 8624 §3.1)" },
2146
+ 12: { name: "ECC-GOST", deprecated: true, reason: "MUST NOT be used for signing (RFC 9904 Table 2)" },
2138
2147
  13: { name: "ECDSAP256SHA256", deprecated: false, reason: "current — RFC 6605" },
2139
2148
  14: { name: "ECDSAP384SHA384", deprecated: false, reason: "current — RFC 6605" },
2140
2149
  15: { name: "ED25519", deprecated: false, reason: "current — RFC 8080" },
@@ -2173,15 +2182,19 @@ var DNSKEY_ALGORITHMS = Object.freeze({
2173
2182
  * // → { digestType: 2, name: "SHA-256", deprecated: false, ... }
2174
2183
  */
2175
2184
 
2176
- // DS digest-type vocabulary (RFC 4034 §5.1 + RFC 6605 §6 + RFC 8624
2177
- // §3.2 + RFC 9558). Digest type 1 = SHA-1 is deprecated per RFC 9905
2178
- // §4. Digest types 5 (GOST R 34.11-2012) and 6 (SM3) added by RFC
2179
- // 9558. Reserved value 0 surfaced for completeness.
2185
+ // DS digest-type vocabulary (RFC 4034 §5.1 + RFC 6605 §6 + RFC 9904
2186
+ // Table 3 + RFC 9558). Digest type 1 = SHA-1 is deprecated per RFC 9905
2187
+ // §4 RFC 9904 Table 3 spells it MUST NOT for delegation and MUST for
2188
+ // validation, so `deprecated` follows the delegation side here for the
2189
+ // same reason it follows validation in the DNSKEY table: that is the
2190
+ // side an operator can still choose. Digest types 5 (GOST R 34.11-2012)
2191
+ // and 6 (SM3) added by RFC 9558. Reserved value 0 surfaced for
2192
+ // completeness.
2180
2193
  var DS_DIGEST_TYPES = Object.freeze({
2181
2194
  0: { name: "Reserved", deprecated: true, reason: "Reserved (RFC 3658) — not for production use" },
2182
2195
  1: { name: "SHA-1", deprecated: true, reason: "SHA-1 deprecated (RFC 9905 §4)" },
2183
2196
  2: { name: "SHA-256", deprecated: false, reason: "current — RFC 4509" },
2184
- 3: { name: "GOST R 34.11-94", deprecated: true, reason: "deprecated (RFC 8624 §3.2; superseded by GOST 2012 in RFC 9558)" },
2197
+ 3: { name: "GOST R 34.11-94", deprecated: true, reason: "MUST NOT be used for delegation (RFC 9904 Table 3); superseded by GOST 2012 in RFC 9558" },
2185
2198
  4: { name: "SHA-384", deprecated: false, reason: "current — RFC 6605 §6" },
2186
2199
  5: { name: "GOST R 34.11-2012", deprecated: false, reason: "current — RFC 9558 §3" },
2187
2200
  6: { name: "SM3", deprecated: false, reason: "current — RFC 9558 §3 (Chinese national standard)" },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@blamejs/core",
3
- "version": "0.18.46",
3
+ "version": "0.18.48",
4
4
  "description": "The Node framework that owns its stack.",
5
5
  "license": "Apache-2.0",
6
6
  "author": "blamejs contributors",
package/sbom.cdx.json CHANGED
@@ -2,10 +2,10 @@
2
2
  "$schema": "http://cyclonedx.org/schema/bom-1.5.schema.json",
3
3
  "bomFormat": "CycloneDX",
4
4
  "specVersion": "1.5",
5
- "serialNumber": "urn:uuid:7d5783b2-ffef-415c-b303-2b4cc46bc73c",
5
+ "serialNumber": "urn:uuid:a63c2af3-b9b9-4c06-b74a-dd7049ac3f6c",
6
6
  "version": 1,
7
7
  "metadata": {
8
- "timestamp": "2026-08-22T08:31:57.142Z",
8
+ "timestamp": "2026-08-22T16:44:54.517Z",
9
9
  "lifecycles": [
10
10
  {
11
11
  "phase": "build"
@@ -19,14 +19,14 @@
19
19
  }
20
20
  ],
21
21
  "component": {
22
- "bom-ref": "@blamejs/core@0.18.46",
22
+ "bom-ref": "@blamejs/core@0.18.48",
23
23
  "type": "application",
24
24
  "name": "blamejs",
25
- "version": "0.18.46",
25
+ "version": "0.18.48",
26
26
  "scope": "required",
27
27
  "author": "blamejs contributors",
28
28
  "description": "The Node framework that owns its stack.",
29
- "purl": "pkg:npm/%40blamejs/core@0.18.46",
29
+ "purl": "pkg:npm/%40blamejs/core@0.18.48",
30
30
  "properties": [],
31
31
  "externalReferences": [
32
32
  {
@@ -54,7 +54,7 @@
54
54
  "components": [],
55
55
  "dependencies": [
56
56
  {
57
- "ref": "@blamejs/core@0.18.46",
57
+ "ref": "@blamejs/core@0.18.48",
58
58
  "dependsOn": []
59
59
  }
60
60
  ]