@allurereport/core 3.3.1 → 3.4.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.
- package/dist/api.d.ts +1 -0
- package/dist/config.d.ts +2 -0
- package/dist/config.js +71 -6
- package/dist/history.d.ts +1 -1
- package/dist/history.js +8 -6
- package/dist/index.d.ts +2 -1
- package/dist/index.js +2 -1
- package/dist/plugin.js +2 -1
- package/dist/qualityGate/qualityGate.js +2 -2
- package/dist/qualityGate/rules.d.ts +3 -1
- package/dist/qualityGate/rules.js +40 -6
- package/dist/report.js +32 -13
- package/dist/store/convert.js +1 -1
- package/dist/store/store.d.ts +14 -3
- package/dist/store/store.js +366 -61
- package/dist/utils/environment.d.ts +24 -0
- package/dist/utils/environment.js +160 -0
- package/dist/utils/event.d.ts +1 -1
- package/dist/utils/safeDumpPath.d.ts +4 -0
- package/dist/utils/safeDumpPath.js +22 -0
- package/dist/utils/safeOutputPath.d.ts +5 -0
- package/dist/utils/safeOutputPath.js +31 -0
- package/dist/utils/windows.d.ts +2 -0
- package/dist/utils/windows.js +51 -0
- package/package.json +30 -42
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { DEFAULT_ENVIRONMENT, DEFAULT_ENVIRONMENT_IDENTITY, formatNormalizedEnvironmentCollision, validateEnvironmentId, validateEnvironmentName, } from "@allurereport/core-api";
|
|
2
|
+
const createIdentity = (id, descriptor) => ({
|
|
3
|
+
id,
|
|
4
|
+
name: descriptor?.name ?? id,
|
|
5
|
+
});
|
|
6
|
+
const compatibilityIdentityFromName = (normalizedName) => normalizedName === DEFAULT_ENVIRONMENT ? DEFAULT_ENVIRONMENT_IDENTITY : { id: normalizedName, name: normalizedName };
|
|
7
|
+
export const normalizeEnvironmentDescriptorMap = (input, sourcePath) => {
|
|
8
|
+
const normalized = {};
|
|
9
|
+
const identities = [];
|
|
10
|
+
const originalIdsByNormalized = new Map();
|
|
11
|
+
const originalIdsByNormalizedName = new Map();
|
|
12
|
+
const errors = [];
|
|
13
|
+
Object.entries(input).forEach(([environmentId, environmentDescriptor]) => {
|
|
14
|
+
const idResult = validateEnvironmentId(environmentId);
|
|
15
|
+
if (!idResult.valid) {
|
|
16
|
+
errors.push(`${sourcePath}[${JSON.stringify(environmentId)}]: ${idResult.reason}`);
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
const nameResult = validateEnvironmentName(environmentDescriptor.name ?? environmentId);
|
|
20
|
+
if (!nameResult.valid) {
|
|
21
|
+
errors.push(`${sourcePath}[${JSON.stringify(environmentId)}]: ${nameResult.reason}`);
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
const normalizedName = nameResult.normalized;
|
|
25
|
+
const normalizedId = idResult.normalized;
|
|
26
|
+
const originalIds = originalIdsByNormalized.get(normalizedId) ?? [];
|
|
27
|
+
const originalIdsForName = originalIdsByNormalizedName.get(normalizedName) ?? [];
|
|
28
|
+
originalIds.push(environmentId);
|
|
29
|
+
originalIdsForName.push(environmentId);
|
|
30
|
+
originalIdsByNormalized.set(normalizedId, originalIds);
|
|
31
|
+
originalIdsByNormalizedName.set(normalizedName, originalIdsForName);
|
|
32
|
+
if (!(normalizedId in normalized)) {
|
|
33
|
+
normalized[normalizedId] = {
|
|
34
|
+
...environmentDescriptor,
|
|
35
|
+
name: normalizedName,
|
|
36
|
+
};
|
|
37
|
+
identities.push({
|
|
38
|
+
id: normalizedId,
|
|
39
|
+
name: normalizedName,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
originalIdsByNormalized.forEach((originalIds, normalizedId) => {
|
|
44
|
+
if (originalIds.length <= 1) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
errors.push(formatNormalizedEnvironmentCollision(sourcePath, normalizedId, originalIds));
|
|
48
|
+
});
|
|
49
|
+
originalIdsByNormalizedName.forEach((originalIds, normalizedName) => {
|
|
50
|
+
if (originalIds.length <= 1) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
errors.push(`${sourcePath}: normalized environment name ${JSON.stringify(normalizedName)} is produced by ids [${originalIds.map((id) => JSON.stringify(id)).join(",")}]`);
|
|
54
|
+
});
|
|
55
|
+
return {
|
|
56
|
+
normalized,
|
|
57
|
+
identities,
|
|
58
|
+
errors,
|
|
59
|
+
};
|
|
60
|
+
};
|
|
61
|
+
export const environmentIdentityById = (environmentsConfig, environmentId) => {
|
|
62
|
+
if (!Object.prototype.hasOwnProperty.call(environmentsConfig, environmentId)) {
|
|
63
|
+
return undefined;
|
|
64
|
+
}
|
|
65
|
+
const descriptor = environmentsConfig[environmentId];
|
|
66
|
+
if (!descriptor) {
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
return createIdentity(environmentId, descriptor);
|
|
70
|
+
};
|
|
71
|
+
export const environmentIdentityByName = (environmentsConfig, environmentName) => {
|
|
72
|
+
for (const [id, descriptor] of Object.entries(environmentsConfig)) {
|
|
73
|
+
if ((descriptor?.name ?? id) === environmentName) {
|
|
74
|
+
return createIdentity(id, descriptor);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return undefined;
|
|
78
|
+
};
|
|
79
|
+
export const resolveStoredEnvironmentIdentity = (params, environmentsConfig, options) => {
|
|
80
|
+
if (params.environment !== undefined) {
|
|
81
|
+
const idResult = validateEnvironmentId(params.environment);
|
|
82
|
+
if (idResult.valid) {
|
|
83
|
+
const byId = environmentIdentityById(environmentsConfig, idResult.normalized);
|
|
84
|
+
if (byId) {
|
|
85
|
+
return byId;
|
|
86
|
+
}
|
|
87
|
+
const byName = environmentIdentityByName(environmentsConfig, idResult.normalized);
|
|
88
|
+
if (byName) {
|
|
89
|
+
return byName;
|
|
90
|
+
}
|
|
91
|
+
const nameResult = validateEnvironmentName(params.environmentName ?? params.environment);
|
|
92
|
+
return {
|
|
93
|
+
id: idResult.normalized,
|
|
94
|
+
name: nameResult.valid ? nameResult.normalized : idResult.normalized,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
const nameResult = validateEnvironmentName(params.environment);
|
|
98
|
+
if (nameResult.valid) {
|
|
99
|
+
return (environmentIdentityByName(environmentsConfig, nameResult.normalized) ??
|
|
100
|
+
compatibilityIdentityFromName(nameResult.normalized));
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
if (params.environmentName !== undefined) {
|
|
104
|
+
const nameResult = validateEnvironmentName(params.environmentName);
|
|
105
|
+
if (nameResult.valid) {
|
|
106
|
+
return (environmentIdentityByName(environmentsConfig, nameResult.normalized) ??
|
|
107
|
+
compatibilityIdentityFromName(nameResult.normalized));
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
if (options?.fallbackToMatch === false) {
|
|
111
|
+
return undefined;
|
|
112
|
+
}
|
|
113
|
+
if (options?.forcedEnvironment) {
|
|
114
|
+
return options.forcedEnvironment;
|
|
115
|
+
}
|
|
116
|
+
const match = Object.entries(environmentsConfig).find(([, { matcher }]) => matcher({ labels: params.labels ?? [] }));
|
|
117
|
+
if (!match) {
|
|
118
|
+
return DEFAULT_ENVIRONMENT_IDENTITY;
|
|
119
|
+
}
|
|
120
|
+
const [id, descriptor] = match;
|
|
121
|
+
return { id, name: descriptor.name ?? id };
|
|
122
|
+
};
|
|
123
|
+
export const resolveEnvironmentIdentity = (params, environmentsConfig, sourcePath) => {
|
|
124
|
+
const errors = [];
|
|
125
|
+
let identityFromEnvironment;
|
|
126
|
+
let identityFromName;
|
|
127
|
+
if (params.environment !== undefined) {
|
|
128
|
+
const environmentResult = validateEnvironmentId(params.environment);
|
|
129
|
+
if (!environmentResult.valid) {
|
|
130
|
+
errors.push(`${sourcePath}: environment ${environmentResult.reason}`);
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
const normalizedEnvironment = environmentResult.normalized;
|
|
134
|
+
identityFromEnvironment = environmentIdentityById(environmentsConfig, normalizedEnvironment) ??
|
|
135
|
+
environmentIdentityByName(environmentsConfig, normalizedEnvironment) ?? {
|
|
136
|
+
id: normalizedEnvironment,
|
|
137
|
+
name: normalizedEnvironment,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
if (params.environmentName !== undefined) {
|
|
142
|
+
const environmentNameResult = validateEnvironmentName(params.environmentName);
|
|
143
|
+
if (!environmentNameResult.valid) {
|
|
144
|
+
errors.push(`${sourcePath}: environmentName ${environmentNameResult.reason}`);
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
identityFromName = environmentIdentityByName(environmentsConfig, environmentNameResult.normalized) ?? {
|
|
148
|
+
id: environmentNameResult.normalized,
|
|
149
|
+
name: environmentNameResult.normalized,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
if (identityFromEnvironment && identityFromName && identityFromEnvironment.id !== identityFromName.id) {
|
|
154
|
+
errors.push(`${sourcePath}: environment ${JSON.stringify(identityFromEnvironment.id)} and environmentName ${JSON.stringify(identityFromName.name)} resolve to different environments`);
|
|
155
|
+
}
|
|
156
|
+
return {
|
|
157
|
+
identity: identityFromEnvironment ?? identityFromName,
|
|
158
|
+
errors,
|
|
159
|
+
};
|
|
160
|
+
};
|
package/dist/utils/event.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import type { EventEmitter } from "node:events";
|
|
1
2
|
import type { TestError } from "@allurereport/core-api";
|
|
2
3
|
import type { BatchOptions, ExitCode, QualityGateValidationResult, RealtimeEventsDispatcher as RealtimeEventsDispatcherType, RealtimeSubscriber as RealtimeSubscriberType, ResultFile } from "@allurereport/plugin-api";
|
|
3
|
-
import type { EventEmitter } from "node:events";
|
|
4
4
|
export declare enum RealtimeEvents {
|
|
5
5
|
TestResult = "testResult",
|
|
6
6
|
TestFixtureResult = "testFixtureResult",
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { resolve } from "node:path";
|
|
2
|
+
import { isPathContainedInDir } from "./safeOutputPath.js";
|
|
3
|
+
export class UnsafeDumpPathError extends Error {
|
|
4
|
+
constructor(entryName, reason) {
|
|
5
|
+
const suffix = reason ? ` (${reason})` : "";
|
|
6
|
+
super(`Refusing to restore dump: unsafe attachment path ${JSON.stringify(entryName)}${suffix}`);
|
|
7
|
+
this.name = "UnsafeDumpPathError";
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
export function resolveDumpAttachmentPath(rootDir, entryName) {
|
|
11
|
+
if (entryName.length === 0) {
|
|
12
|
+
throw new UnsafeDumpPathError(entryName, "empty name");
|
|
13
|
+
}
|
|
14
|
+
if (entryName.includes("\0")) {
|
|
15
|
+
throw new UnsafeDumpPathError(entryName, "NUL byte");
|
|
16
|
+
}
|
|
17
|
+
const resolved = resolve(resolve(rootDir), entryName);
|
|
18
|
+
if (!isPathContainedInDir(rootDir, resolved)) {
|
|
19
|
+
throw new UnsafeDumpPathError(entryName);
|
|
20
|
+
}
|
|
21
|
+
return resolved;
|
|
22
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare class UnsafeReportOutputPathError extends Error {
|
|
2
|
+
constructor(relativePath: string);
|
|
3
|
+
}
|
|
4
|
+
export declare function isPathContainedInDir(rootDir: string, candidatePath: string): boolean;
|
|
5
|
+
export declare function resolvePathUnderOutputRoot(outputRoot: string, relativePath: string): string;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { resolve, sep } from "node:path";
|
|
2
|
+
import { isWindows } from "./windows.js";
|
|
3
|
+
export class UnsafeReportOutputPathError extends Error {
|
|
4
|
+
constructor(relativePath) {
|
|
5
|
+
super(`Refusing to write outside report output directory: ${JSON.stringify(relativePath)}`);
|
|
6
|
+
this.name = "UnsafeReportOutputPathError";
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
export function isPathContainedInDir(rootDir, candidatePath) {
|
|
10
|
+
const rootResolved = resolve(rootDir);
|
|
11
|
+
const candidateResolved = resolve(candidatePath);
|
|
12
|
+
if (isWindows()) {
|
|
13
|
+
const rootLower = rootResolved.toLowerCase();
|
|
14
|
+
const candLower = candidateResolved.toLowerCase();
|
|
15
|
+
const prefix = rootLower.endsWith("\\") ? rootLower : `${rootLower}\\`;
|
|
16
|
+
return candLower === rootLower || candLower.startsWith(prefix);
|
|
17
|
+
}
|
|
18
|
+
const prefix = rootResolved.endsWith(sep) ? rootResolved : `${rootResolved}${sep}`;
|
|
19
|
+
return candidateResolved === rootResolved || candidateResolved.startsWith(prefix);
|
|
20
|
+
}
|
|
21
|
+
export function resolvePathUnderOutputRoot(outputRoot, relativePath) {
|
|
22
|
+
if (relativePath.includes("\0")) {
|
|
23
|
+
throw new UnsafeReportOutputPathError(relativePath);
|
|
24
|
+
}
|
|
25
|
+
const rootResolved = resolve(outputRoot);
|
|
26
|
+
const targetPath = resolve(rootResolved, relativePath);
|
|
27
|
+
if (!isPathContainedInDir(rootResolved, targetPath)) {
|
|
28
|
+
throw new UnsafeReportOutputPathError(relativePath);
|
|
29
|
+
}
|
|
30
|
+
return targetPath;
|
|
31
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { platform } from "node:os";
|
|
2
|
+
export function isWindows() {
|
|
3
|
+
return platform() === "win32";
|
|
4
|
+
}
|
|
5
|
+
const hasWindowsForbiddenPluginIdChar = (id) => {
|
|
6
|
+
if (/["<>|?*:]/.test(id)) {
|
|
7
|
+
return true;
|
|
8
|
+
}
|
|
9
|
+
for (let i = 0; i < id.length; i++) {
|
|
10
|
+
const code = id.charCodeAt(i);
|
|
11
|
+
if (code <= 0x1f) {
|
|
12
|
+
return true;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
return false;
|
|
16
|
+
};
|
|
17
|
+
const PLUGIN_ID_WINDOWS_RESERVED = new Set([
|
|
18
|
+
"CON",
|
|
19
|
+
"PRN",
|
|
20
|
+
"AUX",
|
|
21
|
+
"NUL",
|
|
22
|
+
"COM0",
|
|
23
|
+
"COM1",
|
|
24
|
+
"COM2",
|
|
25
|
+
"COM3",
|
|
26
|
+
"COM4",
|
|
27
|
+
"COM5",
|
|
28
|
+
"COM6",
|
|
29
|
+
"COM7",
|
|
30
|
+
"COM8",
|
|
31
|
+
"COM9",
|
|
32
|
+
"LPT0",
|
|
33
|
+
"LPT1",
|
|
34
|
+
"LPT2",
|
|
35
|
+
"LPT3",
|
|
36
|
+
"LPT4",
|
|
37
|
+
"LPT5",
|
|
38
|
+
"LPT6",
|
|
39
|
+
"LPT7",
|
|
40
|
+
"LPT8",
|
|
41
|
+
"LPT9",
|
|
42
|
+
]);
|
|
43
|
+
export function assertValidPluginIdForWindows(id) {
|
|
44
|
+
if (hasWindowsForbiddenPluginIdChar(id)) {
|
|
45
|
+
throw new Error(`Invalid plugin id ${JSON.stringify(id)}: contains characters not allowed in Windows file names`);
|
|
46
|
+
}
|
|
47
|
+
const dotSegment = id.includes(".") ? id.slice(0, id.indexOf(".")) : id;
|
|
48
|
+
if (PLUGIN_ID_WINDOWS_RESERVED.has(dotSegment.toUpperCase())) {
|
|
49
|
+
throw new Error(`Invalid plugin id ${JSON.stringify(id)}: reserved device name on Windows`);
|
|
50
|
+
}
|
|
51
|
+
}
|
package/package.json
CHANGED
|
@@ -1,76 +1,64 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@allurereport/core",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.4.1",
|
|
4
4
|
"description": "Collection of generic Allure utilities used across the entire project",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"allure"
|
|
7
7
|
],
|
|
8
|
-
"repository": "https://github.com/allure-framework/allure3",
|
|
9
8
|
"license": "Apache-2.0",
|
|
10
9
|
"author": "Qameta Software",
|
|
10
|
+
"repository": "https://github.com/allure-framework/allure3",
|
|
11
|
+
"files": [
|
|
12
|
+
"dist"
|
|
13
|
+
],
|
|
11
14
|
"type": "module",
|
|
15
|
+
"module": "dist/index.js",
|
|
16
|
+
"types": "dist/index.d.ts",
|
|
12
17
|
"exports": {
|
|
13
18
|
".": "./dist/index.js"
|
|
14
19
|
},
|
|
15
|
-
"module": "dist/index.js",
|
|
16
|
-
"types": "dist/index.d.ts",
|
|
17
|
-
"files": [
|
|
18
|
-
"dist"
|
|
19
|
-
],
|
|
20
20
|
"scripts": {
|
|
21
21
|
"build": "run clean && tsc --project ./tsconfig.json",
|
|
22
22
|
"clean": "rimraf ./dist",
|
|
23
|
-
"
|
|
24
|
-
"
|
|
25
|
-
"
|
|
23
|
+
"test": "vitest run",
|
|
24
|
+
"lint": "oxlint --import-plugin src test features stories",
|
|
25
|
+
"lint:fix": "oxlint --import-plugin --fix src test features stories"
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@allurereport/ci": "3.
|
|
29
|
-
"@allurereport/core-api": "3.
|
|
30
|
-
"@allurereport/plugin-allure2": "3.
|
|
31
|
-
"@allurereport/plugin-api": "3.
|
|
32
|
-
"@allurereport/plugin-awesome": "3.
|
|
33
|
-
"@allurereport/plugin-classic": "3.
|
|
34
|
-
"@allurereport/plugin-csv": "3.
|
|
35
|
-
"@allurereport/plugin-dashboard": "3.
|
|
36
|
-
"@allurereport/plugin-jira": "3.
|
|
37
|
-
"@allurereport/plugin-log": "3.
|
|
38
|
-
"@allurereport/plugin-progress": "3.
|
|
39
|
-
"@allurereport/plugin-slack": "3.
|
|
40
|
-
"@allurereport/plugin-testops": "3.
|
|
41
|
-
"@allurereport/plugin-testplan": "3.
|
|
42
|
-
"@allurereport/reader": "3.
|
|
43
|
-
"@allurereport/reader-api": "3.
|
|
44
|
-
"@allurereport/service": "3.
|
|
45
|
-
"@allurereport/summary": "3.
|
|
46
|
-
"handlebars": "^4.7.
|
|
28
|
+
"@allurereport/ci": "3.4.1",
|
|
29
|
+
"@allurereport/core-api": "3.4.1",
|
|
30
|
+
"@allurereport/plugin-allure2": "3.4.1",
|
|
31
|
+
"@allurereport/plugin-api": "3.4.1",
|
|
32
|
+
"@allurereport/plugin-awesome": "3.4.1",
|
|
33
|
+
"@allurereport/plugin-classic": "3.4.1",
|
|
34
|
+
"@allurereport/plugin-csv": "3.4.1",
|
|
35
|
+
"@allurereport/plugin-dashboard": "3.4.1",
|
|
36
|
+
"@allurereport/plugin-jira": "3.4.1",
|
|
37
|
+
"@allurereport/plugin-log": "3.4.1",
|
|
38
|
+
"@allurereport/plugin-progress": "3.4.1",
|
|
39
|
+
"@allurereport/plugin-slack": "3.4.1",
|
|
40
|
+
"@allurereport/plugin-testops": "3.4.1",
|
|
41
|
+
"@allurereport/plugin-testplan": "3.4.1",
|
|
42
|
+
"@allurereport/reader": "3.4.1",
|
|
43
|
+
"@allurereport/reader-api": "3.4.1",
|
|
44
|
+
"@allurereport/service": "3.4.1",
|
|
45
|
+
"@allurereport/summary": "3.4.1",
|
|
46
|
+
"handlebars": "^4.7.9",
|
|
47
47
|
"node-stream-zip": "^1.15.0",
|
|
48
48
|
"p-limit": "^7.2.0",
|
|
49
49
|
"progress": "^2.0.3",
|
|
50
|
-
"yaml": "^2.8.
|
|
50
|
+
"yaml": "^2.8.3",
|
|
51
51
|
"yoctocolors": "^2.1.1",
|
|
52
52
|
"zip-stream": "^7.0.2"
|
|
53
53
|
},
|
|
54
54
|
"devDependencies": {
|
|
55
|
-
"@stylistic/eslint-plugin": "^2.6.1",
|
|
56
|
-
"@types/eslint": "^8.56.11",
|
|
57
|
-
"@types/handlebars": "^4.1.0",
|
|
58
55
|
"@types/node": "^20.17.9",
|
|
59
56
|
"@types/progress": "^2",
|
|
60
57
|
"@types/zip-stream": "^7.0.0",
|
|
61
|
-
"@typescript-eslint/eslint-plugin": "^8.0.0",
|
|
62
|
-
"@typescript-eslint/parser": "^8.0.0",
|
|
63
58
|
"@vitest/runner": "^2.1.9",
|
|
64
59
|
"@vitest/snapshot": "^2.1.9",
|
|
65
60
|
"allure-js-commons": "^3.3.3",
|
|
66
61
|
"allure-vitest": "^3.3.3",
|
|
67
|
-
"eslint": "^8.57.0",
|
|
68
|
-
"eslint-config-prettier": "^9.1.0",
|
|
69
|
-
"eslint-plugin-import": "^2.29.1",
|
|
70
|
-
"eslint-plugin-jsdoc": "^50.0.0",
|
|
71
|
-
"eslint-plugin-n": "^17.10.1",
|
|
72
|
-
"eslint-plugin-no-null": "^1.0.2",
|
|
73
|
-
"eslint-plugin-prefer-arrow": "^1.2.3",
|
|
74
62
|
"rimraf": "^6.0.1",
|
|
75
63
|
"tslib": "^2.7.0",
|
|
76
64
|
"typescript": "^5.6.3",
|