@platforma-sdk/block-tools 2.3.5 → 2.3.6

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 CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var S=Object.defineProperty;var A=(r,e,a)=>e in r?S(r,e,{enumerable:!0,configurable:!0,writable:!0,value:a}):r[e]=a;var n=(r,e,a)=>A(r,typeof e!="symbol"?e+"":e,a);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("@oclif/core"),l=require("node:path"),u=require("node:fs");require("zod");require("mime-types");require("tar");require("@milaboratories/resolve-helper");const c=require("./config-CDLSqmC-.js"),O=require("@milaboratories/pl-model-middle-layer");require("canonicalize");const E=require("@milaboratories/ts-helpers-oclif"),N=require("yaml"),f=class f extends t.Command{async run(){const{flags:e}=await this.parse(f),a=l.resolve(e.modulePath),s=await c.loadPackDescriptionRaw(a),d=await c.BlockPackMetaEmbedAbsoluteBase64.parseAsync(c.BlockPackMetaDescription(a).parse(s.meta));await u.promises.writeFile(l.resolve(e.destination),JSON.stringify(d))}};n(f,"description","Extracts meta information from blocks package.json and outputs meta.json with embedded binary and textual information linked from the meta section."),n(f,"flags",{modulePath:t.Flags.string({char:"i",summary:"input module path",helpValue:"<path>",default:"."}),destination:t.Flags.string({char:"o",summary:"output meta.json file",helpValue:"<path>",required:!0})});let w=f;async function q(r){try{return await u.promises.readFile(r,"utf8")}catch(e){if(e.code==="ENOENT")return;throw e}}const g=class g extends t.Command{async run(){const{flags:e}=await this.parse(g),a=l.resolve(e.modulePath);let{model:s,platforma:d}=require(a);if(s||(s=d),!s)throw new Error('"model" export not found');const{config:i}=s;if(!i)throw new Error('Malformed "model" object, check it is created with "BlockModel" and ".done()" is executed as the call in the chain.');if(!("canRun"in i||"inputsValid"in i)||!("outputs"in i)||!("sections"in i))throw new Error('"config" has unexpected structure');const m=await q(e.sourceBundle);m!==void 0&&(i.code={type:"plain",content:m}),await u.promises.writeFile(l.resolve(e.destination),JSON.stringify(i))}};n(g,"description","Extracts and outputs block model JSON from pre-built block model module"),n(g,"flags",{modulePath:t.Flags.string({char:"i",summary:"input module path",helpValue:"<path>",default:"."}),sourceBundle:t.Flags.string({char:"b",summary:"bundled model code to embed into the model for callback-based rendering to work",helpValue:"<path>",default:"./dist/bundle.js"}),destination:t.Flags.string({char:"o",summary:"output model file",helpValue:"<path>",default:"./dist/model.json"})});let k=g;const p=class p extends t.Command{async run(){const{flags:e}=await this.parse(p),a=await c.loadPackDescription(l.resolve(e.modulePath));await c.buildBlockPackDist(a,l.resolve(e.destinationPath))}};n(p,"description","Builds block pack and outputs a block pack manifest consolidating all references assets into a single folder"),n(p,"flags",{modulePath:t.Flags.string({char:"i",summary:"input module path",helpValue:"<path>",default:"."}),destinationPath:t.Flags.string({char:"o",summary:"output folder",helpValue:"<path>",default:"./block-pack"})});let F=p;const h=class h extends t.Command{async run(){const{flags:e}=await this.parse(h),a=l.resolve(e.manifest),s=O.BlockPackManifest.parse(JSON.parse(await u.promises.readFile(a,{encoding:"utf-8"}))),d=l.dirname(a);this.log(`Manifest root = ${d}`);const i=c.storageByUrl(e.registry),m=new c.BlockRegistryV2(i,new E.OclifLoggerAdapter(this));await m.publishPackage(s,async o=>Buffer.from(await u.promises.readFile(l.resolve(d,o)))),e.refresh&&await m.updateIfNeeded()}};n(h,"description","Publishes the block package and refreshes the registry (for v2 block-pack schema)"),n(h,"flags",{registry:t.Flags.string({char:"r",summary:"full address of the registry",helpValue:"<address>",env:"PL_REGISTRY",required:!0}),manifest:t.Flags.file({char:"m",summary:"manifest file path",exists:!0,default:`./block-pack/${c.ManifestFileName}`}),refresh:t.Flags.boolean({summary:"refresh repository after adding the package",default:!0,allowNo:!0,env:"PL_REGISTRY_REFRESH"})});let b=h;function C(r){const e=r.match(/(?<destName>[^\/\\]+)=(?<src>.*)/);if(e){const{src:a,destName:s}=e.groups;return{src:a,destName:s}}else return{src:r,destName:l.basename(r)}}const x=t.Flags.custom({summary:"target files to upload",helpValue:"file_path | package_name=file_path",parse:async r=>C(r)}),L=["registry","organization","package","version"],y=class y extends t.Command{async run(){const{flags:e}=await this.parse(y),a=c.PlRegPackageConfigDataShard.parse({});for(const o of L)e[o]&&(a[o]=e[o]);e.meta&&(e.meta.endsWith(".json")?a.meta=JSON.parse(await u.promises.readFile(e.meta,{encoding:"utf-8"})):e.meta.endsWith(".yaml")&&(a.meta=N.parse(await u.promises.readFile(e.meta,{encoding:"utf-8"}))));for(const o of e.file)a.files[o.destName]=o.src;const s=await c.getConfig(a);this.log(N.stringify(s.conf));const d=s.createRegistry(new E.OclifLoggerAdapter(this)),i=s.fullPackageName,m=d.constructNewPackage(i);for(const[o,v]of Object.entries(s.conf.files)){this.log(`Uploading ${v} -> ${o} ...`);const R=await u.promises.readFile(v);await m.addFile(o,R)}this.log("Uploading meta information..."),await m.writeMeta(s.conf.meta),await m.finish(),e.refresh&&await d.updateIfNeeded()}};n(y,"description","Uploads V1 package and refreshes the registry"),n(y,"flags",{registry:t.Flags.string({char:"r",summary:"full address of the registry or alias from .pl.reg",helpValue:"<address|alias>",env:"PL_REGISTRY"}),organization:t.Flags.string({char:"o",summary:"target organisation",env:"PL_PACKAGE_ORGANIZATION"}),package:t.Flags.string({char:"p",summary:"target package",env:"PL_PACKAGE_NAME"}),version:t.Flags.string({char:"v",summary:"target version",env:"PL_PACKAGE_VERSION"}),meta:t.Flags.file({char:"m",summary:"json file containing meta information to associate with tha package",exists:!0}),file:x({char:"f",summary:"package files",multiple:!0,default:[]}),refresh:t.Flags.boolean({summary:"refresh repository after adding the package",default:!0,allowNo:!0,env:"PL_REGISTRY_REFRESH"})});let P=y;const M={"upload-package-v1":P,pack:F,"build-model":k,"build-meta":w,publish:b};exports.COMMANDS=M;
1
+ "use strict";var S=Object.defineProperty;var q=(r,e,a)=>e in r?S(r,e,{enumerable:!0,configurable:!0,writable:!0,value:a}):r[e]=a;var n=(r,e,a)=>q(r,typeof e!="symbol"?e+"":e,a);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("@oclif/core"),l=require("node:path"),m=require("node:fs");require("zod");require("mime-types");require("tar");require("@milaboratories/resolve-helper");const c=require("./config-CDLSqmC-.js"),A=require("@milaboratories/pl-model-middle-layer");require("canonicalize");require("lru-cache");const E=require("@milaboratories/ts-helpers-oclif"),N=require("yaml"),f=class f extends t.Command{async run(){const{flags:e}=await this.parse(f),a=l.resolve(e.modulePath),s=await c.loadPackDescriptionRaw(a),d=await c.BlockPackMetaEmbedAbsoluteBase64.parseAsync(c.BlockPackMetaDescription(a).parse(s.meta));await m.promises.writeFile(l.resolve(e.destination),JSON.stringify(d))}};n(f,"description","Extracts meta information from blocks package.json and outputs meta.json with embedded binary and textual information linked from the meta section."),n(f,"flags",{modulePath:t.Flags.string({char:"i",summary:"input module path",helpValue:"<path>",default:"."}),destination:t.Flags.string({char:"o",summary:"output meta.json file",helpValue:"<path>",required:!0})});let w=f;async function O(r){try{return await m.promises.readFile(r,"utf8")}catch(e){if(e.code==="ENOENT")return;throw e}}const g=class g extends t.Command{async run(){const{flags:e}=await this.parse(g),a=l.resolve(e.modulePath);let{model:s,platforma:d}=require(a);if(s||(s=d),!s)throw new Error('"model" export not found');const{config:i}=s;if(!i)throw new Error('Malformed "model" object, check it is created with "BlockModel" and ".done()" is executed as the call in the chain.');if(!("canRun"in i||"inputsValid"in i)||!("outputs"in i)||!("sections"in i))throw new Error('"config" has unexpected structure');const u=await O(e.sourceBundle);u!==void 0&&(i.code={type:"plain",content:u}),await m.promises.writeFile(l.resolve(e.destination),JSON.stringify(i))}};n(g,"description","Extracts and outputs block model JSON from pre-built block model module"),n(g,"flags",{modulePath:t.Flags.string({char:"i",summary:"input module path",helpValue:"<path>",default:"."}),sourceBundle:t.Flags.string({char:"b",summary:"bundled model code to embed into the model for callback-based rendering to work",helpValue:"<path>",default:"./dist/bundle.js"}),destination:t.Flags.string({char:"o",summary:"output model file",helpValue:"<path>",default:"./dist/model.json"})});let k=g;const p=class p extends t.Command{async run(){const{flags:e}=await this.parse(p),a=await c.loadPackDescription(l.resolve(e.modulePath));await c.buildBlockPackDist(a,l.resolve(e.destinationPath))}};n(p,"description","Builds block pack and outputs a block pack manifest consolidating all references assets into a single folder"),n(p,"flags",{modulePath:t.Flags.string({char:"i",summary:"input module path",helpValue:"<path>",default:"."}),destinationPath:t.Flags.string({char:"o",summary:"output folder",helpValue:"<path>",default:"./block-pack"})});let F=p;const h=class h extends t.Command{async run(){const{flags:e}=await this.parse(h),a=l.resolve(e.manifest),s=A.BlockPackManifest.parse(JSON.parse(await m.promises.readFile(a,{encoding:"utf-8"}))),d=l.dirname(a);this.log(`Manifest root = ${d}`);const i=c.storageByUrl(e.registry),u=new c.BlockRegistryV2(i,new E.OclifLoggerAdapter(this));await u.publishPackage(s,async o=>Buffer.from(await m.promises.readFile(l.resolve(d,o)))),e.refresh&&await u.updateIfNeeded()}};n(h,"description","Publishes the block package and refreshes the registry (for v2 block-pack schema)"),n(h,"flags",{registry:t.Flags.string({char:"r",summary:"full address of the registry",helpValue:"<address>",env:"PL_REGISTRY",required:!0}),manifest:t.Flags.file({char:"m",summary:"manifest file path",exists:!0,default:`./block-pack/${c.ManifestFileName}`}),refresh:t.Flags.boolean({summary:"refresh repository after adding the package",default:!0,allowNo:!0,env:"PL_REGISTRY_REFRESH"})});let b=h;function C(r){const e=r.match(/(?<destName>[^\/\\]+)=(?<src>.*)/);if(e){const{src:a,destName:s}=e.groups;return{src:a,destName:s}}else return{src:r,destName:l.basename(r)}}const x=t.Flags.custom({summary:"target files to upload",helpValue:"file_path | package_name=file_path",parse:async r=>C(r)}),L=["registry","organization","package","version"],y=class y extends t.Command{async run(){const{flags:e}=await this.parse(y),a=c.PlRegPackageConfigDataShard.parse({});for(const o of L)e[o]&&(a[o]=e[o]);e.meta&&(e.meta.endsWith(".json")?a.meta=JSON.parse(await m.promises.readFile(e.meta,{encoding:"utf-8"})):e.meta.endsWith(".yaml")&&(a.meta=N.parse(await m.promises.readFile(e.meta,{encoding:"utf-8"}))));for(const o of e.file)a.files[o.destName]=o.src;const s=await c.getConfig(a);this.log(N.stringify(s.conf));const d=s.createRegistry(new E.OclifLoggerAdapter(this)),i=s.fullPackageName,u=d.constructNewPackage(i);for(const[o,v]of Object.entries(s.conf.files)){this.log(`Uploading ${v} -> ${o} ...`);const R=await m.promises.readFile(v);await u.addFile(o,R)}this.log("Uploading meta information..."),await u.writeMeta(s.conf.meta),await u.finish(),e.refresh&&await d.updateIfNeeded()}};n(y,"description","Uploads V1 package and refreshes the registry"),n(y,"flags",{registry:t.Flags.string({char:"r",summary:"full address of the registry or alias from .pl.reg",helpValue:"<address|alias>",env:"PL_REGISTRY"}),organization:t.Flags.string({char:"o",summary:"target organisation",env:"PL_PACKAGE_ORGANIZATION"}),package:t.Flags.string({char:"p",summary:"target package",env:"PL_PACKAGE_NAME"}),version:t.Flags.string({char:"v",summary:"target version",env:"PL_PACKAGE_VERSION"}),meta:t.Flags.file({char:"m",summary:"json file containing meta information to associate with tha package",exists:!0}),file:x({char:"f",summary:"package files",multiple:!0,default:[]}),refresh:t.Flags.boolean({summary:"refresh repository after adding the package",default:!0,allowNo:!0,env:"PL_REGISTRY_REFRESH"})});let P=y;const M={"upload-package-v1":P,pack:F,"build-model":k,"build-meta":w,publish:b};exports.COMMANDS=M;
2
2
  //# sourceMappingURL=cli.js.map
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sources":["../src/cmd/build-meta.ts","../src/cmd/build-model.ts","../src/cmd/pack-block.ts","../src/cmd/publish.ts","../src/registry_v1/flags.ts","../src/cmd/upload-package-v1.ts","../src/cmd/index.ts"],"sourcesContent":["import { Command, Flags } from '@oclif/core';\nimport path from 'path';\nimport fs from 'fs';\nimport { loadPackDescriptionRaw } from '../v2';\nimport { BlockPackMetaDescription, BlockPackMetaEmbedAbsoluteBase64 } from '../v2/model/block_meta';\n\nexport default class BuildMeta extends Command {\n static override description =\n 'Extracts meta information from blocks package.json and outputs meta.json with embedded binary ' +\n 'and textual information linked from the meta section.';\n\n static flags = {\n modulePath: Flags.string({\n char: 'i',\n summary: 'input module path',\n helpValue: '<path>',\n default: '.'\n }),\n\n destination: Flags.string({\n char: 'o',\n summary: 'output meta.json file',\n helpValue: '<path>',\n required: true\n })\n };\n\n public async run(): Promise<void> {\n const { flags } = await this.parse(BuildMeta);\n const modulePath = path.resolve(flags.modulePath);\n const descriptionRaw = await loadPackDescriptionRaw(modulePath);\n const metaEmbedded = await BlockPackMetaEmbedAbsoluteBase64.parseAsync(\n BlockPackMetaDescription(modulePath).parse(descriptionRaw.meta)\n );\n\n await fs.promises.writeFile(path.resolve(flags.destination), JSON.stringify(metaEmbedded));\n }\n}\n","import { Command, Flags } from '@oclif/core';\nimport fs from 'fs';\nimport path from 'path';\n\nasync function getFileContent(path: string) {\n try {\n return await fs.promises.readFile(path, 'utf8');\n } catch (error: any) {\n if (error.code === 'ENOENT') {\n return undefined;\n }\n throw error;\n }\n}\n\nexport default class BuildModel extends Command {\n static override description =\n 'Extracts and outputs block model JSON from pre-built block model module';\n\n static flags = {\n modulePath: Flags.string({\n char: 'i',\n summary: 'input module path',\n helpValue: '<path>',\n default: '.'\n }),\n\n sourceBundle: Flags.string({\n char: 'b',\n summary: 'bundled model code to embed into the model for callback-based rendering to work',\n helpValue: '<path>',\n default: './dist/bundle.js'\n }),\n\n destination: Flags.string({\n char: 'o',\n summary: 'output model file',\n helpValue: '<path>',\n default: './dist/model.json'\n })\n };\n\n public async run(): Promise<void> {\n const { flags } = await this.parse(BuildModel);\n const modulePath = path.resolve(flags.modulePath); // i.e. folder with package.json file\n let { model, platforma } = require(modulePath);\n\n if (!model) model = platforma;\n if (!model) throw new Error('\"model\" export not found');\n\n const { config } = model;\n\n if (!config)\n throw new Error(\n 'Malformed \"model\" object, check it is created with \"BlockModel\" ' +\n 'and \".done()\" is executed as the call in the chain.'\n );\n\n if (\n !('canRun' in config || 'inputsValid' in config) ||\n !('outputs' in config) ||\n !('sections' in config)\n )\n throw new Error('\"config\" has unexpected structure');\n\n const code = await getFileContent(flags.sourceBundle);\n if (code !== undefined) {\n config.code = {\n type: 'plain',\n content: code\n };\n }\n\n await fs.promises.writeFile(path.resolve(flags.destination), JSON.stringify(config));\n }\n}\n","import { Command, Flags } from '@oclif/core';\nimport { loadPackDescription } from '../v2/source_package';\nimport path from 'path';\nimport { buildBlockPackDist } from '../v2/build_dist';\n\nexport default class PackBlock extends Command {\n static description =\n 'Builds block pack and outputs a block pack manifest consolidating all ' +\n 'references assets into a single folder';\n\n static flags = {\n modulePath: Flags.string({\n char: 'i',\n summary: 'input module path',\n helpValue: '<path>',\n default: '.'\n }),\n\n destinationPath: Flags.string({\n char: 'o',\n summary: 'output folder',\n helpValue: '<path>',\n default: './block-pack'\n })\n };\n\n public async run(): Promise<void> {\n const { flags } = await this.parse(PackBlock);\n const description = await loadPackDescription(path.resolve(flags.modulePath));\n await buildBlockPackDist(description, path.resolve(flags.destinationPath));\n }\n}\n","import { Command, Flags } from '@oclif/core';\nimport fs from 'node:fs';\nimport { OclifLoggerAdapter } from '@milaboratories/ts-helpers-oclif';\nimport { ManifestFileName } from '../v2/registry/schema_public';\nimport { BlockPackManifest } from '@milaboratories/pl-model-middle-layer';\nimport { storageByUrl } from '../io/storage';\nimport { BlockRegistryV2 } from '../v2/registry/registry';\nimport path from 'node:path';\n\nexport default class Publish extends Command {\n static description =\n 'Publishes the block package and refreshes the registry (for v2 block-pack schema)';\n\n static flags = {\n registry: Flags.string({\n char: 'r',\n summary: 'full address of the registry',\n helpValue: '<address>',\n env: 'PL_REGISTRY',\n required: true\n }),\n\n manifest: Flags.file({\n char: 'm',\n summary: 'manifest file path',\n exists: true,\n default: `./block-pack/${ManifestFileName}`\n }),\n\n refresh: Flags.boolean({\n summary: 'refresh repository after adding the package',\n default: true,\n allowNo: true,\n env: 'PL_REGISTRY_REFRESH'\n })\n };\n\n public async run(): Promise<void> {\n const { flags } = await this.parse(Publish);\n\n // if (flags.meta) {\n // if (flags.meta.endsWith('.json'))\n // configFromFlags.meta = JSON.parse(\n // await fs.promises.readFile(flags.meta, { encoding: 'utf-8' })\n // );\n // else if (flags.meta.endsWith('.yaml'))\n // configFromFlags.meta = YAML.parse(\n // await fs.promises.readFile(flags.meta, { encoding: 'utf-8' })\n // );\n // }\n\n const manifestPath = path.resolve(flags.manifest);\n const manifest = BlockPackManifest.parse(\n JSON.parse(await fs.promises.readFile(manifestPath, { encoding: 'utf-8' }))\n );\n const manifestRoot = path.dirname(manifestPath);\n\n this.log(`Manifest root = ${manifestRoot}`);\n\n const storage = storageByUrl(flags.registry);\n const registry = new BlockRegistryV2(storage, new OclifLoggerAdapter(this));\n\n await registry.publishPackage(manifest, async (file) =>\n Buffer.from(await fs.promises.readFile(path.resolve(manifestRoot, file)))\n );\n\n if (flags.refresh) await registry.updateIfNeeded();\n }\n}\n","import { Flags } from '@oclif/core';\nimport path from 'node:path';\n\nexport interface TargetFile {\n src: string;\n destName: string;\n}\n\nfunction parseTargetFile(arg: string): TargetFile {\n const match = arg.match(/(?<destName>[^\\/\\\\]+)=(?<src>.*)/);\n if (match) {\n const { src, destName } = match.groups!;\n return { src, destName };\n } else {\n return { src: arg, destName: path.basename(arg) };\n }\n}\n\nexport const targetFile = Flags.custom<TargetFile>({\n summary: 'target files to upload',\n helpValue: 'file_path | package_name=file_path',\n parse: async (arg) => parseTargetFile(arg)\n});\n","import { Command, Flags } from '@oclif/core';\nimport { getConfig } from '../registry_v1/config';\nimport { targetFile } from '../registry_v1/flags';\nimport fs from 'node:fs';\nimport YAML from 'yaml';\nimport { PlRegPackageConfigDataShard } from '../registry_v1/config_schema';\nimport { OclifLoggerAdapter } from '@milaboratories/ts-helpers-oclif';\n\ntype BasicConfigField = keyof PlRegPackageConfigDataShard &\n ('registry' | 'organization' | 'package' | 'version');\nconst BasicConfigFields: BasicConfigField[] = ['registry', 'organization', 'package', 'version'];\n\nexport default class UploadPackageV1 extends Command {\n static description = 'Uploads V1 package and refreshes the registry';\n\n static flags = {\n registry: Flags.string({\n char: 'r',\n summary: 'full address of the registry or alias from .pl.reg',\n helpValue: '<address|alias>',\n env: 'PL_REGISTRY'\n }),\n\n organization: Flags.string({\n char: 'o',\n summary: 'target organisation',\n env: 'PL_PACKAGE_ORGANIZATION'\n }),\n\n package: Flags.string({\n char: 'p',\n summary: 'target package',\n env: 'PL_PACKAGE_NAME'\n }),\n\n version: Flags.string({\n char: 'v',\n summary: 'target version',\n env: 'PL_PACKAGE_VERSION'\n }),\n\n meta: Flags.file({\n char: 'm',\n summary: 'json file containing meta information to associate with tha package',\n exists: true\n }),\n\n file: targetFile({\n char: 'f',\n summary: 'package files',\n multiple: true,\n default: []\n }),\n\n refresh: Flags.boolean({\n summary: 'refresh repository after adding the package',\n default: true,\n allowNo: true,\n env: 'PL_REGISTRY_REFRESH'\n })\n };\n\n public async run(): Promise<void> {\n const { flags } = await this.parse(UploadPackageV1);\n const configFromFlags: PlRegPackageConfigDataShard = PlRegPackageConfigDataShard.parse({});\n\n for (const field of BasicConfigFields) if (flags[field]) configFromFlags[field] = flags[field];\n\n if (flags.meta) {\n if (flags.meta.endsWith('.json'))\n configFromFlags.meta = JSON.parse(\n await fs.promises.readFile(flags.meta, { encoding: 'utf-8' })\n );\n else if (flags.meta.endsWith('.yaml'))\n configFromFlags.meta = YAML.parse(\n await fs.promises.readFile(flags.meta, { encoding: 'utf-8' })\n );\n }\n\n for (const targetFile of flags.file) {\n configFromFlags.files[targetFile.destName] = targetFile.src;\n }\n\n const conf = await getConfig(configFromFlags);\n\n this.log(YAML.stringify(conf.conf));\n\n const registry = conf.createRegistry(new OclifLoggerAdapter(this));\n const name = conf.fullPackageName;\n\n const builder = registry.constructNewPackage(name);\n\n for (const [dst, src] of Object.entries(conf.conf.files)) {\n this.log(`Uploading ${src} -> ${dst} ...`);\n const content = await fs.promises.readFile(src);\n await builder.addFile(dst, content);\n }\n\n this.log(`Uploading meta information...`);\n await builder.writeMeta(conf.conf.meta);\n await builder.finish();\n\n if (flags.refresh) await registry.updateIfNeeded();\n }\n}\n","import BuildMeta from './build-meta';\nimport BuildModel from './build-model';\nimport PackBlock from './pack-block';\nimport Publish from './publish';\nimport UploadPackageV1 from './upload-package-v1';\n\n// prettier-ignore\nexport const COMMANDS = {\n 'upload-package-v1': UploadPackageV1,\n 'pack': PackBlock,\n 'build-model': BuildModel,\n 'build-meta': BuildMeta,\n 'publish': Publish,\n};\n"],"names":["_BuildMeta","Command","flags","modulePath","path","descriptionRaw","loadPackDescriptionRaw","metaEmbedded","BlockPackMetaEmbedAbsoluteBase64","BlockPackMetaDescription","fs","__publicField","Flags","BuildMeta","getFileContent","error","_BuildModel","model","platforma","config","code","BuildModel","_PackBlock","description","loadPackDescription","buildBlockPackDist","PackBlock","_Publish","manifestPath","manifest","BlockPackManifest","manifestRoot","storage","storageByUrl","registry","BlockRegistryV2","OclifLoggerAdapter","file","ManifestFileName","Publish","parseTargetFile","arg","match","src","destName","targetFile","BasicConfigFields","_UploadPackageV1","configFromFlags","PlRegPackageConfigDataShard","field","YAML","conf","getConfig","name","builder","dst","content","UploadPackageV1","COMMANDS"],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sources":["../src/cmd/build-meta.ts","../src/cmd/build-model.ts","../src/cmd/pack-block.ts","../src/cmd/publish.ts","../src/registry_v1/flags.ts","../src/cmd/upload-package-v1.ts","../src/cmd/index.ts"],"sourcesContent":["import { Command, Flags } from '@oclif/core';\nimport path from 'path';\nimport fs from 'fs';\nimport { loadPackDescriptionRaw } from '../v2';\nimport { BlockPackMetaDescription, BlockPackMetaEmbedAbsoluteBase64 } from '../v2/model/block_meta';\n\nexport default class BuildMeta extends Command {\n static override description =\n 'Extracts meta information from blocks package.json and outputs meta.json with embedded binary ' +\n 'and textual information linked from the meta section.';\n\n static flags = {\n modulePath: Flags.string({\n char: 'i',\n summary: 'input module path',\n helpValue: '<path>',\n default: '.'\n }),\n\n destination: Flags.string({\n char: 'o',\n summary: 'output meta.json file',\n helpValue: '<path>',\n required: true\n })\n };\n\n public async run(): Promise<void> {\n const { flags } = await this.parse(BuildMeta);\n const modulePath = path.resolve(flags.modulePath);\n const descriptionRaw = await loadPackDescriptionRaw(modulePath);\n const metaEmbedded = await BlockPackMetaEmbedAbsoluteBase64.parseAsync(\n BlockPackMetaDescription(modulePath).parse(descriptionRaw.meta)\n );\n\n await fs.promises.writeFile(path.resolve(flags.destination), JSON.stringify(metaEmbedded));\n }\n}\n","import { Command, Flags } from '@oclif/core';\nimport fs from 'fs';\nimport path from 'path';\n\nasync function getFileContent(path: string) {\n try {\n return await fs.promises.readFile(path, 'utf8');\n } catch (error: any) {\n if (error.code === 'ENOENT') {\n return undefined;\n }\n throw error;\n }\n}\n\nexport default class BuildModel extends Command {\n static override description =\n 'Extracts and outputs block model JSON from pre-built block model module';\n\n static flags = {\n modulePath: Flags.string({\n char: 'i',\n summary: 'input module path',\n helpValue: '<path>',\n default: '.'\n }),\n\n sourceBundle: Flags.string({\n char: 'b',\n summary: 'bundled model code to embed into the model for callback-based rendering to work',\n helpValue: '<path>',\n default: './dist/bundle.js'\n }),\n\n destination: Flags.string({\n char: 'o',\n summary: 'output model file',\n helpValue: '<path>',\n default: './dist/model.json'\n })\n };\n\n public async run(): Promise<void> {\n const { flags } = await this.parse(BuildModel);\n const modulePath = path.resolve(flags.modulePath); // i.e. folder with package.json file\n let { model, platforma } = require(modulePath);\n\n if (!model) model = platforma;\n if (!model) throw new Error('\"model\" export not found');\n\n const { config } = model;\n\n if (!config)\n throw new Error(\n 'Malformed \"model\" object, check it is created with \"BlockModel\" ' +\n 'and \".done()\" is executed as the call in the chain.'\n );\n\n if (\n !('canRun' in config || 'inputsValid' in config) ||\n !('outputs' in config) ||\n !('sections' in config)\n )\n throw new Error('\"config\" has unexpected structure');\n\n const code = await getFileContent(flags.sourceBundle);\n if (code !== undefined) {\n config.code = {\n type: 'plain',\n content: code\n };\n }\n\n await fs.promises.writeFile(path.resolve(flags.destination), JSON.stringify(config));\n }\n}\n","import { Command, Flags } from '@oclif/core';\nimport { loadPackDescription } from '../v2/source_package';\nimport path from 'path';\nimport { buildBlockPackDist } from '../v2/build_dist';\n\nexport default class PackBlock extends Command {\n static description =\n 'Builds block pack and outputs a block pack manifest consolidating all ' +\n 'references assets into a single folder';\n\n static flags = {\n modulePath: Flags.string({\n char: 'i',\n summary: 'input module path',\n helpValue: '<path>',\n default: '.'\n }),\n\n destinationPath: Flags.string({\n char: 'o',\n summary: 'output folder',\n helpValue: '<path>',\n default: './block-pack'\n })\n };\n\n public async run(): Promise<void> {\n const { flags } = await this.parse(PackBlock);\n const description = await loadPackDescription(path.resolve(flags.modulePath));\n await buildBlockPackDist(description, path.resolve(flags.destinationPath));\n }\n}\n","import { Command, Flags } from '@oclif/core';\nimport fs from 'node:fs';\nimport { OclifLoggerAdapter } from '@milaboratories/ts-helpers-oclif';\nimport { ManifestFileName } from '../v2/registry/schema_public';\nimport { BlockPackManifest } from '@milaboratories/pl-model-middle-layer';\nimport { storageByUrl } from '../io/storage';\nimport { BlockRegistryV2 } from '../v2/registry/registry';\nimport path from 'node:path';\n\nexport default class Publish extends Command {\n static description =\n 'Publishes the block package and refreshes the registry (for v2 block-pack schema)';\n\n static flags = {\n registry: Flags.string({\n char: 'r',\n summary: 'full address of the registry',\n helpValue: '<address>',\n env: 'PL_REGISTRY',\n required: true\n }),\n\n manifest: Flags.file({\n char: 'm',\n summary: 'manifest file path',\n exists: true,\n default: `./block-pack/${ManifestFileName}`\n }),\n\n refresh: Flags.boolean({\n summary: 'refresh repository after adding the package',\n default: true,\n allowNo: true,\n env: 'PL_REGISTRY_REFRESH'\n })\n };\n\n public async run(): Promise<void> {\n const { flags } = await this.parse(Publish);\n\n // if (flags.meta) {\n // if (flags.meta.endsWith('.json'))\n // configFromFlags.meta = JSON.parse(\n // await fs.promises.readFile(flags.meta, { encoding: 'utf-8' })\n // );\n // else if (flags.meta.endsWith('.yaml'))\n // configFromFlags.meta = YAML.parse(\n // await fs.promises.readFile(flags.meta, { encoding: 'utf-8' })\n // );\n // }\n\n const manifestPath = path.resolve(flags.manifest);\n const manifest = BlockPackManifest.parse(\n JSON.parse(await fs.promises.readFile(manifestPath, { encoding: 'utf-8' }))\n );\n const manifestRoot = path.dirname(manifestPath);\n\n this.log(`Manifest root = ${manifestRoot}`);\n\n const storage = storageByUrl(flags.registry);\n const registry = new BlockRegistryV2(storage, new OclifLoggerAdapter(this));\n\n await registry.publishPackage(manifest, async (file) =>\n Buffer.from(await fs.promises.readFile(path.resolve(manifestRoot, file)))\n );\n\n if (flags.refresh) await registry.updateIfNeeded();\n }\n}\n","import { Flags } from '@oclif/core';\nimport path from 'node:path';\n\nexport interface TargetFile {\n src: string;\n destName: string;\n}\n\nfunction parseTargetFile(arg: string): TargetFile {\n const match = arg.match(/(?<destName>[^\\/\\\\]+)=(?<src>.*)/);\n if (match) {\n const { src, destName } = match.groups!;\n return { src, destName };\n } else {\n return { src: arg, destName: path.basename(arg) };\n }\n}\n\nexport const targetFile = Flags.custom<TargetFile>({\n summary: 'target files to upload',\n helpValue: 'file_path | package_name=file_path',\n parse: async (arg) => parseTargetFile(arg)\n});\n","import { Command, Flags } from '@oclif/core';\nimport { getConfig } from '../registry_v1/config';\nimport { targetFile } from '../registry_v1/flags';\nimport fs from 'node:fs';\nimport YAML from 'yaml';\nimport { PlRegPackageConfigDataShard } from '../registry_v1/config_schema';\nimport { OclifLoggerAdapter } from '@milaboratories/ts-helpers-oclif';\n\ntype BasicConfigField = keyof PlRegPackageConfigDataShard &\n ('registry' | 'organization' | 'package' | 'version');\nconst BasicConfigFields: BasicConfigField[] = ['registry', 'organization', 'package', 'version'];\n\nexport default class UploadPackageV1 extends Command {\n static description = 'Uploads V1 package and refreshes the registry';\n\n static flags = {\n registry: Flags.string({\n char: 'r',\n summary: 'full address of the registry or alias from .pl.reg',\n helpValue: '<address|alias>',\n env: 'PL_REGISTRY'\n }),\n\n organization: Flags.string({\n char: 'o',\n summary: 'target organisation',\n env: 'PL_PACKAGE_ORGANIZATION'\n }),\n\n package: Flags.string({\n char: 'p',\n summary: 'target package',\n env: 'PL_PACKAGE_NAME'\n }),\n\n version: Flags.string({\n char: 'v',\n summary: 'target version',\n env: 'PL_PACKAGE_VERSION'\n }),\n\n meta: Flags.file({\n char: 'm',\n summary: 'json file containing meta information to associate with tha package',\n exists: true\n }),\n\n file: targetFile({\n char: 'f',\n summary: 'package files',\n multiple: true,\n default: []\n }),\n\n refresh: Flags.boolean({\n summary: 'refresh repository after adding the package',\n default: true,\n allowNo: true,\n env: 'PL_REGISTRY_REFRESH'\n })\n };\n\n public async run(): Promise<void> {\n const { flags } = await this.parse(UploadPackageV1);\n const configFromFlags: PlRegPackageConfigDataShard = PlRegPackageConfigDataShard.parse({});\n\n for (const field of BasicConfigFields) if (flags[field]) configFromFlags[field] = flags[field];\n\n if (flags.meta) {\n if (flags.meta.endsWith('.json'))\n configFromFlags.meta = JSON.parse(\n await fs.promises.readFile(flags.meta, { encoding: 'utf-8' })\n );\n else if (flags.meta.endsWith('.yaml'))\n configFromFlags.meta = YAML.parse(\n await fs.promises.readFile(flags.meta, { encoding: 'utf-8' })\n );\n }\n\n for (const targetFile of flags.file) {\n configFromFlags.files[targetFile.destName] = targetFile.src;\n }\n\n const conf = await getConfig(configFromFlags);\n\n this.log(YAML.stringify(conf.conf));\n\n const registry = conf.createRegistry(new OclifLoggerAdapter(this));\n const name = conf.fullPackageName;\n\n const builder = registry.constructNewPackage(name);\n\n for (const [dst, src] of Object.entries(conf.conf.files)) {\n this.log(`Uploading ${src} -> ${dst} ...`);\n const content = await fs.promises.readFile(src);\n await builder.addFile(dst, content);\n }\n\n this.log(`Uploading meta information...`);\n await builder.writeMeta(conf.conf.meta);\n await builder.finish();\n\n if (flags.refresh) await registry.updateIfNeeded();\n }\n}\n","import BuildMeta from './build-meta';\nimport BuildModel from './build-model';\nimport PackBlock from './pack-block';\nimport Publish from './publish';\nimport UploadPackageV1 from './upload-package-v1';\n\n// prettier-ignore\nexport const COMMANDS = {\n 'upload-package-v1': UploadPackageV1,\n 'pack': PackBlock,\n 'build-model': BuildModel,\n 'build-meta': BuildMeta,\n 'publish': Publish,\n};\n"],"names":["_BuildMeta","Command","flags","modulePath","path","descriptionRaw","loadPackDescriptionRaw","metaEmbedded","BlockPackMetaEmbedAbsoluteBase64","BlockPackMetaDescription","fs","__publicField","Flags","BuildMeta","getFileContent","error","_BuildModel","model","platforma","config","code","BuildModel","_PackBlock","description","loadPackDescription","buildBlockPackDist","PackBlock","_Publish","manifestPath","manifest","BlockPackManifest","manifestRoot","storage","storageByUrl","registry","BlockRegistryV2","OclifLoggerAdapter","file","ManifestFileName","Publish","parseTargetFile","arg","match","src","destName","targetFile","BasicConfigFields","_UploadPackageV1","configFromFlags","PlRegPackageConfigDataShard","field","YAML","conf","getConfig","name","builder","dst","content","UploadPackageV1","COMMANDS"],"mappings":"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"}
package/dist/cli.mjs CHANGED
@@ -11,6 +11,7 @@ import "@milaboratories/resolve-helper";
11
11
  import { l as S, B as O, a as V, b as j, c as C, M as I, s as L, d as G, P as M, g as T } from "./config-CL-9hOpg.mjs";
12
12
  import { BlockPackManifest as D } from "@milaboratories/pl-model-middle-layer";
13
13
  import "canonicalize";
14
+ import "lru-cache";
14
15
  import { OclifLoggerAdapter as R } from "@milaboratories/ts-helpers-oclif";
15
16
  import E from "yaml";
16
17
  const f = class f extends y {
@@ -216,7 +217,7 @@ n(g, "description", "Uploads V1 package and refreshes the registry"), n(g, "flag
216
217
  })
217
218
  });
218
219
  let v = g;
219
- const se = {
220
+ const re = {
220
221
  "upload-package-v1": v,
221
222
  pack: b,
222
223
  "build-model": k,
@@ -224,6 +225,6 @@ const se = {
224
225
  publish: P
225
226
  };
226
227
  export {
227
- se as COMMANDS
228
+ re as COMMANDS
228
229
  };
229
230
  //# sourceMappingURL=cli.mjs.map
package/dist/cli.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.mjs","sources":["../src/cmd/build-meta.ts","../src/cmd/build-model.ts","../src/cmd/pack-block.ts","../src/cmd/publish.ts","../src/registry_v1/flags.ts","../src/cmd/upload-package-v1.ts","../src/cmd/index.ts"],"sourcesContent":["import { Command, Flags } from '@oclif/core';\nimport path from 'path';\nimport fs from 'fs';\nimport { loadPackDescriptionRaw } from '../v2';\nimport { BlockPackMetaDescription, BlockPackMetaEmbedAbsoluteBase64 } from '../v2/model/block_meta';\n\nexport default class BuildMeta extends Command {\n static override description =\n 'Extracts meta information from blocks package.json and outputs meta.json with embedded binary ' +\n 'and textual information linked from the meta section.';\n\n static flags = {\n modulePath: Flags.string({\n char: 'i',\n summary: 'input module path',\n helpValue: '<path>',\n default: '.'\n }),\n\n destination: Flags.string({\n char: 'o',\n summary: 'output meta.json file',\n helpValue: '<path>',\n required: true\n })\n };\n\n public async run(): Promise<void> {\n const { flags } = await this.parse(BuildMeta);\n const modulePath = path.resolve(flags.modulePath);\n const descriptionRaw = await loadPackDescriptionRaw(modulePath);\n const metaEmbedded = await BlockPackMetaEmbedAbsoluteBase64.parseAsync(\n BlockPackMetaDescription(modulePath).parse(descriptionRaw.meta)\n );\n\n await fs.promises.writeFile(path.resolve(flags.destination), JSON.stringify(metaEmbedded));\n }\n}\n","import { Command, Flags } from '@oclif/core';\nimport fs from 'fs';\nimport path from 'path';\n\nasync function getFileContent(path: string) {\n try {\n return await fs.promises.readFile(path, 'utf8');\n } catch (error: any) {\n if (error.code === 'ENOENT') {\n return undefined;\n }\n throw error;\n }\n}\n\nexport default class BuildModel extends Command {\n static override description =\n 'Extracts and outputs block model JSON from pre-built block model module';\n\n static flags = {\n modulePath: Flags.string({\n char: 'i',\n summary: 'input module path',\n helpValue: '<path>',\n default: '.'\n }),\n\n sourceBundle: Flags.string({\n char: 'b',\n summary: 'bundled model code to embed into the model for callback-based rendering to work',\n helpValue: '<path>',\n default: './dist/bundle.js'\n }),\n\n destination: Flags.string({\n char: 'o',\n summary: 'output model file',\n helpValue: '<path>',\n default: './dist/model.json'\n })\n };\n\n public async run(): Promise<void> {\n const { flags } = await this.parse(BuildModel);\n const modulePath = path.resolve(flags.modulePath); // i.e. folder with package.json file\n let { model, platforma } = require(modulePath);\n\n if (!model) model = platforma;\n if (!model) throw new Error('\"model\" export not found');\n\n const { config } = model;\n\n if (!config)\n throw new Error(\n 'Malformed \"model\" object, check it is created with \"BlockModel\" ' +\n 'and \".done()\" is executed as the call in the chain.'\n );\n\n if (\n !('canRun' in config || 'inputsValid' in config) ||\n !('outputs' in config) ||\n !('sections' in config)\n )\n throw new Error('\"config\" has unexpected structure');\n\n const code = await getFileContent(flags.sourceBundle);\n if (code !== undefined) {\n config.code = {\n type: 'plain',\n content: code\n };\n }\n\n await fs.promises.writeFile(path.resolve(flags.destination), JSON.stringify(config));\n }\n}\n","import { Command, Flags } from '@oclif/core';\nimport { loadPackDescription } from '../v2/source_package';\nimport path from 'path';\nimport { buildBlockPackDist } from '../v2/build_dist';\n\nexport default class PackBlock extends Command {\n static description =\n 'Builds block pack and outputs a block pack manifest consolidating all ' +\n 'references assets into a single folder';\n\n static flags = {\n modulePath: Flags.string({\n char: 'i',\n summary: 'input module path',\n helpValue: '<path>',\n default: '.'\n }),\n\n destinationPath: Flags.string({\n char: 'o',\n summary: 'output folder',\n helpValue: '<path>',\n default: './block-pack'\n })\n };\n\n public async run(): Promise<void> {\n const { flags } = await this.parse(PackBlock);\n const description = await loadPackDescription(path.resolve(flags.modulePath));\n await buildBlockPackDist(description, path.resolve(flags.destinationPath));\n }\n}\n","import { Command, Flags } from '@oclif/core';\nimport fs from 'node:fs';\nimport { OclifLoggerAdapter } from '@milaboratories/ts-helpers-oclif';\nimport { ManifestFileName } from '../v2/registry/schema_public';\nimport { BlockPackManifest } from '@milaboratories/pl-model-middle-layer';\nimport { storageByUrl } from '../io/storage';\nimport { BlockRegistryV2 } from '../v2/registry/registry';\nimport path from 'node:path';\n\nexport default class Publish extends Command {\n static description =\n 'Publishes the block package and refreshes the registry (for v2 block-pack schema)';\n\n static flags = {\n registry: Flags.string({\n char: 'r',\n summary: 'full address of the registry',\n helpValue: '<address>',\n env: 'PL_REGISTRY',\n required: true\n }),\n\n manifest: Flags.file({\n char: 'm',\n summary: 'manifest file path',\n exists: true,\n default: `./block-pack/${ManifestFileName}`\n }),\n\n refresh: Flags.boolean({\n summary: 'refresh repository after adding the package',\n default: true,\n allowNo: true,\n env: 'PL_REGISTRY_REFRESH'\n })\n };\n\n public async run(): Promise<void> {\n const { flags } = await this.parse(Publish);\n\n // if (flags.meta) {\n // if (flags.meta.endsWith('.json'))\n // configFromFlags.meta = JSON.parse(\n // await fs.promises.readFile(flags.meta, { encoding: 'utf-8' })\n // );\n // else if (flags.meta.endsWith('.yaml'))\n // configFromFlags.meta = YAML.parse(\n // await fs.promises.readFile(flags.meta, { encoding: 'utf-8' })\n // );\n // }\n\n const manifestPath = path.resolve(flags.manifest);\n const manifest = BlockPackManifest.parse(\n JSON.parse(await fs.promises.readFile(manifestPath, { encoding: 'utf-8' }))\n );\n const manifestRoot = path.dirname(manifestPath);\n\n this.log(`Manifest root = ${manifestRoot}`);\n\n const storage = storageByUrl(flags.registry);\n const registry = new BlockRegistryV2(storage, new OclifLoggerAdapter(this));\n\n await registry.publishPackage(manifest, async (file) =>\n Buffer.from(await fs.promises.readFile(path.resolve(manifestRoot, file)))\n );\n\n if (flags.refresh) await registry.updateIfNeeded();\n }\n}\n","import { Flags } from '@oclif/core';\nimport path from 'node:path';\n\nexport interface TargetFile {\n src: string;\n destName: string;\n}\n\nfunction parseTargetFile(arg: string): TargetFile {\n const match = arg.match(/(?<destName>[^\\/\\\\]+)=(?<src>.*)/);\n if (match) {\n const { src, destName } = match.groups!;\n return { src, destName };\n } else {\n return { src: arg, destName: path.basename(arg) };\n }\n}\n\nexport const targetFile = Flags.custom<TargetFile>({\n summary: 'target files to upload',\n helpValue: 'file_path | package_name=file_path',\n parse: async (arg) => parseTargetFile(arg)\n});\n","import { Command, Flags } from '@oclif/core';\nimport { getConfig } from '../registry_v1/config';\nimport { targetFile } from '../registry_v1/flags';\nimport fs from 'node:fs';\nimport YAML from 'yaml';\nimport { PlRegPackageConfigDataShard } from '../registry_v1/config_schema';\nimport { OclifLoggerAdapter } from '@milaboratories/ts-helpers-oclif';\n\ntype BasicConfigField = keyof PlRegPackageConfigDataShard &\n ('registry' | 'organization' | 'package' | 'version');\nconst BasicConfigFields: BasicConfigField[] = ['registry', 'organization', 'package', 'version'];\n\nexport default class UploadPackageV1 extends Command {\n static description = 'Uploads V1 package and refreshes the registry';\n\n static flags = {\n registry: Flags.string({\n char: 'r',\n summary: 'full address of the registry or alias from .pl.reg',\n helpValue: '<address|alias>',\n env: 'PL_REGISTRY'\n }),\n\n organization: Flags.string({\n char: 'o',\n summary: 'target organisation',\n env: 'PL_PACKAGE_ORGANIZATION'\n }),\n\n package: Flags.string({\n char: 'p',\n summary: 'target package',\n env: 'PL_PACKAGE_NAME'\n }),\n\n version: Flags.string({\n char: 'v',\n summary: 'target version',\n env: 'PL_PACKAGE_VERSION'\n }),\n\n meta: Flags.file({\n char: 'm',\n summary: 'json file containing meta information to associate with tha package',\n exists: true\n }),\n\n file: targetFile({\n char: 'f',\n summary: 'package files',\n multiple: true,\n default: []\n }),\n\n refresh: Flags.boolean({\n summary: 'refresh repository after adding the package',\n default: true,\n allowNo: true,\n env: 'PL_REGISTRY_REFRESH'\n })\n };\n\n public async run(): Promise<void> {\n const { flags } = await this.parse(UploadPackageV1);\n const configFromFlags: PlRegPackageConfigDataShard = PlRegPackageConfigDataShard.parse({});\n\n for (const field of BasicConfigFields) if (flags[field]) configFromFlags[field] = flags[field];\n\n if (flags.meta) {\n if (flags.meta.endsWith('.json'))\n configFromFlags.meta = JSON.parse(\n await fs.promises.readFile(flags.meta, { encoding: 'utf-8' })\n );\n else if (flags.meta.endsWith('.yaml'))\n configFromFlags.meta = YAML.parse(\n await fs.promises.readFile(flags.meta, { encoding: 'utf-8' })\n );\n }\n\n for (const targetFile of flags.file) {\n configFromFlags.files[targetFile.destName] = targetFile.src;\n }\n\n const conf = await getConfig(configFromFlags);\n\n this.log(YAML.stringify(conf.conf));\n\n const registry = conf.createRegistry(new OclifLoggerAdapter(this));\n const name = conf.fullPackageName;\n\n const builder = registry.constructNewPackage(name);\n\n for (const [dst, src] of Object.entries(conf.conf.files)) {\n this.log(`Uploading ${src} -> ${dst} ...`);\n const content = await fs.promises.readFile(src);\n await builder.addFile(dst, content);\n }\n\n this.log(`Uploading meta information...`);\n await builder.writeMeta(conf.conf.meta);\n await builder.finish();\n\n if (flags.refresh) await registry.updateIfNeeded();\n }\n}\n","import BuildMeta from './build-meta';\nimport BuildModel from './build-model';\nimport PackBlock from './pack-block';\nimport Publish from './publish';\nimport UploadPackageV1 from './upload-package-v1';\n\n// prettier-ignore\nexport const COMMANDS = {\n 'upload-package-v1': UploadPackageV1,\n 'pack': PackBlock,\n 'build-model': BuildModel,\n 'build-meta': BuildMeta,\n 'publish': Publish,\n};\n"],"names":["_BuildMeta","Command","flags","modulePath","path","descriptionRaw","loadPackDescriptionRaw","metaEmbedded","BlockPackMetaEmbedAbsoluteBase64","BlockPackMetaDescription","fs","__publicField","Flags","BuildMeta","getFileContent","error","_BuildModel","model","platforma","config","code","BuildModel","_PackBlock","description","loadPackDescription","buildBlockPackDist","PackBlock","_Publish","manifestPath","manifest","BlockPackManifest","manifestRoot","storage","storageByUrl","registry","BlockRegistryV2","OclifLoggerAdapter","file","ManifestFileName","Publish","parseTargetFile","arg","match","src","destName","targetFile","BasicConfigFields","_UploadPackageV1","configFromFlags","PlRegPackageConfigDataShard","field","YAML","conf","getConfig","name","builder","dst","content","UploadPackageV1","COMMANDS"],"mappings":"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"}
1
+ {"version":3,"file":"cli.mjs","sources":["../src/cmd/build-meta.ts","../src/cmd/build-model.ts","../src/cmd/pack-block.ts","../src/cmd/publish.ts","../src/registry_v1/flags.ts","../src/cmd/upload-package-v1.ts","../src/cmd/index.ts"],"sourcesContent":["import { Command, Flags } from '@oclif/core';\nimport path from 'path';\nimport fs from 'fs';\nimport { loadPackDescriptionRaw } from '../v2';\nimport { BlockPackMetaDescription, BlockPackMetaEmbedAbsoluteBase64 } from '../v2/model/block_meta';\n\nexport default class BuildMeta extends Command {\n static override description =\n 'Extracts meta information from blocks package.json and outputs meta.json with embedded binary ' +\n 'and textual information linked from the meta section.';\n\n static flags = {\n modulePath: Flags.string({\n char: 'i',\n summary: 'input module path',\n helpValue: '<path>',\n default: '.'\n }),\n\n destination: Flags.string({\n char: 'o',\n summary: 'output meta.json file',\n helpValue: '<path>',\n required: true\n })\n };\n\n public async run(): Promise<void> {\n const { flags } = await this.parse(BuildMeta);\n const modulePath = path.resolve(flags.modulePath);\n const descriptionRaw = await loadPackDescriptionRaw(modulePath);\n const metaEmbedded = await BlockPackMetaEmbedAbsoluteBase64.parseAsync(\n BlockPackMetaDescription(modulePath).parse(descriptionRaw.meta)\n );\n\n await fs.promises.writeFile(path.resolve(flags.destination), JSON.stringify(metaEmbedded));\n }\n}\n","import { Command, Flags } from '@oclif/core';\nimport fs from 'fs';\nimport path from 'path';\n\nasync function getFileContent(path: string) {\n try {\n return await fs.promises.readFile(path, 'utf8');\n } catch (error: any) {\n if (error.code === 'ENOENT') {\n return undefined;\n }\n throw error;\n }\n}\n\nexport default class BuildModel extends Command {\n static override description =\n 'Extracts and outputs block model JSON from pre-built block model module';\n\n static flags = {\n modulePath: Flags.string({\n char: 'i',\n summary: 'input module path',\n helpValue: '<path>',\n default: '.'\n }),\n\n sourceBundle: Flags.string({\n char: 'b',\n summary: 'bundled model code to embed into the model for callback-based rendering to work',\n helpValue: '<path>',\n default: './dist/bundle.js'\n }),\n\n destination: Flags.string({\n char: 'o',\n summary: 'output model file',\n helpValue: '<path>',\n default: './dist/model.json'\n })\n };\n\n public async run(): Promise<void> {\n const { flags } = await this.parse(BuildModel);\n const modulePath = path.resolve(flags.modulePath); // i.e. folder with package.json file\n let { model, platforma } = require(modulePath);\n\n if (!model) model = platforma;\n if (!model) throw new Error('\"model\" export not found');\n\n const { config } = model;\n\n if (!config)\n throw new Error(\n 'Malformed \"model\" object, check it is created with \"BlockModel\" ' +\n 'and \".done()\" is executed as the call in the chain.'\n );\n\n if (\n !('canRun' in config || 'inputsValid' in config) ||\n !('outputs' in config) ||\n !('sections' in config)\n )\n throw new Error('\"config\" has unexpected structure');\n\n const code = await getFileContent(flags.sourceBundle);\n if (code !== undefined) {\n config.code = {\n type: 'plain',\n content: code\n };\n }\n\n await fs.promises.writeFile(path.resolve(flags.destination), JSON.stringify(config));\n }\n}\n","import { Command, Flags } from '@oclif/core';\nimport { loadPackDescription } from '../v2/source_package';\nimport path from 'path';\nimport { buildBlockPackDist } from '../v2/build_dist';\n\nexport default class PackBlock extends Command {\n static description =\n 'Builds block pack and outputs a block pack manifest consolidating all ' +\n 'references assets into a single folder';\n\n static flags = {\n modulePath: Flags.string({\n char: 'i',\n summary: 'input module path',\n helpValue: '<path>',\n default: '.'\n }),\n\n destinationPath: Flags.string({\n char: 'o',\n summary: 'output folder',\n helpValue: '<path>',\n default: './block-pack'\n })\n };\n\n public async run(): Promise<void> {\n const { flags } = await this.parse(PackBlock);\n const description = await loadPackDescription(path.resolve(flags.modulePath));\n await buildBlockPackDist(description, path.resolve(flags.destinationPath));\n }\n}\n","import { Command, Flags } from '@oclif/core';\nimport fs from 'node:fs';\nimport { OclifLoggerAdapter } from '@milaboratories/ts-helpers-oclif';\nimport { ManifestFileName } from '../v2/registry/schema_public';\nimport { BlockPackManifest } from '@milaboratories/pl-model-middle-layer';\nimport { storageByUrl } from '../io/storage';\nimport { BlockRegistryV2 } from '../v2/registry/registry';\nimport path from 'node:path';\n\nexport default class Publish extends Command {\n static description =\n 'Publishes the block package and refreshes the registry (for v2 block-pack schema)';\n\n static flags = {\n registry: Flags.string({\n char: 'r',\n summary: 'full address of the registry',\n helpValue: '<address>',\n env: 'PL_REGISTRY',\n required: true\n }),\n\n manifest: Flags.file({\n char: 'm',\n summary: 'manifest file path',\n exists: true,\n default: `./block-pack/${ManifestFileName}`\n }),\n\n refresh: Flags.boolean({\n summary: 'refresh repository after adding the package',\n default: true,\n allowNo: true,\n env: 'PL_REGISTRY_REFRESH'\n })\n };\n\n public async run(): Promise<void> {\n const { flags } = await this.parse(Publish);\n\n // if (flags.meta) {\n // if (flags.meta.endsWith('.json'))\n // configFromFlags.meta = JSON.parse(\n // await fs.promises.readFile(flags.meta, { encoding: 'utf-8' })\n // );\n // else if (flags.meta.endsWith('.yaml'))\n // configFromFlags.meta = YAML.parse(\n // await fs.promises.readFile(flags.meta, { encoding: 'utf-8' })\n // );\n // }\n\n const manifestPath = path.resolve(flags.manifest);\n const manifest = BlockPackManifest.parse(\n JSON.parse(await fs.promises.readFile(manifestPath, { encoding: 'utf-8' }))\n );\n const manifestRoot = path.dirname(manifestPath);\n\n this.log(`Manifest root = ${manifestRoot}`);\n\n const storage = storageByUrl(flags.registry);\n const registry = new BlockRegistryV2(storage, new OclifLoggerAdapter(this));\n\n await registry.publishPackage(manifest, async (file) =>\n Buffer.from(await fs.promises.readFile(path.resolve(manifestRoot, file)))\n );\n\n if (flags.refresh) await registry.updateIfNeeded();\n }\n}\n","import { Flags } from '@oclif/core';\nimport path from 'node:path';\n\nexport interface TargetFile {\n src: string;\n destName: string;\n}\n\nfunction parseTargetFile(arg: string): TargetFile {\n const match = arg.match(/(?<destName>[^\\/\\\\]+)=(?<src>.*)/);\n if (match) {\n const { src, destName } = match.groups!;\n return { src, destName };\n } else {\n return { src: arg, destName: path.basename(arg) };\n }\n}\n\nexport const targetFile = Flags.custom<TargetFile>({\n summary: 'target files to upload',\n helpValue: 'file_path | package_name=file_path',\n parse: async (arg) => parseTargetFile(arg)\n});\n","import { Command, Flags } from '@oclif/core';\nimport { getConfig } from '../registry_v1/config';\nimport { targetFile } from '../registry_v1/flags';\nimport fs from 'node:fs';\nimport YAML from 'yaml';\nimport { PlRegPackageConfigDataShard } from '../registry_v1/config_schema';\nimport { OclifLoggerAdapter } from '@milaboratories/ts-helpers-oclif';\n\ntype BasicConfigField = keyof PlRegPackageConfigDataShard &\n ('registry' | 'organization' | 'package' | 'version');\nconst BasicConfigFields: BasicConfigField[] = ['registry', 'organization', 'package', 'version'];\n\nexport default class UploadPackageV1 extends Command {\n static description = 'Uploads V1 package and refreshes the registry';\n\n static flags = {\n registry: Flags.string({\n char: 'r',\n summary: 'full address of the registry or alias from .pl.reg',\n helpValue: '<address|alias>',\n env: 'PL_REGISTRY'\n }),\n\n organization: Flags.string({\n char: 'o',\n summary: 'target organisation',\n env: 'PL_PACKAGE_ORGANIZATION'\n }),\n\n package: Flags.string({\n char: 'p',\n summary: 'target package',\n env: 'PL_PACKAGE_NAME'\n }),\n\n version: Flags.string({\n char: 'v',\n summary: 'target version',\n env: 'PL_PACKAGE_VERSION'\n }),\n\n meta: Flags.file({\n char: 'm',\n summary: 'json file containing meta information to associate with tha package',\n exists: true\n }),\n\n file: targetFile({\n char: 'f',\n summary: 'package files',\n multiple: true,\n default: []\n }),\n\n refresh: Flags.boolean({\n summary: 'refresh repository after adding the package',\n default: true,\n allowNo: true,\n env: 'PL_REGISTRY_REFRESH'\n })\n };\n\n public async run(): Promise<void> {\n const { flags } = await this.parse(UploadPackageV1);\n const configFromFlags: PlRegPackageConfigDataShard = PlRegPackageConfigDataShard.parse({});\n\n for (const field of BasicConfigFields) if (flags[field]) configFromFlags[field] = flags[field];\n\n if (flags.meta) {\n if (flags.meta.endsWith('.json'))\n configFromFlags.meta = JSON.parse(\n await fs.promises.readFile(flags.meta, { encoding: 'utf-8' })\n );\n else if (flags.meta.endsWith('.yaml'))\n configFromFlags.meta = YAML.parse(\n await fs.promises.readFile(flags.meta, { encoding: 'utf-8' })\n );\n }\n\n for (const targetFile of flags.file) {\n configFromFlags.files[targetFile.destName] = targetFile.src;\n }\n\n const conf = await getConfig(configFromFlags);\n\n this.log(YAML.stringify(conf.conf));\n\n const registry = conf.createRegistry(new OclifLoggerAdapter(this));\n const name = conf.fullPackageName;\n\n const builder = registry.constructNewPackage(name);\n\n for (const [dst, src] of Object.entries(conf.conf.files)) {\n this.log(`Uploading ${src} -> ${dst} ...`);\n const content = await fs.promises.readFile(src);\n await builder.addFile(dst, content);\n }\n\n this.log(`Uploading meta information...`);\n await builder.writeMeta(conf.conf.meta);\n await builder.finish();\n\n if (flags.refresh) await registry.updateIfNeeded();\n }\n}\n","import BuildMeta from './build-meta';\nimport BuildModel from './build-model';\nimport PackBlock from './pack-block';\nimport Publish from './publish';\nimport UploadPackageV1 from './upload-package-v1';\n\n// prettier-ignore\nexport const COMMANDS = {\n 'upload-package-v1': UploadPackageV1,\n 'pack': PackBlock,\n 'build-model': BuildModel,\n 'build-meta': BuildMeta,\n 'publish': Publish,\n};\n"],"names":["_BuildMeta","Command","flags","modulePath","path","descriptionRaw","loadPackDescriptionRaw","metaEmbedded","BlockPackMetaEmbedAbsoluteBase64","BlockPackMetaDescription","fs","__publicField","Flags","BuildMeta","getFileContent","error","_BuildModel","model","platforma","config","code","BuildModel","_PackBlock","description","loadPackDescription","buildBlockPackDist","PackBlock","_Publish","manifestPath","manifest","BlockPackManifest","manifestRoot","storage","storageByUrl","registry","BlockRegistryV2","OclifLoggerAdapter","file","ManifestFileName","Publish","parseTargetFile","arg","match","src","destName","targetFile","BasicConfigFields","_UploadPackageV1","configFromFlags","PlRegPackageConfigDataShard","field","YAML","conf","getConfig","name","builder","dst","content","UploadPackageV1","COMMANDS"],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var k=Object.defineProperty;var v=(o,t,a)=>t in o?k(o,t,{enumerable:!0,configurable:!0,writable:!0,value:a}):o[t]=a;var n=(o,t,a)=>v(o,typeof t!="symbol"?t+"":t,a);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./config-CDLSqmC-.js"),g=require("undici"),r=require("node:path"),l=require("node:path/posix"),P=require("node:fs/promises"),f=require("@milaboratories/pl-model-middle-layer"),u=require("canonicalize");require("zod");require("mime-types");require("tar");require("@milaboratories/resolve-helper");class B{constructor(t){n(this,"metaCache",new Map);n(this,"v2RootFolderReader");this.registryReader=t,this.v2RootFolderReader=t.relativeReader(e.MainPrefix)}async embedMetaContent(t){const a=u(t.id),i=this.metaCache.get(a);if(i&&i.sha256===t.latestManifestSha256)return i.meta;const p=this.v2RootFolderReader.getContentReader(),d=await e.BlockPackMetaEmbedBytes(p).parseAsync(t.latest.meta);return this.metaCache.set(a,{sha256:t.latestManifestSha256,meta:d}),d}async listBlockPacks(){this.v2RootFolderReader.getContentReader();const t=e.GlobalOverviewReg.parse(JSON.parse(Buffer.from(await this.v2RootFolderReader.readFile(e.GlobalOverviewFileName)).toString()));return await Promise.all(t.packages.map(async a=>({id:a.latest.id,meta:await this.embedMetaContent(a),spec:{type:"from-registry-v2",id:a.latest.id,registryUrl:this.registryReader.rootUrl.toString()},otherVersions:a.allVersions})))}async getComponents(t){const a=this.v2RootFolderReader.relativeReader(e.packageContentPrefixInsideV2(t)),i=f.BlockPackManifest.parse(JSON.parse(Buffer.from(await a.readFile(e.ManifestFileName)).toString()));return e.BlockComponentsAbsoluteUrl(a.rootUrl.toString()).parse(i.description.components)}}const R=Object.freeze(Object.defineProperty({__proto__:null,GlobalOverviewPath:e.GlobalOverviewPath,MetaFile:e.MetaFile,PlPackageConfigData:e.PlPackageConfigData,PlPackageJsonConfigFile:e.PlPackageJsonConfigFile,PlPackageYamlConfigFile:e.PlPackageYamlConfigFile,PlRegCommonConfigData:e.PlRegCommonConfigData,PlRegFullPackageConfigData:e.PlRegFullPackageConfigData,PlRegPackageConfig:e.PlRegPackageConfig,PlRegPackageConfigDataShard:e.PlRegPackageConfigDataShard,packageContentPrefix:e.packageContentPrefix,packageOverviewPath:e.packageOverviewPath,payloadFilePath:e.payloadFilePath},Symbol.toStringTag,{value:"Module"}));class s{constructor(t,a){this.rootUrl=t,this.httpDispatcher=a}async readFile(t){const a=new URL(t,this.rootUrl),i=await g.request(a,{dispatcher:this.httpDispatcher});return Buffer.from(await i.body.arrayBuffer())}relativeReader(t){return t.endsWith("/")||(t=t+"/"),new s(new URL(t,this.rootUrl),this.httpDispatcher)}getContentReader(t){let a=this;return t!==void 0&&(a=a.relativeReader(t)),i=>a.readFile(i)}}class c{constructor(t,a){this.rootUrl=t,this.root=a}async readFile(t){const a=r.join(this.root,...t.split(l.sep));return await P.readFile(a)}relativeReader(t){return t.endsWith("/")||(t=t+"/"),new c(new URL(t,this.rootUrl),r.join(this.root,...t.split(l.sep)))}getContentReader(t){let a=this;return t!==void 0&&(a=a.relativeReader(t)),i=>a.readFile(i)}}function h(o){return o.split(l.sep).join(r.sep)}function m(o){return o.split(r.sep).join(l.sep)}function b(o,t){o.endsWith("/")||(o=o+"/");const a=new URL(o,`file:${m(r.resolve("."))}/`);switch(a.protocol){case"file:":const i=h(a.pathname);return new c(a,i);case"https:":case"http:":return new s(a,t??new g.Agent);default:throw new Error(`Unknown protocol: ${a.protocol}`)}}exports.BlockComponentsAbsoluteUrl=e.BlockComponentsAbsoluteUrl;exports.BlockComponentsConsolidate=e.BlockComponentsConsolidate;exports.BlockComponentsDescription=e.BlockComponentsDescription;exports.BlockDescriptionPackageJsonField=e.BlockDescriptionPackageJsonField;exports.BlockDescriptionToExplicitBinaryBytes=e.BlockDescriptionToExplicitBinaryBytes;exports.BlockPackDescriptionConsolidateToFolder=e.BlockPackDescriptionConsolidateToFolder;exports.BlockPackDescriptionManifestAddRelativePathPrefix=e.BlockPackDescriptionManifestAddRelativePathPrefix;exports.BlockPackMetaConsolidate=e.BlockPackMetaConsolidate;exports.BlockPackMetaDescription=e.BlockPackMetaDescription;exports.BlockPackMetaEmbedAbsoluteBase64=e.BlockPackMetaEmbedAbsoluteBase64;exports.BlockPackMetaEmbedAbsoluteBytes=e.BlockPackMetaEmbedAbsoluteBytes;exports.BlockPackMetaEmbedBytes=e.BlockPackMetaEmbedBytes;exports.BlockRegistryV2=e.BlockRegistryV2;exports.FSStorage=e.FSStorage;exports.GlobalOverview=e.GlobalOverview;exports.GlobalOverviewEntry=e.GlobalOverviewEntry;exports.GlobalOverviewEntryReg=e.GlobalOverviewEntryReg;exports.GlobalOverviewFileName=e.GlobalOverviewFileName;exports.GlobalOverviewPath=e.GlobalOverviewPath$1;exports.GlobalOverviewReg=e.GlobalOverviewReg;exports.GlobalOverviewToExplicitBinaryBase64=e.GlobalOverviewToExplicitBinaryBase64;exports.GlobalOverviewToExplicitBinaryBytes=e.GlobalOverviewToExplicitBinaryBytes;exports.MainPrefix=e.MainPrefix;exports.ManifestFileName=e.ManifestFileName;exports.ManifestSuffix=e.ManifestSuffix;exports.PackageOverview=e.PackageOverview;exports.PackageOverviewFileName=e.PackageOverviewFileName;exports.PackageOverviewVersionEntry=e.PackageOverviewVersionEntry;exports.ResolvedBlockPackDescriptionFromPackageJson=e.ResolvedBlockPackDescriptionFromPackageJson;exports.ResolvedModuleFile=e.ResolvedModuleFile;exports.ResolvedModuleFolder=e.ResolvedModuleFolder;exports.S3Storage=e.S3Storage;exports.absoluteToBase64=e.absoluteToBase64;exports.absoluteToBytes=e.absoluteToBytes;exports.absoluteToString=e.absoluteToString;exports.buildBlockPackDist=e.buildBlockPackDist;exports.cpAbsoluteToRelative=e.cpAbsoluteToRelative;exports.loadPackDescription=e.loadPackDescription;exports.loadPackDescriptionRaw=e.loadPackDescriptionRaw;exports.mapLocalToAbsolute=e.mapLocalToAbsolute;exports.packFolderToRelativeTgz=e.packFolderToRelativeTgz;exports.packageContentPrefix=e.packageContentPrefix$1;exports.packageContentPrefixInsideV2=e.packageContentPrefixInsideV2;exports.packageOverviewPath=e.packageOverviewPath$1;exports.parsePackageName=e.parsePackageName;exports.relativeToContentString=e.relativeToContentString;exports.relativeToExplicitBinary64=e.relativeToExplicitBinary64;exports.relativeToExplicitBytes=e.relativeToExplicitBytes;exports.relativeToExplicitString=e.relativeToExplicitString;exports.storageByUrl=e.storageByUrl;exports.tryLoadPackDescription=e.tryLoadPackDescription;exports.RegistryV1=R;exports.RegistryV2Reader=B;exports.folderReaderByUrl=b;
1
+ "use strict";var P=Object.defineProperty;var u=(o,t,a)=>t in o?P(o,t,{enumerable:!0,configurable:!0,writable:!0,value:a}):o[t]=a;var l=(o,t,a)=>u(o,typeof t!="symbol"?t+"":t,a);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./config-CDLSqmC-.js"),h=require("undici"),s=require("node:path"),n=require("node:path/posix"),f=require("node:fs/promises"),k=require("@milaboratories/pl-model-middle-layer"),g=require("canonicalize");require("zod");require("mime-types");require("tar");require("@milaboratories/resolve-helper");const v=require("lru-cache"),B={cacheBlockListFor:45e3,keepStaleBlockListFor:3e5};class R{constructor(t,a){l(this,"v2RootFolderReader");l(this,"ops");l(this,"embeddedMetaCache",new v.LRUCache({max:500,fetchMethod:async(t,a,i)=>{const r=this.v2RootFolderReader.getContentReader();return await e.BlockPackMetaEmbedBytes(r).parseAsync(i.context.latest.meta)}}));l(this,"listCacheTimestamp",0);l(this,"listCache");l(this,"componentsCache",new v.LRUCache({max:500,fetchMethod:async(t,a,{context:i})=>{const r=this.v2RootFolderReader.relativeReader(e.packageContentPrefixInsideV2(i)),p=k.BlockPackManifest.parse(JSON.parse(Buffer.from(await r.readFile(e.ManifestFileName)).toString()));return e.BlockComponentsAbsoluteUrl(r.rootUrl.toString()).parse(p.description.components)}}));this.registryReader=t,this.v2RootFolderReader=t.relativeReader(e.MainPrefix),this.ops={...B,...a??{}}}async embedMetaContent(t){return await this.embeddedMetaCache.forceFetch(g({id:t.id,sha256:t.latestManifestSha256}),{context:t})}async listBlockPacks(){if(this.listCache!==void 0&&Date.now()-this.listCacheTimestamp<=this.ops.cacheBlockListFor)return this.listCache;try{const t=this.v2RootFolderReader.getContentReader(),a=e.GlobalOverviewReg.parse(JSON.parse(Buffer.from(await this.v2RootFolderReader.readFile(e.GlobalOverviewFileName)).toString())),i=await Promise.all(a.packages.map(async r=>({id:r.latest.id,meta:await this.embedMetaContent(r),spec:{type:"from-registry-v2",id:r.latest.id,registryUrl:this.registryReader.rootUrl.toString()},otherVersions:r.allVersions})));return this.listCache=i,this.listCacheTimestamp=Date.now(),i}catch(t){if(this.listCache!==void 0&&Date.now()-this.listCacheTimestamp<=this.ops.keepStaleBlockListFor)return this.listCache;throw t}}async getOverviewForSpec(t){return(await this.listBlockPacks()).find(a=>k.blockPackIdNoVersionEquals(t,a.id))}async getComponents(t){return await this.componentsCache.forceFetch(g(t),{context:t})}}const m=Object.freeze(Object.defineProperty({__proto__:null,GlobalOverviewPath:e.GlobalOverviewPath,MetaFile:e.MetaFile,PlPackageConfigData:e.PlPackageConfigData,PlPackageJsonConfigFile:e.PlPackageJsonConfigFile,PlPackageYamlConfigFile:e.PlPackageYamlConfigFile,PlRegCommonConfigData:e.PlRegCommonConfigData,PlRegFullPackageConfigData:e.PlRegFullPackageConfigData,PlRegPackageConfig:e.PlRegPackageConfig,PlRegPackageConfigDataShard:e.PlRegPackageConfigDataShard,packageContentPrefix:e.packageContentPrefix,packageOverviewPath:e.packageOverviewPath,payloadFilePath:e.payloadFilePath},Symbol.toStringTag,{value:"Module"}));class c{constructor(t,a){this.rootUrl=t,this.httpDispatcher=a}async readFile(t){const a=new URL(t,this.rootUrl),i=await h.request(a,{dispatcher:this.httpDispatcher});return Buffer.from(await i.body.arrayBuffer())}relativeReader(t){return t.endsWith("/")||(t=t+"/"),new c(new URL(t,this.rootUrl),this.httpDispatcher)}getContentReader(t){let a=this;return t!==void 0&&(a=a.relativeReader(t)),i=>a.readFile(i)}}class d{constructor(t,a){this.rootUrl=t,this.root=a}async readFile(t){const a=s.join(this.root,...t.split(n.sep));return await f.readFile(a)}relativeReader(t){return t.endsWith("/")||(t=t+"/"),new d(new URL(t,this.rootUrl),s.join(this.root,...t.split(n.sep)))}getContentReader(t){let a=this;return t!==void 0&&(a=a.relativeReader(t)),i=>a.readFile(i)}}function w(o){return o.split(n.sep).join(s.sep)}function C(o){return o.split(s.sep).join(n.sep)}function y(o,t){o.endsWith("/")||(o=o+"/");const a=new URL(o,`file:${C(s.resolve("."))}/`);switch(a.protocol){case"file:":const i=w(a.pathname);return new d(a,i);case"https:":case"http:":return new c(a,t??new h.Agent);default:throw new Error(`Unknown protocol: ${a.protocol}`)}}exports.BlockComponentsAbsoluteUrl=e.BlockComponentsAbsoluteUrl;exports.BlockComponentsConsolidate=e.BlockComponentsConsolidate;exports.BlockComponentsDescription=e.BlockComponentsDescription;exports.BlockDescriptionPackageJsonField=e.BlockDescriptionPackageJsonField;exports.BlockDescriptionToExplicitBinaryBytes=e.BlockDescriptionToExplicitBinaryBytes;exports.BlockPackDescriptionConsolidateToFolder=e.BlockPackDescriptionConsolidateToFolder;exports.BlockPackDescriptionManifestAddRelativePathPrefix=e.BlockPackDescriptionManifestAddRelativePathPrefix;exports.BlockPackMetaConsolidate=e.BlockPackMetaConsolidate;exports.BlockPackMetaDescription=e.BlockPackMetaDescription;exports.BlockPackMetaEmbedAbsoluteBase64=e.BlockPackMetaEmbedAbsoluteBase64;exports.BlockPackMetaEmbedAbsoluteBytes=e.BlockPackMetaEmbedAbsoluteBytes;exports.BlockPackMetaEmbedBytes=e.BlockPackMetaEmbedBytes;exports.BlockRegistryV2=e.BlockRegistryV2;exports.FSStorage=e.FSStorage;exports.GlobalOverview=e.GlobalOverview;exports.GlobalOverviewEntry=e.GlobalOverviewEntry;exports.GlobalOverviewEntryReg=e.GlobalOverviewEntryReg;exports.GlobalOverviewFileName=e.GlobalOverviewFileName;exports.GlobalOverviewPath=e.GlobalOverviewPath$1;exports.GlobalOverviewReg=e.GlobalOverviewReg;exports.GlobalOverviewToExplicitBinaryBase64=e.GlobalOverviewToExplicitBinaryBase64;exports.GlobalOverviewToExplicitBinaryBytes=e.GlobalOverviewToExplicitBinaryBytes;exports.MainPrefix=e.MainPrefix;exports.ManifestFileName=e.ManifestFileName;exports.ManifestSuffix=e.ManifestSuffix;exports.PackageOverview=e.PackageOverview;exports.PackageOverviewFileName=e.PackageOverviewFileName;exports.PackageOverviewVersionEntry=e.PackageOverviewVersionEntry;exports.ResolvedBlockPackDescriptionFromPackageJson=e.ResolvedBlockPackDescriptionFromPackageJson;exports.ResolvedModuleFile=e.ResolvedModuleFile;exports.ResolvedModuleFolder=e.ResolvedModuleFolder;exports.S3Storage=e.S3Storage;exports.absoluteToBase64=e.absoluteToBase64;exports.absoluteToBytes=e.absoluteToBytes;exports.absoluteToString=e.absoluteToString;exports.buildBlockPackDist=e.buildBlockPackDist;exports.cpAbsoluteToRelative=e.cpAbsoluteToRelative;exports.loadPackDescription=e.loadPackDescription;exports.loadPackDescriptionRaw=e.loadPackDescriptionRaw;exports.mapLocalToAbsolute=e.mapLocalToAbsolute;exports.packFolderToRelativeTgz=e.packFolderToRelativeTgz;exports.packageContentPrefix=e.packageContentPrefix$1;exports.packageContentPrefixInsideV2=e.packageContentPrefixInsideV2;exports.packageOverviewPath=e.packageOverviewPath$1;exports.parsePackageName=e.parsePackageName;exports.relativeToContentString=e.relativeToContentString;exports.relativeToExplicitBinary64=e.relativeToExplicitBinary64;exports.relativeToExplicitBytes=e.relativeToExplicitBytes;exports.relativeToExplicitString=e.relativeToExplicitString;exports.storageByUrl=e.storageByUrl;exports.tryLoadPackDescription=e.tryLoadPackDescription;exports.RegistryV1=m;exports.RegistryV2Reader=R;exports.folderReaderByUrl=y;
2
2
  //# sourceMappingURL=index.js.map
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 BlockPackManifest,\n BlockPackMetaEmbeddedBytes,\n BlockPackOverview\n} from '@milaboratories/pl-model-middle-layer';\nimport { FolderReader } from '../../io';\nimport canonicalize from 'canonicalize';\nimport {\n GlobalOverviewEntryReg,\n GlobalOverviewFileName,\n GlobalOverviewReg,\n MainPrefix,\n ManifestFileName,\n packageContentPrefix,\n packageContentPrefixInsideV2\n} from './schema_public';\nimport { BlockComponentsAbsoluteUrl, BlockPackMetaEmbedBytes } from '../model';\n\nexport type BlockPackOverviewNoRegLabel = Omit<BlockPackOverview, 'registryId'>;\n\nexport class RegistryV2Reader {\n private readonly metaCache = new Map<\n string,\n { sha256: string; meta: BlockPackMetaEmbeddedBytes }\n >();\n\n private readonly v2RootFolderReader: FolderReader;\n\n constructor(private readonly registryReader: FolderReader) {\n this.v2RootFolderReader = registryReader.relativeReader(MainPrefix);\n }\n\n private async embedMetaContent(\n entry: GlobalOverviewEntryReg\n ): Promise<BlockPackMetaEmbeddedBytes> {\n const id = canonicalize(entry.id)!;\n const fromCache = this.metaCache.get(id);\n if (fromCache && fromCache.sha256 === entry.latestManifestSha256) return fromCache.meta;\n const rootContentReader = this.v2RootFolderReader.getContentReader();\n const meta = await BlockPackMetaEmbedBytes(rootContentReader).parseAsync(entry.latest.meta);\n this.metaCache.set(id, { sha256: entry.latestManifestSha256, meta });\n return meta;\n }\n\n public async listBlockPacks(): Promise<BlockPackOverviewNoRegLabel[]> {\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 return await Promise.all(\n globalOverview.packages.map(\n async (p) =>\n ({\n id: p.latest.id,\n meta: await this.embedMetaContent(p),\n spec: {\n type: 'from-registry-v2',\n id: p.latest.id,\n registryUrl: this.registryReader.rootUrl.toString()\n },\n otherVersions: p.allVersions\n }) satisfies BlockPackOverviewNoRegLabel\n )\n );\n }\n\n public async getComponents(id: BlockPackId): Promise<BlockComponentsAbsoluteUrl> {\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 }\n}\n","import { Agent, 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';\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 ?? new Agent());\n default:\n throw new Error(`Unknown protocol: ${url.protocol}`);\n }\n}\n"],"names":["RegistryV2Reader","registryReader","__publicField","MainPrefix","entry","id","canonicalize","fromCache","rootContentReader","meta","BlockPackMetaEmbedBytes","globalOverview","GlobalOverviewReg","GlobalOverviewFileName","p","packageFolderReader","packageContentPrefixInsideV2","manifest","BlockPackManifest","ManifestFileName","BlockComponentsAbsoluteUrl","HttpFolderReader","rootUrl","httpDispatcher","file","targetUrl","response","request","relativePath","reader","path","FSFolderReader","root","targetPath","pathPosix","fsp","posixToLocalPath","localToPosix","folderReaderByUrl","address","url","rootPath","Agent"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/v2/registry/registry_reader.ts","../src/io/folder_reader.ts"],"sourcesContent":["import {\n BlockPackId,\n BlockPackIdNoVersion,\n blockPackIdNoVersionEquals,\n BlockPackManifest,\n BlockPackMetaEmbeddedBytes,\n BlockPackOverview,\n BlockPackSpec\n} from '@milaboratories/pl-model-middle-layer';\nimport { FolderReader } from '../../io';\nimport canonicalize from 'canonicalize';\nimport {\n GlobalOverviewEntryReg,\n GlobalOverviewFileName,\n GlobalOverviewReg,\n MainPrefix,\n ManifestFileName,\n packageContentPrefix,\n packageContentPrefixInsideV2\n} from './schema_public';\nimport { BlockComponentsAbsoluteUrl, BlockPackMetaEmbedBytes } from '../model';\nimport { LRUCache } from 'lru-cache';\n\nexport type BlockPackOverviewNoRegLabel = Omit<BlockPackOverview, 'registryId'>;\n\nexport type RegistryV2ReaderOps = {\n /** Number of milliseconds to cache retrieved block list for */\n cacheBlockListFor: number;\n /** Number of milliseconds to keep cached retrieved block list for, if new requests returns error */\n keepStaleBlockListFor: number;\n};\n\nconst DefaultRegistryV2ReaderOps: RegistryV2ReaderOps = {\n cacheBlockListFor: 45e3, // 45 seconds\n keepStaleBlockListFor: 300e3 // 5 minutes\n};\n\nexport class RegistryV2Reader {\n private readonly v2RootFolderReader: FolderReader;\n private readonly ops: RegistryV2ReaderOps;\n\n constructor(\n private readonly registryReader: FolderReader,\n ops?: Partial<RegistryV2ReaderOps>\n ) {\n this.v2RootFolderReader = registryReader.relativeReader(MainPrefix);\n this.ops = { ...DefaultRegistryV2ReaderOps, ...(ops ?? {}) };\n }\n\n private readonly embeddedMetaCache = new LRUCache<\n string,\n BlockPackMetaEmbeddedBytes,\n GlobalOverviewEntryReg\n >({\n max: 500,\n fetchMethod: async (key, staleValue, options) => {\n const rootContentReader = this.v2RootFolderReader.getContentReader();\n const meta = await BlockPackMetaEmbedBytes(rootContentReader).parseAsync(\n options.context.latest.meta\n );\n return meta;\n }\n });\n\n private async embedMetaContent(\n entry: GlobalOverviewEntryReg\n ): Promise<BlockPackMetaEmbeddedBytes> {\n return await this.embeddedMetaCache.forceFetch(\n canonicalize({ id: entry.id, sha256: entry.latestManifestSha256 })!,\n { context: entry }\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 const rootContentReader = this.v2RootFolderReader.getContentReader();\n\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(\n async (p) =>\n ({\n id: p.latest.id,\n meta: await this.embedMetaContent(p),\n spec: {\n type: 'from-registry-v2',\n id: p.latest.id,\n registryUrl: this.registryReader.rootUrl.toString()\n },\n otherVersions: p.allVersions\n }) satisfies BlockPackOverviewNoRegLabel\n )\n );\n\n this.listCache = result;\n this.listCacheTimestamp = Date.now();\n\n return result;\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 getOverviewForSpec(\n id: BlockPackIdNoVersion\n ): Promise<BlockPackOverviewNoRegLabel | undefined> {\n return (await this.listBlockPacks()).find((e) => blockPackIdNoVersionEquals(id, e.id));\n }\n\n private readonly componentsCache = new LRUCache<string, BlockComponentsAbsoluteUrl, BlockPackId>({\n max: 500,\n fetchMethod: async (key, staleValue, { context: id }) => {\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 }\n });\n\n public async getComponents(id: BlockPackId): Promise<BlockComponentsAbsoluteUrl> {\n return await this.componentsCache.forceFetch(canonicalize(id)!, { context: id });\n }\n}\n","import { Agent, 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';\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 ?? new Agent());\n default:\n throw new Error(`Unknown protocol: ${url.protocol}`);\n }\n}\n"],"names":["DefaultRegistryV2ReaderOps","RegistryV2Reader","registryReader","ops","__publicField","LRUCache","key","staleValue","options","rootContentReader","BlockPackMetaEmbedBytes","id","packageFolderReader","packageContentPrefixInsideV2","manifest","BlockPackManifest","ManifestFileName","BlockComponentsAbsoluteUrl","MainPrefix","entry","canonicalize","globalOverview","GlobalOverviewReg","GlobalOverviewFileName","result","p","e","blockPackIdNoVersionEquals","HttpFolderReader","rootUrl","httpDispatcher","file","targetUrl","response","request","relativePath","reader","path","FSFolderReader","root","targetPath","pathPosix","fsp","posixToLocalPath","localToPosix","folderReaderByUrl","address","url","rootPath","Agent"],"mappings":"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"}
package/dist/index.mjs CHANGED
@@ -1,189 +1,223 @@
1
- var d = Object.defineProperty;
2
- var g = (t, e, a) => e in t ? d(t, e, { enumerable: !0, configurable: !0, writable: !0, value: a }) : t[e] = a;
3
- var i = (t, e, a) => g(t, typeof e != "symbol" ? e + "" : e, a);
4
- import { e as f, f as m, G as k, h, p as v, M as R, i as u, j as P, k as w, m as B, n as y, o as C, q as F, r as b, t as M, P as O, u as S, v as x, w as D } from "./config-CL-9hOpg.mjs";
5
- import { Q as te, O as oe, W as se, a7 as re, U as ie, V as le, L as ne, a as ce, B as pe, N as de, d as ge, F as fe, a6 as me, a4 as ke, a5 as he, a3 as ve, a9 as Re, a8 as ue, $ as Pe, a1 as we, Z as Be, a0 as ye, T as Ce, R as Fe, x as be, S as Me, A as Oe, C as Se, z as xe, c as De, D as Te, b as Ue, l as Ee, y as Ge, E as Ae, _ as Le, a2 as Ve, X as je, I as Ne, J as Je, K as ze, H as We, s as _e, Y as $e } from "./config-CL-9hOpg.mjs";
6
- import { Agent as T, request as U } from "undici";
7
- import s from "node:path";
8
- import r from "node:path/posix";
9
- import E from "node:fs/promises";
10
- import { BlockPackManifest as G } from "@milaboratories/pl-model-middle-layer";
11
- import A from "canonicalize";
1
+ var m = Object.defineProperty;
2
+ var f = (a, e, t) => e in a ? m(a, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : a[e] = t;
3
+ var r = (a, e, t) => f(a, typeof e != "symbol" ? e + "" : e, t);
4
+ import { e as k, f as g, G as v, h as u, p as R, M as w, i as P, j as C, k as B, m as y, n as F, o as b, q as x, r as D, t as T, P as M, u as O, v as S, w as U } from "./config-CL-9hOpg.mjs";
5
+ import { Q as ie, O as le, W as ne, a7 as ce, U as pe, V as de, L as he, a as me, B as fe, N as ke, d as ge, F as ve, a6 as ue, a4 as Re, a5 as we, a3 as Pe, a9 as Ce, a8 as Be, $ as ye, a1 as Fe, Z as be, a0 as xe, T as De, R as Te, x as Me, S as Oe, A as Se, C as Ue, z as Ee, c as Le, D as Ve, b as Ge, l as Ae, y as Ne, E as je, _ as Je, a2 as ze, X as We, I as qe, J as Ie, K as _e, H as $e, s as Ye, Y as He } from "./config-CL-9hOpg.mjs";
6
+ import { Agent as E, request as L } from "undici";
7
+ import i from "node:path";
8
+ import l from "node:path/posix";
9
+ import V from "node:fs/promises";
10
+ import { blockPackIdNoVersionEquals as G, BlockPackManifest as A } from "@milaboratories/pl-model-middle-layer";
11
+ import d from "canonicalize";
12
12
  import "zod";
13
13
  import "mime-types";
14
14
  import "tar";
15
15
  import "@milaboratories/resolve-helper";
16
- class Q {
17
- constructor(e) {
18
- i(this, "metaCache", /* @__PURE__ */ new Map());
19
- i(this, "v2RootFolderReader");
20
- this.registryReader = e, this.v2RootFolderReader = e.relativeReader(f);
16
+ import { LRUCache as h } from "lru-cache";
17
+ const N = {
18
+ cacheBlockListFor: 45e3,
19
+ // 45 seconds
20
+ keepStaleBlockListFor: 3e5
21
+ // 5 minutes
22
+ };
23
+ class te {
24
+ constructor(e, t) {
25
+ r(this, "v2RootFolderReader");
26
+ r(this, "ops");
27
+ r(this, "embeddedMetaCache", new h({
28
+ max: 500,
29
+ fetchMethod: async (e, t, o) => {
30
+ const s = this.v2RootFolderReader.getContentReader();
31
+ return await g(s).parseAsync(
32
+ o.context.latest.meta
33
+ );
34
+ }
35
+ }));
36
+ r(this, "listCacheTimestamp", 0);
37
+ r(this, "listCache");
38
+ r(this, "componentsCache", new h({
39
+ max: 500,
40
+ fetchMethod: async (e, t, { context: o }) => {
41
+ const s = this.v2RootFolderReader.relativeReader(
42
+ R(o)
43
+ ), p = A.parse(
44
+ JSON.parse(Buffer.from(await s.readFile(w)).toString())
45
+ );
46
+ return P(s.rootUrl.toString()).parse(
47
+ p.description.components
48
+ );
49
+ }
50
+ }));
51
+ this.registryReader = e, this.v2RootFolderReader = e.relativeReader(k), this.ops = { ...N, ...t ?? {} };
21
52
  }
22
53
  async embedMetaContent(e) {
23
- const a = A(e.id), o = this.metaCache.get(a);
24
- if (o && o.sha256 === e.latestManifestSha256) return o.meta;
25
- const p = this.v2RootFolderReader.getContentReader(), c = await m(p).parseAsync(e.latest.meta);
26
- return this.metaCache.set(a, { sha256: e.latestManifestSha256, meta: c }), c;
54
+ return await this.embeddedMetaCache.forceFetch(
55
+ d({ id: e.id, sha256: e.latestManifestSha256 }),
56
+ { context: e }
57
+ );
27
58
  }
28
59
  async listBlockPacks() {
29
- this.v2RootFolderReader.getContentReader();
30
- const e = k.parse(
31
- JSON.parse(
32
- Buffer.from(await this.v2RootFolderReader.readFile(h)).toString()
33
- )
34
- );
35
- return await Promise.all(
36
- e.packages.map(
37
- async (a) => ({
38
- id: a.latest.id,
39
- meta: await this.embedMetaContent(a),
40
- spec: {
41
- type: "from-registry-v2",
42
- id: a.latest.id,
43
- registryUrl: this.registryReader.rootUrl.toString()
44
- },
45
- otherVersions: a.allVersions
46
- })
47
- )
48
- );
60
+ if (this.listCache !== void 0 && Date.now() - this.listCacheTimestamp <= this.ops.cacheBlockListFor)
61
+ return this.listCache;
62
+ try {
63
+ const e = this.v2RootFolderReader.getContentReader(), t = v.parse(
64
+ JSON.parse(
65
+ Buffer.from(await this.v2RootFolderReader.readFile(u)).toString()
66
+ )
67
+ ), o = await Promise.all(
68
+ t.packages.map(
69
+ async (s) => ({
70
+ id: s.latest.id,
71
+ meta: await this.embedMetaContent(s),
72
+ spec: {
73
+ type: "from-registry-v2",
74
+ id: s.latest.id,
75
+ registryUrl: this.registryReader.rootUrl.toString()
76
+ },
77
+ otherVersions: s.allVersions
78
+ })
79
+ )
80
+ );
81
+ return this.listCache = o, this.listCacheTimestamp = Date.now(), o;
82
+ } catch (e) {
83
+ if (this.listCache !== void 0 && Date.now() - this.listCacheTimestamp <= this.ops.keepStaleBlockListFor)
84
+ return this.listCache;
85
+ throw e;
86
+ }
87
+ }
88
+ async getOverviewForSpec(e) {
89
+ return (await this.listBlockPacks()).find((t) => G(e, t.id));
49
90
  }
50
91
  async getComponents(e) {
51
- const a = this.v2RootFolderReader.relativeReader(
52
- v(e)
53
- ), o = G.parse(
54
- JSON.parse(Buffer.from(await a.readFile(R)).toString())
55
- );
56
- return u(a.rootUrl.toString()).parse(
57
- o.description.components
58
- );
92
+ return await this.componentsCache.forceFetch(d(e), { context: e });
59
93
  }
60
94
  }
61
- const X = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
95
+ const ae = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
62
96
  __proto__: null,
63
- GlobalOverviewPath: P,
64
- MetaFile: w,
65
- PlPackageConfigData: B,
66
- PlPackageJsonConfigFile: y,
67
- PlPackageYamlConfigFile: C,
68
- PlRegCommonConfigData: F,
69
- PlRegFullPackageConfigData: b,
70
- PlRegPackageConfig: M,
71
- PlRegPackageConfigDataShard: O,
72
- packageContentPrefix: S,
73
- packageOverviewPath: x,
74
- payloadFilePath: D
97
+ GlobalOverviewPath: C,
98
+ MetaFile: B,
99
+ PlPackageConfigData: y,
100
+ PlPackageJsonConfigFile: F,
101
+ PlPackageYamlConfigFile: b,
102
+ PlRegCommonConfigData: x,
103
+ PlRegFullPackageConfigData: D,
104
+ PlRegPackageConfig: T,
105
+ PlRegPackageConfigDataShard: M,
106
+ packageContentPrefix: O,
107
+ packageOverviewPath: S,
108
+ payloadFilePath: U
75
109
  }, Symbol.toStringTag, { value: "Module" }));
76
- class l {
77
- constructor(e, a) {
78
- this.rootUrl = e, this.httpDispatcher = a;
110
+ class n {
111
+ constructor(e, t) {
112
+ this.rootUrl = e, this.httpDispatcher = t;
79
113
  }
80
114
  async readFile(e) {
81
- const a = new URL(e, this.rootUrl), o = await U(a, {
115
+ const t = new URL(e, this.rootUrl), o = await L(t, {
82
116
  dispatcher: this.httpDispatcher
83
117
  });
84
118
  return Buffer.from(await o.body.arrayBuffer());
85
119
  }
86
120
  relativeReader(e) {
87
- return e.endsWith("/") || (e = e + "/"), new l(new URL(e, this.rootUrl), this.httpDispatcher);
121
+ return e.endsWith("/") || (e = e + "/"), new n(new URL(e, this.rootUrl), this.httpDispatcher);
88
122
  }
89
123
  getContentReader(e) {
90
- let a = this;
91
- return e !== void 0 && (a = a.relativeReader(e)), (o) => a.readFile(o);
124
+ let t = this;
125
+ return e !== void 0 && (t = t.relativeReader(e)), (o) => t.readFile(o);
92
126
  }
93
127
  }
94
- class n {
95
- constructor(e, a) {
96
- this.rootUrl = e, this.root = a;
128
+ class c {
129
+ constructor(e, t) {
130
+ this.rootUrl = e, this.root = t;
97
131
  }
98
132
  async readFile(e) {
99
- const a = s.join(this.root, ...e.split(r.sep));
100
- return await E.readFile(a);
133
+ const t = i.join(this.root, ...e.split(l.sep));
134
+ return await V.readFile(t);
101
135
  }
102
136
  relativeReader(e) {
103
- return e.endsWith("/") || (e = e + "/"), new n(
137
+ return e.endsWith("/") || (e = e + "/"), new c(
104
138
  new URL(e, this.rootUrl),
105
- s.join(this.root, ...e.split(r.sep))
139
+ i.join(this.root, ...e.split(l.sep))
106
140
  );
107
141
  }
108
142
  getContentReader(e) {
109
- let a = this;
110
- return e !== void 0 && (a = a.relativeReader(e)), (o) => a.readFile(o);
143
+ let t = this;
144
+ return e !== void 0 && (t = t.relativeReader(e)), (o) => t.readFile(o);
111
145
  }
112
146
  }
113
- function L(t) {
114
- return t.split(r.sep).join(s.sep);
147
+ function j(a) {
148
+ return a.split(l.sep).join(i.sep);
115
149
  }
116
- function V(t) {
117
- return t.split(s.sep).join(r.sep);
150
+ function J(a) {
151
+ return a.split(i.sep).join(l.sep);
118
152
  }
119
- function Z(t, e) {
120
- t.endsWith("/") || (t = t + "/");
121
- const a = new URL(t, `file:${V(s.resolve("."))}/`);
122
- switch (a.protocol) {
153
+ function oe(a, e) {
154
+ a.endsWith("/") || (a = a + "/");
155
+ const t = new URL(a, `file:${J(i.resolve("."))}/`);
156
+ switch (t.protocol) {
123
157
  case "file:":
124
- const o = L(a.pathname);
125
- return new n(a, o);
158
+ const o = j(t.pathname);
159
+ return new c(t, o);
126
160
  case "https:":
127
161
  case "http:":
128
- return new l(a, e ?? new T());
162
+ return new n(t, e ?? new E());
129
163
  default:
130
- throw new Error(`Unknown protocol: ${a.protocol}`);
164
+ throw new Error(`Unknown protocol: ${t.protocol}`);
131
165
  }
132
166
  }
133
167
  export {
134
- u as BlockComponentsAbsoluteUrl,
135
- te as BlockComponentsConsolidate,
136
- oe as BlockComponentsDescription,
137
- se as BlockDescriptionPackageJsonField,
138
- re as BlockDescriptionToExplicitBinaryBytes,
139
- ie as BlockPackDescriptionConsolidateToFolder,
140
- le as BlockPackDescriptionManifestAddRelativePathPrefix,
141
- ne as BlockPackMetaConsolidate,
142
- ce as BlockPackMetaDescription,
143
- pe as BlockPackMetaEmbedAbsoluteBase64,
144
- de as BlockPackMetaEmbedAbsoluteBytes,
145
- m as BlockPackMetaEmbedBytes,
168
+ P as BlockComponentsAbsoluteUrl,
169
+ ie as BlockComponentsConsolidate,
170
+ le as BlockComponentsDescription,
171
+ ne as BlockDescriptionPackageJsonField,
172
+ ce as BlockDescriptionToExplicitBinaryBytes,
173
+ pe as BlockPackDescriptionConsolidateToFolder,
174
+ de as BlockPackDescriptionManifestAddRelativePathPrefix,
175
+ he as BlockPackMetaConsolidate,
176
+ me as BlockPackMetaDescription,
177
+ fe as BlockPackMetaEmbedAbsoluteBase64,
178
+ ke as BlockPackMetaEmbedAbsoluteBytes,
179
+ g as BlockPackMetaEmbedBytes,
146
180
  ge as BlockRegistryV2,
147
- fe as FSStorage,
148
- me as GlobalOverview,
149
- ke as GlobalOverviewEntry,
150
- he as GlobalOverviewEntryReg,
151
- h as GlobalOverviewFileName,
152
- ve as GlobalOverviewPath,
153
- k as GlobalOverviewReg,
154
- Re as GlobalOverviewToExplicitBinaryBase64,
155
- ue as GlobalOverviewToExplicitBinaryBytes,
156
- f as MainPrefix,
157
- R as ManifestFileName,
158
- Pe as ManifestSuffix,
159
- we as PackageOverview,
160
- Be as PackageOverviewFileName,
161
- ye as PackageOverviewVersionEntry,
162
- X as RegistryV1,
163
- Q as RegistryV2Reader,
164
- Ce as ResolvedBlockPackDescriptionFromPackageJson,
165
- Fe as ResolvedModuleFile,
166
- be as ResolvedModuleFolder,
167
- Me as S3Storage,
168
- Oe as absoluteToBase64,
169
- Se as absoluteToBytes,
170
- xe as absoluteToString,
171
- De as buildBlockPackDist,
172
- Te as cpAbsoluteToRelative,
173
- Z as folderReaderByUrl,
174
- Ue as loadPackDescription,
175
- Ee as loadPackDescriptionRaw,
176
- Ge as mapLocalToAbsolute,
177
- Ae as packFolderToRelativeTgz,
178
- Le as packageContentPrefix,
179
- v as packageContentPrefixInsideV2,
180
- Ve as packageOverviewPath,
181
- je as parsePackageName,
182
- Ne as relativeToContentString,
183
- Je as relativeToExplicitBinary64,
184
- ze as relativeToExplicitBytes,
185
- We as relativeToExplicitString,
186
- _e as storageByUrl,
187
- $e as tryLoadPackDescription
181
+ ve as FSStorage,
182
+ ue as GlobalOverview,
183
+ Re as GlobalOverviewEntry,
184
+ we as GlobalOverviewEntryReg,
185
+ u as GlobalOverviewFileName,
186
+ Pe as GlobalOverviewPath,
187
+ v as GlobalOverviewReg,
188
+ Ce as GlobalOverviewToExplicitBinaryBase64,
189
+ Be as GlobalOverviewToExplicitBinaryBytes,
190
+ k as MainPrefix,
191
+ w as ManifestFileName,
192
+ ye as ManifestSuffix,
193
+ Fe as PackageOverview,
194
+ be as PackageOverviewFileName,
195
+ xe as PackageOverviewVersionEntry,
196
+ ae as RegistryV1,
197
+ te as RegistryV2Reader,
198
+ De as ResolvedBlockPackDescriptionFromPackageJson,
199
+ Te as ResolvedModuleFile,
200
+ Me as ResolvedModuleFolder,
201
+ Oe as S3Storage,
202
+ Se as absoluteToBase64,
203
+ Ue as absoluteToBytes,
204
+ Ee as absoluteToString,
205
+ Le as buildBlockPackDist,
206
+ Ve as cpAbsoluteToRelative,
207
+ oe as folderReaderByUrl,
208
+ Ge as loadPackDescription,
209
+ Ae as loadPackDescriptionRaw,
210
+ Ne as mapLocalToAbsolute,
211
+ je as packFolderToRelativeTgz,
212
+ Je as packageContentPrefix,
213
+ R as packageContentPrefixInsideV2,
214
+ ze as packageOverviewPath,
215
+ We as parsePackageName,
216
+ qe as relativeToContentString,
217
+ Ie as relativeToExplicitBinary64,
218
+ _e as relativeToExplicitBytes,
219
+ $e as relativeToExplicitString,
220
+ Ye as storageByUrl,
221
+ He as tryLoadPackDescription
188
222
  };
189
223
  //# sourceMappingURL=index.mjs.map
@@ -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 BlockPackManifest,\n BlockPackMetaEmbeddedBytes,\n BlockPackOverview\n} from '@milaboratories/pl-model-middle-layer';\nimport { FolderReader } from '../../io';\nimport canonicalize from 'canonicalize';\nimport {\n GlobalOverviewEntryReg,\n GlobalOverviewFileName,\n GlobalOverviewReg,\n MainPrefix,\n ManifestFileName,\n packageContentPrefix,\n packageContentPrefixInsideV2\n} from './schema_public';\nimport { BlockComponentsAbsoluteUrl, BlockPackMetaEmbedBytes } from '../model';\n\nexport type BlockPackOverviewNoRegLabel = Omit<BlockPackOverview, 'registryId'>;\n\nexport class RegistryV2Reader {\n private readonly metaCache = new Map<\n string,\n { sha256: string; meta: BlockPackMetaEmbeddedBytes }\n >();\n\n private readonly v2RootFolderReader: FolderReader;\n\n constructor(private readonly registryReader: FolderReader) {\n this.v2RootFolderReader = registryReader.relativeReader(MainPrefix);\n }\n\n private async embedMetaContent(\n entry: GlobalOverviewEntryReg\n ): Promise<BlockPackMetaEmbeddedBytes> {\n const id = canonicalize(entry.id)!;\n const fromCache = this.metaCache.get(id);\n if (fromCache && fromCache.sha256 === entry.latestManifestSha256) return fromCache.meta;\n const rootContentReader = this.v2RootFolderReader.getContentReader();\n const meta = await BlockPackMetaEmbedBytes(rootContentReader).parseAsync(entry.latest.meta);\n this.metaCache.set(id, { sha256: entry.latestManifestSha256, meta });\n return meta;\n }\n\n public async listBlockPacks(): Promise<BlockPackOverviewNoRegLabel[]> {\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 return await Promise.all(\n globalOverview.packages.map(\n async (p) =>\n ({\n id: p.latest.id,\n meta: await this.embedMetaContent(p),\n spec: {\n type: 'from-registry-v2',\n id: p.latest.id,\n registryUrl: this.registryReader.rootUrl.toString()\n },\n otherVersions: p.allVersions\n }) satisfies BlockPackOverviewNoRegLabel\n )\n );\n }\n\n public async getComponents(id: BlockPackId): Promise<BlockComponentsAbsoluteUrl> {\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 }\n}\n","import { Agent, 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';\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 ?? new Agent());\n default:\n throw new Error(`Unknown protocol: ${url.protocol}`);\n }\n}\n"],"names":["RegistryV2Reader","registryReader","__publicField","MainPrefix","entry","id","canonicalize","fromCache","rootContentReader","meta","BlockPackMetaEmbedBytes","globalOverview","GlobalOverviewReg","GlobalOverviewFileName","p","packageFolderReader","packageContentPrefixInsideV2","manifest","BlockPackManifest","ManifestFileName","BlockComponentsAbsoluteUrl","HttpFolderReader","rootUrl","httpDispatcher","file","targetUrl","response","request","relativePath","reader","path","FSFolderReader","root","targetPath","pathPosix","fsp","posixToLocalPath","localToPosix","folderReaderByUrl","address","url","rootPath","Agent"],"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 BlockPackOverview,\n BlockPackSpec\n} from '@milaboratories/pl-model-middle-layer';\nimport { FolderReader } from '../../io';\nimport canonicalize from 'canonicalize';\nimport {\n GlobalOverviewEntryReg,\n GlobalOverviewFileName,\n GlobalOverviewReg,\n MainPrefix,\n ManifestFileName,\n packageContentPrefix,\n packageContentPrefixInsideV2\n} from './schema_public';\nimport { BlockComponentsAbsoluteUrl, BlockPackMetaEmbedBytes } from '../model';\nimport { LRUCache } from 'lru-cache';\n\nexport type BlockPackOverviewNoRegLabel = Omit<BlockPackOverview, 'registryId'>;\n\nexport type RegistryV2ReaderOps = {\n /** Number of milliseconds to cache retrieved block list for */\n cacheBlockListFor: number;\n /** Number of milliseconds to keep cached retrieved block list for, if new requests returns error */\n keepStaleBlockListFor: number;\n};\n\nconst DefaultRegistryV2ReaderOps: RegistryV2ReaderOps = {\n cacheBlockListFor: 45e3, // 45 seconds\n keepStaleBlockListFor: 300e3 // 5 minutes\n};\n\nexport class RegistryV2Reader {\n private readonly v2RootFolderReader: FolderReader;\n private readonly ops: RegistryV2ReaderOps;\n\n constructor(\n private readonly registryReader: FolderReader,\n ops?: Partial<RegistryV2ReaderOps>\n ) {\n this.v2RootFolderReader = registryReader.relativeReader(MainPrefix);\n this.ops = { ...DefaultRegistryV2ReaderOps, ...(ops ?? {}) };\n }\n\n private readonly embeddedMetaCache = new LRUCache<\n string,\n BlockPackMetaEmbeddedBytes,\n GlobalOverviewEntryReg\n >({\n max: 500,\n fetchMethod: async (key, staleValue, options) => {\n const rootContentReader = this.v2RootFolderReader.getContentReader();\n const meta = await BlockPackMetaEmbedBytes(rootContentReader).parseAsync(\n options.context.latest.meta\n );\n return meta;\n }\n });\n\n private async embedMetaContent(\n entry: GlobalOverviewEntryReg\n ): Promise<BlockPackMetaEmbeddedBytes> {\n return await this.embeddedMetaCache.forceFetch(\n canonicalize({ id: entry.id, sha256: entry.latestManifestSha256 })!,\n { context: entry }\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 const rootContentReader = this.v2RootFolderReader.getContentReader();\n\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(\n async (p) =>\n ({\n id: p.latest.id,\n meta: await this.embedMetaContent(p),\n spec: {\n type: 'from-registry-v2',\n id: p.latest.id,\n registryUrl: this.registryReader.rootUrl.toString()\n },\n otherVersions: p.allVersions\n }) satisfies BlockPackOverviewNoRegLabel\n )\n );\n\n this.listCache = result;\n this.listCacheTimestamp = Date.now();\n\n return result;\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 getOverviewForSpec(\n id: BlockPackIdNoVersion\n ): Promise<BlockPackOverviewNoRegLabel | undefined> {\n return (await this.listBlockPacks()).find((e) => blockPackIdNoVersionEquals(id, e.id));\n }\n\n private readonly componentsCache = new LRUCache<string, BlockComponentsAbsoluteUrl, BlockPackId>({\n max: 500,\n fetchMethod: async (key, staleValue, { context: id }) => {\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 }\n });\n\n public async getComponents(id: BlockPackId): Promise<BlockComponentsAbsoluteUrl> {\n return await this.componentsCache.forceFetch(canonicalize(id)!, { context: id });\n }\n}\n","import { Agent, 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';\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 ?? new Agent());\n default:\n throw new Error(`Unknown protocol: ${url.protocol}`);\n }\n}\n"],"names":["DefaultRegistryV2ReaderOps","RegistryV2Reader","registryReader","ops","__publicField","LRUCache","key","staleValue","options","rootContentReader","BlockPackMetaEmbedBytes","id","packageFolderReader","packageContentPrefixInsideV2","manifest","BlockPackManifest","ManifestFileName","BlockComponentsAbsoluteUrl","MainPrefix","entry","canonicalize","globalOverview","GlobalOverviewReg","GlobalOverviewFileName","result","p","e","blockPackIdNoVersionEquals","HttpFolderReader","rootUrl","httpDispatcher","file","targetUrl","response","request","relativePath","reader","path","FSFolderReader","root","targetPath","pathPosix","fsp","posixToLocalPath","localToPosix","folderReaderByUrl","address","url","rootPath","Agent"],"mappings":"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"}
@@ -1,14 +1,25 @@
1
- import { BlockPackId, BlockPackOverview } from '@milaboratories/pl-model-middle-layer';
1
+ import { BlockPackId, BlockPackIdNoVersion, BlockPackOverview } from '@milaboratories/pl-model-middle-layer';
2
2
  import { FolderReader } from '../../io';
3
3
  import { BlockComponentsAbsoluteUrl } from '../model';
4
4
  export type BlockPackOverviewNoRegLabel = Omit<BlockPackOverview, 'registryId'>;
5
+ export type RegistryV2ReaderOps = {
6
+ /** Number of milliseconds to cache retrieved block list for */
7
+ cacheBlockListFor: number;
8
+ /** Number of milliseconds to keep cached retrieved block list for, if new requests returns error */
9
+ keepStaleBlockListFor: number;
10
+ };
5
11
  export declare class RegistryV2Reader {
6
12
  private readonly registryReader;
7
- private readonly metaCache;
8
13
  private readonly v2RootFolderReader;
9
- constructor(registryReader: FolderReader);
14
+ private readonly ops;
15
+ constructor(registryReader: FolderReader, ops?: Partial<RegistryV2ReaderOps>);
16
+ private readonly embeddedMetaCache;
10
17
  private embedMetaContent;
18
+ private listCacheTimestamp;
19
+ private listCache;
11
20
  listBlockPacks(): Promise<BlockPackOverviewNoRegLabel[]>;
21
+ getOverviewForSpec(id: BlockPackIdNoVersion): Promise<BlockPackOverviewNoRegLabel | undefined>;
22
+ private readonly componentsCache;
12
23
  getComponents(id: BlockPackId): Promise<BlockComponentsAbsoluteUrl>;
13
24
  }
14
25
  //# sourceMappingURL=registry_reader.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"registry_reader.d.ts","sourceRoot":"","sources":["../../../src/v2/registry/registry_reader.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EAGX,iBAAiB,EAClB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAWxC,OAAO,EAAE,0BAA0B,EAA2B,MAAM,UAAU,CAAC;AAE/E,MAAM,MAAM,2BAA2B,GAAG,IAAI,CAAC,iBAAiB,EAAE,YAAY,CAAC,CAAC;AAEhF,qBAAa,gBAAgB;IAQf,OAAO,CAAC,QAAQ,CAAC,cAAc;IAP3C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAGtB;IAEJ,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAe;gBAErB,cAAc,EAAE,YAAY;YAI3C,gBAAgB;IAYjB,cAAc,IAAI,OAAO,CAAC,2BAA2B,EAAE,CAAC;IAwBxD,aAAa,CAAC,EAAE,EAAE,WAAW,GAAG,OAAO,CAAC,0BAA0B,CAAC;CAWjF"}
1
+ {"version":3,"file":"registry_reader.d.ts","sourceRoot":"","sources":["../../../src/v2/registry/registry_reader.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,oBAAoB,EAIpB,iBAAiB,EAElB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAWxC,OAAO,EAAE,0BAA0B,EAA2B,MAAM,UAAU,CAAC;AAG/E,MAAM,MAAM,2BAA2B,GAAG,IAAI,CAAC,iBAAiB,EAAE,YAAY,CAAC,CAAC;AAEhF,MAAM,MAAM,mBAAmB,GAAG;IAChC,+DAA+D;IAC/D,iBAAiB,EAAE,MAAM,CAAC;IAC1B,oGAAoG;IACpG,qBAAqB,EAAE,MAAM,CAAC;CAC/B,CAAC;AAOF,qBAAa,gBAAgB;IAKzB,OAAO,CAAC,QAAQ,CAAC,cAAc;IAJjC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAe;IAClD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAsB;gBAGvB,cAAc,EAAE,YAAY,EAC7C,GAAG,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC;IAMpC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAa/B;YAEW,gBAAgB;IAS9B,OAAO,CAAC,kBAAkB,CAAa;IACvC,OAAO,CAAC,SAAS,CAAwD;IAE5D,cAAc,IAAI,OAAO,CAAC,2BAA2B,EAAE,CAAC;IA6CxD,kBAAkB,CAC7B,EAAE,EAAE,oBAAoB,GACvB,OAAO,CAAC,2BAA2B,GAAG,SAAS,CAAC;IAInD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAa7B;IAEU,aAAa,CAAC,EAAE,EAAE,WAAW,GAAG,OAAO,CAAC,0BAA0B,CAAC;CAGjF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@platforma-sdk/block-tools",
3
- "version": "2.3.5",
3
+ "version": "2.3.6",
4
4
  "description": "Utility to manipulate Platforma Blocks and Block Registry",
5
5
  "types": "./dist/lib.d.ts",
6
6
  "main": "./dist/index.js",
@@ -26,15 +26,16 @@
26
26
  "@aws-sdk/client-s3": "^3.658.1",
27
27
  "@oclif/core": "^4.0.23",
28
28
  "canonicalize": "^2.0.0",
29
+ "lru-cache": "^11.0.1",
29
30
  "undici": "^6.19.8",
30
31
  "mime-types": "^2.1.35",
31
32
  "tar": "^7.4.3",
32
33
  "yaml": "^2.5.1",
33
34
  "zod": "^3.23.8",
34
35
  "@milaboratories/resolve-helper": "^1.0.1",
35
- "@milaboratories/pl-model-middle-layer": "^1.4.2",
36
+ "@milaboratories/ts-helpers-oclif": "^1.1.6",
36
37
  "@milaboratories/ts-helpers": "^1.0.28",
37
- "@milaboratories/ts-helpers-oclif": "^1.1.6"
38
+ "@milaboratories/pl-model-middle-layer": "^1.4.2"
38
39
  },
39
40
  "devDependencies": {
40
41
  "typescript": "~5.5.4",
@@ -1,8 +1,11 @@
1
1
  import {
2
2
  BlockPackId,
3
+ BlockPackIdNoVersion,
4
+ blockPackIdNoVersionEquals,
3
5
  BlockPackManifest,
4
6
  BlockPackMetaEmbeddedBytes,
5
- BlockPackOverview
7
+ BlockPackOverview,
8
+ BlockPackSpec
6
9
  } from '@milaboratories/pl-model-middle-layer';
7
10
  import { FolderReader } from '../../io';
8
11
  import canonicalize from 'canonicalize';
@@ -16,66 +19,128 @@ import {
16
19
  packageContentPrefixInsideV2
17
20
  } from './schema_public';
18
21
  import { BlockComponentsAbsoluteUrl, BlockPackMetaEmbedBytes } from '../model';
22
+ import { LRUCache } from 'lru-cache';
19
23
 
20
24
  export type BlockPackOverviewNoRegLabel = Omit<BlockPackOverview, 'registryId'>;
21
25
 
22
- export class RegistryV2Reader {
23
- private readonly metaCache = new Map<
24
- string,
25
- { sha256: string; meta: BlockPackMetaEmbeddedBytes }
26
- >();
26
+ export type RegistryV2ReaderOps = {
27
+ /** Number of milliseconds to cache retrieved block list for */
28
+ cacheBlockListFor: number;
29
+ /** Number of milliseconds to keep cached retrieved block list for, if new requests returns error */
30
+ keepStaleBlockListFor: number;
31
+ };
32
+
33
+ const DefaultRegistryV2ReaderOps: RegistryV2ReaderOps = {
34
+ cacheBlockListFor: 45e3, // 45 seconds
35
+ keepStaleBlockListFor: 300e3 // 5 minutes
36
+ };
27
37
 
38
+ export class RegistryV2Reader {
28
39
  private readonly v2RootFolderReader: FolderReader;
40
+ private readonly ops: RegistryV2ReaderOps;
29
41
 
30
- constructor(private readonly registryReader: FolderReader) {
42
+ constructor(
43
+ private readonly registryReader: FolderReader,
44
+ ops?: Partial<RegistryV2ReaderOps>
45
+ ) {
31
46
  this.v2RootFolderReader = registryReader.relativeReader(MainPrefix);
47
+ this.ops = { ...DefaultRegistryV2ReaderOps, ...(ops ?? {}) };
32
48
  }
33
49
 
50
+ private readonly embeddedMetaCache = new LRUCache<
51
+ string,
52
+ BlockPackMetaEmbeddedBytes,
53
+ GlobalOverviewEntryReg
54
+ >({
55
+ max: 500,
56
+ fetchMethod: async (key, staleValue, options) => {
57
+ const rootContentReader = this.v2RootFolderReader.getContentReader();
58
+ const meta = await BlockPackMetaEmbedBytes(rootContentReader).parseAsync(
59
+ options.context.latest.meta
60
+ );
61
+ return meta;
62
+ }
63
+ });
64
+
34
65
  private async embedMetaContent(
35
66
  entry: GlobalOverviewEntryReg
36
67
  ): Promise<BlockPackMetaEmbeddedBytes> {
37
- const id = canonicalize(entry.id)!;
38
- const fromCache = this.metaCache.get(id);
39
- if (fromCache && fromCache.sha256 === entry.latestManifestSha256) return fromCache.meta;
40
- const rootContentReader = this.v2RootFolderReader.getContentReader();
41
- const meta = await BlockPackMetaEmbedBytes(rootContentReader).parseAsync(entry.latest.meta);
42
- this.metaCache.set(id, { sha256: entry.latestManifestSha256, meta });
43
- return meta;
68
+ return await this.embeddedMetaCache.forceFetch(
69
+ canonicalize({ id: entry.id, sha256: entry.latestManifestSha256 })!,
70
+ { context: entry }
71
+ );
44
72
  }
45
73
 
74
+ private listCacheTimestamp: number = 0;
75
+ private listCache: BlockPackOverviewNoRegLabel[] | undefined = undefined;
76
+
46
77
  public async listBlockPacks(): Promise<BlockPackOverviewNoRegLabel[]> {
47
- const rootContentReader = this.v2RootFolderReader.getContentReader();
48
- const globalOverview = GlobalOverviewReg.parse(
49
- JSON.parse(
50
- Buffer.from(await this.v2RootFolderReader.readFile(GlobalOverviewFileName)).toString()
51
- )
52
- );
53
- return await Promise.all(
54
- globalOverview.packages.map(
55
- async (p) =>
56
- ({
57
- id: p.latest.id,
58
- meta: await this.embedMetaContent(p),
59
- spec: {
60
- type: 'from-registry-v2',
78
+ if (
79
+ this.listCache !== undefined &&
80
+ Date.now() - this.listCacheTimestamp <= this.ops.cacheBlockListFor
81
+ )
82
+ return this.listCache;
83
+ try {
84
+ const rootContentReader = this.v2RootFolderReader.getContentReader();
85
+
86
+ const globalOverview = GlobalOverviewReg.parse(
87
+ JSON.parse(
88
+ Buffer.from(await this.v2RootFolderReader.readFile(GlobalOverviewFileName)).toString()
89
+ )
90
+ );
91
+
92
+ const result = await Promise.all(
93
+ globalOverview.packages.map(
94
+ async (p) =>
95
+ ({
61
96
  id: p.latest.id,
62
- registryUrl: this.registryReader.rootUrl.toString()
63
- },
64
- otherVersions: p.allVersions
65
- }) satisfies BlockPackOverviewNoRegLabel
97
+ meta: await this.embedMetaContent(p),
98
+ spec: {
99
+ type: 'from-registry-v2',
100
+ id: p.latest.id,
101
+ registryUrl: this.registryReader.rootUrl.toString()
102
+ },
103
+ otherVersions: p.allVersions
104
+ }) satisfies BlockPackOverviewNoRegLabel
105
+ )
106
+ );
107
+
108
+ this.listCache = result;
109
+ this.listCacheTimestamp = Date.now();
110
+
111
+ return result;
112
+ } catch (e: unknown) {
113
+ if (
114
+ this.listCache !== undefined &&
115
+ Date.now() - this.listCacheTimestamp <= this.ops.keepStaleBlockListFor
66
116
  )
67
- );
117
+ return this.listCache;
118
+ throw e;
119
+ }
120
+ }
121
+
122
+ public async getOverviewForSpec(
123
+ id: BlockPackIdNoVersion
124
+ ): Promise<BlockPackOverviewNoRegLabel | undefined> {
125
+ return (await this.listBlockPacks()).find((e) => blockPackIdNoVersionEquals(id, e.id));
68
126
  }
69
127
 
128
+ private readonly componentsCache = new LRUCache<string, BlockComponentsAbsoluteUrl, BlockPackId>({
129
+ max: 500,
130
+ fetchMethod: async (key, staleValue, { context: id }) => {
131
+ const packageFolderReader = this.v2RootFolderReader.relativeReader(
132
+ packageContentPrefixInsideV2(id)
133
+ );
134
+ const manifest = BlockPackManifest.parse(
135
+ JSON.parse(Buffer.from(await packageFolderReader.readFile(ManifestFileName)).toString())
136
+ );
137
+ return BlockComponentsAbsoluteUrl(packageFolderReader.rootUrl.toString()).parse(
138
+ manifest.description.components
139
+ );
140
+ }
141
+ });
142
+
70
143
  public async getComponents(id: BlockPackId): Promise<BlockComponentsAbsoluteUrl> {
71
- const packageFolderReader = this.v2RootFolderReader.relativeReader(
72
- packageContentPrefixInsideV2(id)
73
- );
74
- const manifest = BlockPackManifest.parse(
75
- JSON.parse(Buffer.from(await packageFolderReader.readFile(ManifestFileName)).toString())
76
- );
77
- return BlockComponentsAbsoluteUrl(packageFolderReader.rootUrl.toString()).parse(
78
- manifest.description.components
79
- );
144
+ return await this.componentsCache.forceFetch(canonicalize(id)!, { context: id });
80
145
  }
81
146
  }