Merge branch 'master' into actions

This commit is contained in:
Oliver Blanthorn 2020-06-07 21:00:46 +01:00
commit 1605106194
No known key found for this signature in database
GPG key ID: 2BB8C36BB504BFF3
18 changed files with 148 additions and 42 deletions

View file

@ -48,14 +48,12 @@ jobs:
- run: bash -c '"$(yarn bin)/web-ext" build --source-dir ./build --overwrite-dest' - run: bash -c '"$(yarn bin)/web-ext" build --source-dir ./build --overwrite-dest'
- run: mv web-ext-artifacts/*.zip web-ext-artifacts/tridactyl.xpi - run: mv web-ext-artifacts/*.zip web-ext-artifacts/tridactyl.xpi
# selenium is temperamental - give it lots of chances to succeed # selenium is temperamental - give it lots of chances to succeed
- run: bash -c 'PATH="$HOME/firefox:$PATH" "$(yarn bin)/jest" || - run: bash -c 'PATH="$HOME/firefox:$PATH" "$(yarn bin)/jest" e2e_tests ||
PATH="$HOME/firefox:$PATH" "$(yarn bin)/jest" || PATH="$HOME/firefox:$PATH" "$(yarn bin)/jest" e2e_tests ||
PATH="$HOME/firefox:$PATH" "$(yarn bin)/jest" || PATH="$HOME/firefox:$PATH" "$(yarn bin)/jest" e2e_tests ||
PATH="$HOME/firefox:$PATH" "$(yarn bin)/jest" || PATH="$HOME/firefox:$PATH" "$(yarn bin)/jest" e2e_tests ||
PATH="$HOME/firefox:$PATH" "$(yarn bin)/jest" || PATH="$HOME/firefox:$PATH" "$(yarn bin)/jest" e2e_tests'
PATH="$HOME/firefox:$PATH" "$(yarn bin)/jest" ||
PATH="$HOME/firefox:$PATH" "$(yarn bin)/jest" ||
PATH="$HOME/firefox:$PATH" "$(yarn bin)/jest"'
workflows: workflows:
version: 2 version: 2
build_test_lint: build_test_lint:

View file

@ -1,5 +1,39 @@
# Tridactyl changelog # Tridactyl changelog
## Release 1.19.1 / 29-05-2020
- New features
- All of our scrolling commands (e.g. j/k) now scroll the focused element ([#2417](https://github.com/tridactyl/tridactyl/issues/2417))
- The bind focus hint mode, `;;`, now hints more selectors to make it easier to select an element to scroll
- `:recontain` command to change the container of the current tab added
- See `:help recontain` before use as it has potentially surprising privacy implications
- Bug fixes
- The commandline history works again, but for real this time ([#2236](https://github.com/tridactyl/tridactyl/issues/2236))
- `g;` works again ([#2407](https://github.com/tridactyl/tridactyl/issues/2407))
- We no longer enter insert mode on readonly elements ([#2389](https://github.com/tridactyl/tridactyl/issues/2389))
- `mkt` now works even if you have used `setnull` or `unbind` ([#2415](https://github.com/tridactyl/tridactyl/issues/2415))
- We ensure nothing is written to local storage in private windows ([#2423](https://github.com/tridactyl/tridactyl/issues/2423))
- (very little was being written - namely the last ex string you executed and the tab ID of the last input you used; both of these would be overwritten regularly so the danger is low)
- this does mean that `repeat` will no longer function in private windows
- `winopen -private [url]` is no longer stored for `repeat` ([#2424](https://github.com/tridactyl/tridactyl/issues/2424))
- We now accurately attach hints to more elements ([#487](https://github.com/tridactyl/tridactyl/issues/487))
- Miscellaneous
- Our config updater no longer uses a while loop which could spin forever in certain circumstances ([#2349](https://github.com/tridactyl/tridactyl/issues/2349))
- Our E2E tests fail less often (by retrying a few times) ([#2387](https://github.com/tridactyl/tridactyl/issues/2387))
- There is now less duplication between lib/state and content/state_content ([#2422](https://github.com/tridactyl/tridactyl/issues/2422))
- Our scrolling code is now a little easier to read ([#2384](https://github.com/tridactyl/tridactyl/issues/2384))
Thanks to all of our contributors for this release: Oliver Blanthorn, dependabot-preview[bot], Matias Ammentorp Storm, MatiasStorm, Dranaxel, glacambre, Alexandre, Robert Günzler and Tanath.
Extra special thanks go to Alexandre, Dranaxel, Matias Ammentorp Storm, MatiasStorm and Tanath who all contributed for the first time.
Last, but not least - thank you to everyone who reported issues.
## Release 1.19.0 / 10-05-2020 ## Release 1.19.0 / 10-05-2020
- New features - New features

View file

@ -11,8 +11,8 @@ Replace Firefox's control mechanism with one modelled on VIM. This is a "Firefox
- Notice that this tab is rubbish and you want to close it? `d`. - Notice that this tab is rubbish and you want to close it? `d`.
- Regret that decision? `u` restores it. - Regret that decision? `u` restores it.
- Want to write something in Vim? `Ctrl-i` in a text box opens it in Vim, if you have `:native` working. - Want to write something in Vim? `Ctrl-i` in a text box opens it in Vim, if you have `:native` working.
- Temporarily disable all that magic because you can't stand it? `Shift-Insert`. - Temporarily disable all that magic because you can't stand it? `Shift-Insert` or `Ctrl-Alt-Escape`.
- But how do you use your browser now? `Shift-Insert` again and we're back on. - But how do you use your browser now? `Shift-Insert` or `Ctrl-Alt-Escape` again and we're back on.
The list could go on a bit here, but I guess you'll get the point. If you feel lost sometimes `:help` might help you a lot, and there's always `:tutor`. The list could go on a bit here, but I guess you'll get the point. If you feel lost sometimes `:help` might help you a lot, and there's always `:tutor`.

View file

@ -6,6 +6,10 @@ If changing one of these settings fixes your bug, please visit the corresponding
- `:set allowautofocus true` and then reload the page. This allows website to use the javascript `focus()` function. [#550](https://github.com/tridactyl/tridactyl/issues/550) - `:set allowautofocus true` and then reload the page. This allows website to use the javascript `focus()` function. [#550](https://github.com/tridactyl/tridactyl/issues/550)
- `:set modeindicator false` and then reload the page. This disables the mode indicator. [#821](https://github.com/tridactyl/tridactyl/issues/821) - `:set modeindicator false` and then reload the page. This disables the mode indicator. [#821](https://github.com/tridactyl/tridactyl/issues/821)
# Firefox settings that can break Tridactyl
If you have `privacy.resistFingerprinting` set to `true` in `about:config`, Tridactyl will have a lot of trouble understanding your keypresses. See [#760](https://github.com/tridactyl/tridactyl/issues/760#issuecomment-433679201) and [#1699](https://github.com/tridactyl/tridactyl/issues/1699). We strongly recommend setting it to `false`, as it is by default.
# Native Editor/Messenger issues # Native Editor/Messenger issues
If you're having trouble running your editor on OSX, you might be having \$PATH issues: [#684](https://github.com/tridactyl/tridactyl/issues/684). The solution is to specify the absolute path to your editor, like this: `:set editorcmd /usr/local/bin/vimr`. If you're having trouble running your editor on OSX, you might be having \$PATH issues: [#684](https://github.com/tridactyl/tridactyl/issues/684). The solution is to specify the absolute path to your editor, like this: `:set editorcmd /usr/local/bin/vimr`.

View file

@ -10,7 +10,7 @@
"css": "^2.2.4", "css": "^2.2.4",
"flyd": "^0.2.8", "flyd": "^0.2.8",
"fuse.js": "^6.0.0", "fuse.js": "^6.0.0",
"immer": "^6.0.8", "immer": "^6.0.9",
"mark.js": "^8.11.1", "mark.js": "^8.11.1",
"mithril": "^2.0.4", "mithril": "^2.0.4",
"ramda": "^0.27.0", "ramda": "^0.27.0",
@ -21,7 +21,7 @@
"devDependencies": { "devDependencies": {
"@types/jest": "^25.2.3", "@types/jest": "^25.2.3",
"@types/mithril": "^2.0.3", "@types/mithril": "^2.0.3",
"@types/node": "^14.0.5", "@types/node": "^14.0.6",
"@types/selenium-webdriver": "^4.0.9", "@types/selenium-webdriver": "^4.0.9",
"cleanslate": "^0.10.1", "cleanslate": "^0.10.1",
"copy-webpack-plugin": "^6.0.1", "copy-webpack-plugin": "^6.0.1",
@ -36,7 +36,7 @@
"source-map-loader": "^1.0.0", "source-map-loader": "^1.0.0",
"ts-jest": "^25.5.1", "ts-jest": "^25.5.1",
"ts-loader": "^7.0.5", "ts-loader": "^7.0.5",
"ts-node": "^8.10.1", "ts-node": "^8.10.2",
"tsconfig-paths-webpack-plugin": "^3.2.0", "tsconfig-paths-webpack-plugin": "^3.2.0",
"tslint": "^5.20.1", "tslint": "^5.20.1",
"tslint-etc": "^1.10.1", "tslint-etc": "^1.10.1",

45
src/excmds.test.ts Normal file
View file

@ -0,0 +1,45 @@
import { tabopen } from "@src/.excmds_background.generated"
import { openInNewTab, getContext } from "@src/lib/webext"
import { fuzzyMatch } from "@src/lib/containers"
jest.mock("@src/lib/webext", () => {
return {
__esModule: true,
openInNewTab: jest.fn(() => ({ then: fn => {} })),
getContext: jest.fn(),
activeTabContainerId: jest.fn(() => ({ then: fn => fn() })),
}
})
jest.mock("@src/lib/containers", () => {
return {
__esModule: true,
fuzzyMatch: jest.fn().mockReturnValue("firefox-container-111"),
}
})
// Ideally this mock should be provided by jest-webextension-mock,
// but it isn't: https://github.com/clarkbw/jest-webextension-mock/issues/89
const windows = {
getCurrent: jest.fn().mockReturnValue({ incognito: false }),
}
describe("excmds unit tests", () => {
beforeAll(() => {
Object.defineProperty(browser, "windows", { value: windows })
})
it('`tabopen("-c", "none")` opens tab with no container', async () => {
await tabopen("-c", "none")
expect(openInNewTab).toHaveBeenCalledWith(null, {})
})
it('`tabopen("-c", "somecnt")` opens tab with some container', async () => {
await tabopen("-c", "somecnt")
expect(openInNewTab).toHaveBeenCalledWith(null, {
cookieStoreId: "firefox-container-111",
})
})
})

View file

@ -2100,7 +2100,7 @@ export async function tabprev(increment = 1) {
/** Like [[open]], but in a new tab. If no address is given, it will open the newtab page, which can be set with `set newtab [url]` /** Like [[open]], but in a new tab. If no address is given, it will open the newtab page, which can be set with `set newtab [url]`
Use the `-c` flag followed by a container name to open a tab in said container. Tridactyl will try to fuzzy match a name if an exact match is not found. If any autocontainer directives are configured and -c is not set, Tridactyl will try to use the right container automatically using your configurations. Use the `-c` flag followed by a container name to open a tab in said container. Tridactyl will try to fuzzy match a name if an exact match is not found (opening the tab in no container can be enforced with "firefox-default" or "none"). If any autocontainer directives are configured and -c is not set, Tridactyl will try to use the right container automatically using your configurations.
Use the `-b` flag to open the tab in the background. Use the `-b` flag to open the tab in the background.
These two can be combined in any order, but need to be placed as the first arguments. These two can be combined in any order, but need to be placed as the first arguments.
@ -2133,8 +2133,13 @@ export async function tabopen(...addressarr: string[]) {
argParse(args) argParse(args)
} else if (args[0] === "-c") { } else if (args[0] === "-c") {
// Ignore the -c flag if incognito as containers are disabled. // Ignore the -c flag if incognito as containers are disabled.
if (!win.incognito) container = await Container.fuzzyMatch(args[1]) if (!win.incognito) {
else logger.error("[tabopen] can't open a container in a private browsing window.") if (args[1] === "firefox-default" || args[1].toLowerCase() === "none") {
container = "firefox-default"
} else {
container = await Container.fuzzyMatch(args[1])
}
} else logger.error("[tabopen] can't open a container in a private browsing window.")
args.shift() args.shift()
args.shift() args.shift()
@ -2163,7 +2168,9 @@ export async function tabopen(...addressarr: string[]) {
const args = { active } as any const args = { active } as any
// Ensure -c has priority. // Ensure -c has priority.
if (container) { if (container) {
args.cookieStoreId = container if (container !== "firefox-default") {
args.cookieStoreId = container
}
} else if (containerId && config.get("tabopencontaineraware") === "true") { } else if (containerId && config.get("tabopencontaineraware") === "true") {
args.cookieStoreId = containerId args.cookieStoreId = containerId
} }
@ -3430,7 +3437,7 @@ export function autocmd(event: string, url: string, ...excmd: string[]) {
* This function accepts a `-u` flag to treat the pattern as a URL rather than a domain. * This function accepts a `-u` flag to treat the pattern as a URL rather than a domain.
* For example: `autocontain -u ^https?://[^/]*youtube\.com/ google` is equivalent to `autocontain youtube\.com google` * For example: `autocontain -u ^https?://[^/]*youtube\.com/ google` is equivalent to `autocontain youtube\.com google`
* *
* For declaring containers that do not yet exist, consider using `auconscreatecontainer true` in your tridactylrc. * For declaring containers that do not yet exist, consider using `auconcreatecontainer true` in your tridactylrc.
* This allows tridactyl to automatically create containers from your autocontain directives. Note that they will be random icons and colors. * This allows tridactyl to automatically create containers from your autocontain directives. Note that they will be random icons and colors.
* *
* __NB: This is an experimental feature, if you encounter issues please create an issue on GitHub.__ * __NB: This is an experimental feature, if you encounter issues please create an issue on GitHub.__

View file

@ -3,7 +3,7 @@
Hook into webRequests and make sure that your (least) favorite domain is contained Hook into webRequests and make sure that your (least) favorite domain is contained
and doesn't touch your default browsing environment. and doesn't touch your default browsing environment.
For declaring containers that do not yet exist, consider using `auconscreatecontainer true` in your tridactylrc. For declaring containers that do not yet exist, consider using `auconcreatecontainer true` in your tridactylrc.
This allows tridactyl to automatically create containers from your autocontain directives. Note that they will be random icons and colors. This allows tridactyl to automatically create containers from your autocontain directives. Note that they will be random icons and colors.
** NB: This is an experimental feature, if you encounter issues please create an issue on github. ** ** NB: This is an experimental feature, if you encounter issues please create an issue on github. **

View file

@ -413,7 +413,7 @@ export class default_config {
/** /**
* Commands that will be run when Tridactyl first runs each time you start your browser. * Commands that will be run when Tridactyl first runs each time you start your browser.
* *
* Each key corresponds to a URL fragment which, if contained within the page URL, will run the corresponding command. * Each key corresponds to a javascript regex that matches the hostname of the computer Firefox is running on. Note that fetching the hostname could be a little slow, if you want to execute something unconditionally, use ".*" as Tridactyl special-cases this pattern to avoid hostname lookups.
*/ */
TriStart: { TriStart: {
".*": "source_quiet", ".*": "source_quiet",

View file

@ -350,19 +350,29 @@ export function mapstrMapToKeyMap(mapstrMap: Map<string, MapTarget>): KeyMap {
return newKeyMap return newKeyMap
} }
export function keyMap(conf, keys): KeyMap { let KEYMAP_CACHE = {}
let maps: any = config.get(conf)
if (maps === undefined) throw new Error("No binds defined for this mode. Reload page with <C-r> and add binds, e.g. :bind --mode=[mode] <Esc> mode normal")
export function translateKeysInPlace(keys, conf): void {
// If so configured, translate keys using the key translation map // If so configured, translate keys using the key translation map
if (config.get("keytranslatemodes")[conf] === "true") { if (config.get("keytranslatemodes")[conf] === "true") {
const translationmap = config.get("keytranslatemap") const translationmap = config.get("keytranslatemap")
translateKeysUsingKeyTranslateMap(keys, translationmap) translateKeysUsingKeyTranslateMap(keys, translationmap)
} }
}
/**
* Return a "*maps" config converted into sequences of minimalkeys (e.g. "nmaps")
*/
export function keyMap(conf): KeyMap {
if (KEYMAP_CACHE[conf]) return KEYMAP_CACHE[conf]
let maps: any = config.get(conf)
if (maps === undefined) throw new Error("No binds defined for this mode. Reload page with <C-r> and add binds, e.g. :bind --mode=[mode] <Esc> mode normal")
// Convert to KeyMap // Convert to KeyMap
maps = new Map(Object.entries(maps)) maps = new Map(Object.entries(maps))
return mapstrMapToKeyMap(maps) KEYMAP_CACHE[conf] = mapstrMapToKeyMap(maps)
return KEYMAP_CACHE[conf]
} }
// }}} // }}}
@ -435,3 +445,9 @@ export function translateKeysUsingKeyTranslateMap(
} }
// }}} // }}}
browser.storage.onChanged.addListener((changes, areaname) => {
if ("userconfig" in changes) {
KEYMAP_CACHE = {}
}
})

View file

@ -1,7 +1,7 @@
{ {
"manifest_version": 2, "manifest_version": 2,
"name": "Tridactyl", "name": "Tridactyl",
"version": "1.19.0", "version": "1.19.1",
"icons": { "icons": {
"64": "static/logo/Tridactyl_64px.png", "64": "static/logo/Tridactyl_64px.png",
"100": "static/logo/Tridactyl_100px.png", "100": "static/logo/Tridactyl_100px.png",
@ -65,7 +65,7 @@
"applications": { "applications": {
"gecko": { "gecko": {
"id": "tridactyl.vim.betas@cmcaine.co.uk", "id": "tridactyl.vim.betas@cmcaine.co.uk",
"strict_min_version": "75.0" "strict_min_version": "68.0"
} }
}, },
"options_ui": { "options_ui": {

View file

@ -3,6 +3,7 @@
import * as keyseq from "@src/lib/keyseq" import * as keyseq from "@src/lib/keyseq"
export function parser(conf, keys): keyseq.ParserResponse { export function parser(conf, keys): keyseq.ParserResponse {
const maps = keyseq.keyMap(conf, keys) const maps = keyseq.keyMap(conf)
keyseq.translateKeysInPlace(keys, conf)
return keyseq.parse(keys, maps) return keyseq.parse(keys, maps)
} }

View file

@ -29,7 +29,8 @@ export function parser(keys: KeyboardEvent[]) {
keys = keyseq.stripOnlyModifiers(keys) keys = keyseq.stripOnlyModifiers(keys)
if (keys.length === 0) return { keys: [], isMatch: false } if (keys.length === 0) return { keys: [], isMatch: false }
const conf = mode2maps.get(modeState.mode) || modeState.mode + "maps" const conf = mode2maps.get(modeState.mode) || modeState.mode + "maps"
const maps: any = keyseq.keyMap(conf, keys) const maps: any = keyseq.keyMap(conf)
keyseq.translateKeysInPlace(keys, conf)
const key = keys[0].key const key = keys[0].key
if (key === "Escape") { if (key === "Escape") {

View file

@ -26,7 +26,7 @@ The idea behind Tridactyl is to allow you to navigate the web more efficiently w
- You can enter this mode with `:` and exit it with `Escape` or `Enter`. - You can enter this mode with `:` and exit it with `Escape` or `Enter`.
- Ignore mode - Ignore mode
- This mode passes all keypresses through to the web page. It is useful for websites that have their own keybinds, such as games and Gmail. - This mode passes all keypresses through to the web page. It is useful for websites that have their own keybinds, such as games and Gmail.
- You can toggle the mode with `Shift-Insert`, `Ctrl-Alt-Backtick`, or `Shift-Esc`. - You can toggle the mode with `Shift-Insert`, `Ctrl-Alt-Escape`, `Ctrl-Alt-Backtick`, or `Shift-Esc`.
- While in ignore mode, you can execute a single normal mode binding by pressing `<C-o>` followed by the keys for the binding. - While in ignore mode, you can execute a single normal mode binding by pressing `<C-o>` followed by the keys for the binding.
Almost all of the modes are controlled by series of keypresses. In this tutorial, a sequence of keys such as `zz` should be entered by pressing the key `z`, letting go, and then pressing the key `z`. There is no need to hold both keys at once, if that were even possible. (`zz` resets the zoom level to the default, so it probably didn't seem to do anything). Sometimes `help` refers to a command that must be entered in command mode; it should hopefully always be clear from context which we mean. Almost all of the modes are controlled by series of keypresses. In this tutorial, a sequence of keys such as `zz` should be entered by pressing the key `z`, letting go, and then pressing the key `z`. There is no need to hold both keys at once, if that were even possible. (`zz` resets the zoom level to the default, so it probably didn't seem to do anything). Sometimes `help` refers to a command that must be entered in command mode; it should hopefully always be clear from context which we mean.

View file

@ -23,7 +23,7 @@ REPLACE_ME_WITH_THE_CHANGE_LOG_USING_SED
## Highlighted features: ## Highlighted features:
- `f`/`F` — enter the "hint mode" to select a link to follow. `F` to open it in a background tab. (Note: hint characters should be typed in lowercase.) - `f`/`F` — enter the "hint mode" to select a link to follow. `F` to open it in a background tab. (Note: hint characters should be typed in lowercase.)
- `Shift` + `Insert` — enter "ignore mode" to send all key presses to the web page you are on. Press `Shift` + `Insert` again to return to the highly productive "normal mode". - `Shift` + `Insert` or `Ctrl-Alt-Escape` — enter "ignore mode" to send all key presses to the web page you are on. Press `Shift` + `Insert` or `Ctrl-Alt-Escape` again to return to the highly productive "normal mode".
- `H`/`L` — go back/forward in the history. - `H`/`L` — go back/forward in the history.
- `o`/`O` — open a URL in this tab (`O` to pre-load current URL). - `o`/`O` — open a URL in this tab (`O` to pre-load current URL).
- `t`/`T` — open a URL in a new tab (`T` to pre-load current URL). - `t`/`T` — open a URL in a new tab (`T` to pre-load current URL).

View file

@ -731,10 +731,10 @@
resolved "https://registry.yarnpkg.com/@types/nearley/-/nearley-2.11.1.tgz#6ac3f57c00ca28071a1774ec72d2e45750f21420" resolved "https://registry.yarnpkg.com/@types/nearley/-/nearley-2.11.1.tgz#6ac3f57c00ca28071a1774ec72d2e45750f21420"
integrity sha512-oaAg5gn74VFpPYs6Ou2pjDao3WJxnlnH29q9rLOxSGb0PTw2QtBQcTAN9xs1OAHrtI9En5kIXKM96stf7//c9w== integrity sha512-oaAg5gn74VFpPYs6Ou2pjDao3WJxnlnH29q9rLOxSGb0PTw2QtBQcTAN9xs1OAHrtI9En5kIXKM96stf7//c9w==
"@types/node@*", "@types/node@^14.0.5": "@types/node@*", "@types/node@^14.0.6":
version "14.0.5" version "14.0.6"
resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.5.tgz#3d03acd3b3414cf67faf999aed11682ed121f22b" resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.6.tgz#f9e178b2da31a4b0ec60b64649e244c31ce18daf"
integrity sha512-90hiq6/VqtQgX8Sp0EzeIsv3r+ellbGj4URKj5j30tLlZvRUpnAe9YbYnjl3pJM93GyXU0tghHhvXHq+5rnCKA== integrity sha512-FbNmu4F67d3oZMWBV6Y4MaPER+0EpE9eIYf2yaHhCWovc1dlXCZkqGX4NLHfVVr6umt20TNBdRzrNJIzIKfdbw==
"@types/normalize-package-data@^2.4.0": "@types/normalize-package-data@^2.4.0":
version "2.4.0" version "2.4.0"
@ -4209,10 +4209,10 @@ immediate@~3.0.5:
resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b"
integrity sha1-nbHb0Pr43m++D13V5Wu2BigN5ps= integrity sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=
immer@^6.0.8: immer@^6.0.9:
version "6.0.8" version "6.0.9"
resolved "https://registry.yarnpkg.com/immer/-/immer-6.0.8.tgz#3758890d66ed7baed5703b9e0763785a16156478" resolved "https://registry.yarnpkg.com/immer/-/immer-6.0.9.tgz#b9dd69b8e69b3a12391e87db1e3ff535d1b26485"
integrity sha512-wmVdrkqL6OzhX5z2k/c0t8g+YzGy+V8B/r1GRdCTO0UcTiFkB0XVAxpJQT045KaNV2u14HzbLCYKJmt7yVCakg== integrity sha512-SyCYnAuiRf67Lvk0VkwFvwtDoEiCMjeamnHvRfnVDyc7re1/rQrNxuL+jJ7lA3WvdC4uznrvbmm+clJ9+XXatg==
immutable@^3.8.2: immutable@^3.8.2:
version "3.8.2" version "3.8.2"
@ -8307,10 +8307,10 @@ ts-loader@^7.0.5:
micromatch "^4.0.0" micromatch "^4.0.0"
semver "^6.0.0" semver "^6.0.0"
ts-node@^8.10.1: ts-node@^8.10.2:
version "8.10.1" version "8.10.2"
resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-8.10.1.tgz#77da0366ff8afbe733596361d2df9a60fc9c9bd3" resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-8.10.2.tgz#eee03764633b1234ddd37f8db9ec10b75ec7fb8d"
integrity sha512-bdNz1L4ekHiJul6SHtZWs1ujEKERJnHs4HxN7rjTyyVOFf3HaJ6sLqe6aPG62XTzAB/63pKRh5jTSWL0D7bsvw== integrity sha512-ISJJGgkIpDdBhWVu3jufsWpK3Rzo7bdiIXJjQc0ynKxVOVcg2oIrf2H2cejminGrptVc6q6/uynAHNCuWGbpVA==
dependencies: dependencies:
arg "^4.1.0" arg "^4.1.0"
diff "^4.0.1" diff "^4.0.1"