@overkill-dev/reporter-dot 0.0.1 → 0.0.3

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.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) Overkill contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/package.json CHANGED
@@ -1,7 +1,43 @@
1
1
  {
2
- "name": "@overkill-dev/reporter-dot",
3
- "version": "0.0.1",
4
- "description": "Placeholder claiming the npm package name \"@overkill-dev/reporter-dot\" so a trusted publisher can be configured. See https://github.com/npm/cli/issues/8544.",
5
- "license": "MIT",
6
- "deprecated": "Placeholder published as a workaround so a Trusted Publisher could be configured. See https://github.com/npm/cli/issues/8544."
7
- }
2
+ "author": "Christian Rackerseder <git@echooff.de>",
3
+ "bugs": {
4
+ "url": "https://github.com/enormora/overkill/issues"
5
+ },
6
+ "dependencies": {
7
+ "ansi-escapes": "7.3.0",
8
+ "figures": "6.1.0",
9
+ "is-interactive": "2.0.0",
10
+ "string-width": "8.2.2",
11
+ "yoctocolors": "2.1.2"
12
+ },
13
+ "description": "Compact Overkill dot progress reporter.",
14
+ "engines": {
15
+ "node": "^26"
16
+ },
17
+ "exports": {
18
+ ".": {
19
+ "import": "./packages/reporter-dot/reporter-dot.entry-point.js",
20
+ "types": "./packages/reporter-dot/reporter-dot.entry-point.d.ts"
21
+ }
22
+ },
23
+ "homepage": "https://github.com/enormora/overkill#readme",
24
+ "keywords": [
25
+ "tdd",
26
+ "test",
27
+ "tests"
28
+ ],
29
+ "license": "MIT",
30
+ "name": "@overkill-dev/reporter-dot",
31
+ "peerDependencies": {
32
+ "@overkill-dev/engine": "0.0.3"
33
+ },
34
+ "repository": {
35
+ "type": "git",
36
+ "url": "git+https://github.com/enormora/overkill.git"
37
+ },
38
+ "sideEffects": [
39
+ "./reporters/dot-reporter.js"
40
+ ],
41
+ "type": "module",
42
+ "version": "0.0.3"
43
+ }
@@ -0,0 +1,3 @@
1
+ import type { RealTimeReporter } from '@overkill-dev/engine';
2
+ export declare function createDotReporter(): RealTimeReporter;
3
+ //# sourceMappingURL=reporter-dot.entry-point.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reporter-dot.entry-point.d.ts","sourceRoot":"","sources":["../../../../../source/packages/reporter-dot/reporter-dot.entry-point.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAiBxE,wBAAgB,iBAAiB,IAAI,gBAAgB,CAKpD"}
@@ -0,0 +1,23 @@
1
+ import isInteractive from 'is-interactive';
2
+ import { createDotReporter as createDotReporterInstance } from "../../reporters/dot-reporter.js";
3
+ const stdout = {
4
+ get columns() {
5
+ return process.stdout.columns;
6
+ },
7
+ off(event, listener) {
8
+ return process.stdout.off(event, listener);
9
+ },
10
+ on(event, listener) {
11
+ return process.stdout.on(event, listener);
12
+ },
13
+ write(text) {
14
+ return process.stdout.write(text);
15
+ }
16
+ };
17
+ export function createDotReporter() {
18
+ return createDotReporterInstance({
19
+ interactive: isInteractive({ stream: process.stdout }),
20
+ stdout
21
+ });
22
+ }
23
+ //# sourceMappingURL=reporter-dot.entry-point.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reporter-dot.entry-point.js","sourceRoot":"","sources":["../../../../../source/packages/reporter-dot/reporter-dot.entry-point.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,iBAAiB,IAAI,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAIjG,MAAM,MAAM,GAAmB;IAC3B,IAAI,OAAO;QACP,OAAO,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC;IAClC,CAAC;IACD,GAAG,CAAC,KAAK,EAAE,QAAQ;QACf,OAAO,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC/C,CAAC;IACD,EAAE,CAAC,KAAK,EAAE,QAAQ;QACd,OAAO,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC9C,CAAC;IACD,KAAK,CAAC,IAAI;QACN,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;CACJ,CAAC;AAEF,MAAM,UAAU,iBAAiB;IAC7B,OAAO,yBAAyB,CAAC;QAC7B,WAAW,EAAE,aAAa,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;QACtD,MAAM;KACT,CAAC,CAAC;AACP,CAAC"}
package/readme.md CHANGED
@@ -1,7 +1,22 @@
1
- # @overkill-dev/reporter-dot
1
+ # `@overkill-dev/reporter-dot`
2
2
 
3
- This version is a placeholder published only to claim the npm name `@overkill-dev/reporter-dot` so a Trusted Publisher
4
- can subsequently be configured for it. It contains no real package content and is published already
5
- deprecated.
3
+ Compact real-time progress reporter for Overkill test runs.
6
4
 
7
- Workaround context: https://github.com/npm/cli/issues/8544
5
+ ## API
6
+
7
+ ```ts
8
+ import { execute } from '@overkill-dev/engine';
9
+ import { createDotReporter } from '@overkill-dev/reporter-dot';
10
+
11
+ await execute(testPlan, {
12
+ reporters: [ createDotReporter() ],
13
+ runFacts: {},
14
+ startedAt: new Date().toISOString()
15
+ });
16
+ ```
17
+
18
+ The reporter writes to `stdout` and declares that sink as exclusive.
19
+
20
+ It prints one mark per completed test and runner error, then a compact
21
+ summary and short detail lines for failed tests, inconclusive tests, and
22
+ runner errors.
@@ -0,0 +1,8 @@
1
+ import type { RealTimeReporter } from '@overkill-dev/engine/engine/reporter.js';
2
+ import { type TerminalOutput } from './terminal.ts';
3
+ export type DotReporterDependencies = {
4
+ readonly interactive: boolean;
5
+ readonly stdout: TerminalOutput;
6
+ };
7
+ export declare function createDotReporter(dependencies: DotReporterDependencies): RealTimeReporter;
8
+ //# sourceMappingURL=dot-reporter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dot-reporter.d.ts","sourceRoot":"","sources":["../../../../source/reporters/dot-reporter.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAiB,MAAM,uBAAuB,CAAC;AAE7E,OAAO,EAAkC,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpF,MAAM,MAAM,uBAAuB,GAAG;IAClC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;CACnC,CAAC;AAyGF,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,uBAAuB,GAAG,gBAAgB,CAgDzF"}
@@ -0,0 +1,132 @@
1
+ import figures from 'figures';
2
+ import colors from 'yoctocolors';
3
+ import { formatCaseId } from "@overkill-dev/engine/engine/identity.js";
4
+ import { createTerminalProgressRenderer } from "./terminal.js";
5
+ const passMark = colors.green(figures.tick);
6
+ const failMark = colors.red(figures.cross);
7
+ const skipMark = colors.cyan('°');
8
+ const inconclusiveMark = colors.cyan('?');
9
+ const runnerErrorMark = colors.red(figures.warning);
10
+ function formatDuration(wallTimeMs) {
11
+ return `${wallTimeMs} ms`;
12
+ }
13
+ function executedCount(result) {
14
+ const { summary } = result;
15
+ const crashCount = result
16
+ .runnerErrors
17
+ .filter(function isCrash(error) {
18
+ return error.subtype === 'crash';
19
+ })
20
+ .length;
21
+ return summary.passed + summary.failed + summary.skipped + summary.inconclusive + crashCount;
22
+ }
23
+ function formatSummary(result) {
24
+ const { summary } = result;
25
+ const outcomes = [
26
+ `${summary.passed} pass`,
27
+ `${summary.failed} fail`,
28
+ `${summary.skipped} skip`,
29
+ ...summary.inconclusive === 0 ? [] : [`${summary.inconclusive} inconclusive`]
30
+ ]
31
+ .join(', ');
32
+ const orphanSummary = result.orphans.length === 0 ? '' : `, ${result.orphans.length} orphaned`;
33
+ const countSummary = [
34
+ `${summary.discovered} discovered`,
35
+ `${summary.planned} planned`,
36
+ `${executedCount(result)} executed`
37
+ ]
38
+ .join(', ');
39
+ return `${countSummary} (${outcomes})${orphanSummary} in ${formatDuration(result.wallTimeMs)}`;
40
+ }
41
+ function failureSummary(failure) {
42
+ if (failure.kind === 'assertion') {
43
+ return failure.checks[0].summary;
44
+ }
45
+ if (failure.kind === 'body-error') {
46
+ return failure.error.message;
47
+ }
48
+ return failure.summary;
49
+ }
50
+ function outcomeDetail(outcome) {
51
+ if (outcome.kind === 'fail') {
52
+ return failureSummary(outcome.failures[0]);
53
+ }
54
+ if (outcome.kind === 'inconclusive') {
55
+ return outcome.reason;
56
+ }
57
+ return null;
58
+ }
59
+ function markForOutcome(outcome) {
60
+ if (outcome.kind === 'pass') {
61
+ return passMark;
62
+ }
63
+ if (outcome.kind === 'fail') {
64
+ return failMark;
65
+ }
66
+ if (outcome.kind === 'skip') {
67
+ return skipMark;
68
+ }
69
+ return inconclusiveMark;
70
+ }
71
+ function formatRunnerError(error) {
72
+ return `Runner error: ${error.message}`;
73
+ }
74
+ function detailLines(result) {
75
+ return [
76
+ ...result.perTest.flatMap(function testDetail(testResult) {
77
+ const detail = outcomeDetail(testResult.outcome);
78
+ if (detail === null || testResult.outcome.kind === 'skip') {
79
+ return [];
80
+ }
81
+ const prefix = testResult.outcome.kind === 'fail' ? 'Failed' : 'Inconclusive';
82
+ return [`${prefix}: ${formatCaseId(testResult.id)}: ${detail}`];
83
+ }),
84
+ ...result.runnerErrors.map(formatRunnerError)
85
+ ];
86
+ }
87
+ export function createDotReporter(dependencies) {
88
+ const progress = createTerminalProgressRenderer({
89
+ interactive: dependencies.interactive,
90
+ output: dependencies.stdout
91
+ });
92
+ let finished = false;
93
+ function writeLine(line) {
94
+ dependencies.stdout.write(`${line}\n`);
95
+ }
96
+ function finishProgress() {
97
+ if (finished) {
98
+ return;
99
+ }
100
+ finished = true;
101
+ progress.finish();
102
+ }
103
+ return {
104
+ dispose() {
105
+ progress.dispose();
106
+ },
107
+ kind: 'real-time',
108
+ name: 'dot',
109
+ sinks: [{ conflictPolicy: 'exclusive', kind: 'stdout' }],
110
+ async onEvent(event) {
111
+ if (event.kind === 'test-end') {
112
+ progress.writeMark(markForOutcome(event.outcome));
113
+ }
114
+ else if (event.kind === 'runner-error') {
115
+ if (finished) {
116
+ writeLine(formatRunnerError(event.error));
117
+ }
118
+ else {
119
+ progress.writeMark(runnerErrorMark);
120
+ }
121
+ }
122
+ },
123
+ async onFinish(result) {
124
+ finishProgress();
125
+ writeLine(formatSummary(result));
126
+ for (const detailLine of detailLines(result)) {
127
+ writeLine(detailLine);
128
+ }
129
+ }
130
+ };
131
+ }
132
+ //# sourceMappingURL=dot-reporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dot-reporter.js","sourceRoot":"","sources":["../../../../source/reporters/dot-reporter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ export type TerminalLineLogger = {
2
+ readonly line: (...values: readonly string[]) => void;
3
+ };
4
+ export type TerminalLineLoggerDependencies = {
5
+ readonly stdoutConsole: Pick<typeof console, 'log'>;
6
+ };
7
+ export type TerminalOutput = {
8
+ readonly columns: number;
9
+ readonly off: (event: 'resize', listener: () => void) => unknown;
10
+ readonly on: (event: 'resize', listener: () => void) => unknown;
11
+ readonly write: (text: string) => unknown;
12
+ };
13
+ export type TerminalProgressRenderer = {
14
+ readonly dispose: () => void;
15
+ readonly finish: () => void;
16
+ readonly writeMark: (mark: string) => void;
17
+ };
18
+ export type TerminalProgressRendererDependencies = {
19
+ readonly interactive: boolean;
20
+ readonly output: TerminalOutput;
21
+ };
22
+ export declare function createTerminalLineLogger(dependencies: TerminalLineLoggerDependencies): TerminalLineLogger;
23
+ export declare function visibleTerminalWidth(value: string): number;
24
+ export declare function createTerminalProgressRenderer(dependencies: TerminalProgressRendererDependencies): TerminalProgressRenderer;
25
+ //# sourceMappingURL=terminal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal.d.ts","sourceRoot":"","sources":["../../../../source/reporters/terminal.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,kBAAkB,GAAG;IAC7B,QAAQ,CAAC,IAAI,EAAE,CAAC,GAAG,MAAM,EAAE,SAAS,MAAM,EAAE,KAAK,IAAI,CAAC;CACzD,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG;IACzC,QAAQ,CAAC,aAAa,EAAE,IAAI,CAAC,OAAO,OAAO,EAAE,KAAK,CAAC,CAAC;CACvD,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,IAAI,KAAK,OAAO,CAAC;IACjE,QAAQ,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,IAAI,KAAK,OAAO,CAAC;IAChE,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;CAC7C,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACnC,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9C,CAAC;AAEF,MAAM,MAAM,oCAAoC,GAAG;IAC/C,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;CACnC,CAAC;AAeF,wBAAgB,wBAAwB,CAAC,YAAY,EAAE,8BAA8B,GAAG,kBAAkB,CAQzG;AAMD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE1D;AAqFD,wBAAgB,8BAA8B,CAC1C,YAAY,EAAE,oCAAoC,GACnD,wBAAwB,CA2D1B"}
@@ -0,0 +1,127 @@
1
+ import ansiEscapes from 'ansi-escapes';
2
+ import stringWidth from 'string-width';
3
+ const fallbackColumns = 80;
4
+
5
+ function terminalColumns(output) {
6
+ return Number.isSafeInteger(output.columns) && output.columns > 0 ? output.columns : fallbackColumns;
7
+ }
8
+ export function visibleTerminalWidth(value) {
9
+ return stringWidth(value);
10
+ }
11
+ function emptyProgressBlock() {
12
+ return {
13
+ lastLineWidth: 0,
14
+ lineCount: 0,
15
+ text: ''
16
+ };
17
+ }
18
+ function firstProgressBlockDraft() {
19
+ return {
20
+ lastLineWidth: 0,
21
+ lines: ['']
22
+ };
23
+ }
24
+ function progressMarkNeedsWrap(lineWidth, markWidth, columns) {
25
+ return lineWidth > 0 && lineWidth + markWidth > columns;
26
+ }
27
+ function appendMarkToDraft(draft, mark, columns) {
28
+ const markWidth = visibleTerminalWidth(mark);
29
+ if (progressMarkNeedsWrap(draft.lastLineWidth, markWidth, columns)) {
30
+ return {
31
+ lastLineWidth: markWidth,
32
+ lines: [...draft.lines, mark]
33
+ };
34
+ }
35
+ const leadingLines = draft.lines.slice(0, -1);
36
+ const currentLine = draft.lines.at(-1) ?? '';
37
+ return {
38
+ lastLineWidth: draft.lastLineWidth + markWidth,
39
+ lines: [...leadingLines, `${currentLine}${mark}`]
40
+ };
41
+ }
42
+ function progressBlockFromDraft(draft) {
43
+ return {
44
+ lastLineWidth: draft.lastLineWidth,
45
+ lineCount: draft.lines.length,
46
+ text: draft.lines.join('\n')
47
+ };
48
+ }
49
+ function renderProgressBlock(marks, columns) {
50
+ return marks.length === 0
51
+ ? emptyProgressBlock()
52
+ : progressBlockFromDraft(marks.reduce(function appendMark(draft, mark) {
53
+ return appendMarkToDraft(draft, mark, columns);
54
+ }, firstProgressBlockDraft()));
55
+ }
56
+ function eraseProgressBlock(lineCount) {
57
+ if (lineCount === 0) {
58
+ return '';
59
+ }
60
+ return ansiEscapes.eraseLines(lineCount);
61
+ }
62
+ function nextProgressBlock(currentBlock, mark, columns) {
63
+ const markWidth = visibleTerminalWidth(mark);
64
+ const needsWrap = progressMarkNeedsWrap(currentBlock.lastLineWidth, markWidth, columns);
65
+ return {
66
+ lastLineWidth: needsWrap ? markWidth : currentBlock.lastLineWidth + markWidth,
67
+ lineCount: currentBlock.lineCount === 0 ? 1 : currentBlock.lineCount + (needsWrap ? 1 : 0),
68
+ text: ''
69
+ };
70
+ }
71
+ function writeProgressMark(output, currentBlock, mark) {
72
+ const markWidth = visibleTerminalWidth(mark);
73
+ const needsWrap = progressMarkNeedsWrap(currentBlock.lastLineWidth, markWidth, terminalColumns(output));
74
+ const prefix = needsWrap ? '\n' : '';
75
+ output.write(`${prefix}${mark}`);
76
+ return nextProgressBlock(currentBlock, mark, terminalColumns(output));
77
+ }
78
+ export function createTerminalProgressRenderer(dependencies) {
79
+ const { interactive, output } = dependencies;
80
+ let currentBlock = emptyProgressBlock();
81
+ let disposed = false;
82
+ let finished = false;
83
+ let marks = [];
84
+ function redrawProgressBlock() {
85
+ if (!interactive || finished || marks.length === 0) {
86
+ return;
87
+ }
88
+ const nextBlock = renderProgressBlock(marks, terminalColumns(output));
89
+ output.write(`${eraseProgressBlock(currentBlock.lineCount)}${nextBlock.text}`);
90
+ currentBlock = nextBlock;
91
+ }
92
+ function resizeTerminal() {
93
+ redrawProgressBlock();
94
+ }
95
+ if (interactive) {
96
+ output.on('resize', resizeTerminal);
97
+ }
98
+ return {
99
+ dispose() {
100
+ if (disposed) {
101
+ return;
102
+ }
103
+ disposed = true;
104
+ if (interactive) {
105
+ output.off('resize', resizeTerminal);
106
+ }
107
+ },
108
+ finish() {
109
+ if (finished) {
110
+ return;
111
+ }
112
+ finished = true;
113
+ if (currentBlock.lastLineWidth > 0) {
114
+ output.write('\n');
115
+ }
116
+ },
117
+ writeMark(mark) {
118
+ if (finished) {
119
+ output.write(mark);
120
+ return;
121
+ }
122
+ marks = [...marks, mark];
123
+ currentBlock = writeProgressMark(output, currentBlock, mark);
124
+ }
125
+ };
126
+ }
127
+ //# sourceMappingURL=terminal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal.js","sourceRoot":"","sources":["../../../../source/reporters/terminal.ts"],"names":[],"mappings":"AAAA,OAAO,WAAW,MAAM,cAAc;AACtC,OAAO,WAAW,MAAM,cAAc;AAuCtC,MAAM,eAAe,GAAG,EAAE;;AAY1B,SAAS,eAAe,CAAC,MAAuC;IAC5D,OAAO,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;AACzG;AAEA,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAC9C,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;AAC9B;AAEA,SAAS,kBAAkB;IACvB,OAAO;QACH,aAAa,EAAE,CAAC;QAChB,SAAS,EAAE,CAAC;QACZ,IAAI,EAAE,EAAE;KACX,CAAC;AACN;AAEA,SAAS,uBAAuB;IAC5B,OAAO;QACH,aAAa,EAAE,CAAC;QAChB,KAAK,EAAE,CAAE,EAAE,CAAE;KAChB,CAAC;AACN;AAEA,SAAS,qBAAqB,CAAC,SAAiB,EAAE,SAAiB,EAAE,OAAe;IAChF,OAAO,SAAS,GAAG,CAAC,IAAI,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;AAC5D;AAEA,SAAS,iBAAiB,CAAC,KAAyB,EAAE,IAAY,EAAE,OAAe;IAC/E,MAAM,SAAS,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;IAE7C,IAAI,qBAAqB,CAAC,KAAK,CAAC,aAAa,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,CAAC;QACjE,OAAO;YACH,aAAa,EAAE,SAAS;YACxB,KAAK,EAAE,CAAE,GAAG,KAAK,CAAC,KAAK,EAAE,IAAI,CAAE;SAClC,CAAC;IACN,CAAC;IAED,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9C,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAE7C,OAAO;QACH,aAAa,EAAE,KAAK,CAAC,aAAa,GAAG,SAAS;QAC9C,KAAK,EAAE,CAAE,GAAG,YAAY,EAAE,GAAG,WAAW,GAAG,IAAI,EAAE,CAAE;KACtD,CAAC;AACN;AAEA,SAAS,sBAAsB,CAAC,KAAyB;IACrD,OAAO;QACH,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM;QAC7B,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;KAC/B,CAAC;AACN;AAEA,SAAS,mBAAmB,CAAC,KAAwB,EAAE,OAAe;IAClE,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;QACrB,CAAC,CAAC,kBAAkB,EAAE;QACtB,CAAC,CAAC,sBAAsB,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,UAAU,CAAC,KAAK,EAAE,IAAI;YACjE,OAAO,iBAAiB,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QACnD,CAAC,EAAE,uBAAuB,EAAE,CAAC,CAAC,CAAC;AACvC;AAEA,SAAS,kBAAkB,CAAC,SAAiB;IACzC,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;QAClB,OAAO,EAAE,CAAC;IACd,CAAC;IAED,OAAO,WAAW,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;AAC7C;AAEA,SAAS,iBAAiB,CAAC,YAA2B,EAAE,IAAY,EAAE,OAAe;IACjF,MAAM,SAAS,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,qBAAqB,CAAC,YAAY,CAAC,aAAa,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IAExF,OAAO;QACH,aAAa,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,aAAa,GAAG,SAAS;QAC7E,SAAS,EAAE,YAAY,CAAC,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,SAAS,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1F,IAAI,EAAE,EAAE;KACX,CAAC;AACN;AAEA,SAAS,iBAAiB,CAAC,MAAsB,EAAE,YAA2B,EAAE,IAAY;IACxF,MAAM,SAAS,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,qBAAqB,CAAC,YAAY,CAAC,aAAa,EAAE,SAAS,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;IACxG,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAErC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,GAAG,IAAI,EAAE,CAAC,CAAC;IAEjC,OAAO,iBAAiB,CAAC,YAAY,EAAE,IAAI,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;AAC1E;AAEA,MAAM,UAAU,8BAA8B,CAC1C,YAAkD;IAElD,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC;IAC7C,IAAI,YAAY,GAAG,kBAAkB,EAAE,CAAC;IACxC,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,KAAK,GAAsB,EAAE,CAAC;IAElC,SAAS,mBAAmB;QACxB,IAAI,CAAC,WAAW,IAAI,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjD,OAAO;QACX,CAAC;QAED,MAAM,SAAS,GAAG,mBAAmB,CAAC,KAAK,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;QACtE,MAAM,CAAC,KAAK,CAAC,GAAG,kBAAkB,CAAC,YAAY,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;QAC/E,YAAY,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED,SAAS,cAAc;QACnB,mBAAmB,EAAE,CAAC;IAC1B,CAAC;IAED,IAAI,WAAW,EAAE,CAAC;QACd,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;IACxC,CAAC;IAED,OAAO;QACH,OAAO;YACH,IAAI,QAAQ,EAAE,CAAC;gBACX,OAAO;YACX,CAAC;YAED,QAAQ,GAAG,IAAI,CAAC;YAChB,IAAI,WAAW,EAAE,CAAC;gBACd,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;YACzC,CAAC;QACL,CAAC;QAED,MAAM;YACF,IAAI,QAAQ,EAAE,CAAC;gBACX,OAAO;YACX,CAAC;YAED,QAAQ,GAAG,IAAI,CAAC;YAChB,IAAI,YAAY,CAAC,aAAa,GAAG,CAAC,EAAE,CAAC;gBACjC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACvB,CAAC;QACL,CAAC;QAED,SAAS,CAAC,IAAI;YACV,IAAI,QAAQ,EAAE,CAAC;gBACX,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAEnB,OAAO;YACX,CAAC;YAED,KAAK,GAAG,CAAE,GAAG,KAAK,EAAE,IAAI,CAAE,CAAC;YAC3B,YAAY,GAAG,iBAAiB,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC;QACjE,CAAC;KACJ,CAAC;AACN"}
package/sbom.cdx.json ADDED
@@ -0,0 +1,135 @@
1
+ {
2
+ "$schema": "http://cyclonedx.org/schema/bom-1.6.schema.json",
3
+ "bomFormat": "CycloneDX",
4
+ "specVersion": "1.6",
5
+ "version": 1,
6
+ "metadata": {
7
+ "tools": {
8
+ "components": [
9
+ {
10
+ "type": "application",
11
+ "name": "packtory",
12
+ "version": "0.0.78"
13
+ }
14
+ ]
15
+ },
16
+ "component": {
17
+ "type": "library",
18
+ "name": "@overkill-dev/reporter-dot",
19
+ "version": "0.0.3",
20
+ "bom-ref": "pkg:npm/@overkill-dev/reporter-dot@0.0.3",
21
+ "purl": "pkg:npm/@overkill-dev/reporter-dot@0.0.3"
22
+ }
23
+ },
24
+ "components": [
25
+ {
26
+ "type": "library",
27
+ "name": "@overkill-dev/engine",
28
+ "version": "0.0.3",
29
+ "bom-ref": "pkg:npm/@overkill-dev/engine@0.0.3",
30
+ "scope": "optional",
31
+ "licenses": [
32
+ {
33
+ "expression": "MIT"
34
+ }
35
+ ],
36
+ "purl": "pkg:npm/@overkill-dev/engine@0.0.3"
37
+ },
38
+ {
39
+ "type": "library",
40
+ "name": "ansi-escapes",
41
+ "version": "7.3.0",
42
+ "bom-ref": "pkg:npm/ansi-escapes@7.3.0",
43
+ "scope": "required",
44
+ "licenses": [
45
+ {
46
+ "expression": "MIT"
47
+ }
48
+ ],
49
+ "purl": "pkg:npm/ansi-escapes@7.3.0"
50
+ },
51
+ {
52
+ "type": "library",
53
+ "name": "figures",
54
+ "version": "6.1.0",
55
+ "bom-ref": "pkg:npm/figures@6.1.0",
56
+ "scope": "required",
57
+ "licenses": [
58
+ {
59
+ "expression": "MIT"
60
+ }
61
+ ],
62
+ "purl": "pkg:npm/figures@6.1.0"
63
+ },
64
+ {
65
+ "type": "library",
66
+ "name": "is-interactive",
67
+ "version": "2.0.0",
68
+ "bom-ref": "pkg:npm/is-interactive@2.0.0",
69
+ "scope": "required",
70
+ "licenses": [
71
+ {
72
+ "expression": "MIT"
73
+ }
74
+ ],
75
+ "purl": "pkg:npm/is-interactive@2.0.0"
76
+ },
77
+ {
78
+ "type": "library",
79
+ "name": "string-width",
80
+ "version": "8.2.2",
81
+ "bom-ref": "pkg:npm/string-width@8.2.2",
82
+ "scope": "required",
83
+ "licenses": [
84
+ {
85
+ "expression": "MIT"
86
+ }
87
+ ],
88
+ "purl": "pkg:npm/string-width@8.2.2"
89
+ },
90
+ {
91
+ "type": "library",
92
+ "name": "yoctocolors",
93
+ "version": "2.1.2",
94
+ "bom-ref": "pkg:npm/yoctocolors@2.1.2",
95
+ "scope": "required",
96
+ "licenses": [
97
+ {
98
+ "expression": "MIT"
99
+ }
100
+ ],
101
+ "purl": "pkg:npm/yoctocolors@2.1.2"
102
+ }
103
+ ],
104
+ "dependencies": [
105
+ {
106
+ "ref": "pkg:npm/@overkill-dev/engine@0.0.3"
107
+ },
108
+ {
109
+ "ref": "pkg:npm/@overkill-dev/reporter-dot@0.0.3",
110
+ "dependsOn": [
111
+ "pkg:npm/@overkill-dev/engine@0.0.3",
112
+ "pkg:npm/ansi-escapes@7.3.0",
113
+ "pkg:npm/figures@6.1.0",
114
+ "pkg:npm/is-interactive@2.0.0",
115
+ "pkg:npm/string-width@8.2.2",
116
+ "pkg:npm/yoctocolors@2.1.2"
117
+ ]
118
+ },
119
+ {
120
+ "ref": "pkg:npm/ansi-escapes@7.3.0"
121
+ },
122
+ {
123
+ "ref": "pkg:npm/figures@6.1.0"
124
+ },
125
+ {
126
+ "ref": "pkg:npm/is-interactive@2.0.0"
127
+ },
128
+ {
129
+ "ref": "pkg:npm/string-width@8.2.2"
130
+ },
131
+ {
132
+ "ref": "pkg:npm/yoctocolors@2.1.2"
133
+ }
134
+ ]
135
+ }