From c477c1e6c697ba13b4ea898f055f91ce9c4d6d9c Mon Sep 17 00:00:00 2001 From: ShiKhu Date: Fri, 27 Aug 2021 09:49:26 +0300 Subject: [PATCH 01/39] fix (tracker): rollup mangle --- tracker/tracker/rollup.config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tracker/tracker/rollup.config.js b/tracker/tracker/rollup.config.js index 198119b11..dd7df7a04 100644 --- a/tracker/tracker/rollup.config.js +++ b/tracker/tracker/rollup.config.js @@ -8,5 +8,5 @@ export default { file: 'build/webworker.js', format: 'cjs', }, - plugins: [resolve(), babel({ babelHelpers: 'bundled' }), terser()], + plugins: [resolve(), babel({ babelHelpers: 'bundled' }), terser({ mangle: { reserved: ['$'] } })], }; From 810817575d8519b63a78af46b4ddd1a968d3330f Mon Sep 17 00:00:00 2001 From: ShiKhu Date: Fri, 27 Aug 2021 09:52:41 +0300 Subject: [PATCH 02/39] feat (tracker): 3.2.4 - performance,selector options + beaconSizeLimit + debug_report_edp --- tracker/tracker/package.json | 2 +- tracker/tracker/src/main/app/index.ts | 38 +++++++++++++++---- tracker/tracker/src/main/index.ts | 10 +++-- tracker/tracker/src/main/modules/mouse.ts | 26 ++++++++++--- .../tracker/src/main/modules/performance.ts | 16 +++++++- tracker/tracker/src/messages/webworker.ts | 1 + tracker/tracker/src/webworker/index.ts | 3 +- 7 files changed, 74 insertions(+), 22 deletions(-) diff --git a/tracker/tracker/package.json b/tracker/tracker/package.json index eb760e700..8c6f6c172 100644 --- a/tracker/tracker/package.json +++ b/tracker/tracker/package.json @@ -1,7 +1,7 @@ { "name": "@openreplay/tracker", "description": "The OpenReplay tracker main package", - "version": "3.2.1", + "version": "3.2.4", "keywords": [ "logging", "replay" diff --git a/tracker/tracker/src/main/app/index.ts b/tracker/tracker/src/main/app/index.ts index f7aef2fce..dfe8ba4f3 100644 --- a/tracker/tracker/src/main/app/index.ts +++ b/tracker/tracker/src/main/app/index.ts @@ -19,13 +19,16 @@ export type Options = { local_uuid_key: string; ingestPoint: string; __is_snippet: boolean; + __debug_report_edp: string | null; onStart?: (info: { sessionID: string, sessionToken: string, userUUID: string }) => void; } & ObserverOptions & WebworkerOptions; type Callback = () => void; type CommitCallback = (messages: Array) => void; -export const DEFAULT_INGEST_POINT = 'https://ingest.openreplay.com'; + +// TODO: use backendHost only +export const DEFAULT_INGEST_POINT = 'https://api.openreplay.com/ingest'; export default class App { readonly nodes: Nodes; @@ -57,6 +60,7 @@ export default class App { local_uuid_key: '__openreplay_uuid', ingestPoint: DEFAULT_INGEST_POINT, __is_snippet: false, + __debug_report_edp: null, obscureTextEmails: true, obscureTextNumbers: false, }, @@ -99,8 +103,23 @@ export default class App { this.attachEventListener(window, 'beforeunload', alertWorker, false); this.attachEventListener(document, 'mouseleave', alertWorker, false, false); this.attachEventListener(document, 'visibilitychange', alertWorker, false); - } catch (e) { /* TODO: send report */} + } catch (e) { + this.sendDebugReport("worker_start", e); + } } + + private sendDebugReport(context: string, e: any) { + if(this.options.__debug_report_edp !== null) { + fetch(this.options.__debug_report_edp, { + method: 'POST', + body: JSON.stringify({ + context, + error: `${e}` + }) + }); + } + } + send(message: Message, urgent = false): void { if (!this.isActive) { return; @@ -230,14 +249,17 @@ export default class App { if (r.status === 200) { return r.json() } else { // TODO: handle canceling && 403 - throw new Error("Server error"); + return r.text().then(text => { + throw new Error(`Server error: ${r.status}. ${text}`); + }); } }) .then(r => { - const { token, userUUID, sessionID } = r; + const { token, userUUID, sessionID, beaconSizeLimit } = r; if (typeof token !== 'string' || - typeof userUUID !== 'string') { - throw new Error("Incorrect server response"); + typeof userUUID !== 'string' || + (typeof beaconSizeLimit !== 'number' && typeof beaconSizeLimit !== 'undefined')) { + throw new Error(`Incorrect server response: ${ JSON.stringify(r) }`); } sessionStorage.setItem(this.options.session_token_key, token); localStorage.setItem(this.options.local_uuid_key, userUUID); @@ -247,7 +269,7 @@ export default class App { if (!this.worker) { throw new Error("Stranger things: no worker found after start request"); } - this.worker.postMessage({ token }); + this.worker.postMessage({ token, beaconSizeLimit }); this.startCallbacks.forEach((cb) => cb()); this.observer.observe(); this.ticker.start(); @@ -259,7 +281,7 @@ export default class App { }) .catch(e => { this.stop(); - /* TODO: send report */ + this.sendDebugReport("session_start", e); }) } } diff --git a/tracker/tracker/src/main/index.ts b/tracker/tracker/src/main/index.ts index 0829651cc..e56eab6ec 100644 --- a/tracker/tracker/src/main/index.ts +++ b/tracker/tracker/src/main/index.ts @@ -20,12 +20,14 @@ import CSSRules from './modules/cssrules'; import { IN_BROWSER, deprecationWarn } from './utils'; import { Options as AppOptions } from './app'; -import { Options as ExceptionOptions } from './modules/exception'; import { Options as ConsoleOptions } from './modules/console'; +import { Options as ExceptionOptions } from './modules/exception'; import { Options as InputOptions } from './modules/input'; +import { Options as MouseOptions } from './modules/mouse'; +import { Options as PerformanceOptions } from './modules/performance'; import { Options as TimingOptions } from './modules/timing'; export type Options = Partial< - AppOptions & ConsoleOptions & ExceptionOptions & InputOptions & TimingOptions + AppOptions & ConsoleOptions & ExceptionOptions & InputOptions & MouseOptions & PerformanceOptions & TimingOptions > & { projectID?: number; // For the back compatibility only (deprecated) projectKey: string; @@ -92,9 +94,9 @@ export default class API { Exception(this.app, options); Img(this.app); Input(this.app, options); - Mouse(this.app); + Mouse(this.app, options); Timing(this.app, options); - Performance(this.app); + Performance(this.app, options); Scroll(this.app); Longtasks(this.app); (window as any).__OPENREPLAY__ = (window as any).__OPENREPLAY__ || this; diff --git a/tracker/tracker/src/main/modules/mouse.ts b/tracker/tracker/src/main/modules/mouse.ts index cae32142f..96b973e14 100644 --- a/tracker/tracker/src/main/modules/mouse.ts +++ b/tracker/tracker/src/main/modules/mouse.ts @@ -1,14 +1,10 @@ +import type { Options as FinderOptions } from '../vendors/finder/finder'; import { finder } from '../vendors/finder/finder'; import { normSpaces, hasOpenreplayAttribute, getLabelAttribute } from '../utils'; import App from '../app'; import { MouseMove, MouseClick } from '../../messages'; import { getInputLabel } from './input'; -const selectorMap: {[id:number]: string} = {}; -function getSelector(id: number, target: Element): string { - return selectorMap[id] = selectorMap[id] || finder(target); -} - function getTarget(target: EventTarget | null): Element | null { if (target instanceof Element) { return _getTarget(target); @@ -76,7 +72,18 @@ function getTargetLabel(target: Element): string { return ''; } -export default function (app: App): void { +export interface Options { + selectorFinder: boolean | FinderOptions; +} + +export default function (app: App, opts: Partial): void { + const options: Options = Object.assign( + { + selectorFinder: true, + }, + opts, + ); + let mousePositionX = -1; let mousePositionY = -1; let mousePositionChanged = false; @@ -97,6 +104,13 @@ export default function (app: App): void { } }; + const selectorMap: {[id:number]: string} = {}; + function getSelector(id: number, target: Element): string { + if (options.selectorFinder === false) { return '' } + return selectorMap[id] = selectorMap[id] || + finder(target, options.selectorFinder === true ? undefined : options.selectorFinder); + } + app.attachEventListener( document.documentElement, 'mouseover', diff --git a/tracker/tracker/src/main/modules/performance.ts b/tracker/tracker/src/main/modules/performance.ts index 2a4edd149..7deac3ef5 100644 --- a/tracker/tracker/src/main/modules/performance.ts +++ b/tracker/tracker/src/main/modules/performance.ts @@ -11,7 +11,7 @@ type Perf = { } } -const perf: Perf = IN_BROWSER && 'memory' in performance // works in Chrome only +const perf: Perf = IN_BROWSER && 'performance' in window && 'memory' in performance // works in Chrome only ? performance as any : { memory: {} } @@ -19,7 +19,19 @@ const perf: Perf = IN_BROWSER && 'memory' in performance // works in Chrome only export const deviceMemory = IN_BROWSER ? ((navigator as any).deviceMemory || 0) * 1024 : 0; export const jsHeapSizeLimit = perf.memory.jsHeapSizeLimit || 0; -export default function (app: App): void { +export interface Options { + capturePerformance: boolean; +} + +export default function (app: App, opts: Partial): void { + const options: Options = Object.assign( + { + capturePerformance: true, + }, + opts, + ); + if (!options.capturePerformance) { return; } + let frames: number | undefined; let ticks: number | undefined; diff --git a/tracker/tracker/src/messages/webworker.ts b/tracker/tracker/src/messages/webworker.ts index e5eb8eef7..e4bc97818 100644 --- a/tracker/tracker/src/messages/webworker.ts +++ b/tracker/tracker/src/messages/webworker.ts @@ -11,6 +11,7 @@ type Settings = { pageNo?: number; startTimestamp?: number; timeAdjustment?: number; + beaconSizeLimit?: number; } & Partial; export type WorkerMessageData = null | "stop" | Settings | Array<{ _id: number }>; \ No newline at end of file diff --git a/tracker/tracker/src/webworker/index.ts b/tracker/tracker/src/webworker/index.ts index 5553610ca..1c6cde40f 100644 --- a/tracker/tracker/src/webworker/index.ts +++ b/tracker/tracker/src/webworker/index.ts @@ -6,7 +6,7 @@ import type { WorkerMessageData } from '../messages/webworker'; const SEND_INTERVAL = 20 * 1000; -const BEACON_SIZE_LIMIT = 1e6 // Limit is set in the backend/services/http +let BEACON_SIZE_LIMIT = 1e6 // Limit is set in the backend/services/http let beaconSize = 4 * 1e5; // Default 400kB @@ -123,6 +123,7 @@ self.onmessage = ({ data }: MessageEvent) => { timeAdjustment = data.timeAdjustment || timeAdjustment; MAX_ATTEMPTS_COUNT = data.connAttemptCount || MAX_ATTEMPTS_COUNT; ATTEMPT_TIMEOUT = data.connAttemptGap || ATTEMPT_TIMEOUT; + BEACON_SIZE_LIMIT = data.beaconSizeLimit || BEACON_SIZE_LIMIT; beaconSize = Math.min(BEACON_SIZE_LIMIT, data.beaconSize || beaconSize); if (writer.isEmpty()) { writeBatchMeta(); From ecbd3b2673e1503bec8c258e50e1502925a3f937 Mon Sep 17 00:00:00 2001 From: ShiKhu Date: Fri, 27 Aug 2021 09:54:52 +0300 Subject: [PATCH 03/39] fix(tracker): 3.2.5 - merge handleError and handlErrorEvent api --- tracker/tracker/package.json | 2 +- tracker/tracker/src/main/index.ts | 16 +++++----------- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/tracker/tracker/package.json b/tracker/tracker/package.json index 8c6f6c172..1ed351baf 100644 --- a/tracker/tracker/package.json +++ b/tracker/tracker/package.json @@ -1,7 +1,7 @@ { "name": "@openreplay/tracker", "description": "The OpenReplay tracker main package", - "version": "3.2.4", + "version": "3.2.5", "keywords": [ "logging", "replay" diff --git a/tracker/tracker/src/main/index.ts b/tracker/tracker/src/main/index.ts index e56eab6ec..79e2cbee8 100644 --- a/tracker/tracker/src/main/index.ts +++ b/tracker/tracker/src/main/index.ts @@ -225,18 +225,12 @@ export default class API { } } - handleError = (e: Error) => { - if (e instanceof Error && this.app !== null) { + handleError = (e: Error | ErrorEvent | PromiseRejectionEvent) => { + if (this.app === null) { return; } + if (e instanceof Error) { this.app.send(getExceptionMessage(e, [])); - } - } - - handleErrorEvent = (e: ErrorEvent | PromiseRejectionEvent) => { - if ( - (e instanceof ErrorEvent || - ('PromiseRejectionEvent' in window && e instanceof PromiseRejectionEvent) - ) && - this.app !== null + } else if (e instanceof ErrorEvent || + ('PromiseRejectionEvent' in window && e instanceof PromiseRejectionEvent) ) { const msg = getExceptionMessageFromEvent(e); if (msg != null) { From 13e2ad7c085a8cc0409ff7cce8c2402e235bde73 Mon Sep 17 00:00:00 2001 From: Taha Yassine Kraiem Date: Tue, 31 Aug 2021 16:39:26 +0100 Subject: [PATCH 04/39] feat(api): insights default journey --- api/app.py | 3 +- api/chalicelib/blueprints/subs/bp_insights.py | 58 ++++++++++ api/chalicelib/core/insights.py | 100 ++++++++++++++++++ .../db/init_dbs/postgresql/1.4.0/1.4.0.sql | 5 + 4 files changed, 165 insertions(+), 1 deletion(-) create mode 100644 api/chalicelib/blueprints/subs/bp_insights.py create mode 100644 api/chalicelib/core/insights.py create mode 100644 scripts/helm/db/init_dbs/postgresql/1.4.0/1.4.0.sql diff --git a/api/app.py b/api/app.py index e67810de5..92224f99e 100644 --- a/api/app.py +++ b/api/app.py @@ -7,7 +7,7 @@ from chalicelib.blueprints import bp_authorizers from chalicelib.blueprints import bp_core, bp_core_crons from chalicelib.blueprints.app import v1_api from chalicelib.blueprints import bp_core_dynamic, bp_core_dynamic_crons -from chalicelib.blueprints.subs import bp_dashboard +from chalicelib.blueprints.subs import bp_dashboard,bp_insights from chalicelib.utils import helper from chalicelib.utils import pg_client from chalicelib.utils.helper import environ @@ -106,4 +106,5 @@ app.register_blueprint(bp_core_crons.app) app.register_blueprint(bp_core_dynamic.app) app.register_blueprint(bp_core_dynamic_crons.app) app.register_blueprint(bp_dashboard.app) +app.register_blueprint(bp_insights.app) app.register_blueprint(v1_api.app) diff --git a/api/chalicelib/blueprints/subs/bp_insights.py b/api/chalicelib/blueprints/subs/bp_insights.py new file mode 100644 index 000000000..062e8fdc8 --- /dev/null +++ b/api/chalicelib/blueprints/subs/bp_insights.py @@ -0,0 +1,58 @@ +from chalice import Blueprint +from chalicelib.utils import helper +from chalicelib import _overrides + +from chalicelib.core import dashboard, insights +from chalicelib.core import metadata + +app = Blueprint(__name__) +_overrides.chalice_app(app) + + +# +# @app.route('/{projectId}/dashboard/metadata', methods=['GET']) +# def get_metadata_map(projectId, context): +# metamap = [] +# for m in metadata.get(project_id=projectId): +# metamap.append({"name": m["key"], "key": f"metadata{m['index']}"}) +# return {"data": metamap} +# +# +@app.route('/{projectId}/insights/journey', methods=['GET', 'POST']) +def get_insights_journey(projectId, context): + data = app.current_request.json_body + if data is None: + data = {} + params = app.current_request.query_params + args = dashboard.dashboard_args(params) + + return {"data": insights.get_journey(project_id=projectId, **{**data, **args})} + +# +# +# @app.route('/{projectId}/dashboard/{widget}/search', methods=['GET']) +# def get_dashboard_autocomplete(projectId, widget, context): +# params = app.current_request.query_params +# if params is None or params.get('q') is None or len(params.get('q')) == 0: +# return {"data": []} +# params['q'] = '^' + params['q'] +# +# if widget in ['performance']: +# data = dashboard.search(params.get('q', ''), params.get('type', ''), project_id=projectId, +# platform=params.get('platform', None), performance=True) +# elif widget in ['pages', 'pages_dom_buildtime', 'top_metrics', 'time_to_render', +# 'impacted_sessions_by_slow_pages', 'pages_response_time']: +# data = dashboard.search(params.get('q', ''), params.get('type', ''), project_id=projectId, +# platform=params.get('platform', None), pages_only=True) +# elif widget in ['resources_loading_time']: +# data = dashboard.search(params.get('q', ''), params.get('type', ''), project_id=projectId, +# platform=params.get('platform', None), performance=False) +# elif widget in ['time_between_events', 'events']: +# data = dashboard.search(params.get('q', ''), params.get('type', ''), project_id=projectId, +# platform=params.get('platform', None), performance=False, events_only=True) +# elif widget in ['metadata']: +# data = dashboard.search(params.get('q', ''), None, project_id=projectId, +# platform=params.get('platform', None), metadata=True, key=params.get("key")) +# else: +# return {"errors": [f"unsupported widget: {widget}"]} +# return {'data': data} diff --git a/api/chalicelib/core/insights.py b/api/chalicelib/core/insights.py new file mode 100644 index 000000000..7e12b9dcc --- /dev/null +++ b/api/chalicelib/core/insights.py @@ -0,0 +1,100 @@ +from chalicelib.core import metadata +from chalicelib.utils import args_transformer +from chalicelib.utils import helper, dev +from chalicelib.utils import pg_client +from chalicelib.utils.TimeUTC import TimeUTC +from chalicelib.utils.metrics_helper import __get_step_size +import math +from chalicelib.core.dashboard import __get_constraints, __get_constraint_values + + +def __transform_journey(rows): + nodes = [] + links = [] + for r in rows: + source = r["source_event"][r["source_event"].index("_"):] + target = r["target_event"][r["target_event"].index("_"):] + if source not in nodes: + nodes.append(source) + if target not in nodes: + nodes.append(target) + links.append({"source": nodes.index(source), "target": nodes.index(target), "value": r["value"]}) + return {"nodes": nodes, "links": sorted(links, key=lambda x: x["value"], reverse=True)} + + +@dev.timed +def get_journey(project_id, startTimestamp=TimeUTC.now(delta_days=-1), endTimestamp=TimeUTC.now(), **args): + pg_sub_query_subset = __get_constraints(project_id=project_id, data=args, duration=True, main_table="sessions", + time_constraint=True) + # pg_sub_query_chart = __get_constraints(project_id=project_id, time_constraint=False, + # chart=True, data=args, main_table="events.pages", time_column="timestamp", + # project=False, duration=False) + # pg_sub_query_subset.append("m_errors.source = 'js_exception'") + # pg_sub_query_subset.append("pages.timestamp>=%(startTimestamp)s") + # pg_sub_query_subset.append("pages.timestamp<%(endTimestamp)s") + # with pg_client.PostgresClient() as cur: + # pg_query = f"""WITH errors AS (SELECT DISTINCT session_id, timestamp + # FROM events.errors + # INNER JOIN public.errors AS m_errors USING (error_id) + # WHERE {" AND ".join(pg_sub_query_subset)} + # ) + # SELECT generated_timestamp AS timestamp, + # COALESCE(COUNT(sessions), 0) AS count + # FROM generate_series(%(startTimestamp)s, %(endTimestamp)s, %(step_size)s) AS generated_timestamp + # LEFT JOIN LATERAL ( SELECT session_id + # FROM errors + # WHERE {" AND ".join(pg_sub_query_chart)} + # ) AS sessions ON (TRUE) + # GROUP BY generated_timestamp + # ORDER BY generated_timestamp;""" + # params = {"step_size": step_size, "project_id": project_id, "startTimestamp": startTimestamp, + # "endTimestamp": endTimestamp, **__get_constraint_values(args)} + + with pg_client.PostgresClient() as cur: + pg_query = f"""SELECT source_event, + target_event, + MAX(target_id) max_target_id, + MAX(source_id) max_source_id, + count(*) AS value + + FROM (SELECT event_number || '_' || path as target_event, + message_id as target_id, + LAG(event_number || '_' || path, 1) OVER ( PARTITION BY session_rank ) AS source_event, + LAG(message_id, 1) OVER ( PARTITION BY session_rank ) AS source_id + FROM (SELECT path, + session_rank, + message_id, + ROW_NUMBER() OVER ( PARTITION BY session_rank ORDER BY timestamp ) AS event_number + FROM (SELECT message_id, + timestamp, + path, + SUM(new_session) OVER (ORDER BY session_id, timestamp) AS session_rank + FROM (SELECT *, + CASE + WHEN source_timestamp IS NULL THEN 1 + ELSE 0 END AS new_session + FROM (SELECT session_id, + message_id, + timestamp, + path, + LAG(pages.timestamp) + OVER ( + PARTITION BY session_id + ORDER BY timestamp) AS source_timestamp + FROM events.pages + INNER JOIN public.sessions USING (session_id) + WHERE {" AND ".join(pg_sub_query_subset)} + ) AS related_events) AS ranked_events) AS processed) AS sorted_events + WHERE event_number <= 4) AS final + WHERE source_event IS NOT NULL + and target_event IS NOT NULL + GROUP BY source_event, target_event + ORDER BY value DESC + LIMIT 20;""" + params = {"project_id": project_id, "startTimestamp": startTimestamp, + "endTimestamp": endTimestamp, **__get_constraint_values(args)} + print(cur.mogrify(pg_query, params)) + cur.execute(cur.mogrify(pg_query, params)) + rows = cur.fetchall() + + return __transform_journey(rows) diff --git a/scripts/helm/db/init_dbs/postgresql/1.4.0/1.4.0.sql b/scripts/helm/db/init_dbs/postgresql/1.4.0/1.4.0.sql new file mode 100644 index 000000000..dd8f6f318 --- /dev/null +++ b/scripts/helm/db/init_dbs/postgresql/1.4.0/1.4.0.sql @@ -0,0 +1,5 @@ +BEGIN; +CREATE INDEX pages_session_id_timestamp_idx ON events.pages (session_id, timestamp); + + +COMMIT; \ No newline at end of file From 9ae7d97e79d89bcba40ed97e8e79eafe0557ac94 Mon Sep 17 00:00:00 2001 From: Taha Yassine Kraiem Date: Wed, 1 Sep 2021 18:50:14 +0100 Subject: [PATCH 05/39] feat(api): insights journey search --- api/chalicelib/core/insights.py | 91 +++++++++++++++++---------------- 1 file changed, 48 insertions(+), 43 deletions(-) diff --git a/api/chalicelib/core/insights.py b/api/chalicelib/core/insights.py index 7e12b9dcc..d470e1537 100644 --- a/api/chalicelib/core/insights.py +++ b/api/chalicelib/core/insights.py @@ -1,4 +1,4 @@ -from chalicelib.core import metadata +from chalicelib.core import sessions_metas from chalicelib.utils import args_transformer from chalicelib.utils import helper, dev from chalicelib.utils import pg_client @@ -22,33 +22,33 @@ def __transform_journey(rows): return {"nodes": nodes, "links": sorted(links, key=lambda x: x["value"], reverse=True)} +JOURNEY_DEPTH = 5 +JOURNEY_TYPES = { + "PAGES": {"table": "events.pages", "column": "base_path", "table_id": "message_id"}, + "CLICK": {"table": "events.clicks", "column": "label", "table_id": "message_id"}, + "VIEW": {"table": "events_ios.views", "column": "name", "table_id": "seq_index"}, + "EVENT": {"table": "events_common.customs", "column": "name", "table_id": "seq_index"} +} + + @dev.timed -def get_journey(project_id, startTimestamp=TimeUTC.now(delta_days=-1), endTimestamp=TimeUTC.now(), **args): +def get_journey(project_id, startTimestamp=TimeUTC.now(delta_days=-1), endTimestamp=TimeUTC.now(), filters=[], **args): pg_sub_query_subset = __get_constraints(project_id=project_id, data=args, duration=True, main_table="sessions", time_constraint=True) - # pg_sub_query_chart = __get_constraints(project_id=project_id, time_constraint=False, - # chart=True, data=args, main_table="events.pages", time_column="timestamp", - # project=False, duration=False) - # pg_sub_query_subset.append("m_errors.source = 'js_exception'") - # pg_sub_query_subset.append("pages.timestamp>=%(startTimestamp)s") - # pg_sub_query_subset.append("pages.timestamp<%(endTimestamp)s") - # with pg_client.PostgresClient() as cur: - # pg_query = f"""WITH errors AS (SELECT DISTINCT session_id, timestamp - # FROM events.errors - # INNER JOIN public.errors AS m_errors USING (error_id) - # WHERE {" AND ".join(pg_sub_query_subset)} - # ) - # SELECT generated_timestamp AS timestamp, - # COALESCE(COUNT(sessions), 0) AS count - # FROM generate_series(%(startTimestamp)s, %(endTimestamp)s, %(step_size)s) AS generated_timestamp - # LEFT JOIN LATERAL ( SELECT session_id - # FROM errors - # WHERE {" AND ".join(pg_sub_query_chart)} - # ) AS sessions ON (TRUE) - # GROUP BY generated_timestamp - # ORDER BY generated_timestamp;""" - # params = {"step_size": step_size, "project_id": project_id, "startTimestamp": startTimestamp, - # "endTimestamp": endTimestamp, **__get_constraint_values(args)} + event_start = None + event_table = JOURNEY_TYPES["PAGES"]["table"] + event_column = JOURNEY_TYPES["PAGES"]["column"] + event_table_id = JOURNEY_TYPES["PAGES"]["table_id"] + extra_values = {} + for f in filters: + if f["type"] == "START_POINT": + event_start = f["value"] + elif f["type"] == "EVENT_TYPE" and JOURNEY_TYPES.get(f["value"]): + event_table = JOURNEY_TYPES[f["value"]]["table"] + event_column = JOURNEY_TYPES[f["value"]]["column"] + elif f["type"] in [sessions_metas.meta_type.USERID, sessions_metas.meta_type.USERID_IOS]: + pg_sub_query_subset.append(f"sessions.user_id = %(user_id)s") + extra_values["user_id"] = f["value"] with pg_client.PostgresClient() as cur: pg_query = f"""SELECT source_event, @@ -57,42 +57,47 @@ def get_journey(project_id, startTimestamp=TimeUTC.now(delta_days=-1), endTimest MAX(source_id) max_source_id, count(*) AS value - FROM (SELECT event_number || '_' || path as target_event, - message_id as target_id, - LAG(event_number || '_' || path, 1) OVER ( PARTITION BY session_rank ) AS source_event, - LAG(message_id, 1) OVER ( PARTITION BY session_rank ) AS source_id - FROM (SELECT path, + FROM (SELECT event_number || '_' || value as target_event, + message_id AS target_id, + LAG(event_number || '_' || value, 1) OVER ( PARTITION BY session_rank ) AS source_event, + LAG(message_id, 1) OVER ( PARTITION BY session_rank ) AS source_id + FROM (SELECT value, session_rank, message_id, ROW_NUMBER() OVER ( PARTITION BY session_rank ORDER BY timestamp ) AS event_number - FROM (SELECT message_id, + + {f"FROM (SELECT * FROM (SELECT *, MIN(mark) OVER ( PARTITION BY session_id , session_rank ORDER BY timestamp ) AS max FROM (SELECT *, CASE WHEN value = %(event_start)s THEN timestamp ELSE NULL END as mark" + if event_start else ""} + + FROM (SELECT session_id, + message_id, timestamp, - path, + value, SUM(new_session) OVER (ORDER BY session_id, timestamp) AS session_rank FROM (SELECT *, CASE WHEN source_timestamp IS NULL THEN 1 ELSE 0 END AS new_session FROM (SELECT session_id, - message_id, + {event_table_id} AS message_id, timestamp, - path, - LAG(pages.timestamp) - OVER ( - PARTITION BY session_id - ORDER BY timestamp) AS source_timestamp - FROM events.pages - INNER JOIN public.sessions USING (session_id) + {event_column} AS value, + LAG(timestamp) + OVER (PARTITION BY session_id ORDER BY timestamp) AS source_timestamp + FROM {event_table} INNER JOIN public.sessions USING (session_id) WHERE {" AND ".join(pg_sub_query_subset)} - ) AS related_events) AS ranked_events) AS processed) AS sorted_events - WHERE event_number <= 4) AS final + ) AS related_events) AS ranked_events) AS processed + {") AS marked) AS maxed WHERE timestamp >= max) AS filtered" if event_start else ""} + ) AS sorted_events + WHERE event_number <= %(JOURNEY_DEPTH)s) AS final WHERE source_event IS NOT NULL and target_event IS NOT NULL GROUP BY source_event, target_event ORDER BY value DESC LIMIT 20;""" params = {"project_id": project_id, "startTimestamp": startTimestamp, - "endTimestamp": endTimestamp, **__get_constraint_values(args)} + "endTimestamp": endTimestamp, "event_start": event_start, "JOURNEY_DEPTH": JOURNEY_DEPTH, + **__get_constraint_values(args), **extra_values} print(cur.mogrify(pg_query, params)) cur.execute(cur.mogrify(pg_query, params)) rows = cur.fetchall() From 5c87b9d59d215154e7d74276bc05fe3f1556f579 Mon Sep 17 00:00:00 2001 From: ShiKhu Date: Thu, 2 Sep 2021 19:30:11 +0200 Subject: [PATCH 06/39] feat(tracker): 3.3.0 start return promise --- tracker/tracker/package-lock.json | 2925 +------------------------ tracker/tracker/package.json | 5 +- tracker/tracker/src/main/app/index.ts | 36 +- 3 files changed, 26 insertions(+), 2940 deletions(-) diff --git a/tracker/tracker/package-lock.json b/tracker/tracker/package-lock.json index 62bc7c1b6..2d6f47ed9 100644 --- a/tracker/tracker/package-lock.json +++ b/tracker/tracker/package-lock.json @@ -1,6 +1,6 @@ { "name": "@openreplay/tracker", - "version": "3.2.1", + "version": "3.2.5", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -503,15 +503,6 @@ "uri-js": "^4.2.2" } }, - "ansi-colors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", - "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", - "dev": true, - "requires": { - "ansi-wrap": "^0.1.0" - } - }, "ansi-escapes": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.0.tgz", @@ -521,15 +512,6 @@ "type-fest": "^0.8.1" } }, - "ansi-gray": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", - "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, "ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", @@ -545,37 +527,6 @@ "color-convert": "^1.9.0" } }, - "ansi-wrap": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", - "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", - "dev": true - }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "append-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", - "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", - "dev": true, - "requires": { - "buffer-equal": "^1.0.0" - } - }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", - "dev": true - }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -585,265 +536,30 @@ "sprintf-js": "~1.0.2" } }, - "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 - }, - "arr-filter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz", - "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=", - "dev": true, - "requires": { - "make-iterator": "^1.0.0" - } - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz", - "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=", - "dev": true, - "requires": { - "make-iterator": "^1.0.0" - } - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", - "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", - "dev": true - }, - "array-initial": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz", - "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=", - "dev": true, - "requires": { - "array-slice": "^1.0.0", - "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 - } - } - }, - "array-last": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz", - "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==", - "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 - } - } - }, - "array-slice": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", - "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", - "dev": true - }, - "array-sort": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz", - "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==", - "dev": true, - "requires": { - "default-compare": "^1.0.0", - "get-value": "^2.0.6", - "kind-of": "^5.0.2" - }, - "dependencies": { - "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 - } - } - }, "array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true }, - "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 - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, "astral-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", "dev": true }, - "async-done": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", - "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.2", - "process-nextick-args": "^2.0.0", - "stream-exhaust": "^1.0.1" - } - }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true - }, - "async-settle": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz", - "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=", - "dev": true, - "requires": { - "async-done": "^1.2.2" - } - }, - "atob": { - "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 - }, - "bach": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz", - "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=", - "dev": true, - "requires": { - "arr-filter": "^1.1.1", - "arr-flatten": "^1.0.1", - "arr-map": "^2.0.0", - "array-each": "^1.0.0", - "array-initial": "^1.0.0", - "array-last": "^1.1.1", - "async-done": "^1.2.2", - "async-settle": "^1.0.0", - "now-and-later": "^2.0.0" - } - }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.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" - } - }, - "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" - } - } - } - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true - }, "binaryextensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-2.3.0.tgz", "integrity": "sha512-nAihlQsYGyc5Bwq6+EsubvANYGExeJKHDO3RjnvwU042fawQTQfM3Kxn7IHUXQOz4bzfwsGYYHGSvXyW4zOGLg==", "dev": true }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "optional": true, - "requires": { - "file-uri-to-path": "1.0.0" - } - }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -854,41 +570,6 @@ "concat-map": "0.0.1" } }, - "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" - } - } - } - }, - "buffer-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", - "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", - "dev": true - }, "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", @@ -901,35 +582,12 @@ "integrity": "sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==", "dev": true }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -947,78 +605,6 @@ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - }, - "dependencies": { - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "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" - } - } - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - } - } - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "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" - } - } - } - }, "cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -1034,116 +620,12 @@ "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", "dev": true }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "dev": true - }, - "clone-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", - "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", - "dev": true - }, - "clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", - "dev": true - }, - "cloneable-readable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", - "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "process-nextick-args": "^2.0.0", - "readable-stream": "^2.3.5" - } - }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", "dev": true }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "collection-map": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz", - "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=", - "dev": true, - "requires": { - "arr-map": "^2.0.2", - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - } - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -1159,42 +641,18 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true - }, "commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, "convert-source-map": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", @@ -1204,28 +662,6 @@ "safe-buffer": "~5.1.1" } }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "copy-props": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.4.tgz", - "integrity": "sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A==", - "dev": true, - "requires": { - "each-props": "^1.3.0", - "is-plain-object": "^2.0.1" - } - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", @@ -1247,16 +683,6 @@ } } }, - "d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "dev": true, - "requires": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", @@ -1266,18 +692,6 @@ "ms": "^2.1.1" } }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, "deep-freeze": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/deep-freeze/-/deep-freeze-0.0.1.tgz", @@ -1296,85 +710,6 @@ "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", "dev": true }, - "default-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", - "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", - "dev": true, - "requires": { - "kind-of": "^5.0.2" - }, - "dependencies": { - "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 - } - } - }, - "default-resolution": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz", - "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=", - "dev": true - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.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==", - "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" - } - } - } - }, - "detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", - "dev": true - }, "dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -1401,28 +736,6 @@ "esutils": "^2.0.2" } }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "each-props": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz", - "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.1", - "object.defaults": "^1.1.0" - } - }, "editions": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/editions/-/editions-2.3.1.tgz", @@ -1439,30 +752,12 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, "errlop": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/errlop/-/errlop-2.2.0.tgz", "integrity": "sha512-e64Qj9+4aZzjzzFpZC7p5kmm/ccCrbLhAJplhsDXQFs87XTsXwOpH4s1Io2s90Tau/8r2j9f4l/thhDevRjzxw==", "dev": true }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, "error-stack-parser": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz", @@ -1471,56 +766,12 @@ "stackframe": "^1.1.1" } }, - "es5-ext": { - "version": "0.10.53", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", - "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", - "dev": true, - "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.3", - "next-tick": "~1.0.0" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, "es6-promisify": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-6.1.1.tgz", "integrity": "sha512-HBL8I3mIki5C1Cc9QjKUenHtnG0A5/xA8Q/AllRcfiwl2CZFXGK7ddBiCoRwAix4i2KxcQfjtIVcrVbB3vbmwg==", "dev": true }, - "es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "dev": true, - "requires": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, - "es6-weak-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", - "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.1" - } - }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -1667,109 +918,6 @@ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, - "expand-brackets": { - "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": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "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" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "ext": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", - "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", - "dev": true, - "requires": { - "type": "^2.0.0" - }, - "dependencies": { - "type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz", - "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==", - "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 - }, - "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" - } - } - } - }, "external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", @@ -1781,83 +929,6 @@ "tmp": "^0.0.33" } }, - "extglob": { - "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" - } - }, - "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" - } - }, - "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" - } - } - } - }, - "fancy-log": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", - "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", - "dev": true, - "requires": { - "ansi-gray": "^0.1.1", - "color-support": "^1.1.3", - "parse-node-version": "^1.0.0", - "time-stamp": "^1.0.0" - } - }, "fast-deep-equal": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", @@ -1968,77 +1039,6 @@ "flat-cache": "^2.0.1" } }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, - "optional": true - }, - "fill-range": { - "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" - } - } - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "findup-sync": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", - "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", - "dev": true, - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - } - }, - "fined": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", - "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "is-plain-object": "^2.0.3", - "object.defaults": "^1.1.0", - "object.pick": "^1.2.0", - "parse-filepath": "^1.0.1" - } - }, - "flagged-respawn": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", - "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", - "dev": true - }, "flat-cache": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", @@ -2056,73 +1056,12 @@ "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", "dev": true }, - "flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "fs-mkdirp-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", - "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "through2": "^2.0.3" - } - }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, - "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "dev": true, - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, "functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", @@ -2135,18 +1074,6 @@ "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", "dev": true }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, "glob": { "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", @@ -2170,83 +1097,6 @@ "is-glob": "^4.0.1" } }, - "glob-stream": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", - "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", - "dev": true, - "requires": { - "extend": "^3.0.0", - "glob": "^7.1.1", - "glob-parent": "^3.1.0", - "is-negated-glob": "^1.0.0", - "ordered-read-streams": "^1.0.0", - "pumpify": "^1.3.5", - "readable-stream": "^2.1.5", - "remove-trailing-separator": "^1.0.1", - "to-absolute-glob": "^2.0.0", - "unique-stream": "^2.0.2" - }, - "dependencies": { - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - } - }, - "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" - } - } - } - }, - "glob-watcher": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.3.tgz", - "integrity": "sha512-8tWsULNEPHKQ2MR4zXuzSmqbdyV5PtwwCaWSGQ1WwHsJ07ilNeN1JB8ntxhckbnpSHaf9dXFUHzIWvm1I13dsg==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-done": "^1.2.0", - "chokidar": "^2.0.0", - "is-negated-glob": "^1.0.0", - "just-debounce": "^1.0.0", - "object.defaults": "^1.1.0" - } - }, - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - } - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - } - }, "globals": { "version": "12.3.0", "resolved": "https://registry.npmjs.org/globals/-/globals-12.3.0.tgz", @@ -2280,166 +1130,12 @@ } } }, - "glogg": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", - "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", - "dev": true, - "requires": { - "sparkles": "^1.0.0" - } - }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - }, - "gulp": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz", - "integrity": "sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==", - "dev": true, - "requires": { - "glob-watcher": "^5.0.3", - "gulp-cli": "^2.2.0", - "undertaker": "^1.2.1", - "vinyl-fs": "^3.0.0" - }, - "dependencies": { - "gulp-cli": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.3.0.tgz", - "integrity": "sha512-zzGBl5fHo0EKSXsHzjspp3y5CONegCm8ErO5Qh0UzFzk2y4tMvzLWhoDokADbarfZRL2pGpRp7yt6gfJX4ph7A==", - "dev": true, - "requires": { - "ansi-colors": "^1.0.1", - "archy": "^1.0.0", - "array-sort": "^1.0.0", - "color-support": "^1.1.3", - "concat-stream": "^1.6.0", - "copy-props": "^2.0.1", - "fancy-log": "^1.3.2", - "gulplog": "^1.0.0", - "interpret": "^1.4.0", - "isobject": "^3.0.1", - "liftoff": "^3.1.0", - "matchdep": "^2.0.0", - "mute-stdout": "^1.0.0", - "pretty-hrtime": "^1.0.0", - "replace-homedir": "^1.0.0", - "semver-greatest-satisfied-range": "^1.1.0", - "v8flags": "^3.2.0", - "yargs": "^7.1.0" - } - } - } - }, - "gulp-typescript": { - "version": "6.0.0-alpha.1", - "resolved": "https://registry.npmjs.org/gulp-typescript/-/gulp-typescript-6.0.0-alpha.1.tgz", - "integrity": "sha512-KoT0TTfjfT7w3JItHkgFH1T/zK4oXWC+a8xxKfniRfVcA0Fa1bKrIhztYelYmb+95RB80OLMBreknYkdwzdi2Q==", - "dev": true, - "requires": { - "ansi-colors": "^4.1.1", - "plugin-error": "^1.0.1", - "source-map": "^0.7.3", - "through2": "^3.0.1", - "vinyl": "^2.2.0", - "vinyl-fs": "^3.0.3" - }, - "dependencies": { - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - }, - "through2": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", - "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", - "dev": true, - "requires": { - "readable-stream": "2 || 3" - } - } - } - }, - "gulplog": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", - "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", - "dev": true, - "requires": { - "glogg": "^1.0.0" - } - }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "dev": true, - "requires": { - "parse-passwd": "^1.0.0" - } - }, - "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", - "dev": true - }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -2487,12 +1183,6 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true - }, "inquirer": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.4.tgz", @@ -2514,114 +1204,6 @@ "through": "^2.3.6" } }, - "interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "dev": true - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - }, - "is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", - "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", - "dev": true, - "requires": { - "is-relative": "^1.0.0", - "is-windows": "^1.0.1" - } - }, - "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" - } - } - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-data-descriptor": { - "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" - } - } - } - }, - "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" - }, - "dependencies": { - "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 - } - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -2649,101 +1231,18 @@ "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", "dev": true }, - "is-negated-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", - "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", - "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" - } - } - } - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, "is-promise": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", "dev": true }, - "is-relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", - "dev": true, - "requires": { - "is-unc-path": "^1.0.0" - } - }, - "is-unc-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", - "dev": true, - "requires": { - "unc-path-regex": "^0.1.2" - } - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "is-valid-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", - "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, "istextorbinary": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-2.6.0.tgz", @@ -2833,55 +1332,6 @@ } } }, - "just-debounce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.0.0.tgz", - "integrity": "sha1-h/zPrv/AtozRnVX2cilD+SnqNeo=", - "dev": true - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "last-run": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", - "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=", - "dev": true, - "requires": { - "default-resolution": "^2.0.0", - "es6-weak-map": "^2.0.1" - } - }, - "lazystream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", - "dev": true, - "requires": { - "readable-stream": "^2.0.5" - } - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "^1.0.0" - } - }, - "lead": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", - "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", - "dev": true, - "requires": { - "flush-write-stream": "^1.0.2" - } - }, "levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", @@ -2892,100 +1342,12 @@ "type-check": "~0.3.2" } }, - "liftoff": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz", - "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==", - "dev": true, - "requires": { - "extend": "^3.0.0", - "findup-sync": "^3.0.0", - "fined": "^1.0.1", - "flagged-respawn": "^1.0.0", - "is-plain-object": "^2.0.4", - "object.map": "^1.0.0", - "rechoir": "^0.6.2", - "resolve": "^1.1.7" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - } - }, "lodash": { "version": "4.17.15", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true }, - "make-iterator": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", - "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "matchdep": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", - "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=", - "dev": true, - "requires": { - "findup-sync": "^2.0.0", - "micromatch": "^3.0.4", - "resolve": "^1.4.0", - "stack-trace": "0.0.10" - }, - "dependencies": { - "findup-sync": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", - "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", - "dev": true, - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^3.1.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - } - }, - "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" - } - } - } - }, "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -2998,27 +1360,6 @@ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true }, - "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" - } - }, "mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", @@ -3040,27 +1381,6 @@ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "dev": true }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "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" - } - } - } - }, "mkdirp": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", @@ -3076,205 +1396,24 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "mute-stdout": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", - "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==", - "dev": true - }, "mute-stream": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, - "nan": { - "version": "2.14.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", - "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==", - "dev": true, - "optional": true - }, - "nanomatch": { - "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", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", - "dev": true - }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "normalize-path": { - "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" - } - }, - "now-and-later": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", - "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", - "dev": true, - "requires": { - "once": "^1.3.2" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "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" - } - }, - "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" - } - } - } - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, - "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - } - }, - "object.defaults": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", - "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", - "dev": true, - "requires": { - "array-each": "^1.0.1", - "array-slice": "^1.0.0", - "for-own": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "object.map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", - "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", - "dev": true, - "requires": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "object.reduce": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz", - "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=", - "dev": true, - "requires": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - } - }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -3307,24 +1446,6 @@ "word-wrap": "~1.2.3" } }, - "ordered-read-streams": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", - "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", - "dev": true, - "requires": { - "readable-stream": "^2.0.1" - } - }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "dev": true, - "requires": { - "lcid": "^1.0.0" - } - }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", @@ -3340,59 +1461,6 @@ "callsites": "^3.0.0" } }, - "parse-filepath": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", - "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", - "dev": true, - "requires": { - "is-absolute": "^1.0.0", - "map-cache": "^0.2.0", - "path-root": "^0.1.1" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "parse-node-version": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", - "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", - "dev": true - }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -3411,77 +1479,12 @@ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", "dev": true }, - "path-root": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", - "dev": true, - "requires": { - "path-root-regex": "^0.1.0" - } - }, - "path-root-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", - "dev": true - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, "picomatch": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", "dev": true }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, - "plugin-error": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", - "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", - "dev": true, - "requires": { - "ansi-colors": "^1.0.1", - "arr-diff": "^4.0.0", - "arr-union": "^3.1.0", - "extend-shallow": "^3.0.2" - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", @@ -3503,45 +1506,12 @@ "fast-diff": "^1.1.2" } }, - "pretty-hrtime": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", - "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, "progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - } - }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -3557,134 +1527,12 @@ "safe-buffer": "^5.1.0" } }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "readdirp": { - "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" - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "requires": { - "resolve": "^1.1.6" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, "regexpp": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", "dev": true }, - "remove-bom-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", - "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5", - "is-utf8": "^0.2.1" - } - }, - "remove-bom-stream": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", - "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", - "dev": true, - "requires": { - "remove-bom-buffer": "^3.0.0", - "safe-buffer": "^5.1.0", - "through2": "^2.0.3" - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "replace-ext": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", - "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", - "dev": true - }, - "replace-homedir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz", - "integrity": "sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1", - "is-absolute": "^1.0.0", - "remove-trailing-separator": "^1.1.0" - } - }, "replace-in-files": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/replace-in-files/-/replace-in-files-2.0.3.tgz", @@ -3698,18 +1546,6 @@ "lodash": "^4.17.15" } }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, "resolve": { "version": "1.17.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", @@ -3719,37 +1555,12 @@ "path-parse": "^1.0.6" } }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - } - }, "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, - "resolve-options": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", - "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", - "dev": true, - "requires": { - "value-or-function": "^3.0.0" - } - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, "restore-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", @@ -3760,12 +1571,6 @@ "signal-exit": "^3.0.2" } }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -3841,15 +1646,6 @@ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -3862,15 +1658,6 @@ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, - "semver-greatest-satisfied-range": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz", - "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=", - "dev": true, - "requires": { - "sver-compat": "^1.5.0" - } - }, "serialize-javascript": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz", @@ -3880,35 +1667,6 @@ "randombytes": "^2.1.0" } }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "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" - } - } - } - }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", @@ -3955,147 +1713,12 @@ } } }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "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" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^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" - } - }, - "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" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - }, - "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" - } - } - } - }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "dev": true, - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, "source-map-support": { "version": "0.5.19", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", @@ -4114,109 +1737,17 @@ } } }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - }, - "sparkles": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", - "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", - "dev": true - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", - "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", - "dev": true - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, - "stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", - "dev": true - }, "stackframe": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz", "integrity": "sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA==" }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "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" - } - } - } - }, - "stream-exhaust": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", - "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==", - "dev": true - }, - "stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", - "dev": true - }, "string-width": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", @@ -4239,15 +1770,6 @@ } } }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", @@ -4265,15 +1787,6 @@ } } }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - } - }, "strip-json-comments": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", @@ -4289,16 +1802,6 @@ "has-flag": "^3.0.0" } }, - "sver-compat": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz", - "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=", - "dev": true, - "requires": { - "es6-iterator": "^2.0.1", - "es6-symbol": "^3.1.1" - } - }, "table": { "version": "5.4.6", "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", @@ -4373,32 +1876,6 @@ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "through2-filter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", - "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", - "dev": true, - "requires": { - "through2": "~2.0.0", - "xtend": "~4.0.0" - } - }, - "time-stamp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", - "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", - "dev": true - }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -4408,73 +1885,12 @@ "os-tmpdir": "~1.0.2" } }, - "to-absolute-glob": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", - "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", - "dev": true, - "requires": { - "is-absolute": "^1.0.0", - "is-negated-glob": "^1.0.0" - } - }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", "dev": true }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "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" - } - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "to-through": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", - "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", - "dev": true, - "requires": { - "through2": "^2.0.3" - } - }, "tslib": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.0.tgz", @@ -4490,12 +1906,6 @@ "tslib": "^1.8.1" } }, - "type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", - "dev": true - }, "type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", @@ -4511,115 +1921,12 @@ "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, "typescript": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.4.tgz", "integrity": "sha512-uauPG7XZn9F/mo+7MrsRjyvbxFpzemRjKEZXS4AK83oP2KKOJPvb+9cO/gmnv8arWZvhnjVOXz7B49m1l0e9Ew==", "dev": true }, - "unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", - "dev": true - }, - "undertaker": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.2.1.tgz", - "integrity": "sha512-71WxIzDkgYk9ZS+spIB8iZXchFhAdEo2YU8xYqBYJ39DIUIqziK78ftm26eecoIY49X0J2MLhG4hr18Yp6/CMA==", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1", - "arr-map": "^2.0.0", - "bach": "^1.0.0", - "collection-map": "^1.0.0", - "es6-weak-map": "^2.0.1", - "last-run": "^1.1.0", - "object.defaults": "^1.0.0", - "object.reduce": "^1.0.0", - "undertaker-registry": "^1.0.0" - } - }, - "undertaker-registry": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz", - "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=", - "dev": true - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, - "unique-stream": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", - "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", - "dev": true, - "requires": { - "json-stable-stringify-without-jsonify": "^1.0.1", - "through2-filter": "^3.0.0" - } - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - } - } - }, - "upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true - }, "uri-js": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", @@ -4629,109 +1936,12 @@ "punycode": "^2.1.0" } }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "use": { - "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 - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, "v8-compile-cache": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", "dev": true }, - "v8flags": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", - "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "value-or-function": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", - "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=", - "dev": true - }, - "vinyl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", - "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", - "dev": true, - "requires": { - "clone": "^2.1.1", - "clone-buffer": "^1.0.0", - "clone-stats": "^1.0.0", - "cloneable-readable": "^1.0.0", - "remove-trailing-separator": "^1.0.1", - "replace-ext": "^1.0.0" - } - }, - "vinyl-fs": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", - "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", - "dev": true, - "requires": { - "fs-mkdirp-stream": "^1.0.0", - "glob-stream": "^6.1.0", - "graceful-fs": "^4.0.0", - "is-valid-glob": "^1.0.0", - "lazystream": "^1.0.0", - "lead": "^1.0.0", - "object.assign": "^4.0.4", - "pumpify": "^1.3.5", - "readable-stream": "^2.3.3", - "remove-bom-buffer": "^3.0.0", - "remove-bom-stream": "^1.2.0", - "resolve-options": "^1.1.0", - "through2": "^2.0.0", - "to-through": "^2.0.0", - "value-or-function": "^3.0.0", - "vinyl": "^2.0.0", - "vinyl-sourcemap": "^1.1.0" - } - }, - "vinyl-sourcemap": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", - "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=", - "dev": true, - "requires": { - "append-buffer": "^1.0.2", - "convert-source-map": "^1.5.0", - "graceful-fs": "^4.1.6", - "normalize-path": "^2.1.1", - "now-and-later": "^2.0.0", - "remove-bom-buffer": "^3.0.0", - "vinyl": "^2.0.0" - } - }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -4741,65 +1951,12 @@ "isexe": "^2.0.0" } }, - "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", - "dev": true - }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "dev": true }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -4814,86 +1971,6 @@ "requires": { "mkdirp": "^0.5.1" } - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true - }, - "yargs": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.1.tgz", - "integrity": "sha512-huO4Fr1f9PmiJJdll5kwoS2e4GqzGSsMT3PPMpOwoVkOK8ckqAewMTZyA6LXVQWflleb/Z8oPBEvNsMft0XE+g==", - "dev": true, - "requires": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.2", - "which-module": "^1.0.0", - "y18n": "^3.2.1", - "yargs-parser": "5.0.0-security.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "yargs-parser": { - "version": "5.0.0-security.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0-security.0.tgz", - "integrity": "sha512-T69y4Ps64LNesYxeYGYPvfoMTt/7y1XtfpIslUeK4um+9Hu7hlGoRtaDLvdXb7+/tfq4opVa2HRY5xGip022rQ==", - "dev": true, - "requires": { - "camelcase": "^3.0.0", - "object.assign": "^4.1.0" - } } } } diff --git a/tracker/tracker/package.json b/tracker/tracker/package.json index 1ed351baf..c6049da67 100644 --- a/tracker/tracker/package.json +++ b/tracker/tracker/package.json @@ -1,7 +1,7 @@ { "name": "@openreplay/tracker", "description": "The OpenReplay tracker main package", - "version": "3.2.5", + "version": "3.3.0", "keywords": [ "logging", "replay" @@ -30,9 +30,6 @@ "@typescript-eslint/parser": "^2.34.0", "eslint": "^6.8.0", "eslint-plugin-prettier": "^3.1.4", - "gulp": "^4.0.2", - "gulp-typescript": "^6.0.0-alpha.1", - "merge2": "^1.4.1", "prettier": "^2.0.0", "replace-in-files": "^2.0.3", "rollup": "^2.17.0", diff --git a/tracker/tracker/src/main/app/index.ts b/tracker/tracker/src/main/app/index.ts index dfe8ba4f3..8102df880 100644 --- a/tracker/tracker/src/main/app/index.ts +++ b/tracker/tracker/src/main/app/index.ts @@ -11,6 +11,12 @@ import type { Options as ObserverOptions } from './observer'; import type { Options as WebworkerOptions, WorkerMessageData } from '../../messages/webworker'; +interface OnStartInfo { + sessionID: string, + sessionToken: string, + userUUID: string, +} + export type Options = { revID: string; node_id: string; @@ -20,7 +26,7 @@ export type Options = { ingestPoint: string; __is_snippet: boolean; __debug_report_edp: string | null; - onStart?: (info: { sessionID: string, sessionToken: string, userUUID: string }) => void; + onStart?: (info: OnStartInfo) => void; } & ObserverOptions & WebworkerOptions; type Callback = () => void; @@ -203,7 +209,7 @@ export default class App { active(): boolean { return this.isActive; } - _start(reset: boolean): void { // TODO: return a promise instead of onStart handling + private _start(reset: boolean): Promise { if (!this.isActive) { this.isActive = true; if (!this.worker) { @@ -227,7 +233,7 @@ export default class App { connAttemptGap: this.options.connAttemptGap, } this.worker.postMessage(messageData); // brings delay of 10th ms? - window.fetch(this.options.ingestPoint + '/v1/web/start', { + return window.fetch(this.options.ingestPoint + '/v1/web/start', { method: 'POST', headers: { 'Content-Type': 'application/json', @@ -275,28 +281,34 @@ export default class App { this.ticker.start(); log("OpenReplay tracking started."); + const onStartInfo = { sessionToken: token, userUUID, sessionID }; if (typeof this.options.onStart === 'function') { - this.options.onStart({ sessionToken: token, userUUID, sessionID }); + this.options.onStart(onStartInfo); } + return onStartInfo; }) .catch(e => { this.stop(); this.sendDebugReport("session_start", e); + throw e; }) } + return Promise.reject("Player is active"); } - start(reset: boolean = false): void { + start(reset: boolean = false): Promise { if (!document.hidden) { - this._start(reset); + return this._start(reset); } else { - const onVisibilityChange = () => { - if (!document.hidden) { - document.removeEventListener("visibilitychange", onVisibilityChange); - this._start(reset); + return new Promise((resolve) => { + const onVisibilityChange = () => { + if (!document.hidden) { + document.removeEventListener("visibilitychange", onVisibilityChange); + resolve(this._start(reset)); + } } - } - document.addEventListener("visibilitychange", onVisibilityChange); + document.addEventListener("visibilitychange", onVisibilityChange); + }); } } stop(): void { From ce38c88a18dd64e2f0a03f96481cc02eaa81a65f Mon Sep 17 00:00:00 2001 From: ShiKhu Date: Thu, 2 Sep 2021 19:40:23 +0200 Subject: [PATCH 07/39] feat (tracker-assist): 3.1.0 ignore start callback if restarting internally --- tracker/tracker-assist/package-lock.json | 15 +++++++++++---- tracker/tracker-assist/package.json | 6 +++--- tracker/tracker-assist/src/index.ts | 7 ++++++- 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/tracker/tracker-assist/package-lock.json b/tracker/tracker-assist/package-lock.json index 82d1c013c..d797a86d4 100644 --- a/tracker/tracker-assist/package-lock.json +++ b/tracker/tracker-assist/package-lock.json @@ -1,6 +1,6 @@ { "name": "@openreplay/tracker-assist", - "version": "3.0.1", + "version": "3.1.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -30,6 +30,12 @@ "js-tokens": "^4.0.0" } }, + "@medv/finder": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@medv/finder/-/finder-2.1.0.tgz", + "integrity": "sha512-Egrg5XO4kLol24b1Kv50HDfi5hW0yQ6aWSsO0Hea1eJ4rogKElIN0M86FdVnGF4XIGYyA7QWx0MgbOzVPA0qkA==", + "dev": true + }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -57,11 +63,12 @@ } }, "@openreplay/tracker": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@openreplay/tracker/-/tracker-3.0.5.tgz", - "integrity": "sha512-hIY7DnQmm7bCe6v+e257WD7OdNuBOWUZ15Q3yUEdyxu7xDNG7brbak9pS97qCt3VY9xGK0RvW/j3ANlRPk8aVg==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@openreplay/tracker/-/tracker-3.3.0.tgz", + "integrity": "sha512-g9sOG01VaiRLw4TcUbux8j3moa7gsGs8rjZPEVJ5SJqxjje9R7tpUD5UId9ne7QdHSoiHfrWFk3TNRLpXyvImg==", "dev": true, "requires": { + "@medv/finder": "^2.0.0", "error-stack-parser": "^2.0.6" } }, diff --git a/tracker/tracker-assist/package.json b/tracker/tracker-assist/package.json index 42f0358f0..067fbe302 100644 --- a/tracker/tracker-assist/package.json +++ b/tracker/tracker-assist/package.json @@ -1,7 +1,7 @@ { "name": "@openreplay/tracker-assist", "description": "Tracker plugin for screen assistance through the WebRTC", - "version": "3.0.3", + "version": "3.1.0", "keywords": [ "WebRTC", "assistance", @@ -24,10 +24,10 @@ "peerjs": "^1.3.2" }, "peerDependencies": { - "@openreplay/tracker": "^3.1.0" + "@openreplay/tracker": "^3.3.0" }, "devDependencies": { - "@openreplay/tracker": "^3.0.5", + "@openreplay/tracker": "^3.3.0", "prettier": "^1.18.2", "replace-in-files-cli": "^1.0.0", "typescript": "^3.6.4" diff --git a/tracker/tracker-assist/src/index.ts b/tracker/tracker-assist/src/index.ts index 3ec90b141..e5a7085b6 100644 --- a/tracker/tracker-assist/src/index.ts +++ b/tracker/tracker-assist/src/index.ts @@ -34,7 +34,10 @@ export default function(opts: Partial = {}) { return; } + let observerRestart = false; + app.attachStartCallback(function() { + if (observerRestart) { return; } // @ts-ignore const peerID = `${app.projectKey}-${app.getSessionID()}` const peer = new Peer(peerID, { @@ -66,6 +69,8 @@ export default function(opts: Partial = {}) { buffering = false; } } + + observerRestart = true; app.stop(); //@ts-ignore (should update tracker dependency) app.addCommitCallback((messages: Array): void => { @@ -78,7 +83,7 @@ export default function(opts: Partial = {}) { sendNext(); } }); - app.start(); + app.start().then(() => { observerRestart = false; }); }); }); From 11ee390f8dd661ace2478b3ad377471f8ee973c2 Mon Sep 17 00:00:00 2001 From: ShiKhu Date: Sun, 5 Sep 2021 21:54:28 +0200 Subject: [PATCH 08/39] fix(tracker-assist): 3.1.1 - peer singletone handling --- tracker/tracker-assist/package.json | 2 +- .../src/{Confirm.ts => ConfirmWindow.ts} | 2 +- tracker/tracker-assist/src/confirm.ts | 92 ------------------- tracker/tracker-assist/src/index.ts | 37 +++++--- 4 files changed, 24 insertions(+), 109 deletions(-) rename tracker/tracker-assist/src/{Confirm.ts => ConfirmWindow.ts} (98%) delete mode 100644 tracker/tracker-assist/src/confirm.ts diff --git a/tracker/tracker-assist/package.json b/tracker/tracker-assist/package.json index 067fbe302..683c9c322 100644 --- a/tracker/tracker-assist/package.json +++ b/tracker/tracker-assist/package.json @@ -1,7 +1,7 @@ { "name": "@openreplay/tracker-assist", "description": "Tracker plugin for screen assistance through the WebRTC", - "version": "3.1.0", + "version": "3.1.1", "keywords": [ "WebRTC", "assistance", diff --git a/tracker/tracker-assist/src/Confirm.ts b/tracker/tracker-assist/src/ConfirmWindow.ts similarity index 98% rename from tracker/tracker-assist/src/Confirm.ts rename to tracker/tracker-assist/src/ConfirmWindow.ts index fd1075789..64dc98a28 100644 --- a/tracker/tracker-assist/src/Confirm.ts +++ b/tracker/tracker-assist/src/ConfirmWindow.ts @@ -1,7 +1,7 @@ const declineIcon = ``; -export default class Confirm { +export default class ConfirmWindow { private wrapper: HTMLDivElement; constructor(text: string, styles?: Object) { diff --git a/tracker/tracker-assist/src/confirm.ts b/tracker/tracker-assist/src/confirm.ts deleted file mode 100644 index fd1075789..000000000 --- a/tracker/tracker-assist/src/confirm.ts +++ /dev/null @@ -1,92 +0,0 @@ - -const declineIcon = ``; - -export default class Confirm { - private wrapper: HTMLDivElement; - - constructor(text: string, styles?: Object) { - const wrapper = document.createElement('div'); - const popup = document.createElement('div'); - const p = document.createElement('p'); - p.innerText = text; - const buttons = document.createElement('div'); - const answerBtn = document.createElement('button'); - answerBtn.innerHTML = declineIcon.replace('fill="#ef5261"', 'fill="green"'); - const declineBtn = document.createElement('button'); - declineBtn.innerHTML = declineIcon; - buttons.appendChild(answerBtn); - buttons.appendChild(declineBtn); - popup.appendChild(p); - popup.appendChild(buttons); - - const btnStyles = { - borderRadius: "50%", - width: "22px", - height: "22px", - background: "transparent", - padding: 0, - margin: 0, - border: 0, - cursor: "pointer", - } - Object.assign(answerBtn.style, btnStyles); - Object.assign(declineBtn.style, btnStyles); - Object.assign(buttons.style, { - marginTop: "10px", - display: "flex", - alignItems: "center", - justifyContent: "space-evenly", - }); - - Object.assign(popup.style, { - position: "relative", - pointerEvents: "auto", - margin: "4em auto", - width: "90%", - maxWidth: "400px", - padding: "25px 30px", - background: "black", - opacity: ".75", - color: "white", - textAlign: "center", - borderRadius: ".25em .25em .4em .4em", - boxShadow: "0 0 20px rgb(0 0 0 / 20%)", - }, styles); - - Object.assign(wrapper.style, { - position: "fixed", - left: 0, - top: 0, - height: "100%", - width: "100%", - pointerEvents: "none", - zIndex: 2147483647 - 1, - }) - - wrapper.appendChild(popup); - this.wrapper = wrapper; - - answerBtn.onclick = () => { - this.remove(); - this.callback(true); - } - declineBtn.onclick = () => { - this.remove(); - this.callback(false); - } - } - - mount() { - document.body.appendChild(this.wrapper); - } - - private callback: (result: boolean) => void = ()=>{}; - onAnswer(callback: (result: boolean) => void) { - this.callback = callback; - } - - remove() { - if (!this.wrapper.parentElement) { return; } - document.body.removeChild(this.wrapper); - } -} diff --git a/tracker/tracker-assist/src/index.ts b/tracker/tracker-assist/src/index.ts index e5a7085b6..89d233e70 100644 --- a/tracker/tracker-assist/src/index.ts +++ b/tracker/tracker-assist/src/index.ts @@ -5,7 +5,7 @@ import type Message from '@openreplay/tracker'; import Mouse from './Mouse'; import CallWindow from './CallWindow'; -import Confirm from './Confirm'; +import ConfirmWindow from './ConfirmWindow'; export interface Options { @@ -34,23 +34,28 @@ export default function(opts: Partial = {}) { return; } - let observerRestart = false; + let assistDemandedRestart = false; + let peer : Peer | null = null; + + app.attachStopCallback(function() { + if (assistDemandedRestart) { return; } + peer && peer.destroy(); + }); app.attachStartCallback(function() { - if (observerRestart) { return; } - // @ts-ignore + if (assistDemandedRestart) { return; } const peerID = `${app.projectKey}-${app.getSessionID()}` - const peer = new Peer(peerID, { + peer = new Peer(peerID, { // @ts-ignore host: app.getHost(), path: '/assist', port: location.protocol === 'http:' && appOptions.__DISABLE_SECURE_MODE ? 80 : 443, }); console.log('OpenReplay tracker-assist peerID:', peerID) + peer.on('error', e => console.log("OpenReplay tracker-assist peer error: ", e.type, e)) peer.on('connection', function(conn) { window.addEventListener("beforeunload", () => conn.open && conn.send("unload")); - peer.on('error', e => console.log("OpenReplay tracker-assist peer error: ", e.type, e)) console.log('OpenReplay tracker-assist: Connecting...') conn.on('open', function() { @@ -70,10 +75,11 @@ export default function(opts: Partial = {}) { } } - observerRestart = true; + assistDemandedRestart = true; app.stop(); //@ts-ignore (should update tracker dependency) app.addCommitCallback((messages: Array): void => { + if (!conn.open) { return; } // TODO: clear commit callbacks on connection close let i = 0; while (i < messages.length) { buffer.push(messages.slice(i, i+=1000)); @@ -83,30 +89,31 @@ export default function(opts: Partial = {}) { sendNext(); } }); - app.start().then(() => { observerRestart = false; }); + app.start().then(() => { assistDemandedRestart = false; }); }); }); - let calling: CallingState = CallingState.False; + let callingState: CallingState = CallingState.False; peer.on('call', function(call) { + if (!peer) { return; } const dataConn: DataConnection | undefined = peer .connections[call.peer].find(c => c.type === 'data'); - if (calling !== CallingState.False || !dataConn) { + if (callingState !== CallingState.False || !dataConn) { call.close(); return; } - calling = CallingState.Requesting; const notifyCallEnd = () => { dataConn.open && dataConn.send("call_end"); } - const confirm = new Confirm(options.confirmText, options.confirmStyle); + callingState = CallingState.Requesting; + const confirm = new ConfirmWindow(options.confirmText, options.confirmStyle); dataConn.on('data', (data) => { // if call closed by a caller before confirm if (data === "call_end") { //console.log('OpenReplay tracker-assist: receiving callend onconfirm') - calling = CallingState.False; + callingState = CallingState.False; confirm.remove(); } }); @@ -115,7 +122,7 @@ export default function(opts: Partial = {}) { if (!agreed || !dataConn.open) { call.close(); notifyCallEnd(); - calling = CallingState.False; + callingState = CallingState.False; return; } @@ -128,7 +135,7 @@ export default function(opts: Partial = {}) { mouse.remove(); callUI?.remove(); lStream.getTracks().forEach(t => t.stop()); - calling = CallingState.False; + callingState = CallingState.False; } const initiateCallEnd = () => { //console.log("callend initiated") From b498427601a26b387bc363ae06893ba08a226cbb Mon Sep 17 00:00:00 2001 From: ShiKhu Date: Tue, 7 Sep 2021 13:54:42 +0200 Subject: [PATCH 09/39] fix(sourcemap-uploader): 3.0.6 - server parameter to the upload functions instead of being global --- sourcemap-uploader/README.md | 17 ++++++++++------- sourcemap-uploader/cli.js | 10 ++-------- sourcemap-uploader/index.js | 8 ++++---- sourcemap-uploader/lib/uploadSourcemaps.js | 16 ++++++++++++---- sourcemap-uploader/package.json | 2 +- 5 files changed, 29 insertions(+), 24 deletions(-) diff --git a/sourcemap-uploader/README.md b/sourcemap-uploader/README.md index e0a42a530..cfca77dd3 100644 --- a/sourcemap-uploader/README.md +++ b/sourcemap-uploader/README.md @@ -10,28 +10,31 @@ npm i -D @openreplay/sourcemap-uploader ## CLI -Upload sourcemap for one file: +### Upload a sourcemap for one file: ``` sourcemap-uploader -s https://opnereplay.mycompany.com/api -k API_KEY -p PROJECT_KEY file -m ./dist/index.js.map -u https://myapp.com/index.js ``` -Upload all sourcemaps in a given directory. The URL must correspond to the root where you upload JS files from the directory. In other words, if you have your `app-42.js` along with the `app-42.js.map` in the `./build` folder and then want to upload it to your OpenReplay instance so it can be reachable through the link `https://myapp.com/static/app-42.js`, then the command should be like: +### Upload all sourcemaps in a given directory. +The URL must correspond to the root where you upload JS files from the directory. In other words, if you have your `app-42.js` along with the `app-42.js.map` in the `./build` folder and then want to upload it to your OpenReplay instance so it can be reachable through the link `https://myapp.com/static/app-42.js`, then the command should be like: ``` sourcemap-uploader -s https://opnereplay.mycompany.com/api -k API_KEY -p PROJECT_KEY dir -m ./build -u https://myapp.com/static ``` -- Use `-s` (`--server`) to specify the URL of your OpenReplay instance (make to append it with /api) +- Use `-s` (`--server`) to specify the URL of your OpenReplay instance (append it with /api). +**Do not use this parameter if you use SaaS version of the OpenRplay** + - Use `-v` (`--verbose`) to see the logs. ## NPM -There are two functions inside `index.js` of the package: +There are two functions you can export from the package: ``` -uploadFile(api_key, project_key, sourcemap_file_path, js_file_url) -uploadDir(api_key, project_key, sourcemap_dir_path, js_dir_url) +uploadFile(api_key, project_key, sourcemap_file_path, js_file_url, [server]) +uploadDir(api_key, project_key, sourcemap_dir_path, js_dir_url, [server]) ``` -Both functions return Promise. +Both functions return Promise with a result value to be the list of files for which sourcemaps were uploaded. diff --git a/sourcemap-uploader/cli.js b/sourcemap-uploader/cli.js index 253a72ce5..9dd3f16f3 100755 --- a/sourcemap-uploader/cli.js +++ b/sourcemap-uploader/cli.js @@ -58,15 +58,9 @@ const { command, api_key, project_key, server, verbose, ...args } = parser.parse global._VERBOSE = !!verbose; -try { - global.SERVER = new URL(server || "https://api.openreplay.com"); -} catch (e) { - console.error(`Sourcemap Uploader: server URL parse error. ${e}`) -} - (command === 'file' - ? uploadFile(api_key, project_key, args.sourcemap_file_path, args.js_file_url) - : uploadDir(api_key, project_key, args.sourcemap_dir_path, args.js_dir_url) + ? uploadFile(api_key, project_key, args.sourcemap_file_path, args.js_file_url, server) + : uploadDir(api_key, project_key, args.sourcemap_dir_path, args.js_dir_url, server) ) .then((sourceFiles) => sourceFiles.length > 0 diff --git a/sourcemap-uploader/index.js b/sourcemap-uploader/index.js index ad16b9ccd..7c3ee7aab 100644 --- a/sourcemap-uploader/index.js +++ b/sourcemap-uploader/index.js @@ -3,12 +3,12 @@ const readFile = require('./lib/readFile.js'), uploadSourcemaps = require('./lib/uploadSourcemaps.js'); module.exports = { - async uploadFile(api_key, project_key, sourcemap_file_path, js_file_url) { + async uploadFile(api_key, project_key, sourcemap_file_path, js_file_url, server) { const sourcemap = await readFile(sourcemap_file_path, js_file_url); - return uploadSourcemaps(api_key, project_key, [sourcemap]); + return uploadSourcemaps(api_key, project_key, [sourcemap], server); }, - async uploadDir(api_key, project_key, sourcemap_dir_path, js_dir_url) { + async uploadDir(api_key, project_key, sourcemap_dir_path, js_dir_url, server) { const sourcemaps = await readDir(sourcemap_dir_path, js_dir_url); - return uploadSourcemaps(api_key, project_key, sourcemaps); + return uploadSourcemaps(api_key, project_key, sourcemaps, server); }, }; diff --git a/sourcemap-uploader/lib/uploadSourcemaps.js b/sourcemap-uploader/lib/uploadSourcemaps.js index da4a57912..8da34ecdc 100644 --- a/sourcemap-uploader/lib/uploadSourcemaps.js +++ b/sourcemap-uploader/lib/uploadSourcemaps.js @@ -1,15 +1,22 @@ const https = require('https'); -const getUploadURLs = (api_key, project_key, js_file_urls) => +const getUploadURLs = (api_key, project_key, js_file_urls, server) => new Promise((resolve, reject) => { if (js_file_urls.length === 0) { resolve([]); } - const pathPrefix = (global.SERVER.pathname + "/").replace(/\/+/g, '/'); + let serverURL; + try { + serverURL = new URL(server); + } catch(e) { + return reject(`Failed to parse server URL "${server}".`) + } + + const pathPrefix = (serverURL.pathname + "/").replace(/\/+/g, '/'); const options = { method: 'PUT', - hostname: global.SERVER.host, + hostname: serverURL.host, path: pathPrefix + `${project_key}/sourcemaps/`, headers: { Authorization: api_key, 'Content-Type': 'application/json' }, } @@ -74,11 +81,12 @@ const uploadSourcemap = (upload_url, body) => req.end(); }); -module.exports = (api_key, project_key, sourcemaps) => +module.exports = (api_key, project_key, sourcemaps, server) => getUploadURLs( api_key, project_key, sourcemaps.map(({ js_file_url }) => js_file_url), + server || "https://api.openreplay.com", ).then(upload_urls => Promise.all( upload_urls.map((upload_url, i) => diff --git a/sourcemap-uploader/package.json b/sourcemap-uploader/package.json index b68c656e1..4a1d20181 100644 --- a/sourcemap-uploader/package.json +++ b/sourcemap-uploader/package.json @@ -1,6 +1,6 @@ { "name": "@openreplay/sourcemap-uploader", - "version": "3.0.5", + "version": "3.0.6", "description": "NPM module to upload your JS sourcemaps files to OpenReplay", "bin": "cli.js", "main": "index.js", From 8a615580357e71c5ed85a5ebe666428e024fa470 Mon Sep 17 00:00:00 2001 From: ShiKhu Date: Tue, 7 Sep 2021 19:12:15 +0200 Subject: [PATCH 10/39] feat(backend): send beaconSizeLimit to Tracker on start --- backend/services/http/handlers.go | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/backend/services/http/handlers.go b/backend/services/http/handlers.go index e22a97abe..975abe31b 100644 --- a/backend/services/http/handlers.go +++ b/backend/services/http/handlers.go @@ -34,11 +34,12 @@ func startSessionHandlerWeb(w http.ResponseWriter, r *http.Request) { Reset bool `json:"reset"` } type response struct { - Timestamp int64 `json:"timestamp"` - Delay int64 `json:"delay"` - Token string `json:"token"` - UserUUID string `json:"userUUID"` - SessionID string `json:"sessionID"` + Timestamp int64 `json:"timestamp"` + Delay int64 `json:"delay"` + Token string `json:"token"` + UserUUID string `json:"userUUID"` + SessionID string `json:"sessionID"` + BeaconSizeLimit int64 `json:"beaconSizeLimit"` } startTime := time.Now() @@ -115,6 +116,7 @@ func startSessionHandlerWeb(w http.ResponseWriter, r *http.Request) { Token: tokenizer.Compose(*tokenData), UserUUID: userUUID, SessionID: strconv.FormatUint(tokenData.ID, 10), + BeaconSizeLimit: BEACON_SIZE_LIMIT, }) } From d099ab4dde992dba84cfffb0dcf79603af915cc1 Mon Sep 17 00:00:00 2001 From: ShiKhu Date: Tue, 7 Sep 2021 19:24:02 +0200 Subject: [PATCH 11/39] feat (backend): default BEACON_SIZE_LIMIT to 7 Mb --- backend/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/Dockerfile b/backend/Dockerfile index d2d94da64..3e60e0e89 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -25,7 +25,7 @@ ENV TZ=UTC \ MAXMINDDB_FILE=/root/geoip.mmdb \ UAPARSER_FILE=/root/regexes.yaml \ HTTP_PORT=80 \ - BEACON_SIZE_LIMIT=1000000 \ + BEACON_SIZE_LIMIT=7000000 \ KAFKA_USE_SSL=true \ REDIS_STREAMS_MAX_LEN=3000 \ TOPIC_RAW=raw \ From a8e54f1062d614f38609de8413d8c894c3b43cd6 Mon Sep 17 00:00:00 2001 From: ShiKhu Date: Fri, 10 Sep 2021 21:31:39 +0200 Subject: [PATCH 12/39] fix (assets rewriter): fix cachable condition & hover classname --- backend/pkg/url/assets/css.go | 7 ++-- backend/pkg/url/assets/url.go | 32 ++++++------------- backend/services/http/assets.go | 7 ++-- .../managers/MouseManager.ts | 11 +++++-- 4 files changed, 24 insertions(+), 33 deletions(-) diff --git a/backend/pkg/url/assets/css.go b/backend/pkg/url/assets/css.go index 633a0f693..3bd486bc7 100644 --- a/backend/pkg/url/assets/css.go +++ b/backend/pkg/url/assets/css.go @@ -66,13 +66,12 @@ func ResolveCSS(baseURL string, css string) string { css = rewriteLinks(css, func(rawurl string) string { return ResolveURL(baseURL, rawurl) }) - return strings.Replace(css, ":hover", ".-asayer-hover", -1) + return strings.Replace(css, ":hover", ".-openreplay-hover", -1) } func (r *Rewriter) RewriteCSS(sessionID uint64, baseurl string, css string) string { css = rewriteLinks(css, func(rawurl string) string { - url , _ := r.RewriteURL(sessionID, baseurl, rawurl) - return url + return r.RewriteURL(sessionID, baseurl, rawurl) }) - return strings.Replace(css, ":hover", ".-asayer-hover", -1) + return strings.Replace(css, ":hover", ".-openreplay-hover", -1) } diff --git a/backend/pkg/url/assets/url.go b/backend/pkg/url/assets/url.go index 4236fb8b7..cc12b583b 100644 --- a/backend/pkg/url/assets/url.go +++ b/backend/pkg/url/assets/url.go @@ -50,23 +50,15 @@ func GetFullCachableURL(baseURL string, relativeURL string) (string, bool) { if !isRelativeCachable(relativeURL) { return "", false } - return ResolveURL(baseURL, relativeURL), true + fullURL := ResolveURL(baseURL, relativeURL) + if !isCachable(fullURL) { + return "", false + } + return fullURL, true } - -const OPENREPLAY_QUERY_START = "OPENREPLAY_QUERY" - func getCachePath(rawurl string) string { return "/" + strings.ReplaceAll(url.QueryEscape(rawurl), "%", "!") // s3 keys are ok with "!" - // u, _ := url.Parse(rawurl) - // s := "/" + u.Scheme + "/" + u.Hostname() + u.Path - // if u.RawQuery != "" { - // if (s[len(s) - 1] != '/') { - // s += "/" - // } - // s += OPENREPLAY_QUERY_START + url.PathEscape(u.RawQuery) - // } - // return s } func getCachePathWithKey(sessionID uint64, rawurl string) string { @@ -82,14 +74,10 @@ func GetCachePathForAssets(sessionID uint64, rawurl string) string { } -func (r *Rewriter) RewriteURL(sessionID uint64, baseURL string, relativeURL string) (string, bool) { - // TODO: put it in one check within GetFullCachableURL - if !isRelativeCachable(relativeURL) { - return relativeURL, false - } - fullURL := ResolveURL(baseURL, relativeURL) - if !isCachable(fullURL) { - return relativeURL, false +func (r *Rewriter) RewriteURL(sessionID uint64, baseURL string, relativeURL string) string { + fullURL, cachable := GetFullCachableURL(baseURL, relativeURL) + if !cachable { + return relativeURL } u := url.URL{ @@ -98,6 +86,6 @@ func (r *Rewriter) RewriteURL(sessionID uint64, baseURL string, relativeURL stri Scheme: r.assetsURL.Scheme, } - return u.String(), true + return u.String() } diff --git a/backend/services/http/assets.go b/backend/services/http/assets.go index dd3dd4703..69fb7f53d 100644 --- a/backend/services/http/assets.go +++ b/backend/services/http/assets.go @@ -21,11 +21,8 @@ func sendAssetsForCacheFromCSS(sessionID uint64, baseURL string, css string) { func handleURL(sessionID uint64, baseURL string, url string) string { if CACHE_ASSESTS { - rewrittenURL, isCachable := rewriter.RewriteURL(sessionID, baseURL, url) - if isCachable { - sendAssetForCache(sessionID, baseURL, url) - } - return rewrittenURL + sendAssetForCache(sessionID, baseURL, url) + return rewriter.RewriteURL(sessionID, baseURL, url) } return assets.ResolveURL(baseURL, url) } diff --git a/frontend/app/player/MessageDistributor/managers/MouseManager.ts b/frontend/app/player/MessageDistributor/managers/MouseManager.ts index a86408823..cd26c5b7f 100644 --- a/frontend/app/player/MessageDistributor/managers/MouseManager.ts +++ b/frontend/app/player/MessageDistributor/managers/MouseManager.ts @@ -7,6 +7,7 @@ import ListWalker from './ListWalker'; type MouseMoveTimed = MouseMove & Timed; const HOVER_CLASS = "-openreplay-hover"; +const HOVER_CLASS_DEPR = "-asayer-hover"; export default class MouseManager extends ListWalker { private hoverElements: Array = []; @@ -19,8 +20,14 @@ export default class MouseManager extends ListWalker { const diffAdd = curHoverElements.filter(elem => !this.hoverElements.includes(elem)); const diffRemove = this.hoverElements.filter(elem => !curHoverElements.includes(elem)); this.hoverElements = curHoverElements; - diffAdd.forEach(elem => elem.classList.add(HOVER_CLASS)); - diffRemove.forEach(elem => elem.classList.remove(HOVER_CLASS)); + diffAdd.forEach(elem => { + elem.classList.add(HOVER_CLASS) + elem.classList.add(HOVER_CLASS_DEPR) + }); + diffRemove.forEach(elem => { + elem.classList.remove(HOVER_CLASS) + elem.classList.remove(HOVER_CLASS_DEPR) + }); } reset(): void { From e6396ca4e796c9ecf0ee0abb0db3397ad71d2818 Mon Sep 17 00:00:00 2001 From: ShiKhu Date: Fri, 10 Sep 2021 22:18:52 +0200 Subject: [PATCH 13/39] feat(backend-http): http2 check --- backend/services/http/main.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/backend/services/http/main.go b/backend/services/http/main.go index 647dc42f5..29181718f 100644 --- a/backend/services/http/main.go +++ b/backend/services/http/main.go @@ -8,6 +8,8 @@ import ( "os/signal" "syscall" + "golang.org/x/net/http2" + "openreplay/backend/pkg/env" "openreplay/backend/pkg/flakeid" @@ -131,6 +133,7 @@ func main() { } }), } + http2.ConfigureServer(server, nil) go func() { if err := server.ListenAndServe(); err != nil { log.Fatalf("Server error: %v\n", err) From 9a01a4dc16c2d45d4ecde46ca2a9e03ad8cd9111 Mon Sep 17 00:00:00 2001 From: Taha Yassine Kraiem Date: Tue, 14 Sep 2021 18:50:48 +0200 Subject: [PATCH 14/39] feat(utilities): disable peerjs auto-discovery --- utilities/server.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utilities/server.js b/utilities/server.js index 1b742bbea..980521c1a 100644 --- a/utilities/server.js +++ b/utilities/server.js @@ -24,7 +24,7 @@ const peerServer = ExpressPeerServer(server, { debug: true, path: '/', proxied: true, - allow_discovery: true + allow_discovery: false }); peerServer.on('connection', peerConnection); peerServer.on('disconnect', peerDisconnect); From 0421e2a4bb5789893057a4571d278c53f6bab2db Mon Sep 17 00:00:00 2001 From: Kraiem Taha Yassine Date: Mon, 20 Sep 2021 20:35:27 +0200 Subject: [PATCH 15/39] Api insights (#176) * feat(db): added new foreign-key indexes * feat(db): added new foreign-key indexes * feat(api): pg_client fixed exception handler * feat(api): changed change password response * feat(api): insights retention --- api/chalicelib/blueprints/subs/bp_insights.py | 11 ++++ api/chalicelib/core/insights.py | 55 ++++++++++++++++++- api/chalicelib/core/users.py | 23 +++++++- api/chalicelib/utils/pg_client.py | 2 +- ee/api/chalicelib/core/users.py | 24 +++++++- .../db/init_dbs/postgresql/1.4.0/1.4.0.sql | 5 ++ .../db/init_dbs/postgresql/init_schema.sql | 5 +- 7 files changed, 118 insertions(+), 7 deletions(-) diff --git a/api/chalicelib/blueprints/subs/bp_insights.py b/api/chalicelib/blueprints/subs/bp_insights.py index 062e8fdc8..8c79e2663 100644 --- a/api/chalicelib/blueprints/subs/bp_insights.py +++ b/api/chalicelib/blueprints/subs/bp_insights.py @@ -28,6 +28,17 @@ def get_insights_journey(projectId, context): return {"data": insights.get_journey(project_id=projectId, **{**data, **args})} + +@app.route('/{projectId}/insights/users_retention', methods=['GET', 'POST']) +def get_users_retention(projectId, context): + data = app.current_request.json_body + if data is None: + data = {} + params = app.current_request.query_params + args = dashboard.dashboard_args(params) + + return {"data": insights.get_retention(project_id=projectId, **{**data, **args})} + # # # @app.route('/{projectId}/dashboard/{widget}/search', methods=['GET']) diff --git a/api/chalicelib/core/insights.py b/api/chalicelib/core/insights.py index d470e1537..37042e64d 100644 --- a/api/chalicelib/core/insights.py +++ b/api/chalicelib/core/insights.py @@ -98,8 +98,61 @@ def get_journey(project_id, startTimestamp=TimeUTC.now(delta_days=-1), endTimest params = {"project_id": project_id, "startTimestamp": startTimestamp, "endTimestamp": endTimestamp, "event_start": event_start, "JOURNEY_DEPTH": JOURNEY_DEPTH, **__get_constraint_values(args), **extra_values} - print(cur.mogrify(pg_query, params)) + # print(cur.mogrify(pg_query, params)) cur.execute(cur.mogrify(pg_query, params)) rows = cur.fetchall() return __transform_journey(rows) + + +def __compute_retention_percentage(rows): + if rows is None or len(rows) == 0: + return rows + t = -1 + for r in rows: + if r["week"] == 0: + t = r["usersCount"] + r["percentage"] = r["usersCount"] / t + return rows + + +@dev.timed +def get_retention(project_id, startTimestamp=TimeUTC.now(delta_days=-1), endTimestamp=TimeUTC.now(), filters=[], + **args): + pg_sub_query = __get_constraints(project_id=project_id, data=args, duration=True, main_table="sessions", + time_constraint=True) + + with pg_client.PostgresClient() as cur: + pg_query = f"""SELECT EXTRACT(EPOCH FROM first_connexion_week::date)::bigint*1000 AS first_connexion_week, + FLOOR(DATE_PART('day', connexion_week - first_connexion_week) / 7)::integer AS week, + COUNT(DISTINCT connexions_list.user_id) AS users_count, + ARRAY_AGG(DISTINCT connexions_list.user_id) AS connected_users + FROM (SELECT DISTINCT user_id, MIN(DATE_TRUNC('week', to_timestamp(start_ts / 1000))) AS first_connexion_week + FROM sessions + WHERE {" AND ".join(pg_sub_query)} + AND NOT EXISTS((SELECT 1 + FROM sessions AS bsess + WHERE bsess.start_ts Date: Mon, 20 Sep 2021 20:55:53 +0200 Subject: [PATCH 16/39] fix(tracker): send resources even they were captured before start --- tracker/tracker/src/main/modules/timing.ts | 43 ++++++++++++---------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/tracker/tracker/src/main/modules/timing.ts b/tracker/tracker/src/main/modules/timing.ts index 1519b9caf..e6e6df8ea 100644 --- a/tracker/tracker/src/main/modules/timing.ts +++ b/tracker/tracker/src/main/modules/timing.ts @@ -1,6 +1,7 @@ import { isURL } from '../utils'; import App from '../app'; import { ResourceTiming, PageLoadTiming, PageRenderTiming } from '../../messages'; +import type Message from '../../messages/message'; // Inspired by https://github.com/WPO-Foundation/RUM-SpeedIndex/blob/master/src/rum-speedindex.js @@ -104,21 +105,28 @@ export default function (app: App, opts: Partial): void { if (!('PerformanceObserver' in window)) { options.captureResourceTimings = false; } - if (!options.captureResourceTimings) { - options.capturePageLoadTimings = false; - options.capturePageRenderTimings = false; - } + if (!options.captureResourceTimings) { return } // Resources are necessary for all timings - let resources: ResourcesTimeMap | null = options.captureResourceTimings - ? {} - : null; + const mQueue: Message[] = [] + function sendOnStart(m: Message) { + if (app.active()) { + app.send(m) + } else { + mQueue.push(m) + } + } + app.attachStartCallback(function() { + mQueue.forEach(m => app.send(m)) + }) + + let resources: ResourcesTimeMap | null = {} function resourceTiming(entry: PerformanceResourceTiming): void { if (entry.duration <= 0 || !isURL(entry.name) || app.isServiceURL(entry.name)) return; if (resources !== null) { resources[entry.name] = entry.startTime + entry.duration; } - app.send(new + sendOnStart(new ResourceTiming( entry.startTime + performance.timing.navigationStart, entry.duration, @@ -136,20 +144,17 @@ export default function (app: App, opts: Partial): void { ); } - const observer: PerformanceObserver | null = options.captureResourceTimings - ? new PerformanceObserver((list) => - list.getEntries().forEach(resourceTiming), - ) - : null; - if (observer !== null) { - performance.getEntriesByType('resource').forEach(resourceTiming); - observer.observe({ entryTypes: ['resource'] }); - } + const observer: PerformanceObserver = new PerformanceObserver( + (list) => list.getEntries().forEach(resourceTiming), + ) + performance.getEntriesByType('resource').forEach(resourceTiming) + observer.observe({ entryTypes: ['resource'] }) + let firstPaint = 0, firstContentfulPaint = 0; - if (options.capturePageLoadTimings && observer !== null) { + if (options.capturePageLoadTimings) { let pageLoadTimingSent: boolean = false; app.ticker.attach(() => { @@ -200,7 +205,7 @@ export default function (app: App, opts: Partial): void { }, 30); } - if (options.capturePageRenderTimings && observer !== null) { + if (options.capturePageRenderTimings) { let visuallyComplete = 0, interactiveWindowStartTime = 0, interactiveWindowTickTime: number | null = 0, From 6549955c6fbc69df993ccda916f11be925d20f8b Mon Sep 17 00:00:00 2001 From: Kraiem Taha Yassine Date: Tue, 21 Sep 2021 17:27:18 +0200 Subject: [PATCH 17/39] Api insights (#178) * feat(db): added new foreign-key indexes * feat(db): added new foreign-key indexes * feat(api): pg_client fixed exception handler * feat(api): changed change password response * feat(api): insights retention * feat(api): insights retention: fill missing values feat(api): insights retention: max date restrictions * feat(api): insights retention changed end date --- api/chalicelib/core/insights.py | 61 ++++++++++++++++++++++++++++++--- api/chalicelib/utils/TimeUTC.py | 9 +++++ 2 files changed, 66 insertions(+), 4 deletions(-) diff --git a/api/chalicelib/core/insights.py b/api/chalicelib/core/insights.py index 37042e64d..c39fb5cea 100644 --- a/api/chalicelib/core/insights.py +++ b/api/chalicelib/core/insights.py @@ -116,9 +116,61 @@ def __compute_retention_percentage(rows): return rows +def __complete_retention(rows, start_date, end_date=None): + if rows is None or len(rows) == 0: + return rows + max_week = 10 + week = 0 + delta_date = 0 + while max_week > 0: + start_date += TimeUTC.MS_WEEK + if end_date is not None and start_date >= end_date: + break + delta = 0 + if delta_date + week >= len(rows) \ + or delta_date + week < len(rows) and rows[delta_date + week]["firstConnexionWeek"] > start_date: + for i in range(max_week): + if end_date is not None and start_date + i * TimeUTC.MS_WEEK >= end_date: + break + + neutral = { + "firstConnexionWeek": start_date, + "week": i, + "usersCount": 0, + "connectedUsers": [], + "percentage": 0 + } + rows.insert(delta_date + week + i, neutral) + delta = i + else: + for i in range(max_week): + if end_date is not None and start_date + i * TimeUTC.MS_WEEK >= end_date: + break + + neutral = { + "firstConnexionWeek": start_date, + "week": i, + "usersCount": 0, + "connectedUsers": [], + "percentage": 0 + } + if delta_date + week + i < len(rows) \ + and i != rows[delta_date + week + i]["week"]: + rows.insert(delta_date + week + i, neutral) + elif delta_date + week + i >= len(rows): + rows.append(neutral) + delta = i + week += delta + max_week -= 1 + delta_date += 1 + return rows + + @dev.timed -def get_retention(project_id, startTimestamp=TimeUTC.now(delta_days=-1), endTimestamp=TimeUTC.now(), filters=[], +def get_retention(project_id, startTimestamp=TimeUTC.now(delta_days=-70), endTimestamp=TimeUTC.now(), filters=[], **args): + startTimestamp = TimeUTC.trunc_week(startTimestamp) + endTimestamp = startTimestamp + 10 * TimeUTC.MS_WEEK pg_sub_query = __get_constraints(project_id=project_id, data=args, duration=True, main_table="sessions", time_constraint=True) @@ -130,6 +182,7 @@ def get_retention(project_id, startTimestamp=TimeUTC.now(delta_days=-1), endTime FROM (SELECT DISTINCT user_id, MIN(DATE_TRUNC('week', to_timestamp(start_ts / 1000))) AS first_connexion_week FROM sessions WHERE {" AND ".join(pg_sub_query)} + AND user_id IS NOT NULL AND NOT EXISTS((SELECT 1 FROM sessions AS bsess WHERE bsess.start_ts Date: Tue, 21 Sep 2021 17:31:24 +0200 Subject: [PATCH 18/39] feat(db): changed delta --- .../db/init_dbs/postgresql/{1.4.0/1.4.0.sql => 1.3.5/1.3.5.sql} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename scripts/helm/db/init_dbs/postgresql/{1.4.0/1.4.0.sql => 1.3.5/1.3.5.sql} (100%) diff --git a/scripts/helm/db/init_dbs/postgresql/1.4.0/1.4.0.sql b/scripts/helm/db/init_dbs/postgresql/1.3.5/1.3.5.sql similarity index 100% rename from scripts/helm/db/init_dbs/postgresql/1.4.0/1.4.0.sql rename to scripts/helm/db/init_dbs/postgresql/1.3.5/1.3.5.sql From d7346c43d633bf45dd99ef44634b96e8bfb16e39 Mon Sep 17 00:00:00 2001 From: Kraiem Taha Yassine Date: Tue, 21 Sep 2021 19:25:26 +0200 Subject: [PATCH 19/39] feat(api): changed peerjs URL (#179) feat(utilities): changed peerjs URL --- api/.chalice/config.json | 2 +- api/chalicelib/core/assist.py | 4 ++-- ee/api/.chalice/config.json | 2 +- utilities/servers/peerjs-server.js | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/api/.chalice/config.json b/api/.chalice/config.json index c3bd72cb6..b6f821e3a 100644 --- a/api/.chalice/config.json +++ b/api/.chalice/config.json @@ -33,7 +33,7 @@ "sourcemaps_reader": "http://utilities-openreplay.app.svc.cluster.local:9000/sourcemaps", "sourcemaps_bucket": "sourcemaps", "js_cache_bucket": "sessions-assets", - "peers": "http://utilities-openreplay.app.svc.cluster.local:9000/assist/peers", + "peers": "http://utilities-openreplay.app.svc.cluster.local:9000/assist/%s/peers", "async_Token": "", "EMAIL_HOST": "", "EMAIL_PORT": "587", diff --git a/api/chalicelib/core/assist.py b/api/chalicelib/core/assist.py index 4b57145e8..dbfe8269b 100644 --- a/api/chalicelib/core/assist.py +++ b/api/chalicelib/core/assist.py @@ -21,7 +21,7 @@ SESSION_PROJECTION_COLS = """s.project_id, def get_live_sessions(project_id, filters=None): project_key = projects.get_project_key(project_id) - connected_peers = requests.get(environ["peers"] + f"/{project_key}") + connected_peers = requests.get(environ["peers"] % environ["S3_KEY"] + f"/{project_key}") if connected_peers.status_code != 200: print("!! issue with the peer-server") print(connected_peers.text) @@ -65,7 +65,7 @@ def get_live_sessions(project_id, filters=None): def is_live(project_id, session_id, project_key=None): if project_key is None: project_key = projects.get_project_key(project_id) - connected_peers = requests.get(environ["peers"] + f"/{project_key}") + connected_peers = requests.get(environ["peers"] % environ["S3_KEY"] + f"/{project_key}") if connected_peers.status_code != 200: print("!! issue with the peer-server") print(connected_peers.text) diff --git a/ee/api/.chalice/config.json b/ee/api/.chalice/config.json index 55ace4632..7705f0fbd 100644 --- a/ee/api/.chalice/config.json +++ b/ee/api/.chalice/config.json @@ -35,7 +35,7 @@ "put_S3_TTL": "20", "sourcemaps_reader": "http://utilities-openreplay.app.svc.cluster.local:9000/sourcemaps", "sourcemaps_bucket": "sourcemaps", - "peers": "http://utilities-openreplay.app.svc.cluster.local:9000/assist/peers", + "peers": "http://utilities-openreplay.app.svc.cluster.local:9000/assist/%s/peers", "js_cache_bucket": "sessions-assets", "async_Token": "", "EMAIL_HOST": "", diff --git a/utilities/servers/peerjs-server.js b/utilities/servers/peerjs-server.js index ef6556531..a103764c3 100644 --- a/utilities/servers/peerjs-server.js +++ b/utilities/servers/peerjs-server.js @@ -48,13 +48,13 @@ const peerError = (error) => { } -peerRouter.get('/peers', function (req, res) { +peerRouter.get(`/${process.env.S3_KEY}/peers`, function (req, res) { console.log("looking for all available sessions"); res.statusCode = 200; res.setHeader('Content-Type', 'application/json'); res.end(JSON.stringify({"data": connectedPeers})); }); -peerRouter.get('/peers/:projectKey', function (req, res) { +peerRouter.get(`/${process.env.S3_KEY}/peers/:projectKey`, function (req, res) { console.log(`looking for available sessions for ${req.params.projectKey}`); res.statusCode = 200; res.setHeader('Content-Type', 'application/json'); From 8c15c5a17e247e1eea9837d7eb17e255e15f6882 Mon Sep 17 00:00:00 2001 From: Mehdi Osman Date: Wed, 22 Sep 2021 11:29:48 +0200 Subject: [PATCH 20/39] Update codeql-analysis.yml --- codeql-analysis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/codeql-analysis.yml b/codeql-analysis.yml index a79a63767..7391122e9 100644 --- a/codeql-analysis.yml +++ b/codeql-analysis.yml @@ -18,7 +18,7 @@ on: # The branches below must be a subset of the branches above branches: [ dev ] schedule: - - cron: '30 23 * * 6' + - cron: '30 11 * * *' jobs: analyze: From 5687c060d215fb81fe8abd6e4e7934f4ce0513ee Mon Sep 17 00:00:00 2001 From: Mehdi Osman Date: Wed, 22 Sep 2021 11:30:59 +0200 Subject: [PATCH 21/39] Update codeql-analysis.yml --- codeql-analysis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/codeql-analysis.yml b/codeql-analysis.yml index 7391122e9..1145dc924 100644 --- a/codeql-analysis.yml +++ b/codeql-analysis.yml @@ -18,7 +18,7 @@ on: # The branches below must be a subset of the branches above branches: [ dev ] schedule: - - cron: '30 11 * * *' + - cron: '31 9 * * *' jobs: analyze: From 73ccc5c5d764fa466e1e9ba1e68ec7de7d84a009 Mon Sep 17 00:00:00 2001 From: Mehdi Osman Date: Wed, 22 Sep 2021 11:34:50 +0200 Subject: [PATCH 22/39] Delete codeql-analysis.yml --- codeql-analysis.yml | 71 --------------------------------------------- 1 file changed, 71 deletions(-) delete mode 100644 codeql-analysis.yml diff --git a/codeql-analysis.yml b/codeql-analysis.yml deleted file mode 100644 index 1145dc924..000000000 --- a/codeql-analysis.yml +++ /dev/null @@ -1,71 +0,0 @@ -# For most projects, this workflow file will not need changing; you simply need -# to commit it to your repository. -# -# You may wish to alter this file to override the set of languages analyzed, -# or to provide custom queries or build logic. -# -# ******** NOTE ******** -# We have attempted to detect the languages in your repository. Please check -# the `language` matrix defined below to confirm you have the correct set of -# supported CodeQL languages. -# -name: "CodeQL" - -on: - push: - branches: [ dev ] - pull_request: - # The branches below must be a subset of the branches above - branches: [ dev ] - schedule: - - cron: '31 9 * * *' - -jobs: - analyze: - name: Analyze - runs-on: ubuntu-latest - permissions: - actions: read - contents: read - security-events: write - - strategy: - fail-fast: false - matrix: - language: [ 'go', 'javascript', 'python' ] - # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ] - # Learn more: - # https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed - - steps: - - name: Checkout repository - uses: actions/checkout@v2 - - # Initializes the CodeQL tools for scanning. - - name: Initialize CodeQL - uses: github/codeql-action/init@v1 - with: - languages: ${{ matrix.language }} - # If you wish to specify custom queries, you can do so here or in a config file. - # By default, queries listed here will override any specified in a config file. - # Prefix the list here with "+" to use these queries and those in the config file. - # queries: ./path/to/local/query, your-org/your-repo/queries@main - - # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). - # If this step fails, then you should remove it and run the build manually (see below) - - name: Autobuild - uses: github/codeql-action/autobuild@v1 - - # ℹ️ Command-line programs to run using the OS shell. - # 📚 https://git.io/JvXDl - - # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines - # and modify them (or add more) to build your code if your project - # uses a compiled language - - #- run: | - # make bootstrap - # make release - - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v1 From 97d81ac26718684b4e1179b0f4b4a79865bda22e Mon Sep 17 00:00:00 2001 From: Kraiem Taha Yassine Date: Wed, 22 Sep 2021 13:06:35 +0200 Subject: [PATCH 23/39] security patch (#182) feat(api): dependencies upgrade feat(utilities): dependencies upgrade --- api/requirements.txt | 4 +- ee/api/requirements.txt | 4 +- utilities/package-lock.json | 1034 ++++++++++++++++++++++++++++++++++- utilities/package.json | 2 +- 4 files changed, 1034 insertions(+), 10 deletions(-) diff --git a/api/requirements.txt b/api/requirements.txt index 671aa5da5..f211cec45 100644 --- a/api/requirements.txt +++ b/api/requirements.txt @@ -1,5 +1,5 @@ -requests==2.24.0 -urllib3==1.25.11 +requests==2.26.0 +urllib3==1.26.6 boto3==1.16.1 pyjwt==1.7.1 psycopg2-binary==2.8.6 diff --git a/ee/api/requirements.txt b/ee/api/requirements.txt index 2a31fc27a..8dc6ce340 100644 --- a/ee/api/requirements.txt +++ b/ee/api/requirements.txt @@ -1,5 +1,5 @@ -requests==2.24.0 -urllib3==1.25.11 +requests==2.26.0 +urllib3==1.26.6 boto3==1.16.1 pyjwt==1.7.1 psycopg2-binary==2.8.6 diff --git a/utilities/package-lock.json b/utilities/package-lock.json index 3de98ac06..75a02b0bd 100644 --- a/utilities/package-lock.json +++ b/utilities/package-lock.json @@ -1,8 +1,1031 @@ { "name": "utilities_server", "version": "1.0.0", - "lockfileVersion": 1, + "lockfileVersion": 2, "requires": true, + "packages": { + "": { + "name": "utilities_server", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "aws-sdk": "^2.992.0", + "express": "^4.17.1", + "peer": "^0.6.1", + "source-map": "^0.7.3" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.34", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.34.tgz", + "integrity": "sha512-ePPA/JuI+X0vb+gSWlPKOY0NdNAie/rPUqX2GUPpbZwiKTkSPhjXWuee47E4MtE54QVzGCQMQkAL6JhV2E1+cQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/cors": { + "version": "2.8.10", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.10.tgz", + "integrity": "sha512-C7srjHiVG3Ey1nR6d511dtDkCEjxuN9W1HWAEjGq8kpcwmNM6JJkpC0xvabM7BXTG2wDq8Eu33iH9aQKa7IvLQ==" + }, + "node_modules/@types/express": { + "version": "4.17.12", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.12.tgz", + "integrity": "sha512-pTYas6FrP15B1Oa0bkN5tQMNqOcVXa9j4FTFtO8DWI9kppKib+6NJtfTOOLcwxuuYvcX2+dVG6et1SxW/Kc17Q==", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.21.tgz", + "integrity": "sha512-gwCiEZqW6f7EoR8TTEfalyEhb1zA5jQJnRngr97+3pzMaO1RKoI1w2bw07TK72renMUVWcWS5mLI6rk1NqN0nA==", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "node_modules/@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" + }, + "node_modules/@types/node": { + "version": "15.12.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-15.12.4.tgz", + "integrity": "sha512-zrNj1+yqYF4WskCMOHwN+w9iuD12+dGm0rQ35HLl9/Ouuq52cEtd0CH9qMgrdNmi5ejC1/V7vKEXYubB+65DkA==" + }, + "node_modules/@types/qs": { + "version": "6.9.6", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.6.tgz", + "integrity": "sha512-0/HnwIfW4ki2D8L8c9GVcG5I72s9jP5GSLVF0VIXDW00kmIpA6O33G7a8n59Tmh7Nz0WUC3rSb7PTY/sdW2JzA==" + }, + "node_modules/@types/range-parser": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", + "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==" + }, + "node_modules/@types/serve-static": { + "version": "1.13.9", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.9.tgz", + "integrity": "sha512-ZFqF6qa48XsPdjXV5Gsz0Zqmux2PerNd3a/ktL45mHpa19cuMi/cL8tcxdAx497yRh+QtYPuofjT9oWw9P7nkA==", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/ws": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.5.tgz", + "integrity": "sha512-8mbDgtc8xpxDDem5Gwj76stBDJX35KQ3YBoayxlqUQcL5BZUthiqP/VQ4PQnLHqM4PmlbyO74t98eJpURO+gPA==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dependencies": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "node_modules/aws-sdk": { + "version": "2.992.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.992.0.tgz", + "integrity": "sha512-FP/AOu1nxfaPJ6to05eHriBUzvPiNapEwy96sm5GNOL8/T38k9//H6UhxLJ/46CzxFMH/Mo/WFp0qwpS39ev5A==", + "hasInstallScript": true, + "dependencies": { + "buffer": "4.9.2", + "events": "1.1.1", + "ieee754": "1.1.13", + "jmespath": "0.15.0", + "querystring": "0.2.0", + "sax": "1.2.1", + "url": "0.10.3", + "uuid": "3.3.2", + "xml2js": "0.4.19" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/aws-sdk/node_modules/uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dependencies": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "node_modules/bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dependencies": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "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.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + }, + "node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/jmespath": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", + "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.48.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz", + "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.31", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz", + "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==", + "dependencies": { + "mime-db": "1.48.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/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=" + }, + "node_modules/peer": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/peer/-/peer-0.6.1.tgz", + "integrity": "sha512-zPJSPoZvo+83sPJNrW8o93QTktx7dKk67965RRDDNAIelWw1ZwE6ZmmhsvRrdNRlK0knQb3rR8GBdZlbWzCYJw==", + "dependencies": { + "@types/cors": "^2.8.6", + "@types/express": "^4.17.3", + "@types/ws": "^7.2.3", + "body-parser": "^1.19.0", + "cors": "^2.8.5", + "express": "^4.17.1", + "uuid": "^3.4.0", + "ws": "^7.2.3", + "yargs": "^15.3.1" + }, + "bin": { + "peerjs": "bin/peerjs" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + }, + "node_modules/qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dependencies": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sax": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", + "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=" + }, + "node_modules/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dependencies": { + "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.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + }, + "node_modules/serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "node_modules/setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/url": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", + "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ws": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.0.tgz", + "integrity": "sha512-6ezXvzOZupqKj4jUqbQ9tXuJNo+BR2gU8fFRk3XCP3e0G6WT414u5ELe6Y0vtp7kmSJ3F7YWObSNr1ESsgi4vw==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml2js": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", + "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~9.0.1" + } + }, + "node_modules/xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + }, + "node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + } + }, "dependencies": { "@types/body-parser": { "version": "1.19.0", @@ -112,9 +1135,9 @@ "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, "aws-sdk": { - "version": "2.932.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.932.0.tgz", - "integrity": "sha512-U6MWUtFD0npWa+ReVEgm0fCIM0fMOYahFp14GLv8fC+BWOTvh5Iwt/gF8NrLomx42bBjA1Abaw6yhmiaSJDQHQ==", + "version": "2.992.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.992.0.tgz", + "integrity": "sha512-FP/AOu1nxfaPJ6to05eHriBUzvPiNapEwy96sm5GNOL8/T38k9//H6UhxLJ/46CzxFMH/Mo/WFp0qwpS39ev5A==", "requires": { "buffer": "4.9.2", "events": "1.1.1", @@ -727,7 +1750,8 @@ "ws": { "version": "7.5.0", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.0.tgz", - "integrity": "sha512-6ezXvzOZupqKj4jUqbQ9tXuJNo+BR2gU8fFRk3XCP3e0G6WT414u5ELe6Y0vtp7kmSJ3F7YWObSNr1ESsgi4vw==" + "integrity": "sha512-6ezXvzOZupqKj4jUqbQ9tXuJNo+BR2gU8fFRk3XCP3e0G6WT414u5ELe6Y0vtp7kmSJ3F7YWObSNr1ESsgi4vw==", + "requires": {} }, "xml2js": { "version": "0.4.19", diff --git a/utilities/package.json b/utilities/package.json index d0cfcdbcc..da4c927d9 100644 --- a/utilities/package.json +++ b/utilities/package.json @@ -18,7 +18,7 @@ }, "homepage": "https://github.com/openreplay/openreplay#readme", "dependencies": { - "aws-sdk": "^2.654.0", + "aws-sdk": "^2.992.0", "express": "^4.17.1", "peer": "^0.6.1", "source-map": "^0.7.3" From e16d5d3bb47c8b36f62f3cbffa33d123a9be354e Mon Sep 17 00:00:00 2001 From: ShiKhu Date: Wed, 22 Sep 2021 15:09:37 +0200 Subject: [PATCH 24/39] feat(backend): iframe message --- backend/pkg/messages/filters.go | 2 +- backend/pkg/messages/messages.go | 372 ++------------------------- backend/pkg/messages/read_message.go | 168 +----------- 3 files changed, 30 insertions(+), 512 deletions(-) diff --git a/backend/pkg/messages/filters.go b/backend/pkg/messages/filters.go index d0a17577b..3aa209c42 100644 --- a/backend/pkg/messages/filters.go +++ b/backend/pkg/messages/filters.go @@ -3,7 +3,7 @@ package messages func IsReplayerType(id uint64) bool { - return 0 == id || 4 == id || 5 == id || 6 == id || 7 == id || 8 == id || 9 == id || 10 == id || 11 == id || 12 == id || 13 == id || 14 == id || 15 == id || 16 == id || 18 == id || 19 == id || 20 == id || 22 == id || 37 == id || 38 == id || 39 == id || 40 == id || 41 == id || 44 == id || 45 == id || 46 == id || 47 == id || 48 == id || 49 == id || 54 == id || 55 == id || 59 == id || 90 == id || 93 == id || 100 == id || 102 == id || 103 == id || 105 == id + return 0 == id || 2 == id || 4 == id || 5 == id || 6 == id || 7 == id || 8 == id || 9 == id || 10 == id || 11 == id || 12 == id || 13 == id || 14 == id || 15 == id || 16 == id || 18 == id || 19 == id || 20 == id || 22 == id || 37 == id || 38 == id || 39 == id || 40 == id || 41 == id || 44 == id || 45 == id || 46 == id || 47 == id || 48 == id || 49 == id || 54 == id || 55 == id || 59 == id || 69 == id || 70 == id } func IsIOSType(id uint64) bool { diff --git a/backend/pkg/messages/messages.go b/backend/pkg/messages/messages.go index e150256c3..10cb158ec 100644 --- a/backend/pkg/messages/messages.go +++ b/backend/pkg/messages/messages.go @@ -86,6 +86,18 @@ p = WriteString(msg.UserCountry, buf, p) return buf[:p] } +type SessionDisconnect struct { + *meta + Timestamp uint64 +} +func (msg *SessionDisconnect) Encode() []byte{ + buf := make([]byte, 11 ) + buf[0] = 2 + p := 1 + p = WriteUint(msg.Timestamp, buf, p) + return buf[:p] +} + type SessionEnd struct { *meta Timestamp uint64 @@ -1166,361 +1178,17 @@ p = WriteString(msg.Selector, buf, p) return buf[:p] } -type IOSSessionStart struct { +type CreateIFrameDocument struct { *meta - Timestamp uint64 -ProjectID uint64 -TrackerVersion string -RevID string -UserUUID string -UserOS string -UserOSVersion string -UserDevice string -UserDeviceType string -UserCountry string + FrameID uint64 +ID uint64 } -func (msg *IOSSessionStart) Encode() []byte{ - buf := make([]byte, 101 + len(msg.TrackerVersion)+ len(msg.RevID)+ len(msg.UserUUID)+ len(msg.UserOS)+ len(msg.UserOSVersion)+ len(msg.UserDevice)+ len(msg.UserDeviceType)+ len(msg.UserCountry)) - buf[0] = 90 +func (msg *CreateIFrameDocument) Encode() []byte{ + buf := make([]byte, 21 ) + buf[0] = 70 p := 1 - p = WriteUint(msg.Timestamp, buf, p) -p = WriteUint(msg.ProjectID, buf, p) -p = WriteString(msg.TrackerVersion, buf, p) -p = WriteString(msg.RevID, buf, p) -p = WriteString(msg.UserUUID, buf, p) -p = WriteString(msg.UserOS, buf, p) -p = WriteString(msg.UserOSVersion, buf, p) -p = WriteString(msg.UserDevice, buf, p) -p = WriteString(msg.UserDeviceType, buf, p) -p = WriteString(msg.UserCountry, buf, p) - return buf[:p] -} - -type IOSSessionEnd struct { - *meta - Timestamp uint64 -} -func (msg *IOSSessionEnd) Encode() []byte{ - buf := make([]byte, 11 ) - buf[0] = 91 - p := 1 - p = WriteUint(msg.Timestamp, buf, p) - return buf[:p] -} - -type IOSMetadata struct { - *meta - Timestamp uint64 -Length uint64 -Key string -Value string -} -func (msg *IOSMetadata) Encode() []byte{ - buf := make([]byte, 41 + len(msg.Key)+ len(msg.Value)) - buf[0] = 92 - p := 1 - p = WriteUint(msg.Timestamp, buf, p) -p = WriteUint(msg.Length, buf, p) -p = WriteString(msg.Key, buf, p) -p = WriteString(msg.Value, buf, p) - return buf[:p] -} - -type IOSCustomEvent struct { - *meta - Timestamp uint64 -Length uint64 -Name string -Payload string -} -func (msg *IOSCustomEvent) Encode() []byte{ - buf := make([]byte, 41 + len(msg.Name)+ len(msg.Payload)) - buf[0] = 93 - p := 1 - p = WriteUint(msg.Timestamp, buf, p) -p = WriteUint(msg.Length, buf, p) -p = WriteString(msg.Name, buf, p) -p = WriteString(msg.Payload, buf, p) - return buf[:p] -} - -type IOSUserID struct { - *meta - Timestamp uint64 -Length uint64 -Value string -} -func (msg *IOSUserID) Encode() []byte{ - buf := make([]byte, 31 + len(msg.Value)) - buf[0] = 94 - p := 1 - p = WriteUint(msg.Timestamp, buf, p) -p = WriteUint(msg.Length, buf, p) -p = WriteString(msg.Value, buf, p) - return buf[:p] -} - -type IOSUserAnonymousID struct { - *meta - Timestamp uint64 -Length uint64 -Value string -} -func (msg *IOSUserAnonymousID) Encode() []byte{ - buf := make([]byte, 31 + len(msg.Value)) - buf[0] = 95 - p := 1 - p = WriteUint(msg.Timestamp, buf, p) -p = WriteUint(msg.Length, buf, p) -p = WriteString(msg.Value, buf, p) - return buf[:p] -} - -type IOSScreenChanges struct { - *meta - Timestamp uint64 -SkipData []byte -} -func (msg *IOSScreenChanges) Encode() []byte{ - buf := make([]byte, 21 + len(msg.SkipData)) - buf[0] = 96 - p := 1 - p = WriteUint(msg.Timestamp, buf, p) -p = WriteData(msg.SkipData, buf, p) - return buf[:p] -} - -type IOSCrash struct { - *meta - Timestamp uint64 -Length uint64 -Name string -Reason string -Stacktrace string -} -func (msg *IOSCrash) Encode() []byte{ - buf := make([]byte, 51 + len(msg.Name)+ len(msg.Reason)+ len(msg.Stacktrace)) - buf[0] = 97 - p := 1 - p = WriteUint(msg.Timestamp, buf, p) -p = WriteUint(msg.Length, buf, p) -p = WriteString(msg.Name, buf, p) -p = WriteString(msg.Reason, buf, p) -p = WriteString(msg.Stacktrace, buf, p) - return buf[:p] -} - -type IOSScreenEnter struct { - *meta - Timestamp uint64 -Length uint64 -Title string -ViewName string -} -func (msg *IOSScreenEnter) Encode() []byte{ - buf := make([]byte, 41 + len(msg.Title)+ len(msg.ViewName)) - buf[0] = 98 - p := 1 - p = WriteUint(msg.Timestamp, buf, p) -p = WriteUint(msg.Length, buf, p) -p = WriteString(msg.Title, buf, p) -p = WriteString(msg.ViewName, buf, p) - return buf[:p] -} - -type IOSScreenLeave struct { - *meta - Timestamp uint64 -Length uint64 -Title string -ViewName string -} -func (msg *IOSScreenLeave) Encode() []byte{ - buf := make([]byte, 41 + len(msg.Title)+ len(msg.ViewName)) - buf[0] = 99 - p := 1 - p = WriteUint(msg.Timestamp, buf, p) -p = WriteUint(msg.Length, buf, p) -p = WriteString(msg.Title, buf, p) -p = WriteString(msg.ViewName, buf, p) - return buf[:p] -} - -type IOSClickEvent struct { - *meta - Timestamp uint64 -Length uint64 -Label string -X uint64 -Y uint64 -} -func (msg *IOSClickEvent) Encode() []byte{ - buf := make([]byte, 51 + len(msg.Label)) - buf[0] = 100 - p := 1 - p = WriteUint(msg.Timestamp, buf, p) -p = WriteUint(msg.Length, buf, p) -p = WriteString(msg.Label, buf, p) -p = WriteUint(msg.X, buf, p) -p = WriteUint(msg.Y, buf, p) - return buf[:p] -} - -type IOSInputEvent struct { - *meta - Timestamp uint64 -Length uint64 -Value string -ValueMasked bool -Label string -} -func (msg *IOSInputEvent) Encode() []byte{ - buf := make([]byte, 51 + len(msg.Value)+ len(msg.Label)) - buf[0] = 101 - p := 1 - p = WriteUint(msg.Timestamp, buf, p) -p = WriteUint(msg.Length, buf, p) -p = WriteString(msg.Value, buf, p) -p = WriteBoolean(msg.ValueMasked, buf, p) -p = WriteString(msg.Label, buf, p) - return buf[:p] -} - -type IOSPerformanceEvent struct { - *meta - Timestamp uint64 -Length uint64 -Name string -Value uint64 -} -func (msg *IOSPerformanceEvent) Encode() []byte{ - buf := make([]byte, 41 + len(msg.Name)) - buf[0] = 102 - p := 1 - p = WriteUint(msg.Timestamp, buf, p) -p = WriteUint(msg.Length, buf, p) -p = WriteString(msg.Name, buf, p) -p = WriteUint(msg.Value, buf, p) - return buf[:p] -} - -type IOSLog struct { - *meta - Timestamp uint64 -Length uint64 -Severity string -Content string -} -func (msg *IOSLog) Encode() []byte{ - buf := make([]byte, 41 + len(msg.Severity)+ len(msg.Content)) - buf[0] = 103 - p := 1 - p = WriteUint(msg.Timestamp, buf, p) -p = WriteUint(msg.Length, buf, p) -p = WriteString(msg.Severity, buf, p) -p = WriteString(msg.Content, buf, p) - return buf[:p] -} - -type IOSInternalError struct { - *meta - Timestamp uint64 -Length uint64 -Content string -} -func (msg *IOSInternalError) Encode() []byte{ - buf := make([]byte, 31 + len(msg.Content)) - buf[0] = 104 - p := 1 - p = WriteUint(msg.Timestamp, buf, p) -p = WriteUint(msg.Length, buf, p) -p = WriteString(msg.Content, buf, p) - return buf[:p] -} - -type IOSNetworkCall struct { - *meta - Timestamp uint64 -Length uint64 -Duration uint64 -Headers string -Body string -URL string -Success bool -Method string -Status uint64 -} -func (msg *IOSNetworkCall) Encode() []byte{ - buf := make([]byte, 91 + len(msg.Headers)+ len(msg.Body)+ len(msg.URL)+ len(msg.Method)) - buf[0] = 105 - p := 1 - p = WriteUint(msg.Timestamp, buf, p) -p = WriteUint(msg.Length, buf, p) -p = WriteUint(msg.Duration, buf, p) -p = WriteString(msg.Headers, buf, p) -p = WriteString(msg.Body, buf, p) -p = WriteString(msg.URL, buf, p) -p = WriteBoolean(msg.Success, buf, p) -p = WriteString(msg.Method, buf, p) -p = WriteUint(msg.Status, buf, p) - return buf[:p] -} - -type IOSPerformanceAggregated struct { - *meta - TimestampStart uint64 -TimestampEnd uint64 -MinFPS uint64 -AvgFPS uint64 -MaxFPS uint64 -MinCPU uint64 -AvgCPU uint64 -MaxCPU uint64 -MinMemory uint64 -AvgMemory uint64 -MaxMemory uint64 -MinBattery uint64 -AvgBattery uint64 -MaxBattery uint64 -} -func (msg *IOSPerformanceAggregated) Encode() []byte{ - buf := make([]byte, 141 ) - buf[0] = 110 - p := 1 - p = WriteUint(msg.TimestampStart, buf, p) -p = WriteUint(msg.TimestampEnd, buf, p) -p = WriteUint(msg.MinFPS, buf, p) -p = WriteUint(msg.AvgFPS, buf, p) -p = WriteUint(msg.MaxFPS, buf, p) -p = WriteUint(msg.MinCPU, buf, p) -p = WriteUint(msg.AvgCPU, buf, p) -p = WriteUint(msg.MaxCPU, buf, p) -p = WriteUint(msg.MinMemory, buf, p) -p = WriteUint(msg.AvgMemory, buf, p) -p = WriteUint(msg.MaxMemory, buf, p) -p = WriteUint(msg.MinBattery, buf, p) -p = WriteUint(msg.AvgBattery, buf, p) -p = WriteUint(msg.MaxBattery, buf, p) - return buf[:p] -} - -type IOSIssueEvent struct { - *meta - Timestamp uint64 -Type string -ContextString string -Context string -Payload string -} -func (msg *IOSIssueEvent) Encode() []byte{ - buf := make([]byte, 51 + len(msg.Type)+ len(msg.ContextString)+ len(msg.Context)+ len(msg.Payload)) - buf[0] = 111 - p := 1 - p = WriteUint(msg.Timestamp, buf, p) -p = WriteString(msg.Type, buf, p) -p = WriteString(msg.ContextString, buf, p) -p = WriteString(msg.Context, buf, p) -p = WriteString(msg.Payload, buf, p) + p = WriteUint(msg.FrameID, buf, p) +p = WriteUint(msg.ID, buf, p) return buf[:p] } diff --git a/backend/pkg/messages/read_message.go b/backend/pkg/messages/read_message.go index dced60ed8..87993e9f3 100644 --- a/backend/pkg/messages/read_message.go +++ b/backend/pkg/messages/read_message.go @@ -44,6 +44,11 @@ if msg.UserDeviceHeapSize, err = ReadUint(reader); err != nil { return nil, err if msg.UserCountry, err = ReadString(reader); err != nil { return nil, err } return msg, nil + case 2: + msg := &SessionDisconnect{ meta: &meta{ TypeID: 2} } + if msg.Timestamp, err = ReadUint(reader); err != nil { return nil, err } + return msg, nil + case 3: msg := &SessionEnd{ meta: &meta{ TypeID: 3} } if msg.Timestamp, err = ReadUint(reader); err != nil { return nil, err } @@ -521,165 +526,10 @@ if msg.Label, err = ReadString(reader); err != nil { return nil, err } if msg.Selector, err = ReadString(reader); err != nil { return nil, err } return msg, nil - case 90: - msg := &IOSSessionStart{ meta: &meta{ TypeID: 90} } - if msg.Timestamp, err = ReadUint(reader); err != nil { return nil, err } -if msg.ProjectID, err = ReadUint(reader); err != nil { return nil, err } -if msg.TrackerVersion, err = ReadString(reader); err != nil { return nil, err } -if msg.RevID, err = ReadString(reader); err != nil { return nil, err } -if msg.UserUUID, err = ReadString(reader); err != nil { return nil, err } -if msg.UserOS, err = ReadString(reader); err != nil { return nil, err } -if msg.UserOSVersion, err = ReadString(reader); err != nil { return nil, err } -if msg.UserDevice, err = ReadString(reader); err != nil { return nil, err } -if msg.UserDeviceType, err = ReadString(reader); err != nil { return nil, err } -if msg.UserCountry, err = ReadString(reader); err != nil { return nil, err } - return msg, nil - - case 91: - msg := &IOSSessionEnd{ meta: &meta{ TypeID: 91} } - if msg.Timestamp, err = ReadUint(reader); err != nil { return nil, err } - return msg, nil - - case 92: - msg := &IOSMetadata{ meta: &meta{ TypeID: 92} } - if msg.Timestamp, err = ReadUint(reader); err != nil { return nil, err } -if msg.Length, err = ReadUint(reader); err != nil { return nil, err } -if msg.Key, err = ReadString(reader); err != nil { return nil, err } -if msg.Value, err = ReadString(reader); err != nil { return nil, err } - return msg, nil - - case 93: - msg := &IOSCustomEvent{ meta: &meta{ TypeID: 93} } - if msg.Timestamp, err = ReadUint(reader); err != nil { return nil, err } -if msg.Length, err = ReadUint(reader); err != nil { return nil, err } -if msg.Name, err = ReadString(reader); err != nil { return nil, err } -if msg.Payload, err = ReadString(reader); err != nil { return nil, err } - return msg, nil - - case 94: - msg := &IOSUserID{ meta: &meta{ TypeID: 94} } - if msg.Timestamp, err = ReadUint(reader); err != nil { return nil, err } -if msg.Length, err = ReadUint(reader); err != nil { return nil, err } -if msg.Value, err = ReadString(reader); err != nil { return nil, err } - return msg, nil - - case 95: - msg := &IOSUserAnonymousID{ meta: &meta{ TypeID: 95} } - if msg.Timestamp, err = ReadUint(reader); err != nil { return nil, err } -if msg.Length, err = ReadUint(reader); err != nil { return nil, err } -if msg.Value, err = ReadString(reader); err != nil { return nil, err } - return msg, nil - - case 96: - msg := &IOSScreenChanges{ meta: &meta{ TypeID: 96} } - if msg.Timestamp, err = ReadUint(reader); err != nil { return nil, err } -if msg.SkipData, err = ReadData(reader); err != nil { return nil, err } - return msg, nil - - case 97: - msg := &IOSCrash{ meta: &meta{ TypeID: 97} } - if msg.Timestamp, err = ReadUint(reader); err != nil { return nil, err } -if msg.Length, err = ReadUint(reader); err != nil { return nil, err } -if msg.Name, err = ReadString(reader); err != nil { return nil, err } -if msg.Reason, err = ReadString(reader); err != nil { return nil, err } -if msg.Stacktrace, err = ReadString(reader); err != nil { return nil, err } - return msg, nil - - case 98: - msg := &IOSScreenEnter{ meta: &meta{ TypeID: 98} } - if msg.Timestamp, err = ReadUint(reader); err != nil { return nil, err } -if msg.Length, err = ReadUint(reader); err != nil { return nil, err } -if msg.Title, err = ReadString(reader); err != nil { return nil, err } -if msg.ViewName, err = ReadString(reader); err != nil { return nil, err } - return msg, nil - - case 99: - msg := &IOSScreenLeave{ meta: &meta{ TypeID: 99} } - if msg.Timestamp, err = ReadUint(reader); err != nil { return nil, err } -if msg.Length, err = ReadUint(reader); err != nil { return nil, err } -if msg.Title, err = ReadString(reader); err != nil { return nil, err } -if msg.ViewName, err = ReadString(reader); err != nil { return nil, err } - return msg, nil - - case 100: - msg := &IOSClickEvent{ meta: &meta{ TypeID: 100} } - if msg.Timestamp, err = ReadUint(reader); err != nil { return nil, err } -if msg.Length, err = ReadUint(reader); err != nil { return nil, err } -if msg.Label, err = ReadString(reader); err != nil { return nil, err } -if msg.X, err = ReadUint(reader); err != nil { return nil, err } -if msg.Y, err = ReadUint(reader); err != nil { return nil, err } - return msg, nil - - case 101: - msg := &IOSInputEvent{ meta: &meta{ TypeID: 101} } - if msg.Timestamp, err = ReadUint(reader); err != nil { return nil, err } -if msg.Length, err = ReadUint(reader); err != nil { return nil, err } -if msg.Value, err = ReadString(reader); err != nil { return nil, err } -if msg.ValueMasked, err = ReadBoolean(reader); err != nil { return nil, err } -if msg.Label, err = ReadString(reader); err != nil { return nil, err } - return msg, nil - - case 102: - msg := &IOSPerformanceEvent{ meta: &meta{ TypeID: 102} } - if msg.Timestamp, err = ReadUint(reader); err != nil { return nil, err } -if msg.Length, err = ReadUint(reader); err != nil { return nil, err } -if msg.Name, err = ReadString(reader); err != nil { return nil, err } -if msg.Value, err = ReadUint(reader); err != nil { return nil, err } - return msg, nil - - case 103: - msg := &IOSLog{ meta: &meta{ TypeID: 103} } - if msg.Timestamp, err = ReadUint(reader); err != nil { return nil, err } -if msg.Length, err = ReadUint(reader); err != nil { return nil, err } -if msg.Severity, err = ReadString(reader); err != nil { return nil, err } -if msg.Content, err = ReadString(reader); err != nil { return nil, err } - return msg, nil - - case 104: - msg := &IOSInternalError{ meta: &meta{ TypeID: 104} } - if msg.Timestamp, err = ReadUint(reader); err != nil { return nil, err } -if msg.Length, err = ReadUint(reader); err != nil { return nil, err } -if msg.Content, err = ReadString(reader); err != nil { return nil, err } - return msg, nil - - case 105: - msg := &IOSNetworkCall{ meta: &meta{ TypeID: 105} } - if msg.Timestamp, err = ReadUint(reader); err != nil { return nil, err } -if msg.Length, err = ReadUint(reader); err != nil { return nil, err } -if msg.Duration, err = ReadUint(reader); err != nil { return nil, err } -if msg.Headers, err = ReadString(reader); err != nil { return nil, err } -if msg.Body, err = ReadString(reader); err != nil { return nil, err } -if msg.URL, err = ReadString(reader); err != nil { return nil, err } -if msg.Success, err = ReadBoolean(reader); err != nil { return nil, err } -if msg.Method, err = ReadString(reader); err != nil { return nil, err } -if msg.Status, err = ReadUint(reader); err != nil { return nil, err } - return msg, nil - - case 110: - msg := &IOSPerformanceAggregated{ meta: &meta{ TypeID: 110} } - if msg.TimestampStart, err = ReadUint(reader); err != nil { return nil, err } -if msg.TimestampEnd, err = ReadUint(reader); err != nil { return nil, err } -if msg.MinFPS, err = ReadUint(reader); err != nil { return nil, err } -if msg.AvgFPS, err = ReadUint(reader); err != nil { return nil, err } -if msg.MaxFPS, err = ReadUint(reader); err != nil { return nil, err } -if msg.MinCPU, err = ReadUint(reader); err != nil { return nil, err } -if msg.AvgCPU, err = ReadUint(reader); err != nil { return nil, err } -if msg.MaxCPU, err = ReadUint(reader); err != nil { return nil, err } -if msg.MinMemory, err = ReadUint(reader); err != nil { return nil, err } -if msg.AvgMemory, err = ReadUint(reader); err != nil { return nil, err } -if msg.MaxMemory, err = ReadUint(reader); err != nil { return nil, err } -if msg.MinBattery, err = ReadUint(reader); err != nil { return nil, err } -if msg.AvgBattery, err = ReadUint(reader); err != nil { return nil, err } -if msg.MaxBattery, err = ReadUint(reader); err != nil { return nil, err } - return msg, nil - - case 111: - msg := &IOSIssueEvent{ meta: &meta{ TypeID: 111} } - if msg.Timestamp, err = ReadUint(reader); err != nil { return nil, err } -if msg.Type, err = ReadString(reader); err != nil { return nil, err } -if msg.ContextString, err = ReadString(reader); err != nil { return nil, err } -if msg.Context, err = ReadString(reader); err != nil { return nil, err } -if msg.Payload, err = ReadString(reader); err != nil { return nil, err } + case 70: + msg := &CreateIFrameDocument{ meta: &meta{ TypeID: 70} } + if msg.FrameID, err = ReadUint(reader); err != nil { return nil, err } +if msg.ID, err = ReadUint(reader); err != nil { return nil, err } return msg, nil } From b9ff2fc0fd2f90cef0b60ee4c05b39e0eafac4d4 Mon Sep 17 00:00:00 2001 From: ShiKhu Date: Wed, 22 Sep 2021 15:18:14 +0200 Subject: [PATCH 25/39] fix(backend): changes to force github action --- backend/services/db/main.go | 2 +- backend/services/ender/main.go | 2 +- backend/services/http/main.go | 2 +- backend/services/sink/main.go | 2 +- backend/services/storage/main.go | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/backend/services/db/main.go b/backend/services/db/main.go index a2cef41b3..8594b0784 100644 --- a/backend/services/db/main.go +++ b/backend/services/db/main.go @@ -17,7 +17,7 @@ import ( "openreplay/backend/services/db/heuristics" ) - + var pg *cache.PGCache func main() { diff --git a/backend/services/ender/main.go b/backend/services/ender/main.go index e99c6866c..c7f22e6d7 100644 --- a/backend/services/ender/main.go +++ b/backend/services/ender/main.go @@ -15,7 +15,7 @@ import ( "openreplay/backend/pkg/queue/types" "openreplay/backend/services/ender/builder" ) - + func main() { log.SetFlags(log.LstdFlags | log.LUTC | log.Llongfile) diff --git a/backend/services/http/main.go b/backend/services/http/main.go index 29181718f..dc2eb1720 100644 --- a/backend/services/http/main.go +++ b/backend/services/http/main.go @@ -24,7 +24,7 @@ import ( "openreplay/backend/services/http/uaparser" ) - + var rewriter *assets.Rewriter var producer types.Producer var pgconn *cache.PGCache diff --git a/backend/services/sink/main.go b/backend/services/sink/main.go index 52227805f..ae8a2b572 100644 --- a/backend/services/sink/main.go +++ b/backend/services/sink/main.go @@ -16,7 +16,7 @@ import ( ) - + func main() { log.SetFlags(log.LstdFlags | log.LUTC | log.Llongfile) diff --git a/backend/services/storage/main.go b/backend/services/storage/main.go index 5033fb845..03474133b 100644 --- a/backend/services/storage/main.go +++ b/backend/services/storage/main.go @@ -17,7 +17,7 @@ import ( ) - + func main() { log.SetFlags(log.LstdFlags | log.LUTC | log.Llongfile) From a0f284c8ea809711eb7c9e1613484bbe19cf9618 Mon Sep 17 00:00:00 2001 From: ShiKhu Date: Wed, 22 Sep 2021 15:58:19 +0200 Subject: [PATCH 26/39] fix(backend): compile fix --- backend/pkg/messages/filters.go | 2 +- backend/pkg/messages/messages.go | 358 +++++++++++++++++++++++++++ backend/pkg/messages/read_message.go | 161 ++++++++++++ backend/services/db/main.go | 2 +- backend/services/ender/main.go | 2 +- backend/services/http/main.go | 2 +- backend/services/sink/main.go | 2 +- backend/services/storage/main.go | 2 +- 8 files changed, 525 insertions(+), 6 deletions(-) diff --git a/backend/pkg/messages/filters.go b/backend/pkg/messages/filters.go index 3aa209c42..80525a2cd 100644 --- a/backend/pkg/messages/filters.go +++ b/backend/pkg/messages/filters.go @@ -3,7 +3,7 @@ package messages func IsReplayerType(id uint64) bool { - return 0 == id || 2 == id || 4 == id || 5 == id || 6 == id || 7 == id || 8 == id || 9 == id || 10 == id || 11 == id || 12 == id || 13 == id || 14 == id || 15 == id || 16 == id || 18 == id || 19 == id || 20 == id || 22 == id || 37 == id || 38 == id || 39 == id || 40 == id || 41 == id || 44 == id || 45 == id || 46 == id || 47 == id || 48 == id || 49 == id || 54 == id || 55 == id || 59 == id || 69 == id || 70 == id + return 0 == id || 2 == id || 4 == id || 5 == id || 6 == id || 7 == id || 8 == id || 9 == id || 10 == id || 11 == id || 12 == id || 13 == id || 14 == id || 15 == id || 16 == id || 18 == id || 19 == id || 20 == id || 22 == id || 37 == id || 38 == id || 39 == id || 40 == id || 41 == id || 44 == id || 45 == id || 46 == id || 47 == id || 48 == id || 49 == id || 54 == id || 55 == id || 59 == id || 69 == id || 70 == id || 90 == id || 93 == id || 100 == id || 102 == id || 103 == id || 105 == id } func IsIOSType(id uint64) bool { diff --git a/backend/pkg/messages/messages.go b/backend/pkg/messages/messages.go index 10cb158ec..2f1865884 100644 --- a/backend/pkg/messages/messages.go +++ b/backend/pkg/messages/messages.go @@ -1192,3 +1192,361 @@ p = WriteUint(msg.ID, buf, p) return buf[:p] } +type IOSSessionStart struct { + *meta + Timestamp uint64 +ProjectID uint64 +TrackerVersion string +RevID string +UserUUID string +UserOS string +UserOSVersion string +UserDevice string +UserDeviceType string +UserCountry string +} +func (msg *IOSSessionStart) Encode() []byte{ + buf := make([]byte, 101 + len(msg.TrackerVersion)+ len(msg.RevID)+ len(msg.UserUUID)+ len(msg.UserOS)+ len(msg.UserOSVersion)+ len(msg.UserDevice)+ len(msg.UserDeviceType)+ len(msg.UserCountry)) + buf[0] = 90 + p := 1 + p = WriteUint(msg.Timestamp, buf, p) +p = WriteUint(msg.ProjectID, buf, p) +p = WriteString(msg.TrackerVersion, buf, p) +p = WriteString(msg.RevID, buf, p) +p = WriteString(msg.UserUUID, buf, p) +p = WriteString(msg.UserOS, buf, p) +p = WriteString(msg.UserOSVersion, buf, p) +p = WriteString(msg.UserDevice, buf, p) +p = WriteString(msg.UserDeviceType, buf, p) +p = WriteString(msg.UserCountry, buf, p) + return buf[:p] +} + +type IOSSessionEnd struct { + *meta + Timestamp uint64 +} +func (msg *IOSSessionEnd) Encode() []byte{ + buf := make([]byte, 11 ) + buf[0] = 91 + p := 1 + p = WriteUint(msg.Timestamp, buf, p) + return buf[:p] +} + +type IOSMetadata struct { + *meta + Timestamp uint64 +Length uint64 +Key string +Value string +} +func (msg *IOSMetadata) Encode() []byte{ + buf := make([]byte, 41 + len(msg.Key)+ len(msg.Value)) + buf[0] = 92 + p := 1 + p = WriteUint(msg.Timestamp, buf, p) +p = WriteUint(msg.Length, buf, p) +p = WriteString(msg.Key, buf, p) +p = WriteString(msg.Value, buf, p) + return buf[:p] +} + +type IOSCustomEvent struct { + *meta + Timestamp uint64 +Length uint64 +Name string +Payload string +} +func (msg *IOSCustomEvent) Encode() []byte{ + buf := make([]byte, 41 + len(msg.Name)+ len(msg.Payload)) + buf[0] = 93 + p := 1 + p = WriteUint(msg.Timestamp, buf, p) +p = WriteUint(msg.Length, buf, p) +p = WriteString(msg.Name, buf, p) +p = WriteString(msg.Payload, buf, p) + return buf[:p] +} + +type IOSUserID struct { + *meta + Timestamp uint64 +Length uint64 +Value string +} +func (msg *IOSUserID) Encode() []byte{ + buf := make([]byte, 31 + len(msg.Value)) + buf[0] = 94 + p := 1 + p = WriteUint(msg.Timestamp, buf, p) +p = WriteUint(msg.Length, buf, p) +p = WriteString(msg.Value, buf, p) + return buf[:p] +} + +type IOSUserAnonymousID struct { + *meta + Timestamp uint64 +Length uint64 +Value string +} +func (msg *IOSUserAnonymousID) Encode() []byte{ + buf := make([]byte, 31 + len(msg.Value)) + buf[0] = 95 + p := 1 + p = WriteUint(msg.Timestamp, buf, p) +p = WriteUint(msg.Length, buf, p) +p = WriteString(msg.Value, buf, p) + return buf[:p] +} + +type IOSScreenChanges struct { + *meta + Timestamp uint64 +SkipData []byte +} +func (msg *IOSScreenChanges) Encode() []byte{ + buf := make([]byte, 21 + len(msg.SkipData)) + buf[0] = 96 + p := 1 + p = WriteUint(msg.Timestamp, buf, p) +p = WriteData(msg.SkipData, buf, p) + return buf[:p] +} + +type IOSCrash struct { + *meta + Timestamp uint64 +Length uint64 +Name string +Reason string +Stacktrace string +} +func (msg *IOSCrash) Encode() []byte{ + buf := make([]byte, 51 + len(msg.Name)+ len(msg.Reason)+ len(msg.Stacktrace)) + buf[0] = 97 + p := 1 + p = WriteUint(msg.Timestamp, buf, p) +p = WriteUint(msg.Length, buf, p) +p = WriteString(msg.Name, buf, p) +p = WriteString(msg.Reason, buf, p) +p = WriteString(msg.Stacktrace, buf, p) + return buf[:p] +} + +type IOSScreenEnter struct { + *meta + Timestamp uint64 +Length uint64 +Title string +ViewName string +} +func (msg *IOSScreenEnter) Encode() []byte{ + buf := make([]byte, 41 + len(msg.Title)+ len(msg.ViewName)) + buf[0] = 98 + p := 1 + p = WriteUint(msg.Timestamp, buf, p) +p = WriteUint(msg.Length, buf, p) +p = WriteString(msg.Title, buf, p) +p = WriteString(msg.ViewName, buf, p) + return buf[:p] +} + +type IOSScreenLeave struct { + *meta + Timestamp uint64 +Length uint64 +Title string +ViewName string +} +func (msg *IOSScreenLeave) Encode() []byte{ + buf := make([]byte, 41 + len(msg.Title)+ len(msg.ViewName)) + buf[0] = 99 + p := 1 + p = WriteUint(msg.Timestamp, buf, p) +p = WriteUint(msg.Length, buf, p) +p = WriteString(msg.Title, buf, p) +p = WriteString(msg.ViewName, buf, p) + return buf[:p] +} + +type IOSClickEvent struct { + *meta + Timestamp uint64 +Length uint64 +Label string +X uint64 +Y uint64 +} +func (msg *IOSClickEvent) Encode() []byte{ + buf := make([]byte, 51 + len(msg.Label)) + buf[0] = 100 + p := 1 + p = WriteUint(msg.Timestamp, buf, p) +p = WriteUint(msg.Length, buf, p) +p = WriteString(msg.Label, buf, p) +p = WriteUint(msg.X, buf, p) +p = WriteUint(msg.Y, buf, p) + return buf[:p] +} + +type IOSInputEvent struct { + *meta + Timestamp uint64 +Length uint64 +Value string +ValueMasked bool +Label string +} +func (msg *IOSInputEvent) Encode() []byte{ + buf := make([]byte, 51 + len(msg.Value)+ len(msg.Label)) + buf[0] = 101 + p := 1 + p = WriteUint(msg.Timestamp, buf, p) +p = WriteUint(msg.Length, buf, p) +p = WriteString(msg.Value, buf, p) +p = WriteBoolean(msg.ValueMasked, buf, p) +p = WriteString(msg.Label, buf, p) + return buf[:p] +} + +type IOSPerformanceEvent struct { + *meta + Timestamp uint64 +Length uint64 +Name string +Value uint64 +} +func (msg *IOSPerformanceEvent) Encode() []byte{ + buf := make([]byte, 41 + len(msg.Name)) + buf[0] = 102 + p := 1 + p = WriteUint(msg.Timestamp, buf, p) +p = WriteUint(msg.Length, buf, p) +p = WriteString(msg.Name, buf, p) +p = WriteUint(msg.Value, buf, p) + return buf[:p] +} + +type IOSLog struct { + *meta + Timestamp uint64 +Length uint64 +Severity string +Content string +} +func (msg *IOSLog) Encode() []byte{ + buf := make([]byte, 41 + len(msg.Severity)+ len(msg.Content)) + buf[0] = 103 + p := 1 + p = WriteUint(msg.Timestamp, buf, p) +p = WriteUint(msg.Length, buf, p) +p = WriteString(msg.Severity, buf, p) +p = WriteString(msg.Content, buf, p) + return buf[:p] +} + +type IOSInternalError struct { + *meta + Timestamp uint64 +Length uint64 +Content string +} +func (msg *IOSInternalError) Encode() []byte{ + buf := make([]byte, 31 + len(msg.Content)) + buf[0] = 104 + p := 1 + p = WriteUint(msg.Timestamp, buf, p) +p = WriteUint(msg.Length, buf, p) +p = WriteString(msg.Content, buf, p) + return buf[:p] +} + +type IOSNetworkCall struct { + *meta + Timestamp uint64 +Length uint64 +Duration uint64 +Headers string +Body string +URL string +Success bool +Method string +Status uint64 +} +func (msg *IOSNetworkCall) Encode() []byte{ + buf := make([]byte, 91 + len(msg.Headers)+ len(msg.Body)+ len(msg.URL)+ len(msg.Method)) + buf[0] = 105 + p := 1 + p = WriteUint(msg.Timestamp, buf, p) +p = WriteUint(msg.Length, buf, p) +p = WriteUint(msg.Duration, buf, p) +p = WriteString(msg.Headers, buf, p) +p = WriteString(msg.Body, buf, p) +p = WriteString(msg.URL, buf, p) +p = WriteBoolean(msg.Success, buf, p) +p = WriteString(msg.Method, buf, p) +p = WriteUint(msg.Status, buf, p) + return buf[:p] +} + +type IOSPerformanceAggregated struct { + *meta + TimestampStart uint64 +TimestampEnd uint64 +MinFPS uint64 +AvgFPS uint64 +MaxFPS uint64 +MinCPU uint64 +AvgCPU uint64 +MaxCPU uint64 +MinMemory uint64 +AvgMemory uint64 +MaxMemory uint64 +MinBattery uint64 +AvgBattery uint64 +MaxBattery uint64 +} +func (msg *IOSPerformanceAggregated) Encode() []byte{ + buf := make([]byte, 141 ) + buf[0] = 110 + p := 1 + p = WriteUint(msg.TimestampStart, buf, p) +p = WriteUint(msg.TimestampEnd, buf, p) +p = WriteUint(msg.MinFPS, buf, p) +p = WriteUint(msg.AvgFPS, buf, p) +p = WriteUint(msg.MaxFPS, buf, p) +p = WriteUint(msg.MinCPU, buf, p) +p = WriteUint(msg.AvgCPU, buf, p) +p = WriteUint(msg.MaxCPU, buf, p) +p = WriteUint(msg.MinMemory, buf, p) +p = WriteUint(msg.AvgMemory, buf, p) +p = WriteUint(msg.MaxMemory, buf, p) +p = WriteUint(msg.MinBattery, buf, p) +p = WriteUint(msg.AvgBattery, buf, p) +p = WriteUint(msg.MaxBattery, buf, p) + return buf[:p] +} + +type IOSIssueEvent struct { + *meta + Timestamp uint64 +Type string +ContextString string +Context string +Payload string +} +func (msg *IOSIssueEvent) Encode() []byte{ + buf := make([]byte, 51 + len(msg.Type)+ len(msg.ContextString)+ len(msg.Context)+ len(msg.Payload)) + buf[0] = 111 + p := 1 + p = WriteUint(msg.Timestamp, buf, p) +p = WriteString(msg.Type, buf, p) +p = WriteString(msg.ContextString, buf, p) +p = WriteString(msg.Context, buf, p) +p = WriteString(msg.Payload, buf, p) + return buf[:p] +} + diff --git a/backend/pkg/messages/read_message.go b/backend/pkg/messages/read_message.go index 87993e9f3..5803e0051 100644 --- a/backend/pkg/messages/read_message.go +++ b/backend/pkg/messages/read_message.go @@ -532,6 +532,167 @@ if msg.Selector, err = ReadString(reader); err != nil { return nil, err } if msg.ID, err = ReadUint(reader); err != nil { return nil, err } return msg, nil + case 90: + msg := &IOSSessionStart{ meta: &meta{ TypeID: 90} } + if msg.Timestamp, err = ReadUint(reader); err != nil { return nil, err } +if msg.ProjectID, err = ReadUint(reader); err != nil { return nil, err } +if msg.TrackerVersion, err = ReadString(reader); err != nil { return nil, err } +if msg.RevID, err = ReadString(reader); err != nil { return nil, err } +if msg.UserUUID, err = ReadString(reader); err != nil { return nil, err } +if msg.UserOS, err = ReadString(reader); err != nil { return nil, err } +if msg.UserOSVersion, err = ReadString(reader); err != nil { return nil, err } +if msg.UserDevice, err = ReadString(reader); err != nil { return nil, err } +if msg.UserDeviceType, err = ReadString(reader); err != nil { return nil, err } +if msg.UserCountry, err = ReadString(reader); err != nil { return nil, err } + return msg, nil + + case 91: + msg := &IOSSessionEnd{ meta: &meta{ TypeID: 91} } + if msg.Timestamp, err = ReadUint(reader); err != nil { return nil, err } + return msg, nil + + case 92: + msg := &IOSMetadata{ meta: &meta{ TypeID: 92} } + if msg.Timestamp, err = ReadUint(reader); err != nil { return nil, err } +if msg.Length, err = ReadUint(reader); err != nil { return nil, err } +if msg.Key, err = ReadString(reader); err != nil { return nil, err } +if msg.Value, err = ReadString(reader); err != nil { return nil, err } + return msg, nil + + case 93: + msg := &IOSCustomEvent{ meta: &meta{ TypeID: 93} } + if msg.Timestamp, err = ReadUint(reader); err != nil { return nil, err } +if msg.Length, err = ReadUint(reader); err != nil { return nil, err } +if msg.Name, err = ReadString(reader); err != nil { return nil, err } +if msg.Payload, err = ReadString(reader); err != nil { return nil, err } + return msg, nil + + case 94: + msg := &IOSUserID{ meta: &meta{ TypeID: 94} } + if msg.Timestamp, err = ReadUint(reader); err != nil { return nil, err } +if msg.Length, err = ReadUint(reader); err != nil { return nil, err } +if msg.Value, err = ReadString(reader); err != nil { return nil, err } + return msg, nil + + case 95: + msg := &IOSUserAnonymousID{ meta: &meta{ TypeID: 95} } + if msg.Timestamp, err = ReadUint(reader); err != nil { return nil, err } +if msg.Length, err = ReadUint(reader); err != nil { return nil, err } +if msg.Value, err = ReadString(reader); err != nil { return nil, err } + return msg, nil + + case 96: + msg := &IOSScreenChanges{ meta: &meta{ TypeID: 96} } + if msg.Timestamp, err = ReadUint(reader); err != nil { return nil, err } +if msg.SkipData, err = ReadData(reader); err != nil { return nil, err } + return msg, nil + + case 97: + msg := &IOSCrash{ meta: &meta{ TypeID: 97} } + if msg.Timestamp, err = ReadUint(reader); err != nil { return nil, err } +if msg.Length, err = ReadUint(reader); err != nil { return nil, err } +if msg.Name, err = ReadString(reader); err != nil { return nil, err } +if msg.Reason, err = ReadString(reader); err != nil { return nil, err } +if msg.Stacktrace, err = ReadString(reader); err != nil { return nil, err } + return msg, nil + + case 98: + msg := &IOSScreenEnter{ meta: &meta{ TypeID: 98} } + if msg.Timestamp, err = ReadUint(reader); err != nil { return nil, err } +if msg.Length, err = ReadUint(reader); err != nil { return nil, err } +if msg.Title, err = ReadString(reader); err != nil { return nil, err } +if msg.ViewName, err = ReadString(reader); err != nil { return nil, err } + return msg, nil + + case 99: + msg := &IOSScreenLeave{ meta: &meta{ TypeID: 99} } + if msg.Timestamp, err = ReadUint(reader); err != nil { return nil, err } +if msg.Length, err = ReadUint(reader); err != nil { return nil, err } +if msg.Title, err = ReadString(reader); err != nil { return nil, err } +if msg.ViewName, err = ReadString(reader); err != nil { return nil, err } + return msg, nil + + case 100: + msg := &IOSClickEvent{ meta: &meta{ TypeID: 100} } + if msg.Timestamp, err = ReadUint(reader); err != nil { return nil, err } +if msg.Length, err = ReadUint(reader); err != nil { return nil, err } +if msg.Label, err = ReadString(reader); err != nil { return nil, err } +if msg.X, err = ReadUint(reader); err != nil { return nil, err } +if msg.Y, err = ReadUint(reader); err != nil { return nil, err } + return msg, nil + + case 101: + msg := &IOSInputEvent{ meta: &meta{ TypeID: 101} } + if msg.Timestamp, err = ReadUint(reader); err != nil { return nil, err } +if msg.Length, err = ReadUint(reader); err != nil { return nil, err } +if msg.Value, err = ReadString(reader); err != nil { return nil, err } +if msg.ValueMasked, err = ReadBoolean(reader); err != nil { return nil, err } +if msg.Label, err = ReadString(reader); err != nil { return nil, err } + return msg, nil + + case 102: + msg := &IOSPerformanceEvent{ meta: &meta{ TypeID: 102} } + if msg.Timestamp, err = ReadUint(reader); err != nil { return nil, err } +if msg.Length, err = ReadUint(reader); err != nil { return nil, err } +if msg.Name, err = ReadString(reader); err != nil { return nil, err } +if msg.Value, err = ReadUint(reader); err != nil { return nil, err } + return msg, nil + + case 103: + msg := &IOSLog{ meta: &meta{ TypeID: 103} } + if msg.Timestamp, err = ReadUint(reader); err != nil { return nil, err } +if msg.Length, err = ReadUint(reader); err != nil { return nil, err } +if msg.Severity, err = ReadString(reader); err != nil { return nil, err } +if msg.Content, err = ReadString(reader); err != nil { return nil, err } + return msg, nil + + case 104: + msg := &IOSInternalError{ meta: &meta{ TypeID: 104} } + if msg.Timestamp, err = ReadUint(reader); err != nil { return nil, err } +if msg.Length, err = ReadUint(reader); err != nil { return nil, err } +if msg.Content, err = ReadString(reader); err != nil { return nil, err } + return msg, nil + + case 105: + msg := &IOSNetworkCall{ meta: &meta{ TypeID: 105} } + if msg.Timestamp, err = ReadUint(reader); err != nil { return nil, err } +if msg.Length, err = ReadUint(reader); err != nil { return nil, err } +if msg.Duration, err = ReadUint(reader); err != nil { return nil, err } +if msg.Headers, err = ReadString(reader); err != nil { return nil, err } +if msg.Body, err = ReadString(reader); err != nil { return nil, err } +if msg.URL, err = ReadString(reader); err != nil { return nil, err } +if msg.Success, err = ReadBoolean(reader); err != nil { return nil, err } +if msg.Method, err = ReadString(reader); err != nil { return nil, err } +if msg.Status, err = ReadUint(reader); err != nil { return nil, err } + return msg, nil + + case 110: + msg := &IOSPerformanceAggregated{ meta: &meta{ TypeID: 110} } + if msg.TimestampStart, err = ReadUint(reader); err != nil { return nil, err } +if msg.TimestampEnd, err = ReadUint(reader); err != nil { return nil, err } +if msg.MinFPS, err = ReadUint(reader); err != nil { return nil, err } +if msg.AvgFPS, err = ReadUint(reader); err != nil { return nil, err } +if msg.MaxFPS, err = ReadUint(reader); err != nil { return nil, err } +if msg.MinCPU, err = ReadUint(reader); err != nil { return nil, err } +if msg.AvgCPU, err = ReadUint(reader); err != nil { return nil, err } +if msg.MaxCPU, err = ReadUint(reader); err != nil { return nil, err } +if msg.MinMemory, err = ReadUint(reader); err != nil { return nil, err } +if msg.AvgMemory, err = ReadUint(reader); err != nil { return nil, err } +if msg.MaxMemory, err = ReadUint(reader); err != nil { return nil, err } +if msg.MinBattery, err = ReadUint(reader); err != nil { return nil, err } +if msg.AvgBattery, err = ReadUint(reader); err != nil { return nil, err } +if msg.MaxBattery, err = ReadUint(reader); err != nil { return nil, err } + return msg, nil + + case 111: + msg := &IOSIssueEvent{ meta: &meta{ TypeID: 111} } + if msg.Timestamp, err = ReadUint(reader); err != nil { return nil, err } +if msg.Type, err = ReadString(reader); err != nil { return nil, err } +if msg.ContextString, err = ReadString(reader); err != nil { return nil, err } +if msg.Context, err = ReadString(reader); err != nil { return nil, err } +if msg.Payload, err = ReadString(reader); err != nil { return nil, err } + return msg, nil + } return nil, fmt.Errorf("Unknown message code: %v", t) } diff --git a/backend/services/db/main.go b/backend/services/db/main.go index 8594b0784..a2cef41b3 100644 --- a/backend/services/db/main.go +++ b/backend/services/db/main.go @@ -17,7 +17,7 @@ import ( "openreplay/backend/services/db/heuristics" ) - + var pg *cache.PGCache func main() { diff --git a/backend/services/ender/main.go b/backend/services/ender/main.go index c7f22e6d7..e99c6866c 100644 --- a/backend/services/ender/main.go +++ b/backend/services/ender/main.go @@ -15,7 +15,7 @@ import ( "openreplay/backend/pkg/queue/types" "openreplay/backend/services/ender/builder" ) - + func main() { log.SetFlags(log.LstdFlags | log.LUTC | log.Llongfile) diff --git a/backend/services/http/main.go b/backend/services/http/main.go index dc2eb1720..29181718f 100644 --- a/backend/services/http/main.go +++ b/backend/services/http/main.go @@ -24,7 +24,7 @@ import ( "openreplay/backend/services/http/uaparser" ) - + var rewriter *assets.Rewriter var producer types.Producer var pgconn *cache.PGCache diff --git a/backend/services/sink/main.go b/backend/services/sink/main.go index ae8a2b572..52227805f 100644 --- a/backend/services/sink/main.go +++ b/backend/services/sink/main.go @@ -16,7 +16,7 @@ import ( ) - + func main() { log.SetFlags(log.LstdFlags | log.LUTC | log.Llongfile) diff --git a/backend/services/storage/main.go b/backend/services/storage/main.go index 03474133b..5033fb845 100644 --- a/backend/services/storage/main.go +++ b/backend/services/storage/main.go @@ -17,7 +17,7 @@ import ( ) - + func main() { log.SetFlags(log.LstdFlags | log.LUTC | log.Llongfile) From ef5021d1c6c6ecc6de4dff049002b0314e2750b9 Mon Sep 17 00:00:00 2001 From: Taha Yassine Kraiem Date: Wed, 22 Sep 2021 16:25:02 +0200 Subject: [PATCH 27/39] feat(api): chalice.yaml removed peers&sourcemaps env-var override --- scripts/helm/app/chalice.yaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/scripts/helm/app/chalice.yaml b/scripts/helm/app/chalice.yaml index 2a83f5deb..4ef1eecc7 100644 --- a/scripts/helm/app/chalice.yaml +++ b/scripts/helm/app/chalice.yaml @@ -54,8 +54,6 @@ env: sessions_bucket: mobs sourcemaps_bucket: sourcemaps js_cache_bucket: sessions-assets - sourcemaps_reader: 'http://utilities-openreplay.app.svc.cluster.local:9000/assist/sourcemaps' - peers: 'http://utilities-openreplay.app.svc.cluster.local:9000/assist/peers' # Enable logging for python app # Ref: https://stackoverflow.com/questions/43969743/logs-in-kubernetes-pod-not-showing-up PYTHONUNBUFFERED: '0' From 2bf1130b898bfebe298cc833b06a0edb9c0091a1 Mon Sep 17 00:00:00 2001 From: ShiKhu Date: Wed, 22 Sep 2021 19:17:57 +0200 Subject: [PATCH 28/39] fev (backend): test log --- backend/services/sink/main.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/backend/services/sink/main.go b/backend/services/sink/main.go index 52227805f..8e8afbd5a 100644 --- a/backend/services/sink/main.go +++ b/backend/services/sink/main.go @@ -15,7 +15,7 @@ import ( "openreplay/backend/pkg/queue/types" ) - + func main() { log.SetFlags(log.LstdFlags | log.LUTC | log.Llongfile) @@ -36,6 +36,9 @@ func main() { // return // } typeID := message.Meta().TypeID + if typeID == 70 { + log.Println("iframe here") + } if !messages.IsReplayerType(typeID) { return } From 7b5d21a220c9800c1d0f7194396297193b985bd4 Mon Sep 17 00:00:00 2001 From: ShiKhu Date: Thu, 23 Sep 2021 17:56:19 +0200 Subject: [PATCH 29/39] dev(backend): remove test log --- backend/services/sink/main.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/backend/services/sink/main.go b/backend/services/sink/main.go index 8e8afbd5a..4a6ac189d 100644 --- a/backend/services/sink/main.go +++ b/backend/services/sink/main.go @@ -36,9 +36,6 @@ func main() { // return // } typeID := message.Meta().TypeID - if typeID == 70 { - log.Println("iframe here") - } if !messages.IsReplayerType(typeID) { return } From 2ebdd3d67ff1c0ba872417db06aa813b34d34eb7 Mon Sep 17 00:00:00 2001 From: ShiKhu Date: Thu, 23 Sep 2021 18:04:26 +0200 Subject: [PATCH 30/39] feat (frontend): re-call peer on remote page reload --- .../AssistActions/AssistActions.tsx | 25 ++-- .../managers/AssistManager.ts | 117 ++++++++++-------- .../managers/StylesManager.js | 92 -------------- 3 files changed, 80 insertions(+), 154 deletions(-) delete mode 100644 frontend/app/player/MessageDistributor/managers/StylesManager.js diff --git a/frontend/app/components/Assist/components/AssistActions/AssistActions.tsx b/frontend/app/components/Assist/components/AssistActions/AssistActions.tsx index 0d51cca91..1c5af3090 100644 --- a/frontend/app/components/Assist/components/AssistActions/AssistActions.tsx +++ b/frontend/app/components/Assist/components/AssistActions/AssistActions.tsx @@ -10,6 +10,19 @@ import { CallingState, ConnectionStatus } from 'Player/MessageDistributor/manage import { toast } from 'react-toastify'; import stl from './AassistActions.css' +function onClose(stream) { + stream.getTracks().forEach(t=>t.stop()); +} + +function onReject() { + toast.info(`Call was rejected.`); +} + +function onError(e) { + toast.error(e); +} + + interface Props { userId: String, toggleChatWindow: (state) => void, @@ -32,18 +45,6 @@ function AssistActions({ toggleChatWindow, userId, calling, peerConnectionStatus } }, [peerConnectionStatus]) - function onClose(stream) { - stream.getTracks().forEach(t=>t.stop()); - } - - function onReject() { - toast.info(`Call was rejected.`); - } - - function onError(e) { - toast.error(e); - } - function onCallConnect(lStream) { setLocalStream(lStream); setEndCall(() => callPeer( diff --git a/frontend/app/player/MessageDistributor/managers/AssistManager.ts b/frontend/app/player/MessageDistributor/managers/AssistManager.ts index ea2121464..7e6dce18d 100644 --- a/frontend/app/player/MessageDistributor/managers/AssistManager.ts +++ b/frontend/app/player/MessageDistributor/managers/AssistManager.ts @@ -10,6 +10,7 @@ import { update, getState } from '../../store'; export enum CallingState { + Reconnecting, Requesting, True, False, @@ -38,7 +39,7 @@ export function getStatusText(status: ConnectionStatus): string { case ConnectionStatus.Error: return "Something went wrong. Try to reload the page."; case ConnectionStatus.WaitingMessages: - return "Connected. Waiting for the data..." + return "Connected. Waiting for the data... (The tab might be inactive)" } } @@ -187,6 +188,13 @@ export default class AssistManager { const conn = this.peer.connect(id, { serialization: 'json', reliable: true}); conn.on('open', () => { window.addEventListener("beforeunload", ()=>conn.open &&conn.send("unload")); + + //console.log("peer connected") + + + if (getState().calling === CallingState.Reconnecting) { + this._call() + } let i = 0; let firstMessage = true; @@ -195,7 +203,7 @@ export default class AssistManager { conn.on('data', (data) => { if (!Array.isArray(data)) { return this.handleCommand(data); } - this.mesagesRecieved = true; + this.disconnectTimeout && clearTimeout(this.disconnectTimeout); if (firstMessage) { firstMessage = false; this.setStatus(ConnectionStatus.Connected) @@ -246,8 +254,8 @@ export default class AssistManager { const onDataClose = () => { - this.initiateCallEnd(); - this.setStatus(ConnectionStatus.Connecting); + this.onCallDisconnect() + //console.log('closed peer conn. Reconnecting...') this.connectToPeer(); } @@ -276,8 +284,6 @@ export default class AssistManager { } - private onCallEnd: null | (()=>void) = null; - private onReject: null | (()=>void) = null; private forceCallEnd() { this.callConnection?.close(); } @@ -290,33 +296,37 @@ export default class AssistManager { private initiateCallEnd = () => { this.forceCallEnd(); this.notifyCallEnd(); - this.onCallEnd?.(); + this.localCallData && this.localCallData.onCallEnd(); } private onTrackerCallEnd = () => { + console.log('onTrackerCallEnd') this.forceCallEnd(); if (getState().calling === CallingState.Requesting) { - this.onReject?.(); + this.localCallData && this.localCallData.onReject(); + } + this.localCallData && this.localCallData.onCallEnd(); + } + + private onCallDisconnect = () => { + if (getState().calling === CallingState.True) { + update({ calling: CallingState.Reconnecting }); } - this.onCallEnd?.(); } - - private mesagesRecieved: boolean = false; + private disconnectTimeout: ReturnType | undefined; private handleCommand(command: string) { + console.log("Data command", command) switch (command) { case "unload": - this.onTrackerCallEnd(); - this.mesagesRecieved = false; - setTimeout(() => { - if (this.mesagesRecieved) { - return; - } - // @ts-ignore - this.dataConnection?.close(); + //this.onTrackerCallEnd(); + this.onCallDisconnect() + this.dataConnection?.close(); + this.disconnectTimeout = setTimeout(() => { + this.onTrackerCallEnd(); this.setStatus(ConnectionStatus.Disconnected); - }, 8000); // TODO: more convenient way + }, 15000); // TODO: more convenient way //this.dataConnection?.close(); return; case "call_end": @@ -337,60 +347,67 @@ export default class AssistManager { conn.send({ x: Math.round(data.x), y: Math.round(data.y) }); } + + private localCallData: { + localStream: MediaStream, + onStream: (s: MediaStream)=>void, + onCallEnd: () => void, + onReject: () => void, + onError?: ()=> void + } | null = null call(localStream: MediaStream, onStream: (s: MediaStream)=>void, onCallEnd: () => void, onReject: () => void, onError?: ()=> void): null | Function { - if (!this.peer || getState().calling !== CallingState.False) { return null; } + this.localCallData = { + localStream, + onStream, + onCallEnd: () => { + onCallEnd(); + this.md.overlay.removeEventListener("mousemove", this.onMouseMove); + update({ calling: CallingState.False }); + this.localCallData = null; + }, + onReject, + onError, + } + this._call() + return this.initiateCallEnd; + } + + private _call() { + if (!this.peer || !this.localCallData || ![CallingState.False, CallingState.Reconnecting].includes(getState().calling)) { return null; } update({ calling: CallingState.Requesting }); - - const call = this.peer.call(this.peerID, localStream); - call.on('stream', stream => { - //call.peerConnection.ontrack = (t)=> console.log('ontrack', t) + //console.log('calling...', this.localCallData.localStream) + + const call = this.peer.call(this.peerID, this.localCallData.localStream); + call.on('stream', stream => { update({ calling: CallingState.True }); - onStream(stream); + this.localCallData && this.localCallData.onStream(stream); this.send({ name: store.getState().getIn([ 'user', 'account', 'name']), }); - // @ts-ignore ?? this.md.overlay.addEventListener("mousemove", this.onMouseMove) }); - this.onCallEnd = () => { - onCallEnd(); - // @ts-ignore ?? - this.md.overlay.removeEventListener("mousemove", this.onMouseMove); - update({ calling: CallingState.False }); - this.onCallEnd = null; - } - - call.on("close", this.onCallEnd); + call.on("close", this.localCallData.onCallEnd); call.on("error", (e) => { console.error("PeerJS error (on call):", e) - this.initiateCallEnd?.(); - onError?.(); + this.initiateCallEnd(); + this.localCallData && this.localCallData.onError && this.localCallData.onError(); }); - // const intervalID = setInterval(() => { - // if (!call.open && getState().calling === CallingState.True) { - // this.onCallEnd?.(); - // clearInterval(intervalID); - // } - // }, 5000); - window.addEventListener("beforeunload", this.initiateCallEnd) - - return this.initiateCallEnd; } clear() { this.initiateCallEnd(); this.dataCheckIntervalID && clearInterval(this.dataCheckIntervalID); if (this.peer) { - this.peer.connections[this.peerID]?.forEach(c => c.open && c.close()); - this.peer.disconnect(); - this.peer.destroy(); + //console.log("destroying peer...") + const peer = this.peer; // otherwise it calls reconnection on data chan close this.peer = null; + peer.destroy(); } } } diff --git a/frontend/app/player/MessageDistributor/managers/StylesManager.js b/frontend/app/player/MessageDistributor/managers/StylesManager.js deleted file mode 100644 index 9ae18fc83..000000000 --- a/frontend/app/player/MessageDistributor/managers/StylesManager.js +++ /dev/null @@ -1,92 +0,0 @@ -// @flow - -import type StatedScreen from '../StatedScreen'; -import type { CssInsertRule, CssDeleteRule } from '../messages'; -import type { Timed } from '../Timed'; - -type CSSRuleMessage = CssInsertRule | CssDeleteRule; -type TimedCSSRuleMessage = Timed & CSSRuleMessage; - -import logger from 'App/logger'; -import ListWalker from './ListWalker'; - -export default class StylesManager extends ListWalker { - #screen: StatedScreen; - _linkLoadingCount: number = 0; - _linkLoadPromises: Array> = []; - _skipCSSLinks: Array = []; // should be common for all pages - - constructor(screen: StatedScreen) { - super(); - this.#screen = screen; - } - - reset():void { - super.reset(); - this._linkLoadingCount = 0; - this._linkLoadPromises = []; - - //cancel all promises? tothinkaboutit - } - - setStyleHandlers(node: HTMLLinkElement, value: string): void { - let timeoutId; - const promise = new Promise((resolve) => { - if (this._skipCSSLinks.includes(value)) resolve(); - this._linkLoadingCount++; - this.#screen.setCSSLoading(true); - const setSkipAndResolve = () => { - this._skipCSSLinks.push(value); // watch out - resolve(); - } - timeoutId = setTimeout(setSkipAndResolve, 4000); - - node.onload = resolve; - node.onerror = setSkipAndResolve; - }).then(() => { - node.onload = null; - node.onerror = null; - clearTimeout(timeoutId); - this._linkLoadingCount--; - if (this._linkLoadingCount === 0) { - this.#screen.setCSSLoading(false); - } - }); - this._linkLoadPromises.push(promise); - } - - #manageRule = (msg: CSSRuleMessage):void => { - // if (msg.tp === "css_insert_rule") { - // let styleSheet = this.#screen.document.styleSheets[ msg.stylesheetID ]; - // if (!styleSheet) { - // logger.log("No stylesheet with corresponding ID found: ", msg) - // styleSheet = this.#screen.document.styleSheets[0]; - // if (!styleSheet) { - // return; - // } - // } - // try { - // styleSheet.insertRule(msg.rule, msg.index); - // } catch (e) { - // logger.log(e, msg) - // //const index = Math.min(msg.index, styleSheet.cssRules.length); - // styleSheet.insertRule(msg.rule, styleSheet.cssRules.length); - // //styleSheet.ownerNode.innerHTML += msg.rule; - // } - // } - // if (msg.tp === "css_delete_rule") { - // // console.warn('Warning: STYLESHEET_DELETE_RULE msg') - // const styleSheet = this.#screen.document.styleSheets[msg.stylesheetID]; - // if (!styleSheet) { - // logger.log("No stylesheet with corresponding ID found: ", msg) - // return; - // } - // styleSheet.deleteRule(msg.index); - // } - } - - moveReady(t: number): Promise { - return Promise.all(this._linkLoadPromises) - .then(() => this.moveApply(t, this.#manageRule)); - } -} \ No newline at end of file From 43862e32e15f7d3d6f7f23c1c28ee6207c57b395 Mon Sep 17 00:00:00 2001 From: ShiKhu Date: Thu, 23 Sep 2021 18:06:18 +0200 Subject: [PATCH 31/39] frontend (feat): maintaining of iframes in replay & hover styles rewriting --- .../MessageDistributor/managers/DOMManager.ts | 29 ++++- .../managers/StylesManager.ts | 109 ++++++++++++++++++ .../app/player/MessageDistributor/messages.ts | 38 +++++- 3 files changed, 171 insertions(+), 5 deletions(-) create mode 100644 frontend/app/player/MessageDistributor/managers/StylesManager.ts diff --git a/frontend/app/player/MessageDistributor/managers/DOMManager.ts b/frontend/app/player/MessageDistributor/managers/DOMManager.ts index 1d723a923..cd5e77b02 100644 --- a/frontend/app/player/MessageDistributor/managers/DOMManager.ts +++ b/frontend/app/player/MessageDistributor/managers/DOMManager.ts @@ -3,7 +3,7 @@ import type { Message, SetNodeScroll, CreateElementNode } from '../messages'; import type { TimedMessage } from '../Timed'; import logger from 'App/logger'; -import StylesManager from './StylesManager'; +import StylesManager, { rewriteNodeStyleSheet } from './StylesManager'; import ListWalker from './ListWalker'; import type { Timed }from '../Timed'; @@ -147,6 +147,7 @@ export default class DOMManager extends ListWalker { this.insertNode(msg); break; case "create_element_node": + // console.log('elementnode', msg) if (msg.svg) { this.nl[ msg.id ] = document.createElementNS('http://www.w3.org/2000/svg', msg.tag); } else { @@ -207,9 +208,14 @@ export default class DOMManager extends ListWalker { break; case "set_node_data": case "set_css_data": - if (!this.nl[ msg.id ]) { logger.error("Node not found", msg); break; } + node = this.nl[ msg.id ] + if (!node) { logger.error("Node not found", msg); break; } // @ts-ignore - this.nl[ msg.id ].data = msg.data; + node.data = msg.data; + if (node instanceof HTMLStyleElement) { + const doc = this.screen.document + doc && rewriteNodeStyleSheet(doc, node) + } break; case "css_insert_rule": node = this.nl[ msg.id ]; @@ -239,6 +245,23 @@ export default class DOMManager extends ListWalker { } catch (e) { logger.warn(e, msg) } + break; + case "create_i_frame_document": + // console.log('ifr', msg) + node = this.nl[ msg.frameID ]; + if (!(node instanceof HTMLIFrameElement)) { + logger.warn("create_i_frame_document message. Node is not iframe") + return; + } + console.log("iframe", msg) + // await new Promise(resolve => { node.onload = resolve }) + + const doc = node.contentDocument; + if (!doc) { + logger.warn("No iframe doc", msg, node, node.contentDocument); + return; + } + this.nl[ msg.id ] = doc.documentElement break; //not sure what to do with this one //case "disconnected": diff --git a/frontend/app/player/MessageDistributor/managers/StylesManager.ts b/frontend/app/player/MessageDistributor/managers/StylesManager.ts new file mode 100644 index 000000000..389533368 --- /dev/null +++ b/frontend/app/player/MessageDistributor/managers/StylesManager.ts @@ -0,0 +1,109 @@ + +import type StatedScreen from '../StatedScreen'; +import type { CssInsertRule, CssDeleteRule } from '../messages'; +import type { Timed } from '../Timed'; + +type CSSRuleMessage = CssInsertRule | CssDeleteRule; +type TimedCSSRuleMessage = Timed & CSSRuleMessage; + +import logger from 'App/logger'; +import ListWalker from './ListWalker'; + + +const HOVER_CN = "-openreplay-hover"; +const HOVER_SELECTOR = `.${HOVER_CN}`; + +// Doesn't work with css files (hasOwnProperty) +export function rewriteNodeStyleSheet(doc: Document, node: HTMLLinkElement | HTMLStyleElement) { + const ss = Object.values(doc.styleSheets).find(s => s.ownerNode === node); + if (!ss || !ss.hasOwnProperty('rules')) { return; } + for(let i = 0; i < ss.rules.length; i++){ + const r = ss.rules[i] + if (r instanceof CSSStyleRule) { + r.selectorText = r.selectorText.replace('/\:hover/g', HOVER_SELECTOR) + } + } +} + +export default class StylesManager extends ListWalker { + private linkLoadingCount: number = 0; + private linkLoadPromises: Array> = []; + private skipCSSLinks: Array = []; // should be common for all pages + + constructor(private readonly screen: StatedScreen) { + super(); + } + + reset():void { + super.reset(); + this.linkLoadingCount = 0; + this.linkLoadPromises = []; + + //cancel all promises? tothinkaboutit + } + + setStyleHandlers(node: HTMLLinkElement, value: string): void { + let timeoutId; + const promise = new Promise((resolve) => { + if (this.skipCSSLinks.includes(value)) resolve(null); + this.linkLoadingCount++; + this.screen.setCSSLoading(true); + const addSkipAndResolve = () => { + this.skipCSSLinks.push(value); // watch out + resolve(null); + } + timeoutId = setTimeout(addSkipAndResolve, 4000); + + node.onload = () => { + const doc = this.screen.document; + doc && rewriteNodeStyleSheet(doc, node); + resolve(null); + } + node.onerror = addSkipAndResolve; + }).then(() => { + node.onload = null; + node.onerror = null; + clearTimeout(timeoutId); + this.linkLoadingCount--; + if (this.linkLoadingCount === 0) { + this.screen.setCSSLoading(false); + } + }); + this.linkLoadPromises.push(promise); + } + + private manageRule = (msg: CSSRuleMessage):void => { + // if (msg.tp === "css_insert_rule") { + // let styleSheet = this.#screen.document.styleSheets[ msg.stylesheetID ]; + // if (!styleSheet) { + // logger.log("No stylesheet with corresponding ID found: ", msg) + // styleSheet = this.#screen.document.styleSheets[0]; + // if (!styleSheet) { + // return; + // } + // } + // try { + // styleSheet.insertRule(msg.rule, msg.index); + // } catch (e) { + // logger.log(e, msg) + // //const index = Math.min(msg.index, styleSheet.cssRules.length); + // styleSheet.insertRule(msg.rule, styleSheet.cssRules.length); + // //styleSheet.ownerNode.innerHTML += msg.rule; + // } + // } + // if (msg.tp === "css_delete_rule") { + // // console.warn('Warning: STYLESHEET_DELETE_RULE msg') + // const styleSheet = this.#screen.document.styleSheets[msg.stylesheetID]; + // if (!styleSheet) { + // logger.log("No stylesheet with corresponding ID found: ", msg) + // return; + // } + // styleSheet.deleteRule(msg.index); + // } + } + + moveReady(t: number): Promise { + return Promise.all(this.linkLoadPromises) + .then(() => this.moveApply(t, this.manageRule)); + } +} \ No newline at end of file diff --git a/frontend/app/player/MessageDistributor/messages.ts b/frontend/app/player/MessageDistributor/messages.ts index 92c7e60fb..6d9f3244c 100644 --- a/frontend/app/player/MessageDistributor/messages.ts +++ b/frontend/app/player/MessageDistributor/messages.ts @@ -36,6 +36,8 @@ export const ID_TP_MAP = { 54: "connection_information", 55: "set_page_visibility", 59: "long_task", + 69: "mouse_click", + 70: "create_i_frame_document", } as const; @@ -255,11 +257,26 @@ export interface LongTask { containerName: string, } +export interface MouseClick { + tp: "mouse_click", + id: number, + hesitationTime: number, + label: string, + selector: string, +} -export type Message = Timestamp | SetPageLocation | SetViewportSize | SetViewportScroll | CreateDocument | CreateElementNode | CreateTextNode | MoveNode | RemoveNode | SetNodeAttribute | RemoveNodeAttribute | SetNodeData | SetCssData | SetNodeScroll | SetInputValue | SetInputChecked | MouseMove | ConsoleLog | CssInsertRule | CssDeleteRule | Fetch | Profiler | OTable | Redux | Vuex | MobX | NgRx | GraphQl | PerformanceTrack | ConnectionInformation | SetPageVisibility | LongTask; +export interface CreateIFrameDocument { + tp: "create_i_frame_document", + frameID: number, + id: number, +} + + +export type Message = Timestamp | SetPageLocation | SetViewportSize | SetViewportScroll | CreateDocument | CreateElementNode | CreateTextNode | MoveNode | RemoveNode | SetNodeAttribute | RemoveNodeAttribute | SetNodeData | SetCssData | SetNodeScroll | SetInputValue | SetInputChecked | MouseMove | ConsoleLog | CssInsertRule | CssDeleteRule | Fetch | Profiler | OTable | Redux | Vuex | MobX | NgRx | GraphQl | PerformanceTrack | ConnectionInformation | SetPageVisibility | LongTask | MouseClick | CreateIFrameDocument; export default function (r: PrimitiveReader): Message | null { - switch (r.readUint()) { + const ui= r.readUint() + switch (ui) { case 0: return { @@ -509,7 +526,24 @@ export default function (r: PrimitiveReader): Message | null { containerName: r.readString(), }; + case 69: + return { + tp: ID_TP_MAP[69], + id: r.readUint(), + hesitationTime: r.readUint(), + label: r.readString(), + selector: r.readString(), + }; + + case 70: + return { + tp: ID_TP_MAP[70], + frameID: r.readUint(), + id: r.readUint(), + }; + default: + console.log("wtf is this", ui) r.readUint(); // IOS skip timestamp r.skip(r.readUint()); return null; From ba7ae009c4a684b640fa791ca0ab3eac2b563a45 Mon Sep 17 00:00:00 2001 From: ShiKhu Date: Thu, 23 Sep 2021 19:14:45 +0200 Subject: [PATCH 32/39] feat(tracker): 3.4.0 - iframe, resourceBaseHref & finder performance options --- tracker/tracker/package-lock.json | 2 +- tracker/tracker/package.json | 2 +- tracker/tracker/src/main/app/index.ts | 33 +- tracker/tracker/src/main/app/observer.ts | 196 +++++++--- tracker/tracker/src/main/modules/cssrules.ts | 3 +- tracker/tracker/src/main/modules/img.ts | 6 +- tracker/tracker/src/main/modules/mouse.ts | 17 +- tracker/tracker/src/main/utils.ts | 10 - .../src/main/vendors/finder/finder.d.ts | 12 - .../tracker/src/main/vendors/finder/finder.js | 339 ------------------ .../tracker/src/main/vendors/finder/finder.ts | 22 +- tracker/tracker/src/messages/index.ts | 16 + 12 files changed, 228 insertions(+), 430 deletions(-) delete mode 100644 tracker/tracker/src/main/vendors/finder/finder.d.ts delete mode 100644 tracker/tracker/src/main/vendors/finder/finder.js diff --git a/tracker/tracker/package-lock.json b/tracker/tracker/package-lock.json index 2d6f47ed9..6eba67e3c 100644 --- a/tracker/tracker/package-lock.json +++ b/tracker/tracker/package-lock.json @@ -1,6 +1,6 @@ { "name": "@openreplay/tracker", - "version": "3.2.5", + "version": "3.3.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/tracker/tracker/package.json b/tracker/tracker/package.json index c6049da67..d88d366da 100644 --- a/tracker/tracker/package.json +++ b/tracker/tracker/package.json @@ -1,7 +1,7 @@ { "name": "@openreplay/tracker", "description": "The OpenReplay tracker main package", - "version": "3.3.0", + "version": "3.4.0", "keywords": [ "logging", "replay" diff --git a/tracker/tracker/src/main/app/index.ts b/tracker/tracker/src/main/app/index.ts index 8102df880..5efea1cf9 100644 --- a/tracker/tracker/src/main/app/index.ts +++ b/tracker/tracker/src/main/app/index.ts @@ -1,4 +1,4 @@ -import { timestamp, log } from '../utils'; +import { timestamp, log, warn } from '../utils'; import { Timestamp, TechnicalInfo, PageClose } from '../../messages'; import Message from '../../messages/message'; import Nodes from './nodes'; @@ -24,6 +24,8 @@ export type Options = { session_pageno_key: string; local_uuid_key: string; ingestPoint: string; + resourceBaseHref: string, // resourceHref? + //resourceURLRewriter: (url: string) => string | boolean, __is_snippet: boolean; __debug_report_edp: string | null; onStart?: (info: OnStartInfo) => void; @@ -65,10 +67,12 @@ export default class App { session_pageno_key: '__openreplay_pageno', local_uuid_key: '__openreplay_uuid', ingestPoint: DEFAULT_INGEST_POINT, + resourceBaseHref: '', __is_snippet: false, __debug_report_edp: null, obscureTextEmails: true, obscureTextNumbers: false, + captureIFrames: false, }, opts, ); @@ -118,6 +122,7 @@ export default class App { if(this.options.__debug_report_edp !== null) { fetch(this.options.__debug_report_edp, { method: 'POST', + headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ context, error: `${e}` @@ -199,11 +204,26 @@ export default class App { return this._sessionID || undefined; } getHost(): string { - return new URL(this.options.ingestPoint).host; + return new URL(this.options.ingestPoint).hostname + } + getProjectKey(): string { + return this.projectKey + } + getBaseHref(): string { + if (this.options.resourceBaseHref) { + return this.options.resourceBaseHref + } + if (document.baseURI) { + return document.baseURI + } + // IE only + return document.head + ?.getElementsByTagName("base")[0] + ?.getAttribute("href") || location.origin + location.pathname } isServiceURL(url: string): boolean { - return url.startsWith(this.options.ingestPoint); + return url.startsWith(this.options.ingestPoint) } active(): boolean { @@ -211,10 +231,10 @@ export default class App { } private _start(reset: boolean): Promise { if (!this.isActive) { - this.isActive = true; if (!this.worker) { - throw new Error("Stranger things: no worker found"); + return Promise.reject("No worker found: perhaps, CSP is not set."); } + this.isActive = true; let pageNo: number = 0; const pageNoStr = sessionStorage.getItem(this.options.session_pageno_key); @@ -273,7 +293,7 @@ export default class App { this._sessionID = sessionID; } if (!this.worker) { - throw new Error("Stranger things: no worker found after start request"); + throw new Error("no worker found after start request (this might not happen)"); } this.worker.postMessage({ token, beaconSizeLimit }); this.startCallbacks.forEach((cb) => cb()); @@ -289,6 +309,7 @@ export default class App { }) .catch(e => { this.stop(); + warn("OpenReplay was unable to start. ", e) this.sendDebugReport("session_start", e); throw e; }) diff --git a/tracker/tracker/src/main/app/observer.ts b/tracker/tracker/src/main/app/observer.ts index 88168cad8..493c7aaac 100644 --- a/tracker/tracker/src/main/app/observer.ts +++ b/tracker/tracker/src/main/app/observer.ts @@ -1,4 +1,4 @@ -import { stars, hasOpenreplayAttribute, getBaseURI } from '../utils'; +import { stars, hasOpenreplayAttribute } from '../utils'; import { CreateDocument, CreateElementNode, @@ -10,37 +10,49 @@ import { RemoveNodeAttribute, MoveNode, RemoveNode, + CreateIFrameDocument, } from '../../messages'; import App from './index'; +interface Window extends WindowProxy { + HTMLInputElement: typeof HTMLInputElement, + HTMLLinkElement: typeof HTMLLinkElement, + HTMLStyleElement: typeof HTMLStyleElement, + SVGStyleElement: typeof SVGStyleElement, + HTMLIFrameElement: typeof HTMLIFrameElement, + Text: typeof Text, + Element: typeof Element, + //parent: Window, +} + + +type WindowConstructor = + Document | + Element | + Text | + HTMLInputElement | + HTMLLinkElement | + HTMLStyleElement | + HTMLIFrameElement + +// type ConstructorNames = +// 'Element' | +// 'Text' | +// 'HTMLInputElement' | +// 'HTMLLinkElement' | +// 'HTMLStyleElement' | +// 'HTMLIFrameElement' +type Constructor = { new (...args: any[]): T , name: string }; + + function isSVGElement(node: Element): node is SVGElement { return node.namespaceURI === 'http://www.w3.org/2000/svg'; } -function isIgnored(node: Node): boolean { - if (node instanceof Text) { - return false; - } - if (!(node instanceof Element)) { - return true; - } - const tag = node.tagName.toUpperCase(); - if (tag === 'LINK') { - const rel = node.getAttribute('rel'); - const as = node.getAttribute('as'); - return !(rel?.includes('stylesheet') || as === "style" || as === "font"); - } - return ( - tag === 'SCRIPT' || - tag === 'NOSCRIPT' || - tag === 'META' || - tag === 'TITLE' || - tag === 'BASE' - ); -} export interface Options { obscureTextEmails: boolean; obscureTextNumbers: boolean; + captureIFrames: boolean; } export default class Observer { @@ -51,17 +63,33 @@ export default class Observer { private readonly attributesList: Array | undefined>; private readonly textSet: Set; private readonly textMasked: Set; - private readonly options: Options; - constructor(private readonly app: App, opts: Options) { - this.options = opts; + constructor(private readonly app: App, private readonly options: Options, private readonly context: Window = window) { this.observer = new MutationObserver( this.app.safe((mutations) => { for (const mutation of mutations) { const target = mutation.target; - if (isIgnored(target) || !document.contains(target)) { + const type = mutation.type; + + // Special case + // Document 'childList' might happen in case of iframe. + // TODO: generalize as much as possible + if (this.isInstance(target, Document) + && type === 'childList' + //&& new Array(mutation.addedNodes).some(node => this.isInstance(node, HTMLHtmlElement)) + ) { + const parentFrame = target.defaultView?.frameElement + if (!parentFrame) { continue } + this.bindTree(target.documentElement) + const frameID = this.app.nodes.getID(parentFrame) + const docID = this.app.nodes.getID(target.documentElement) + if (frameID === undefined || docID === undefined) { continue } + this.app.send(CreateIFrameDocument(frameID, docID)); + continue; + } + + if (this.isIgnored(target) || !context.document.contains(target)) { continue; } - const type = mutation.type; if (type === 'childList') { for (let i = 0; i < mutation.removedNodes.length; i++) { this.bindTree(mutation.removedNodes[i]); @@ -114,6 +142,43 @@ export default class Observer { this.textMasked.clear(); } + // TODO: we need a type expert here so we won't have to ignore the lines + private isInstance(node: Node, constr: Constructor): node is T { + let context = this.context; + while(context.parent && context.parent !== context) { + // @ts-ignore + if (node instanceof context[constr.name]) { + return true + } + // @ts-ignore + context = context.parent + } + // @ts-ignore + return node instanceof context[constr.name] + } + + private isIgnored(node: Node): boolean { + if (this.isInstance(node, Text)) { + return false; + } + if (!this.isInstance(node, Element)) { + return true; + } + const tag = node.tagName.toUpperCase(); + if (tag === 'LINK') { + const rel = node.getAttribute('rel'); + const as = node.getAttribute('as'); + return !(rel?.includes('stylesheet') || as === "style" || as === "font"); + } + return ( + tag === 'SCRIPT' || + tag === 'NOSCRIPT' || + tag === 'META' || + tag === 'TITLE' || + tag === 'BASE' + ); + } + private sendNodeAttribute( id: number, node: Element, @@ -130,7 +195,7 @@ export default class Observer { if (value.length > 1e5) { value = ''; } - this.app.send(new SetNodeAttributeURLBased(id, name, value, getBaseURI())); + this.app.send(new SetNodeAttributeURLBased(id, name, value, this.app.getBaseHref())); } else { this.app.send(new SetNodeAttribute(id, name, value)); } @@ -148,7 +213,7 @@ export default class Observer { } if ( name === 'value' && - node instanceof HTMLInputElement && + this.isInstance(node, HTMLInputElement) && node.type !== 'button' && node.type !== 'reset' && node.type !== 'submit' @@ -159,8 +224,8 @@ export default class Observer { this.app.send(new RemoveNodeAttribute(id, name)); return; } - if (name === 'style' || name === 'href' && node instanceof HTMLLinkElement) { - this.app.send(new SetNodeAttributeURLBased(id, name, value, getBaseURI())); + if (name === 'style' || name === 'href' && this.isInstance(node, HTMLLinkElement)) { + this.app.send(new SetNodeAttributeURLBased(id, name, value, this.app.getBaseHref())); return; } if (name === 'href' || value.length > 1e5) { @@ -170,8 +235,8 @@ export default class Observer { } private sendNodeData(id: number, parentElement: Element, data: string): void { - if (parentElement instanceof HTMLStyleElement || parentElement instanceof SVGStyleElement) { - this.app.send(new SetCSSDataURLBased(id, data, getBaseURI())); + if (this.isInstance(parentElement, HTMLStyleElement) || this.isInstance(parentElement, SVGStyleElement)) { + this.app.send(new SetCSSDataURLBased(id, data, this.app.getBaseHref())); return; } if (this.textMasked.has(id)) { @@ -201,7 +266,7 @@ export default class Observer { } private bindTree(node: Node): void { - if (isIgnored(node)) { + if (this.isIgnored(node)) { return; } this.bindNode(node); @@ -210,7 +275,7 @@ export default class Observer { NodeFilter.SHOW_ELEMENT + NodeFilter.SHOW_TEXT, { acceptNode: (node) => - isIgnored(node) || this.app.nodes.getID(node) !== undefined + this.isIgnored(node) || this.app.nodes.getID(node) !== undefined ? NodeFilter.FILTER_REJECT : NodeFilter.FILTER_ACCEPT, }, @@ -231,7 +296,9 @@ export default class Observer { private _commitNode(id: number, node: Node): boolean { const parent = node.parentNode; let parentID: number | undefined; - if (id !== 0) { + if (this.isInstance(node, HTMLHtmlElement)) { + this.indexes[id] = 0 + } else { if (parent === null) { this.unbindNode(node); return false; @@ -247,7 +314,7 @@ export default class Observer { } if ( this.textMasked.has(parentID) || - (node instanceof Element && hasOpenreplayAttribute(node, 'masked')) + (this.isInstance(node, Element) && hasOpenreplayAttribute(node, 'masked')) ) { this.textMasked.add(id); } @@ -271,7 +338,7 @@ export default class Observer { throw 'commitNode: missing node index'; } if (isNew === true) { - if (node instanceof Element) { + if (this.isInstance(node, Element)) { if (parentID !== undefined) { this.app.send(new CreateElementNode( @@ -287,7 +354,12 @@ export default class Observer { const attr = node.attributes[i]; this.sendNodeAttribute(id, node, attr.nodeName, attr.value); } - } else if (node instanceof Text) { + + if (this.isInstance(node, HTMLIFrameElement) && + (this.options.captureIFrames || node.getAttribute("data-openreplay-capture"))) { + this.handleIframe(node); + } + } else if (this.isInstance(node, Text)) { // for text node id != 0, hence parentID !== undefined and parent is Element this.app.send(new CreateTextNode(id, parentID as number, index)); this.sendNodeData(id, parent as Element, node.data); @@ -299,7 +371,7 @@ export default class Observer { } const attr = this.attributesList[id]; if (attr !== undefined) { - if (!(node instanceof Element)) { + if (!this.isInstance(node, Element)) { throw 'commitNode: node is not an element'; } for (const name of attr) { @@ -307,7 +379,7 @@ export default class Observer { } } if (this.textSet.has(id)) { - if (!(node instanceof Text)) { + if (!this.isInstance(node, Text)) { throw 'commitNode: node is not a text'; } // for text node id != 0, hence parent is Element @@ -337,8 +409,44 @@ export default class Observer { this.clear(); } + private iframeObservers: Observer[] = []; + private handleIframe(iframe: HTMLIFrameElement): void { + const handle = () => { + const context = iframe.contentWindow as Window | null + const id = this.app.nodes.getID(iframe) + if (!context || id === undefined) { return } + + const observer = new Observer(this.app, this.options, context) + this.iframeObservers.push(observer) + observer.observeIframe(id, context) + } + this.app.attachEventListener(iframe, "load", handle) + handle() + } + + // TODO: abstract common functionality, separate FrameObserver + private observeIframe(id: number, context: Window) { + const doc = context.document; + this.observer.observe(doc, { + childList: true, + attributes: true, + characterData: true, + subtree: true, + attributeOldValue: false, + characterDataOldValue: false, + }); + this.bindTree(doc.documentElement); + const docID = this.app.nodes.getID(doc.documentElement); + if (docID === undefined) { + console.log("Wrong") + return; + } + this.app.send(CreateIFrameDocument(id,docID)); + this.commitNodes(); + } + observe(): void { - this.observer.observe(document, { + this.observer.observe(this.context.document, { childList: true, attributes: true, characterData: true, @@ -347,11 +455,13 @@ export default class Observer { characterDataOldValue: false, }); this.app.send(new CreateDocument()); - this.bindTree(document.documentElement); + this.bindTree(this.context.document.documentElement); this.commitNodes(); } disconnect(): void { + this.iframeObservers.forEach(o => o.disconnect()); + this.iframeObservers = []; this.observer.disconnect(); this.clear(); } diff --git a/tracker/tracker/src/main/modules/cssrules.ts b/tracker/tracker/src/main/modules/cssrules.ts index 366a7d3fe..54166f717 100644 --- a/tracker/tracker/src/main/modules/cssrules.ts +++ b/tracker/tracker/src/main/modules/cssrules.ts @@ -1,6 +1,5 @@ import App from '../app'; import { CSSInsertRuleURLBased, CSSDeleteRule, TechnicalInfo } from '../../messages'; -import { getBaseURI } from '../utils'; export default function(app: App | null) { if (app === null) { @@ -14,7 +13,7 @@ export default function(app: App | null) { const processOperation = app.safe( (stylesheet: CSSStyleSheet, index: number, rule?: string) => { const sendMessage = typeof rule === 'string' - ? (nodeID: number) => app.send(new CSSInsertRuleURLBased(nodeID, rule, index, getBaseURI())) + ? (nodeID: number) => app.send(new CSSInsertRuleURLBased(nodeID, rule, index, app.getBaseHref())) : (nodeID: number) => app.send(new CSSDeleteRule(nodeID, index)); // TODO: Extend messages to maintain nested rules (CSSGroupingRule prototype, as well as CSSKeyframesRule) if (stylesheet.ownerNode == null) { diff --git a/tracker/tracker/src/main/modules/img.ts b/tracker/tracker/src/main/modules/img.ts index d7d4a6be5..e20a4d531 100644 --- a/tracker/tracker/src/main/modules/img.ts +++ b/tracker/tracker/src/main/modules/img.ts @@ -1,4 +1,4 @@ -import { timestamp, isURL, getBaseURI } from '../utils'; +import { timestamp, isURL } from '../utils'; import App from '../app'; import { ResourceTiming, SetNodeAttributeURLBased } from '../../messages'; @@ -17,7 +17,7 @@ export default function (app: App): void { app.send(new ResourceTiming(timestamp(), 0, 0, 0, 0, 0, src, 'img')); } } else if (src.length < 1e5) { - app.send(new SetNodeAttributeURLBased(id, 'src', src, getBaseURI())); + app.send(new SetNodeAttributeURLBased(id, 'src', src, app.getBaseHref())); } }); @@ -30,7 +30,7 @@ export default function (app: App): void { return; } const src = target.src; - app.send(new SetNodeAttributeURLBased(id, 'src', src, getBaseURI())); + app.send(new SetNodeAttributeURLBased(id, 'src', src, app.getBaseHref())); } } }); diff --git a/tracker/tracker/src/main/modules/mouse.ts b/tracker/tracker/src/main/modules/mouse.ts index 96b973e14..a0a526b93 100644 --- a/tracker/tracker/src/main/modules/mouse.ts +++ b/tracker/tracker/src/main/modules/mouse.ts @@ -72,14 +72,23 @@ function getTargetLabel(target: Element): string { return ''; } +interface HeatmapsOptions { + finder: FinderOptions, +} + export interface Options { - selectorFinder: boolean | FinderOptions; + heatmaps: boolean | HeatmapsOptions; } export default function (app: App, opts: Partial): void { const options: Options = Object.assign( { - selectorFinder: true, + heatmaps: { + finder: { + threshold: 5, + maxNumberOfTries: 600, + }, + }, }, opts, ); @@ -106,9 +115,9 @@ export default function (app: App, opts: Partial): void { const selectorMap: {[id:number]: string} = {}; function getSelector(id: number, target: Element): string { - if (options.selectorFinder === false) { return '' } + if (options.heatmaps === false) { return '' } return selectorMap[id] = selectorMap[id] || - finder(target, options.selectorFinder === true ? undefined : options.selectorFinder); + finder(target, options.heatmaps === true ? undefined : options.heatmaps.finder); } app.attachEventListener( diff --git a/tracker/tracker/src/main/utils.ts b/tracker/tracker/src/main/utils.ts index 350447b62..586d02ecb 100644 --- a/tracker/tracker/src/main/utils.ts +++ b/tracker/tracker/src/main/utils.ts @@ -16,16 +16,6 @@ export function isURL(s: string): boolean { return s.substr(0, 8) === 'https://' || s.substr(0, 7) === 'http://'; } -export function getBaseURI(): string { - if (document.baseURI) { - return document.baseURI; - } - // IE only - return document.head - ?.getElementsByTagName("base")[0] - ?.getAttribute("href") || location.origin + location.pathname; -} - export const IN_BROWSER = !(typeof window === "undefined"); export const log = console.log diff --git a/tracker/tracker/src/main/vendors/finder/finder.d.ts b/tracker/tracker/src/main/vendors/finder/finder.d.ts deleted file mode 100644 index aaff849fb..000000000 --- a/tracker/tracker/src/main/vendors/finder/finder.d.ts +++ /dev/null @@ -1,12 +0,0 @@ -export declare type Options = { - root: Element; - idName: (name: string) => boolean; - className: (name: string) => boolean; - tagName: (name: string) => boolean; - attr: (name: string, value: string) => boolean; - seedMinLength: number; - optimizedMinLength: number; - threshold: number; - maxNumberOfTries: number; -}; -export declare function finder(input: Element, options?: Partial): string; diff --git a/tracker/tracker/src/main/vendors/finder/finder.js b/tracker/tracker/src/main/vendors/finder/finder.js deleted file mode 100644 index 0e5eab2d7..000000000 --- a/tracker/tracker/src/main/vendors/finder/finder.js +++ /dev/null @@ -1,339 +0,0 @@ -var Limit; -(function (Limit) { - Limit[Limit["All"] = 0] = "All"; - Limit[Limit["Two"] = 1] = "Two"; - Limit[Limit["One"] = 2] = "One"; -})(Limit || (Limit = {})); -let config; -let rootDocument; -export function finder(input, options) { - if (input.nodeType !== Node.ELEMENT_NODE) { - throw new Error(`Can't generate CSS selector for non-element node type.`); - } - if ("html" === input.tagName.toLowerCase()) { - return "html"; - } - const defaults = { - root: document.body, - idName: (name) => true, - className: (name) => true, - tagName: (name) => true, - attr: (name, value) => false, - seedMinLength: 1, - optimizedMinLength: 2, - threshold: 1000, - maxNumberOfTries: 10000, - }; - config = Object.assign(Object.assign({}, defaults), options); - rootDocument = findRootDocument(config.root, defaults); - let path = bottomUpSearch(input, Limit.All, () => bottomUpSearch(input, Limit.Two, () => bottomUpSearch(input, Limit.One))); - if (path) { - const optimized = sort(optimize(path, input)); - if (optimized.length > 0) { - path = optimized[0]; - } - return selector(path); - } - else { - throw new Error(`Selector was not found.`); - } -} -function findRootDocument(rootNode, defaults) { - if (rootNode.nodeType === Node.DOCUMENT_NODE) { - return rootNode; - } - if (rootNode === defaults.root) { - return rootNode.ownerDocument; - } - return rootNode; -} -function bottomUpSearch(input, limit, fallback) { - let path = null; - let stack = []; - let current = input; - let i = 0; - while (current && current !== config.root.parentElement) { - let level = maybe(id(current)) || maybe(...attr(current)) || maybe(...classNames(current)) || maybe(tagName(current)) || [any()]; - const nth = index(current); - if (limit === Limit.All) { - if (nth) { - level = level.concat(level.filter(dispensableNth).map(node => nthChild(node, nth))); - } - } - else if (limit === Limit.Two) { - level = level.slice(0, 1); - if (nth) { - level = level.concat(level.filter(dispensableNth).map(node => nthChild(node, nth))); - } - } - else if (limit === Limit.One) { - const [node] = level = level.slice(0, 1); - if (nth && dispensableNth(node)) { - level = [nthChild(node, nth)]; - } - } - for (let node of level) { - node.level = i; - } - stack.push(level); - if (stack.length >= config.seedMinLength) { - path = findUniquePath(stack, fallback); - if (path) { - break; - } - } - current = current.parentElement; - i++; - } - if (!path) { - path = findUniquePath(stack, fallback); - } - return path; -} -function findUniquePath(stack, fallback) { - const paths = sort(combinations(stack)); - if (paths.length > config.threshold) { - return fallback ? fallback() : null; - } - for (let candidate of paths) { - if (unique(candidate)) { - return candidate; - } - } - return null; -} -function selector(path) { - let node = path[0]; - let query = node.name; - for (let i = 1; i < path.length; i++) { - const level = path[i].level || 0; - if (node.level === level - 1) { - query = `${path[i].name} > ${query}`; - } - else { - query = `${path[i].name} ${query}`; - } - node = path[i]; - } - return query; -} -function penalty(path) { - return path.map(node => node.penalty).reduce((acc, i) => acc + i, 0); -} -function unique(path) { - switch (rootDocument.querySelectorAll(selector(path)).length) { - case 0: - throw new Error(`Can't select any node with this selector: ${selector(path)}`); - case 1: - return true; - default: - return false; - } -} -function id(input) { - const elementId = input.getAttribute("id"); - if (elementId && config.idName(elementId)) { - return { - name: "#" + cssesc(elementId, { isIdentifier: true }), - penalty: 0, - }; - } - return null; -} -function attr(input) { - const attrs = Array.from(input.attributes).filter((attr) => config.attr(attr.name, attr.value)); - return attrs.map((attr) => ({ - name: "[" + cssesc(attr.name, { isIdentifier: true }) + "=\"" + cssesc(attr.value) + "\"]", - penalty: 0.5 - })); -} -function classNames(input) { - const names = Array.from(input.classList) - .filter(config.className); - return names.map((name) => ({ - name: "." + cssesc(name, { isIdentifier: true }), - penalty: 1 - })); -} -function tagName(input) { - const name = input.tagName.toLowerCase(); - if (config.tagName(name)) { - return { - name, - penalty: 2 - }; - } - return null; -} -function any() { - return { - name: "*", - penalty: 3 - }; -} -function index(input) { - const parent = input.parentNode; - if (!parent) { - return null; - } - let child = parent.firstChild; - if (!child) { - return null; - } - let i = 0; - while (child) { - if (child.nodeType === Node.ELEMENT_NODE) { - i++; - } - if (child === input) { - break; - } - child = child.nextSibling; - } - return i; -} -function nthChild(node, i) { - return { - name: node.name + `:nth-child(${i})`, - penalty: node.penalty + 1 - }; -} -function dispensableNth(node) { - return node.name !== "html" && !node.name.startsWith("#"); -} -function maybe(...level) { - const list = level.filter(notEmpty); - if (list.length > 0) { - return list; - } - return null; -} -function notEmpty(value) { - return value !== null && value !== undefined; -} -function* combinations(stack, path = []) { - if (stack.length > 0) { - for (let node of stack[0]) { - yield* combinations(stack.slice(1, stack.length), path.concat(node)); - } - } - else { - yield path; - } -} -function sort(paths) { - return Array.from(paths).sort((a, b) => penalty(a) - penalty(b)); -} -function* optimize(path, input, scope = { - counter: 0, - visited: new Map() -}) { - if (path.length > 2 && path.length > config.optimizedMinLength) { - for (let i = 1; i < path.length - 1; i++) { - if (scope.counter > config.maxNumberOfTries) { - return; // Okay At least I tried! - } - scope.counter += 1; - const newPath = [...path]; - newPath.splice(i, 1); - const newPathKey = selector(newPath); - if (scope.visited.has(newPathKey)) { - return; - } - if (unique(newPath) && same(newPath, input)) { - yield newPath; - scope.visited.set(newPathKey, true); - yield* optimize(newPath, input, scope); - } - } - } -} -function same(path, input) { - return rootDocument.querySelector(selector(path)) === input; -} -const regexAnySingleEscape = /[ -,\.\/:-@\[-\^`\{-~]/; -const regexSingleEscape = /[ -,\.\/:-@\[\]\^`\{-~]/; -const regexExcessiveSpaces = /(^|\\+)?(\\[A-F0-9]{1,6})\x20(?![a-fA-F0-9\x20])/g; -const defaultOptions = { - "escapeEverything": false, - "isIdentifier": false, - "quotes": "single", - "wrap": false -}; -function cssesc(string, opt = {}) { - const options = Object.assign(Object.assign({}, defaultOptions), opt); - if (options.quotes != "single" && options.quotes != "double") { - options.quotes = "single"; - } - const quote = options.quotes == "double" ? "\"" : "'"; - const isIdentifier = options.isIdentifier; - const firstChar = string.charAt(0); - let output = ""; - let counter = 0; - const length = string.length; - while (counter < length) { - const character = string.charAt(counter++); - let codePoint = character.charCodeAt(0); - let value = void 0; - // If it’s not a printable ASCII character… - if (codePoint < 0x20 || codePoint > 0x7E) { - if (codePoint >= 0xD800 && codePoint <= 0xDBFF && counter < length) { - // It’s a high surrogate, and there is a next character. - const extra = string.charCodeAt(counter++); - if ((extra & 0xFC00) == 0xDC00) { - // next character is low surrogate - codePoint = ((codePoint & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000; - } - else { - // It’s an unmatched surrogate; only append this code unit, in case - // the next code unit is the high surrogate of a surrogate pair. - counter--; - } - } - value = "\\" + codePoint.toString(16).toUpperCase() + " "; - } - else { - if (options.escapeEverything) { - if (regexAnySingleEscape.test(character)) { - value = "\\" + character; - } - else { - value = "\\" + codePoint.toString(16).toUpperCase() + " "; - } - } - else if (/[\t\n\f\r\x0B]/.test(character)) { - value = "\\" + codePoint.toString(16).toUpperCase() + " "; - } - else if (character == "\\" || !isIdentifier && (character == "\"" && quote == character || character == "'" && quote == character) || isIdentifier && regexSingleEscape.test(character)) { - value = "\\" + character; - } - else { - value = character; - } - } - output += value; - } - if (isIdentifier) { - if (/^-[-\d]/.test(output)) { - output = "\\-" + output.slice(1); - } - else if (/\d/.test(firstChar)) { - output = "\\3" + firstChar + " " + output.slice(1); - } - } - // Remove spaces after `\HEX` escapes that are not followed by a hex digit, - // since they’re redundant. Note that this is only possible if the escape - // sequence isn’t preceded by an odd number of backslashes. - output = output.replace(regexExcessiveSpaces, function ($0, $1, $2) { - if ($1 && $1.length % 2) { - // It’s not safe to remove the space, so don’t. - return $0; - } - // Strip the space. - return ($1 || "") + $2; - }); - if (!isIdentifier && options.wrap) { - return quote + output + quote; - } - return output; -} diff --git a/tracker/tracker/src/main/vendors/finder/finder.ts b/tracker/tracker/src/main/vendors/finder/finder.ts index bb2621d75..fc9f64af2 100644 --- a/tracker/tracker/src/main/vendors/finder/finder.ts +++ b/tracker/tracker/src/main/vendors/finder/finder.ts @@ -279,14 +279,16 @@ function notEmpty(value: T | null | undefined): value is T { return value !== null && value !== undefined } -function* combinations(stack: Node[][], path: Node[] = []): Generator { +function combinations(stack: Node[][], path: Node[] = []): Node[][] { + const paths: Node[][] = [] if (stack.length > 0) { for (let node of stack[0]) { - yield* combinations(stack.slice(1, stack.length), path.concat(node)) + paths.push(...combinations(stack.slice(1, stack.length), path.concat(node))) } } else { - yield path + paths.push(path) } + return paths } function sort(paths: Iterable): Path[] { @@ -298,29 +300,31 @@ type Scope = { visited: Map } -function* optimize(path: Path, input: Element, scope: Scope = { +function optimize(path: Path, input: Element, scope: Scope = { counter: 0, visited: new Map() -}): Generator { +}): Node[][] { + const paths: Node[][] = [] if (path.length > 2 && path.length > config.optimizedMinLength) { for (let i = 1; i < path.length - 1; i++) { if (scope.counter > config.maxNumberOfTries) { - return // Okay At least I tried! + return paths // Okay At least I tried! } scope.counter += 1 const newPath = [...path] newPath.splice(i, 1) const newPathKey = selector(newPath) if (scope.visited.has(newPathKey)) { - return + return paths } if (unique(newPath) && same(newPath, input)) { - yield newPath + paths.push(newPath) scope.visited.set(newPathKey, true) - yield* optimize(newPath, input, scope) + paths.push(...optimize(newPath, input, scope)) } } } + return paths } function same(path: Path, input: Element) { diff --git a/tracker/tracker/src/messages/index.ts b/tracker/tracker/src/messages/index.ts index 487868202..210f534cb 100644 --- a/tracker/tracker/src/messages/index.ts +++ b/tracker/tracker/src/messages/index.ts @@ -885,3 +885,19 @@ export const MouseClick = bindNew(_MouseClick); classes.set(69, MouseClick); +class _CreateIFrameDocument implements Message { + readonly _id: number = 70; + constructor( + public frameID: number, + public id: number + ) {} + encode(writer: Writer): boolean { + return writer.uint(70) && + writer.uint(this.frameID) && + writer.uint(this.id); + } +} +export const CreateIFrameDocument = bindNew(_CreateIFrameDocument); +classes.set(70, CreateIFrameDocument); + + From afaab71bf4793f3dc4c5be2b3d066a2b2274afbc Mon Sep 17 00:00:00 2001 From: ShiKhu Date: Thu, 23 Sep 2021 19:16:04 +0200 Subject: [PATCH 33/39] feat(tracker-assist):3.2.0: maintaining call resume on page reload --- tracker/tracker-assist/package-lock.json | 2 +- tracker/tracker-assist/package.json | 6 +- tracker/tracker-assist/src/CallWindow.ts | 159 +++++++++++--------- tracker/tracker-assist/src/ConfirmWindow.ts | 28 ++-- tracker/tracker-assist/src/_slim.ts | 8 + tracker/tracker-assist/src/index.ts | 55 +++++-- 6 files changed, 153 insertions(+), 105 deletions(-) create mode 100644 tracker/tracker-assist/src/_slim.ts diff --git a/tracker/tracker-assist/package-lock.json b/tracker/tracker-assist/package-lock.json index d797a86d4..9c778051a 100644 --- a/tracker/tracker-assist/package-lock.json +++ b/tracker/tracker-assist/package-lock.json @@ -1,6 +1,6 @@ { "name": "@openreplay/tracker-assist", - "version": "3.1.0", + "version": "3.1.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/tracker/tracker-assist/package.json b/tracker/tracker-assist/package.json index 683c9c322..fec7cf002 100644 --- a/tracker/tracker-assist/package.json +++ b/tracker/tracker-assist/package.json @@ -1,7 +1,7 @@ { "name": "@openreplay/tracker-assist", "description": "Tracker plugin for screen assistance through the WebRTC", - "version": "3.1.1", + "version": "3.2.0", "keywords": [ "WebRTC", "assistance", @@ -24,10 +24,10 @@ "peerjs": "^1.3.2" }, "peerDependencies": { - "@openreplay/tracker": "^3.3.0" + "@openreplay/tracker": "^3.4.0" }, "devDependencies": { - "@openreplay/tracker": "^3.3.0", + "@openreplay/tracker": "^3.4.0", "prettier": "^1.18.2", "replace-in-files-cli": "^1.0.0", "typescript": "^3.6.4" diff --git a/tracker/tracker-assist/src/CallWindow.ts b/tracker/tracker-assist/src/CallWindow.ts index 860753aa7..995c36e76 100644 --- a/tracker/tracker-assist/src/CallWindow.ts +++ b/tracker/tracker-assist/src/CallWindow.ts @@ -7,6 +7,7 @@ export default class CallWindow { private audioBtn: HTMLAnchorElement | null = null; private videoBtn: HTMLAnchorElement | null = null; private userNameSpan: HTMLSpanElement | null = null; + private vPlaceholder: HTMLParagraphElement | null = null; private tsInterval: ReturnType; constructor(endCall: () => void) { @@ -23,84 +24,84 @@ export default class CallWindow { height: "200px", width: "200px", }); - //iframe.src = "//static.openreplay.com/tracker-assist/index.html"; - iframe.onload = () => { - const doc = iframe.contentDocument; - if (!doc) { - console.error("OpenReplay: CallWindow iframe document is not reachable.") - return; - } - fetch("https://static.openreplay.com/tracker-assist/index.html") - //fetch("file:///Users/shikhu/work/asayer-tester/dist/assist/index.html") - .then(r => r.text()) - .then((text) => { - iframe.onload = () => { - doc.body.removeChild(doc.body.children[0]); //?!!>R# - const assistSection = doc.getElementById("or-assist") - assistSection && assistSection.removeAttribute("style"); - iframe.style.height = doc.body.scrollHeight + 'px'; - iframe.style.width = doc.body.scrollWidth + 'px'; - iframe.onload = null; - } - - text = text.replace(/href="css/g, "href=\"https://static.openreplay.com/tracker-assist/css") - doc.open(); - doc.write(text); - doc.close(); - - - this.vLocal = doc.getElementById("video-local") as HTMLVideoElement; - this.vRemote = doc.getElementById("video-remote") as HTMLVideoElement; - this._trySetStreams(); - // - this.vLocal.parentElement && this.vLocal.parentElement.classList.add("d-none"); - - this.audioBtn = doc.getElementById("audio-btn") as HTMLAnchorElement; - this.audioBtn.onclick = () => this.toggleAudio(); - this.videoBtn = doc.getElementById("video-btn") as HTMLAnchorElement; - this.videoBtn.onclick = () => this.toggleVideo(); - - this.userNameSpan = doc.getElementById("username") as HTMLSpanElement; - this._trySetAssistentName(); - - const endCallBtn = doc.getElementById("end-call-btn") as HTMLAnchorElement; - endCallBtn.onclick = endCall; - - const tsText = doc.getElementById("time-stamp"); - const startTs = Date.now(); - if (tsText) { - this.tsInterval = setInterval(() => { - const ellapsed = Date.now() - startTs; - const secsFull = ~~(ellapsed / 1000); - const mins = ~~(secsFull / 60); - const secs = secsFull - mins * 60 - tsText.innerText = `${mins}:${secs < 10 ? 0 : ''}${secs}`; - }, 500); - } - - // TODO: better D'n'D - doc.body.setAttribute("draggable", "true"); - doc.body.ondragstart = (e) => { - if (!e.dataTransfer || !e.target) { return; } - //@ts-ignore - if (!e.target.classList || !e.target.classList.contains("card-header")) { return; } - e.dataTransfer.setDragImage(doc.body, e.clientX, e.clientY); - }; - doc.body.ondragend = e => { - Object.assign(iframe.style, { - left: `${e.clientX}px`, - top: `${e.clientY}px`, - bottom: 'auto', - right: 'auto', - }) - } - }); - } - document.body.appendChild(iframe); + const doc = iframe.contentDocument; + if (!doc) { + console.error("OpenReplay: CallWindow iframe document is not reachable.") + return; + } + fetch("https://static.openreplay.com/tracker-assist/index.html") + //fetch("file:///Users/shikhu/work/asayer-tester/dist/assist/index.html") + .then(r => r.text()) + .then((text) => { + iframe.onload = () => { + doc.body.removeChild(doc.body.children[0]); //?!!>R# + const assistSection = doc.getElementById("or-assist") + assistSection && assistSection.removeAttribute("style"); + iframe.style.height = doc.body.scrollHeight + 'px'; + iframe.style.width = doc.body.scrollWidth + 'px'; + iframe.onload = null; + } + + text = text.replace(/href="css/g, "href=\"https://static.openreplay.com/tracker-assist/css") + doc.open(); + doc.write(text); + doc.close(); + + + this.vLocal = doc.getElementById("video-local") as HTMLVideoElement; + this.vRemote = doc.getElementById("video-remote") as HTMLVideoElement; + + // + this.vLocal.parentElement && this.vLocal.parentElement.classList.add("d-none"); + + this.audioBtn = doc.getElementById("audio-btn") as HTMLAnchorElement; + this.audioBtn.onclick = () => this.toggleAudio(); + this.videoBtn = doc.getElementById("video-btn") as HTMLAnchorElement; + this.videoBtn.onclick = () => this.toggleVideo(); + + this.userNameSpan = doc.getElementById("username") as HTMLSpanElement; + this.vPlaceholder = doc.querySelector("#remote-stream p") + this._trySetAssistentName(); + this._trySetStreams(); + + const endCallBtn = doc.getElementById("end-call-btn") as HTMLAnchorElement; + endCallBtn.onclick = endCall; + + const tsText = doc.getElementById("time-stamp"); + const startTs = Date.now(); + if (tsText) { + this.tsInterval = setInterval(() => { + const ellapsed = Date.now() - startTs; + const secsFull = ~~(ellapsed / 1000); + const mins = ~~(secsFull / 60); + const secs = secsFull - mins * 60 + tsText.innerText = `${mins}:${secs < 10 ? 0 : ''}${secs}`; + }, 500); + } + + // TODO: better D'n'D + doc.body.setAttribute("draggable", "true"); + doc.body.ondragstart = (e) => { + if (!e.dataTransfer || !e.target) { return; } + //@ts-ignore + if (!e.target.classList || !e.target.classList.contains("card-header")) { return; } + e.dataTransfer.setDragImage(doc.body, e.clientX, e.clientY); + }; + doc.body.ondragend = e => { + Object.assign(iframe.style, { + left: `${e.clientX}px`, // TODO: fix in case e is inside the iframe + top: `${e.clientY}px`, + bottom: 'auto', + right: 'auto', + }) + } + }); } + // TODO: load(): Promise + private aRemote: HTMLAudioElement | null = null; private localStream: MediaStream | null = null; private remoteStream: MediaStream | null = null; @@ -109,7 +110,11 @@ export default class CallWindow { private _trySetStreams() { if (this.vRemote && !this.vRemote.srcObject && this.remoteStream) { this.vRemote.srcObject = this.remoteStream; - // Hack for audio (doesen't work in iframe because of some magical reasons) + + if (this.vPlaceholder) { + this.vPlaceholder.innerText = "Video has been paused. Click anywhere to resume."; + } + // Hack for audio (doesen't work in iframe because of some magical reasons (check if it is connected to autoplay?)) this.aRemote = document.createElement("audio"); this.aRemote.autoplay = true; this.aRemote.style.display = "none" @@ -133,6 +138,10 @@ export default class CallWindow { this._trySetStreams(); } + playRemote() { + this.vRemote && this.vRemote.play() + } + // TODO: determined workflow _trySetAssistentName() { diff --git a/tracker/tracker-assist/src/ConfirmWindow.ts b/tracker/tracker-assist/src/ConfirmWindow.ts index 64dc98a28..6257f4376 100644 --- a/tracker/tracker-assist/src/ConfirmWindow.ts +++ b/tracker/tracker-assist/src/ConfirmWindow.ts @@ -67,26 +67,32 @@ export default class ConfirmWindow { this.wrapper = wrapper; answerBtn.onclick = () => { - this.remove(); - this.callback(true); + this._remove(); + this.resolve(true); } declineBtn.onclick = () => { - this.remove(); - this.callback(false); + this._remove(); + this.resolve(false); } } - mount() { + private resolve: (result: boolean) => void = ()=>{}; + private reject: ()=>void = ()=>{}; + + mount(): Promise { document.body.appendChild(this.wrapper); + return new Promise((resolve, reject) => { + this.resolve = resolve; + this.reject = reject; + }); } - private callback: (result: boolean) => void = ()=>{}; - onAnswer(callback: (result: boolean) => void) { - this.callback = callback; - } - - remove() { + private _remove() { if (!this.wrapper.parentElement) { return; } document.body.removeChild(this.wrapper); } + remove() { + this._remove(); + this.reject(); + } } diff --git a/tracker/tracker-assist/src/_slim.ts b/tracker/tracker-assist/src/_slim.ts new file mode 100644 index 000000000..cf8d2205e --- /dev/null +++ b/tracker/tracker-assist/src/_slim.ts @@ -0,0 +1,8 @@ + +/** + * Hach for the issue of peerjs compilation on angular + * Mor info here: https://github.com/peers/peerjs/issues/552 + */ + +// @ts-ignore +window.parcelRequire = window.parcelRequire || undefined; diff --git a/tracker/tracker-assist/src/index.ts b/tracker/tracker-assist/src/index.ts index 89d233e70..a5c6510fa 100644 --- a/tracker/tracker-assist/src/index.ts +++ b/tracker/tracker-assist/src/index.ts @@ -1,3 +1,4 @@ +import './_slim'; import Peer, { MediaConnection } from 'peerjs'; import type { DataConnection } from 'peerjs'; import { App, Messages } from '@openreplay/tracker'; @@ -11,6 +12,7 @@ import ConfirmWindow from './ConfirmWindow'; export interface Options { confirmText: string, confirmStyle: Object, // Styles object + session_calling_peer_key: string, } @@ -25,6 +27,7 @@ export default function(opts: Partial = {}) { { confirmText: "You have a call. Do you want to answer?", confirmStyle: {}, + session_calling_peer_key: "__openreplay_calling_peer", }, opts, ); @@ -104,25 +107,42 @@ export default function(opts: Partial = {}) { return; } + function setCallingState(newState: CallingState) { + if (newState === CallingState.True) { + sessionStorage.setItem(options.session_calling_peer_key, call.peer); + } else if (newState === CallingState.False) { + sessionStorage.removeItem(options.session_calling_peer_key); + } + callingState = newState; + } + const notifyCallEnd = () => { dataConn.open && dataConn.send("call_end"); } - callingState = CallingState.Requesting; - const confirm = new ConfirmWindow(options.confirmText, options.confirmStyle); - dataConn.on('data', (data) => { // if call closed by a caller before confirm - if (data === "call_end") { - //console.log('OpenReplay tracker-assist: receiving callend onconfirm') - callingState = CallingState.False; - confirm.remove(); - } - }); - confirm.mount(); - confirm.onAnswer(agreed => { + + let confirmAnswer: Promise + const peerOnCall = sessionStorage.getItem(options.session_calling_peer_key) + if (peerOnCall === call.peer) { + confirmAnswer = Promise.resolve(true) + } else { + setCallingState(CallingState.Requesting); + const confirm = new ConfirmWindow(options.confirmText, options.confirmStyle); + confirmAnswer = confirm.mount(); + dataConn.on('data', (data) => { // if call closed by a caller before confirm + if (data === "call_end") { + //console.log('OpenReplay tracker-assist: receiving callend onconfirm') + setCallingState(CallingState.False); + confirm.remove(); + } + }); + } + + confirmAnswer.then(agreed => { if (!agreed || !dataConn.open) { call.close(); notifyCallEnd(); - callingState = CallingState.False; + setCallingState(CallingState.False); return; } @@ -131,11 +151,10 @@ export default function(opts: Partial = {}) { const onCallConnect = lStream => { const onCallEnd = () => { - //console.log("on callend", call.open) mouse.remove(); callUI?.remove(); lStream.getTracks().forEach(t => t.stop()); - callingState = CallingState.False; + setCallingState(CallingState.False); } const initiateCallEnd = () => { //console.log("callend initiated") @@ -145,6 +164,7 @@ export default function(opts: Partial = {}) { } call.answer(lStream); + setCallingState(CallingState.True) dataConn.on("close", onCallEnd); @@ -176,6 +196,11 @@ export default function(opts: Partial = {}) { }); call.on('stream', function(rStream) { callUI.setRemoteStream(rStream); + const onInteraction = () => { + callUI.playRemote() + document.removeEventListener("click", onInteraction) + } + document.addEventListener("click", onInteraction) }); dataConn.on('data', (data: any) => { if (data === "call_end") { @@ -200,7 +225,7 @@ export default function(opts: Partial = {}) { .then(onCallConnect) .catch(e => console.log("OpenReplay tracker-assist: cant reach media devices. ", e)); }); - }); + }).catch(); // in case of Confirm.remove() without any confirmation }); }); } From 7819d4b921c5867ff3fe4afa8084e1975ed1a913 Mon Sep 17 00:00:00 2001 From: ShiKhu Date: Thu, 23 Sep 2021 19:32:42 +0200 Subject: [PATCH 34/39] dev(sourcemap-uploader): upgrade lint dependencies --- sourcemap-uploader/.eslintrc.json | 4 +- sourcemap-uploader/cli.js | 38 +- sourcemap-uploader/index.js | 16 +- sourcemap-uploader/lib/readDir.js | 7 +- sourcemap-uploader/lib/readFile.js | 2 +- sourcemap-uploader/lib/uploadSourcemaps.js | 78 +- sourcemap-uploader/package-lock.json | 919 ++++++++++----------- sourcemap-uploader/package.json | 8 +- 8 files changed, 535 insertions(+), 537 deletions(-) diff --git a/sourcemap-uploader/.eslintrc.json b/sourcemap-uploader/.eslintrc.json index fb4d5e7ee..0cad97a27 100644 --- a/sourcemap-uploader/.eslintrc.json +++ b/sourcemap-uploader/.eslintrc.json @@ -8,7 +8,9 @@ "module": true, "console": true, "Promise": true, - "Buffer": true + "Buffer": true, + "URL": true, + "global": true }, "plugins": [ "prettier" diff --git a/sourcemap-uploader/cli.js b/sourcemap-uploader/cli.js index 9dd3f16f3..7085f1345 100755 --- a/sourcemap-uploader/cli.js +++ b/sourcemap-uploader/cli.js @@ -14,7 +14,8 @@ parser.addArgument(['-k', '--api-key'], { help: 'API key', required: true, }); -parser.addArgument(['-p', '-i', '--project-key'], { // -i is depricated +parser.addArgument(['-p', '-i', '--project-key'], { + // -i is depricated help: 'Project Key', required: true, }); @@ -54,19 +55,34 @@ dir.addArgument(['-u', '--js-dir-url'], { // TODO: exclude in dir -const { command, api_key, project_key, server, verbose, ...args } = parser.parseArgs(); +const { command, api_key, project_key, server, verbose, ...args } = + parser.parseArgs(); global._VERBOSE = !!verbose; (command === 'file' - ? uploadFile(api_key, project_key, args.sourcemap_file_path, args.js_file_url, server) - : uploadDir(api_key, project_key, args.sourcemap_dir_path, args.js_dir_url, server) + ? uploadFile( + api_key, + project_key, + args.sourcemap_file_path, + args.js_file_url, + server, + ) + : uploadDir( + api_key, + project_key, + args.sourcemap_dir_path, + args.js_dir_url, + server, + ) ) -.then((sourceFiles) => - sourceFiles.length > 0 - ? console.log(`Successfully uploaded ${sourceFiles.length} sourcemap file${sourceFiles.length > 1 ? "s" : ""} for: \n` - + sourceFiles.join("\t\n") + .then((sourceFiles) => + sourceFiles.length > 0 + ? console.log( + `Successfully uploaded ${sourceFiles.length} sourcemap file${ + sourceFiles.length > 1 ? 's' : '' + } for: \n` + sourceFiles.join('\t\n'), + ) + : console.log(`No sourcemaps found in ${args.sourcemap_dir_path}`), ) - : console.log(`No sourcemaps found in ${ args.sourcemap_dir_path }`) -) -.catch(e => console.error(`Sourcemap Uploader: ${e}`)); + .catch((e) => console.error(`Sourcemap Uploader: ${e}`)); diff --git a/sourcemap-uploader/index.js b/sourcemap-uploader/index.js index 7c3ee7aab..dabbee434 100644 --- a/sourcemap-uploader/index.js +++ b/sourcemap-uploader/index.js @@ -3,11 +3,23 @@ const readFile = require('./lib/readFile.js'), uploadSourcemaps = require('./lib/uploadSourcemaps.js'); module.exports = { - async uploadFile(api_key, project_key, sourcemap_file_path, js_file_url, server) { + async uploadFile( + api_key, + project_key, + sourcemap_file_path, + js_file_url, + server, + ) { const sourcemap = await readFile(sourcemap_file_path, js_file_url); return uploadSourcemaps(api_key, project_key, [sourcemap], server); }, - async uploadDir(api_key, project_key, sourcemap_dir_path, js_dir_url, server) { + async uploadDir( + api_key, + project_key, + sourcemap_dir_path, + js_dir_url, + server, + ) { const sourcemaps = await readDir(sourcemap_dir_path, js_dir_url); return uploadSourcemaps(api_key, project_key, sourcemaps, server); }, diff --git a/sourcemap-uploader/lib/readDir.js b/sourcemap-uploader/lib/readDir.js index 501a2949f..bb7825964 100644 --- a/sourcemap-uploader/lib/readDir.js +++ b/sourcemap-uploader/lib/readDir.js @@ -3,12 +3,13 @@ const readFile = require('./readFile'); module.exports = (sourcemap_dir_path, js_dir_url) => { sourcemap_dir_path = (sourcemap_dir_path + '/').replace(/\/+/g, '/'); - if (js_dir_url[ js_dir_url.length - 1 ] !== '/') { // replace will break schema + if (js_dir_url[js_dir_url.length - 1] !== '/') { + // replace will break schema js_dir_url += '/'; } - return glob(sourcemap_dir_path + '**/*.map').then(sourcemap_file_paths => + return glob(sourcemap_dir_path + '**/*.map').then((sourcemap_file_paths) => Promise.all( - sourcemap_file_paths.map(sourcemap_file_path => + sourcemap_file_paths.map((sourcemap_file_path) => readFile( sourcemap_file_path, js_dir_url + sourcemap_file_path.slice(sourcemap_dir_path.length, -4), diff --git a/sourcemap-uploader/lib/readFile.js b/sourcemap-uploader/lib/readFile.js index 67cec2f82..cca02206b 100644 --- a/sourcemap-uploader/lib/readFile.js +++ b/sourcemap-uploader/lib/readFile.js @@ -1,6 +1,6 @@ const fs = require('fs').promises; module.exports = (sourcemap_file_path, js_file_url) => - fs.readFile(sourcemap_file_path, 'utf8').then(body => { + fs.readFile(sourcemap_file_path, 'utf8').then((body) => { return { sourcemap_file_path, js_file_url, body }; }); diff --git a/sourcemap-uploader/lib/uploadSourcemaps.js b/sourcemap-uploader/lib/uploadSourcemaps.js index 8da34ecdc..5bfc8a0f4 100644 --- a/sourcemap-uploader/lib/uploadSourcemaps.js +++ b/sourcemap-uploader/lib/uploadSourcemaps.js @@ -9,43 +9,47 @@ const getUploadURLs = (api_key, project_key, js_file_urls, server) => let serverURL; try { serverURL = new URL(server); - } catch(e) { - return reject(`Failed to parse server URL "${server}".`) + } catch (e) { + return reject(`Failed to parse server URL "${server}".`); } - const pathPrefix = (serverURL.pathname + "/").replace(/\/+/g, '/'); + const pathPrefix = (serverURL.pathname + '/').replace(/\/+/g, '/'); const options = { method: 'PUT', hostname: serverURL.host, path: pathPrefix + `${project_key}/sourcemaps/`, headers: { Authorization: api_key, 'Content-Type': 'application/json' }, - } + }; if (global._VERBOSE) { - console.log("Request: ", options, "\nFiles: ", js_file_urls); + console.log('Request: ', options, '\nFiles: ', js_file_urls); } - const req = https.request( - options, - res => { + const req = https.request(options, (res) => { + if (global._VERBOSE) { + console.log( + 'Response Code: ', + res.statusCode, + '\nMessage: ', + res.statusMessage, + ); + } + if (res.statusCode === 403) { + reject( + 'Authorisation rejected. Please, check your API_KEY and/or PROJECT_KEY.', + ); + return; + } else if (res.statusCode !== 200) { + reject('Server Error. Please, contact OpenReplay support.'); + return; + } + let data = ''; + res.on('data', (s) => (data += s)); + res.on('end', () => { if (global._VERBOSE) { - console.log("Response Code: ", res.statusCode, "\nMessage: ", res.statusMessage); + console.log('Server Response: ', data); } - if (res.statusCode === 403) { - reject("Authorisation rejected. Please, check your API_KEY and/or PROJECT_KEY.") - return - } else if (res.statusCode !== 200) { - reject("Server Error. Please, contact OpenReplay support."); - return; - } - let data = ''; - res.on('data', s => (data += s)); - res.on('end', () => { - if (global._VERBOSE) { - console.log("Server Response: ", data) - } - resolve(JSON.parse(data).data) - }); - }, - ); + resolve(JSON.parse(data).data); + }); + }); req.on('error', reject); req.write(JSON.stringify({ URL: js_file_urls })); req.end(); @@ -63,14 +67,19 @@ const uploadSourcemap = (upload_url, body) => 'Content-Type': 'application/json', }, }, - res => { + (res) => { if (res.statusCode !== 200) { if (global._VERBOSE) { - console.log("Response Code: ", res.statusCode, "\nMessage: ", res.statusMessage); + console.log( + 'Response Code: ', + res.statusCode, + '\nMessage: ', + res.statusMessage, + ); } - reject("Unable to upload. Please, contact OpenReplay support."); - return; // TODO: report per-file errors. + reject('Unable to upload. Please, contact OpenReplay support.'); + return; // TODO: report per-file errors. } resolve(); //res.on('end', resolve); @@ -86,12 +95,13 @@ module.exports = (api_key, project_key, sourcemaps, server) => api_key, project_key, sourcemaps.map(({ js_file_url }) => js_file_url), - server || "https://api.openreplay.com", - ).then(upload_urls => + server || 'https://api.openreplay.com', + ).then((upload_urls) => Promise.all( upload_urls.map((upload_url, i) => - uploadSourcemap(upload_url, sourcemaps[i].body) - .then(() => sourcemaps[i].js_file_url) + uploadSourcemap(upload_url, sourcemaps[i].body).then( + () => sourcemaps[i].js_file_url, + ), ), ), ); diff --git a/sourcemap-uploader/package-lock.json b/sourcemap-uploader/package-lock.json index 40b676c79..0b38bb293 100644 --- a/sourcemap-uploader/package-lock.json +++ b/sourcemap-uploader/package-lock.json @@ -1,29 +1,88 @@ { "name": "@openreplay/sourcemap-uploader", - "version": "3.0.1", + "version": "3.0.6", "lockfileVersion": 1, "requires": true, "dependencies": { "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", "dev": true, "requires": { - "@babel/highlight": "^7.8.3" + "@babel/highlight": "^7.10.4" } }, + "@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "dev": true + }, "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", "dev": true, "requires": { + "@babel/helper-validator-identifier": "^7.14.5", "chalk": "^2.0.0", - "esutils": "^2.0.2", "js-tokens": "^4.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + } } }, + "@eslint/eslintrc": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + } + }, + "@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + } + }, + "@humanwhocodes/object-schema": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", + "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", + "dev": true + }, "@types/events": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", @@ -50,21 +109,21 @@ "integrity": "sha512-GnZbirvmqZUzMgkFn70c74OQpTTUcCzlhQliTzYjQMqg+hVKcDnxdL19Ne3UdYzdMA/+W3eb646FWn/ZaT1NfQ==" }, "acorn": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz", - "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==", + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true }, "acorn-jsx": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.1.0.tgz", - "integrity": "sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true }, "ajv": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", - "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -73,19 +132,16 @@ "uri-js": "^4.2.2" } }, - "ansi-escapes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.0.tgz", - "integrity": "sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg==", - "dev": true, - "requires": { - "type-fest": "^0.8.1" - } + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true }, "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, "ansi-styles": { @@ -106,15 +162,15 @@ } }, "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true }, "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, "brace-expansion": { @@ -134,37 +190,56 @@ "dev": true }, "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", - "dev": true - }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -187,39 +262,29 @@ "dev": true }, "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "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" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" } }, "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, "doctrine": { @@ -237,109 +302,134 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true }, "eslint": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", - "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", "ajv": "^6.10.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", "debug": "^4.0.1", "doctrine": "^3.0.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.3", - "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.2", - "esquery": "^1.0.1", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", "ignore": "^4.0.6", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", - "inquirer": "^7.0.0", "is-glob": "^4.0.0", "js-yaml": "^3.13.1", "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.14", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", - "optionator": "^0.8.3", + "optionator": "^0.9.1", "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^6.1.2", - "strip-ansi": "^5.2.0", - "strip-json-comments": "^3.0.1", - "table": "^5.2.3", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", "text-table": "^0.2.0", "v8-compile-cache": "^2.0.3" } }, "eslint-config-prettier": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.10.0.tgz", - "integrity": "sha512-AtndijGte1rPILInUdHjvKEGbIV06NuvPrqlIEaEaWtbtvJh464mDeyGMdZEQMsGvC0ZVkiex1fSNcC4HAbRGg==", - "dev": true, - "requires": { - "get-stdin": "^6.0.0" - } + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", + "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==", + "dev": true }, "eslint-plugin-prettier": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.2.tgz", - "integrity": "sha512-GlolCC9y3XZfv3RQfwGew7NnuFDKsfI4lbvRK+PIIo23SFH+LemGs4cKwzAaRa+Mdb+lQO/STaIayno8T5sJJA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz", + "integrity": "sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==", "dev": true, "requires": { "prettier-linter-helpers": "^1.0.0" } }, "eslint-scope": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", - "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "requires": { - "esrecurse": "^4.1.0", + "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, "eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "dev": true, "requires": { "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } } }, "eslint-visitor-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", - "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true }, "espree": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.2.tgz", - "integrity": "sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", "dev": true, "requires": { - "acorn": "^7.1.0", - "acorn-jsx": "^5.1.0", - "eslint-visitor-keys": "^1.1.0" + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } } }, "esprima": { @@ -349,21 +439,37 @@ "dev": true }, "esquery": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", - "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", "dev": true, "requires": { - "estraverse": "^4.0.0" + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } } }, "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "requires": { - "estraverse": "^4.1.0" + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } } }, "estraverse": { @@ -378,21 +484,10 @@ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, "fast-diff": { @@ -413,39 +508,29 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, - "figures": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.1.0.tgz", - "integrity": "sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, "requires": { - "flat-cache": "^2.0.1" + "flat-cache": "^3.0.4" } }, "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", "dev": true, "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" + "flatted": "^3.1.0", + "rimraf": "^3.0.2" } }, "flatted": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", - "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", + "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", "dev": true }, "fs.realpath": { @@ -460,16 +545,10 @@ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, - "get-stdin": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", - "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", - "dev": true - }, "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -481,9 +560,9 @@ } }, "glob-parent": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", - "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "requires": { "is-glob": "^4.0.1" @@ -498,12 +577,12 @@ } }, "globals": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.3.0.tgz", - "integrity": "sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw==", + "version": "13.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz", + "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==", "dev": true, "requires": { - "type-fest": "^0.8.1" + "type-fest": "^0.20.2" } }, "has-flag": { @@ -512,15 +591,6 @@ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, "ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", @@ -528,9 +598,9 @@ "dev": true }, "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, "requires": { "parent-module": "^1.0.0", @@ -559,27 +629,6 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, - "inquirer": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.4.tgz", - "integrity": "sha512-Bu5Td5+j11sCkqfqmUTiwv+tWisMtP0L7Q8WrqA2C/BbBhy1YTdFrvjjlrKq8oagA/tLQBski2Gcx/Sqyi2qSQ==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^2.4.2", - "cli-cursor": "^3.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.15", - "mute-stream": "0.0.8", - "run-async": "^2.2.0", - "rxjs": "^6.5.3", - "string-width": "^4.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" - } - }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -601,12 +650,6 @@ "is-extglob": "^2.1.1" } }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true - }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -620,9 +663,9 @@ "dev": true }, "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -642,27 +685,42 @@ "dev": true }, "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" } }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", "dev": true }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "dev": true + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -672,45 +730,18 @@ "brace-expansion": "^1.1.7" } }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -720,35 +751,20 @@ "wrappy": "1" } }, - "onetime": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", - "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", "dev": true, "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" } }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -765,21 +781,21 @@ "dev": true }, "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, "prettier": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", - "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.4.1.tgz", + "integrity": "sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA==", "dev": true }, "prettier-linter-helpers": { @@ -804,9 +820,15 @@ "dev": true }, "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true }, "resolve-from": { @@ -815,91 +837,72 @@ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "requires": { "glob": "^7.1.3" } }, - "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "dev": true, - "requires": { - "is-promise": "^2.1.0" - } - }, - "rxjs": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", - "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } }, "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "requires": { - "shebang-regex": "^1.0.0" + "shebang-regex": "^3.0.0" } }, "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dev": true, "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" }, "dependencies": { - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true } } @@ -910,48 +913,29 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } + "strip-ansi": "^6.0.1" } }, "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { - "ansi-regex": "^4.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - } + "ansi-regex": "^5.0.1" } }, "strip-json-comments": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", - "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true }, "supports-color": { @@ -964,39 +948,36 @@ } }, "table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", + "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", "dev": true, "requires": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" + "ajv": "^8.0.1", + "lodash.clonedeep": "^4.5.0", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0" }, "dependencies": { - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "ajv": { + "version": "8.6.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz", + "integrity": "sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==", "dev": true, "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true } } }, @@ -1006,61 +987,40 @@ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "tslib": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", - "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", - "dev": true - }, "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "requires": { - "prelude-ls": "~1.1.2" + "prelude-ls": "^1.2.1" } }, "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true }, "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==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "requires": { "punycode": "^2.1.0" } }, "v8-compile-cache": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", - "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { "isexe": "^2.0.0" @@ -1078,14 +1038,11 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, - "write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - } + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true } } } diff --git a/sourcemap-uploader/package.json b/sourcemap-uploader/package.json index 4a1d20181..e8da522a1 100644 --- a/sourcemap-uploader/package.json +++ b/sourcemap-uploader/package.json @@ -13,10 +13,10 @@ ], "license": "MIT", "devDependencies": { - "eslint": "^6.8.0", - "eslint-config-prettier": "^6.10.0", - "eslint-plugin-prettier": "^3.1.2", - "prettier": "^1.19.1" + "eslint": "^7.32.0", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-prettier": "^4.0.0", + "prettier": "^2.4.1" }, "dependencies": { "argparse": "^1.0.10", From bfbc6a29d56b09fe83e5a75c05eaa9da2bacdef1 Mon Sep 17 00:00:00 2001 From: ShiKhu Date: Thu, 23 Sep 2021 19:36:56 +0200 Subject: [PATCH 35/39] dev(tracker-axios): update version requirement to fix vulnerability --- tracker/tracker-axios/package-lock.json | 16 ++++++++-------- tracker/tracker-axios/package.json | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/tracker/tracker-axios/package-lock.json b/tracker/tracker-axios/package-lock.json index 5fe0b3a1f..4dca3d564 100644 --- a/tracker/tracker-axios/package-lock.json +++ b/tracker/tracker-axios/package-lock.json @@ -1,6 +1,6 @@ { "name": "@openreplay/tracker-axios", - "version": "3.0.0", + "version": "3.0.1", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -99,12 +99,12 @@ "dev": true }, "axios": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", - "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", "dev": true, "requires": { - "follow-redirects": "^1.10.0" + "follow-redirects": "^1.14.0" } }, "braces": { @@ -267,9 +267,9 @@ } }, "follow-redirects": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz", - "integrity": "sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==", + "version": "1.14.4", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.4.tgz", + "integrity": "sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g==", "dev": true }, "function-bind": { diff --git a/tracker/tracker-axios/package.json b/tracker/tracker-axios/package.json index f013633ef..9f1bce79b 100644 --- a/tracker/tracker-axios/package.json +++ b/tracker/tracker-axios/package.json @@ -21,11 +21,11 @@ "dependencies": {}, "peerDependencies": { "@openreplay/tracker": "^3.0.0", - "axios": "^0.21.1" + "axios": "^0.21.2" }, "devDependencies": { "@openreplay/tracker": "^3.0.0", - "axios": "^0.21.1", + "axios": "^0.21.2", "prettier": "^1.18.2", "replace-in-files-cli": "^1.0.0", "typescript": "^3.6.4" From ff447b29a7e5bbac1423d5163950bace84f85711 Mon Sep 17 00:00:00 2001 From: ShiKhu Date: Thu, 23 Sep 2021 19:43:54 +0200 Subject: [PATCH 36/39] fix(tracker-*): audit vulnerabilities --- tracker/tracker-axios/package-lock.json | 6 +++--- tracker/tracker-mobx/package-lock.json | 18 +++++++++--------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/tracker/tracker-axios/package-lock.json b/tracker/tracker-axios/package-lock.json index 4dca3d564..49bb3588d 100644 --- a/tracker/tracker-axios/package-lock.json +++ b/tracker/tracker-axios/package-lock.json @@ -761,9 +761,9 @@ } }, "trim-newlines": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz", - "integrity": "sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", "dev": true }, "type-fest": { diff --git a/tracker/tracker-mobx/package-lock.json b/tracker/tracker-mobx/package-lock.json index f6acb3063..7e115ddcd 100644 --- a/tracker/tracker-mobx/package-lock.json +++ b/tracker/tracker-mobx/package-lock.json @@ -264,9 +264,9 @@ "dev": true }, "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "requires": { "is-glob": "^4.0.1" @@ -545,9 +545,9 @@ "dev": true }, "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, "path-type": { @@ -752,9 +752,9 @@ } }, "trim-newlines": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz", - "integrity": "sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", "dev": true }, "type-fest": { From 73f7a8d2786932d30b35569fcb85247674b450a4 Mon Sep 17 00:00:00 2001 From: ShiKhu Date: Fri, 24 Sep 2021 00:44:28 +0200 Subject: [PATCH 37/39] fix(backend): env int overflow check --- backend/pkg/env/vars.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/backend/pkg/env/vars.go b/backend/pkg/env/vars.go index a5334b301..33ae9da3c 100644 --- a/backend/pkg/env/vars.go +++ b/backend/pkg/env/vars.go @@ -36,8 +36,13 @@ func Uint16(key string) uint16 { return uint16(n) } +const MAX_INT = uint64(^uint(0) >> 1) func Int(key string) int { - return int(Uint64(key)) + val := Uint64(key) + if val > MAX_INT { + log.Fatalln(key + " is too big. ") + } + return int(val) } func Bool(key string) bool { From 759f3aeced4d503ca50ddada2b863bbe0deae488 Mon Sep 17 00:00:00 2001 From: ShiKhu Date: Fri, 24 Sep 2021 00:48:45 +0200 Subject: [PATCH 38/39] fix(frontend): silence node counter (temp) --- .../player/MessageDistributor/managers/WindowNodeCounter.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/frontend/app/player/MessageDistributor/managers/WindowNodeCounter.js b/frontend/app/player/MessageDistributor/managers/WindowNodeCounter.js index d3e0fd394..245ac9084 100644 --- a/frontend/app/player/MessageDistributor/managers/WindowNodeCounter.js +++ b/frontend/app/player/MessageDistributor/managers/WindowNodeCounter.js @@ -57,11 +57,12 @@ export default class WindowNodeCounter { addNode(id: number, parentID: number) { if (!this._nodes[ parentID ]) { - console.error(`Wrong! Node with id ${ parentID } (parentId) not found.`); + //TODO: iframe case + //console.error(`Wrong! Node with id ${ parentID } (parentId) not found.`); return; } if (!!this._nodes[ id ]) { - console.error(`Wrong! Node with id ${ id } already exists.`); + //console.error(`Wrong! Node with id ${ id } already exists.`); return; } this._nodes[id] = this._nodes[ parentID ].newChild(); From b94bb9978f253a49373106cb5efe1388c561e6b7 Mon Sep 17 00:00:00 2001 From: Shekar Siri Date: Fri, 24 Sep 2021 12:12:19 +0530 Subject: [PATCH 39/39] change(ui) - tracker msg --- .../shared/TrackerUpdateMessage/TrackerUpdateMessage.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/app/components/shared/TrackerUpdateMessage/TrackerUpdateMessage.js b/frontend/app/components/shared/TrackerUpdateMessage/TrackerUpdateMessage.js index 985d1c5fc..790af890d 100644 --- a/frontend/app/components/shared/TrackerUpdateMessage/TrackerUpdateMessage.js +++ b/frontend/app/components/shared/TrackerUpdateMessage/TrackerUpdateMessage.js @@ -24,7 +24,7 @@ const TrackerUpdateMessage= (props) => {
- Please props.history.push(withSiteId(onboardingRoute('installing'), siteId))}>update your tracker (Asayer) to the latest OpenReplay version ({window.ENV.TRACKER_VERSION}) to benefit from all new features we recently shipped. + There might be a mismatch between the tracker and the backend versions. Please make sure to props.history.push(withSiteId(onboardingRoute('installing'), siteId))}>update the tracker to latest version ({window.ENV.TRACKER_VERSION}).