@primmel/primmel 1.4.0 → 1.5.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/dist/src/ser-des/config/conformanceTest.d.ts.map +1 -1
- package/dist/src/ser-des/config/conformanceTest.js +19 -0
- package/dist/src/ser-des/config/conformanceTest.js.map +1 -1
- package/dist/src/ser-des/config/field-parser.d.ts.map +1 -1
- package/dist/src/ser-des/config/field-parser.js +31 -0
- package/dist/src/ser-des/config/field-parser.js.map +1 -1
- package/dist/src/ser-des/config/form.d.ts.map +1 -1
- package/dist/src/ser-des/config/form.js +23 -0
- package/dist/src/ser-des/config/form.js.map +1 -1
- package/dist/src/ser-des/config/index.d.ts.map +1 -1
- package/dist/src/ser-des/config/index.js +9 -0
- package/dist/src/ser-des/config/index.js.map +1 -1
- package/dist/src/ser-des/config/packageManifest.d.ts.map +1 -1
- package/dist/src/ser-des/config/packageManifest.js +22 -0
- package/dist/src/ser-des/config/packageManifest.js.map +1 -1
- package/dist/src/ser-des/config/predicate.d.ts +5 -0
- package/dist/src/ser-des/config/predicate.d.ts.map +1 -0
- package/dist/src/ser-des/config/predicate.js +111 -0
- package/dist/src/ser-des/config/predicate.js.map +1 -0
- package/dist/src/ser-des/config/ref.d.ts +15 -0
- package/dist/src/ser-des/config/ref.d.ts.map +1 -0
- package/dist/src/ser-des/config/ref.js +50 -0
- package/dist/src/ser-des/config/ref.js.map +1 -0
- package/dist/src/ser-des/config/requirement.d.ts.map +1 -1
- package/dist/src/ser-des/config/requirement.js +19 -0
- package/dist/src/ser-des/config/requirement.js.map +1 -1
- package/dist/src/ser-des/parse.d.ts.map +1 -1
- package/dist/src/ser-des/parse.js +1 -0
- package/dist/src/ser-des/parse.js.map +1 -1
- package/dist/src/ser-des/types.d.ts +2 -0
- package/dist/src/ser-des/types.d.ts.map +1 -1
- package/dist/src/types/ConformanceTest.d.ts +3 -0
- package/dist/src/types/ConformanceTest.d.ts.map +1 -1
- package/dist/src/types/Form.d.ts +11 -0
- package/dist/src/types/Form.d.ts.map +1 -1
- package/dist/src/types/Package.d.ts +4 -0
- package/dist/src/types/Package.d.ts.map +1 -1
- package/dist/src/types/Ref.d.ts +11 -0
- package/dist/src/types/Ref.d.ts.map +1 -0
- package/dist/src/types/Ref.js +3 -0
- package/dist/src/types/Ref.js.map +1 -0
- package/dist/src/types/RefPredicate.d.ts +22 -0
- package/dist/src/types/RefPredicate.d.ts.map +1 -0
- package/dist/src/types/RefPredicate.js +3 -0
- package/dist/src/types/RefPredicate.js.map +1 -0
- package/dist/src/types/Requirement.d.ts +3 -0
- package/dist/src/types/Requirement.d.ts.map +1 -1
- package/dist/src/types/Standard.d.ts +3 -0
- package/dist/src/types/Standard.d.ts.map +1 -1
- package/dist-browser/index.mjs +1186 -1104
- package/dist-cli/primmel.mjs +162 -0
- package/package.json +1 -1
package/dist-cli/primmel.mjs
CHANGED
|
@@ -222,6 +222,7 @@ function parse(mmelString, parsers, options = {}) {
|
|
|
222
222
|
referenceMaterials: {},
|
|
223
223
|
testPointSets: {},
|
|
224
224
|
competenceKinds: {},
|
|
225
|
+
predicates: {},
|
|
225
226
|
constraints: {},
|
|
226
227
|
discrepancyRecords: {},
|
|
227
228
|
stateMachines: {},
|
|
@@ -1167,6 +1168,21 @@ function dumpSeriesDecl(decl) {
|
|
|
1167
1168
|
return out;
|
|
1168
1169
|
}
|
|
1169
1170
|
|
|
1171
|
+
// src/ser-des/config/ref.ts
|
|
1172
|
+
function parseRef(t, i, stripWrapping2, unwrapBlock2) {
|
|
1173
|
+
const predicate = stripWrapping2(t[i++] ?? "");
|
|
1174
|
+
const target = stripWrapping2(t[i++] ?? "");
|
|
1175
|
+
const ref = { predicate, target };
|
|
1176
|
+
if (i < t.length && t[i].startsWith("{")) {
|
|
1177
|
+
const block = unwrapBlock2(t[i++]);
|
|
1178
|
+
const m = /note\s+"([^"]*)"/.exec(block) ?? /note\s+(\S+)/.exec(block);
|
|
1179
|
+
if (m) {
|
|
1180
|
+
ref.note = m[1];
|
|
1181
|
+
}
|
|
1182
|
+
}
|
|
1183
|
+
return { ref, next: i };
|
|
1184
|
+
}
|
|
1185
|
+
|
|
1170
1186
|
// src/ser-des/config/sourceDiscrepancy.ts
|
|
1171
1187
|
var VALID_RESOLUTIONS = ["follows_clause_x", "annotated_only"];
|
|
1172
1188
|
function parseSourceDiscrepancy(block) {
|
|
@@ -1346,6 +1362,8 @@ function parseFormField(name, block, type) {
|
|
|
1346
1362
|
enumRef: "",
|
|
1347
1363
|
pattern: "",
|
|
1348
1364
|
required: false,
|
|
1365
|
+
requiredWhen: "",
|
|
1366
|
+
refs: [],
|
|
1349
1367
|
measurementMethod: "",
|
|
1350
1368
|
calculationId: null,
|
|
1351
1369
|
calculationBindings: [],
|
|
@@ -1407,6 +1425,10 @@ function parseFormField(name, block, type) {
|
|
|
1407
1425
|
field.bind = stripWrapping(t[i++]);
|
|
1408
1426
|
} else if (cmd === "required") {
|
|
1409
1427
|
field.required = stripWrapping(t[i++]) === "true";
|
|
1428
|
+
} else if (cmd === "required_when") {
|
|
1429
|
+
const read = readValueToken(t, i);
|
|
1430
|
+
field.requiredWhen = stripWrapping(read.text);
|
|
1431
|
+
i = read.next;
|
|
1410
1432
|
} else if (cmd === "measurement_method") {
|
|
1411
1433
|
field.measurementMethod = stripWrapping(t[i++]);
|
|
1412
1434
|
} else if (cmd === "calculation") {
|
|
@@ -1475,6 +1497,10 @@ function parseFormField(name, block, type) {
|
|
|
1475
1497
|
field.referenceIds = tokenizePackage(t[i++]).map(stripWrapping);
|
|
1476
1498
|
} else if (cmd === "references") {
|
|
1477
1499
|
field.fieldReferences = parseRoleReferences(unwrapBlock(t[i++]));
|
|
1500
|
+
} else if (cmd === "ref") {
|
|
1501
|
+
const r = parseRef(t, i, stripWrapping, unwrapBlock);
|
|
1502
|
+
field.refs.push(r.ref);
|
|
1503
|
+
i = r.next;
|
|
1478
1504
|
} else if (cmd === "specification_reference") {
|
|
1479
1505
|
field.specificationReference = stripWrapping(t[i++]);
|
|
1480
1506
|
} else if (cmd === "applicability") {
|
|
@@ -1721,6 +1747,9 @@ function dumpFormField(field, indent) {
|
|
|
1721
1747
|
if (field.required) {
|
|
1722
1748
|
inner.push("required true");
|
|
1723
1749
|
}
|
|
1750
|
+
if (field.requiredWhen) {
|
|
1751
|
+
inner.push("required_when " + dumpBareSafe(field.requiredWhen));
|
|
1752
|
+
}
|
|
1724
1753
|
if (field.measurementMethod) {
|
|
1725
1754
|
inner.push("measurement_method " + field.measurementMethod);
|
|
1726
1755
|
}
|
|
@@ -1806,6 +1835,13 @@ function dumpFormField(field, indent) {
|
|
|
1806
1835
|
"references { " + dumpRoleReferences(field.fieldReferences) + " }"
|
|
1807
1836
|
);
|
|
1808
1837
|
}
|
|
1838
|
+
if (field.refs && field.refs.length > 0) {
|
|
1839
|
+
for (const r of field.refs) {
|
|
1840
|
+
inner.push(
|
|
1841
|
+
"ref " + r.predicate + ' "' + escapeString(r.target) + '"' + (r.note ? ' { note "' + escapeString(r.note) + '" }' : "")
|
|
1842
|
+
);
|
|
1843
|
+
}
|
|
1844
|
+
}
|
|
1809
1845
|
if (field.specificationReference) {
|
|
1810
1846
|
inner.push(
|
|
1811
1847
|
'specification_reference "' + escapeString(field.specificationReference) + '"'
|
|
@@ -4096,6 +4132,10 @@ var parseForm = function(id, data) {
|
|
|
4096
4132
|
result.reportRows = rr;
|
|
4097
4133
|
} else if (command === "references") {
|
|
4098
4134
|
result.formReferences = parseRoleReferences(unwrapBlock(t[i++]));
|
|
4135
|
+
} else if (command === "ref") {
|
|
4136
|
+
const r = parseRef(t, i, stripWrapping, unwrapBlock);
|
|
4137
|
+
result.refs = [...result.refs ?? [], r.ref];
|
|
4138
|
+
i = r.next;
|
|
4099
4139
|
} else if (command === "calculation_context") {
|
|
4100
4140
|
result.calculationContext = parseCalculationContext(
|
|
4101
4141
|
unwrapBlock(t[i++])
|
|
@@ -4326,6 +4366,7 @@ function makeSubformRefField(subformId, block) {
|
|
|
4326
4366
|
enumRef: "",
|
|
4327
4367
|
pattern: "",
|
|
4328
4368
|
required: false,
|
|
4369
|
+
requiredWhen: "",
|
|
4329
4370
|
measurementMethod: "",
|
|
4330
4371
|
calculationId: null,
|
|
4331
4372
|
calculationBindings: [],
|
|
@@ -4338,6 +4379,7 @@ function makeSubformRefField(subformId, block) {
|
|
|
4338
4379
|
defaultValue: "",
|
|
4339
4380
|
hasDefault: false,
|
|
4340
4381
|
referenceIds: [],
|
|
4382
|
+
refs: [],
|
|
4341
4383
|
fieldReferences: [],
|
|
4342
4384
|
specificationReference: "",
|
|
4343
4385
|
applicability: [],
|
|
@@ -4378,6 +4420,11 @@ var dumpForm = function(f) {
|
|
|
4378
4420
|
if (f.formReferences.length > 0) {
|
|
4379
4421
|
out += " references { " + dumpRoleReferences(f.formReferences) + " }\n";
|
|
4380
4422
|
}
|
|
4423
|
+
if (f.refs && f.refs.length > 0) {
|
|
4424
|
+
for (const r of f.refs) {
|
|
4425
|
+
out += " ref " + r.predicate + ' "' + escapeString(r.target) + '"' + (r.note ? ' { note "' + escapeString(r.note) + '" }' : "") + "\n";
|
|
4426
|
+
}
|
|
4427
|
+
}
|
|
4381
4428
|
if (f.calculationContext) {
|
|
4382
4429
|
const cc = f.calculationContext;
|
|
4383
4430
|
let line = " calculation_context { ";
|
|
@@ -6841,6 +6888,11 @@ var parseConformanceTest = function(id, data) {
|
|
|
6841
6888
|
}
|
|
6842
6889
|
} else if (keyword === "targets") {
|
|
6843
6890
|
result.targets = tokenizePackage(value());
|
|
6891
|
+
} else if (keyword === "ref") {
|
|
6892
|
+
const block = value();
|
|
6893
|
+
const rt = tokenizePackage(block);
|
|
6894
|
+
const rr = parseRef(rt, 0, stripWrapping, unwrapBlock);
|
|
6895
|
+
(result.refs ??= []).push(rr.ref);
|
|
6844
6896
|
} else if (keyword === "binds_to") {
|
|
6845
6897
|
result.bindsTo = tokenizePackage(value());
|
|
6846
6898
|
} else if (keyword === "applicability") {
|
|
@@ -6967,6 +7019,9 @@ var dumpConformanceTest = function(ct) {
|
|
|
6967
7019
|
} else if (ct.reference) {
|
|
6968
7020
|
out += " reference " + ct.reference + "\n";
|
|
6969
7021
|
}
|
|
7022
|
+
for (const r of ct.refs ?? []) {
|
|
7023
|
+
out += " ref " + r.predicate + ' "' + escapeString(r.target) + '"' + (r.note ? ' { note "' + escapeString(r.note) + '" }' : "") + "\n";
|
|
7024
|
+
}
|
|
6970
7025
|
if (ct.targets.length > 0) {
|
|
6971
7026
|
out += " targets {\n";
|
|
6972
7027
|
for (const t of ct.targets) {
|
|
@@ -7678,6 +7733,94 @@ var dumpReferenceMaterial = function(m) {
|
|
|
7678
7733
|
return out;
|
|
7679
7734
|
};
|
|
7680
7735
|
|
|
7736
|
+
// src/ser-des/config/predicate.ts
|
|
7737
|
+
var parsePredicate = function(id, data) {
|
|
7738
|
+
const result = {
|
|
7739
|
+
id,
|
|
7740
|
+
kind: "",
|
|
7741
|
+
description: "",
|
|
7742
|
+
subjectKinds: [],
|
|
7743
|
+
targetKinds: [],
|
|
7744
|
+
resolution: "",
|
|
7745
|
+
inverse: "",
|
|
7746
|
+
transitive: false,
|
|
7747
|
+
symmetric: false
|
|
7748
|
+
};
|
|
7749
|
+
const t = tokenizePackage(data);
|
|
7750
|
+
let i = 0;
|
|
7751
|
+
while (i < t.length) {
|
|
7752
|
+
const keyword = t[i++];
|
|
7753
|
+
if (i >= t.length) {
|
|
7754
|
+
throw new Error(
|
|
7755
|
+
`Parsing error: predicate. ID ${id}: Expecting value for ${keyword}`
|
|
7756
|
+
);
|
|
7757
|
+
}
|
|
7758
|
+
if (keyword === "kind") {
|
|
7759
|
+
const v = stripWrapping(t[i++]);
|
|
7760
|
+
if (v !== "citation" && v !== "semantic") {
|
|
7761
|
+
throw new Error(
|
|
7762
|
+
`Parsing error: predicate. ID ${id}: kind must be citation|semantic (got '${v}')`
|
|
7763
|
+
);
|
|
7764
|
+
}
|
|
7765
|
+
result.kind = v;
|
|
7766
|
+
} else if (keyword === "description" || keyword === "definition") {
|
|
7767
|
+
result.description = stripWrapping(t[i++]);
|
|
7768
|
+
} else if (keyword === "subject_kinds") {
|
|
7769
|
+
result.subjectKinds = tokenizePackage(unwrapBlock(t[i++])).map(
|
|
7770
|
+
stripWrapping
|
|
7771
|
+
);
|
|
7772
|
+
} else if (keyword === "target_kinds") {
|
|
7773
|
+
result.targetKinds = tokenizePackage(unwrapBlock(t[i++])).map(
|
|
7774
|
+
stripWrapping
|
|
7775
|
+
);
|
|
7776
|
+
} else if (keyword === "resolution") {
|
|
7777
|
+
result.resolution = stripWrapping(t[i++]);
|
|
7778
|
+
} else if (keyword === "inverse") {
|
|
7779
|
+
result.inverse = stripWrapping(t[i++]);
|
|
7780
|
+
} else if (keyword === "transitive") {
|
|
7781
|
+
result.transitive = stripWrapping(t[i++]) === "true";
|
|
7782
|
+
} else if (keyword === "symmetric") {
|
|
7783
|
+
result.symmetric = stripWrapping(t[i++]) === "true";
|
|
7784
|
+
} else {
|
|
7785
|
+
i++;
|
|
7786
|
+
}
|
|
7787
|
+
}
|
|
7788
|
+
return (ctx) => {
|
|
7789
|
+
ctx.predicates ??= {};
|
|
7790
|
+
ctx.predicates[id] = result;
|
|
7791
|
+
return ctx;
|
|
7792
|
+
};
|
|
7793
|
+
};
|
|
7794
|
+
var dumpPredicate = function(p) {
|
|
7795
|
+
let out = "predicate " + p.id + " {\n";
|
|
7796
|
+
if (p.kind) {
|
|
7797
|
+
out += " kind " + p.kind + "\n";
|
|
7798
|
+
}
|
|
7799
|
+
if (p.description) {
|
|
7800
|
+
out += ' description "' + escapeString(p.description) + '"\n';
|
|
7801
|
+
}
|
|
7802
|
+
if (p.subjectKinds.length > 0) {
|
|
7803
|
+
out += " subject_kinds { " + p.subjectKinds.join(" ") + " }\n";
|
|
7804
|
+
}
|
|
7805
|
+
if (p.targetKinds.length > 0) {
|
|
7806
|
+
out += " target_kinds { " + p.targetKinds.join(" ") + " }\n";
|
|
7807
|
+
}
|
|
7808
|
+
if (p.resolution) {
|
|
7809
|
+
out += " resolution " + p.resolution + "\n";
|
|
7810
|
+
}
|
|
7811
|
+
if (p.inverse) {
|
|
7812
|
+
out += " inverse " + p.inverse + "\n";
|
|
7813
|
+
}
|
|
7814
|
+
if (p.transitive) {
|
|
7815
|
+
out += " transitive true\n";
|
|
7816
|
+
}
|
|
7817
|
+
if (p.symmetric) {
|
|
7818
|
+
out += " symmetric true\n";
|
|
7819
|
+
}
|
|
7820
|
+
out += "}\n";
|
|
7821
|
+
return out;
|
|
7822
|
+
};
|
|
7823
|
+
|
|
7681
7824
|
// src/ser-des/config/constraint.ts
|
|
7682
7825
|
function readValue2(raw) {
|
|
7683
7826
|
if (raw.length >= 2 && raw.charAt(0) === '"' && raw.charAt(raw.length - 1) === '"') {
|
|
@@ -8244,6 +8387,10 @@ var parseRequirement = function(id, data) {
|
|
|
8244
8387
|
result.source = src;
|
|
8245
8388
|
}
|
|
8246
8389
|
(result.sourceRefs ??= []).push(src);
|
|
8390
|
+
} else if (cmd === "ref") {
|
|
8391
|
+
const r = parseRef(t, i, stripWrapping, unwrapBlock);
|
|
8392
|
+
(result.refs ??= []).push(r.ref);
|
|
8393
|
+
i = r.next;
|
|
8247
8394
|
} else {
|
|
8248
8395
|
unwrapBlock(t[i++]);
|
|
8249
8396
|
}
|
|
@@ -8385,6 +8532,9 @@ var dumpRequirement = function(r) {
|
|
|
8385
8532
|
for (const src of r.sourceRefs ?? (r.source && (r.source.doc || r.source.clause) ? [r.source] : [])) {
|
|
8386
8533
|
out += ' source { doc "' + escapeString(src.doc) + '" clause "' + escapeString(src.clause) + '"' + (src.fragment ? ' fragment "' + escapeString(src.fragment) + '"' : "") + " }\n";
|
|
8387
8534
|
}
|
|
8535
|
+
for (const ref of r.refs ?? []) {
|
|
8536
|
+
out += " ref " + ref.predicate + ' "' + escapeString(ref.target) + '"' + (ref.note ? ' { note "' + escapeString(ref.note) + '" }' : "") + "\n";
|
|
8537
|
+
}
|
|
8388
8538
|
out += "}\n";
|
|
8389
8539
|
return out;
|
|
8390
8540
|
};
|
|
@@ -8562,6 +8712,10 @@ var parsePackage = function(data) {
|
|
|
8562
8712
|
manifest.product = stripWrapping(t[i++]);
|
|
8563
8713
|
} else if (cmd === "maps_to" || cmd === "mapsTo") {
|
|
8564
8714
|
manifest.mapsTo = readList(t[i++]);
|
|
8715
|
+
} else if (cmd === "ref") {
|
|
8716
|
+
const r = parseRef(t, i, stripWrapping, unwrapBlock);
|
|
8717
|
+
(manifest.refs ??= []).push(r.ref);
|
|
8718
|
+
i = r.next;
|
|
8565
8719
|
} else if (cmd === "scheme_type" || cmd === "schemeType") {
|
|
8566
8720
|
manifest.schemeType = stripWrapping(t[i++]);
|
|
8567
8721
|
} else if (cmd === "provides") {
|
|
@@ -12429,6 +12583,14 @@ var CONSTRUCTS = [
|
|
|
12429
12583
|
parse: parseCompetenceKind,
|
|
12430
12584
|
dump: dumpCompetenceKind
|
|
12431
12585
|
}),
|
|
12586
|
+
// The relation registry (docs/primmel/18): declared ref predicates.
|
|
12587
|
+
defineConstruct({
|
|
12588
|
+
keyword: "predicate",
|
|
12589
|
+
field: "predicates",
|
|
12590
|
+
takesID: true,
|
|
12591
|
+
parse: parsePredicate,
|
|
12592
|
+
dump: dumpPredicate
|
|
12593
|
+
}),
|
|
12432
12594
|
// Primmel v3 domain constraints (TODO.roadmap/51 — BUG.R60-SSOT gap 7)
|
|
12433
12595
|
defineConstruct({
|
|
12434
12596
|
keyword: "constraint",
|
package/package.json
CHANGED