@webneat/codewiki 0.0.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/index.cjs ADDED
@@ -0,0 +1,2453 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all3) => {
9
+ for (var name in all3)
10
+ __defProp(target, name, { get: all3[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc2) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc2 = __getOwnPropDesc(from, key)) || desc2.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/index.ts
31
+ var src_exports = {};
32
+ __export(src_exports, {
33
+ context_from_config: () => context_from_config,
34
+ context_from_db: () => context_from_db,
35
+ create: () => create,
36
+ load: () => load
37
+ });
38
+ module.exports = __toCommonJS(src_exports);
39
+
40
+ // src/internals/context.ts
41
+ var import_typescript = __toESM(require("typescript"), 1);
42
+ var import_url = require("url");
43
+ var import_better_sqlite3 = __toESM(require("better-sqlite3"), 1);
44
+ var import_promises2 = require("fs/promises");
45
+ var import_path2 = __toESM(require("path"), 1);
46
+ var import_better_sqlite32 = require("drizzle-orm/better-sqlite3");
47
+
48
+ // src/internals/errors.ts
49
+ var import_errors = __toESM(require("@webneat/errors"), 1);
50
+ var err = (0, import_errors.default)({
51
+ file_outside_project_path: (data) => `File "${data.file_path}" is outside project path "${data.project_path}"`,
52
+ file_not_found: (data) => `File not found: ${data.path}`,
53
+ db_error: (data) => `Database error in ${data.operation}: ${data.reason}`,
54
+ symbol_meta_parse_error: (data) => `Failed to parse symbol metadata for symbol ${data.symbol_id}: ${data.reason}`,
55
+ exported_symbol_not_found: (data) => `Exported symbol "${data.name}" not found in file with id ${data.file_id}`,
56
+ module_resolution_failed: (data) => `Failed to resolve module "${data.module}" from "${data.from}"`,
57
+ exporter_file_not_found: (data) => `Exporter file not found at "${data.path}" for module "${data.module}"`,
58
+ ast_parse_error: (data) => `AST parsing error in ${data.operation}: ${data.reason}`,
59
+ config_not_found: (data) => `No config found in database at ${data.db_path}`,
60
+ config_invalid_node_modules_paths: (data) => `Invalid node_modules_paths stored in database ${data.db_path}: ${data.reason}`,
61
+ symbol_missing_text: (data) => `Symbol ${data.symbol_id} (${data.name}) has no source text`,
62
+ symbol_node_not_found: (data) => `Symbol node not found for ${data.name} in ${data.file_path}`,
63
+ symbol_not_found: (data) => `Symbol "${data.name}" not found in file "${data.path}"`,
64
+ describe_dependency_failed: (data) => `Failed to describe ${data.package}#${data.name}: ${data.reason}`,
65
+ // CLI errors
66
+ could_not_read_file: (data) => `Could not read file ${data.path}: ${data.reason}`,
67
+ invalid_json: (data) => `Invalid JSON: ${data.reason}`,
68
+ invalid_config: (data) => `Invalid configuration: ${JSON.stringify(data.errors)}`,
69
+ invalid_type: (data) => `Invalid entity type: ${data.type}. Must be one of: dependency, symbol, file, directory`
70
+ });
71
+
72
+ // src/db/migrate.ts
73
+ var import_promises = require("fs/promises");
74
+ var import_path = require("path");
75
+ var import_drizzle_orm2 = require("drizzle-orm");
76
+
77
+ // src/db/schema.ts
78
+ var schema_exports = {};
79
+ __export(schema_exports, {
80
+ configs: () => configs,
81
+ directories: () => directories,
82
+ directories_relations: () => directories_relations,
83
+ external_dependencies: () => external_dependencies,
84
+ external_dependencies_relations: () => external_dependencies_relations,
85
+ external_imports: () => external_imports,
86
+ external_imports_relations: () => external_imports_relations,
87
+ files: () => files,
88
+ files_relations: () => files_relations,
89
+ imports: () => imports,
90
+ imports_relations: () => imports_relations,
91
+ migrations: () => migrations,
92
+ symbol_external_links: () => symbol_external_links,
93
+ symbol_external_links_relations: () => symbol_external_links_relations,
94
+ symbol_internal_links: () => symbol_internal_links,
95
+ symbol_internal_links_relations: () => symbol_internal_links_relations,
96
+ symbols: () => symbols,
97
+ symbols_relations: () => symbols_relations
98
+ });
99
+ var import_drizzle_orm = require("drizzle-orm");
100
+ var import_sqlite_core = require("drizzle-orm/sqlite-core");
101
+ var timestamps = {
102
+ created_at: (0, import_sqlite_core.integer)("created_at", { mode: "timestamp" }).default(import_drizzle_orm.sql`(unixepoch())`).notNull(),
103
+ updated_at: (0, import_sqlite_core.integer)("updated_at", { mode: "timestamp" }).default(import_drizzle_orm.sql`(unixepoch())`).notNull()
104
+ };
105
+ var migrations = (0, import_sqlite_core.sqliteTable)("migrations", {
106
+ id: (0, import_sqlite_core.integer)("id").primaryKey({ autoIncrement: true }),
107
+ name: (0, import_sqlite_core.text)("name").notNull().unique(),
108
+ created_at: timestamps.created_at
109
+ });
110
+ var configs = (0, import_sqlite_core.sqliteTable)("configs", {
111
+ id: (0, import_sqlite_core.integer)("id").primaryKey({ autoIncrement: false }).notNull().default(1),
112
+ project_path: (0, import_sqlite_core.text)("project_path").notNull(),
113
+ description: (0, import_sqlite_core.text)("description"),
114
+ package_json_path: (0, import_sqlite_core.text)("package_json_path"),
115
+ node_modules_paths: (0, import_sqlite_core.text)("node_modules_paths"),
116
+ ...timestamps
117
+ });
118
+ var directories = (0, import_sqlite_core.sqliteTable)(
119
+ "directories",
120
+ {
121
+ id: (0, import_sqlite_core.integer)("id").primaryKey({ autoIncrement: true }),
122
+ parent_id: (0, import_sqlite_core.integer)("parent_id").references(() => directories.id, { onDelete: "cascade" }),
123
+ path: (0, import_sqlite_core.text)("path").notNull().unique(),
124
+ description: (0, import_sqlite_core.text)("description"),
125
+ state: (0, import_sqlite_core.text)("state").$type().notNull().default("to_describe"),
126
+ error: (0, import_sqlite_core.text)("error"),
127
+ ...timestamps
128
+ },
129
+ (table) => ({
130
+ parent_idx: (0, import_sqlite_core.index)("directories_parent_idx").on(table.parent_id),
131
+ path_idx: (0, import_sqlite_core.index)("directories_path_idx").on(table.path),
132
+ state_idx: (0, import_sqlite_core.index)("directories_state_idx").on(table.state)
133
+ })
134
+ );
135
+ var files = (0, import_sqlite_core.sqliteTable)(
136
+ "files",
137
+ {
138
+ id: (0, import_sqlite_core.integer)("id").primaryKey({ autoIncrement: true }),
139
+ directory_id: (0, import_sqlite_core.integer)("directory_id").notNull().references(() => directories.id, { onDelete: "cascade" }),
140
+ path: (0, import_sqlite_core.text)("path").notNull().unique(),
141
+ hash: (0, import_sqlite_core.text)("hash"),
142
+ description: (0, import_sqlite_core.text)("description"),
143
+ state: (0, import_sqlite_core.text)("state").$type().notNull().default("to_scan"),
144
+ error: (0, import_sqlite_core.text)("error"),
145
+ ...timestamps
146
+ },
147
+ (table) => ({
148
+ directory_idx: (0, import_sqlite_core.index)("files_directory_idx").on(table.directory_id),
149
+ path_idx: (0, import_sqlite_core.index)("files_path_idx").on(table.path),
150
+ hash_idx: (0, import_sqlite_core.index)("files_hash_idx").on(table.hash),
151
+ state_idx: (0, import_sqlite_core.index)("files_state_idx").on(table.state)
152
+ })
153
+ );
154
+ var external_dependencies = (0, import_sqlite_core.sqliteTable)(
155
+ "external_dependencies",
156
+ {
157
+ id: (0, import_sqlite_core.integer)("id").primaryKey({ autoIncrement: true }),
158
+ package: (0, import_sqlite_core.text)("package").notNull(),
159
+ subpath: (0, import_sqlite_core.text)("subpath"),
160
+ name: (0, import_sqlite_core.text)("name"),
161
+ version: (0, import_sqlite_core.text)("version"),
162
+ github_repo: (0, import_sqlite_core.text)("github_repo"),
163
+ is_builtin: (0, import_sqlite_core.integer)("is_builtin", { mode: "boolean" }).default(false).notNull(),
164
+ description: (0, import_sqlite_core.text)("description"),
165
+ state: (0, import_sqlite_core.text)("state").$type().notNull().default("to_describe"),
166
+ error: (0, import_sqlite_core.text)("error"),
167
+ ...timestamps
168
+ },
169
+ (table) => ({
170
+ state_idx: (0, import_sqlite_core.index)("external_dependencies_state_idx").on(table.state),
171
+ package_subpath_name_unique: (0, import_sqlite_core.uniqueIndex)("external_dependencies_package_subpath_name_unique").on(table.package, table.subpath, table.name)
172
+ })
173
+ );
174
+ var external_imports = (0, import_sqlite_core.sqliteTable)(
175
+ "external_imports",
176
+ {
177
+ id: (0, import_sqlite_core.integer)("id").primaryKey({ autoIncrement: true }),
178
+ file_id: (0, import_sqlite_core.integer)("file_id").notNull().references(() => files.id, { onDelete: "cascade" }),
179
+ external_dependency_id: (0, import_sqlite_core.integer)("external_dependency_id").notNull().references(() => external_dependencies.id, { onDelete: "cascade" }),
180
+ alias: (0, import_sqlite_core.text)("alias").notNull(),
181
+ is_dynamic: (0, import_sqlite_core.integer)("is_dynamic", { mode: "boolean" }).default(false).notNull(),
182
+ ...timestamps
183
+ },
184
+ (table) => ({
185
+ file_idx: (0, import_sqlite_core.index)("external_imports_file_idx").on(table.file_id),
186
+ external_dependency_idx: (0, import_sqlite_core.index)("external_imports_external_dependency_idx").on(table.external_dependency_id)
187
+ })
188
+ );
189
+ var imports = (0, import_sqlite_core.sqliteTable)(
190
+ "imports",
191
+ {
192
+ id: (0, import_sqlite_core.integer)("id").primaryKey({ autoIncrement: true }),
193
+ exporter_file_id: (0, import_sqlite_core.integer)("exporter_file_id").notNull().references(() => files.id, { onDelete: "cascade" }),
194
+ importer_file_id: (0, import_sqlite_core.integer)("importer_file_id").notNull().references(() => files.id, { onDelete: "cascade" }),
195
+ symbol_id: (0, import_sqlite_core.integer)("symbol_id").references(() => symbols.id, { onDelete: "set null" }),
196
+ name: (0, import_sqlite_core.text)("name").notNull(),
197
+ alias: (0, import_sqlite_core.text)("alias").notNull(),
198
+ is_dynamic: (0, import_sqlite_core.integer)("is_dynamic", { mode: "boolean" }).default(false).notNull(),
199
+ state: (0, import_sqlite_core.text)("state").$type().notNull().default("to_link"),
200
+ error: (0, import_sqlite_core.text)("error"),
201
+ ...timestamps
202
+ },
203
+ (table) => ({
204
+ exporter_file_idx: (0, import_sqlite_core.index)("imports_exporter_file_idx").on(table.exporter_file_id),
205
+ importer_file_idx: (0, import_sqlite_core.index)("imports_importer_file_idx").on(table.importer_file_id),
206
+ symbol_idx: (0, import_sqlite_core.index)("imports_symbol_idx").on(table.symbol_id),
207
+ state_idx: (0, import_sqlite_core.index)("imports_state_idx").on(table.state)
208
+ })
209
+ );
210
+ var symbols = (0, import_sqlite_core.sqliteTable)(
211
+ "symbols",
212
+ {
213
+ id: (0, import_sqlite_core.integer)("id").primaryKey({ autoIncrement: true }),
214
+ file_id: (0, import_sqlite_core.integer)("file_id").notNull().references(() => files.id, { onDelete: "cascade" }),
215
+ type: (0, import_sqlite_core.text)("type").notNull(),
216
+ // 'function', 'class', 'variable', 'type', 'class_method', 'class_property', 'other'
217
+ name: (0, import_sqlite_core.text)("name").notNull(),
218
+ text: (0, import_sqlite_core.text)("text"),
219
+ // source code
220
+ meta: (0, import_sqlite_core.text)("meta"),
221
+ // JSON details
222
+ description: (0, import_sqlite_core.text)("description"),
223
+ is_exported: (0, import_sqlite_core.integer)("is_exported", { mode: "boolean" }).default(false).notNull(),
224
+ state: (0, import_sqlite_core.text)("state").$type().notNull().default("to_link"),
225
+ error: (0, import_sqlite_core.text)("error"),
226
+ ...timestamps
227
+ },
228
+ (table) => ({
229
+ file_idx: (0, import_sqlite_core.index)("symbols_file_idx").on(table.file_id),
230
+ type_idx: (0, import_sqlite_core.index)("symbols_type_idx").on(table.type),
231
+ name_idx: (0, import_sqlite_core.index)("symbols_name_idx").on(table.name),
232
+ is_exported_idx: (0, import_sqlite_core.index)("symbols_is_exported_idx").on(table.is_exported),
233
+ state_idx: (0, import_sqlite_core.index)("symbols_state_idx").on(table.state)
234
+ })
235
+ );
236
+ var symbol_internal_links = (0, import_sqlite_core.sqliteTable)(
237
+ "symbol_internal_links",
238
+ {
239
+ id: (0, import_sqlite_core.integer)("id").primaryKey({ autoIncrement: true }),
240
+ from_file_id: (0, import_sqlite_core.integer)("from_file_id").notNull().references(() => files.id, { onDelete: "cascade" }),
241
+ to_file_id: (0, import_sqlite_core.integer)("to_file_id").notNull().references(() => files.id, { onDelete: "cascade" }),
242
+ from_symbol_id: (0, import_sqlite_core.integer)("from_symbol_id").notNull().references(() => symbols.id, { onDelete: "cascade" }),
243
+ to_symbol_id: (0, import_sqlite_core.integer)("to_symbol_id").notNull().references(() => symbols.id, { onDelete: "cascade" }),
244
+ state: (0, import_sqlite_core.text)("state").$type().notNull().default("pending"),
245
+ error: (0, import_sqlite_core.text)("error"),
246
+ ...timestamps
247
+ },
248
+ (table) => ({
249
+ from_file_idx: (0, import_sqlite_core.index)("symbol_internal_links_from_file_idx").on(table.from_file_id),
250
+ to_file_idx: (0, import_sqlite_core.index)("symbol_internal_links_to_file_idx").on(table.to_file_id),
251
+ from_symbol_idx: (0, import_sqlite_core.index)("symbol_internal_links_from_symbol_idx").on(table.from_symbol_id),
252
+ to_symbol_idx: (0, import_sqlite_core.index)("symbol_internal_links_to_symbol_idx").on(table.to_symbol_id),
253
+ state_idx: (0, import_sqlite_core.index)("symbol_internal_links_state_idx").on(table.state)
254
+ })
255
+ );
256
+ var symbol_external_links = (0, import_sqlite_core.sqliteTable)(
257
+ "symbol_external_links",
258
+ {
259
+ id: (0, import_sqlite_core.integer)("id").primaryKey({ autoIncrement: true }),
260
+ symbol_id: (0, import_sqlite_core.integer)("symbol_id").notNull().references(() => symbols.id, { onDelete: "cascade" }),
261
+ external_import_id: (0, import_sqlite_core.integer)("external_import_id").notNull().references(() => external_imports.id, { onDelete: "cascade" }),
262
+ ...timestamps
263
+ },
264
+ (table) => ({
265
+ symbol_idx: (0, import_sqlite_core.index)("symbol_external_links_symbol_idx").on(table.symbol_id),
266
+ external_import_idx: (0, import_sqlite_core.index)("symbol_external_links_external_import_idx").on(table.external_import_id)
267
+ })
268
+ );
269
+ var directories_relations = (0, import_drizzle_orm.relations)(directories, ({ one, many }) => ({
270
+ parent: one(directories, {
271
+ fields: [directories.parent_id],
272
+ references: [directories.id],
273
+ relationName: "subdirectories"
274
+ }),
275
+ subdirectories: many(directories, {
276
+ relationName: "subdirectories"
277
+ }),
278
+ files: many(files)
279
+ }));
280
+ var files_relations = (0, import_drizzle_orm.relations)(files, ({ one, many }) => ({
281
+ directory: one(directories, {
282
+ fields: [files.directory_id],
283
+ references: [directories.id]
284
+ }),
285
+ external_imports: many(external_imports),
286
+ imports_as_exporter: many(imports, {
287
+ relationName: "imports_as_exporter"
288
+ }),
289
+ imports_as_importer: many(imports, {
290
+ relationName: "imports_as_importer"
291
+ }),
292
+ symbols: many(symbols),
293
+ internal_links_from: many(symbol_internal_links, {
294
+ relationName: "file_internal_links_from"
295
+ }),
296
+ internal_links_to: many(symbol_internal_links, {
297
+ relationName: "file_internal_links_to"
298
+ })
299
+ }));
300
+ var external_dependencies_relations = (0, import_drizzle_orm.relations)(external_dependencies, ({ many }) => ({
301
+ imports: many(external_imports),
302
+ symbol_external_links: many(symbol_external_links)
303
+ }));
304
+ var external_imports_relations = (0, import_drizzle_orm.relations)(external_imports, ({ one }) => ({
305
+ file: one(files, {
306
+ fields: [external_imports.file_id],
307
+ references: [files.id]
308
+ }),
309
+ external_dependency: one(external_dependencies, {
310
+ fields: [external_imports.external_dependency_id],
311
+ references: [external_dependencies.id]
312
+ })
313
+ }));
314
+ var imports_relations = (0, import_drizzle_orm.relations)(imports, ({ one }) => ({
315
+ exporter_file: one(files, {
316
+ fields: [imports.exporter_file_id],
317
+ references: [files.id],
318
+ relationName: "imports_as_exporter"
319
+ }),
320
+ importer_file: one(files, {
321
+ fields: [imports.importer_file_id],
322
+ references: [files.id],
323
+ relationName: "imports_as_importer"
324
+ }),
325
+ symbol: one(symbols, {
326
+ fields: [imports.symbol_id],
327
+ references: [symbols.id]
328
+ })
329
+ }));
330
+ var symbols_relations = (0, import_drizzle_orm.relations)(symbols, ({ one, many }) => ({
331
+ file: one(files, {
332
+ fields: [symbols.file_id],
333
+ references: [files.id]
334
+ }),
335
+ imports: many(imports),
336
+ internal_links_from: many(symbol_internal_links, {
337
+ relationName: "internal_links_from"
338
+ }),
339
+ internal_links_to: many(symbol_internal_links, {
340
+ relationName: "internal_links_to"
341
+ }),
342
+ external_links: many(symbol_external_links)
343
+ }));
344
+ var symbol_internal_links_relations = (0, import_drizzle_orm.relations)(symbol_internal_links, ({ one }) => ({
345
+ from_file: one(files, {
346
+ fields: [symbol_internal_links.from_file_id],
347
+ references: [files.id],
348
+ relationName: "file_internal_links_from"
349
+ }),
350
+ to_file: one(files, {
351
+ fields: [symbol_internal_links.to_file_id],
352
+ references: [files.id],
353
+ relationName: "file_internal_links_to"
354
+ }),
355
+ from_symbol: one(symbols, {
356
+ fields: [symbol_internal_links.from_symbol_id],
357
+ references: [symbols.id],
358
+ relationName: "internal_links_from"
359
+ }),
360
+ to_symbol: one(symbols, {
361
+ fields: [symbol_internal_links.to_symbol_id],
362
+ references: [symbols.id],
363
+ relationName: "internal_links_to"
364
+ })
365
+ }));
366
+ var symbol_external_links_relations = (0, import_drizzle_orm.relations)(symbol_external_links, ({ one }) => ({
367
+ symbol: one(symbols, {
368
+ fields: [symbol_external_links.symbol_id],
369
+ references: [symbols.id]
370
+ }),
371
+ external_import: one(external_imports, {
372
+ fields: [symbol_external_links.external_import_id],
373
+ references: [external_imports.id]
374
+ })
375
+ }));
376
+
377
+ // src/db/migrate.ts
378
+ async function migrate(ctx) {
379
+ const [migration_filenames, applied_migration_names] = await Promise.all([get_migration_filenames(ctx), get_applied_migration_names(ctx)]);
380
+ for (const filename of migration_filenames) {
381
+ if (applied_migration_names.has(filename)) continue;
382
+ await apply_migration(ctx, filename);
383
+ }
384
+ }
385
+ async function get_migration_filenames({ migrations_path }) {
386
+ const filenames = /* @__PURE__ */ new Set();
387
+ for (const entry of await (0, import_promises.readdir)(migrations_path, { withFileTypes: true })) {
388
+ if (!entry.isFile() || !entry.name.endsWith(".sql")) continue;
389
+ filenames.add(entry.name);
390
+ }
391
+ return filenames;
392
+ }
393
+ async function get_applied_migration_names({ db: db6 }) {
394
+ const res = db6.get(import_drizzle_orm2.sql`SELECT name FROM sqlite_master WHERE type='table' AND name='migrations'`);
395
+ if (!res) return /* @__PURE__ */ new Set();
396
+ const applied = await db6.select({ name: migrations.name }).from(migrations);
397
+ return new Set(applied.map((x) => x.name));
398
+ }
399
+ async function apply_migration({ sqlite, migrations_path }, filename) {
400
+ const file_path = (0, import_path.join)(migrations_path, filename);
401
+ const queries = await (0, import_promises.readFile)(file_path, "utf-8");
402
+ sqlite.transaction(() => {
403
+ sqlite.exec(queries);
404
+ sqlite.prepare("INSERT INTO migrations (name) VALUES (?)").run(filename);
405
+ })();
406
+ }
407
+
408
+ // src/db/configs.ts
409
+ var configs_exports = {};
410
+ __export(configs_exports, {
411
+ get: () => get,
412
+ upsert: () => upsert
413
+ });
414
+ var import_drizzle_orm4 = require("drizzle-orm");
415
+
416
+ // src/db/common.ts
417
+ var import_drizzle_orm3 = require("drizzle-orm");
418
+ function safe_query(operation, fn) {
419
+ return err.safe(fn, (reason, ...args) => err.new("db_error", { operation, args: args.slice(1), reason }));
420
+ }
421
+ function do_search(db6, table, options) {
422
+ if (!options.select.includes("id")) options.select.push("id");
423
+ return db6.select(fields(table, options.select)).from(table).where(conditions(table, options.where)).orderBy(order(table, options.order_by)).offset(options.offset).limit(options.limit).all();
424
+ }
425
+ function fields(table, fields2) {
426
+ const res = {};
427
+ for (const field of fields2) res[field] = table[field];
428
+ return res;
429
+ }
430
+ function conditions(table, filters) {
431
+ if (!filters || Object.keys(filters).length === 0) return void 0;
432
+ const parts = [];
433
+ for (const [field, value] of Object.entries(filters)) {
434
+ if (Array.isArray(value) && value.length > 0) {
435
+ const field_conditions = value.map((v) => condition(table, field, v));
436
+ parts.push((0, import_drizzle_orm3.or)(...field_conditions));
437
+ } else {
438
+ parts.push(condition(table, field, value));
439
+ }
440
+ }
441
+ return (0, import_drizzle_orm3.and)(...parts);
442
+ }
443
+ function condition(table, field, value) {
444
+ if (typeof value === "object" && value !== null) {
445
+ if ("contains" in value) return (0, import_drizzle_orm3.like)(table[field], `%${value.contains}%`);
446
+ if ("starts_with" in value) return (0, import_drizzle_orm3.like)(table[field], `${value.starts_with}%`);
447
+ if ("ends_with" in value) return (0, import_drizzle_orm3.like)(table[field], `%${value.ends_with}`);
448
+ return (0, import_drizzle_orm3.eq)(table[field], JSON.stringify(value));
449
+ }
450
+ return (0, import_drizzle_orm3.eq)(table[field], value);
451
+ }
452
+ function order(table, [field, direction]) {
453
+ return direction === "asc" ? (0, import_drizzle_orm3.asc)(table[field]) : (0, import_drizzle_orm3.desc)(table[field]);
454
+ }
455
+
456
+ // src/db/configs.ts
457
+ var get = safe_query(
458
+ "configs.get",
459
+ (ctx) => ctx.db.select().from(configs).where((0, import_drizzle_orm4.eq)(configs.id, 1)).get()
460
+ );
461
+ var upsert = safe_query(
462
+ "configs.upsert",
463
+ (ctx, data) => ctx.db.insert(configs).values({ id: 1, ...data }).onConflictDoUpdate({
464
+ target: configs.id,
465
+ set: { ...data, updated_at: import_drizzle_orm4.sql`(unixepoch())` }
466
+ }).run()
467
+ );
468
+
469
+ // src/db/files.ts
470
+ var files_exports = {};
471
+ __export(files_exports, {
472
+ all: () => all,
473
+ by_directory_path: () => by_directory_path,
474
+ by_id: () => by_id,
475
+ by_id_and_state: () => by_id_and_state,
476
+ by_path: () => by_path,
477
+ by_state: () => by_state,
478
+ del: () => del,
479
+ del_by_dir: () => del_by_dir,
480
+ get_directory_ids: () => get_directory_ids,
481
+ imported_by: () => imported_by,
482
+ importing: () => importing,
483
+ insert: () => insert,
484
+ search: () => search,
485
+ update: () => update,
486
+ update_many: () => update_many,
487
+ using_dependency: () => using_dependency
488
+ });
489
+ var import_drizzle_orm5 = require("drizzle-orm");
490
+
491
+ // src/internals/utils.ts
492
+ var import_fs = require("fs");
493
+ var parse_json = err.safe(JSON.parse, (reason, text2) => err.new("invalid_json", { reason, text: text2 }));
494
+ var read_file = err.safe(
495
+ (path6) => (0, import_fs.readFileSync)(path6, "utf-8"),
496
+ (reason, path6) => err.new("could_not_read_file", { path: path6, reason })
497
+ );
498
+ function group_by_unique(items, key) {
499
+ const groups = {};
500
+ for (const item of items) {
501
+ groups[key(item)] = item;
502
+ }
503
+ return groups;
504
+ }
505
+ function expand({ items, get_children, get_key }) {
506
+ const visited = /* @__PURE__ */ new Set();
507
+ const result = [];
508
+ const queue = [...items];
509
+ while (queue.length > 0) {
510
+ const item = queue.shift();
511
+ const key = get_key(item);
512
+ if (err.any(key)) return key;
513
+ if (visited.has(key)) continue;
514
+ visited.add(key);
515
+ result.push(item);
516
+ const children2 = get_children(item);
517
+ if (err.any(children2)) return children2;
518
+ queue.push(...children2);
519
+ }
520
+ return result;
521
+ }
522
+ function uniq(items) {
523
+ return [...new Set(items)];
524
+ }
525
+ function merge(a, b) {
526
+ const res = { ...a };
527
+ for (const key of Object.keys(b)) {
528
+ if (b[key] !== void 0) res[key] = b[key];
529
+ }
530
+ return res;
531
+ }
532
+
533
+ // src/db/defaults.ts
534
+ var files2 = {
535
+ select: ["id", "directory_id", "path", "state", "error"],
536
+ order_by: ["id", "asc"],
537
+ limit: 20,
538
+ offset: 0,
539
+ where: {}
540
+ };
541
+ var directories2 = {
542
+ select: ["id", "parent_id", "path", "state", "error"],
543
+ order_by: ["id", "asc"],
544
+ limit: 20,
545
+ offset: 0,
546
+ where: {}
547
+ };
548
+ var symbols2 = {
549
+ select: ["id", "file_id", "type", "name", "meta", "is_exported", "state", "error"],
550
+ order_by: ["id", "asc"],
551
+ limit: 20,
552
+ offset: 0,
553
+ where: {}
554
+ };
555
+ var external_dependencies2 = {
556
+ select: ["id", "package", "subpath", "name", "state", "error"],
557
+ order_by: ["id", "asc"],
558
+ limit: 20,
559
+ offset: 0,
560
+ where: {}
561
+ };
562
+
563
+ // src/db/files.ts
564
+ var default_select_fields = ["id", "directory_id", "path", "state", "error"];
565
+ var all = safe_query("files.all", (ctx) => ctx.db.select().from(files).all());
566
+ var search = safe_query("files.search", (ctx, options = {}) => {
567
+ return do_search(ctx.db, files, merge(files2, options));
568
+ });
569
+ var by_id = safe_query("files.by_id", (ctx, id) => ctx.db.select().from(files).where((0, import_drizzle_orm5.eq)(files.id, id)).get());
570
+ var by_path = safe_query(
571
+ "files.by_path",
572
+ (ctx, path6) => ctx.db.select().from(files).where((0, import_drizzle_orm5.eq)(files.path, path6)).get()
573
+ );
574
+ var by_state = safe_query(
575
+ "files.by_state",
576
+ (ctx, state) => ctx.db.select().from(files).where((0, import_drizzle_orm5.eq)(files.state, state)).all()
577
+ );
578
+ var insert = safe_query("files.insert", (ctx, values) => ctx.db.insert(files).values(values).run());
579
+ var update = safe_query(
580
+ "files.update",
581
+ (ctx, file_id, values) => ctx.db.update(files).set(values).where((0, import_drizzle_orm5.eq)(files.id, file_id)).run()
582
+ );
583
+ var update_many = safe_query(
584
+ "files.update_many",
585
+ (ctx, file_ids, values) => ctx.db.update(files).set(values).where((0, import_drizzle_orm5.inArray)(files.id, file_ids)).run()
586
+ );
587
+ var by_id_and_state = safe_query(
588
+ "files.by_id_and_state",
589
+ (ctx, params) => ctx.db.select().from(files).where((0, import_drizzle_orm5.and)((0, import_drizzle_orm5.eq)(files.id, params.id), (0, import_drizzle_orm5.eq)(files.state, params.state))).get()
590
+ );
591
+ var del = safe_query("files.delete", (ctx, file_id) => ctx.db.delete(files).where((0, import_drizzle_orm5.eq)(files.id, file_id)).run());
592
+ var del_by_dir = safe_query(
593
+ "files.delete_by_dir",
594
+ (ctx, directory_id) => ctx.db.delete(files).where((0, import_drizzle_orm5.eq)(files.directory_id, directory_id)).run()
595
+ );
596
+ var get_directory_ids = safe_query(
597
+ "files.get_directory_ids",
598
+ (ctx, file_ids) => ctx.db.select({ directory_id: files.directory_id }).from(files).where((0, import_drizzle_orm5.inArray)(files.id, file_ids)).all().map((x) => x.directory_id)
599
+ );
600
+ var by_directory_path = safe_query("files.by_directory_path", (ctx, dir_path, recursive = false) => {
601
+ let dir_ids;
602
+ if (recursive) {
603
+ if (dir_path === "/") {
604
+ dir_ids = ctx.db.select({ id: directories.id }).from(directories).all().map((d) => d.id);
605
+ } else {
606
+ dir_ids = ctx.db.select({ id: directories.id }).from(directories).where((0, import_drizzle_orm5.or)((0, import_drizzle_orm5.eq)(directories.path, dir_path), (0, import_drizzle_orm5.like)(directories.path, `${dir_path}/%`))).all().map((d) => d.id);
607
+ }
608
+ } else {
609
+ const dir = ctx.db.select({ id: directories.id }).from(directories).where((0, import_drizzle_orm5.eq)(directories.path, dir_path)).get();
610
+ dir_ids = dir ? [dir.id] : [];
611
+ }
612
+ if (dir_ids.length === 0) return [];
613
+ return ctx.db.select().from(files).where((0, import_drizzle_orm5.inArray)(files.directory_id, dir_ids)).all();
614
+ });
615
+ var using_dependency = safe_query(
616
+ "files.using_dependency",
617
+ (ctx, external_dependency_id, fields_to_select = default_select_fields) => {
618
+ if (!fields_to_select.includes("id")) fields_to_select.push("id");
619
+ const imports2 = ctx.db.select({ file_id: external_imports.file_id }).from(external_imports).where((0, import_drizzle_orm5.eq)(external_imports.external_dependency_id, external_dependency_id)).all();
620
+ const file_ids = uniq(imports2.map((i) => i.file_id));
621
+ if (file_ids.length === 0) return [];
622
+ return ctx.db.select(fields(files, fields_to_select)).from(files).where((0, import_drizzle_orm5.inArray)(files.id, file_ids)).all();
623
+ }
624
+ );
625
+ var imported_by = safe_query(
626
+ "files.imported_by",
627
+ (ctx, file_id, fields_to_select = default_select_fields) => {
628
+ if (!fields_to_select.includes("id")) fields_to_select.push("id");
629
+ const import_rows = ctx.db.select({ id: imports.exporter_file_id }).from(imports).where((0, import_drizzle_orm5.eq)(imports.importer_file_id, file_id)).all();
630
+ const file_ids = uniq(import_rows.map((i) => i.id));
631
+ if (file_ids.length === 0) return [];
632
+ return ctx.db.select(fields(files, fields_to_select)).from(files).where((0, import_drizzle_orm5.inArray)(files.id, file_ids)).all();
633
+ }
634
+ );
635
+ var importing = safe_query(
636
+ "files.importing",
637
+ (ctx, file_id, fields_to_select = default_select_fields) => {
638
+ if (!fields_to_select.includes("id")) fields_to_select.push("id");
639
+ const import_records = ctx.db.select({ importer_file_id: imports.importer_file_id }).from(imports).where((0, import_drizzle_orm5.eq)(imports.exporter_file_id, file_id)).all();
640
+ const file_ids = uniq(import_records.map((i) => i.importer_file_id));
641
+ if (file_ids.length === 0) return [];
642
+ return ctx.db.select(fields(files, fields_to_select)).from(files).where((0, import_drizzle_orm5.inArray)(files.id, file_ids)).all();
643
+ }
644
+ );
645
+
646
+ // src/db/directories.ts
647
+ var directories_exports = {};
648
+ __export(directories_exports, {
649
+ by_id: () => by_id2,
650
+ by_id_and_state: () => by_id_and_state2,
651
+ by_path: () => by_path2,
652
+ by_state: () => by_state2,
653
+ insert: () => insert2,
654
+ search: () => search2,
655
+ update: () => update2,
656
+ update_many: () => update_many2
657
+ });
658
+ var import_drizzle_orm6 = require("drizzle-orm");
659
+ var by_id2 = safe_query(
660
+ "directories.by_id",
661
+ (ctx, id) => ctx.db.select().from(directories).where((0, import_drizzle_orm6.eq)(directories.id, id)).get()
662
+ );
663
+ var by_path2 = safe_query(
664
+ "directories.by_path",
665
+ (ctx, path6) => ctx.db.select().from(directories).where((0, import_drizzle_orm6.eq)(directories.path, path6)).get()
666
+ );
667
+ var by_state2 = safe_query(
668
+ "directories.by_state",
669
+ (ctx, state) => ctx.db.select().from(directories).where((0, import_drizzle_orm6.eq)(directories.state, state)).all()
670
+ );
671
+ var insert2 = safe_query(
672
+ "directories.insert",
673
+ (ctx, values) => ctx.db.insert(directories).values(values).returning().get()
674
+ );
675
+ var update2 = safe_query(
676
+ "directories.update",
677
+ (ctx, id, values) => ctx.db.update(directories).set(values).where((0, import_drizzle_orm6.eq)(directories.id, id)).run()
678
+ );
679
+ var update_many2 = safe_query(
680
+ "directories.update_many",
681
+ (ctx, ids, values) => ctx.db.update(directories).set(values).where((0, import_drizzle_orm6.inArray)(directories.id, ids)).run()
682
+ );
683
+ var by_id_and_state2 = safe_query(
684
+ "directories.by_id_and_state",
685
+ (ctx, params) => ctx.db.select().from(directories).where((0, import_drizzle_orm6.and)((0, import_drizzle_orm6.eq)(directories.id, params.id), (0, import_drizzle_orm6.eq)(directories.state, params.state))).get()
686
+ );
687
+ var search2 = safe_query("directories.search", (ctx, options = {}) => {
688
+ return do_search(ctx.db, directories, merge(directories2, options));
689
+ });
690
+
691
+ // src/db/imports.ts
692
+ var imports_exports = {};
693
+ __export(imports_exports, {
694
+ by_exporter_file: () => by_exporter_file,
695
+ by_importer_file: () => by_importer_file,
696
+ by_state: () => by_state3,
697
+ del_by_importer_file: () => del_by_importer_file,
698
+ insert_many: () => insert_many,
699
+ update: () => update3
700
+ });
701
+ var import_drizzle_orm7 = require("drizzle-orm");
702
+ var by_exporter_file = safe_query(
703
+ "imports.by_exporter_file",
704
+ (ctx, exporter_file_id) => ctx.db.select().from(imports).where((0, import_drizzle_orm7.eq)(imports.exporter_file_id, exporter_file_id)).all()
705
+ );
706
+ var by_importer_file = safe_query(
707
+ "imports.by_importer_file",
708
+ (ctx, importer_file_id) => ctx.db.select().from(imports).where((0, import_drizzle_orm7.eq)(imports.importer_file_id, importer_file_id)).all()
709
+ );
710
+ var insert_many = safe_query("imports.insert_many", (ctx, values) => ctx.db.insert(imports).values(values).run());
711
+ var del_by_importer_file = safe_query(
712
+ "imports.del_by_importer_file",
713
+ (ctx, file_id) => ctx.db.delete(imports).where((0, import_drizzle_orm7.eq)(imports.importer_file_id, file_id)).run()
714
+ );
715
+ var by_state3 = safe_query(
716
+ "imports.by_state",
717
+ (ctx, state) => ctx.db.select().from(imports).where((0, import_drizzle_orm7.eq)(imports.state, state)).all()
718
+ );
719
+ var update3 = safe_query(
720
+ "imports.update",
721
+ (ctx, id, data) => ctx.db.update(imports).set(data).where((0, import_drizzle_orm7.eq)(imports.id, id)).run()
722
+ );
723
+
724
+ // src/db/symbols.ts
725
+ var symbols_exports = {};
726
+ __export(symbols_exports, {
727
+ by_file: () => by_file,
728
+ by_file_and_name: () => by_file_and_name,
729
+ by_id: () => by_id3,
730
+ by_id_and_state: () => by_id_and_state3,
731
+ by_state: () => by_state4,
732
+ del_by_file: () => del_by_file,
733
+ insert_many: () => insert_many2,
734
+ meta: () => meta,
735
+ referenced_by: () => referenced_by,
736
+ referencing: () => referencing,
737
+ search: () => search3,
738
+ update: () => update4,
739
+ using_dependency: () => using_dependency2
740
+ });
741
+ var import_drizzle_orm8 = require("drizzle-orm");
742
+ var insert_many2 = safe_query("symbols.insert_many", (ctx, values) => ctx.db.insert(symbols).values(values).run());
743
+ var del_by_file = safe_query(
744
+ "symbols.delete_by_file",
745
+ (ctx, file_id) => ctx.db.delete(symbols).where((0, import_drizzle_orm8.eq)(symbols.file_id, file_id)).run()
746
+ );
747
+ var by_file_and_name = safe_query(
748
+ "symbols.by_file_and_name",
749
+ (ctx, params) => ctx.db.select().from(symbols).where((0, import_drizzle_orm8.and)((0, import_drizzle_orm8.eq)(symbols.file_id, params.file_id), (0, import_drizzle_orm8.eq)(symbols.name, params.name), (0, import_drizzle_orm8.eq)(symbols.is_exported, params.is_exported))).get()
750
+ );
751
+ var by_state4 = safe_query(
752
+ "symbols.by_state",
753
+ (ctx, state) => ctx.db.select().from(symbols).where((0, import_drizzle_orm8.eq)(symbols.state, state)).all()
754
+ );
755
+ var by_file = safe_query(
756
+ "symbols.by_file",
757
+ (ctx, file_id) => ctx.db.select().from(symbols).where((0, import_drizzle_orm8.eq)(symbols.file_id, file_id)).all()
758
+ );
759
+ var update4 = safe_query(
760
+ "symbols.update",
761
+ (ctx, id, data) => ctx.db.update(symbols).set(data).where((0, import_drizzle_orm8.eq)(symbols.id, id)).run()
762
+ );
763
+ var by_id3 = safe_query("symbols.by_id", (ctx, id) => ctx.db.select().from(symbols).where((0, import_drizzle_orm8.eq)(symbols.id, id)).get());
764
+ var by_id_and_state3 = safe_query(
765
+ "symbols.by_id_and_state",
766
+ (ctx, params) => ctx.db.select().from(symbols).where((0, import_drizzle_orm8.and)((0, import_drizzle_orm8.eq)(symbols.id, params.id), (0, import_drizzle_orm8.eq)(symbols.state, params.state))).get()
767
+ );
768
+ function meta(symbol) {
769
+ return err.catch(
770
+ () => JSON.parse(symbol.meta),
771
+ (reason) => err.new("symbol_meta_parse_error", { reason, symbol_id: symbol.id, meta: symbol.meta })
772
+ );
773
+ }
774
+ var search3 = safe_query("symbols.search", (ctx, options = {}) => {
775
+ return do_search(ctx.db, symbols, merge(symbols2, options));
776
+ });
777
+ var referenced_by = safe_query(
778
+ "symbols.referenced_by",
779
+ (ctx, symbol_id, fields_to_select = symbols2.select) => {
780
+ if (!fields_to_select.includes("id")) fields_to_select.push("id");
781
+ const link_records = ctx.db.select({ id: symbol_internal_links.to_symbol_id }).from(symbol_internal_links).where((0, import_drizzle_orm8.eq)(symbol_internal_links.from_symbol_id, symbol_id)).all();
782
+ const symbol_ids = uniq(link_records.map((i) => i.id).filter((id) => id !== null));
783
+ if (symbol_ids.length === 0) return [];
784
+ return ctx.db.select(fields(symbols, fields_to_select)).from(symbols).where((0, import_drizzle_orm8.inArray)(symbols.id, symbol_ids)).all();
785
+ }
786
+ );
787
+ var referencing = safe_query(
788
+ "symbols.referencing",
789
+ (ctx, symbol_id, fields_to_select = symbols2.select) => {
790
+ if (!fields_to_select.includes("id")) fields_to_select.push("id");
791
+ const link_records = ctx.db.select({ id: symbol_internal_links.from_symbol_id }).from(symbol_internal_links).where((0, import_drizzle_orm8.eq)(symbol_internal_links.to_symbol_id, symbol_id)).all();
792
+ const symbol_ids = uniq(link_records.map((i) => i.id).filter((id) => id !== null));
793
+ if (symbol_ids.length === 0) return [];
794
+ return ctx.db.select(fields(symbols, fields_to_select)).from(symbols).where((0, import_drizzle_orm8.inArray)(symbols.id, symbol_ids)).all();
795
+ }
796
+ );
797
+ var using_dependency2 = safe_query(
798
+ "symbols.using_dependency",
799
+ (ctx, dependency_id, fields_to_select = symbols2.select) => {
800
+ if (!fields_to_select.includes("id")) fields_to_select.push("id");
801
+ const link_records = ctx.db.select({ symbol_id: symbol_external_links.symbol_id }).from(symbol_external_links).innerJoin(external_imports, (0, import_drizzle_orm8.eq)(symbol_external_links.external_import_id, external_imports.id)).where((0, import_drizzle_orm8.eq)(external_imports.external_dependency_id, dependency_id)).all();
802
+ const symbol_ids = uniq(link_records.map((i) => i.symbol_id));
803
+ if (symbol_ids.length === 0) return [];
804
+ return ctx.db.select(fields(symbols, fields_to_select)).from(symbols).where((0, import_drizzle_orm8.inArray)(symbols.id, symbol_ids)).all();
805
+ }
806
+ );
807
+
808
+ // src/db/external_dependencies.ts
809
+ var external_dependencies_exports = {};
810
+ __export(external_dependencies_exports, {
811
+ all: () => all2,
812
+ by_id: () => by_id4,
813
+ by_package_subpath_and_name: () => by_package_subpath_and_name,
814
+ by_state: () => by_state5,
815
+ get_or_create: () => get_or_create,
816
+ insert: () => insert3,
817
+ search: () => search4,
818
+ update: () => update5,
819
+ used_by_file: () => used_by_file,
820
+ used_by_symbol: () => used_by_symbol
821
+ });
822
+ var import_drizzle_orm9 = require("drizzle-orm");
823
+ var by_id4 = safe_query(
824
+ "external_dependencies.by_id",
825
+ (ctx, id) => ctx.db.select().from(external_dependencies).where((0, import_drizzle_orm9.eq)(external_dependencies.id, id)).get()
826
+ );
827
+ var by_state5 = safe_query(
828
+ "external_dependencies.by_state",
829
+ (ctx, state) => ctx.db.select().from(external_dependencies).where((0, import_drizzle_orm9.eq)(external_dependencies.state, state)).all()
830
+ );
831
+ var by_package_subpath_and_name = safe_query(
832
+ "external_dependencies.by_package_subpath_and_name",
833
+ (ctx, params) => ctx.db.select().from(external_dependencies).where(
834
+ (0, import_drizzle_orm9.and)(
835
+ (0, import_drizzle_orm9.eq)(external_dependencies.package, params.package),
836
+ params.subpath === null ? import_drizzle_orm9.sql`${external_dependencies.subpath} IS NULL` : (0, import_drizzle_orm9.eq)(external_dependencies.subpath, params.subpath),
837
+ params.name === null ? import_drizzle_orm9.sql`${external_dependencies.name} IS NULL` : (0, import_drizzle_orm9.eq)(external_dependencies.name, params.name)
838
+ )
839
+ ).get()
840
+ );
841
+ var insert3 = safe_query(
842
+ "external_dependencies.insert",
843
+ (ctx, value) => ctx.db.insert(external_dependencies).values(value).returning().get()
844
+ );
845
+ var update5 = safe_query(
846
+ "external_dependencies.update",
847
+ (ctx, id, data) => ctx.db.update(external_dependencies).set(data).where((0, import_drizzle_orm9.eq)(external_dependencies.id, id)).run()
848
+ );
849
+ var all2 = safe_query("external_dependencies.all", (ctx) => ctx.db.select().from(external_dependencies).all());
850
+ function get_or_create(ctx, value) {
851
+ return err.pipe(
852
+ () => by_package_subpath_and_name(ctx, { package: value.package, subpath: value.subpath ?? null, name: value.name ?? null }),
853
+ (existing) => existing || insert3(ctx, value)
854
+ );
855
+ }
856
+ var search4 = safe_query(
857
+ "external_dependencies.search",
858
+ (ctx, options = {}) => {
859
+ return do_search(ctx.db, external_dependencies, merge(external_dependencies2, options));
860
+ }
861
+ );
862
+ var used_by_file = safe_query(
863
+ "external_dependencies.used_by_file",
864
+ (ctx, file_id, fields_to_select = external_dependencies2.select) => {
865
+ if (!fields_to_select.includes("id")) fields_to_select.push("id");
866
+ const imports_records = ctx.db.select({ external_dependency_id: external_imports.external_dependency_id }).from(external_imports).where((0, import_drizzle_orm9.eq)(external_imports.file_id, file_id)).all();
867
+ const dependency_ids = uniq(imports_records.map((r) => r.external_dependency_id));
868
+ if (dependency_ids.length === 0) return [];
869
+ return ctx.db.select(fields(external_dependencies, fields_to_select)).from(external_dependencies).where((0, import_drizzle_orm9.inArray)(external_dependencies.id, dependency_ids)).all();
870
+ }
871
+ );
872
+ var used_by_symbol = safe_query(
873
+ "external_dependencies.used_by_symbol",
874
+ (ctx, symbol_id, fields_to_select = external_dependencies2.select) => {
875
+ if (!fields_to_select.includes("id")) fields_to_select.push("id");
876
+ const link_records = ctx.db.select({ external_import_id: symbol_external_links.external_import_id }).from(symbol_external_links).where((0, import_drizzle_orm9.eq)(symbol_external_links.symbol_id, symbol_id)).all();
877
+ if (link_records.length === 0) return [];
878
+ const external_import_ids = uniq(link_records.map((r) => r.external_import_id));
879
+ const imports_records = ctx.db.select({ external_dependency_id: external_imports.external_dependency_id }).from(external_imports).where((0, import_drizzle_orm9.inArray)(external_imports.id, external_import_ids)).all();
880
+ const dependency_ids = uniq(imports_records.map((r) => r.external_dependency_id));
881
+ if (dependency_ids.length === 0) return [];
882
+ return ctx.db.select(fields(external_dependencies, fields_to_select)).from(external_dependencies).where((0, import_drizzle_orm9.inArray)(external_dependencies.id, dependency_ids)).all();
883
+ }
884
+ );
885
+
886
+ // src/db/external_imports.ts
887
+ var external_imports_exports = {};
888
+ __export(external_imports_exports, {
889
+ by_external_dependency: () => by_external_dependency,
890
+ by_file: () => by_file2,
891
+ by_symbol: () => by_symbol,
892
+ del_by_file: () => del_by_file2,
893
+ insert_many: () => insert_many3
894
+ });
895
+ var import_drizzle_orm10 = require("drizzle-orm");
896
+ var insert_many3 = safe_query(
897
+ "external_imports.insert_many",
898
+ (ctx, values) => ctx.db.insert(external_imports).values(values).run()
899
+ );
900
+ var del_by_file2 = safe_query(
901
+ "external_imports.delete_by_file",
902
+ (ctx, file_id) => ctx.db.delete(external_imports).where((0, import_drizzle_orm10.eq)(external_imports.file_id, file_id)).run()
903
+ );
904
+ var by_file2 = safe_query(
905
+ "external_imports.by_file",
906
+ (ctx, file_id) => ctx.db.select().from(external_imports).where((0, import_drizzle_orm10.eq)(external_imports.file_id, file_id)).all()
907
+ );
908
+ var by_external_dependency = safe_query(
909
+ "external_imports.by_external_dependency",
910
+ (ctx, external_dependency_id) => ctx.db.select().from(external_imports).where((0, import_drizzle_orm10.eq)(external_imports.external_dependency_id, external_dependency_id)).all()
911
+ );
912
+ var by_symbol = safe_query(
913
+ "external_imports.by_symbol",
914
+ (ctx, symbol_id) => ctx.db.query.symbol_external_links.findMany({
915
+ where: (0, import_drizzle_orm10.eq)(symbol_external_links.symbol_id, symbol_id),
916
+ with: {
917
+ external_import: {
918
+ with: {
919
+ external_dependency: true
920
+ }
921
+ }
922
+ }
923
+ })
924
+ );
925
+
926
+ // src/db/symbol_internal_links.ts
927
+ var symbol_internal_links_exports = {};
928
+ __export(symbol_internal_links_exports, {
929
+ by_from_symbol: () => by_from_symbol,
930
+ del_by_from_symbol: () => del_by_from_symbol,
931
+ exists: () => exists,
932
+ insert: () => insert4
933
+ });
934
+ var import_drizzle_orm11 = require("drizzle-orm");
935
+ var by_from_symbol = safe_query(
936
+ "symbol_internal_links.by_from_symbol",
937
+ (ctx, from_symbol_id) => ctx.db.query.symbol_internal_links.findMany({
938
+ where: (0, import_drizzle_orm11.eq)(symbol_internal_links.from_symbol_id, from_symbol_id),
939
+ with: {
940
+ to_symbol: {
941
+ with: {
942
+ file: true
943
+ }
944
+ }
945
+ }
946
+ })
947
+ );
948
+ var insert4 = safe_query(
949
+ "symbol_internal_links.insert",
950
+ (ctx, value) => ctx.db.insert(symbol_internal_links).values(value).run()
951
+ );
952
+ var exists = safe_query(
953
+ "symbol_internal_links.exists",
954
+ (ctx, params) => ctx.db.select({ id: symbol_internal_links.id }).from(symbol_internal_links).where((0, import_drizzle_orm11.and)((0, import_drizzle_orm11.eq)(symbol_internal_links.from_symbol_id, params.from_symbol_id), (0, import_drizzle_orm11.eq)(symbol_internal_links.to_symbol_id, params.to_symbol_id))).get()
955
+ );
956
+ var del_by_from_symbol = safe_query(
957
+ "symbol_internal_links.del_by_from_symbol",
958
+ (ctx, from_symbol_id) => ctx.db.delete(symbol_internal_links).where((0, import_drizzle_orm11.eq)(symbol_internal_links.from_symbol_id, from_symbol_id)).run()
959
+ );
960
+
961
+ // src/db/symbol_external_links.ts
962
+ var symbol_external_links_exports = {};
963
+ __export(symbol_external_links_exports, {
964
+ by_external_import: () => by_external_import,
965
+ by_symbol: () => by_symbol2,
966
+ del_by_symbol: () => del_by_symbol,
967
+ exists: () => exists2,
968
+ insert: () => insert5
969
+ });
970
+ var import_drizzle_orm12 = require("drizzle-orm");
971
+ var by_symbol2 = safe_query(
972
+ "symbol_external_links.by_symbol",
973
+ (ctx, symbol_id) => ctx.db.select().from(symbol_external_links).where((0, import_drizzle_orm12.eq)(symbol_external_links.symbol_id, symbol_id)).all()
974
+ );
975
+ var insert5 = safe_query(
976
+ "symbol_external_links.insert",
977
+ (ctx, value) => ctx.db.insert(symbol_external_links).values(value).run()
978
+ );
979
+ var by_external_import = safe_query(
980
+ "symbol_external_links.by_external_import",
981
+ (ctx, external_import_id) => ctx.db.select().from(symbol_external_links).where((0, import_drizzle_orm12.eq)(symbol_external_links.external_import_id, external_import_id)).all()
982
+ );
983
+ var exists2 = safe_query(
984
+ "symbol_external_links.exists",
985
+ (ctx, params) => ctx.db.select({ id: symbol_external_links.id }).from(symbol_external_links).where((0, import_drizzle_orm12.and)((0, import_drizzle_orm12.eq)(symbol_external_links.symbol_id, params.symbol_id), (0, import_drizzle_orm12.eq)(symbol_external_links.external_import_id, params.external_import_id))).get()
986
+ );
987
+ var del_by_symbol = safe_query(
988
+ "symbol_external_links.del_by_symbol",
989
+ (ctx, symbol_id) => ctx.db.delete(symbol_external_links).where((0, import_drizzle_orm12.eq)(symbol_external_links.symbol_id, symbol_id)).run()
990
+ );
991
+
992
+ // src/internals/context.ts
993
+ var import_meta = {};
994
+ async function create_context(sqlite, db6, config) {
995
+ const project_path = import_path2.default.resolve(config.project_path);
996
+ const currentDir = (0, import_path2.dirname)((0, import_url.fileURLToPath)(import_meta.url));
997
+ const migrations_path = currentDir.includes("/dist") ? (0, import_path2.join)(currentDir, "../migrations") : (0, import_path2.join)(currentDir, "../../migrations");
998
+ const tsconfig_path = (0, import_path2.join)(project_path, "tsconfig.json");
999
+ if (!import_typescript.default.sys.fileExists(tsconfig_path)) {
1000
+ throw err.new("file_not_found", { path: tsconfig_path });
1001
+ }
1002
+ const tsconfig = import_typescript.default.parseJsonConfigFileContent(import_typescript.default.readConfigFile(tsconfig_path, import_typescript.default.sys.readFile).config, import_typescript.default.sys, project_path);
1003
+ const program = import_typescript.default.createProgram({ rootNames: tsconfig.fileNames, options: tsconfig.options });
1004
+ const package_json_path = config.package_json_path ?? import_path2.default.join(project_path, "package.json");
1005
+ const node_modules_paths = config.node_modules_paths ?? [import_path2.default.join(project_path, "node_modules")];
1006
+ const dependencies = await get_dependencies(package_json_path, node_modules_paths);
1007
+ const ctx = { db: db6, sqlite, migrations_path, project_path, program, dependencies };
1008
+ await migrate(ctx);
1009
+ err.or_throw(
1010
+ configs_exports.upsert(ctx, {
1011
+ project_path,
1012
+ description: config.description ?? null,
1013
+ package_json_path: config.package_json_path ?? null,
1014
+ node_modules_paths: config.node_modules_paths ? JSON.stringify(config.node_modules_paths) : null
1015
+ })
1016
+ );
1017
+ return ctx;
1018
+ }
1019
+ async function context_from_config(config) {
1020
+ const sqlite = new import_better_sqlite3.default(config.db_path);
1021
+ sqlite.pragma("foreign_keys = ON");
1022
+ const db6 = (0, import_better_sqlite32.drizzle)(sqlite, { schema: schema_exports });
1023
+ return create_context(sqlite, db6, config);
1024
+ }
1025
+ async function context_from_db(db_path) {
1026
+ const sqlite = new import_better_sqlite3.default(db_path);
1027
+ sqlite.pragma("foreign_keys = ON");
1028
+ const db6 = (0, import_better_sqlite32.drizzle)(sqlite, { schema: schema_exports });
1029
+ const temp_ctx = { db: db6, sqlite };
1030
+ const stored = err.or_throw(configs_exports.get(temp_ctx));
1031
+ if (!stored) {
1032
+ sqlite.close();
1033
+ throw err.new("config_not_found", { db_path });
1034
+ }
1035
+ let node_modules_paths;
1036
+ if (stored.node_modules_paths) {
1037
+ try {
1038
+ node_modules_paths = JSON.parse(stored.node_modules_paths);
1039
+ } catch (parse_error) {
1040
+ sqlite.close();
1041
+ throw err.new("config_invalid_node_modules_paths", { db_path, reason: parse_error });
1042
+ }
1043
+ }
1044
+ return create_context(sqlite, db6, {
1045
+ db_path,
1046
+ project_path: stored.project_path,
1047
+ description: stored.description ?? void 0,
1048
+ package_json_path: stored.package_json_path ?? void 0,
1049
+ node_modules_paths
1050
+ });
1051
+ }
1052
+ async function get_dependencies(package_json_path, node_modules_paths) {
1053
+ const dependencies = {};
1054
+ const package_json = JSON.parse(await (0, import_promises2.readFile)(package_json_path, "utf-8"));
1055
+ const packages = { ...package_json.dependencies ?? {}, ...package_json.devDependencies ?? {} };
1056
+ for (const [name, version] of Object.entries(packages)) {
1057
+ dependencies[name] = { name, version, github_repo: await get_github_repo(node_modules_paths, name) };
1058
+ }
1059
+ return dependencies;
1060
+ }
1061
+ async function get_github_repo(node_modules_paths, package_name) {
1062
+ for (const node_modules_path of node_modules_paths) {
1063
+ try {
1064
+ const package_json_path = import_path2.default.join(node_modules_path, package_name, "package.json");
1065
+ const package_json = JSON.parse(await (0, import_promises2.readFile)(package_json_path, "utf-8"));
1066
+ const url = package_json.repository?.url || package_json.repository;
1067
+ if (typeof url === "string") {
1068
+ let repo = url.split("/").slice(-2).join("/");
1069
+ if (repo.endsWith(".git")) repo = repo.slice(0, -4);
1070
+ return repo.split(":").pop();
1071
+ }
1072
+ } catch {
1073
+ }
1074
+ }
1075
+ return void 0;
1076
+ }
1077
+
1078
+ // src/update/track_changes.ts
1079
+ var import_path3 = __toESM(require("path"), 1);
1080
+ var import_typescript2 = require("typescript");
1081
+ var import_promises3 = require("fs/promises");
1082
+
1083
+ // src/update/events.ts
1084
+ function file_updated(ctx, file_id) {
1085
+ const impacted_files_ids = err.or_throw(
1086
+ expand({
1087
+ items: [file_id],
1088
+ get_key: (id) => id,
1089
+ get_children: (id) => {
1090
+ const imports2 = imports_exports.by_exporter_file(ctx, id);
1091
+ if (err.any(imports2)) return imports2;
1092
+ return imports2.map((x) => x.importer_file_id);
1093
+ }
1094
+ })
1095
+ );
1096
+ const dir_ids = err.or_throw(files_exports.get_directory_ids(ctx, impacted_files_ids));
1097
+ const impacted_dirs_ids = err.or_throw(
1098
+ expand({
1099
+ items: dir_ids,
1100
+ get_key: (id) => id,
1101
+ get_children: (id) => {
1102
+ const dir = directories_exports.by_id(ctx, id);
1103
+ if (err.any(dir)) return dir;
1104
+ return dir?.parent_id ? [dir.parent_id] : [];
1105
+ }
1106
+ })
1107
+ );
1108
+ err.or_throw(files_exports.update_many(ctx, impacted_files_ids, { state: "to_scan" }));
1109
+ err.or_throw(directories_exports.update_many(ctx, impacted_dirs_ids, { state: "to_describe" }));
1110
+ }
1111
+
1112
+ // src/update/track_changes.ts
1113
+ async function track_changes(ctx) {
1114
+ const db_files = err.or_throw(files_exports.all(ctx));
1115
+ const { created, updated, deleted } = await changes(ctx, get_source_files(ctx), db_files);
1116
+ for (const { source_file, hash } of created) handle_new_source_file(ctx, source_file, hash);
1117
+ for (const { db_file, hash } of updated) handle_changed_source_file(ctx, db_file, hash);
1118
+ for (const { db_file } of deleted) handle_deleted_source_file(ctx, db_file);
1119
+ }
1120
+ function get_source_files(ctx) {
1121
+ const src_files = [];
1122
+ for (const file of ctx.program.getSourceFiles()) {
1123
+ if (ctx.program.isSourceFileDefaultLibrary(file)) continue;
1124
+ if (ctx.program.isSourceFileFromExternalLibrary(file)) continue;
1125
+ if (!import_path3.default.resolve(file.fileName).startsWith(ctx.project_path)) continue;
1126
+ src_files.push(file);
1127
+ }
1128
+ return src_files;
1129
+ }
1130
+ function handle_new_source_file(ctx, file, hash) {
1131
+ const file_path = err.or_throw(get_file_path(ctx, file));
1132
+ const dirs_paths = err.or_throw(get_parents_paths(ctx, file));
1133
+ let parent_dir_id = null;
1134
+ for (const dir_path of dirs_paths) {
1135
+ let dir = err.or_throw(directories_exports.by_path(ctx, dir_path));
1136
+ if (dir) {
1137
+ err.or_throw(directories_exports.update(ctx, dir.id, { state: "to_describe" }));
1138
+ } else {
1139
+ dir = err.or_throw(directories_exports.insert(ctx, { path: dir_path, state: "to_describe", parent_id: parent_dir_id }));
1140
+ }
1141
+ parent_dir_id = dir.id;
1142
+ }
1143
+ err.or_throw(files_exports.insert(ctx, { directory_id: parent_dir_id, path: file_path, state: "to_scan", hash }));
1144
+ }
1145
+ function handle_changed_source_file(ctx, db_file, hash) {
1146
+ file_updated(ctx, db_file.id);
1147
+ err.or_throw(files_exports.update(ctx, db_file.id, { hash }));
1148
+ }
1149
+ function handle_deleted_source_file(ctx, db_file) {
1150
+ err.or_throw(handle_changed_source_file(ctx, db_file, ""));
1151
+ err.or_throw(files_exports.del(ctx, db_file.id));
1152
+ }
1153
+ async function changes(ctx, source_files, db_files) {
1154
+ const created = [];
1155
+ const updated = [];
1156
+ const deleted = [];
1157
+ const db_files_index = group_by_unique(db_files, (x) => x.path);
1158
+ const source_files_index = group_by_unique(source_files, (x) => err.or(get_file_path(ctx, x), ""));
1159
+ const filenames = new Set(Object.keys(source_files_index).concat(Object.keys(db_files_index)));
1160
+ for (const filename of filenames) {
1161
+ const db_file = db_files_index[filename];
1162
+ const source_file = source_files_index[filename];
1163
+ if (!db_file && source_file) created.push({ source_file, hash: await file_signature(source_file.fileName) });
1164
+ if (db_file && !source_file) deleted.push({ db_file });
1165
+ if (db_file && source_file) {
1166
+ const hash = await file_signature(source_file.fileName);
1167
+ if (db_file.hash !== hash) updated.push({ db_file, source_file, hash });
1168
+ }
1169
+ }
1170
+ return { created, updated, deleted };
1171
+ }
1172
+ function get_file_path(ctx, file) {
1173
+ const absolute_path = import_path3.default.resolve(file.fileName);
1174
+ if (absolute_path.startsWith(ctx.project_path)) return absolute_path.slice(ctx.project_path.length);
1175
+ return err.new("file_outside_project_path", { file_path: absolute_path, project_path: ctx.project_path });
1176
+ }
1177
+ function get_parents_paths(ctx, file) {
1178
+ const file_path = get_file_path(ctx, file);
1179
+ if (err.any(file_path)) return file_path;
1180
+ const dirs = [];
1181
+ let current = import_path3.default.dirname(file_path);
1182
+ while (current !== import_path3.default.sep) {
1183
+ dirs.push(current);
1184
+ current = import_path3.default.dirname(current);
1185
+ }
1186
+ dirs.push(current);
1187
+ return dirs.reverse();
1188
+ }
1189
+ async function file_signature(file_path) {
1190
+ const stats = await (0, import_promises3.stat)(file_path);
1191
+ return `${stats.mtimeMs}:${stats.size}`;
1192
+ }
1193
+
1194
+ // src/update/sync_external_dependencies.ts
1195
+ async function sync_external_dependencies(ctx) {
1196
+ const db_deps = err.or_throw(external_dependencies_exports.all(ctx));
1197
+ for (const ctx_dep of Object.values(ctx.dependencies)) {
1198
+ const existing = db_deps.filter((d) => d.package === ctx_dep.name);
1199
+ if (existing.length === 0) continue;
1200
+ const needs_update = existing.some((d) => d.version !== ctx_dep.version || (d.github_repo || "") !== (ctx_dep.github_repo || ""));
1201
+ if (!needs_update) continue;
1202
+ for (const db_dep of existing) {
1203
+ err.or_throw(
1204
+ external_dependencies_exports.update(ctx, db_dep.id, {
1205
+ version: ctx_dep.version,
1206
+ github_repo: ctx_dep.github_repo,
1207
+ state: "to_describe",
1208
+ error: null
1209
+ })
1210
+ );
1211
+ const files3 = err.or_throw(files_exports.using_dependency(ctx, db_dep.id, ["id"]));
1212
+ for (const file of files3) file_updated(ctx, file.id);
1213
+ }
1214
+ }
1215
+ }
1216
+
1217
+ // src/update/scan_files/scan_files.ts
1218
+ var import_path5 = __toESM(require("path"), 1);
1219
+ var import_typescript10 = __toESM(require("typescript"), 1);
1220
+
1221
+ // src/update/scan_files/imports.ts
1222
+ var import_typescript4 = __toESM(require("typescript"), 1);
1223
+
1224
+ // src/update/scan_files/common.ts
1225
+ var import_path4 = __toESM(require("path"), 1);
1226
+ var import_typescript3 = __toESM(require("typescript"), 1);
1227
+ function is_external_module(ctx, source_file, module_path) {
1228
+ const resolved = import_typescript3.default.resolveModuleName(module_path, source_file.fileName, ctx.program.getCompilerOptions(), import_typescript3.default.sys);
1229
+ if (!resolved.resolvedModule) return true;
1230
+ const resolved_path = import_path4.default.resolve(resolved.resolvedModule.resolvedFileName);
1231
+ return !resolved_path.startsWith(ctx.project_path);
1232
+ }
1233
+ function has_export_modifier(node) {
1234
+ if (!import_typescript3.default.canHaveModifiers(node)) return false;
1235
+ const modifiers = import_typescript3.default.getModifiers(node);
1236
+ if (!modifiers) return false;
1237
+ return modifiers.some((m) => m.kind === import_typescript3.default.SyntaxKind.ExportKeyword);
1238
+ }
1239
+ function has_default_modifier(node) {
1240
+ if (!import_typescript3.default.canHaveModifiers(node)) return false;
1241
+ const modifiers = import_typescript3.default.getModifiers(node);
1242
+ if (!modifiers) return false;
1243
+ return modifiers.some((m) => m.kind === import_typescript3.default.SyntaxKind.DefaultKeyword);
1244
+ }
1245
+ function extract_parameters(node, source_file) {
1246
+ return node.parameters.map((param) => ({
1247
+ name: import_typescript3.default.isIdentifier(param.name) ? param.name.text : param.name.getText(source_file),
1248
+ type: param.type ? param.type.getText(source_file) : null,
1249
+ optional: !!param.questionToken,
1250
+ rest: !!param.dotDotDotToken,
1251
+ default: param.initializer ? param.initializer.getText(source_file) : null
1252
+ }));
1253
+ }
1254
+ function extract_type_parameters(node, source_file) {
1255
+ if (!("typeParameters" in node) || !node.typeParameters) return [];
1256
+ return node.typeParameters.map((tp) => tp.getText(source_file));
1257
+ }
1258
+ function extract_jsdoc_comment(node, source_file) {
1259
+ const sf = source_file || node.getSourceFile();
1260
+ if (!sf) return null;
1261
+ const sourceText = sf.getFullText();
1262
+ const ranges = import_typescript3.default.getLeadingCommentRanges(sourceText, node.getFullStart());
1263
+ if (!ranges || ranges.length === 0) return null;
1264
+ const lastComment = ranges[ranges.length - 1];
1265
+ if (!lastComment) return null;
1266
+ const commentText = sourceText.slice(lastComment.pos, lastComment.end);
1267
+ if (commentText.startsWith("/**")) {
1268
+ return commentText;
1269
+ }
1270
+ return null;
1271
+ }
1272
+ function extract_decorators(node, source_file) {
1273
+ if (!import_typescript3.default.canHaveDecorators(node)) return [];
1274
+ const decorators = import_typescript3.default.getDecorators(node);
1275
+ if (!decorators) return [];
1276
+ const sf = source_file || node.getSourceFile();
1277
+ return decorators.map((decorator) => {
1278
+ const expr = decorator.expression;
1279
+ if (import_typescript3.default.isIdentifier(expr)) {
1280
+ return { name: expr.text };
1281
+ }
1282
+ if (import_typescript3.default.isCallExpression(expr) && import_typescript3.default.isIdentifier(expr.expression)) {
1283
+ return {
1284
+ name: expr.expression.text,
1285
+ arguments: expr.arguments.map((arg) => arg.getText(sf))
1286
+ };
1287
+ }
1288
+ return { name: decorator.expression.getText(sf) };
1289
+ });
1290
+ }
1291
+ function is_builtin_module(package_name) {
1292
+ const builtins = [
1293
+ "fs",
1294
+ "path",
1295
+ "http",
1296
+ "https",
1297
+ "url",
1298
+ "crypto",
1299
+ "os",
1300
+ "util",
1301
+ "stream",
1302
+ "events",
1303
+ "buffer",
1304
+ "child_process",
1305
+ "cluster",
1306
+ "dns",
1307
+ "net",
1308
+ "tls",
1309
+ "dgram",
1310
+ "readline",
1311
+ "repl",
1312
+ "vm",
1313
+ "zlib",
1314
+ "assert",
1315
+ "querystring",
1316
+ "string_decoder",
1317
+ "timers",
1318
+ "tty",
1319
+ "v8",
1320
+ "worker_threads"
1321
+ ];
1322
+ return builtins.includes(package_name) || package_name.startsWith("node:");
1323
+ }
1324
+ function is_dynamic_import(node) {
1325
+ if (!import_typescript3.default.isCallExpression(node)) return false;
1326
+ if (node.expression.kind !== import_typescript3.default.SyntaxKind.ImportKeyword) return false;
1327
+ if (node.arguments.length !== 1) return false;
1328
+ const arg = node.arguments[0];
1329
+ if (!arg) return false;
1330
+ return import_typescript3.default.isStringLiteral(arg);
1331
+ }
1332
+
1333
+ // src/update/scan_files/imports.ts
1334
+ function is_import(ctx, source_file, node) {
1335
+ if (!import_typescript4.default.isImportDeclaration(node) || !node.moduleSpecifier || !import_typescript4.default.isStringLiteral(node.moduleSpecifier)) return false;
1336
+ return !is_external_module(ctx, source_file, node.moduleSpecifier.text);
1337
+ }
1338
+ function extract_import(ctx, source_file, node, file_id) {
1339
+ const imports2 = [];
1340
+ const clause = node.importClause;
1341
+ if (!clause || !node.moduleSpecifier || !import_typescript4.default.isStringLiteral(node.moduleSpecifier)) return imports2;
1342
+ const exporter_file_id = resolve_exporter_file(ctx, source_file, node.moduleSpecifier.text);
1343
+ if (err.any(exporter_file_id)) return imports2;
1344
+ if (clause.name) {
1345
+ imports2.push({
1346
+ importer_file_id: file_id,
1347
+ exporter_file_id,
1348
+ name: "default",
1349
+ alias: clause.name.text,
1350
+ state: "to_link"
1351
+ });
1352
+ }
1353
+ if (clause.namedBindings && import_typescript4.default.isNamedImports(clause.namedBindings)) {
1354
+ for (const element of clause.namedBindings.elements) {
1355
+ imports2.push({
1356
+ importer_file_id: file_id,
1357
+ exporter_file_id,
1358
+ name: (element.propertyName || element.name).text,
1359
+ alias: element.name.text,
1360
+ state: "to_link"
1361
+ });
1362
+ }
1363
+ }
1364
+ if (clause.namedBindings && import_typescript4.default.isNamespaceImport(clause.namedBindings)) {
1365
+ imports2.push({
1366
+ importer_file_id: file_id,
1367
+ exporter_file_id,
1368
+ name: "*",
1369
+ alias: clause.namedBindings.name.text,
1370
+ state: "to_link"
1371
+ });
1372
+ }
1373
+ return imports2;
1374
+ }
1375
+ function extract_dynamic_import(ctx, source_file, node, file_id) {
1376
+ const arg = node.arguments[0];
1377
+ const module_specifier = arg.text;
1378
+ const exporter_file_id = resolve_exporter_file(ctx, source_file, module_specifier);
1379
+ if (err.any(exporter_file_id)) return null;
1380
+ return {
1381
+ importer_file_id: file_id,
1382
+ exporter_file_id,
1383
+ name: "*",
1384
+ alias: "__dynamic_import__",
1385
+ state: "to_link",
1386
+ is_dynamic: true
1387
+ };
1388
+ }
1389
+ function resolve_exporter_file(ctx, source_file, module_specifier) {
1390
+ const resolution = import_typescript4.default.resolveModuleName(module_specifier, source_file.fileName, ctx.program.getCompilerOptions(), import_typescript4.default.sys);
1391
+ if (!resolution.resolvedModule) {
1392
+ return err.new("module_resolution_failed", { module: module_specifier, from: source_file.fileName });
1393
+ }
1394
+ const resolved_path = resolution.resolvedModule.resolvedFileName;
1395
+ const file_path = resolved_path.startsWith(ctx.project_path) ? resolved_path.slice(ctx.project_path.length) : resolved_path;
1396
+ const file = files_exports.by_path(ctx, file_path);
1397
+ if (err.any(file)) return file;
1398
+ if (!file) {
1399
+ return err.new("exporter_file_not_found", { path: file_path, module: module_specifier });
1400
+ }
1401
+ return file.id;
1402
+ }
1403
+
1404
+ // src/update/scan_files/external_imports.ts
1405
+ var import_typescript5 = __toESM(require("typescript"), 1);
1406
+ function is_external_import(ctx, source_file, node) {
1407
+ if (!import_typescript5.default.isImportDeclaration(node) || !node.moduleSpecifier || !import_typescript5.default.isStringLiteral(node.moduleSpecifier)) return false;
1408
+ return is_external_module(ctx, source_file, node.moduleSpecifier.text);
1409
+ }
1410
+ function parse_module_specifier(spec) {
1411
+ let is_builtin = false;
1412
+ let normalized = spec;
1413
+ if (spec.startsWith("node:")) {
1414
+ normalized = spec.slice(5);
1415
+ is_builtin = true;
1416
+ } else {
1417
+ is_builtin = is_builtin_module(spec);
1418
+ }
1419
+ if (normalized.startsWith("@")) {
1420
+ const parts = normalized.split("/");
1421
+ if (parts.length <= 2) {
1422
+ return { pkg: normalized, subpath: null, is_builtin };
1423
+ }
1424
+ const pkg = `${parts[0]}/${parts[1]}`;
1425
+ const subpath = "/" + parts.slice(2).join("/");
1426
+ return { pkg, subpath, is_builtin };
1427
+ } else {
1428
+ const slash_idx = normalized.indexOf("/");
1429
+ if (slash_idx === -1) {
1430
+ return { pkg: normalized, subpath: null, is_builtin };
1431
+ }
1432
+ const pkg = normalized.slice(0, slash_idx);
1433
+ const subpath = normalized.slice(slash_idx);
1434
+ return { pkg, subpath, is_builtin };
1435
+ }
1436
+ }
1437
+ function extract_external_import_info(node) {
1438
+ const results = [];
1439
+ const module_specifier = node.moduleSpecifier.text;
1440
+ const { pkg, subpath, is_builtin } = parse_module_specifier(module_specifier);
1441
+ const clause = node.importClause;
1442
+ if (!clause) {
1443
+ results.push({
1444
+ package: pkg,
1445
+ subpath,
1446
+ name: null,
1447
+ alias: "__side_effect__",
1448
+ is_builtin
1449
+ });
1450
+ return results;
1451
+ }
1452
+ if (clause.name) {
1453
+ results.push({
1454
+ package: pkg,
1455
+ subpath,
1456
+ name: "default",
1457
+ alias: clause.name.text,
1458
+ is_builtin
1459
+ });
1460
+ }
1461
+ if (clause.namedBindings && import_typescript5.default.isNamedImports(clause.namedBindings)) {
1462
+ for (const element of clause.namedBindings.elements) {
1463
+ results.push({
1464
+ package: pkg,
1465
+ subpath,
1466
+ name: (element.propertyName || element.name).text,
1467
+ alias: element.name.text,
1468
+ is_builtin
1469
+ });
1470
+ }
1471
+ }
1472
+ if (clause.namedBindings && import_typescript5.default.isNamespaceImport(clause.namedBindings)) {
1473
+ results.push({
1474
+ package: pkg,
1475
+ subpath,
1476
+ name: "*",
1477
+ alias: clause.namedBindings.name.text,
1478
+ is_builtin
1479
+ });
1480
+ }
1481
+ return results;
1482
+ }
1483
+ function extract_external_import(ctx, node, file_id) {
1484
+ const infos = extract_external_import_info(node);
1485
+ const external_imports2 = [];
1486
+ for (const info of infos) {
1487
+ const dep_meta = Object.values(ctx.dependencies).find((dep) => info.package.startsWith(dep.name));
1488
+ const dependency = external_dependencies_exports.get_or_create(ctx, {
1489
+ package: info.package,
1490
+ subpath: info.subpath,
1491
+ name: info.name,
1492
+ version: dep_meta?.version,
1493
+ github_repo: dep_meta?.github_repo,
1494
+ is_builtin: info.is_builtin,
1495
+ state: "to_describe"
1496
+ });
1497
+ if (err.any(dependency)) return dependency;
1498
+ external_imports2.push({ file_id, external_dependency_id: dependency.id, alias: info.alias, is_dynamic: false });
1499
+ }
1500
+ return external_imports2;
1501
+ }
1502
+ function extract_external_dynamic_import(ctx, node, file_id) {
1503
+ const arg = node.arguments[0];
1504
+ const module_specifier = arg.text;
1505
+ const { pkg, subpath, is_builtin } = parse_module_specifier(module_specifier);
1506
+ const dep_meta = Object.values(ctx.dependencies).find((dep) => pkg.startsWith(dep.name));
1507
+ const dependency = external_dependencies_exports.get_or_create(ctx, {
1508
+ package: pkg,
1509
+ subpath,
1510
+ name: "*",
1511
+ version: dep_meta?.version,
1512
+ github_repo: dep_meta?.github_repo,
1513
+ is_builtin,
1514
+ state: "to_describe"
1515
+ });
1516
+ if (err.any(dependency)) return dependency;
1517
+ return { file_id, external_dependency_id: dependency.id, alias: "__dynamic_import__", is_dynamic: true };
1518
+ }
1519
+
1520
+ // src/update/scan_files/types.ts
1521
+ var import_typescript6 = __toESM(require("typescript"), 1);
1522
+ function is_type(node) {
1523
+ return import_typescript6.default.isTypeAliasDeclaration(node) || import_typescript6.default.isInterfaceDeclaration(node) || import_typescript6.default.isEnumDeclaration(node);
1524
+ }
1525
+ function extract_type_symbol(node, file_id, source_file) {
1526
+ const meta2 = import_typescript6.default.isEnumDeclaration(node) ? extract_enum_meta(node, source_file) : import_typescript6.default.isInterfaceDeclaration(node) ? extract_interface_meta(node, source_file) : extract_type_alias_meta(node, source_file);
1527
+ return {
1528
+ file_id,
1529
+ type: "type",
1530
+ name: node.name.text,
1531
+ text: node.getText(source_file),
1532
+ meta: JSON.stringify(meta2),
1533
+ is_exported: has_export_modifier(node),
1534
+ state: "to_link"
1535
+ };
1536
+ }
1537
+ function extract_enum_meta(node, source_file) {
1538
+ const enum_values = {};
1539
+ for (const member of node.members) {
1540
+ if (import_typescript6.default.isIdentifier(member.name) || import_typescript6.default.isStringLiteral(member.name)) {
1541
+ const name = member.name.text;
1542
+ const value = member.initializer ? member.initializer.getText(source_file) : "auto";
1543
+ enum_values[name] = value;
1544
+ }
1545
+ }
1546
+ return {
1547
+ kind: "enum",
1548
+ type_parameters: [],
1549
+ extends: [],
1550
+ members: [],
1551
+ enum_values,
1552
+ decorators: extract_decorators(node, source_file),
1553
+ comment: extract_jsdoc_comment(node, source_file)
1554
+ };
1555
+ }
1556
+ function extract_interface_meta(node, source_file) {
1557
+ const members = [];
1558
+ for (const member of node.members) {
1559
+ if (import_typescript6.default.isPropertySignature(member) && import_typescript6.default.isIdentifier(member.name)) {
1560
+ members.push({
1561
+ name: member.name.text,
1562
+ type: member.type ? member.type.getText(source_file) : "any",
1563
+ optional: !!member.questionToken
1564
+ });
1565
+ } else if (import_typescript6.default.isMethodSignature(member) && import_typescript6.default.isIdentifier(member.name)) {
1566
+ const params = member.parameters.map((p) => {
1567
+ const param_type = p.type ? p.type.getText(source_file) : "any";
1568
+ return `${p.name.getText(source_file)}: ${param_type}`;
1569
+ }).join(", ");
1570
+ const return_type = member.type ? member.type.getText(source_file) : "void";
1571
+ members.push({
1572
+ name: member.name.text,
1573
+ type: `(${params}) => ${return_type}`,
1574
+ optional: !!member.questionToken
1575
+ });
1576
+ }
1577
+ }
1578
+ const extends_clauses = node.heritageClauses?.filter((c) => c.token === import_typescript6.default.SyntaxKind.ExtendsKeyword).flatMap((c) => c.types.map((t) => t.expression.getText(source_file))) || [];
1579
+ return {
1580
+ kind: "interface",
1581
+ type_parameters: extract_type_parameters(node, source_file),
1582
+ extends: extends_clauses,
1583
+ members,
1584
+ enum_values: {},
1585
+ decorators: extract_decorators(node, source_file),
1586
+ comment: extract_jsdoc_comment(node, source_file)
1587
+ };
1588
+ }
1589
+ function extract_type_alias_meta(node, source_file) {
1590
+ return {
1591
+ kind: "type_alias",
1592
+ type_parameters: extract_type_parameters(node, source_file),
1593
+ extends: [],
1594
+ members: [],
1595
+ enum_values: {},
1596
+ decorators: extract_decorators(node, source_file),
1597
+ comment: extract_jsdoc_comment(node, source_file)
1598
+ };
1599
+ }
1600
+
1601
+ // src/update/scan_files/functions.ts
1602
+ var import_typescript7 = __toESM(require("typescript"), 1);
1603
+ function is_function(node) {
1604
+ if (!import_typescript7.default.isFunctionDeclaration(node)) return false;
1605
+ return !!node.name || has_default_modifier(node);
1606
+ }
1607
+ function extract_function_symbol(node, file_id, source_file) {
1608
+ const is_default = has_default_modifier(node);
1609
+ const name = is_default ? "default" : node.name?.text || "default";
1610
+ const meta2 = {
1611
+ kind: "function_declaration",
1612
+ parameters: extract_parameters(node, source_file),
1613
+ return_type: node.type ? node.type.getText(source_file) : null,
1614
+ type_parameters: extract_type_parameters(node, source_file),
1615
+ modifiers: {
1616
+ async: !!node.modifiers?.some((m) => m.kind === import_typescript7.default.SyntaxKind.AsyncKeyword),
1617
+ generator: !!node.asteriskToken
1618
+ },
1619
+ decorators: extract_decorators(node, source_file),
1620
+ comment: extract_jsdoc_comment(node, source_file)
1621
+ };
1622
+ return {
1623
+ file_id,
1624
+ type: "function",
1625
+ name,
1626
+ text: node.getText(source_file),
1627
+ meta: JSON.stringify(meta2),
1628
+ is_exported: has_export_modifier(node),
1629
+ state: "to_link"
1630
+ };
1631
+ }
1632
+
1633
+ // src/update/scan_files/variables.ts
1634
+ var import_typescript8 = __toESM(require("typescript"), 1);
1635
+ function is_function_declaration(declaration) {
1636
+ return !!(declaration.initializer && (import_typescript8.default.isArrowFunction(declaration.initializer) || import_typescript8.default.isFunctionExpression(declaration.initializer)));
1637
+ }
1638
+ function extract_variable_symbol(node, file_id, source_file) {
1639
+ const symbols3 = [];
1640
+ const is_exported = has_export_modifier(node);
1641
+ const declaration_kind = node.declarationList.flags & import_typescript8.default.NodeFlags.Const ? "const" : node.declarationList.flags & import_typescript8.default.NodeFlags.Let ? "let" : "var";
1642
+ for (const declaration of node.declarationList.declarations) {
1643
+ if (!import_typescript8.default.isIdentifier(declaration.name)) continue;
1644
+ if (is_function_declaration(declaration)) {
1645
+ const func_node = declaration.initializer;
1646
+ const meta2 = {
1647
+ kind: import_typescript8.default.isArrowFunction(func_node) ? "arrow_function" : "function_expression",
1648
+ parameters: extract_parameters(func_node, source_file),
1649
+ return_type: func_node.type ? func_node.type.getText(source_file) : null,
1650
+ type_parameters: extract_type_parameters(func_node, source_file),
1651
+ modifiers: {
1652
+ async: !!func_node.modifiers?.some((m) => m.kind === import_typescript8.default.SyntaxKind.AsyncKeyword),
1653
+ generator: import_typescript8.default.isFunctionExpression(func_node) && !!func_node.asteriskToken
1654
+ },
1655
+ decorators: extract_decorators(node, source_file),
1656
+ comment: extract_jsdoc_comment(node, source_file)
1657
+ };
1658
+ symbols3.push({
1659
+ file_id,
1660
+ type: "function",
1661
+ name: declaration.name.text,
1662
+ text: node.getText(source_file),
1663
+ meta: JSON.stringify(meta2),
1664
+ is_exported,
1665
+ state: "to_link"
1666
+ });
1667
+ } else {
1668
+ const meta2 = {
1669
+ declaration_kind,
1670
+ type: declaration.type ? declaration.type.getText(source_file) : null,
1671
+ value: declaration.initializer ? declaration.initializer.getText(source_file) : null,
1672
+ decorators: extract_decorators(node, source_file),
1673
+ comment: extract_jsdoc_comment(node, source_file)
1674
+ };
1675
+ symbols3.push({
1676
+ file_id,
1677
+ type: "variable",
1678
+ name: declaration.name.text,
1679
+ text: node.getText(source_file),
1680
+ meta: JSON.stringify(meta2),
1681
+ is_exported,
1682
+ state: "to_link"
1683
+ });
1684
+ }
1685
+ }
1686
+ return symbols3;
1687
+ }
1688
+
1689
+ // src/update/scan_files/classes.ts
1690
+ var import_typescript9 = __toESM(require("typescript"), 1);
1691
+ function is_class(node) {
1692
+ if (!import_typescript9.default.isClassDeclaration(node)) return false;
1693
+ return !!node.name || has_default_modifier(node);
1694
+ }
1695
+ function extract_class_symbol(node, file_id, source_file) {
1696
+ const is_default = has_default_modifier(node);
1697
+ const name = is_default ? "default" : node.name?.text || "default";
1698
+ const meta2 = {
1699
+ extends: node.heritageClauses?.find((c) => c.token === import_typescript9.default.SyntaxKind.ExtendsKeyword)?.types[0]?.expression.getText(source_file) || null,
1700
+ implements: node.heritageClauses?.find((c) => c.token === import_typescript9.default.SyntaxKind.ImplementsKeyword)?.types.map((t) => t.expression.getText(source_file)) || [],
1701
+ type_parameters: extract_type_parameters(node, source_file),
1702
+ modifiers: {
1703
+ abstract: !!node.modifiers?.some((m) => m.kind === import_typescript9.default.SyntaxKind.AbstractKeyword)
1704
+ },
1705
+ decorators: extract_decorators(node, source_file),
1706
+ comment: extract_jsdoc_comment(node, source_file)
1707
+ };
1708
+ return {
1709
+ file_id,
1710
+ type: "class",
1711
+ name,
1712
+ text: node.getText(source_file),
1713
+ meta: JSON.stringify(meta2),
1714
+ is_exported: has_export_modifier(node),
1715
+ state: "to_link"
1716
+ };
1717
+ }
1718
+ function get_visibility(member) {
1719
+ if (!import_typescript9.default.canHaveModifiers(member)) return null;
1720
+ const modifiers = import_typescript9.default.getModifiers(member);
1721
+ if (!modifiers) return null;
1722
+ if (modifiers.some((m) => m.kind === import_typescript9.default.SyntaxKind.PrivateKeyword)) return "private";
1723
+ if (modifiers.some((m) => m.kind === import_typescript9.default.SyntaxKind.ProtectedKeyword)) return "protected";
1724
+ if (modifiers.some((m) => m.kind === import_typescript9.default.SyntaxKind.PublicKeyword)) return "public";
1725
+ return null;
1726
+ }
1727
+ function extract_class_fields(node, file_id, source_file) {
1728
+ const symbols3 = [];
1729
+ if (!node.name) return symbols3;
1730
+ const class_name = node.name.text;
1731
+ node.members.forEach((member) => {
1732
+ if (import_typescript9.default.isMethodDeclaration(member) && member.name && import_typescript9.default.isIdentifier(member.name)) {
1733
+ const meta2 = {
1734
+ class_name,
1735
+ visibility: get_visibility(member),
1736
+ parameters: extract_parameters(member, source_file),
1737
+ return_type: member.type ? member.type.getText(source_file) : null,
1738
+ type_parameters: extract_type_parameters(member, source_file),
1739
+ modifiers: {
1740
+ static: !!member.modifiers?.some((m) => m.kind === import_typescript9.default.SyntaxKind.StaticKeyword),
1741
+ async: !!member.modifiers?.some((m) => m.kind === import_typescript9.default.SyntaxKind.AsyncKeyword),
1742
+ abstract: !!member.modifiers?.some((m) => m.kind === import_typescript9.default.SyntaxKind.AbstractKeyword),
1743
+ readonly: !!member.modifiers?.some((m) => m.kind === import_typescript9.default.SyntaxKind.ReadonlyKeyword)
1744
+ },
1745
+ decorators: extract_decorators(member, source_file),
1746
+ comment: extract_jsdoc_comment(member, source_file)
1747
+ };
1748
+ symbols3.push({
1749
+ file_id,
1750
+ type: "class_method",
1751
+ name: `${class_name}.${member.name.text}`,
1752
+ text: member.getText(source_file),
1753
+ meta: JSON.stringify(meta2),
1754
+ is_exported: false,
1755
+ state: "to_link"
1756
+ });
1757
+ }
1758
+ if (import_typescript9.default.isPropertyDeclaration(member) && member.name && import_typescript9.default.isIdentifier(member.name)) {
1759
+ const meta2 = {
1760
+ class_name,
1761
+ visibility: get_visibility(member),
1762
+ type: member.type ? member.type.getText(source_file) : null,
1763
+ optional: !!member.questionToken,
1764
+ modifiers: {
1765
+ static: !!member.modifiers?.some((m) => m.kind === import_typescript9.default.SyntaxKind.StaticKeyword),
1766
+ readonly: !!member.modifiers?.some((m) => m.kind === import_typescript9.default.SyntaxKind.ReadonlyKeyword),
1767
+ abstract: !!member.modifiers?.some((m) => m.kind === import_typescript9.default.SyntaxKind.AbstractKeyword)
1768
+ },
1769
+ decorators: extract_decorators(member, source_file),
1770
+ comment: extract_jsdoc_comment(member, source_file)
1771
+ };
1772
+ symbols3.push({
1773
+ file_id,
1774
+ type: "class_property",
1775
+ name: `${class_name}.${member.name.text}`,
1776
+ text: member.getText(source_file),
1777
+ meta: JSON.stringify(meta2),
1778
+ is_exported: false,
1779
+ state: "to_link"
1780
+ });
1781
+ }
1782
+ });
1783
+ return symbols3;
1784
+ }
1785
+
1786
+ // src/update/scan_files/scan_files.ts
1787
+ async function scan_files(ctx) {
1788
+ const files3 = err.or_throw(files_exports.by_state(ctx, "to_scan"));
1789
+ for (const file of files3) {
1790
+ const res = scan_file(ctx, file);
1791
+ if (err.any(res)) {
1792
+ err.or_throw(files_exports.update(ctx, file.id, { error: String(res) }));
1793
+ } else {
1794
+ err.or_throw(files_exports.update(ctx, file.id, { state: "to_describe", error: null }));
1795
+ }
1796
+ }
1797
+ }
1798
+ function scan_file(ctx, file) {
1799
+ return err.pipe(
1800
+ () => symbols_exports.del_by_file(ctx, file.id),
1801
+ () => imports_exports.del_by_importer_file(ctx, file.id),
1802
+ () => external_imports_exports.del_by_file(ctx, file.id),
1803
+ () => get_source_file(ctx, file.path),
1804
+ (source_file) => parse_file(ctx, source_file, file.id),
1805
+ ({ imports: imports2, symbols: symbols3, external_imports: external_imports2 }) => err.pipe(
1806
+ () => external_imports2.length && external_imports_exports.insert_many(ctx, external_imports2),
1807
+ () => imports2.length && imports_exports.insert_many(ctx, imports2),
1808
+ () => symbols3.length && symbols_exports.insert_many(ctx, symbols3)
1809
+ )
1810
+ );
1811
+ }
1812
+ function get_source_file(ctx, file_path) {
1813
+ const source_file = ctx.program.getSourceFile(import_path5.default.join(ctx.project_path, file_path));
1814
+ if (!source_file) return err.new("file_not_found", { path: file_path });
1815
+ return source_file;
1816
+ }
1817
+ function parse_file(ctx, source_file, file_id) {
1818
+ const imports2 = [];
1819
+ const symbols3 = [];
1820
+ const external_imports2 = [];
1821
+ function find_dynamic_imports(node) {
1822
+ if (is_dynamic_import(node)) {
1823
+ const arg = node.arguments[0];
1824
+ if (is_external_module(ctx, source_file, arg.text)) {
1825
+ const result = extract_external_dynamic_import(ctx, node, file_id);
1826
+ if (err.any(result)) return result;
1827
+ external_imports2.push(result);
1828
+ } else {
1829
+ const result = extract_dynamic_import(ctx, source_file, node, file_id);
1830
+ if (result) imports2.push(result);
1831
+ }
1832
+ }
1833
+ import_typescript10.default.forEachChild(node, find_dynamic_imports);
1834
+ }
1835
+ let error = void 0;
1836
+ import_typescript10.default.forEachChild(source_file, (statement) => {
1837
+ if (error) return;
1838
+ const res = parse_node(ctx, source_file, statement, file_id);
1839
+ if (err.any(res)) {
1840
+ error = res;
1841
+ return;
1842
+ }
1843
+ imports2.push(...res.imports);
1844
+ symbols3.push(...res.symbols);
1845
+ external_imports2.push(...res.external_imports);
1846
+ error = find_dynamic_imports(statement);
1847
+ });
1848
+ if (error) return error;
1849
+ return { imports: imports2, symbols: symbols3, external_imports: external_imports2 };
1850
+ }
1851
+ function parse_node(ctx, source_file, node, file_id) {
1852
+ const imports2 = [];
1853
+ const symbols3 = [];
1854
+ const external_imports2 = [];
1855
+ if (is_external_import(ctx, source_file, node)) {
1856
+ const result = extract_external_import(ctx, node, file_id);
1857
+ if (err.any(result)) return result;
1858
+ external_imports2.push(...result);
1859
+ } else if (is_import(ctx, source_file, node)) {
1860
+ imports2.push(...extract_import(ctx, source_file, node, file_id));
1861
+ } else if (import_typescript10.default.isExportAssignment(node) && !node.isExportEquals) {
1862
+ symbols3.push({
1863
+ file_id,
1864
+ type: "variable",
1865
+ name: "default",
1866
+ text: node.getText(source_file),
1867
+ meta: JSON.stringify({
1868
+ declaration_kind: "const",
1869
+ type: null,
1870
+ value: node.expression.getText(source_file),
1871
+ decorators: [],
1872
+ comment: null
1873
+ }),
1874
+ is_exported: true,
1875
+ state: "to_link"
1876
+ });
1877
+ } else if (import_typescript10.default.isExportDeclaration(node) && node.exportClause && import_typescript10.default.isNamedExports(node.exportClause) && !node.moduleSpecifier) {
1878
+ for (const element of node.exportClause.elements) {
1879
+ if (element.name.text === "default") {
1880
+ const localName = element.propertyName?.text || element.name.text;
1881
+ symbols3.push({
1882
+ file_id,
1883
+ type: "variable",
1884
+ name: "default",
1885
+ text: node.getText(source_file),
1886
+ meta: JSON.stringify({ declaration_kind: "const", type: null, value: localName, is_reexport: true, decorators: [], comment: null }),
1887
+ is_exported: true,
1888
+ state: "to_link"
1889
+ });
1890
+ }
1891
+ }
1892
+ } else if (is_type(node)) {
1893
+ symbols3.push(extract_type_symbol(node, file_id, source_file));
1894
+ } else if (is_function(node)) {
1895
+ symbols3.push(extract_function_symbol(node, file_id, source_file));
1896
+ } else if (import_typescript10.default.isVariableStatement(node)) {
1897
+ symbols3.push(...extract_variable_symbol(node, file_id, source_file));
1898
+ } else if (is_class(node)) {
1899
+ symbols3.push(extract_class_symbol(node, file_id, source_file));
1900
+ symbols3.push(...extract_class_fields(node, file_id, source_file));
1901
+ }
1902
+ return { imports: imports2, symbols: symbols3, external_imports: external_imports2 };
1903
+ }
1904
+
1905
+ // src/update/link_imports.ts
1906
+ async function link_imports(ctx) {
1907
+ const imports2 = err.or_throw(imports_exports.by_state(ctx, "to_link"));
1908
+ let i = 0;
1909
+ for (const import_ of imports2) {
1910
+ const res = link_import(ctx, import_);
1911
+ if (err.any(res)) err.or_throw(imports_exports.update(ctx, import_.id, { error: String(res) }));
1912
+ }
1913
+ }
1914
+ function link_import(ctx, import_) {
1915
+ if (import_.name === "*") {
1916
+ return imports_exports.update(ctx, import_.id, { state: "ready", error: null });
1917
+ }
1918
+ const symbol = symbols_exports.by_file_and_name(ctx, { file_id: import_.exporter_file_id, name: import_.name, is_exported: true });
1919
+ if (err.any(symbol)) return symbol;
1920
+ if (!symbol) return err.new("exported_symbol_not_found", { name: import_.name, file_id: import_.exporter_file_id });
1921
+ return imports_exports.update(ctx, import_.id, { symbol_id: symbol.id, state: "ready", error: null });
1922
+ }
1923
+
1924
+ // src/update/link_symbols.ts
1925
+ var import_path6 = __toESM(require("path"), 1);
1926
+ var import_typescript11 = __toESM(require("typescript"), 1);
1927
+ async function link_symbols(ctx) {
1928
+ const symbols3 = err.or_throw(symbols_exports.by_state(ctx, "to_link"));
1929
+ let i = 0;
1930
+ for (const symbol of symbols3) {
1931
+ const res = link_symbol(ctx, symbol);
1932
+ if (err.any(res)) {
1933
+ err.or_throw(symbols_exports.update(ctx, symbol.id, { error: String(res) }));
1934
+ }
1935
+ }
1936
+ }
1937
+ function link_symbol(ctx, symbol) {
1938
+ if (!symbol.text) return err.new("symbol_missing_text", { symbol_id: symbol.id, name: symbol.name });
1939
+ const resolutions = find_symbol_references(ctx, symbol);
1940
+ if (err.any(resolutions)) return resolutions;
1941
+ for (const resolution of resolutions) {
1942
+ if (resolution.type === "internal") create_internal_link(ctx, symbol, resolution);
1943
+ if (resolution.type === "external") create_external_link(ctx, symbol, resolution);
1944
+ }
1945
+ return symbols_exports.update(ctx, symbol.id, { state: "to_describe", error: null });
1946
+ }
1947
+ function find_symbol_references(ctx, symbol) {
1948
+ const file = files_exports.by_id(ctx, symbol.file_id);
1949
+ if (err.any(file)) return file;
1950
+ if (!file) return err.new("file_not_found", { path: `file_id=${symbol.file_id}` });
1951
+ const file_path = import_path6.default.join(ctx.project_path, file.path);
1952
+ const source_file = ctx.program.getSourceFile(file_path);
1953
+ if (!source_file) return err.new("file_not_found", { path: file_path });
1954
+ const symbol_node = find_symbol_node(source_file, symbol);
1955
+ if (!symbol_node) return err.new("symbol_node_not_found", { symbol_id: symbol.id, name: symbol.name, file_path: file.path });
1956
+ const type_checker = ctx.program.getTypeChecker();
1957
+ const resolutions = [];
1958
+ const seen = /* @__PURE__ */ new Set();
1959
+ function visit(node) {
1960
+ const ts_symbol = type_checker.getSymbolAtLocation(node);
1961
+ if (!import_typescript11.default.isIdentifier(node) || is_declaration(node.parent, node) || !ts_symbol) {
1962
+ import_typescript11.default.forEachChild(node, visit);
1963
+ return;
1964
+ }
1965
+ const resolution = resolve_ts_symbol(ctx, type_checker, ts_symbol, symbol);
1966
+ if (resolution) {
1967
+ const key = `${resolution.type}:${resolution.type === "internal" ? resolution.symbol_id : resolution.external_import_id}`;
1968
+ if (!seen.has(key)) {
1969
+ seen.add(key);
1970
+ resolutions.push(resolution);
1971
+ }
1972
+ }
1973
+ import_typescript11.default.forEachChild(node, visit);
1974
+ }
1975
+ visit(symbol_node);
1976
+ return resolutions;
1977
+ }
1978
+ function resolve_ts_symbol(ctx, type_checker, ts_symbol, from_symbol) {
1979
+ let symbol_to_use = ts_symbol;
1980
+ if (ts_symbol.flags & import_typescript11.default.SymbolFlags.Alias) {
1981
+ symbol_to_use = type_checker.getAliasedSymbol(ts_symbol) || symbol_to_use;
1982
+ }
1983
+ const declarations = symbol_to_use.getDeclarations();
1984
+ if (!declarations || declarations.length === 0 || !declarations[0]) return null;
1985
+ const declaration_source_file = declarations[0].getSourceFile();
1986
+ if (declaration_source_file.fileName.includes("/lib.") && !declaration_source_file.fileName.includes("node_modules")) {
1987
+ return null;
1988
+ }
1989
+ if (!declaration_source_file.fileName.startsWith(ctx.project_path) || declaration_source_file.fileName.includes("node_modules")) {
1990
+ const external_import_links = external_imports_exports.by_file(ctx, from_symbol.file_id);
1991
+ if (err.any(external_import_links)) return null;
1992
+ for (const ext_import of external_import_links) {
1993
+ const ext_dep = external_dependencies_exports.by_id(ctx, ext_import.external_dependency_id);
1994
+ if (err.any(ext_dep) || !ext_dep) continue;
1995
+ if (ext_import.alias === symbol_to_use.name || ext_dep.name === symbol_to_use.name) {
1996
+ return { type: "external", external_import_id: ext_import.id };
1997
+ }
1998
+ }
1999
+ return null;
2000
+ }
2001
+ let file_path = declaration_source_file.fileName;
2002
+ if (file_path.startsWith(ctx.project_path)) {
2003
+ file_path = file_path.substring(ctx.project_path.length);
2004
+ }
2005
+ const file = files_exports.by_path(ctx, file_path);
2006
+ if (err.any(file) || !file) return null;
2007
+ if (file.id === from_symbol.file_id) {
2008
+ const file_symbols2 = symbols_exports.by_file(ctx, file.id);
2009
+ if (err.any(file_symbols2)) return null;
2010
+ for (const file_symbol of file_symbols2) {
2011
+ if (file_symbol.name === symbol_to_use.name && file_symbol.id !== from_symbol.id) {
2012
+ return { type: "internal", symbol_id: file_symbol.id, file_id: file.id };
2013
+ }
2014
+ }
2015
+ return null;
2016
+ }
2017
+ const file_symbols = symbols_exports.by_file(ctx, file.id);
2018
+ if (err.any(file_symbols)) return null;
2019
+ for (const file_symbol of file_symbols) {
2020
+ if (file_symbol.name === symbol_to_use.name) {
2021
+ return { type: "internal", symbol_id: file_symbol.id, file_id: file.id };
2022
+ }
2023
+ }
2024
+ return null;
2025
+ }
2026
+ function find_symbol_node(source_file, symbol) {
2027
+ let result;
2028
+ function visit(node) {
2029
+ if (result) return;
2030
+ if (matches_symbol(node, symbol)) {
2031
+ result = node;
2032
+ return;
2033
+ }
2034
+ import_typescript11.default.forEachChild(node, visit);
2035
+ }
2036
+ visit(source_file);
2037
+ return result;
2038
+ }
2039
+ function matches_symbol(node, symbol) {
2040
+ if (symbol.name === "default") {
2041
+ if (symbol.type === "function" && import_typescript11.default.isFunctionDeclaration(node)) return has_default_modifier(node);
2042
+ if (symbol.type === "class" && import_typescript11.default.isClassDeclaration(node)) return has_default_modifier(node);
2043
+ if (symbol.type === "variable") {
2044
+ if (import_typescript11.default.isExportAssignment(node) && !node.isExportEquals) return true;
2045
+ if (import_typescript11.default.isExportDeclaration(node) && node.exportClause && import_typescript11.default.isNamedExports(node.exportClause)) {
2046
+ return node.exportClause.elements.some((element) => element.name.text === "default");
2047
+ }
2048
+ }
2049
+ }
2050
+ if (symbol.type === "function") {
2051
+ if (import_typescript11.default.isVariableStatement(node)) {
2052
+ const declarations = node.declarationList.declarations;
2053
+ for (const decl of declarations) {
2054
+ if (import_typescript11.default.isIdentifier(decl.name) && decl.name.text === symbol.name) {
2055
+ const initializer = decl.initializer;
2056
+ if (initializer && (import_typescript11.default.isArrowFunction(initializer) || import_typescript11.default.isFunctionExpression(initializer))) {
2057
+ return true;
2058
+ }
2059
+ }
2060
+ }
2061
+ return false;
2062
+ }
2063
+ if (import_typescript11.default.isFunctionDeclaration(node)) {
2064
+ return get_node_name(node) === symbol.name;
2065
+ }
2066
+ return false;
2067
+ }
2068
+ if (symbol.type === "class") {
2069
+ if (!import_typescript11.default.isClassDeclaration(node)) return false;
2070
+ return get_node_name(node) === symbol.name;
2071
+ }
2072
+ if (symbol.type === "type") {
2073
+ if (!import_typescript11.default.isTypeAliasDeclaration(node) && !import_typescript11.default.isInterfaceDeclaration(node) && !import_typescript11.default.isEnumDeclaration(node)) return false;
2074
+ return get_node_name(node) === symbol.name;
2075
+ }
2076
+ if (symbol.type === "variable") {
2077
+ if (import_typescript11.default.isVariableStatement(node)) {
2078
+ const declarations = node.declarationList.declarations;
2079
+ for (const decl of declarations) {
2080
+ if (import_typescript11.default.isIdentifier(decl.name) && decl.name.text === symbol.name) {
2081
+ const initializer = decl.initializer;
2082
+ if (!initializer || !import_typescript11.default.isArrowFunction(initializer) && !import_typescript11.default.isFunctionExpression(initializer)) {
2083
+ return true;
2084
+ }
2085
+ }
2086
+ }
2087
+ }
2088
+ return false;
2089
+ }
2090
+ if (symbol.type === "class_method") {
2091
+ if (!import_typescript11.default.isMethodDeclaration(node)) return false;
2092
+ const method_name = get_node_name(node);
2093
+ if (!method_name) return false;
2094
+ const class_node = node.parent;
2095
+ if (!class_node || !import_typescript11.default.isClassDeclaration(class_node)) return false;
2096
+ const class_name = get_node_name(class_node);
2097
+ if (!class_name) return false;
2098
+ return `${class_name}.${method_name}` === symbol.name;
2099
+ }
2100
+ if (symbol.type === "class_property") {
2101
+ if (!import_typescript11.default.isPropertyDeclaration(node)) return false;
2102
+ const prop_name = get_node_name(node);
2103
+ if (!prop_name) return false;
2104
+ const class_node = node.parent;
2105
+ if (!class_node || !import_typescript11.default.isClassDeclaration(class_node)) return false;
2106
+ const class_name = get_node_name(class_node);
2107
+ if (!class_name) return false;
2108
+ return `${class_name}.${prop_name}` === symbol.name;
2109
+ }
2110
+ return false;
2111
+ }
2112
+ function get_node_name(node) {
2113
+ if (!("name" in node)) return void 0;
2114
+ const nodeWithName = node;
2115
+ if (nodeWithName.name && import_typescript11.default.isIdentifier(nodeWithName.name)) {
2116
+ return nodeWithName.name.text;
2117
+ }
2118
+ return void 0;
2119
+ }
2120
+ function is_declaration(parent, identifier) {
2121
+ if (!parent) return false;
2122
+ if (import_typescript11.default.isFunctionDeclaration(parent) && parent.name === identifier) return true;
2123
+ if (import_typescript11.default.isClassDeclaration(parent) && parent.name === identifier) return true;
2124
+ if (import_typescript11.default.isInterfaceDeclaration(parent) && parent.name === identifier) return true;
2125
+ if (import_typescript11.default.isTypeAliasDeclaration(parent) && parent.name === identifier) return true;
2126
+ if (import_typescript11.default.isEnumDeclaration(parent) && parent.name === identifier) return true;
2127
+ if (import_typescript11.default.isVariableDeclaration(parent) && parent.name === identifier) return true;
2128
+ if (import_typescript11.default.isParameter(parent) && parent.name === identifier) return true;
2129
+ if (import_typescript11.default.isPropertyDeclaration(parent) && parent.name === identifier) return true;
2130
+ if (import_typescript11.default.isMethodDeclaration(parent) && parent.name === identifier) return true;
2131
+ if (import_typescript11.default.isTypeParameterDeclaration(parent) && parent.name === identifier) return true;
2132
+ if (import_typescript11.default.isImportClause(parent) && parent.name === identifier) return true;
2133
+ if (import_typescript11.default.isImportSpecifier(parent) && (parent.name === identifier || parent.propertyName === identifier)) return true;
2134
+ if (import_typescript11.default.isNamespaceImport(parent) && parent.name === identifier) return true;
2135
+ return false;
2136
+ }
2137
+ function create_internal_link(ctx, from_symbol, resolution) {
2138
+ const existing = symbol_internal_links_exports.exists(ctx, {
2139
+ from_symbol_id: from_symbol.id,
2140
+ to_symbol_id: resolution.symbol_id
2141
+ });
2142
+ if (err.any(existing)) return existing;
2143
+ if (existing) return;
2144
+ return symbol_internal_links_exports.insert(ctx, {
2145
+ from_file_id: from_symbol.file_id,
2146
+ to_file_id: resolution.file_id,
2147
+ from_symbol_id: from_symbol.id,
2148
+ to_symbol_id: resolution.symbol_id,
2149
+ state: "pending"
2150
+ });
2151
+ }
2152
+ function create_external_link(ctx, from_symbol, resolution) {
2153
+ const existing = symbol_external_links_exports.exists(ctx, {
2154
+ symbol_id: from_symbol.id,
2155
+ external_import_id: resolution.external_import_id
2156
+ });
2157
+ if (err.any(existing)) return existing;
2158
+ if (existing) return;
2159
+ return symbol_external_links_exports.insert(ctx, {
2160
+ symbol_id: from_symbol.id,
2161
+ external_import_id: resolution.external_import_id
2162
+ });
2163
+ }
2164
+
2165
+ // src/update/index.ts
2166
+ async function update6(ctx) {
2167
+ await track_changes(ctx);
2168
+ await sync_external_dependencies(ctx);
2169
+ await scan_files(ctx);
2170
+ await link_imports(ctx);
2171
+ await link_symbols(ctx);
2172
+ }
2173
+
2174
+ // src/counts.ts
2175
+ var import_drizzle_orm13 = require("drizzle-orm");
2176
+ var counts = safe_query("counts", (ctx) => {
2177
+ const symbol_counts = ctx.db.select({ state: symbols.state, count: (0, import_drizzle_orm13.count)() }).from(symbols).groupBy(symbols.state).all();
2178
+ const file_counts = ctx.db.select({ state: files.state, count: (0, import_drizzle_orm13.count)() }).from(files).groupBy(files.state).all();
2179
+ const dir_counts = ctx.db.select({ state: directories.state, count: (0, import_drizzle_orm13.count)() }).from(directories).groupBy(directories.state).all();
2180
+ const dep_counts = ctx.db.select({ state: external_dependencies.state, count: (0, import_drizzle_orm13.count)() }).from(external_dependencies).groupBy(external_dependencies.state).all();
2181
+ return {
2182
+ symbols: get_groups(symbol_counts, ["to_link", "to_describe", "ready"]),
2183
+ files: get_groups(file_counts, ["to_scan", "to_describe", "ready"]),
2184
+ directories: get_groups(dir_counts, ["to_describe", "ready"]),
2185
+ dependencies: get_groups(dep_counts, ["to_describe", "ready"])
2186
+ };
2187
+ });
2188
+ function get_groups(items, states) {
2189
+ const groups = { total: 0 };
2190
+ for (const state of states) groups[state] = 0;
2191
+ for (const item of items) {
2192
+ if (!states.includes(item.state)) continue;
2193
+ groups[item.state] = (groups[item.state] || 0) + item.count;
2194
+ groups.total += item.count;
2195
+ }
2196
+ return groups;
2197
+ }
2198
+
2199
+ // src/files.ts
2200
+ function files_wiki(ctx) {
2201
+ return {
2202
+ get: (id) => get2(ctx, id),
2203
+ search: (options) => search5(ctx, options),
2204
+ set_description: (id, description) => set_description(ctx, id, description),
2205
+ imported_by_file: (file_id, options) => imported_by_file(ctx, file_id, options),
2206
+ importing_file: (file_id, options) => importing_file(ctx, file_id, options),
2207
+ importing_dependency: (dependency_id, options) => importing_dependency(ctx, dependency_id, options)
2208
+ };
2209
+ }
2210
+ function get2(ctx, id) {
2211
+ return err.or_throw(files_exports.by_id(ctx, id)) ?? null;
2212
+ }
2213
+ function search5(ctx, options) {
2214
+ return err.or_throw(files_exports.search(ctx, options));
2215
+ }
2216
+ function set_description(ctx, id, description) {
2217
+ err.or_throw(files_exports.update(ctx, id, { description }));
2218
+ }
2219
+ function imported_by_file(ctx, file_id, options = {}) {
2220
+ let imported_files = err.or_throw(files_exports.imported_by(ctx, file_id, options.select));
2221
+ if (options.deep) {
2222
+ imported_files = err.or_throw(
2223
+ expand({
2224
+ items: imported_files,
2225
+ get_children: (file) => files_exports.imported_by(ctx, file.id, options.select),
2226
+ get_key: (file) => file.id
2227
+ })
2228
+ );
2229
+ }
2230
+ const start = options.offset ?? 0;
2231
+ const end = options.limit ? start + options.limit : imported_files.length;
2232
+ return imported_files.slice(start, end);
2233
+ }
2234
+ function importing_file(ctx, file_id, options = {}) {
2235
+ let importing_files = err.or_throw(files_exports.importing(ctx, file_id, options.select));
2236
+ if (options.deep) {
2237
+ importing_files = err.or_throw(
2238
+ expand({
2239
+ items: importing_files,
2240
+ get_children: (file) => files_exports.importing(ctx, file.id, options.select),
2241
+ get_key: (file) => file.id
2242
+ })
2243
+ );
2244
+ }
2245
+ const start = options.offset ?? 0;
2246
+ const end = options.limit ? start + options.limit : importing_files.length;
2247
+ return importing_files.slice(start, end);
2248
+ }
2249
+ function importing_dependency(ctx, dependency_id, options = {}) {
2250
+ let files_using_dependency = err.or_throw(files_exports.using_dependency(ctx, dependency_id, options.select));
2251
+ if (options.deep) {
2252
+ files_using_dependency = err.or_throw(
2253
+ expand({
2254
+ items: files_using_dependency,
2255
+ get_children: (file) => files_exports.importing(ctx, file.id, options.select),
2256
+ get_key: (file) => file.id
2257
+ })
2258
+ );
2259
+ }
2260
+ const start = options.offset ?? 0;
2261
+ const end = options.limit ? start + options.limit : files_using_dependency.length;
2262
+ return files_using_dependency.slice(start, end);
2263
+ }
2264
+
2265
+ // src/symbols.ts
2266
+ function symbols_wiki(ctx) {
2267
+ return {
2268
+ get: (id) => get3(ctx, id),
2269
+ search: (options) => search6(ctx, options),
2270
+ set_description: (id, description) => set_description2(ctx, id, description),
2271
+ referencing_symbol: (symbol_id, options) => referencing_symbol(ctx, symbol_id, options),
2272
+ referenced_by_symbol: (symbol_id, options) => referenced_by_symbol(ctx, symbol_id, options),
2273
+ using_dependency: (dependency_id, options) => using_dependency3(ctx, dependency_id, options)
2274
+ };
2275
+ }
2276
+ function get3(ctx, id) {
2277
+ return err.or_throw(symbols_exports.by_id(ctx, id)) ?? null;
2278
+ }
2279
+ function search6(ctx, options) {
2280
+ return err.or_throw(symbols_exports.search(ctx, options));
2281
+ }
2282
+ function set_description2(ctx, id, description) {
2283
+ err.or_throw(symbols_exports.update(ctx, id, { description }));
2284
+ }
2285
+ function referenced_by_symbol(ctx, symbol_id, options = {}) {
2286
+ let referenced_symbols = err.or_throw(symbols_exports.referenced_by(ctx, symbol_id, options.select));
2287
+ if (options.deep) {
2288
+ referenced_symbols = err.or_throw(
2289
+ expand({
2290
+ items: referenced_symbols,
2291
+ get_children: (symbol) => symbols_exports.referenced_by(ctx, symbol.id, options.select),
2292
+ get_key: (symbol) => symbol.id
2293
+ })
2294
+ );
2295
+ }
2296
+ const start = options.offset ?? 0;
2297
+ const end = options.limit ? start + options.limit : referenced_symbols.length;
2298
+ return referenced_symbols.slice(start, end);
2299
+ }
2300
+ function referencing_symbol(ctx, symbol_id, options = {}) {
2301
+ let referencing_symbols = err.or_throw(symbols_exports.referencing(ctx, symbol_id, options.select));
2302
+ if (options.deep) {
2303
+ referencing_symbols = err.or_throw(
2304
+ expand({
2305
+ items: referencing_symbols,
2306
+ get_children: (symbol) => symbols_exports.referencing(ctx, symbol.id, options.select),
2307
+ get_key: (symbol) => symbol.id
2308
+ })
2309
+ );
2310
+ }
2311
+ const start = options.offset ?? 0;
2312
+ const end = options.limit ? start + options.limit : referencing_symbols.length;
2313
+ return referencing_symbols.slice(start, end);
2314
+ }
2315
+ function using_dependency3(ctx, dependency_id, options = {}) {
2316
+ let symbols_using_dep = err.or_throw(symbols_exports.using_dependency(ctx, dependency_id, options.select));
2317
+ if (options.deep) {
2318
+ symbols_using_dep = err.or_throw(
2319
+ expand({
2320
+ items: symbols_using_dep,
2321
+ get_children: (symbol) => symbols_exports.referencing(ctx, symbol.id, options.select),
2322
+ get_key: (symbol) => symbol.id
2323
+ })
2324
+ );
2325
+ }
2326
+ const start = options.offset ?? 0;
2327
+ const end = options.limit ? start + options.limit : symbols_using_dep.length;
2328
+ return symbols_using_dep.slice(start, end);
2329
+ }
2330
+
2331
+ // src/directories.ts
2332
+ function directories_wiki(ctx) {
2333
+ return {
2334
+ get: (id) => get4(ctx, id),
2335
+ search: (options) => search7(ctx, options),
2336
+ set_description: (id, description) => set_description3(ctx, id, description),
2337
+ children: (parent_id, options) => children(ctx, parent_id, options),
2338
+ files: (directory_id, options) => directory_files(ctx, directory_id, options)
2339
+ };
2340
+ }
2341
+ function get4(ctx, id) {
2342
+ return err.or_throw(directories_exports.by_id(ctx, id)) ?? null;
2343
+ }
2344
+ function search7(ctx, options) {
2345
+ return err.or_throw(directories_exports.search(ctx, options));
2346
+ }
2347
+ function set_description3(ctx, id, description) {
2348
+ err.or_throw(directories_exports.update(ctx, id, { description }));
2349
+ }
2350
+ function children(ctx, parent_id, options = {}) {
2351
+ let child_directories = err.or_throw(directories_exports.search(ctx, { select: options.select, where: { parent_id }, limit: 1e4 }));
2352
+ if (options.deep) {
2353
+ child_directories = err.or_throw(
2354
+ expand({
2355
+ items: child_directories,
2356
+ get_children: (dir) => directories_exports.search(ctx, { select: options.select, where: { parent_id: dir.id }, limit: 1e4 }),
2357
+ get_key: (dir) => dir.id
2358
+ })
2359
+ );
2360
+ }
2361
+ const start = options.offset ?? 0;
2362
+ const end = options.limit ? start + options.limit : child_directories.length;
2363
+ return child_directories.slice(start, end);
2364
+ }
2365
+ function directory_files(ctx, directory_id, options = {}) {
2366
+ let files_list = err.or_throw(files_exports.search(ctx, { select: options.select, where: { directory_id }, limit: 1e4 }));
2367
+ if (options.deep) {
2368
+ const all_subdirs = err.or_throw(
2369
+ expand({
2370
+ items: err.or_throw(directories_exports.search(ctx, { select: ["id"], where: { parent_id: directory_id }, limit: 1e4 })),
2371
+ get_children: (dir) => directories_exports.search(ctx, { select: ["id"], where: { parent_id: dir.id }, limit: 1e4 }),
2372
+ get_key: (dir) => dir.id
2373
+ })
2374
+ );
2375
+ for (const subdir of all_subdirs) {
2376
+ const subdir_files = err.or_throw(
2377
+ files_exports.search(ctx, { select: options.select, where: { directory_id: subdir.id }, limit: 1e4 })
2378
+ );
2379
+ subdir_files.forEach((x) => files_list.push(x));
2380
+ }
2381
+ }
2382
+ const start = options.offset ?? 0;
2383
+ const end = options.limit ? start + options.limit : files_list.length;
2384
+ return files_list.slice(start, end);
2385
+ }
2386
+
2387
+ // src/dependencies.ts
2388
+ function dependencies_wiki(ctx) {
2389
+ return {
2390
+ get: (id) => get5(ctx, id),
2391
+ search: (options) => search8(ctx, options),
2392
+ set_description: (id, description) => set_description4(ctx, id, description),
2393
+ used_by_file: (file_id, options) => used_by_file2(ctx, file_id, options),
2394
+ used_by_symbol: (symbol_id, options) => used_by_symbol2(ctx, symbol_id, options)
2395
+ };
2396
+ }
2397
+ function get5(ctx, id) {
2398
+ return err.or_throw(external_dependencies_exports.by_id(ctx, id)) ?? null;
2399
+ }
2400
+ function search8(ctx, options) {
2401
+ return err.or_throw(external_dependencies_exports.search(ctx, options));
2402
+ }
2403
+ function set_description4(ctx, id, description) {
2404
+ err.or_throw(external_dependencies_exports.update(ctx, id, { description, state: "ready", error: null }));
2405
+ }
2406
+ function used_by_file2(ctx, file_id, options) {
2407
+ return err.or_throw(external_dependencies_exports.used_by_file(ctx, file_id, options?.select));
2408
+ }
2409
+ function used_by_symbol2(ctx, symbol_id, options) {
2410
+ return err.or_throw(external_dependencies_exports.used_by_symbol(ctx, symbol_id, options?.select));
2411
+ }
2412
+
2413
+ // src/index.ts
2414
+ async function create(config) {
2415
+ const ctx = await context_from_config(config);
2416
+ return {
2417
+ config,
2418
+ update: () => update6(ctx),
2419
+ counts: () => err.or_throw(counts(ctx)),
2420
+ files: files_wiki(ctx),
2421
+ symbols: symbols_wiki(ctx),
2422
+ directories: directories_wiki(ctx),
2423
+ dependencies: dependencies_wiki(ctx)
2424
+ };
2425
+ }
2426
+ async function load(db_path) {
2427
+ const ctx = await context_from_db(db_path);
2428
+ const stored = ctx.db.select().from(schema_exports.configs).get();
2429
+ const config = {
2430
+ db_path,
2431
+ project_path: stored.project_path,
2432
+ description: stored.description ?? void 0,
2433
+ package_json_path: stored.package_json_path ?? void 0,
2434
+ node_modules_paths: stored.node_modules_paths ? JSON.parse(stored.node_modules_paths) : void 0
2435
+ };
2436
+ return {
2437
+ config,
2438
+ update: () => update6(ctx),
2439
+ counts: () => err.or_throw(counts(ctx)),
2440
+ files: files_wiki(ctx),
2441
+ symbols: symbols_wiki(ctx),
2442
+ directories: directories_wiki(ctx),
2443
+ dependencies: dependencies_wiki(ctx)
2444
+ };
2445
+ }
2446
+ // Annotate the CommonJS export names for ESM import in node:
2447
+ 0 && (module.exports = {
2448
+ context_from_config,
2449
+ context_from_db,
2450
+ create,
2451
+ load
2452
+ });
2453
+ //# sourceMappingURL=index.cjs.map