aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.circleci/config.yml18
-rw-r--r--.gitignore2
-rw-r--r--e2e/ambassador/manifest.json28
-rw-r--r--e2e/ambassador/src/background/index.js49
-rw-r--r--e2e/ambassador/src/background/ipc.js7
-rw-r--r--e2e/ambassador/src/background/tabs.js28
-rw-r--r--e2e/ambassador/src/client/ipc.js29
-rw-r--r--e2e/ambassador/src/client/keys.js28
-rw-r--r--e2e/ambassador/src/client/scrolls.js20
-rw-r--r--e2e/ambassador/src/client/tabs.js60
-rw-r--r--e2e/ambassador/src/client/windows.js27
-rw-r--r--e2e/ambassador/src/content/events.js31
-rw-r--r--e2e/ambassador/src/content/index.js30
-rw-r--r--e2e/ambassador/src/content/ipc.js40
-rw-r--r--e2e/ambassador/src/content/scrolls.js20
-rw-r--r--e2e/ambassador/src/shared/messages.js40
-rw-r--r--e2e/ambassador/webpack.config.js24
-rw-r--r--e2e/contents/follow.test.js83
-rw-r--r--e2e/contents/mark.test.js71
-rw-r--r--e2e/contents/navigate.test.js102
-rw-r--r--e2e/contents/scroll.test.js106
-rw-r--r--e2e/contents/tab.test.js192
-rw-r--r--e2e/contents/zoom.test.js53
-rw-r--r--e2e/eventually.js23
-rw-r--r--e2e/karma-delay.js10
-rw-r--r--e2e/karma-webext-launcher.js53
-rw-r--r--e2e/karma.conf.js53
-rw-r--r--e2e/main.js2
-rw-r--r--e2e/mark.test.js121
-rw-r--r--e2e/navigate.test.js167
-rw-r--r--e2e/scroll.test.js150
-rw-r--r--e2e/tab.test.js202
-rw-r--r--e2e/web-server/index.js88
-rw-r--r--e2e/web-server/url.js5
-rw-r--r--e2e/zoom.test.js81
-rw-r--r--package-lock.json1362
-rw-r--r--package.json7
37 files changed, 1577 insertions, 1835 deletions
diff --git a/.circleci/config.yml b/.circleci/config.yml
index 4116684..2d83bc3 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -6,6 +6,7 @@ executors:
- image: circleci/node:10-stretch-browsers
environment:
- FIREFOX_VERSION: "60.0esr"
+ - GECKODRIVER_VERSION: "0.24.0"
working_directory: ~
commands:
@@ -29,6 +30,18 @@ commands:
- ~/firefox
- run: echo 'export PATH=~/firefox/$FIREFOX_VERSION:$PATH' >> $BASH_ENV
+ install_geckodriver:
+ steps:
+ - run:
+ name: Install geckodriver
+ command: |
+ mkdir -p geckodriver
+
+ url=https://github.com/mozilla/geckodriver/releases/download/v0.24.0/geckodriver-v${GECKODRIVER_VERSION}-linux64.tar.gz
+ curl -sSLf "$url" | tar -C geckodriver xvf -
+
+ echo 'export PATH=~/geckodriver/$GECKODRIVER_VERSION:$PATH' >> $BASH_ENV
+
setup_npm:
steps:
- restore_cache:
@@ -61,10 +74,9 @@ jobs:
- checkout
- setup_npm
- run: npm run build
- - run: npm run ambassador:build
- run:
- name: Run web server
- command: node e2e/web-server
+ name: Run geckodriver
+ command: geckodriver
background: true
- run: npm run test:e2e
diff --git a/.gitignore b/.gitignore
index 07d22c4..10a2021 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,4 @@
/node_modules/
/build/
-/e2e/ambassador/build/
*.zip
+lanthan-driver.log
diff --git a/e2e/ambassador/manifest.json b/e2e/ambassador/manifest.json
deleted file mode 100644
index d2253f6..0000000
--- a/e2e/ambassador/manifest.json
+++ /dev/null
@@ -1,28 +0,0 @@
-{
- "manifest_version": 2,
- "name": "ambassador",
- "description": "WebExtension test helper",
- "version": "0.1",
- "content_scripts": [
- {
- "all_frames": true,
- "matches": [ "<all_urls>" ],
- "js": [ "build/content.js" ],
- "run_at": "document_start",
- "match_about_blank": true
- }
- ],
- "background": {
- "scripts": [
- "build/background.js"
- ]
- },
- "permissions": [
- "history",
- "sessions",
- "storage",
- "tabs",
- "clipboardRead",
- "activeTab"
- ]
-}
diff --git a/e2e/ambassador/src/background/index.js b/e2e/ambassador/src/background/index.js
deleted file mode 100644
index ce21dc8..0000000
--- a/e2e/ambassador/src/background/index.js
+++ /dev/null
@@ -1,49 +0,0 @@
-import {
- WINDOWS_CREATE, WINDOWS_REMOVE, WINDOWS_GET,
- TABS_CREATE, TABS_SELECT_AT, TABS_GET, TABS_UPDATE, TABS_REMOVE,
- TABS_GET_ZOOM, TABS_SET_ZOOM,
- EVENT_KEYPRESS, EVENT_KEYDOWN, EVENT_KEYUP,
- SCROLL_GET, SCROLL_SET,
-} from '../shared/messages';
-import * as tabs from './tabs';
-import { receiveContentMessage } from './ipc';
-
-receiveContentMessage((message) => {
- switch (message.type) {
- case WINDOWS_CREATE:
- return browser.windows.create({ url: message.url });
- case WINDOWS_REMOVE:
- return browser.windows.remove(message.windowId);
- case WINDOWS_GET:
- return browser.windows.get(message.windowId, { populate: true });
- case TABS_CREATE:
- return tabs.create({
- url: message.url,
- windowId: message.windowId,
- });
- case TABS_SELECT_AT:
- return tabs.selectAt({
- windowId: message.windowId,
- index: message.index,
- });
- case TABS_GET:
- return browser.tabs.get(message.tabId);
- case TABS_UPDATE:
- return browser.tabs.update(message.tabId, message.properties);
- case TABS_REMOVE:
- return browser.tabs.remove(message.tabId);
- case TABS_GET_ZOOM:
- return browser.tabs.getZoom(message.tabId);
- case TABS_SET_ZOOM:
- return browser.tabs.setZoom(message.tabId, message.factor);
- case EVENT_KEYPRESS:
- case EVENT_KEYDOWN:
- case EVENT_KEYUP:
- case SCROLL_GET:
- case SCROLL_SET:
- return browser.tabs.sendMessage(
- message.tabId,
- message
- );
- }
-});
diff --git a/e2e/ambassador/src/background/ipc.js b/e2e/ambassador/src/background/ipc.js
deleted file mode 100644
index 95d2164..0000000
--- a/e2e/ambassador/src/background/ipc.js
+++ /dev/null
@@ -1,7 +0,0 @@
-const receiveContentMessage = (func) => {
- browser.runtime.onMessage.addListener((message) => {
- return func(message);
- });
-};
-
-export { receiveContentMessage };
diff --git a/e2e/ambassador/src/background/tabs.js b/e2e/ambassador/src/background/tabs.js
deleted file mode 100644
index 5594134..0000000
--- a/e2e/ambassador/src/background/tabs.js
+++ /dev/null
@@ -1,28 +0,0 @@
-const create = (props = {}) => {
- return new Promise((resolve) => {
- browser.tabs.create(props).then((createdTab) => {
- let callback = (tabId, changeInfo, tab) => {
- if (tab.url !== 'about:blank' && tabId === createdTab.id &&
- changeInfo.status === 'complete') {
- browser.tabs.onUpdated.removeListener(callback);
-
- // wait for 50 milliseconds to ensure plugin loaded;
- setTimeout(() => resolve(tab), 50);
- }
- };
- browser.tabs.onUpdated.addListener(callback);
- });
- });
-};
-
-const selectAt = (props = {}) => {
- return browser.tabs.query({ windowId: props.windowId }).then((tabs) => {
- let target = tabs[props.index];
- return browser.tabs.update(target.id, { active: true });
- });
-};
-
-
-export {
- create, selectAt
-};
diff --git a/e2e/ambassador/src/client/ipc.js b/e2e/ambassador/src/client/ipc.js
deleted file mode 100644
index 9f232ea..0000000
--- a/e2e/ambassador/src/client/ipc.js
+++ /dev/null
@@ -1,29 +0,0 @@
-import { METHOD_REQUEST, METHOD_RESPONSE } from '../shared/messages';
-
-const generateId = () => {
- return Math.random().toString();
-};
-
-const send = (message) => {
- return new Promise((resolve) => {
- let id = generateId();
- let callback = (e) => {
- let packet = e.data;
- if (e.source !== window || packet.method !== METHOD_RESPONSE ||
- packet.id !== id) {
- return;
- }
- window.removeEventListener('message', callback);
- resolve(packet.message);
- };
- window.addEventListener('message', callback);
-
- window.postMessage({
- id,
- method: METHOD_REQUEST,
- message
- }, window.origin);
- });
-};
-
-export { send };
diff --git a/e2e/ambassador/src/client/keys.js b/e2e/ambassador/src/client/keys.js
deleted file mode 100644
index 6b36c23..0000000
--- a/e2e/ambassador/src/client/keys.js
+++ /dev/null
@@ -1,28 +0,0 @@
-import { EVENT_KEYPRESS, EVENT_KEYDOWN, EVENT_KEYUP } from '../shared/messages';
-import * as ipc from './ipc';
-
-const NEUTRAL_MODIFIERS = { shiftKey: false, altKey: false, ctrlKey: false };
-
-const press = (tabId, key, modifiers = NEUTRAL_MODIFIERS) => {
- return ipc.send({ ...modifiers,
- type: EVENT_KEYPRESS,
- tabId,
- key, });
-};
-
-const down = (tabId, key, modifiers = NEUTRAL_MODIFIERS) => {
- return ipc.send({ modifiers,
- type: EVENT_KEYDOWN,
- tabId,
- key, });
-};
-
-
-const up = (tabId, key, modifiers = NEUTRAL_MODIFIERS) => {
- return ipc.send({ modifiers,
- type: EVENT_KEYUP,
- tabId,
- key, });
-};
-
-export { press, down, up };
diff --git a/e2e/ambassador/src/client/scrolls.js b/e2e/ambassador/src/client/scrolls.js
deleted file mode 100644
index f8f82e9..0000000
--- a/e2e/ambassador/src/client/scrolls.js
+++ /dev/null
@@ -1,20 +0,0 @@
-import { SCROLL_GET, SCROLL_SET } from '../shared/messages';
-import * as ipc from './ipc';
-
-const get = (tabId) => {
- return ipc.send({
- type: SCROLL_GET,
- tabId,
- });
-};
-
-const set = (tabId, x, y) => {
- return ipc.send({
- type: SCROLL_SET,
- tabId,
- x,
- y,
- });
-};
-
-export { get, set };
diff --git a/e2e/ambassador/src/client/tabs.js b/e2e/ambassador/src/client/tabs.js
deleted file mode 100644
index d0cd578..0000000
--- a/e2e/ambassador/src/client/tabs.js
+++ /dev/null
@@ -1,60 +0,0 @@
-import {
- TABS_CREATE, TABS_SELECT_AT, TABS_GET, TABS_UPDATE, TABS_REMOVE,
- TABS_GET_ZOOM, TABS_SET_ZOOM,
-} from '../shared/messages';
-import * as ipc from './ipc';
-
-const create = (windowId, url) => {
- return ipc.send({
- type: TABS_CREATE,
- windowId,
- url,
- });
-};
-
-const selectAt = (windowId, index) => {
- return ipc.send({
- type: TABS_SELECT_AT,
- windowId,
- index,
- });
-};
-
-const get = (tabId) => {
- return ipc.send({
- type: TABS_GET,
- tabId,
- });
-};
-
-const update = (tabId, properties) => {
- return ipc.send({
- type: TABS_UPDATE,
- tabId,
- properties,
- });
-};
-
-const remove = (tabId) => {
- return ipc.send({
- type: TABS_REMOVE,
- tabId
- });
-};
-
-const getZoom = (tabId) => {
- return ipc.send({
- tabId,
- type: TABS_GET_ZOOM,
- });
-};
-
-const setZoom = (tabId, factor) => {
- return ipc.send({
- type: TABS_SET_ZOOM,
- tabId,
- factor,
- });
-};
-
-export { create, selectAt, get, update, remove, getZoom, setZoom };
diff --git a/e2e/ambassador/src/client/windows.js b/e2e/ambassador/src/client/windows.js
deleted file mode 100644
index f92405a..0000000
--- a/e2e/ambassador/src/client/windows.js
+++ /dev/null
@@ -1,27 +0,0 @@
-import {
- WINDOWS_CREATE, WINDOWS_REMOVE, WINDOWS_GET
-} from '../shared/messages';
-import * as ipc from './ipc';
-
-const create = (url) => {
- return ipc.send({
- type: WINDOWS_CREATE,
- url,
- });
-};
-
-const remove = (windowId) => {
- return ipc.send({
- type: WINDOWS_REMOVE,
- windowId,
- });
-};
-
-const get = (windowId) => {
- return ipc.send({
- type: WINDOWS_GET,
- windowId,
- });
-};
-
-export { create, remove, get };
diff --git a/e2e/ambassador/src/content/events.js b/e2e/ambassador/src/content/events.js
deleted file mode 100644
index 1e45909..0000000
--- a/e2e/ambassador/src/content/events.js
+++ /dev/null
@@ -1,31 +0,0 @@
-const keypress = (opts) => {
- let event = new KeyboardEvent('keypress', {
- key: opts.key,
- altKey: opts.altKey,
- shiftKey: opts.shiftKey,
- ctrlKey: opts.ctrlKey
- });
- document.body.dispatchEvent(event);
-};
-
-const keydown = (opts) => {
- let event = new KeyboardEvent('keydown', {
- key: opts.key,
- altKey: opts.altKey,
- shiftKey: opts.shiftKey,
- ctrlKey: opts.ctrlKey
- });
- document.body.dispatchEvent(event);
-};
-
-const keyup = (opts) => {
- let event = new KeyboardEvent('keyup', {
- key: opts.key,
- altKey: opts.altKey,
- shiftKey: opts.shiftKey,
- ctrlKey: opts.ctrlKey
- });
- document.body.dispatchEvent(event);
-};
-
-export { keypress, keydown, keyup };
diff --git a/e2e/ambassador/src/content/index.js b/e2e/ambassador/src/content/index.js
deleted file mode 100644
index fd19136..0000000
--- a/e2e/ambassador/src/content/index.js
+++ /dev/null
@@ -1,30 +0,0 @@
-import {
- EVENT_KEYPRESS, EVENT_KEYDOWN, EVENT_KEYUP,
- SCROLL_GET, SCROLL_SET,
-} from '../shared/messages';
-import * as ipc from './ipc';
-import * as events from './events';
-import * as scrolls from './scrolls';
-
-ipc.receivePageMessage((message) => {
- return ipc.sendToBackground(message);
-});
-
-ipc.receiveBackgroundMesssage((message) => {
- switch (message.type) {
- case EVENT_KEYPRESS:
- events.keypress(message);
- break;
- case EVENT_KEYDOWN:
- events.keydown(message);
- break;
- case EVENT_KEYUP:
- events.keyup(message);
- break;
- case SCROLL_GET:
- return Promise.resolve(scrolls.get());
- case SCROLL_SET:
- return Promise.resolve(scrolls.set(message.x, message.y));
- }
- return Promise.resolve({});
-});
diff --git a/e2e/ambassador/src/content/ipc.js b/e2e/ambassador/src/content/ipc.js
deleted file mode 100644
index 917623c..0000000
--- a/e2e/ambassador/src/content/ipc.js
+++ /dev/null
@@ -1,40 +0,0 @@
-import { METHOD_REQUEST, METHOD_RESPONSE } from '../shared/messages';
-
-const sendToBackground = (message) => {
- return browser.runtime.sendMessage(message);
-};
-
-const receiveBackgroundMesssage = (func) => {
- return browser.runtime.onMessage.addListener((message) => {
- return Promise.resolve(func(message));
- });
-};
-
-const receivePageMessage = (func) => {
- window.addEventListener('message', (e) => {
- let packet = e.data;
- if (e.origin !== window.origin || packet.method !== METHOD_REQUEST) {
- return;
- }
-
- let resp = {
- id: packet.id,
- method: METHOD_RESPONSE,
- };
- let respMessage = func(packet.message);
- if (respMessage instanceof Promise) {
- return respMessage.then((data) => {
- resp.message = data;
- e.source.postMessage(resp, e.origin);
- });
- } else if (respMessage) {
- resp.message = respMessage;
- }
- e.source.postMessage(resp, e.origin);
- });
-};
-
-export {
- sendToBackground, receiveBackgroundMesssage,
- receivePageMessage,
-};
diff --git a/e2e/ambassador/src/content/scrolls.js b/e2e/ambassador/src/content/scrolls.js
deleted file mode 100644
index 4227cf7..0000000
--- a/e2e/ambassador/src/content/scrolls.js
+++ /dev/null
@@ -1,20 +0,0 @@
-const get = () => {
- let element = document.documentElement;
- return {
- xMax: element.scrollWidth - element.clientWidth,
- yMax: element.scrollHeight - element.clientHeight,
- x: element.scrollLeft,
- y: element.scrollTop,
- frameWidth: element.clientWidth,
- frameHeight: element.clientHeight,
- };
-};
-
-const set = (x, y) => {
- let element = document.documentElement;
- element.scrollLeft = x;
- element.scrollTop = y;
- return get();
-};
-
-export { get, set };
diff --git a/e2e/ambassador/src/shared/messages.js b/e2e/ambassador/src/shared/messages.js
deleted file mode 100644
index 35c41d7..0000000
--- a/e2e/ambassador/src/shared/messages.js
+++ /dev/null
@@ -1,40 +0,0 @@
-const METHOD_REQUEST = 'request';
-const METHOD_RESPONSE = 'response';
-const WINDOWS_CREATE = 'windows.create';
-const WINDOWS_REMOVE = 'windows.remove';
-const WINDOWS_GET = 'windows.get';
-const TABS_CREATE = 'tabs.create';
-const TABS_SELECT_AT = 'tabs.selectAt';
-const TABS_GET = 'tabs.get';
-const TABS_UPDATE = 'tabs.update';
-const TABS_REMOVE = 'tabs.remove';
-const TABS_GET_ZOOM = 'tabs.get.zoom';
-const TABS_SET_ZOOM = 'tabs.set.zoom';
-const EVENT_KEYPRESS = 'event.keypress';
-const EVENT_KEYDOWN = 'event.keydown';
-const EVENT_KEYUP = 'event.keyup';
-const SCROLL_GET = 'scroll.get';
-const SCROLL_SET = 'scroll.set';
-
-export {
- METHOD_REQUEST,
- METHOD_RESPONSE,
-
- WINDOWS_CREATE,
- WINDOWS_REMOVE,
- WINDOWS_GET,
-
- TABS_GET,
- TABS_UPDATE,
- TABS_CREATE,
- TABS_SELECT_AT,
- TABS_GET_ZOOM,
- TABS_SET_ZOOM,
- TABS_REMOVE,
-
- EVENT_KEYPRESS,
- EVENT_KEYDOWN,
- EVENT_KEYUP,
- SCROLL_GET,
- SCROLL_SET,
-};
diff --git a/e2e/ambassador/webpack.config.js b/e2e/ambassador/webpack.config.js
deleted file mode 100644
index d292317..0000000
--- a/e2e/ambassador/webpack.config.js
+++ /dev/null
@@ -1,24 +0,0 @@
-const path = require('path');
-
-const src = path.resolve(__dirname, 'src');
-const dist = path.resolve(__dirname, 'build');
-
-config = {
- entry: {
- content: path.join(src, 'content'),
- background: path.join(src, 'background')
- },
-
- output: {
- path: dist,
- filename: '[name].js'
- },
-
- resolve: {
- extensions: [ '.js' ],
- modules: [path.join(__dirname, 'src'), 'node_modules']
- }
-};
-
-module.exports = config
-
diff --git a/e2e/contents/follow.test.js b/e2e/contents/follow.test.js
deleted file mode 100644
index f78780b..0000000
--- a/e2e/contents/follow.test.js
+++ /dev/null
@@ -1,83 +0,0 @@
-import * as windows from "../ambassador/src/client/windows";
-import * as tabs from "../ambassador/src/client/tabs";
-import * as keys from "../ambassador/src/client/keys";
-import { CLIENT_URL } from '../web-server/url';
-
-describe("tab test", () => {
- let targetWindow;
-
- beforeEach(async () => {
- targetWindow = await windows.create(CLIENT_URL);
- });
-
- afterEach(async () => {
- await windows.remove(targetWindow.id);
- });return
-
- it('follows link by `f`', async() => {
- let tab = await tabs.create(targetWindow.id, CLIENT_URL + '/follow');
- await keys.press(tab.id, 'f');
- await new Promise(resolve => { setTimeout(() => resolve(), 10) });
- await keys.press(tab.id, 'a');
- await new Promise(resolve => { setTimeout(() => resolve(), 10) });
-
- tab = tabs.get(tab.id);
- expect(tab.url).to.be.equal(CLIENT_URL + '/follow#a');
- });
-
- it('follows link into new tab by `F`', async () => {
- let tab = await tabs.create(targetWindow.id, CLIENT_URL + '/follow');
- await keys.press(tab.id, 'F', { shiftKey: true });
- await new Promise(resolve => { setTimeout(() => resolve(), 10) });
- await keys.press(tab.id, 'a');
- await new Promise(resolve => { setTimeout(() => resolve(), 500) });
-
- let win = await windows.get(targetWindow.id);
- let urls = win.tabs.map(t => t.url);
- expect(urls).to.have.lengthOf(3);
- expect(urls).to.include(CLIENT_URL + '/');
- expect(urls).to.include(CLIENT_URL + '/follow');
- expect(urls).to.include(CLIENT_URL + '/follow#a');
- });
-
- it('follows link with target=_blank into new tab by `f`', async () => {
- let tab = await tabs.create(targetWindow.id, CLIENT_URL + '/follow');
- await keys.press(tab.id, 'f');
- await new Promise(resolve => { setTimeout(() => resolve(), 10) });
- await keys.press(tab.id, 'b');
- await new Promise(resolve => { setTimeout(() => resolve(), 500) });
-
- let win = await windows.get(targetWindow.id);
- let urls = win.tabs.map(t => t.url);
- expect(urls).to.have.lengthOf(3);
- expect(urls).to.include(CLIENT_URL + '/');
- expect(urls).to.include(CLIENT_URL + '/follow');
- expect(urls).to.include(CLIENT_URL + '/follow#external');
- });
-
- it('follows link with target=_blank into new tab by `F`', async () => {
- let tab = await tabs.create(targetWindow.id, CLIENT_URL + '/follow');
- await keys.press(tab.id, 'F', { shiftKey: true });
- await new Promise(resolve => { setTimeout(() => resolve(), 10) });
- await keys.press(tab.id, 'b');
- await new Promise(resolve => { setTimeout(() => resolve(), 500) });
-
- let win = await windows.get(targetWindow.id);
- let urls = win.tabs.map(t => t.url);
- expect(urls).to.have.lengthOf(3);
- expect(urls).to.include(CLIENT_URL + '/');
- expect(urls).to.include(CLIENT_URL + '/follow');
- expect(urls).to.include(CLIENT_URL + '/follow#external');
- });
-
- it('follows area by `F`', async () => {
- let tab = await tabs.create(targetWindow.id, CLIENT_URL + '/follow');
- await keys.press(tab.id, 'f');
- await new Promise(resolve => { setTimeout(() => resolve(), 10) });
- await keys.press(tab.id, 'c');
- await new Promise(resolve => { setTimeout(() => resolve(), 10) });
-
- tab = await tabs.get(tab.id);
- expect(tab.url).to.be.equal(CLIENT_URL + '/follow#area');
- });
-});
diff --git a/e2e/contents/mark.test.js b/e2e/contents/mark.test.js
deleted file mode 100644
index 85566bd..0000000
--- a/e2e/contents/mark.test.js
+++ /dev/null
@@ -1,71 +0,0 @@
-import * as windows from "../ambassador/src/client/windows";
-import * as tabs from "../ambassador/src/client/tabs";
-import * as keys from "../ambassador/src/client/keys";
-import * as scrolls from "../ambassador/src/client/scrolls";
-import { CLIENT_URL } from '../web-server/url';
-
-describe("mark test", () => {
- let targetWindow;
-
- before(async () => {
- targetWindow = await windows.create();
- });
-
- after(async () => {
- await windows.remove(targetWindow.id);
- });
-
- it('set a local mark and jump to it', async () => {
- let tab = await tabs.create(targetWindow.id, CLIENT_URL + '/mark#local');
- await scrolls.set(tab.id, 100, 100);
- await keys.press(tab.id, 'm');
- await keys.press(tab.id, 'a');
-
- await scrolls.set(tab.id, 200, 200);
- await keys.press(tab.id, "'");
- await keys.press(tab.id, 'a');
-
- let scroll = await scrolls.get(tab.id);
- expect(scroll.x).to.be.equals(100);
- expect(scroll.y).to.be.equals(100);
- });
-
- it('set a global mark and jump to it', async () => {
- let tab1 = await tabs.create(targetWindow.id, CLIENT_URL + '/mark#global1');
- await scrolls.set(tab1.id, 100, 100);
- await keys.press(tab1.id, 'm');
- await keys.press(tab1.id, 'A');
- await new Promise(resolve => { setTimeout(() => resolve(), 100) });
- await scrolls.set(tab1.id, 200, 200);
-
- let tab2 = await tabs.create(targetWindow.id, CLIENT_URL + '/mark#global2');
- await keys.press(tab2.id, "'");
- await keys.press(tab2.id, 'A');
- await new Promise(resolve => { setTimeout(() => resolve(), 100) });
-
- tab1 = await tabs.get(tab1.id);
- expect(tab1.active).to.be.true;
- let scroll = await scrolls.get(tab1.id);
- expect(scroll.x).to.be.equals(100);
- expect(scroll.y).to.be.equals(100);
- });
-
- it('set a global mark and creates new tab from gone', async () => {
- let tab1 = await tabs.create(targetWindow.id, CLIENT_URL + '/mark#gone');
- await scrolls.set(tab1.id, 100, 100);
- await keys.press(tab1.id, 'm');
- await keys.press(tab1.id, 'A');
- await tabs.remove(tab1.id);
- await new Promise(resolve => { setTimeout(() => resolve(), 100) });
-
- let tab2 = await tabs.create(targetWindow.id, CLIENT_URL + '/mark#newtab');
- await keys.press(tab2.id, "'");
- await keys.press(tab2.id, 'A');
- await new Promise(resolve => { setTimeout(() => resolve(), 100) });
-
- let win = await windows.get(targetWindow.id);
- let found = win.tabs.find(tab => tab.url === CLIENT_URL + '/mark#gone')
- expect(found).to.be.an('object');
- expect(found.id).to.not.equal(tab1.id);
- });
-});
diff --git a/e2e/contents/navigate.test.js b/e2e/contents/navigate.test.js
deleted file mode 100644
index 32ed423..0000000
--- a/e2e/contents/navigate.test.js
+++ /dev/null
@@ -1,102 +0,0 @@
-import * as windows from "../ambassador/src/client/windows";
-import * as tabs from "../ambassador/src/client/tabs";
-import * as keys from "../ambassador/src/client/keys";
-import * as scrolls from "../ambassador/src/client/scrolls";
-import { CLIENT_URL } from '../web-server/url';
-
-describe("navigate test", () => {
- let targetWindow;
-
- before(async () => {
- targetWindow = await windows.create();
- await tabs.create(targetWindow.id, CLIENT_URL);
- });
-
- after(async () => {
- await windows.remove(targetWindow.id);
- });
-
- it('goes to parent', async () => {
- let tab = await tabs.create(targetWindow.id, CLIENT_URL + '/a/b/c');
- await keys.press(tab.id, 'g');
- await keys.press(tab.id, 'u');
- await new Promise((resolve) => setTimeout(resolve, 10));
-
- tab = await tabs.get(tab.id);
- expect(tab.url).to.be.equal(CLIENT_URL + '/a/b/');
- });
-
- it('removes hash', async () => {
- let tab = await tabs.create(targetWindow.id, CLIENT_URL + '/a/b/c#navigate');
- await keys.press(tab.id, 'g');
- await keys.press(tab.id, 'u');
- tab = await tabs.get(tab.id);
- expect(tab.url).to.be.equal(CLIENT_URL + '/a/b/c#');
- });
-
- it('goes to root', async () => {
- let tab = await tabs.create(targetWindow.id, CLIENT_URL + '/a/b/c');
- await keys.press(tab.id, 'g');
- await keys.press(tab.id, 'U', { shiftKey: true });
- await new Promise((resolve) => setTimeout(resolve, 10));
-
- tab = await tabs.get(tab.id);
- expect(tab.url).to.be.equal(CLIENT_URL + '/');
- });
-
- it('goes back and forward in history', async () => {
- let tab = await tabs.create(targetWindow.id, CLIENT_URL + '/#navigate');
- await keys.press(tab.id, 'g');
- await keys.press(tab.id, 'u');
- await keys.press(tab.id, 'H', { shiftKey: true });
- await new Promise((resolve) => setTimeout(resolve, 10));
-
- tab = await tabs.get(tab.id);
- expect(tab.url, 'go back in history').to.be.equal(CLIENT_URL + '/#navigate');
- await new Promise((resolve) => setTimeout(resolve, 10));
- await keys.press(tab.id, 'L', { shiftKey: true });
-
- tab = await tabs.get(tab.id);
- expect(tab.url, 'go next in history').to.be.equal(CLIENT_URL + '/#');
- });
-
- it('goes previous page by <a>', async () => {
- let tab = await tabs.create(targetWindow.id, CLIENT_URL + '/a-pagenation?page=10');
- await keys.press(tab.id, '[');
- await keys.press(tab.id, '[');
- await new Promise((resolve) => setTimeout(resolve, 10));
-
- tab = await tabs.get(tab.id);
- expect(tab.url).to.be.equal(CLIENT_URL + '/a-pagenation?page=9');
- })
-
- it('goes next page by <a>', async () => {
- let tab = await tabs.create(targetWindow.id, CLIENT_URL + '/a-pagenation?page=10');
- await keys.press(tab.id, ']');
- await keys.press(tab.id, ']');
- await new Promise((resolve) => setTimeout(resolve, 100));
-
- tab = await tabs.get(tab.id);
- expect(tab.url).to.be.equal(CLIENT_URL + '/a-pagenation?page=11');
- })
-
- it('goes previous page by <link>', async () => {
- let tab = await tabs.create(targetWindow.id, CLIENT_URL + '/link-pagenation?page=10');
- await keys.press(tab.id, '[');
- await keys.press(tab.id, '[');
- await new Promise((resolve) => setTimeout(resolve, 10));
-
- tab = await tabs.get(tab.id);
- expect(tab.url).to.be.equal(CLIENT_URL + '/link-pagenation?page=9');
- })
-
- it('goes next page by <link>', async () => {
- let tab = await tabs.create(targetWindow.id, CLIENT_URL + '/link-pagenation?page=10');
- await keys.press(tab.id, ']');
- await keys.press(tab.id, ']');
- await new Promise((resolve) => setTimeout(resolve, 10));
-
- tab = await tabs.get(tab.id);
- expect(tab.url).to.be.equal(CLIENT_URL + '/link-pagenation?page=11');
- })
-});
diff --git a/e2e/contents/scroll.test.js b/e2e/contents/scroll.test.js
deleted file mode 100644
index f364890..0000000
--- a/e2e/contents/scroll.test.js
+++ /dev/null
@@ -1,106 +0,0 @@
-import * as windows from "../ambassador/src/client/windows";
-import * as tabs from "../ambassador/src/client/tabs";
-import * as keys from "../ambassador/src/client/keys";
-import * as scrolls from "../ambassador/src/client/scrolls";
-import { CLIENT_URL } from '../web-server/url';
-
-describe("scroll test", () => {
- let targetWindow;
- let targetTab;
-
- before(async () => {
- targetWindow = await windows.create();
- targetTab = await tabs.create(targetWindow.id, CLIENT_URL + '/scroll');
- });
-
- after(async () => {
- await windows.remove(targetWindow.id);
- });
-
- it('scrolls up by k', async () => {
- let before = await scrolls.set(targetTab.id, 100, 100);
- await keys.press(targetTab.id, 'k');
-
- let actual = await scrolls.get(targetTab.id);
- expect(actual.y).to.be.lessThan(before.y);
- });
-
- it('scrolls down by j', async () => {
- let before = await scrolls.set(targetTab.id, 100, 100);
- await keys.press(targetTab.id, 'j');
-
- let actual = await scrolls.get(targetTab.id);
- expect(actual.y).to.be.greaterThan(before.y);
- });
-
- it('scrolls left by h', async () => {
- let before = await scrolls.set(targetTab.id, 100, 100)
- await keys.press(targetTab.id, 'h');
-
- let actual = await scrolls.get(targetTab.id);
- expect(actual.x).to.be.lessThan(before.x);
- });
-
- it('scrolls top by gg', async () => {
- await scrolls.set(targetTab.id, 100, 100);
- await keys.press(targetTab.id, 'g');
- await keys.press(targetTab.id, 'g');
- let actual = await scrolls.get(targetTab.id);
- expect(actual.y).to.be.equals(0);
- });
-
- it('scrolls bottom by G', async () => {
- await scrolls.set(targetTab.id, 100, 100);
- await keys.press(targetTab.id, 'G', { shiftKey: true });
-
- let actual = await scrolls.get(targetTab.id);
- expect(actual.y).to.be.equals(actual.yMax);
- });
-
- it('scrolls bottom by 0', async () => {
- await scrolls.set(targetTab.id, 100, 100);
- await keys.press(targetTab.id, '0');
-
- let actual = await scrolls.get(targetTab.id);
- expect(actual.x).to.be.equals(0);
- });
-
- it('scrolls bottom by $', async () => {
- await scrolls.set(targetTab.id, 100, 100);
- await keys.press(targetTab.id, '$');
-
- let actual = await scrolls.get(targetTab.id);
- expect(actual.x).to.be.equals(actual.xMax);
- });
-
- it('scrolls bottom by <C-U>', async () => {
- let before = await scrolls.set(targetTab.id, 5000, 5000);
- await keys.press(targetTab.id, 'u', { ctrlKey: true });
-
- let actual = await scrolls.get(targetTab.id);
- expect(actual.y).to.closeTo(before.y - before.frameHeight / 2, 1);
- });
-
- it('scrolls bottom by <C-D>', async () => {
- let before = await scrolls.set(targetTab.id, 5000, 5000);
- await keys.press(targetTab.id, 'd', { ctrlKey: true });
-
- let actual = await scrolls.get(targetTab.id);
- expect(actual.y).to.closeTo(before.y + before.frameHeight / 2, 1);
- });
-
- it('scrolls bottom by <C-B>', async () => {
- let before = await scrolls.set(targetTab.id, 5000, 5000);
- await keys.press(targetTab.id, 'b', { ctrlKey: true });
-
- let actual = await await scrolls.get(targetTab.id);
- expect(actual.y).to.equals(before.y - before.frameHeight);
- });
-
- it('scrolls bottom by <C-F>', async () => {
- let before = await scrolls.set(targetTab.id, 5000, 5000);
- await keys.press(targetTab.id, 'f', { ctrlKey: true });
- let actual = await scrolls.get(targetTab.id);
- expect(actual.y).to.equals(before.y + before.frameHeight);
- });
-});
diff --git a/e2e/contents/tab.test.js b/e2e/contents/tab.test.js
deleted file mode 100644
index 3c98dc9..0000000
--- a/e2e/contents/tab.test.js
+++ /dev/null
@@ -1,192 +0,0 @@
-import * as windows from "../ambassador/src/client/windows";
-import * as tabs from "../ambassador/src/client/tabs";
-import * as keys from "../ambassador/src/client/keys";
-import { CLIENT_URL } from '../web-server/url';
-
-describe("tab test", () => {
- let targetWindow;
-
- beforeEach(async () => {
- targetWindow = await windows.create(CLIENT_URL);
- });
-
- afterEach(async () => {
- await windows.remove(targetWindow.id);
- });
-
- it('deletes tab by d', async () => {
- let tab = await tabs.create(targetWindow.id, CLIENT_URL);
- let before = await windows.get(targetWindow.id);
- await keys.press(tab.id, 'd');
-
- let actual = await windows.get(targetWindow.id);
- expect(actual.tabs).to.have.lengthOf(before.tabs.length - 1);
- });
-
- it('deletes tabs to the right by D', async () => {
- let tab1 = await tabs.create(targetWindow.id, CLIENT_URL + '#1');
- await tabs.create(targetWindow.id, CLIENT_URL + '#2');
- await tabs.create(targetWindow.id, CLIENT_URL + '#3');
-
- let before = await windows.get(targetWindow.id)
- let tab = await tabs.selectAt(targetWindow.id, tab1.index)
- await keys.press(tab.id, 'D', { shiftKey: true });
-
- let actual = await windows.get(targetWindow.id);
- expect(actual.tabs).to.have.lengthOf(before.tabs.length - 2);
- });
-
- it('duplicates tab by zd', async () => {
- let tab = await tabs.create(targetWindow.id, CLIENT_URL);
- let before = await windows.get(targetWindow.id)
- await keys.press(tab.id, 'z');
- await keys.press(tab.id, 'd');
-
- let actual = await windows.get(targetWindow.id);
- expect(actual.tabs).to.have.lengthOf(before.tabs.length + 1);
- });
-
- it('makes pinned by zp', async () => {
- let tab = await tabs.create(targetWindow.id, CLIENT_URL);
- let before = await windows.get(targetWindow.id);
- await keys.press(tab.id, 'z');
- await keys.press(tab.id, 'p');
-
- let actual = await windows.get(targetWindow.id);
- expect(actual.tabs[0].pinned).to.be.true;
- });
-
- it('selects previous tab by K', async () => {
- await tabs.create(targetWindow.id, CLIENT_URL + '#1');
- await tabs.create(targetWindow.id, CLIENT_URL + '#2');
- await tabs.create(targetWindow.id, CLIENT_URL + '#3');
- let tab = await tabs.selectAt(targetWindow.id, 2);
- await keys.press(tab.id, 'K', { shiftKey: true });
-
- let win = await windows.get(targetWindow.id);
- expect(win.tabs[1].active).to.be.true;
- });
-
- it('selects previous tab by K rotatory', async () => {
- await tabs.create(targetWindow.id, CLIENT_URL + '#1');
- await tabs.create(targetWindow.id, CLIENT_URL + '#2');
- await tabs.create(targetWindow.id, CLIENT_URL + '#3');
- let tab = await tabs.selectAt(targetWindow.id, 0);
- await keys.press(tab.id, 'K', { shiftKey: true });
-
- let win = await windows.get(targetWindow.id);
- expect(win.tabs[3].active).to.be.true;
- });
-
- it('selects next tab by J', async () => {
- await tabs.create(targetWindow.id, CLIENT_URL + '#1');
- await tabs.create(targetWindow.id, CLIENT_URL + '#2');
- await tabs.create(targetWindow.id, CLIENT_URL + '#3');
- let tab = await tabs.selectAt(targetWindow.id, 2);
- await keys.press(tab.id, 'J', { shiftKey: true });
-
- let win = await windows.get(targetWindow.id);
- expect(win.tabs[3].active).to.be.true;
- });
-
- it('selects previous tab by J rotatory', async () => {
- await tabs.create(targetWindow.id, CLIENT_URL + '#1');
- await tabs.create(targetWindow.id, CLIENT_URL + '#2');
- await tabs.create(targetWindow.id, CLIENT_URL + '#3');
- let tab = await tabs.selectAt(targetWindow.id, 3);
- await keys.press(tab.id, 'J', { shiftKey: true });
-
- let win = await windows.get(targetWindow.id);
- expect(win.tabs[0].active).to.be.true;
- });
-
- it('selects first tab by g0', async () => {
- await tabs.create(targetWindow.id, CLIENT_URL + '#1');
- await tabs.create(targetWindow.id, CLIENT_URL + '#2');
- await tabs.create(targetWindow.id, CLIENT_URL + '#3');
- let tab = await tabs.selectAt(targetWindow.id, 2);
- await keys.press(tab.id, 'g');
- await keys.press(tab.id, '0');
-
- let win = await windows.get(targetWindow.id);
- expect(win.tabs[0].active).to.be.true;
- });
-
- it('selects last tab by g$', async () => {
- await tabs.create(targetWindow.id, CLIENT_URL + '#1');
- await tabs.create(targetWindow.id, CLIENT_URL + '#2');
- await tabs.create(targetWindow.id, CLIENT_URL + '#3');
- let tab = await tabs.selectAt(targetWindow.id, 2);
- await keys.press(tab.id, 'g');
- await keys.press(tab.id, '$');
-
- let win = await windows.get(targetWindow.id);
- expect(win.tabs[3].active).to.be.true;
- });
-
- it('selects last selected tab by <C-6>', async () => {
- await tabs.create(targetWindow.id, CLIENT_URL + '#1');
- await tabs.create(targetWindow.id, CLIENT_URL + '#2');
- await tabs.create(targetWindow.id, CLIENT_URL + '#3');
- await tabs.selectAt(targetWindow.id, 1);
- let tab = await tabs.selectAt(targetWindow.id, 3);
- await keys.press(tab.id, '6', { ctrlKey: true });
-
- let win = await windows.get(targetWindow.id);
- expect(win.tabs[1].active).to.be.true;
- });
-
- it('deletes tab by d', async () => {
- let tab = await tabs.create(targetWindow.id, CLIENT_URL + '#1');
- await keys.press(tab.id, 'd');
-
- let win = await windows.get(targetWindow.id);
- expect(win.tabs).to.have.lengthOf(1);
- });
-
- it('reopen tab by u', async () => {
- let tab = await tabs.create(targetWindow.id, CLIENT_URL + '#1');
- await keys.press(tab.id, 'd');
-
- let win = await windows.get(targetWindow.id);
- expect(win.tabs).to.have.lengthOf(1);
-
- await keys.press(win.tabs[0].id, 'u');
- await new Promise(resolve => setTimeout(resolve, 100));
-
- win = await windows.get(targetWindow.id);
- expect(win.tabs).to.have.lengthOf(2);
- });
-
- it('does not delete pinned tab by d', async () => {
- let tab = await tabs.create(targetWindow.id, CLIENT_URL + '#1');
- tab = await tabs.update(tab.id, { pinned: true });
- await keys.press(tab.id, 'd');
-
- let win = await windows.get(targetWindow.id);
- expect(win.tabs).to.have.lengthOf(2);
- });
-
- it('deletes pinned tab by !d', async () => {
- let tab = await tabs.create(targetWindow.id, CLIENT_URL + '#1');
- tab = await tabs.update(tab.id, { pinned: true });
- await keys.press(tab.id, '!');
- await keys.press(tab.id, 'd');
-
- let win = await windows.get(targetWindow.id);
- expect(win.tabs).to.have.lengthOf(1);
- });
-
- it('opens view-source by gf', async () => {
- await new Promise(resolve => setTimeout(resolve, 100));
- let win = await windows.get(targetWindow.id);
- let tab = win.tabs[0];
- await keys.press(tab.id, 'g');
- await keys.press(tab.id, 'f');
- await new Promise(resolve => setTimeout(resolve, 500));
-
- win = await windows.get(targetWindow.id);
- let urls = win.tabs.map((t) => t.url)
- expect(urls).to.include.members([CLIENT_URL + '/', 'view-source:' + CLIENT_URL + '/']);
- });
-});
diff --git a/e2e/contents/zoom.test.js b/e2e/contents/zoom.test.js
deleted file mode 100644
index 74d4f56..0000000
--- a/e2e/contents/zoom.test.js
+++ /dev/null
@@ -1,53 +0,0 @@
-import * as windows from "../ambassador/src/client/windows";
-import * as tabs from "../ambassador/src/client/tabs";
-import * as keys from "../ambassador/src/client/keys";
-import { CLIENT_URL } from '../web-server/url';
-
-describe("zoom test", () => {
- let targetWindow;
- let targetTab;
-
- before(async () => {
- targetWindow = await windows.create(CLIENT_URL);
- });
-
- after(async () => {
- await windows.remove(targetWindow.id);
- });
-
- beforeEach(async () => {
- targetTab = await tabs.create(targetWindow.id, CLIENT_URL);
- });
-
- it('zooms-in by zi', async () => {
- let before = await tabs.getZoom(targetTab.id);
- await keys.press(targetTab.id, 'z');
- await keys.press(targetTab.id, 'i');
- await new Promise(resolve => setTimeout(resolve, 100));
-
- let actual = await tabs.getZoom(targetTab.id);
- expect(actual).to.be.greaterThan(before);
- });
-
- it('zooms-in by zo', async () => {
- let before = await tabs.getZoom(targetTab.id);
- await keys.press(targetTab.id, 'z');
- await keys.press(targetTab.id, 'o');
- await new Promise(resolve => setTimeout(resolve, 100));
-
- let actual = await tabs.getZoom(targetTab.id);
- expect(actual).to.be.lessThan(before);
- });
-
- it('zooms-in by zz', async () => {
- await tabs.setZoom(targetTab.id, 1.5);
- let before = await tabs.getZoom(targetTab.id);
- await keys.press(targetTab.id, 'z');
- await keys.press(targetTab.id, 'z');
- await new Promise(resolve => setTimeout(resolve, 100));
-
- let actual = await tabs.getZoom(targetTab.id);
- expect(actual).to.be.lessThan(before);
- expect(actual).to.equal(1);
- });
-});
diff --git a/e2e/eventually.js b/e2e/eventually.js
new file mode 100644
index 0000000..ab0ae25
--- /dev/null
+++ b/e2e/eventually.js
@@ -0,0 +1,23 @@
+let defaultInterval = 100;
+let defaultTimeout = 2000;
+
+function sleep(ms) {
+ return new Promise(resolve => setTimeout(resolve, ms));
+}
+
+const eventually = async (fn, timeout = defaultTimeout, interval = defaultInterval) => {
+ let start = Date.now();
+ let loop = async() => {
+ try {
+ await fn();
+ } catch (err) {
+ if (Date.now() - start > timeout) {
+ throw err;
+ }
+ await new Promise((resolve) => setTimeout(resolve, interval))
+ await loop();
+ }
+ };
+ await loop();
+};
+module.exports = eventually;
diff --git a/e2e/karma-delay.js b/e2e/karma-delay.js
deleted file mode 100644
index 7d18c4a..0000000
--- a/e2e/karma-delay.js
+++ /dev/null
@@ -1,10 +0,0 @@
-'use strict';
-
-window.__karma__.start = (function(start){
-return function(){
- var args = arguments
- setTimeout(() => {
- start(args)
- }, 3000);
-};
-}(window.__karma__.start));
diff --git a/e2e/karma-webext-launcher.js b/e2e/karma-webext-launcher.js
deleted file mode 100644
index e0a3e42..0000000
--- a/e2e/karma-webext-launcher.js
+++ /dev/null
@@ -1,53 +0,0 @@
-'use strict'
-
-var fs = require('fs')
-var path = require('path')
-
-var PREFS = {
- 'browser.shell.checkDefaultBrowser': 'false',
- 'browser.bookmarks.restore_default_bookmarks': 'false',
- 'dom.disable_open_during_load': 'false',
- 'dom.max_script_run_time': '0',
- 'dom.min_background_timeout_value': '10',
- 'extensions.autoDisableScopes': '0',
- 'extensions.enabledScopes': '15',
-}
-
-var FirefoxWebExt = function (id, baseBrowserDecorator, args) {
- baseBrowserDecorator(this)
-
- this._start = function (url) {
- var self = this
- var command = this._getCommand()
-
- let prefArgs = [].concat(...Object.keys(PREFS).map((key) => {
- return ['--pref', key + '=' + PREFS[key]];
- }));
- let sourceDirArgs = [].concat(...args.sourceDirs.map((dir) => {
- return ['--source-dir', dir];
- }));
-
- self._execCommand(
- command,
- ['run', '--start-url', url, '--no-input'].concat(sourceDirArgs, prefArgs)
- )
- }
-}
-
-FirefoxWebExt.prototype = {
- name: 'FirefoxWebExt',
-
- DEFAULT_CMD: {
- linux: 'node_modules/web-ext/bin/web-ext',
- darwin: 'node_modules/web-ext/bin/web-ext',
- win32: 'node_modules/web-ext/bin/web-ext',
- }
-}
-
-FirefoxWebExt.$inject = ['id', 'baseBrowserDecorator', 'args']
-
-// PUBLISH DI MODULE
-module.exports = {
- 'launcher:FirefoxWebExt': ['type', FirefoxWebExt],
-}
-
diff --git a/e2e/karma.conf.js b/e2e/karma.conf.js
deleted file mode 100644
index fcda415..0000000
--- a/e2e/karma.conf.js
+++ /dev/null
@@ -1,53 +0,0 @@
-module.exports = function (config) {
-
- config.set({
- basePath: '',
- frameworks: ['mocha'],
- files: [
- 'main.js',
- 'karma-delay.js',
- '**/*.test.js'
- ],
-
- preprocessors: {
- '**/main.js': ['webpack'],
- '**/*.test.js': ['webpack']
- },
-
- port: 9876,
- colors: true,
- logLevel: config.LOG_INFO,
-
- customLaunchers: {
- FirefoxWebExtRunner: {
- base: 'FirefoxWebExt',
- sourceDirs: [ '.', 'e2e/ambassador'],
- },
- },
- browsers: ['FirefoxWebExtRunner'],
- sauceLabs: {
- username: 'michael_jackson'
- },
-
- singleRun: true,
-
- webpackMiddleware: {
- noInfo: true
- },
-
- reporters: ['mocha'],
-
- plugins: [
- require('./karma-webext-launcher'),
- 'karma-mocha',
- 'karma-webpack',
- 'karma-mocha-reporter',
- ],
-
- client: {
- mocha: {
- timeout: 5000
- }
- }
- })
-}
diff --git a/e2e/main.js b/e2e/main.js
deleted file mode 100644
index d923aaa..0000000
--- a/e2e/main.js
+++ /dev/null
@@ -1,2 +0,0 @@
-import chai from 'chai';
-global.expect = chai.expect;
diff --git a/e2e/mark.test.js b/e2e/mark.test.js
new file mode 100644
index 0000000..8f350b7
--- /dev/null
+++ b/e2e/mark.test.js
@@ -0,0 +1,121 @@
+const express = require('express');
+const lanthan = require('lanthan');
+const path = require('path');
+const assert = require('assert');
+const eventually = require('./eventually');
+
+const Key = lanthan.Key;
+
+const newApp = () => {
+ let app = express();
+ app.get('/', (req, res) => {
+ res.send(`<!DOCTYPEhtml>
+<html lang="en">
+ <body style="width:10000px; height:10000px"></body>
+</html">`);
+ });
+ return app;
+};
+
+describe("mark test", () => {
+
+ const port = 12321;
+ let http;
+ let firefox;
+ let session;
+ let browser;
+
+ before(async() => {
+ http = newApp().listen(port);
+
+ firefox = await lanthan.firefox();
+ await firefox.session.installAddon(path.join(__dirname, '..'));
+ session = firefox.session;
+ browser = firefox.browser;
+ });
+
+ after(async() => {
+ if (firefox) {
+ await firefox.close();
+ }
+ http.close();
+ });
+
+ it('should set a local mark and jump to it', async () => {
+ await session.navigateTo(`http://127.0.0.1:${port}`);
+ let body = await session.findElementByCSS('body');
+
+ await session.executeScript(() => window.scrollTo(200, 200));
+ await body.sendKeys('m', 'a');
+ await session.executeScript(() => window.scrollTo(500, 500));
+ await body.sendKeys('\'', 'a');
+
+ await eventually(async() => {
+ let pageXOffset = await session.executeScript(() => window.pageXOffset);
+ let pageYOffset = await session.executeScript(() => window.pageYOffset);
+ assert.equal(pageXOffset, 200);
+ assert.equal(pageYOffset, 200);
+ });
+ });
+
+ it('should set a global mark and jump to it', async () => {
+ await session.navigateTo(`http://127.0.0.1:${port}#first`);
+ let body = await session.findElementByCSS('body');
+
+ await session.executeScript(() => window.scrollTo(200, 200));
+ await body.sendKeys('m', 'A');
+ await session.executeScript(() => window.scrollTo(500, 500));
+ await body.sendKeys('\'', 'A');
+
+ await eventually(async() => {
+ let pageXOffset = await session.executeScript(() => window.pageXOffset);
+ let pageYOffset = await session.executeScript(() => window.pageYOffset);
+ assert.equal(pageXOffset, 200);
+ assert.equal(pageYOffset, 200);
+ });
+
+ await browser.tabs.create({ url: `http://127.0.0.1:${port}#second` });
+ body = await session.findElementByCSS('body');
+ await body.sendKeys('\'', 'A');
+
+ await eventually(async() => {
+ let tab = (await browser.tabs.query({ active: true }))[0];
+ let url = new URL(tab.url);
+ assert.equal(url.hash, '#first');
+
+ let pageXOffset = await session.executeScript(() => window.pageXOffset);
+ let pageYOffset = await session.executeScript(() => window.pageYOffset);
+ assert.equal(pageXOffset, 200);
+ assert.equal(pageYOffset, 200);
+ });
+ });
+
+ it('set a global mark and creates new tab from gone', async () => {
+ await session.navigateTo(`http://127.0.0.1:${port}#first`);
+ await session.executeScript(() => window.scrollTo(500, 500));
+ let body = await session.findElementByCSS('body');
+ await body.sendKeys('m', 'A');
+
+ let tab = (await browser.tabs.query({ active: true }))[0];
+ await browser.tabs.create({ url: `http://127.0.0.1:${port}#second` });
+ await browser.tabs.remove(tab.id);
+
+ let handles;
+ await eventually(async() => {
+ handles = await session.getWindowHandles();
+ assert.equal(handles.length, 2);
+ });
+ await session.switchToWindow(handles[0]);
+ await session.navigateTo(`http://127.0.0.1:${port}#second`);
+ body = await session.findElementByCSS('body');
+ await body.sendKeys('\'', 'A');
+
+ await eventually(async() => {
+ let tab = (await browser.tabs.query({ active: true }))[0];
+ let url = new URL(tab.url);
+ assert.equal(url.hash, '#first');
+ });
+ });
+});
+
+
diff --git a/e2e/navigate.test.js b/e2e/navigate.test.js
new file mode 100644
index 0000000..089fa56
--- /dev/null
+++ b/e2e/navigate.test.js
@@ -0,0 +1,167 @@
+const express = require('express');
+const lanthan = require('lanthan');
+const path = require('path');
+const assert = require('assert');
+const eventually = require('./eventually');
+
+const Key = lanthan.Key;
+
+const newApp = () => {
+ let app = express();
+ app.get('/pagenation-a/:page', (req, res) => {
+ res.status(200).send(`
+<html lang="en">
+ <a href="/pagenation-a/${Number(req.params.page) - 1}">prev</a>
+ <a href="/pagenation-a/${Number(req.params.page) + 1}">next</a>
+</html">`);
+ });
+ app.get('/pagenation-link/:page', (req, res) => {
+ res.status(200).send(`
+<html lang="en">
+ <head>
+ <link rel="prev" href="/pagenation-link/${Number(req.params.page) - 1}"></link>
+ <link rel="next" href="/pagenation-link/${Number(req.params.page) + 1}"></link>
+ </head>
+</html">`);
+ });
+
+ app.get('/*', (req, res) => {
+ res.send(`<!DOCTYPEhtml>
+<html lang="en">
+ ${req.path}
+</html">`);
+ });
+ return app;
+};
+
+describe("zoom test", () => {
+
+ const port = 12321;
+ let http;
+ let firefox;
+ let session;
+ let browser;
+
+ before(async() => {
+ http = newApp().listen(port);
+
+ firefox = await lanthan.firefox();
+ await firefox.session.installAddon(path.join(__dirname, '..'));
+ session = firefox.session;
+ browser = firefox.browser;
+ });
+
+ after(async() => {
+ if (firefox) {
+ await firefox.close();
+ }
+ http.close();
+ });
+
+ it('should go to parent path without hash by gu', async () => {
+ await session.navigateTo(`http://127.0.0.1:${port}/a/b/c`);
+ let body = await session.findElementByCSS('body');
+
+ await body.sendKeys('g', 'u');
+
+ let tab = (await browser.tabs.query({}))[0];
+ let url = new URL(tab.url);
+ assert.equal(url.pathname, `/a/b/`)
+ });
+
+ it('should remove hash by gu', async () => {
+ await session.navigateTo(`http://127.0.0.1:${port}/a/b/c#hash`);
+ let body = await session.findElementByCSS('body');
+
+ await body.sendKeys('g', 'u');
+
+ let tab = (await browser.tabs.query({}))[0];
+ let url = new URL(tab.url);
+ assert.equal(url.hash, '')
+ assert.equal(url.pathname, `/a/b/c`)
+ });
+
+ it('should go to root path by gU', async () => {
+ await session.navigateTo(`http://127.0.0.1:${port}/a/b/c#hash`);
+ let body = await session.findElementByCSS('body');
+
+ await body.sendKeys('g', Key.Shift, 'u');
+
+ await eventually(async() => {
+ let tab = (await browser.tabs.query({}))[0];
+ let url = new URL(tab.url);
+ assert.equal(url.pathname, `/`)
+ });
+ });
+
+ it('should go back and forward in history by H and L', async () => {
+ await session.navigateTo(`http://127.0.0.1:${port}/first`);
+ await session.navigateTo(`http://127.0.0.1:${port}/second`);
+ let body = await session.findElementByCSS('body');
+
+ await body.sendKeys(Key.Shift, 'h');
+
+ let tab = (await browser.tabs.query({}))[0];
+ let url = new URL(tab.url);
+ assert.equal(url.pathname, `/first`)
+
+ body = await session.findElementByCSS('body');
+ await body.sendKeys(Key.Shift, 'l');
+
+ tab = (await browser.tabs.query({}))[0];
+ url = new URL(tab.url);
+ assert.equal(url.pathname, `/second`)
+ });
+
+ it('should go previous and next page in <a> by [[ and ]]', async () => {
+ await session.navigateTo(`http://127.0.0.1:${port}/pagenation-a/10`);
+
+ let body = await session.findElementByCSS('body');
+ await body.sendKeys('[', '[');
+
+ await eventually(async() => {
+ let tab = (await browser.tabs.query({}))[0];
+ let url = new URL(tab.url);
+ assert.equal(url.pathname, '/pagenation-a/9');
+ });
+ });
+
+ it('should go next page in <a> by ]]', async () => {
+ await session.navigateTo(`http://127.0.0.1:${port}/pagenation-a/10`);
+ let body = await session.findElementByCSS('body');
+ await body.sendKeys(']', ']');
+
+ await eventually(async() => {
+ let tab = (await browser.tabs.query({}))[0];
+ let url = new URL(tab.url);
+ assert.equal(url.pathname, '/pagenation-a/11');
+ });
+ });
+
+ it('should go previous page in <link> by ]]', async () => {
+ await session.navigateTo(`http://127.0.0.1:${port}/pagenation-link/10`);
+
+ let body = await session.findElementByCSS('body');
+ await body.sendKeys('[', '[');
+
+ await eventually(async() => {
+ let tab = (await browser.tabs.query({}))[0];
+ let url = new URL(tab.url);
+ assert.equal(url.pathname, '/pagenation-link/9');
+ });
+ });
+
+ it('should go next page by in <link> by [[', async () => {
+ await session.navigateTo(`http://127.0.0.1:${port}/pagenation-link/10`);
+ let body = await session.findElementByCSS('body');
+ await body.sendKeys(']', ']');
+
+ await eventually(async() => {
+ let tab = (await browser.tabs.query({}))[0];
+ let url = new URL(tab.url);
+ assert.equal(url.pathname, '/pagenation-link/11');
+ });
+ });
+});
+
+
diff --git a/e2e/scroll.test.js b/e2e/scroll.test.js
new file mode 100644
index 0000000..32b0012
--- /dev/null
+++ b/e2e/scroll.test.js
@@ -0,0 +1,150 @@
+const express = require('express');
+const lanthan = require('lanthan');
+const path = require('path');
+const assert = require('assert');
+
+const Key = lanthan.Key;
+
+const newApp = () => {
+ let app = express();
+ app.get('/', (req, res) => {
+ res.send(`<!DOCTYPEhtml>
+<html lang="en">
+ <body style="width:10000px; height:10000px"></body>
+</html">`);
+ });
+ return app;
+};
+
+describe("scroll test", () => {
+
+ const port = 12321;
+ let http;
+ let firefox;
+ let session;
+ let body;
+
+ before(async() => {
+ http = newApp().listen(port);
+
+ firefox = await lanthan.firefox();
+ await firefox.session.installAddon(path.join(__dirname, '..'));
+ session = firefox.session;
+ });
+
+ after(async() => {
+ if (firefox) {
+ await firefox.close();
+ }
+ http.close();
+ });
+
+ beforeEach(async() => {
+ await session.navigateTo(`http://127.0.0.1:${port}`);
+ body = await session.findElementByCSS('body');
+ });
+
+
+ it('scrolls up by k', async () => {
+ await body.sendKeys('j');
+
+ let pageYOffset = await session.executeScript(() => window.pageYOffset);
+ assert.equal(pageYOffset, 64);
+ });
+
+ it('scrolls down by j', async () => {
+ await session.executeScript(() => window.scrollTo(0, 200));
+ await body.sendKeys('k');
+
+ let pageYOffset = await session.executeScript(() => window.pageYOffset);
+ assert.equal(pageYOffset, 136);
+ });
+
+ it('scrolls left by h', async () => {
+ await session.executeScript(() => window.scrollTo(100, 100));
+ await body.sendKeys('h');
+
+ let pageXOffset = await session.executeScript(() => window.pageXOffset);
+ assert.equal(pageXOffset, 36);
+ });
+
+ it('scrolls left by l', async () => {
+ await session.executeScript(() => window.scrollTo(100, 100));
+ await body.sendKeys('l');
+
+ let pageXOffset = await session.executeScript(() => window.pageXOffset);
+ assert.equal(pageXOffset, 164);
+ });
+
+ it('scrolls top by gg', async () => {
+ await session.executeScript(() => window.scrollTo(0, 100));
+ await body.sendKeys('g', 'g');
+
+ let pageYOffset = await session.executeScript(() => window.pageYOffset);
+ assert.equal(pageYOffset, 0);
+ });
+
+ it('scrolls bottom by G', async () => {
+ await session.executeScript(() => window.scrollTo(0, 100));
+ await body.sendKeys(Key.Shift, 'g');
+
+ let pageYOffset = await session.executeScript(() => window.pageYOffset);
+ assert(pageYOffset > 5000);
+ });
+
+ it('scrolls bottom by 0', async () => {
+ await session.executeScript(() => window.scrollTo(0, 100));
+ await body.sendKeys(Key.Shift, '0');
+
+ let pageXOffset = await session.executeScript(() => window.pageXOffset);
+ assert(pageXOffset === 0);
+ });
+
+ it('scrolls bottom by $', async () => {
+ await session.executeScript(() => window.scrollTo(0, 100));
+ await body.sendKeys(Key.Shift, '$');
+
+ let pageXOffset = await session.executeScript(() => window.pageXOffset);
+ assert(pageXOffset > 5000);
+ });
+
+ it('scrolls bottom by <C-U>', async () => {
+ await session.executeScript(() => window.scrollTo(0, 1000));
+ await body.sendKeys(Key.Control, 'u');
+
+ let pageHeight =
+ await session.executeScript(() => window.document.documentElement.clientHeight);
+ let pageYOffset = await session.executeScript(() => window.pageYOffset);
+ assert(Math.abs(pageYOffset - (1000 - Math.floor(pageHeight / 2))) < 5);
+ });
+
+ it('scrolls bottom by <C-D>', async () => {
+ await session.executeScript(() => window.scrollTo(0, 1000));
+ await body.sendKeys(Key.Control, 'd');
+
+ let pageHeight =
+ await session.executeScript(() => window.document.documentElement.clientHeight);
+ let pageYOffset = await session.executeScript(() => window.pageYOffset);
+ assert(Math.abs(pageYOffset - (1000 + Math.floor(pageHeight / 2))) < 5);
+ });
+
+ it('scrolls bottom by <C-B>', async () => {
+ await session.executeScript(() => window.scrollTo(0, 1000));
+ await body.sendKeys(Key.Control, 'b');
+
+ let pageHeight =
+ await session.executeScript(() => window.document.documentElement.clientHeight);
+ let pageYOffset = await session.executeScript(() => window.pageYOffset);
+ assert(Math.abs(pageYOffset - (1000 - pageHeight)) < 5);
+ });
+
+ it('scrolls bottom by <C-F>', async () => {
+ await session.executeScript(() => window.scrollTo(0, 1000));
+ await body.sendKeys(Key.Control, 'f');
+
+ let pageHeight =
+ await session.executeScript(() => window.document.documentElement.clientHeight);
+ let pageYOffset = await session.executeScript(() => window.pageYOffset);
+ assert(Math.abs(pageYOffset - (1000 + pageHeight)) < 5);
+ });
+});
diff --git a/e2e/tab.test.js b/e2e/tab.test.js
new file mode 100644
index 0000000..39338aa
--- /dev/null
+++ b/e2e/tab.test.js
@@ -0,0 +1,202 @@
+const express = require('express');
+const lanthan = require('lanthan');
+const path = require('path');
+const assert = require('assert');
+const eventually = require('./eventually');
+
+const Key = lanthan.Key;
+
+const newApp = () => {
+ let app = express();
+ app.get('/', (req, res) => {
+ res.send('ok');
+ });
+ return app;
+};
+
+describe("tab test", () => {
+
+ const port = 12321;
+ const url = `http://127.0.0.1:${port}/`;
+
+ let http;
+ let firefox;
+ let session;
+ let browser;
+ let win;
+ let tabs;
+
+ before(async() => {
+ firefox = await lanthan.firefox();
+ await firefox.session.installAddon(path.join(__dirname, '..'));
+ session = firefox.session;
+ browser = firefox.browser;
+ http = newApp().listen(port);
+ });
+
+ after(async() => {
+ http.close();
+ if (firefox) {
+ await firefox.close();
+ }
+ });
+
+ beforeEach(async() => {
+ win = await browser.windows.create({ url: `${url}#0` });
+ for (let i = 1; i < 5; ++i) {
+ await browser.tabs.create({ url: `${url}#${i}`, windowId: win.id });
+ await session.navigateTo(`${url}#${i}`);
+ }
+ tabs = await browser.tabs.query({ windowId: win.id });
+ tabs.sort((t1, t2) => t1.index - t2.index);
+ });
+
+ afterEach(async() => {
+ await browser.windows.remove(win.id);
+ });
+
+ it('deletes tab by d', async () => {
+ let body = await session.findElementByCSS('body');
+ await body.sendKeys('d');
+
+ let current = await browser.tabs.query({ windowId: win.id });
+ assert(current.length === tabs.length - 1);
+ });
+
+ it('deletes tabs to the right by D', async () => {
+ await browser.tabs.update(tabs[1].id, { active: true });
+ let body = await session.findElementByCSS('body');
+ await body.sendKeys(Key.Shift, 'd');
+
+ let current = await browser.tabs.query({ windowId: win.id });
+ assert(current.length === 2);
+ });
+
+ it('duplicates tab by zd', async () => {
+ await browser.tabs.update(tabs[0].id, { active: true });
+ let body = await session.findElementByCSS('body');
+ await body.sendKeys('z', 'd');
+
+ await eventually(async() => {
+ let current = await browser.tabs.query({ windowId: win.id });
+ current.sort((t1, t2) => t1.index - t2.index);
+ assert(current.length === tabs.length + 1);
+ assert(current[0].url === current[1].url);
+ });
+ });
+
+ it('makes pinned by zp', async () => {
+ await browser.tabs.update(tabs[0].id, { active: true });
+ let body = await session.findElementByCSS('body');
+ await body.sendKeys('z', 'p');
+
+ let current = await browser.tabs.query({ windowId: win.id });
+ assert(current[0].pinned);
+ });
+
+ it('selects previous tab by K', async () => {
+ await browser.tabs.update(tabs[2].id, { active: true });
+ let body = await session.findElementByCSS('body');
+ await body.sendKeys(Key.Shift, 'K');
+
+ let current = await browser.tabs.query({ windowId: win.id });
+ assert(current[1].active);
+ });
+
+ it('selects previous tab by K rotatory', async () => {
+ await browser.tabs.update(tabs[0].id, { active: true });
+ let body = await session.findElementByCSS('body');
+ await body.sendKeys(Key.Shift, 'K');
+
+ let current = await browser.tabs.query({ windowId: win.id });
+ assert(current[current.length - 1].active)
+ });
+
+ it('selects next tab by J', async () => {
+ await browser.tabs.update(tabs[2].id, { active: true });
+ let body = await session.findElementByCSS('body');
+ await body.sendKeys(Key.Shift, 'J');
+
+ let current = await browser.tabs.query({ windowId: win.id });
+ assert(current[3].active);
+ });
+
+ it('selects previous tab by J rotatory', async () => {
+ await browser.tabs.update(tabs[tabs.length - 1].id, { active: true });
+ let body = await session.findElementByCSS('body');
+ await body.sendKeys(Key.Shift, 'J');
+
+ let current = await browser.tabs.query({ windowId: win.id });
+ assert(current[0].active)
+ });
+
+ it('selects first tab by g0', async () => {
+ await browser.tabs.update(tabs[2].id, { active: true });
+ let body = await session.findElementByCSS('body');
+ await body.sendKeys('g', '0');
+
+ let current = await browser.tabs.query({ windowId: win.id });
+ assert(current[0].active)
+ });
+
+ it('selects last tab by g$', async () => {
+ await browser.tabs.update(tabs[2].id, { active: true });
+ let body = await session.findElementByCSS('body');
+ await body.sendKeys('g', '$');
+
+ let current = await browser.tabs.query({ windowId: win.id });
+ assert(current[current.length - 1].active)
+ });
+
+ it('selects last selected tab by <C-6>', async () => {
+ await browser.tabs.update(tabs[1].id, { active: true });
+ await browser.tabs.update(tabs[4].id, { active: true });
+
+ let body = await session.findElementByCSS('body');
+ await body.sendKeys(Key.Control, '6');
+
+ let current = await browser.tabs.query({ windowId: win.id });
+ assert(current[1].active)
+ });
+
+ // browser.sessions.getRecentlyClosed() sometime throws "An unexpected error occurred"
+ // This might be a bug in Firefox.
+ it.skip('reopen tab by u', async () => {
+ await browser.tabs.remove(tabs[1].id);
+ let body = await session.findElementByCSS('body');
+ await body.sendKeys('u');
+
+ let current = await browser.tabs.query({ windowId: win.id });
+ assert(current.length === tabs.length);
+ });
+
+ it('does not delete pinned tab by d', async () => {
+ await browser.tabs.update(tabs[0].id, { active: true, pinned: true });
+ let body = await session.findElementByCSS('body');
+ await body.sendKeys('d');
+
+ let current = await browser.tabs.query({ windowId: win.id });
+ assert(current.length === tabs.length);
+ });
+
+ it('deletes pinned tab by !d', async () => {
+ await browser.tabs.update(tabs[0].id, { active: true, pinned: true });
+ let body = await session.findElementByCSS('body');
+ await body.sendKeys('!', 'd');
+
+ let current = await browser.tabs.query({ windowId: win.id });
+ assert(current.length === tabs.length - 1);
+ });
+
+ it('opens view-source by gf', async () => {
+ await browser.tabs.update(tabs[0].id, { active: true });
+ let body = await session.findElementByCSS('body');
+ await body.sendKeys('g', 'f');
+
+ await eventually(async() => {
+ let current = await browser.tabs.query({ windowId: win.id });
+ assert(current.length === tabs.length + 1);
+ assert(current[current.length - 1].url === `view-source:${url}#0`);
+ });
+ });
+});
diff --git a/e2e/web-server/index.js b/e2e/web-server/index.js
deleted file mode 100644
index 376e118..0000000
--- a/e2e/web-server/index.js
+++ /dev/null
@@ -1,88 +0,0 @@
-'use strict';
-
-var serverUrl = require('./url');
-var http = require('http');
-var url = require('url');
-
-const handleScroll = (req, res) => {
- res.writeHead(200, {'Content-Type': 'text/html'});
- res.end('<!DOCTYPEhtml><html lang="en"><body style="width:10000px; height:10000px"></body></html">');
-};
-
-const handleAPagenation = (req, res) => {
- let u = url.parse(req.url);
- let params = new url.URLSearchParams(u.search);
- let page = params.get('page') === null ? null : Number(params.get('page'));
- if (page === null || isNaN(page)) {
- return handle404(req, res);
- }
-
- let body = '';
- let nextLink = u.pathname + '?page=' + (page + 1);
- let prevLink = u.pathname + '?page=' + (page - 1);
-
- if (page > 1) {
- body += '<a href="' + prevLink + '">prev</a> | ';
- }
- body += '<a href="' + nextLink + '">next</a>';
-
- res.writeHead(200, {'Content-Type': 'text/html'});
- res.end('<!DOCTYPEhtml><html lang="en"><body">' + body + '</body></html">');
-};
-
-const handleLinkPagenation = (req, res) => {
- let u = url.parse(req.url);
- let params = new url.URLSearchParams(u.search);
- let page = params.get('page') === null ? null : Number(params.get('page'));
- if (page === null || isNaN(page)) {
- return handle404(req, res);
- }
-
- let head = '';
- let nextLink = u.pathname + '?page=' + (page + 1);
- let prevLink = u.pathname + '?page=' + (page - 1);
-
- if (page > 1) {
- head += '<link rel="prev" href="' + prevLink + '"></link>';
- }
- head += '<link rel="next" href="' + nextLink + '"></link>';
-
- res.writeHead(200, {'Content-Type': 'text/html'});
- res.end('<!DOCTYPEhtml><html lang="en"><head>' + head + '</head><body"></body></html">');
-};
-
-const handleFollow = (req, res) => {
- let body = '';
- body += '<a href="#a">a</a>';
- body += '<a href="#external" target="_blank">external</a>';
- body += '<img width="320" height="240" src="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=" usemap="#map"><map name="map"><area href="#area" shape="rect" coords="15,19,126,104"></map>'
-
- res.writeHead(200, {'Content-Type': 'text/html'});
- res.end('<!DOCTYPEhtml><html lang="en"><body">' + body + '</body></html">');
-}
-
-const handle404 = (req, res) => {
- res.writeHead(404, {'Content-Type': 'text/plain'});
- res.end('not found')
-};
-
-http.createServer(function (req, res) {
- if (req.method !== 'GET') {
- handle404(req, res);
- }
-
- let u = url.parse(req.url);
- if (u.pathname === '/scroll' || u.pathname === '/mark') {
- handleScroll(req, res);
- } else if (u.pathname === '/a-pagenation') {
- handleAPagenation(req, res);
- } else if (u.pathname === '/link-pagenation') {
- handleLinkPagenation(req, res);
- } else if (u.pathname === '/follow') {
- handleFollow(req, res);
- } else {
- handle404(req, res);
- }
-
- console.log(`"${req.method} ${req.url}"`, res.statusCode)
-}).listen(serverUrl.PORT, serverUrl.HOST);
diff --git a/e2e/web-server/url.js b/e2e/web-server/url.js
deleted file mode 100644
index 37f3d84..0000000
--- a/e2e/web-server/url.js
+++ /dev/null
@@ -1,5 +0,0 @@
-module.exports = {
- PORT: 11111,
- HOST: '127.0.0.1',
- CLIENT_URL: 'http://127.0.0.1:11111',
-}
diff --git a/e2e/zoom.test.js b/e2e/zoom.test.js
new file mode 100644
index 0000000..bc89628
--- /dev/null
+++ b/e2e/zoom.test.js
@@ -0,0 +1,81 @@
+const express = require('express');
+const lanthan = require('lanthan');
+const path = require('path');
+const assert = require('assert');
+const eventually = require('./eventually');
+
+const Key = lanthan.Key;
+
+const newApp = () => {
+ let app = express();
+ app.get('/', (req, res) => {
+ res.send(`<!DOCTYPEhtml>
+<html lang="en">
+</html">`);
+ });
+ return app;
+};
+
+describe("zoom test", () => {
+
+ const port = 12321;
+ let http;
+ let firefox;
+ let session;
+ let browser;
+ let tab;
+ let body;
+
+ before(async() => {
+ http = newApp().listen(port);
+
+ firefox = await lanthan.firefox();
+ await firefox.session.installAddon(path.join(__dirname, '..'));
+ session = firefox.session;
+ browser = firefox.browser;
+ tab = (await browser.tabs.query({}))[0]
+ });
+
+ after(async() => {
+ if (firefox) {
+ await firefox.close();
+ }
+ http.close();
+ });
+
+ beforeEach(async() => {
+ await session.navigateTo(`http://127.0.0.1:${port}`);
+ body = await session.findElementByCSS('body');
+ });
+
+ it('should zoom in by zi', async () => {
+ let before = await browser.tabs.getZoom(tab.id);
+ await body.sendKeys('z', 'i');
+
+ await eventually(async() => {
+ let actual = await browser.tabs.getZoom(tab.id);
+ assert(before < actual);
+ });
+ });
+
+ it('should zoom out by zo', async () => {
+ let before = await browser.tabs.getZoom(tab.id);
+ await body.sendKeys('z', 'o');
+
+ await eventually(async() => {
+ let actual = await browser.tabs.getZoom(tab.id);
+ assert(before > actual);
+ });
+ });
+
+ it('scrolls left by h', async () => {
+ await browser.tabs.setZoom(tab.id, 2);
+ await body.sendKeys('z', 'z');
+
+ await eventually(async() => {
+ let actual = await browser.tabs.getZoom(tab.id);
+ assert(actual === 1);
+ });
+ });
+});
+
diff --git a/package-lock.json b/package-lock.json
index fcf6641..c747cfe 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -780,15 +780,7 @@
"version": "7.1.3",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
"integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
- "dev": true,
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
+ "dev": true
},
"globals": {
"version": "11.11.0",
@@ -1182,6 +1174,12 @@
"integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
"dev": true
},
+ "array-flatten": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
+ "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=",
+ "dev": true
+ },
"array-from": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz",
@@ -1348,9 +1346,9 @@
"dev": true
},
"atob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz",
- "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=",
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
+ "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
"dev": true
},
"aws-sign2": {
@@ -2581,15 +2579,6 @@
"static-extend": "^0.1.1"
},
"dependencies": {
- "define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "dev": true,
- "requires": {
- "is-descriptor": "^0.1.0"
- }
- },
"isobject": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
@@ -2871,6 +2860,12 @@
"integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=",
"dev": true
},
+ "content-disposition": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
+ "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=",
+ "dev": true
+ },
"content-type": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
@@ -2889,6 +2884,12 @@
"integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=",
"dev": true
},
+ "cookie-signature": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
+ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=",
+ "dev": true
+ },
"copy-concurrently": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz",
@@ -3372,56 +3373,12 @@
}
},
"define-property": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
- "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
"dev": true,
"requires": {
- "is-descriptor": "^1.0.2",
- "isobject": "^3.0.1"
- },
- "dependencies": {
- "is-accessor-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
- "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-data-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
- "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-descriptor": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
- "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
- "dev": true,
- "requires": {
- "is-accessor-descriptor": "^1.0.0",
- "is-data-descriptor": "^1.0.0",
- "kind-of": "^6.0.2"
- }
- },
- "isobject": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
- "dev": true
- },
- "kind-of": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
- "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
- "dev": true
- }
+ "is-descriptor": "^0.1.0"
}
},
"delayed-stream": {
@@ -3452,6 +3409,12 @@
"minimalistic-assert": "^1.0.0"
}
},
+ "destroy": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
+ "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=",
+ "dev": true
+ },
"detect-file": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz",
@@ -4845,6 +4808,12 @@
"integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
"dev": true
},
+ "etag": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+ "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
+ "dev": true
+ },
"event-emitter": {
"version": "0.3.5",
"resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz",
@@ -4948,6 +4917,73 @@
"homedir-polyfill": "^1.0.1"
}
},
+ "express": {
+ "version": "4.16.4",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz",
+ "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==",
+ "dev": true,
+ "requires": {
+ "accepts": "~1.3.5",
+ "array-flatten": "1.1.1",
+ "body-parser": "1.18.3",
+ "content-disposition": "0.5.2",
+ "content-type": "~1.0.4",
+ "cookie": "0.3.1",
+ "cookie-signature": "1.0.6",
+ "debug": "2.6.9",
+ "depd": "~1.1.2",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "finalhandler": "1.1.1",
+ "fresh": "0.5.2",
+ "merge-descriptors": "1.0.1",
+ "methods": "~1.1.2",
+ "on-finished": "~2.3.0",
+ "parseurl": "~1.3.2",
+ "path-to-regexp": "0.1.7",
+ "proxy-addr": "~2.0.4",
+ "qs": "6.5.2",
+ "range-parser": "~1.2.0",
+ "safe-buffer": "5.1.2",
+ "send": "0.16.2",
+ "serve-static": "1.13.2",
+ "setprototypeof": "1.1.0",
+ "statuses": "~1.4.0",
+ "type-is": "~1.6.16",
+ "utils-merge": "1.0.1",
+ "vary": "~1.1.2"
+ },
+ "dependencies": {
+ "finalhandler": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz",
+ "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "on-finished": "~2.3.0",
+ "parseurl": "~1.3.2",
+ "statuses": "~1.4.0",
+ "unpipe": "~1.0.0"
+ }
+ },
+ "path-to-regexp": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
+ "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=",
+ "dev": true
+ },
+ "statuses": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
+ "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==",
+ "dev": true
+ }
+ }
+ },
"extend": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz",
@@ -4955,24 +4991,12 @@
"dev": true
},
"extend-shallow": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
- "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
"dev": true,
"requires": {
- "assign-symbols": "^1.0.0",
- "is-extendable": "^1.0.1"
- },
- "dependencies": {
- "is-extendable": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
- "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
- "dev": true,
- "requires": {
- "is-plain-object": "^2.0.4"
- }
- }
+ "is-extendable": "^0.1.0"
}
},
"external-editor": {
@@ -5165,41 +5189,22 @@
"arr-diff": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
- "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
- "dev": true
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA="
},
"array-unique": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
- "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
- "dev": true
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg="
},
"braces": {
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
"integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
- "dev": true,
- "requires": {
- "arr-flatten": "^1.1.0",
- "array-unique": "^0.3.2",
- "extend-shallow": "^2.0.1",
- "fill-range": "^4.0.0",
- "isobject": "^3.0.1",
- "repeat-element": "^1.1.2",
- "snapdragon": "^0.8.1",
- "snapdragon-node": "^2.0.1",
- "split-string": "^3.0.2",
- "to-regex": "^3.0.1"
- },
"dependencies": {
"extend-shallow": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8="
}
}
},
@@ -5207,52 +5212,26 @@
"version": "2.1.4",
"resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
"integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
- "dev": true,
- "requires": {
- "debug": "^2.3.3",
- "define-property": "^0.2.5",
- "extend-shallow": "^2.0.1",
- "posix-character-classes": "^0.1.0",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.1"
- },
"dependencies": {
"define-property": {
"version": "0.2.5",
"resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "dev": true,
- "requires": {
- "is-descriptor": "^0.1.0"
- }
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY="
},
"extend-shallow": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8="
},
"is-accessor-descriptor": {
"version": "0.1.6",
"resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
"integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
- "dev": true,
- "requires": {
- "kind-of": "^3.0.2"
- },
"dependencies": {
"kind-of": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ="
}
}
},
@@ -5260,38 +5239,23 @@
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
"integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
- "dev": true,
- "requires": {
- "kind-of": "^3.0.2"
- },
"dependencies": {
"kind-of": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ="
}
}
},
"is-descriptor": {
"version": "0.1.6",
"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
- "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
- "dev": true,
- "requires": {
- "is-accessor-descriptor": "^0.1.6",
- "is-data-descriptor": "^0.1.4",
- "kind-of": "^5.0.0"
- }
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg=="
},
"kind-of": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
- "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
- "dev": true
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="
}
}
},
@@ -5299,35 +5263,16 @@
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
"integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
- "dev": true,
- "requires": {
- "array-unique": "^0.3.2",
- "define-property": "^1.0.0",
- "expand-brackets": "^2.1.4",
- "extend-shallow": "^2.0.1",
- "fragment-cache": "^0.2.1",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.1"
- },
"dependencies": {
"define-property": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
- "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
- "dev": true,
- "requires": {
- "is-descriptor": "^1.0.0"
- }
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY="
},
"extend-shallow": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8="
}
}
},
@@ -5335,121 +5280,67 @@
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
"integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
- "dev": true,
- "requires": {
- "extend-shallow": "^2.0.1",
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1",
- "to-regex-range": "^2.1.0"
- },
"dependencies": {
"extend-shallow": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8="
}
}
},
"is-accessor-descriptor": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
- "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.0"
- }
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ=="
},
"is-data-descriptor": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
- "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.0"
- }
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ=="
},
"is-descriptor": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
- "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
- "dev": true,
- "requires": {
- "is-accessor-descriptor": "^1.0.0",
- "is-data-descriptor": "^1.0.0",
- "kind-of": "^6.0.2"
- }
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg=="
},
"is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
- "dev": true
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
},
"is-glob": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
"integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
- "dev": true,
- "requires": {
- "is-extglob": "^2.1.0"
- }
+ "dev": true
},
"is-number": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
"integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
- "dev": true,
- "requires": {
- "kind-of": "^3.0.2"
- },
"dependencies": {
"kind-of": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ="
}
}
},
"isobject": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
- "dev": true
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
},
"kind-of": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
- "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
- "dev": true
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
},
"micromatch": {
"version": "3.1.10",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
"integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
- "dev": true,
- "requires": {
- "arr-diff": "^4.0.0",
- "array-unique": "^0.3.2",
- "braces": "^2.3.1",
- "define-property": "^2.0.2",
- "extend-shallow": "^3.0.2",
- "extglob": "^2.0.4",
- "fragment-cache": "^0.2.1",
- "kind-of": "^6.0.2",
- "nanomatch": "^1.2.9",
- "object.pick": "^1.3.0",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.2"
- }
+ "dev": true
}
}
},
@@ -5640,6 +5531,12 @@
}
}
},
+ "forwarded": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
+ "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=",
+ "dev": true
+ },
"fragment-cache": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
@@ -5649,6 +5546,12 @@
"map-cache": "^0.2.2"
}
},
+ "fresh": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+ "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
+ "dev": true
+ },
"from2": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
@@ -5720,7 +5623,8 @@
"ansi-regex": {
"version": "2.1.1",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"aproba": {
"version": "1.2.0",
@@ -5763,7 +5667,8 @@
"code-point-at": {
"version": "1.1.0",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"concat-map": {
"version": "0.0.1",
@@ -5774,7 +5679,8 @@
"console-control-strings": {
"version": "1.1.0",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"core-util-is": {
"version": "1.0.2",
@@ -5891,7 +5797,8 @@
"inherits": {
"version": "2.0.3",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"ini": {
"version": "1.3.5",
@@ -5903,6 +5810,7 @@
"version": "1.0.0",
"bundled": true,
"dev": true,
+ "optional": true,
"requires": {
"number-is-nan": "^1.0.0"
}
@@ -5925,12 +5833,14 @@
"minimist": {
"version": "0.0.8",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"minipass": {
"version": "2.2.4",
"bundled": true,
"dev": true,
+ "optional": true,
"requires": {
"safe-buffer": "^5.1.1",
"yallist": "^3.0.0"
@@ -5949,6 +5859,7 @@
"version": "0.5.1",
"bundled": true,
"dev": true,
+ "optional": true,
"requires": {
"minimist": "0.0.8"
}
@@ -6029,7 +5940,8 @@
"number-is-nan": {
"version": "1.0.1",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"object-assign": {
"version": "4.1.1",
@@ -6041,6 +5953,7 @@
"version": "1.4.0",
"bundled": true,
"dev": true,
+ "optional": true,
"requires": {
"wrappy": "1"
}
@@ -6126,7 +6039,8 @@
"safe-buffer": {
"version": "5.1.1",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"safer-buffer": {
"version": "2.1.2",
@@ -6162,6 +6076,7 @@
"version": "1.0.2",
"bundled": true,
"dev": true,
+ "optional": true,
"requires": {
"code-point-at": "^1.0.0",
"is-fullwidth-code-point": "^1.0.0",
@@ -6181,6 +6096,7 @@
"version": "3.0.1",
"bundled": true,
"dev": true,
+ "optional": true,
"requires": {
"ansi-regex": "^2.0.0"
}
@@ -6224,12 +6140,14 @@
"wrappy": {
"version": "1.0.2",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"yallist": {
"version": "3.0.2",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
}
}
},
@@ -6475,6 +6393,7 @@
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
"integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
"dev": true,
+ "optional": true,
"requires": {
"is-glob": "^2.0.0"
}
@@ -7258,6 +7177,12 @@
"integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=",
"dev": true
},
+ "ipaddr.js": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz",
+ "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=",
+ "dev": true
+ },
"is-absolute": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.1.7.tgz",
@@ -7373,7 +7298,8 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
"integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
- "dev": true
+ "dev": true,
+ "optional": true
},
"is-finite": {
"version": "1.0.2",
@@ -7395,6 +7321,7 @@
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
"integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
"dev": true,
+ "optional": true,
"requires": {
"is-extglob": "^1.0.0"
}
@@ -7456,23 +7383,6 @@
"integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
"dev": true
},
- "is-odd": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz",
- "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==",
- "dev": true,
- "requires": {
- "is-number": "^4.0.0"
- },
- "dependencies": {
- "is-number": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
- "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
- "dev": true
- }
- }
- },
"is-path-inside": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz",
@@ -7894,10 +7804,7 @@
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
"integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
- "dev": true,
- "requires": {
- "remove-trailing-separator": "^1.0.1"
- }
+ "dev": true
}
}
},
@@ -7951,6 +7858,16 @@
"upath": "^1.1.0"
}
},
+ "define-property": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^1.0.2",
+ "isobject": "^3.0.1"
+ }
+ },
"expand-brackets": {
"version": "2.1.4",
"resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
@@ -8038,10 +7955,7 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
+ "dev": true
},
"extglob": {
"version": "2.0.4",
@@ -8102,7 +8016,8 @@
"ansi-regex": {
"version": "2.1.1",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"aproba": {
"version": "1.2.0",
@@ -8145,7 +8060,8 @@
"code-point-at": {
"version": "1.1.0",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"concat-map": {
"version": "0.0.1",
@@ -8156,7 +8072,8 @@
"console-control-strings": {
"version": "1.1.0",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"core-util-is": {
"version": "1.0.2",
@@ -8273,7 +8190,8 @@
"inherits": {
"version": "2.0.3",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"ini": {
"version": "1.3.5",
@@ -8285,6 +8203,7 @@
"version": "1.0.0",
"bundled": true,
"dev": true,
+ "optional": true,
"requires": {
"number-is-nan": "^1.0.0"
}
@@ -8307,12 +8226,14 @@
"minimist": {
"version": "0.0.8",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"minipass": {
"version": "2.3.5",
"bundled": true,
"dev": true,
+ "optional": true,
"requires": {
"safe-buffer": "^5.1.2",
"yallist": "^3.0.0"
@@ -8331,6 +8252,7 @@
"version": "0.5.1",
"bundled": true,
"dev": true,
+ "optional": true,
"requires": {
"minimist": "0.0.8"
}
@@ -8411,7 +8333,8 @@
"number-is-nan": {
"version": "1.0.1",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"object-assign": {
"version": "4.1.1",
@@ -8423,6 +8346,7 @@
"version": "1.4.0",
"bundled": true,
"dev": true,
+ "optional": true,
"requires": {
"wrappy": "1"
}
@@ -8508,7 +8432,8 @@
"safe-buffer": {
"version": "5.1.2",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"safer-buffer": {
"version": "2.1.2",
@@ -8544,6 +8469,7 @@
"version": "1.0.2",
"bundled": true,
"dev": true,
+ "optional": true,
"requires": {
"code-point-at": "^1.0.0",
"is-fullwidth-code-point": "^1.0.0",
@@ -8563,6 +8489,7 @@
"version": "3.0.1",
"bundled": true,
"dev": true,
+ "optional": true,
"requires": {
"ansi-regex": "^2.0.0"
}
@@ -8606,12 +8533,14 @@
"wrappy": {
"version": "1.0.2",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"yallist": {
"version": "3.0.3",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
}
}
},
@@ -8750,20 +8679,12 @@
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
"integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
- "dev": true,
- "requires": {
- "assign-symbols": "^1.0.0",
- "is-extendable": "^1.0.1"
- }
+ "dev": true
},
"is-extendable": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
- "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
- "dev": true,
- "requires": {
- "is-plain-object": "^2.0.4"
- }
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA=="
},
"kind-of": {
"version": "6.0.2",
@@ -8783,12 +8704,7 @@
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
"integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.1.11",
- "micromatch": "^3.1.10",
- "readable-stream": "^2.0.2"
- }
+ "dev": true
},
"source-map": {
"version": "0.6.1",
@@ -8922,6 +8838,131 @@
"is-buffer": "^1.1.5"
}
},
+ "lanthan": {
+ "version": "git+https://github.com/ueokande/lanthan.git#4ae32c1443b7f3f48dd214db0f275144aa3ad23d",
+ "from": "git+https://github.com/ueokande/lanthan.git#master",
+ "dev": true,
+ "requires": {
+ "commander": "^2.19.0",
+ "express": "^4.16.4",
+ "request": "^2.88.0",
+ "request-promise-native": "^1.0.7",
+ "web-ext": "^3.0.0"
+ },
+ "dependencies": {
+ "ajv": {
+ "version": "6.10.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz",
+ "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==",
+ "dev": true,
+ "requires": {
+ "fast-deep-equal": "^2.0.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "commander": {
+ "version": "2.20.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz",
+ "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==",
+ "dev": true
+ },
+ "extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+ "dev": true
+ },
+ "fast-deep-equal": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
+ "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
+ "dev": true
+ },
+ "har-validator": {
+ "version": "5.1.3",
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
+ "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
+ "dev": true,
+ "requires": {
+ "ajv": "^6.5.5",
+ "har-schema": "^2.0.0"
+ }
+ },
+ "json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true
+ },
+ "mime-db": {
+ "version": "1.38.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz",
+ "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==",
+ "dev": true
+ },
+ "mime-types": {
+ "version": "2.1.22",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.22.tgz",
+ "integrity": "sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==",
+ "dev": true,
+ "requires": {
+ "mime-db": "~1.38.0"
+ }
+ },
+ "oauth-sign": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
+ "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
+ "dev": true
+ },
+ "request": {
+ "version": "2.88.0",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
+ "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
+ "dev": true,
+ "requires": {
+ "aws-sign2": "~0.7.0",
+ "aws4": "^1.8.0",
+ "caseless": "~0.12.0",
+ "combined-stream": "~1.0.6",
+ "extend": "~3.0.2",
+ "forever-agent": "~0.6.1",
+ "form-data": "~2.3.2",
+ "har-validator": "~5.1.0",
+ "http-signature": "~1.2.0",
+ "is-typedarray": "~1.0.0",
+ "isstream": "~0.1.2",
+ "json-stringify-safe": "~5.0.1",
+ "mime-types": "~2.1.19",
+ "oauth-sign": "~0.9.0",
+ "performance-now": "^2.1.0",
+ "qs": "~6.5.2",
+ "safe-buffer": "^5.1.2",
+ "tough-cookie": "~2.4.3",
+ "tunnel-agent": "^0.6.0",
+ "uuid": "^3.3.2"
+ }
+ },
+ "tough-cookie": {
+ "version": "2.4.3",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
+ "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
+ "dev": true,
+ "requires": {
+ "psl": "^1.1.24",
+ "punycode": "^1.4.1"
+ }
+ },
+ "uuid": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
+ "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==",
+ "dev": true
+ }
+ }
+ },
"latest-version": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz",
@@ -9234,10 +9275,9 @@
"dev": true
},
"map-age-cleaner": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.2.tgz",
- "integrity": "sha512-UN1dNocxQq44IhJyMI4TU8phc2m9BddacHRPRjKGLYaF0jqd3xLz0jS0skpAU9WgYyoR4gHtUpzytNBS385FWQ==",
- "dev": true,
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz",
+ "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==",
"requires": {
"p-defer": "^1.0.0"
}
@@ -9305,14 +9345,20 @@
"dev": true
},
"mem": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/mem/-/mem-4.0.0.tgz",
- "integrity": "sha512-WQxG/5xYc3tMbYLXoXPm81ET2WDULiU5FxbuIoNbJqLOOI8zehXFdZuiUEgfdrU2mVB1pxBZUGlYORSrpuJreA==",
- "dev": true,
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz",
+ "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==",
"requires": {
"map-age-cleaner": "^0.1.1",
- "mimic-fn": "^1.0.0",
- "p-is-promise": "^1.1.0"
+ "mimic-fn": "^2.0.0",
+ "p-is-promise": "^2.0.0"
+ },
+ "dependencies": {
+ "mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="
+ }
}
},
"memory-fs": {
@@ -9351,6 +9397,18 @@
}
}
},
+ "merge-descriptors": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
+ "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=",
+ "dev": true
+ },
+ "methods": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+ "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
+ "dev": true
+ },
"micromatch": {
"version": "2.3.11",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
@@ -9537,38 +9595,22 @@
"ansi-regex": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
- "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
- "dev": true
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
},
"camelcase": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.2.0.tgz",
- "integrity": "sha512-IXFsBS2pC+X0j0N/GE7Dm7j3bsEBp+oTpb7F50dwEVX7rf3IgwO9XatnegTsDtniKCUtEJH4fSU6Asw7uoVLfQ==",
- "dev": true
+ "integrity": "sha512-IXFsBS2pC+X0j0N/GE7Dm7j3bsEBp+oTpb7F50dwEVX7rf3IgwO9XatnegTsDtniKCUtEJH4fSU6Asw7uoVLfQ=="
},
"cliui": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz",
- "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==",
- "dev": true,
- "requires": {
- "string-width": "^2.1.1",
- "strip-ansi": "^4.0.0",
- "wrap-ansi": "^2.0.0"
- }
+ "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ=="
},
"cross-spawn": {
"version": "6.0.5",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
- "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
- "dev": true,
- "requires": {
- "nice-try": "^1.0.4",
- "path-key": "^2.0.1",
- "semver": "^5.5.0",
- "shebang-command": "^1.2.0",
- "which": "^1.2.9"
- }
+ "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ=="
},
"debug": {
"version": "3.2.6",
@@ -9582,35 +9624,17 @@
"execa": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
- "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
- "dev": true,
- "requires": {
- "cross-spawn": "^6.0.0",
- "get-stream": "^4.0.0",
- "is-stream": "^1.1.0",
- "npm-run-path": "^2.0.0",
- "p-finally": "^1.0.0",
- "signal-exit": "^3.0.0",
- "strip-eof": "^1.0.0"
- }
+ "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA=="
},
"find-up": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
- "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
- "dev": true,
- "requires": {
- "locate-path": "^3.0.0"
- }
+ "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg=="
},
"get-stream": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
- "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
- "dev": true,
- "requires": {
- "pump": "^3.0.0"
- }
+ "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w=="
},
"glob": {
"version": "7.1.3",
@@ -9635,27 +9659,17 @@
"invert-kv": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz",
- "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==",
- "dev": true
+ "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA=="
},
"lcid": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz",
- "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==",
- "dev": true,
- "requires": {
- "invert-kv": "^2.0.0"
- }
+ "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA=="
},
"locate-path": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
- "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
- "dev": true,
- "requires": {
- "p-locate": "^3.0.0",
- "path-exists": "^3.0.0"
- }
+ "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A=="
},
"ms": {
"version": "2.1.1",
@@ -9667,7 +9681,6 @@
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz",
"integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==",
- "dev": true,
"requires": {
"execa": "^1.0.0",
"lcid": "^2.0.0",
@@ -9677,45 +9690,27 @@
"p-limit": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz",
- "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==",
- "dev": true,
- "requires": {
- "p-try": "^2.0.0"
- }
+ "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ=="
},
"p-locate": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
- "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
- "dev": true,
- "requires": {
- "p-limit": "^2.0.0"
- }
+ "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ=="
},
"p-try": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz",
- "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==",
- "dev": true
+ "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ=="
},
"pump": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
- "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
- "dev": true,
- "requires": {
- "end-of-stream": "^1.1.0",
- "once": "^1.3.1"
- }
+ "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww=="
},
"strip-ansi": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
- "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
- "dev": true,
- "requires": {
- "ansi-regex": "^3.0.0"
- }
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8="
},
"supports-color": {
"version": "6.0.0",
@@ -9738,38 +9733,19 @@
"which-module": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
- "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
- "dev": true
+ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho="
},
"yargs": {
"version": "12.0.5",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz",
"integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==",
- "dev": true,
- "requires": {
- "cliui": "^4.0.0",
- "decamelize": "^1.2.0",
- "find-up": "^3.0.0",
- "get-caller-file": "^1.0.1",
- "os-locale": "^3.0.0",
- "require-directory": "^2.1.1",
- "require-main-filename": "^1.0.1",
- "set-blocking": "^2.0.0",
- "string-width": "^2.0.0",
- "which-module": "^2.0.0",
- "y18n": "^3.2.1 || ^4.0.0",
- "yargs-parser": "^11.1.1"
- }
+ "dev": true
},
"yargs-parser": {
"version": "11.1.1",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz",
"integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==",
- "dev": true,
- "requires": {
- "camelcase": "^5.0.0",
- "decamelize": "^1.2.0"
- }
+ "dev": true
}
}
},
@@ -9874,9 +9850,9 @@
"dev": true
},
"nanomatch": {
- "version": "1.2.9",
- "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz",
- "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==",
+ "version": "1.2.13",
+ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
+ "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
"dev": true,
"requires": {
"arr-diff": "^4.0.0",
@@ -9884,7 +9860,6 @@
"define-property": "^2.0.2",
"extend-shallow": "^3.0.2",
"fragment-cache": "^0.2.1",
- "is-odd": "^2.0.0",
"is-windows": "^1.0.2",
"kind-of": "^6.0.2",
"object.pick": "^1.3.0",
@@ -9905,6 +9880,70 @@
"integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
"dev": true
},
+ "define-property": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^1.0.2",
+ "isobject": "^3.0.1"
+ }
+ },
+ "extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "dev": true,
+ "requires": {
+ "assign-symbols": "^1.0.0",
+ "is-extendable": "^1.0.1"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ }
+ },
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "^2.0.4"
+ }
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ },
"kind-of": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
@@ -9951,9 +9990,9 @@
"dev": true
},
"nice-try": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.4.tgz",
- "integrity": "sha512-2NpiFHqC87y/zFke0fC0spBXL3bBsoh/p5H1EFhshxjCR5+0g2d6BiXbUFz9v1sAcxsk2htp2eQnNIci2dIYcA==",
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
+ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
"dev": true
},
"nise": {
@@ -10349,17 +10388,6 @@
"copy-descriptor": "^0.1.0",
"define-property": "^0.2.5",
"kind-of": "^3.0.3"
- },
- "dependencies": {
- "define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "dev": true,
- "requires": {
- "is-descriptor": "^0.1.0"
- }
- }
}
},
"object-keys": {
@@ -10572,8 +10600,7 @@
"p-defer": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz",
- "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=",
- "dev": true
+ "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww="
},
"p-finally": {
"version": "1.0.0",
@@ -10582,10 +10609,9 @@
"dev": true
},
"p-is-promise": {
- "version": "1.1.0",
- "resolved": "http://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz",
- "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=",
- "dev": true
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.0.0.tgz",
+ "integrity": "sha512-pzQPhYMCAgLAKPWD2jC3Se9fEfrD9npNos0y150EeqZll7akhEgGhTW/slB6lHku8AvYGiJ+YJ5hfHKePPgFWg=="
},
"p-limit": {
"version": "1.2.0",
@@ -10963,10 +10989,7 @@
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "requires": {
- "has-flag": "^3.0.0"
- }
+ "dev": true
}
}
},
@@ -11383,6 +11406,16 @@
"object-assign": "^4.1.1"
}
},
+ "proxy-addr": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz",
+ "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==",
+ "dev": true,
+ "requires": {
+ "forwarded": "~0.1.2",
+ "ipaddr.js": "1.8.0"
+ }
+ },
"prr": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
@@ -11741,6 +11774,27 @@
"requires": {
"extend-shallow": "^3.0.2",
"safe-regex": "^1.1.0"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "dev": true,
+ "requires": {
+ "assign-symbols": "^1.0.0",
+ "is-extendable": "^1.0.1"
+ }
+ },
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "^2.0.4"
+ }
+ }
}
},
"regexpp": {
@@ -11860,6 +11914,34 @@
"uuid": "^3.1.0"
}
},
+ "request-promise-core": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz",
+ "integrity": "sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==",
+ "dev": true,
+ "requires": {
+ "lodash": "^4.17.11"
+ },
+ "dependencies": {
+ "lodash": {
+ "version": "4.17.11",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
+ "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
+ "dev": true
+ }
+ }
+ },
+ "request-promise-native": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.7.tgz",
+ "integrity": "sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w==",
+ "dev": true,
+ "requires": {
+ "request-promise-core": "1.1.2",
+ "stealthy-require": "^1.1.1",
+ "tough-cookie": "^2.3.3"
+ }
+ },
"require-directory": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
@@ -12114,17 +12196,13 @@
"punycode": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
- "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
- "dev": true
+ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
},
"uri-js": {
"version": "4.2.2",
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
"integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
- "dev": true,
- "requires": {
- "punycode": "^2.1.0"
- }
+ "dev": true
}
}
},
@@ -12164,12 +12242,59 @@
"semver": "^5.0.3"
}
},
+ "send": {
+ "version": "0.16.2",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz",
+ "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "depd": "~1.1.2",
+ "destroy": "~1.0.4",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "fresh": "0.5.2",
+ "http-errors": "~1.6.2",
+ "mime": "1.4.1",
+ "ms": "2.0.0",
+ "on-finished": "~2.3.0",
+ "range-parser": "~1.2.0",
+ "statuses": "~1.4.0"
+ },
+ "dependencies": {
+ "mime": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz",
+ "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==",
+ "dev": true
+ },
+ "statuses": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
+ "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==",
+ "dev": true
+ }
+ }
+ },
"serialize-javascript": {
"version": "1.6.1",
"resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.6.1.tgz",
"integrity": "sha512-A5MOagrPFga4YaKQSWHryl7AXvbQkEqpw4NNYMTNYUNV51bA8ABHgYFpqKx+YFFrw59xMV1qGH1R4AgoNIVgCw==",
"dev": true
},
+ "serve-static": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz",
+ "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==",
+ "dev": true,
+ "requires": {
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "parseurl": "~1.3.2",
+ "send": "0.16.2"
+ }
+ },
"set-blocking": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
@@ -12193,17 +12318,6 @@
"is-extendable": "^0.1.1",
"is-plain-object": "^2.0.3",
"split-string": "^3.0.1"
- },
- "dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
}
},
"setimmediate": {
@@ -12423,26 +12537,6 @@
"source-map": "^0.5.6",
"source-map-resolve": "^0.5.0",
"use": "^3.1.0"
- },
- "dependencies": {
- "define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "dev": true,
- "requires": {
- "is-descriptor": "^0.1.0"
- }
- },
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
}
},
"snapdragon-node": {
@@ -12716,6 +12810,27 @@
"dev": true,
"requires": {
"extend-shallow": "^3.0.0"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "dev": true,
+ "requires": {
+ "assign-symbols": "^1.0.0",
+ "is-extendable": "^1.0.1"
+ }
+ },
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "^2.0.4"
+ }
+ }
}
},
"sprintf-js": {
@@ -12758,17 +12873,6 @@
"requires": {
"define-property": "^0.2.5",
"object-copy": "^0.1.0"
- },
- "dependencies": {
- "define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "dev": true,
- "requires": {
- "is-descriptor": "^0.1.0"
- }
- }
}
},
"statuses": {
@@ -12786,6 +12890,12 @@
"readable-stream": "^2.0.1"
}
},
+ "stealthy-require": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz",
+ "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=",
+ "dev": true
+ },
"stream-browserify": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz",
@@ -13307,11 +13417,7 @@
"version": "0.5.10",
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.10.tgz",
"integrity": "sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ==",
- "dev": true,
- "requires": {
- "buffer-from": "^1.0.0",
- "source-map": "^0.6.0"
- }
+ "dev": true
}
}
},
@@ -13515,6 +13621,78 @@
"extend-shallow": "^3.0.2",
"regex-not": "^1.0.2",
"safe-regex": "^1.1.0"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^1.0.2",
+ "isobject": "^3.0.1"
+ }
+ },
+ "extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "dev": true,
+ "requires": {
+ "assign-symbols": "^1.0.0",
+ "is-extendable": "^1.0.1"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ }
+ },
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "^2.0.4"
+ }
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+ "dev": true
+ }
}
},
"to-regex-range": {
@@ -13703,15 +13881,6 @@
"set-value": "^0.4.3"
},
"dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- },
"set-value": {
"version": "0.4.3",
"resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
@@ -13946,21 +14115,10 @@
}
},
"use": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz",
- "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
- "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
- "dev": true
- }
- }
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
+ "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
+ "dev": true
},
"user-home": {
"version": "1.1.1",
@@ -14046,6 +14204,12 @@
"spdx-expression-parse": "^3.0.0"
}
},
+ "vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
+ "dev": true
+ },
"verror": {
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
@@ -14165,6 +14329,16 @@
"upath": "^1.1.0"
}
},
+ "define-property": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^1.0.2",
+ "isobject": "^3.0.1"
+ }
+ },
"expand-brackets": {
"version": "2.1.4",
"resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
@@ -14257,6 +14431,27 @@
}
}
},
+ "extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "dev": true,
+ "requires": {
+ "assign-symbols": "^1.0.0",
+ "is-extendable": "^1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "^2.0.4"
+ }
+ }
+ }
+ },
"extglob": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
@@ -14336,7 +14531,8 @@
"ansi-regex": {
"version": "2.1.1",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"aproba": {
"version": "1.2.0",
@@ -14751,7 +14947,8 @@
"safe-buffer": {
"version": "5.1.2",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"safer-buffer": {
"version": "2.1.2",
@@ -14807,6 +15004,7 @@
"version": "3.0.1",
"bundled": true,
"dev": true,
+ "optional": true,
"requires": {
"ansi-regex": "^2.0.0"
}
@@ -14850,12 +15048,14 @@
"wrappy": {
"version": "1.0.2",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"yallist": {
"version": "3.0.3",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
}
}
},
@@ -15141,6 +15341,16 @@
"xregexp": "4.0.0"
}
},
+ "define-property": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^1.0.2",
+ "isobject": "^3.0.1"
+ }
+ },
"expand-brackets": {
"version": "2.1.4",
"resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
@@ -15233,6 +15443,27 @@
}
}
},
+ "extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "dev": true,
+ "requires": {
+ "assign-symbols": "^1.0.0",
+ "is-extendable": "^1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "^2.0.4"
+ }
+ }
+ }
+ },
"extglob": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
@@ -15312,7 +15543,8 @@
"ansi-regex": {
"version": "2.1.1",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"aproba": {
"version": "1.2.0",
@@ -15333,12 +15565,14 @@
"balanced-match": {
"version": "1.0.0",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"brace-expansion": {
"version": "1.1.11",
"bundled": true,
"dev": true,
+ "optional": true,
"requires": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
@@ -15353,17 +15587,20 @@
"code-point-at": {
"version": "1.1.0",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"concat-map": {
"version": "0.0.1",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"console-control-strings": {
"version": "1.1.0",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"core-util-is": {
"version": "1.0.2",
@@ -15480,7 +15717,8 @@
"inherits": {
"version": "2.0.3",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"ini": {
"version": "1.3.5",
@@ -15492,6 +15730,7 @@
"version": "1.0.0",
"bundled": true,
"dev": true,
+ "optional": true,
"requires": {
"number-is-nan": "^1.0.0"
}
@@ -15506,6 +15745,7 @@
"version": "3.0.4",
"bundled": true,
"dev": true,
+ "optional": true,
"requires": {
"brace-expansion": "^1.1.7"
}
@@ -15513,12 +15753,14 @@
"minimist": {
"version": "0.0.8",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"minipass": {
"version": "2.3.5",
"bundled": true,
"dev": true,
+ "optional": true,
"requires": {
"safe-buffer": "^5.1.2",
"yallist": "^3.0.0"
@@ -15537,6 +15779,7 @@
"version": "0.5.1",
"bundled": true,
"dev": true,
+ "optional": true,
"requires": {
"minimist": "0.0.8"
}
@@ -15617,7 +15860,8 @@
"number-is-nan": {
"version": "1.0.1",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"object-assign": {
"version": "4.1.1",
@@ -15629,6 +15873,7 @@
"version": "1.4.0",
"bundled": true,
"dev": true,
+ "optional": true,
"requires": {
"wrappy": "1"
}
@@ -15714,7 +15959,8 @@
"safe-buffer": {
"version": "5.1.2",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"safer-buffer": {
"version": "2.1.2",
@@ -15750,6 +15996,7 @@
"version": "1.0.2",
"bundled": true,
"dev": true,
+ "optional": true,
"requires": {
"code-point-at": "^1.0.0",
"is-fullwidth-code-point": "^1.0.0",
@@ -15769,6 +16016,7 @@
"version": "3.0.1",
"bundled": true,
"dev": true,
+ "optional": true,
"requires": {
"ansi-regex": "^2.0.0"
}
@@ -15812,12 +16060,14 @@
"wrappy": {
"version": "1.0.2",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"yallist": {
"version": "3.0.3",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
}
}
},
@@ -16172,6 +16422,16 @@
}
}
},
+ "define-property": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^1.0.2",
+ "isobject": "^3.0.1"
+ }
+ },
"eslint-scope": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.2.tgz",
@@ -16274,6 +16534,27 @@
}
}
},
+ "extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "dev": true,
+ "requires": {
+ "assign-symbols": "^1.0.0",
+ "is-extendable": "^1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "^2.0.4"
+ }
+ }
+ }
+ },
"extglob": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
@@ -17036,8 +17317,7 @@
"ansi-regex": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
- "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
- "dev": true
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
},
"camelcase": {
"version": "5.2.0",
@@ -17060,14 +17340,7 @@
"version": "6.0.5",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
"integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
- "dev": true,
- "requires": {
- "nice-try": "^1.0.4",
- "path-key": "^2.0.1",
- "semver": "^5.5.0",
- "shebang-command": "^1.2.0",
- "which": "^1.2.9"
- }
+ "dev": true
},
"execa": {
"version": "1.0.0",
@@ -17172,20 +17445,13 @@
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
"integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
- "dev": true,
- "requires": {
- "end-of-stream": "^1.1.0",
- "once": "^1.3.1"
- }
+ "dev": true
},
"strip-ansi": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
"integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
- "dev": true,
- "requires": {
- "ansi-regex": "^3.0.0"
- }
+ "dev": true
},
"which-module": {
"version": "2.0.0",
diff --git a/package.json b/package.json
index b8a2250..861cb9a 100644
--- a/package.json
+++ b/package.json
@@ -5,11 +5,9 @@
"start": "webpack --mode development -w --debug --devtool inline-source-map",
"build": "NODE_ENV=production webpack --mode production --progress --display-error-details",
"package": "npm run build && script/package.sh",
- "lint": "eslint --ext .jsx,.js src e2e/ambassador/src",
+ "lint": "eslint --ext .jsx,.js src",
"test": "karma start",
- "test:e2e": "karma start e2e/karma.conf.js",
- "ambassador:start": "webpack --mode production -w --debug --context e2e/ambassador --config e2e/ambassador/webpack.config.js --devtool inline-source-map",
- "ambassador:build": "webpack --mode production --context e2e/ambassador --config e2e/ambassador/webpack.config.js"
+ "test:e2e": "mocha --timeout 5000 e2e"
},
"repository": {
"type": "git",
@@ -40,6 +38,7 @@
"karma-sinon": "^1.0.5",
"karma-sourcemap-loader": "^0.3.7",
"karma-webpack": "^3.0.5",
+ "lanthan": "git+https://github.com/ueokande/lanthan.git#master",
"mocha": "^6.0.2",
"node-sass": "^4.11.0",
"preact": "^8.4.2",