From 51540e886738cdf89f3305fcb353a43b4a1e6693 Mon Sep 17 00:00:00 2001 From: Vladimir Y Date: Mon, 16 Jul 2018 05:52:26 +0300 Subject: [PATCH] update "fs-json-store" * decrease chances of getting settings file corrupted by enabling atomic file write --- package.json | 6 +- src/@types/memdown/index.d.ts | 1 + .../api/endpoints-builders/general.ts | 4 +- src/electron-main/api/index.spec.ts | 2 +- src/electron-main/constants.ts | 42 +++--- src/electron-main/model.ts | 5 +- src/electron-main/util.ts | 19 +-- .../webview/tutanota/lib/rest/model/common.ts | 2 + .../webview/tutanota/lib/rest/model/entity.ts | 6 +- src/shared/model/electron.ts | 4 +- src/webpack/lib/index.ts | 4 +- tsconfig.json | 1 + yarn.lock | 133 ++++++++++++------ 13 files changed, 144 insertions(+), 85 deletions(-) create mode 100644 src/@types/memdown/index.d.ts diff --git a/package.json b/package.json index abc9ba6c5..c754fc0f2 100644 --- a/package.json +++ b/package.json @@ -79,13 +79,14 @@ "electron-rpc-api": "0.2.1", "electron-unhandled": "1.1.0", "electron-updater": "2.23.3", - "fs-json-store": "2.0.0", + "fs-json-store": "2.0.2", "fs-json-store-encryption-adapter": "0.0.3", "jimp": "0.2.28", "keepasshttp-client": "2.2.6", "keytar": "4.2.1", "rolling-rate-limiter": "0.1.11", "rxjs": "6.2.2", + "tslib": "1.9.3", "valid-url": "1.0.9" }, "devDependencies": { @@ -145,7 +146,7 @@ "cssnano": "4.0.2", "devtron": "1.4.0", "electron": "2.0.5", - "electron-builder": "20.20.4", + "electron-builder": "20.21.2", "exports-loader": "0.7.0", "file-loader": "1.1.11", "font-awesome": "4.7.0", @@ -153,7 +154,6 @@ "gulp": "3.9.1", "html-loader": "0.5.5", "html-webpack-plugin": "4.0.0-alpha", - "hydux-mutator": "0.1.11", "immer": "1.3.1", "jasmine": "3.1.0", "karma": "2.0.4", diff --git a/src/@types/memdown/index.d.ts b/src/@types/memdown/index.d.ts new file mode 100644 index 000000000..da6ddb928 --- /dev/null +++ b/src/@types/memdown/index.d.ts @@ -0,0 +1 @@ +declare module "memdown"; diff --git a/src/electron-main/api/endpoints-builders/general.ts b/src/electron-main/api/endpoints-builders/general.ts index 3376a1f4f..aaae0989f 100644 --- a/src/electron-main/api/endpoints-builders/general.ts +++ b/src/electron-main/api/endpoints-builders/general.ts @@ -17,7 +17,7 @@ export async function buildGeneralEndpoints( openAboutWindow: () => { aboutWindow({ icon_path: ctx.locations.icon, - package_json_dir: path.join(ctx.locations.app, ".."), + package_json_dir: path.join(ctx.locations.appDir, ".."), }); return EMPTY; }, @@ -33,7 +33,7 @@ export async function buildGeneralEndpoints( })()), openSettingsFolder: () => { - shell.openItem(ctx.locations.userData); + shell.openItem(ctx.locations.userDataDir); return EMPTY; }, diff --git a/src/electron-main/api/index.spec.ts b/src/electron-main/api/index.spec.ts index 378c02b4c..997726b1b 100644 --- a/src/electron-main/api/index.spec.ts +++ b/src/electron-main/api/index.spec.ts @@ -221,7 +221,7 @@ const tests: Record) => Imple openSettingsFolder: async (t) => { const openItemSpy: sinon.SinonSpy = t.context.mocks.electron.shell.openItem; await t.context.endpoints.openSettingsFolder().toPromise(); - t.true(openItemSpy.alwaysCalledWith(t.context.ctx.locations.userData)); + t.true(openItemSpy.alwaysCalledWith(t.context.ctx.locations.userDataDir)); }, patchBaseSettings: async (t) => { diff --git a/src/electron-main/constants.ts b/src/electron-main/constants.ts index 9c0d0d71f..70745ee00 100644 --- a/src/electron-main/constants.ts +++ b/src/electron-main/constants.ts @@ -2,25 +2,27 @@ import {Options as EncryptionAdapterOptions} from "fs-json-store-encryption-adap import {APP_NAME} from "src/shared/constants"; -const encryptionPreset: EncryptionAdapterOptions = { - keyDerivation: {type: "sodium.crypto_pwhash", preset: "mode:interactive|algorithm:default"}, - encryption: {type: "sodium.crypto_secretbox_easy", preset: "algorithm:default"}, -}; - -export const INITIAL_STORES = Object.freeze({ - config: { - encryptionPreset, - startMinimized: true, - compactLayout: false, - closeToTray: true, - unreadNotifications: true, - checkForUpdatesAndNotify: true, - window: { - bounds: {width: 1024, height: 768}, - }, - }, - settings: {accounts: []}, -}); - export const KEYTAR_SERVICE_NAME = APP_NAME; export const KEYTAR_MASTER_PASSWORD_ACCOUNT = "master-password"; + +export const INITIAL_STORES = (() => { + const encryptionPreset: EncryptionAdapterOptions = { + keyDerivation: {type: "sodium.crypto_pwhash", preset: "mode:interactive|algorithm:default"}, + encryption: {type: "sodium.crypto_secretbox_easy", preset: "algorithm:default"}, + }; + + return Object.freeze({ + config: { + encryptionPreset, + startMinimized: true, + compactLayout: false, + closeToTray: true, + unreadNotifications: true, + checkForUpdatesAndNotify: true, + window: { + bounds: {width: 1024, height: 768}, + }, + }, + settings: {accounts: []}, + }); +})(); diff --git a/src/electron-main/model.ts b/src/electron-main/model.ts index 657e7c5da..9039f63bd 100644 --- a/src/electron-main/model.ts +++ b/src/electron-main/model.ts @@ -17,13 +17,14 @@ export interface ContextInitOptions { } export interface Context { + readonly storeFs: StoreModel.StoreFs; readonly runtimeEnvironment: RuntimeEnvironment; readonly locations: ElectronContextLocations; - initialStores: { + readonly initialStores: { config: Config; settings: Settings; }; - configStore: StoreModel.Store; + readonly configStore: StoreModel.Store; settingsStore: StoreModel.Store; uiContext?: UIContext; } diff --git a/src/electron-main/util.ts b/src/electron-main/util.ts index 0d1bc3c31..258f7337d 100644 --- a/src/electron-main/util.ts +++ b/src/electron-main/util.ts @@ -5,7 +5,7 @@ import path from "path"; import url from "url"; import {app} from "electron"; import {EncryptionAdapter} from "fs-json-store-encryption-adapter"; -import {Model as StoreModel, Store} from "fs-json-store"; +import {Fs as StoreFs, Model as StoreModel, Store} from "fs-json-store"; import {BuildEnvironment} from "src/shared/model/common"; import {Config, configEncryptionPresetValidator, Settings, settingsAccountLoginUniquenessValidator} from "src/shared/model/options"; @@ -18,26 +18,27 @@ export async function initContext(options: ContextInitOptions = {}): Promise({ - ...fsOption, + fs: storeFs, optimisticLocking: true, - file: path.join(locations.userData, "config.json"), + file: path.join(locations.userDataDir, "config.json"), validators: [configEncryptionPresetValidator], }); - logger.transports.file.file = path.join(locations.userData, "./log.log"); + logger.transports.file.file = path.join(locations.userDataDir, "./log.log"); logger.transports.file.level = "info"; return { + storeFs, runtimeEnvironment, locations, initialStores, configStore, settingsStore: new Store({ - ...fsOption, + fs: storeFs, optimisticLocking: true, - file: path.join(locations.userData, "settings.bin"), + file: path.join(locations.userDataDir, "settings.bin"), validators: [settingsAccountLoginUniquenessValidator], }), }; @@ -62,8 +63,8 @@ function initLocations(runtimeEnvironment: RuntimeEnvironment, paths?: ContextIn const formatFileUrl = (pathname: string) => url.format({pathname, protocol: "file:", slashes: true}); return { - app: appRelativePath(), - userData: userDataDir, + appDir, + userDataDir, icon: appRelativePath(largeIcon), trayIcon: appRelativePath(os.platform() === "darwin" ? "./assets/icons/mac/icon.png" : largeIcon), trayIconUnreadOverlay: appRelativePath("./assets/icons/tray-icon-unread-overlay.png"), diff --git a/src/electron-preload/webview/tutanota/lib/rest/model/common.ts b/src/electron-preload/webview/tutanota/lib/rest/model/common.ts index 2de3d0095..e31653f09 100644 --- a/src/electron-preload/webview/tutanota/lib/rest/model/common.ts +++ b/src/electron-preload/webview/tutanota/lib/rest/model/common.ts @@ -33,6 +33,8 @@ export interface BaseEntity { _id: Id | IdTuple; } +export type NumberString = string; + export type Id = string; export type IdTuple = [Id, Id]; diff --git a/src/electron-preload/webview/tutanota/lib/rest/model/entity.ts b/src/electron-preload/webview/tutanota/lib/rest/model/entity.ts index 995d34299..088869b02 100644 --- a/src/electron-preload/webview/tutanota/lib/rest/model/entity.ts +++ b/src/electron-preload/webview/tutanota/lib/rest/model/entity.ts @@ -1,4 +1,4 @@ -import {BaseEntity, GroupType, Id, IdTuple, MailFolderType} from "./common"; +import {BaseEntity, GroupType, Id, IdTuple, MailFolderType, NumberString} from "./common"; export interface User extends BaseEntity { memberships: GroupMembership[]; @@ -54,7 +54,9 @@ export interface MailAddress extends BaseEntity { } export interface File extends BaseEntity { - + mimeType?: string; + name: string; + size: NumberString; } export interface MailBody extends BaseEntity { diff --git a/src/shared/model/electron.ts b/src/shared/model/electron.ts index fa8a367c7..29a633dde 100644 --- a/src/shared/model/electron.ts +++ b/src/shared/model/electron.ts @@ -15,13 +15,13 @@ export interface ElectronWindow { } export interface ElectronContextLocations { - readonly app: string; + readonly appDir: string; readonly browserWindowPage: string; readonly icon: string; readonly trayIcon: string; readonly trayIconUnreadOverlay: string; readonly trayIconLoggedOutOverlay: string; - readonly userData: string; + readonly userDataDir: string; readonly preload: { browserWindow: string; browserWindowE2E: string; diff --git a/src/webpack/lib/index.ts b/src/webpack/lib/index.ts index 202c54cee..681b884b5 100644 --- a/src/webpack/lib/index.ts +++ b/src/webpack/lib/index.ts @@ -58,10 +58,10 @@ const buildBaseConfig: BuildConfig = (config, options = {}) => { uglifyOptions: { compress: false, mangle: false, - ecma: 6, + ecma: 7, output: { comments: true, - beautify: true, + beautify: false, }, }, }), diff --git a/tsconfig.json b/tsconfig.json index d8c6179e8..209216666 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -10,6 +10,7 @@ "noImplicitReturns": true, "noFallthroughCasesInSwitch": true, "noEmitOnError": true, + "importHelpers": true, "declaration": false, "sourceMap": true, "lib": [ diff --git a/yarn.lock b/yarn.lock index b40c32824..90afc871e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -404,10 +404,6 @@ dependencies: arrify "^1.0.1" -"@funkia/list@^0.1.0": - version "0.1.0" - resolved "https://registry.yarnpkg.com/@funkia/list/-/list-0.1.0.tgz#1c7600d747260824dfc58d59a298ced296242052" - "@ng-select/ng-select@2.3.3": version "2.3.3" resolved "https://registry.yarnpkg.com/@ng-select/ng-select/-/ng-select-2.3.3.tgz#c823d2c8573a068125115c853c4419ce660f649f" @@ -1016,6 +1012,10 @@ app-builder-bin@1.11.1: version "1.11.1" resolved "https://registry.yarnpkg.com/app-builder-bin/-/app-builder-bin-1.11.1.tgz#33741167f2873cf76805c9557b62caac8ede017b" +app-builder-bin@1.11.2: + version "1.11.2" + resolved "https://registry.yarnpkg.com/app-builder-bin/-/app-builder-bin-1.11.2.tgz#3cfb28cb8731253072e402513d82dcda97bb4d24" + app-root-path@^2.0.1: version "2.1.0" resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-2.1.0.tgz#98bf6599327ecea199309866e8140368fd2e646a" @@ -1740,7 +1740,7 @@ builder-util-runtime@4.4.0, builder-util-runtime@^4.4.0, builder-util-runtime@~4 fs-extra-p "^4.6.1" sax "^1.2.4" -builder-util@5.16.0, builder-util@^5.14.0, builder-util@~5.16.0: +builder-util@5.16.0: version "5.16.0" resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-5.16.0.tgz#8b9aabe15a1a5c4ffa8ebc511049248918f717df" dependencies: @@ -1759,6 +1759,25 @@ builder-util@5.16.0, builder-util@^5.14.0, builder-util@~5.16.0: stat-mode "^0.2.2" temp-file "^3.1.3" +builder-util@5.16.1, builder-util@^5.14.0, builder-util@~5.16.0: + version "5.16.1" + resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-5.16.1.tgz#3ac21c90ef040ff02fc8d0ee4fd5ec46929c767b" + dependencies: + "7zip-bin" "~4.0.2" + app-builder-bin "1.11.2" + bluebird-lst "^1.0.5" + builder-util-runtime "^4.4.0" + chalk "^2.4.1" + debug "^3.1.0" + fs-extra-p "^4.6.1" + is-ci "^1.1.0" + js-yaml "^3.12.0" + lazy-val "^1.0.3" + semver "^5.5.0" + source-map-support "^0.5.6" + stat-mode "^0.2.2" + temp-file "^3.1.3" + buildmail@4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/buildmail/-/buildmail-4.0.1.tgz#877f7738b78729871c9a105e3b837d2be11a7a72" @@ -2295,22 +2314,22 @@ compress-commons@^1.2.0: normalize-path "^2.0.0" readable-stream "^2.0.0" -compressible@~2.0.13: +compressible@~2.0.14: version "2.0.14" resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.14.tgz#326c5f507fbb055f54116782b969a81b67a29da7" dependencies: mime-db ">= 1.34.0 < 2" compression@^1.5.2: - version "1.7.2" - resolved "http://registry.npmjs.org/compression/-/compression-1.7.2.tgz#aaffbcd6aaf854b44ebb280353d5ad1651f59a69" + version "1.7.3" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.3.tgz#27e0e176aaf260f7f2c2813c3e440adb9f1993db" dependencies: - accepts "~1.3.4" + accepts "~1.3.5" bytes "3.0.0" - compressible "~2.0.13" + compressible "~2.0.14" debug "2.6.9" on-headers "~1.0.1" - safe-buffer "5.1.1" + safe-buffer "5.1.2" vary "~1.1.2" concat-map@0.0.1: @@ -2476,8 +2495,8 @@ crc32-stream@^2.0.0: readable-stream "^2.0.0" crc@^3.4.4: - version "3.6.0" - resolved "https://registry.yarnpkg.com/crc/-/crc-3.6.0.tgz#50cf87e2601f9bf5e482a1575f006a1138a3ad37" + version "3.7.0" + resolved "https://registry.yarnpkg.com/crc/-/crc-3.7.0.tgz#58b7083e32ba4b276e1f4cbce1a78b39a6ab63f9" dependencies: buffer "^5.1.0" @@ -3179,7 +3198,38 @@ ejs@~2.5.6: version "2.5.9" resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.5.9.tgz#7ba254582a560d267437109a68354112475b0ce5" -electron-builder-lib@20.20.4, electron-builder-lib@~20.20.4: +electron-builder-lib@20.21.2: + version "20.21.2" + resolved "https://registry.yarnpkg.com/electron-builder-lib/-/electron-builder-lib-20.21.2.tgz#761fb2147a62ba9e40a837f01efa73c7a3ff6fd3" + dependencies: + "7zip-bin" "~4.0.2" + app-builder-bin "1.11.2" + async-exit-hook "^2.0.1" + bluebird-lst "^1.0.5" + builder-util "5.16.1" + builder-util-runtime "4.4.0" + chromium-pickle-js "^0.2.0" + debug "^3.1.0" + ejs "^2.6.1" + electron-osx-sign "0.4.10" + electron-publish "20.22.1" + env-paths "^1.0.0" + fs-extra-p "^4.6.1" + hosted-git-info "^2.7.1" + is-ci "^1.1.0" + isbinaryfile "^3.0.2" + js-yaml "^3.12.0" + lazy-val "^1.0.3" + minimatch "^3.0.4" + normalize-package-data "^2.4.0" + plist "^3.0.1" + read-config-file "3.1.0" + sanitize-filename "^1.6.1" + semver "^5.5.0" + sumchecker "^2.0.2" + temp-file "^3.1.3" + +electron-builder-lib@~20.20.4: version "20.20.4" resolved "https://registry.yarnpkg.com/electron-builder-lib/-/electron-builder-lib-20.20.4.tgz#fd129ae85c5514f16f4f392218141ebe3dc8411d" dependencies: @@ -3210,16 +3260,16 @@ electron-builder-lib@20.20.4, electron-builder-lib@~20.20.4: sumchecker "^2.0.2" temp-file "^3.1.3" -electron-builder@20.20.4: - version "20.20.4" - resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-20.20.4.tgz#09d879c6551df801444a153dc7b159a304e1d55d" +electron-builder@20.21.2: + version "20.21.2" + resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-20.21.2.tgz#56889c622bae3c70d3aa6fb2118c1bef22113043" dependencies: bluebird-lst "^1.0.5" - builder-util "5.16.0" + builder-util "5.16.1" builder-util-runtime "4.4.0" chalk "^2.4.1" dmg-builder "4.14.0" - electron-builder-lib "20.20.4" + electron-builder-lib "20.21.2" fs-extra-p "^4.6.1" is-ci "^1.1.0" lazy-val "^1.0.3" @@ -3294,6 +3344,18 @@ electron-publish@20.22.0: lazy-val "^1.0.3" mime "^2.3.1" +electron-publish@20.22.1: + version "20.22.1" + resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-20.22.1.tgz#c4f1c90376829bcbecef9e286166f360ec1b5bb1" + dependencies: + bluebird-lst "^1.0.5" + builder-util "~5.16.0" + builder-util-runtime "^4.4.0" + chalk "^2.4.1" + fs-extra-p "^4.6.1" + lazy-val "^1.0.3" + mime "^2.3.1" + electron-rpc-api@0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/electron-rpc-api/-/electron-rpc-api-0.2.1.tgz#c6d8abf2ada16a63c472b8bfa7e171feaef347bd" @@ -4294,15 +4356,15 @@ fs-json-store-encryption-adapter@0.0.3: tslib "^1.9.3" util.promisify "^1.0.0" -fs-json-store@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fs-json-store/-/fs-json-store-2.0.0.tgz#a702e078d4c1fe159eddaf21474ea93e7a30a73e" +fs-json-store@2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/fs-json-store/-/fs-json-store-2.0.2.tgz#86ab89add39f88d7aff60b2470bb8372b0de2184" dependencies: combine-errors "^3.0.3" fs-no-eperm-anymore "^2.0.2" imurmurhash "^0.1.4" kind-of "^6.0.2" - memfs "^2.9.0" + memfs "^2.9.4" proper-lockfile "^3.0.2" tslib "^1.9.3" @@ -5042,15 +5104,6 @@ humanize-plus@^1.8.1: version "1.8.2" resolved "https://registry.yarnpkg.com/humanize-plus/-/humanize-plus-1.8.2.tgz#a65b34459ad6367adbb3707a82a3c9f916167030" -hydux-mutator@0.1.11: - version "0.1.11" - resolved "https://registry.yarnpkg.com/hydux-mutator/-/hydux-mutator-0.1.11.tgz#4784f43f8dd994848c8b3919d13b68dca83c280d" - dependencies: - "@funkia/list" "^0.1.0" - parsimmon "^1.6.4" - quick-lru "^1.1.0" - tslib "^1.8.1" - iconv-lite@0.4.15: version "0.4.15" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.15.tgz#fe265a218ac6a57cfe854927e9d04c19825eddeb" @@ -6559,7 +6612,7 @@ mem@^1.1.0: dependencies: mimic-fn "^1.0.0" -memfs@^2.9.0: +memfs@^2.9.4: version "2.9.4" resolved "https://registry.yarnpkg.com/memfs/-/memfs-2.9.4.tgz#2ca9d8088d61ab27376174f0ae68ea7084ac7214" dependencies: @@ -6666,8 +6719,8 @@ miller-rabin@^4.0.0: brorand "^1.0.1" "mime-db@>= 1.34.0 < 2": - version "1.34.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.34.0.tgz#452d0ecff5c30346a6dc1e64b1eaee0d3719ff9a" + version "1.35.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.35.0.tgz#0569d657466491283709663ad379a99b90d9ab47" mime-db@~1.33.0: version "1.33.0" @@ -7665,10 +7718,6 @@ parseurl@~1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" -parsimmon@^1.6.4: - version "1.12.0" - resolved "https://registry.yarnpkg.com/parsimmon/-/parsimmon-1.12.0.tgz#886a442fb30b5fc3c8e7c4994050f5cdcfe0ea90" - pascalcase@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" @@ -8418,7 +8467,7 @@ querystringify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.0.0.tgz#fa3ed6e68eb15159457c89b37bc6472833195755" -quick-lru@^1.0.0, quick-lru@^1.1.0: +quick-lru@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8" @@ -9076,7 +9125,7 @@ safe-buffer@5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: +safe-buffer@5.1.2, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -10327,7 +10376,7 @@ tsickle@^0.29.0: source-map "^0.6.0" source-map-support "^0.5.0" -tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.2, tslib@^1.9.3: +tslib@1.9.3, tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.2, tslib@^1.9.3: version "1.9.3" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286"