From 8cb47fda2ff47fe50316cb11828b7cfaff9afb44 Mon Sep 17 00:00:00 2001 From: Rifa Achrinza <25147899+achrinza@users.noreply.github.com> Date: Fri, 10 Apr 2020 13:59:20 +0800 Subject: [PATCH] feat: updates import resolution Updates import resolution to use ES6-style imports and Typescript import/export helpers. Signed-off-by: Rifa Achrinza <25147899+achrinza@users.noreply.github.com> feat: adds `tslib` as a devDependency to reduce overall file size. Signed-off-by: Rifa Achrinza <25147899+achrinza@users.noreply.github.com> fix: fixes implicit any types in test files. Signed-off-by: Rifa Achrinza <25147899+achrinza@users.noreply.github.com> --- functions/package-lock.json | 28 +++++++++++++++++-- functions/package.json | 13 +++++---- functions/src/config.example.ts | 10 +++---- functions/src/firebaseFunctions.ts | 4 +-- functions/src/index.ts | 12 ++++---- functions/src/opentrace/getHandshakePin.ts | 9 ++---- functions/src/opentrace/getTempIDs.ts | 12 ++++---- functions/src/opentrace/getUploadToken.ts | 16 +++++------ .../src/opentrace/processUploadedData.ts | 6 ++-- .../src/opentrace/types/FunctionConfig.ts | 8 ++---- .../src/opentrace/types/HeartBeatEvent.ts | 4 +-- .../src/opentrace/types/StreetPassRecord.ts | 4 +-- .../src/opentrace/utils/Authenticator.ts | 4 +-- .../src/opentrace/utils/CustomEncrypter.ts | 8 ++---- functions/src/opentrace/utils/PinGenerator.ts | 2 +- .../src/opentrace/utils/formatTimestamp.ts | 8 ++---- .../src/opentrace/utils/getEncryptionKey.ts | 8 ++---- functions/test/index.test.ts | 4 +-- functions/test/opentrace/config.test.ts | 16 +++++------ functions/tsconfig.json | 8 +++--- 20 files changed, 92 insertions(+), 92 deletions(-) diff --git a/functions/package-lock.json b/functions/package-lock.json index 6457ff1..4140426 100644 --- a/functions/package-lock.json +++ b/functions/package-lock.json @@ -40,6 +40,13 @@ "requires": { "@firebase/util": "0.2.40", "tslib": "1.10.0" + }, + "dependencies": { + "tslib": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" + } } }, "@firebase/database": { @@ -54,6 +61,13 @@ "@firebase/util": "0.2.40", "faye-websocket": "0.11.3", "tslib": "1.10.0" + }, + "dependencies": { + "tslib": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" + } } }, "@firebase/database-types": { @@ -75,6 +89,13 @@ "integrity": "sha512-ViuceN8F6eeN/8QaA7FbOX7KlypQAFrXHBnTEicxwED4n1SdgGFapaS/ggScq1MMwq0RjGinNbigtc1Rqy8yVA==", "requires": { "tslib": "1.10.0" + }, + "dependencies": { + "tslib": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" + } } }, "@google-cloud/common": { @@ -2605,9 +2626,10 @@ } }, "tslib": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", - "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", + "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==", + "dev": true }, "tslint": { "version": "5.20.1", diff --git a/functions/package.json b/functions/package.json index 97eebb3..62da032 100644 --- a/functions/package.json +++ b/functions/package.json @@ -21,14 +21,15 @@ "moment": "^2.24.0" }, "devDependencies": { - "tslint": "^5.12.0", - "typescript": "^3.2.2", - "firebase-functions-test": "^0.1.6", - "mocha": "^7.0.2", + "@types/chai": "^4.2.0", "@types/mocha": "^7.0.2", "chai": "^4.2.0", - "@types/chai": "^4.2.0", - "ts-node": "^8.8.2" + "firebase-functions-test": "^0.1.6", + "mocha": "^7.0.2", + "ts-node": "^8.8.2", + "tslib": "^1.11.1", + "tslint": "^5.12.0", + "typescript": "^3.2.2" }, "private": true } diff --git a/functions/src/config.example.ts b/functions/src/config.example.ts index c563d1e..7218958 100644 --- a/functions/src/config.example.ts +++ b/functions/src/config.example.ts @@ -1,8 +1,8 @@ -import FunctionConfig from "./opentrace/types/FunctionConfig"; -import Authenticator from "./opentrace/utils/Authenticator"; -import PinGenerator from "./opentrace/utils/PinGenerator"; +import {FunctionConfig} from "./opentrace/types/FunctionConfig"; +import {Authenticator} from "./opentrace/utils/Authenticator"; +import {PinGenerator} from "./opentrace/utils/PinGenerator"; -const config: FunctionConfig = { +export const config: FunctionConfig = { projectId: "", regions: [], utcOffset: 0, @@ -26,5 +26,3 @@ const config: FunctionConfig = { bucketForArchive: "archive-bucket", }, }; - -export default config; diff --git a/functions/src/firebaseFunctions.ts b/functions/src/firebaseFunctions.ts index 9f4db02..93a1202 100644 --- a/functions/src/firebaseFunctions.ts +++ b/functions/src/firebaseFunctions.ts @@ -1,6 +1,6 @@ -import * as functions from "firebase-functions"; +import functions from "firebase-functions"; -import config from "./config"; +import {config} from "./config"; /** * Wrapper around functions to handle authentication diff --git a/functions/src/index.ts b/functions/src/index.ts index 9544355..3467c41 100644 --- a/functions/src/index.ts +++ b/functions/src/index.ts @@ -1,13 +1,13 @@ -import * as admin from "firebase-admin"; +import admin from "firebase-admin"; admin.initializeApp(); import * as firebaseFunctions from "./firebaseFunctions"; -import config from "./config"; +import {config} from "./config"; -import getHandshakePin from "./opentrace/getHandshakePin"; -import getTempIDs from "./opentrace/getTempIDs"; -import getUploadToken from "./opentrace/getUploadToken"; -import processUploadedData from "./opentrace/processUploadedData"; +import {getHandshakePin} from "./opentrace/getHandshakePin"; +import {getTempIDs} from "./opentrace/getTempIDs"; +import {getUploadToken} from "./opentrace/getUploadToken"; +import {processUploadedData} from "./opentrace/processUploadedData"; exports.getHandshakePin = firebaseFunctions.https(getHandshakePin); exports.getTempIDs = firebaseFunctions.https(getTempIDs); diff --git a/functions/src/opentrace/getHandshakePin.ts b/functions/src/opentrace/getHandshakePin.ts index 39a6c2c..43cdfd0 100644 --- a/functions/src/opentrace/getHandshakePin.ts +++ b/functions/src/opentrace/getHandshakePin.ts @@ -1,11 +1,10 @@ -import * as functions from "firebase-functions"; - -import config from "../config"; +import functions from "firebase-functions"; +import {config} from "../config"; /** * Get the handshake pin for a user. */ -const getHandshakePin = async (uid: string) => { +export const getHandshakePin = async (uid: string) => { console.log('getHandshakePin:', 'uid', uid); try { @@ -20,5 +19,3 @@ const getHandshakePin = async (uid: string) => { }; export const getUserHandshakePin = config.upload.pinGenerator.generatePin; - -export default getHandshakePin; diff --git a/functions/src/opentrace/getTempIDs.ts b/functions/src/opentrace/getTempIDs.ts index aefebef..fcebbff 100644 --- a/functions/src/opentrace/getTempIDs.ts +++ b/functions/src/opentrace/getTempIDs.ts @@ -1,8 +1,8 @@ -import * as moment from "moment"; +import moment from "moment"; -import config from "../config"; -import CustomEncrypter from "./utils/CustomEncrypter"; -import getEncryptionKey from "./utils/getEncryptionKey"; +import {config} from "../config"; +import {CustomEncrypter} from "./utils/CustomEncrypter"; +import {getEncryptionKey} from "./utils/getEncryptionKey"; const UID_SIZE = 21; const TIME_SIZE = 4; @@ -11,7 +11,7 @@ const TEMPID_SIZE = UID_SIZE + TIME_SIZE * 2; const IV_SIZE = 16; const AUTHTAG_SIZE = 16; -const getTempIDs = async (uid: string) => { +export const getTempIDs = async (uid: string) => { console.log('getTempIDs:', 'uid', uid); const encryptionKey = await getEncryptionKey(); @@ -76,5 +76,3 @@ export function decryptTempID(tempID: string, encryptionKey: Buffer): { uid: str expiryTime: expiryTime }; } - -export default getTempIDs; diff --git a/functions/src/opentrace/getUploadToken.ts b/functions/src/opentrace/getUploadToken.ts index 34767a5..d7f2bd3 100644 --- a/functions/src/opentrace/getUploadToken.ts +++ b/functions/src/opentrace/getUploadToken.ts @@ -1,15 +1,15 @@ -import * as functions from "firebase-functions"; -import * as admin from "firebase-admin"; +import functions from "firebase-functions"; +import admin from "firebase-admin"; -import config from "../config"; -import getEncryptionKey from "./utils/getEncryptionKey"; -import CustomEncrypter from "./utils/CustomEncrypter"; -import formatTimestamp from "./utils/formatTimestamp"; +import {config} from "../config"; +import {getEncryptionKey} from "./utils/getEncryptionKey"; +import {CustomEncrypter} from "./utils/CustomEncrypter"; +import {formatTimestamp} from "./utils/formatTimestamp"; /** * Get upload token by passing in a secret string as `data` */ -const getUploadToken = async (uid: string, data: any, context: functions.https.CallableContext) => { +export const getUploadToken = async (uid: string, data: any, context: functions.https.CallableContext) => { console.log('getUploadToken:', 'uid', uid, 'data', data, 'ip', context.rawRequest.ip); let valid = false; @@ -109,5 +109,3 @@ export function validateToken(token: string, encryptionKey: Buffer, validateToke return {uid: uid, uploadCode: upload}; } - -export default getUploadToken; diff --git a/functions/src/opentrace/processUploadedData.ts b/functions/src/opentrace/processUploadedData.ts index 4bec9d1..048bae8 100644 --- a/functions/src/opentrace/processUploadedData.ts +++ b/functions/src/opentrace/processUploadedData.ts @@ -1,8 +1,6 @@ -import * as functions from "firebase-functions"; +import functions from "firebase-functions"; import {ObjectMetadata} from "firebase-functions/lib/providers/storage"; -const processUploadedData = async (object: ObjectMetadata) => { +export const processUploadedData = async (object: ObjectMetadata) => { throw new functions.https.HttpsError('unimplemented', 'Not implemented yet'); }; - -export default processUploadedData; diff --git a/functions/src/opentrace/types/FunctionConfig.ts b/functions/src/opentrace/types/FunctionConfig.ts index 1815bc9..4a32f5e 100644 --- a/functions/src/opentrace/types/FunctionConfig.ts +++ b/functions/src/opentrace/types/FunctionConfig.ts @@ -1,10 +1,10 @@ -import Authenticator from "../utils/Authenticator"; -import PinGenerator from "../utils/PinGenerator"; +import {Authenticator} from "../utils/Authenticator"; +import {PinGenerator} from "../utils/PinGenerator"; // SUPPORTED_REGIONS from function-configuration.d.ts declare type SUPPORTED_REGIONS = "us-central1" | "us-east1" | "us-east4" | "europe-west1" | "europe-west2" | "asia-east2" | "asia-northeast1"; -interface FunctionConfig { +export interface FunctionConfig { projectId: string // Firebase Project ID regions: SUPPORTED_REGIONS[] utcOffset: number | string @@ -28,5 +28,3 @@ interface FunctionConfig { bucketForArchive: string } } - -export default FunctionConfig; diff --git a/functions/src/opentrace/types/HeartBeatEvent.ts b/functions/src/opentrace/types/HeartBeatEvent.ts index f4ae4b6..7425230 100644 --- a/functions/src/opentrace/types/HeartBeatEvent.ts +++ b/functions/src/opentrace/types/HeartBeatEvent.ts @@ -1,8 +1,6 @@ -interface HeartBeatEvent { +export interface HeartBeatEvent { timestamp: number, msg?: string, // enhanced fields: timestampString?: string, } - -export default HeartBeatEvent; diff --git a/functions/src/opentrace/types/StreetPassRecord.ts b/functions/src/opentrace/types/StreetPassRecord.ts index 537629a..33a7cd7 100644 --- a/functions/src/opentrace/types/StreetPassRecord.ts +++ b/functions/src/opentrace/types/StreetPassRecord.ts @@ -8,7 +8,7 @@ * Transmission Power txPower * Organization org */ -interface StreetPassRecord { +export interface StreetPassRecord { timestamp: number, msg?: string, modelC: string, @@ -24,5 +24,3 @@ interface StreetPassRecord { contactIdValidFrom?: number, contactIdValidTo?: number, } - -export default StreetPassRecord; diff --git a/functions/src/opentrace/utils/Authenticator.ts b/functions/src/opentrace/utils/Authenticator.ts index 97eeda6..8367324 100644 --- a/functions/src/opentrace/utils/Authenticator.ts +++ b/functions/src/opentrace/utils/Authenticator.ts @@ -1,7 +1,7 @@ -import * as functions from "firebase-functions"; +import functions from "firebase-functions"; import {CallableContext} from "firebase-functions/lib/providers/https"; -export default class Authenticator { +export class Authenticator { async authenticate(data: any, context: CallableContext): Promise { if (!context.auth) { throw new functions.https.HttpsError('unauthenticated', 'The function must be called while authenticated.'); diff --git a/functions/src/opentrace/utils/CustomEncrypter.ts b/functions/src/opentrace/utils/CustomEncrypter.ts index b4fff6b..03bb94e 100644 --- a/functions/src/opentrace/utils/CustomEncrypter.ts +++ b/functions/src/opentrace/utils/CustomEncrypter.ts @@ -1,7 +1,7 @@ -import * as crypto from "crypto"; -import config from "../../config"; +import crypto from "crypto"; +import {config} from "../../config"; -class CustomEncrypter { +export class CustomEncrypter { algorithm: string; key: Buffer; @@ -71,5 +71,3 @@ class CustomEncrypter { return this.decrypt(decodedCipherTextB64, decodedIvB64, decodedAuthTagB64); } } - -export default CustomEncrypter; diff --git a/functions/src/opentrace/utils/PinGenerator.ts b/functions/src/opentrace/utils/PinGenerator.ts index f5a5ee1..99c0e8b 100644 --- a/functions/src/opentrace/utils/PinGenerator.ts +++ b/functions/src/opentrace/utils/PinGenerator.ts @@ -2,7 +2,7 @@ * This class uses a plain substring to generate a pin from user uid. * It should be subclassed with a secure implementation. */ -export default class PinGenerator { +export class PinGenerator { async generatePin(uid: string): Promise { return uid.substring(0, 6).toUpperCase(); } diff --git a/functions/src/opentrace/utils/formatTimestamp.ts b/functions/src/opentrace/utils/formatTimestamp.ts index 2ffd6e0..09c4ae4 100644 --- a/functions/src/opentrace/utils/formatTimestamp.ts +++ b/functions/src/opentrace/utils/formatTimestamp.ts @@ -2,14 +2,12 @@ * Convert timestamp (expressed in seconds since the Epoch) to "DD-MMM-YYYY HH:mm:ss Z" format * @param timestamp */ -import * as moment from "moment"; +import moment from "moment"; -import config from "../../config"; +import {config} from "../../config"; const TIMESTAMP_FORMAT = "DD-MMM-YYYY HH:mm:ss Z"; -function formatTimestamp(timestamp: number) { +export function formatTimestamp(timestamp: number) { return moment.unix(timestamp).utcOffset(config.utcOffset).format(TIMESTAMP_FORMAT); } - -export default formatTimestamp; \ No newline at end of file diff --git a/functions/src/opentrace/utils/getEncryptionKey.ts b/functions/src/opentrace/utils/getEncryptionKey.ts index 3a237c6..4f65743 100644 --- a/functions/src/opentrace/utils/getEncryptionKey.ts +++ b/functions/src/opentrace/utils/getEncryptionKey.ts @@ -1,11 +1,11 @@ import {SecretManagerServiceClient} from "@google-cloud/secret-manager"; -import config from "../../config"; +import {config} from "../../config"; const SECRET_KEY = `projects/${config.projectId}/secrets/${config.encryption.keyPath}`; const SECRET_KEY_DEFAULT_VERSION = `${SECRET_KEY}/versions/${config.encryption.defaultVersion}`; -const getEncryptionKey = async (): Promise => getEncryptionSecret(SECRET_KEY_DEFAULT_VERSION); +export const getEncryptionKey = async (): Promise => getEncryptionSecret(SECRET_KEY_DEFAULT_VERSION); export const getAllEncryptionKeys = async (): Promise => { const secretManagerClient = new SecretManagerServiceClient(); @@ -25,7 +25,7 @@ export const getAllEncryptionKeys = async (): Promise => { const isDefaultKey = (_: string) => SECRET_KEY_DEFAULT_VERSION.substring(SECRET_KEY_DEFAULT_VERSION.length - 2) === _.substring(_.length - 2); -async function getEncryptionSecret(keyPathIncludingVersion: string): Promise { +export async function getEncryptionSecret(keyPathIncludingVersion: string): Promise { const secretManagerClient = new SecretManagerServiceClient(); console.log("getEncryptionSecret:", `Getting encryption key: ${keyPathIncludingVersion}`); @@ -36,5 +36,3 @@ async function getEncryptionSecret(keyPathIncludingVersion: string): Promise { + .catch((error: any) => { chai.assert(false, `generatePin throws error: ${error.message}`); }) - .then(async pin => { + .then(async (pin: any) => { chai.assert(pin == await config.upload.pinGenerator.generatePin(uid), "Pin is not consistent between different calls"); }); diff --git a/functions/tsconfig.json b/functions/tsconfig.json index e9cb7d0..b979a87 100644 --- a/functions/tsconfig.json +++ b/functions/tsconfig.json @@ -7,10 +7,10 @@ "skipLibCheck": true, "sourceMap": true, "strict": true, - "target": "es2017" + "target": "es2017", + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "importHelpers": true }, "compileOnSave": true, - "include": [ - "src" - ] }