import csvparse from 'csv-parse/lib/sync' ; import * as fs from 'fs' ; import * as os from 'os' ; import * as path from 'path' ; import * as tmp from 'tmp' ; import * as buildx from './buildx' ; import * as core from '@actions/core' ; import { issueCommand } from '@actions/core/lib/command' ; let _tmpDir ; export interface Inputs { builder : string ; files : string [ ] ; targets : string [ ] ; noCache : boolean ; pull : boolean ; load : boolean ; push : boolean ; set : string [ ] ; } export function tmpDir ( ) { if ( ! _tmpDir ) { _tmpDir = fs . mkdtempSync ( path . join ( os . tmpdir ( ) , 'docker-build-push-' ) ) . split ( path . sep ) . join ( path . posix . sep ) ; } return _tmpDir ; } export function tmpNameSync ( options ? ) { return tmp . tmpNameSync ( options ) ; } export async function getInputs ( ) { return { builder : core . getInput ( 'builder' ) , files : getInputList ( 'files' ) , targets : getInputList ( 'targets' ) , noCache : core . getBooleanInput ( 'no-cache' ) , pull : core . getBooleanInput ( 'pull' ) , load : core . getBooleanInput ( 'load' ) , push : core . getBooleanInput ( 'push' ) , set : getInputList ( 'set' , true ) } ; } export async function getArgs ( inputs , buildxVersion ) { let args = [ 'buildx' ] ; args . push . apply ( args , await getBakeArgs ( inputs , buildxVersion ) ) ; args . push . apply ( args , await getCommonArgs ( inputs ) ) ; args . push . apply ( args , inputs . targets ) ; return args ; } async function getBakeArgs ( inputs , buildxVersion ) { let args = [ 'bake' ] ; await asyncForEach ( inputs . files , async ( file ) => { args . push ( '--file' , file ) ; } ) ; await asyncForEach ( inputs . set , async ( set ) => { args . push ( '--set' , set ) ; } ) ; if ( buildx . satisfies ( buildxVersion , '>=0.6.0' ) ) { args . push ( '--metadata-file' , await buildx . getMetadataFile ( ) ) ; } return args ; } async function getCommonArgs ( inputs ) { let args = [ ] ; if ( inputs . noCache ) { args . push ( '--no-cache' ) ; } if ( inputs . builder ) { args . push ( '--builder' , inputs . builder ) ; } if ( inputs . pull ) { args . push ( '--pull' ) ; } if ( inputs . load ) { args . push ( '--load' ) ; } if ( inputs . push ) { args . push ( '--push' ) ; } return args ; } export function getInputList ( name , ignoreComma ? ) { let res = [ ] ; const items = core . getInput ( name ) ; if ( items == '' ) { return res ; } for ( let output of csvparse ( items , { columns : false , relaxColumnCount : true , skipLinesWithEmptyValues : true } ) as Array < string [ ] > ) { if ( output . length == 1 ) { res . push ( output [ 0 ] ) ; continue ; } else if ( ! ignoreComma ) { res . push ( ... output ) ; continue ; } res . push ( output . join ( ',' ) ) ; } return res . filter ( item => item ) . map ( pat => pat . trim ( ) ) ; } export const asyncForEach = async ( array , callback ) => { for ( let index = 0 ; index < array . length ; index ++ ) { await callback ( array [ index ] , index , array ) ; } } ; export function setOutput ( name , value ) { issueCommand ( 'set-output' , { name } , value ) ; }