@bsb/registry 1.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.
Files changed (54) hide show
  1. package/README.md +133 -0
  2. package/bsb-plugin.json +47 -0
  3. package/lib/.bsb/clients/service-bsb-registry.d.ts +1118 -0
  4. package/lib/.bsb/clients/service-bsb-registry.d.ts.map +1 -0
  5. package/lib/.bsb/clients/service-bsb-registry.js +393 -0
  6. package/lib/.bsb/clients/service-bsb-registry.js.map +1 -0
  7. package/lib/plugins/service-bsb-registry/auth.d.ts +87 -0
  8. package/lib/plugins/service-bsb-registry/auth.d.ts.map +1 -0
  9. package/lib/plugins/service-bsb-registry/auth.js +197 -0
  10. package/lib/plugins/service-bsb-registry/auth.js.map +1 -0
  11. package/lib/plugins/service-bsb-registry/db/file.d.ts +73 -0
  12. package/lib/plugins/service-bsb-registry/db/file.d.ts.map +1 -0
  13. package/lib/plugins/service-bsb-registry/db/file.js +588 -0
  14. package/lib/plugins/service-bsb-registry/db/file.js.map +1 -0
  15. package/lib/plugins/service-bsb-registry/db/index.d.ts +75 -0
  16. package/lib/plugins/service-bsb-registry/db/index.d.ts.map +1 -0
  17. package/lib/plugins/service-bsb-registry/db/index.js +24 -0
  18. package/lib/plugins/service-bsb-registry/db/index.js.map +1 -0
  19. package/lib/plugins/service-bsb-registry/index.d.ts +1228 -0
  20. package/lib/plugins/service-bsb-registry/index.d.ts.map +1 -0
  21. package/lib/plugins/service-bsb-registry/index.js +661 -0
  22. package/lib/plugins/service-bsb-registry/index.js.map +1 -0
  23. package/lib/plugins/service-bsb-registry/types.d.ts +559 -0
  24. package/lib/plugins/service-bsb-registry/types.d.ts.map +1 -0
  25. package/lib/plugins/service-bsb-registry/types.js +235 -0
  26. package/lib/plugins/service-bsb-registry/types.js.map +1 -0
  27. package/lib/plugins/service-bsb-registry-ui/http-server.d.ts +138 -0
  28. package/lib/plugins/service-bsb-registry-ui/http-server.d.ts.map +1 -0
  29. package/lib/plugins/service-bsb-registry-ui/http-server.js +1660 -0
  30. package/lib/plugins/service-bsb-registry-ui/http-server.js.map +1 -0
  31. package/lib/plugins/service-bsb-registry-ui/index.d.ts +62 -0
  32. package/lib/plugins/service-bsb-registry-ui/index.d.ts.map +1 -0
  33. package/lib/plugins/service-bsb-registry-ui/index.js +101 -0
  34. package/lib/plugins/service-bsb-registry-ui/index.js.map +1 -0
  35. package/lib/plugins/service-bsb-registry-ui/static/assets/images/apple-touch-icon.png +0 -0
  36. package/lib/plugins/service-bsb-registry-ui/static/assets/images/favicon-16x16.png +0 -0
  37. package/lib/plugins/service-bsb-registry-ui/static/assets/images/favicon-32x32.png +0 -0
  38. package/lib/plugins/service-bsb-registry-ui/static/assets/images/favicon.ico +0 -0
  39. package/lib/plugins/service-bsb-registry-ui/static/css/style.css +1849 -0
  40. package/lib/plugins/service-bsb-registry-ui/static/js/app.js +336 -0
  41. package/lib/plugins/service-bsb-registry-ui/templates/layouts/main.hbs +39 -0
  42. package/lib/plugins/service-bsb-registry-ui/templates/pages/error.hbs +13 -0
  43. package/lib/plugins/service-bsb-registry-ui/templates/pages/home.hbs +62 -0
  44. package/lib/plugins/service-bsb-registry-ui/templates/pages/not-found.hbs +13 -0
  45. package/lib/plugins/service-bsb-registry-ui/templates/pages/plugin-detail.hbs +537 -0
  46. package/lib/plugins/service-bsb-registry-ui/templates/pages/plugins.hbs +40 -0
  47. package/lib/plugins/service-bsb-registry-ui/templates/partials/pagination.hbs +41 -0
  48. package/lib/plugins/service-bsb-registry-ui/templates/partials/plugin-card.hbs +40 -0
  49. package/lib/plugins/service-bsb-registry-ui/templates/partials/search-form.hbs +31 -0
  50. package/lib/schemas/service-bsb-registry-ui.json +57 -0
  51. package/lib/schemas/service-bsb-registry-ui.plugin.json +73 -0
  52. package/lib/schemas/service-bsb-registry.json +1883 -0
  53. package/lib/schemas/service-bsb-registry.plugin.json +68 -0
  54. package/package.json +60 -0
@@ -0,0 +1,588 @@
1
+ "use strict";
2
+ /**
3
+ * File-based database implementation for BSB Registry.
4
+ *
5
+ * Layout on disk:
6
+ * <dataDir>/
7
+ * orgs/
8
+ * <orgId>.json Organization metadata (includes members)
9
+ * plugins/
10
+ * <org>/
11
+ * <name>/
12
+ * <version>.json Full RegistryEntry for each version
13
+ * users.json User[] - all registered users
14
+ * tokens.json AuthToken[] - all auth tokens
15
+ */
16
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
17
+ if (k2 === undefined) k2 = k;
18
+ var desc = Object.getOwnPropertyDescriptor(m, k);
19
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
20
+ desc = { enumerable: true, get: function() { return m[k]; } };
21
+ }
22
+ Object.defineProperty(o, k2, desc);
23
+ }) : (function(o, m, k, k2) {
24
+ if (k2 === undefined) k2 = k;
25
+ o[k2] = m[k];
26
+ }));
27
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
28
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
29
+ }) : function(o, v) {
30
+ o["default"] = v;
31
+ });
32
+ var __importStar = (this && this.__importStar) || (function () {
33
+ var ownKeys = function(o) {
34
+ ownKeys = Object.getOwnPropertyNames || function (o) {
35
+ var ar = [];
36
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
37
+ return ar;
38
+ };
39
+ return ownKeys(o);
40
+ };
41
+ return function (mod) {
42
+ if (mod && mod.__esModule) return mod;
43
+ var result = {};
44
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
45
+ __setModuleDefault(result, mod);
46
+ return result;
47
+ };
48
+ })();
49
+ Object.defineProperty(exports, "__esModule", { value: true });
50
+ exports.FileDB = void 0;
51
+ const fs = __importStar(require("fs"));
52
+ const path = __importStar(require("path"));
53
+ class FileDB {
54
+ dataDir;
55
+ pluginsDir;
56
+ orgsDir;
57
+ usersFile;
58
+ tokensFile;
59
+ constructor(dataDir) {
60
+ this.dataDir = dataDir;
61
+ this.pluginsDir = path.join(dataDir, 'plugins');
62
+ this.orgsDir = path.join(dataDir, 'orgs');
63
+ this.usersFile = path.join(dataDir, 'users.json');
64
+ this.tokensFile = path.join(dataDir, 'tokens.json');
65
+ }
66
+ // ============================================================================
67
+ // Lifecycle
68
+ // ============================================================================
69
+ async init(obs) {
70
+ const span = obs.startSpan('FileDB.init');
71
+ try {
72
+ fs.mkdirSync(this.pluginsDir, { recursive: true });
73
+ fs.mkdirSync(this.orgsDir, { recursive: true });
74
+ // Ensure users and tokens files exist
75
+ if (!fs.existsSync(this.usersFile)) {
76
+ this.writeJson(this.usersFile, []);
77
+ }
78
+ if (!fs.existsSync(this.tokensFile)) {
79
+ this.writeJson(this.tokensFile, []);
80
+ }
81
+ obs.log.info('File DB initialized at {path}', { path: this.dataDir });
82
+ }
83
+ finally {
84
+ span.end();
85
+ }
86
+ }
87
+ async dispose() {
88
+ // Nothing to close -- all ops are synchronous fs calls
89
+ }
90
+ // ============================================================================
91
+ // Plugin CRUD
92
+ // ============================================================================
93
+ async versionExists(obs, org, name, version) {
94
+ return fs.existsSync(this.versionPath(org, name, version));
95
+ }
96
+ async insert(obs, entry) {
97
+ const span = obs.startSpan('FileDB.insert', { pluginId: entry.id, version: entry.version });
98
+ try {
99
+ const vPath = this.versionPath(entry.org, entry.name, entry.version);
100
+ if (fs.existsSync(vPath)) {
101
+ throw new Error(`Version ${entry.version} of ${entry.id} already exists. Published versions are immutable.`);
102
+ }
103
+ // Ensure plugin directory exists
104
+ const pluginDir = this.pluginDir(entry.org, entry.name);
105
+ fs.mkdirSync(pluginDir, { recursive: true });
106
+ // Write version entry
107
+ this.writeJson(vPath, entry);
108
+ obs.log.debug('Plugin inserted: {id}@{version}', { id: entry.id, version: entry.version });
109
+ }
110
+ catch (error) {
111
+ obs.log.error('Insert failed: {error}', { error: error.message });
112
+ throw error;
113
+ }
114
+ finally {
115
+ span.end();
116
+ }
117
+ }
118
+ async get(obs, org, name, version) {
119
+ const span = obs.startSpan('FileDB.get', { org, name, ...(version ? { version } : {}) });
120
+ try {
121
+ if (version) {
122
+ return this.readVersion(org, name, version);
123
+ }
124
+ // No version specified -- return the latest
125
+ const entries = this.readAllVersions(org, name);
126
+ if (entries.length === 0)
127
+ return null;
128
+ return this.latestEntry(entries);
129
+ }
130
+ finally {
131
+ span.end();
132
+ }
133
+ }
134
+ async delete(obs, org, name, version) {
135
+ const span = obs.startSpan('FileDB.delete', { org, name, ...(version ? { version } : {}) });
136
+ try {
137
+ if (version) {
138
+ const vPath = this.versionPath(org, name, version);
139
+ if (fs.existsSync(vPath)) {
140
+ fs.unlinkSync(vPath);
141
+ obs.log.debug('Deleted version {org}/{name}@{version}', { org, name, version });
142
+ }
143
+ // If no versions remain, remove the plugin directory
144
+ const remaining = this.listVersionFiles(org, name);
145
+ if (remaining.length === 0) {
146
+ this.rmdir(this.pluginDir(org, name));
147
+ }
148
+ }
149
+ else {
150
+ // Delete entire plugin
151
+ const dir = this.pluginDir(org, name);
152
+ if (fs.existsSync(dir)) {
153
+ fs.rmSync(dir, { recursive: true, force: true });
154
+ obs.log.debug('Deleted all versions of {org}/{name}', { org, name });
155
+ }
156
+ }
157
+ }
158
+ finally {
159
+ span.end();
160
+ }
161
+ }
162
+ // ============================================================================
163
+ // Queries
164
+ // ============================================================================
165
+ async list(obs, query) {
166
+ const span = obs.startSpan('FileDB.list');
167
+ try {
168
+ let results = this.allLatestEntries();
169
+ // Apply filters
170
+ if (query.org)
171
+ results = results.filter(e => e.org === query.org);
172
+ if (query.language)
173
+ results = results.filter(e => e.language === query.language);
174
+ if (query.category)
175
+ results = results.filter(e => e.category === query.category);
176
+ // Sort newest first
177
+ results.sort((a, b) => cmpDate(b.publishedAt, a.publishedAt));
178
+ const total = results.length;
179
+ const limit = query.limit || 50;
180
+ const offset = query.offset || 0;
181
+ return { results: results.slice(offset, offset + limit), total };
182
+ }
183
+ finally {
184
+ span.end();
185
+ }
186
+ }
187
+ async search(obs, query) {
188
+ const span = obs.startSpan('FileDB.search', { query: query.query });
189
+ try {
190
+ const q = query.query.toLowerCase();
191
+ let results = this.allLatestEntries().filter(e => {
192
+ return (e.id.toLowerCase().includes(q) ||
193
+ e.name.toLowerCase().includes(q) ||
194
+ e.displayName.toLowerCase().includes(q) ||
195
+ e.description.toLowerCase().includes(q) ||
196
+ e.tags.some(tag => tag.toLowerCase().includes(q)));
197
+ });
198
+ if (query.language)
199
+ results = results.filter(e => e.language === query.language);
200
+ if (query.category)
201
+ results = results.filter(e => e.category === query.category);
202
+ results.sort((a, b) => cmpDate(b.publishedAt, a.publishedAt));
203
+ const total = results.length;
204
+ const limit = query.limit || 20;
205
+ const offset = query.offset || 0;
206
+ return { results: results.slice(offset, offset + limit), total };
207
+ }
208
+ finally {
209
+ span.end();
210
+ }
211
+ }
212
+ async getVersions(obs, org, name, majorMinor) {
213
+ const span = obs.startSpan('FileDB.getVersions', { org, name, ...(majorMinor ? { majorMinor } : {}) });
214
+ try {
215
+ const entries = this.readAllVersions(org, name);
216
+ let infos = entries.map(e => ({
217
+ version: e.version,
218
+ majorMinor: e.majorMinor,
219
+ publishedAt: e.publishedAt,
220
+ }));
221
+ if (majorMinor) {
222
+ infos = infos.filter(v => v.majorMinor === majorMinor);
223
+ }
224
+ infos.sort((a, b) => cmpDate(b.publishedAt, a.publishedAt));
225
+ return infos;
226
+ }
227
+ finally {
228
+ span.end();
229
+ }
230
+ }
231
+ async getStats(obs) {
232
+ const span = obs.startSpan('FileDB.getStats');
233
+ try {
234
+ const latest = this.allLatestEntries();
235
+ const byLanguage = {};
236
+ const byCategory = {};
237
+ let totalDownloads = 0;
238
+ for (const entry of latest) {
239
+ byLanguage[entry.language] = (byLanguage[entry.language] || 0) + 1;
240
+ byCategory[entry.category] = (byCategory[entry.category] || 0) + 1;
241
+ totalDownloads += entry.downloads || 0;
242
+ }
243
+ return {
244
+ totalPlugins: latest.length,
245
+ byLanguage: JSON.stringify(byLanguage),
246
+ byCategory: JSON.stringify(byCategory),
247
+ totalDownloads,
248
+ };
249
+ }
250
+ finally {
251
+ span.end();
252
+ }
253
+ }
254
+ // ============================================================================
255
+ // Organizations
256
+ // ============================================================================
257
+ async getOrganization(obs, orgId) {
258
+ const span = obs.startSpan('FileDB.getOrganization', { orgId });
259
+ try {
260
+ const orgPath = path.join(this.orgsDir, `${orgId}.json`);
261
+ if (!fs.existsSync(orgPath))
262
+ return null;
263
+ const org = this.readJson(orgPath);
264
+ // Count plugins for this org (live count)
265
+ const orgDir = path.join(this.pluginsDir, orgId);
266
+ let pluginCount = 0;
267
+ if (fs.existsSync(orgDir)) {
268
+ pluginCount = fs.readdirSync(orgDir, { withFileTypes: true })
269
+ .filter(d => d.isDirectory())
270
+ .length;
271
+ }
272
+ return { ...org, pluginCount };
273
+ }
274
+ finally {
275
+ span.end();
276
+ }
277
+ }
278
+ async createOrganization(obs, orgId, displayName, visibility) {
279
+ const span = obs.startSpan('FileDB.createOrganization', { orgId });
280
+ try {
281
+ const orgPath = path.join(this.orgsDir, `${orgId}.json`);
282
+ // If already exists, return it
283
+ if (fs.existsSync(orgPath)) {
284
+ return this.readJson(orgPath);
285
+ }
286
+ const org = {
287
+ id: orgId,
288
+ name: orgId,
289
+ displayName,
290
+ pluginCount: 0,
291
+ visibility,
292
+ members: [],
293
+ };
294
+ this.writeJson(orgPath, org);
295
+ obs.log.debug('Created organization: {orgId}', { orgId });
296
+ return org;
297
+ }
298
+ finally {
299
+ span.end();
300
+ }
301
+ }
302
+ async setOrgMember(obs, orgId, userId, permission) {
303
+ const span = obs.startSpan('FileDB.setOrgMember', { orgId, userId, permission });
304
+ try {
305
+ const orgPath = path.join(this.orgsDir, `${orgId}.json`);
306
+ if (!fs.existsSync(orgPath)) {
307
+ throw new Error(`Organization not found: ${orgId}`);
308
+ }
309
+ const org = this.readJson(orgPath);
310
+ const members = [...(org.members || [])];
311
+ // Update existing or add new
312
+ const existingIdx = members.findIndex(m => m.userId === userId);
313
+ if (existingIdx >= 0) {
314
+ members[existingIdx] = { userId, permission };
315
+ }
316
+ else {
317
+ members.push({ userId, permission });
318
+ }
319
+ const updated = { ...org, members };
320
+ this.writeJson(orgPath, updated);
321
+ obs.log.debug('Set org member: {orgId} / {userId} = {permission}', { orgId, userId, permission });
322
+ }
323
+ finally {
324
+ span.end();
325
+ }
326
+ }
327
+ async removeOrgMember(obs, orgId, userId) {
328
+ const span = obs.startSpan('FileDB.removeOrgMember', { orgId, userId });
329
+ try {
330
+ const orgPath = path.join(this.orgsDir, `${orgId}.json`);
331
+ if (!fs.existsSync(orgPath))
332
+ return;
333
+ const org = this.readJson(orgPath);
334
+ const updated = { ...org, members: (org.members || []).filter(m => m.userId !== userId) };
335
+ this.writeJson(orgPath, updated);
336
+ obs.log.debug('Removed org member: {orgId} / {userId}', { orgId, userId });
337
+ }
338
+ finally {
339
+ span.end();
340
+ }
341
+ }
342
+ async getOrgMembers(obs, orgId) {
343
+ const span = obs.startSpan('FileDB.getOrgMembers', { orgId });
344
+ try {
345
+ const orgPath = path.join(this.orgsDir, `${orgId}.json`);
346
+ if (!fs.existsSync(orgPath))
347
+ return [];
348
+ const org = this.readJson(orgPath);
349
+ return org.members || [];
350
+ }
351
+ finally {
352
+ span.end();
353
+ }
354
+ }
355
+ // ============================================================================
356
+ // Users
357
+ // ============================================================================
358
+ async getUser(obs, userId) {
359
+ const span = obs.startSpan('FileDB.getUser', { userId });
360
+ try {
361
+ const users = this.readJson(this.usersFile);
362
+ return users.find(u => u.id === userId) ?? null;
363
+ }
364
+ finally {
365
+ span.end();
366
+ }
367
+ }
368
+ async getUserByEmail(obs, email) {
369
+ const span = obs.startSpan('FileDB.getUserByEmail', { email });
370
+ try {
371
+ const users = this.readJson(this.usersFile);
372
+ return users.find(u => u.email === email) ?? null;
373
+ }
374
+ finally {
375
+ span.end();
376
+ }
377
+ }
378
+ async listUsers(obs) {
379
+ const span = obs.startSpan('FileDB.listUsers');
380
+ try {
381
+ return this.readJson(this.usersFile);
382
+ }
383
+ finally {
384
+ span.end();
385
+ }
386
+ }
387
+ async createUser(obs, user) {
388
+ const span = obs.startSpan('FileDB.createUser', { userId: user.id });
389
+ try {
390
+ const users = this.readJson(this.usersFile);
391
+ if (users.some(u => u.id === user.id)) {
392
+ throw new Error(`User already exists: ${user.id}`);
393
+ }
394
+ users.push(user);
395
+ this.writeJson(this.usersFile, users);
396
+ obs.log.debug('Created user: {id}', { id: user.id });
397
+ }
398
+ finally {
399
+ span.end();
400
+ }
401
+ }
402
+ async updateUser(obs, userId, updates) {
403
+ const span = obs.startSpan('FileDB.updateUser', { userId });
404
+ try {
405
+ const users = this.readJson(this.usersFile);
406
+ const idx = users.findIndex(u => u.id === userId);
407
+ if (idx < 0)
408
+ return null;
409
+ const existing = users[idx];
410
+ const updated = {
411
+ ...existing,
412
+ name: updates.name ?? existing.name,
413
+ email: updates.email ?? existing.email,
414
+ active: updates.active ?? existing.active,
415
+ permissions: updates.permissions ?? existing.permissions,
416
+ updatedAt: new Date().toISOString(),
417
+ };
418
+ users[idx] = updated;
419
+ this.writeJson(this.usersFile, users);
420
+ obs.log.debug('Updated user: {id}', { id: userId });
421
+ return updated;
422
+ }
423
+ finally {
424
+ span.end();
425
+ }
426
+ }
427
+ // ============================================================================
428
+ // Auth Tokens
429
+ // ============================================================================
430
+ async getToken(obs, tokenString) {
431
+ const span = obs.startSpan('FileDB.getToken');
432
+ try {
433
+ const tokens = this.readJson(this.tokensFile);
434
+ return tokens.find(t => t.token === tokenString) ?? null;
435
+ }
436
+ finally {
437
+ span.end();
438
+ }
439
+ }
440
+ async getTokensForUser(obs, userId) {
441
+ const span = obs.startSpan('FileDB.getTokensForUser', { userId });
442
+ try {
443
+ const tokens = this.readJson(this.tokensFile);
444
+ return tokens.filter(t => t.userId === userId);
445
+ }
446
+ finally {
447
+ span.end();
448
+ }
449
+ }
450
+ async createToken(obs, token) {
451
+ const span = obs.startSpan('FileDB.createToken', { userId: token.userId });
452
+ try {
453
+ const tokens = this.readJson(this.tokensFile);
454
+ tokens.push(token);
455
+ this.writeJson(this.tokensFile, tokens);
456
+ obs.log.debug('Created token for user: {userId}', { userId: token.userId });
457
+ }
458
+ finally {
459
+ span.end();
460
+ }
461
+ }
462
+ async deleteToken(obs, tokenString) {
463
+ const span = obs.startSpan('FileDB.deleteToken');
464
+ try {
465
+ const tokens = this.readJson(this.tokensFile);
466
+ const idx = tokens.findIndex(t => t.token === tokenString);
467
+ if (idx < 0)
468
+ return false;
469
+ tokens.splice(idx, 1);
470
+ this.writeJson(this.tokensFile, tokens);
471
+ return true;
472
+ }
473
+ finally {
474
+ span.end();
475
+ }
476
+ }
477
+ async deleteTokensForUser(obs, userId) {
478
+ const span = obs.startSpan('FileDB.deleteTokensForUser', { userId });
479
+ try {
480
+ const tokens = this.readJson(this.tokensFile);
481
+ const before = tokens.length;
482
+ const remaining = tokens.filter(t => t.userId !== userId);
483
+ const count = before - remaining.length;
484
+ if (count > 0) {
485
+ this.writeJson(this.tokensFile, remaining);
486
+ }
487
+ return count;
488
+ }
489
+ finally {
490
+ span.end();
491
+ }
492
+ }
493
+ // ============================================================================
494
+ // Internal helpers
495
+ // ============================================================================
496
+ pluginDir(org, name) {
497
+ return path.join(this.pluginsDir, org, name);
498
+ }
499
+ versionPath(org, name, version) {
500
+ return path.join(this.pluginsDir, org, name, `${version}.json`);
501
+ }
502
+ /** List version JSON files in a plugin directory. Returns filenames (no path). */
503
+ listVersionFiles(org, name) {
504
+ const dir = this.pluginDir(org, name);
505
+ if (!fs.existsSync(dir))
506
+ return [];
507
+ return fs.readdirSync(dir).filter(f => f.endsWith('.json'));
508
+ }
509
+ /** Read a single version entry. Returns null if file does not exist. */
510
+ readVersion(org, name, version) {
511
+ const p = this.versionPath(org, name, version);
512
+ if (!fs.existsSync(p))
513
+ return null;
514
+ return this.readJson(p);
515
+ }
516
+ /** Read every version entry for a plugin. */
517
+ readAllVersions(org, name) {
518
+ const files = this.listVersionFiles(org, name);
519
+ const dir = this.pluginDir(org, name);
520
+ const entries = [];
521
+ for (const f of files) {
522
+ try {
523
+ entries.push(this.readJson(path.join(dir, f)));
524
+ }
525
+ catch {
526
+ // Skip corrupt files
527
+ }
528
+ }
529
+ return entries;
530
+ }
531
+ /** Walk every org/plugin directory and return the latest entry of each plugin. */
532
+ allLatestEntries() {
533
+ const results = [];
534
+ if (!fs.existsSync(this.pluginsDir))
535
+ return results;
536
+ const orgs = fs.readdirSync(this.pluginsDir, { withFileTypes: true })
537
+ .filter(d => d.isDirectory());
538
+ for (const orgDir of orgs) {
539
+ const orgPath = path.join(this.pluginsDir, orgDir.name);
540
+ const plugins = fs.readdirSync(orgPath, { withFileTypes: true })
541
+ .filter(d => d.isDirectory());
542
+ for (const pluginDir of plugins) {
543
+ const entries = this.readAllVersions(orgDir.name, pluginDir.name);
544
+ if (entries.length === 0)
545
+ continue;
546
+ const latest = this.latestEntry(entries);
547
+ if (latest)
548
+ results.push(latest);
549
+ }
550
+ }
551
+ return results;
552
+ }
553
+ /** Pick the entry with the most recent publishedAt. */
554
+ latestEntry(entries) {
555
+ if (entries.length === 0)
556
+ return null;
557
+ let best = entries[0];
558
+ for (let i = 1; i < entries.length; i++) {
559
+ if (cmpDate(entries[i].publishedAt, best.publishedAt) > 0) {
560
+ best = entries[i];
561
+ }
562
+ }
563
+ return best;
564
+ }
565
+ /** Remove a directory if it exists and is empty. */
566
+ rmdir(dir) {
567
+ try {
568
+ if (fs.existsSync(dir) && fs.readdirSync(dir).length === 0) {
569
+ fs.rmdirSync(dir);
570
+ }
571
+ }
572
+ catch {
573
+ // Ignore cleanup failures
574
+ }
575
+ }
576
+ readJson(filePath) {
577
+ return JSON.parse(fs.readFileSync(filePath, 'utf-8'));
578
+ }
579
+ writeJson(filePath, data) {
580
+ fs.writeFileSync(filePath, JSON.stringify(data, null, 2), 'utf-8');
581
+ }
582
+ }
583
+ exports.FileDB = FileDB;
584
+ /** Compare two ISO date strings. Returns positive if a > b. */
585
+ function cmpDate(a, b) {
586
+ return new Date(a).getTime() - new Date(b).getTime();
587
+ }
588
+ //# sourceMappingURL=file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file.js","sourceRoot":"","sources":["../../../../src/plugins/service-bsb-registry/db/file.ts"],"names":[],"mappings":"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"}