diff --git a/.eslintrc.json b/.eslintrc.json index 171e4e2e..3f332ef4 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,45 +1,15 @@ { - "overrides": [ - { - "files": "*.js", - "extends": [ - "eslint:recommended", - "prettier" - ], - "plugins": [ - "prettier" - ], - "parserOptions": { - "ecmaVersion": 2019, - "sourceType": "module" - }, - "env": { - "es6": true, - "node": true - }, - "rules": { - "prettier/prettier": "error" - } - }, - { - "files": "*.ts", - "extends": [ - "eslint:recommended", - "plugin:@typescript-eslint/eslint-recommended", - "plugin:@typescript-eslint/recommended", - "prettier/@typescript-eslint" - ], - "plugins": [ - "@typescript-eslint", - "prettier" - ], - "parser": "@typescript-eslint/parser", - "rules": { - "@typescript-eslint/explicit-function-return-type": "off", - "@typescript-eslint/explicit-member-accessibility": "off", - "@typescript-eslint/triple-slash-reference": "off", - "prettier/prettier": "error" - } - } - ] + "plugins": [ + "eslint-plugin-prettier", + "eslint-plugin-no-cyrillic-string" + ], + "rules": { + "prettier/prettier": "error", + "no-cyrillic-string/no-cyrillic-string": "error" + }, + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaVersion": 2022, + "sourceType": "module" + } } diff --git a/.travis.yml b/.travis.yml index c993ef92..e231548c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,6 +4,11 @@ node_js: - 11 - 12 - 13 + - 14 + - 15 + - 16 + - 17 + - 18 before_install: - yarn cache clean install: diff --git a/lerna.json b/lerna.json index 2dace5d0..256b98f2 100644 --- a/lerna.json +++ b/lerna.json @@ -4,5 +4,5 @@ "packages/*" ], "useWorkspaces": true, - "version": "2.4.5" + "version": "6.0.0" } diff --git a/package.json b/package.json index 9af4cfb6..446796d5 100644 --- a/package.json +++ b/package.json @@ -8,24 +8,29 @@ "docs": "node scripts/generate-docs.js" }, "devDependencies": { - "@typescript-eslint/eslint-plugin": "^2.17.0", - "@typescript-eslint/parser": "^2.17.0", + "@typescript-eslint/eslint-plugin": "^5.40.0", + "@typescript-eslint/parser": "^5.40.0", "ejs": "^3.0.1", - "eslint": "^6.8.0", - "eslint-config-prettier": "^6.9.0", - "eslint-plugin-prettier": "^3.1.2", + "eslint": "^8.25.0", + "eslint-config-prettier": "^8.5.0", + "eslint-plugin-no-cyrillic-string": "^1.0.5", + "eslint-plugin-prettier": "^4.2.1", + "eslint-plugin-simple-import-sort": "^8.0.0", "husky": "^4.2.1", - "lerna": "^3.20.2", + "lerna": "^6.0.0", + "lerna-update-wizard": "^1.1.2", "lint-staged": "^10.0.2", - "prettier": "1.18.2", - "typedoc": "^0.16.9", - "typescript": "^3.7.5" + "prettier": "2.7.1", + "typedoc": "^0.23.16", + "typescript": "^4.8.4" }, "workspaces": { "packages": [ - "examples/*", "packages/*" ], + "examples": [ + "examples/*" + ], "nohoist": [ "**/react-native", "**/react-native/**", diff --git a/packages/e3kit-base/.mocharc.json b/packages/e3kit-base/.mocharc.json deleted file mode 100644 index 15124f9c..00000000 --- a/packages/e3kit-base/.mocharc.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "package": "./package.json", - "extension": [ - "ts" - ], - "diff": true, - "reporter": "spec", - "spec": "src/__tests__/*.test.ts", - "recursive": true, - "require": [ - "ts-node/register" - ] -} diff --git a/packages/e3kit-base/package.json b/packages/e3kit-base/package.json index 72173243..0706ec86 100644 --- a/packages/e3kit-base/package.json +++ b/packages/e3kit-base/package.json @@ -16,38 +16,39 @@ "build": "rollup -c", "clean": "rimraf .rpt2_cache dist", "prepare": "npm run clean && npm run build", - "test": "mocha" + "ts-mocha": "ts-mocha -p tsconfig.spec.json src/__tests__/*.spec.ts" }, "dependencies": { - "@types/abstract-leveldown": "^5.0.1", - "@types/levelup": "^4.3.0", - "@virgilsecurity/crypto-types": "^1.0.0", - "@virgilsecurity/keyknox": "^1.0.3", - "@virgilsecurity/sdk-crypto": "^1.0.0", - "abstract-leveldown": "^6.2.2", - "levelup": "^4.3.2", - "subleveldown": "^4.1.4", - "virgil-pythia": "^1.0.2", - "virgil-sdk": "^6.1.2" + "@types/abstract-leveldown": "7.2.0", + "@types/expect": "24.3.0", + "@types/levelup": "5.1.2", + "@virgilsecurity/crypto-types": "1.1.1", + "@virgilsecurity/keyknox": "1.0.3", + "@virgilsecurity/sdk-crypto": "1.1.1", + "abstract-leveldown": "7.2.0", + "levelup": "5.1.1", + "subleveldown": "6.0.1", + "virgil-pythia": "1.0.2", + "virgil-sdk": "6.1.2" }, "devDependencies": { - "@types/chai": "^4.2.7", - "@types/chai-as-promised": "^7.1.2", + "@types/chai": "4.3.3", + "@types/chai-as-promised": "7.1.5", "@types/memdown": "^3.0.0", - "@types/mocha": "^5.2.7", - "@types/sinon": "7.5.1", - "chai": "^4.2.0", - "chai-as-promised": "^7.1.1", + "@types/mocha": "10.0.0", + "@types/sinon": "10.0.13", + "chai": "4.3.6", + "chai-as-promised": "7.1.1", "memdown": "^5.1.0", - "mocha": "^7.0.1", - "rimraf": "^3.0.0", - "rollup": "^1.29.1", - "rollup-plugin-license": "^2.3.0", - "rollup-plugin-typescript2": "^0.25.3", - "sinon": "8.1.1", - "ts-node": "^8.6.2", - "typescript": "^3.7.5", - "virgil-crypto": "^4.1.2" + "rimraf": "3.0.2", + "rollup": "3.1.0", + "rollup-plugin-license": "2.8.1", + "rollup-plugin-typescript2": "0.34.1", + "sinon": "14.0.1", + "ts-mocha": "10.0.0", + "ts-node": "10.9.1", + "typescript": "4.8.4", + "virgil-crypto": "4.2.2" }, "publishConfig": { "access": "public" diff --git a/packages/e3kit-base/src/AbstractEThree.ts b/packages/e3kit-base/src/AbstractEThree.ts index 8286a23a..005c3e62 100644 --- a/packages/e3kit-base/src/AbstractEThree.ts +++ b/packages/e3kit-base/src/AbstractEThree.ts @@ -111,7 +111,7 @@ export abstract class AbstractEThree { } this.inProcess = true; try { - const [cards, privateKey] = await Promise.all([ + const [cards, privateKey]: [ICard[], IPrivateKey | null] = await Promise.all([ this.cardManager.searchCards(this.identity), this.keyLoader.loadLocalPrivateKey(), ]); @@ -134,7 +134,7 @@ export abstract class AbstractEThree { } this.inProcess = true; try { - const [cards, privateKey] = await Promise.all([ + const [cards, privateKey]: [ICard[], IPrivateKey | null] = await Promise.all([ this.cardManager.searchCards(this.identity), this.keyLoader.loadLocalPrivateKey(), ]); @@ -472,7 +472,7 @@ export abstract class AbstractEThree { } const identitiesFound = new Set(Object.keys(result)); - const identitiesNotFound = new Set([...identitySet].filter(i => !identitiesFound.has(i))); + const identitiesNotFound = new Set([...identitySet].filter((i) => !identitiesFound.has(i))); if (identitiesNotFound.size > 0) { throw new UsersNotFoundError([...identitiesNotFound]); } @@ -533,7 +533,7 @@ export abstract class AbstractEThree { const resultWithErrors: { [identity: string]: Error } = {}; for (const identity of argument) { - const filteredCards = cards.filter(card => card.identity === identity); + const filteredCards = cards.filter((card) => card.identity === identity); if (filteredCards.length === 0) { resultWithErrors[identity] = new LookupNotFoundError(identity); } else if (filteredCards.length > 1) { @@ -689,10 +689,10 @@ export abstract class AbstractEThree { private isOwnPublicKeyIncluded(ownPublicKey: IPublicKey, publicKeys: IPublicKey[]) { const selfPublicKey = this.virgilCrypto.exportPublicKey(ownPublicKey).toString('base64'); - const stringKeys = publicKeys.map(key => + const stringKeys = publicKeys.map((key) => this.virgilCrypto.exportPublicKey(key).toString('base64'), ); - return stringKeys.some(key => key === selfPublicKey); + return stringKeys.some((key) => key === selfPublicKey); } private throwIllegalInvocationError(method: string) { diff --git a/packages/e3kit-base/src/GroupLocalStorage.ts b/packages/e3kit-base/src/GroupLocalStorage.ts index 27c2f5fd..c35d00ae 100644 --- a/packages/e3kit-base/src/GroupLocalStorage.ts +++ b/packages/e3kit-base/src/GroupLocalStorage.ts @@ -1,5 +1,6 @@ /// -import levelup, { LevelUp } from 'levelup'; +import levelup from 'levelup'; +import { LevelUp } from 'levelup'; import sub from 'subleveldown'; import { AbstractLevelDOWN, AbstractBatch } from 'abstract-leveldown'; import { Ticket, RawGroup, GroupInfo, IKeyPair, ICrypto } from './types'; @@ -18,7 +19,7 @@ export interface GroupLocalStorageConstructorParams { export class GroupLocalStorage { private _db: LevelUp; - private _encryptionLevel: VirgilEncryptDown; + private readonly _encryptionLevel: VirgilEncryptDown; constructor({ identity, virgilCrypto, leveldown }: GroupLocalStorageConstructorParams) { this._encryptionLevel = new VirgilEncryptDown(leveldown, { virgilCrypto }); @@ -39,11 +40,13 @@ export class GroupLocalStorage { key: sessionId, value: rawGroup.info, }; - const insertTickets: AbstractBatch[] = rawGroup.tickets.map(ticket => ({ - type: 'put', - key: this.getTicketKey(sessionId, ticket.groupSessionMessage.epochNumber), - value: ticket, - })); + const insertTickets: AbstractBatch[] = rawGroup.tickets.map( + (ticket: Ticket) => ({ + type: 'put', + key: this.getTicketKey(sessionId, ticket.groupSessionMessage.epochNumber), + value: ticket, + }), + ); await this._db.batch([insertInfo, ...insertTickets]); } @@ -56,12 +59,11 @@ export class GroupLocalStorage { throw new Error('Either "ticketCount" or "epochNumber" option must be provided'); } - const [info, tickets] = await Promise.all([ + const [info, tickets]: [GroupInfo | null, Ticket[]] = await Promise.all([ this.retrieveGroupInfo(sessionId), options.ticketCount ? this.retrieveNLastTickets(sessionId, options.ticketCount) - : // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - this.retrieveTicketByEpochNumber(sessionId, options.epochNumber!), + : this.retrieveTicketByEpochNumber(sessionId, options.epochNumber!), ]); if (!info || tickets.length === 0) return null; @@ -100,7 +102,7 @@ export class GroupLocalStorage { private async retrieveGroupInfo(sessionId: string): Promise { try { return await this._db.get(sessionId); - } catch (err) { + } catch (err: any) { if (err.notFound) { return null; } @@ -121,8 +123,8 @@ export class GroupLocalStorage { reverse: true, limit: ticketCount, }) - .on('data', data => tickets.unshift(data.value)) - .on('error', err => (error = err)) + .on('data', (data) => tickets.unshift(data.value)) + .on('error', (err) => (error = err)) .on('end', () => (error ? reject(error) : resolve(tickets))); }); } @@ -135,7 +137,7 @@ export class GroupLocalStorage { try { const ticket = await this._db.get(key); return [ticket]; - } catch (err) { + } catch (err: any) { if (err.notFound) { return []; } diff --git a/packages/e3kit-base/src/GroupManager.ts b/packages/e3kit-base/src/GroupManager.ts index f10cc437..4394b969 100644 --- a/packages/e3kit-base/src/GroupManager.ts +++ b/packages/e3kit-base/src/GroupManager.ts @@ -68,7 +68,7 @@ export class GroupManager { initiatorCard.identity, initiatorCard.publicKey, ); - } catch (err) { + } catch (err: any) { if ( err.name === 'GroupTicketDoesntExistError' || err.name === 'GroupTicketNoAccessError' @@ -92,7 +92,7 @@ export class GroupManager { } const initiator = initiatorCard.identity; - const tickets = cloudTickets.map(ct => ({ + const tickets = cloudTickets.map((ct) => ({ groupSessionMessage: ct.groupSessionMessageInfo, participants: ct.identities, })); @@ -124,7 +124,7 @@ export class GroupManager { cardManager: this._cardManager, groupManager: this, }); - } catch (error) { + } catch (error: any) { if (error.name === 'GroupTicketNoAccessError') { throw new GroupError( GroupErrorCode.NoAccess, @@ -142,9 +142,9 @@ export class GroupManager { await cloudTicketStorage.addRecipients(sessionId, allowedCards); await localGroupStorage.addParticipants( sessionId, - allowedCards.map(card => card.identity), + allowedCards.map((card) => card.identity), ); - } catch (error) { + } catch (error: any) { if (error.name === 'GroupTicketNoAccessError') { throw new GroupError( GroupErrorCode.NoAccess, @@ -158,7 +158,7 @@ export class GroupManager { async removeAccess(sessionId: string, forbiddenIdentities: string[]) { const cloudTicketStorage = await this.getCloudTicketStorage(); await Promise.all( - forbiddenIdentities.map(identity => + forbiddenIdentities.map((identity) => cloudTicketStorage.removeRecipient(sessionId, identity), ), ); @@ -175,7 +175,7 @@ export class GroupManager { const cloudTicketStorage = await this.getCloudTicketStorage(); try { await cloudTicketStorage.reAddRecipient(sessionId, allowedCard); - } catch (error) { + } catch (error: any) { if (error.name === 'GroupTicketNoAccessError') { throw new GroupError( GroupErrorCode.NoAccess, @@ -217,7 +217,6 @@ export class GroupManager { accessTokenProvider, apiUrl, undefined, - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion new VirgilAgent( process.env.__VIRGIL_PRODUCT_NAME__!, process.env.__VIRGIL_PRODUCT_VERSION__!, diff --git a/packages/e3kit-base/src/PrivateKeyLoader.ts b/packages/e3kit-base/src/PrivateKeyLoader.ts index 5e2ae8f1..49a53d27 100644 --- a/packages/e3kit-base/src/PrivateKeyLoader.ts +++ b/packages/e3kit-base/src/PrivateKeyLoader.ts @@ -39,7 +39,6 @@ export class PrivateKeyLoader { this.options.accessTokenProvider, this.options.apiUrl, undefined, - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion new VirgilAgent( process.env.__VIRGIL_PRODUCT_NAME__!, process.env.__VIRGIL_PRODUCT_VERSION__!, @@ -144,7 +143,7 @@ export class PrivateKeyLoader { privateKey: oldKeyPair.privateKey, publicKeys: [oldKeyPair.publicKey], }); - } catch (e) { + } catch (e: any) { if (e.name === 'FoundationError' || e.name === 'RNVirgilCryptoError') { throw new WrongKeyknoxPasswordError(); } @@ -194,7 +193,7 @@ export class PrivateKeyLoader { if (!skipCloudSync) { try { await storage.retrieveCloudEntries(); - } catch (e) { + } catch (e: any) { if (e.name === 'FoundationError' || e.name === 'RNVirgilCryptoError') { throw new WrongKeyknoxPasswordError(); } diff --git a/packages/e3kit-base/src/__tests__/AbstractEThree.test.ts b/packages/e3kit-base/src/__tests__/AbstractEThree.spec.ts similarity index 88% rename from packages/e3kit-base/src/__tests__/AbstractEThree.test.ts rename to packages/e3kit-base/src/__tests__/AbstractEThree.spec.ts index 9021d67e..e973932b 100644 --- a/packages/e3kit-base/src/__tests__/AbstractEThree.test.ts +++ b/packages/e3kit-base/src/__tests__/AbstractEThree.spec.ts @@ -2,31 +2,28 @@ import { expect, use } from 'chai'; import chaiAsPromised from 'chai-as-promised'; import sinon from 'sinon'; -import { CardManager, CachingJwtProvider, KeyEntryStorage, ICard } from 'virgil-sdk'; -import { VirgilCrypto } from 'virgil-crypto'; import { AbstractLevelDOWN } from 'abstract-leveldown'; - +import { ICard } from '../types'; +import memdown from 'memdown'; +import { VirgilCrypto } from 'virgil-crypto'; +import { CachingJwtProvider, CardManager, KeyEntryStorage } from 'virgil-sdk'; import { PrivateKeyLoader } from '../PrivateKeyLoader'; import { AbstractEThree } from '../AbstractEThree'; import { - UsersNotFoundError, - UsersFoundWithMultipleCardsError, IdentityAlreadyExistsError, MultipleCardsError, RegisterRequiredError, + UsersFoundWithMultipleCardsError, + UsersNotFoundError, } from '../errors'; -import { ICrypto } from '../types'; -import memdown from 'memdown'; use(chaiAsPromised); -const getRandomString = (prefix?: string) => { - return `${prefix ? prefix : ''}${Math.random() - .toString(36) - .substr(2)}`; +const getRandomString = (prefix: string): string => { + return `${prefix ? prefix : ''}${Math.random().toString(36).substr(2)}`; }; -let cryptoStub: sinon.SinonStubbedInstance; +let cryptoStub: sinon.SinonStubbedInstance; let cardManagerStub: sinon.SinonStubbedInstance; let keyLoaderStub: sinon.SinonStubbedInstance; let accessTokenProviderStub: sinon.SinonStubbedInstance; @@ -38,9 +35,9 @@ class MyEThree extends AbstractEThree { super({ identity, virgilCrypto: cryptoStub, - cardManager: cardManagerStub as any, - keyLoader: keyLoaderStub as any, - groupStorageLeveldown: groupStorageLeveldownStub as any, + cardManager: cardManagerStub, + keyLoader: keyLoaderStub, + groupStorageLeveldown: groupStorageLeveldownStub, // the following aren't actually used in the code and tests accessTokenProvider: accessTokenProviderStub, keyEntryStorage: keyEntryStorageStub, @@ -89,8 +86,8 @@ describe('AbstractEthree', () => { it('revoke all cards for identity', async () => { const ethree = new MyEThree('my_identity'); const identitiesCards = [ - { id: getRandomString(), identity: 'my_identity' } as ICard, - { id: getRandomString(), identity: 'my_identity' } as ICard, + { id: getRandomString(''), identity: 'my_identity' } as ICard, + { id: getRandomString(''), identity: 'my_identity' } as ICard, ]; cardManagerStub.searchCards.resolves(identitiesCards); await ethree.unregister(); @@ -122,9 +119,9 @@ describe('AbstractEthree', () => { const identities = Array(numberOfIdentities) .fill(undefined) .map((_: undefined, index: number) => `identity_${index + 1}`); - cardManagerStub.searchCards.callsFake(identities => { + cardManagerStub.searchCards.callsFake((identities) => { if (Array.isArray(identities)) { - return Promise.resolve(identities.map(identity => ({ identity } as ICard))); + return Promise.resolve(identities.map((identity) => ({ identity } as ICard))); } else { throw new Error('Expected "identities" to be an array'); } diff --git a/packages/e3kit-base/src/__tests__/GroupLocalStorage.test.ts b/packages/e3kit-base/src/__tests__/GroupLocalStorage.spec.ts similarity index 96% rename from packages/e3kit-base/src/__tests__/GroupLocalStorage.test.ts rename to packages/e3kit-base/src/__tests__/GroupLocalStorage.spec.ts index 9b3dc607..346bfc88 100644 --- a/packages/e3kit-base/src/__tests__/GroupLocalStorage.test.ts +++ b/packages/e3kit-base/src/__tests__/GroupLocalStorage.spec.ts @@ -12,9 +12,7 @@ import { AbstractLevelDOWN } from 'abstract-leveldown'; use(chaiAsPromised); const getRandomString = (prefix?: string) => { - return `${prefix ? prefix : ''}${Math.random() - .toString(36) - .substr(2)}`; + return `${prefix ? prefix : ''}${Math.random().toString(36).substr(2)}`; }; const createGroupInfo = (initiator?: string): GroupInfo => { @@ -436,12 +434,12 @@ describe('GroupLocalStorage', () => { sessionIds.push(getRandomString('session')); } - const groups = sessionIds.map(sessionId => ({ + const groups = sessionIds.map((sessionId) => ({ info: createGroupInfo(), tickets: createTickets(sessionId, 10), })); - await Promise.all(groups.map(g => storage.store(g))); + await Promise.all(groups.map((g) => storage.store(g))); await storage.reset(); @@ -464,28 +462,28 @@ describe('GroupLocalStorage', () => { sessionIds.push(getRandomString('session')); } - const groups = sessionIds.map(sessionId => ({ + const groups = sessionIds.map((sessionId) => ({ info: createGroupInfo(), tickets: createTickets(sessionId, 10), })); await Promise.all( - groups.map(g => storage1.store(g)).concat(groups.map(g => storage2.store(g))), + groups.map((g) => storage1.store(g)).concat(groups.map((g) => storage2.store(g))), ); await storage1.reset(); const storage1Groups = await Promise.all( - sessionIds.map(sessionId => storage1.retrieve(sessionId, { ticketCount: 100 })), + sessionIds.map((sessionId) => storage1.retrieve(sessionId, { ticketCount: 100 })), ); - expect(storage1Groups.every(el => el == null)).to.be.true; + expect(storage1Groups.every((el) => el == null)).to.be.true; const storage2Groups = await Promise.all( - sessionIds.map(sessionId => storage2.retrieve(sessionId, { ticketCount: 100 })), + sessionIds.map((sessionId) => storage2.retrieve(sessionId, { ticketCount: 100 })), ); - expect(storage2Groups.every(el => el != null)).to.be.true; + expect(storage2Groups.every((el) => el != null)).to.be.true; }); }); }); diff --git a/packages/e3kit-base/src/groups/Group.ts b/packages/e3kit-base/src/groups/Group.ts index d055c354..bf4d0233 100644 --- a/packages/e3kit-base/src/groups/Group.ts +++ b/packages/e3kit-base/src/groups/Group.ts @@ -57,7 +57,7 @@ export class Group { this._virgilCrypto = options.privateKeyLoader.options.virgilCrypto; this._privateKeyLoader = options.privateKeyLoader; this._session = this._virgilCrypto.importGroupSession( - sortedTickets.map(t => t.groupSessionMessage.data), + sortedTickets.map((t: Ticket) => t.groupSessionMessage.data), ); this._cardManager = options.cardManager; this._groupManager = options.groupManager; @@ -132,7 +132,7 @@ export class Group { decrypted = tempGroup.decrypt(encryptedData, actualCard); } return shouldReturnString ? decrypted.toString('utf8') : decrypted; - } catch (err) { + } catch (err: any) { if (err.name === 'FoundationError' && /Invalid signature/.test(err.message)) { throw new GroupError( GroupErrorCode.DataVerificationFailed, @@ -173,7 +173,7 @@ export class Group { } const missingIdentities = setDifference( - new Set(cardsToAdd.map(c => c.identity)), + new Set(cardsToAdd.map((c: ICard) => c.identity)), new Set(this.participants), ); const newParticipantCount = missingIdentities.size + this.participants.length; @@ -183,7 +183,7 @@ export class Group { `Cannot add ${missingIdentities.size} participant(s) to the group that has ${this.participants.length} participants. Group can have ${VALID_GROUP_PARTICIPANT_COUNT_RANGE[0]} to ${VALID_GROUP_PARTICIPANT_COUNT_RANGE[1]} participants.`, ); } - const missingCards = cardsToAdd.filter(c => missingIdentities.has(c.identity)); + const missingCards = cardsToAdd.filter((c: ICard) => missingIdentities.has(c.identity)); if (missingCards.length === 0) { throw new GroupError( GroupErrorCode.ParticipantAlreadyAdded, @@ -214,14 +214,15 @@ export class Group { const oldIdentities = new Set(this.participants); const newIdentities = setDifference( new Set(this.participants), - new Set(cardsToRemove.map(c => c.identity)), + new Set(cardsToRemove.map((c: ICard) => c.identity)), ); if (!isValidParticipantCount(newIdentities.size)) { throw new GroupError( GroupErrorCode.InvalidChangeParticipants, - `Cannot remove ${oldIdentities.size - - newIdentities.size} participant(s) from the group that has ${ + `Cannot remove ${ + oldIdentities.size - newIdentities.size + } participant(s) from the group that has ${ oldIdentities.size } participants. Group can have ${VALID_GROUP_PARTICIPANT_COUNT_RANGE[0]} to ${ VALID_GROUP_PARTICIPANT_COUNT_RANGE[1] diff --git a/packages/e3kit-base/src/virgil-encrypt-down/index.ts b/packages/e3kit-base/src/virgil-encrypt-down/index.ts index e734095b..1157b034 100644 --- a/packages/e3kit-base/src/virgil-encrypt-down/index.ts +++ b/packages/e3kit-base/src/virgil-encrypt-down/index.ts @@ -46,7 +46,7 @@ class VirgilEncryptDownIterator extends AbstractIterator { key, this.options.valueAsBuffer ? decrypted : decrypted.toString('utf8'), ); - } catch (err) { + } catch (err: any) { callback(err, undefined!, undefined!); } }); @@ -58,7 +58,7 @@ class VirgilEncryptDownIterator extends AbstractIterator { } class VirgilEncryptDown extends AbstractLevelDOWN { - db: AbstractLevelDOWN; + public db: AbstractLevelDOWN; crypto: ICrypto; keyPair?: IKeyPair; @@ -86,7 +86,7 @@ class VirgilEncryptDown extends AbstractLevelDOWN { try { const decrypted = this.decrypt(encrypted); callback(undefined, options.asBuffer ? decrypted : decrypted.toString('utf8')); - } catch (error) { + } catch (error: any) { callback(error, undefined!); } }); @@ -96,7 +96,7 @@ class VirgilEncryptDown extends AbstractLevelDOWN { let encrypted; try { encrypted = this.encrypt(value); - } catch (err) { + } catch (err: any) { return setTimeout(() => callback(err)); } @@ -114,13 +114,13 @@ class VirgilEncryptDown extends AbstractLevelDOWN { ) { let operations; try { - operations = ops.map(op => { + operations = ops.map((op) => { if (op.type === 'put') { return { ...op, value: this.encrypt(op.value) }; } return op; }); - } catch (err) { + } catch (err: any) { return setTimeout(() => callback(err)); } diff --git a/packages/e3kit-base/tsconfig.json b/packages/e3kit-base/tsconfig.json index 6818f0b6..abbec1a4 100644 --- a/packages/e3kit-base/tsconfig.json +++ b/packages/e3kit-base/tsconfig.json @@ -1,10 +1,26 @@ { + "compileOnSave": false, "compilerOptions": { - "target": "ES2015", + "outDir": "./dist/types", + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitReturns": false, + "strictPropertyInitialization": false, + "noFallthroughCasesInSwitch": true, + "sourceMap": true, "declaration": true, "declarationDir": "./dist/types", - "strict": true, + "downlevelIteration": true, + "experimentalDecorators": true, + "noImplicitAny": true, + "moduleResolution": "node", + "importHelpers": true, "esModuleInterop": true, - "moduleResolution": "node" - } + "target": "es2020", + "module": "es2015", + "lib": [ + "es2018", + "dom" + ] + }, } diff --git a/packages/e3kit-base/tsconfig.spec.json b/packages/e3kit-base/tsconfig.spec.json new file mode 100644 index 00000000..ff8b1114 --- /dev/null +++ b/packages/e3kit-base/tsconfig.spec.json @@ -0,0 +1,26 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "outDir": "./dist/types", + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitReturns": false, + "strictPropertyInitialization": false, + "noFallthroughCasesInSwitch": true, + "sourceMap": true, + "declaration": true, + "declarationDir": "./dist/types", + "downlevelIteration": true, + "experimentalDecorators": true, + "noImplicitAny": true, + "moduleResolution": "node", + "importHelpers": true, + "esModuleInterop": true, + "target": "es2020", + "module": "commonjs", + "lib": [ + "es2018", + "dom" + ] + }, +} diff --git a/packages/e3kit-browser/package.json b/packages/e3kit-browser/package.json index fa9c754f..149e0933 100644 --- a/packages/e3kit-browser/package.json +++ b/packages/e3kit-browser/package.json @@ -16,31 +16,35 @@ "author": "Virgil Security Inc. ", "license": "BSD-3-Clause", "scripts": { - "build": "cross-env NODE_OPTIONS=--max-old-space-size=4096 rollup -c", + "build": "rollup -c", "clean": "rimraf .rpt2_cache dist", "prepare": "npm run clean && npm run build" }, "dependencies": { - "@types/level-js": "^4.0.1", - "@virgilsecurity/e3kit-base": "^2.4.5", - "@virgilsecurity/pythia-crypto": "^1.1.2", + "@types/level-js": "4.0.2", + "@virgilsecurity/e3kit-base": "2.4.5", + "@virgilsecurity/pythia-crypto": "1.1.3", "level-js": "^5.0.1", - "virgil-crypto": "^4.1.2", - "virgil-sdk": "^6.1.2" + "virgil-crypto": "4.2.2", + "virgil-sdk": "6.1.2" }, "devDependencies": { - "cross-env": "^7.0.2", - "rimraf": "^3.0.0", - "rollup": "^1.29.1", - "rollup-plugin-commonjs": "^10.1.0", - "rollup-plugin-copy": "^2.0.1", - "rollup-plugin-license": "^2.3.0", - "rollup-plugin-node-builtins": "^2.1.2", - "rollup-plugin-node-globals": "^1.4.0", - "rollup-plugin-node-resolve": "^5.2.0", - "rollup-plugin-re": "^1.0.7", - "rollup-plugin-typescript2": "^0.25.3", - "typescript": "^3.7.5" + "@rollup/plugin-json": "5.0.0", + "@rollup/plugin-wasm": "6.0.0", + "cross-env": "7.0.3", + "readable-stream": "4.2.0", + "rimraf": "3.0.2", + "rollup": "3.1.0", + "rollup-plugin-commonjs": "10.1.0", + "rollup-plugin-copy": "3.4.0", + "rollup-plugin-license": "2.8.1", + "rollup-plugin-node-builtins": "2.1.2", + "rollup-plugin-node-globals": "1.4.0", + "rollup-plugin-node-polyfills": "0.2.1", + "rollup-plugin-node-resolve": "5.2.0", + "rollup-plugin-re": "1.0.7", + "rollup-plugin-typescript2": "0.34.1", + "typescript": "4.8.4" }, "publishConfig": { "access": "public" diff --git a/packages/e3kit-browser/rollup.config.js b/packages/e3kit-browser/rollup.config.js index 3c7678f8..b4c35803 100644 --- a/packages/e3kit-browser/rollup.config.js +++ b/packages/e3kit-browser/rollup.config.js @@ -7,10 +7,13 @@ const license = require('rollup-plugin-license'); const nodeBuiltins = require('rollup-plugin-node-builtins'); const nodeGlobals = require('rollup-plugin-node-globals'); const nodeResolve = require('rollup-plugin-node-resolve'); +const nodePolyfills = require('rollup-plugin-node-polyfills'); const replace = require('rollup-plugin-re'); const typescript = require('rollup-plugin-typescript2'); const { generateCrossPlatformPath } = require('../../utils/build'); const packageJson = require('./package.json'); +const json = require('@rollup/plugin-json'); +const wasm = require('@rollup/plugin-wasm'); const PRODUCT_NAME = 'e3kit'; const FORMAT = { @@ -32,7 +35,7 @@ const TARGET = { const sourcePath = path.join(__dirname, 'src'); const outputPath = path.join(__dirname, 'dist'); -const getModulePath = request => { +const getModulePath = (request) => { const resolvePaths = require.resolve.paths(request); for (let resolvePath of resolvePaths) { const modulePath = path.join(resolvePath, request); @@ -117,7 +120,10 @@ const createEntry = (target, cryptoType, format) => { ], }), nodeResolve({ browser: true, preferBuiltins: true }), - commonjs(), + commonjs({ + ignoreDynamicRequires: true, + ignore: ['readable-stream'], + }), typescript({ useTsconfigDeclarationDir: true, objectHashIgnoreUnknownHack: true, @@ -127,8 +133,10 @@ const createEntry = (target, cryptoType, format) => { }, }, }), + json(), nodeGlobals(), nodeBuiltins(), + nodePolyfills(), license({ banner: { content: { @@ -136,11 +144,22 @@ const createEntry = (target, cryptoType, format) => { }, }, }), - cryptoType === CRYPTO_TYPE.WASM && - copy({ - outputFolder: outputPath, - targets: [foundationWasmPath, pythiaWasmPath], - }), + wasm({ + publicPath: outputPath, + sync: [foundationWasmPath, pythiaWasmPath], + }), + copy({ + targets: [ + { + src: foundationWasmPath, + dest: outputPath, + }, + { + src: pythiaWasmPath, + dest: outputPath, + }, + ], + }), ], }; }; diff --git a/packages/e3kit-browser/src/EThree.ts b/packages/e3kit-browser/src/EThree.ts index ac5b36ab..6539586e 100644 --- a/packages/e3kit-browser/src/EThree.ts +++ b/packages/e3kit-browser/src/EThree.ts @@ -157,7 +157,6 @@ export class EThree extends AbstractEThree { const onFinishCallback = () => resolve(streamSigner.sign(privateKey as VirgilPrivateKey)); - // eslint-disable-next-line @typescript-eslint/no-explicit-any const onErrorCallback = (err: any) => { streamSigner.dispose(); reject(err); @@ -702,13 +701,10 @@ export class EThree extends AbstractEThree { retryOnUnauthorized: true, apiUrl: opts.apiUrl, productInfo: { - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion product: process.env.__VIRGIL_PRODUCT_NAME__!, - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion version: process.env.__VIRGIL_PRODUCT_VERSION__!, }, }); - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const groupStorageLeveldown = leveljs(opts.groupStorageName!); return { diff --git a/packages/e3kit-browser/src/processFile.ts b/packages/e3kit-browser/src/processFile.ts index eb845a60..c65d8b46 100644 --- a/packages/e3kit-browser/src/processFile.ts +++ b/packages/e3kit-browser/src/processFile.ts @@ -14,7 +14,6 @@ export type processFileOptions = { signal?: AbortSignal; onChunkCallback: onChunkCallback; onFinishCallback: () => void; - // eslint-disable-next-line @typescript-eslint/no-explicit-any onErrorCallback: (err: any) => void; }; diff --git a/packages/e3kit-browser/src/typeguards.ts b/packages/e3kit-browser/src/typeguards.ts index d0c783bc..132c1431 100644 --- a/packages/e3kit-browser/src/typeguards.ts +++ b/packages/e3kit-browser/src/typeguards.ts @@ -1,7 +1,6 @@ /** * @hidden */ -// eslint-disable-next-line @typescript-eslint/no-explicit-any export const isFile = (val: any): val is File => { return val instanceof File; }; diff --git a/packages/e3kit-browser/tsconfig.json b/packages/e3kit-browser/tsconfig.json index 6818f0b6..0d2d5472 100644 --- a/packages/e3kit-browser/tsconfig.json +++ b/packages/e3kit-browser/tsconfig.json @@ -1,10 +1,25 @@ { + "compileOnSave": false, "compilerOptions": { - "target": "ES2015", + "outDir": "./dist", + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitReturns": false, + "strictPropertyInitialization": false, + "noFallthroughCasesInSwitch": true, + "sourceMap": true, "declaration": true, "declarationDir": "./dist/types", - "strict": true, + "downlevelIteration": true, + "experimentalDecorators": true, + "moduleResolution": "node", + "importHelpers": true, "esModuleInterop": true, - "moduleResolution": "node" - } + "target": "es2020", + "module": "es2015", + "lib": [ + "es2018", + "dom" + ] + }, } diff --git a/packages/e3kit-native/package.json b/packages/e3kit-native/package.json index 7fd0472a..ebd37d24 100644 --- a/packages/e3kit-native/package.json +++ b/packages/e3kit-native/package.json @@ -18,30 +18,31 @@ "prepare": "npm run clean && npm run build" }, "dependencies": { - "@types/abstract-leveldown": "^5.0.1", - "@types/react-native": "^0.61.4", - "@virgilsecurity/e3kit-base": "^2.4.5", - "@virgilsecurity/sdk-crypto": "^1.0.0", - "asyncstorage-down": "^4.2.0", - "virgil-sdk": "^6.1.2" + "@types/abstract-leveldown": "7.2.0", + "@types/react-native": "0.70.4", + "@virgilsecurity/e3kit-base": "2.4.5", + "@virgilsecurity/sdk-crypto": "1.1.1", + "asyncstorage-down": "4.2.0", + "virgil-sdk": "6.1.2" }, "devDependencies": { - "@virgilsecurity/key-storage-rn": "^1.0.0", - "react-native-keychain": "^5.0.1", - "react-native-virgil-crypto": ">=0.5.2 <1.0.0", - "rimraf": "^3.0.0", - "rollup": "^1.29.1", - "rollup-plugin-commonjs": "^10.1.0", - "rollup-plugin-license": "^2.3.0", - "rollup-plugin-node-builtins": "^2.1.2", - "rollup-plugin-node-globals": "^1.4.0", - "rollup-plugin-node-resolve": "^5.2.0", - "rollup-plugin-typescript2": "^0.25.3", - "typescript": "^3.7.5" + "@rollup/plugin-json": "5.0.0", + "@virgilsecurity/key-storage-rn": "1.0.0", + "react-native-keychain": "8.1.1", + "react-native-virgil-crypto": "0.6.1", + "rimraf": "3.0.2", + "rollup": "3.1.0", + "rollup-plugin-commonjs": "10.1.0", + "rollup-plugin-license": "2.8.1", + "rollup-plugin-node-builtins": "2.1.2", + "rollup-plugin-node-globals": "1.4.0", + "rollup-plugin-node-resolve": "5.2.0", + "rollup-plugin-typescript2": "0.34.1", + "typescript": "4.8.4" }, "peerDependencies": { - "@virgilsecurity/key-storage-rn": "^1.0.0", - "react-native-virgil-crypto": ">=0.5.2 <1.0.0" + "@virgilsecurity/key-storage-rn": "1.0.0", + "react-native-virgil-crypto": "0.6.1" }, "publishConfig": { "access": "public" diff --git a/packages/e3kit-native/rollup.config.js b/packages/e3kit-native/rollup.config.js index 24ac4649..792bcf4f 100644 --- a/packages/e3kit-native/rollup.config.js +++ b/packages/e3kit-native/rollup.config.js @@ -7,6 +7,7 @@ const typescript = require('rollup-plugin-typescript2'); const builtins = require('rollup-plugin-node-builtins'); const globals = require('rollup-plugin-node-globals'); const replace = require('rollup-plugin-re'); +const json = require('@rollup/plugin-json'); const packageJson = require('./package.json'); const PRODUCT_NAME = 'e3kit'; @@ -19,7 +20,7 @@ const FORMAT = { const sourcePath = path.join(__dirname, 'src'); const outputPath = path.join(__dirname, 'dist'); -const createEntry = format => ({ +const createEntry = (format) => ({ external: [ '@react-native-community/async-storage', '@virgilsecurity/key-storage-rn/native', @@ -51,6 +52,7 @@ const createEntry = format => ({ }, }, }), + json(), license({ banner: { content: { diff --git a/packages/e3kit-native/src/EThree.ts b/packages/e3kit-native/src/EThree.ts index 1fc6357e..55518c62 100644 --- a/packages/e3kit-native/src/EThree.ts +++ b/packages/e3kit-native/src/EThree.ts @@ -55,10 +55,8 @@ export class EThree extends AbstractEThree { retryOnUnauthorized: true, apiUrl: opts.apiUrl, productInfo: { - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - product: process.env.__VIRGIL_PRODUCT_NAME__!, - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - version: process.env.__VIRGIL_PRODUCT_VERSION__!, + product: process.env.__VIRGIL_PRODUCT_NAME__ ?? '', + version: process.env.__VIRGIL_PRODUCT_VERSION__ ?? '', }, }); const groupStorageLeveldown = asyncstorageDown(opts.groupStorageName!, { @@ -115,7 +113,6 @@ export class EThree extends AbstractEThree { * @hidden */ protected isPublicKey(publicKey: any) { - // eslint-disable-next-line @typescript-eslint/no-explicit-any return publicKey != null && typeof (publicKey as any).value === 'string'; } } diff --git a/packages/e3kit-native/src/asyncstoragedown-clear-polyfill.ts b/packages/e3kit-native/src/asyncstoragedown-clear-polyfill.ts index e692b5b7..cc80c385 100644 --- a/packages/e3kit-native/src/asyncstoragedown-clear-polyfill.ts +++ b/packages/e3kit-native/src/asyncstoragedown-clear-polyfill.ts @@ -1,7 +1,7 @@ import asyncstorageDown from 'asyncstorage-down'; if (typeof asyncstorageDown.prototype.clear === 'undefined') { - asyncstorageDown.prototype.clear = function(opts?: any, cb?: (err?: Error) => void) { + asyncstorageDown.prototype.clear = function (opts?: any, cb?: (err?: Error) => void) { let options; let callback: (err?: Error) => void; if (typeof opts === 'function') { diff --git a/packages/e3kit-native/tsconfig.json b/packages/e3kit-native/tsconfig.json index 6818f0b6..3c811468 100644 --- a/packages/e3kit-native/tsconfig.json +++ b/packages/e3kit-native/tsconfig.json @@ -1,10 +1,25 @@ { + "compileOnSave": false, "compilerOptions": { - "target": "ES2015", + "outDir": "./dist/types", + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitReturns": false, + "strictPropertyInitialization": false, + "noFallthroughCasesInSwitch": true, + "sourceMap": true, "declaration": true, "declarationDir": "./dist/types", - "strict": true, + "downlevelIteration": true, + "experimentalDecorators": true, + "moduleResolution": "node", + "importHelpers": true, "esModuleInterop": true, - "moduleResolution": "node" - } + "target": "es2020", + "module": "es2015", + "lib": [ + "es2018", + "dom" + ] + }, } diff --git a/packages/e3kit-node/package.json b/packages/e3kit-node/package.json index 2f72dc6c..d18efc3d 100644 --- a/packages/e3kit-node/package.json +++ b/packages/e3kit-node/package.json @@ -18,24 +18,24 @@ "prepare": "npm run clean && npm run build" }, "dependencies": { - "@types/leveldown": "^4.0.0", - "@types/mkdirp": "^0.5.2", - "@virgilsecurity/e3kit-base": "^2.4.5", - "@virgilsecurity/pythia-crypto": "^1.1.2", - "leveldown": "^5.4.1", - "mkdirp": "^1.0.3", - "virgil-crypto": "^4.1.2", - "virgil-sdk": "^6.1.2" + "@types/leveldown": "4.0.3", + "@types/mkdirp": "1.0.2", + "@virgilsecurity/e3kit-base": "2.4.5", + "@virgilsecurity/pythia-crypto": "1.1.3", + "leveldown": "6.1.1", + "mkdirp": "1.0.4", + "virgil-crypto": "4.2.2", + "virgil-sdk": "6.1.2" }, "devDependencies": { - "@rollup/plugin-json": "^4.0.1", - "builtin-modules": "^3.1.0", - "rimraf": "^3.0.0", - "rollup": "^1.29.1", - "rollup-plugin-license": "^2.3.0", - "rollup-plugin-re": "^1.0.7", - "rollup-plugin-typescript2": "^0.25.3", - "typescript": "^3.7.5" + "@rollup/plugin-json": "5.0.0", + "builtin-modules": "3.3.0", + "rimraf": "3.0.2", + "rollup": "3.1.0", + "rollup-plugin-license": "2.8.1", + "rollup-plugin-re": "1.0.7", + "rollup-plugin-typescript2": "0.34.1", + "typescript": "4.8.4" }, "publishConfig": { "access": "public" diff --git a/packages/e3kit-node/tsconfig.json b/packages/e3kit-node/tsconfig.json index 4505a693..45cd33f1 100644 --- a/packages/e3kit-node/tsconfig.json +++ b/packages/e3kit-node/tsconfig.json @@ -1,11 +1,26 @@ { + "compileOnSave": false, "compilerOptions": { + "outDir": "./dist", "resolveJsonModule": true, - "target": "ES2015", + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitReturns": false, + "strictPropertyInitialization": false, + "noFallthroughCasesInSwitch": true, + "sourceMap": true, "declaration": true, "declarationDir": "./dist/types", - "strict": true, + "downlevelIteration": true, + "experimentalDecorators": true, + "moduleResolution": "node", + "importHelpers": true, "esModuleInterop": true, - "moduleResolution": "node" - } + "target": "es2020", + "module": "es2015", + "lib": [ + "es2018", + "dom" + ] + }, } diff --git a/packages/e3kit-tests/babel.config.json b/packages/e3kit-tests/babel.config.json new file mode 100644 index 00000000..9182636e --- /dev/null +++ b/packages/e3kit-tests/babel.config.json @@ -0,0 +1,36 @@ +{ + "presets": [ + [ + "@babel/preset-env", + { + "modules": "commonjs", + "targets": { + "node": "current" + } + } + ], + "@babel/preset-typescript" + ], + "plugins": [ + "@babel/plugin-transform-async-to-generator", + "babel-plugin-transform-class-properties", + "babel-plugin-transform-decorators-legacy", + "babel-plugin-transform-es2015-modules-commonjs" + ], + "env": { + "test": { + "presets": ["@babel/preset-env"], + "plugins": [ + "@babel/plugin-transform-async-to-generator", + "@babel/plugin-transform-modules-commonjs", + [ + "@babel/plugin-transform-runtime", + { + "regenerator": true + } + ], + "transform-class-properties" + ] + } + } +} diff --git a/packages/e3kit-tests/jest.config.ts b/packages/e3kit-tests/jest.config.ts new file mode 100644 index 00000000..ef74c5cb --- /dev/null +++ b/packages/e3kit-tests/jest.config.ts @@ -0,0 +1,18 @@ +import type { Config } from 'jest'; + +const config: Config = { + verbose: true, + preset: 'ts-jest', + testEnvironment: 'node', + transform: { + '^.+\\.ts?$': 'ts-jest', + '^.+\\.js?$': 'babel-jest', // had to add this + }, + //testMatch: ['*.spec.ts'], + //runner: 'jest-runner-mocha', + moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'], + moduleDirectories: ['node_modules', 'src'], + transformIgnorePatterns: [], +}; + +export default config; diff --git a/packages/e3kit-tests/karma.conf.js b/packages/e3kit-tests/karma.conf.js index 43438734..20570057 100644 --- a/packages/e3kit-tests/karma.conf.js +++ b/packages/e3kit-tests/karma.conf.js @@ -3,60 +3,73 @@ const webpack = require('webpack'); dotenv.config(); -module.exports = config => { +module.exports = (config) => { config.set({ - frameworks: ['mocha'], - autoWatch: false, - files: ['src/browser.test.ts'], + frameworks: ['mocha', 'karma-typescript'], + autoWatch: true, + files: [ + { + pattern: 'src/browser/*.spec.ts', + type: 'module', + }, + ], browsers: ['ChromeHeadless'], colors: true, - logLevel: config.LOG_INFO, + logLevel: config.DEBUG, browserNoActivityTimeout: 60 * 1000, - singleRun: true, + singleRun: false, mime: { 'text/x-typescript': ['ts'], 'application/wasm': ['wasm'], }, preprocessors: { - 'src/browser.test.ts': ['webpack'], + 'src/browser.test.ts': ['karma-typescript'], }, client: { mocha: { timeout: 15000, }, }, - reporters: ['spec'], - webpack: { - mode: 'production', - resolve: { - extensions: ['.js', '.ts'], - }, - module: { - rules: [ - { - test: /\.ts$/, - loader: 'ts-loader', - }, - { - test: /\.wasm$/, - type: 'javascript/auto', - loader: 'file-loader', - }, - ], + reporters: ['spec', 'karma-typescript'], + karmaTypescriptConfig: { + bundlerOptions: { + entrypoints: '**.spec.ts', + transforms: [require('karma-typescript-es6-transform')()], + resolve: 'src', }, - plugins: [ - new webpack.NormalModuleReplacementPlugin( - /@virgilsecurity\/e3kit-node/, - '@virgilsecurity/e3kit-browser', - ), - new webpack.EnvironmentPlugin({ - APP_KEY_ID: JSON.stringify(process.env.APP_KEY_ID), - APP_KEY: JSON.stringify(process.env.APP_KEY), - APP_ID: JSON.stringify(process.env.APP_ID), - API_URL: JSON.stringify(process.env.API_URL), - NODE_ENV: process.env.NODE_ENV || JSON.stringify('production'), - }), - ], + tsconfig: 'tsconfig.json', }, + // webpack: { + // mode: process.env.NODE_ENV || JSON.stringify('production'), + // resolve: { + // extensions: ['.js', '.ts'], + // }, + // module: { + // rules: [ + // { + // test: /\.ts$/, + // loader: 'ts-loader', + // }, + // { + // test: /\.wasm$/, + // type: 'javascript/auto', + // loader: 'file-loader', + // }, + // ], + // }, + // plugins: [ + // new webpack.NormalModuleReplacementPlugin( + // /@virgilsecurity\/e3kit-node/, + // '@virgilsecurity/e3kit-browser', + // ), + // new webpack.EnvironmentPlugin({ + // APP_KEY_ID: JSON.stringify(process.env.APP_KEY_ID), + // APP_KEY: JSON.stringify(process.env.APP_KEY), + // APP_ID: JSON.stringify(process.env.APP_ID), + // API_URL: JSON.stringify(process.env.API_URL), + // NODE_ENV: process.env.NODE_ENV || JSON.stringify('production'), + // }), + // ], + // }, }); }; diff --git a/packages/e3kit-tests/package.json b/packages/e3kit-tests/package.json index 23fb8c28..3d99dbe9 100644 --- a/packages/e3kit-tests/package.json +++ b/packages/e3kit-tests/package.json @@ -6,40 +6,61 @@ "author": "Virgil Security Inc. ", "license": "BSD-3-Clause", "private": true, + "type": "module", "scripts": { "test": "concurrently 'npm:test:*'", "test:node": "mocha -t 0 -r dotenv/config -r ts-node/register -r setup-mocha src/node.test.ts", - "test:browser": "karma start" + "test:browser": "jest src/browser/*.spec.ts" }, "dependencies": { - "@types/chai": "^4.2.7", + "@babel/plugin-transform-async-to-generator": "^7.18.6", + "@babel/plugin-transform-runtime": "^7.19.6", + "@babel/preset-typescript": "^7.18.6", + "@types/chai": "4.3.3", + "@types/expect": "24.3.0", "@types/is-buffer": "^2.0.0", - "@types/mocha": "^5.2.7", - "@types/uuid": "^3.4.6", - "@virgilsecurity/e3kit-browser": "^2.4.5", - "@virgilsecurity/e3kit-node": "^2.4.5", - "@virgilsecurity/keyknox": "^1.0.3", - "@virgilsecurity/pythia-crypto": "^1.1.2", - "chai": "^4.2.0", - "concurrently": "^5.1.0", - "dotenv": "^8.2.0", - "file-loader": "^5.0.2", - "is-buffer": "^2.0.4", - "karma": "^4.4.1", - "karma-chai": "^0.1.0", - "karma-chrome-launcher": "^3.1.0", - "karma-mocha": "^1.3.0", - "karma-spec-reporter": "^0.0.32", - "karma-webpack": "^4.0.2", - "mocha": "^7.0.1", - "ts-loader": "^6.2.1", - "ts-node": "^8.6.2", - "typescript": "^3.7.5", - "uuid": "^3.4.0", - "virgil-crypto": "^4.1.2", - "virgil-pythia": "^1.0.2", - "virgil-sdk": "^6.1.2", - "webpack": "^4.41.5" + "@types/jest": "^29.2.0", + "@types/mocha": "10.0.0", + "@types/uuid": "8.3.4", + "@virgilsecurity/e3kit-browser": "2.4.5", + "@virgilsecurity/e3kit-node": "2.4.5", + "@virgilsecurity/keyknox": "1.0.3", + "@virgilsecurity/pythia-crypto": "1.1.3", + "babel-env": "^2.4.1", + "babel-jest": "^29.2.1", + "babel-plugin-transform-class-properties": "^6.24.1", + "babel-plugin-transform-decorators-legacy": "^1.3.5", + "babel-plugin-transform-es2015-modules-commonjs": "^6.26.2", + "chai": "4.3.6", + "concurrently": "7.4.0", + "dotenv": "16.0.3", + "file-loader": "6.2.0", + "is-buffer": "2.0.5", + "jasmine": "4.4.0", + "jest": "^29.2.1", + "jest-runner-mocha": "^0.6.0", + "karma": "6.4.1", + "karma-chai": "0.1.0", + "karma-chrome-launcher": "3.1.1", + "karma-jasmine": "5.1.0", + "karma-mocha": "2.0.1", + "karma-spec-reporter": "0.0.34", + "karma-typescript": "5.5.3", + "karma-typescript-angular2-transform": "^5.5.3", + "karma-typescript-es6-transform": "5.5.3", + "karma-webpack": "5.0.0", + "mime": "3.0.0", + "mocha": "10.0.0", + "ts-jest": "^29.0.3", + "ts-loader": "9.4.1", + "ts-mocha": "10.0.0", + "ts-node": "10.9.1", + "typescript": "4.8.4", + "uuid": "9.0.0", + "virgil-crypto": "4.2.2", + "virgil-pythia": "1.0.2", + "virgil-sdk": "6.1.2", + "webpack": "5.74.0" }, "workspaces": { "nohoist": [ @@ -56,5 +77,9 @@ "ts-node", "webpack" ] + }, + "devDependencies": { + "readable-stream": "4.2.0", + "rollup-plugin-typescript2": "0.34.1" } } diff --git a/packages/e3kit-tests/src/browser.test.ts b/packages/e3kit-tests/src/browser.test.ts index 6ede6b39..cec61a26 100644 --- a/packages/e3kit-tests/src/browser.test.ts +++ b/packages/e3kit-tests/src/browser.test.ts @@ -1,4 +1,2 @@ -import './common/EThree.test'; -import './common/Group.test'; -import './browser/EThreeBrowser.test'; -import './browser/EthreeDocSnippets.test'; +import './browser/EThreeBrowser.spec'; +import './browser/EthreeDocSnippets.spec'; diff --git a/packages/e3kit-tests/src/browser/EThreeBrowser.test.ts b/packages/e3kit-tests/src/browser/EThreeBrowser.spec.ts similarity index 99% rename from packages/e3kit-tests/src/browser/EThreeBrowser.test.ts rename to packages/e3kit-tests/src/browser/EThreeBrowser.spec.ts index 73294b99..d290a312 100644 --- a/packages/e3kit-tests/src/browser/EThreeBrowser.test.ts +++ b/packages/e3kit-tests/src/browser/EThreeBrowser.spec.ts @@ -1,5 +1,5 @@ import { expect } from 'chai'; -import uuid from 'uuid/v4'; +import { v4 as uuid } from 'uuid'; import { VIRGIL_STREAM_SIGNING_STATE, @@ -51,7 +51,7 @@ describe('EThreeBrowser', () => { const readFile = (file: Blob) => { const reader = new FileReader(); - const promise = new Promise(r => + const promise = new Promise((r: any) => reader.addEventListener('loadend', () => r(reader.result!)), ); reader.readAsText(file); @@ -344,7 +344,7 @@ describe('EThreeBrowser', () => { const encryptedFile = await sdk1.authEncryptFile(originFile, receiverPublicKey); try { await sdk2.authDecryptFile(encryptedFile); - } catch (err) { + } catch (err: any) { expect(err).to.be.instanceOf(VirgilCryptoError); expect(err.status).to.be.equal(VirgilCryptoErrorStatus.SIGNER_NOT_FOUND); return; @@ -486,7 +486,7 @@ describe('EThreeBrowser', () => { const { encryptedSharedFile, fileKey } = await sdk1.encryptSharedFile(originFile); try { await sdk2.decryptSharedFile(encryptedSharedFile, fileKey, wrongPublicKey); - } catch (err) { + } catch (err: any) { expect(err).to.be.instanceOf(VirgilCryptoError); expect(err.status).to.be.equal(VirgilCryptoErrorStatus.SIGNER_NOT_FOUND); return; diff --git a/packages/e3kit-tests/src/browser/EthreeDocSnippets.test.ts b/packages/e3kit-tests/src/browser/EthreeDocSnippets.spec.ts similarity index 99% rename from packages/e3kit-tests/src/browser/EthreeDocSnippets.test.ts rename to packages/e3kit-tests/src/browser/EthreeDocSnippets.spec.ts index 3d6d1732..bc3649c1 100644 --- a/packages/e3kit-tests/src/browser/EthreeDocSnippets.test.ts +++ b/packages/e3kit-tests/src/browser/EthreeDocSnippets.spec.ts @@ -1,5 +1,5 @@ import { expect } from 'chai'; -import uuid from 'uuid/v4'; +import { v4 as uuid } from 'uuid'; import { EThree } from '@virgilsecurity/e3kit-browser'; import { initPythia } from '@virgilsecurity/pythia-crypto'; diff --git a/packages/e3kit-tests/src/common/EThree.test.ts b/packages/e3kit-tests/src/common/EThree.spec.ts similarity index 99% rename from packages/e3kit-tests/src/common/EThree.test.ts rename to packages/e3kit-tests/src/common/EThree.spec.ts index 45fb4c28..86953b0c 100644 --- a/packages/e3kit-tests/src/common/EThree.test.ts +++ b/packages/e3kit-tests/src/common/EThree.spec.ts @@ -1,6 +1,6 @@ import { expect } from 'chai'; import isBuffer from 'is-buffer'; -import uuid from 'uuid/v4'; +import { v4 as uuid } from 'uuid'; import { IdentityAlreadyExistsError, @@ -316,7 +316,7 @@ describe('EThree', () => { const identity2 = uuid(); try { await sdk.lookupPublicKeys([identity1, identity2]); - } catch (e) { + } catch (e: any) { expect(e).to.be.instanceOf(LookupError); expect(e.lookupResult[identity1]).to.be.instanceOf(LookupNotFoundError); expect(e.lookupResult[identity2]).to.be.instanceOf(LookupNotFoundError); @@ -343,7 +343,7 @@ describe('EThree', () => { const fetchToken = createFetchToken(identity); const sdk = await initializeEThree(fetchToken); try { - await sdk.lookupPublicKeys([identity, identity, 'random']); + await sdk.findUsers([identity, identity, 'random']); } catch (e) { expect(e).to.be.instanceOf(Error); return; @@ -797,7 +797,7 @@ describe('EThree', () => { const recipient = virgilCrypto.generateKeys(); const sdk = await initializeEThree(fetchToken); await sdk.register(); - const publicKey = (await sdk.lookupPublicKeys([identity]))[0]; + const publicKey = (await sdk.findUsers([identity]))[0]; const encryptedMessage = await sdk.encrypt(buf, recipient.publicKey); expect(isBuffer(encryptedMessage)).to.be.true; const resp = await sdk.decrypt(encryptedMessage, publicKey); diff --git a/packages/e3kit-tests/src/common/Group.test.ts b/packages/e3kit-tests/src/common/Group.spec.ts similarity index 99% rename from packages/e3kit-tests/src/common/Group.test.ts rename to packages/e3kit-tests/src/common/Group.spec.ts index b02a538c..4a570da4 100644 --- a/packages/e3kit-tests/src/common/Group.test.ts +++ b/packages/e3kit-tests/src/common/Group.spec.ts @@ -1,5 +1,5 @@ import { expect } from 'chai'; -import uuid from 'uuid/v4'; +import { v4 as uuid } from 'uuid'; import { EThree, GroupError, GroupErrorCode } from '@virgilsecurity/e3kit-node'; import { initPythia } from '@virgilsecurity/pythia-crypto'; diff --git a/packages/e3kit-tests/src/common/utils.ts b/packages/e3kit-tests/src/common/utils.ts index 16a02175..b76a462f 100644 --- a/packages/e3kit-tests/src/common/utils.ts +++ b/packages/e3kit-tests/src/common/utils.ts @@ -1,5 +1,5 @@ export const sleep = (ms: number) => - new Promise(resolve => { + new Promise((resolve) => { setTimeout(resolve, ms); }); diff --git a/packages/e3kit-tests/src/node.test.ts b/packages/e3kit-tests/src/node.test.ts index 17a7c909..8994175b 100644 --- a/packages/e3kit-tests/src/node.test.ts +++ b/packages/e3kit-tests/src/node.test.ts @@ -1,2 +1,2 @@ -import './common/EThree.test'; -import './common/Group.test'; +import './common/EThree.spec'; +import './common/Group.spec'; diff --git a/packages/e3kit-tests/tsconfig.json b/packages/e3kit-tests/tsconfig.json index 4ce94732..962a8780 100644 --- a/packages/e3kit-tests/tsconfig.json +++ b/packages/e3kit-tests/tsconfig.json @@ -1,11 +1,30 @@ { "compilerOptions": { - "target": "ES2015", - "declaration": true, - "declarationDir": "./dist/types", + "outDir": "./dist", + "forceConsistentCasingInFileNames": true, "strict": true, - "esModuleInterop": true, + "noImplicitReturns": false, + "strictPropertyInitialization": false, + "noFallthroughCasesInSwitch": true, + "sourceMap": true, + "declaration": true, + "downlevelIteration": true, + "experimentalDecorators": true, "moduleResolution": "node", - "resolveJsonModule": true - } + "importHelpers": true, + "isolatedModules": true, + "esModuleInterop": true, + "resolveJsonModule": true, + "allowJs": false, + "target": "es2020", + "module": "es2015", + "types" : [ + "mocha", + "expect.js" + ], + "lib": [ + "es2018", + "dom" + ] + }, }