@platforma-sdk/block-tools 2.1.5 → 2.1.7

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 (100) hide show
  1. package/dist/cli.js +1 -756
  2. package/dist/cli.js.map +1 -1
  3. package/dist/cli.mjs +187 -0
  4. package/dist/cli.mjs.map +1 -0
  5. package/dist/cmd/build-meta.d.ts +10 -0
  6. package/dist/cmd/build-meta.d.ts.map +1 -0
  7. package/dist/cmd/build-model.d.ts +11 -0
  8. package/dist/cmd/build-model.d.ts.map +1 -0
  9. package/dist/cmd/index.d.ts +11 -0
  10. package/dist/cmd/index.d.ts.map +1 -0
  11. package/dist/cmd/pack-block.d.ts +10 -0
  12. package/dist/cmd/pack-block.d.ts.map +1 -0
  13. package/dist/cmd/upload-package-v1.d.ts +15 -0
  14. package/dist/cmd/upload-package-v1.d.ts.map +1 -0
  15. package/dist/common_types.d.ts +3 -0
  16. package/dist/common_types.d.ts.map +1 -0
  17. package/dist/config-BJognM_j.mjs +536 -0
  18. package/dist/config-BJognM_j.mjs.map +1 -0
  19. package/dist/config-CfA0Dj6h.js +3 -0
  20. package/dist/config-CfA0Dj6h.js.map +1 -0
  21. package/dist/index.js +2 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/index.mjs +43 -0
  24. package/dist/index.mjs.map +1 -0
  25. package/dist/lib/storage.d.ts +29 -0
  26. package/dist/lib/storage.d.ts.map +1 -0
  27. package/dist/lib.d.ts +3 -2637
  28. package/dist/lib.d.ts.map +1 -0
  29. package/dist/registry_v1/config.d.ts +12 -0
  30. package/dist/registry_v1/config.d.ts.map +1 -0
  31. package/dist/registry_v1/config_schema.d.ts +94 -0
  32. package/dist/registry_v1/config_schema.d.ts.map +1 -0
  33. package/dist/registry_v1/flags.d.ts +9 -0
  34. package/dist/registry_v1/flags.d.ts.map +1 -0
  35. package/dist/registry_v1/index.d.ts +4 -0
  36. package/dist/registry_v1/index.d.ts.map +1 -0
  37. package/dist/registry_v1/registry.d.ts +46 -0
  38. package/dist/registry_v1/registry.d.ts.map +1 -0
  39. package/dist/registry_v1/v1_repo_schema.d.ts +25 -0
  40. package/dist/registry_v1/v1_repo_schema.d.ts.map +1 -0
  41. package/dist/util.d.ts +4 -0
  42. package/dist/util.d.ts.map +1 -0
  43. package/dist/v2/build_dist.d.ts +3 -0
  44. package/dist/v2/build_dist.d.ts.map +1 -0
  45. package/dist/v2/index.d.ts +4 -0
  46. package/dist/v2/index.d.ts.map +1 -0
  47. package/dist/v2/model/block_components.d.ts +384 -0
  48. package/dist/v2/model/block_components.d.ts.map +1 -0
  49. package/dist/v2/model/common.d.ts +3 -0
  50. package/dist/v2/model/common.d.ts.map +1 -0
  51. package/dist/v2/model/content_conversion.d.ts +35 -0
  52. package/dist/v2/model/content_conversion.d.ts.map +1 -0
  53. package/dist/v2/model/content_types.d.ts +478 -0
  54. package/dist/v2/model/content_types.d.ts.map +1 -0
  55. package/dist/{lib.d.cts → v2/model/index.d.ts} +449 -1005
  56. package/dist/v2/model/index.d.ts.map +1 -0
  57. package/dist/v2/model/meta.d.ts +805 -0
  58. package/dist/v2/model/meta.d.ts.map +1 -0
  59. package/dist/v2/registry/schema.d.ts +15 -0
  60. package/dist/v2/registry/schema.d.ts.map +1 -0
  61. package/dist/v2/source_package.d.ts +8 -0
  62. package/dist/v2/source_package.d.ts.map +1 -0
  63. package/package.json +24 -17
  64. package/src/cmd/build-meta.ts +38 -0
  65. package/src/cmd/build-model.ts +76 -0
  66. package/src/cmd/index.ts +12 -0
  67. package/src/cmd/pack-block.ts +32 -0
  68. package/src/cmd/upload-package-v1.ts +105 -0
  69. package/src/common_types.ts +3 -0
  70. package/src/lib/storage.test.ts +91 -0
  71. package/src/lib/storage.ts +140 -0
  72. package/src/lib.ts +2 -0
  73. package/src/registry_v1/config.ts +90 -0
  74. package/src/registry_v1/config_schema.ts +30 -0
  75. package/src/registry_v1/flags.ts +23 -0
  76. package/src/registry_v1/index.ts +3 -0
  77. package/src/registry_v1/registry.test.ts +122 -0
  78. package/src/registry_v1/registry.ts +253 -0
  79. package/src/registry_v1/v1_repo_schema.ts +42 -0
  80. package/src/util.ts +25 -0
  81. package/src/v2/build_dist.test.ts +16 -0
  82. package/src/v2/build_dist.ts +29 -0
  83. package/src/v2/index.ts +3 -0
  84. package/src/v2/model/block_components.ts +32 -0
  85. package/src/v2/model/common.ts +2 -0
  86. package/src/v2/model/content_conversion.ts +178 -0
  87. package/src/v2/model/content_types.ts +233 -0
  88. package/src/v2/model/index.ts +46 -0
  89. package/src/v2/model/meta.ts +36 -0
  90. package/src/v2/registry/schema.ts +29 -0
  91. package/src/v2/source_package.test.ts +27 -0
  92. package/src/v2/source_package.ts +82 -0
  93. package/dist/cli.cjs +0 -786
  94. package/dist/cli.cjs.map +0 -1
  95. package/dist/cli.d.cts +0 -58
  96. package/dist/cli.d.ts +0 -58
  97. package/dist/lib.cjs +0 -629
  98. package/dist/lib.cjs.map +0 -1
  99. package/dist/lib.js +0 -577
  100. package/dist/lib.js.map +0 -1
@@ -0,0 +1,536 @@
1
+ var ne = Object.defineProperty;
2
+ var ce = (t, e, r) => e in t ? ne(t, e, { enumerable: !0, configurable: !0, writable: !0, value: r }) : t[e] = r;
3
+ var v = (t, e, r) => ce(t, typeof e != "symbol" ? e + "" : e, r);
4
+ import h from "node:fs/promises";
5
+ import n from "node:path";
6
+ import { z as i } from "zod";
7
+ import * as le from "mime-types";
8
+ import * as ge from "tar";
9
+ import { BlockComponents as O, ContentAbsoluteBinaryLocal as R, ContentAbsoluteFolder as fe, BlockComponentsManifest as Z, ContentRelativeBinary as V, BlockPackMeta as j, ContentAbsoluteTextLocal as Y, BlockPackMetaEmbeddedContent as pe, DescriptionContentText as ue, DescriptionContentBinary as de, CreateBlockPackDescriptionSchema as N, BlockPackMetaManifest as he, BlockPackDescriptionFromPackageJsonRaw as H, SemVer as z } from "@milaboratories/pl-model-middle-layer";
10
+ import { notEmpty as Q } from "@milaboratories/ts-helpers";
11
+ import me from "yaml";
12
+ import * as W from "node:os";
13
+ import { randomUUID as ke } from "node:crypto";
14
+ import we from "semver/preload";
15
+ import u from "node:path/posix";
16
+ import { S3 as ve, paginateListObjectsV2 as ye } from "@aws-sdk/client-s3";
17
+ import * as w from "node:fs";
18
+ function X(t, e) {
19
+ try {
20
+ return require.resolve(e, {
21
+ paths: [t]
22
+ });
23
+ } catch (r) {
24
+ if (r.code !== "MODULE_NOT_FOUND") throw r;
25
+ }
26
+ }
27
+ function Pe(t) {
28
+ return i.string().transform((e, r) => {
29
+ const o = X(t, e);
30
+ return o === void 0 ? (r.addIssue({
31
+ code: i.ZodIssueCode.custom,
32
+ message: `Can't resolve ${e} against ${t}`
33
+ }), i.NEVER) : {
34
+ type: "absolute-file",
35
+ file: o
36
+ };
37
+ });
38
+ }
39
+ function Fe(t, ...e) {
40
+ return i.string().transform((r, o) => {
41
+ const s = r.endsWith("/") ? r : `${r}/`;
42
+ for (const a of e) {
43
+ const f = X(t, s + a);
44
+ if (f !== void 0) {
45
+ if (!f.endsWith(a))
46
+ throw new Error(`Unexpected resolve result ${f} with index file ${a}`);
47
+ return {
48
+ type: "absolute-folder",
49
+ folder: f.slice(0, f.length - a.length)
50
+ };
51
+ }
52
+ }
53
+ return o.addIssue({
54
+ code: i.ZodIssueCode.custom,
55
+ message: `Can't resolve ${r} folder against ${t}, no index file found (${e.join(", ")})`
56
+ }), i.NEVER;
57
+ });
58
+ }
59
+ function I(t) {
60
+ return (e) => e.type === "relative" ? { type: "absolute-file", file: n.resolve(t, e.path) } : e;
61
+ }
62
+ function $e() {
63
+ return async (t) => t.type === "absolute-file" ? await h.readFile(t.file, { encoding: "utf-8" }) : t.content;
64
+ }
65
+ function be() {
66
+ return async (t) => {
67
+ if (t.type === "absolute-file") {
68
+ const e = le.lookup(t.file);
69
+ if (!e) throw new Error(`Can't recognize mime type of the file: ${t.file}.`);
70
+ return {
71
+ type: "explicit-base64",
72
+ mimeType: e,
73
+ content: await h.readFile(t.file, { encoding: "base64" })
74
+ };
75
+ } else return t;
76
+ };
77
+ }
78
+ function C(t, e) {
79
+ return async (r) => {
80
+ if (r.type === "absolute-file") {
81
+ const o = n.basename(r.file), s = n.resolve(t, o);
82
+ return e == null || e.push(o), await h.cp(r.file, s), { type: "relative", path: o };
83
+ } else return r;
84
+ };
85
+ }
86
+ function Be(t, e, r) {
87
+ if (!e.endsWith(".tgz")) throw new Error(`Unexpected tgz file name: ${e}`);
88
+ return async (o) => {
89
+ const s = n.resolve(t, e);
90
+ return await ge.create(
91
+ {
92
+ gzip: !0,
93
+ file: s,
94
+ cwd: o.folder
95
+ },
96
+ [o.folder]
97
+ ), r == null || r.push(e), { type: "relative", path: e };
98
+ };
99
+ }
100
+ function G(t) {
101
+ const e = t.endsWith("/") ? t : `${t}/`;
102
+ return (r) => r.type === "relative" ? { type: "absolute-url", url: e + r.path } : r;
103
+ }
104
+ function Ce(t) {
105
+ return O(
106
+ Pe(t),
107
+ Fe(t, "index.html")
108
+ );
109
+ }
110
+ function Se(t, e) {
111
+ return O(
112
+ R.transform(C(t, e)),
113
+ fe.transform(Be(t, "ui.tgz", e))
114
+ ).pipe(Z);
115
+ }
116
+ function it(t) {
117
+ return O(
118
+ V.transform(G(t)),
119
+ V.transform(G(t))
120
+ );
121
+ }
122
+ function Ee(t) {
123
+ return j(
124
+ ue.transform(I(t)),
125
+ de.transform(I(t))
126
+ );
127
+ }
128
+ function Oe(t, e) {
129
+ return j(
130
+ Y.transform(C(t, e)),
131
+ R.transform(C(t, e))
132
+ );
133
+ }
134
+ const nt = j(
135
+ Y.transform($e()),
136
+ R.transform(be())
137
+ ).pipe(pe);
138
+ function ee(t) {
139
+ return N(
140
+ Ce(t),
141
+ Ee(t)
142
+ );
143
+ }
144
+ function Re(t, e) {
145
+ return N(
146
+ Se(t, e),
147
+ //BlockPackMetaToExplicit
148
+ Oe(t, e)
149
+ ).pipe(te);
150
+ }
151
+ const te = N(
152
+ Z,
153
+ he
154
+ ), je = te.extend({
155
+ schema: i.literal("v1"),
156
+ files: i.array(i.string())
157
+ }), Ne = "manifest.json";
158
+ async function ct(t, e) {
159
+ await h.mkdir(e, { recursive: !0 });
160
+ const r = [], o = await Re(e, r).parseAsync(
161
+ t
162
+ ), s = je.parse({
163
+ schema: "v1",
164
+ ...o,
165
+ files: r
166
+ });
167
+ return await h.writeFile(n.resolve(e, Ne), JSON.stringify(s)), s;
168
+ }
169
+ async function D(t, e) {
170
+ try {
171
+ return e(await h.readFile(t));
172
+ } catch (r) {
173
+ if (r.code == "ENOENT") return;
174
+ throw new Error("", { cause: r });
175
+ }
176
+ }
177
+ const S = "block", ze = /(?:@[a-zA-Z0-9-.]+\/)?(?<organization>[a-zA-Z0-9-]+)\.(?<name>[a-zA-Z0-9-]+)/;
178
+ function re(t) {
179
+ const e = t.match(ze);
180
+ if (!e)
181
+ throw new Error(
182
+ `Malformed package name (${t}), can't infer organization and block pack name.`
183
+ );
184
+ const { name: r, organization: o } = e.groups;
185
+ return { name: r, organization: o };
186
+ }
187
+ async function lt(t) {
188
+ const e = n.resolve(t, "package.json");
189
+ try {
190
+ const r = await D(
191
+ e,
192
+ (f) => JSON.parse(f.toString("utf-8"))
193
+ );
194
+ if (r === void 0) return;
195
+ const o = r[S];
196
+ if (o === void 0) return;
197
+ const s = {
198
+ ...H.parse(o),
199
+ id: {
200
+ ...re(
201
+ Q(r.name, `"name" not found in ${e}`)
202
+ ),
203
+ version: z.parse(r.version)
204
+ }
205
+ }, a = await ee(t).safeParseAsync(s);
206
+ return a.success ? a.data : void 0;
207
+ } catch {
208
+ return;
209
+ }
210
+ }
211
+ async function De(t) {
212
+ const e = n.resolve(t, "package.json"), r = JSON.parse(await h.readFile(e, { encoding: "utf-8" })), o = r[S];
213
+ if (o === void 0)
214
+ throw new Error(
215
+ `Block description (field ${S}) not found in ${e}.`
216
+ );
217
+ return {
218
+ ...H.parse(o),
219
+ id: {
220
+ ...re(
221
+ Q(r.name, `"name" not found in ${e}`)
222
+ ),
223
+ version: z.parse(r.version)
224
+ }
225
+ };
226
+ }
227
+ async function gt(t) {
228
+ const e = await De(t);
229
+ return await ee(t).parseAsync(e);
230
+ }
231
+ const Me = i.string().regex(/^(?:s3:|file:)/), Je = i.object({
232
+ organization: i.string(),
233
+ package: i.string(),
234
+ version: z.optional(),
235
+ files: i.record(i.string().regex(/^[^\/]+$/), i.string()).default({}),
236
+ meta: i.object({}).passthrough()
237
+ }), xe = i.object({
238
+ registries: i.record(i.string(), Me).default({}),
239
+ registry: i.string().optional()
240
+ }), oe = xe.merge(Je).required(
241
+ { registry: !0, version: !0 }
242
+ ), M = oe.partial().required({
243
+ registries: !0,
244
+ files: !0
245
+ }), Ae = "pl.package.json", Te = "pl.package.yaml", y = "v1/";
246
+ function ft(t) {
247
+ return `${y}${t.organization}/${t.package}/${t.version}`;
248
+ }
249
+ function se(t, e) {
250
+ return `${y}${t.organization}/${t.package}/${t.version}/${e}`;
251
+ }
252
+ function K(t) {
253
+ return `${y}${t.organization}/${t.package}/overview.json`;
254
+ }
255
+ const $ = `${y}overview.json`, ae = "meta.json", E = "_updates_v1/per_package_version/";
256
+ function Ue(t, e) {
257
+ return `${E}${t.organization}/${t.package}/${t.version}/${e}`;
258
+ }
259
+ const _e = /(?<packageKeyWithoutVersion>(?<organization>[^\/]+)\/(?<pkg>[^\/]+))\/(?<version>[^\/]+)\/(?<seed>[^\/]+)$/, ie = "_updates_v1/_global_update_in", q = "_updates_v1/_global_update_out";
260
+ class Le {
261
+ constructor(e, r) {
262
+ this.storage = e, this.logger = r;
263
+ }
264
+ constructNewPackage(e) {
265
+ return new Ve(this.storage, e);
266
+ }
267
+ async updateRegistry() {
268
+ var f, J, x, A, T, U, _, L;
269
+ (f = this.logger) == null || f.info("Initiating registry refresh...");
270
+ const e = /* @__PURE__ */ new Map(), r = [], o = await this.storage.listFiles(E);
271
+ (J = this.logger) == null || J.info("Packages to be updated:");
272
+ for (const c of o) {
273
+ const m = c.match(_e);
274
+ if (!m) continue;
275
+ r.push(c);
276
+ const { packageKeyWithoutVersion: k, organization: l, pkg: g, version: p, seed: P } = m.groups;
277
+ let F = e.get(k);
278
+ F ? F.versions.has(p) || F.versions.add(p) : e.set(k, {
279
+ package: { organization: l, package: g },
280
+ versions: /* @__PURE__ */ new Set([p])
281
+ }), (x = this.logger) == null || x.info(` - ${l}:${g}:${p}`);
282
+ }
283
+ const s = await this.storage.getFile($);
284
+ let a = s === void 0 ? [] : JSON.parse(s.toString());
285
+ (A = this.logger) == null || A.info(`Global overview loaded, ${a.length} records`);
286
+ for (const [, c] of e.entries()) {
287
+ const m = K(c.package), k = await this.storage.getFile(m);
288
+ let l = k === void 0 ? [] : JSON.parse(k.toString());
289
+ (T = this.logger) == null || T.info(
290
+ `Updating ${c.package.organization}:${c.package.package} overview, ${l.length} records`
291
+ ), l = l.filter((g) => !c.versions.has(g.version));
292
+ for (const [g] of c.versions.entries()) {
293
+ const p = g.toString(), P = await this.storage.getFile(
294
+ se(
295
+ {
296
+ ...c.package,
297
+ version: p
298
+ },
299
+ ae
300
+ )
301
+ );
302
+ P && l.push({ version: p, meta: JSON.parse(P.toString()) });
303
+ }
304
+ l.sort((g, p) => we.compare(p.version, g.version)), await this.storage.putFile(m, Buffer.from(JSON.stringify(l))), (U = this.logger) == null || U.info(`Done (${l.length} records)`), a = a.filter(
305
+ (g) => g.organization !== c.package.organization || g.package !== c.package.package
306
+ ), a.push({
307
+ organization: c.package.organization,
308
+ package: c.package.package,
309
+ allVersions: l.map((g) => g.version).reverse(),
310
+ latestVersion: l[0].version,
311
+ latestMeta: l[0].meta
312
+ });
313
+ }
314
+ await this.storage.putFile($, Buffer.from(JSON.stringify(a))), (_ = this.logger) == null || _.info(`Global overview updated (${a.length} records)`), await this.storage.deleteFiles(...r.map((c) => `${E}${c}`)), (L = this.logger) == null || L.info("Version update requests cleared");
315
+ }
316
+ async updateIfNeeded(e = !1) {
317
+ var s, a;
318
+ (s = this.logger) == null || s.info("Checking if registry requires refresh...");
319
+ const r = await this.storage.getFile(ie), o = await this.storage.getFile(q);
320
+ !e && r === void 0 && o === void 0 || !e && r !== void 0 && o !== void 0 && r.equals(o) || (await this.updateRegistry(), r && (await this.storage.putFile(q, r), (a = this.logger) == null || a.info("Refresh finished")));
321
+ }
322
+ async getPackageOverview(e) {
323
+ const r = await this.storage.getFile(K(e));
324
+ if (r !== void 0)
325
+ return JSON.parse(r.toString());
326
+ }
327
+ async getGlobalOverview() {
328
+ const e = await this.storage.getFile($);
329
+ if (e !== void 0)
330
+ return JSON.parse(e.toString());
331
+ }
332
+ }
333
+ class Ve {
334
+ constructor(e, r) {
335
+ v(this, "metaAdded", !1);
336
+ v(this, "seed", ke());
337
+ this.storage = e, this.name = r;
338
+ }
339
+ async addFile(e, r) {
340
+ await this.storage.putFile(se(this.name, e), r);
341
+ }
342
+ async writeMeta(e) {
343
+ await this.addFile(ae, Buffer.from(JSON.stringify(e))), this.metaAdded = !0;
344
+ }
345
+ async finish() {
346
+ if (!this.metaAdded) throw new Error("meta not added");
347
+ await this.storage.putFile(Ue(this.name, this.seed), Buffer.of(0)), await this.storage.putFile(ie, Buffer.from(this.seed));
348
+ }
349
+ }
350
+ class We {
351
+ constructor(e, r, o) {
352
+ this.client = e, this.bucket = r, this.root = o;
353
+ }
354
+ async getFile(e) {
355
+ try {
356
+ return Buffer.from(
357
+ await (await this.client.getObject({
358
+ Bucket: this.bucket,
359
+ Key: u.join(this.root, e)
360
+ })).Body.transformToByteArray()
361
+ );
362
+ } catch (r) {
363
+ if (r.name === "NoSuchKey") return;
364
+ throw r;
365
+ }
366
+ }
367
+ async listFiles(e) {
368
+ const r = u.join(this.root, e), o = ye(
369
+ { client: this.client },
370
+ {
371
+ Bucket: this.bucket,
372
+ Prefix: r
373
+ }
374
+ ), s = [];
375
+ for await (const a of o)
376
+ s.push(...a.Contents.map((f) => u.relative(r, f.Key)));
377
+ return s;
378
+ }
379
+ async putFile(e, r) {
380
+ await this.client.putObject({
381
+ Bucket: this.bucket,
382
+ Key: u.join(this.root, e),
383
+ Body: r
384
+ });
385
+ }
386
+ async deleteFiles(...e) {
387
+ const r = await this.client.deleteObjects({
388
+ Bucket: this.bucket,
389
+ Delete: {
390
+ Objects: e.map((o) => ({
391
+ Key: u.join(this.root, o)
392
+ }))
393
+ }
394
+ });
395
+ if (r.Errors !== void 0 && r.Errors.length > 0)
396
+ throw new Error(`Errors encountered while deleting files: ${r.Errors.join(`
397
+ `)}`);
398
+ }
399
+ }
400
+ class Ie {
401
+ constructor(e) {
402
+ /** Absolute path */
403
+ v(this, "root");
404
+ this.root = n.resolve(e);
405
+ }
406
+ toAbsolutePath(e) {
407
+ if (u.isAbsolute(e)) throw new Error("absolute path");
408
+ return n.resolve(this.root, e.split(u.sep).join(n.sep));
409
+ }
410
+ async getFile(e) {
411
+ try {
412
+ return await w.promises.readFile(this.toAbsolutePath(e));
413
+ } catch (r) {
414
+ if (r.code == "ENOENT") return;
415
+ throw new Error("", { cause: r });
416
+ }
417
+ }
418
+ async listFiles(e) {
419
+ try {
420
+ const r = this.toAbsolutePath(e);
421
+ return (await w.promises.readdir(r, { recursive: !0, withFileTypes: !0 })).filter((o) => o.isFile()).map(
422
+ (o) => n.relative(r, n.resolve(o.path, o.name)).split(n.sep).join(u.sep)
423
+ );
424
+ } catch (r) {
425
+ if (r.code == "ENOENT") return [];
426
+ throw new Error("", { cause: r });
427
+ }
428
+ }
429
+ async putFile(e, r) {
430
+ const o = this.toAbsolutePath(e);
431
+ await w.promises.mkdir(n.dirname(o), { recursive: !0 }), await w.promises.writeFile(o, r);
432
+ }
433
+ async deleteFiles(...e) {
434
+ for (const r of e) await w.promises.rm(this.toAbsolutePath(r));
435
+ }
436
+ }
437
+ function Ge(t) {
438
+ const e = new URL(t, `file:${n.resolve(".").split(n.sep).join(u.sep)}/`);
439
+ switch (e.protocol) {
440
+ case "file:":
441
+ const r = n.resolve(e.pathname);
442
+ return new Ie(r);
443
+ case "s3:":
444
+ const o = {}, s = e.searchParams.get("region");
445
+ s && (o.region = s);
446
+ const a = e.hostname;
447
+ return new We(new ve(o), a, e.pathname.replace(/^\//, ""));
448
+ default:
449
+ throw new Error(`Unknown protocol: ${e.protocol}`);
450
+ }
451
+ }
452
+ function d(t, e) {
453
+ return e === void 0 ? t : {
454
+ ...t,
455
+ ...e,
456
+ registries: { ...t.registries, ...e.registries },
457
+ files: { ...t.files, ...e.files }
458
+ };
459
+ }
460
+ async function b(t) {
461
+ return D(t, (e) => M.parse(JSON.parse(e.toString())));
462
+ }
463
+ async function B(t) {
464
+ return D(t, (e) => M.parse(me.parse(e.toString())));
465
+ }
466
+ async function Ke() {
467
+ let t = M.parse({});
468
+ return t = d(t, await b("./.pl.reg.json")), t = d(t, await B("./.pl.reg.yaml")), t = d(t, await b(`${W.homedir()}/.pl.reg.json`)), t = d(t, await B(`${W.homedir()}/.pl.reg.yaml`)), t = d(t, await b(Ae)), t = d(t, await B(Te)), t;
469
+ }
470
+ class qe {
471
+ constructor(e) {
472
+ this.conf = e;
473
+ }
474
+ createRegistry(e) {
475
+ let r = this.conf.registry;
476
+ if (!r.startsWith("file:") && !r.startsWith("s3:")) {
477
+ const o = this.conf.registries[r];
478
+ if (!o) throw new Error(`Registry with alias "${r}" not found`);
479
+ r = o;
480
+ }
481
+ return new Le(Ge(r), e);
482
+ }
483
+ get fullPackageName() {
484
+ return {
485
+ organization: this.conf.organization,
486
+ package: this.conf.package,
487
+ version: this.conf.version
488
+ };
489
+ }
490
+ }
491
+ async function pt(t) {
492
+ const e = await Ke();
493
+ return new qe(
494
+ oe.parse(d(e, t))
495
+ );
496
+ }
497
+ export {
498
+ C as A,
499
+ nt as B,
500
+ Be as C,
501
+ G as D,
502
+ S as E,
503
+ re as F,
504
+ $ as G,
505
+ lt as H,
506
+ ae as M,
507
+ M as P,
508
+ ee as R,
509
+ Ee as a,
510
+ gt as b,
511
+ ct as c,
512
+ Je as d,
513
+ Ae as e,
514
+ Te as f,
515
+ pt as g,
516
+ xe as h,
517
+ oe as i,
518
+ qe as j,
519
+ K as k,
520
+ De as l,
521
+ se as m,
522
+ Re as n,
523
+ te as o,
524
+ ft as p,
525
+ je as q,
526
+ Ne as r,
527
+ Ce as s,
528
+ Se as t,
529
+ it as u,
530
+ Pe as v,
531
+ Fe as w,
532
+ I as x,
533
+ $e as y,
534
+ be as z
535
+ };
536
+ //# sourceMappingURL=config-BJognM_j.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-BJognM_j.mjs","sources":["../src/v2/model/content_conversion.ts","../src/v2/model/block_components.ts","../src/v2/model/meta.ts","../src/v2/model/index.ts","../src/v2/build_dist.ts","../src/util.ts","../src/v2/source_package.ts","../src/common_types.ts","../src/registry_v1/config_schema.ts","../src/registry_v1/v1_repo_schema.ts","../src/registry_v1/registry.ts","../src/lib/storage.ts","../src/registry_v1/config.ts"],"sourcesContent":["import { z } from 'zod';\nimport path from 'path';\nimport fsp from 'node:fs/promises';\nimport * as mime from 'mime-types';\nimport * as tar from 'tar';\nimport {\n ContentAbsoluteBinaryLocal,\n ContentAbsoluteFile,\n ContentAbsoluteFolder,\n ContentAbsoluteTextLocal,\n ContentAbsoluteUrl,\n ContentAnyLocal,\n ContentExplicitBase64,\n ContentRelative\n} from '@milaboratories/pl-model-middle-layer';\n\ntype ContentCtxFs = {\n type: 'local';\n /** Folder relative to which content should be resolved */\n path: string;\n};\n\ntype ContentCtxUrl = {\n type: 'remote';\n /** URL prefix from which content should be resolved */\n url: string;\n};\n\n/** Describes a place relative to which any content references should be interpreted */\nexport type ContentCtx = ContentCtxFs | ContentCtxUrl;\n\nfunction tryResolve(root: string, request: string): string | undefined {\n try {\n return require.resolve(request, {\n paths: [root]\n });\n } catch (err: any) {\n if (err.code !== 'MODULE_NOT_FOUND') throw err;\n }\n return undefined;\n}\n\nfunction mustResolve(root: string, request: string): string {\n const res = tryResolve(root, request);\n if (res === undefined) throw new Error(`Can't resolve ${request} against ${root}`);\n return res;\n}\n\n/** Zod type that resolves node module request into absolute content */\nexport function ResolvedModuleFile(moduleRoot: string) {\n return z.string().transform<ContentAbsoluteFile>((request, ctx) => {\n const result = tryResolve(moduleRoot, request);\n if (result === undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Can't resolve ${request} against ${moduleRoot}`\n });\n return z.NEVER;\n }\n return {\n type: 'absolute-file',\n file: result\n };\n });\n}\n\n/**\n * Zod type that resolves node module request for folder into absolute folder,\n * given a list of expected index files in that folder\n * */\nexport function ResolvedModuleFolder(\n moduleRoot: string,\n ...indexFilesToLookFor: [string, ...string[]]\n) {\n return z.string().transform<ContentAbsoluteFolder>((request, ctx) => {\n const requestWithSlash = request.endsWith('/') ? request : `${request}/`;\n\n for (const idxFile of indexFilesToLookFor) {\n const result = tryResolve(moduleRoot, requestWithSlash + idxFile);\n if (result !== undefined) {\n if (!result.endsWith(idxFile))\n throw new Error(`Unexpected resolve result ${result} with index file ${idxFile}`);\n return {\n type: 'absolute-folder',\n folder: result.slice(0, result.length - idxFile.length)\n };\n }\n }\n\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Can't resolve ${request} folder against ${moduleRoot}, no index file found (${indexFilesToLookFor.join(', ')})`\n });\n return z.NEVER;\n });\n}\n\nexport function mapLocalToAbsolute(\n root: string\n): <T extends ContentAnyLocal>(value: T) => Exclude<T, ContentRelative> | ContentAbsoluteFile {\n return <T extends ContentAnyLocal>(value: T) =>\n value.type === 'relative'\n ? { type: 'absolute-file', file: path.resolve(root, value.path) }\n : (value as Exclude<T, ContentRelative>);\n}\n\nexport function absoluteToString(): (value: ContentAbsoluteTextLocal) => Promise<string> {\n return async (value) => {\n if (value.type === 'absolute-file')\n return await fsp.readFile(value.file, { encoding: 'utf-8' });\n else return value.content;\n };\n}\n\n// TODO add type and size limitations\nexport function absoluteToBase64(): (\n value: ContentAbsoluteBinaryLocal\n) => Promise<ContentExplicitBase64> {\n return async (value) => {\n if (value.type === 'absolute-file') {\n const mimeType = mime.lookup(value.file);\n if (!mimeType) throw new Error(`Can't recognize mime type of the file: ${value.file}.`);\n return {\n type: 'explicit-base64',\n mimeType,\n content: await fsp.readFile(value.file, { encoding: 'base64' })\n };\n } else return value;\n };\n}\n\nexport function cpAbsoluteToRelative(\n dstFolder: string,\n fileAccumulator?: string[]\n): <T extends Exclude<ContentAnyLocal, ContentRelative>>(\n value: T\n) => Promise<Exclude<T, ContentAbsoluteFile> | ContentRelative> {\n return async <T extends Exclude<ContentAnyLocal, ContentRelative>>(value: T) => {\n if (value.type === 'absolute-file') {\n const fileName = path.basename(value.file);\n const dst = path.resolve(dstFolder, fileName);\n fileAccumulator?.push(fileName);\n await fsp.cp(value.file, dst);\n return { type: 'relative', path: fileName };\n } else return value as Exclude<T, ContentAbsoluteFile>;\n };\n}\n\nexport function packFolderToRelativeTgz(\n dstFolder: string,\n tgzName: string,\n fileAccumulator?: string[]\n): (value: ContentAbsoluteFolder) => Promise<ContentRelative> {\n if (!tgzName.endsWith('.tgz')) throw new Error(`Unexpected tgz file name: ${tgzName}`);\n return async (value: ContentAbsoluteFolder) => {\n const dst = path.resolve(dstFolder, tgzName);\n await tar.create(\n {\n gzip: true,\n file: dst,\n cwd: value.folder\n },\n [value.folder]\n );\n fileAccumulator?.push(tgzName);\n return { type: 'relative', path: tgzName };\n };\n}\n\nexport function mapRemoteToAbsolute(\n rootUrl: string\n): <T extends ContentAnyLocal>(value: T) => Exclude<T, ContentRelative> | ContentAbsoluteUrl {\n const rootWithSlash = rootUrl.endsWith('/') ? rootUrl : `${rootUrl}/`;\n return <T extends ContentAnyLocal>(value: T) =>\n value.type === 'relative'\n ? { type: 'absolute-url', url: rootWithSlash + value.path }\n : (value as Exclude<T, ContentRelative>);\n}\n","import { z } from 'zod';\nimport {\n ResolvedModuleFile,\n ResolvedModuleFolder,\n packFolderToRelativeTgz,\n cpAbsoluteToRelative,\n mapRemoteToAbsolute,\n} from './content_conversion';\nimport { BlockComponents, BlockComponentsManifest, ContentAbsoluteBinaryLocal, ContentAbsoluteFolder, ContentRelativeBinary } from '@milaboratories/pl-model-middle-layer';\n\nexport function BlockComponentsDescription(moduleRoot: string) {\n return BlockComponents(\n ResolvedModuleFile(moduleRoot),\n ResolvedModuleFolder(moduleRoot, 'index.html')\n );\n}\nexport type BlockComponentsDescription = z.infer<ReturnType<typeof BlockComponentsDescription>>;\n\nexport function BlockComponentsConsolidate(dstFolder: string, fileAccumulator?: string[]) {\n return BlockComponents(\n ContentAbsoluteBinaryLocal.transform(cpAbsoluteToRelative(dstFolder, fileAccumulator)),\n ContentAbsoluteFolder.transform(packFolderToRelativeTgz(dstFolder, 'ui.tgz', fileAccumulator))\n ).pipe(BlockComponentsManifest);\n}\n\nexport function BlockComponentsAbsoluteUrl(prefix: string) {\n return BlockComponents(\n ContentRelativeBinary.transform(mapRemoteToAbsolute(prefix)),\n ContentRelativeBinary.transform(mapRemoteToAbsolute(prefix))\n );\n}\nexport type BlockComponentsAbsolute = z.infer<ReturnType<typeof BlockComponentsAbsoluteUrl>>;\n","import {\n BlockPackMeta,\n ContentAbsoluteBinaryLocal,\n ContentAbsoluteTextLocal,\n DescriptionContentBinary,\n DescriptionContentText\n} from '@milaboratories/pl-model-middle-layer';\nimport {\n absoluteToBase64,\n absoluteToString,\n cpAbsoluteToRelative,\n mapLocalToAbsolute\n} from './content_conversion';\nimport { z } from 'zod';\nimport { BlockPackMetaEmbeddedContent } from '@milaboratories/pl-model-middle-layer';\n\nexport function BlockPackMetaDescription(root: string) {\n return BlockPackMeta(\n DescriptionContentText.transform(mapLocalToAbsolute(root)),\n DescriptionContentBinary.transform(mapLocalToAbsolute(root))\n );\n}\nexport type BlockPackMetaDescription = z.infer<ReturnType<typeof BlockPackMetaDescription>>;\n\nexport function BlockPackMetaConsolidate(dstFolder: string, fileAccumulator?: string[]) {\n return BlockPackMeta(\n ContentAbsoluteTextLocal.transform(cpAbsoluteToRelative(dstFolder, fileAccumulator)),\n ContentAbsoluteBinaryLocal.transform(cpAbsoluteToRelative(dstFolder, fileAccumulator))\n );\n}\n\nexport const BlockPackMetaEmbed = BlockPackMeta(\n ContentAbsoluteTextLocal.transform(absoluteToString()),\n ContentAbsoluteBinaryLocal.transform(absoluteToBase64())\n).pipe(BlockPackMetaEmbeddedContent);\nexport type BlockPackMetaEmbed = z.infer<typeof BlockPackMetaEmbed>;\n","import { z } from 'zod';\nimport { BlockComponentsConsolidate, BlockComponentsDescription } from './block_components';\nimport {\n BlockComponentsManifest,\n BlockPackMetaManifest,\n CreateBlockPackDescriptionSchema\n} from '@milaboratories/pl-model-middle-layer';\nimport { BlockPackMetaConsolidate, BlockPackMetaDescription } from './meta';\n\nexport * from './block_components';\nexport * from './content_conversion';\n\nexport function ResolvedBlockPackDescriptionFromPackageJson(root: string) {\n return CreateBlockPackDescriptionSchema(\n BlockComponentsDescription(root),\n BlockPackMetaDescription(root)\n );\n}\nexport type BlockPackDescriptionAbsolute = z.infer<\n ReturnType<typeof ResolvedBlockPackDescriptionFromPackageJson>\n>;\n\nexport function BlockPackDescriptionConsolidateToFolder(\n dstFolder: string,\n fileAccumulator?: string[]\n) {\n return CreateBlockPackDescriptionSchema(\n BlockComponentsConsolidate(dstFolder, fileAccumulator),\n //BlockPackMetaToExplicit\n BlockPackMetaConsolidate(dstFolder, fileAccumulator)\n ).pipe(BlockPackDescriptionManifest);\n}\n\nexport const BlockPackDescriptionManifest = CreateBlockPackDescriptionSchema(\n BlockComponentsManifest,\n BlockPackMetaManifest\n);\nexport type BlockPackDescriptionManifest = z.infer<typeof BlockPackDescriptionManifest>;\n\nexport const BlockPackManifest = BlockPackDescriptionManifest.extend({\n schema: z.literal('v1'),\n files: z.array(z.string())\n});\nexport type BlockPackManifest = z.infer<typeof BlockPackManifest>;\n\nexport const BlockPackManifestFile = 'manifest.json';\n","import {\n BlockPackDescriptionAbsolute,\n BlockPackDescriptionConsolidateToFolder,\n BlockPackDescriptionManifest,\n BlockPackManifest,\n BlockPackManifestFile\n} from './model';\nimport fsp from 'node:fs/promises';\nimport { BlockPackMetaConsolidate, BlockPackMetaDescription } from './model/meta';\nimport { patch } from 'semver';\nimport path from 'node:path';\n\nexport async function buildBlockPackDist(\n description: BlockPackDescriptionAbsolute,\n dst: string\n): Promise<BlockPackManifest> {\n await fsp.mkdir(dst, { recursive: true });\n const files: string[] = [];\n const descriptionRelative = await BlockPackDescriptionConsolidateToFolder(dst, files).parseAsync(\n description\n );\n const manifest: BlockPackManifest = BlockPackManifest.parse({\n schema: 'v1',\n ...descriptionRelative,\n files\n });\n await fsp.writeFile(path.resolve(dst, BlockPackManifestFile), JSON.stringify(manifest));\n return manifest;\n}\n","import { BigIntStats } from 'node:fs';\nimport fsp from 'node:fs/promises';\n\nexport async function tryLoadFile<T>(\n file: string,\n map: (buf: Buffer) => T\n): Promise<T | undefined> {\n try {\n return map(await fsp.readFile(file));\n } catch (err: any) {\n if (err.code == 'ENOENT') return undefined;\n else throw new Error('', { cause: err });\n }\n}\n\nexport async function tryStat(path: string): Promise<BigIntStats | undefined> {\n try {\n return await fsp.stat(path, { bigint: true });\n } catch (error: any) {\n if (error.code === 'ENOENT') {\n return undefined;\n }\n throw error;\n }\n}\n","import path from 'path';\nimport { tryLoadFile } from '../util';\nimport { ResolvedBlockPackDescriptionFromPackageJson, BlockPackDescriptionAbsolute } from './model';\nimport { notEmpty } from '@milaboratories/ts-helpers';\nimport fsp from 'node:fs/promises';\nimport {\n BlockPackDescriptionFromPackageJsonRaw,\n BlockPackDescriptionRaw,\n BlockPackId,\n BlockPackMetaDescriptionRaw,\n SemVer\n} from '@milaboratories/pl-model-middle-layer';\n\nexport const BlockDescriptionPackageJsonField = 'block';\n\nconst ConventionPackageNamePattern =\n /(?:@[a-zA-Z0-9-.]+\\/)?(?<organization>[a-zA-Z0-9-]+)\\.(?<name>[a-zA-Z0-9-]+)/;\n\nexport function parsePackageName(packageName: string): Pick<BlockPackId, 'organization' | 'name'> {\n const match = packageName.match(ConventionPackageNamePattern);\n if (!match)\n throw new Error(\n `Malformed package name (${packageName}), can't infer organization and block pack name.`\n );\n const { name, organization } = match.groups!;\n return { name, organization };\n}\n\nexport async function tryLoadPackDescription(\n moduleRoot: string\n): Promise<BlockPackDescriptionAbsolute | undefined> {\n const fullPackageJsonPath = path.resolve(moduleRoot, 'package.json');\n try {\n const packageJson = await tryLoadFile(fullPackageJsonPath, (buf) =>\n JSON.parse(buf.toString('utf-8'))\n );\n if (packageJson === undefined) return undefined;\n const descriptionNotParsed = packageJson[BlockDescriptionPackageJsonField];\n if (descriptionNotParsed === undefined) return undefined;\n const descriptionRaw = {\n ...BlockPackDescriptionFromPackageJsonRaw.parse(descriptionNotParsed),\n id: {\n ...parsePackageName(\n notEmpty(packageJson['name'], `\"name\" not found in ${fullPackageJsonPath}`)\n ),\n version: SemVer.parse(packageJson['version'])\n }\n };\n const descriptionParsingResult =\n await ResolvedBlockPackDescriptionFromPackageJson(moduleRoot).safeParseAsync(descriptionRaw);\n if (descriptionParsingResult.success) return descriptionParsingResult.data;\n return undefined;\n } catch (e: any) {\n return undefined;\n }\n}\n\nexport async function loadPackDescriptionRaw(moduleRoot: string): Promise<BlockPackDescriptionRaw> {\n const fullPackageJsonPath = path.resolve(moduleRoot, 'package.json');\n const packageJson = JSON.parse(await fsp.readFile(fullPackageJsonPath, { encoding: 'utf-8' }));\n const descriptionNotParsed = packageJson[BlockDescriptionPackageJsonField];\n if (descriptionNotParsed === undefined)\n throw new Error(\n `Block description (field ${BlockDescriptionPackageJsonField}) not found in ${fullPackageJsonPath}.`\n );\n return {\n ...BlockPackDescriptionFromPackageJsonRaw.parse(descriptionNotParsed),\n id: {\n ...parsePackageName(\n notEmpty(packageJson['name'], `\"name\" not found in ${fullPackageJsonPath}`)\n ),\n version: SemVer.parse(packageJson['version'])\n }\n };\n}\n\nexport async function loadPackDescription(\n moduleRoot: string\n): Promise<BlockPackDescriptionAbsolute> {\n const descriptionRaw = await loadPackDescriptionRaw(moduleRoot);\n return await ResolvedBlockPackDescriptionFromPackageJson(moduleRoot).parseAsync(descriptionRaw);\n}\n","import { z } from 'zod';\n\nexport const PlRegAddress = z.string().regex(/^(?:s3:|file:)/);\n","import { z } from 'zod';\nimport { PlRegAddress } from '../common_types';\nimport { SemVer } from '@milaboratories/pl-model-middle-layer';\n\nexport const PlPackageConfigData = z.object({\n organization: z.string(),\n package: z.string(),\n version: SemVer.optional(),\n files: z.record(z.string().regex(/^[^\\/]+$/), z.string()).default({}),\n meta: z.object({}).passthrough()\n});\n\nexport const PlRegCommonConfigData = z.object({\n registries: z.record(z.string(), PlRegAddress).default({}),\n registry: z.string().optional()\n});\nexport type PlRegCommonConfigData = z.infer<typeof PlRegCommonConfigData>;\n\nexport const PlRegFullPackageConfigData = PlRegCommonConfigData.merge(PlPackageConfigData).required(\n { registry: true, version: true }\n);\nexport type PlRegFullPackageConfigData = z.infer<typeof PlRegFullPackageConfigData>;\nexport const PlRegPackageConfigDataShard = PlRegFullPackageConfigData.partial().required({\n registries: true,\n files: true\n});\nexport type PlRegPackageConfigDataShard = z.infer<typeof PlRegPackageConfigDataShard>;\n\nexport const PlPackageJsonConfigFile = 'pl.package.json';\nexport const PlPackageYamlConfigFile = 'pl.package.yaml';\n","export interface FullBlockPackageName {\n organization: string;\n package: string;\n version: string;\n}\n\nconst MainPrefix = 'v1/';\n\nexport function packageContentPrefix(bp: FullBlockPackageName): string {\n return `${MainPrefix}${bp.organization}/${bp.package}/${bp.version}`;\n}\n\nexport function payloadFilePath(bp: FullBlockPackageName, file: string): string {\n return `${MainPrefix}${bp.organization}/${bp.package}/${bp.version}/${file}`;\n}\n\nexport type BlockPackageNameWithoutVersion = Pick<FullBlockPackageName, 'organization' | 'package'>;\n\nexport function packageOverviewPath(bp: BlockPackageNameWithoutVersion): string {\n return `${MainPrefix}${bp.organization}/${bp.package}/overview.json`;\n}\n\nexport const GlobalOverviewPath = `${MainPrefix}overview.json`;\n\nexport const MetaFile = 'meta.json';\n\nexport interface PackageOverviewEntry {\n version: string;\n meta: object;\n}\n\nexport type PackageOverview = PackageOverviewEntry[];\n\nexport interface GlobalOverviewEntry {\n organization: string;\n package: string;\n allVersions: string[];\n latestVersion: string;\n latestMeta: object;\n}\n\nexport type GlobalOverview = GlobalOverviewEntry[];\n","import { RegistryStorage } from '../lib/storage';\nimport { randomUUID } from 'node:crypto';\nimport semver from 'semver/preload';\nimport {\n BlockPackageNameWithoutVersion,\n FullBlockPackageName,\n GlobalOverview,\n GlobalOverviewPath,\n MetaFile,\n PackageOverview,\n packageOverviewPath,\n payloadFilePath\n} from './v1_repo_schema';\nimport { MiLogger } from '@milaboratories/ts-helpers';\n\nfunction fullNameToPath(name: FullBlockPackageName): string {\n return `${name.organization}/${name.package}/${name.version}`;\n}\n\nconst VersionUpdatesPrefix = '_updates_v1/per_package_version/';\n\nfunction packageUpdatePath(bp: FullBlockPackageName, seed: string): string {\n return `${VersionUpdatesPrefix}${bp.organization}/${bp.package}/${bp.version}/${seed}`;\n}\n\nconst PackageUpdatePattern =\n /(?<packageKeyWithoutVersion>(?<organization>[^\\/]+)\\/(?<pkg>[^\\/]+))\\/(?<version>[^\\/]+)\\/(?<seed>[^\\/]+)$/;\n\nconst GlobalUpdateSeedInFile = '_updates_v1/_global_update_in';\nconst GlobalUpdateSeedOutFile = '_updates_v1/_global_update_out';\n\n/*\n Note on convergence guarantee.\n\n Here is what S3 guarantees:\n\n Amazon S3 delivers strong read-after-write consistency automatically,\n without changes to performance or availability, without sacrificing\n regional isolation for applications, and at no additional cost.\n\n After a successful write of a new object or an overwrite of an existing\n object, any subsequent read request immediately receives the latest\n version of the object. S3 also provides strong consistency for list\n operations, so after a write, you can immediately perform a listing\n of the objects in a bucket with any changes reflected.\n\n https://aws.amazon.com/s3/faqs/#What_data_consistency_model_does_Amazon_S3_employ\n\n The following registry update schema with _update_seed / _updated_seed\n seems to guarantee eventual convergence of registry state, though I don't\n have enough time to really think it through, beware.\n\n */\n\n/**\n * Layout:\n *\n * _updates_v1/per_package/\n * organisationA/package1/1.2.3/seedABC <-- Tells that change happened for organisationA/package1 version 1.2.3, and reassembly of package1 overview is required\n * organisationA/package1/1.2.3/seedCDE\n * organisationB/package2/1.4.3/seedFGH\n *\n * _updates_v1/_global_update_in <-- Anybody who changes contents writes a random seed in this file\n * _updates_v1/_global_update_out <-- Update process writes update seed from the _global_update_in here after successful update.\n * Mismatch between contents of those files is a sign that another update should be performed.\n *\n * v1/ <-- Actual block packages content\n * organisationA/package2/1.2.3/meta.json\n * organisationA/package2/1.2.3/main.template.plj.gz\n * organisationA/package2/1.2.3/...\n * organisationA/package2/overview.json <-- Per-package aggregated meta-data over all available versions\n * ...\n *\n * v1/overview.json <-- aggregated information about all packages\n *\n */\nexport class BlockRegistry {\n constructor(\n private readonly storage: RegistryStorage,\n private readonly logger?: MiLogger\n ) {}\n\n constructNewPackage(pack: FullBlockPackageName): BlockRegistryPackConstructor {\n return new BlockRegistryPackConstructor(this.storage, pack);\n }\n\n private async updateRegistry() {\n this.logger?.info('Initiating registry refresh...');\n\n // reading update requests\n const packagesToUpdate = new Map<string, PackageUpdateInfo>();\n const seedPaths: string[] = [];\n const rawSeedPaths = await this.storage.listFiles(VersionUpdatesPrefix);\n this.logger?.info('Packages to be updated:');\n for (const seedPath of rawSeedPaths) {\n const match = seedPath.match(PackageUpdatePattern);\n if (!match) continue;\n seedPaths.push(seedPath);\n const { packageKeyWithoutVersion, organization, pkg, version, seed } = match.groups!;\n\n let update = packagesToUpdate.get(packageKeyWithoutVersion);\n let added = false;\n if (!update) {\n packagesToUpdate.set(packageKeyWithoutVersion, {\n package: { organization, package: pkg },\n versions: new Set([version])\n });\n added = true;\n } else if (!update.versions.has(version)) {\n update.versions.add(version);\n added = true;\n }\n this.logger?.info(` - ${organization}:${pkg}:${version}`);\n }\n\n // loading global overview\n const overviewContent = await this.storage.getFile(GlobalOverviewPath);\n let overview =\n overviewContent === undefined\n ? []\n : (JSON.parse(overviewContent.toString()) as GlobalOverview);\n this.logger?.info(`Global overview loaded, ${overview.length} records`);\n\n // updating packages\n for (const [, packageInfo] of packagesToUpdate.entries()) {\n // reading existing overview\n const overviewFile = packageOverviewPath(packageInfo.package);\n const pOverviewContent = await this.storage.getFile(overviewFile);\n let packageOverview =\n pOverviewContent === undefined\n ? []\n : (JSON.parse(pOverviewContent.toString()) as PackageOverview);\n this.logger?.info(\n `Updating ${packageInfo.package.organization}:${packageInfo.package.package} overview, ${packageOverview.length} records`\n );\n\n // removing versions that we will update\n packageOverview = packageOverview.filter((e) => !packageInfo.versions.has(e.version));\n\n // reading new entries\n for (const [v] of packageInfo.versions.entries()) {\n const version = v.toString();\n const metaContent = await this.storage.getFile(\n payloadFilePath(\n {\n ...packageInfo.package,\n version\n },\n MetaFile\n )\n );\n if (!metaContent) continue;\n packageOverview.push({ version, meta: JSON.parse(metaContent.toString()) });\n }\n\n // sorting entries according to version\n packageOverview.sort((e1, e2) => semver.compare(e2.version, e1.version));\n\n // write package overview back\n await this.storage.putFile(overviewFile, Buffer.from(JSON.stringify(packageOverview)));\n this.logger?.info(`Done (${packageOverview.length} records)`);\n\n // patching corresponding entry in overview\n overview = overview.filter(\n (e) =>\n e.organization !== packageInfo.package.organization ||\n e.package !== packageInfo.package.package\n );\n overview.push({\n organization: packageInfo.package.organization,\n package: packageInfo.package.package,\n allVersions: packageOverview.map((e) => e.version).reverse(),\n latestVersion: packageOverview[0].version,\n latestMeta: packageOverview[0].meta\n });\n }\n\n // writing global overview\n await this.storage.putFile(GlobalOverviewPath, Buffer.from(JSON.stringify(overview)));\n this.logger?.info(`Global overview updated (${overview.length} records)`);\n\n // deleting seeds\n await this.storage.deleteFiles(...seedPaths.map((sp) => `${VersionUpdatesPrefix}${sp}`));\n this.logger?.info(`Version update requests cleared`);\n }\n\n async updateIfNeeded(force: boolean = false): Promise<void> {\n // implementation of main convergence algorithm\n\n this.logger?.info(`Checking if registry requires refresh...`);\n const updateRequestSeed = await this.storage.getFile(GlobalUpdateSeedInFile);\n const currentUpdatedSeed = await this.storage.getFile(GlobalUpdateSeedOutFile);\n if (!force && updateRequestSeed === undefined && currentUpdatedSeed === undefined) return;\n if (\n !force &&\n updateRequestSeed !== undefined &&\n currentUpdatedSeed !== undefined &&\n updateRequestSeed.equals(currentUpdatedSeed)\n )\n return;\n\n await this.updateRegistry();\n\n if (updateRequestSeed) {\n await this.storage.putFile(GlobalUpdateSeedOutFile, updateRequestSeed);\n this.logger?.info(`Refresh finished`);\n }\n }\n\n async getPackageOverview(\n name: BlockPackageNameWithoutVersion\n ): Promise<undefined | PackageOverview> {\n const content = await this.storage.getFile(packageOverviewPath(name));\n if (content === undefined) return undefined;\n return JSON.parse(content.toString()) as PackageOverview;\n }\n\n async getGlobalOverview(): Promise<undefined | GlobalOverview> {\n const content = await this.storage.getFile(GlobalOverviewPath);\n if (content === undefined) return undefined;\n return JSON.parse(content.toString()) as GlobalOverview;\n }\n}\n\nexport class BlockRegistryPackConstructor {\n private metaAdded: boolean = false;\n public readonly seed = randomUUID();\n\n constructor(\n private readonly storage: RegistryStorage,\n public readonly name: FullBlockPackageName\n ) {}\n\n async addFile(file: string, content: Buffer): Promise<void> {\n await this.storage.putFile(payloadFilePath(this.name, file), content);\n }\n\n async writeMeta(meta: object) {\n await this.addFile(MetaFile, Buffer.from(JSON.stringify(meta)));\n this.metaAdded = true;\n }\n\n async finish() {\n if (!this.metaAdded) throw new Error('meta not added');\n await this.storage.putFile(packageUpdatePath(this.name, this.seed), Buffer.of(0));\n await this.storage.putFile(GlobalUpdateSeedInFile, Buffer.from(this.seed));\n }\n}\n\ninterface PackageUpdateInfo {\n package: BlockPackageNameWithoutVersion;\n versions: Set<String>;\n}\n","import pathPosix from 'node:path/posix';\nimport path from 'node:path';\nimport { paginateListObjectsV2, S3 } from '@aws-sdk/client-s3';\nimport * as fs from 'node:fs';\n\nexport interface RegistryStorage {\n putFile(file: string, buffer: Buffer): Promise<void>;\n\n getFile(file: string): Promise<Buffer | undefined>;\n\n listFiles(prefix: string): Promise<string[]>;\n\n deleteFiles(...files: string[]): Promise<void>;\n}\n\nexport class S3Storage implements RegistryStorage {\n constructor(\n public readonly client: S3,\n public readonly bucket: string,\n public readonly root: string\n ) {}\n\n async getFile(file: string): Promise<Buffer | undefined> {\n try {\n return Buffer.from(\n await (\n await this.client.getObject({\n Bucket: this.bucket,\n Key: pathPosix.join(this.root, file)\n })\n ).Body!.transformToByteArray()\n );\n } catch (e: any) {\n if (e.name === 'NoSuchKey') return undefined;\n else throw e;\n }\n }\n\n async listFiles(prefix: string): Promise<string[]> {\n const listRoot = pathPosix.join(this.root, prefix);\n const paginator = paginateListObjectsV2(\n { client: this.client },\n {\n Bucket: this.bucket,\n Prefix: listRoot\n }\n );\n const result: string[] = [];\n for await (const page of paginator)\n result.push(...page.Contents!.map((e) => pathPosix.relative(listRoot, e.Key!)));\n return result;\n }\n\n async putFile(file: string, buffer: Buffer): Promise<void> {\n await this.client.putObject({\n Bucket: this.bucket,\n Key: pathPosix.join(this.root, file),\n Body: buffer\n });\n }\n\n async deleteFiles(...files: string[]): Promise<void> {\n // TODO implement support of more than 1000 files\n const results = await this.client.deleteObjects({\n Bucket: this.bucket,\n Delete: {\n Objects: files.map((file) => ({\n Key: pathPosix.join(this.root, file)\n }))\n }\n });\n if (results.Errors !== undefined && results.Errors.length > 0)\n throw new Error(`Errors encountered while deleting files: ${results.Errors.join('\\n')}`);\n }\n}\n\nexport class FSStorage implements RegistryStorage {\n /** Absolute path */\n public readonly root: string;\n\n constructor(_root: string) {\n this.root = path.resolve(_root);\n }\n\n private toAbsolutePath(localPath: string): string {\n if (pathPosix.isAbsolute(localPath)) throw new Error('absolute path');\n return path.resolve(this.root, localPath.split(pathPosix.sep).join(path.sep));\n }\n\n async getFile(address: string): Promise<Buffer | undefined> {\n try {\n return await fs.promises.readFile(this.toAbsolutePath(address));\n } catch (err: any) {\n if (err.code == 'ENOENT') return undefined;\n else throw new Error('', { cause: err });\n }\n }\n\n async listFiles(prefix: string): Promise<string[]> {\n try {\n const listRoot = this.toAbsolutePath(prefix);\n return (await fs.promises.readdir(listRoot, { recursive: true, withFileTypes: true }))\n .filter((e) => e.isFile())\n .map((e) =>\n path.relative(listRoot, path.resolve(e.path, e.name)).split(path.sep).join(pathPosix.sep)\n );\n } catch (err: any) {\n if (err.code == 'ENOENT') return [];\n else throw new Error('', { cause: err });\n }\n }\n\n async putFile(address: string, buffer: Buffer): Promise<void> {\n const absoluteAddress = this.toAbsolutePath(address);\n await fs.promises.mkdir(path.dirname(absoluteAddress), { recursive: true });\n await fs.promises.writeFile(absoluteAddress, buffer);\n }\n\n async deleteFiles(...files: string[]): Promise<void> {\n // Folders are not removed, deletes issued sequentially\n for (const file of files) await fs.promises.rm(this.toAbsolutePath(file));\n }\n}\n\nexport function storageByUrl(address: string): RegistryStorage {\n const url = new URL(address, `file:${path.resolve('.').split(path.sep).join(pathPosix.sep)}/`);\n switch (url.protocol) {\n case 'file:':\n const root = path.resolve(url.pathname);\n return new FSStorage(root);\n case 's3:':\n const options: NonNullable<ConstructorParameters<typeof S3>[0]> = {};\n const region = url.searchParams.get('region');\n if (region) options.region = region;\n const bucket = url.hostname;\n return new S3Storage(new S3(options), bucket, url.pathname.replace(/^\\//, ''));\n default:\n throw new Error(`Unknown protocol: ${url.protocol}`);\n }\n}\n","import YAML from 'yaml';\nimport { tryLoadFile } from '../util';\nimport {\n PlPackageJsonConfigFile,\n PlPackageYamlConfigFile,\n PlRegFullPackageConfigData,\n PlRegPackageConfigDataShard\n} from './config_schema';\nimport * as os from 'node:os';\nimport { BlockRegistry } from './registry';\nimport { storageByUrl } from '../lib/storage';\nimport { FullBlockPackageName } from './v1_repo_schema';\nimport { MiLogger } from '@milaboratories/ts-helpers';\n\nfunction mergeConfigs(\n c1: PlRegPackageConfigDataShard,\n c2: PlRegPackageConfigDataShard | undefined\n): PlRegPackageConfigDataShard {\n if (c2 === undefined) return c1;\n return {\n ...c1,\n ...c2,\n registries: { ...c1.registries, ...c2.registries },\n files: { ...c1.files, ...c2.files }\n };\n}\n\nasync function tryLoadJsonConfigFromFile(\n file: string\n): Promise<PlRegPackageConfigDataShard | undefined> {\n return tryLoadFile(file, (buf) => PlRegPackageConfigDataShard.parse(JSON.parse(buf.toString())));\n}\n\nasync function tryLoadYamlConfigFromFile(\n file: string\n): Promise<PlRegPackageConfigDataShard | undefined> {\n return tryLoadFile(file, (buf) => PlRegPackageConfigDataShard.parse(YAML.parse(buf.toString())));\n}\n\nasync function loadConfigShard(): Promise<PlRegPackageConfigDataShard> {\n let conf = PlRegPackageConfigDataShard.parse({});\n\n conf = mergeConfigs(conf, await tryLoadJsonConfigFromFile('./.pl.reg.json'));\n conf = mergeConfigs(conf, await tryLoadYamlConfigFromFile('./.pl.reg.yaml'));\n conf = mergeConfigs(conf, await tryLoadJsonConfigFromFile(`${os.homedir()}/.pl.reg.json`));\n conf = mergeConfigs(conf, await tryLoadYamlConfigFromFile(`${os.homedir()}/.pl.reg.yaml`));\n conf = mergeConfigs(conf, await tryLoadJsonConfigFromFile(PlPackageJsonConfigFile));\n conf = mergeConfigs(conf, await tryLoadYamlConfigFromFile(PlPackageYamlConfigFile));\n\n return conf;\n}\n\nlet conf: PlRegPackageConfigDataShard | undefined = undefined;\nlet confPromise: Promise<PlRegPackageConfigDataShard> | undefined = undefined;\n\nasync function getConfigShard() {\n if (conf !== undefined) return conf;\n if (confPromise !== undefined) return await confPromise;\n confPromise = loadConfigShard();\n return await confPromise;\n}\n\nexport class PlRegPackageConfig {\n constructor(public readonly conf: PlRegFullPackageConfigData) {}\n\n createRegistry(logger?: MiLogger): BlockRegistry {\n let address = this.conf.registry;\n if (!address.startsWith('file:') && !address.startsWith('s3:')) {\n const regByAlias = this.conf.registries[address];\n if (!regByAlias) throw new Error(`Registry with alias \"${address}\" not found`);\n address = regByAlias;\n }\n return new BlockRegistry(storageByUrl(address), logger);\n }\n\n get fullPackageName(): FullBlockPackageName {\n return {\n organization: this.conf.organization,\n package: this.conf.package,\n version: this.conf.version\n };\n }\n}\n\nexport async function getConfig(finalShard: PlRegPackageConfigDataShard) {\n const confShard = await loadConfigShard();\n return new PlRegPackageConfig(\n PlRegFullPackageConfigData.parse(mergeConfigs(confShard, finalShard))\n );\n}\n"],"names":["tryResolve","root","request","err","ResolvedModuleFile","moduleRoot","z","ctx","result","ResolvedModuleFolder","indexFilesToLookFor","requestWithSlash","idxFile","mapLocalToAbsolute","value","path","absoluteToString","fsp","absoluteToBase64","mimeType","mime","cpAbsoluteToRelative","dstFolder","fileAccumulator","fileName","dst","packFolderToRelativeTgz","tgzName","tar","mapRemoteToAbsolute","rootUrl","rootWithSlash","BlockComponentsDescription","BlockComponents","BlockComponentsConsolidate","ContentAbsoluteBinaryLocal","ContentAbsoluteFolder","BlockComponentsManifest","BlockComponentsAbsoluteUrl","prefix","ContentRelativeBinary","BlockPackMetaDescription","BlockPackMeta","DescriptionContentText","DescriptionContentBinary","BlockPackMetaConsolidate","ContentAbsoluteTextLocal","BlockPackMetaEmbed","BlockPackMetaEmbeddedContent","ResolvedBlockPackDescriptionFromPackageJson","CreateBlockPackDescriptionSchema","BlockPackDescriptionConsolidateToFolder","BlockPackDescriptionManifest","BlockPackMetaManifest","BlockPackManifest","BlockPackManifestFile","buildBlockPackDist","description","files","descriptionRelative","manifest","tryLoadFile","file","map","BlockDescriptionPackageJsonField","ConventionPackageNamePattern","parsePackageName","packageName","match","name","organization","tryLoadPackDescription","fullPackageJsonPath","packageJson","buf","descriptionNotParsed","descriptionRaw","BlockPackDescriptionFromPackageJsonRaw","notEmpty","SemVer","descriptionParsingResult","loadPackDescriptionRaw","loadPackDescription","PlRegAddress","PlPackageConfigData","PlRegCommonConfigData","PlRegFullPackageConfigData","PlRegPackageConfigDataShard","PlPackageJsonConfigFile","PlPackageYamlConfigFile","MainPrefix","packageContentPrefix","bp","payloadFilePath","packageOverviewPath","GlobalOverviewPath","MetaFile","VersionUpdatesPrefix","packageUpdatePath","seed","PackageUpdatePattern","GlobalUpdateSeedInFile","GlobalUpdateSeedOutFile","BlockRegistry","storage","logger","pack","BlockRegistryPackConstructor","_a","packagesToUpdate","seedPaths","rawSeedPaths","_b","seedPath","packageKeyWithoutVersion","pkg","version","update","_c","overviewContent","overview","_d","packageInfo","overviewFile","pOverviewContent","packageOverview","_e","e","v","metaContent","e1","e2","semver","_f","_g","sp","_h","force","updateRequestSeed","currentUpdatedSeed","content","__publicField","randomUUID","meta","S3Storage","client","bucket","pathPosix","listRoot","paginator","paginateListObjectsV2","page","buffer","results","FSStorage","_root","localPath","address","fs","absoluteAddress","storageByUrl","url","options","region","S3","mergeConfigs","c1","c2","tryLoadJsonConfigFromFile","tryLoadYamlConfigFromFile","YAML","loadConfigShard","conf","os","PlRegPackageConfig","regByAlias","getConfig","finalShard","confShard"],"mappings":"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"}