@platforma-sdk/block-tools 2.5.60 → 2.5.62
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.js.map +1 -1
- package/dist/cli.mjs +4 -3
- package/dist/cli.mjs.map +1 -1
- package/dist/config-26zalc5o.js +3 -0
- package/dist/config-26zalc5o.js.map +1 -0
- package/dist/{config-Bg6-2Pd-.mjs → config-DwOM2V6u.mjs} +266 -256
- package/dist/config-DwOM2V6u.mjs.map +1 -0
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +59 -57
- package/dist/index.mjs.map +1 -1
- package/dist/v2/build_dist.d.ts.map +1 -1
- package/dist/v2/model/block_components.d.ts.map +1 -1
- package/dist/v2/model/block_description.d.ts +190 -1
- package/dist/v2/model/block_description.d.ts.map +1 -1
- package/dist/v2/model/block_meta.d.ts.map +1 -1
- package/dist/v2/registry/registry_reader.d.ts.map +1 -1
- package/dist/v2/registry/schema_public.d.ts +147 -0
- package/dist/v2/registry/schema_public.d.ts.map +1 -1
- package/dist/v2/source_package.d.ts.map +1 -1
- package/package.json +8 -6
- package/src/v2/build_dist.ts +4 -1
- package/src/v2/model/block_description.ts +11 -1
- package/src/v2/registry/registry_reader.ts +1 -0
- package/src/v2/source_package.ts +2 -1
- package/dist/config-Bg6-2Pd-.mjs.map +0 -1
- package/dist/config-DPNjt6Gf.js +0 -3
- package/dist/config-DPNjt6Gf.js.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 UpdateSuggestions,\n SingleBlockPackOverview,\n AnyChannel\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) => channel === AnyChannel || 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","AnyChannel","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":"upBAqCMA,EAAkD,CACtD,kBAAmB,KACnB,sBAAuB,GACzB,EAGgB,SAAAC,EAAuBC,EAAwBC,EAA6B,CAC1F,MAAMC,EAAYC,EAAA,OAAO,IAAIH,EAAgB,OAAO,EAC9CI,EAAYD,EAAA,OAAO,IAAIH,EAAgB,OAAO,EAI9CK,EAAyC,CAAC,EAE1CC,EAAQL,EAAkB,KAC7BM,GAAMJ,SAAO,GAAGI,EAAGP,CAAc,GAAKG,EAAA,OAAO,GAAGI,EAAGL,CAAS,CAC/D,EACMM,EAAQP,EAAkB,KAAMM,GAAMJ,EAAAA,OAAO,IAAII,EAAGL,CAAS,GAAKC,EAAA,OAAO,GAAGI,EAAGH,CAAS,CAAC,EACzFK,EAAQR,EAAkB,KAAMM,GAAMJ,EAAAA,OAAO,IAAII,EAAGH,CAAS,CAAC,EAEhE,OAAAE,KAAmB,KAAK,CAAE,KAAM,QAAS,OAAQA,EAAO,EACxDE,KAAmB,KAAK,CAAE,KAAM,QAAS,OAAQA,EAAO,EACxDC,KAAmB,KAAK,CAAE,KAAM,QAAS,OAAQA,EAAO,EAErDJ,CACT,CAEO,MAAMK,CAAiB,CAI5B,YACmBC,EACjBC,EACA,CANeC,EAAA,2BACAA,EAAA,YAeAA,EAAA,+BAA0B,IAAIC,EAAAA,SAI7C,CACA,IAAK,IACL,YAAa,MAAOC,EAAMC,EAAaC,IACrC,MAAMC,QAAM,SAAY,CACtB,MAAMC,EACJF,EAAQ,QAAQ,aAAe,OAC3B,KAAK,mBACF,eAAeG,EAAA,6BAA6BH,EAAQ,QAAQ,UAAU,CAAC,EACvE,mBACH,KAAK,mBAAmB,iBAAiB,EAC/C,OAAO,MAAMI,EAAwB,wBAAAF,CAAa,EAAE,WAAWF,EAAQ,QAAQ,IAAI,CAAA,EAClFK,EAAoB,oBAAA,CAAA,CAC1B,GAcOT,EAAA,0BAA6B,GAC7BA,EAAA,kBAuHSA,EAAA,uBAAkB,IAAIC,EAAAA,SAA0D,CAC/F,IAAK,IACL,YAAa,MAAOS,EAAKC,EAAY,CAAE,QAASC,CAAG,IACjD,MAAMP,EAAAA,MAAM,SAAY,CAChB,MAAAQ,EAAsB,KAAK,mBAAmB,eAClDN,EAAAA,6BAA6BK,CAAE,CACjC,EACME,EAAWC,EAAAA,kBAAkB,MACjC,KAAK,MAAM,OAAO,KAAK,MAAMF,EAAoB,SAASG,EAAAA,gBAAgB,CAAC,EAAE,SAAU,CAAA,CACzF,EACA,OAAOC,EAA2B,2BAAAJ,EAAoB,QAAQ,SAAA,CAAU,EAAE,MACxEC,EAAS,YAAY,UACvB,CAAA,EACCL,EAAoB,oBAAA,CAAA,CAC1B,GAhLkB,KAAA,eAAAX,EAGZ,KAAA,mBAAqBA,EAAe,eAAeoB,EAAAA,UAAU,EAClE,KAAK,IAAM,CAAE,GAAGjC,EAA4B,GAAIc,GAAO,CAAA,CAAI,CAAA,CA0B7D,MAAc,iBACZa,EACAO,EACAC,EACAC,EACqC,CAC9B,OAAA,MAAM,KAAK,wBAAwB,WACxCC,EAAa,CAAE,GAAAV,EAAI,OAAAO,EAAQ,aAAAC,EAAc,EACzC,CAAE,QAAS,CAAE,KAAAC,EAAM,WAAYD,EAAe,OAAYR,CAAK,CAAA,CACjE,CAAA,CAMF,MAAa,gBAAyD,CAElE,GAAA,KAAK,YAAc,QACnB,KAAK,MAAQ,KAAK,oBAAsB,KAAK,IAAI,kBAEjD,OAAO,KAAK,UACV,GAAA,CACK,OAAA,MAAMP,QAAM,SAAY,CAE7B,MAAMkB,EAAiBC,EAAAA,kBAAkB,MACvC,KAAK,MACH,OAAO,KAAK,MAAM,KAAK,mBAAmB,SAASC,EAAAA,sBAAsB,CAAC,EAAE,SAAS,CAAA,CAEzF,EAEMC,EAAS,MAAM,QAAQ,IAC3BH,EAAe,SAAS,IAAI,MAAOI,GAAM,CACjC,MAAAC,EAAmB,MAAM,QAAQ,IACrC,OAAO,QAAQD,EAAE,eAAe,EAAE,IAAI,MAAO,CAACE,EAASC,CAAI,IAAM,CAC/DD,EACA,CACE,GAAIC,EAAK,YAAY,GACrB,KAAM,MAAM,KAAK,iBACfA,EAAK,YAAY,GACjBA,EAAK,eACL,GACAA,EAAK,YAAY,IACnB,EACA,KAAM,CACJ,KAAM,mBACN,GAAIA,EAAK,YAAY,GACrB,YAAa,KAAK,eAAe,QAAQ,SAAS,EAClD,QAAAD,CAAA,CACF,CAEH,CAAA,CACH,EACO,MAAA,CACL,GAAIF,EAAE,GACN,gBAAiB,OAAO,YAAYC,CAAgB,EACpD,YAAaD,EAAE,uBACjB,CACD,CAAA,CACH,EAEA,YAAK,UAAYD,EACZ,KAAA,mBAAqB,KAAK,IAAI,EAE5BA,GACNjB,sBAAoB,QAChBsB,EAAY,CAEjB,GAAA,KAAK,YAAc,QACnB,KAAK,MAAQ,KAAK,oBAAsB,KAAK,IAAI,sBAEjD,OAAO,KAAK,UACR,MAAAA,CAAA,CACR,CAGF,MAAa,kBACXnB,EACAiB,EAC8C,CAC9C,MAAMG,GAAY,MAAM,KAAK,eAAkB,GAAA,KAAMD,GACnDE,EAAAA,2BAA2BrB,EAAImB,EAAE,EAAE,CACrC,EACI,GAAAC,IAAa,OACV,OAAAA,EAAS,gBAAgBH,CAAO,CAAA,CAGzC,MAAa,qBACXjB,EACAiB,EACgD,CAChD,MAAMG,GAAY,MAAM,KAAK,eAAkB,GAAA,KAAMD,GACnDE,EAAAA,2BAA2BrB,EAAImB,EAAE,EAAE,CACrC,EACI,GAAAC,IAAa,OAAkB,OAEnC,MAAME,EAAoBF,EAAS,YAChC,OAAQtC,GAAMmC,IAAYM,EAAAA,YAAczC,EAAE,SAAS,QAAQmC,CAAO,GAAK,CAAC,EACxE,IAAKnC,GAAMA,EAAE,OAAO,EAGvB,OAAAwC,EAAkB,QAAQ,EAEnBhD,EAAuB0B,EAAG,QAASsB,CAAiB,CAAA,CAG7D,MAAa,oBACXtB,EACAiB,EACkC,CAC3B,OAAA,MAAMxB,QAAM,SAAY,CACvB,MAAA+B,EAAkB,MAAM,KAAK,mBAAmB,SACpD7B,EAAA,6BAA6BK,CAAE,EAAIyB,EAAAA,cACrC,EACML,EAAWjB,EAAAA,kBAAkB,MAAM,KAAK,MAAM,OAAO,KAAKqB,CAAe,EAAE,SAAU,CAAA,CAAC,EACrF,MAAA,CACL,GAAAxB,EACA,KAAM,MAAM,KAAK,iBACfA,EACA,MAAM0B,EAAAA,gBAAgBF,CAAe,EACrC,GACAJ,EAAS,YAAY,IACvB,EACA,KAAM,CACJ,KAAM,mBACN,GAAApB,EACA,YAAa,KAAK,eAAe,QAAQ,SAAS,EAClD,QAAAiB,CAAA,CAEJ,GACCpB,sBAAoB,CAAA,CAmBzB,MAAa,cAAcG,EAAsD,CACxE,OAAA,MAAM,KAAK,gBAAgB,WAAWU,EAAaV,CAAE,EAAI,CAAE,QAASA,EAAI,CAAA,CAEnF,CC5OA,MAAM2B,CAAyC,CAC7C,YACkBC,EACCC,EACjB,CAFgB,KAAA,QAAAD,EACC,KAAA,eAAAC,CAAA,CAGnB,MAAa,SAASC,EAA+B,CACnD,MAAMC,EAAY,IAAI,IAAID,EAAM,KAAK,OAAO,EACtCE,EAAW,MAAMC,EAAA,QAAQF,EAAW,CACxC,WAAY,KAAK,cAAA,CAClB,EACD,OAAO,OAAO,KAAK,MAAMC,EAAS,KAAK,aAAa,CAAA,CAG/C,eAAeE,EAAwC,CAC5D,OAAKA,EAAa,SAAS,GAAG,MAAkBA,EAAe,KACxD,IAAIP,EAAiB,IAAI,IAAIO,EAAc,KAAK,OAAO,EAAG,KAAK,cAAc,CAAA,CAG/E,iBAAiBA,EAA8C,CACpE,IAAIC,EAA2B,KAC/B,OAAID,IAAiB,SAAoBC,EAAAA,EAAO,eAAeD,CAAY,GACnEE,GAASD,EAAO,SAASC,CAAI,CAAA,CAEzC,CAEA,MAAMC,CAAuC,CAC3C,YACkBT,EACCU,EACjB,CAFgB,KAAA,QAAAV,EACC,KAAA,KAAAU,CAAA,CAGnB,MAAa,SAASR,EAA+B,CAC7C,MAAAS,EAAaH,EAAK,KAAK,KAAK,KAAM,GAAGN,EAAK,MAAMU,EAAU,GAAG,CAAC,EAC7D,OAAA,MAAMC,EAAI,SAASF,CAAU,CAAA,CAG/B,eAAeL,EAAsC,CAC1D,OAAKA,EAAa,SAAS,GAAG,MAAkBA,EAAe,KACxD,IAAIG,EACT,IAAI,IAAIH,EAAc,KAAK,OAAO,EAClCE,EAAK,KAAK,KAAK,KAAM,GAAGF,EAAa,MAAMM,EAAU,GAAG,CAAC,CAC3D,CAAA,CAGK,iBAAiBN,EAA8C,CACpE,IAAIC,EAAyB,KAC7B,OAAID,IAAiB,SAAoBC,EAAAA,EAAO,eAAeD,CAAY,GACnEE,GAASD,EAAO,SAASC,CAAI,CAAA,CAEzC,CAEA,SAASM,EAAiB3B,EAAmB,CAC3C,OAAOA,EAAE,MAAMyB,EAAU,GAAG,EAAE,KAAKJ,EAAK,GAAG,CAC7C,CAEA,SAASO,EAAa5B,EAAmB,CACvC,OAAOA,EAAE,MAAMqB,EAAK,GAAG,EAAE,KAAKI,EAAU,GAAG,CAC7C,CAEgB,SAAAI,EAAkBC,EAAiBhB,EAA2C,CACvFgB,EAAQ,SAAS,GAAG,MAAaA,EAAU,KAC1C,MAAAC,EAAM,IAAI,IAAID,EAAS,QAAQF,EAAaP,EAAK,QAAQ,GAAG,CAAC,CAAC,GAAG,EACvE,OAAQU,EAAI,SAAU,CACpB,IAAK,QACG,MAAAC,EAAWL,EAAiBI,EAAI,QAAQ,EACvC,OAAA,IAAIT,EAAeS,EAAKC,CAAQ,EACzC,IAAK,SACL,IAAK,QACH,OAAO,IAAIpB,EAAiBmB,EAAKjB,GAAkBmB,yBAAuB,EAC5E,QACE,MAAM,IAAI,MAAM,qBAAqBF,EAAI,QAAQ,EAAE,CAAA,CAEzD"}
|
|
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 AnyChannel\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 featureFlags: data.description.featureFlags,\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) => channel === AnyChannel || 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","AnyChannel","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,8 +1,8 @@
|
|
|
1
1
|
var C = Object.defineProperty;
|
|
2
2
|
var P = (s, e, t) => e in s ? C(s, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : s[e] = t;
|
|
3
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-
|
|
5
|
-
import { V as
|
|
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-DwOM2V6u.mjs";
|
|
5
|
+
import { V as ye, U as we, Z as Re, af as Ce, X as Pe, Y as Be, Q as Fe, a as be, B as xe, T as Oe, b as Se, a2 as Te, a1 as De, F as Me, ae as Ue, ac as Ee, ad as Le, ab as je, ah as Ge, ag as Ve, aa as Ne, a5 as Ae, a0 as Je, a4 as We, W as Ie, R as _e, A as ze, S as qe, E as $e, H as He, D as Ye, d as Ke, I as Qe, c as Xe, l as Ze, C as et, J as tt, a9 as at, a8 as ot, a3 as st, a7 as it, a6 as rt, _ as nt, L as lt, N as ct, O as pt, K as dt, s as ht, $ as ft } from "./config-DwOM2V6u.mjs";
|
|
6
6
|
import { request as _ } from "undici";
|
|
7
7
|
import p from "node:path";
|
|
8
8
|
import f from "node:path/posix";
|
|
@@ -14,6 +14,7 @@ import "zod";
|
|
|
14
14
|
import "mime-types";
|
|
15
15
|
import "tar";
|
|
16
16
|
import "@milaboratories/resolve-helper";
|
|
17
|
+
import "@milaboratories/pl-model-common";
|
|
17
18
|
import { LRUCache as R } from "lru-cache";
|
|
18
19
|
import { retry as d, Retry2TimesWithDelay as h } from "@milaboratories/ts-helpers";
|
|
19
20
|
const H = {
|
|
@@ -28,7 +29,7 @@ function Y(s, e) {
|
|
|
28
29
|
), r = e.find((n) => c.gte(n, t) && c.lt(n, a)), u = e.find((n) => c.gte(n, a));
|
|
29
30
|
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
|
}
|
|
31
|
-
class
|
|
32
|
+
class me {
|
|
32
33
|
constructor(e, t) {
|
|
33
34
|
l(this, "v2RootFolderReader");
|
|
34
35
|
l(this, "ops");
|
|
@@ -89,6 +90,7 @@ class fe {
|
|
|
89
90
|
!0,
|
|
90
91
|
r.description.meta
|
|
91
92
|
),
|
|
93
|
+
featureFlags: r.description.featureFlags,
|
|
92
94
|
spec: {
|
|
93
95
|
type: "from-registry-v2",
|
|
94
96
|
id: r.description.id,
|
|
@@ -197,7 +199,7 @@ function K(s) {
|
|
|
197
199
|
function Q(s) {
|
|
198
200
|
return s.split(p.sep).join(f.sep);
|
|
199
201
|
}
|
|
200
|
-
function
|
|
202
|
+
function ge(s, e) {
|
|
201
203
|
s.endsWith("/") || (s = s + "/");
|
|
202
204
|
const t = new URL(s, `file:${Q(p.resolve("."))}/`);
|
|
203
205
|
switch (t.protocol) {
|
|
@@ -211,7 +213,7 @@ function me(s, e) {
|
|
|
211
213
|
throw new Error(`Unknown protocol: ${t.protocol}`);
|
|
212
214
|
}
|
|
213
215
|
}
|
|
214
|
-
const
|
|
216
|
+
const ve = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
215
217
|
__proto__: null,
|
|
216
218
|
GlobalOverviewPath: M,
|
|
217
219
|
MetaFile: U,
|
|
@@ -228,65 +230,65 @@ const ge = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
|
228
230
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
229
231
|
export {
|
|
230
232
|
D as BlockComponentsAbsoluteUrl,
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
233
|
+
ye as BlockComponentsConsolidate,
|
|
234
|
+
we as BlockComponentsDescription,
|
|
235
|
+
Re as BlockDescriptionPackageJsonField,
|
|
236
|
+
Ce as BlockDescriptionToExplicitBinaryBytes,
|
|
237
|
+
Pe as BlockPackDescriptionConsolidateToFolder,
|
|
238
|
+
Be as BlockPackDescriptionManifestAddRelativePathPrefix,
|
|
239
|
+
Fe as BlockPackMetaConsolidate,
|
|
240
|
+
be as BlockPackMetaDescription,
|
|
241
|
+
xe as BlockPackMetaEmbedAbsoluteBase64,
|
|
242
|
+
Oe as BlockPackMetaEmbedAbsoluteBytes,
|
|
241
243
|
F as BlockPackMetaEmbedBytes,
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
244
|
+
Se as BlockRegistryV2,
|
|
245
|
+
Te as ChannelNameRegexp,
|
|
246
|
+
De as ChannelsFolder,
|
|
247
|
+
Me as FSStorage,
|
|
248
|
+
Ue as GlobalOverview,
|
|
249
|
+
Ee as GlobalOverviewEntry,
|
|
250
|
+
Le as GlobalOverviewEntryReg,
|
|
249
251
|
x as GlobalOverviewFileName,
|
|
250
|
-
|
|
252
|
+
je as GlobalOverviewPath,
|
|
251
253
|
b as GlobalOverviewReg,
|
|
252
|
-
|
|
253
|
-
|
|
254
|
+
Ge as GlobalOverviewToExplicitBinaryBase64,
|
|
255
|
+
Ve as GlobalOverviewToExplicitBinaryBytes,
|
|
254
256
|
B as MainPrefix,
|
|
255
257
|
T as ManifestFileName,
|
|
256
258
|
O as ManifestSuffix,
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
259
|
+
Ne as PackageManifestPattern,
|
|
260
|
+
Ae as PackageOverview,
|
|
261
|
+
Je as PackageOverviewFileName,
|
|
262
|
+
We as PackageOverviewVersionEntry,
|
|
263
|
+
ve as RegistryV1,
|
|
264
|
+
me as RegistryV2Reader,
|
|
265
|
+
Ie as ResolvedBlockPackDescriptionFromPackageJson,
|
|
266
|
+
_e as ResolvedModuleFile,
|
|
267
|
+
ze as ResolvedModuleFolder,
|
|
268
|
+
qe as S3Storage,
|
|
269
|
+
$e as absoluteToBase64,
|
|
270
|
+
He as absoluteToBytes,
|
|
271
|
+
Ye as absoluteToString,
|
|
272
|
+
Ke as buildBlockPackDist,
|
|
273
|
+
Qe as cpAbsoluteToRelative,
|
|
274
|
+
ge as folderReaderByUrl,
|
|
273
275
|
Y as inferUpdateSuggestions,
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
276
|
+
Xe as loadPackDescription,
|
|
277
|
+
Ze as loadPackDescriptionRaw,
|
|
278
|
+
et as mapLocalToAbsolute,
|
|
279
|
+
tt as packFolderToRelativeTgz,
|
|
280
|
+
at as packageChannelPrefix,
|
|
281
|
+
ot as packageChannelPrefixInsideV2,
|
|
282
|
+
st as packageContentPrefix,
|
|
281
283
|
m as packageContentPrefixInsideV2,
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
284
|
+
it as packageOverviewPath,
|
|
285
|
+
rt as packageOverviewPathInsideV2,
|
|
286
|
+
nt as parsePackageName,
|
|
287
|
+
lt as relativeToContentString,
|
|
288
|
+
ct as relativeToExplicitBinary64,
|
|
289
|
+
pt as relativeToExplicitBytes,
|
|
290
|
+
dt as relativeToExplicitString,
|
|
291
|
+
ht as storageByUrl,
|
|
292
|
+
ft as tryLoadPackDescription
|
|
291
293
|
};
|
|
292
294
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","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 AnyChannel\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) => channel === AnyChannel || 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","overview","e","blockPackIdNoVersionEquals","versionCandidates","AnyChannel","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.mjs","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 AnyChannel\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 featureFlags: data.description.featureFlags,\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) => channel === AnyChannel || 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","overview","e","blockPackIdNoVersionEquals","versionCandidates","AnyChannel","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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build_dist.d.ts","sourceRoot":"","sources":["../../src/v2/build_dist.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,iBAAiB,EAGlB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,4BAA4B,EAA2C,MAAM,SAAS,CAAC;AAKhG,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,4BAA4B,EACzC,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,iBAAiB,CAAC,
|
|
1
|
+
{"version":3,"file":"build_dist.d.ts","sourceRoot":"","sources":["../../src/v2/build_dist.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,iBAAiB,EAGlB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,4BAA4B,EAA2C,MAAM,SAAS,CAAC;AAKhG,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,4BAA4B,EACzC,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,iBAAiB,CAAC,CAuB5B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"block_components.d.ts","sourceRoot":"","sources":["../../../src/v2/model/block_components.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAgBxB,wBAAgB,0BAA0B,CAAC,UAAU,EAAE,MAAM
|
|
1
|
+
{"version":3,"file":"block_components.d.ts","sourceRoot":"","sources":["../../../src/v2/model/block_components.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAgBxB,wBAAgB,0BAA0B,CAAC,UAAU,EAAE,MAAM;;;;;;;;;;;gBAsBgkC,UAAU;;;;;;;;;;;;;;;gBAAspB,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAjBtyD;AACD,MAAM,MAAM,0BAA0B,GAAG,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,0BAA0B,CAAC,CAAC,CAAC;AAEhG,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,MAAM,EAAE;;gBAci/O,UAAU;oBAAqC,SAAS;mBAAiB,SAAS;;;;;;;;;;gBAAkN,UAAU;gBAA+B,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gBAAlyN,UAAU;;oBAAk8M,UAAU;wBAAqC,SAAS;uBAAiB,SAAS;;;;;;;;;;oBAAkN,UAAU;oBAA+B,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gBAAloM,UAAU;;oBAAkyL,UAAU;wBAAqC,SAAS;uBAAiB,SAAS;;;;;;;;;;oBAAkN,UAAU;oBAA+B,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gBAAtV,UAAU;oBAAqC,SAAS;mBAAiB,SAAS;;;;;;;;;;gBAAkN,UAAU;gBAA+B,SAAS;;;;;;;;;;;;;;;;;;;;;;;gBAA5gO,UAAU;kBAAmC,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gBA5Bp8B,QAAQ,IAAI,WAAW,GAC1B,UAAS,GAAG,SAAS;gBACN,UACT;gBACQ,SAAS;mBAAqB,UAEvC;;;;;;;;;;;;;;;UAQe,SAAS;gBAAmB,UAAU;gBAC1D,SAAQ;oBACH,UAAU;oBAAkC,SAAS;uBAAyB,UAClF;;;;;;;kBAIsB,UAAU;;;;;;;;;;;;WAMmC,qBAAqB,YACrF,SAAS;gBAAmB,UAAU;gBAAiC,SAAS;oBAAuB,UAAU;oBAAkC,SAAS;uBAAyB,UAAU;;;;;;;kBAA+J,UAAU;;;;;;;;;;;;;aAAsQ,SAAS;gBAAmB,UAAU;gBAA8B,SAAS;mBAAqB,UAAU;;;;;;;UAA+H,SAAS;gBAAmB,UAAU;gBAA8B,SAAS;mBAAqB,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAT18B;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM;;gBALqB,UAAU;gBAClE,SAAS;;;;;;;;;;;;;;;;;;;;;;;gBAW8lC,UAAU;;oBAZzjC,UAAU;oBAClE,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;gBAW8vD,UAAU;;oBAZztD,UAAU;oBAClE,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;gBAD+C,UAAU;gBAClE,SAAS;;;;;;;;;;;;;;;gBAD+C,UAAU;gBAClE,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAS9B;AACD,MAAM,MAAM,0BAA0B,GAAG,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,0BAA0B,CAAC,CAAC,CAAC"}
|