@platforma-sdk/block-tools 2.5.2 → 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/cli.js +1 -1
- package/dist/cli.mjs +1 -1
- package/dist/{config-Dvh9BG_1.mjs → config-BhgCn4u4.mjs} +62 -59
- package/dist/config-BhgCn4u4.mjs.map +1 -0
- package/dist/config-CnMHgekz.js +3 -0
- package/dist/config-CnMHgekz.js.map +1 -0
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +191 -178
- package/dist/index.mjs.map +1 -1
- package/dist/v2/model/block_components.d.ts +5 -5
- package/dist/v2/model/block_description.d.ts +48 -48
- package/dist/v2/registry/registry_reader.d.ts +4 -1
- package/dist/v2/registry/registry_reader.d.ts.map +1 -1
- package/dist/v2/registry/schema_public.d.ts +639 -639
- package/dist/v2/source_package.d.ts.map +1 -1
- package/package.json +6 -6
- package/src/v2/registry/registry.test.ts +52 -1
- package/src/v2/registry/registry_reader.ts +48 -7
- package/src/v2/source_package.ts +2 -2
- package/dist/config-B2n8i1gx.js +0 -3
- package/dist/config-B2n8i1gx.js.map +0 -1
- package/dist/config-Dvh9BG_1.mjs.map +0 -1
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
|
|
2
|
-
var
|
|
3
|
-
var
|
|
4
|
-
import { e as
|
|
5
|
-
import {
|
|
6
|
-
import { request as
|
|
7
|
-
import
|
|
8
|
-
import
|
|
9
|
-
import
|
|
10
|
-
import { defaultHttpDispatcher as
|
|
11
|
-
import { blockPackIdNoVersionEquals as
|
|
12
|
-
import
|
|
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
|
|
18
|
-
import { retry as
|
|
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
|
-
|
|
26
|
-
|
|
27
|
-
s(
|
|
28
|
-
|
|
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
|
-
|
|
40
|
+
l(this, "embeddedGlobalMetaCache", new R({
|
|
35
41
|
max: 500,
|
|
36
|
-
fetchMethod: async (e,
|
|
37
|
-
const
|
|
38
|
-
return await
|
|
39
|
-
},
|
|
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
|
-
|
|
42
|
-
|
|
43
|
-
|
|
47
|
+
l(this, "listCacheTimestamp", 0);
|
|
48
|
+
l(this, "listCache");
|
|
49
|
+
l(this, "componentsCache", new R({
|
|
44
50
|
max: 500,
|
|
45
|
-
fetchMethod: async (e,
|
|
46
|
-
const
|
|
47
|
-
|
|
48
|
-
),
|
|
49
|
-
JSON.parse(Buffer.from(await
|
|
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
|
|
52
|
-
|
|
57
|
+
return D(o.rootUrl.toString()).parse(
|
|
58
|
+
i.description.components
|
|
53
59
|
);
|
|
54
|
-
},
|
|
60
|
+
}, h)
|
|
55
61
|
}));
|
|
56
|
-
this.registryReader = e, this.v2RootFolderReader = e.relativeReader(
|
|
62
|
+
this.registryReader = e, this.v2RootFolderReader = e.relativeReader(B), this.ops = { ...$, ...t ?? {} };
|
|
57
63
|
}
|
|
58
|
-
async embedMetaContent(e,
|
|
64
|
+
async embedMetaContent(e, t, a, o) {
|
|
59
65
|
return await this.embeddedGlobalMetaCache.forceFetch(
|
|
60
|
-
|
|
61
|
-
{ context: { meta:
|
|
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
|
|
69
|
-
const e =
|
|
74
|
+
return await d(async () => {
|
|
75
|
+
const e = b.parse(
|
|
70
76
|
JSON.parse(
|
|
71
|
-
Buffer.from(await this.v2RootFolderReader.readFile(
|
|
77
|
+
Buffer.from(await this.v2RootFolderReader.readFile(x)).toString()
|
|
72
78
|
)
|
|
73
|
-
),
|
|
74
|
-
e.packages.map(async (
|
|
75
|
-
const
|
|
76
|
-
Object.entries(
|
|
77
|
-
|
|
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:
|
|
85
|
+
id: r.description.id,
|
|
80
86
|
meta: await this.embedMetaContent(
|
|
81
|
-
|
|
82
|
-
|
|
87
|
+
r.description.id,
|
|
88
|
+
r.manifestSha256,
|
|
83
89
|
!0,
|
|
84
|
-
|
|
90
|
+
r.description.meta
|
|
85
91
|
),
|
|
86
92
|
spec: {
|
|
87
93
|
type: "from-registry-v2",
|
|
88
|
-
id:
|
|
94
|
+
id: r.description.id,
|
|
89
95
|
registryUrl: this.registryReader.rootUrl.toString(),
|
|
90
|
-
channel:
|
|
96
|
+
channel: i
|
|
91
97
|
}
|
|
92
98
|
}
|
|
93
99
|
])
|
|
94
100
|
);
|
|
95
101
|
return {
|
|
96
|
-
id:
|
|
97
|
-
latestByChannel: Object.fromEntries(
|
|
98
|
-
allVersions:
|
|
102
|
+
id: a.id,
|
|
103
|
+
latestByChannel: Object.fromEntries(o),
|
|
104
|
+
allVersions: a.allVersionsWithChannels
|
|
99
105
|
};
|
|
100
106
|
})
|
|
101
107
|
);
|
|
102
|
-
return this.listCache =
|
|
103
|
-
},
|
|
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,
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
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,
|
|
120
|
-
return await
|
|
121
|
-
const
|
|
122
|
-
|
|
123
|
-
),
|
|
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
|
|
140
|
+
await S(a),
|
|
129
141
|
!1,
|
|
130
|
-
|
|
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:
|
|
148
|
+
channel: t
|
|
137
149
|
}
|
|
138
150
|
};
|
|
139
|
-
},
|
|
151
|
+
}, h);
|
|
140
152
|
}
|
|
141
153
|
async getComponents(e) {
|
|
142
|
-
return await this.componentsCache.forceFetch(
|
|
154
|
+
return await this.componentsCache.forceFetch(w(e), { context: e });
|
|
143
155
|
}
|
|
144
156
|
}
|
|
145
|
-
class
|
|
146
|
-
constructor(e,
|
|
147
|
-
this.rootUrl = e, this.httpDispatcher =
|
|
157
|
+
class g {
|
|
158
|
+
constructor(e, t) {
|
|
159
|
+
this.rootUrl = e, this.httpDispatcher = t;
|
|
148
160
|
}
|
|
149
161
|
async readFile(e) {
|
|
150
|
-
const
|
|
162
|
+
const t = new URL(e, this.rootUrl), a = await _(t, {
|
|
151
163
|
dispatcher: this.httpDispatcher
|
|
152
164
|
});
|
|
153
|
-
return Buffer.from(await
|
|
165
|
+
return Buffer.from(await a.body.arrayBuffer());
|
|
154
166
|
}
|
|
155
167
|
relativeReader(e) {
|
|
156
|
-
return e.endsWith("/") || (e = e + "/"), new
|
|
168
|
+
return e.endsWith("/") || (e = e + "/"), new g(new URL(e, this.rootUrl), this.httpDispatcher);
|
|
157
169
|
}
|
|
158
170
|
getContentReader(e) {
|
|
159
|
-
let
|
|
160
|
-
return e !== void 0 && (
|
|
171
|
+
let t = this;
|
|
172
|
+
return e !== void 0 && (t = t.relativeReader(e)), (a) => t.readFile(a);
|
|
161
173
|
}
|
|
162
174
|
}
|
|
163
|
-
class
|
|
164
|
-
constructor(e,
|
|
165
|
-
this.rootUrl = e, this.root =
|
|
175
|
+
class v {
|
|
176
|
+
constructor(e, t) {
|
|
177
|
+
this.rootUrl = e, this.root = t;
|
|
166
178
|
}
|
|
167
179
|
async readFile(e) {
|
|
168
|
-
const
|
|
169
|
-
return await
|
|
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
|
|
184
|
+
return e.endsWith("/") || (e = e + "/"), new v(
|
|
173
185
|
new URL(e, this.rootUrl),
|
|
174
|
-
|
|
186
|
+
p.join(this.root, ...e.split(f.sep))
|
|
175
187
|
);
|
|
176
188
|
}
|
|
177
189
|
getContentReader(e) {
|
|
178
|
-
let
|
|
179
|
-
return e !== void 0 && (
|
|
190
|
+
let t = this;
|
|
191
|
+
return e !== void 0 && (t = t.relativeReader(e)), (a) => t.readFile(a);
|
|
180
192
|
}
|
|
181
193
|
}
|
|
182
|
-
function
|
|
183
|
-
return
|
|
194
|
+
function Y(s) {
|
|
195
|
+
return s.split(f.sep).join(p.sep);
|
|
184
196
|
}
|
|
185
|
-
function
|
|
186
|
-
return
|
|
197
|
+
function K(s) {
|
|
198
|
+
return s.split(p.sep).join(f.sep);
|
|
187
199
|
}
|
|
188
|
-
function
|
|
189
|
-
|
|
190
|
-
const
|
|
191
|
-
switch (
|
|
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
|
|
194
|
-
return new
|
|
205
|
+
const a = Y(t.pathname);
|
|
206
|
+
return new v(t, a);
|
|
195
207
|
case "https:":
|
|
196
208
|
case "http:":
|
|
197
|
-
return new
|
|
209
|
+
return new g(t, e ?? q());
|
|
198
210
|
default:
|
|
199
|
-
throw new Error(`Unknown protocol: ${
|
|
211
|
+
throw new Error(`Unknown protocol: ${t.protocol}`);
|
|
200
212
|
}
|
|
201
213
|
}
|
|
202
|
-
const
|
|
214
|
+
const me = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
203
215
|
__proto__: null,
|
|
204
|
-
GlobalOverviewPath:
|
|
205
|
-
MetaFile:
|
|
206
|
-
PlPackageConfigData:
|
|
207
|
-
PlPackageJsonConfigFile:
|
|
208
|
-
PlPackageYamlConfigFile:
|
|
209
|
-
PlRegCommonConfigData:
|
|
210
|
-
PlRegFullPackageConfigData:
|
|
211
|
-
PlRegPackageConfig:
|
|
212
|
-
PlRegPackageConfigDataShard:
|
|
213
|
-
packageContentPrefix:
|
|
214
|
-
packageOverviewPath:
|
|
215
|
-
payloadFilePath:
|
|
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
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
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
|