Convert hak to TypeScript (#289)

* Convert hak to TypeScript

* Fix linter & remove stray log line

* Fix more linting errors

In one case by switching to import() and hence esnext

* Return type for getNodeModuleBin

Co-authored-by: Michael Telatynski <7t3chguy@gmail.com>

* More types

Co-authored-by: Michael Telatynski <7t3chguy@gmail.com>
This commit is contained in:
David Baker
2021-12-14 14:32:27 +00:00
committed by GitHub
co-authored by Michael Telatynski
parent 18500e7ec3
commit 326e6577e1
24 changed files with 522 additions and 223 deletions
+6 -7
View File
@@ -14,18 +14,17 @@ See the License for the specific language governing permissions and
limitations under the License.
*/
const path = require('path');
const childProcess = require('child_process');
import path from 'path';
import childProcess from 'child_process';
module.exports = async function(hakEnv, moduleInfo) {
await buildKeytar(hakEnv, moduleInfo);
};
import HakEnv from '../../scripts/hak/hakEnv';
import { DependencyInfo } from '../../scripts/hak/dep';
async function buildKeytar(hakEnv, moduleInfo) {
export default async function buildKeytar(hakEnv: HakEnv, moduleInfo: DependencyInfo): Promise<void> {
const env = hakEnv.makeGypEnv();
console.log("Running yarn with env", env);
await new Promise((resolve, reject) => {
await new Promise<void>((resolve, reject) => {
const proc = childProcess.spawn(
path.join(moduleInfo.nodeModuleBinDir, 'node-gyp' + (hakEnv.isWin() ? '.cmd' : '')),
['rebuild'],
+7 -4
View File
@@ -14,13 +14,16 @@ See the License for the specific language governing permissions and
limitations under the License.
*/
const childProcess = require('child_process');
import childProcess from 'child_process';
module.exports = async function(hakEnv, moduleInfo) {
import HakEnv from '../../scripts/hak/hakEnv';
import { DependencyInfo } from '../../scripts/hak/dep';
export default async function(hakEnv: HakEnv, moduleInfo: DependencyInfo): Promise<void> {
const tools = [['python', '--version']]; // node-gyp uses python for reasons beyond comprehension
for (const tool of tools) {
await new Promise((resolve, reject) => {
await new Promise<void>((resolve, reject) => {
const proc = childProcess.spawn(tool[0], tool.slice(1), {
stdio: ['ignore'],
});
@@ -33,4 +36,4 @@ module.exports = async function(hakEnv, moduleInfo) {
});
});
}
};
}
+2 -2
View File
@@ -1,7 +1,7 @@
{
"scripts": {
"check": "check.js",
"build": "build.js"
"check": "check.ts",
"build": "build.ts"
},
"copy": "build/Release/keytar.node",
"dependencies": {
@@ -14,13 +14,16 @@ See the License for the specific language governing permissions and
limitations under the License.
*/
const path = require('path');
const childProcess = require('child_process');
import path from 'path';
import childProcess from 'child_process';
const mkdirp = require('mkdirp');
const fsExtra = require('fs-extra');
import mkdirp from 'mkdirp';
import fsExtra from 'fs-extra';
module.exports = async function(hakEnv, moduleInfo) {
import HakEnv from '../../scripts/hak/hakEnv';
import { DependencyInfo } from '../../scripts/hak/dep';
export default async function(hakEnv: HakEnv, moduleInfo: DependencyInfo): Promise<void> {
if (hakEnv.isWin()) {
await buildOpenSslWin(hakEnv, moduleInfo);
await buildSqlCipherWin(hakEnv, moduleInfo);
@@ -28,7 +31,7 @@ module.exports = async function(hakEnv, moduleInfo) {
await buildSqlCipherUnix(hakEnv, moduleInfo);
}
await buildMatrixSeshat(hakEnv, moduleInfo);
};
}
async function buildOpenSslWin(hakEnv, moduleInfo) {
const version = moduleInfo.cfg.dependencies.openssl;
@@ -37,15 +40,15 @@ async function buildOpenSslWin(hakEnv, moduleInfo) {
const openSslArch = hakEnv.getTargetArch() === 'x64' ? 'VC-WIN64A' : 'VC-WIN32';
console.log("Building openssl in " + openSslDir);
await new Promise((resolve, reject) => {
await new Promise<void>((resolve, reject) => {
const proc = childProcess.spawn(
'perl',
[
'Configure',
'--prefix=' + moduleInfo.depPrefix,
// sqlcipher only uses about a tiny part of openssl. We link statically
// so will only pull in the symbols we use, but we may as well turn off
// as much as possible to save on build time.
// sqlcipher only uses about a tiny part of openssl. We link statically
// so will only pull in the symbols we use, but we may as well turn off
// as much as possible to save on build time.
'no-afalgeng',
'no-capieng',
'no-cms',
@@ -103,7 +106,7 @@ async function buildOpenSslWin(hakEnv, moduleInfo) {
});
});
await new Promise((resolve, reject) => {
await new Promise<void>((resolve, reject) => {
const proc = childProcess.spawn(
'nmake',
['build_libs'],
@@ -117,7 +120,7 @@ async function buildOpenSslWin(hakEnv, moduleInfo) {
});
});
await new Promise((resolve, reject) => {
await new Promise<void>((resolve, reject) => {
const proc = childProcess.spawn(
'nmake',
['install_dev'],
@@ -139,7 +142,7 @@ async function buildSqlCipherWin(hakEnv, moduleInfo) {
await mkdirp(buildDir);
await new Promise((resolve, reject) => {
await new Promise<void>((resolve, reject) => {
const proc = childProcess.spawn(
'nmake',
['/f', path.join('..', 'Makefile.msc'), 'libsqlite3.lib', 'TOP=..'],
@@ -214,7 +217,7 @@ async function buildSqlCipherUnix(hakEnv, moduleInfo) {
args.push(`LDFLAGS=${ldflags.join(' ')}`);
}
await new Promise((resolve, reject) => {
await new Promise<void>((resolve, reject) => {
const proc = childProcess.spawn(
path.join(sqlCipherDir, 'configure'),
args,
@@ -228,7 +231,7 @@ async function buildSqlCipherUnix(hakEnv, moduleInfo) {
});
});
await new Promise((resolve, reject) => {
await new Promise<void>((resolve, reject) => {
const proc = childProcess.spawn(
'make',
[],
@@ -242,7 +245,7 @@ async function buildSqlCipherUnix(hakEnv, moduleInfo) {
});
});
await new Promise((resolve, reject) => {
await new Promise<void>((resolve, reject) => {
const proc = childProcess.spawn(
'make',
['install'],
@@ -286,7 +289,7 @@ async function buildMatrixSeshat(hakEnv, moduleInfo) {
}
console.log("Running neon with env", env);
await new Promise((resolve, reject) => {
await new Promise<void>((resolve, reject) => {
const proc = childProcess.spawn(
path.join(moduleInfo.nodeModuleBinDir, 'neon' + (hakEnv.isWin() ? '.cmd' : '')),
['build', '--release'],
@@ -14,13 +14,16 @@ See the License for the specific language governing permissions and
limitations under the License.
*/
const childProcess = require('child_process');
const fsProm = require('fs').promises;
import childProcess from 'child_process';
import fsProm from 'fs/promises';
module.exports = async function(hakEnv, moduleInfo) {
import HakEnv from '../../scripts/hak/hakEnv';
import { DependencyInfo } from '../../scripts/hak/dep';
export default async function(hakEnv: HakEnv, moduleInfo: DependencyInfo): Promise<void> {
// of course tcl doesn't have a --version
if (!hakEnv.isLinux()) {
await new Promise((resolve, reject) => {
await new Promise<void>((resolve, reject) => {
const proc = childProcess.spawn('tclsh', [], {
stdio: ['pipe', 'ignore', 'ignore'],
});
@@ -48,7 +51,7 @@ module.exports = async function(hakEnv, moduleInfo) {
}
for (const tool of tools) {
await new Promise((resolve, reject) => {
await new Promise<void>((resolve, reject) => {
const proc = childProcess.spawn(tool[0], tool.slice(1), {
stdio: ['ignore'],
});
@@ -79,4 +82,4 @@ module.exports = async function(hakEnv, moduleInfo) {
rustc.stdin.write('fn main() {}');
rustc.stdin.end();
});
};
}
@@ -14,15 +14,18 @@ See the License for the specific language governing permissions and
limitations under the License.
*/
const path = require('path');
const childProcess = require('child_process');
import path from 'path';
import childProcess from 'child_process';
const fs = require('fs');
const fsProm = require('fs').promises;
const needle = require('needle');
const tar = require('tar');
import fs from 'fs';
import fsProm from 'fs/promises';
import needle from 'needle';
import tar from 'tar';
module.exports = async function(hakEnv, moduleInfo) {
import HakEnv from '../../scripts/hak/hakEnv';
import { DependencyInfo } from '../../scripts/hak/dep';
export default async function(hakEnv: HakEnv, moduleInfo: DependencyInfo): Promise<void> {
if (!hakEnv.isLinux()) {
await getSqlCipher(hakEnv, moduleInfo);
}
@@ -30,9 +33,9 @@ module.exports = async function(hakEnv, moduleInfo) {
if (hakEnv.isWin()) {
await getOpenSsl(hakEnv, moduleInfo);
}
};
}
async function getSqlCipher(hakEnv, moduleInfo) {
async function getSqlCipher(hakEnv: HakEnv, moduleInfo: DependencyInfo): Promise<void> {
const version = moduleInfo.cfg.dependencies.sqlcipher;
const sqlCipherDir = path.join(moduleInfo.moduleTargetDotHakDir, `sqlcipher-${version}`);
@@ -74,8 +77,8 @@ async function getSqlCipher(hakEnv, moduleInfo) {
// set it to 2 (default to memory).
const patchFile = path.join(moduleInfo.moduleHakDir, `sqlcipher-${version}-win.patch`);
await new Promise((resolve, reject) => {
const readStream = fs.createReadStream(patchFile);
await new Promise<void>((resolve, reject) => {
const readStream = fs.createReadStream(patchFile);
const proc = childProcess.spawn(
'patch',
@@ -93,7 +96,7 @@ async function getSqlCipher(hakEnv, moduleInfo) {
}
}
async function getOpenSsl(hakEnv, moduleInfo) {
async function getOpenSsl(hakEnv: HakEnv, moduleInfo: DependencyInfo): Promise<void> {
const version = moduleInfo.cfg.dependencies.openssl;
const openSslDir = path.join(moduleInfo.moduleTargetDotHakDir, `openssl-${version}`);
+3 -3
View File
@@ -1,8 +1,8 @@
{
"scripts": {
"check": "check.js",
"fetchDeps": "fetchDeps.js",
"build": "build.js"
"check": "check.ts",
"fetchDeps": "fetchDeps.ts",
"build": "build.ts"
},
"prune": "native",
"copy": "native/index.node",
+17
View File
@@ -0,0 +1,17 @@
{
"compilerOptions": {
"moduleResolution": "node",
"esModuleInterop": true,
"target": "es2016",
"sourceMap": false,
"lib": [
"es2019",
]
},
"include": [
"./**/*.ts"
],
"ts-node": {
"transpileOnly": true
}
}