@platforma-sdk/block-tools 2.5.3 → 2.5.4

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.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/v2/registry/registry_reader.ts","../src/io/folder_reader.ts"],"sourcesContent":["import {\n BlockPackId,\n BlockPackIdNoVersion,\n blockPackIdNoVersionEquals,\n BlockPackManifest,\n BlockPackMetaEmbeddedBytes,\n BlockPackMetaManifest,\n BlockPackOverview,\n SingleBlockPackOverview\n} from '@milaboratories/pl-model-middle-layer';\nimport { FolderReader } from '../../io';\nimport canonicalize from 'canonicalize';\nimport {\n GlobalOverviewFileName,\n GlobalOverviewReg,\n MainPrefix,\n ManifestFileName,\n ManifestSuffix,\n packageContentPrefixInsideV2\n} from './schema_public';\nimport { BlockComponentsAbsoluteUrl, BlockPackMetaEmbedBytes } from '../model';\nimport { LRUCache } from 'lru-cache';\nimport { calculateSha256 } from '../../util';\nimport { retry, Retry2TimesWithDelay } from '@milaboratories/ts-helpers';\n\nexport type BlockPackOverviewNoRegLabel = Omit<BlockPackOverview, 'registryId'>;\n\nexport type RegistryV2ReaderOps = {\n /** Number of milliseconds to cache retrieved block list for */\n cacheBlockListFor: number;\n /** Number of milliseconds to keep cached retrieved block list for, if new requests returns error */\n keepStaleBlockListFor: number;\n};\n\nconst DefaultRegistryV2ReaderOps: RegistryV2ReaderOps = {\n cacheBlockListFor: 45e3, // 45 seconds\n keepStaleBlockListFor: 300e3 // 5 minutes\n};\n\nexport class RegistryV2Reader {\n private readonly v2RootFolderReader: FolderReader;\n private readonly ops: RegistryV2ReaderOps;\n\n constructor(\n private readonly registryReader: FolderReader,\n ops?: Partial<RegistryV2ReaderOps>\n ) {\n this.v2RootFolderReader = registryReader.relativeReader(MainPrefix);\n this.ops = { ...DefaultRegistryV2ReaderOps, ...(ops ?? {}) };\n }\n\n /**\n * Embeds meta infromation relative to registry root.\n * Meta information that looks like:\n *\n * */\n private readonly embeddedGlobalMetaCache = new LRUCache<\n string,\n BlockPackMetaEmbeddedBytes,\n { meta: BlockPackMetaManifest; relativeTo?: BlockPackId }\n >({\n max: 500,\n fetchMethod: async (_key, _staleValue, options) =>\n await retry(async () => {\n const contentReader =\n options.context.relativeTo !== undefined\n ? this.v2RootFolderReader\n .relativeReader(packageContentPrefixInsideV2(options.context.relativeTo))\n .getContentReader()\n : this.v2RootFolderReader.getContentReader();\n return await BlockPackMetaEmbedBytes(contentReader).parseAsync(options.context.meta);\n }, Retry2TimesWithDelay)\n });\n\n private async embedMetaContent(\n id: BlockPackId,\n sha256: string,\n absolutePath: boolean,\n meta: BlockPackMetaManifest\n ): Promise<BlockPackMetaEmbeddedBytes> {\n return await this.embeddedGlobalMetaCache.forceFetch(\n canonicalize({ id, sha256, absolutePath })!,\n { context: { meta, relativeTo: absolutePath ? undefined : id } }\n );\n }\n\n private listCacheTimestamp: number = 0;\n private listCache: BlockPackOverviewNoRegLabel[] | undefined = undefined;\n\n public async listBlockPacks(): Promise<BlockPackOverviewNoRegLabel[]> {\n if (\n this.listCache !== undefined &&\n Date.now() - this.listCacheTimestamp <= this.ops.cacheBlockListFor\n )\n return this.listCache;\n try {\n return await retry(async () => {\n // const rootContentReader = this.v2RootFolderReader.getContentReader();\n const globalOverview = GlobalOverviewReg.parse(\n JSON.parse(\n Buffer.from(await this.v2RootFolderReader.readFile(GlobalOverviewFileName)).toString()\n )\n );\n\n const result = await Promise.all(\n globalOverview.packages.map(async (p) => {\n const byChannelEntries = await Promise.all(\n Object.entries(p.latestByChannel).map(async ([channel, data]) => [\n channel,\n {\n id: data.description.id,\n meta: await this.embedMetaContent(\n data.description.id,\n data.manifestSha256,\n true,\n data.description.meta\n ),\n spec: {\n type: 'from-registry-v2',\n id: data.description.id,\n registryUrl: this.registryReader.rootUrl.toString(),\n channel\n }\n }\n ])\n );\n return {\n id: p.id,\n latestByChannel: Object.fromEntries(byChannelEntries),\n allVersions: p.allVersionsWithChannels\n } satisfies BlockPackOverviewNoRegLabel;\n })\n );\n\n this.listCache = result;\n this.listCacheTimestamp = Date.now();\n\n return result;\n }, Retry2TimesWithDelay);\n } catch (e: unknown) {\n if (\n this.listCache !== undefined &&\n Date.now() - this.listCacheTimestamp <= this.ops.keepStaleBlockListFor\n )\n return this.listCache;\n throw e;\n }\n }\n\n public async getLatestOverview(\n id: BlockPackIdNoVersion,\n channel: string\n ): Promise<SingleBlockPackOverview | undefined> {\n return await retry(async () => {\n const overview = (await this.listBlockPacks()).find((e) =>\n blockPackIdNoVersionEquals(id, e.id)\n );\n if (overview === undefined) return undefined;\n return overview.latestByChannel[channel];\n }, Retry2TimesWithDelay);\n }\n\n public async getSpecificOverview(\n id: BlockPackId,\n channel: string\n ): Promise<SingleBlockPackOverview> {\n return await retry(async () => {\n const manifestContent = await this.v2RootFolderReader.readFile(\n packageContentPrefixInsideV2(id) + ManifestSuffix\n );\n const overview = BlockPackManifest.parse(JSON.parse(Buffer.from(manifestContent).toString()));\n return {\n id: id,\n meta: await this.embedMetaContent(\n id,\n await calculateSha256(manifestContent),\n false,\n overview.description.meta\n ),\n spec: {\n type: 'from-registry-v2',\n id,\n registryUrl: this.registryReader.rootUrl.toString(),\n channel\n }\n };\n }, Retry2TimesWithDelay);\n }\n\n private readonly componentsCache = new LRUCache<string, BlockComponentsAbsoluteUrl, BlockPackId>({\n max: 500,\n fetchMethod: async (key, staleValue, { context: id }) =>\n await retry(async () => {\n const packageFolderReader = this.v2RootFolderReader.relativeReader(\n packageContentPrefixInsideV2(id)\n );\n const manifest = BlockPackManifest.parse(\n JSON.parse(Buffer.from(await packageFolderReader.readFile(ManifestFileName)).toString())\n );\n return BlockComponentsAbsoluteUrl(packageFolderReader.rootUrl.toString()).parse(\n manifest.description.components\n );\n }, Retry2TimesWithDelay)\n });\n\n public async getComponents(id: BlockPackId): Promise<BlockComponentsAbsoluteUrl> {\n return await this.componentsCache.forceFetch(canonicalize(id)!, { context: id });\n }\n}\n","import { Dispatcher, request } from 'undici';\nimport { RelativeContentReader } from '../v2';\nimport path from 'node:path';\nimport pathPosix from 'node:path/posix';\nimport fsp from 'node:fs/promises';\nimport { defaultHttpDispatcher } from '@milaboratories/pl-http';\n\nexport interface FolderReader {\n readonly rootUrl: URL;\n relativeReader(relativePath: string): FolderReader;\n readFile(file: string): Promise<Buffer>;\n getContentReader(relativePath?: string): RelativeContentReader;\n}\n\nclass HttpFolderReader implements FolderReader {\n constructor(\n public readonly rootUrl: URL,\n private readonly httpDispatcher: Dispatcher\n ) {}\n\n public async readFile(file: string): Promise<Buffer> {\n const targetUrl = new URL(file, this.rootUrl);\n const response = await request(targetUrl, {\n dispatcher: this.httpDispatcher\n });\n return Buffer.from(await response.body.arrayBuffer());\n }\n\n public relativeReader(relativePath: string): HttpFolderReader {\n if (!relativePath.endsWith('/')) relativePath = relativePath + '/';\n return new HttpFolderReader(new URL(relativePath, this.rootUrl), this.httpDispatcher);\n }\n\n public getContentReader(relativePath?: string): RelativeContentReader {\n let reader: HttpFolderReader = this;\n if (relativePath !== undefined) reader = reader.relativeReader(relativePath);\n return (path) => reader.readFile(path);\n }\n}\n\nclass FSFolderReader implements FolderReader {\n constructor(\n public readonly rootUrl: URL,\n private readonly root: string\n ) {}\n\n public async readFile(file: string): Promise<Buffer> {\n const targetPath = path.join(this.root, ...file.split(pathPosix.sep));\n return await fsp.readFile(targetPath);\n }\n\n public relativeReader(relativePath: string): FSFolderReader {\n if (!relativePath.endsWith('/')) relativePath = relativePath + '/';\n return new FSFolderReader(\n new URL(relativePath, this.rootUrl),\n path.join(this.root, ...relativePath.split(pathPosix.sep))\n );\n }\n\n public getContentReader(relativePath?: string): RelativeContentReader {\n let reader: FSFolderReader = this;\n if (relativePath !== undefined) reader = reader.relativeReader(relativePath);\n return (path) => reader.readFile(path);\n }\n}\n\nfunction posixToLocalPath(p: string): string {\n return p.split(pathPosix.sep).join(path.sep);\n}\n\nfunction localToPosix(p: string): string {\n return p.split(path.sep).join(pathPosix.sep);\n}\n\nexport function folderReaderByUrl(address: string, httpDispatcher?: Dispatcher): FolderReader {\n if (!address.endsWith('/')) address = address + '/';\n const url = new URL(address, `file:${localToPosix(path.resolve('.'))}/`);\n switch (url.protocol) {\n case 'file:':\n const rootPath = posixToLocalPath(url.pathname);\n return new FSFolderReader(url, rootPath);\n case 'https:':\n case 'http:':\n return new HttpFolderReader(url, httpDispatcher ?? defaultHttpDispatcher());\n default:\n throw new Error(`Unknown protocol: ${url.protocol}`);\n }\n}\n"],"names":["DefaultRegistryV2ReaderOps","RegistryV2Reader","registryReader","ops","__publicField","LRUCache","_key","_staleValue","options","retry","contentReader","packageContentPrefixInsideV2","BlockPackMetaEmbedBytes","Retry2TimesWithDelay","key","staleValue","id","packageFolderReader","manifest","BlockPackManifest","ManifestFileName","BlockComponentsAbsoluteUrl","MainPrefix","sha256","absolutePath","meta","canonicalize","globalOverview","GlobalOverviewReg","GlobalOverviewFileName","result","p","byChannelEntries","channel","data","e","overview","blockPackIdNoVersionEquals","manifestContent","ManifestSuffix","calculateSha256","HttpFolderReader","rootUrl","httpDispatcher","file","targetUrl","response","request","relativePath","reader","path","FSFolderReader","root","targetPath","pathPosix","fsp","posixToLocalPath","localToPosix","folderReaderByUrl","address","url","rootPath","defaultHttpDispatcher"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/v2/registry/registry_reader.ts","../src/io/folder_reader.ts"],"sourcesContent":["import {\n BlockPackId,\n BlockPackIdNoVersion,\n blockPackIdNoVersionEquals,\n BlockPackManifest,\n BlockPackMetaEmbeddedBytes,\n BlockPackMetaManifest,\n BlockPackOverview,\n UpdateSuggestions,\n SingleBlockPackOverview\n} from '@milaboratories/pl-model-middle-layer';\nimport { FolderReader } from '../../io';\nimport canonicalize from 'canonicalize';\nimport {\n GlobalOverviewFileName,\n GlobalOverviewReg,\n MainPrefix,\n ManifestFileName,\n ManifestSuffix,\n packageContentPrefixInsideV2\n} from './schema_public';\nimport { BlockComponentsAbsoluteUrl, BlockPackMetaEmbedBytes } from '../model';\nimport { LRUCache } from 'lru-cache';\nimport semver from 'semver';\nimport { calculateSha256 } from '../../util';\nimport { retry, Retry2TimesWithDelay } from '@milaboratories/ts-helpers';\n\nexport type BlockPackOverviewNoRegLabel = Omit<BlockPackOverview, 'registryId'>;\n\nexport type RegistryV2ReaderOps = {\n /** Number of milliseconds to cache retrieved block list for */\n cacheBlockListFor: number;\n /** Number of milliseconds to keep cached retrieved block list for, if new requests returns error */\n keepStaleBlockListFor: number;\n};\n\nconst DefaultRegistryV2ReaderOps: RegistryV2ReaderOps = {\n cacheBlockListFor: 45e3, // 45 seconds\n keepStaleBlockListFor: 300e3 // 5 minutes\n};\n\n/** @param availableVersions must be reverse sorted (from highest version to lowest) */\nexport function inferUpdateSuggestions(currentVersion: string, availableVersions: string[]) {\n const nextMinor = semver.inc(currentVersion, 'minor')!;\n const nextMajor = semver.inc(currentVersion, 'major')!;\n\n // first found = the highest (given the search criteria)\n\n const suggestions: UpdateSuggestions<string> = [];\n\n const patch = availableVersions.find(\n (v) => semver.gt(v, currentVersion) && semver.lt(v, nextMinor)\n );\n const minor = availableVersions.find((v) => semver.gte(v, nextMinor) && semver.lt(v, nextMajor));\n const major = availableVersions.find((v) => semver.gte(v, nextMajor));\n\n if (patch) suggestions.push({ type: 'patch', update: patch });\n if (minor) suggestions.push({ type: 'minor', update: minor });\n if (major) suggestions.push({ type: 'major', update: major });\n\n return suggestions;\n}\n\nexport class RegistryV2Reader {\n private readonly v2RootFolderReader: FolderReader;\n private readonly ops: RegistryV2ReaderOps;\n\n constructor(\n private readonly registryReader: FolderReader,\n ops?: Partial<RegistryV2ReaderOps>\n ) {\n this.v2RootFolderReader = registryReader.relativeReader(MainPrefix);\n this.ops = { ...DefaultRegistryV2ReaderOps, ...(ops ?? {}) };\n }\n\n /**\n * Embeds meta infromation relative to registry root.\n * Meta information that looks like:\n *\n * */\n private readonly embeddedGlobalMetaCache = new LRUCache<\n string,\n BlockPackMetaEmbeddedBytes,\n { meta: BlockPackMetaManifest; relativeTo?: BlockPackId }\n >({\n max: 500,\n fetchMethod: async (_key, _staleValue, options) =>\n await retry(async () => {\n const contentReader =\n options.context.relativeTo !== undefined\n ? this.v2RootFolderReader\n .relativeReader(packageContentPrefixInsideV2(options.context.relativeTo))\n .getContentReader()\n : this.v2RootFolderReader.getContentReader();\n return await BlockPackMetaEmbedBytes(contentReader).parseAsync(options.context.meta);\n }, Retry2TimesWithDelay)\n });\n\n private async embedMetaContent(\n id: BlockPackId,\n sha256: string,\n absolutePath: boolean,\n meta: BlockPackMetaManifest\n ): Promise<BlockPackMetaEmbeddedBytes> {\n return await this.embeddedGlobalMetaCache.forceFetch(\n canonicalize({ id, sha256, absolutePath })!,\n { context: { meta, relativeTo: absolutePath ? undefined : id } }\n );\n }\n\n private listCacheTimestamp: number = 0;\n private listCache: BlockPackOverviewNoRegLabel[] | undefined = undefined;\n\n public async listBlockPacks(): Promise<BlockPackOverviewNoRegLabel[]> {\n if (\n this.listCache !== undefined &&\n Date.now() - this.listCacheTimestamp <= this.ops.cacheBlockListFor\n )\n return this.listCache;\n try {\n return await retry(async () => {\n // const rootContentReader = this.v2RootFolderReader.getContentReader();\n const globalOverview = GlobalOverviewReg.parse(\n JSON.parse(\n Buffer.from(await this.v2RootFolderReader.readFile(GlobalOverviewFileName)).toString()\n )\n );\n\n const result = await Promise.all(\n globalOverview.packages.map(async (p) => {\n const byChannelEntries = await Promise.all(\n Object.entries(p.latestByChannel).map(async ([channel, data]) => [\n channel,\n {\n id: data.description.id,\n meta: await this.embedMetaContent(\n data.description.id,\n data.manifestSha256,\n true,\n data.description.meta\n ),\n spec: {\n type: 'from-registry-v2',\n id: data.description.id,\n registryUrl: this.registryReader.rootUrl.toString(),\n channel\n }\n }\n ])\n );\n return {\n id: p.id,\n latestByChannel: Object.fromEntries(byChannelEntries),\n allVersions: p.allVersionsWithChannels\n } satisfies BlockPackOverviewNoRegLabel;\n })\n );\n\n this.listCache = result;\n this.listCacheTimestamp = Date.now();\n\n return result;\n }, Retry2TimesWithDelay);\n } catch (e: unknown) {\n if (\n this.listCache !== undefined &&\n Date.now() - this.listCacheTimestamp <= this.ops.keepStaleBlockListFor\n )\n return this.listCache;\n throw e;\n }\n }\n\n public async getLatestOverview(\n id: BlockPackIdNoVersion,\n channel: string\n ): Promise<SingleBlockPackOverview | undefined> {\n const overview = (await this.listBlockPacks()).find((e) =>\n blockPackIdNoVersionEquals(id, e.id)\n );\n if (overview === undefined) return undefined;\n return overview.latestByChannel[channel];\n }\n\n public async getUpdateSuggestions(\n id: BlockPackId,\n channel: string\n ): Promise<UpdateSuggestions<string> | undefined> {\n const overview = (await this.listBlockPacks()).find((e) =>\n blockPackIdNoVersionEquals(id, e.id)\n );\n if (overview === undefined) return undefined;\n\n const versionCandidates = overview.allVersions\n .filter((v) => v.channels.indexOf(channel) >= 0)\n .map((v) => v.version);\n\n // versions are sorted\n versionCandidates.reverse(); // changing sorting order to opposite\n\n return inferUpdateSuggestions(id.version, versionCandidates);\n }\n\n public async getSpecificOverview(\n id: BlockPackId,\n channel: string\n ): Promise<SingleBlockPackOverview> {\n return await retry(async () => {\n const manifestContent = await this.v2RootFolderReader.readFile(\n packageContentPrefixInsideV2(id) + ManifestSuffix\n );\n const overview = BlockPackManifest.parse(JSON.parse(Buffer.from(manifestContent).toString()));\n return {\n id: id,\n meta: await this.embedMetaContent(\n id,\n await calculateSha256(manifestContent),\n false,\n overview.description.meta\n ),\n spec: {\n type: 'from-registry-v2',\n id,\n registryUrl: this.registryReader.rootUrl.toString(),\n channel\n }\n };\n }, Retry2TimesWithDelay);\n }\n\n private readonly componentsCache = new LRUCache<string, BlockComponentsAbsoluteUrl, BlockPackId>({\n max: 500,\n fetchMethod: async (key, staleValue, { context: id }) =>\n await retry(async () => {\n const packageFolderReader = this.v2RootFolderReader.relativeReader(\n packageContentPrefixInsideV2(id)\n );\n const manifest = BlockPackManifest.parse(\n JSON.parse(Buffer.from(await packageFolderReader.readFile(ManifestFileName)).toString())\n );\n return BlockComponentsAbsoluteUrl(packageFolderReader.rootUrl.toString()).parse(\n manifest.description.components\n );\n }, Retry2TimesWithDelay)\n });\n\n public async getComponents(id: BlockPackId): Promise<BlockComponentsAbsoluteUrl> {\n return await this.componentsCache.forceFetch(canonicalize(id)!, { context: id });\n }\n}\n","import { Dispatcher, request } from 'undici';\nimport { RelativeContentReader } from '../v2';\nimport path from 'node:path';\nimport pathPosix from 'node:path/posix';\nimport fsp from 'node:fs/promises';\nimport { defaultHttpDispatcher } from '@milaboratories/pl-http';\n\nexport interface FolderReader {\n readonly rootUrl: URL;\n relativeReader(relativePath: string): FolderReader;\n readFile(file: string): Promise<Buffer>;\n getContentReader(relativePath?: string): RelativeContentReader;\n}\n\nclass HttpFolderReader implements FolderReader {\n constructor(\n public readonly rootUrl: URL,\n private readonly httpDispatcher: Dispatcher\n ) {}\n\n public async readFile(file: string): Promise<Buffer> {\n const targetUrl = new URL(file, this.rootUrl);\n const response = await request(targetUrl, {\n dispatcher: this.httpDispatcher\n });\n return Buffer.from(await response.body.arrayBuffer());\n }\n\n public relativeReader(relativePath: string): HttpFolderReader {\n if (!relativePath.endsWith('/')) relativePath = relativePath + '/';\n return new HttpFolderReader(new URL(relativePath, this.rootUrl), this.httpDispatcher);\n }\n\n public getContentReader(relativePath?: string): RelativeContentReader {\n let reader: HttpFolderReader = this;\n if (relativePath !== undefined) reader = reader.relativeReader(relativePath);\n return (path) => reader.readFile(path);\n }\n}\n\nclass FSFolderReader implements FolderReader {\n constructor(\n public readonly rootUrl: URL,\n private readonly root: string\n ) {}\n\n public async readFile(file: string): Promise<Buffer> {\n const targetPath = path.join(this.root, ...file.split(pathPosix.sep));\n return await fsp.readFile(targetPath);\n }\n\n public relativeReader(relativePath: string): FSFolderReader {\n if (!relativePath.endsWith('/')) relativePath = relativePath + '/';\n return new FSFolderReader(\n new URL(relativePath, this.rootUrl),\n path.join(this.root, ...relativePath.split(pathPosix.sep))\n );\n }\n\n public getContentReader(relativePath?: string): RelativeContentReader {\n let reader: FSFolderReader = this;\n if (relativePath !== undefined) reader = reader.relativeReader(relativePath);\n return (path) => reader.readFile(path);\n }\n}\n\nfunction posixToLocalPath(p: string): string {\n return p.split(pathPosix.sep).join(path.sep);\n}\n\nfunction localToPosix(p: string): string {\n return p.split(path.sep).join(pathPosix.sep);\n}\n\nexport function folderReaderByUrl(address: string, httpDispatcher?: Dispatcher): FolderReader {\n if (!address.endsWith('/')) address = address + '/';\n const url = new URL(address, `file:${localToPosix(path.resolve('.'))}/`);\n switch (url.protocol) {\n case 'file:':\n const rootPath = posixToLocalPath(url.pathname);\n return new FSFolderReader(url, rootPath);\n case 'https:':\n case 'http:':\n return new HttpFolderReader(url, httpDispatcher ?? defaultHttpDispatcher());\n default:\n throw new Error(`Unknown protocol: ${url.protocol}`);\n }\n}\n"],"names":["DefaultRegistryV2ReaderOps","inferUpdateSuggestions","currentVersion","availableVersions","nextMinor","semver","nextMajor","suggestions","patch","v","minor","major","RegistryV2Reader","registryReader","ops","__publicField","LRUCache","_key","_staleValue","options","retry","contentReader","packageContentPrefixInsideV2","BlockPackMetaEmbedBytes","Retry2TimesWithDelay","key","staleValue","id","packageFolderReader","manifest","BlockPackManifest","ManifestFileName","BlockComponentsAbsoluteUrl","MainPrefix","sha256","absolutePath","meta","canonicalize","globalOverview","GlobalOverviewReg","GlobalOverviewFileName","result","p","byChannelEntries","channel","data","e","overview","blockPackIdNoVersionEquals","versionCandidates","manifestContent","ManifestSuffix","calculateSha256","HttpFolderReader","rootUrl","httpDispatcher","file","targetUrl","response","request","relativePath","reader","path","FSFolderReader","root","targetPath","pathPosix","fsp","posixToLocalPath","localToPosix","folderReaderByUrl","address","url","rootPath","defaultHttpDispatcher"],"mappings":"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"}
package/dist/index.mjs CHANGED
@@ -1,279 +1,292 @@
1
- var u = Object.defineProperty;
2
- var y = (o, e, a) => e in o ? u(o, e, { enumerable: !0, configurable: !0, writable: !0, value: a }) : o[e] = a;
3
- var s = (o, e, a) => y(o, typeof e != "symbol" ? e + "" : e, a);
4
- import { e as w, p as h, f as R, G as C, h as P, i as B, j as F, M as b, k as x, m as O, n as T, o as S, q as D, r as M, t as U, u as E, v as L, P as V, w as G, x as N, y as j } from "./config-Dvh9BG_1.mjs";
5
- import { U as me, T as fe, Y as ge, ae as ve, W as ke, X as ue, O as ye, a as we, B as Re, Q as Ce, b as Pe, a1 as Be, a0 as Fe, F as be, ad as xe, ab as Oe, ac as Te, aa as Se, ag as De, af as Me, a9 as Ue, a4 as Ee, $ as Le, a3 as Ve, V as Ge, R as Ne, z as je, S as Ae, D as Je, E as We, C as Ie, d as _e, H as ze, c as qe, l as $e, A as He, I as Ye, a8 as Ke, a7 as Qe, a2 as Xe, a6 as Ze, a5 as ea, Z as aa, K as ta, L as oa, N as ra, J as sa, s as ia, _ as na } from "./config-Dvh9BG_1.mjs";
6
- import { request as A } from "undici";
7
- import c from "node:path";
8
- import d from "node:path/posix";
9
- import J from "node:fs/promises";
10
- import { defaultHttpDispatcher as W } from "@milaboratories/pl-http";
11
- import { blockPackIdNoVersionEquals as I, BlockPackManifest as g } from "@milaboratories/pl-model-middle-layer";
12
- import v from "canonicalize";
1
+ var C = Object.defineProperty;
2
+ var P = (s, e, t) => e in s ? C(s, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : s[e] = t;
3
+ var l = (s, e, t) => P(s, typeof e != "symbol" ? e + "" : e, t);
4
+ import { e as c, f as B, p as m, h as F, G as b, i as x, j as O, k as S, M as T, m as D, n as M, o as U, q as E, r as L, t as j, u as G, v as V, w as N, P as A, x as J, y as W, z as I } from "./config-BhgCn4u4.mjs";
5
+ import { V as ue, U as ke, Z as ye, af as we, X as Re, Y as Ce, Q as Pe, a as Be, B as Fe, T as be, b as xe, a2 as Oe, a1 as Se, F as Te, ae as De, ac as Me, ad as Ue, ab as Ee, ah as Le, ag as je, aa as Ge, a5 as Ve, a0 as Ne, a4 as Ae, W as Je, R as We, A as Ie, S as _e, E as ze, H as qe, D as $e, d as He, I as Ye, c as Ke, l as Qe, C as Xe, J as Ze, a9 as et, a8 as tt, a3 as at, a7 as ot, a6 as st, _ as it, L as rt, N as nt, O as lt, K as ct, s as pt, $ as dt } from "./config-BhgCn4u4.mjs";
6
+ import { request as _ } from "undici";
7
+ import p from "node:path";
8
+ import f from "node:path/posix";
9
+ import z from "node:fs/promises";
10
+ import { defaultHttpDispatcher as q } from "@milaboratories/pl-http";
11
+ import { blockPackIdNoVersionEquals as k, BlockPackManifest as y } from "@milaboratories/pl-model-middle-layer";
12
+ import w from "canonicalize";
13
13
  import "zod";
14
14
  import "mime-types";
15
15
  import "tar";
16
16
  import "@milaboratories/resolve-helper";
17
- import { LRUCache as k } from "lru-cache";
18
- import { retry as n, Retry2TimesWithDelay as l } from "@milaboratories/ts-helpers";
19
- const _ = {
17
+ import { LRUCache as R } from "lru-cache";
18
+ import { retry as d, Retry2TimesWithDelay as h } from "@milaboratories/ts-helpers";
19
+ const $ = {
20
20
  cacheBlockListFor: 45e3,
21
21
  // 45 seconds
22
22
  keepStaleBlockListFor: 3e5
23
23
  // 5 minutes
24
24
  };
25
- class le {
26
- constructor(e, a) {
27
- s(this, "v2RootFolderReader");
28
- s(this, "ops");
25
+ function H(s, e) {
26
+ const t = c.inc(s, "minor"), a = c.inc(s, "major"), o = [], i = e.find(
27
+ (n) => c.gt(n, s) && c.lt(n, t)
28
+ ), r = e.find((n) => c.gte(n, t) && c.lt(n, a)), u = e.find((n) => c.gte(n, a));
29
+ return i && o.push({ type: "patch", update: i }), r && o.push({ type: "minor", update: r }), u && o.push({ type: "major", update: u }), o;
30
+ }
31
+ class he {
32
+ constructor(e, t) {
33
+ l(this, "v2RootFolderReader");
34
+ l(this, "ops");
29
35
  /**
30
36
  * Embeds meta infromation relative to registry root.
31
37
  * Meta information that looks like:
32
38
  *
33
39
  * */
34
- s(this, "embeddedGlobalMetaCache", new k({
40
+ l(this, "embeddedGlobalMetaCache", new R({
35
41
  max: 500,
36
- fetchMethod: async (e, a, t) => await n(async () => {
37
- const r = t.context.relativeTo !== void 0 ? this.v2RootFolderReader.relativeReader(h(t.context.relativeTo)).getContentReader() : this.v2RootFolderReader.getContentReader();
38
- return await R(r).parseAsync(t.context.meta);
39
- }, l)
42
+ fetchMethod: async (e, t, a) => await d(async () => {
43
+ const o = a.context.relativeTo !== void 0 ? this.v2RootFolderReader.relativeReader(m(a.context.relativeTo)).getContentReader() : this.v2RootFolderReader.getContentReader();
44
+ return await F(o).parseAsync(a.context.meta);
45
+ }, h)
40
46
  }));
41
- s(this, "listCacheTimestamp", 0);
42
- s(this, "listCache");
43
- s(this, "componentsCache", new k({
47
+ l(this, "listCacheTimestamp", 0);
48
+ l(this, "listCache");
49
+ l(this, "componentsCache", new R({
44
50
  max: 500,
45
- fetchMethod: async (e, a, { context: t }) => await n(async () => {
46
- const r = this.v2RootFolderReader.relativeReader(
47
- h(t)
48
- ), p = g.parse(
49
- JSON.parse(Buffer.from(await r.readFile(b)).toString())
51
+ fetchMethod: async (e, t, { context: a }) => await d(async () => {
52
+ const o = this.v2RootFolderReader.relativeReader(
53
+ m(a)
54
+ ), i = y.parse(
55
+ JSON.parse(Buffer.from(await o.readFile(T)).toString())
50
56
  );
51
- return x(r.rootUrl.toString()).parse(
52
- p.description.components
57
+ return D(o.rootUrl.toString()).parse(
58
+ i.description.components
53
59
  );
54
- }, l)
60
+ }, h)
55
61
  }));
56
- this.registryReader = e, this.v2RootFolderReader = e.relativeReader(w), this.ops = { ..._, ...a ?? {} };
62
+ this.registryReader = e, this.v2RootFolderReader = e.relativeReader(B), this.ops = { ...$, ...t ?? {} };
57
63
  }
58
- async embedMetaContent(e, a, t, r) {
64
+ async embedMetaContent(e, t, a, o) {
59
65
  return await this.embeddedGlobalMetaCache.forceFetch(
60
- v({ id: e, sha256: a, absolutePath: t }),
61
- { context: { meta: r, relativeTo: t ? void 0 : e } }
66
+ w({ id: e, sha256: t, absolutePath: a }),
67
+ { context: { meta: o, relativeTo: a ? void 0 : e } }
62
68
  );
63
69
  }
64
70
  async listBlockPacks() {
65
71
  if (this.listCache !== void 0 && Date.now() - this.listCacheTimestamp <= this.ops.cacheBlockListFor)
66
72
  return this.listCache;
67
73
  try {
68
- return await n(async () => {
69
- const e = C.parse(
74
+ return await d(async () => {
75
+ const e = b.parse(
70
76
  JSON.parse(
71
- Buffer.from(await this.v2RootFolderReader.readFile(P)).toString()
77
+ Buffer.from(await this.v2RootFolderReader.readFile(x)).toString()
72
78
  )
73
- ), a = await Promise.all(
74
- e.packages.map(async (t) => {
75
- const r = await Promise.all(
76
- Object.entries(t.latestByChannel).map(async ([p, i]) => [
77
- p,
79
+ ), t = await Promise.all(
80
+ e.packages.map(async (a) => {
81
+ const o = await Promise.all(
82
+ Object.entries(a.latestByChannel).map(async ([i, r]) => [
83
+ i,
78
84
  {
79
- id: i.description.id,
85
+ id: r.description.id,
80
86
  meta: await this.embedMetaContent(
81
- i.description.id,
82
- i.manifestSha256,
87
+ r.description.id,
88
+ r.manifestSha256,
83
89
  !0,
84
- i.description.meta
90
+ r.description.meta
85
91
  ),
86
92
  spec: {
87
93
  type: "from-registry-v2",
88
- id: i.description.id,
94
+ id: r.description.id,
89
95
  registryUrl: this.registryReader.rootUrl.toString(),
90
- channel: p
96
+ channel: i
91
97
  }
92
98
  }
93
99
  ])
94
100
  );
95
101
  return {
96
- id: t.id,
97
- latestByChannel: Object.fromEntries(r),
98
- allVersions: t.allVersionsWithChannels
102
+ id: a.id,
103
+ latestByChannel: Object.fromEntries(o),
104
+ allVersions: a.allVersionsWithChannels
99
105
  };
100
106
  })
101
107
  );
102
- return this.listCache = a, this.listCacheTimestamp = Date.now(), a;
103
- }, l);
108
+ return this.listCache = t, this.listCacheTimestamp = Date.now(), t;
109
+ }, h);
104
110
  } catch (e) {
105
111
  if (this.listCache !== void 0 && Date.now() - this.listCacheTimestamp <= this.ops.keepStaleBlockListFor)
106
112
  return this.listCache;
107
113
  throw e;
108
114
  }
109
115
  }
110
- async getLatestOverview(e, a) {
111
- return await n(async () => {
112
- const t = (await this.listBlockPacks()).find(
113
- (r) => I(e, r.id)
114
- );
115
- if (t !== void 0)
116
- return t.latestByChannel[a];
117
- }, l);
116
+ async getLatestOverview(e, t) {
117
+ const a = (await this.listBlockPacks()).find(
118
+ (o) => k(e, o.id)
119
+ );
120
+ if (a !== void 0)
121
+ return a.latestByChannel[t];
122
+ }
123
+ async getUpdateSuggestions(e, t) {
124
+ const a = (await this.listBlockPacks()).find(
125
+ (i) => k(e, i.id)
126
+ );
127
+ if (a === void 0) return;
128
+ const o = a.allVersions.filter((i) => i.channels.indexOf(t) >= 0).map((i) => i.version);
129
+ return o.reverse(), H(e.version, o);
118
130
  }
119
- async getSpecificOverview(e, a) {
120
- return await n(async () => {
121
- const t = await this.v2RootFolderReader.readFile(
122
- h(e) + B
123
- ), r = g.parse(JSON.parse(Buffer.from(t).toString()));
131
+ async getSpecificOverview(e, t) {
132
+ return await d(async () => {
133
+ const a = await this.v2RootFolderReader.readFile(
134
+ m(e) + O
135
+ ), o = y.parse(JSON.parse(Buffer.from(a).toString()));
124
136
  return {
125
137
  id: e,
126
138
  meta: await this.embedMetaContent(
127
139
  e,
128
- await F(t),
140
+ await S(a),
129
141
  !1,
130
- r.description.meta
142
+ o.description.meta
131
143
  ),
132
144
  spec: {
133
145
  type: "from-registry-v2",
134
146
  id: e,
135
147
  registryUrl: this.registryReader.rootUrl.toString(),
136
- channel: a
148
+ channel: t
137
149
  }
138
150
  };
139
- }, l);
151
+ }, h);
140
152
  }
141
153
  async getComponents(e) {
142
- return await this.componentsCache.forceFetch(v(e), { context: e });
154
+ return await this.componentsCache.forceFetch(w(e), { context: e });
143
155
  }
144
156
  }
145
- class m {
146
- constructor(e, a) {
147
- this.rootUrl = e, this.httpDispatcher = a;
157
+ class g {
158
+ constructor(e, t) {
159
+ this.rootUrl = e, this.httpDispatcher = t;
148
160
  }
149
161
  async readFile(e) {
150
- const a = new URL(e, this.rootUrl), t = await A(a, {
162
+ const t = new URL(e, this.rootUrl), a = await _(t, {
151
163
  dispatcher: this.httpDispatcher
152
164
  });
153
- return Buffer.from(await t.body.arrayBuffer());
165
+ return Buffer.from(await a.body.arrayBuffer());
154
166
  }
155
167
  relativeReader(e) {
156
- return e.endsWith("/") || (e = e + "/"), new m(new URL(e, this.rootUrl), this.httpDispatcher);
168
+ return e.endsWith("/") || (e = e + "/"), new g(new URL(e, this.rootUrl), this.httpDispatcher);
157
169
  }
158
170
  getContentReader(e) {
159
- let a = this;
160
- return e !== void 0 && (a = a.relativeReader(e)), (t) => a.readFile(t);
171
+ let t = this;
172
+ return e !== void 0 && (t = t.relativeReader(e)), (a) => t.readFile(a);
161
173
  }
162
174
  }
163
- class f {
164
- constructor(e, a) {
165
- this.rootUrl = e, this.root = a;
175
+ class v {
176
+ constructor(e, t) {
177
+ this.rootUrl = e, this.root = t;
166
178
  }
167
179
  async readFile(e) {
168
- const a = c.join(this.root, ...e.split(d.sep));
169
- return await J.readFile(a);
180
+ const t = p.join(this.root, ...e.split(f.sep));
181
+ return await z.readFile(t);
170
182
  }
171
183
  relativeReader(e) {
172
- return e.endsWith("/") || (e = e + "/"), new f(
184
+ return e.endsWith("/") || (e = e + "/"), new v(
173
185
  new URL(e, this.rootUrl),
174
- c.join(this.root, ...e.split(d.sep))
186
+ p.join(this.root, ...e.split(f.sep))
175
187
  );
176
188
  }
177
189
  getContentReader(e) {
178
- let a = this;
179
- return e !== void 0 && (a = a.relativeReader(e)), (t) => a.readFile(t);
190
+ let t = this;
191
+ return e !== void 0 && (t = t.relativeReader(e)), (a) => t.readFile(a);
180
192
  }
181
193
  }
182
- function z(o) {
183
- return o.split(d.sep).join(c.sep);
194
+ function Y(s) {
195
+ return s.split(f.sep).join(p.sep);
184
196
  }
185
- function q(o) {
186
- return o.split(c.sep).join(d.sep);
197
+ function K(s) {
198
+ return s.split(p.sep).join(f.sep);
187
199
  }
188
- function ce(o, e) {
189
- o.endsWith("/") || (o = o + "/");
190
- const a = new URL(o, `file:${q(c.resolve("."))}/`);
191
- switch (a.protocol) {
200
+ function fe(s, e) {
201
+ s.endsWith("/") || (s = s + "/");
202
+ const t = new URL(s, `file:${K(p.resolve("."))}/`);
203
+ switch (t.protocol) {
192
204
  case "file:":
193
- const t = z(a.pathname);
194
- return new f(a, t);
205
+ const a = Y(t.pathname);
206
+ return new v(t, a);
195
207
  case "https:":
196
208
  case "http:":
197
- return new m(a, e ?? W());
209
+ return new g(t, e ?? q());
198
210
  default:
199
- throw new Error(`Unknown protocol: ${a.protocol}`);
211
+ throw new Error(`Unknown protocol: ${t.protocol}`);
200
212
  }
201
213
  }
202
- const pe = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
214
+ const me = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
203
215
  __proto__: null,
204
- GlobalOverviewPath: O,
205
- MetaFile: T,
206
- PlPackageConfigData: S,
207
- PlPackageJsonConfigFile: D,
208
- PlPackageYamlConfigFile: M,
209
- PlRegCommonConfigData: U,
210
- PlRegFullPackageConfigData: E,
211
- PlRegPackageConfig: L,
212
- PlRegPackageConfigDataShard: V,
213
- packageContentPrefix: G,
214
- packageOverviewPath: N,
215
- payloadFilePath: j
216
+ GlobalOverviewPath: M,
217
+ MetaFile: U,
218
+ PlPackageConfigData: E,
219
+ PlPackageJsonConfigFile: L,
220
+ PlPackageYamlConfigFile: j,
221
+ PlRegCommonConfigData: G,
222
+ PlRegFullPackageConfigData: V,
223
+ PlRegPackageConfig: N,
224
+ PlRegPackageConfigDataShard: A,
225
+ packageContentPrefix: J,
226
+ packageOverviewPath: W,
227
+ payloadFilePath: I
216
228
  }, Symbol.toStringTag, { value: "Module" }));
217
229
  export {
218
- x as BlockComponentsAbsoluteUrl,
219
- me as BlockComponentsConsolidate,
220
- fe as BlockComponentsDescription,
221
- ge as BlockDescriptionPackageJsonField,
222
- ve as BlockDescriptionToExplicitBinaryBytes,
223
- ke as BlockPackDescriptionConsolidateToFolder,
224
- ue as BlockPackDescriptionManifestAddRelativePathPrefix,
225
- ye as BlockPackMetaConsolidate,
226
- we as BlockPackMetaDescription,
227
- Re as BlockPackMetaEmbedAbsoluteBase64,
228
- Ce as BlockPackMetaEmbedAbsoluteBytes,
229
- R as BlockPackMetaEmbedBytes,
230
- Pe as BlockRegistryV2,
231
- Be as ChannelNameRegexp,
232
- Fe as ChannelsFolder,
233
- be as FSStorage,
234
- xe as GlobalOverview,
235
- Oe as GlobalOverviewEntry,
236
- Te as GlobalOverviewEntryReg,
237
- P as GlobalOverviewFileName,
238
- Se as GlobalOverviewPath,
239
- C as GlobalOverviewReg,
240
- De as GlobalOverviewToExplicitBinaryBase64,
241
- Me as GlobalOverviewToExplicitBinaryBytes,
242
- w as MainPrefix,
243
- b as ManifestFileName,
244
- B as ManifestSuffix,
245
- Ue as PackageManifestPattern,
246
- Ee as PackageOverview,
247
- Le as PackageOverviewFileName,
248
- Ve as PackageOverviewVersionEntry,
249
- pe as RegistryV1,
250
- le as RegistryV2Reader,
251
- Ge as ResolvedBlockPackDescriptionFromPackageJson,
252
- Ne as ResolvedModuleFile,
253
- je as ResolvedModuleFolder,
254
- Ae as S3Storage,
255
- Je as absoluteToBase64,
256
- We as absoluteToBytes,
257
- Ie as absoluteToString,
258
- _e as buildBlockPackDist,
259
- ze as cpAbsoluteToRelative,
260
- ce as folderReaderByUrl,
261
- qe as loadPackDescription,
262
- $e as loadPackDescriptionRaw,
263
- He as mapLocalToAbsolute,
264
- Ye as packFolderToRelativeTgz,
265
- Ke as packageChannelPrefix,
266
- Qe as packageChannelPrefixInsideV2,
267
- Xe as packageContentPrefix,
268
- h as packageContentPrefixInsideV2,
269
- Ze as packageOverviewPath,
270
- ea as packageOverviewPathInsideV2,
271
- aa as parsePackageName,
272
- ta as relativeToContentString,
273
- oa as relativeToExplicitBinary64,
274
- ra as relativeToExplicitBytes,
275
- sa as relativeToExplicitString,
276
- ia as storageByUrl,
277
- na as tryLoadPackDescription
230
+ D as BlockComponentsAbsoluteUrl,
231
+ ue as BlockComponentsConsolidate,
232
+ ke as BlockComponentsDescription,
233
+ ye as BlockDescriptionPackageJsonField,
234
+ we as BlockDescriptionToExplicitBinaryBytes,
235
+ Re as BlockPackDescriptionConsolidateToFolder,
236
+ Ce as BlockPackDescriptionManifestAddRelativePathPrefix,
237
+ Pe as BlockPackMetaConsolidate,
238
+ Be as BlockPackMetaDescription,
239
+ Fe as BlockPackMetaEmbedAbsoluteBase64,
240
+ be as BlockPackMetaEmbedAbsoluteBytes,
241
+ F as BlockPackMetaEmbedBytes,
242
+ xe as BlockRegistryV2,
243
+ Oe as ChannelNameRegexp,
244
+ Se as ChannelsFolder,
245
+ Te as FSStorage,
246
+ De as GlobalOverview,
247
+ Me as GlobalOverviewEntry,
248
+ Ue as GlobalOverviewEntryReg,
249
+ x as GlobalOverviewFileName,
250
+ Ee as GlobalOverviewPath,
251
+ b as GlobalOverviewReg,
252
+ Le as GlobalOverviewToExplicitBinaryBase64,
253
+ je as GlobalOverviewToExplicitBinaryBytes,
254
+ B as MainPrefix,
255
+ T as ManifestFileName,
256
+ O as ManifestSuffix,
257
+ Ge as PackageManifestPattern,
258
+ Ve as PackageOverview,
259
+ Ne as PackageOverviewFileName,
260
+ Ae as PackageOverviewVersionEntry,
261
+ me as RegistryV1,
262
+ he as RegistryV2Reader,
263
+ Je as ResolvedBlockPackDescriptionFromPackageJson,
264
+ We as ResolvedModuleFile,
265
+ Ie as ResolvedModuleFolder,
266
+ _e as S3Storage,
267
+ ze as absoluteToBase64,
268
+ qe as absoluteToBytes,
269
+ $e as absoluteToString,
270
+ He as buildBlockPackDist,
271
+ Ye as cpAbsoluteToRelative,
272
+ fe as folderReaderByUrl,
273
+ H as inferUpdateSuggestions,
274
+ Ke as loadPackDescription,
275
+ Qe as loadPackDescriptionRaw,
276
+ Xe as mapLocalToAbsolute,
277
+ Ze as packFolderToRelativeTgz,
278
+ et as packageChannelPrefix,
279
+ tt as packageChannelPrefixInsideV2,
280
+ at as packageContentPrefix,
281
+ m as packageContentPrefixInsideV2,
282
+ ot as packageOverviewPath,
283
+ st as packageOverviewPathInsideV2,
284
+ it as parsePackageName,
285
+ rt as relativeToContentString,
286
+ nt as relativeToExplicitBinary64,
287
+ lt as relativeToExplicitBytes,
288
+ ct as relativeToExplicitString,
289
+ pt as storageByUrl,
290
+ dt as tryLoadPackDescription
278
291
  };
279
292
  //# sourceMappingURL=index.mjs.map