2019-12-03 10:28:59 -05:00
import * as fs from 'fs'
import * as os from 'os'
import * as path from 'path'
import * as yaml from 'js-yaml'
//
// SUMMARY
//
// This script rebuilds the usage section in the README.md to be consistent with the action.yml
function updateUsage (
actionReference : string ,
actionYamlPath : string = 'action.yml' ,
readmePath : string = 'README.md' ,
startToken : string = '<!-- start usage -->' ,
endToken : string = '<!-- end usage -->'
) : void {
if ( ! actionReference ) {
throw new Error ( 'Parameter actionReference must not be empty' )
}
// Load the action.yml
const actionYaml = yaml . safeLoad ( fs . readFileSync ( actionYamlPath ) . toString ( ) )
// Load the README
const originalReadme = fs . readFileSync ( readmePath ) . toString ( )
// Find the start token
const startTokenIndex = originalReadme . indexOf ( startToken )
if ( startTokenIndex < 0 ) {
throw new Error ( ` Start token ' ${ startToken } ' not found ` )
}
// Find the end token
const endTokenIndex = originalReadme . indexOf ( endToken )
if ( endTokenIndex < 0 ) {
throw new Error ( ` End token ' ${ endToken } ' not found ` )
} else if ( endTokenIndex < startTokenIndex ) {
throw new Error ( 'Start token must appear before end token' )
}
// Build the new README
const newReadme : string [ ] = [ ]
// Append the beginning
newReadme . push ( originalReadme . substr ( 0 , startTokenIndex + startToken . length ) )
// Build the new usage section
newReadme . push ( '```yaml' , ` - uses: ${ actionReference } ` , ' with:' )
const inputs = actionYaml . inputs
let firstInput = true
for ( const key of Object . keys ( inputs ) ) {
const input = inputs [ key ]
// Line break between inputs
if ( ! firstInput ) {
newReadme . push ( '' )
}
// Constrain the width of the description
const width = 80
let description = input . description as string
while ( description ) {
// Longer than width? Find a space to break apart
let segment : string = description
if ( description . length > width ) {
segment = description . substr ( 0 , width + 1 )
2020-01-03 12:32:17 -05:00
while ( ! segment . endsWith ( ' ' ) && segment ) {
2019-12-03 10:28:59 -05:00
segment = segment . substr ( 0 , segment . length - 1 )
}
2020-01-03 12:32:17 -05:00
// Trimmed too much?
if ( segment . length < width * 0.67 ) {
segment = description
}
2019-12-03 10:28:59 -05:00
} else {
segment = description
}
description = description . substr ( segment . length ) // Remaining
segment = segment . trimRight ( ) // Trim the trailing space
newReadme . push ( ` # ${ segment } ` )
}
// Input and default
if ( input . default !== undefined ) {
newReadme . push ( ` # Default: ${ input . default } ` )
}
newReadme . push ( ` ${ key } : '' ` )
firstInput = false
}
newReadme . push ( '```' )
// Append the end
newReadme . push ( originalReadme . substr ( endTokenIndex ) )
// Write the new README
fs . writeFileSync ( readmePath , newReadme . join ( os . EOL ) )
}
updateUsage (
2019-12-13 00:00:48 -05:00
'actions/checkout@v2' ,
2019-12-03 10:28:59 -05:00
path . join ( __dirname , '..' , '..' , 'action.yml' ) ,
path . join ( __dirname , '..' , '..' , 'README.md' )
)