@milaboratories/pl-middle-layer 1.43.87 → 1.43.89

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.
@@ -1 +1 @@
1
- {"version":3,"file":"registry.cjs","sources":["../../src/block_registry/registry.ts"],"sourcesContent":["import type { Dispatcher } from 'undici';\nimport { request } from 'undici';\nimport type {\n BlockPackDescriptionAbsolute } from '@platforma-sdk/block-tools';\nimport {\n BlockPackMetaEmbedAbsoluteBytes,\n RegistryV1,\n} from '@platforma-sdk/block-tools';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport YAML from 'yaml';\nimport { assertNever } from '@milaboratories/ts-helpers';\nimport { LegacyDevBlockPackFiles } from '../dev_env';\nimport { tryLoadPackDescription } from '@platforma-sdk/block-tools';\nimport type { V2RegistryProvider } from './registry-v2-provider';\nimport type {\n BlockPackId,\n BlockPackListing,\n BlockPackOverview,\n RegistryEntry,\n RegistryStatus,\n SingleBlockPackOverview } from '@milaboratories/pl-model-middle-layer';\nimport {\n AnyChannel,\n StableChannel,\n} from '@milaboratories/pl-model-middle-layer';\n\nasync function getFileContent(path: string) {\n try {\n return await fs.promises.readFile(path, 'utf8');\n } catch (error: unknown) {\n if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {\n return undefined;\n }\n throw error;\n }\n}\n\nasync function getFileStat(path: string) {\n try {\n return await fs.promises.stat(path, { bigint: true });\n } catch (error: unknown) {\n if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {\n return undefined;\n }\n throw error;\n }\n}\n\nexport async function getDevV1PacketMtime(devPath: string): Promise<string> {\n let mtime = 0n;\n for (const f of LegacyDevBlockPackFiles) {\n const fullPath = path.join(devPath, ...f);\n const stat = await getFileStat(fullPath);\n if (stat === undefined) continue;\n if (mtime < stat.mtimeNs) mtime = stat.mtimeNs;\n }\n return mtime.toString();\n}\n\nexport async function getDevV2PacketMtime(\n description: BlockPackDescriptionAbsolute,\n): Promise<string> {\n const wfStats = await fs.promises.stat(description.components.workflow.main.file, {\n bigint: true,\n });\n const modelStats = await fs.promises.stat(description.components.model.file, { bigint: true });\n return (wfStats.mtimeNs > modelStats.mtimeNs ? wfStats.mtimeNs : modelStats.mtimeNs).toString();\n}\n\nexport class BlockPackRegistry {\n constructor(\n private readonly v2Provider: V2RegistryProvider,\n private readonly registries: RegistryEntry[],\n private readonly http?: Dispatcher,\n ) {}\n\n private async getPackagesForRoot(regEntry: RegistryEntry): Promise<BlockPackOverview[]> {\n const result: BlockPackOverview[] = [];\n const regSpec = regEntry.spec;\n switch (regSpec.type) {\n case 'remote-v1':\n {\n const httpOptions = this.http !== undefined ? { dispatcher: this.http } : {};\n\n const overviewResponse = await request(\n `${regSpec.url}/${RegistryV1.GlobalOverviewPath}`,\n httpOptions,\n );\n const overview = (await overviewResponse.body.json()) as RegistryV1.GlobalOverview;\n for (const overviewEntry of overview) {\n const { organization, package: pkg, latestMeta, latestVersion } = overviewEntry;\n const id = {\n organization,\n name: pkg,\n version: latestVersion,\n };\n const latestOverview: SingleBlockPackOverview = {\n id,\n meta: {\n title: latestMeta['title'] ?? 'No title',\n description: latestMeta['description'] ?? 'No Description',\n organization: {\n name: organization,\n url: 'https://unknown.com',\n },\n },\n spec: {\n type: 'from-registry-v1',\n id,\n registryUrl: regSpec.url,\n },\n };\n result.push({\n registryId: regEntry.id,\n id,\n latestByChannel: {\n [AnyChannel]: latestOverview,\n [StableChannel]: latestOverview,\n },\n allVersions: overviewEntry.allVersions.map((v) => ({ version: v, channels: [] })),\n });\n }\n return result;\n }\n\n case 'remote-v2':\n return (await this.v2Provider.getRegistry(regSpec.url).listBlockPacks())\n .map((e) => ({ ...e, registryId: regEntry.id }));\n // e.latestByChannel[StableChannel]\n // ? {\n // ...e,\n // registryId: regEntry.id,\n // }\n // : {\n // ...e,\n // latestByChannel: {\n // ...e.latestByChannel,\n // [StableChannel]: ((s: SingleBlockPackOverview) => {\n // if (s.spec.type === 'from-registry-v2') {\n // return { ...s, spec: { ...s.spec, channel: StableChannel } };\n // }\n\n // return s;\n // })(e.latestByChannel[AnyChannel]),\n // },\n // registryId: regEntry.id,\n // },\n\n case 'local-dev':\n for (const entry of await fs.promises.readdir(regSpec.path, { withFileTypes: true })) {\n if (!entry.isDirectory()) continue;\n const devPath = path.join(regSpec.path, entry.name);\n\n const legacyYamlContent = await getFileContent(\n path.join(devPath, RegistryV1.PlPackageYamlConfigFile),\n );\n if (legacyYamlContent !== undefined) {\n const config = RegistryV1.PlPackageConfigData.parse(YAML.parse(legacyYamlContent));\n\n const mtime = await getDevV1PacketMtime(devPath);\n\n const id = {\n organization: config.organization,\n name: config.package,\n version: 'DEV',\n };\n\n const latestOverview: SingleBlockPackOverview = {\n id,\n meta: {\n title: (config.meta['title'] as string) ?? 'No title',\n description: (config.meta['description'] as string) ?? 'No Description',\n organization: {\n name: config.organization,\n url: 'https://unknown.com',\n },\n },\n spec: {\n type: 'dev-v2',\n folder: devPath,\n mtime,\n },\n };\n\n result.push({\n registryId: regEntry.id,\n id,\n latestByChannel: {\n [AnyChannel]: latestOverview,\n [StableChannel]: latestOverview,\n },\n allVersions: [],\n });\n } else {\n let actualDevPath = devPath;\n let v2Description = await tryLoadPackDescription(actualDevPath);\n\n if (v2Description === undefined)\n // iterating over expected subfolder names where block developer may put root block-pack package\n for (const bpSubfolder of ['block', 'meta']) {\n actualDevPath = path.join(devPath, bpSubfolder);\n v2Description = await tryLoadPackDescription(actualDevPath);\n if (v2Description !== undefined) break;\n }\n\n if (v2Description !== undefined) {\n const mtime = await getDevV2PacketMtime(v2Description);\n\n const latestOverview: SingleBlockPackOverview = {\n id: v2Description.id,\n meta: await BlockPackMetaEmbedAbsoluteBytes.parseAsync(v2Description.meta),\n featureFlags: v2Description.featureFlags,\n spec: {\n type: 'dev-v2',\n folder: actualDevPath,\n mtime,\n },\n };\n\n result.push({\n registryId: regEntry.id,\n id: v2Description.id,\n latestByChannel: {\n [AnyChannel]: latestOverview,\n [StableChannel]: latestOverview,\n },\n allVersions: [],\n });\n }\n }\n\n continue;\n }\n return result;\n default:\n return assertNever(regSpec);\n }\n }\n\n public async listBlockPacks(): Promise<BlockPackListing> {\n const blockPacks: BlockPackOverview[] = [];\n const registries: RegistryStatus[] = [];\n for (const regSpecs of this.registries) {\n registries.push({ ...regSpecs, status: 'online' });\n blockPacks.push(...(await this.getPackagesForRoot(regSpecs)));\n }\n return { registries, blockPacks };\n }\n\n public async getOverview(\n registryId: string,\n blockId: BlockPackId,\n channel: string,\n ): Promise<SingleBlockPackOverview> {\n const regSpec = this.registries.find((reg) => reg.id === registryId)?.spec;\n if (!regSpec) throw new Error(`Registry with id \"${registryId}\" not found`);\n if (regSpec.type !== 'remote-v2')\n throw new Error(\n `Only \"remote-v2\" registries support specific package version overview retrieval.`,\n );\n const reg = this.v2Provider.getRegistry(regSpec.url);\n return await reg.getSpecificOverview(blockId, channel);\n }\n}\n"],"names":["LegacyDevBlockPackFiles","request","RegistryV1","AnyChannel","StableChannel","tryLoadPackDescription","BlockPackMetaEmbedAbsoluteBytes","assertNever"],"mappings":"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"}
1
+ {"version":3,"file":"registry.cjs","sources":["../../src/block_registry/registry.ts"],"sourcesContent":["import type { Dispatcher } from 'undici';\nimport { request } from 'undici';\nimport type {\n BlockPackDescriptionAbsolute } from '@platforma-sdk/block-tools';\nimport {\n BlockPackMetaEmbedAbsoluteBytes,\n RegistryV1,\n} from '@platforma-sdk/block-tools';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport YAML from 'yaml';\nimport { assertNever } from '@milaboratories/ts-helpers';\nimport { LegacyDevBlockPackFiles } from '../dev_env';\nimport { tryLoadPackDescription } from '@platforma-sdk/block-tools';\nimport type { V2RegistryProvider } from './registry-v2-provider';\nimport type {\n BlockPackId,\n BlockPackListing,\n BlockPackOverview,\n RegistryEntry,\n RegistryStatus,\n SingleBlockPackOverview } from '@milaboratories/pl-model-middle-layer';\nimport {\n AnyChannel,\n StableChannel,\n} from '@milaboratories/pl-model-middle-layer';\n\nasync function getFileContent(path: string) {\n try {\n return await fs.promises.readFile(path, 'utf8');\n } catch (error: unknown) {\n if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {\n return undefined;\n }\n throw error;\n }\n}\n\nasync function getFileStat(path: string) {\n try {\n return await fs.promises.stat(path, { bigint: true });\n } catch (error: unknown) {\n if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {\n return undefined;\n }\n throw error;\n }\n}\n\nexport async function getDevV1PacketMtime(devPath: string): Promise<string> {\n let mtime = 0n;\n for (const f of LegacyDevBlockPackFiles) {\n const fullPath = path.join(devPath, ...f);\n const stat = await getFileStat(fullPath);\n if (stat === undefined) continue;\n if (mtime < stat.mtimeNs) mtime = stat.mtimeNs;\n }\n return mtime.toString();\n}\n\nexport async function getDevV2PacketMtime(\n description: BlockPackDescriptionAbsolute,\n): Promise<string> {\n const wfStats = await fs.promises.stat(description.components.workflow.main.file, {\n bigint: true,\n });\n const modelStats = await fs.promises.stat(description.components.model.file, { bigint: true });\n return (wfStats.mtimeNs > modelStats.mtimeNs ? wfStats.mtimeNs : modelStats.mtimeNs).toString();\n}\n\nexport class BlockPackRegistry {\n constructor(\n private readonly v2Provider: V2RegistryProvider,\n private readonly registries: RegistryEntry[],\n private readonly http?: Dispatcher,\n ) {}\n\n private async getPackagesForRoot(regEntry: RegistryEntry): Promise<BlockPackOverview[]> {\n const result: BlockPackOverview[] = [];\n const regSpec = regEntry.spec;\n switch (regSpec.type) {\n case 'remote-v1':\n {\n const httpOptions = this.http !== undefined ? { dispatcher: this.http } : {};\n\n const overviewResponse = await request(\n `${regSpec.url}/${RegistryV1.GlobalOverviewPath}`,\n httpOptions,\n );\n const overview = (await overviewResponse.body.json()) as RegistryV1.GlobalOverview;\n for (const overviewEntry of overview) {\n const { organization, package: pkg, latestMeta, latestVersion } = overviewEntry;\n const id = {\n organization,\n name: pkg,\n version: latestVersion,\n };\n const latestOverview: SingleBlockPackOverview = {\n id,\n meta: {\n title: (latestMeta['title'] as string | undefined) ?? 'No title',\n description: (latestMeta['description'] as string | undefined) ?? 'No Description',\n organization: {\n name: organization,\n url: 'https://unknown.com',\n },\n },\n spec: {\n type: 'from-registry-v1',\n id,\n registryUrl: regSpec.url,\n },\n };\n result.push({\n registryId: regEntry.id,\n id,\n latestByChannel: {\n [AnyChannel]: latestOverview,\n [StableChannel]: latestOverview,\n },\n allVersions: overviewEntry.allVersions.map((v) => ({ version: v, channels: [] })),\n });\n }\n return result;\n }\n\n case 'remote-v2':\n return (await this.v2Provider.getRegistry(regSpec.url).listBlockPacks())\n .map((e) => ({ ...e, registryId: regEntry.id }));\n // e.latestByChannel[StableChannel]\n // ? {\n // ...e,\n // registryId: regEntry.id,\n // }\n // : {\n // ...e,\n // latestByChannel: {\n // ...e.latestByChannel,\n // [StableChannel]: ((s: SingleBlockPackOverview) => {\n // if (s.spec.type === 'from-registry-v2') {\n // return { ...s, spec: { ...s.spec, channel: StableChannel } };\n // }\n\n // return s;\n // })(e.latestByChannel[AnyChannel]),\n // },\n // registryId: regEntry.id,\n // },\n\n case 'local-dev':\n for (const entry of await fs.promises.readdir(regSpec.path, { withFileTypes: true })) {\n if (!entry.isDirectory()) continue;\n const devPath = path.join(regSpec.path, entry.name);\n\n const legacyYamlContent = await getFileContent(\n path.join(devPath, RegistryV1.PlPackageYamlConfigFile),\n );\n if (legacyYamlContent !== undefined) {\n const config = RegistryV1.PlPackageConfigData.parse(YAML.parse(legacyYamlContent));\n\n const mtime = await getDevV1PacketMtime(devPath);\n\n const id = {\n organization: config.organization,\n name: config.package,\n version: 'DEV',\n };\n\n const latestOverview: SingleBlockPackOverview = {\n id,\n meta: {\n title: (config.meta['title'] as string) ?? 'No title',\n description: (config.meta['description'] as string) ?? 'No Description',\n organization: {\n name: config.organization,\n url: 'https://unknown.com',\n },\n },\n spec: {\n type: 'dev-v2',\n folder: devPath,\n mtime,\n },\n };\n\n result.push({\n registryId: regEntry.id,\n id,\n latestByChannel: {\n [AnyChannel]: latestOverview,\n [StableChannel]: latestOverview,\n },\n allVersions: [],\n });\n } else {\n let actualDevPath = devPath;\n let v2Description = await tryLoadPackDescription(actualDevPath);\n\n if (v2Description === undefined)\n // iterating over expected subfolder names where block developer may put root block-pack package\n for (const bpSubfolder of ['block', 'meta']) {\n actualDevPath = path.join(devPath, bpSubfolder);\n v2Description = await tryLoadPackDescription(actualDevPath);\n if (v2Description !== undefined) break;\n }\n\n if (v2Description !== undefined) {\n const mtime = await getDevV2PacketMtime(v2Description);\n\n const latestOverview: SingleBlockPackOverview = {\n id: v2Description.id,\n meta: await BlockPackMetaEmbedAbsoluteBytes.parseAsync(v2Description.meta),\n featureFlags: v2Description.featureFlags,\n spec: {\n type: 'dev-v2',\n folder: actualDevPath,\n mtime,\n },\n };\n\n result.push({\n registryId: regEntry.id,\n id: v2Description.id,\n latestByChannel: {\n [AnyChannel]: latestOverview,\n [StableChannel]: latestOverview,\n },\n allVersions: [],\n });\n }\n }\n\n continue;\n }\n return result;\n default:\n return assertNever(regSpec);\n }\n }\n\n public async listBlockPacks(): Promise<BlockPackListing> {\n const blockPacks: BlockPackOverview[] = [];\n const registries: RegistryStatus[] = [];\n for (const regSpecs of this.registries) {\n registries.push({ ...regSpecs, status: 'online' });\n blockPacks.push(...(await this.getPackagesForRoot(regSpecs)));\n }\n return { registries, blockPacks };\n }\n\n public async getOverview(\n registryId: string,\n blockId: BlockPackId,\n channel: string,\n ): Promise<SingleBlockPackOverview> {\n const regSpec = this.registries.find((reg) => reg.id === registryId)?.spec;\n if (!regSpec) throw new Error(`Registry with id \"${registryId}\" not found`);\n if (regSpec.type !== 'remote-v2')\n throw new Error(\n `Only \"remote-v2\" registries support specific package version overview retrieval.`,\n );\n const reg = this.v2Provider.getRegistry(regSpec.url);\n return await reg.getSpecificOverview(blockId, channel);\n }\n}\n"],"names":["LegacyDevBlockPackFiles","request","RegistryV1","AnyChannel","StableChannel","tryLoadPackDescription","BlockPackMetaEmbedAbsoluteBytes","assertNever"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sources":["../../src/block_registry/registry.ts"],"sourcesContent":["import type { Dispatcher } from 'undici';\nimport { request } from 'undici';\nimport type {\n BlockPackDescriptionAbsolute } from '@platforma-sdk/block-tools';\nimport {\n BlockPackMetaEmbedAbsoluteBytes,\n RegistryV1,\n} from '@platforma-sdk/block-tools';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport YAML from 'yaml';\nimport { assertNever } from '@milaboratories/ts-helpers';\nimport { LegacyDevBlockPackFiles } from '../dev_env';\nimport { tryLoadPackDescription } from '@platforma-sdk/block-tools';\nimport type { V2RegistryProvider } from './registry-v2-provider';\nimport type {\n BlockPackId,\n BlockPackListing,\n BlockPackOverview,\n RegistryEntry,\n RegistryStatus,\n SingleBlockPackOverview } from '@milaboratories/pl-model-middle-layer';\nimport {\n AnyChannel,\n StableChannel,\n} from '@milaboratories/pl-model-middle-layer';\n\nasync function getFileContent(path: string) {\n try {\n return await fs.promises.readFile(path, 'utf8');\n } catch (error: unknown) {\n if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {\n return undefined;\n }\n throw error;\n }\n}\n\nasync function getFileStat(path: string) {\n try {\n return await fs.promises.stat(path, { bigint: true });\n } catch (error: unknown) {\n if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {\n return undefined;\n }\n throw error;\n }\n}\n\nexport async function getDevV1PacketMtime(devPath: string): Promise<string> {\n let mtime = 0n;\n for (const f of LegacyDevBlockPackFiles) {\n const fullPath = path.join(devPath, ...f);\n const stat = await getFileStat(fullPath);\n if (stat === undefined) continue;\n if (mtime < stat.mtimeNs) mtime = stat.mtimeNs;\n }\n return mtime.toString();\n}\n\nexport async function getDevV2PacketMtime(\n description: BlockPackDescriptionAbsolute,\n): Promise<string> {\n const wfStats = await fs.promises.stat(description.components.workflow.main.file, {\n bigint: true,\n });\n const modelStats = await fs.promises.stat(description.components.model.file, { bigint: true });\n return (wfStats.mtimeNs > modelStats.mtimeNs ? wfStats.mtimeNs : modelStats.mtimeNs).toString();\n}\n\nexport class BlockPackRegistry {\n constructor(\n private readonly v2Provider: V2RegistryProvider,\n private readonly registries: RegistryEntry[],\n private readonly http?: Dispatcher,\n ) {}\n\n private async getPackagesForRoot(regEntry: RegistryEntry): Promise<BlockPackOverview[]> {\n const result: BlockPackOverview[] = [];\n const regSpec = regEntry.spec;\n switch (regSpec.type) {\n case 'remote-v1':\n {\n const httpOptions = this.http !== undefined ? { dispatcher: this.http } : {};\n\n const overviewResponse = await request(\n `${regSpec.url}/${RegistryV1.GlobalOverviewPath}`,\n httpOptions,\n );\n const overview = (await overviewResponse.body.json()) as RegistryV1.GlobalOverview;\n for (const overviewEntry of overview) {\n const { organization, package: pkg, latestMeta, latestVersion } = overviewEntry;\n const id = {\n organization,\n name: pkg,\n version: latestVersion,\n };\n const latestOverview: SingleBlockPackOverview = {\n id,\n meta: {\n title: latestMeta['title'] ?? 'No title',\n description: latestMeta['description'] ?? 'No Description',\n organization: {\n name: organization,\n url: 'https://unknown.com',\n },\n },\n spec: {\n type: 'from-registry-v1',\n id,\n registryUrl: regSpec.url,\n },\n };\n result.push({\n registryId: regEntry.id,\n id,\n latestByChannel: {\n [AnyChannel]: latestOverview,\n [StableChannel]: latestOverview,\n },\n allVersions: overviewEntry.allVersions.map((v) => ({ version: v, channels: [] })),\n });\n }\n return result;\n }\n\n case 'remote-v2':\n return (await this.v2Provider.getRegistry(regSpec.url).listBlockPacks())\n .map((e) => ({ ...e, registryId: regEntry.id }));\n // e.latestByChannel[StableChannel]\n // ? {\n // ...e,\n // registryId: regEntry.id,\n // }\n // : {\n // ...e,\n // latestByChannel: {\n // ...e.latestByChannel,\n // [StableChannel]: ((s: SingleBlockPackOverview) => {\n // if (s.spec.type === 'from-registry-v2') {\n // return { ...s, spec: { ...s.spec, channel: StableChannel } };\n // }\n\n // return s;\n // })(e.latestByChannel[AnyChannel]),\n // },\n // registryId: regEntry.id,\n // },\n\n case 'local-dev':\n for (const entry of await fs.promises.readdir(regSpec.path, { withFileTypes: true })) {\n if (!entry.isDirectory()) continue;\n const devPath = path.join(regSpec.path, entry.name);\n\n const legacyYamlContent = await getFileContent(\n path.join(devPath, RegistryV1.PlPackageYamlConfigFile),\n );\n if (legacyYamlContent !== undefined) {\n const config = RegistryV1.PlPackageConfigData.parse(YAML.parse(legacyYamlContent));\n\n const mtime = await getDevV1PacketMtime(devPath);\n\n const id = {\n organization: config.organization,\n name: config.package,\n version: 'DEV',\n };\n\n const latestOverview: SingleBlockPackOverview = {\n id,\n meta: {\n title: (config.meta['title'] as string) ?? 'No title',\n description: (config.meta['description'] as string) ?? 'No Description',\n organization: {\n name: config.organization,\n url: 'https://unknown.com',\n },\n },\n spec: {\n type: 'dev-v2',\n folder: devPath,\n mtime,\n },\n };\n\n result.push({\n registryId: regEntry.id,\n id,\n latestByChannel: {\n [AnyChannel]: latestOverview,\n [StableChannel]: latestOverview,\n },\n allVersions: [],\n });\n } else {\n let actualDevPath = devPath;\n let v2Description = await tryLoadPackDescription(actualDevPath);\n\n if (v2Description === undefined)\n // iterating over expected subfolder names where block developer may put root block-pack package\n for (const bpSubfolder of ['block', 'meta']) {\n actualDevPath = path.join(devPath, bpSubfolder);\n v2Description = await tryLoadPackDescription(actualDevPath);\n if (v2Description !== undefined) break;\n }\n\n if (v2Description !== undefined) {\n const mtime = await getDevV2PacketMtime(v2Description);\n\n const latestOverview: SingleBlockPackOverview = {\n id: v2Description.id,\n meta: await BlockPackMetaEmbedAbsoluteBytes.parseAsync(v2Description.meta),\n featureFlags: v2Description.featureFlags,\n spec: {\n type: 'dev-v2',\n folder: actualDevPath,\n mtime,\n },\n };\n\n result.push({\n registryId: regEntry.id,\n id: v2Description.id,\n latestByChannel: {\n [AnyChannel]: latestOverview,\n [StableChannel]: latestOverview,\n },\n allVersions: [],\n });\n }\n }\n\n continue;\n }\n return result;\n default:\n return assertNever(regSpec);\n }\n }\n\n public async listBlockPacks(): Promise<BlockPackListing> {\n const blockPacks: BlockPackOverview[] = [];\n const registries: RegistryStatus[] = [];\n for (const regSpecs of this.registries) {\n registries.push({ ...regSpecs, status: 'online' });\n blockPacks.push(...(await this.getPackagesForRoot(regSpecs)));\n }\n return { registries, blockPacks };\n }\n\n public async getOverview(\n registryId: string,\n blockId: BlockPackId,\n channel: string,\n ): Promise<SingleBlockPackOverview> {\n const regSpec = this.registries.find((reg) => reg.id === registryId)?.spec;\n if (!regSpec) throw new Error(`Registry with id \"${registryId}\" not found`);\n if (regSpec.type !== 'remote-v2')\n throw new Error(\n `Only \"remote-v2\" registries support specific package version overview retrieval.`,\n );\n const reg = this.v2Provider.getRegistry(regSpec.url);\n return await reg.getSpecificOverview(blockId, channel);\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"registry.js","sources":["../../src/block_registry/registry.ts"],"sourcesContent":["import type { Dispatcher } from 'undici';\nimport { request } from 'undici';\nimport type {\n BlockPackDescriptionAbsolute } from '@platforma-sdk/block-tools';\nimport {\n BlockPackMetaEmbedAbsoluteBytes,\n RegistryV1,\n} from '@platforma-sdk/block-tools';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport YAML from 'yaml';\nimport { assertNever } from '@milaboratories/ts-helpers';\nimport { LegacyDevBlockPackFiles } from '../dev_env';\nimport { tryLoadPackDescription } from '@platforma-sdk/block-tools';\nimport type { V2RegistryProvider } from './registry-v2-provider';\nimport type {\n BlockPackId,\n BlockPackListing,\n BlockPackOverview,\n RegistryEntry,\n RegistryStatus,\n SingleBlockPackOverview } from '@milaboratories/pl-model-middle-layer';\nimport {\n AnyChannel,\n StableChannel,\n} from '@milaboratories/pl-model-middle-layer';\n\nasync function getFileContent(path: string) {\n try {\n return await fs.promises.readFile(path, 'utf8');\n } catch (error: unknown) {\n if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {\n return undefined;\n }\n throw error;\n }\n}\n\nasync function getFileStat(path: string) {\n try {\n return await fs.promises.stat(path, { bigint: true });\n } catch (error: unknown) {\n if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {\n return undefined;\n }\n throw error;\n }\n}\n\nexport async function getDevV1PacketMtime(devPath: string): Promise<string> {\n let mtime = 0n;\n for (const f of LegacyDevBlockPackFiles) {\n const fullPath = path.join(devPath, ...f);\n const stat = await getFileStat(fullPath);\n if (stat === undefined) continue;\n if (mtime < stat.mtimeNs) mtime = stat.mtimeNs;\n }\n return mtime.toString();\n}\n\nexport async function getDevV2PacketMtime(\n description: BlockPackDescriptionAbsolute,\n): Promise<string> {\n const wfStats = await fs.promises.stat(description.components.workflow.main.file, {\n bigint: true,\n });\n const modelStats = await fs.promises.stat(description.components.model.file, { bigint: true });\n return (wfStats.mtimeNs > modelStats.mtimeNs ? wfStats.mtimeNs : modelStats.mtimeNs).toString();\n}\n\nexport class BlockPackRegistry {\n constructor(\n private readonly v2Provider: V2RegistryProvider,\n private readonly registries: RegistryEntry[],\n private readonly http?: Dispatcher,\n ) {}\n\n private async getPackagesForRoot(regEntry: RegistryEntry): Promise<BlockPackOverview[]> {\n const result: BlockPackOverview[] = [];\n const regSpec = regEntry.spec;\n switch (regSpec.type) {\n case 'remote-v1':\n {\n const httpOptions = this.http !== undefined ? { dispatcher: this.http } : {};\n\n const overviewResponse = await request(\n `${regSpec.url}/${RegistryV1.GlobalOverviewPath}`,\n httpOptions,\n );\n const overview = (await overviewResponse.body.json()) as RegistryV1.GlobalOverview;\n for (const overviewEntry of overview) {\n const { organization, package: pkg, latestMeta, latestVersion } = overviewEntry;\n const id = {\n organization,\n name: pkg,\n version: latestVersion,\n };\n const latestOverview: SingleBlockPackOverview = {\n id,\n meta: {\n title: (latestMeta['title'] as string | undefined) ?? 'No title',\n description: (latestMeta['description'] as string | undefined) ?? 'No Description',\n organization: {\n name: organization,\n url: 'https://unknown.com',\n },\n },\n spec: {\n type: 'from-registry-v1',\n id,\n registryUrl: regSpec.url,\n },\n };\n result.push({\n registryId: regEntry.id,\n id,\n latestByChannel: {\n [AnyChannel]: latestOverview,\n [StableChannel]: latestOverview,\n },\n allVersions: overviewEntry.allVersions.map((v) => ({ version: v, channels: [] })),\n });\n }\n return result;\n }\n\n case 'remote-v2':\n return (await this.v2Provider.getRegistry(regSpec.url).listBlockPacks())\n .map((e) => ({ ...e, registryId: regEntry.id }));\n // e.latestByChannel[StableChannel]\n // ? {\n // ...e,\n // registryId: regEntry.id,\n // }\n // : {\n // ...e,\n // latestByChannel: {\n // ...e.latestByChannel,\n // [StableChannel]: ((s: SingleBlockPackOverview) => {\n // if (s.spec.type === 'from-registry-v2') {\n // return { ...s, spec: { ...s.spec, channel: StableChannel } };\n // }\n\n // return s;\n // })(e.latestByChannel[AnyChannel]),\n // },\n // registryId: regEntry.id,\n // },\n\n case 'local-dev':\n for (const entry of await fs.promises.readdir(regSpec.path, { withFileTypes: true })) {\n if (!entry.isDirectory()) continue;\n const devPath = path.join(regSpec.path, entry.name);\n\n const legacyYamlContent = await getFileContent(\n path.join(devPath, RegistryV1.PlPackageYamlConfigFile),\n );\n if (legacyYamlContent !== undefined) {\n const config = RegistryV1.PlPackageConfigData.parse(YAML.parse(legacyYamlContent));\n\n const mtime = await getDevV1PacketMtime(devPath);\n\n const id = {\n organization: config.organization,\n name: config.package,\n version: 'DEV',\n };\n\n const latestOverview: SingleBlockPackOverview = {\n id,\n meta: {\n title: (config.meta['title'] as string) ?? 'No title',\n description: (config.meta['description'] as string) ?? 'No Description',\n organization: {\n name: config.organization,\n url: 'https://unknown.com',\n },\n },\n spec: {\n type: 'dev-v2',\n folder: devPath,\n mtime,\n },\n };\n\n result.push({\n registryId: regEntry.id,\n id,\n latestByChannel: {\n [AnyChannel]: latestOverview,\n [StableChannel]: latestOverview,\n },\n allVersions: [],\n });\n } else {\n let actualDevPath = devPath;\n let v2Description = await tryLoadPackDescription(actualDevPath);\n\n if (v2Description === undefined)\n // iterating over expected subfolder names where block developer may put root block-pack package\n for (const bpSubfolder of ['block', 'meta']) {\n actualDevPath = path.join(devPath, bpSubfolder);\n v2Description = await tryLoadPackDescription(actualDevPath);\n if (v2Description !== undefined) break;\n }\n\n if (v2Description !== undefined) {\n const mtime = await getDevV2PacketMtime(v2Description);\n\n const latestOverview: SingleBlockPackOverview = {\n id: v2Description.id,\n meta: await BlockPackMetaEmbedAbsoluteBytes.parseAsync(v2Description.meta),\n featureFlags: v2Description.featureFlags,\n spec: {\n type: 'dev-v2',\n folder: actualDevPath,\n mtime,\n },\n };\n\n result.push({\n registryId: regEntry.id,\n id: v2Description.id,\n latestByChannel: {\n [AnyChannel]: latestOverview,\n [StableChannel]: latestOverview,\n },\n allVersions: [],\n });\n }\n }\n\n continue;\n }\n return result;\n default:\n return assertNever(regSpec);\n }\n }\n\n public async listBlockPacks(): Promise<BlockPackListing> {\n const blockPacks: BlockPackOverview[] = [];\n const registries: RegistryStatus[] = [];\n for (const regSpecs of this.registries) {\n registries.push({ ...regSpecs, status: 'online' });\n blockPacks.push(...(await this.getPackagesForRoot(regSpecs)));\n }\n return { registries, blockPacks };\n }\n\n public async getOverview(\n registryId: string,\n blockId: BlockPackId,\n channel: string,\n ): Promise<SingleBlockPackOverview> {\n const regSpec = this.registries.find((reg) => reg.id === registryId)?.spec;\n if (!regSpec) throw new Error(`Registry with id \"${registryId}\" not found`);\n if (regSpec.type !== 'remote-v2')\n throw new Error(\n `Only \"remote-v2\" registries support specific package version overview retrieval.`,\n );\n const reg = this.v2Provider.getRegistry(regSpec.url);\n return await reg.getSpecificOverview(blockId, channel);\n }\n}\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@milaboratories/pl-middle-layer",
3
- "version": "1.43.87",
3
+ "version": "1.43.89",
4
4
  "description": "Pl Middle Layer",
5
5
  "engines": {
6
6
  "node": ">=22.19.0"
@@ -27,22 +27,22 @@
27
27
  "zod": "~3.23.8",
28
28
  "remeda": "^2.28.0",
29
29
  "@milaboratories/pl-http": "1.2.0",
30
- "@milaboratories/computable": "2.7.4",
30
+ "@platforma-sdk/block-tools": "2.6.27",
31
31
  "@milaboratories/resolve-helper": "1.1.1",
32
+ "@milaboratories/computable": "2.7.4",
32
33
  "@milaboratories/pl-client": "2.16.13",
33
- "@platforma-sdk/block-tools": "2.6.27",
34
- "@milaboratories/pl-drivers": "1.11.26",
34
+ "@milaboratories/pl-model-common": "1.21.10",
35
+ "@milaboratories/pl-drivers": "1.11.27",
35
36
  "@milaboratories/pl-model-middle-layer": "1.8.45",
36
37
  "@milaboratories/pl-model-backend": "1.1.30",
38
+ "@platforma-sdk/model": "1.48.2",
39
+ "@platforma-sdk/workflow-tengo": "5.7.0",
37
40
  "@milaboratories/pl-tree": "1.8.20",
38
- "@platforma-sdk/model": "1.47.5",
39
- "@milaboratories/pl-model-common": "1.21.10",
40
- "@milaboratories/ts-helpers": "1.5.4",
41
+ "@milaboratories/pl-deployments": "2.14.0",
41
42
  "@milaboratories/pl-config": "1.7.9",
42
43
  "@milaboratories/pl-errors": "1.1.45",
43
- "@platforma-sdk/workflow-tengo": "5.6.6",
44
- "@milaboratories/pl-deployments": "2.14.0",
45
- "@milaboratories/pf-driver": "1.0.10"
44
+ "@milaboratories/pf-driver": "1.0.11",
45
+ "@milaboratories/ts-helpers": "1.5.4"
46
46
  },
47
47
  "devDependencies": {
48
48
  "semver": "^7.7.2",
@@ -51,10 +51,10 @@
51
51
  "vitest": "^4.0.7",
52
52
  "@types/node": "~24.5.2",
53
53
  "tslib": "~2.7.0",
54
- "@milaboratories/build-configs": "1.1.0",
54
+ "@milaboratories/ts-builder": "1.2.0",
55
+ "@milaboratories/build-configs": "1.2.0",
55
56
  "@milaboratories/eslint-config": "1.0.5",
56
- "@milaboratories/ts-builder": "1.1.0",
57
- "@milaboratories/ts-configs": "1.1.0"
57
+ "@milaboratories/ts-configs": "1.2.0"
58
58
  },
59
59
  "scripts": {
60
60
  "type-check": "ts-builder types --target node",
@@ -98,8 +98,8 @@ export class BlockPackRegistry {
98
98
  const latestOverview: SingleBlockPackOverview = {
99
99
  id,
100
100
  meta: {
101
- title: latestMeta['title'] ?? 'No title',
102
- description: latestMeta['description'] ?? 'No Description',
101
+ title: (latestMeta['title'] as string | undefined) ?? 'No title',
102
+ description: (latestMeta['description'] as string | undefined) ?? 'No Description',
103
103
  organization: {
104
104
  name: organization,
105
105
  url: 'https://unknown.com',