@primmel/primmel 1.21.12 → 1.21.14

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 (117) hide show
  1. package/dist/src/check-allowlist.d.ts +12 -0
  2. package/dist/src/check-allowlist.d.ts.map +1 -1
  3. package/dist/src/check-allowlist.js +35 -4
  4. package/dist/src/check-allowlist.js.map +1 -1
  5. package/dist/src/check-rules.d.ts.map +1 -1
  6. package/dist/src/check-rules.js +30 -0
  7. package/dist/src/check-rules.js.map +1 -1
  8. package/dist/src/check.d.ts +38 -0
  9. package/dist/src/check.d.ts.map +1 -1
  10. package/dist/src/check.js +1155 -4
  11. package/dist/src/check.js.map +1 -1
  12. package/dist/src/export/retrieval.d.ts +9 -1
  13. package/dist/src/export/retrieval.d.ts.map +1 -1
  14. package/dist/src/export/retrieval.js +29 -0
  15. package/dist/src/export/retrieval.js.map +1 -1
  16. package/dist/src/expressions/index.d.ts +83 -0
  17. package/dist/src/expressions/index.d.ts.map +1 -0
  18. package/dist/src/expressions/index.js +382 -0
  19. package/dist/src/expressions/index.js.map +1 -0
  20. package/dist/src/fmt.d.ts +11 -0
  21. package/dist/src/fmt.d.ts.map +1 -0
  22. package/dist/src/fmt.js +71 -0
  23. package/dist/src/fmt.js.map +1 -0
  24. package/dist/src/ser-des/config/calculation.d.ts.map +1 -1
  25. package/dist/src/ser-des/config/calculation.js +46 -0
  26. package/dist/src/ser-des/config/calculation.js.map +1 -1
  27. package/dist/src/ser-des/config/competenceKind.d.ts.map +1 -1
  28. package/dist/src/ser-des/config/competenceKind.js +9 -20
  29. package/dist/src/ser-des/config/competenceKind.js.map +1 -1
  30. package/dist/src/ser-des/config/conformanceTest.d.ts.map +1 -1
  31. package/dist/src/ser-des/config/conformanceTest.js +33 -6
  32. package/dist/src/ser-des/config/conformanceTest.js.map +1 -1
  33. package/dist/src/ser-des/config/constraint.d.ts.map +1 -1
  34. package/dist/src/ser-des/config/constraint.js +24 -2
  35. package/dist/src/ser-des/config/constraint.js.map +1 -1
  36. package/dist/src/ser-des/config/index.d.ts +7 -0
  37. package/dist/src/ser-des/config/index.d.ts.map +1 -1
  38. package/dist/src/ser-des/config/index.js +50 -0
  39. package/dist/src/ser-des/config/index.js.map +1 -1
  40. package/dist/src/ser-des/config/lmlAligned.d.ts +16 -0
  41. package/dist/src/ser-des/config/lmlAligned.d.ts.map +1 -0
  42. package/dist/src/ser-des/config/lmlAligned.js +337 -0
  43. package/dist/src/ser-des/config/lmlAligned.js.map +1 -0
  44. package/dist/src/ser-des/config/packageManifest.d.ts.map +1 -1
  45. package/dist/src/ser-des/config/packageManifest.js +3 -0
  46. package/dist/src/ser-des/config/packageManifest.js.map +1 -1
  47. package/dist/src/ser-des/config/process.d.ts.map +1 -1
  48. package/dist/src/ser-des/config/process.js +192 -0
  49. package/dist/src/ser-des/config/process.js.map +1 -1
  50. package/dist/src/ser-des/config/requirement.d.ts.map +1 -1
  51. package/dist/src/ser-des/config/requirement.js +123 -7
  52. package/dist/src/ser-des/config/requirement.js.map +1 -1
  53. package/dist/src/ser-des/config/symbol.d.ts.map +1 -1
  54. package/dist/src/ser-des/config/symbol.js +21 -0
  55. package/dist/src/ser-des/config/symbol.js.map +1 -1
  56. package/dist/src/ser-des/config/table.d.ts.map +1 -1
  57. package/dist/src/ser-des/config/table.js +7 -0
  58. package/dist/src/ser-des/config/table.js.map +1 -1
  59. package/dist/src/ser-des/config/uncertaintyBudget.d.ts +5 -0
  60. package/dist/src/ser-des/config/uncertaintyBudget.d.ts.map +1 -0
  61. package/dist/src/ser-des/config/uncertaintyBudget.js +211 -0
  62. package/dist/src/ser-des/config/uncertaintyBudget.js.map +1 -0
  63. package/dist/src/ser-des/config/verdict.d.ts.map +1 -1
  64. package/dist/src/ser-des/config/verdict.js +12 -2
  65. package/dist/src/ser-des/config/verdict.js.map +1 -1
  66. package/dist/src/ser-des/dump.d.ts.map +1 -1
  67. package/dist/src/ser-des/dump.js +46 -0
  68. package/dist/src/ser-des/dump.js.map +1 -1
  69. package/dist/src/ser-des/expression-carrier.d.ts +17 -0
  70. package/dist/src/ser-des/expression-carrier.d.ts.map +1 -0
  71. package/dist/src/ser-des/expression-carrier.js +72 -0
  72. package/dist/src/ser-des/expression-carrier.js.map +1 -0
  73. package/dist/src/ser-des/package.d.ts.map +1 -1
  74. package/dist/src/ser-des/package.js +54 -4
  75. package/dist/src/ser-des/package.js.map +1 -1
  76. package/dist/src/ser-des/parse.d.ts.map +1 -1
  77. package/dist/src/ser-des/parse.js +36 -2
  78. package/dist/src/ser-des/parse.js.map +1 -1
  79. package/dist/src/ser-des/shape-front-end.d.ts.map +1 -1
  80. package/dist/src/ser-des/shape-front-end.js +24 -5
  81. package/dist/src/ser-des/shape-front-end.js.map +1 -1
  82. package/dist/src/ser-des/types.d.ts +10 -0
  83. package/dist/src/ser-des/types.d.ts.map +1 -1
  84. package/dist/src/text-coverage.d.ts.map +1 -1
  85. package/dist/src/text-coverage.js +52 -0
  86. package/dist/src/text-coverage.js.map +1 -1
  87. package/dist/src/types/Calculation.d.ts +14 -0
  88. package/dist/src/types/Calculation.d.ts.map +1 -1
  89. package/dist/src/types/CompetenceKind.d.ts +6 -14
  90. package/dist/src/types/CompetenceKind.d.ts.map +1 -1
  91. package/dist/src/types/ConformanceTest.d.ts +5 -1
  92. package/dist/src/types/ConformanceTest.d.ts.map +1 -1
  93. package/dist/src/types/Constraint.d.ts +10 -1
  94. package/dist/src/types/Constraint.d.ts.map +1 -1
  95. package/dist/src/types/LmlAligned.d.ts +76 -0
  96. package/dist/src/types/LmlAligned.d.ts.map +1 -0
  97. package/dist/src/types/LmlAligned.js +8 -0
  98. package/dist/src/types/LmlAligned.js.map +1 -0
  99. package/dist/src/types/Package.d.ts +7 -0
  100. package/dist/src/types/Package.d.ts.map +1 -1
  101. package/dist/src/types/Requirement.d.ts +33 -0
  102. package/dist/src/types/Requirement.d.ts.map +1 -1
  103. package/dist/src/types/Standard.d.ts +12 -0
  104. package/dist/src/types/Standard.d.ts.map +1 -1
  105. package/dist/src/types/Symbol.d.ts +8 -0
  106. package/dist/src/types/Symbol.d.ts.map +1 -1
  107. package/dist/src/types/UncertaintyBudget.d.ts +68 -0
  108. package/dist/src/types/UncertaintyBudget.d.ts.map +1 -0
  109. package/dist/src/types/UncertaintyBudget.js +3 -0
  110. package/dist/src/types/UncertaintyBudget.js.map +1 -0
  111. package/dist/src/types/Verdict.d.ts +3 -1
  112. package/dist/src/types/Verdict.d.ts.map +1 -1
  113. package/dist/src/types/process.d.ts +52 -1
  114. package/dist/src/types/process.d.ts.map +1 -1
  115. package/dist-browser/index.mjs +2791 -1925
  116. package/dist-cli/primmel.mjs +2931 -76
  117. package/package.json +1 -1
@@ -0,0 +1,382 @@
1
+ "use strict";
2
+ //! The Primmel expression language: the lexer, the precedence parser, and
3
+ //! the AST. The machine-executable core — first-class syntax, never a
4
+ //! quoted string. The identifiers resolve against the caller's scope (the
5
+ //! argument bindings); the unbound names surface at parse time.
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.lex = lex;
8
+ exports.parseExpression = parseExpression;
9
+ exports.canonicalizeExpression = canonicalizeExpression;
10
+ exports.freeIdentifiers = freeIdentifiers;
11
+ exports.renderExpression = renderExpression;
12
+ const OPERATORS = [
13
+ '->',
14
+ '<=',
15
+ '>=',
16
+ '!=',
17
+ '≠',
18
+ '<',
19
+ '>',
20
+ '=',
21
+ '+',
22
+ '-',
23
+ '*',
24
+ '/',
25
+ '(',
26
+ ')',
27
+ ',',
28
+ '.',
29
+ '|',
30
+ ];
31
+ const NAV_OPS = new Set(['forAll', 'exists', 'select', 'collect']);
32
+ function lex(src) {
33
+ const tokens = [];
34
+ let i = 0;
35
+ while (i < src.length) {
36
+ const c = src[i];
37
+ if (/\s/.test(c)) {
38
+ i += 1;
39
+ continue;
40
+ }
41
+ if (c === "'") {
42
+ let j = i + 1;
43
+ while (j < src.length && src[j] !== "'") {
44
+ j += 1;
45
+ }
46
+ if (j >= src.length) {
47
+ throw new Error(`expression: unterminated string at offset ${i}`);
48
+ }
49
+ tokens.push({ kind: 'str', value: src.slice(i + 1, j) });
50
+ i = j + 1;
51
+ continue;
52
+ }
53
+ if (/[0-9]/.test(c)) {
54
+ let j = i;
55
+ while (j < src.length && /[0-9.]/.test(src[j])) {
56
+ j += 1;
57
+ }
58
+ tokens.push({ kind: 'num', value: Number(src.slice(i, j)) });
59
+ i = j;
60
+ continue;
61
+ }
62
+ if (/[A-Za-z_]/.test(c)) {
63
+ let j = i;
64
+ while (j < src.length && /[A-Za-z0-9_.]/.test(src[j])) {
65
+ j += 1;
66
+ }
67
+ tokens.push({ kind: 'name', value: src.slice(i, j) });
68
+ i = j;
69
+ continue;
70
+ }
71
+ const two = src.slice(i, i + 2);
72
+ if (OPERATORS.includes(two)) {
73
+ tokens.push({ kind: 'op', value: two });
74
+ i += 2;
75
+ continue;
76
+ }
77
+ if (OPERATORS.includes(c)) {
78
+ tokens.push({ kind: 'op', value: c });
79
+ i += 1;
80
+ continue;
81
+ }
82
+ throw new Error(`expression: unexpected character "${c}" at offset ${i}`);
83
+ }
84
+ return tokens;
85
+ }
86
+ // ── the precedence-climbing parser ─────────────────────────────────────
87
+ const BINARY_LEVELS = [
88
+ ['implies'],
89
+ ['or'],
90
+ ['xor'],
91
+ ['and'],
92
+ ['<=', '>=', '<', '>', '=', '!=', '≠'],
93
+ ['+', '-'],
94
+ ['*', '/'],
95
+ ];
96
+ /** The word-spelled binary operators — never call targets. */
97
+ const WORD_BINOPS = new Set(['implies', 'or', 'xor', 'and']);
98
+ class ExprParser {
99
+ tokens;
100
+ pos = 0;
101
+ constructor(tokens) {
102
+ this.tokens = tokens;
103
+ }
104
+ peek() {
105
+ return this.tokens[this.pos];
106
+ }
107
+ take() {
108
+ const tok = this.tokens[this.pos];
109
+ if (tok === undefined) {
110
+ throw new Error('expression: unexpected end');
111
+ }
112
+ this.pos += 1;
113
+ return tok;
114
+ }
115
+ parse() {
116
+ const ast = this.parseLevel(0);
117
+ if (this.pos !== this.tokens.length) {
118
+ throw new Error(`expression: trailing tokens at position ${this.pos}`);
119
+ }
120
+ return ast;
121
+ }
122
+ parseLevel(level) {
123
+ if (level >= BINARY_LEVELS.length) {
124
+ return this.parseUnary();
125
+ }
126
+ let left = this.parseLevel(level + 1);
127
+ for (;;) {
128
+ const tok = this.peek();
129
+ const op = tok?.kind === 'op'
130
+ ? tok.value
131
+ : tok?.kind === 'name' && WORD_BINOPS.has(tok.value)
132
+ ? tok.value
133
+ : undefined;
134
+ if (op === undefined || !BINARY_LEVELS[level].includes(op)) {
135
+ return left;
136
+ }
137
+ this.take();
138
+ const right = this.parseLevel(level + 1);
139
+ left = { type: 'binop', op, left, right };
140
+ }
141
+ }
142
+ parseUnary() {
143
+ const tok = this.peek();
144
+ if (tok?.kind === 'name' && (tok.value === 'not' || tok.value === '-')) {
145
+ this.take();
146
+ return { type: 'unop', op: tok.value, operand: this.parseUnary() };
147
+ }
148
+ if (tok?.kind === 'op' && tok.value === '-') {
149
+ this.take();
150
+ return { type: 'unop', op: '-', operand: this.parseUnary() };
151
+ }
152
+ return this.parsePrimary();
153
+ }
154
+ parsePrimary() {
155
+ const tok = this.take();
156
+ if (tok.kind === 'num') {
157
+ return { type: 'num', value: tok.value };
158
+ }
159
+ if (tok.kind === 'str') {
160
+ return { type: 'str', value: tok.value };
161
+ }
162
+ if (tok.kind === 'op' && tok.value === '(') {
163
+ const inner = this.parseLevel(0);
164
+ const close = this.take();
165
+ if (close.kind !== 'op' || close.value !== ')') {
166
+ throw new Error('expression: expected closing parenthesis');
167
+ }
168
+ return inner;
169
+ }
170
+ if (tok.kind === 'name') {
171
+ // the boolean and conditional keywords — reserved literals and
172
+ // the OCL conditional form, never call targets
173
+ if (tok.value === 'true' || tok.value === 'false') {
174
+ return { type: 'bool', value: tok.value === 'true' };
175
+ }
176
+ if (tok.value === 'if') {
177
+ const cond = this.parseLevel(0);
178
+ const thenTok = this.take();
179
+ if (thenTok.kind !== 'name' || thenTok.value !== 'then') {
180
+ throw new Error('expression: expected "then" in the conditional');
181
+ }
182
+ const whenTrue = this.parseLevel(0);
183
+ const elseTok = this.take();
184
+ if (elseTok.kind !== 'name' || elseTok.value !== 'else') {
185
+ throw new Error('expression: expected "else" in the conditional');
186
+ }
187
+ const whenFalse = this.parseLevel(0);
188
+ const endTok = this.take();
189
+ if (endTok.kind !== 'name' || endTok.value !== 'endif') {
190
+ throw new Error('expression: expected "endif" to close the conditional');
191
+ }
192
+ return { type: 'ifelse', cond, then: whenTrue, else: whenFalse };
193
+ }
194
+ // the dotted path first — its segments join; a following '(' makes
195
+ // it a call (the table-as-object idiom: table.permits(a, b))
196
+ const segs = [tok.value];
197
+ while (this.peek()?.kind === 'op' && this.peek().value === '.') {
198
+ this.take();
199
+ const seg = this.take();
200
+ if (seg.kind !== 'name') {
201
+ throw new Error('expression: expected a path segment after "."');
202
+ }
203
+ segs.push(seg.value);
204
+ }
205
+ const next = this.peek();
206
+ if (next?.kind === 'op' &&
207
+ next.value === '(' &&
208
+ !WORD_BINOPS.has(segs[0])) {
209
+ this.take();
210
+ const args = [];
211
+ const closing = this.peek();
212
+ if (closing?.kind === 'op' && closing.value === ')') {
213
+ this.take();
214
+ return { type: 'call', callee: segs.join('.'), args };
215
+ }
216
+ for (;;) {
217
+ args.push(this.parseLevel(0));
218
+ const sep = this.peek();
219
+ if (sep?.kind === 'op' && sep.value === ',') {
220
+ this.take();
221
+ continue;
222
+ }
223
+ break;
224
+ }
225
+ const close = this.take();
226
+ if (close.kind !== 'op' || close.value !== ')') {
227
+ throw new Error('expression: expected closing parenthesis');
228
+ }
229
+ return { type: 'call', callee: segs.join('.'), args };
230
+ }
231
+ // the collection navigation (register 24):
232
+ // source -> forAll(v | body) / exists / select
233
+ const arrow = this.peek();
234
+ if (arrow?.kind === 'op' && arrow.value === '->') {
235
+ this.take();
236
+ const opTok = this.take();
237
+ if (opTok.kind !== 'name' || !NAV_OPS.has(opTok.value)) {
238
+ throw new Error('expression: expected a collection iterator (forAll | exists | select | collect)');
239
+ }
240
+ if (this.peek()?.kind !== 'op' || this.peek().value !== '(') {
241
+ throw new Error('expression: expected ( after the iterator');
242
+ }
243
+ this.take();
244
+ const varTok = this.take();
245
+ if (varTok.kind !== 'name') {
246
+ throw new Error('expression: expected the lambda parameter');
247
+ }
248
+ if (this.peek()?.kind !== 'op' || this.peek().value !== '|') {
249
+ throw new Error('expression: expected | after the parameter');
250
+ }
251
+ this.take();
252
+ const body = this.parseLevel(0);
253
+ const close = this.take();
254
+ if (close.kind !== 'op' || close.value !== ')') {
255
+ throw new Error('expression: expected closing parenthesis');
256
+ }
257
+ return {
258
+ type: 'nav',
259
+ source: segs.join('.'),
260
+ op: opTok.value,
261
+ var: varTok.value,
262
+ body,
263
+ };
264
+ }
265
+ return { type: 'name', path: segs };
266
+ }
267
+ throw new Error(`expression: unexpected token "${String(tok.value)}"`);
268
+ }
269
+ }
270
+ function parseExpression(src) {
271
+ return new ExprParser(lex(src)).parse();
272
+ }
273
+ /**
274
+ * The inline-block carrier's canonical form: the raw block text parsed
275
+ * and re-rendered — every carrier stores this, and the canonical source
276
+ * reparses to the same tree (the dump fixpoint).
277
+ */
278
+ function canonicalizeExpression(raw) {
279
+ const body = raw.trim();
280
+ if (body.length === 0) {
281
+ throw new Error('expression: the block is empty');
282
+ }
283
+ return renderExpression(parseExpression(body));
284
+ }
285
+ /** The named leaves and the call targets of the AST. The lambda
286
+ * parameters bind their bodies: a name rooted at a bound parameter is
287
+ * the navigation's own, never free. */
288
+ function freeIdentifiers(ast) {
289
+ const out = { names: [], calls: [] };
290
+ const walk = (node, bound) => {
291
+ switch (node.type) {
292
+ case 'num':
293
+ return;
294
+ case 'str':
295
+ return;
296
+ case 'bool':
297
+ return;
298
+ case 'ifelse':
299
+ walk(node.cond, bound);
300
+ walk(node.then, bound);
301
+ walk(node.else, bound);
302
+ return;
303
+ case 'name': {
304
+ // the lexer's name token carries its dots whole — the root is
305
+ // the token's first dot-segment, not the path array's
306
+ if (bound.has(node.path[0].split('.')[0])) {
307
+ return;
308
+ }
309
+ out.names.push(node.path.join('.'));
310
+ return;
311
+ }
312
+ case 'call':
313
+ out.calls.push(node.callee);
314
+ for (const a of node.args) {
315
+ walk(a, bound);
316
+ }
317
+ return;
318
+ case 'unop':
319
+ walk(node.operand, bound);
320
+ return;
321
+ case 'binop':
322
+ walk(node.left, bound);
323
+ walk(node.right, bound);
324
+ return;
325
+ case 'nav': {
326
+ const inner = new Set(bound);
327
+ inner.add(node['var']);
328
+ walk({ type: 'name', path: [node.source] }, bound);
329
+ walk(node.body, inner);
330
+ return;
331
+ }
332
+ }
333
+ };
334
+ walk(ast, new Set());
335
+ return out;
336
+ }
337
+ /** The canonical source form of the AST (the dumper's output). */
338
+ function renderExpression(ast) {
339
+ switch (ast.type) {
340
+ case 'num':
341
+ return String(ast.value);
342
+ case 'str':
343
+ return "'" + ast.value + "'";
344
+ case 'bool':
345
+ return ast.value ? 'true' : 'false';
346
+ case 'ifelse':
347
+ return ('if ' +
348
+ renderExpression(ast.cond) +
349
+ ' then ' +
350
+ renderExpression(ast.then) +
351
+ ' else ' +
352
+ renderExpression(ast.else) +
353
+ ' endif');
354
+ case 'name':
355
+ return ast.path.join('.');
356
+ case 'call':
357
+ return ast.callee + '(' + ast.args.map(renderExpression).join(', ') + ')';
358
+ case 'unop': {
359
+ // a unary over a binary needs the parens back — the rendered
360
+ // source must reparse to the same tree
361
+ const inner = renderExpression(ast.operand);
362
+ return (ast.op +
363
+ (ast.operand.type === 'binop' ? ' (' + inner + ')' : ' ' + inner));
364
+ }
365
+ case 'nav':
366
+ return (ast.source +
367
+ ' -> ' +
368
+ ast.op +
369
+ '(' +
370
+ ast['var'] +
371
+ ' | ' +
372
+ renderExpression(ast.body) +
373
+ ')');
374
+ case 'binop':
375
+ return (renderExpression(ast.left) +
376
+ ' ' +
377
+ ast.op +
378
+ ' ' +
379
+ renderExpression(ast.right));
380
+ }
381
+ }
382
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/expressions/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export interface FmtFileResult {
2
+ file: string;
3
+ status: 'formatted' | 'unchanged' | 'unstable' | 'skipped-includes';
4
+ }
5
+ export interface FmtResult {
6
+ dir: string;
7
+ files: FmtFileResult[];
8
+ written: number;
9
+ }
10
+ export declare function fmtPackage(dir: string, check?: boolean): FmtResult;
11
+ //# sourceMappingURL=fmt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fmt.d.ts","sourceRoot":"","sources":["../../src/fmt.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,GAAG,WAAW,GAAG,UAAU,GAAG,kBAAkB,CAAC;CACrE;AAED,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;CACjB;AAgBD,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,UAAQ,GAAG,SAAS,CAqChE"}
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ // ─────────────────────────────────────────────────────────────────────
3
+ // fmt (register W8): the canonical serialization as a command. Each
4
+ // .prl content file loads, dumps, and — when the bytes differ — is
5
+ // written back in the canon. The fixpoint is the safety: the dumped
6
+ // text re-loads to itself, verified before any write; a file that does
7
+ // not round-trip byte-stably is reported, never rewritten. The author's
8
+ // facet order yields to the canonical order — the canon is the
9
+ // save-back contract (the kernel owns the serialized form; the editor's
10
+ // save path rides the same dump). Files that `include "…"` are skipped
11
+ // in place: the dump inlines the included text, and the include
12
+ // structure is the author's.
13
+ // ─────────────────────────────────────────────────────────────────────
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.fmtPackage = fmtPackage;
16
+ const node_fs_1 = require("node:fs");
17
+ const node_path_1 = require("node:path");
18
+ const index_1 = require("./ser-des/index");
19
+ const ALLOWLIST = '.primmel-allowlist.prl';
20
+ function walkPrl(dir, out = []) {
21
+ for (const e of (0, node_fs_1.readdirSync)(dir).sort()) {
22
+ const p = (0, node_path_1.join)(dir, e);
23
+ if ((0, node_fs_1.statSync)(p).isDirectory()) {
24
+ walkPrl(p, out);
25
+ }
26
+ else if (e.endsWith('.prl') && e !== ALLOWLIST) {
27
+ out.push(p);
28
+ }
29
+ }
30
+ return out;
31
+ }
32
+ function fmtPackage(dir, check = false) {
33
+ const result = { dir, files: [], written: 0 };
34
+ for (const file of walkPrl(dir)) {
35
+ const src = (0, node_fs_1.readFileSync)(file, 'utf8');
36
+ if (/^\s*include\s+"/m.test(src)) {
37
+ result.files.push({ file, status: 'skipped-includes' });
38
+ continue;
39
+ }
40
+ let canonical;
41
+ try {
42
+ const raw = (0, index_1.dump)((0, index_1.loadFile)(file));
43
+ // the fixpoint gate: the canonical text must re-load to itself
44
+ if ((0, index_1.dump)((0, index_1.load)(raw)) !== raw) {
45
+ result.files.push({ file, status: 'unstable' });
46
+ continue;
47
+ }
48
+ // a source without a metadata header gains an EMPTY one from the
49
+ // Standard-level dump — strip the empty form back off; a metadata
50
+ // block with content stays
51
+ canonical = /^\s*metadata\s*\{/.test(src)
52
+ ? raw
53
+ : raw.replace(/^metadata \{\n(?: {2}\w+ ""\n)*\}\n+/, '');
54
+ }
55
+ catch {
56
+ result.files.push({ file, status: 'unstable' });
57
+ continue;
58
+ }
59
+ if (canonical === src) {
60
+ result.files.push({ file, status: 'unchanged' });
61
+ continue;
62
+ }
63
+ if (!check) {
64
+ (0, node_fs_1.writeFileSync)(file, canonical);
65
+ result.written += 1;
66
+ }
67
+ result.files.push({ file, status: 'formatted' });
68
+ }
69
+ return result;
70
+ }
71
+ //# sourceMappingURL=fmt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fmt.js","sourceRoot":"","sources":["../../src/fmt.ts"],"names":[],"mappings":";AAAA,wEAAwE;AACxE,oEAAoE;AACpE,mEAAmE;AACnE,oEAAoE;AACpE,uEAAuE;AACvE,wEAAwE;AACxE,+DAA+D;AAC/D,wEAAwE;AACxE,uEAAuE;AACvE,gEAAgE;AAChE,6BAA6B;AAC7B,wEAAwE;;AA+BxE,gCAqCC;AAlED,qCAA6E;AAC7E,yCAAiC;AACjC,2CAAuD;AAavD,MAAM,SAAS,GAAG,wBAAwB,CAAC;AAE3C,SAAS,OAAO,CAAC,GAAW,EAAE,MAAgB,EAAE;IAC9C,KAAK,MAAM,CAAC,IAAI,IAAA,qBAAW,EAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QACxC,MAAM,CAAC,GAAG,IAAA,gBAAI,EAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACvB,IAAI,IAAA,kBAAQ,EAAC,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;YAC9B,OAAO,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAClB,CAAC;aAAM,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;YACjD,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAgB,UAAU,CAAC,GAAW,EAAE,KAAK,GAAG,KAAK;IACnD,MAAM,MAAM,GAAc,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;IACzD,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAChC,MAAM,GAAG,GAAG,IAAA,sBAAY,EAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACvC,IAAI,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACjC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC,CAAC;YACxD,SAAS;QACX,CAAC;QACD,IAAI,SAAiB,CAAC;QACtB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAA,YAAI,EAAC,IAAA,gBAAQ,EAAC,IAAI,CAAC,CAAC,CAAC;YACjC,+DAA+D;YAC/D,IAAI,IAAA,YAAI,EAAC,IAAA,YAAI,EAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;gBAC5B,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;gBAChD,SAAS;YACX,CAAC;YACD,iEAAiE;YACjE,kEAAkE;YAClE,2BAA2B;YAC3B,SAAS,GAAG,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC;gBACvC,CAAC,CAAC,GAAG;gBACL,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,sCAAsC,EAAE,EAAE,CAAC,CAAC;QAC9D,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;YAChD,SAAS;QACX,CAAC;QACD,IAAI,SAAS,KAAK,GAAG,EAAE,CAAC;YACtB,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;YACjD,SAAS;QACX,CAAC;QACD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,IAAA,uBAAa,EAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YAC/B,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC;QACtB,CAAC;QACD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"calculation.d.ts","sourceRoot":"","sources":["../../../../src/ser-des/config/calculation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAWzD,OAAO,KAAK,WAAW,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,EAKV,qBAAqB,EACtB,MAAM,yBAAyB,CAAC;AAIjC,eAAO,MAAM,gBAAgB,EAAE,MAiI9B,CAAC;AAgWF,eAAO,MAAM,kBAAkB,EAAE,QAAQ,CAAC,WAAW,EAAE,qBAAqB,CAUzE,CAAC;AAEJ,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,WAAW,CA+H/C,CAAC"}
1
+ {"version":3,"file":"calculation.d.ts","sourceRoot":"","sources":["../../../../src/ser-des/config/calculation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAWzD,OAAO,KAAK,WAAW,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,EAKV,qBAAqB,EACtB,MAAM,yBAAyB,CAAC;AAIjC,eAAO,MAAM,gBAAgB,EAAE,MAoJ9B,CAAC;AAiXF,eAAO,MAAM,kBAAkB,EAAE,QAAQ,CAAC,WAAW,EAAE,qBAAqB,CAUzE,CAAC;AAEJ,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,WAAW,CAqI/C,CAAC"}
@@ -54,6 +54,27 @@ const parseCalculation = function (id, data) {
54
54
  else if (command === 'expression') {
55
55
  result.expression = (0, tokenize_1.unwrapBlock)(t[i++]);
56
56
  }
57
+ else if (command === 'math') {
58
+ // The declared math (TODO.lang-gaps 20): notation + formula —
59
+ // math is NOT in OCL (spec clause 13, calculation-math).
60
+ const inner = (0, tokenize_1.tokenizePackage)((0, tokenize_1.unwrapBlock)(t[i++]));
61
+ let notation = '';
62
+ let formula = '';
63
+ let j = 0;
64
+ while (j < inner.length) {
65
+ const k = inner[j++];
66
+ if (j >= inner.length) {
67
+ break;
68
+ }
69
+ if (k === 'notation') {
70
+ notation = (0, tokenize_1.stripWrapping)(inner[j++]);
71
+ }
72
+ else if (k === 'formula') {
73
+ formula = (0, tokenize_1.stripWrapping)(inner[j++]);
74
+ }
75
+ }
76
+ result.math = { notation, formula };
77
+ }
57
78
  else if (command === 'reference') {
58
79
  result._relations.ref = (0, tokenize_1.tokenizePackage)(t[i++]);
59
80
  }
@@ -454,6 +475,25 @@ function parseVariant(vid, block, calcId) {
454
475
  else if (cmd === 'expression') {
455
476
  variant.expression = (0, tokenize_1.stripWrapping)(t[i++]);
456
477
  }
478
+ else if (cmd === 'math') {
479
+ const inner = (0, tokenize_1.tokenizePackage)((0, tokenize_1.unwrapBlock)(t[i++]));
480
+ let notation = '';
481
+ let formula = '';
482
+ let j = 0;
483
+ while (j < inner.length) {
484
+ const k = inner[j++];
485
+ if (j >= inner.length) {
486
+ break;
487
+ }
488
+ if (k === 'notation') {
489
+ notation = (0, tokenize_1.stripWrapping)(inner[j++]);
490
+ }
491
+ else if (k === 'formula') {
492
+ formula = (0, tokenize_1.stripWrapping)(inner[j++]);
493
+ }
494
+ }
495
+ variant.math = { notation, formula };
496
+ }
457
497
  else if (cmd === 'lookup') {
458
498
  variant.lookup = parseLookup((0, tokenize_1.unwrapBlock)(t[i++]));
459
499
  }
@@ -606,6 +646,12 @@ const dumpCalculation = function (c) {
606
646
  if (c.expression) {
607
647
  out += ' expression "' + (0, tokenize_1.escapeString)(c.expression) + '"\n';
608
648
  }
649
+ if (c.math) {
650
+ out += ' math {\n';
651
+ out += ' notation ' + c.math.notation + '\n';
652
+ out += ' formula "' + (0, tokenize_1.escapeString)(c.math.formula) + '"\n';
653
+ out += ' }\n';
654
+ }
609
655
  if (c.params && c.params.length > 0) {
610
656
  out += ' params { ' + c.params.join(' ') + ' }\n';
611
657
  }