@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.
Files changed (52) hide show
  1. package/dist/src/ser-des/config/conformanceTest.d.ts.map +1 -1
  2. package/dist/src/ser-des/config/conformanceTest.js +19 -0
  3. package/dist/src/ser-des/config/conformanceTest.js.map +1 -1
  4. package/dist/src/ser-des/config/field-parser.d.ts.map +1 -1
  5. package/dist/src/ser-des/config/field-parser.js +31 -0
  6. package/dist/src/ser-des/config/field-parser.js.map +1 -1
  7. package/dist/src/ser-des/config/form.d.ts.map +1 -1
  8. package/dist/src/ser-des/config/form.js +23 -0
  9. package/dist/src/ser-des/config/form.js.map +1 -1
  10. package/dist/src/ser-des/config/index.d.ts.map +1 -1
  11. package/dist/src/ser-des/config/index.js +9 -0
  12. package/dist/src/ser-des/config/index.js.map +1 -1
  13. package/dist/src/ser-des/config/packageManifest.d.ts.map +1 -1
  14. package/dist/src/ser-des/config/packageManifest.js +22 -0
  15. package/dist/src/ser-des/config/packageManifest.js.map +1 -1
  16. package/dist/src/ser-des/config/predicate.d.ts +5 -0
  17. package/dist/src/ser-des/config/predicate.d.ts.map +1 -0
  18. package/dist/src/ser-des/config/predicate.js +111 -0
  19. package/dist/src/ser-des/config/predicate.js.map +1 -0
  20. package/dist/src/ser-des/config/ref.d.ts +15 -0
  21. package/dist/src/ser-des/config/ref.d.ts.map +1 -0
  22. package/dist/src/ser-des/config/ref.js +50 -0
  23. package/dist/src/ser-des/config/ref.js.map +1 -0
  24. package/dist/src/ser-des/config/requirement.d.ts.map +1 -1
  25. package/dist/src/ser-des/config/requirement.js +19 -0
  26. package/dist/src/ser-des/config/requirement.js.map +1 -1
  27. package/dist/src/ser-des/parse.d.ts.map +1 -1
  28. package/dist/src/ser-des/parse.js +1 -0
  29. package/dist/src/ser-des/parse.js.map +1 -1
  30. package/dist/src/ser-des/types.d.ts +2 -0
  31. package/dist/src/ser-des/types.d.ts.map +1 -1
  32. package/dist/src/types/ConformanceTest.d.ts +3 -0
  33. package/dist/src/types/ConformanceTest.d.ts.map +1 -1
  34. package/dist/src/types/Form.d.ts +11 -0
  35. package/dist/src/types/Form.d.ts.map +1 -1
  36. package/dist/src/types/Package.d.ts +4 -0
  37. package/dist/src/types/Package.d.ts.map +1 -1
  38. package/dist/src/types/Ref.d.ts +11 -0
  39. package/dist/src/types/Ref.d.ts.map +1 -0
  40. package/dist/src/types/Ref.js +3 -0
  41. package/dist/src/types/Ref.js.map +1 -0
  42. package/dist/src/types/RefPredicate.d.ts +22 -0
  43. package/dist/src/types/RefPredicate.d.ts.map +1 -0
  44. package/dist/src/types/RefPredicate.js +3 -0
  45. package/dist/src/types/RefPredicate.js.map +1 -0
  46. package/dist/src/types/Requirement.d.ts +3 -0
  47. package/dist/src/types/Requirement.d.ts.map +1 -1
  48. package/dist/src/types/Standard.d.ts +3 -0
  49. package/dist/src/types/Standard.d.ts.map +1 -1
  50. package/dist-browser/index.mjs +1186 -1104
  51. package/dist-cli/primmel.mjs +162 -0
  52. package/package.json +1 -1
@@ -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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@primmel/primmel",
3
- "version": "1.4.0",
3
+ "version": "1.5.0",
4
4
  "description": "Primmel — parser, types, and serializer for the Primmel modelling language (successor to MMEL)",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",