optiprune 1.0.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.
- package/LICENSE +7 -0
- package/README.md +49 -0
- package/dist/cache.d.ts +14 -0
- package/dist/cache.js +36 -0
- package/dist/cache.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +53 -0
- package/dist/cli.js.map +1 -0
- package/dist/config-loader.d.ts +4 -0
- package/dist/config-loader.js +68 -0
- package/dist/config-loader.js.map +1 -0
- package/dist/coverage-tracker.d.ts +39 -0
- package/dist/coverage-tracker.js +61 -0
- package/dist/coverage-tracker.js.map +1 -0
- package/dist/fs-utils.d.ts +33 -0
- package/dist/fs-utils.js +334 -0
- package/dist/fs-utils.js.map +1 -0
- package/dist/graph.d.ts +28 -0
- package/dist/graph.js +331 -0
- package/dist/graph.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +313 -0
- package/dist/index.js.map +1 -0
- package/dist/instrument.d.ts +1 -0
- package/dist/instrument.js +20 -0
- package/dist/instrument.js.map +1 -0
- package/dist/instrumentation-plugin.d.ts +6 -0
- package/dist/instrumentation-plugin.js +84 -0
- package/dist/instrumentation-plugin.js.map +1 -0
- package/dist/layer2.d.ts +6 -0
- package/dist/layer2.js +227 -0
- package/dist/layer2.js.map +1 -0
- package/dist/layer3.d.ts +7 -0
- package/dist/layer3.js +244 -0
- package/dist/layer3.js.map +1 -0
- package/dist/layer4.d.ts +7 -0
- package/dist/layer4.js +90 -0
- package/dist/layer4.js.map +1 -0
- package/dist/layer5.d.ts +6 -0
- package/dist/layer5.js +141 -0
- package/dist/layer5.js.map +1 -0
- package/dist/layer6.d.ts +25 -0
- package/dist/layer6.js +183 -0
- package/dist/layer6.js.map +1 -0
- package/dist/parser.d.ts +24 -0
- package/dist/parser.js +481 -0
- package/dist/parser.js.map +1 -0
- package/dist/reporters.d.ts +3 -0
- package/dist/reporters.js +75 -0
- package/dist/reporters.js.map +1 -0
- package/dist/types.d.ts +205 -0
- package/dist/types.js +11 -0
- package/dist/types.js.map +1 -0
- package/dist/workspace.d.ts +6 -0
- package/dist/workspace.js +114 -0
- package/dist/workspace.js.map +1 -0
- package/package.json +112 -0
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
export type Confidence = "high" | "medium" | "low" | "info";
|
|
2
|
+
export type Severity = "error" | "warning" | "info";
|
|
3
|
+
export type ParseStatus = "parsed" | "recovered" | "fallback";
|
|
4
|
+
export type EdgeKind = "import" | "export-from" | "export-all" | "require" | "dynamic-literal" | "dynamic-pattern" | "unknown-dynamic";
|
|
5
|
+
export interface Position {
|
|
6
|
+
line: number;
|
|
7
|
+
column: number;
|
|
8
|
+
}
|
|
9
|
+
export interface Range {
|
|
10
|
+
start: Position;
|
|
11
|
+
end: Position;
|
|
12
|
+
}
|
|
13
|
+
export interface ParseDiagnostic {
|
|
14
|
+
message: string;
|
|
15
|
+
file: string;
|
|
16
|
+
location?: Range;
|
|
17
|
+
recovered: boolean;
|
|
18
|
+
}
|
|
19
|
+
export interface ExportRecord {
|
|
20
|
+
name: string;
|
|
21
|
+
exportedAs: string;
|
|
22
|
+
location?: Range;
|
|
23
|
+
isDefault: boolean;
|
|
24
|
+
isReExport: boolean;
|
|
25
|
+
isWildcard: boolean;
|
|
26
|
+
isTypeOnly?: boolean;
|
|
27
|
+
isExternalContract?: boolean;
|
|
28
|
+
}
|
|
29
|
+
export interface DependencyEdge {
|
|
30
|
+
source: string;
|
|
31
|
+
rawSpecifier: string;
|
|
32
|
+
kind: EdgeKind;
|
|
33
|
+
target?: string;
|
|
34
|
+
location?: Range;
|
|
35
|
+
importedNames: string[];
|
|
36
|
+
dynamicPattern?: DynamicPattern;
|
|
37
|
+
resolution: "resolved" | "unresolved" | "external" | "unknown";
|
|
38
|
+
isTypeOnly?: boolean;
|
|
39
|
+
}
|
|
40
|
+
export interface DynamicPattern {
|
|
41
|
+
prefix: string;
|
|
42
|
+
suffix: string;
|
|
43
|
+
baseDirectory: string;
|
|
44
|
+
candidates: string[];
|
|
45
|
+
}
|
|
46
|
+
export interface ModuleRecord {
|
|
47
|
+
id: string;
|
|
48
|
+
relativePath: string;
|
|
49
|
+
parseStatus: ParseStatus;
|
|
50
|
+
parseDiagnostics: ParseDiagnostic[];
|
|
51
|
+
ast?: unknown;
|
|
52
|
+
sourceText: string;
|
|
53
|
+
exports: ExportRecord[];
|
|
54
|
+
edges: DependencyEdge[];
|
|
55
|
+
hasUnknownDynamicBoundary: boolean;
|
|
56
|
+
hasUnresolvedCommonJsExports: boolean;
|
|
57
|
+
}
|
|
58
|
+
export interface WorkspacePackage {
|
|
59
|
+
name: string;
|
|
60
|
+
location: string;
|
|
61
|
+
relativePath: string;
|
|
62
|
+
manifestPath: string;
|
|
63
|
+
dependencies: Set<string>;
|
|
64
|
+
allDependencies: Set<string>;
|
|
65
|
+
}
|
|
66
|
+
export interface MonorepoGraph {
|
|
67
|
+
rootPath: string;
|
|
68
|
+
packageMap: Map<string, WorkspacePackage>;
|
|
69
|
+
topologicalOrder: string[];
|
|
70
|
+
}
|
|
71
|
+
export interface StronglyConnectedComponent {
|
|
72
|
+
id: number;
|
|
73
|
+
modules: string[];
|
|
74
|
+
isCycle: boolean;
|
|
75
|
+
}
|
|
76
|
+
export interface ConcolicVerificationResult {
|
|
77
|
+
pathReached: boolean;
|
|
78
|
+
executionTimeMs: number;
|
|
79
|
+
logs: string[];
|
|
80
|
+
}
|
|
81
|
+
export interface CandidateBranch {
|
|
82
|
+
file: string;
|
|
83
|
+
line: number;
|
|
84
|
+
instrumentedCode: string;
|
|
85
|
+
seedInput: Record<string, any>;
|
|
86
|
+
}
|
|
87
|
+
export interface Finding {
|
|
88
|
+
rule: "unreachable-file" | "unused-export" | "unreachable-statement" | "constant-condition" | "contradictory-guard" | "schema-impossible-guard" | "parse-recovery" | "unresolved-import" | "unknown-dynamic-import" | "no-entry-points" | "unreachable-dynamic-path" | "protected-contract";
|
|
89
|
+
severity: Severity;
|
|
90
|
+
confidence: Confidence;
|
|
91
|
+
message: string;
|
|
92
|
+
file: string;
|
|
93
|
+
location?: Range;
|
|
94
|
+
evidence: Record<string, unknown>;
|
|
95
|
+
}
|
|
96
|
+
export interface AnalyzerOptions {
|
|
97
|
+
rootDir?: string;
|
|
98
|
+
entry?: string[];
|
|
99
|
+
extensions?: string[];
|
|
100
|
+
ignore?: string[];
|
|
101
|
+
reportUnusedExports?: boolean;
|
|
102
|
+
schemaEnums?: Record<string, string[]>;
|
|
103
|
+
externalContracts?: string[];
|
|
104
|
+
failOn?: "high" | "medium" | "low" | "none";
|
|
105
|
+
json?: boolean;
|
|
106
|
+
includeConventionalEntries?: boolean;
|
|
107
|
+
}
|
|
108
|
+
export type RuleSeverity = "error" | "warning" | "off";
|
|
109
|
+
export interface Config {
|
|
110
|
+
rootDir?: string;
|
|
111
|
+
entry?: string[];
|
|
112
|
+
extensions?: string[];
|
|
113
|
+
ignore?: string[];
|
|
114
|
+
externalContracts?: string[];
|
|
115
|
+
reportUnusedExports?: boolean;
|
|
116
|
+
includeConventionalEntries?: boolean;
|
|
117
|
+
failOn?: Confidence;
|
|
118
|
+
json?: boolean;
|
|
119
|
+
layers?: {
|
|
120
|
+
smtTimeoutMs?: number;
|
|
121
|
+
isolateMemoryLimitMb?: number;
|
|
122
|
+
enableConcolicProof?: boolean;
|
|
123
|
+
};
|
|
124
|
+
rules?: Record<string, RuleSeverity>;
|
|
125
|
+
}
|
|
126
|
+
export interface ResolvedOptions {
|
|
127
|
+
rootDir: string;
|
|
128
|
+
entry: string[];
|
|
129
|
+
extensions: string[];
|
|
130
|
+
ignore: string[];
|
|
131
|
+
reportUnusedExports: boolean;
|
|
132
|
+
schemaEnums: Record<string, string[]>;
|
|
133
|
+
failOn: Confidence;
|
|
134
|
+
json: boolean;
|
|
135
|
+
includeConventionalEntries: boolean;
|
|
136
|
+
monorepo?: MonorepoGraph;
|
|
137
|
+
externalContracts: string[];
|
|
138
|
+
layers: {
|
|
139
|
+
smtTimeoutMs: number;
|
|
140
|
+
isolateMemoryLimitMb: number;
|
|
141
|
+
enableConcolicProof: boolean;
|
|
142
|
+
};
|
|
143
|
+
rules: Record<string, RuleSeverity>;
|
|
144
|
+
}
|
|
145
|
+
export interface AnalysisSummary {
|
|
146
|
+
filesDiscovered: number;
|
|
147
|
+
filesParsed: number;
|
|
148
|
+
filesRecovered: number;
|
|
149
|
+
filesFallback: number;
|
|
150
|
+
edges: number;
|
|
151
|
+
entryPoints: number;
|
|
152
|
+
stronglyConnectedComponents: number;
|
|
153
|
+
cycles: number;
|
|
154
|
+
findings: number;
|
|
155
|
+
errors: number;
|
|
156
|
+
warnings: number;
|
|
157
|
+
}
|
|
158
|
+
export interface AnalysisReport {
|
|
159
|
+
version: string;
|
|
160
|
+
rootDir: string;
|
|
161
|
+
entryPoints: string[];
|
|
162
|
+
summary: AnalysisSummary;
|
|
163
|
+
findings: Finding[];
|
|
164
|
+
modules: Array<{
|
|
165
|
+
path: string;
|
|
166
|
+
parseStatus: ParseStatus;
|
|
167
|
+
exports: Array<{
|
|
168
|
+
name: string;
|
|
169
|
+
exportedAs: string;
|
|
170
|
+
isDefault: boolean;
|
|
171
|
+
isReExport: boolean;
|
|
172
|
+
isWildcard: boolean;
|
|
173
|
+
isTypeOnly?: boolean;
|
|
174
|
+
isExternalContract?: boolean;
|
|
175
|
+
}>;
|
|
176
|
+
edges: Array<{
|
|
177
|
+
kind: EdgeKind;
|
|
178
|
+
specifier: string;
|
|
179
|
+
target?: string;
|
|
180
|
+
resolution: DependencyEdge["resolution"];
|
|
181
|
+
}>;
|
|
182
|
+
}>;
|
|
183
|
+
components: Array<{
|
|
184
|
+
id: number;
|
|
185
|
+
modules: string[];
|
|
186
|
+
isCycle: boolean;
|
|
187
|
+
}>;
|
|
188
|
+
}
|
|
189
|
+
export interface AnalysisContext {
|
|
190
|
+
options: ResolvedOptions;
|
|
191
|
+
modules: Map<string, ModuleRecord>;
|
|
192
|
+
entryPoints: Set<string>;
|
|
193
|
+
reachable: Set<string>;
|
|
194
|
+
maybeReachable: Set<string>;
|
|
195
|
+
components: StronglyConnectedComponent[];
|
|
196
|
+
usedExports: Set<string>;
|
|
197
|
+
candidateBranches: CandidateBranch[];
|
|
198
|
+
monorepo?: MonorepoGraph;
|
|
199
|
+
}
|
|
200
|
+
export interface AnalyzerPlugin {
|
|
201
|
+
name: string;
|
|
202
|
+
analyze(context: AnalysisContext): Finding[];
|
|
203
|
+
}
|
|
204
|
+
export declare const CONFIDENCE_RANK: Record<Confidence | "none", number>;
|
|
205
|
+
export declare function defineConfig(config: Config): Config;
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAoPA,MAAM,CAAC,MAAM,eAAe,GAAwC;IAClE,IAAI,EAAE,CAAC;IACP,GAAG,EAAE,CAAC;IACN,MAAM,EAAE,CAAC;IACT,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC,CAAC,EAAE,yCAAyC;CACpD,CAAC;AAEF,MAAM,UAAU,YAAY,CAAC,MAAc;IACzC,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { MonorepoGraph } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Resolves all sub-packages in a Monorepo workspace.
|
|
4
|
+
* Uses POSIX-style path logic for internal calculations to support Windows.
|
|
5
|
+
*/
|
|
6
|
+
export declare function buildMonorepoTopology(rootPath: string): Promise<MonorepoGraph>;
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import path from 'pathe';
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import fg from 'fast-glob';
|
|
4
|
+
import * as yaml from 'js-yaml';
|
|
5
|
+
import { normalizeAbsolute } from './fs-utils.js';
|
|
6
|
+
/**
|
|
7
|
+
* Resolves all sub-packages in a Monorepo workspace.
|
|
8
|
+
* Uses POSIX-style path logic for internal calculations to support Windows.
|
|
9
|
+
*/
|
|
10
|
+
export async function buildMonorepoTopology(rootPath) {
|
|
11
|
+
const absoluteRoot = normalizeAbsolute(rootPath);
|
|
12
|
+
const packageMap = new Map();
|
|
13
|
+
const packageGlobs = [];
|
|
14
|
+
// 1. Detect pnpm-workspace.yaml
|
|
15
|
+
const pnpmWorkspacePath = path.join(absoluteRoot, 'pnpm-workspace.yaml');
|
|
16
|
+
if (fs.existsSync(pnpmWorkspacePath)) {
|
|
17
|
+
try {
|
|
18
|
+
const content = fs.readFileSync(pnpmWorkspacePath, 'utf-8');
|
|
19
|
+
const doc = yaml.load(content);
|
|
20
|
+
if (doc?.packages && Array.isArray(doc.packages)) {
|
|
21
|
+
packageGlobs.push(...doc.packages);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
catch (e) {
|
|
25
|
+
console.error(`[Workspace] Error parsing pnpm-workspace.yaml: ${e}`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
// 2. Detect Yarn/NPM workspaces in package.json
|
|
29
|
+
const rootPackageJsonPath = path.join(absoluteRoot, 'package.json');
|
|
30
|
+
if (fs.existsSync(rootPackageJsonPath)) {
|
|
31
|
+
try {
|
|
32
|
+
const rootManifest = JSON.parse(fs.readFileSync(rootPackageJsonPath, 'utf-8'));
|
|
33
|
+
if (Array.isArray(rootManifest.workspaces)) {
|
|
34
|
+
packageGlobs.push(...rootManifest.workspaces);
|
|
35
|
+
}
|
|
36
|
+
else if (rootManifest.workspaces?.packages && Array.isArray(rootManifest.workspaces.packages)) {
|
|
37
|
+
packageGlobs.push(...rootManifest.workspaces.packages);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
catch (e) {
|
|
41
|
+
console.error(`[Workspace] Error parsing root package.json: ${e}`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
// Default to common patterns if nothing found
|
|
45
|
+
if (packageGlobs.length === 0) {
|
|
46
|
+
packageGlobs.push('packages/*', 'apps/*');
|
|
47
|
+
}
|
|
48
|
+
// 3. Find all package.json files matching the globs
|
|
49
|
+
// Use path.posix for globs as fast-glob expects forward slashes
|
|
50
|
+
const manifestFiles = await fg(packageGlobs.map(g => path.posix.join(g, 'package.json')), { cwd: absoluteRoot, absolute: true, ignore: ['**/node_modules/**'] });
|
|
51
|
+
for (const manifestPath of manifestFiles) {
|
|
52
|
+
try {
|
|
53
|
+
const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf-8'));
|
|
54
|
+
const pkgName = manifest.name;
|
|
55
|
+
if (!pkgName)
|
|
56
|
+
continue;
|
|
57
|
+
const location = normalizeAbsolute(path.dirname(manifestPath));
|
|
58
|
+
const allDeps = new Set([
|
|
59
|
+
...Object.keys(manifest.dependencies || {}),
|
|
60
|
+
...Object.keys(manifest.devDependencies || {}),
|
|
61
|
+
...Object.keys(manifest.peerDependencies || {}),
|
|
62
|
+
]);
|
|
63
|
+
packageMap.set(pkgName, {
|
|
64
|
+
name: pkgName,
|
|
65
|
+
location,
|
|
66
|
+
relativePath: path.posix.relative(absoluteRoot, location),
|
|
67
|
+
manifestPath: normalizeAbsolute(manifestPath),
|
|
68
|
+
dependencies: new Set(), // Will be filled in next pass
|
|
69
|
+
allDependencies: allDeps,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
catch (e) {
|
|
73
|
+
console.error(`[Workspace] Error parsing package manifest at ${manifestPath}: ${e}`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// 4. Resolve internal workspace dependencies
|
|
77
|
+
const internalPackageNames = new Set(packageMap.keys());
|
|
78
|
+
for (const pkg of packageMap.values()) {
|
|
79
|
+
for (const depName of pkg.allDependencies) {
|
|
80
|
+
if (internalPackageNames.has(depName)) {
|
|
81
|
+
pkg.dependencies.add(depName);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// 5. Topological Sort
|
|
86
|
+
const topologicalOrder = [];
|
|
87
|
+
const visited = new Set();
|
|
88
|
+
const visiting = new Set();
|
|
89
|
+
function visit(name) {
|
|
90
|
+
if (visiting.has(name))
|
|
91
|
+
return;
|
|
92
|
+
if (visited.has(name))
|
|
93
|
+
return;
|
|
94
|
+
visiting.add(name);
|
|
95
|
+
const pkg = packageMap.get(name);
|
|
96
|
+
if (pkg) {
|
|
97
|
+
for (const dep of pkg.dependencies) {
|
|
98
|
+
visit(dep);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
visiting.delete(name);
|
|
102
|
+
visited.add(name);
|
|
103
|
+
topologicalOrder.push(name);
|
|
104
|
+
}
|
|
105
|
+
for (const name of packageMap.keys()) {
|
|
106
|
+
visit(name);
|
|
107
|
+
}
|
|
108
|
+
return {
|
|
109
|
+
rootPath: absoluteRoot,
|
|
110
|
+
packageMap,
|
|
111
|
+
topologicalOrder,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=workspace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../src/workspace.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "optiprune",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Resilient static dead-code analyzer for TypeScript and JavaScript workspaces.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"homepage": "https://dreamlongyt.github.io/optiprune/",
|
|
9
|
+
"repository": {
|
|
10
|
+
"type": "git",
|
|
11
|
+
"url": "git+https://github.com/DreamLongYT/optiprune.git"
|
|
12
|
+
},
|
|
13
|
+
"bugs": {
|
|
14
|
+
"url": "https://github.com/DreamLongYT/optiprune/issues"
|
|
15
|
+
},
|
|
16
|
+
"keywords": [
|
|
17
|
+
"analysis",
|
|
18
|
+
"analyze",
|
|
19
|
+
"class",
|
|
20
|
+
"cli",
|
|
21
|
+
"dead code",
|
|
22
|
+
"dependencies",
|
|
23
|
+
"detect",
|
|
24
|
+
"devDependencies",
|
|
25
|
+
"duplicate",
|
|
26
|
+
"entropy",
|
|
27
|
+
"enum",
|
|
28
|
+
"export",
|
|
29
|
+
"files",
|
|
30
|
+
"find",
|
|
31
|
+
"javascript",
|
|
32
|
+
"lint",
|
|
33
|
+
"maintenance",
|
|
34
|
+
"members",
|
|
35
|
+
"missing",
|
|
36
|
+
"monorepo",
|
|
37
|
+
"namespace",
|
|
38
|
+
"package",
|
|
39
|
+
"scan",
|
|
40
|
+
"types",
|
|
41
|
+
"typescript",
|
|
42
|
+
"unreferenced",
|
|
43
|
+
"unresolved",
|
|
44
|
+
"unused",
|
|
45
|
+
"workspace",
|
|
46
|
+
"optiprune",
|
|
47
|
+
"pruning",
|
|
48
|
+
"dead",
|
|
49
|
+
"opti",
|
|
50
|
+
"optimization"
|
|
51
|
+
],
|
|
52
|
+
"bin": {
|
|
53
|
+
"optiprune": "dist/cli.js"
|
|
54
|
+
},
|
|
55
|
+
"exports": {
|
|
56
|
+
".": {
|
|
57
|
+
"types": "./dist/index.d.ts",
|
|
58
|
+
"import": "./dist/index.js"
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
"files": [
|
|
62
|
+
"dist",
|
|
63
|
+
"README.md",
|
|
64
|
+
"LICENSE"
|
|
65
|
+
],
|
|
66
|
+
"scripts": {
|
|
67
|
+
"build": "tsc -p tsconfig.json",
|
|
68
|
+
"check": "tsc -p tsconfig.json --noEmit",
|
|
69
|
+
"test": "pnpm vitest run --no-file-parallelism",
|
|
70
|
+
"test:watch": "vitest",
|
|
71
|
+
"analyze": "node ./dist/cli.js",
|
|
72
|
+
"docs:dev": "vitepress dev docs",
|
|
73
|
+
"docs:build": "vitepress build docs",
|
|
74
|
+
"docs:preview": "vitepress preview docs",
|
|
75
|
+
"prepublishOnly": "pnpm run build"
|
|
76
|
+
},
|
|
77
|
+
"dependencies": {
|
|
78
|
+
"@babel/cli": "^8.0.4",
|
|
79
|
+
"@babel/core": "^8.0.1",
|
|
80
|
+
"@babel/helper-plugin-utils": "^8.0.1",
|
|
81
|
+
"@babel/parser": "^7.29.7",
|
|
82
|
+
"@babel/plugin-proposal-decorators": "^8.0.2",
|
|
83
|
+
"@babel/plugin-transform-typescript": "^8.0.1",
|
|
84
|
+
"@babel/preset-env": "^8.0.2",
|
|
85
|
+
"@babel/traverse": "^8.0.4",
|
|
86
|
+
"@babel/types": "^8.0.4",
|
|
87
|
+
"@swc/core": "^1.15.47",
|
|
88
|
+
"commander": "^15.0.0",
|
|
89
|
+
"esbuild": "^0.28.1",
|
|
90
|
+
"fast-glob": "^3.3.3",
|
|
91
|
+
"js-yaml": "^5.2.2",
|
|
92
|
+
"pathe": "latest",
|
|
93
|
+
"quickjs-emscripten": "^0.32.0",
|
|
94
|
+
"z3-solver": "^5.0.0"
|
|
95
|
+
},
|
|
96
|
+
"devDependencies": {
|
|
97
|
+
"@types/node": "^22.15.3",
|
|
98
|
+
"typescript": "^5.8.3",
|
|
99
|
+
"vitepress": "^1.6.4",
|
|
100
|
+
"vitest": "^3.2.4",
|
|
101
|
+
"vue": "^3.5.40"
|
|
102
|
+
},
|
|
103
|
+
"engines": {
|
|
104
|
+
"node": ">=20.0.0"
|
|
105
|
+
},
|
|
106
|
+
"license": "MIT",
|
|
107
|
+
"directories": {
|
|
108
|
+
"doc": "docs",
|
|
109
|
+
"test": "tests"
|
|
110
|
+
},
|
|
111
|
+
"author": "DreamLongYT"
|
|
112
|
+
}
|