aontu 0.52.1 → 0.54.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/README.md +88 -0
- package/bin/aontu-mcp.js +4 -0
- package/dist/agentsmd.d.ts +16 -0
- package/dist/agentsmd.js +107 -0
- package/dist/agentsmd.js.map +1 -0
- package/dist/aontu.d.ts +15 -3
- package/dist/aontu.js +126 -5
- package/dist/aontu.js.map +1 -1
- package/dist/cli.d.ts +45 -1
- package/dist/cli.js +2845 -69
- package/dist/cli.js.map +1 -1
- package/dist/ctx.d.ts +18 -0
- package/dist/ctx.js +44 -0
- package/dist/ctx.js.map +1 -1
- package/dist/diff.d.ts +22 -0
- package/dist/diff.js +141 -0
- package/dist/diff.js.map +1 -0
- package/dist/err.d.ts +3 -1
- package/dist/err.js +45 -8
- package/dist/err.js.map +1 -1
- package/dist/graph.d.ts +13 -0
- package/dist/graph.js +110 -0
- package/dist/graph.js.map +1 -0
- package/dist/hcanon.d.ts +3 -0
- package/dist/hcanon.js +145 -0
- package/dist/hcanon.js.map +1 -0
- package/dist/hints.js +235 -8
- package/dist/hints.js.map +1 -1
- package/dist/jsonschema.d.ts +20 -0
- package/dist/jsonschema.js +425 -0
- package/dist/jsonschema.js.map +1 -0
- package/dist/lang.js +955 -110
- package/dist/lang.js.map +1 -1
- package/dist/lsp.d.ts +9 -2
- package/dist/lsp.js +343 -48
- package/dist/lsp.js.map +1 -1
- package/dist/mcp-server.d.ts +20 -0
- package/dist/mcp-server.js +147 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/mcp.d.ts +42 -0
- package/dist/mcp.js +941 -0
- package/dist/mcp.js.map +1 -0
- package/dist/mod-tool.d.ts +58 -0
- package/dist/mod-tool.js +532 -0
- package/dist/mod-tool.js.map +1 -0
- package/dist/mod.d.ts +35 -0
- package/dist/mod.js +345 -0
- package/dist/mod.js.map +1 -0
- package/dist/patch.d.ts +49 -0
- package/dist/patch.js +506 -0
- package/dist/patch.js.map +1 -0
- package/dist/provenance.d.ts +41 -0
- package/dist/provenance.js +336 -0
- package/dist/provenance.js.map +1 -0
- package/dist/query.d.ts +27 -0
- package/dist/query.js +294 -0
- package/dist/query.js.map +1 -0
- package/dist/reach.d.ts +15 -0
- package/dist/reach.js +168 -0
- package/dist/reach.js.map +1 -0
- package/dist/relation.d.ts +23 -0
- package/dist/relation.js +230 -0
- package/dist/relation.js.map +1 -0
- package/dist/report-sarif.d.ts +14 -0
- package/dist/report-sarif.js +102 -0
- package/dist/report-sarif.js.map +1 -0
- package/dist/sig.d.ts +25 -0
- package/dist/sig.js +277 -0
- package/dist/sig.js.map +1 -0
- package/dist/sigdecl.d.ts +2 -0
- package/dist/sigdecl.js +11 -0
- package/dist/sigdecl.js.map +1 -0
- package/dist/siggate.d.ts +4 -0
- package/dist/siggate.js +90 -0
- package/dist/siggate.js.map +1 -0
- package/dist/site.d.ts +4 -0
- package/dist/site.js +31 -0
- package/dist/site.js.map +1 -1
- package/dist/std.d.ts +1 -0
- package/dist/std.js +129 -0
- package/dist/std.js.map +1 -0
- package/dist/subsume.d.ts +39 -0
- package/dist/subsume.js +573 -0
- package/dist/subsume.js.map +1 -0
- package/dist/trim.d.ts +19 -0
- package/dist/trim.js +155 -0
- package/dist/trim.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/type.d.ts +17 -1
- package/dist/type.js.map +1 -1
- package/dist/unify.d.ts +2 -1
- package/dist/unify.js +234 -38
- package/dist/unify.js.map +1 -1
- package/dist/utility.d.ts +8 -1
- package/dist/utility.js +68 -1
- package/dist/utility.js.map +1 -1
- package/dist/val/AggFuncVal.d.ts +44 -0
- package/dist/val/AggFuncVal.js +364 -0
- package/dist/val/AggFuncVal.js.map +1 -0
- package/dist/val/ArithFuncVal.d.ts +31 -0
- package/dist/val/ArithFuncVal.js +62 -0
- package/dist/val/ArithFuncVal.js.map +1 -0
- package/dist/val/BagVal.d.ts +7 -0
- package/dist/val/BagVal.js +150 -11
- package/dist/val/BagVal.js.map +1 -1
- package/dist/val/CloseFuncVal.js +9 -1
- package/dist/val/CloseFuncVal.js.map +1 -1
- package/dist/val/ConjunctVal.d.ts +1 -1
- package/dist/val/ConjunctVal.js +19 -0
- package/dist/val/ConjunctVal.js.map +1 -1
- package/dist/val/ConstraintVal.d.ts +7 -1
- package/dist/val/ConstraintVal.js +523 -45
- package/dist/val/ConstraintVal.js.map +1 -1
- package/dist/val/ContainerKindVal.d.ts +35 -0
- package/dist/val/ContainerKindVal.js +99 -0
- package/dist/val/ContainerKindVal.js.map +1 -0
- package/dist/val/CopyFuncVal.d.ts +1 -2
- package/dist/val/CopyFuncVal.js.map +1 -1
- package/dist/val/Decimal.d.ts +1 -0
- package/dist/val/Decimal.js +13 -0
- package/dist/val/Decimal.js.map +1 -1
- package/dist/val/DeprecateFuncVal.d.ts +11 -0
- package/dist/val/DeprecateFuncVal.js +47 -0
- package/dist/val/DeprecateFuncVal.js.map +1 -0
- package/dist/val/DisjunctVal.d.ts +1 -2
- package/dist/val/DisjunctVal.js +269 -53
- package/dist/val/DisjunctVal.js.map +1 -1
- package/dist/val/EachFuncVal.d.ts +15 -0
- package/dist/val/EachFuncVal.js +75 -0
- package/dist/val/EachFuncVal.js.map +1 -0
- package/dist/val/ExpectVal.js +62 -4
- package/dist/val/ExpectVal.js.map +1 -1
- package/dist/val/FeatureVal.js +1 -1
- package/dist/val/FeatureVal.js.map +1 -1
- package/dist/val/FilterFuncVal.d.ts +15 -0
- package/dist/val/FilterFuncVal.js +91 -0
- package/dist/val/FilterFuncVal.js.map +1 -0
- package/dist/val/FuncBaseVal.d.ts +7 -1
- package/dist/val/FuncBaseVal.js +183 -2
- package/dist/val/FuncBaseVal.js.map +1 -1
- package/dist/val/GraphAtomVal.d.ts +39 -0
- package/dist/val/GraphAtomVal.js +184 -0
- package/dist/val/GraphAtomVal.js.map +1 -0
- package/dist/val/HideFuncVal.js.map +1 -1
- package/dist/val/JunctionVal.js +24 -1
- package/dist/val/JunctionVal.js.map +1 -1
- package/dist/val/KeyFuncVal.d.ts +1 -1
- package/dist/val/KeyFuncVal.js +38 -30
- package/dist/val/KeyFuncVal.js.map +1 -1
- package/dist/val/ListVal.js +94 -14
- package/dist/val/ListVal.js.map +1 -1
- package/dist/val/LowerFuncVal.js.map +1 -1
- package/dist/val/MapVal.d.ts +1 -0
- package/dist/val/MapVal.js +146 -14
- package/dist/val/MapVal.js.map +1 -1
- package/dist/val/MatchFuncVal.d.ts +15 -0
- package/dist/val/MatchFuncVal.js +107 -0
- package/dist/val/MatchFuncVal.js.map +1 -0
- package/dist/val/MoveFuncVal.js.map +1 -1
- package/dist/val/NilVal.js +24 -0
- package/dist/val/NilVal.js.map +1 -1
- package/dist/val/OpBaseVal.d.ts +1 -1
- package/dist/val/OpBaseVal.js +19 -1
- package/dist/val/OpBaseVal.js.map +1 -1
- package/dist/val/OpenFuncVal.js +4 -1
- package/dist/val/OpenFuncVal.js.map +1 -1
- package/dist/val/PackFuncVal.d.ts +15 -0
- package/dist/val/PackFuncVal.js +108 -0
- package/dist/val/PackFuncVal.js.map +1 -0
- package/dist/val/PathFuncVal.d.ts +2 -2
- package/dist/val/PathFuncVal.js +75 -16
- package/dist/val/PathFuncVal.js.map +1 -1
- package/dist/val/PathVal.d.ts +25 -0
- package/dist/val/PathVal.js +150 -0
- package/dist/val/PathVal.js.map +1 -0
- package/dist/val/PlaceVal.d.ts +13 -0
- package/dist/val/PlaceVal.js +131 -0
- package/dist/val/PlaceVal.js.map +1 -0
- package/dist/val/PlusOpVal.d.ts +2 -1
- package/dist/val/PlusOpVal.js +61 -37
- package/dist/val/PlusOpVal.js.map +1 -1
- package/dist/val/PrefFuncVal.js.map +1 -1
- package/dist/val/PrefVal.d.ts +4 -2
- package/dist/val/PrefVal.js +223 -41
- package/dist/val/PrefVal.js.map +1 -1
- package/dist/val/RecurseVal.d.ts +19 -0
- package/dist/val/RecurseVal.js +217 -0
- package/dist/val/RecurseVal.js.map +1 -0
- package/dist/val/RefVal.d.ts +3 -2
- package/dist/val/RefVal.js +181 -66
- package/dist/val/RefVal.js.map +1 -1
- package/dist/val/ReferFuncVal.d.ts +59 -0
- package/dist/val/ReferFuncVal.js +604 -0
- package/dist/val/ReferFuncVal.js.map +1 -0
- package/dist/val/ScalarKindVal.d.ts +4 -3
- package/dist/val/ScalarKindVal.js +12 -12
- package/dist/val/ScalarKindVal.js.map +1 -1
- package/dist/val/SuperFuncVal.d.ts +4 -2
- package/dist/val/SuperFuncVal.js +118 -14
- package/dist/val/SuperFuncVal.js.map +1 -1
- package/dist/val/TopVal.d.ts +1 -1
- package/dist/val/TopVal.js.map +1 -1
- package/dist/val/TypeFuncVal.js.map +1 -1
- package/dist/val/UpperFuncVal.js.map +1 -1
- package/dist/val/Val.d.ts +7 -1
- package/dist/val/Val.js +170 -2
- package/dist/val/Val.js.map +1 -1
- package/dist/val/VarVal.js.map +1 -1
- package/dist/val/arith.d.ts +6 -0
- package/dist/val/arith.js +173 -0
- package/dist/val/arith.js.map +1 -0
- package/dist/vet.d.ts +45 -0
- package/dist/vet.js +802 -0
- package/dist/vet.js.map +1 -0
- package/dist/view.d.ts +85 -0
- package/dist/view.js +1948 -0
- package/dist/view.js.map +1 -0
- package/dist/walk.d.ts +2 -0
- package/dist/walk.js +91 -0
- package/dist/walk.js.map +1 -0
- package/grammar/aontu.gbnf +138 -0
- package/grammar/aontu.lark +118 -0
- package/grammar/aontu.tmLanguage.json +184 -0
- package/package.json +30 -8
- package/skill/SKILL.md +37 -0
- package/skill/error-codes.md +62 -0
- package/skill/examples.md +99 -0
- package/skill/grammar-card.md +56 -0
- package/src/agentsmd.ts +135 -0
- package/src/aontu.ts +166 -5
- package/src/cli.ts +3324 -72
- package/src/ctx.ts +93 -1
- package/src/diff.ts +198 -0
- package/src/err.ts +50 -8
- package/src/graph.ts +185 -0
- package/src/hcanon.ts +167 -0
- package/src/hints.ts +291 -8
- package/src/jsonschema.ts +552 -0
- package/src/lang.ts +1049 -110
- package/src/lsp.ts +351 -49
- package/src/mcp-server.ts +187 -0
- package/src/mcp.ts +1130 -0
- package/src/mod-tool.ts +718 -0
- package/src/mod.ts +453 -0
- package/src/patch.ts +628 -0
- package/src/provenance.ts +437 -0
- package/src/query.ts +381 -0
- package/src/reach.ts +213 -0
- package/src/relation.ts +298 -0
- package/src/report-sarif.ts +137 -0
- package/src/sig.ts +345 -0
- package/src/sigdecl.ts +11 -0
- package/src/siggate.ts +144 -0
- package/src/site.ts +36 -1
- package/src/std.ts +131 -0
- package/src/subsume.ts +739 -0
- package/src/trim.ts +195 -0
- package/src/tsconfig.json +10 -4
- package/src/type.ts +51 -2
- package/src/unify.ts +253 -38
- package/src/utility.ts +79 -1
- package/src/val/AggFuncVal.ts +546 -0
- package/src/val/ArithFuncVal.ts +108 -0
- package/src/val/BagVal.ts +158 -12
- package/src/val/CloseFuncVal.ts +9 -1
- package/src/val/ConjunctVal.ts +20 -0
- package/src/val/ConstraintVal.ts +576 -48
- package/src/val/ContainerKindVal.ts +158 -0
- package/src/val/CopyFuncVal.ts +0 -1
- package/src/val/Decimal.ts +15 -0
- package/src/val/DeprecateFuncVal.ts +84 -0
- package/src/val/DisjunctVal.ts +282 -59
- package/src/val/EachFuncVal.ts +133 -0
- package/src/val/ExpectVal.ts +65 -8
- package/src/val/FeatureVal.ts +1 -1
- package/src/val/FilterFuncVal.ts +154 -0
- package/src/val/FuncBaseVal.ts +206 -2
- package/src/val/GraphAtomVal.ts +264 -0
- package/src/val/HideFuncVal.ts +0 -2
- package/src/val/JunctionVal.ts +24 -1
- package/src/val/KeyFuncVal.ts +39 -35
- package/src/val/ListVal.ts +101 -15
- package/src/val/LowerFuncVal.ts +0 -1
- package/src/val/MapVal.ts +153 -14
- package/src/val/MatchFuncVal.ts +176 -0
- package/src/val/MoveFuncVal.ts +0 -2
- package/src/val/NilVal.ts +25 -0
- package/src/val/OpBaseVal.ts +20 -1
- package/src/val/OpenFuncVal.ts +4 -2
- package/src/val/PackFuncVal.ts +175 -0
- package/src/val/PathFuncVal.ts +107 -20
- package/src/val/PathVal.ts +221 -0
- package/src/val/PlaceVal.ts +193 -0
- package/src/val/PlusOpVal.ts +67 -39
- package/src/val/PrefFuncVal.ts +0 -1
- package/src/val/PrefVal.ts +251 -60
- package/src/val/RecurseVal.ts +285 -0
- package/src/val/RefVal.ts +183 -78
- package/src/val/ReferFuncVal.ts +732 -0
- package/src/val/ScalarKindVal.ts +12 -13
- package/src/val/SuperFuncVal.ts +137 -13
- package/src/val/TopVal.ts +1 -2
- package/src/val/TypeFuncVal.ts +0 -2
- package/src/val/UpperFuncVal.ts +0 -1
- package/src/val/Val.ts +216 -4
- package/src/val/VarVal.ts +0 -1
- package/src/val/arith.ts +319 -0
- package/src/vet.ts +1025 -0
- package/src/view.ts +2563 -0
- package/src/walk.ts +99 -0
package/dist/err.js
CHANGED
|
@@ -5,10 +5,42 @@ exports.AontuError = void 0;
|
|
|
5
5
|
exports.getHint = getHint;
|
|
6
6
|
exports.makeNilErr = makeNilErr;
|
|
7
7
|
exports.descErr = descErr;
|
|
8
|
+
exports.setColor = setColor;
|
|
9
|
+
exports.colorActive = colorActive;
|
|
10
|
+
const node_path_1 = require("node:path");
|
|
8
11
|
const jsonic_1 = require("@tabnas/jsonic");
|
|
9
12
|
const NilVal_1 = require("./val/NilVal");
|
|
10
13
|
const hints_1 = require("./hints");
|
|
11
14
|
const { errmsg, strinject } = jsonic_1.util;
|
|
15
|
+
// COLOUR IS A DECISION ABOUT THE DESTINATION, not about the message.
|
|
16
|
+
// Every error frame hardcoded the ANSI escapes, so a piped report and
|
|
17
|
+
// a `--jsonl` answer carried terminal control codes into whatever read
|
|
18
|
+
// them -- a log file, a CI annotation, an agent's parser (the review's
|
|
19
|
+
// finding F).
|
|
20
|
+
//
|
|
21
|
+
// NO_COLOR (no-color.org: set, to anything, means no colour) turns them
|
|
22
|
+
// off everywhere, library callers included. The CLI additionally turns
|
|
23
|
+
// them off when its stderr is not a terminal, through setColor: a
|
|
24
|
+
// library cannot see the destination, and a caller who has one is the
|
|
25
|
+
// only one who can say.
|
|
26
|
+
let COLOR;
|
|
27
|
+
function setColor(on) {
|
|
28
|
+
COLOR = on;
|
|
29
|
+
}
|
|
30
|
+
function colorActive() {
|
|
31
|
+
if (null != COLOR) {
|
|
32
|
+
return COLOR;
|
|
33
|
+
}
|
|
34
|
+
// `globalThis` always exists; `process` need not (this library runs
|
|
35
|
+
// in a browser too), so the optional chain starts at the part that
|
|
36
|
+
// can actually be missing -- and stays a CHAIN rather than becoming
|
|
37
|
+
// an `if`, because the browser arm is unreachable from any test this
|
|
38
|
+
// suite can run and ADR-002 does not accept an arm nothing takes.
|
|
39
|
+
// Set-but-EMPTY is the documented exception and does not disable
|
|
40
|
+
// colour (no-color.org).
|
|
41
|
+
const no = globalThis.process?.env?.NO_COLOR;
|
|
42
|
+
return null == no || '' === no;
|
|
43
|
+
}
|
|
12
44
|
function getHint(why, details) {
|
|
13
45
|
if (hints_1.hints[why]) {
|
|
14
46
|
let txt = hints_1.hints[why];
|
|
@@ -40,8 +72,8 @@ function descErr(err, errctx) {
|
|
|
40
72
|
if (null == err.msg || '' === err.msg) {
|
|
41
73
|
let v1 = err.primary;
|
|
42
74
|
let v2 = err.secondary;
|
|
43
|
-
let v1src = resolveSrc(v1, errctx
|
|
44
|
-
let v2src = resolveSrc(v2, errctx
|
|
75
|
+
let v1src = resolveSrc(v1, errctx);
|
|
76
|
+
let v2src = resolveSrc(v2, errctx);
|
|
45
77
|
// STRICT `!==` against the empty string. The loose `!=` here dropped
|
|
46
78
|
// the list index 0, because `'' != 0` is FALSE in JavaScript ('' and
|
|
47
79
|
// 0 are both coerced to 0): `a:[1]&[2]` reported its conflict at
|
|
@@ -58,7 +90,7 @@ function descErr(err, errctx) {
|
|
|
58
90
|
const details = err.details;
|
|
59
91
|
err.msg = [
|
|
60
92
|
errmsg({
|
|
61
|
-
color: { active:
|
|
93
|
+
color: { active: colorActive() },
|
|
62
94
|
name: 'aontu',
|
|
63
95
|
code: err.why,
|
|
64
96
|
txts: {
|
|
@@ -72,7 +104,7 @@ function descErr(err, errctx) {
|
|
|
72
104
|
'\n',
|
|
73
105
|
(null != v1 && errmsg({
|
|
74
106
|
// TODO: color should come from jsonic config
|
|
75
|
-
color: { active:
|
|
107
|
+
color: { active: colorActive(), line: '\x1b[34m' },
|
|
76
108
|
txts: {
|
|
77
109
|
msg: 'Cannot ' + attempt + ' value: ' + v1.canon +
|
|
78
110
|
(null == v2 ? '' : ' with value: ' + v2.canon), // + ' #' + err.id,
|
|
@@ -87,7 +119,7 @@ function descErr(err, errctx) {
|
|
|
87
119
|
})),
|
|
88
120
|
(null != v2 && errmsg({
|
|
89
121
|
// TODO: color should come from jsonic config
|
|
90
|
-
color: { active:
|
|
122
|
+
color: { active: colorActive(), line: '\x1b[34m' },
|
|
91
123
|
txts: {
|
|
92
124
|
msg: 'Cannot ' + attempt + ' value: ' + v2.canon +
|
|
93
125
|
' with value: ' + v1.canon, // + ' #' + err.id,
|
|
@@ -114,11 +146,16 @@ function descErr(err, errctx) {
|
|
|
114
146
|
}
|
|
115
147
|
function resolveFile(url) {
|
|
116
148
|
const cwd = process.cwd();
|
|
117
|
-
|
|
149
|
+
// The PLATFORM'S separator, not '/': a hardcoded slash never matched
|
|
150
|
+
// a Windows cwd, so every Windows report named the absolute path
|
|
151
|
+
// where the POSIX report (and the Go CLI, which prints the entry as
|
|
152
|
+
// typed) named `clash.aon` -- caught by the docs transcript for
|
|
153
|
+
// reading a conflict error, which pins the relative spelling.
|
|
154
|
+
let out = url?.replace(cwd + node_path_1.sep, '') ?? '<no-file>';
|
|
118
155
|
out = out === cwd || '' === out ? '<no-file>' : out;
|
|
119
156
|
return out;
|
|
120
157
|
}
|
|
121
|
-
function resolveSrc(v, errctx
|
|
158
|
+
function resolveSrc(v, errctx) {
|
|
122
159
|
let src = undefined;
|
|
123
160
|
const url = v?.site.url;
|
|
124
161
|
// Cache reads on errctx for the lifetime of the error-formatting pass.
|
|
@@ -165,6 +202,6 @@ class AontuError extends Error {
|
|
|
165
202
|
.filter(line => !line.match(/aontu\/(src|dist)\//))
|
|
166
203
|
.join('\n');
|
|
167
204
|
}
|
|
168
|
-
} /* node:coverage ignore next
|
|
205
|
+
} /* node:coverage ignore next 11 */
|
|
169
206
|
exports.AontuError = AontuError;
|
|
170
207
|
//# sourceMappingURL=err.js.map
|
package/dist/err.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"err.js","sourceRoot":"","sources":["../src/err.ts"],"names":[],"mappings":";AAAA,yDAAyD;;;
|
|
1
|
+
{"version":3,"file":"err.js","sourceRoot":"","sources":["../src/err.ts"],"names":[],"mappings":"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"}
|
package/dist/graph.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Val } from './type';
|
|
2
|
+
export type Edge = {
|
|
3
|
+
from: string;
|
|
4
|
+
key: string;
|
|
5
|
+
to: string;
|
|
6
|
+
at: string;
|
|
7
|
+
hidden?: true;
|
|
8
|
+
};
|
|
9
|
+
export type Graph = {
|
|
10
|
+
edges: Edge[];
|
|
11
|
+
disjunct?: string[];
|
|
12
|
+
};
|
|
13
|
+
export declare function graphOf(root: Val): Graph;
|
package/dist/graph.js
ADDED
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* Copyright (c) 2025 Richard Rodger, MIT License */
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.graphOf = graphOf;
|
|
5
|
+
const keyorder_1 = require("./keyorder");
|
|
6
|
+
const formatPath = (path) => 0 === path.length ? '$' : '$.' + path.join('.');
|
|
7
|
+
// Digits-only segments are list indices, which is exactly how the rest
|
|
8
|
+
// of the engine spells them.
|
|
9
|
+
const isIndex = (seg) => /^[0-9]+$/.test(seg);
|
|
10
|
+
// The node a link starts at and the relation it hangs under, derived
|
|
11
|
+
// from the link's own position.
|
|
12
|
+
//
|
|
13
|
+
// A DECLARED predicate (rel()-minted) is authoritative: the link is cut
|
|
14
|
+
// at the key the rel() sat on, wherever that is on the way down, which
|
|
15
|
+
// is what makes a MAP-valued relation report the relation rather than
|
|
16
|
+
// the inner label. Without one the relation is INFERRED: strip the list
|
|
17
|
+
// indices, and the first real key above the link is it.
|
|
18
|
+
const cut = (at, relkey) => {
|
|
19
|
+
if (undefined !== relkey) {
|
|
20
|
+
for (let i = at.length - 1; 0 <= i; i--) {
|
|
21
|
+
if (at[i] === relkey) {
|
|
22
|
+
return { from: formatPath(at.slice(0, i)), key: relkey };
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
let i = at.length - 1;
|
|
27
|
+
for (; 0 <= i && isIndex(at[i]); i--) { }
|
|
28
|
+
return 0 > i
|
|
29
|
+
? { from: formatPath([]), key: relkey ?? '' }
|
|
30
|
+
: { from: formatPath(at.slice(0, i)), key: relkey ?? at[i] };
|
|
31
|
+
};
|
|
32
|
+
// The graph of an evaluated tree. Walks POSITIONS, not values: a
|
|
33
|
+
// reference or a spread can put one value object at several positions,
|
|
34
|
+
// and a walk guarded by object identity would find the first and miss
|
|
35
|
+
// every other place it is reached. The guard is therefore the ancestor
|
|
36
|
+
// chain — which is what a cycle actually is.
|
|
37
|
+
function graphOf(root) {
|
|
38
|
+
const edges = [];
|
|
39
|
+
const disjunct = [];
|
|
40
|
+
// ONE WALK, with `undecided` saying which side of ADR-007 it is on:
|
|
41
|
+
// below an unresolved disjunction every link is a position the
|
|
42
|
+
// document has not decided, and nothing there is an edge.
|
|
43
|
+
const visit = (node, path, ancestors, hidden, undecided) => {
|
|
44
|
+
if (null == node || true !== node.isVal || ancestors.has(node)) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
hidden = hidden || true === node.mark?.hide;
|
|
48
|
+
const link = node.link;
|
|
49
|
+
if (null != link) {
|
|
50
|
+
if (undecided) {
|
|
51
|
+
disjunct.push(formatPath(path));
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
const { from, key } = cut(path, node.relkey);
|
|
55
|
+
const edge = { from, key, to: link, at: formatPath(path) };
|
|
56
|
+
if (hidden) {
|
|
57
|
+
edge.hidden = true;
|
|
58
|
+
}
|
|
59
|
+
edges.push(edge);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// A graph atom is TRANSPARENT here (RELATIONS P2): it carries the
|
|
63
|
+
// field's value at the field's own position, and the graph is about
|
|
64
|
+
// the value.
|
|
65
|
+
if (true === node.isGraphAtom && undefined !== node.held) {
|
|
66
|
+
visit(node.held, path, ancestors, hidden, undecided);
|
|
67
|
+
}
|
|
68
|
+
// An unresolved conjunction (a link waiting on a peer that never
|
|
69
|
+
// came, a constraint still open) holds its terms at the SAME
|
|
70
|
+
// position; every link among them is written there, and is an
|
|
71
|
+
// edge. This is what a match-selected branch or a deferred refer()
|
|
72
|
+
// looks like after evaluation.
|
|
73
|
+
if (true === node.isConjunct && Array.isArray(node.peg)) {
|
|
74
|
+
ancestors.add(node);
|
|
75
|
+
for (const term of node.peg) {
|
|
76
|
+
visit(term, path, ancestors, hidden, undecided);
|
|
77
|
+
}
|
|
78
|
+
ancestors.delete(node);
|
|
79
|
+
}
|
|
80
|
+
// AN UNRESOLVED DISJUNCTION IS NOT A VALUE (ADR-007), so a link
|
|
81
|
+
// under one of its arms is not an edge. Its POSITION is collected
|
|
82
|
+
// instead, so a figure can report what the document leaves
|
|
83
|
+
// undecided rather than drawing it or dropping it in silence.
|
|
84
|
+
if (true === node.isDisjunct && Array.isArray(node.peg)) {
|
|
85
|
+
ancestors.add(node);
|
|
86
|
+
for (const arm of node.peg) {
|
|
87
|
+
visit(arm, path, ancestors, hidden, true);
|
|
88
|
+
}
|
|
89
|
+
ancestors.delete(node);
|
|
90
|
+
}
|
|
91
|
+
if ((true === node.isMap || true === node.isList) && null != node.peg) {
|
|
92
|
+
ancestors.add(node);
|
|
93
|
+
for (const k of Object.keys(node.peg)) {
|
|
94
|
+
visit(node.peg[k], [...path, k], ancestors, hidden, undecided);
|
|
95
|
+
}
|
|
96
|
+
ancestors.delete(node);
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
visit(root, [], new Set(), false, false);
|
|
100
|
+
// DETERMINISTIC by construction, not by luck: edges by the position
|
|
101
|
+
// they are written at, which is unique — one link, one place. That
|
|
102
|
+
// holds through a conjunction too: its terms share the position, and
|
|
103
|
+
// two links there would have had to unify into one.
|
|
104
|
+
edges.sort((a, b) => (0, keyorder_1.cmpCodePoint)(a.at, b.at));
|
|
105
|
+
if (0 < disjunct.length) {
|
|
106
|
+
return { edges, disjunct: [...new Set(disjunct)].sort(keyorder_1.cmpCodePoint) };
|
|
107
|
+
}
|
|
108
|
+
return { edges };
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph.js","sourceRoot":"","sources":["../src/graph.ts"],"names":[],"mappings":";AAAA,oDAAoD;;;AAsBpD,yCAAyC;AAqCzC,MAAM,UAAU,GAAG,CAAC,IAAc,EAAU,EAAE,CAC5C,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAGjD,uEAAuE;AACvE,6BAA6B;AAC7B,MAAM,OAAO,GAAG,CAAC,GAAW,EAAW,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAG9D,qEAAqE;AACrE,gCAAgC;AAChC,EAAE;AACF,wEAAwE;AACxE,uEAAuE;AACvE,sEAAsE;AACtE,wEAAwE;AACxE,wDAAwD;AACxD,MAAM,GAAG,GAAG,CACV,EAAY,EAAE,MAA0B,EACT,EAAE;IACjC,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;QACzB,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC;gBACrB,OAAO,EAAE,IAAI,EAAE,UAAU,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,CAAA;YAC1D,CAAC;QACH,CAAC;IACH,CAAC;IACD,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,GAAG,CAAC,CAAA;IACrB,OAAO,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC;QACV,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,IAAI,EAAE,EAAE;QAC7C,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;AAChE,CAAC,CAAA;AAGD,iEAAiE;AACjE,uEAAuE;AACvE,sEAAsE;AACtE,uEAAuE;AACvE,6CAA6C;AAC7C,iBAAwB,IAAS;IAC/B,MAAM,KAAK,GAAW,EAAE,CAAA;IACxB,MAAM,QAAQ,GAAa,EAAE,CAAA;IAE7B,oEAAoE;IACpE,+DAA+D;IAC/D,0DAA0D;IAC1D,MAAM,KAAK,GAAG,CACZ,IAAS,EAAE,IAAc,EAAE,SAAmB,EAAE,MAAe,EAC/D,SAAkB,EACZ,EAAE;QACR,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,CAAC,KAAK,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/D,OAAM;QACR,CAAC;QAED,MAAM,GAAG,MAAM,IAAI,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,IAAI,CAAA;QAE3C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAA;QACtB,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;YACjB,IAAI,SAAS,EAAE,CAAC;gBACd,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAA;YACjC,CAAC;iBACI,CAAC;gBACJ,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,MAA4B,CAAC,CAAA;gBAClE,MAAM,IAAI,GAAS,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,UAAU,CAAC,IAAI,CAAC,EAAE,CAAA;gBAChE,IAAI,MAAM,EAAE,CAAC;oBACX,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;gBACpB,CAAC;gBACD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAClB,CAAC;QACH,CAAC;QAED,kEAAkE;QAClE,oEAAoE;QACpE,aAAa;QACb,IAAI,IAAI,KAAK,IAAI,CAAC,WAAW,IAAI,SAAS,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;YACzD,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,CAAA;QACtD,CAAC;QAED,iEAAiE;QACjE,6DAA6D;QAC7D,8DAA8D;QAC9D,mEAAmE;QACnE,+BAA+B;QAC/B,IAAI,IAAI,KAAK,IAAI,CAAC,UAAU,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACxD,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YACnB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;gBAC5B,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,CAAA;YACjD,CAAC;YACD,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QACxB,CAAC;QAED,gEAAgE;QAChE,kEAAkE;QAClE,2DAA2D;QAC3D,8DAA8D;QAC9D,IAAI,IAAI,KAAK,IAAI,CAAC,UAAU,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACxD,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YACnB,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;gBAC3B,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,CAAA;YAC3C,CAAC;YACD,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QACxB,CAAC;QAED,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK,IAAI,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YACtE,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YACnB,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBACtC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,CAAA;YAChE,CAAC;YACD,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QACxB,CAAC;IACH,CAAC,CAAA;IAED,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;IAExC,oEAAoE;IACpE,mEAAmE;IACnE,qEAAqE;IACrE,oDAAoD;IACpD,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAA,uBAAY,EAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IAE9C,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;QACxB,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,uBAAY,CAAC,EAAE,CAAA;IACvE,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,CAAA;AAClB,CAAC"}
|
package/dist/hcanon.d.ts
ADDED
package/dist/hcanon.js
ADDED
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* Copyright (c) 2025 Richard Rodger, MIT License */
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.hcanon = hcanon;
|
|
5
|
+
exports.canonHash = canonHash;
|
|
6
|
+
// The HASH FORM (G6 phase 0, docs/capability-review/g6-distribution.md):
|
|
7
|
+
// exactly the unify-level canon with the additions that close its
|
|
8
|
+
// semantic gaps, so that two documents with the same hash form have the
|
|
9
|
+
// same meaning:
|
|
10
|
+
//
|
|
11
|
+
// - a CLOSED map or list renders wrapped: close({...}), close([...])
|
|
12
|
+
// (canon drops closedness);
|
|
13
|
+
// - the type/hide MARKS render as their builtin wrappers: type(x),
|
|
14
|
+
// hide(x) (canon drops marks).
|
|
15
|
+
//
|
|
16
|
+
// Both additions reuse existing parseable syntax, so the hash form
|
|
17
|
+
// remains valid Aontu source and round-trips:
|
|
18
|
+
// hcanon(unify(parse(hcanon(v)))) == hcanon(v) is a spec-suite property
|
|
19
|
+
// (test/spec/hcanon.tsv). User-facing canon is UNCHANGED — hcanon is a
|
|
20
|
+
// separate rendering.
|
|
21
|
+
//
|
|
22
|
+
// The marks PROPAGATE to every descendant at unification (walkMark), so
|
|
23
|
+
// a wrapper is emitted only where a mark STARTS: the walk carries the
|
|
24
|
+
// inherited marks down and a child whose mark the parent already
|
|
25
|
+
// carries renders bare. Without that, hide({a:1}) would render every
|
|
26
|
+
// leaf re-wrapped — still correct, never minimal, and not what the
|
|
27
|
+
// source said.
|
|
28
|
+
//
|
|
29
|
+
// canonHash (G6 phase 1) is the pin built on it:
|
|
30
|
+
// "aon1-" + base64url( SHA-256( UTF-8( hcanon(v) ) ) )
|
|
31
|
+
// (unpadded base64url, RFC 4648 section 5). The "aon1-" scheme id
|
|
32
|
+
// exists so a future semantically-stronger normal form is an upgrade,
|
|
33
|
+
// not a breakage. This is a CANONICAL-TEXT hash, not a semantic
|
|
34
|
+
// equivalence class: the failure direction is the safe one — a false
|
|
35
|
+
// "changed" forces a needless re-review; a false "unchanged" would need
|
|
36
|
+
// two hash forms with the same bytes and different meanings, which is
|
|
37
|
+
// exactly the gap the close/mark wrappers exist to shut.
|
|
38
|
+
const node_crypto_1 = require("node:crypto");
|
|
39
|
+
const keyorder_1 = require("./keyorder");
|
|
40
|
+
// One node's rendering, carrying the marks the ANCESTORS already
|
|
41
|
+
// wrapped. Bags and junctions recurse structurally (their canon getters
|
|
42
|
+
// render children through plain canon, which would drop a nested
|
|
43
|
+
// close); everything else — scalars, kinds, funcs, refs, constraints —
|
|
44
|
+
// delegates to its own canon, whose text is already in cross-port
|
|
45
|
+
// parity. The non-Val arm mirrors MapVal.canon's raw-peg fallback and
|
|
46
|
+
// is unreachable through an evaluated tree (direct-tested, ADR-002).
|
|
47
|
+
function render(v, inh) {
|
|
48
|
+
if (true !== v?.isVal) {
|
|
49
|
+
return String(v);
|
|
50
|
+
}
|
|
51
|
+
const mtype = true === v.mark?.type;
|
|
52
|
+
const mhide = true === v.mark?.hide;
|
|
53
|
+
const inner = {
|
|
54
|
+
type: inh.type || mtype,
|
|
55
|
+
hide: inh.hide || mhide,
|
|
56
|
+
};
|
|
57
|
+
let s;
|
|
58
|
+
if (true === v.isMap) {
|
|
59
|
+
// Alias declarations are dropped here for the same reason
|
|
60
|
+
// MapVal.canon drops them, and this is the surface where it counts:
|
|
61
|
+
// `aon1-` pins MEANING, so a document written with aliases and the
|
|
62
|
+
// same document written longhand must hash to one string. Two
|
|
63
|
+
// renderers, one rule -- hcanon is not canon and does not inherit
|
|
64
|
+
// the filter (docs/design/ALIASES.0.md §4).
|
|
65
|
+
const keys = Object.keys(v.peg)
|
|
66
|
+
.filter((k) => !v.aliasKeys.includes(k))
|
|
67
|
+
.sort(keyorder_1.cmpCodePoint);
|
|
68
|
+
s = '{' +
|
|
69
|
+
(v.spread.cj ? '&:' + render(v.spread.cj, inner) +
|
|
70
|
+
(0 < keys.length ? ',' : '') : '') +
|
|
71
|
+
keys.map((k) => JSON.stringify(k) +
|
|
72
|
+
(v.optionalKeys.includes(k) ? '?' : '') +
|
|
73
|
+
':' +
|
|
74
|
+
render(v.peg[k], inner)).join(',') +
|
|
75
|
+
'}';
|
|
76
|
+
if (true === v.closed) {
|
|
77
|
+
s = 'close(' + s + ')';
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
else if (true === v.isList) {
|
|
81
|
+
const keys = Object.keys(v.peg);
|
|
82
|
+
s = '[' +
|
|
83
|
+
(v.spread.cj ? '&:' + render(v.spread.cj, inner) +
|
|
84
|
+
(0 < keys.length ? ',' : '') : '') +
|
|
85
|
+
keys.map((k) => render(v.peg[k], inner)).join(',') +
|
|
86
|
+
']';
|
|
87
|
+
if (true === v.closed) {
|
|
88
|
+
s = 'close(' + s + ')';
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
else if (true === v.isPref) {
|
|
92
|
+
s = '*' + render(v.peg, inner);
|
|
93
|
+
}
|
|
94
|
+
else if (true === v.isConjunct || true === v.isDisjunct) {
|
|
95
|
+
s = junctionText(v, true === v.isConjunct ? '&' : '|', inner);
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
s = v.canon;
|
|
99
|
+
}
|
|
100
|
+
if (mtype && !inh.type) {
|
|
101
|
+
s = 'type(' + s + ')';
|
|
102
|
+
}
|
|
103
|
+
if (mhide && !inh.hide) {
|
|
104
|
+
s = 'hide(' + s + ')';
|
|
105
|
+
}
|
|
106
|
+
// The deprecation record rides outermost, as canonRiders
|
|
107
|
+
// renders it (the wrappers are all reparseable calls, so order only
|
|
108
|
+
// has to be FIXED, and this matches the canon the G3 rows pinned).
|
|
109
|
+
const d = v.deprecation;
|
|
110
|
+
if (null != d) {
|
|
111
|
+
const dkeys = Object.keys(d).sort();
|
|
112
|
+
const rec = dkeys.map((k) => JSON.stringify(k) + ':' + JSON.stringify(d[k])).join(',');
|
|
113
|
+
s = 'deprecate(' + s + ('' === rec ? '' : ',{' + rec + '}') + ')';
|
|
114
|
+
}
|
|
115
|
+
return s;
|
|
116
|
+
}
|
|
117
|
+
// The JunctionVal.canon parenthesisation rule, kept: a member that is
|
|
118
|
+
// itself a junction with more than one term keeps its parens so the
|
|
119
|
+
// text reparses with the same structure (`(1|2)&3`, not the
|
|
120
|
+
// differently-parsing `1|2&3`). Post-unification junctions are
|
|
121
|
+
// flattened by norm, so no SOURCE reaches the wrapping arm -- it is
|
|
122
|
+
// pinned by direct tests over constructed Vals in both ports, because
|
|
123
|
+
// a hash form that could render ambiguously would be a pin that
|
|
124
|
+
// silently agrees with a document it should not.
|
|
125
|
+
function junctionText(v, sym, inner) {
|
|
126
|
+
return v.peg.map((m) => true === m?.isJunction && 1 < m.peg.length
|
|
127
|
+
? '(' + render(m, inner) + ')'
|
|
128
|
+
: render(m, inner))
|
|
129
|
+
.join(sym);
|
|
130
|
+
}
|
|
131
|
+
// The hash form of an EVALUATED Val (unify first; parse-level canon
|
|
132
|
+
// parenthesisation differs between the ports and is excluded by
|
|
133
|
+
// construction — AGENTS.md).
|
|
134
|
+
function hcanon(v) {
|
|
135
|
+
return render(v, { type: false, hide: false });
|
|
136
|
+
}
|
|
137
|
+
// The canon-hash pin. Scoped to the module evaluated STANDALONE: its
|
|
138
|
+
// own include closure resolved and unified at its own root, before any
|
|
139
|
+
// consumer context — which is what makes the pin transitive (an edit
|
|
140
|
+
// two includes deep changes the unified root, hence the hash).
|
|
141
|
+
function canonHash(v) {
|
|
142
|
+
return 'aon1-' +
|
|
143
|
+
(0, node_crypto_1.createHash)('sha256').update(hcanon(v), 'utf8').digest('base64url');
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=hcanon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hcanon.js","sourceRoot":"","sources":["../src/hcanon.ts"],"names":[],"mappings":"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"}
|