@fjall/util 2.33.0 → 2.34.0
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/.minified
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
87 files minified at 2026-07-
|
|
1
|
+
87 files minified at 2026-07-17T22:47:13.831Z
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
*/
|
|
21
21
|
import { type BuildxBuildArgs, type BuildxBuildResult, type DockerCliError } from "./dockerCliSchemas.js";
|
|
22
22
|
import { type BuildxProgressEvent, type DockerCliState, type ImagetoolsInspect, type Result } from "./DockerCli.js";
|
|
23
|
-
export declare function _buildxBuild(state: DockerCliState, args: BuildxBuildArgs, onProgress: (event: BuildxProgressEvent) => void): Promise<Result<BuildxBuildResult, DockerCliError>>;
|
|
23
|
+
export declare function _buildxBuild(state: DockerCliState, args: BuildxBuildArgs, onProgress: (event: BuildxProgressEvent) => void, abortSignal?: AbortSignal): Promise<Result<BuildxBuildResult, DockerCliError>>;
|
|
24
24
|
/**
|
|
25
25
|
* Create one or more manifest-list tags pointing at an existing image
|
|
26
26
|
* digest without re-uploading layers.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{rm as
|
|
1
|
+
import{rm as L}from"node:fs/promises";import{buildxArgvBuilder as A}from"./buildxArgvBuilder.js";import{BuildxBuildArgsSchema as R}from"./dockerCliSchemas.js";import{DEFAULT_INSPECT_TIMEOUT_MS as S,DOCKER_CLI_BUILDX_LOG_CATEGORY as B}from"./dockerCliConstants.js";import{BuildxBuildMonitor as j,buildPhaseTimeoutMessage as N,publishStallTimeoutMessage as U,resolveBuildxBudgets as G}from"./buildxBuildMonitor.js";import{parseMetadataFile as J}from"./metadataFileParser.js";import{parseRawjsonLine as P}from"./rawjsonParser.js";import{rawjsonToVertexEvent as H}from"./rawjsonToVertexEvent.js";import{maskSensitiveOutput as x}from"../securityHelpers.js";import{failure as t,makeError as a,maskOutput as b,runDocker as M,spawnFailureToError as K,streamDocker as V,success as C}from"./DockerCli.js";function F(s){return s instanceof Error?s.message:String(s)}async function ae(s,c,e,l){const r=R.safeParse(c);if(!r.success){const n=x(r.error.message);return t(a("validation",`Invalid BuildxBuildArgs: ${n}`,{issues:r.error.issues}))}const o=G(s.env);if(!o.success)return t(a("validation",x(o.error.message)));const g=o.data,u=A(r.data);let f=0,_=0;const k=new Set;let w,T;try{const n=new j(g);w=n,T=r.data.metadataFile;const O=p=>{const D=P(p);if(D===null){p.trim()!==""&&s.logger.debug(B,"Skipping malformed rawjson line",{line:x(p)});return}const m=H(D);if(m===null)return;const y=n.observe(m);y!==void 0&&e({type:"status",message:b(y.message),...y.percentage!==void 0&&{percentage:y.percentage}});for(const i of m.vertexes)i.completed!==void 0&&!k.has(i.digest)&&(k.add(i.digest),i.cached===!0?f++:_++),e({type:"vertex",message:b(i.name),vertex:i.digest});for(const i of m.logs)e({type:"log",message:b(i.data),vertex:i.vertex});for(const i of m.statuses)e({type:"status",message:b(`${i.name} ${i.current}`),vertex:i.vertex});for(const i of m.warnings)e({type:"warning",message:b(i.short),vertex:i.vertex})},I=l!==void 0?AbortSignal.any([n.signal,l]):n.signal,d=await V(s,{args:u,abortSignal:I},O);if(d.spawnError!==void 0)return t(a("daemon_unreachable",`Docker CLI is not available: ${d.spawnError}`,{stderrTail:d.stderrTail}));if(d.aborted||d.exitCode===null)return n.timedOutPhase==="build"?t(a("timeout",N(g),{stderrTail:d.stderrTail})):n.timedOutPhase==="publish"?t(a("timeout",U(g,n.progressSummary()),{stderrTail:d.stderrTail})):t(a("abort","docker buildx build was aborted",{stderrTail:d.stderrTail}));if(d.exitCode!==0)return t(a("build_failed",`docker buildx build failed (exit ${d.exitCode})`,{stderrTail:d.stderrTail}));const h=await J(r.data.metadataFile);if(!h.success)return h;const E=h.data,v=E["containerimage.digest"];if(typeof v!="string"||v==="")return t(a("metadata_missing_digest","Buildx metadata file does not contain containerimage.digest",{metadataFile:r.data.metadataFile}));const $={};for(const p of r.data.tags)$[p]=v;return C({digest:v,imageDigests:$,metadata:E,platforms:r.data.platforms,cacheHits:f,cacheMisses:_})}finally{w!==void 0&&w.dispose(),T!==void 0&&await L(T,{force:!0}).catch(n=>{s.logger.warn(B,"Failed to clean up buildx metadata file",{path:T,error:x(F(n))})})}}async function ie(s,c,e,l){if(c.trim()==="")return t(a("validation","tagByDigest: sourceImage must be non-empty"));if(!e.startsWith("sha256:"))return t(a("validation",`tagByDigest: expected sha256:... digest, got ${e.slice(0,32)}`));if(l.length===0)return t(a("validation","tagByDigest: tags must be a non-empty list"));for(const f of l)if(typeof f!="string"||f.trim()==="")return t(a("validation","tagByDigest: every tag must be non-empty"));const r=`${c}@${e}`,o=[];for(const f of l)o.push("--tag",f);const g=["buildx","imagetools","create",...o,r],u=await M(s,{args:g,timeoutMs:S});return u.spawnError!==void 0?t(K(u)):u.exitCode===null?t(a("abort",`docker buildx imagetools create for ${r} was aborted`,{stderrTail:u.stderrTail})):u.exitCode!==0?t(a("tag_failed",`docker buildx imagetools create for ${r} failed (exit ${u.exitCode})`,{stderrTail:u.stderrTail})):C(void 0)}async function se(s,c){const e=await M(s,{args:["buildx","imagetools","inspect",c,"--raw"],timeoutMs:S});if(e.spawnError!==void 0)return t(a("daemon_unreachable",`Docker CLI is not available: ${e.spawnError}`,{stderrTail:e.stderrTail}));if(e.exitCode===null)return t(a("abort",`docker buildx imagetools inspect ${c} was aborted`,{stderrTail:e.stderrTail}));if(e.exitCode!==0)return t(a("inspect_failed",`docker buildx imagetools inspect ${c} failed (exit ${e.exitCode})`,{stderrTail:e.stderrTail}));let l,r;try{const o=JSON.parse(e.stdout);typeof o.mediaType=="string"&&(l=o.mediaType),typeof o.digest=="string"&&(r=o.digest)}catch(o){s.logger.debug(B,"imagetools inspect output is not JSON; preserving raw",{error:x(F(o))})}return C({raw:e.stdout,...l!==void 0&&{mediaType:l},...r!==void 0&&{digest:r}})}export{ae as _buildxBuild,se as _imagetoolsInspect,ie as _tagByDigest};
|
|
@@ -94,7 +94,7 @@ export interface DaemonInfo {
|
|
|
94
94
|
export declare class DockerCli {
|
|
95
95
|
private readonly state;
|
|
96
96
|
constructor(opts: DockerCliOptions);
|
|
97
|
-
buildxBuild(args: BuildxBuildArgs, onProgress: (event: BuildxProgressEvent) => void): Promise<Result<BuildxBuildResult, DockerCliError>>;
|
|
97
|
+
buildxBuild(args: BuildxBuildArgs, onProgress: (event: BuildxProgressEvent) => void, abortSignal?: AbortSignal): Promise<Result<BuildxBuildResult, DockerCliError>>;
|
|
98
98
|
tag(source: string, target: string): Promise<Result<void, DockerCliError>>;
|
|
99
99
|
/**
|
|
100
100
|
* Create one or more manifest-list tags pointing at a previously pushed
|
package/dist/docker/DockerCli.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{spawn as h}from"node:child_process";import{filterDangerousEnvVars as k,maskSensitiveOutput as E}from"../securityHelpers.js";import{abortChildProcess as b}from"./abortHelpers.js";import{DEFAULT_DOCKER_BIN as x,DOCKER_CLI_LOG_CATEGORY as A,STDERR_TAIL_LINE_MAX_CHARS as y,STDERR_TAIL_LINES as S}from"./dockerCliConstants.js";import{_buildxBuild as D,_imagetoolsInspect as C,_tagByDigest as I}from"./DockerCli.build.js";import{_assertBuildxAvailable as L,_detectDaemon as R,_ensureBuilder as O}from"./DockerCli.daemon.js";import{_imageInspect as P,_loginEcr as N,_pull as F,_push as G,_tag as K}from"./DockerCli.registry.js";import{failure as v,success as M}from"./result.js";class Q{state;constructor(e){const r=e.dockerBin!==void 0&&e.dockerBin!==""?e.dockerBin:x,
|
|
1
|
+
import{spawn as h}from"node:child_process";import{filterDangerousEnvVars as k,maskSensitiveOutput as E}from"../securityHelpers.js";import{abortChildProcess as b}from"./abortHelpers.js";import{DEFAULT_DOCKER_BIN as x,DOCKER_CLI_LOG_CATEGORY as A,STDERR_TAIL_LINE_MAX_CHARS as y,STDERR_TAIL_LINES as S}from"./dockerCliConstants.js";import{_buildxBuild as D,_imagetoolsInspect as C,_tagByDigest as I}from"./DockerCli.build.js";import{_assertBuildxAvailable as L,_detectDaemon as R,_ensureBuilder as O}from"./DockerCli.daemon.js";import{_imageInspect as P,_loginEcr as N,_pull as F,_push as G,_tag as K}from"./DockerCli.registry.js";import{failure as v,success as M}from"./result.js";class Q{state;constructor(e){const r=e.dockerBin!==void 0&&e.dockerBin!==""?e.dockerBin:x,t=k(e.env??process.env);this.state={logger:e.logger,dockerBin:r,env:t,abortSignal:e.abortSignal,ecrSession:void 0}}async buildxBuild(e,r,t){return D(this.state,e,r,t)}async tag(e,r){return K(this.state,e,r)}async tagByDigest(e,r,t){return I(this.state,e,r,t)}async push(e,r){return G(this.state,e,r)}async pull(e,r,t){return F(this.state,e,r,t)}async imageInspect(e){return P(this.state,e)}async imagetoolsInspect(e){return C(this.state,e)}async loginEcr(e){return N(this.state,e)}async logoutEcr(){const e=this.state.ecrSession;this.state.ecrSession=void 0,e!==void 0&&await e.dispose()}async withEcrSession(e,r,t){const o=await this.loginEcr(e);if(!o.success)return v(t(o.error));try{return await r()}finally{await this.logoutEcr().catch(()=>{})}}async ensureBuilder(e){return O(this.state,e)}async assertBuildxAvailable(){return L(this.state)}async detectDaemon(){return R(this.state)}}function j(n){const e=E(n);return e.length>y?e.slice(0,y)+"\u2026":e}function H(n,e,r){let t,o=r;if(r!==void 0&&Array.isArray(r.stderrTail)&&r.stderrTail.every(a=>typeof a=="string")){t=r.stderrTail.map(j);const{stderrTail:a,...i}=r;o=Object.keys(i).length>0?i:void 0}return{kind:n,message:e,...t!==void 0&&{stderrTail:t},...o!==void 0&&{details:o}}}function W(n){return H("daemon_unreachable",`Docker CLI is not available: ${n.spawnError??"unknown spawn failure"}`,{stderrTail:n.stderrTail})}function _(n,e){if(n==="")return[];const r=n.split(/\r?\n/);for(;r.length>0&&r[r.length-1]==="";)r.pop();return r.slice(-e)}function Z(n){return E(n)}function T(n){return n.ecrSession!==void 0?{...n.env,...n.ecrSession.env}:n.env}function ee(n,e){return new Promise(r=>{let t=!1,o=!1;const a=w(n.abortSignal,e.timeoutMs,e.abortSignal);let i;try{i=h(n.dockerBin,e.args,{shell:!1,env:T(n)})}catch(s){const d=s instanceof Error?s.message:String(s);r({exitCode:null,stdout:"",stderr:d,stderrTail:[d],aborted:!1,spawnError:d});return}let c="",l="";i.stdout?.on("data",s=>{c+=s.toString()}),i.stderr?.on("data",s=>{l+=s.toString()}),e.stdin!==void 0&&(i.stdin?.on("error",s=>{n.logger.debug(A,"stdin write error (typically EPIPE on early child exit)",{error:s.message})}),i.stdin?.write(e.stdin),i.stdin?.end());const g=()=>{t=!0,b(i)};a!==void 0&&(a.aborted?g():a.addEventListener("abort",g,{once:!0})),i.once("error",s=>{if(o)return;o=!0,a!==void 0&&a.removeEventListener("abort",g);const d=s instanceof Error?s.message:String(s);r({exitCode:null,stdout:c,stderr:d,stderrTail:[d],aborted:t,spawnError:d})}),i.once("close",s=>{o||(o=!0,a!==void 0&&a.removeEventListener("abort",g),r({exitCode:s,stdout:c,stderr:l,stderrTail:_(l,S),aborted:t}))})})}function re(n,e,r,t){return new Promise(o=>{let a=!1,i=!1;const c=w(n.abortSignal,e.timeoutMs,e.abortSignal);let l;try{l=h(n.dockerBin,e.args,{shell:!1,env:T(n)})}catch(u){const f=u instanceof Error?u.message:String(u);o({exitCode:null,stderrTail:[f],aborted:!1,spawnError:f,child:null});return}let g="",s="",d="";l.stdout?.on("data",u=>{g+=u.toString();const f=g.split(/\r?\n/);g=f.pop()??"";for(const p of f)r(p)}),l.stderr?.on("data",u=>{const f=u.toString();if(s+=f,t!==void 0){d+=f;const p=d.split(/\r?\n/);d=p.pop()??"";for(const B of p)t(B)}});const m=()=>{a=!0,b(l)};c!==void 0&&(c.aborted?m():c.addEventListener("abort",m,{once:!0})),l.once("error",u=>{if(i)return;i=!0,c!==void 0&&c.removeEventListener("abort",m);const f=u instanceof Error?u.message:String(u);o({exitCode:null,stderrTail:[f],aborted:a,spawnError:f,child:l})}),l.once("close",u=>{i||(i=!0,g!==""&&r(g),t!==void 0&&d!==""&&t(d),c!==void 0&&c.removeEventListener("abort",m),o({exitCode:u,stderrTail:_(s,S),aborted:a,child:l}))})})}function w(n,e,r){const t=[];if(n!==void 0&&t.push(n),r!==void 0&&t.push(r),e!==void 0&&t.push(AbortSignal.timeout(e)),t.length!==0)return t.length===1?t[0]:AbortSignal.any(t)}export{Q as DockerCli,v as failure,H as makeError,Z as maskOutput,ee as runDocker,W as spawnFailureToError,re as streamDocker,M as success,_ as tailLines};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fjall/util",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.34.0",
|
|
4
4
|
"description": "Common utility methods",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -134,5 +134,5 @@
|
|
|
134
134
|
"engines": {
|
|
135
135
|
"node": ">=22.0.0"
|
|
136
136
|
},
|
|
137
|
-
"gitHead": "
|
|
137
|
+
"gitHead": "8c553fca8f9737d445061ea75cf6c6c7db0d24c9"
|
|
138
138
|
}
|