@platforma-sdk/block-tools 2.1.7 → 2.1.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +1 -1
- package/dist/cli.mjs +1 -1
- package/dist/config-B8NlJ02C.js +3 -0
- package/dist/config-B8NlJ02C.js.map +1 -0
- package/dist/config-jteHItEq.mjs +1325 -0
- package/dist/config-jteHItEq.mjs.map +1 -0
- package/dist/index.js +1 -1
- package/dist/index.mjs +2 -2
- package/dist/v2/model/block_components.d.ts.map +1 -1
- package/dist/v2/model/index.d.ts.map +1 -1
- package/dist/v2/model/meta.d.ts.map +1 -1
- package/package.json +10 -10
- package/dist/config-BJognM_j.mjs +0 -536
- package/dist/config-BJognM_j.mjs.map +0 -1
- package/dist/config-CfA0Dj6h.js +0 -3
- package/dist/config-CfA0Dj6h.js.map +0 -1
package/dist/config-CfA0Dj6h.js
DELETED
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
"use strict";var we=Object.defineProperty;var ve=(t,e,o)=>e in t?we(t,e,{enumerable:!0,configurable:!0,writable:!0,value:o}):t[e]=o;var P=(t,e,o)=>ve(t,typeof e!="symbol"?e+"":e,o);const k=require("node:fs/promises"),c=require("node:path"),s=require("zod"),Pe=require("mime-types"),ye=require("tar"),r=require("@milaboratories/pl-model-middle-layer"),H=require("@milaboratories/ts-helpers"),Fe=require("yaml"),be=require("node:os"),Be=require("node:crypto"),Ce=require("semver/preload"),d=require("node:path/posix"),Q=require("@aws-sdk/client-s3"),$e=require("node:fs");function B(t){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const o in t)if(o!=="default"){const n=Object.getOwnPropertyDescriptor(t,o);Object.defineProperty(e,o,n.get?n:{enumerable:!0,get:()=>t[o]})}}return e.default=t,Object.freeze(e)}const Se=B(Pe),ze=B(ye),Z=B(be),v=B($e);function X(t,e){try{return require.resolve(e,{paths:[t]})}catch(o){if(o.code!=="MODULE_NOT_FOUND")throw o}}function ee(t){return s.z.string().transform((e,o)=>{const n=X(t,e);return n===void 0?(o.addIssue({code:s.z.ZodIssueCode.custom,message:`Can't resolve ${e} against ${t}`}),s.z.NEVER):{type:"absolute-file",file:n}})}function te(t,...e){return s.z.string().transform((o,n)=>{const a=o.endsWith("/")?o:`${o}/`;for(const i of e){const u=X(t,a+i);if(u!==void 0){if(!u.endsWith(i))throw new Error(`Unexpected resolve result ${u} with index file ${i}`);return{type:"absolute-folder",folder:u.slice(0,u.length-i.length)}}}return n.addIssue({code:s.z.ZodIssueCode.custom,message:`Can't resolve ${o} folder against ${t}, no index file found (${e.join(", ")})`}),s.z.NEVER})}function O(t){return e=>e.type==="relative"?{type:"absolute-file",file:c.resolve(t,e.path)}:e}function oe(){return async t=>t.type==="absolute-file"?await k.readFile(t.file,{encoding:"utf-8"}):t.content}function ne(){return async t=>{if(t.type==="absolute-file"){const e=Se.lookup(t.file);if(!e)throw new Error(`Can't recognize mime type of the file: ${t.file}.`);return{type:"explicit-base64",mimeType:e,content:await k.readFile(t.file,{encoding:"base64"})}}else return t}}function F(t,e){return async o=>{if(o.type==="absolute-file"){const n=c.basename(o.file),a=c.resolve(t,n);return e==null||e.push(n),await k.cp(o.file,a),{type:"relative",path:n}}else return o}}function re(t,e,o){if(!e.endsWith(".tgz"))throw new Error(`Unexpected tgz file name: ${e}`);return async n=>{const a=c.resolve(t,e);return await ze.create({gzip:!0,file:a,cwd:n.folder},[n.folder]),o==null||o.push(e),{type:"relative",path:e}}}function M(t){const e=t.endsWith("/")?t:`${t}/`;return o=>o.type==="relative"?{type:"absolute-url",url:e+o.path}:o}function ae(t){return r.BlockComponents(ee(t),te(t,"index.html"))}function ie(t,e){return r.BlockComponents(r.ContentAbsoluteBinaryLocal.transform(F(t,e)),r.ContentAbsoluteFolder.transform(re(t,"ui.tgz",e))).pipe(r.BlockComponentsManifest)}function De(t){return r.BlockComponents(r.ContentRelativeBinary.transform(M(t)),r.ContentRelativeBinary.transform(M(t)))}function se(t){return r.BlockPackMeta(r.DescriptionContentText.transform(O(t)),r.DescriptionContentBinary.transform(O(t)))}function Re(t,e){return r.BlockPackMeta(r.ContentAbsoluteTextLocal.transform(F(t,e)),r.ContentAbsoluteBinaryLocal.transform(F(t,e)))}const Oe=r.BlockPackMeta(r.ContentAbsoluteTextLocal.transform(oe()),r.ContentAbsoluteBinaryLocal.transform(ne())).pipe(r.BlockPackMetaEmbeddedContent);function N(t){return r.CreateBlockPackDescriptionSchema(ae(t),se(t))}function ce(t,e){return r.CreateBlockPackDescriptionSchema(ie(t,e),Re(t,e)).pipe(T)}const T=r.CreateBlockPackDescriptionSchema(r.BlockComponentsManifest,r.BlockPackMetaManifest),le=T.extend({schema:s.z.literal("v1"),files:s.z.array(s.z.string())}),ge="manifest.json";async function Me(t,e){await k.mkdir(e,{recursive:!0});const o=[],n=await ce(e,o).parseAsync(t),a=le.parse({schema:"v1",...n,files:o});return await k.writeFile(c.resolve(e,ge),JSON.stringify(a)),a}async function _(t,e){try{return e(await k.readFile(t))}catch(o){if(o.code=="ENOENT")return;throw new Error("",{cause:o})}}const b="block",Ee=/(?:@[a-zA-Z0-9-.]+\/)?(?<organization>[a-zA-Z0-9-]+)\.(?<name>[a-zA-Z0-9-]+)/;function J(t){const e=t.match(Ee);if(!e)throw new Error(`Malformed package name (${t}), can't infer organization and block pack name.`);const{name:o,organization:n}=e.groups;return{name:o,organization:n}}async function je(t){const e=c.resolve(t,"package.json");try{const o=await _(e,u=>JSON.parse(u.toString("utf-8")));if(o===void 0)return;const n=o[b];if(n===void 0)return;const a={...r.BlockPackDescriptionFromPackageJsonRaw.parse(n),id:{...J(H.notEmpty(o.name,`"name" not found in ${e}`)),version:r.SemVer.parse(o.version)}},i=await N(t).safeParseAsync(a);return i.success?i.data:void 0}catch{return}}async function pe(t){const e=c.resolve(t,"package.json"),o=JSON.parse(await k.readFile(e,{encoding:"utf-8"})),n=o[b];if(n===void 0)throw new Error(`Block description (field ${b}) not found in ${e}.`);return{...r.BlockPackDescriptionFromPackageJsonRaw.parse(n),id:{...J(H.notEmpty(o.name,`"name" not found in ${e}`)),version:r.SemVer.parse(o.version)}}}async function Ne(t){const e=await pe(t);return await N(t).parseAsync(e)}const Te=s.z.string().regex(/^(?:s3:|file:)/),ue=s.z.object({organization:s.z.string(),package:s.z.string(),version:r.SemVer.optional(),files:s.z.record(s.z.string().regex(/^[^\/]+$/),s.z.string()).default({}),meta:s.z.object({}).passthrough()}),fe=s.z.object({registries:s.z.record(s.z.string(),Te).default({}),registry:s.z.string().optional()}),A=fe.merge(ue).required({registry:!0,version:!0}),C=A.partial().required({registries:!0,files:!0}),de="pl.package.json",he="pl.package.yaml",$="v1/";function _e(t){return`${$}${t.organization}/${t.package}/${t.version}`}function q(t,e){return`${$}${t.organization}/${t.package}/${t.version}/${e}`}function E(t){return`${$}${t.organization}/${t.package}/overview.json`}const y=`${$}overview.json`,x="meta.json",j="_updates_v1/per_package_version/";function Je(t,e){return`${j}${t.organization}/${t.package}/${t.version}/${e}`}const Ae=/(?<packageKeyWithoutVersion>(?<organization>[^\/]+)\/(?<pkg>[^\/]+))\/(?<version>[^\/]+)\/(?<seed>[^\/]+)$/,ke="_updates_v1/_global_update_in",Y="_updates_v1/_global_update_out";class qe{constructor(e,o){this.storage=e,this.logger=o}constructNewPackage(e){return new xe(this.storage,e)}async updateRegistry(){var u,U,L,V,W,I,G,K;(u=this.logger)==null||u.info("Initiating registry refresh...");const e=new Map,o=[],n=await this.storage.listFiles(j);(U=this.logger)==null||U.info("Packages to be updated:");for(const l of n){const m=l.match(Ae);if(!m)continue;o.push(l);const{packageKeyWithoutVersion:w,organization:g,pkg:p,version:f,seed:S}=m.groups;let z=e.get(w);z?z.versions.has(f)||z.versions.add(f):e.set(w,{package:{organization:g,package:p},versions:new Set([f])}),(L=this.logger)==null||L.info(` - ${g}:${p}:${f}`)}const a=await this.storage.getFile(y);let i=a===void 0?[]:JSON.parse(a.toString());(V=this.logger)==null||V.info(`Global overview loaded, ${i.length} records`);for(const[,l]of e.entries()){const m=E(l.package),w=await this.storage.getFile(m);let g=w===void 0?[]:JSON.parse(w.toString());(W=this.logger)==null||W.info(`Updating ${l.package.organization}:${l.package.package} overview, ${g.length} records`),g=g.filter(p=>!l.versions.has(p.version));for(const[p]of l.versions.entries()){const f=p.toString(),S=await this.storage.getFile(q({...l.package,version:f},x));S&&g.push({version:f,meta:JSON.parse(S.toString())})}g.sort((p,f)=>Ce.compare(f.version,p.version)),await this.storage.putFile(m,Buffer.from(JSON.stringify(g))),(I=this.logger)==null||I.info(`Done (${g.length} records)`),i=i.filter(p=>p.organization!==l.package.organization||p.package!==l.package.package),i.push({organization:l.package.organization,package:l.package.package,allVersions:g.map(p=>p.version).reverse(),latestVersion:g[0].version,latestMeta:g[0].meta})}await this.storage.putFile(y,Buffer.from(JSON.stringify(i))),(G=this.logger)==null||G.info(`Global overview updated (${i.length} records)`),await this.storage.deleteFiles(...o.map(l=>`${j}${l}`)),(K=this.logger)==null||K.info("Version update requests cleared")}async updateIfNeeded(e=!1){var a,i;(a=this.logger)==null||a.info("Checking if registry requires refresh...");const o=await this.storage.getFile(ke),n=await this.storage.getFile(Y);!e&&o===void 0&&n===void 0||!e&&o!==void 0&&n!==void 0&&o.equals(n)||(await this.updateRegistry(),o&&(await this.storage.putFile(Y,o),(i=this.logger)==null||i.info("Refresh finished")))}async getPackageOverview(e){const o=await this.storage.getFile(E(e));if(o!==void 0)return JSON.parse(o.toString())}async getGlobalOverview(){const e=await this.storage.getFile(y);if(e!==void 0)return JSON.parse(e.toString())}}class xe{constructor(e,o){P(this,"metaAdded",!1);P(this,"seed",Be.randomUUID());this.storage=e,this.name=o}async addFile(e,o){await this.storage.putFile(q(this.name,e),o)}async writeMeta(e){await this.addFile(x,Buffer.from(JSON.stringify(e))),this.metaAdded=!0}async finish(){if(!this.metaAdded)throw new Error("meta not added");await this.storage.putFile(Je(this.name,this.seed),Buffer.of(0)),await this.storage.putFile(ke,Buffer.from(this.seed))}}class Ue{constructor(e,o,n){this.client=e,this.bucket=o,this.root=n}async getFile(e){try{return Buffer.from(await(await this.client.getObject({Bucket:this.bucket,Key:d.join(this.root,e)})).Body.transformToByteArray())}catch(o){if(o.name==="NoSuchKey")return;throw o}}async listFiles(e){const o=d.join(this.root,e),n=Q.paginateListObjectsV2({client:this.client},{Bucket:this.bucket,Prefix:o}),a=[];for await(const i of n)a.push(...i.Contents.map(u=>d.relative(o,u.Key)));return a}async putFile(e,o){await this.client.putObject({Bucket:this.bucket,Key:d.join(this.root,e),Body:o})}async deleteFiles(...e){const o=await this.client.deleteObjects({Bucket:this.bucket,Delete:{Objects:e.map(n=>({Key:d.join(this.root,n)}))}});if(o.Errors!==void 0&&o.Errors.length>0)throw new Error(`Errors encountered while deleting files: ${o.Errors.join(`
|
|
2
|
-
`)}`)}}class Le{constructor(e){P(this,"root");this.root=c.resolve(e)}toAbsolutePath(e){if(d.isAbsolute(e))throw new Error("absolute path");return c.resolve(this.root,e.split(d.sep).join(c.sep))}async getFile(e){try{return await v.promises.readFile(this.toAbsolutePath(e))}catch(o){if(o.code=="ENOENT")return;throw new Error("",{cause:o})}}async listFiles(e){try{const o=this.toAbsolutePath(e);return(await v.promises.readdir(o,{recursive:!0,withFileTypes:!0})).filter(n=>n.isFile()).map(n=>c.relative(o,c.resolve(n.path,n.name)).split(c.sep).join(d.sep))}catch(o){if(o.code=="ENOENT")return[];throw new Error("",{cause:o})}}async putFile(e,o){const n=this.toAbsolutePath(e);await v.promises.mkdir(c.dirname(n),{recursive:!0}),await v.promises.writeFile(n,o)}async deleteFiles(...e){for(const o of e)await v.promises.rm(this.toAbsolutePath(o))}}function Ve(t){const e=new URL(t,`file:${c.resolve(".").split(c.sep).join(d.sep)}/`);switch(e.protocol){case"file:":const o=c.resolve(e.pathname);return new Le(o);case"s3:":const n={},a=e.searchParams.get("region");a&&(n.region=a);const i=e.hostname;return new Ue(new Q.S3(n),i,e.pathname.replace(/^\//,""));default:throw new Error(`Unknown protocol: ${e.protocol}`)}}function h(t,e){return e===void 0?t:{...t,...e,registries:{...t.registries,...e.registries},files:{...t.files,...e.files}}}async function D(t){return _(t,e=>C.parse(JSON.parse(e.toString())))}async function R(t){return _(t,e=>C.parse(Fe.parse(e.toString())))}async function We(){let t=C.parse({});return t=h(t,await D("./.pl.reg.json")),t=h(t,await R("./.pl.reg.yaml")),t=h(t,await D(`${Z.homedir()}/.pl.reg.json`)),t=h(t,await R(`${Z.homedir()}/.pl.reg.yaml`)),t=h(t,await D(de)),t=h(t,await R(he)),t}class me{constructor(e){this.conf=e}createRegistry(e){let o=this.conf.registry;if(!o.startsWith("file:")&&!o.startsWith("s3:")){const n=this.conf.registries[o];if(!n)throw new Error(`Registry with alias "${o}" not found`);o=n}return new qe(Ve(o),e)}get fullPackageName(){return{organization:this.conf.organization,package:this.conf.package,version:this.conf.version}}}async function Ie(t){const e=await We();return new me(A.parse(h(e,t)))}exports.BlockComponentsAbsoluteUrl=De;exports.BlockComponentsConsolidate=ie;exports.BlockComponentsDescription=ae;exports.BlockDescriptionPackageJsonField=b;exports.BlockPackDescriptionConsolidateToFolder=ce;exports.BlockPackDescriptionManifest=T;exports.BlockPackManifest=le;exports.BlockPackManifestFile=ge;exports.BlockPackMetaDescription=se;exports.BlockPackMetaEmbed=Oe;exports.GlobalOverviewPath=y;exports.MetaFile=x;exports.PlPackageConfigData=ue;exports.PlPackageJsonConfigFile=de;exports.PlPackageYamlConfigFile=he;exports.PlRegCommonConfigData=fe;exports.PlRegFullPackageConfigData=A;exports.PlRegPackageConfig=me;exports.PlRegPackageConfigDataShard=C;exports.ResolvedBlockPackDescriptionFromPackageJson=N;exports.ResolvedModuleFile=ee;exports.ResolvedModuleFolder=te;exports.absoluteToBase64=ne;exports.absoluteToString=oe;exports.buildBlockPackDist=Me;exports.cpAbsoluteToRelative=F;exports.getConfig=Ie;exports.loadPackDescription=Ne;exports.loadPackDescriptionRaw=pe;exports.mapLocalToAbsolute=O;exports.mapRemoteToAbsolute=M;exports.packFolderToRelativeTgz=re;exports.packageContentPrefix=_e;exports.packageOverviewPath=E;exports.parsePackageName=J;exports.payloadFilePath=q;exports.tryLoadPackDescription=je;
|
|
3
|
-
//# sourceMappingURL=config-CfA0Dj6h.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config-CfA0Dj6h.js","sources":["../src/v2/model/content_conversion.ts","../src/v2/model/block_components.ts","../src/v2/model/meta.ts","../src/v2/model/index.ts","../src/v2/build_dist.ts","../src/util.ts","../src/v2/source_package.ts","../src/common_types.ts","../src/registry_v1/config_schema.ts","../src/registry_v1/v1_repo_schema.ts","../src/registry_v1/registry.ts","../src/lib/storage.ts","../src/registry_v1/config.ts"],"sourcesContent":["import { z } from 'zod';\nimport path from 'path';\nimport fsp from 'node:fs/promises';\nimport * as mime from 'mime-types';\nimport * as tar from 'tar';\nimport {\n ContentAbsoluteBinaryLocal,\n ContentAbsoluteFile,\n ContentAbsoluteFolder,\n ContentAbsoluteTextLocal,\n ContentAbsoluteUrl,\n ContentAnyLocal,\n ContentExplicitBase64,\n ContentRelative\n} from '@milaboratories/pl-model-middle-layer';\n\ntype ContentCtxFs = {\n type: 'local';\n /** Folder relative to which content should be resolved */\n path: string;\n};\n\ntype ContentCtxUrl = {\n type: 'remote';\n /** URL prefix from which content should be resolved */\n url: string;\n};\n\n/** Describes a place relative to which any content references should be interpreted */\nexport type ContentCtx = ContentCtxFs | ContentCtxUrl;\n\nfunction tryResolve(root: string, request: string): string | undefined {\n try {\n return require.resolve(request, {\n paths: [root]\n });\n } catch (err: any) {\n if (err.code !== 'MODULE_NOT_FOUND') throw err;\n }\n return undefined;\n}\n\nfunction mustResolve(root: string, request: string): string {\n const res = tryResolve(root, request);\n if (res === undefined) throw new Error(`Can't resolve ${request} against ${root}`);\n return res;\n}\n\n/** Zod type that resolves node module request into absolute content */\nexport function ResolvedModuleFile(moduleRoot: string) {\n return z.string().transform<ContentAbsoluteFile>((request, ctx) => {\n const result = tryResolve(moduleRoot, request);\n if (result === undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Can't resolve ${request} against ${moduleRoot}`\n });\n return z.NEVER;\n }\n return {\n type: 'absolute-file',\n file: result\n };\n });\n}\n\n/**\n * Zod type that resolves node module request for folder into absolute folder,\n * given a list of expected index files in that folder\n * */\nexport function ResolvedModuleFolder(\n moduleRoot: string,\n ...indexFilesToLookFor: [string, ...string[]]\n) {\n return z.string().transform<ContentAbsoluteFolder>((request, ctx) => {\n const requestWithSlash = request.endsWith('/') ? request : `${request}/`;\n\n for (const idxFile of indexFilesToLookFor) {\n const result = tryResolve(moduleRoot, requestWithSlash + idxFile);\n if (result !== undefined) {\n if (!result.endsWith(idxFile))\n throw new Error(`Unexpected resolve result ${result} with index file ${idxFile}`);\n return {\n type: 'absolute-folder',\n folder: result.slice(0, result.length - idxFile.length)\n };\n }\n }\n\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Can't resolve ${request} folder against ${moduleRoot}, no index file found (${indexFilesToLookFor.join(', ')})`\n });\n return z.NEVER;\n });\n}\n\nexport function mapLocalToAbsolute(\n root: string\n): <T extends ContentAnyLocal>(value: T) => Exclude<T, ContentRelative> | ContentAbsoluteFile {\n return <T extends ContentAnyLocal>(value: T) =>\n value.type === 'relative'\n ? { type: 'absolute-file', file: path.resolve(root, value.path) }\n : (value as Exclude<T, ContentRelative>);\n}\n\nexport function absoluteToString(): (value: ContentAbsoluteTextLocal) => Promise<string> {\n return async (value) => {\n if (value.type === 'absolute-file')\n return await fsp.readFile(value.file, { encoding: 'utf-8' });\n else return value.content;\n };\n}\n\n// TODO add type and size limitations\nexport function absoluteToBase64(): (\n value: ContentAbsoluteBinaryLocal\n) => Promise<ContentExplicitBase64> {\n return async (value) => {\n if (value.type === 'absolute-file') {\n const mimeType = mime.lookup(value.file);\n if (!mimeType) throw new Error(`Can't recognize mime type of the file: ${value.file}.`);\n return {\n type: 'explicit-base64',\n mimeType,\n content: await fsp.readFile(value.file, { encoding: 'base64' })\n };\n } else return value;\n };\n}\n\nexport function cpAbsoluteToRelative(\n dstFolder: string,\n fileAccumulator?: string[]\n): <T extends Exclude<ContentAnyLocal, ContentRelative>>(\n value: T\n) => Promise<Exclude<T, ContentAbsoluteFile> | ContentRelative> {\n return async <T extends Exclude<ContentAnyLocal, ContentRelative>>(value: T) => {\n if (value.type === 'absolute-file') {\n const fileName = path.basename(value.file);\n const dst = path.resolve(dstFolder, fileName);\n fileAccumulator?.push(fileName);\n await fsp.cp(value.file, dst);\n return { type: 'relative', path: fileName };\n } else return value as Exclude<T, ContentAbsoluteFile>;\n };\n}\n\nexport function packFolderToRelativeTgz(\n dstFolder: string,\n tgzName: string,\n fileAccumulator?: string[]\n): (value: ContentAbsoluteFolder) => Promise<ContentRelative> {\n if (!tgzName.endsWith('.tgz')) throw new Error(`Unexpected tgz file name: ${tgzName}`);\n return async (value: ContentAbsoluteFolder) => {\n const dst = path.resolve(dstFolder, tgzName);\n await tar.create(\n {\n gzip: true,\n file: dst,\n cwd: value.folder\n },\n [value.folder]\n );\n fileAccumulator?.push(tgzName);\n return { type: 'relative', path: tgzName };\n };\n}\n\nexport function mapRemoteToAbsolute(\n rootUrl: string\n): <T extends ContentAnyLocal>(value: T) => Exclude<T, ContentRelative> | ContentAbsoluteUrl {\n const rootWithSlash = rootUrl.endsWith('/') ? rootUrl : `${rootUrl}/`;\n return <T extends ContentAnyLocal>(value: T) =>\n value.type === 'relative'\n ? { type: 'absolute-url', url: rootWithSlash + value.path }\n : (value as Exclude<T, ContentRelative>);\n}\n","import { z } from 'zod';\nimport {\n ResolvedModuleFile,\n ResolvedModuleFolder,\n packFolderToRelativeTgz,\n cpAbsoluteToRelative,\n mapRemoteToAbsolute,\n} from './content_conversion';\nimport { BlockComponents, BlockComponentsManifest, ContentAbsoluteBinaryLocal, ContentAbsoluteFolder, ContentRelativeBinary } from '@milaboratories/pl-model-middle-layer';\n\nexport function BlockComponentsDescription(moduleRoot: string) {\n return BlockComponents(\n ResolvedModuleFile(moduleRoot),\n ResolvedModuleFolder(moduleRoot, 'index.html')\n );\n}\nexport type BlockComponentsDescription = z.infer<ReturnType<typeof BlockComponentsDescription>>;\n\nexport function BlockComponentsConsolidate(dstFolder: string, fileAccumulator?: string[]) {\n return BlockComponents(\n ContentAbsoluteBinaryLocal.transform(cpAbsoluteToRelative(dstFolder, fileAccumulator)),\n ContentAbsoluteFolder.transform(packFolderToRelativeTgz(dstFolder, 'ui.tgz', fileAccumulator))\n ).pipe(BlockComponentsManifest);\n}\n\nexport function BlockComponentsAbsoluteUrl(prefix: string) {\n return BlockComponents(\n ContentRelativeBinary.transform(mapRemoteToAbsolute(prefix)),\n ContentRelativeBinary.transform(mapRemoteToAbsolute(prefix))\n );\n}\nexport type BlockComponentsAbsolute = z.infer<ReturnType<typeof BlockComponentsAbsoluteUrl>>;\n","import {\n BlockPackMeta,\n ContentAbsoluteBinaryLocal,\n ContentAbsoluteTextLocal,\n DescriptionContentBinary,\n DescriptionContentText\n} from '@milaboratories/pl-model-middle-layer';\nimport {\n absoluteToBase64,\n absoluteToString,\n cpAbsoluteToRelative,\n mapLocalToAbsolute\n} from './content_conversion';\nimport { z } from 'zod';\nimport { BlockPackMetaEmbeddedContent } from '@milaboratories/pl-model-middle-layer';\n\nexport function BlockPackMetaDescription(root: string) {\n return BlockPackMeta(\n DescriptionContentText.transform(mapLocalToAbsolute(root)),\n DescriptionContentBinary.transform(mapLocalToAbsolute(root))\n );\n}\nexport type BlockPackMetaDescription = z.infer<ReturnType<typeof BlockPackMetaDescription>>;\n\nexport function BlockPackMetaConsolidate(dstFolder: string, fileAccumulator?: string[]) {\n return BlockPackMeta(\n ContentAbsoluteTextLocal.transform(cpAbsoluteToRelative(dstFolder, fileAccumulator)),\n ContentAbsoluteBinaryLocal.transform(cpAbsoluteToRelative(dstFolder, fileAccumulator))\n );\n}\n\nexport const BlockPackMetaEmbed = BlockPackMeta(\n ContentAbsoluteTextLocal.transform(absoluteToString()),\n ContentAbsoluteBinaryLocal.transform(absoluteToBase64())\n).pipe(BlockPackMetaEmbeddedContent);\nexport type BlockPackMetaEmbed = z.infer<typeof BlockPackMetaEmbed>;\n","import { z } from 'zod';\nimport { BlockComponentsConsolidate, BlockComponentsDescription } from './block_components';\nimport {\n BlockComponentsManifest,\n BlockPackMetaManifest,\n CreateBlockPackDescriptionSchema\n} from '@milaboratories/pl-model-middle-layer';\nimport { BlockPackMetaConsolidate, BlockPackMetaDescription } from './meta';\n\nexport * from './block_components';\nexport * from './content_conversion';\n\nexport function ResolvedBlockPackDescriptionFromPackageJson(root: string) {\n return CreateBlockPackDescriptionSchema(\n BlockComponentsDescription(root),\n BlockPackMetaDescription(root)\n );\n}\nexport type BlockPackDescriptionAbsolute = z.infer<\n ReturnType<typeof ResolvedBlockPackDescriptionFromPackageJson>\n>;\n\nexport function BlockPackDescriptionConsolidateToFolder(\n dstFolder: string,\n fileAccumulator?: string[]\n) {\n return CreateBlockPackDescriptionSchema(\n BlockComponentsConsolidate(dstFolder, fileAccumulator),\n //BlockPackMetaToExplicit\n BlockPackMetaConsolidate(dstFolder, fileAccumulator)\n ).pipe(BlockPackDescriptionManifest);\n}\n\nexport const BlockPackDescriptionManifest = CreateBlockPackDescriptionSchema(\n BlockComponentsManifest,\n BlockPackMetaManifest\n);\nexport type BlockPackDescriptionManifest = z.infer<typeof BlockPackDescriptionManifest>;\n\nexport const BlockPackManifest = BlockPackDescriptionManifest.extend({\n schema: z.literal('v1'),\n files: z.array(z.string())\n});\nexport type BlockPackManifest = z.infer<typeof BlockPackManifest>;\n\nexport const BlockPackManifestFile = 'manifest.json';\n","import {\n BlockPackDescriptionAbsolute,\n BlockPackDescriptionConsolidateToFolder,\n BlockPackDescriptionManifest,\n BlockPackManifest,\n BlockPackManifestFile\n} from './model';\nimport fsp from 'node:fs/promises';\nimport { BlockPackMetaConsolidate, BlockPackMetaDescription } from './model/meta';\nimport { patch } from 'semver';\nimport path from 'node:path';\n\nexport async function buildBlockPackDist(\n description: BlockPackDescriptionAbsolute,\n dst: string\n): Promise<BlockPackManifest> {\n await fsp.mkdir(dst, { recursive: true });\n const files: string[] = [];\n const descriptionRelative = await BlockPackDescriptionConsolidateToFolder(dst, files).parseAsync(\n description\n );\n const manifest: BlockPackManifest = BlockPackManifest.parse({\n schema: 'v1',\n ...descriptionRelative,\n files\n });\n await fsp.writeFile(path.resolve(dst, BlockPackManifestFile), JSON.stringify(manifest));\n return manifest;\n}\n","import { BigIntStats } from 'node:fs';\nimport fsp from 'node:fs/promises';\n\nexport async function tryLoadFile<T>(\n file: string,\n map: (buf: Buffer) => T\n): Promise<T | undefined> {\n try {\n return map(await fsp.readFile(file));\n } catch (err: any) {\n if (err.code == 'ENOENT') return undefined;\n else throw new Error('', { cause: err });\n }\n}\n\nexport async function tryStat(path: string): Promise<BigIntStats | undefined> {\n try {\n return await fsp.stat(path, { bigint: true });\n } catch (error: any) {\n if (error.code === 'ENOENT') {\n return undefined;\n }\n throw error;\n }\n}\n","import path from 'path';\nimport { tryLoadFile } from '../util';\nimport { ResolvedBlockPackDescriptionFromPackageJson, BlockPackDescriptionAbsolute } from './model';\nimport { notEmpty } from '@milaboratories/ts-helpers';\nimport fsp from 'node:fs/promises';\nimport {\n BlockPackDescriptionFromPackageJsonRaw,\n BlockPackDescriptionRaw,\n BlockPackId,\n BlockPackMetaDescriptionRaw,\n SemVer\n} from '@milaboratories/pl-model-middle-layer';\n\nexport const BlockDescriptionPackageJsonField = 'block';\n\nconst ConventionPackageNamePattern =\n /(?:@[a-zA-Z0-9-.]+\\/)?(?<organization>[a-zA-Z0-9-]+)\\.(?<name>[a-zA-Z0-9-]+)/;\n\nexport function parsePackageName(packageName: string): Pick<BlockPackId, 'organization' | 'name'> {\n const match = packageName.match(ConventionPackageNamePattern);\n if (!match)\n throw new Error(\n `Malformed package name (${packageName}), can't infer organization and block pack name.`\n );\n const { name, organization } = match.groups!;\n return { name, organization };\n}\n\nexport async function tryLoadPackDescription(\n moduleRoot: string\n): Promise<BlockPackDescriptionAbsolute | undefined> {\n const fullPackageJsonPath = path.resolve(moduleRoot, 'package.json');\n try {\n const packageJson = await tryLoadFile(fullPackageJsonPath, (buf) =>\n JSON.parse(buf.toString('utf-8'))\n );\n if (packageJson === undefined) return undefined;\n const descriptionNotParsed = packageJson[BlockDescriptionPackageJsonField];\n if (descriptionNotParsed === undefined) return undefined;\n const descriptionRaw = {\n ...BlockPackDescriptionFromPackageJsonRaw.parse(descriptionNotParsed),\n id: {\n ...parsePackageName(\n notEmpty(packageJson['name'], `\"name\" not found in ${fullPackageJsonPath}`)\n ),\n version: SemVer.parse(packageJson['version'])\n }\n };\n const descriptionParsingResult =\n await ResolvedBlockPackDescriptionFromPackageJson(moduleRoot).safeParseAsync(descriptionRaw);\n if (descriptionParsingResult.success) return descriptionParsingResult.data;\n return undefined;\n } catch (e: any) {\n return undefined;\n }\n}\n\nexport async function loadPackDescriptionRaw(moduleRoot: string): Promise<BlockPackDescriptionRaw> {\n const fullPackageJsonPath = path.resolve(moduleRoot, 'package.json');\n const packageJson = JSON.parse(await fsp.readFile(fullPackageJsonPath, { encoding: 'utf-8' }));\n const descriptionNotParsed = packageJson[BlockDescriptionPackageJsonField];\n if (descriptionNotParsed === undefined)\n throw new Error(\n `Block description (field ${BlockDescriptionPackageJsonField}) not found in ${fullPackageJsonPath}.`\n );\n return {\n ...BlockPackDescriptionFromPackageJsonRaw.parse(descriptionNotParsed),\n id: {\n ...parsePackageName(\n notEmpty(packageJson['name'], `\"name\" not found in ${fullPackageJsonPath}`)\n ),\n version: SemVer.parse(packageJson['version'])\n }\n };\n}\n\nexport async function loadPackDescription(\n moduleRoot: string\n): Promise<BlockPackDescriptionAbsolute> {\n const descriptionRaw = await loadPackDescriptionRaw(moduleRoot);\n return await ResolvedBlockPackDescriptionFromPackageJson(moduleRoot).parseAsync(descriptionRaw);\n}\n","import { z } from 'zod';\n\nexport const PlRegAddress = z.string().regex(/^(?:s3:|file:)/);\n","import { z } from 'zod';\nimport { PlRegAddress } from '../common_types';\nimport { SemVer } from '@milaboratories/pl-model-middle-layer';\n\nexport const PlPackageConfigData = z.object({\n organization: z.string(),\n package: z.string(),\n version: SemVer.optional(),\n files: z.record(z.string().regex(/^[^\\/]+$/), z.string()).default({}),\n meta: z.object({}).passthrough()\n});\n\nexport const PlRegCommonConfigData = z.object({\n registries: z.record(z.string(), PlRegAddress).default({}),\n registry: z.string().optional()\n});\nexport type PlRegCommonConfigData = z.infer<typeof PlRegCommonConfigData>;\n\nexport const PlRegFullPackageConfigData = PlRegCommonConfigData.merge(PlPackageConfigData).required(\n { registry: true, version: true }\n);\nexport type PlRegFullPackageConfigData = z.infer<typeof PlRegFullPackageConfigData>;\nexport const PlRegPackageConfigDataShard = PlRegFullPackageConfigData.partial().required({\n registries: true,\n files: true\n});\nexport type PlRegPackageConfigDataShard = z.infer<typeof PlRegPackageConfigDataShard>;\n\nexport const PlPackageJsonConfigFile = 'pl.package.json';\nexport const PlPackageYamlConfigFile = 'pl.package.yaml';\n","export interface FullBlockPackageName {\n organization: string;\n package: string;\n version: string;\n}\n\nconst MainPrefix = 'v1/';\n\nexport function packageContentPrefix(bp: FullBlockPackageName): string {\n return `${MainPrefix}${bp.organization}/${bp.package}/${bp.version}`;\n}\n\nexport function payloadFilePath(bp: FullBlockPackageName, file: string): string {\n return `${MainPrefix}${bp.organization}/${bp.package}/${bp.version}/${file}`;\n}\n\nexport type BlockPackageNameWithoutVersion = Pick<FullBlockPackageName, 'organization' | 'package'>;\n\nexport function packageOverviewPath(bp: BlockPackageNameWithoutVersion): string {\n return `${MainPrefix}${bp.organization}/${bp.package}/overview.json`;\n}\n\nexport const GlobalOverviewPath = `${MainPrefix}overview.json`;\n\nexport const MetaFile = 'meta.json';\n\nexport interface PackageOverviewEntry {\n version: string;\n meta: object;\n}\n\nexport type PackageOverview = PackageOverviewEntry[];\n\nexport interface GlobalOverviewEntry {\n organization: string;\n package: string;\n allVersions: string[];\n latestVersion: string;\n latestMeta: object;\n}\n\nexport type GlobalOverview = GlobalOverviewEntry[];\n","import { RegistryStorage } from '../lib/storage';\nimport { randomUUID } from 'node:crypto';\nimport semver from 'semver/preload';\nimport {\n BlockPackageNameWithoutVersion,\n FullBlockPackageName,\n GlobalOverview,\n GlobalOverviewPath,\n MetaFile,\n PackageOverview,\n packageOverviewPath,\n payloadFilePath\n} from './v1_repo_schema';\nimport { MiLogger } from '@milaboratories/ts-helpers';\n\nfunction fullNameToPath(name: FullBlockPackageName): string {\n return `${name.organization}/${name.package}/${name.version}`;\n}\n\nconst VersionUpdatesPrefix = '_updates_v1/per_package_version/';\n\nfunction packageUpdatePath(bp: FullBlockPackageName, seed: string): string {\n return `${VersionUpdatesPrefix}${bp.organization}/${bp.package}/${bp.version}/${seed}`;\n}\n\nconst PackageUpdatePattern =\n /(?<packageKeyWithoutVersion>(?<organization>[^\\/]+)\\/(?<pkg>[^\\/]+))\\/(?<version>[^\\/]+)\\/(?<seed>[^\\/]+)$/;\n\nconst GlobalUpdateSeedInFile = '_updates_v1/_global_update_in';\nconst GlobalUpdateSeedOutFile = '_updates_v1/_global_update_out';\n\n/*\n Note on convergence guarantee.\n\n Here is what S3 guarantees:\n\n Amazon S3 delivers strong read-after-write consistency automatically,\n without changes to performance or availability, without sacrificing\n regional isolation for applications, and at no additional cost.\n\n After a successful write of a new object or an overwrite of an existing\n object, any subsequent read request immediately receives the latest\n version of the object. S3 also provides strong consistency for list\n operations, so after a write, you can immediately perform a listing\n of the objects in a bucket with any changes reflected.\n\n https://aws.amazon.com/s3/faqs/#What_data_consistency_model_does_Amazon_S3_employ\n\n The following registry update schema with _update_seed / _updated_seed\n seems to guarantee eventual convergence of registry state, though I don't\n have enough time to really think it through, beware.\n\n */\n\n/**\n * Layout:\n *\n * _updates_v1/per_package/\n * organisationA/package1/1.2.3/seedABC <-- Tells that change happened for organisationA/package1 version 1.2.3, and reassembly of package1 overview is required\n * organisationA/package1/1.2.3/seedCDE\n * organisationB/package2/1.4.3/seedFGH\n *\n * _updates_v1/_global_update_in <-- Anybody who changes contents writes a random seed in this file\n * _updates_v1/_global_update_out <-- Update process writes update seed from the _global_update_in here after successful update.\n * Mismatch between contents of those files is a sign that another update should be performed.\n *\n * v1/ <-- Actual block packages content\n * organisationA/package2/1.2.3/meta.json\n * organisationA/package2/1.2.3/main.template.plj.gz\n * organisationA/package2/1.2.3/...\n * organisationA/package2/overview.json <-- Per-package aggregated meta-data over all available versions\n * ...\n *\n * v1/overview.json <-- aggregated information about all packages\n *\n */\nexport class BlockRegistry {\n constructor(\n private readonly storage: RegistryStorage,\n private readonly logger?: MiLogger\n ) {}\n\n constructNewPackage(pack: FullBlockPackageName): BlockRegistryPackConstructor {\n return new BlockRegistryPackConstructor(this.storage, pack);\n }\n\n private async updateRegistry() {\n this.logger?.info('Initiating registry refresh...');\n\n // reading update requests\n const packagesToUpdate = new Map<string, PackageUpdateInfo>();\n const seedPaths: string[] = [];\n const rawSeedPaths = await this.storage.listFiles(VersionUpdatesPrefix);\n this.logger?.info('Packages to be updated:');\n for (const seedPath of rawSeedPaths) {\n const match = seedPath.match(PackageUpdatePattern);\n if (!match) continue;\n seedPaths.push(seedPath);\n const { packageKeyWithoutVersion, organization, pkg, version, seed } = match.groups!;\n\n let update = packagesToUpdate.get(packageKeyWithoutVersion);\n let added = false;\n if (!update) {\n packagesToUpdate.set(packageKeyWithoutVersion, {\n package: { organization, package: pkg },\n versions: new Set([version])\n });\n added = true;\n } else if (!update.versions.has(version)) {\n update.versions.add(version);\n added = true;\n }\n this.logger?.info(` - ${organization}:${pkg}:${version}`);\n }\n\n // loading global overview\n const overviewContent = await this.storage.getFile(GlobalOverviewPath);\n let overview =\n overviewContent === undefined\n ? []\n : (JSON.parse(overviewContent.toString()) as GlobalOverview);\n this.logger?.info(`Global overview loaded, ${overview.length} records`);\n\n // updating packages\n for (const [, packageInfo] of packagesToUpdate.entries()) {\n // reading existing overview\n const overviewFile = packageOverviewPath(packageInfo.package);\n const pOverviewContent = await this.storage.getFile(overviewFile);\n let packageOverview =\n pOverviewContent === undefined\n ? []\n : (JSON.parse(pOverviewContent.toString()) as PackageOverview);\n this.logger?.info(\n `Updating ${packageInfo.package.organization}:${packageInfo.package.package} overview, ${packageOverview.length} records`\n );\n\n // removing versions that we will update\n packageOverview = packageOverview.filter((e) => !packageInfo.versions.has(e.version));\n\n // reading new entries\n for (const [v] of packageInfo.versions.entries()) {\n const version = v.toString();\n const metaContent = await this.storage.getFile(\n payloadFilePath(\n {\n ...packageInfo.package,\n version\n },\n MetaFile\n )\n );\n if (!metaContent) continue;\n packageOverview.push({ version, meta: JSON.parse(metaContent.toString()) });\n }\n\n // sorting entries according to version\n packageOverview.sort((e1, e2) => semver.compare(e2.version, e1.version));\n\n // write package overview back\n await this.storage.putFile(overviewFile, Buffer.from(JSON.stringify(packageOverview)));\n this.logger?.info(`Done (${packageOverview.length} records)`);\n\n // patching corresponding entry in overview\n overview = overview.filter(\n (e) =>\n e.organization !== packageInfo.package.organization ||\n e.package !== packageInfo.package.package\n );\n overview.push({\n organization: packageInfo.package.organization,\n package: packageInfo.package.package,\n allVersions: packageOverview.map((e) => e.version).reverse(),\n latestVersion: packageOverview[0].version,\n latestMeta: packageOverview[0].meta\n });\n }\n\n // writing global overview\n await this.storage.putFile(GlobalOverviewPath, Buffer.from(JSON.stringify(overview)));\n this.logger?.info(`Global overview updated (${overview.length} records)`);\n\n // deleting seeds\n await this.storage.deleteFiles(...seedPaths.map((sp) => `${VersionUpdatesPrefix}${sp}`));\n this.logger?.info(`Version update requests cleared`);\n }\n\n async updateIfNeeded(force: boolean = false): Promise<void> {\n // implementation of main convergence algorithm\n\n this.logger?.info(`Checking if registry requires refresh...`);\n const updateRequestSeed = await this.storage.getFile(GlobalUpdateSeedInFile);\n const currentUpdatedSeed = await this.storage.getFile(GlobalUpdateSeedOutFile);\n if (!force && updateRequestSeed === undefined && currentUpdatedSeed === undefined) return;\n if (\n !force &&\n updateRequestSeed !== undefined &&\n currentUpdatedSeed !== undefined &&\n updateRequestSeed.equals(currentUpdatedSeed)\n )\n return;\n\n await this.updateRegistry();\n\n if (updateRequestSeed) {\n await this.storage.putFile(GlobalUpdateSeedOutFile, updateRequestSeed);\n this.logger?.info(`Refresh finished`);\n }\n }\n\n async getPackageOverview(\n name: BlockPackageNameWithoutVersion\n ): Promise<undefined | PackageOverview> {\n const content = await this.storage.getFile(packageOverviewPath(name));\n if (content === undefined) return undefined;\n return JSON.parse(content.toString()) as PackageOverview;\n }\n\n async getGlobalOverview(): Promise<undefined | GlobalOverview> {\n const content = await this.storage.getFile(GlobalOverviewPath);\n if (content === undefined) return undefined;\n return JSON.parse(content.toString()) as GlobalOverview;\n }\n}\n\nexport class BlockRegistryPackConstructor {\n private metaAdded: boolean = false;\n public readonly seed = randomUUID();\n\n constructor(\n private readonly storage: RegistryStorage,\n public readonly name: FullBlockPackageName\n ) {}\n\n async addFile(file: string, content: Buffer): Promise<void> {\n await this.storage.putFile(payloadFilePath(this.name, file), content);\n }\n\n async writeMeta(meta: object) {\n await this.addFile(MetaFile, Buffer.from(JSON.stringify(meta)));\n this.metaAdded = true;\n }\n\n async finish() {\n if (!this.metaAdded) throw new Error('meta not added');\n await this.storage.putFile(packageUpdatePath(this.name, this.seed), Buffer.of(0));\n await this.storage.putFile(GlobalUpdateSeedInFile, Buffer.from(this.seed));\n }\n}\n\ninterface PackageUpdateInfo {\n package: BlockPackageNameWithoutVersion;\n versions: Set<String>;\n}\n","import pathPosix from 'node:path/posix';\nimport path from 'node:path';\nimport { paginateListObjectsV2, S3 } from '@aws-sdk/client-s3';\nimport * as fs from 'node:fs';\n\nexport interface RegistryStorage {\n putFile(file: string, buffer: Buffer): Promise<void>;\n\n getFile(file: string): Promise<Buffer | undefined>;\n\n listFiles(prefix: string): Promise<string[]>;\n\n deleteFiles(...files: string[]): Promise<void>;\n}\n\nexport class S3Storage implements RegistryStorage {\n constructor(\n public readonly client: S3,\n public readonly bucket: string,\n public readonly root: string\n ) {}\n\n async getFile(file: string): Promise<Buffer | undefined> {\n try {\n return Buffer.from(\n await (\n await this.client.getObject({\n Bucket: this.bucket,\n Key: pathPosix.join(this.root, file)\n })\n ).Body!.transformToByteArray()\n );\n } catch (e: any) {\n if (e.name === 'NoSuchKey') return undefined;\n else throw e;\n }\n }\n\n async listFiles(prefix: string): Promise<string[]> {\n const listRoot = pathPosix.join(this.root, prefix);\n const paginator = paginateListObjectsV2(\n { client: this.client },\n {\n Bucket: this.bucket,\n Prefix: listRoot\n }\n );\n const result: string[] = [];\n for await (const page of paginator)\n result.push(...page.Contents!.map((e) => pathPosix.relative(listRoot, e.Key!)));\n return result;\n }\n\n async putFile(file: string, buffer: Buffer): Promise<void> {\n await this.client.putObject({\n Bucket: this.bucket,\n Key: pathPosix.join(this.root, file),\n Body: buffer\n });\n }\n\n async deleteFiles(...files: string[]): Promise<void> {\n // TODO implement support of more than 1000 files\n const results = await this.client.deleteObjects({\n Bucket: this.bucket,\n Delete: {\n Objects: files.map((file) => ({\n Key: pathPosix.join(this.root, file)\n }))\n }\n });\n if (results.Errors !== undefined && results.Errors.length > 0)\n throw new Error(`Errors encountered while deleting files: ${results.Errors.join('\\n')}`);\n }\n}\n\nexport class FSStorage implements RegistryStorage {\n /** Absolute path */\n public readonly root: string;\n\n constructor(_root: string) {\n this.root = path.resolve(_root);\n }\n\n private toAbsolutePath(localPath: string): string {\n if (pathPosix.isAbsolute(localPath)) throw new Error('absolute path');\n return path.resolve(this.root, localPath.split(pathPosix.sep).join(path.sep));\n }\n\n async getFile(address: string): Promise<Buffer | undefined> {\n try {\n return await fs.promises.readFile(this.toAbsolutePath(address));\n } catch (err: any) {\n if (err.code == 'ENOENT') return undefined;\n else throw new Error('', { cause: err });\n }\n }\n\n async listFiles(prefix: string): Promise<string[]> {\n try {\n const listRoot = this.toAbsolutePath(prefix);\n return (await fs.promises.readdir(listRoot, { recursive: true, withFileTypes: true }))\n .filter((e) => e.isFile())\n .map((e) =>\n path.relative(listRoot, path.resolve(e.path, e.name)).split(path.sep).join(pathPosix.sep)\n );\n } catch (err: any) {\n if (err.code == 'ENOENT') return [];\n else throw new Error('', { cause: err });\n }\n }\n\n async putFile(address: string, buffer: Buffer): Promise<void> {\n const absoluteAddress = this.toAbsolutePath(address);\n await fs.promises.mkdir(path.dirname(absoluteAddress), { recursive: true });\n await fs.promises.writeFile(absoluteAddress, buffer);\n }\n\n async deleteFiles(...files: string[]): Promise<void> {\n // Folders are not removed, deletes issued sequentially\n for (const file of files) await fs.promises.rm(this.toAbsolutePath(file));\n }\n}\n\nexport function storageByUrl(address: string): RegistryStorage {\n const url = new URL(address, `file:${path.resolve('.').split(path.sep).join(pathPosix.sep)}/`);\n switch (url.protocol) {\n case 'file:':\n const root = path.resolve(url.pathname);\n return new FSStorage(root);\n case 's3:':\n const options: NonNullable<ConstructorParameters<typeof S3>[0]> = {};\n const region = url.searchParams.get('region');\n if (region) options.region = region;\n const bucket = url.hostname;\n return new S3Storage(new S3(options), bucket, url.pathname.replace(/^\\//, ''));\n default:\n throw new Error(`Unknown protocol: ${url.protocol}`);\n }\n}\n","import YAML from 'yaml';\nimport { tryLoadFile } from '../util';\nimport {\n PlPackageJsonConfigFile,\n PlPackageYamlConfigFile,\n PlRegFullPackageConfigData,\n PlRegPackageConfigDataShard\n} from './config_schema';\nimport * as os from 'node:os';\nimport { BlockRegistry } from './registry';\nimport { storageByUrl } from '../lib/storage';\nimport { FullBlockPackageName } from './v1_repo_schema';\nimport { MiLogger } from '@milaboratories/ts-helpers';\n\nfunction mergeConfigs(\n c1: PlRegPackageConfigDataShard,\n c2: PlRegPackageConfigDataShard | undefined\n): PlRegPackageConfigDataShard {\n if (c2 === undefined) return c1;\n return {\n ...c1,\n ...c2,\n registries: { ...c1.registries, ...c2.registries },\n files: { ...c1.files, ...c2.files }\n };\n}\n\nasync function tryLoadJsonConfigFromFile(\n file: string\n): Promise<PlRegPackageConfigDataShard | undefined> {\n return tryLoadFile(file, (buf) => PlRegPackageConfigDataShard.parse(JSON.parse(buf.toString())));\n}\n\nasync function tryLoadYamlConfigFromFile(\n file: string\n): Promise<PlRegPackageConfigDataShard | undefined> {\n return tryLoadFile(file, (buf) => PlRegPackageConfigDataShard.parse(YAML.parse(buf.toString())));\n}\n\nasync function loadConfigShard(): Promise<PlRegPackageConfigDataShard> {\n let conf = PlRegPackageConfigDataShard.parse({});\n\n conf = mergeConfigs(conf, await tryLoadJsonConfigFromFile('./.pl.reg.json'));\n conf = mergeConfigs(conf, await tryLoadYamlConfigFromFile('./.pl.reg.yaml'));\n conf = mergeConfigs(conf, await tryLoadJsonConfigFromFile(`${os.homedir()}/.pl.reg.json`));\n conf = mergeConfigs(conf, await tryLoadYamlConfigFromFile(`${os.homedir()}/.pl.reg.yaml`));\n conf = mergeConfigs(conf, await tryLoadJsonConfigFromFile(PlPackageJsonConfigFile));\n conf = mergeConfigs(conf, await tryLoadYamlConfigFromFile(PlPackageYamlConfigFile));\n\n return conf;\n}\n\nlet conf: PlRegPackageConfigDataShard | undefined = undefined;\nlet confPromise: Promise<PlRegPackageConfigDataShard> | undefined = undefined;\n\nasync function getConfigShard() {\n if (conf !== undefined) return conf;\n if (confPromise !== undefined) return await confPromise;\n confPromise = loadConfigShard();\n return await confPromise;\n}\n\nexport class PlRegPackageConfig {\n constructor(public readonly conf: PlRegFullPackageConfigData) {}\n\n createRegistry(logger?: MiLogger): BlockRegistry {\n let address = this.conf.registry;\n if (!address.startsWith('file:') && !address.startsWith('s3:')) {\n const regByAlias = this.conf.registries[address];\n if (!regByAlias) throw new Error(`Registry with alias \"${address}\" not found`);\n address = regByAlias;\n }\n return new BlockRegistry(storageByUrl(address), logger);\n }\n\n get fullPackageName(): FullBlockPackageName {\n return {\n organization: this.conf.organization,\n package: this.conf.package,\n version: this.conf.version\n };\n }\n}\n\nexport async function getConfig(finalShard: PlRegPackageConfigDataShard) {\n const confShard = await loadConfigShard();\n return new PlRegPackageConfig(\n PlRegFullPackageConfigData.parse(mergeConfigs(confShard, finalShard))\n );\n}\n"],"names":["tryResolve","root","request","err","ResolvedModuleFile","moduleRoot","z","ctx","result","ResolvedModuleFolder","indexFilesToLookFor","requestWithSlash","idxFile","mapLocalToAbsolute","value","path","absoluteToString","fsp","absoluteToBase64","mimeType","mime","cpAbsoluteToRelative","dstFolder","fileAccumulator","fileName","dst","packFolderToRelativeTgz","tgzName","tar","mapRemoteToAbsolute","rootUrl","rootWithSlash","BlockComponentsDescription","BlockComponents","BlockComponentsConsolidate","ContentAbsoluteBinaryLocal","ContentAbsoluteFolder","BlockComponentsManifest","BlockComponentsAbsoluteUrl","prefix","ContentRelativeBinary","BlockPackMetaDescription","BlockPackMeta","DescriptionContentText","DescriptionContentBinary","BlockPackMetaConsolidate","ContentAbsoluteTextLocal","BlockPackMetaEmbed","BlockPackMetaEmbeddedContent","ResolvedBlockPackDescriptionFromPackageJson","CreateBlockPackDescriptionSchema","BlockPackDescriptionConsolidateToFolder","BlockPackDescriptionManifest","BlockPackMetaManifest","BlockPackManifest","BlockPackManifestFile","buildBlockPackDist","description","files","descriptionRelative","manifest","tryLoadFile","file","map","BlockDescriptionPackageJsonField","ConventionPackageNamePattern","parsePackageName","packageName","match","name","organization","tryLoadPackDescription","fullPackageJsonPath","packageJson","buf","descriptionNotParsed","descriptionRaw","BlockPackDescriptionFromPackageJsonRaw","notEmpty","SemVer","descriptionParsingResult","loadPackDescriptionRaw","loadPackDescription","PlRegAddress","PlPackageConfigData","PlRegCommonConfigData","PlRegFullPackageConfigData","PlRegPackageConfigDataShard","PlPackageJsonConfigFile","PlPackageYamlConfigFile","MainPrefix","packageContentPrefix","bp","payloadFilePath","packageOverviewPath","GlobalOverviewPath","MetaFile","VersionUpdatesPrefix","packageUpdatePath","seed","PackageUpdatePattern","GlobalUpdateSeedInFile","GlobalUpdateSeedOutFile","BlockRegistry","storage","logger","pack","BlockRegistryPackConstructor","_a","packagesToUpdate","seedPaths","rawSeedPaths","_b","seedPath","packageKeyWithoutVersion","pkg","version","update","_c","overviewContent","overview","_d","packageInfo","overviewFile","pOverviewContent","packageOverview","_e","e","v","metaContent","e1","e2","semver","_f","_g","sp","_h","force","updateRequestSeed","currentUpdatedSeed","content","__publicField","randomUUID","meta","S3Storage","client","bucket","pathPosix","listRoot","paginator","paginateListObjectsV2","page","buffer","results","FSStorage","_root","localPath","address","fs","absoluteAddress","storageByUrl","url","options","region","S3","mergeConfigs","c1","c2","tryLoadJsonConfigFromFile","tryLoadYamlConfigFromFile","YAML","loadConfigShard","conf","os","PlRegPackageConfig","regByAlias","getConfig","finalShard","confShard"],"mappings":"+2BA+BA,SAASA,EAAWC,EAAcC,EAAqC,CACjE,GAAA,CACK,OAAA,QAAQ,QAAQA,EAAS,CAC9B,MAAO,CAACD,CAAI,CAAA,CACb,QACME,EAAU,CACb,GAAAA,EAAI,OAAS,mBAA0B,MAAAA,CAC7C,CAEF,CASO,SAASC,GAAmBC,EAAoB,CACrD,OAAOC,EAAAA,EAAE,OAAO,EAAE,UAA+B,CAACJ,EAASK,IAAQ,CAC3D,MAAAC,EAASR,EAAWK,EAAYH,CAAO,EAC7C,OAAIM,IAAW,QACbD,EAAI,SAAS,CACX,KAAMD,EAAAA,EAAE,aAAa,OACrB,QAAS,iBAAiBJ,CAAO,YAAYG,CAAU,EAAA,CACxD,EACMC,EAAAA,EAAE,OAEJ,CACL,KAAM,gBACN,KAAME,CAAA,CACR,CACD,CACH,CAMgB,SAAAC,GACdJ,KACGK,EACH,CACA,OAAOJ,EAAAA,EAAE,OAAO,EAAE,UAAiC,CAACJ,EAASK,IAAQ,CACnE,MAAMI,EAAmBT,EAAQ,SAAS,GAAG,EAAIA,EAAU,GAAGA,CAAO,IAErE,UAAWU,KAAWF,EAAqB,CACzC,MAAMF,EAASR,EAAWK,EAAYM,EAAmBC,CAAO,EAChE,GAAIJ,IAAW,OAAW,CACpB,GAAA,CAACA,EAAO,SAASI,CAAO,EAC1B,MAAM,IAAI,MAAM,6BAA6BJ,CAAM,oBAAoBI,CAAO,EAAE,EAC3E,MAAA,CACL,KAAM,kBACN,OAAQJ,EAAO,MAAM,EAAGA,EAAO,OAASI,EAAQ,MAAM,CAAA,CAE1D,CACF,CAEA,OAAAL,EAAI,SAAS,CACX,KAAMD,EAAAA,EAAE,aAAa,OACrB,QAAS,iBAAiBJ,CAAO,mBAAmBG,CAAU,0BAA0BK,EAAoB,KAAK,IAAI,CAAC,GAAA,CACvH,EACMJ,EAAAA,EAAE,KAAA,CACV,CACH,CAEO,SAASO,EACdZ,EAC4F,CAC5F,OAAmCa,GACjCA,EAAM,OAAS,WACX,CAAE,KAAM,gBAAiB,KAAMC,EAAK,QAAQd,EAAMa,EAAM,IAAI,CAC3D,EAAAA,CACT,CAEO,SAASE,IAAyE,CACvF,MAAO,OAAOF,GACRA,EAAM,OAAS,gBACV,MAAMG,EAAI,SAASH,EAAM,KAAM,CAAE,SAAU,QAAS,EACjDA,EAAM,OAEtB,CAGO,SAASI,IAEoB,CAClC,MAAO,OAAOJ,GAAU,CAClB,GAAAA,EAAM,OAAS,gBAAiB,CAClC,MAAMK,EAAWC,GAAK,OAAON,EAAM,IAAI,EACnC,GAAA,CAACK,EAAgB,MAAA,IAAI,MAAM,0CAA0CL,EAAM,IAAI,GAAG,EAC/E,MAAA,CACL,KAAM,kBACN,SAAAK,EACA,QAAS,MAAMF,EAAI,SAASH,EAAM,KAAM,CAAE,SAAU,SAAU,CAAA,MAEpD,QAAAA,CAAA,CAElB,CAEgB,SAAAO,EACdC,EACAC,EAG8D,CAC9D,MAAO,OAA4DT,GAAa,CAC1E,GAAAA,EAAM,OAAS,gBAAiB,CAClC,MAAMU,EAAWT,EAAK,SAASD,EAAM,IAAI,EACnCW,EAAMV,EAAK,QAAQO,EAAWE,CAAQ,EAC5C,OAAAD,GAAA,MAAAA,EAAiB,KAAKC,GACtB,MAAMP,EAAI,GAAGH,EAAM,KAAMW,CAAG,EACrB,CAAE,KAAM,WAAY,KAAMD,CAAS,MAC9B,QAAAV,CAAA,CAElB,CAEgB,SAAAY,GACdJ,EACAK,EACAJ,EAC4D,CACxD,GAAA,CAACI,EAAQ,SAAS,MAAM,QAAS,IAAI,MAAM,6BAA6BA,CAAO,EAAE,EACrF,MAAO,OAAOb,GAAiC,CAC7C,MAAMW,EAAMV,EAAK,QAAQO,EAAWK,CAAO,EAC3C,aAAMC,GAAI,OACR,CACE,KAAM,GACN,KAAMH,EACN,IAAKX,EAAM,MACb,EACA,CAACA,EAAM,MAAM,CAAA,EAEfS,GAAA,MAAAA,EAAiB,KAAKI,GACf,CAAE,KAAM,WAAY,KAAMA,CAAQ,CAAA,CAE7C,CAEO,SAASE,EACdC,EAC2F,CAC3F,MAAMC,EAAgBD,EAAQ,SAAS,GAAG,EAAIA,EAAU,GAAGA,CAAO,IAClE,OAAmChB,GACjCA,EAAM,OAAS,WACX,CAAE,KAAM,eAAgB,IAAKiB,EAAgBjB,EAAM,IAAA,EAClDA,CACT,CCvKO,SAASkB,GAA2B3B,EAAoB,CACtD,OAAA4B,EAAA,gBACL7B,GAAmBC,CAAU,EAC7BI,GAAqBJ,EAAY,YAAY,CAAA,CAEjD,CAGgB,SAAA6B,GAA2BZ,EAAmBC,EAA4B,CACjF,OAAAU,EAAA,gBACLE,EAAAA,2BAA2B,UAAUd,EAAqBC,EAAWC,CAAe,CAAC,EACrFa,wBAAsB,UAAUV,GAAwBJ,EAAW,SAAUC,CAAe,CAAC,CAAA,EAC7F,KAAKc,EAAAA,uBAAuB,CAChC,CAEO,SAASC,GAA2BC,EAAgB,CAClD,OAAAN,EAAA,gBACLO,EAAAA,sBAAsB,UAAUX,EAAoBU,CAAM,CAAC,EAC3DC,EAAAA,sBAAsB,UAAUX,EAAoBU,CAAM,CAAC,CAAA,CAE/D,CCdO,SAASE,GAAyBxC,EAAc,CAC9C,OAAAyC,EAAA,cACLC,EAAAA,uBAAuB,UAAU9B,EAAmBZ,CAAI,CAAC,EACzD2C,EAAAA,yBAAyB,UAAU/B,EAAmBZ,CAAI,CAAC,CAAA,CAE/D,CAGgB,SAAA4C,GAAyBvB,EAAmBC,EAA4B,CAC/E,OAAAmB,EAAA,cACLI,EAAAA,yBAAyB,UAAUzB,EAAqBC,EAAWC,CAAe,CAAC,EACnFY,EAAAA,2BAA2B,UAAUd,EAAqBC,EAAWC,CAAe,CAAC,CAAA,CAEzF,CAEO,MAAMwB,GAAqBL,EAAA,cAChCI,2BAAyB,UAAU9B,IAAkB,EACrDmB,6BAA2B,UAAUjB,IAAkB,CACzD,EAAE,KAAK8B,EAA4B,4BAAA,ECtB5B,SAASC,EAA4ChD,EAAc,CACjE,OAAAiD,EAAA,iCACLlB,GAA2B/B,CAAI,EAC/BwC,GAAyBxC,CAAI,CAAA,CAEjC,CAKgB,SAAAkD,GACd7B,EACAC,EACA,CACO,OAAA2B,EAAA,iCACLhB,GAA2BZ,EAAWC,CAAe,EAErDsB,GAAyBvB,EAAWC,CAAe,CAAA,EACnD,KAAK6B,CAA4B,CACrC,CAEO,MAAMA,EAA+BF,EAAA,iCAC1Cb,EAAA,wBACAgB,EAAA,qBACF,EAGaC,GAAoBF,EAA6B,OAAO,CACnE,OAAQ9C,EAAAA,EAAE,QAAQ,IAAI,EACtB,MAAOA,EAAAA,EAAE,MAAMA,EAAA,EAAE,QAAQ,CAC3B,CAAC,EAGYiD,GAAwB,gBCjCf,eAAAC,GACpBC,EACAhC,EAC4B,CAC5B,MAAMR,EAAI,MAAMQ,EAAK,CAAE,UAAW,GAAM,EACxC,MAAMiC,EAAkB,CAAA,EAClBC,EAAsB,MAAMR,GAAwC1B,EAAKiC,CAAK,EAAE,WACpFD,CAAA,EAEIG,EAA8BN,GAAkB,MAAM,CAC1D,OAAQ,KACR,GAAGK,EACH,MAAAD,CAAA,CACD,EACK,aAAAzC,EAAI,UAAUF,EAAK,QAAQU,EAAK8B,EAAqB,EAAG,KAAK,UAAUK,CAAQ,CAAC,EAC/EA,CACT,CCzBsB,eAAAC,EACpBC,EACAC,EACwB,CACpB,GAAA,CACF,OAAOA,EAAI,MAAM9C,EAAI,SAAS6C,CAAI,CAAC,QAC5B3D,EAAU,CACb,GAAAA,EAAI,MAAQ,SAAiB,aACtB,IAAI,MAAM,GAAI,CAAE,MAAOA,CAAK,CAAA,CACzC,CACF,CCAO,MAAM6D,EAAmC,QAE1CC,GACJ,+EAEK,SAASC,EAAiBC,EAAiE,CAC1F,MAAAC,EAAQD,EAAY,MAAMF,EAA4B,EAC5D,GAAI,CAACG,EACH,MAAM,IAAI,MACR,2BAA2BD,CAAW,kDAAA,EAE1C,KAAM,CAAE,KAAAE,EAAM,aAAAC,GAAiBF,EAAM,OAC9B,MAAA,CAAE,KAAAC,EAAM,aAAAC,EACjB,CAEA,eAAsBC,GACpBlE,EACmD,CACnD,MAAMmE,EAAsBzD,EAAK,QAAQV,EAAY,cAAc,EAC/D,GAAA,CACF,MAAMoE,EAAc,MAAMZ,EAAYW,EAAsBE,GAC1D,KAAK,MAAMA,EAAI,SAAS,OAAO,CAAC,CAAA,EAE9B,GAAAD,IAAgB,OAAkB,OAChC,MAAAE,EAAuBF,EAAYT,CAAgC,EACrE,GAAAW,IAAyB,OAAkB,OAC/C,MAAMC,EAAiB,CACrB,GAAGC,EAAuC,uCAAA,MAAMF,CAAoB,EACpE,GAAI,CACF,GAAGT,EACDY,WAASL,EAAY,KAAS,uBAAuBD,CAAmB,EAAE,CAC5E,EACA,QAASO,EAAAA,OAAO,MAAMN,EAAY,OAAU,CAC9C,CAAA,EAEIO,EACJ,MAAM/B,EAA4C5C,CAAU,EAAE,eAAeuE,CAAc,EACzF,OAAAI,EAAyB,QAAgBA,EAAyB,KAC/D,YACQ,CACR,MACT,CACF,CAEA,eAAsBC,GAAuB5E,EAAsD,CACjG,MAAMmE,EAAsBzD,EAAK,QAAQV,EAAY,cAAc,EAC7DoE,EAAc,KAAK,MAAM,MAAMxD,EAAI,SAASuD,EAAqB,CAAE,SAAU,OAAQ,CAAC,CAAC,EACvFG,EAAuBF,EAAYT,CAAgC,EACzE,GAAIW,IAAyB,OAC3B,MAAM,IAAI,MACR,4BAA4BX,CAAgC,kBAAkBQ,CAAmB,GAAA,EAE9F,MAAA,CACL,GAAGK,EAAuC,uCAAA,MAAMF,CAAoB,EACpE,GAAI,CACF,GAAGT,EACDY,WAASL,EAAY,KAAS,uBAAuBD,CAAmB,EAAE,CAC5E,EACA,QAASO,EAAAA,OAAO,MAAMN,EAAY,OAAU,CAC9C,CAAA,CAEJ,CAEA,eAAsBS,GACpB7E,EACuC,CACjC,MAAAuE,EAAiB,MAAMK,GAAuB5E,CAAU,EAC9D,OAAO,MAAM4C,EAA4C5C,CAAU,EAAE,WAAWuE,CAAc,CAChG,CC/EO,MAAMO,GAAe7E,EAAAA,EAAE,SAAS,MAAM,gBAAgB,ECEhD8E,GAAsB9E,IAAE,OAAO,CAC1C,aAAcA,IAAE,OAAO,EACvB,QAASA,IAAE,OAAO,EAClB,QAASyE,SAAO,SAAS,EACzB,MAAOzE,EAAAA,EAAE,OAAOA,EAAA,EAAE,SAAS,MAAM,UAAU,EAAGA,EAAAA,EAAE,OAAQ,CAAA,EAAE,QAAQ,CAAA,CAAE,EACpE,KAAMA,EAAAA,EAAE,OAAO,CAAE,CAAA,EAAE,YAAY,CACjC,CAAC,EAEY+E,GAAwB/E,IAAE,OAAO,CAC5C,WAAYA,EAAAA,EAAE,OAAOA,EAAE,EAAA,OAAA,EAAU6E,EAAY,EAAE,QAAQ,EAAE,EACzD,SAAU7E,EAAA,EAAE,OAAO,EAAE,SAAS,CAChC,CAAC,EAGYgF,EAA6BD,GAAsB,MAAMD,EAAmB,EAAE,SACzF,CAAE,SAAU,GAAM,QAAS,EAAK,CAClC,EAEaG,EAA8BD,EAA2B,QAAQ,EAAE,SAAS,CACvF,WAAY,GACZ,MAAO,EACT,CAAC,EAGYE,GAA0B,kBAC1BC,GAA0B,kBCvBjCC,EAAa,MAEZ,SAASC,GAAqBC,EAAkC,CAC9D,MAAA,GAAGF,CAAU,GAAGE,EAAG,YAAY,IAAIA,EAAG,OAAO,IAAIA,EAAG,OAAO,EACpE,CAEgB,SAAAC,EAAgBD,EAA0B9B,EAAsB,CAC9E,MAAO,GAAG4B,CAAU,GAAGE,EAAG,YAAY,IAAIA,EAAG,OAAO,IAAIA,EAAG,OAAO,IAAI9B,CAAI,EAC5E,CAIO,SAASgC,EAAoBF,EAA4C,CAC9E,MAAO,GAAGF,CAAU,GAAGE,EAAG,YAAY,IAAIA,EAAG,OAAO,gBACtD,CAEa,MAAAG,EAAqB,GAAGL,CAAU,gBAElCM,EAAW,YCLlBC,EAAuB,mCAE7B,SAASC,GAAkBN,EAA0BO,EAAsB,CACzE,MAAO,GAAGF,CAAoB,GAAGL,EAAG,YAAY,IAAIA,EAAG,OAAO,IAAIA,EAAG,OAAO,IAAIO,CAAI,EACtF,CAEA,MAAMC,GACJ,6GAEIC,GAAyB,gCACzBC,EAA0B,iCA+CzB,MAAMC,EAAc,CACzB,YACmBC,EACAC,EACjB,CAFiB,KAAA,QAAAD,EACA,KAAA,OAAAC,CAChB,CAEH,oBAAoBC,EAA0D,CAC5E,OAAO,IAAIC,GAA6B,KAAK,QAASD,CAAI,CAC5D,CAEA,MAAc,gBAAiB,sBACxBE,EAAA,KAAA,SAAA,MAAAA,EAAQ,KAAK,kCAGZ,MAAAC,MAAuB,IACvBC,EAAsB,CAAA,EACtBC,EAAe,MAAM,KAAK,QAAQ,UAAUd,CAAoB,GACjEe,EAAA,KAAA,SAAA,MAAAA,EAAQ,KAAK,2BAClB,UAAWC,KAAYF,EAAc,CAC7B,MAAA3C,EAAQ6C,EAAS,MAAMb,EAAoB,EACjD,GAAI,CAAChC,EAAO,SACZ0C,EAAU,KAAKG,CAAQ,EACvB,KAAM,CAAE,yBAAAC,EAA0B,aAAA5C,EAAc,IAAA6C,EAAK,QAAAC,EAAS,KAAAjB,GAAS/B,EAAM,OAEzE,IAAAiD,EAASR,EAAiB,IAAIK,CAAwB,EAErDG,EAMOA,EAAO,SAAS,IAAID,CAAO,GAC9BC,EAAA,SAAS,IAAID,CAAO,EAN3BP,EAAiB,IAAIK,EAA0B,CAC7C,QAAS,CAAE,aAAA5C,EAAc,QAAS6C,CAAI,EACtC,SAAU,IAAI,IAAI,CAACC,CAAO,CAAC,CAAA,CAC5B,GAMEE,EAAA,KAAA,SAAA,MAAAA,EAAQ,KAAK,OAAOhD,CAAY,IAAI6C,CAAG,IAAIC,CAAO,GACzD,CAGA,MAAMG,EAAkB,MAAM,KAAK,QAAQ,QAAQxB,CAAkB,EACjE,IAAAyB,EACFD,IAAoB,OAChB,CAAA,EACC,KAAK,MAAMA,EAAgB,SAAA,CAAU,GAC5CE,EAAA,KAAK,SAAL,MAAAA,EAAa,KAAK,2BAA2BD,EAAS,MAAM,YAG5D,SAAW,CAAA,CAAGE,CAAW,IAAKb,EAAiB,UAAW,CAElD,MAAAc,EAAe7B,EAAoB4B,EAAY,OAAO,EACtDE,EAAmB,MAAM,KAAK,QAAQ,QAAQD,CAAY,EAC5D,IAAAE,EACFD,IAAqB,OACjB,CAAA,EACC,KAAK,MAAMA,EAAiB,SAAA,CAAU,GAC7CE,EAAA,KAAK,SAAL,MAAAA,EAAa,KACX,YAAYJ,EAAY,QAAQ,YAAY,IAAIA,EAAY,QAAQ,OAAO,cAAcG,EAAgB,MAAM,YAI/FA,EAAAA,EAAgB,OAAQE,GAAM,CAACL,EAAY,SAAS,IAAIK,EAAE,OAAO,CAAC,EAGpF,SAAW,CAACC,CAAC,IAAKN,EAAY,SAAS,UAAW,CAC1C,MAAAN,EAAUY,EAAE,WACZC,EAAc,MAAM,KAAK,QAAQ,QACrCpC,EACE,CACE,GAAG6B,EAAY,QACf,QAAAN,CACF,EACApB,CACF,CAAA,EAEGiC,GACWJ,EAAA,KAAK,CAAE,QAAAT,EAAS,KAAM,KAAK,MAAMa,EAAY,UAAU,CAAA,CAAG,CAC5E,CAGgBJ,EAAA,KAAK,CAACK,EAAIC,IAAOC,GAAO,QAAQD,EAAG,QAASD,EAAG,OAAO,CAAC,EAGjE,MAAA,KAAK,QAAQ,QAAQP,EAAc,OAAO,KAAK,KAAK,UAAUE,CAAe,CAAC,CAAC,GACrFQ,EAAA,KAAK,SAAL,MAAAA,EAAa,KAAK,SAASR,EAAgB,MAAM,aAGjDL,EAAWA,EAAS,OACjBO,GACCA,EAAE,eAAiBL,EAAY,QAAQ,cACvCK,EAAE,UAAYL,EAAY,QAAQ,OAAA,EAEtCF,EAAS,KAAK,CACZ,aAAcE,EAAY,QAAQ,aAClC,QAASA,EAAY,QAAQ,QAC7B,YAAaG,EAAgB,IAAKE,GAAMA,EAAE,OAAO,EAAE,QAAQ,EAC3D,cAAeF,EAAgB,CAAC,EAAE,QAClC,WAAYA,EAAgB,CAAC,EAAE,IAAA,CAChC,CACH,CAGM,MAAA,KAAK,QAAQ,QAAQ9B,EAAoB,OAAO,KAAK,KAAK,UAAUyB,CAAQ,CAAC,CAAC,GACpFc,EAAA,KAAK,SAAL,MAAAA,EAAa,KAAK,4BAA4Bd,EAAS,MAAM,aAG7D,MAAM,KAAK,QAAQ,YAAY,GAAGV,EAAU,IAAKyB,GAAO,GAAGtC,CAAoB,GAAGsC,CAAE,EAAE,CAAC,GAClFC,EAAA,KAAA,SAAA,MAAAA,EAAQ,KAAK,kCACpB,CAEA,MAAM,eAAeC,EAAiB,GAAsB,UAGrD7B,EAAA,KAAA,SAAA,MAAAA,EAAQ,KAAK,4CAClB,MAAM8B,EAAoB,MAAM,KAAK,QAAQ,QAAQrC,EAAsB,EACrEsC,EAAqB,MAAM,KAAK,QAAQ,QAAQrC,CAAuB,EACzE,CAACmC,GAASC,IAAsB,QAAaC,IAAuB,QAEtE,CAACF,GACDC,IAAsB,QACtBC,IAAuB,QACvBD,EAAkB,OAAOC,CAAkB,IAI7C,MAAM,KAAK,iBAEPD,IACF,MAAM,KAAK,QAAQ,QAAQpC,EAAyBoC,CAAiB,GAChE1B,EAAA,KAAA,SAAA,MAAAA,EAAQ,KAAK,qBAEtB,CAEA,MAAM,mBACJ3C,EACsC,CACtC,MAAMuE,EAAU,MAAM,KAAK,QAAQ,QAAQ9C,EAAoBzB,CAAI,CAAC,EAChE,GAAAuE,IAAY,OAChB,OAAO,KAAK,MAAMA,EAAQ,SAAU,CAAA,CACtC,CAEA,MAAM,mBAAyD,CAC7D,MAAMA,EAAU,MAAM,KAAK,QAAQ,QAAQ7C,CAAkB,EACzD,GAAA6C,IAAY,OAChB,OAAO,KAAK,MAAMA,EAAQ,SAAU,CAAA,CACtC,CACF,CAEO,MAAMjC,EAA6B,CAIxC,YACmBH,EACDnC,EAChB,CANMwE,EAAA,iBAAqB,IACbA,EAAA,YAAOC,GAAW,WAAA,GAGf,KAAA,QAAAtC,EACD,KAAA,KAAAnC,CACf,CAEH,MAAM,QAAQP,EAAc8E,EAAgC,CACpD,MAAA,KAAK,QAAQ,QAAQ/C,EAAgB,KAAK,KAAM/B,CAAI,EAAG8E,CAAO,CACtE,CAEA,MAAM,UAAUG,EAAc,CACtB,MAAA,KAAK,QAAQ/C,EAAU,OAAO,KAAK,KAAK,UAAU+C,CAAI,CAAC,CAAC,EAC9D,KAAK,UAAY,EACnB,CAEA,MAAM,QAAS,CACb,GAAI,CAAC,KAAK,UAAiB,MAAA,IAAI,MAAM,gBAAgB,EACrD,MAAM,KAAK,QAAQ,QAAQ7C,GAAkB,KAAK,KAAM,KAAK,IAAI,EAAG,OAAO,GAAG,CAAC,CAAC,EAC1E,MAAA,KAAK,QAAQ,QAAQG,GAAwB,OAAO,KAAK,KAAK,IAAI,CAAC,CAC3E,CACF,CCxOO,MAAM2C,EAAqC,CAChD,YACkBC,EACAC,EACAjJ,EAChB,CAHgB,KAAA,OAAAgJ,EACA,KAAA,OAAAC,EACA,KAAA,KAAAjJ,CACf,CAEH,MAAM,QAAQ6D,EAA2C,CACnD,GAAA,CACF,OAAO,OAAO,KACZ,MACE,MAAM,KAAK,OAAO,UAAU,CAC1B,OAAQ,KAAK,OACb,IAAKqF,EAAU,KAAK,KAAK,KAAMrF,CAAI,CAAA,CACpC,GACD,KAAM,qBAAqB,CAAA,QAExBiE,EAAQ,CACX,GAAAA,EAAE,OAAS,YAAoB,OACxB,MAAAA,CACb,CACF,CAEA,MAAM,UAAUxF,EAAmC,CACjD,MAAM6G,EAAWD,EAAU,KAAK,KAAK,KAAM5G,CAAM,EAC3C8G,EAAYC,EAAA,sBAChB,CAAE,OAAQ,KAAK,MAAO,EACtB,CACE,OAAQ,KAAK,OACb,OAAQF,CACV,CAAA,EAEI5I,EAAmB,CAAA,EACzB,gBAAiB+I,KAAQF,EACvB7I,EAAO,KAAK,GAAG+I,EAAK,SAAU,IAAKxB,GAAMoB,EAAU,SAASC,EAAUrB,EAAE,GAAI,CAAC,CAAC,EACzE,OAAAvH,CACT,CAEA,MAAM,QAAQsD,EAAc0F,EAA+B,CACnD,MAAA,KAAK,OAAO,UAAU,CAC1B,OAAQ,KAAK,OACb,IAAKL,EAAU,KAAK,KAAK,KAAMrF,CAAI,EACnC,KAAM0F,CAAA,CACP,CACH,CAEA,MAAM,eAAe9F,EAAgC,CAEnD,MAAM+F,EAAU,MAAM,KAAK,OAAO,cAAc,CAC9C,OAAQ,KAAK,OACb,OAAQ,CACN,QAAS/F,EAAM,IAAKI,IAAU,CAC5B,IAAKqF,EAAU,KAAK,KAAK,KAAMrF,CAAI,CAAA,EACnC,CACJ,CAAA,CACD,EACD,GAAI2F,EAAQ,SAAW,QAAaA,EAAQ,OAAO,OAAS,EACpD,MAAA,IAAI,MAAM,4CAA4CA,EAAQ,OAAO,KAAK;AAAA,CAAI,CAAC,EAAE,CAC3F,CACF,CAEO,MAAMC,EAAqC,CAIhD,YAAYC,EAAe,CAFXd,EAAA,aAGT,KAAA,KAAO9H,EAAK,QAAQ4I,CAAK,CAChC,CAEQ,eAAeC,EAA2B,CAChD,GAAIT,EAAU,WAAWS,CAAS,EAAS,MAAA,IAAI,MAAM,eAAe,EACpE,OAAO7I,EAAK,QAAQ,KAAK,KAAM6I,EAAU,MAAMT,EAAU,GAAG,EAAE,KAAKpI,EAAK,GAAG,CAAC,CAC9E,CAEA,MAAM,QAAQ8I,EAA8C,CACtD,GAAA,CACF,OAAO,MAAMC,EAAG,SAAS,SAAS,KAAK,eAAeD,CAAO,CAAC,QACvD1J,EAAU,CACb,GAAAA,EAAI,MAAQ,SAAiB,aACtB,IAAI,MAAM,GAAI,CAAE,MAAOA,CAAK,CAAA,CACzC,CACF,CAEA,MAAM,UAAUoC,EAAmC,CAC7C,GAAA,CACI,MAAA6G,EAAW,KAAK,eAAe7G,CAAM,EAC3C,OAAQ,MAAMuH,EAAG,SAAS,QAAQV,EAAU,CAAE,UAAW,GAAM,cAAe,EAAK,CAAC,GACjF,OAAQrB,GAAMA,EAAE,OAAQ,CAAA,EACxB,IAAKA,GACJhH,EAAK,SAASqI,EAAUrI,EAAK,QAAQgH,EAAE,KAAMA,EAAE,IAAI,CAAC,EAAE,MAAMhH,EAAK,GAAG,EAAE,KAAKoI,EAAU,GAAG,CAAA,QAErFhJ,EAAU,CACjB,GAAIA,EAAI,MAAQ,SAAU,MAAO,CAAA,QACtB,IAAI,MAAM,GAAI,CAAE,MAAOA,CAAK,CAAA,CACzC,CACF,CAEA,MAAM,QAAQ0J,EAAiBL,EAA+B,CACtD,MAAAO,EAAkB,KAAK,eAAeF,CAAO,EAC7C,MAAAC,EAAG,SAAS,MAAM/I,EAAK,QAAQgJ,CAAe,EAAG,CAAE,UAAW,EAAA,CAAM,EAC1E,MAAMD,EAAG,SAAS,UAAUC,EAAiBP,CAAM,CACrD,CAEA,MAAM,eAAe9F,EAAgC,CAExC,UAAAI,KAAQJ,EAAa,MAAAoG,EAAG,SAAS,GAAG,KAAK,eAAehG,CAAI,CAAC,CAC1E,CACF,CAEO,SAASkG,GAAaH,EAAkC,CAC7D,MAAMI,EAAM,IAAI,IAAIJ,EAAS,QAAQ9I,EAAK,QAAQ,GAAG,EAAE,MAAMA,EAAK,GAAG,EAAE,KAAKoI,EAAU,GAAG,CAAC,GAAG,EAC7F,OAAQc,EAAI,SAAU,CACpB,IAAK,QACH,MAAMhK,EAAOc,EAAK,QAAQkJ,EAAI,QAAQ,EAC/B,OAAA,IAAIP,GAAUzJ,CAAI,EAC3B,IAAK,MACH,MAAMiK,EAA4D,CAAA,EAC5DC,EAASF,EAAI,aAAa,IAAI,QAAQ,EACxCE,MAAgB,OAASA,GAC7B,MAAMjB,EAASe,EAAI,SACnB,OAAO,IAAIjB,GAAU,IAAIoB,EAAA,GAAGF,CAAO,EAAGhB,EAAQe,EAAI,SAAS,QAAQ,MAAO,EAAE,CAAC,EAC/E,QACE,MAAM,IAAI,MAAM,qBAAqBA,EAAI,QAAQ,EAAE,CACvD,CACF,CC7HA,SAASI,EACPC,EACAC,EAC6B,CACzB,OAAAA,IAAO,OAAkBD,EACtB,CACL,GAAGA,EACH,GAAGC,EACH,WAAY,CAAE,GAAGD,EAAG,WAAY,GAAGC,EAAG,UAAW,EACjD,MAAO,CAAE,GAAGD,EAAG,MAAO,GAAGC,EAAG,KAAM,CAAA,CAEtC,CAEA,eAAeC,EACb1G,EACkD,CAClD,OAAOD,EAAYC,EAAOY,GAAQa,EAA4B,MAAM,KAAK,MAAMb,EAAI,SAAU,CAAA,CAAC,CAAC,CACjG,CAEA,eAAe+F,EACb3G,EACkD,CAClD,OAAOD,EAAYC,EAAOY,GAAQa,EAA4B,MAAMmF,GAAK,MAAMhG,EAAI,SAAU,CAAA,CAAC,CAAC,CACjG,CAEA,eAAeiG,IAAwD,CACrE,IAAIC,EAAOrF,EAA4B,MAAM,CAAE,CAAA,EAE/CqF,OAAAA,EAAOP,EAAaO,EAAM,MAAMJ,EAA0B,gBAAgB,CAAC,EAC3EI,EAAOP,EAAaO,EAAM,MAAMH,EAA0B,gBAAgB,CAAC,EAC3EG,EAAOP,EAAaO,EAAM,MAAMJ,EAA0B,GAAGK,EAAG,QAAS,CAAA,eAAe,CAAC,EACzFD,EAAOP,EAAaO,EAAM,MAAMH,EAA0B,GAAGI,EAAG,QAAS,CAAA,eAAe,CAAC,EACzFD,EAAOP,EAAaO,EAAM,MAAMJ,EAA0BhF,EAAuB,CAAC,EAClFoF,EAAOP,EAAaO,EAAM,MAAMH,EAA0BhF,EAAuB,CAAC,EAE3EmF,CACT,CAYO,MAAME,EAAmB,CAC9B,YAA4BF,EAAkC,CAAlCA,KAAAA,KAAAA,CAAmC,CAE/D,eAAenE,EAAkC,CAC3C,IAAAoD,EAAU,KAAK,KAAK,SACpB,GAAA,CAACA,EAAQ,WAAW,OAAO,GAAK,CAACA,EAAQ,WAAW,KAAK,EAAG,CAC9D,MAAMkB,EAAa,KAAK,KAAK,WAAWlB,CAAO,EAC/C,GAAI,CAACkB,EAAY,MAAM,IAAI,MAAM,wBAAwBlB,CAAO,aAAa,EACnEA,EAAAkB,CACZ,CACA,OAAO,IAAIxE,GAAcyD,GAAaH,CAAO,EAAGpD,CAAM,CACxD,CAEA,IAAI,iBAAwC,CACnC,MAAA,CACL,aAAc,KAAK,KAAK,aACxB,QAAS,KAAK,KAAK,QACnB,QAAS,KAAK,KAAK,OAAA,CAEvB,CACF,CAEA,eAAsBuE,GAAUC,EAAyC,CACjE,MAAAC,EAAY,MAAMP,KACxB,OAAO,IAAIG,GACTxF,EAA2B,MAAM+E,EAAaa,EAAWD,CAAU,CAAC,CAAA,CAExE"}
|