@plugjs/plug 0.0.1

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 (264) hide show
  1. package/LICENSE.md +211 -0
  2. package/NOTICE.md +13 -0
  3. package/README.md +7 -0
  4. package/dist/assert.cjs +72 -0
  5. package/dist/assert.cjs.map +6 -0
  6. package/dist/assert.mjs +41 -0
  7. package/dist/assert.mjs.map +6 -0
  8. package/dist/async.cjs +58 -0
  9. package/dist/async.cjs.map +6 -0
  10. package/dist/async.mjs +30 -0
  11. package/dist/async.mjs.map +6 -0
  12. package/dist/build.cjs +136 -0
  13. package/dist/build.cjs.map +6 -0
  14. package/dist/build.mjs +110 -0
  15. package/dist/build.mjs.map +6 -0
  16. package/dist/files.cjs +113 -0
  17. package/dist/files.cjs.map +6 -0
  18. package/dist/files.mjs +88 -0
  19. package/dist/files.mjs.map +6 -0
  20. package/dist/fork.cjs +177 -0
  21. package/dist/fork.cjs.map +6 -0
  22. package/dist/fork.mjs +151 -0
  23. package/dist/fork.mjs.map +6 -0
  24. package/dist/helpers.cjs +129 -0
  25. package/dist/helpers.cjs.map +6 -0
  26. package/dist/helpers.mjs +97 -0
  27. package/dist/helpers.mjs.map +6 -0
  28. package/dist/index.cjs +25 -0
  29. package/dist/index.cjs.map +6 -0
  30. package/dist/index.mjs +7 -0
  31. package/dist/index.mjs.map +6 -0
  32. package/dist/log/colors.cjs +129 -0
  33. package/dist/log/colors.cjs.map +6 -0
  34. package/dist/log/colors.mjs +93 -0
  35. package/dist/log/colors.mjs.map +6 -0
  36. package/dist/log/emit.cjs +109 -0
  37. package/dist/log/emit.cjs.map +6 -0
  38. package/dist/log/emit.mjs +83 -0
  39. package/dist/log/emit.mjs.map +6 -0
  40. package/dist/log/levels.cjs +75 -0
  41. package/dist/log/levels.cjs.map +6 -0
  42. package/dist/log/levels.mjs +41 -0
  43. package/dist/log/levels.mjs.map +6 -0
  44. package/dist/log/logger.cjs +129 -0
  45. package/dist/log/logger.cjs.map +6 -0
  46. package/dist/log/logger.mjs +104 -0
  47. package/dist/log/logger.mjs.map +6 -0
  48. package/dist/log/options.cjs +149 -0
  49. package/dist/log/options.cjs.map +6 -0
  50. package/dist/log/options.mjs +124 -0
  51. package/dist/log/options.mjs.map +6 -0
  52. package/dist/log/report.cjs +284 -0
  53. package/dist/log/report.cjs.map +6 -0
  54. package/dist/log/report.mjs +259 -0
  55. package/dist/log/report.mjs.map +6 -0
  56. package/dist/log/spinner.cjs +83 -0
  57. package/dist/log/spinner.cjs.map +6 -0
  58. package/dist/log/spinner.mjs +57 -0
  59. package/dist/log/spinner.mjs.map +6 -0
  60. package/dist/log.cjs +71 -0
  61. package/dist/log.cjs.map +6 -0
  62. package/dist/log.mjs +45 -0
  63. package/dist/log.mjs.map +6 -0
  64. package/dist/paths.cjs +158 -0
  65. package/dist/paths.cjs.map +6 -0
  66. package/dist/paths.mjs +122 -0
  67. package/dist/paths.mjs.map +6 -0
  68. package/dist/pipe.cjs +71 -0
  69. package/dist/pipe.cjs.map +6 -0
  70. package/dist/pipe.mjs +44 -0
  71. package/dist/pipe.mjs.map +6 -0
  72. package/dist/plugs/copy.cjs +95 -0
  73. package/dist/plugs/copy.cjs.map +6 -0
  74. package/dist/plugs/copy.mjs +64 -0
  75. package/dist/plugs/copy.mjs.map +6 -0
  76. package/dist/plugs/coverage/analysis.cjs +229 -0
  77. package/dist/plugs/coverage/analysis.cjs.map +6 -0
  78. package/dist/plugs/coverage/analysis.mjs +202 -0
  79. package/dist/plugs/coverage/analysis.mjs.map +6 -0
  80. package/dist/plugs/coverage/report.cjs +215 -0
  81. package/dist/plugs/coverage/report.cjs.map +6 -0
  82. package/dist/plugs/coverage/report.mjs +200 -0
  83. package/dist/plugs/coverage/report.mjs.map +6 -0
  84. package/dist/plugs/coverage.cjs +142 -0
  85. package/dist/plugs/coverage.cjs.map +6 -0
  86. package/dist/plugs/coverage.mjs +117 -0
  87. package/dist/plugs/coverage.mjs.map +6 -0
  88. package/dist/plugs/debug.cjs +50 -0
  89. package/dist/plugs/debug.cjs.map +6 -0
  90. package/dist/plugs/debug.mjs +25 -0
  91. package/dist/plugs/debug.mjs.map +6 -0
  92. package/dist/plugs/esbuild/bundle-locals.cjs +51 -0
  93. package/dist/plugs/esbuild/bundle-locals.cjs.map +6 -0
  94. package/dist/plugs/esbuild/bundle-locals.mjs +26 -0
  95. package/dist/plugs/esbuild/bundle-locals.mjs.map +6 -0
  96. package/dist/plugs/esbuild/check-dependencies.cjs +140 -0
  97. package/dist/plugs/esbuild/check-dependencies.cjs.map +6 -0
  98. package/dist/plugs/esbuild/check-dependencies.mjs +115 -0
  99. package/dist/plugs/esbuild/check-dependencies.mjs.map +6 -0
  100. package/dist/plugs/esbuild/fix-extensions.cjs +91 -0
  101. package/dist/plugs/esbuild/fix-extensions.cjs.map +6 -0
  102. package/dist/plugs/esbuild/fix-extensions.mjs +60 -0
  103. package/dist/plugs/esbuild/fix-extensions.mjs.map +6 -0
  104. package/dist/plugs/esbuild.cjs +109 -0
  105. package/dist/plugs/esbuild.cjs.map +6 -0
  106. package/dist/plugs/esbuild.mjs +83 -0
  107. package/dist/plugs/esbuild.mjs.map +6 -0
  108. package/dist/plugs/eslint/runner.cjs +91 -0
  109. package/dist/plugs/eslint/runner.cjs.map +6 -0
  110. package/dist/plugs/eslint/runner.mjs +68 -0
  111. package/dist/plugs/eslint/runner.mjs.map +6 -0
  112. package/dist/plugs/exec.cjs +128 -0
  113. package/dist/plugs/exec.cjs.map +6 -0
  114. package/dist/plugs/exec.mjs +96 -0
  115. package/dist/plugs/exec.mjs.map +6 -0
  116. package/dist/plugs/filter.cjs +59 -0
  117. package/dist/plugs/filter.cjs.map +6 -0
  118. package/dist/plugs/filter.mjs +34 -0
  119. package/dist/plugs/filter.mjs.map +6 -0
  120. package/dist/plugs/mocha/reporter.cjs +140 -0
  121. package/dist/plugs/mocha/reporter.cjs.map +6 -0
  122. package/dist/plugs/mocha/reporter.mjs +107 -0
  123. package/dist/plugs/mocha/reporter.mjs.map +6 -0
  124. package/dist/plugs/mocha/runner.cjs +73 -0
  125. package/dist/plugs/mocha/runner.cjs.map +6 -0
  126. package/dist/plugs/mocha/runner.mjs +44 -0
  127. package/dist/plugs/mocha/runner.mjs.map +6 -0
  128. package/dist/plugs/tsc/compiler.cjs +74 -0
  129. package/dist/plugs/tsc/compiler.cjs.map +6 -0
  130. package/dist/plugs/tsc/compiler.mjs +43 -0
  131. package/dist/plugs/tsc/compiler.mjs.map +6 -0
  132. package/dist/plugs/tsc/options.cjs +82 -0
  133. package/dist/plugs/tsc/options.cjs.map +6 -0
  134. package/dist/plugs/tsc/options.mjs +51 -0
  135. package/dist/plugs/tsc/options.mjs.map +6 -0
  136. package/dist/plugs/tsc/report.cjs +90 -0
  137. package/dist/plugs/tsc/report.cjs.map +6 -0
  138. package/dist/plugs/tsc/report.mjs +59 -0
  139. package/dist/plugs/tsc/report.mjs.map +6 -0
  140. package/dist/plugs/tsc/runner.cjs +101 -0
  141. package/dist/plugs/tsc/runner.cjs.map +6 -0
  142. package/dist/plugs/tsc/runner.mjs +72 -0
  143. package/dist/plugs/tsc/runner.mjs.map +6 -0
  144. package/dist/plugs.cjs +31 -0
  145. package/dist/plugs.cjs.map +6 -0
  146. package/dist/plugs.mjs +13 -0
  147. package/dist/plugs.mjs.map +6 -0
  148. package/dist/run.cjs +95 -0
  149. package/dist/run.cjs.map +6 -0
  150. package/dist/run.mjs +70 -0
  151. package/dist/run.mjs.map +6 -0
  152. package/dist/task.cjs +39 -0
  153. package/dist/task.cjs.map +6 -0
  154. package/dist/task.mjs +14 -0
  155. package/dist/task.mjs.map +6 -0
  156. package/dist/utils/asyncfs.cjs +143 -0
  157. package/dist/utils/asyncfs.cjs.map +6 -0
  158. package/dist/utils/asyncfs.mjs +83 -0
  159. package/dist/utils/asyncfs.mjs.map +6 -0
  160. package/dist/utils/caller.cjs +59 -0
  161. package/dist/utils/caller.cjs.map +6 -0
  162. package/dist/utils/caller.mjs +34 -0
  163. package/dist/utils/caller.mjs.map +6 -0
  164. package/dist/utils/match.cjs +69 -0
  165. package/dist/utils/match.cjs.map +6 -0
  166. package/dist/utils/match.mjs +38 -0
  167. package/dist/utils/match.mjs.map +6 -0
  168. package/dist/utils/options.cjs +41 -0
  169. package/dist/utils/options.cjs.map +6 -0
  170. package/dist/utils/options.mjs +16 -0
  171. package/dist/utils/options.mjs.map +6 -0
  172. package/dist/utils/walk.cjs +104 -0
  173. package/dist/utils/walk.cjs.map +6 -0
  174. package/dist/utils/walk.mjs +79 -0
  175. package/dist/utils/walk.mjs.map +6 -0
  176. package/extra/cli.mjs +212 -0
  177. package/extra/ts-loader.mjs +214 -0
  178. package/extra/webassembly.d.ts +11 -0
  179. package/package.json +57 -0
  180. package/src/assert.ts +47 -0
  181. package/src/async.ts +50 -0
  182. package/src/files.ts +129 -0
  183. package/src/fork.ts +263 -0
  184. package/src/helpers.ts +145 -0
  185. package/src/index.ts +20 -0
  186. package/src/log/colors.ts +119 -0
  187. package/src/log/emit.ts +125 -0
  188. package/src/log/levels.ts +65 -0
  189. package/src/log/logger.ts +171 -0
  190. package/src/log/options.ts +199 -0
  191. package/src/log/report.ts +433 -0
  192. package/src/log/spinner.ts +70 -0
  193. package/src/log.ts +68 -0
  194. package/src/paths.ts +213 -0
  195. package/src/pipe.ts +231 -0
  196. package/src/plugs/copy.ts +113 -0
  197. package/src/plugs/coverage/analysis.ts +395 -0
  198. package/src/plugs/coverage/report.ts +337 -0
  199. package/src/plugs/coverage.ts +194 -0
  200. package/src/plugs/debug.ts +35 -0
  201. package/src/plugs/esbuild/bundle-locals.ts +33 -0
  202. package/src/plugs/esbuild/check-dependencies.ts +158 -0
  203. package/src/plugs/esbuild/fix-extensions.ts +108 -0
  204. package/src/plugs/esbuild.ts +128 -0
  205. package/src/plugs/eslint/runner.ts +112 -0
  206. package/src/plugs/exec.ts +215 -0
  207. package/src/plugs/filter.ts +56 -0
  208. package/src/plugs/mocha/reporter.ts +152 -0
  209. package/src/plugs/mocha/runner.ts +77 -0
  210. package/src/plugs/tsc/compiler.ts +66 -0
  211. package/src/plugs/tsc/options.ts +97 -0
  212. package/src/plugs/tsc/report.ts +74 -0
  213. package/src/plugs/tsc/runner.ts +100 -0
  214. package/src/plugs.ts +33 -0
  215. package/src/run.ts +160 -0
  216. package/src/task.ts +26 -0
  217. package/src/utils/asyncfs.ts +82 -0
  218. package/src/utils/caller.ts +45 -0
  219. package/src/utils/match.ts +286 -0
  220. package/src/utils/options.ts +22 -0
  221. package/src/utils/walk.ts +136 -0
  222. package/types/assert.d.ts +18 -0
  223. package/types/async.d.ts +20 -0
  224. package/types/build.d.ts +56 -0
  225. package/types/files.d.ts +44 -0
  226. package/types/fork.d.ts +57 -0
  227. package/types/helpers.d.ts +49 -0
  228. package/types/index.d.ts +14 -0
  229. package/types/log/colors.d.ts +25 -0
  230. package/types/log/emit.d.ts +14 -0
  231. package/types/log/levels.d.ts +52 -0
  232. package/types/log/logger.d.ts +31 -0
  233. package/types/log/options.d.ts +40 -0
  234. package/types/log/report.d.ts +64 -0
  235. package/types/log/spinner.d.ts +2 -0
  236. package/types/log.d.ts +10 -0
  237. package/types/paths.d.ts +76 -0
  238. package/types/pipe.d.ts +152 -0
  239. package/types/plugs/copy.d.ts +27 -0
  240. package/types/plugs/coverage/analysis.d.ts +104 -0
  241. package/types/plugs/coverage/report.d.ts +53 -0
  242. package/types/plugs/coverage.d.ts +46 -0
  243. package/types/plugs/debug.d.ts +14 -0
  244. package/types/plugs/esbuild/bundle-locals.d.ts +6 -0
  245. package/types/plugs/esbuild/check-dependencies.d.ts +12 -0
  246. package/types/plugs/esbuild/fix-extensions.d.ts +29 -0
  247. package/types/plugs/esbuild.d.ts +24 -0
  248. package/types/plugs/eslint/runner.d.ts +22 -0
  249. package/types/plugs/exec.d.ts +90 -0
  250. package/types/plugs/filter.d.ts +23 -0
  251. package/types/plugs/mocha/reporter.d.ts +8 -0
  252. package/types/plugs/mocha/runner.d.ts +34 -0
  253. package/types/plugs/tsc/compiler.d.ts +24 -0
  254. package/types/plugs/tsc/options.d.ts +8 -0
  255. package/types/plugs/tsc/report.d.ts +5 -0
  256. package/types/plugs/tsc/runner.d.ts +13 -0
  257. package/types/plugs.d.ts +16 -0
  258. package/types/run.d.ts +89 -0
  259. package/types/task.d.ts +15 -0
  260. package/types/utils/asyncfs.d.ts +37 -0
  261. package/types/utils/caller.d.ts +7 -0
  262. package/types/utils/match.d.ts +216 -0
  263. package/types/utils/options.d.ts +15 -0
  264. package/types/utils/walk.d.ts +28 -0
@@ -0,0 +1,202 @@
1
+ // plugs/coverage/analysis.ts
2
+ import { fileURLToPath, pathToFileURL } from "node:url";
3
+ import { SourceMapConsumer } from "source-map";
4
+ import { assert } from "../../assert.mjs";
5
+ import { $gry, $p } from "../../log.mjs";
6
+ import { readFile } from "../../utils/asyncfs.mjs";
7
+ var CoverageAnalyserImpl = class {
8
+ constructor(_log) {
9
+ this._log = _log;
10
+ }
11
+ };
12
+ var CoverageResultAnalyser = class extends CoverageAnalyserImpl {
13
+ constructor(log, _result) {
14
+ super(log);
15
+ this._result = _result;
16
+ const _coverage = [];
17
+ for (const coveredFunction of _result.functions) {
18
+ for (const range of coveredFunction.ranges) {
19
+ for (let i = range.startOffset; i < range.endOffset; i++) {
20
+ _coverage[i] = range.count;
21
+ }
22
+ }
23
+ }
24
+ this._coverage = _coverage;
25
+ }
26
+ _coverage;
27
+ _lineLengths;
28
+ async init() {
29
+ const filename = fileURLToPath(this._result.url);
30
+ const source = await readFile(filename, "utf-8");
31
+ this._lineLengths = source.split("\n").map((line) => line.length);
32
+ return this;
33
+ }
34
+ destroy() {
35
+ }
36
+ coverage(source, line, column) {
37
+ assert(this._lineLengths, "Analyser not initialized");
38
+ assert(source === this._result.url, `Wrong source ${source} (should be ${this._result.url})`);
39
+ const { _lineLengths, _coverage } = this;
40
+ let offset = 0;
41
+ for (let l = line - 2; l >= 0; l--)
42
+ offset += _lineLengths[l] + 1;
43
+ return _coverage[offset + column] || 0;
44
+ }
45
+ };
46
+ var CoverageSitemapAnalyser = class extends CoverageResultAnalyser {
47
+ constructor(log, result, _sourceMapCache, _sourceMapBias) {
48
+ super(log, result);
49
+ this._sourceMapCache = _sourceMapCache;
50
+ this._sourceMapBias = _sourceMapBias;
51
+ this._lineLengths = _sourceMapCache.lineLengths;
52
+ }
53
+ _preciseMappings = /* @__PURE__ */ new Map();
54
+ _sourceMap;
55
+ _key(source, line, column) {
56
+ return `${line}:${column}:${source}`;
57
+ }
58
+ async init() {
59
+ const sourceMap = this._sourceMapCache.data;
60
+ assert(sourceMap, "Missing source map data from cache");
61
+ this._sourceMap = await new SourceMapConsumer(sourceMap);
62
+ if (this._sourceMapBias === "none") {
63
+ this._sourceMap.eachMapping((m) => {
64
+ const location = { line: m.generatedLine, column: m.generatedColumn };
65
+ const key = this._key(m.source, m.originalLine, m.originalColumn);
66
+ this._preciseMappings.set(key, location);
67
+ });
68
+ }
69
+ return this;
70
+ }
71
+ destroy() {
72
+ this._sourceMap?.destroy();
73
+ }
74
+ coverage(source, line, column) {
75
+ assert(this._sourceMap, "Analyser not initialized");
76
+ if (this._sourceMapBias === "none") {
77
+ const key = this._key(source, line, column);
78
+ const location = this._preciseMappings.get(key);
79
+ if (!location) {
80
+ this._log.debug(`No precise mapping for ${source}:${line}:${column}`);
81
+ return 0;
82
+ } else {
83
+ return super.coverage(this._result.url, location.line, location.column);
84
+ }
85
+ }
86
+ const bias = this._sourceMapBias === "greatest_lower_bound" ? SourceMapConsumer.GREATEST_LOWER_BOUND : this._sourceMapBias === "least_upper_bound" ? SourceMapConsumer.LEAST_UPPER_BOUND : void 0;
87
+ const generated = this._sourceMap.generatedPositionFor({ source, line, column, bias });
88
+ if (!generated) {
89
+ this._log.debug(`No position generated for ${source}:${line}:${column}`);
90
+ return 0;
91
+ }
92
+ if (generated.line == null) {
93
+ this._log.debug(`No line generated for ${source}:${line}:${column}`);
94
+ return 0;
95
+ }
96
+ if (generated.column == null) {
97
+ this._log.debug(`No column generated for ${source}:${line}:${column}`);
98
+ return 0;
99
+ }
100
+ return super.coverage(this._result.url, generated.line, generated.column);
101
+ }
102
+ };
103
+ function combineCoverage(analysers, source, line, column) {
104
+ let coverage = 0;
105
+ if (!analysers)
106
+ return coverage;
107
+ for (const analyser of analysers) {
108
+ coverage += analyser.coverage(source, line, column);
109
+ }
110
+ return coverage;
111
+ }
112
+ var SourcesCoverageAnalyser = class extends CoverageAnalyserImpl {
113
+ constructor(log, _filename) {
114
+ super(log);
115
+ this._filename = _filename;
116
+ }
117
+ _mappings = /* @__PURE__ */ new Map();
118
+ hasMappings() {
119
+ return this._mappings.size > 0;
120
+ }
121
+ add(source, analyser) {
122
+ const analysers = this._mappings.get(source) || /* @__PURE__ */ new Set();
123
+ analysers.add(analyser);
124
+ this._mappings.set(source, analysers);
125
+ }
126
+ async init() {
127
+ this._log.debug("SourcesCoverageAnalyser", $p(this._filename), $gry(`(${this._mappings.size} mappings)`));
128
+ for (const analysers of this._mappings.values()) {
129
+ for (const analyser of analysers) {
130
+ await analyser.init();
131
+ }
132
+ }
133
+ return this;
134
+ }
135
+ destroy() {
136
+ for (const analysers of this._mappings.values()) {
137
+ for (const analyser of analysers) {
138
+ analyser.destroy();
139
+ }
140
+ }
141
+ }
142
+ coverage(source, line, column) {
143
+ const analysers = this._mappings.get(source);
144
+ return combineCoverage(analysers, source, line, column);
145
+ }
146
+ };
147
+ var CombiningCoverageAnalyser = class extends CoverageAnalyserImpl {
148
+ _analysers = /* @__PURE__ */ new Set();
149
+ add(analyser) {
150
+ this._analysers.add(analyser);
151
+ }
152
+ async init() {
153
+ this._log.debug("CombiningCoverageAnalyser", $gry(`(${this._analysers.size} analysers)`));
154
+ this._log.enter();
155
+ try {
156
+ for (const analyser of this._analysers)
157
+ await analyser.init();
158
+ return this;
159
+ } finally {
160
+ this._log.leave();
161
+ }
162
+ }
163
+ destroy() {
164
+ for (const analyser of this._analysers)
165
+ analyser.destroy();
166
+ }
167
+ coverage(source, line, column) {
168
+ return combineCoverage(this._analysers, source, line, column);
169
+ }
170
+ };
171
+ async function createAnalyser(sourceFiles, coverageFiles, sourceMapBias, log) {
172
+ const urls = sourceFiles.map((path) => pathToFileURL(path).toString());
173
+ const analyser = new CombiningCoverageAnalyser(log);
174
+ for await (const coverageFile of coverageFiles) {
175
+ const coverageFileAnalyser = new SourcesCoverageAnalyser(log, coverageFile);
176
+ log.info("Parsing coverage file", $p(coverageFile));
177
+ const contents = await readFile(coverageFile, "utf-8");
178
+ const coverage = JSON.parse(contents);
179
+ for (const result of coverage.result) {
180
+ const mapping = coverage["source-map-cache"]?.[result.url];
181
+ if (mapping) {
182
+ const matches = urls.filter((url) => mapping.data?.sources.includes(url));
183
+ if (matches.length) {
184
+ const sourceAnalyser = new CoverageSitemapAnalyser(log, result, mapping, sourceMapBias);
185
+ for (const match of matches)
186
+ coverageFileAnalyser.add(match, sourceAnalyser);
187
+ }
188
+ } else if (urls.includes(result.url)) {
189
+ coverageFileAnalyser.add(result.url, new CoverageResultAnalyser(log, result));
190
+ }
191
+ }
192
+ if (coverageFileAnalyser.hasMappings())
193
+ analyser.add(coverageFileAnalyser);
194
+ }
195
+ return await analyser.init();
196
+ }
197
+ export {
198
+ CombiningCoverageAnalyser,
199
+ SourcesCoverageAnalyser,
200
+ createAnalyser
201
+ };
202
+ //# sourceMappingURL=analysis.mjs.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/plugs/coverage/analysis.ts"],
4
+ "mappings": "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",
5
+ "names": []
6
+ }
@@ -0,0 +1,215 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // plugs/coverage/report.ts
21
+ var report_exports = {};
22
+ __export(report_exports, {
23
+ COVERAGE_IGNORED: () => COVERAGE_IGNORED,
24
+ COVERAGE_SKIPPED: () => COVERAGE_SKIPPED,
25
+ coverageReport: () => coverageReport
26
+ });
27
+ module.exports = __toCommonJS(report_exports);
28
+ var import_parser = require("@babel/parser");
29
+ var import_types = require("@babel/types");
30
+ var import_node_url = require("node:url");
31
+ var import_log = require("../../log.cjs");
32
+ var import_asyncfs = require("../../utils/asyncfs.cjs");
33
+ var COVERAGE_SKIPPED = -2;
34
+ var COVERAGE_IGNORED = -1;
35
+ var ignoreRegexp = /(coverage|istanbul)\s+ignore\s+(test|if|else|try|catch|finally|next)(\s|$)/g;
36
+ async function coverageReport(analyser, sourceFiles, log) {
37
+ const results = {};
38
+ const nodes = {
39
+ coveredNodes: 0,
40
+ missingNodes: 0,
41
+ ignoredNodes: 0,
42
+ totalNodes: 0,
43
+ coverage: 0
44
+ };
45
+ for (const file of sourceFiles) {
46
+ const url = (0, import_node_url.pathToFileURL)(file).toString();
47
+ const code = await (0, import_asyncfs.readFile)(file, "utf-8");
48
+ const tree = (0, import_parser.parse)(code, {
49
+ allowImportExportEverywhere: true,
50
+ allowAwaitOutsideFunction: true,
51
+ allowReturnOutsideFunction: true,
52
+ allowSuperOutsideMethod: true,
53
+ allowUndeclaredExports: true,
54
+ attachComment: true,
55
+ errorRecovery: false,
56
+ sourceType: "unambiguous",
57
+ sourceFilename: file,
58
+ startLine: 1,
59
+ startColumn: 0,
60
+ plugins: ["typescript"],
61
+ strictMode: false,
62
+ ranges: false,
63
+ tokens: false,
64
+ createParenthesizedExpressions: true
65
+ });
66
+ const codeCoverage = new Array(code.length).fill(0);
67
+ const nodeCoverage = {
68
+ coveredNodes: 0,
69
+ missingNodes: 0,
70
+ ignoredNodes: 0,
71
+ totalNodes: 0,
72
+ coverage: 0
73
+ };
74
+ const setCodeCoverage = (node, coverage, recursive) => {
75
+ if (!node)
76
+ return;
77
+ if (Array.isArray(node)) {
78
+ for (const n of node)
79
+ setCodeCoverage(n, coverage, recursive);
80
+ return;
81
+ }
82
+ if (node.start != null && node.end != null) {
83
+ for (let i = node.start; i < node.end; i++) {
84
+ codeCoverage[i] = coverage;
85
+ }
86
+ }
87
+ if (coverage == COVERAGE_IGNORED) {
88
+ nodeCoverage.ignoredNodes++;
89
+ } else if (coverage === 0) {
90
+ nodeCoverage.missingNodes++;
91
+ } else if (coverage > 0) {
92
+ nodeCoverage.coveredNodes++;
93
+ }
94
+ if (!recursive)
95
+ return;
96
+ const keys = import_types.VISITOR_KEYS[node.type] || [];
97
+ for (const key of keys) {
98
+ const value = node[key];
99
+ if (Array.isArray(value)) {
100
+ for (const child of value) {
101
+ setCodeCoverage(child, coverage, true);
102
+ }
103
+ } else if (value) {
104
+ setCodeCoverage(value, coverage, true);
105
+ }
106
+ }
107
+ };
108
+ const visitChildren = (node, depth) => {
109
+ const keys = import_types.VISITOR_KEYS[node.type] || [];
110
+ for (const key of keys) {
111
+ const children = node[key];
112
+ if (Array.isArray(children)) {
113
+ for (const child of children) {
114
+ if (child)
115
+ visitNode(child, depth + 1);
116
+ }
117
+ } else if (children) {
118
+ visitNode(children, depth + 1);
119
+ }
120
+ }
121
+ };
122
+ const maybeIgnoreNode = (condition, node, depth) => {
123
+ if (condition) {
124
+ setCodeCoverage(node, COVERAGE_IGNORED, true);
125
+ } else if (node) {
126
+ visitNode(node, depth);
127
+ }
128
+ };
129
+ const visitNode = (node, depth) => {
130
+ log.trace("-".padStart(depth * 2 + 1, " "), node.type, `${node.loc?.start.line}:${node.loc?.start.column}`);
131
+ if ((0, import_types.isFile)(node))
132
+ return visitChildren(node, depth);
133
+ if ((0, import_types.isProgram)(node))
134
+ return visitChildren(node, depth);
135
+ const ignores = [];
136
+ for (const comment of node.leadingComments || []) {
137
+ for (const match of comment.value.matchAll(ignoreRegexp)) {
138
+ ignores.push(match[2]);
139
+ }
140
+ }
141
+ if (ignores.includes("next"))
142
+ return setCodeCoverage(node, COVERAGE_IGNORED, true);
143
+ if ((0, import_types.isTypeScript)(node)) {
144
+ if ((0, import_types.isTSDeclareMethod)(node))
145
+ return setCodeCoverage(node, COVERAGE_SKIPPED, true);
146
+ if ((0, import_types.isTSTypeReference)(node))
147
+ return setCodeCoverage(node, COVERAGE_SKIPPED, true);
148
+ if ((0, import_types.isDeclaration)(node))
149
+ return setCodeCoverage(node, COVERAGE_SKIPPED, true);
150
+ setCodeCoverage(node, COVERAGE_SKIPPED, false);
151
+ return visitChildren(node, depth);
152
+ }
153
+ if ((0, import_types.isExportDeclaration)(node) && node.exportKind === "type") {
154
+ return setCodeCoverage(node, COVERAGE_SKIPPED, true);
155
+ }
156
+ if ((0, import_types.isImportDeclaration)(node) && node.importKind === "type") {
157
+ return setCodeCoverage(node, COVERAGE_SKIPPED, true);
158
+ }
159
+ let coverage = 0;
160
+ if (node.loc) {
161
+ const { line, column } = node.loc.start;
162
+ const c = analyser.coverage(url, line, column);
163
+ if (c == null)
164
+ log.warn(`No coverage for ${node.type} at ${(0, import_log.$p)(file)}:${line}:${column}`);
165
+ else
166
+ coverage = c;
167
+ }
168
+ setCodeCoverage(node, coverage, false);
169
+ if ((0, import_types.isIfStatement)(node)) {
170
+ maybeIgnoreNode(ignores.includes("test"), node.test, depth + 1);
171
+ maybeIgnoreNode(ignores.includes("if"), node.consequent, depth + 1);
172
+ maybeIgnoreNode(ignores.includes("else"), node.alternate, depth + 1);
173
+ return;
174
+ }
175
+ if ((0, import_types.isTryStatement)(node)) {
176
+ maybeIgnoreNode(ignores.includes("try"), node.block, depth + 1);
177
+ maybeIgnoreNode(ignores.includes("catch"), node.handler, depth + 1);
178
+ maybeIgnoreNode(ignores.includes("finally"), node.finalizer, depth + 1);
179
+ return;
180
+ }
181
+ visitChildren(node, depth);
182
+ };
183
+ codeCoverage.fill(COVERAGE_SKIPPED);
184
+ setCodeCoverage(tree.program.directives, 0, true);
185
+ setCodeCoverage(tree.program.body, 0, true);
186
+ nodeCoverage.coveredNodes = 0;
187
+ nodeCoverage.missingNodes = 0;
188
+ nodeCoverage.ignoredNodes = 0;
189
+ visitChildren(tree.program, -1);
190
+ updateNodeCoverageResult(nodeCoverage);
191
+ nodes.coveredNodes += nodeCoverage.coveredNodes;
192
+ nodes.missingNodes += nodeCoverage.missingNodes;
193
+ nodes.ignoredNodes += nodeCoverage.ignoredNodes;
194
+ nodes.totalNodes += nodeCoverage.totalNodes;
195
+ results[file] = { code, codeCoverage, nodeCoverage };
196
+ }
197
+ updateNodeCoverageResult(nodes);
198
+ return { results, nodes };
199
+ }
200
+ function updateNodeCoverageResult(result) {
201
+ const { coveredNodes, missingNodes, ignoredNodes } = result;
202
+ const totalNodes = result.totalNodes = coveredNodes + missingNodes + ignoredNodes;
203
+ if (totalNodes - ignoredNodes) {
204
+ result.coverage = Math.floor(100 * coveredNodes / (totalNodes - ignoredNodes));
205
+ } else {
206
+ result.coverage = 0;
207
+ }
208
+ }
209
+ // Annotate the CommonJS export names for ESM import in node:
210
+ 0 && (module.exports = {
211
+ COVERAGE_IGNORED,
212
+ COVERAGE_SKIPPED,
213
+ coverageReport
214
+ });
215
+ //# sourceMappingURL=report.cjs.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/plugs/coverage/report.ts"],
4
+ "mappings": "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",
5
+ "names": []
6
+ }
@@ -0,0 +1,200 @@
1
+ // plugs/coverage/report.ts
2
+ import { parse } from "@babel/parser";
3
+ import {
4
+ isDeclaration,
5
+ isExportDeclaration,
6
+ isFile,
7
+ isIfStatement,
8
+ isImportDeclaration,
9
+ isProgram,
10
+ isTryStatement,
11
+ isTSDeclareMethod,
12
+ isTSTypeReference,
13
+ isTypeScript,
14
+ VISITOR_KEYS
15
+ } from "@babel/types";
16
+ import { pathToFileURL } from "node:url";
17
+ import { $p } from "../../log.mjs";
18
+ import { readFile } from "../../utils/asyncfs.mjs";
19
+ var COVERAGE_SKIPPED = -2;
20
+ var COVERAGE_IGNORED = -1;
21
+ var ignoreRegexp = /(coverage|istanbul)\s+ignore\s+(test|if|else|try|catch|finally|next)(\s|$)/g;
22
+ async function coverageReport(analyser, sourceFiles, log) {
23
+ const results = {};
24
+ const nodes = {
25
+ coveredNodes: 0,
26
+ missingNodes: 0,
27
+ ignoredNodes: 0,
28
+ totalNodes: 0,
29
+ coverage: 0
30
+ };
31
+ for (const file of sourceFiles) {
32
+ const url = pathToFileURL(file).toString();
33
+ const code = await readFile(file, "utf-8");
34
+ const tree = parse(code, {
35
+ allowImportExportEverywhere: true,
36
+ allowAwaitOutsideFunction: true,
37
+ allowReturnOutsideFunction: true,
38
+ allowSuperOutsideMethod: true,
39
+ allowUndeclaredExports: true,
40
+ attachComment: true,
41
+ errorRecovery: false,
42
+ sourceType: "unambiguous",
43
+ sourceFilename: file,
44
+ startLine: 1,
45
+ startColumn: 0,
46
+ plugins: ["typescript"],
47
+ strictMode: false,
48
+ ranges: false,
49
+ tokens: false,
50
+ createParenthesizedExpressions: true
51
+ });
52
+ const codeCoverage = new Array(code.length).fill(0);
53
+ const nodeCoverage = {
54
+ coveredNodes: 0,
55
+ missingNodes: 0,
56
+ ignoredNodes: 0,
57
+ totalNodes: 0,
58
+ coverage: 0
59
+ };
60
+ const setCodeCoverage = (node, coverage, recursive) => {
61
+ if (!node)
62
+ return;
63
+ if (Array.isArray(node)) {
64
+ for (const n of node)
65
+ setCodeCoverage(n, coverage, recursive);
66
+ return;
67
+ }
68
+ if (node.start != null && node.end != null) {
69
+ for (let i = node.start; i < node.end; i++) {
70
+ codeCoverage[i] = coverage;
71
+ }
72
+ }
73
+ if (coverage == COVERAGE_IGNORED) {
74
+ nodeCoverage.ignoredNodes++;
75
+ } else if (coverage === 0) {
76
+ nodeCoverage.missingNodes++;
77
+ } else if (coverage > 0) {
78
+ nodeCoverage.coveredNodes++;
79
+ }
80
+ if (!recursive)
81
+ return;
82
+ const keys = VISITOR_KEYS[node.type] || [];
83
+ for (const key of keys) {
84
+ const value = node[key];
85
+ if (Array.isArray(value)) {
86
+ for (const child of value) {
87
+ setCodeCoverage(child, coverage, true);
88
+ }
89
+ } else if (value) {
90
+ setCodeCoverage(value, coverage, true);
91
+ }
92
+ }
93
+ };
94
+ const visitChildren = (node, depth) => {
95
+ const keys = VISITOR_KEYS[node.type] || [];
96
+ for (const key of keys) {
97
+ const children = node[key];
98
+ if (Array.isArray(children)) {
99
+ for (const child of children) {
100
+ if (child)
101
+ visitNode(child, depth + 1);
102
+ }
103
+ } else if (children) {
104
+ visitNode(children, depth + 1);
105
+ }
106
+ }
107
+ };
108
+ const maybeIgnoreNode = (condition, node, depth) => {
109
+ if (condition) {
110
+ setCodeCoverage(node, COVERAGE_IGNORED, true);
111
+ } else if (node) {
112
+ visitNode(node, depth);
113
+ }
114
+ };
115
+ const visitNode = (node, depth) => {
116
+ log.trace("-".padStart(depth * 2 + 1, " "), node.type, `${node.loc?.start.line}:${node.loc?.start.column}`);
117
+ if (isFile(node))
118
+ return visitChildren(node, depth);
119
+ if (isProgram(node))
120
+ return visitChildren(node, depth);
121
+ const ignores = [];
122
+ for (const comment of node.leadingComments || []) {
123
+ for (const match of comment.value.matchAll(ignoreRegexp)) {
124
+ ignores.push(match[2]);
125
+ }
126
+ }
127
+ if (ignores.includes("next"))
128
+ return setCodeCoverage(node, COVERAGE_IGNORED, true);
129
+ if (isTypeScript(node)) {
130
+ if (isTSDeclareMethod(node))
131
+ return setCodeCoverage(node, COVERAGE_SKIPPED, true);
132
+ if (isTSTypeReference(node))
133
+ return setCodeCoverage(node, COVERAGE_SKIPPED, true);
134
+ if (isDeclaration(node))
135
+ return setCodeCoverage(node, COVERAGE_SKIPPED, true);
136
+ setCodeCoverage(node, COVERAGE_SKIPPED, false);
137
+ return visitChildren(node, depth);
138
+ }
139
+ if (isExportDeclaration(node) && node.exportKind === "type") {
140
+ return setCodeCoverage(node, COVERAGE_SKIPPED, true);
141
+ }
142
+ if (isImportDeclaration(node) && node.importKind === "type") {
143
+ return setCodeCoverage(node, COVERAGE_SKIPPED, true);
144
+ }
145
+ let coverage = 0;
146
+ if (node.loc) {
147
+ const { line, column } = node.loc.start;
148
+ const c = analyser.coverage(url, line, column);
149
+ if (c == null)
150
+ log.warn(`No coverage for ${node.type} at ${$p(file)}:${line}:${column}`);
151
+ else
152
+ coverage = c;
153
+ }
154
+ setCodeCoverage(node, coverage, false);
155
+ if (isIfStatement(node)) {
156
+ maybeIgnoreNode(ignores.includes("test"), node.test, depth + 1);
157
+ maybeIgnoreNode(ignores.includes("if"), node.consequent, depth + 1);
158
+ maybeIgnoreNode(ignores.includes("else"), node.alternate, depth + 1);
159
+ return;
160
+ }
161
+ if (isTryStatement(node)) {
162
+ maybeIgnoreNode(ignores.includes("try"), node.block, depth + 1);
163
+ maybeIgnoreNode(ignores.includes("catch"), node.handler, depth + 1);
164
+ maybeIgnoreNode(ignores.includes("finally"), node.finalizer, depth + 1);
165
+ return;
166
+ }
167
+ visitChildren(node, depth);
168
+ };
169
+ codeCoverage.fill(COVERAGE_SKIPPED);
170
+ setCodeCoverage(tree.program.directives, 0, true);
171
+ setCodeCoverage(tree.program.body, 0, true);
172
+ nodeCoverage.coveredNodes = 0;
173
+ nodeCoverage.missingNodes = 0;
174
+ nodeCoverage.ignoredNodes = 0;
175
+ visitChildren(tree.program, -1);
176
+ updateNodeCoverageResult(nodeCoverage);
177
+ nodes.coveredNodes += nodeCoverage.coveredNodes;
178
+ nodes.missingNodes += nodeCoverage.missingNodes;
179
+ nodes.ignoredNodes += nodeCoverage.ignoredNodes;
180
+ nodes.totalNodes += nodeCoverage.totalNodes;
181
+ results[file] = { code, codeCoverage, nodeCoverage };
182
+ }
183
+ updateNodeCoverageResult(nodes);
184
+ return { results, nodes };
185
+ }
186
+ function updateNodeCoverageResult(result) {
187
+ const { coveredNodes, missingNodes, ignoredNodes } = result;
188
+ const totalNodes = result.totalNodes = coveredNodes + missingNodes + ignoredNodes;
189
+ if (totalNodes - ignoredNodes) {
190
+ result.coverage = Math.floor(100 * coveredNodes / (totalNodes - ignoredNodes));
191
+ } else {
192
+ result.coverage = 0;
193
+ }
194
+ }
195
+ export {
196
+ COVERAGE_IGNORED,
197
+ COVERAGE_SKIPPED,
198
+ coverageReport
199
+ };
200
+ //# sourceMappingURL=report.mjs.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/plugs/coverage/report.ts"],
4
+ "mappings": ";AACA,SAAS,aAAa;AACtB;AAAA,EACW;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,OACK;AACP,SAAS,qBAAqB;AAC9B,SAAS,UAAkB;AAE3B,SAAS,gBAAgB;AAWlB,IAAM,mBAAmB;AAMzB,IAAM,mBAAmB;AAiDhC,IAAM,eAAe;AAUrB,eAAsB,eAClB,UACA,aACA,KACuB;AAEzB,QAAM,UAA2B,CAAC;AAClC,QAAM,QAA4B;AAAA,IAChC,cAAc;AAAA,IACd,cAAc;AAAA,IACd,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,UAAU;AAAA,EACZ;AAQA,aAAW,QAAQ,aAAa;AAE9B,UAAM,MAAM,cAAc,IAAI,EAAE,SAAS;AACzC,UAAM,OAAO,MAAM,SAAS,MAAM,OAAO;AAEzC,UAAM,OAAO,MAAM,MAAM;AAAA,MACvB,6BAA6B;AAAA,MAC7B,2BAA2B;AAAA,MAC3B,4BAA4B;AAAA,MAC5B,yBAAyB;AAAA,MACzB,wBAAwB;AAAA,MACxB,eAAe;AAAA,MACf,eAAe;AAAA,MACf,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,WAAW;AAAA,MACX,aAAa;AAAA,MACb,SAAS,CAAE,YAAa;AAAA,MACxB,YAAY;AAAA,MACZ,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,gCAAgC;AAAA,IAClC,CAAC;AAED,UAAM,eAAyB,IAAI,MAAM,KAAK,MAAM,EAAE,KAAK,CAAC;AAC5D,UAAM,eAAmC;AAAA,MACvC,cAAc;AAAA,MACd,cAAc;AAAA,MACd,cAAc;AAAA,MACd,YAAY;AAAA,MACZ,UAAU;AAAA,IACZ;AAGA,UAAM,kBAAkB,CACpB,MACA,UACA,cACO;AACT,UAAI,CAAE;AAAM;AAEZ,UAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,mBAAW,KAAK;AAAM,0BAAgB,GAAG,UAAU,SAAS;AAC5D;AAAA,MACF;AAEA,UAAK,KAAK,SAAS,QAAU,KAAK,OAAO,MAAO;AAC9C,iBAAS,IAAI,KAAK,OAAO,IAAI,KAAK,KAAK,KAAM;AAC3C,uBAAa,KAAK;AAAA,QACpB;AAAA,MACF;AAEA,UAAI,YAAY,kBAAkB;AAChC,qBAAa;AAAA,MACf,WAAW,aAAa,GAAG;AACzB,qBAAa;AAAA,MACf,WAAW,WAAW,GAAG;AACvB,qBAAa;AAAA,MACf;AAEA,UAAI,CAAE;AAAW;AAEjB,YAAM,OAAO,aAAa,KAAK,SAAS,CAAC;AACzC,iBAAW,OAAO,MAAM;AACtB,cAAM,QAA8B,KAAM;AAC1C,YAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,qBAAW,SAAS,OAAO;AACzB,4BAAgB,OAAO,UAAU,IAAI;AAAA,UACvC;AAAA,QACF,WAAW,OAAO;AAChB,0BAAgB,OAAO,UAAU,IAAI;AAAA,QACvC;AAAA,MACF;AAAA,IACF;AAGA,UAAM,gBAAgB,CAAC,MAAY,UAAwB;AACzD,YAAM,OAAO,aAAa,KAAK,SAAS,CAAC;AACzC,iBAAW,OAAO,MAAM;AACtB,cAAM,WAAiD,KAAM;AAC7D,YAAI,MAAM,QAAQ,QAAQ,GAAG;AAC3B,qBAAW,SAAS,UAAU;AAC5B,gBAAI;AAAO,wBAAU,OAAO,QAAQ,CAAC;AAAA,UACvC;AAAA,QACF,WAAW,UAAU;AACnB,oBAAU,UAAU,QAAQ,CAAC;AAAA,QAC/B;AAAA,MACF;AAAA,IACF;AAGA,UAAM,kBAAkB,CACpB,WACA,MACA,UACO;AACT,UAAI,WAAW;AACb,wBAAgB,MAAM,kBAAkB,IAAI;AAAA,MAC9C,WAAW,MAAM;AACf,kBAAU,MAAM,KAAK;AAAA,MACvB;AAAA,IACF;AAGA,UAAM,YAAY,CAAC,MAAY,UAAwB;AAErD,UAAI,MAAM,IAAI,SAAU,QAAQ,IAAK,GAAG,GAAG,GAAG,KAAK,MAAM,GAAG,KAAK,KAAK,MAAM,QAAQ,KAAK,KAAK,MAAM,QAAQ;AAG5G,UAAI,OAAO,IAAI;AAAG,eAAO,cAAc,MAAM,KAAK;AAClD,UAAI,UAAU,IAAI;AAAG,eAAO,cAAc,MAAM,KAAK;AAGrD,YAAM,UAA4B,CAAC;AACnC,iBAAW,WAAW,KAAK,mBAAmB,CAAC,GAAG;AAChD,mBAAW,SAAS,QAAQ,MAAM,SAAS,YAAY,GAAG;AACxD,kBAAQ,KAAK,MAAM,EAAoB;AAAA,QACzC;AAAA,MACF;AAGA,UAAI,QAAQ,SAAS,MAAM;AAAG,eAAO,gBAAgB,MAAM,kBAAkB,IAAI;AAGjF,UAAI,aAAa,IAAI,GAAG;AACtB,YAAI,kBAAkB,IAAI;AAAG,iBAAO,gBAAgB,MAAM,kBAAkB,IAAI;AAChF,YAAI,kBAAkB,IAAI;AAAG,iBAAO,gBAAgB,MAAM,kBAAkB,IAAI;AAChF,YAAI,cAAc,IAAI;AAAG,iBAAO,gBAAgB,MAAM,kBAAkB,IAAI;AAG5E,wBAAgB,MAAM,kBAAkB,KAAK;AAC7C,eAAO,cAAc,MAAM,KAAK;AAAA,MAClC;AAGA,UAAI,oBAAoB,IAAI,KAAM,KAAK,eAAe,QAAS;AAC7D,eAAO,gBAAgB,MAAM,kBAAkB,IAAI;AAAA,MACrD;AAEA,UAAI,oBAAoB,IAAI,KAAM,KAAK,eAAe,QAAS;AAC7D,eAAO,gBAAgB,MAAM,kBAAkB,IAAI;AAAA,MACrD;AAGA,UAAI,WAAW;AACf,UAAI,KAAK,KAAK;AACZ,cAAM,EAAE,MAAM,OAAO,IAAI,KAAK,IAAI;AAClC,cAAM,IAAI,SAAS,SAAS,KAAK,MAAM,MAAM;AAC7C,YAAI,KAAK;AAAM,cAAI,KAAK,mBAAmB,KAAK,WAAW,GAAG,IAAI,KAAK,QAAQ,QAAQ;AAAA;AAClF,qBAAW;AAAA,MAClB;AAGA,sBAAgB,MAAM,UAAU,KAAK;AAGrC,UAAI,cAAc,IAAI,GAAG;AACvB,wBAAgB,QAAQ,SAAS,MAAM,GAAG,KAAK,MAAM,QAAQ,CAAC;AAC9D,wBAAgB,QAAQ,SAAS,IAAI,GAAG,KAAK,YAAY,QAAQ,CAAC;AAClE,wBAAgB,QAAQ,SAAS,MAAM,GAAG,KAAK,WAAW,QAAQ,CAAC;AACnE;AAAA,MACF;AAGA,UAAI,eAAe,IAAI,GAAG;AACxB,wBAAgB,QAAQ,SAAS,KAAK,GAAG,KAAK,OAAO,QAAQ,CAAC;AAC9D,wBAAgB,QAAQ,SAAS,OAAO,GAAG,KAAK,SAAS,QAAQ,CAAC;AAClE,wBAAgB,QAAQ,SAAS,SAAS,GAAG,KAAK,WAAW,QAAQ,CAAC;AACtE;AAAA,MACF;AAGA,oBAAc,MAAM,KAAK;AAAA,IAC3B;AAGA,iBAAa,KAAK,gBAAgB;AAClC,oBAAgB,KAAK,QAAQ,YAAY,GAAG,IAAI;AAChD,oBAAgB,KAAK,QAAQ,MAAM,GAAG,IAAI;AAG1C,iBAAa,eAAe;AAC5B,iBAAa,eAAe;AAC5B,iBAAa,eAAe;AAG5B,kBAAc,KAAK,SAAS,EAAE;AAW9B,6BAAyB,YAAY;AAErC,UAAM,gBAAgB,aAAa;AACnC,UAAM,gBAAgB,aAAa;AACnC,UAAM,gBAAgB,aAAa;AACnC,UAAM,cAAc,aAAa;AAGjC,YAAQ,QAAQ,EAAE,MAAM,cAAc,aAAa;AAAA,EACrD;AAGA,2BAAyB,KAAK;AAC9B,SAAO,EAAE,SAAS,MAAM;AAC1B;AAEA,SAAS,yBAAyB,QAAkC;AAClE,QAAM,EAAE,cAAc,cAAc,aAAa,IAAI;AACrD,QAAM,aAAa,OAAO,aAAa,eAAe,eAAe;AACrE,MAAI,aAAa,cAAc;AAC7B,WAAO,WAAW,KAAK,MAAO,MAAM,gBAAiB,aAAa,aAAa;AAAA,EACjF,OAAO;AACL,WAAO,WAAW;AAAA,EACpB;AACF;",
5
+ "names": []
6
+ }