@primmel/primmel 1.4.1 → 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 +19 -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 +22 -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 +6 -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 +1159 -1082
  51. package/dist-cli/primmel.mjs +153 -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) {
@@ -1347,6 +1363,7 @@ function parseFormField(name, block, type) {
1347
1363
  pattern: "",
1348
1364
  required: false,
1349
1365
  requiredWhen: "",
1366
+ refs: [],
1350
1367
  measurementMethod: "",
1351
1368
  calculationId: null,
1352
1369
  calculationBindings: [],
@@ -1480,6 +1497,10 @@ function parseFormField(name, block, type) {
1480
1497
  field.referenceIds = tokenizePackage(t[i++]).map(stripWrapping);
1481
1498
  } else if (cmd === "references") {
1482
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;
1483
1504
  } else if (cmd === "specification_reference") {
1484
1505
  field.specificationReference = stripWrapping(t[i++]);
1485
1506
  } else if (cmd === "applicability") {
@@ -1814,6 +1835,13 @@ function dumpFormField(field, indent) {
1814
1835
  "references { " + dumpRoleReferences(field.fieldReferences) + " }"
1815
1836
  );
1816
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
+ }
1817
1845
  if (field.specificationReference) {
1818
1846
  inner.push(
1819
1847
  'specification_reference "' + escapeString(field.specificationReference) + '"'
@@ -4104,6 +4132,10 @@ var parseForm = function(id, data) {
4104
4132
  result.reportRows = rr;
4105
4133
  } else if (command === "references") {
4106
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;
4107
4139
  } else if (command === "calculation_context") {
4108
4140
  result.calculationContext = parseCalculationContext(
4109
4141
  unwrapBlock(t[i++])
@@ -4347,6 +4379,7 @@ function makeSubformRefField(subformId, block) {
4347
4379
  defaultValue: "",
4348
4380
  hasDefault: false,
4349
4381
  referenceIds: [],
4382
+ refs: [],
4350
4383
  fieldReferences: [],
4351
4384
  specificationReference: "",
4352
4385
  applicability: [],
@@ -4387,6 +4420,11 @@ var dumpForm = function(f) {
4387
4420
  if (f.formReferences.length > 0) {
4388
4421
  out += " references { " + dumpRoleReferences(f.formReferences) + " }\n";
4389
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
+ }
4390
4428
  if (f.calculationContext) {
4391
4429
  const cc = f.calculationContext;
4392
4430
  let line = " calculation_context { ";
@@ -6850,6 +6888,11 @@ var parseConformanceTest = function(id, data) {
6850
6888
  }
6851
6889
  } else if (keyword === "targets") {
6852
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);
6853
6896
  } else if (keyword === "binds_to") {
6854
6897
  result.bindsTo = tokenizePackage(value());
6855
6898
  } else if (keyword === "applicability") {
@@ -6976,6 +7019,9 @@ var dumpConformanceTest = function(ct) {
6976
7019
  } else if (ct.reference) {
6977
7020
  out += " reference " + ct.reference + "\n";
6978
7021
  }
7022
+ for (const r of ct.refs ?? []) {
7023
+ out += " ref " + r.predicate + ' "' + escapeString(r.target) + '"' + (r.note ? ' { note "' + escapeString(r.note) + '" }' : "") + "\n";
7024
+ }
6979
7025
  if (ct.targets.length > 0) {
6980
7026
  out += " targets {\n";
6981
7027
  for (const t of ct.targets) {
@@ -7687,6 +7733,94 @@ var dumpReferenceMaterial = function(m) {
7687
7733
  return out;
7688
7734
  };
7689
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
+
7690
7824
  // src/ser-des/config/constraint.ts
7691
7825
  function readValue2(raw) {
7692
7826
  if (raw.length >= 2 && raw.charAt(0) === '"' && raw.charAt(raw.length - 1) === '"') {
@@ -8253,6 +8387,10 @@ var parseRequirement = function(id, data) {
8253
8387
  result.source = src;
8254
8388
  }
8255
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;
8256
8394
  } else {
8257
8395
  unwrapBlock(t[i++]);
8258
8396
  }
@@ -8394,6 +8532,9 @@ var dumpRequirement = function(r) {
8394
8532
  for (const src of r.sourceRefs ?? (r.source && (r.source.doc || r.source.clause) ? [r.source] : [])) {
8395
8533
  out += ' source { doc "' + escapeString(src.doc) + '" clause "' + escapeString(src.clause) + '"' + (src.fragment ? ' fragment "' + escapeString(src.fragment) + '"' : "") + " }\n";
8396
8534
  }
8535
+ for (const ref of r.refs ?? []) {
8536
+ out += " ref " + ref.predicate + ' "' + escapeString(ref.target) + '"' + (ref.note ? ' { note "' + escapeString(ref.note) + '" }' : "") + "\n";
8537
+ }
8397
8538
  out += "}\n";
8398
8539
  return out;
8399
8540
  };
@@ -8571,6 +8712,10 @@ var parsePackage = function(data) {
8571
8712
  manifest.product = stripWrapping(t[i++]);
8572
8713
  } else if (cmd === "maps_to" || cmd === "mapsTo") {
8573
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;
8574
8719
  } else if (cmd === "scheme_type" || cmd === "schemeType") {
8575
8720
  manifest.schemeType = stripWrapping(t[i++]);
8576
8721
  } else if (cmd === "provides") {
@@ -12438,6 +12583,14 @@ var CONSTRUCTS = [
12438
12583
  parse: parseCompetenceKind,
12439
12584
  dump: dumpCompetenceKind
12440
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
+ }),
12441
12594
  // Primmel v3 domain constraints (TODO.roadmap/51 — BUG.R60-SSOT gap 7)
12442
12595
  defineConstruct({
12443
12596
  keyword: "constraint",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@primmel/primmel",
3
- "version": "1.4.1",
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",