You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
	
	
		
			86 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			TypeScript
		
	
		
		
			
		
	
	
			86 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			TypeScript
		
	
| 
								 
											7 years ago
										 
									 | 
							
								import { join, resolve } from 'path';
							 | 
						||
| 
								 | 
							
								import { readdir as readdirCallback } from 'fs';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import pify from 'pify';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import { getCliOptions, getPrintableError } from './common';
							 | 
						||
| 
								 | 
							
								import { writeSignature } from './signature';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// @ts-ignore
							 | 
						||
| 
								 | 
							
								import * as packageJson from '../../package.json';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const readdir = pify(readdirCallback);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* tslint:disable:no-console */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const OPTIONS = [
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    names: ['help', 'h'],
							 | 
						||
| 
								 | 
							
								    type: 'bool',
							 | 
						||
| 
								 | 
							
								    help: 'Print this help and exit.',
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    names: ['private', 'p'],
							 | 
						||
| 
								 | 
							
								    type: 'string',
							 | 
						||
| 
								 | 
							
								    help: 'Path to private key file (default: ./private.key)',
							 | 
						||
| 
								 | 
							
								    default: 'private.key',
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    names: ['update', 'u'],
							 | 
						||
| 
								 | 
							
								    type: 'string',
							 | 
						||
| 
								 | 
							
								    help: 'Path to the update package (default: the .exe or .zip in ./release)',
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    names: ['version', 'v'],
							 | 
						||
| 
								 | 
							
								    type: 'string',
							 | 
						||
| 
								 | 
							
								    help: `Version number of this package (default: ${packageJson.version})`,
							 | 
						||
| 
								 | 
							
								    default: packageJson.version,
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								type OptionsType = {
							 | 
						||
| 
								 | 
							
								  private: string;
							 | 
						||
| 
								 | 
							
								  update: string;
							 | 
						||
| 
								 | 
							
								  version: string;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const cliOptions = getCliOptions<OptionsType>(OPTIONS);
							 | 
						||
| 
								 | 
							
								go(cliOptions).catch(error => {
							 | 
						||
| 
								 | 
							
								  console.error('Something went wrong!', getPrintableError(error));
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								async function go(options: OptionsType) {
							 | 
						||
| 
								 | 
							
								  const { private: privateKeyPath, version } = options;
							 | 
						||
| 
								 | 
							
								  let { update: updatePath } = options;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (!updatePath) {
							 | 
						||
| 
								 | 
							
								    updatePath = await findUpdatePath();
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  console.log('Signing with...');
							 | 
						||
| 
								 | 
							
								  console.log(`  version: ${version}`);
							 | 
						||
| 
								 | 
							
								  console.log(`  update file: ${updatePath}`);
							 | 
						||
| 
								 | 
							
								  console.log(`  private key file: ${privateKeyPath}`);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  await writeSignature(updatePath, version, privateKeyPath);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const IS_EXE = /\.exe$/;
							 | 
						||
| 
								 | 
							
								const IS_ZIP = /\.zip$/;
							 | 
						||
| 
								 | 
							
								async function findUpdatePath(): Promise<string> {
							 | 
						||
| 
								 | 
							
								  const releaseDir = resolve('release');
							 | 
						||
| 
								 | 
							
								  const files: Array<string> = await readdir(releaseDir);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  const max = files.length;
							 | 
						||
| 
								 | 
							
								  for (let i = 0; i < max; i += 1) {
							 | 
						||
| 
								 | 
							
								    const file = files[i];
							 | 
						||
| 
								 | 
							
								    const fullPath = join(releaseDir, file);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (IS_EXE.test(file) || IS_ZIP.test(file)) {
							 | 
						||
| 
								 | 
							
								      return fullPath;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  throw new Error("No suitable file found in 'release' folder!");
							 | 
						||
| 
								 | 
							
								}
							 |