@portll/cobolwork 0.5.0 → 0.7.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 (163) hide show
  1. package/README.md +89 -26
  2. package/STABILITY.md +76 -0
  3. package/bin/cobolwork.mjs +56 -14
  4. package/lib/baseline.mjs +9 -0
  5. package/lib/bms.mjs +21 -7
  6. package/lib/build.mjs +133 -53
  7. package/lib/capabilities.mjs +13 -11
  8. package/lib/cics-commands.mjs +501 -9
  9. package/lib/compliance.mjs +11 -0
  10. package/lib/consequence.mjs +17 -0
  11. package/lib/control-reuse.mjs +113 -0
  12. package/lib/control-workers.mjs +161 -0
  13. package/lib/control.mjs +77 -4
  14. package/lib/dataflow.mjs +402 -152
  15. package/lib/db2/cursor.mjs +15 -0
  16. package/lib/db2/read.mjs +170 -0
  17. package/lib/db2/rules.mjs +77 -0
  18. package/lib/db2/stmt/alter.mjs +473 -0
  19. package/lib/db2/stmt/grant.mjs +125 -0
  20. package/lib/db2/stmt/index.mjs +141 -0
  21. package/lib/db2/stmt/misc.mjs +325 -0
  22. package/lib/db2/stmt/routine.mjs +564 -0
  23. package/lib/db2/stmt/storage.mjs +146 -0
  24. package/lib/db2/stmt/table.mjs +540 -0
  25. package/lib/db2/stmt/view.mjs +146 -0
  26. package/lib/diff.mjs +17 -5
  27. package/lib/equivalence.mjs +44 -5
  28. package/lib/evidence/cli.mjs +26 -7
  29. package/lib/evidence/record.mjs +16 -6
  30. package/lib/evidence/seal.mjs +17 -0
  31. package/lib/evidence/store.mjs +44 -15
  32. package/lib/evidence/timestamp.mjs +83 -0
  33. package/lib/evidence/verify.mjs +120 -42
  34. package/lib/exec-reading.mjs +51 -0
  35. package/lib/execution.mjs +3 -2
  36. package/lib/explain.mjs +2 -0
  37. package/lib/exploitability.mjs +11 -2
  38. package/lib/hlasm/asm/data.mjs +128 -0
  39. package/lib/hlasm/asm/listing.mjs +43 -0
  40. package/lib/hlasm/asm/output.mjs +45 -0
  41. package/lib/hlasm/asm/sections.mjs +161 -0
  42. package/lib/hlasm/asm/symbols.mjs +78 -0
  43. package/lib/hlasm/exec.mjs +27 -0
  44. package/lib/hlasm/expr.mjs +167 -0
  45. package/lib/hlasm/instr.mjs +73 -0
  46. package/lib/hlasm/locate.mjs +333 -0
  47. package/lib/hlasm/macro/authorization.mjs +146 -0
  48. package/lib/hlasm/macro/datasets.mjs +107 -0
  49. package/lib/hlasm/macro/io.mjs +162 -0
  50. package/lib/hlasm/macro/le.mjs +53 -0
  51. package/lib/hlasm/macro/linkage.mjs +143 -0
  52. package/lib/hlasm/macro/operator.mjs +77 -0
  53. package/lib/hlasm/macro/program.mjs +184 -0
  54. package/lib/hlasm/macro/recovery.mjs +85 -0
  55. package/lib/hlasm/macro/storage.mjs +167 -0
  56. package/lib/hlasm/macro/structured.mjs +131 -0
  57. package/lib/hlasm/model.mjs +97 -0
  58. package/lib/hlasm/mvs38.mjs +47 -0
  59. package/lib/hlasm/operands.mjs +59 -0
  60. package/lib/hlasm/optable.mjs +61 -0
  61. package/lib/hlasm/read.mjs +130 -0
  62. package/lib/hlasm.mjs +44 -7
  63. package/lib/ims/dli.mjs +37 -0
  64. package/lib/ims/macro/dbd.mjs +299 -0
  65. package/lib/ims/macro/psb.mjs +286 -0
  66. package/lib/ims/model.mjs +149 -0
  67. package/lib/ims/operands.mjs +23 -0
  68. package/lib/ims/read.mjs +37 -0
  69. package/lib/ims/rules.mjs +135 -0
  70. package/lib/inventory.mjs +10 -7
  71. package/lib/ironwork-ids.mjs +24 -0
  72. package/lib/ironwork.mjs +20 -13
  73. package/lib/kernel/pds-archive.mjs +256 -0
  74. package/lib/kernel/registry.mjs +32 -23
  75. package/lib/kernel/shared-pass.mjs +163 -0
  76. package/lib/kernel/source-tree.mjs +104 -36
  77. package/lib/kernel/version-key.mjs +17 -0
  78. package/lib/layout.mjs +26 -31
  79. package/lib/options.mjs +26 -4
  80. package/lib/parser.mjs +136 -17
  81. package/lib/pli/cursor.mjs +15 -0
  82. package/lib/pli/expr.mjs +101 -0
  83. package/lib/pli/include.mjs +82 -0
  84. package/lib/pli/layout.mjs +125 -0
  85. package/lib/pli/lex.mjs +198 -0
  86. package/lib/pli/program.mjs +280 -0
  87. package/lib/pli/rules/based.mjs +95 -0
  88. package/lib/pli/rules/conditions.mjs +68 -0
  89. package/lib/pli/rules/entry.mjs +130 -0
  90. package/lib/pli/rules/index.mjs +24 -0
  91. package/lib/pli/rules/preprocessor.mjs +55 -0
  92. package/lib/pli/statements.mjs +130 -0
  93. package/lib/pli/stmt/alloc.mjs +45 -0
  94. package/lib/pli/stmt/assignment.mjs +56 -0
  95. package/lib/pli/stmt/call.mjs +104 -0
  96. package/lib/pli/stmt/conditions.mjs +94 -0
  97. package/lib/pli/stmt/control.mjs +219 -0
  98. package/lib/pli/stmt/declare.mjs +149 -0
  99. package/lib/pli/stmt/exec.mjs +55 -0
  100. package/lib/pli/stmt/io.mjs +239 -0
  101. package/lib/pli/stmt/misc.mjs +4 -0
  102. package/lib/pli/stmt/preprocessor.mjs +242 -0
  103. package/lib/pli/stmt/procedure.mjs +258 -0
  104. package/lib/pli/stmt/stream.mjs +283 -0
  105. package/lib/pli/storage.mjs +129 -0
  106. package/lib/policy.mjs +6 -0
  107. package/lib/precompile-check.mjs +124 -0
  108. package/lib/precompile-cics.mjs +8 -4
  109. package/lib/reach.mjs +11 -2
  110. package/lib/revision.json +1 -1
  111. package/lib/sarif.mjs +44 -3
  112. package/lib/scan.mjs +28 -12
  113. package/lib/sets/abend.mjs +82 -8
  114. package/lib/sets/build.mjs +43 -37
  115. package/lib/sets/cics.mjs +20 -38
  116. package/lib/sets/compile.mjs +46 -18
  117. package/lib/sets/copybook.mjs +5 -3
  118. package/lib/sets/crypto.mjs +5 -3
  119. package/lib/sets/ddl.mjs +36 -0
  120. package/lib/sets/flow.mjs +32 -8
  121. package/lib/sets/hidden.mjs +5 -3
  122. package/lib/sets/hlasm.mjs +124 -8
  123. package/lib/sets/ims.mjs +139 -0
  124. package/lib/sets/log.mjs +11 -9
  125. package/lib/sets/opaque.mjs +27 -7
  126. package/lib/sets/pli.mjs +40 -0
  127. package/lib/sets/priv.mjs +5 -3
  128. package/lib/sets/recon.mjs +5 -3
  129. package/lib/sets/secrets.mjs +112 -0
  130. package/lib/sets/semantics.mjs +8 -3
  131. package/lib/sets/web.mjs +39 -23
  132. package/lib/site.mjs +10 -0
  133. package/lib/sources.mjs +80 -20
  134. package/lib/statement-cursor.mjs +67 -0
  135. package/lib/verify.mjs +3 -2
  136. package/lib/version.mjs +6 -0
  137. package/package.json +3 -2
  138. package/rules/compliance-cobit2019.json +520 -5
  139. package/rules/compliance-dora.json +509 -5
  140. package/rules/compliance-ffiec.json +505 -1
  141. package/rules/compliance-nist80053.json +557 -1
  142. package/rules/gitleaks-mainframe.toml +46 -15
  143. package/rules/hlasm-instructions.json +2396 -0
  144. package/rules/hlasm-optables.json +8024 -0
  145. package/schema/cobolwork-baseline.schema.json +36 -0
  146. package/schema/cobolwork-build-provenance.schema.json +187 -0
  147. package/schema/cobolwork-build.schema.json +382 -0
  148. package/schema/cobolwork-capabilities.schema.json +239 -0
  149. package/schema/cobolwork-diff.schema.json +217 -0
  150. package/schema/cobolwork-evidence.schema.json +161 -0
  151. package/schema/cobolwork-execution.schema.json +53 -0
  152. package/schema/cobolwork-explain.schema.json +360 -0
  153. package/schema/cobolwork-finding.schema.json +465 -0
  154. package/schema/cobolwork-flow.schema.json +465 -0
  155. package/schema/cobolwork-gate.schema.json +211 -0
  156. package/schema/cobolwork-inventory.schema.json +206 -0
  157. package/schema/cobolwork-parse.schema.json +105 -0
  158. package/schema/cobolwork-reach.schema.json +74 -0
  159. package/schema/cobolwork-report.schema.json +559 -0
  160. package/schema/cobolwork-witness.schema.json +107 -0
  161. package/schema/cobolwork.baseline.schema.json +101 -0
  162. package/schema/cobolwork.policy.schema.json +7 -0
  163. package/schema/cobolwork.site.schema.json +116 -0
@@ -0,0 +1,146 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ // Db2 for z/OS CREATE DATABASE, CREATE STOGROUP and CREATE [LOB | LARGE] TABLESPACE, after the Db2 13
3
+ // SQL Reference; every clause at most once, in any order.
4
+
5
+ import { cursor } from '../cursor.mjs';
6
+ import { readName, readInteger, only } from './table.mjs';
7
+ import { readUsing } from './index.mjs';
8
+
9
+ const CCSIDS = ['ASCII', 'EBCDIC', 'UNICODE'];
10
+
11
+ function setter(c, into) {
12
+ return (key, value) => {
13
+ if (key in into) c.fail(`no second ${key}`);
14
+ into[key] = value;
15
+ };
16
+ }
17
+
18
+ const yes = (c) => only(c, ['YES', 'NO']) === 'YES';
19
+ const name = (c) => readName(c).join('.');
20
+
21
+ function readDatabase(c) {
22
+ c.expectWord('DATABASE');
23
+ const node = { kind: 'CREATE DATABASE', name: name(c), options: {} };
24
+ const set = setter(c, node.options);
25
+ while (!c.done()) {
26
+ if (c.word('BUFFERPOOL')) set('bufferpool', name(c));
27
+ else if (c.word('INDEXBP')) set('indexbp', name(c));
28
+ else if (c.isWord('AS') && c.isWord('WORKFILE', 1)) { c.next(); c.next(); set('workfile', c.word('FOR') ? { member: name(c) } : {}); }
29
+ else if (c.word('STOGROUP')) set('stogroup', name(c));
30
+ else if (c.word('CCSID')) set('ccsid', only(c, CCSIDS));
31
+ else c.fail('a database clause');
32
+ }
33
+ return node;
34
+ }
35
+
36
+ // The volume list holds volume serials or '*', which lets SMS choose.
37
+ function readStogroup(c) {
38
+ c.expectWord('STOGROUP');
39
+ const node = { kind: 'CREATE STOGROUP', name: name(c), options: {} };
40
+ const set = setter(c, node.options);
41
+ while (!c.done()) {
42
+ if (c.word('VOLUMES')) {
43
+ set('volumes', c.items().map((item) => {
44
+ const s = cursor(item);
45
+ const t = s.next();
46
+ if (!t || !['word', 'ident', 'lit', 'num'].includes(t.t) || !s.done()) s.fail("a volume serial or '*'");
47
+ return t.v;
48
+ }));
49
+ } else if (c.word('VCAT')) set('vcat', name(c));
50
+ else if (c.isWord(['DATACLAS', 'MGMTCLAS', 'STORCLAS'])) set(c.next().u.toLowerCase(), name(c));
51
+ else if (c.isWord('NO') && c.isWord('KEY', 1)) { c.next(); c.next(); c.expectWord('LABEL'); set('keyLabel', null); }
52
+ else if (c.isWord('KEY') && c.isWord('LABEL', 1)) { c.next(); c.next(); set('keyLabel', name(c)); }
53
+ else c.fail('a storage group clause');
54
+ }
55
+ if (!('vcat' in node.options)) c.fail('VCAT');
56
+ return node;
57
+ }
58
+
59
+ function readCompress(c) {
60
+ if (!yes(c)) return 'NO';
61
+ const how = c.word(['FIXEDLENGTH', 'HUFFMAN']);
62
+ return how ? how.u : 'YES';
63
+ }
64
+
65
+ function readDssize(c) {
66
+ const n = readInteger(c);
67
+ c.expectWord('G');
68
+ return `${n}G`;
69
+ }
70
+
71
+ // USING, FREEPAGE, PCTFREE [FOR UPDATE n], GBPCACHE, COMPRESS, TRACKMOD and DSSIZE: the clauses a
72
+ // partition may carry as well as the table space.
73
+ function readSpaceClause(c, set) {
74
+ if (c.isWord('USING')) set('using', readUsing(c));
75
+ else if (c.word('FREEPAGE')) set('freepage', readInteger(c));
76
+ else if (c.word('PCTFREE')) {
77
+ const pctfree = readInteger(c);
78
+ if (c.isWord('FOR') && c.isWord('UPDATE', 1)) { c.next(); c.next(); set('pctfree', { pctfree, forUpdate: readInteger(c) }); }
79
+ else set('pctfree', pctfree);
80
+ } else if (c.word('GBPCACHE')) set('gbpcache', only(c, ['CHANGED', 'ALL', 'SYSTEM', 'NONE']));
81
+ else if (c.word('COMPRESS')) set('compress', readCompress(c));
82
+ else if (c.word('TRACKMOD')) set('trackmod', yes(c));
83
+ else if (c.word('DSSIZE')) set('dssize', readDssize(c));
84
+ else return false;
85
+ return true;
86
+ }
87
+
88
+ function readPartitions(c) {
89
+ return c.items().map((item) => {
90
+ const s = cursor(item);
91
+ s.expectWord(['PARTITION', 'PART']);
92
+ const part = { number: readInteger(s) };
93
+ const set = setter(s, part);
94
+ while (!s.done()) if (!readSpaceClause(s, set)) s.fail('a partition clause');
95
+ return part;
96
+ });
97
+ }
98
+
99
+ function readTablespace(c, flavour) {
100
+ c.expectWord('TABLESPACE');
101
+ const node = { kind: 'CREATE TABLESPACE', lob: flavour === 'LOB', large: flavour === 'LARGE', name: name(c), options: {} };
102
+ const set = setter(c, node.options);
103
+ while (!c.done()) {
104
+ if (readSpaceClause(c, set)) continue;
105
+ if (c.word('IN')) set('in', name(c));
106
+ else if (c.word('BUFFERPOOL')) set('bufferpool', name(c));
107
+ else if (c.word('MAXPARTITIONS')) set('maxpartitions', readInteger(c));
108
+ else if (c.word('NUMPARTS')) {
109
+ set('numparts', readInteger(c));
110
+ if (c.isOp('(')) set('partitions', readPartitions(c));
111
+ } else if (c.word('PAGENUM')) set('pagenum', only(c, ['RELATIVE', 'ABSOLUTE']));
112
+ else if (c.word('SEGSIZE')) set('segsize', readInteger(c));
113
+ else if (c.word('CCSID')) set('ccsid', only(c, CCSIDS));
114
+ else if (c.word('CLOSE')) set('close', yes(c));
115
+ else if (c.word('DEFINE')) set('define', yes(c));
116
+ else if (c.isWord('INSERT') && c.isWord('ALGORITHM', 1)) { c.next(); c.next(); set('insertAlgorithm', readInteger(c)); }
117
+ else if (c.word('LOCKMAX')) set('lockmax', c.word('SYSTEM') ? 'SYSTEM' : readInteger(c));
118
+ else if (c.word('LOCKSIZE')) {
119
+ const size = only(c, ['ANY', 'TABLESPACE', 'TABLE', 'PAGE', 'ROW', 'LOB']);
120
+ set('locksize', size === 'TABLE' ? 'TABLESPACE' : size);
121
+ } else if (c.word('LOCKPART')) set('lockpart', yes(c));
122
+ else if (c.isWord('NOT') && c.isWord('LOGGED', 1)) { c.next(); c.next(); set('logged', false); }
123
+ else if (c.word('LOGGED')) set('logged', true);
124
+ else if (c.word('LOG')) set('logged', yes(c));
125
+ else if (c.word('MAXROWS')) set('maxrows', readInteger(c));
126
+ else if (c.isWord('MEMBER') && c.isWord('CLUSTER', 1)) { c.next(); c.next(); set('memberCluster', true); }
127
+ else if (c.isWord('FOR') && c.isWord(['SORT', 'DGTT'], 1)) { c.next(); set('for', c.next().u); }
128
+ else c.fail('a table space clause');
129
+ }
130
+ return node;
131
+ }
132
+
133
+ export const parsers = {
134
+ 'CREATE DATABASE': (c) => (c.expectWord('CREATE'), readDatabase(c)),
135
+ 'CREATE STOGROUP': (c) => (c.expectWord('CREATE'), readStogroup(c)),
136
+ 'CREATE TABLESPACE': (c) => {
137
+ c.expectWord('CREATE');
138
+ const flavour = c.word(['LOB', 'LARGE']);
139
+ return readTablespace(c, flavour ? flavour.u : null);
140
+ },
141
+ // Db2 for z/OS sizes buffer pools with the -ALTER BUFFERPOOL command; CREATE BUFFERPOOL is Db2 LUW.
142
+ 'CREATE BUFFERPOOL': (c) => {
143
+ c.expectWord('CREATE');
144
+ c.fail('a Db2 for z/OS statement (z/OS has no CREATE BUFFERPOOL)');
145
+ },
146
+ };