node-opcua-convert-nodeset-to-javascript 2.170.1 → 2.172.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/dist/convert_namespace_to_typescript.js +24 -7
- package/dist/convert_namespace_to_typescript.js.map +1 -1
- package/dist/main.js +37 -6
- package/dist/main.js.map +1 -1
- package/dist/remove_unused.js +199 -34
- package/dist/remove_unused.js.map +1 -1
- package/package.json +14 -14
- package/source/convert_namespace_to_typescript.ts +23 -12
- package/source/main.ts +41 -7
- package/source/remove_unused.ts +208 -40
|
@@ -11,6 +11,26 @@ const node_opcua_constants_1 = require("node-opcua-constants");
|
|
|
11
11
|
const walk_through_1 = require("./walk_through");
|
|
12
12
|
const convert_to_typescript_1 = require("./convert_to_typescript");
|
|
13
13
|
const cache_1 = require("./private/cache");
|
|
14
|
+
// Robust write: on Windows, transient locks from antivirus, OneDrive, or the
|
|
15
|
+
// TS language server (when files are open in an IDE) surface as ERROR_SHARING_VIOLATION
|
|
16
|
+
// (errno -4094 / code UNKNOWN/EBUSY/EPERM). Retry with backoff.
|
|
17
|
+
function writeFileSyncRetry(filePath, content, attempts = 6) {
|
|
18
|
+
for (let i = 0; i < attempts; i++) {
|
|
19
|
+
try {
|
|
20
|
+
fs_1.default.writeFileSync(filePath, content);
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
catch (err) {
|
|
24
|
+
const code = err.code;
|
|
25
|
+
const transient = code === "UNKNOWN" || code === "EBUSY" || code === "EPERM";
|
|
26
|
+
if (!transient || i === attempts - 1)
|
|
27
|
+
throw err;
|
|
28
|
+
// Synchronous backoff (tight loop is fine for ~ms-scale retries).
|
|
29
|
+
const until = Date.now() + 50 * (i + 1);
|
|
30
|
+
while (Date.now() < until) { /* spin */ }
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
14
34
|
function getPackageFolder(dependency, options) {
|
|
15
35
|
const l = [...(options.lookupFolders || [])];
|
|
16
36
|
l.push(path_1.default.join(__dirname, "../../"));
|
|
@@ -77,7 +97,7 @@ async function convertNamespaceTypeToTypescript(session, namespaceIndex, options
|
|
|
77
97
|
if (!fs_1.default.existsSync(sourceFolder)) {
|
|
78
98
|
fs_1.default.mkdirSync(sourceFolder);
|
|
79
99
|
}
|
|
80
|
-
|
|
100
|
+
writeFileSyncRetry(path_1.default.join(sourceFolder, filename + ".ts"), content);
|
|
81
101
|
infos[module] = infos[module] || { folder, dependencies: [], module, files: [] };
|
|
82
102
|
infos[module].files.push(filename + ".ts");
|
|
83
103
|
infos[module].dependencies = [...new Set([...infos[module].dependencies, ...dependencies])];
|
|
@@ -222,10 +242,6 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
222
242
|
// content3.push(fs.readFileSync(path.join(__dirname, "../source/licences/agpl_v3.md"), "utf8"));
|
|
223
243
|
fs_1.default.writeFileSync(licenseFile, content3.join("\n"));
|
|
224
244
|
}
|
|
225
|
-
const remove_unused_1 = require("./remove_unused");
|
|
226
|
-
function _tidyUpImports(folder) {
|
|
227
|
-
(0, remove_unused_1.cleanUpTypescriptModule)(folder);
|
|
228
|
-
}
|
|
229
245
|
async function outputFiles(infos, options) {
|
|
230
246
|
const values = Object.values(infos);
|
|
231
247
|
if (values.length < 1) {
|
|
@@ -233,12 +249,13 @@ async function outputFiles(infos, options) {
|
|
|
233
249
|
}
|
|
234
250
|
console.log("generating files for ", options.nsName);
|
|
235
251
|
for (const info of values) {
|
|
236
|
-
// create indexes
|
|
237
252
|
await _output_index_ts_file(info);
|
|
238
253
|
await _output_package_json(info, options);
|
|
239
254
|
await _output_tsconfig_json(info, options);
|
|
240
255
|
await _output_licence(info, options);
|
|
241
|
-
await _tidyUpImports(info.folder);
|
|
242
256
|
}
|
|
257
|
+
// Import cleanup is deferred to a second, parallel phase in main.ts —
|
|
258
|
+
// each namespace's cleanup uses an isolated ts-morph Project, so the
|
|
259
|
+
// expensive AST work can run across many cores without contention.
|
|
243
260
|
}
|
|
244
261
|
//# sourceMappingURL=convert_namespace_to_typescript.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"convert_namespace_to_typescript.js","sourceRoot":"","sources":["../source/convert_namespace_to_typescript.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"convert_namespace_to_typescript.js","sourceRoot":"","sources":["../source/convert_namespace_to_typescript.ts"],"names":[],"mappings":"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"}
|
package/dist/main.js
CHANGED
|
@@ -3,33 +3,64 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const
|
|
6
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
7
|
+
const node_os_1 = __importDefault(require("node:os"));
|
|
8
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
7
9
|
const node_opcua_address_space_1 = require("node-opcua-address-space");
|
|
8
10
|
const nodeJS_1 = require("node-opcua-address-space/nodeJS");
|
|
9
11
|
const node_opcua_nodesets_1 = require("node-opcua-nodesets");
|
|
10
12
|
const convert_namespace_to_typescript_1 = require("./convert_namespace_to_typescript");
|
|
13
|
+
const remove_unused_1 = require("./remove_unused");
|
|
11
14
|
const update_parent_tsconfig_1 = require("./update_parent_tsconfig");
|
|
15
|
+
async function runWithConcurrency(items, limit, fn) {
|
|
16
|
+
let cursor = 0;
|
|
17
|
+
const workers = Array.from({ length: limit }, async () => {
|
|
18
|
+
while (true) {
|
|
19
|
+
const idx = cursor++;
|
|
20
|
+
if (idx >= items.length)
|
|
21
|
+
return;
|
|
22
|
+
await fn(items[idx]);
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
await Promise.all(workers);
|
|
26
|
+
}
|
|
12
27
|
async function main() {
|
|
13
28
|
const addressSpace = node_opcua_address_space_1.AddressSpace.create();
|
|
14
29
|
const xmlFiles = node_opcua_nodesets_1.nodesetCatalog.map((set) => (0, node_opcua_nodesets_1.constructNodesetFilename)(set.xmlFile));
|
|
15
30
|
await (0, nodeJS_1.generateAddressSpace)(addressSpace, xmlFiles);
|
|
16
31
|
const session = new node_opcua_address_space_1.PseudoSession(addressSpace);
|
|
17
32
|
const options = {
|
|
18
|
-
baseFolder:
|
|
33
|
+
baseFolder: node_path_1.default.join(__dirname, "../../"),
|
|
19
34
|
prefix: "node-opcua-nodeset-",
|
|
20
35
|
};
|
|
21
36
|
// const nodesetCatalog2 = nodesetCatalog.filter((meta) => meta.name == "scales");
|
|
22
|
-
|
|
37
|
+
// Phase 1: convert each namespace sequentially.
|
|
38
|
+
// The convert step writes type files into whichever package the type
|
|
39
|
+
// *originates* in, not the namespace being processed. Two namespaces
|
|
40
|
+
// running in parallel will both try to write e.g. node-opcua-nodeset-ua
|
|
41
|
+
// files concurrently, causing Windows ERROR_SHARING_VIOLATION.
|
|
42
|
+
for (const meta of node_opcua_nodesets_1.nodesetCatalog) {
|
|
23
43
|
const index = addressSpace.getNamespaceIndex(meta.uri);
|
|
24
44
|
if (index === -1) {
|
|
25
45
|
console.log("namespace not found", meta.uri);
|
|
26
|
-
|
|
46
|
+
continue;
|
|
27
47
|
}
|
|
28
|
-
|
|
48
|
+
await (0, convert_namespace_to_typescript_1.convertNamespaceTypeToTypescript)(session, index, {
|
|
29
49
|
...options,
|
|
30
50
|
nsName: meta.name,
|
|
31
51
|
});
|
|
32
|
-
}
|
|
52
|
+
}
|
|
53
|
+
// Phase 2: clean up imports in every nodeset package that actually has a
|
|
54
|
+
// source/ folder on disk. This covers cases where a catalog entry name
|
|
55
|
+
// doesn't line up with its package folder (e.g. catalog "standard" writes
|
|
56
|
+
// into node-opcua-nodeset-ua).
|
|
57
|
+
const folders = node_fs_1.default.readdirSync(options.baseFolder)
|
|
58
|
+
.filter((name) => name.startsWith(options.prefix))
|
|
59
|
+
.map((name) => node_path_1.default.join(options.baseFolder, name))
|
|
60
|
+
.filter((p) => node_fs_1.default.existsSync(node_path_1.default.join(p, "source")));
|
|
61
|
+
const concurrency = Math.max(2, Math.min(node_os_1.default.cpus().length, 12));
|
|
62
|
+
console.log(`tidying imports across ${folders.length} packages with concurrency=${concurrency}`);
|
|
63
|
+
await runWithConcurrency(folders, concurrency, remove_unused_1.cleanUpTypescriptModule);
|
|
33
64
|
await (0, update_parent_tsconfig_1.updateParentTSConfig)();
|
|
34
65
|
}
|
|
35
66
|
void main();
|
package/dist/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../source/main.ts"],"names":[],"mappings":";;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../source/main.ts"],"names":[],"mappings":"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"}
|
package/dist/remove_unused.js
CHANGED
|
@@ -4,49 +4,199 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.cleanUpTypescriptModule = cleanUpTypescriptModule;
|
|
7
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
8
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
7
9
|
const ts_morph_1 = require("ts-morph");
|
|
8
|
-
const fs_1 = __importDefault(require("fs"));
|
|
9
|
-
const path_1 = __importDefault(require("path"));
|
|
10
10
|
const dryRun = false;
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
const NODE_BUILTINS = new Set([
|
|
12
|
+
"assert", "async_hooks", "buffer", "child_process", "cluster", "console",
|
|
13
|
+
"crypto", "dgram", "dns", "events", "fs", "http", "http2", "https", "net",
|
|
14
|
+
"os", "path", "perf_hooks", "process", "querystring", "readline", "stream",
|
|
15
|
+
"string_decoder", "tls", "tty", "url", "util", "v8", "vm", "worker_threads",
|
|
16
|
+
"zlib",
|
|
17
|
+
]);
|
|
18
|
+
function importGroup(spec) {
|
|
19
|
+
if (spec.startsWith("node:") || NODE_BUILTINS.has(spec))
|
|
20
|
+
return 0;
|
|
21
|
+
if (spec.startsWith("."))
|
|
22
|
+
return 3;
|
|
23
|
+
if (spec.startsWith("node-opcua"))
|
|
24
|
+
return 2;
|
|
25
|
+
return 1;
|
|
26
|
+
}
|
|
27
|
+
function applyTypeOnlyImports(file) {
|
|
28
|
+
// Pass 1: collect identifier names used in value (runtime) positions.
|
|
29
|
+
// Anything whose name appears only in TypeNode positions is type-only.
|
|
30
|
+
const valueNames = new Set();
|
|
31
|
+
file.forEachDescendant((node) => {
|
|
32
|
+
if (node.getKind() !== ts_morph_1.SyntaxKind.Identifier)
|
|
33
|
+
return;
|
|
34
|
+
const parent = node.getParent();
|
|
35
|
+
if (!parent)
|
|
36
|
+
return;
|
|
37
|
+
// Declaration sites are not usages.
|
|
38
|
+
if (ts_morph_1.Node.isImportSpecifier(parent))
|
|
39
|
+
return;
|
|
40
|
+
if (ts_morph_1.Node.isImportClause(parent))
|
|
41
|
+
return;
|
|
42
|
+
if (ts_morph_1.Node.isNamespaceImport(parent))
|
|
43
|
+
return;
|
|
44
|
+
// Walk past QualifiedName chains: in dotted type references like
|
|
45
|
+
// `UAProperty<UInt32, DataType.UInt32>` both `DataType` and the inner
|
|
46
|
+
// `UInt32` have a QualifiedName as their immediate parent, but the
|
|
47
|
+
// surrounding context is a TypeReference (a TypeNode).
|
|
48
|
+
let ctx = parent;
|
|
49
|
+
while (ts_morph_1.Node.isQualifiedName(ctx)) {
|
|
50
|
+
const p = ctx.getParent();
|
|
51
|
+
if (!p)
|
|
52
|
+
break;
|
|
53
|
+
ctx = p;
|
|
54
|
+
}
|
|
55
|
+
if (ts_morph_1.Node.isTypeNode(ctx))
|
|
56
|
+
return;
|
|
57
|
+
// `interface X extends Foo` — Foo's parent is ExpressionWithTypeArguments
|
|
58
|
+
// inside a HeritageClause inside an InterfaceDeclaration. Still type-only.
|
|
59
|
+
if (ts_morph_1.Node.isExpressionWithTypeArguments(ctx)) {
|
|
60
|
+
const heritage = ctx.getParent();
|
|
61
|
+
if (heritage && ts_morph_1.Node.isHeritageClause(heritage)) {
|
|
62
|
+
const decl = heritage.getParent();
|
|
63
|
+
if (decl && ts_morph_1.Node.isInterfaceDeclaration(decl))
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
valueNames.add(node.getText());
|
|
68
|
+
});
|
|
69
|
+
// Pass 2: flip type-only on import specifiers, hoist when all qualify.
|
|
13
70
|
file.getImportDeclarations().forEach((importDecl) => {
|
|
71
|
+
if (importDecl.isTypeOnly())
|
|
72
|
+
return;
|
|
14
73
|
const namedImports = importDecl.getNamedImports();
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
74
|
+
if (namedImports.length === 0)
|
|
75
|
+
return;
|
|
76
|
+
const hasDefault = !!importDecl.getDefaultImport();
|
|
77
|
+
const hasNamespace = !!importDecl.getNamespaceImport();
|
|
78
|
+
const isTypeOnly = namedImports.map((spec) => {
|
|
79
|
+
if (spec.isTypeOnly())
|
|
80
|
+
return true;
|
|
81
|
+
const localName = spec.getAliasNode()?.getText() ?? spec.getNameNode().getText();
|
|
82
|
+
return !valueNames.has(localName);
|
|
19
83
|
});
|
|
20
|
-
|
|
21
|
-
if (
|
|
22
|
-
|
|
23
|
-
importDecl.
|
|
84
|
+
const allTypeOnly = isTypeOnly.every(Boolean);
|
|
85
|
+
if (allTypeOnly && !hasDefault && !hasNamespace) {
|
|
86
|
+
// Hoist to `import type { ... }`; clear redundant per-specifier `type` keywords.
|
|
87
|
+
importDecl.setIsTypeOnly(true);
|
|
88
|
+
namedImports.forEach((spec) => {
|
|
89
|
+
if (spec.isTypeOnly())
|
|
90
|
+
spec.setIsTypeOnly(false);
|
|
91
|
+
});
|
|
24
92
|
}
|
|
25
|
-
else
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
console.log("removing name in import ", named.getText());
|
|
30
|
-
named.remove();
|
|
93
|
+
else {
|
|
94
|
+
namedImports.forEach((spec, i) => {
|
|
95
|
+
if (isTypeOnly[i] && !spec.isTypeOnly()) {
|
|
96
|
+
spec.setIsTypeOnly(true);
|
|
31
97
|
}
|
|
32
98
|
});
|
|
33
99
|
}
|
|
34
100
|
});
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
101
|
+
}
|
|
102
|
+
function regroupImports(file) {
|
|
103
|
+
const imports = file.getImportDeclarations();
|
|
104
|
+
if (imports.length === 0)
|
|
105
|
+
return;
|
|
106
|
+
const structures = imports.map((d) => d.getStructure());
|
|
107
|
+
for (const d of [...imports].reverse())
|
|
108
|
+
d.remove();
|
|
109
|
+
structures.sort((a, b) => {
|
|
110
|
+
const ga = importGroup(a.moduleSpecifier);
|
|
111
|
+
const gb = importGroup(b.moduleSpecifier);
|
|
112
|
+
if (ga !== gb)
|
|
113
|
+
return ga - gb;
|
|
114
|
+
return a.moduleSpecifier.localeCompare(b.moduleSpecifier);
|
|
115
|
+
});
|
|
116
|
+
file.insertImportDeclarations(0, structures);
|
|
117
|
+
const reinserted = file.getImportDeclarations();
|
|
118
|
+
for (let i = 1; i < reinserted.length; i++) {
|
|
119
|
+
const prevG = importGroup(reinserted[i - 1].getModuleSpecifierValue());
|
|
120
|
+
const currG = importGroup(reinserted[i].getModuleSpecifierValue());
|
|
121
|
+
if (prevG !== currG) {
|
|
122
|
+
reinserted[i].prependWhitespace("\n");
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
const BIOME_IGNORE_EMPTY_INTERFACE = "// biome-ignore lint/suspicious/noEmptyInterface: forward-compatible placeholder for OPC-UA generated types";
|
|
127
|
+
function tidyEmptyInterfaces(file) {
|
|
128
|
+
// Two complaints to resolve:
|
|
129
|
+
// 1. Formatter wants `interface X {}` on a single line, not `{\n}`.
|
|
130
|
+
// 2. suspicious/noEmptyInterface fires for `interface X {}` WITHOUT extends.
|
|
131
|
+
// For `interface X extends Y {}` the rule doesn't fire, so a directive
|
|
132
|
+
// there is reported as "unused".
|
|
133
|
+
//
|
|
134
|
+
// First pass (in reverse, since text only shrinks): collapse bodies.
|
|
135
|
+
// Then a snapshot+descending pass for the biome-ignore directives, which
|
|
136
|
+
// only target interfaces with no extends clause.
|
|
137
|
+
const ifaces = file.getInterfaces();
|
|
138
|
+
for (let i = ifaces.length - 1; i >= 0; i--) {
|
|
139
|
+
const iface = ifaces[i];
|
|
140
|
+
if (iface.getMembers().length !== 0)
|
|
141
|
+
continue;
|
|
142
|
+
const text = iface.getText();
|
|
143
|
+
const collapsed = text.replace(/\{\s*\}\s*$/, "{}");
|
|
144
|
+
if (collapsed !== text) {
|
|
145
|
+
iface.replaceWithText(collapsed);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
// Re-fetch (previous replaceWithText calls may have invalidated nodes),
|
|
149
|
+
// then snapshot positions before inserting comment lines.
|
|
150
|
+
const positions = [];
|
|
151
|
+
for (const iface of file.getInterfaces()) {
|
|
152
|
+
if (iface.getMembers().length !== 0)
|
|
153
|
+
continue;
|
|
154
|
+
// Rule only fires when there's no extends clause.
|
|
155
|
+
if (iface.getExtends().length !== 0)
|
|
156
|
+
continue;
|
|
157
|
+
const leading = iface.getLeadingCommentRanges().map((c) => c.getText()).join("\n");
|
|
158
|
+
if (leading.includes("biome-ignore lint/suspicious/noEmptyInterface"))
|
|
159
|
+
continue;
|
|
160
|
+
positions.push(iface.getStart());
|
|
161
|
+
}
|
|
162
|
+
positions.sort((a, b) => b - a);
|
|
163
|
+
for (const pos of positions) {
|
|
164
|
+
file.insertText(pos, `${BIOME_IGNORE_EMPTY_INTERFACE}\n`);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
function fixFile(file) {
|
|
168
|
+
// Sort alphabetically, dedupe, drop unused imports.
|
|
169
|
+
file.organizeImports();
|
|
170
|
+
// Mark type-only specifiers; hoist when the whole import qualifies.
|
|
171
|
+
applyTypeOnlyImports(file);
|
|
172
|
+
// Group: builtins → external → node-opcua-* → relative.
|
|
173
|
+
regroupImports(file);
|
|
174
|
+
// Collapse empty interface bodies to single-line `{}` and add a
|
|
175
|
+
// suppression directive for the ones the lint rule actually fires on.
|
|
176
|
+
tidyEmptyInterfaces(file);
|
|
177
|
+
// Remove unused local variables (function-scope or top-level).
|
|
178
|
+
// Use a single-pass identifier-name frequency map instead of ts-morph's
|
|
179
|
+
// findReferences(), which calls TS's reference finder per declaration —
|
|
180
|
+
// unreliable without dep resolution and 10–100× slower. For generated
|
|
181
|
+
// code (no fancy scoping), name count > 1 is a sufficient proxy for "used".
|
|
182
|
+
const identifierCounts = new Map();
|
|
183
|
+
file.forEachDescendant((node) => {
|
|
184
|
+
if (node.getKind() === ts_morph_1.SyntaxKind.Identifier) {
|
|
185
|
+
const txt = node.getText();
|
|
186
|
+
identifierCounts.set(txt, (identifierCounts.get(txt) || 0) + 1);
|
|
187
|
+
}
|
|
188
|
+
});
|
|
189
|
+
file.getVariableStatements().forEach((variableStatement) => {
|
|
190
|
+
variableStatement.getDeclarations().forEach((declaration) => {
|
|
38
191
|
const name = declaration.getName();
|
|
39
|
-
const
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
});
|
|
43
|
-
if (!isUsed) {
|
|
192
|
+
const count = identifierCounts.get(name) ?? 0;
|
|
193
|
+
// Count includes the declaration's own name node; >1 means referenced elsewhere.
|
|
194
|
+
if (count <= 1) {
|
|
44
195
|
console.log("removing unused variable=", name);
|
|
45
196
|
declaration.remove();
|
|
46
197
|
}
|
|
47
198
|
});
|
|
48
199
|
try {
|
|
49
|
-
// If no declarations left in this statement, remove the whole statement
|
|
50
200
|
if (variableStatement.getDeclarations().length === 0) {
|
|
51
201
|
console.log("removing variable statement:", variableStatement.getText());
|
|
52
202
|
variableStatement.remove();
|
|
@@ -56,20 +206,35 @@ function fixFile(file) {
|
|
|
56
206
|
console.log(err.message);
|
|
57
207
|
}
|
|
58
208
|
});
|
|
59
|
-
// Save changes
|
|
60
209
|
if (!dryRun) {
|
|
61
210
|
file.saveSync();
|
|
62
211
|
}
|
|
63
212
|
}
|
|
64
213
|
async function cleanUpTypescriptModule(moduleFolder) {
|
|
214
|
+
const sourceFolder = node_path_1.default.join(moduleFolder, "source");
|
|
215
|
+
// Some namespaces in the catalog don't have a dedicated module folder
|
|
216
|
+
// (their types are written into a shared package like node-opcua-nodeset-ua).
|
|
217
|
+
// Nothing to tidy here — silently skip.
|
|
218
|
+
if (!node_fs_1.default.existsSync(sourceFolder)) {
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
// Isolated project: only this module's own files, no tsconfig dependency
|
|
222
|
+
// resolution. The cleanup analysis is purely syntactic (organizeImports +
|
|
223
|
+
// type-position check via AST), so we don't need the full type checker —
|
|
224
|
+
// and skipping dep resolution lets us run many namespaces in parallel
|
|
225
|
+
// without ts-morph touching files outside this folder.
|
|
65
226
|
const project = new ts_morph_1.Project({
|
|
66
|
-
|
|
227
|
+
skipAddingFilesFromTsConfig: true,
|
|
228
|
+
skipFileDependencyResolution: true,
|
|
229
|
+
skipLoadingLibFiles: true,
|
|
67
230
|
});
|
|
68
|
-
const
|
|
69
|
-
const
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
231
|
+
const dirFiles = await node_fs_1.default.promises.readdir(sourceFolder);
|
|
232
|
+
for (const f of dirFiles) {
|
|
233
|
+
const fullPath = node_path_1.default.join(sourceFolder, f);
|
|
234
|
+
project.addSourceFileAtPath(fullPath);
|
|
235
|
+
}
|
|
236
|
+
for (const f of dirFiles) {
|
|
237
|
+
const fullPath = node_path_1.default.join(sourceFolder, f);
|
|
73
238
|
const sourceFile = project.getSourceFileOrThrow(fullPath);
|
|
74
239
|
fixFile(sourceFile);
|
|
75
240
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remove_unused.js","sourceRoot":"","sources":["../source/remove_unused.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"remove_unused.js","sourceRoot":"","sources":["../source/remove_unused.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "node-opcua-convert-nodeset-to-javascript",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.172.0",
|
|
4
4
|
"description": "pure nodejs OPCUA SDK - module convert-nodeset-to-javascript",
|
|
5
5
|
"types": "dist/index.d.ts",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -16,26 +16,26 @@
|
|
|
16
16
|
"dependencies": {
|
|
17
17
|
"case-anything": "1.1.5",
|
|
18
18
|
"chalk": "4.1.2",
|
|
19
|
-
"node-opcua-address-space": "2.
|
|
20
|
-
"node-opcua-address-space-base": "2.
|
|
19
|
+
"node-opcua-address-space": "2.172.0",
|
|
20
|
+
"node-opcua-address-space-base": "2.172.0",
|
|
21
21
|
"node-opcua-assert": "2.164.0",
|
|
22
22
|
"node-opcua-constants": "2.157.0",
|
|
23
|
-
"node-opcua-data-model": "2.
|
|
24
|
-
"node-opcua-debug": "2.
|
|
25
|
-
"node-opcua-nodeid": "2.
|
|
23
|
+
"node-opcua-data-model": "2.172.0",
|
|
24
|
+
"node-opcua-debug": "2.172.0",
|
|
25
|
+
"node-opcua-nodeid": "2.172.0",
|
|
26
26
|
"node-opcua-nodesets": "2.163.1",
|
|
27
|
-
"node-opcua-pseudo-session": "2.
|
|
28
|
-
"node-opcua-types": "2.
|
|
29
|
-
"node-opcua-utils": "2.
|
|
30
|
-
"node-opcua-variant": "2.
|
|
27
|
+
"node-opcua-pseudo-session": "2.172.0",
|
|
28
|
+
"node-opcua-types": "2.172.0",
|
|
29
|
+
"node-opcua-utils": "2.172.0",
|
|
30
|
+
"node-opcua-variant": "2.172.0",
|
|
31
31
|
"ts-morph": "28.0.0",
|
|
32
32
|
"typescript": "5.9.3",
|
|
33
33
|
"wordwrap": "^1.0.0"
|
|
34
34
|
},
|
|
35
35
|
"devDependencies": {
|
|
36
|
-
"node-opcua-leak-detector": "2.
|
|
37
|
-
"node-opcua-packet-analyzer": "2.
|
|
38
|
-
"node-opcua-service-translate-browse-path": "2.
|
|
36
|
+
"node-opcua-leak-detector": "2.172.0",
|
|
37
|
+
"node-opcua-packet-analyzer": "2.172.0",
|
|
38
|
+
"node-opcua-service-translate-browse-path": "2.172.0"
|
|
39
39
|
},
|
|
40
40
|
"author": "Etienne Rossignon",
|
|
41
41
|
"license": "MIT",
|
|
@@ -52,7 +52,7 @@
|
|
|
52
52
|
"internet of things"
|
|
53
53
|
],
|
|
54
54
|
"homepage": "http://node-opcua.github.io/",
|
|
55
|
-
"gitHead": "
|
|
55
|
+
"gitHead": "dfe9993a93b5c3897825e898b5f07b25952c7f45",
|
|
56
56
|
"files": [
|
|
57
57
|
"dist",
|
|
58
58
|
"source"
|
|
@@ -9,6 +9,25 @@ import { convertTypeToTypescript } from "./convert_to_typescript";
|
|
|
9
9
|
import { constructCache } from "./private/cache";
|
|
10
10
|
import { Options } from "./options";
|
|
11
11
|
|
|
12
|
+
// Robust write: on Windows, transient locks from antivirus, OneDrive, or the
|
|
13
|
+
// TS language server (when files are open in an IDE) surface as ERROR_SHARING_VIOLATION
|
|
14
|
+
// (errno -4094 / code UNKNOWN/EBUSY/EPERM). Retry with backoff.
|
|
15
|
+
function writeFileSyncRetry(filePath: string, content: string, attempts = 6): void {
|
|
16
|
+
for (let i = 0; i < attempts; i++) {
|
|
17
|
+
try {
|
|
18
|
+
fs.writeFileSync(filePath, content);
|
|
19
|
+
return;
|
|
20
|
+
} catch (err) {
|
|
21
|
+
const code = (err as NodeJS.ErrnoException).code;
|
|
22
|
+
const transient = code === "UNKNOWN" || code === "EBUSY" || code === "EPERM";
|
|
23
|
+
if (!transient || i === attempts - 1) throw err;
|
|
24
|
+
// Synchronous backoff (tight loop is fine for ~ms-scale retries).
|
|
25
|
+
const until = Date.now() + 50 * (i + 1);
|
|
26
|
+
while (Date.now() < until) { /* spin */ }
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
12
31
|
function getPackageFolder(dependency: string, options: Options) {
|
|
13
32
|
const l = [...(options.lookupFolders || [])];
|
|
14
33
|
l.push(path.join(__dirname, "../../"));
|
|
@@ -98,7 +117,7 @@ export async function convertNamespaceTypeToTypescript(
|
|
|
98
117
|
if (!fs.existsSync(sourceFolder)) {
|
|
99
118
|
fs.mkdirSync(sourceFolder);
|
|
100
119
|
}
|
|
101
|
-
|
|
120
|
+
writeFileSyncRetry(path.join(sourceFolder, filename + ".ts"), content);
|
|
102
121
|
infos[module] = infos[module] || { folder, dependencies: [], module, files: [] };
|
|
103
122
|
infos[module].files.push(filename + ".ts");
|
|
104
123
|
infos[module].dependencies = [...new Set([...infos[module].dependencies, ...dependencies])];
|
|
@@ -261,10 +280,6 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
261
280
|
|
|
262
281
|
|
|
263
282
|
|
|
264
|
-
}
|
|
265
|
-
import { cleanUpTypescriptModule } from "./remove_unused";
|
|
266
|
-
function _tidyUpImports(folder: string) {
|
|
267
|
-
cleanUpTypescriptModule(folder);
|
|
268
283
|
}
|
|
269
284
|
async function outputFiles(infos: { [key: string]: Info }, options: Options) {
|
|
270
285
|
const values = Object.values(infos) as Info[];
|
|
@@ -273,16 +288,12 @@ async function outputFiles(infos: { [key: string]: Info }, options: Options) {
|
|
|
273
288
|
}
|
|
274
289
|
console.log("generating files for ", options.nsName);
|
|
275
290
|
for (const info of values) {
|
|
276
|
-
// create indexes
|
|
277
291
|
await _output_index_ts_file(info);
|
|
278
|
-
|
|
279
292
|
await _output_package_json(info, options);
|
|
280
|
-
|
|
281
293
|
await _output_tsconfig_json(info, options);
|
|
282
|
-
|
|
283
294
|
await _output_licence(info, options);
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
await _tidyUpImports(info.folder);
|
|
287
295
|
}
|
|
296
|
+
// Import cleanup is deferred to a second, parallel phase in main.ts —
|
|
297
|
+
// each namespace's cleanup uses an isolated ts-morph Project, so the
|
|
298
|
+
// expensive AST work can run across many cores without contention.
|
|
288
299
|
}
|
package/source/main.ts
CHANGED
|
@@ -1,9 +1,26 @@
|
|
|
1
|
-
import
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
|
|
2
5
|
import { AddressSpace, PseudoSession } from "node-opcua-address-space";
|
|
3
6
|
import { generateAddressSpace } from "node-opcua-address-space/nodeJS";
|
|
4
7
|
import { constructNodesetFilename, nodesetCatalog } from "node-opcua-nodesets";
|
|
8
|
+
|
|
5
9
|
import { convertNamespaceTypeToTypescript } from "./convert_namespace_to_typescript";
|
|
6
|
-
import {
|
|
10
|
+
import { cleanUpTypescriptModule } from "./remove_unused";
|
|
11
|
+
import { updateParentTSConfig } from "./update_parent_tsconfig";
|
|
12
|
+
|
|
13
|
+
async function runWithConcurrency<T>(items: T[], limit: number, fn: (item: T) => Promise<void>): Promise<void> {
|
|
14
|
+
let cursor = 0;
|
|
15
|
+
const workers = Array.from({ length: limit }, async () => {
|
|
16
|
+
while (true) {
|
|
17
|
+
const idx = cursor++;
|
|
18
|
+
if (idx >= items.length) return;
|
|
19
|
+
await fn(items[idx]);
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
await Promise.all(workers);
|
|
23
|
+
}
|
|
7
24
|
|
|
8
25
|
async function main() {
|
|
9
26
|
const addressSpace = AddressSpace.create();
|
|
@@ -18,18 +35,35 @@ async function main() {
|
|
|
18
35
|
};
|
|
19
36
|
// const nodesetCatalog2 = nodesetCatalog.filter((meta) => meta.name == "scales");
|
|
20
37
|
|
|
21
|
-
|
|
38
|
+
// Phase 1: convert each namespace sequentially.
|
|
39
|
+
// The convert step writes type files into whichever package the type
|
|
40
|
+
// *originates* in, not the namespace being processed. Two namespaces
|
|
41
|
+
// running in parallel will both try to write e.g. node-opcua-nodeset-ua
|
|
42
|
+
// files concurrently, causing Windows ERROR_SHARING_VIOLATION.
|
|
43
|
+
for (const meta of nodesetCatalog) {
|
|
22
44
|
const index = addressSpace.getNamespaceIndex(meta.uri);
|
|
23
45
|
if (index === -1) {
|
|
24
46
|
console.log("namespace not found", meta.uri);
|
|
25
|
-
|
|
47
|
+
continue;
|
|
26
48
|
}
|
|
27
|
-
|
|
49
|
+
await convertNamespaceTypeToTypescript(session, index, {
|
|
28
50
|
...options,
|
|
29
51
|
nsName: meta.name,
|
|
30
|
-
})
|
|
52
|
+
});
|
|
31
53
|
}
|
|
32
|
-
|
|
54
|
+
|
|
55
|
+
// Phase 2: clean up imports in every nodeset package that actually has a
|
|
56
|
+
// source/ folder on disk. This covers cases where a catalog entry name
|
|
57
|
+
// doesn't line up with its package folder (e.g. catalog "standard" writes
|
|
58
|
+
// into node-opcua-nodeset-ua).
|
|
59
|
+
const folders = fs.readdirSync(options.baseFolder)
|
|
60
|
+
.filter((name) => name.startsWith(options.prefix))
|
|
61
|
+
.map((name) => path.join(options.baseFolder, name))
|
|
62
|
+
.filter((p) => fs.existsSync(path.join(p, "source")));
|
|
63
|
+
|
|
64
|
+
const concurrency = Math.max(2, Math.min(os.cpus().length, 12));
|
|
65
|
+
console.log(`tidying imports across ${folders.length} packages with concurrency=${concurrency}`);
|
|
66
|
+
await runWithConcurrency(folders, concurrency, cleanUpTypescriptModule);
|
|
33
67
|
await updateParentTSConfig();
|
|
34
68
|
}
|
|
35
69
|
void main();
|
package/source/remove_unused.ts
CHANGED
|
@@ -1,80 +1,248 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
|
|
4
|
+
import type { ImportDeclarationStructure, OptionalKind, SourceFile } from "ts-morph";
|
|
5
|
+
import { Node, Project, SyntaxKind } from "ts-morph";
|
|
4
6
|
|
|
5
7
|
const dryRun = false;
|
|
6
|
-
|
|
7
|
-
|
|
8
|
+
|
|
9
|
+
const NODE_BUILTINS = new Set([
|
|
10
|
+
"assert", "async_hooks", "buffer", "child_process", "cluster", "console",
|
|
11
|
+
"crypto", "dgram", "dns", "events", "fs", "http", "http2", "https", "net",
|
|
12
|
+
"os", "path", "perf_hooks", "process", "querystring", "readline", "stream",
|
|
13
|
+
"string_decoder", "tls", "tty", "url", "util", "v8", "vm", "worker_threads",
|
|
14
|
+
"zlib",
|
|
15
|
+
]);
|
|
16
|
+
|
|
17
|
+
function importGroup(spec: string): number {
|
|
18
|
+
if (spec.startsWith("node:") || NODE_BUILTINS.has(spec)) return 0;
|
|
19
|
+
if (spec.startsWith(".")) return 3;
|
|
20
|
+
if (spec.startsWith("node-opcua")) return 2;
|
|
21
|
+
return 1;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function applyTypeOnlyImports(file: SourceFile) {
|
|
25
|
+
// Pass 1: collect identifier names used in value (runtime) positions.
|
|
26
|
+
// Anything whose name appears only in TypeNode positions is type-only.
|
|
27
|
+
const valueNames = new Set<string>();
|
|
28
|
+
file.forEachDescendant((node) => {
|
|
29
|
+
if (node.getKind() !== SyntaxKind.Identifier) return;
|
|
30
|
+
const parent = node.getParent();
|
|
31
|
+
if (!parent) return;
|
|
32
|
+
// Declaration sites are not usages.
|
|
33
|
+
if (Node.isImportSpecifier(parent)) return;
|
|
34
|
+
if (Node.isImportClause(parent)) return;
|
|
35
|
+
if (Node.isNamespaceImport(parent)) return;
|
|
36
|
+
|
|
37
|
+
// Walk past QualifiedName chains: in dotted type references like
|
|
38
|
+
// `UAProperty<UInt32, DataType.UInt32>` both `DataType` and the inner
|
|
39
|
+
// `UInt32` have a QualifiedName as their immediate parent, but the
|
|
40
|
+
// surrounding context is a TypeReference (a TypeNode).
|
|
41
|
+
let ctx = parent;
|
|
42
|
+
while (Node.isQualifiedName(ctx)) {
|
|
43
|
+
const p = ctx.getParent();
|
|
44
|
+
if (!p) break;
|
|
45
|
+
ctx = p;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
if (Node.isTypeNode(ctx)) return;
|
|
49
|
+
|
|
50
|
+
// `interface X extends Foo` — Foo's parent is ExpressionWithTypeArguments
|
|
51
|
+
// inside a HeritageClause inside an InterfaceDeclaration. Still type-only.
|
|
52
|
+
if (Node.isExpressionWithTypeArguments(ctx)) {
|
|
53
|
+
const heritage = ctx.getParent();
|
|
54
|
+
if (heritage && Node.isHeritageClause(heritage)) {
|
|
55
|
+
const decl = heritage.getParent();
|
|
56
|
+
if (decl && Node.isInterfaceDeclaration(decl)) return;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
valueNames.add(node.getText());
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
// Pass 2: flip type-only on import specifiers, hoist when all qualify.
|
|
8
64
|
file.getImportDeclarations().forEach((importDecl) => {
|
|
65
|
+
if (importDecl.isTypeOnly()) return;
|
|
9
66
|
const namedImports = importDecl.getNamedImports();
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
67
|
+
if (namedImports.length === 0) return;
|
|
68
|
+
|
|
69
|
+
const hasDefault = !!importDecl.getDefaultImport();
|
|
70
|
+
const hasNamespace = !!importDecl.getNamespaceImport();
|
|
71
|
+
|
|
72
|
+
const isTypeOnly = namedImports.map((spec) => {
|
|
73
|
+
if (spec.isTypeOnly()) return true;
|
|
74
|
+
const localName = spec.getAliasNode()?.getText() ?? spec.getNameNode().getText();
|
|
75
|
+
return !valueNames.has(localName);
|
|
14
76
|
});
|
|
15
77
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
78
|
+
const allTypeOnly = isTypeOnly.every(Boolean);
|
|
79
|
+
|
|
80
|
+
if (allTypeOnly && !hasDefault && !hasNamespace) {
|
|
81
|
+
// Hoist to `import type { ... }`; clear redundant per-specifier `type` keywords.
|
|
82
|
+
importDecl.setIsTypeOnly(true);
|
|
83
|
+
namedImports.forEach((spec) => {
|
|
84
|
+
if (spec.isTypeOnly()) spec.setIsTypeOnly(false);
|
|
85
|
+
});
|
|
86
|
+
} else {
|
|
87
|
+
namedImports.forEach((spec, i) => {
|
|
88
|
+
if (isTypeOnly[i] && !spec.isTypeOnly()) {
|
|
89
|
+
spec.setIsTypeOnly(true);
|
|
26
90
|
}
|
|
27
91
|
});
|
|
28
92
|
}
|
|
29
93
|
});
|
|
94
|
+
}
|
|
30
95
|
|
|
31
|
-
|
|
32
|
-
file.
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
96
|
+
function regroupImports(file: SourceFile) {
|
|
97
|
+
const imports = file.getImportDeclarations();
|
|
98
|
+
if (imports.length === 0) return;
|
|
99
|
+
|
|
100
|
+
const structures: OptionalKind<ImportDeclarationStructure>[] = imports.map((d) => d.getStructure());
|
|
101
|
+
|
|
102
|
+
for (const d of [...imports].reverse()) d.remove();
|
|
103
|
+
|
|
104
|
+
structures.sort((a, b) => {
|
|
105
|
+
const ga = importGroup(a.moduleSpecifier);
|
|
106
|
+
const gb = importGroup(b.moduleSpecifier);
|
|
107
|
+
if (ga !== gb) return ga - gb;
|
|
108
|
+
return a.moduleSpecifier.localeCompare(b.moduleSpecifier);
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
file.insertImportDeclarations(0, structures);
|
|
112
|
+
|
|
113
|
+
const reinserted = file.getImportDeclarations();
|
|
114
|
+
for (let i = 1; i < reinserted.length; i++) {
|
|
115
|
+
const prevG = importGroup(reinserted[i - 1].getModuleSpecifierValue());
|
|
116
|
+
const currG = importGroup(reinserted[i].getModuleSpecifierValue());
|
|
117
|
+
if (prevG !== currG) {
|
|
118
|
+
reinserted[i].prependWhitespace("\n");
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
39
122
|
|
|
40
|
-
|
|
41
|
-
|
|
123
|
+
const BIOME_IGNORE_EMPTY_INTERFACE = "// biome-ignore lint/suspicious/noEmptyInterface: forward-compatible placeholder for OPC-UA generated types";
|
|
124
|
+
|
|
125
|
+
function tidyEmptyInterfaces(file: SourceFile) {
|
|
126
|
+
// Two complaints to resolve:
|
|
127
|
+
// 1. Formatter wants `interface X {}` on a single line, not `{\n}`.
|
|
128
|
+
// 2. suspicious/noEmptyInterface fires for `interface X {}` WITHOUT extends.
|
|
129
|
+
// For `interface X extends Y {}` the rule doesn't fire, so a directive
|
|
130
|
+
// there is reported as "unused".
|
|
131
|
+
//
|
|
132
|
+
// First pass (in reverse, since text only shrinks): collapse bodies.
|
|
133
|
+
// Then a snapshot+descending pass for the biome-ignore directives, which
|
|
134
|
+
// only target interfaces with no extends clause.
|
|
135
|
+
const ifaces = file.getInterfaces();
|
|
136
|
+
for (let i = ifaces.length - 1; i >= 0; i--) {
|
|
137
|
+
const iface = ifaces[i];
|
|
138
|
+
if (iface.getMembers().length !== 0) continue;
|
|
139
|
+
const text = iface.getText();
|
|
140
|
+
const collapsed = text.replace(/\{\s*\}\s*$/, "{}");
|
|
141
|
+
if (collapsed !== text) {
|
|
142
|
+
iface.replaceWithText(collapsed);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// Re-fetch (previous replaceWithText calls may have invalidated nodes),
|
|
147
|
+
// then snapshot positions before inserting comment lines.
|
|
148
|
+
const positions: number[] = [];
|
|
149
|
+
for (const iface of file.getInterfaces()) {
|
|
150
|
+
if (iface.getMembers().length !== 0) continue;
|
|
151
|
+
// Rule only fires when there's no extends clause.
|
|
152
|
+
if (iface.getExtends().length !== 0) continue;
|
|
153
|
+
const leading = iface.getLeadingCommentRanges().map((c) => c.getText()).join("\n");
|
|
154
|
+
if (leading.includes("biome-ignore lint/suspicious/noEmptyInterface")) continue;
|
|
155
|
+
positions.push(iface.getStart());
|
|
156
|
+
}
|
|
157
|
+
positions.sort((a, b) => b - a);
|
|
158
|
+
for (const pos of positions) {
|
|
159
|
+
file.insertText(pos, `${BIOME_IGNORE_EMPTY_INTERFACE}\n`);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
function fixFile(file: SourceFile) {
|
|
164
|
+
// Sort alphabetically, dedupe, drop unused imports.
|
|
165
|
+
file.organizeImports();
|
|
166
|
+
|
|
167
|
+
// Mark type-only specifiers; hoist when the whole import qualifies.
|
|
168
|
+
applyTypeOnlyImports(file);
|
|
169
|
+
|
|
170
|
+
// Group: builtins → external → node-opcua-* → relative.
|
|
171
|
+
regroupImports(file);
|
|
172
|
+
|
|
173
|
+
// Collapse empty interface bodies to single-line `{}` and add a
|
|
174
|
+
// suppression directive for the ones the lint rule actually fires on.
|
|
175
|
+
tidyEmptyInterfaces(file);
|
|
176
|
+
|
|
177
|
+
// Remove unused local variables (function-scope or top-level).
|
|
178
|
+
// Use a single-pass identifier-name frequency map instead of ts-morph's
|
|
179
|
+
// findReferences(), which calls TS's reference finder per declaration —
|
|
180
|
+
// unreliable without dep resolution and 10–100× slower. For generated
|
|
181
|
+
// code (no fancy scoping), name count > 1 is a sufficient proxy for "used".
|
|
182
|
+
const identifierCounts = new Map<string, number>();
|
|
183
|
+
file.forEachDescendant((node) => {
|
|
184
|
+
if (node.getKind() === SyntaxKind.Identifier) {
|
|
185
|
+
const txt = node.getText();
|
|
186
|
+
identifierCounts.set(txt, (identifierCounts.get(txt) || 0) + 1);
|
|
187
|
+
}
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
file.getVariableStatements().forEach((variableStatement) => {
|
|
191
|
+
variableStatement.getDeclarations().forEach((declaration) => {
|
|
192
|
+
const name = declaration.getName();
|
|
193
|
+
const count = identifierCounts.get(name) ?? 0;
|
|
194
|
+
// Count includes the declaration's own name node; >1 means referenced elsewhere.
|
|
195
|
+
if (count <= 1) {
|
|
196
|
+
console.log("removing unused variable=", name);
|
|
42
197
|
declaration.remove();
|
|
43
198
|
}
|
|
44
199
|
});
|
|
45
200
|
|
|
46
201
|
try {
|
|
47
|
-
// If no declarations left in this statement, remove the whole statement
|
|
48
202
|
if (variableStatement.getDeclarations().length === 0) {
|
|
49
203
|
console.log("removing variable statement:", variableStatement.getText());
|
|
50
204
|
variableStatement.remove();
|
|
51
205
|
}
|
|
52
206
|
} catch (err) {
|
|
53
207
|
console.log((err as Error).message);
|
|
54
|
-
|
|
55
208
|
}
|
|
56
209
|
});
|
|
57
210
|
|
|
58
|
-
// Save changes
|
|
59
211
|
if (!dryRun) {
|
|
60
212
|
file.saveSync();
|
|
61
213
|
}
|
|
62
214
|
}
|
|
63
|
-
export async function cleanUpTypescriptModule(moduleFolder: string) {
|
|
64
215
|
|
|
216
|
+
export async function cleanUpTypescriptModule(moduleFolder: string) {
|
|
217
|
+
const sourceFolder = path.join(moduleFolder, "source");
|
|
218
|
+
// Some namespaces in the catalog don't have a dedicated module folder
|
|
219
|
+
// (their types are written into a shared package like node-opcua-nodeset-ua).
|
|
220
|
+
// Nothing to tidy here — silently skip.
|
|
221
|
+
if (!fs.existsSync(sourceFolder)) {
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
65
224
|
|
|
225
|
+
// Isolated project: only this module's own files, no tsconfig dependency
|
|
226
|
+
// resolution. The cleanup analysis is purely syntactic (organizeImports +
|
|
227
|
+
// type-position check via AST), so we don't need the full type checker —
|
|
228
|
+
// and skipping dep resolution lets us run many namespaces in parallel
|
|
229
|
+
// without ts-morph touching files outside this folder.
|
|
66
230
|
const project = new Project({
|
|
67
|
-
|
|
231
|
+
skipAddingFilesFromTsConfig: true,
|
|
232
|
+
skipFileDependencyResolution: true,
|
|
233
|
+
skipLoadingLibFiles: true,
|
|
68
234
|
});
|
|
69
235
|
|
|
70
|
-
const sourceFolder = path.join(moduleFolder, "source");
|
|
71
|
-
|
|
72
236
|
const dirFiles = await fs.promises.readdir(sourceFolder);
|
|
73
|
-
|
|
74
|
-
|
|
237
|
+
|
|
238
|
+
for (const f of dirFiles) {
|
|
239
|
+
const fullPath = path.join(sourceFolder, f);
|
|
240
|
+
project.addSourceFileAtPath(fullPath);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
for (const f of dirFiles) {
|
|
75
244
|
const fullPath = path.join(sourceFolder, f);
|
|
76
245
|
const sourceFile = project.getSourceFileOrThrow(fullPath);
|
|
77
246
|
fixFile(sourceFile);
|
|
78
247
|
}
|
|
79
|
-
|
|
80
|
-
}
|
|
248
|
+
}
|