yuku-analyzer 0.5.37 → 0.5.39
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/README.md +10 -10
- package/analyzer.js +46 -50
- package/decode.js +4 -0
- package/engine.js +1 -8
- package/index.d.ts +5 -2
- package/module.js +5 -23
- package/package.json +14 -14
package/README.md
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
# yuku-analyzer
|
|
2
2
|
|
|
3
|
-
Full semantic analysis for JavaScript and TypeScript: scopes, symbols, resolved references, closures, and cross-file module linking. Powered by [Yuku](https://github.com/yuku-toolchain/yuku)
|
|
3
|
+
Full semantic analysis for JavaScript and TypeScript: scopes, symbols, resolved references, closures, and cross-file module linking, computed natively in Zig and queried as plain JavaScript objects. Powered by [Yuku](https://github.com/yuku-toolchain/yuku).
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
**No single library gives you all of this.** Scopes and resolved references mean `eslint-scope` or `@typescript-eslint/scope-manager`. Cross-file go-to-definition means the TypeScript compiler or `ts-morph`. A parser sits under both. `yuku-analyzer` is all of them in one native pass behind one API.
|
|
6
|
+
|
|
7
|
+
**At native speed.** Up to ~15× faster per file than `eslint-scope`, `@typescript-eslint/scope-manager`, and `@babel/traverse`, with zero per-query cost after the single native call. Stitch those separate tools together yourself and the gap only widens: each re-walks the AST, you re-parse to resolve across files, and you keep the indexes between them in sync by hand. `yuku-analyzer` pays all of that once, in Zig.
|
|
6
8
|
|
|
7
9
|
```bash
|
|
8
|
-
npm install yuku-analyzer
|
|
10
|
+
npm install yuku-analyzer
|
|
9
11
|
```
|
|
10
12
|
|
|
11
|
-
`yuku-parser` is a peer dependency.
|
|
12
|
-
|
|
13
13
|
## Quick start
|
|
14
14
|
|
|
15
15
|
```js
|
|
@@ -35,9 +35,7 @@ console.log(def.module.path); // "lib.ts"
|
|
|
35
35
|
console.log(def.symbol.has(SymbolFlags.Const)); // true
|
|
36
36
|
```
|
|
37
37
|
|
|
38
|
-
##
|
|
39
|
-
|
|
40
|
-
JavaScript tooling that needs real semantics has had two options: track scopes by hand during a walk (fragile, incomplete, and re-implemented in every tool), or embed a full language service (heavy). `yuku-analyzer` is the missing middle: the exact scope and binding model of a production compiler, exposed to JavaScript as a small, fast object graph.
|
|
38
|
+
## How it works
|
|
41
39
|
|
|
42
40
|
Nothing semantic is reimplemented in JavaScript. The binder, scope tree, reference resolution, and module records are computed by the same well-tested native analyzer that powers the rest of Yuku, then shipped to JavaScript as one compact buffer that the JS side only decodes, through lazy zero-copy views. That handoff is usually where native tooling stalls: either every query pays an FFI round trip, or the semantics get a hand-written JS twin that slowly drifts. Here there is one implementation and one crossing, so it cannot drift, and the corner cases arrive already correct: catch-clause scope sharing, named function expression scopes, `var` hoist targets, TS declaration merging, value space versus type space, and write detection through destructuring patterns.
|
|
43
41
|
|
|
@@ -117,7 +115,9 @@ module.dependents; // modules that import this file
|
|
|
117
115
|
analyzer.diagnostics; // e.g. "Module './lib.ts' has no export 'helpr'"
|
|
118
116
|
```
|
|
119
117
|
|
|
120
|
-
Linking is automatic: every cross-file surface relinks on demand after files change. Call `analyzer.link()` explicitly if you want to control when the work happens.
|
|
118
|
+
Linking is automatic: every cross-file surface relinks on demand after files change. Re-adding a path replaces its module with a new object and relinks, and removing it relinks too. Call `analyzer.link()` explicitly if you want to control when the work happens.
|
|
119
|
+
|
|
120
|
+
Module records and linking model ECMAScript and TypeScript module syntax, so CommonJS `require` and `module.exports` are ordinary code rather than records and take no part in linking. Per-file scopes, symbols, and references are still computed for CommonJS sources.
|
|
121
121
|
|
|
122
122
|
Module resolution is pluggable. The default resolves relative specifiers among added files with standard extension and index probing. Pass your own resolver for anything else:
|
|
123
123
|
|
|
@@ -135,7 +135,7 @@ Concretely, on an Apple M-series machine: parsing plus complete semantic analysi
|
|
|
135
135
|
|
|
136
136
|
## TypeScript
|
|
137
137
|
|
|
138
|
-
Everything is fully typed. Visitor handlers receive exact node types,
|
|
138
|
+
Everything is fully typed. Visitor handlers receive exact node types, and the semantic surface (`Module`, `Scope`, `Symbol`, `Reference`, `Import`, `Export`, `Capture`) is exported:
|
|
139
139
|
|
|
140
140
|
```ts
|
|
141
141
|
import type { Module, Symbol, Capture } from "yuku-analyzer";
|
package/analyzer.js
CHANGED
|
@@ -2,9 +2,7 @@ import { Module, SymbolFlags } from "./module.js";
|
|
|
2
2
|
|
|
3
3
|
const RESOLVE_EXTENSIONS = [".tsx", ".ts", ".jsx", ".js", ".mts", ".mjs", ".cts", ".cjs"];
|
|
4
4
|
|
|
5
|
-
//
|
|
6
|
-
// than one `export *` declaration supplies the name through different
|
|
7
|
-
// bindings. distinct from null (not found / circular).
|
|
5
|
+
// name supplied ambiguously by multiple export * (ResolveExport, 16.2.1.7.2.2)
|
|
8
6
|
const AMBIGUOUS = Symbol("ambiguous");
|
|
9
7
|
|
|
10
8
|
export class Analyzer {
|
|
@@ -13,6 +11,10 @@ export class Analyzer {
|
|
|
13
11
|
#diagnostics = [];
|
|
14
12
|
#dirty = false;
|
|
15
13
|
#linking = false;
|
|
14
|
+
// origin defining symbol -> importing local symbols that resolve to it,
|
|
15
|
+
// across every module. built once per link so referencesOf is a lookup
|
|
16
|
+
// rather than a per-call walk over every import in the graph.
|
|
17
|
+
#importersByOrigin = new Map();
|
|
16
18
|
|
|
17
19
|
constructor(options = {}) {
|
|
18
20
|
this.#resolve = options.resolve ?? defaultResolve(this.#modules);
|
|
@@ -44,10 +46,7 @@ export class Analyzer {
|
|
|
44
46
|
return this.#diagnostics;
|
|
45
47
|
}
|
|
46
48
|
|
|
47
|
-
//
|
|
48
|
-
// added module, wires the dependency graph, and reports binding
|
|
49
|
-
// validation failures as diagnostics rather than throwing. unresolvable
|
|
50
|
-
// specifiers are skipped so a partial graph still links.
|
|
49
|
+
// static spec linking, reports failures as diagnostics rather than throwing
|
|
51
50
|
link() {
|
|
52
51
|
this.#dirty = false;
|
|
53
52
|
this.#linking = true;
|
|
@@ -74,18 +73,40 @@ export class Analyzer {
|
|
|
74
73
|
record._resolved = this.#resolveModule(record.specifier, module, false);
|
|
75
74
|
if (record._resolved === null) continue;
|
|
76
75
|
this.#wire(module, record._resolved);
|
|
77
|
-
//
|
|
78
|
-
// `export *` conflicts are deferred to use sites, per spec
|
|
76
|
+
// export * as ns resolves trivially, bare export * conflicts deferred to use sites
|
|
79
77
|
if (record.fromName !== null) {
|
|
80
78
|
this.#validate(module, record, record.fromName, "Re-export");
|
|
81
79
|
}
|
|
82
80
|
}
|
|
83
81
|
}
|
|
82
|
+
this.#indexImporters();
|
|
84
83
|
this.#linking = false;
|
|
85
84
|
}
|
|
86
85
|
|
|
87
|
-
//
|
|
88
|
-
//
|
|
86
|
+
// buckets every importing local under the origin symbol it resolves to,
|
|
87
|
+
// computing each definitionOf once. referencesOf then reads the bucket
|
|
88
|
+
// instead of re-walking the whole import graph on every call.
|
|
89
|
+
#indexImporters() {
|
|
90
|
+
this.#importersByOrigin = new Map();
|
|
91
|
+
for (const module of this.#modules.values()) {
|
|
92
|
+
for (const record of module.imports) {
|
|
93
|
+
const local = record.local;
|
|
94
|
+
if (local === null) continue;
|
|
95
|
+
const definition = this.definitionOf(local);
|
|
96
|
+
// a symbol object is unique to its (module, id), so the origin
|
|
97
|
+
// symbol alone keys the bucket; the module is implied.
|
|
98
|
+
if (definition === null || definition.symbol === null) continue;
|
|
99
|
+
let importers = this.#importersByOrigin.get(definition.symbol);
|
|
100
|
+
if (importers === undefined) {
|
|
101
|
+
importers = [];
|
|
102
|
+
this.#importersByOrigin.set(definition.symbol, importers);
|
|
103
|
+
}
|
|
104
|
+
importers.push(local);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// report a record whose name fails to resolve or resolves ambiguously
|
|
89
110
|
#validate(module, record, name, what) {
|
|
90
111
|
const resolution = this.#resolveExport(record._resolved, name, []);
|
|
91
112
|
if (resolution !== null && resolution !== AMBIGUOUS) return;
|
|
@@ -102,10 +123,7 @@ export class Analyzer {
|
|
|
102
123
|
});
|
|
103
124
|
}
|
|
104
125
|
|
|
105
|
-
//
|
|
106
|
-
// ResolveExport (InitializeEnvironment step 7.c). namespace
|
|
107
|
-
// resolutions yield { module, symbol: null }; unresolved or ambiguous
|
|
108
|
-
// chains yield null.
|
|
126
|
+
// follow an import binding to its defining module and symbol (ResolveExport, InitializeEnvironment 7.c)
|
|
109
127
|
definitionOf(symbol) {
|
|
110
128
|
this._ensureLinked();
|
|
111
129
|
let module = symbol.module;
|
|
@@ -138,19 +156,14 @@ export class Analyzer {
|
|
|
138
156
|
for (const reference of origin.symbol.references) {
|
|
139
157
|
out.push({ module: origin.module, reference });
|
|
140
158
|
}
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
for (const
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
if (
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
definition.module === origin.module
|
|
150
|
-
) {
|
|
151
|
-
for (const reference of record.local.references) {
|
|
152
|
-
out.push({ module, reference });
|
|
153
|
-
}
|
|
159
|
+
const importers = this.#importersByOrigin.get(origin.symbol);
|
|
160
|
+
if (importers !== undefined) {
|
|
161
|
+
for (const local of importers) {
|
|
162
|
+
// a self-import resolving back to the origin module is already
|
|
163
|
+
// covered by the direct references above
|
|
164
|
+
if (local.module === origin.module) continue;
|
|
165
|
+
for (const reference of local.references) {
|
|
166
|
+
out.push({ module: local.module, reference });
|
|
154
167
|
}
|
|
155
168
|
}
|
|
156
169
|
}
|
|
@@ -185,21 +198,8 @@ export class Analyzer {
|
|
|
185
198
|
if (!to._dependents.includes(from)) to._dependents.push(from);
|
|
186
199
|
}
|
|
187
200
|
|
|
188
|
-
// ResolveExport
|
|
189
|
-
// name to the binding that defines it, following named re-export and
|
|
190
|
-
// `export *` chains. returns { module, symbol, namespace } (the
|
|
191
|
-
// spec's ResolvedBinding, with namespace: true for its namespace
|
|
192
|
-
// [[BindingName]]), null when unresolvable or circular, or AMBIGUOUS.
|
|
193
|
-
//
|
|
194
|
-
// local and indirect entries live in one name-keyed map (_exportMap);
|
|
195
|
-
// duplicate export names are an early error, so the spec's step 5/6
|
|
196
|
-
// partition cannot change the outcome. ParseModule step 10.a.ii
|
|
197
|
-
// (rewriting an export of an imported binding through its original
|
|
198
|
-
// module) is applied at resolution time instead of collection time.
|
|
201
|
+
// ResolveExport, 16.2.1.7.2.2
|
|
199
202
|
#resolveExport(module, exportName, resolveSet) {
|
|
200
|
-
// step 3: a repeated (module, exportName) pair is a circular import
|
|
201
|
-
// request. the pair key still permits re-entering a module for a
|
|
202
|
-
// different name, which renaming re-export chains legitimately do.
|
|
203
203
|
for (const entry of resolveSet) {
|
|
204
204
|
if (entry.module === module && entry.exportName === exportName) return null;
|
|
205
205
|
}
|
|
@@ -210,8 +210,7 @@ export class Analyzer {
|
|
|
210
210
|
if (direct.specifier === null) {
|
|
211
211
|
const local = direct.local;
|
|
212
212
|
if (local !== null && (local.flags & SymbolFlags.Import) !== 0) {
|
|
213
|
-
// export of an imported binding
|
|
214
|
-
// module (the ParseModule rewrite)
|
|
213
|
+
// export of an imported binding resolves through the original module (ParseModule 10.a.ii)
|
|
215
214
|
const record = module._importOfSymbol(local.id);
|
|
216
215
|
if (record !== undefined) {
|
|
217
216
|
const imported =
|
|
@@ -221,22 +220,19 @@ export class Analyzer {
|
|
|
221
220
|
return this.#resolveExport(imported, record.name, resolveSet);
|
|
222
221
|
}
|
|
223
222
|
}
|
|
224
|
-
// step 5: the module provides the direct binding
|
|
225
223
|
return { module, symbol: local, namespace: false };
|
|
226
224
|
}
|
|
227
225
|
const next = direct._resolved ?? this.#resolveModule(direct.specifier, module, true);
|
|
228
226
|
if (next === null) return null;
|
|
229
|
-
//
|
|
230
|
-
// follow the chain under the source name
|
|
227
|
+
// namespace re-export binds the namespace, named ones follow the chain
|
|
231
228
|
if (direct.isNamespaceReexport) return { module: next, symbol: null, namespace: true };
|
|
232
229
|
return this.#resolveExport(next, direct.fromName, resolveSet);
|
|
233
230
|
}
|
|
234
231
|
|
|
235
|
-
//
|
|
232
|
+
// default never crosses export *
|
|
236
233
|
if (exportName === "default") return null;
|
|
237
234
|
|
|
238
|
-
//
|
|
239
|
-
// ambiguous
|
|
235
|
+
// identical star bindings collapse, otherwise ambiguous
|
|
240
236
|
let starResolution = null;
|
|
241
237
|
for (const star of module._starExports()) {
|
|
242
238
|
const next = star._resolved ?? this.#resolveModule(star.specifier, module, true);
|
package/decode.js
CHANGED
|
@@ -1275,6 +1275,8 @@ function decode(buffer, source) {
|
|
|
1275
1275
|
}
|
|
1276
1276
|
}
|
|
1277
1277
|
let o = ((dp + 3) & ~3) >> 2;
|
|
1278
|
+
if (o + 8 > _u32.length)
|
|
1279
|
+
throw new RangeError("yuku-analyzer: truncated semantic sub-header");
|
|
1278
1280
|
const scopeCount = _u32[o], symbolCount = _u32[o + 1],
|
|
1279
1281
|
referenceCount = _u32[o + 2], declNodeCount = _u32[o + 3],
|
|
1280
1282
|
importCount = _u32[o + 4], exportCount = _u32[o + 5],
|
|
@@ -1294,6 +1296,8 @@ function decode(buffer, source) {
|
|
|
1294
1296
|
o += exportCount * 10;
|
|
1295
1297
|
const nodeScopes = _u32.subarray(o, o + nodeScopeCount);
|
|
1296
1298
|
o += nodeScopeCount;
|
|
1299
|
+
if (o > _u32.length)
|
|
1300
|
+
throw new RangeError("yuku-analyzer: truncated semantic sections");
|
|
1297
1301
|
const _id = (v) => v === NULL ? null : v;
|
|
1298
1302
|
return (_semView = {
|
|
1299
1303
|
scope: {
|
package/engine.js
CHANGED
|
@@ -55,8 +55,7 @@ export class WalkContext {
|
|
|
55
55
|
this._removed = true;
|
|
56
56
|
}
|
|
57
57
|
insertBefore(node) {
|
|
58
|
-
// advance past the insert so the current node keeps its turn
|
|
59
|
-
// new sibling is not visited
|
|
58
|
+
// advance past the insert so the current node keeps its turn
|
|
60
59
|
this.#insert(node, 0);
|
|
61
60
|
this._frame.i++;
|
|
62
61
|
}
|
|
@@ -86,10 +85,6 @@ function createDispatch(visitors) {
|
|
|
86
85
|
return { enter, leave, typed: (type) => concrete.get(type) };
|
|
87
86
|
}
|
|
88
87
|
|
|
89
|
-
/**
|
|
90
|
-
* Walk an AST depth-first, dispatching to typed visitors and mutating
|
|
91
|
-
* in place. Returns the root.
|
|
92
|
-
*/
|
|
93
88
|
export function walk(root, visitors, state) {
|
|
94
89
|
_walk(root, visitors, state, new WalkContext());
|
|
95
90
|
return root;
|
|
@@ -107,8 +102,6 @@ export function _walk(root, visitors, state, ctx) {
|
|
|
107
102
|
ctx._frame = frame;
|
|
108
103
|
}
|
|
109
104
|
|
|
110
|
-
// swaps the current node in its parent slot and continues the walk on
|
|
111
|
-
// the replacement
|
|
112
105
|
function applyReplace(parent, key, list, frame) {
|
|
113
106
|
const next = ctx._replacement;
|
|
114
107
|
ctx._replacement = null;
|
package/index.d.ts
CHANGED
|
@@ -388,7 +388,10 @@ interface Module {
|
|
|
388
388
|
symbolOf(node: Node): Symbol | null;
|
|
389
389
|
/** The reference recorded for an identifier node, or null. */
|
|
390
390
|
referenceOf(node: Node): Reference | null;
|
|
391
|
-
/**
|
|
391
|
+
/**
|
|
392
|
+
* The innermost scope whose extent contains `node`, or the module's
|
|
393
|
+
* root scope for a node not produced by this module's analysis.
|
|
394
|
+
*/
|
|
392
395
|
scopeOf(node: Node): Scope;
|
|
393
396
|
/**
|
|
394
397
|
* The node that structurally contains `node`. Null at the program
|
|
@@ -432,7 +435,7 @@ interface Module {
|
|
|
432
435
|
|
|
433
436
|
/** Collects every node of the given type(s), in source order. */
|
|
434
437
|
findAll<K extends NodeType>(type: K): NodeOfType<K>[];
|
|
435
|
-
findAll<K extends NodeType>(types:
|
|
438
|
+
findAll<K extends NodeType>(types: Iterable<K>): NodeOfType<K>[];
|
|
436
439
|
|
|
437
440
|
/** Import records, in source order. */
|
|
438
441
|
readonly imports: Import[];
|
package/module.js
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
//
|
|
2
|
-
// export object graph, built lazily over the decoded analyzer buffer.
|
|
3
|
-
|
|
1
|
+
// one analyzed file, its AST plus a lazily built semantic graph
|
|
4
2
|
import binding from "./binding.js";
|
|
5
3
|
import { decode, SymbolFlags } from "./decode.js";
|
|
6
4
|
import { walkModule } from "./walk.js";
|
|
@@ -316,8 +314,7 @@ export class Module {
|
|
|
316
314
|
return this.scopes[this.#sem.nodeScope(index)];
|
|
317
315
|
}
|
|
318
316
|
|
|
319
|
-
//
|
|
320
|
-
// root or for a node not part of this module's AST.
|
|
317
|
+
// structural parent, or null at the root or for a foreign node
|
|
321
318
|
parentOf(node) {
|
|
322
319
|
const index = this.#r.indexOf(node);
|
|
323
320
|
if (index === undefined) return null;
|
|
@@ -333,11 +330,7 @@ export class Module {
|
|
|
333
330
|
return null;
|
|
334
331
|
}
|
|
335
332
|
|
|
336
|
-
// GetExportedNames
|
|
337
|
-
// directly or through `export *` chains. ambiguous star names are not
|
|
338
|
-
// filtered (spec note), "default" never crosses a star boundary, and
|
|
339
|
-
// circular `export *` terminates via exportStarSet. TS `export =` /
|
|
340
|
-
// `export as namespace` are not ESM export names and do not appear.
|
|
333
|
+
// GetExportedNames, 16.2.1.7.2.1
|
|
341
334
|
exportedNames(exportStarSet = new Set()) {
|
|
342
335
|
if (exportStarSet.has(this)) return [];
|
|
343
336
|
exportStarSet.add(this);
|
|
@@ -352,14 +345,7 @@ export class Module {
|
|
|
352
345
|
return [...names];
|
|
353
346
|
}
|
|
354
347
|
|
|
355
|
-
//
|
|
356
|
-
// `fn` (nested functions included, value positions only) that is
|
|
357
|
-
// declared outside its scope subtree, deduplicated by symbol with
|
|
358
|
-
// `isWritten` OR-ed across the references. only bindings count.
|
|
359
|
-
// `this`, `arguments`, and unresolved/global names carry no symbol
|
|
360
|
-
// and never appear. module-scope and import bindings count like any
|
|
361
|
-
// other outer binding. computed method keys evaluate in the enclosing
|
|
362
|
-
// scope, outside the function node's span, so they are not captures.
|
|
348
|
+
// outer bindings a function closes over, deduped by symbol
|
|
363
349
|
capturesOf(fn) {
|
|
364
350
|
const index = this.#r.indexOf(fn);
|
|
365
351
|
if (index === undefined) {
|
|
@@ -447,11 +433,7 @@ export class Module {
|
|
|
447
433
|
return this.#symbolReferences[symbolId];
|
|
448
434
|
}
|
|
449
435
|
|
|
450
|
-
//
|
|
451
|
-
// name-keyed map of the local + indirect entries and the star-entry
|
|
452
|
-
// list (`export *` only). name-less records (`export *`, TS
|
|
453
|
-
// `export =` / `export as namespace`) stay out of the map. duplicate
|
|
454
|
-
// names are an early error; in recovery trees the first record wins.
|
|
436
|
+
// export-entry partition (ParseModule, 16.2.1.7.1)
|
|
455
437
|
_exportMap() {
|
|
456
438
|
if (this.#exportMap === null) {
|
|
457
439
|
const map = new Map();
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "yuku-analyzer",
|
|
3
|
-
"version": "0.5.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.5.39",
|
|
4
|
+
"description": "Full JavaScript and TypeScript semantic analysis: scopes, symbols, resolved references, closures, and cross-file module linking, computed natively in Zig and queried as plain JavaScript objects",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
@@ -21,17 +21,17 @@
|
|
|
21
21
|
"decode.js"
|
|
22
22
|
],
|
|
23
23
|
"optionalDependencies": {
|
|
24
|
-
"@yuku-analyzer/binding-linux-x64-gnu": "0.5.
|
|
25
|
-
"@yuku-analyzer/binding-linux-arm64-gnu": "0.5.
|
|
26
|
-
"@yuku-analyzer/binding-linux-arm-gnu": "0.5.
|
|
27
|
-
"@yuku-analyzer/binding-linux-x64-musl": "0.5.
|
|
28
|
-
"@yuku-analyzer/binding-linux-arm64-musl": "0.5.
|
|
29
|
-
"@yuku-analyzer/binding-linux-arm-musl": "0.5.
|
|
30
|
-
"@yuku-analyzer/binding-darwin-x64": "0.5.
|
|
31
|
-
"@yuku-analyzer/binding-darwin-arm64": "0.5.
|
|
32
|
-
"@yuku-analyzer/binding-win32-x64": "0.5.
|
|
33
|
-
"@yuku-analyzer/binding-win32-arm64": "0.5.
|
|
34
|
-
"@yuku-analyzer/binding-freebsd-x64": "0.5.
|
|
24
|
+
"@yuku-analyzer/binding-linux-x64-gnu": "0.5.39",
|
|
25
|
+
"@yuku-analyzer/binding-linux-arm64-gnu": "0.5.39",
|
|
26
|
+
"@yuku-analyzer/binding-linux-arm-gnu": "0.5.39",
|
|
27
|
+
"@yuku-analyzer/binding-linux-x64-musl": "0.5.39",
|
|
28
|
+
"@yuku-analyzer/binding-linux-arm64-musl": "0.5.39",
|
|
29
|
+
"@yuku-analyzer/binding-linux-arm-musl": "0.5.39",
|
|
30
|
+
"@yuku-analyzer/binding-darwin-x64": "0.5.39",
|
|
31
|
+
"@yuku-analyzer/binding-darwin-arm64": "0.5.39",
|
|
32
|
+
"@yuku-analyzer/binding-win32-x64": "0.5.39",
|
|
33
|
+
"@yuku-analyzer/binding-win32-arm64": "0.5.39",
|
|
34
|
+
"@yuku-analyzer/binding-freebsd-x64": "0.5.39"
|
|
35
35
|
},
|
|
36
36
|
"keywords": [
|
|
37
37
|
"analyzer",
|
|
@@ -49,6 +49,6 @@
|
|
|
49
49
|
"typescript"
|
|
50
50
|
],
|
|
51
51
|
"dependencies": {
|
|
52
|
-
"@yuku-toolchain/types": "0.5.
|
|
52
|
+
"@yuku-toolchain/types": "0.5.37"
|
|
53
53
|
}
|
|
54
54
|
}
|