From 6bb1cf3554839b6605834686431c1788833099df Mon Sep 17 00:00:00 2001 From: redSpoutnik <15638041+redSpoutnik@users.noreply.github.com> Date: Fri, 8 May 2020 21:25:23 +0200 Subject: [PATCH 001/271] Feature: manually add subtitle --- .../subtitleeditor/subtitleeditor.js | 30 +++ .../subtitleeditor.template.html | 1 + src/components/subtitleuploader/style.css | 11 + .../subtitleuploader/subtitleuploader.js | 194 ++++++++++++++++++ .../subtitleuploader.template.html | 45 ++++ src/scripts/site.js | 1 + 6 files changed, 282 insertions(+) create mode 100644 src/components/subtitleuploader/style.css create mode 100644 src/components/subtitleuploader/subtitleuploader.js create mode 100644 src/components/subtitleuploader/subtitleuploader.template.html diff --git a/src/components/subtitleeditor/subtitleeditor.js b/src/components/subtitleeditor/subtitleeditor.js index e9bcc0bfc..4513d1d9d 100644 --- a/src/components/subtitleeditor/subtitleeditor.js +++ b/src/components/subtitleeditor/subtitleeditor.js @@ -347,6 +347,34 @@ define(['dialogHelper', 'require', 'layoutManager', 'globalize', 'userSettings', } } + function onOpenUploadMenu(e) { + + var context = dom.parentWithClass(e.target, 'subtitleEditorDialog'); + var selectLanguage = context.querySelector('#selectLanguage'); + var apiClient = connectionManager.getApiClient(currentItem.ServerId); + + require(['subtitleUploader'], function (subtitleUploader) { + + subtitleUploader.show({ + + languages: { + list: selectLanguage.innerHTML, + value: selectLanguage.value + }, + itemId: currentItem.Id, + serverId: currentItem.ServerId + + }).then(function (hasChanged) { + + if (hasChanged) { + hasChanges = true; + reload(context, apiClient, currentItem.Id); + } + }); + }); + + } + function onSearchSubmit(e) { var form = this; @@ -454,6 +482,8 @@ define(['dialogHelper', 'require', 'layoutManager', 'globalize', 'userSettings', dlg.querySelector('.subtitleSearchForm').addEventListener('submit', onSearchSubmit); + dlg.querySelector('.btnOpenUploadMenu').addEventListener('click', onOpenUploadMenu); + var btnSubmit = dlg.querySelector('.btnSubmit'); if (layoutManager.tv) { diff --git a/src/components/subtitleeditor/subtitleeditor.template.html b/src/components/subtitleeditor/subtitleeditor.template.html index 7471972f5..b01942c99 100644 --- a/src/components/subtitleeditor/subtitleeditor.template.html +++ b/src/components/subtitleeditor/subtitleeditor.template.html @@ -18,6 +18,7 @@ + diff --git a/src/components/subtitleuploader/style.css b/src/components/subtitleuploader/style.css new file mode 100644 index 000000000..c9d5eb980 --- /dev/null +++ b/src/components/subtitleuploader/style.css @@ -0,0 +1,11 @@ +.subtitleEditor-dropZone { + border: 0.2em dashed currentcolor; + border-radius: 0.25em; + + text-align: center; + position: relative; + height: 12em; + display: flex; + align-items: center; + justify-content: center; +} diff --git a/src/components/subtitleuploader/subtitleuploader.js b/src/components/subtitleuploader/subtitleuploader.js new file mode 100644 index 000000000..bf3a8ca4b --- /dev/null +++ b/src/components/subtitleuploader/subtitleuploader.js @@ -0,0 +1,194 @@ +define(['dialogHelper', 'connectionManager', 'dom', 'loading', 'scrollHelper', 'layoutManager', 'globalize', 'require', 'emby-button', 'emby-select', 'formDialogStyle', 'css!./style'], function (dialogHelper, connectionManager, dom, loading, scrollHelper, layoutManager, globalize, require) { + 'use strict'; + + var currentItemId; + var currentServerId; + var currentFile; + var hasChanges = false; + + function onFileReaderError(evt) { + + loading.hide(); + + switch (evt.target.error.code) { + case evt.target.error.NOT_FOUND_ERR: + require(['toast'], function (toast) { + toast(globalize.translate('MessageFileReadError')); + }); + break; + case evt.target.error.ABORT_ERR: + break; // noop + default: + require(['toast'], function (toast) { + toast(globalize.translate('MessageFileReadError')); + }); + break; + } + } + + function isValidSubtitleFile(file) { + return file && ['.sub', '.srt', '.vtt', '.ass', '.ssa'] + .some(function(ext) { + return file.name.endsWith(ext); + }); + } + + function setFiles(page, files) { + + var file = files[0]; + + if (!isValidSubtitleFile(file)) { + page.querySelector('#subtitleOutput').innerHTML = ''; + page.querySelector('#fldUpload').classList.add('hide'); + page.querySelector('#labelDropSubtitle').classList.remove('hide'); + currentFile = null; + return; + } + + currentFile = file; + + var reader = new FileReader(); + + reader.onerror = onFileReaderError; + reader.onloadstart = function () { + page.querySelector('#fldUpload').classList.add('hide'); + }; + reader.onabort = function () { + loading.hide(); + console.debug('File read cancelled'); + }; + + // Closure to capture the file information. + reader.onload = (function (theFile) { + return function () { + + // Render thumbnail. + var html = 'subtitles' + escape(theFile.name) + ''; + + page.querySelector('#subtitleOutput').innerHTML = html; + page.querySelector('#fldUpload').classList.remove('hide'); + page.querySelector('#labelDropSubtitle').classList.add('hide'); + + }; + })(file); + + // Read in the subtitle file as a data URL. + reader.readAsDataURL(file); + } + + function onSubmit(e) { + + var file = currentFile; + + if (!isValidSubtitleFile(file)) { + require(['toast'], function (toast) { + toast(globalize.translate('MessageSubtitleFileTypeAllowed')); + }); + e.preventDefault(); + return false; + } + + loading.show(); + + var dlg = dom.parentWithClass(this, 'dialog'); + var language = dlg.querySelector('#selectLanguage').value; + var isForced = dlg.querySelector('#chkIsForced').checked; + + connectionManager.getApiClient(currentServerId).uploadItemSubtitle(currentItemId, language, isForced, file).then(function () { + + dlg.querySelector('#uploadSubtitle').value = ''; + loading.hide(); + hasChanges = true; + dialogHelper.close(dlg); + }); + + e.preventDefault(); + return false; + } + + function initEditor(page) { + + page.querySelector('.uploadSubtitleForm').addEventListener('submit', onSubmit); + + page.querySelector('#uploadSubtitle').addEventListener('change', function () { + setFiles(page, this.files); + }); + + page.querySelector('.btnBrowse').addEventListener('click', function () { + page.querySelector('#uploadSubtitle').click(); + }); + } + + function showEditor(options, resolve, reject) { + + options = options || {}; + + require(['text!./subtitleuploader.template.html'], function (template) { + + currentItemId = options.itemId; + currentServerId = options.serverId; + + var dialogOptions = { + removeOnClose: true, + scrollY: false + }; + + if (layoutManager.tv) { + dialogOptions.size = 'fullscreen'; + } else { + dialogOptions.size = 'small'; + } + + var dlg = dialogHelper.createDialog(dialogOptions); + + dlg.classList.add('formDialog'); + dlg.classList.add('subtitleUploaderDialog'); + + dlg.innerHTML = globalize.translateDocument(template, 'core'); + + if (layoutManager.tv) { + scrollHelper.centerFocus.on(dlg, false); + } + + // Has to be assigned a z-index after the call to .open() + dlg.addEventListener('close', function () { + + if (layoutManager.tv) { + scrollHelper.centerFocus.off(dlg, false); + } + + loading.hide(); + resolve(hasChanges); + }); + + dialogHelper.open(dlg); + + initEditor(dlg); + + var selectLanguage = dlg.querySelector('#selectLanguage'); + + if (options.languages) { + + selectLanguage.innerHTML = options.languages.list || null; + selectLanguage.value = options.languages.value || null; + } + + dlg.querySelector('.btnCancel').addEventListener('click', function () { + + dialogHelper.close(dlg); + }); + }); + } + + return { + show: function (options) { + + return new Promise(function (resolve, reject) { + + hasChanges = false; + + showEditor(options, resolve, reject); + }); + } + }; +}); diff --git a/src/components/subtitleuploader/subtitleuploader.template.html b/src/components/subtitleuploader/subtitleuploader.template.html new file mode 100644 index 000000000..ef09775cd --- /dev/null +++ b/src/components/subtitleuploader/subtitleuploader.template.html @@ -0,0 +1,45 @@ +
+ +

+ ${HeaderUploadSubtitle} +

+
+ +
+
+ +
+ +
+

${HeaderAddUpdateSubtitle}

+ + +
+
+
+
${LabelDropSubtitleHere}
+ + +
+
+
+
+ +
+
+ +
+ +
+
+
+
+
diff --git a/src/scripts/site.js b/src/scripts/site.js index c00169d22..d3a47031b 100644 --- a/src/scripts/site.js +++ b/src/scripts/site.js @@ -799,6 +799,7 @@ var AppInfo = {}; define('recordingButton', [componentsPath + '/recordingcreator/recordingbutton'], returnFirstDependency); define('recordingHelper', [componentsPath + '/recordingcreator/recordinghelper'], returnFirstDependency); define('subtitleEditor', [componentsPath + '/subtitleeditor/subtitleeditor'], returnFirstDependency); + define('subtitleUploader', [componentsPath + '/subtitleuploader/subtitleuploader'], returnFirstDependency); define('subtitleSync', [componentsPath + '/subtitlesync/subtitlesync'], returnFirstDependency); define('itemIdentifier', [componentsPath + '/itemidentifier/itemidentifier'], returnFirstDependency); define('itemMediaInfo', [componentsPath + '/itemMediaInfo/itemMediaInfo'], returnFirstDependency); From 64da797e78e33e11eec8f087dcb2ec7dcb26dcce Mon Sep 17 00:00:00 2001 From: redSpoutnik <15638041+redSpoutnik@users.noreply.github.com> Date: Sat, 16 May 2020 15:16:18 +0200 Subject: [PATCH 002/271] fix code smells --- .../subtitleeditor/subtitleeditor.js | 6 +++--- .../subtitleuploader/subtitleuploader.js | 21 ++++++------------- .../subtitleuploader.template.html | 4 ++-- 3 files changed, 11 insertions(+), 20 deletions(-) diff --git a/src/components/subtitleeditor/subtitleeditor.js b/src/components/subtitleeditor/subtitleeditor.js index 4513d1d9d..350b95d66 100644 --- a/src/components/subtitleeditor/subtitleeditor.js +++ b/src/components/subtitleeditor/subtitleeditor.js @@ -349,8 +349,8 @@ define(['dialogHelper', 'require', 'layoutManager', 'globalize', 'userSettings', function onOpenUploadMenu(e) { - var context = dom.parentWithClass(e.target, 'subtitleEditorDialog'); - var selectLanguage = context.querySelector('#selectLanguage'); + var dialog = dom.parentWithClass(e.target, 'subtitleEditorDialog'); + var selectLanguage = dialog.querySelector('#selectLanguage'); var apiClient = connectionManager.getApiClient(currentItem.ServerId); require(['subtitleUploader'], function (subtitleUploader) { @@ -368,7 +368,7 @@ define(['dialogHelper', 'require', 'layoutManager', 'globalize', 'userSettings', if (hasChanged) { hasChanges = true; - reload(context, apiClient, currentItem.Id); + reload(dialog, apiClient, currentItem.Id); } }); }); diff --git a/src/components/subtitleuploader/subtitleuploader.js b/src/components/subtitleuploader/subtitleuploader.js index bf3a8ca4b..09e45ba5d 100644 --- a/src/components/subtitleuploader/subtitleuploader.js +++ b/src/components/subtitleuploader/subtitleuploader.js @@ -10,19 +10,11 @@ define(['dialogHelper', 'connectionManager', 'dom', 'loading', 'scrollHelper', ' loading.hide(); - switch (evt.target.error.code) { - case evt.target.error.NOT_FOUND_ERR: - require(['toast'], function (toast) { - toast(globalize.translate('MessageFileReadError')); - }); - break; - case evt.target.error.ABORT_ERR: - break; // noop - default: - require(['toast'], function (toast) { - toast(globalize.translate('MessageFileReadError')); - }); - break; + var error = evt.target.error; + if (error.code !== error.ABORT_ERR) { + require(['toast'], function (toast) { + toast(globalize.translate('MessageFileReadError')); + }); } } @@ -85,7 +77,7 @@ define(['dialogHelper', 'connectionManager', 'dom', 'loading', 'scrollHelper', ' toast(globalize.translate('MessageSubtitleFileTypeAllowed')); }); e.preventDefault(); - return false; + return; } loading.show(); @@ -103,7 +95,6 @@ define(['dialogHelper', 'connectionManager', 'dom', 'loading', 'scrollHelper', ' }); e.preventDefault(); - return false; } function initEditor(page) { diff --git a/src/components/subtitleuploader/subtitleuploader.template.html b/src/components/subtitleuploader/subtitleuploader.template.html index ef09775cd..3f4944de5 100644 --- a/src/components/subtitleuploader/subtitleuploader.template.html +++ b/src/components/subtitleuploader/subtitleuploader.template.html @@ -1,5 +1,5 @@
- +

${HeaderUploadSubtitle}

@@ -14,7 +14,7 @@

${HeaderAddUpdateSubtitle}

From 11099fc41e9085f80641f3a7d3eca657f5cf2528 Mon Sep 17 00:00:00 2001 From: redSpoutnik <15638041+redSpoutnik@users.noreply.github.com> Date: Sat, 16 May 2020 15:42:39 +0200 Subject: [PATCH 003/271] remove block padding --- .../subtitleeditor/subtitleeditor.js | 6 ------ .../subtitleuploader/subtitleuploader.js | 18 ------------------ 2 files changed, 24 deletions(-) diff --git a/src/components/subtitleeditor/subtitleeditor.js b/src/components/subtitleeditor/subtitleeditor.js index 350b95d66..553255f1a 100644 --- a/src/components/subtitleeditor/subtitleeditor.js +++ b/src/components/subtitleeditor/subtitleeditor.js @@ -348,31 +348,25 @@ define(['dialogHelper', 'require', 'layoutManager', 'globalize', 'userSettings', } function onOpenUploadMenu(e) { - var dialog = dom.parentWithClass(e.target, 'subtitleEditorDialog'); var selectLanguage = dialog.querySelector('#selectLanguage'); var apiClient = connectionManager.getApiClient(currentItem.ServerId); require(['subtitleUploader'], function (subtitleUploader) { - subtitleUploader.show({ - languages: { list: selectLanguage.innerHTML, value: selectLanguage.value }, itemId: currentItem.Id, serverId: currentItem.ServerId - }).then(function (hasChanged) { - if (hasChanged) { hasChanges = true; reload(dialog, apiClient, currentItem.Id); } }); }); - } function onSearchSubmit(e) { diff --git a/src/components/subtitleuploader/subtitleuploader.js b/src/components/subtitleuploader/subtitleuploader.js index 09e45ba5d..9b9be4c75 100644 --- a/src/components/subtitleuploader/subtitleuploader.js +++ b/src/components/subtitleuploader/subtitleuploader.js @@ -7,7 +7,6 @@ define(['dialogHelper', 'connectionManager', 'dom', 'loading', 'scrollHelper', ' var hasChanges = false; function onFileReaderError(evt) { - loading.hide(); var error = evt.target.error; @@ -26,7 +25,6 @@ define(['dialogHelper', 'connectionManager', 'dom', 'loading', 'scrollHelper', ' } function setFiles(page, files) { - var file = files[0]; if (!isValidSubtitleFile(file)) { @@ -53,14 +51,12 @@ define(['dialogHelper', 'connectionManager', 'dom', 'loading', 'scrollHelper', ' // Closure to capture the file information. reader.onload = (function (theFile) { return function () { - // Render thumbnail. var html = '
subtitles' + escape(theFile.name) + ''; page.querySelector('#subtitleOutput').innerHTML = html; page.querySelector('#fldUpload').classList.remove('hide'); page.querySelector('#labelDropSubtitle').classList.add('hide'); - }; })(file); @@ -69,7 +65,6 @@ define(['dialogHelper', 'connectionManager', 'dom', 'loading', 'scrollHelper', ' } function onSubmit(e) { - var file = currentFile; if (!isValidSubtitleFile(file)) { @@ -87,7 +82,6 @@ define(['dialogHelper', 'connectionManager', 'dom', 'loading', 'scrollHelper', ' var isForced = dlg.querySelector('#chkIsForced').checked; connectionManager.getApiClient(currentServerId).uploadItemSubtitle(currentItemId, language, isForced, file).then(function () { - dlg.querySelector('#uploadSubtitle').value = ''; loading.hide(); hasChanges = true; @@ -98,24 +92,19 @@ define(['dialogHelper', 'connectionManager', 'dom', 'loading', 'scrollHelper', ' } function initEditor(page) { - page.querySelector('.uploadSubtitleForm').addEventListener('submit', onSubmit); - page.querySelector('#uploadSubtitle').addEventListener('change', function () { setFiles(page, this.files); }); - page.querySelector('.btnBrowse').addEventListener('click', function () { page.querySelector('#uploadSubtitle').click(); }); } function showEditor(options, resolve, reject) { - options = options || {}; require(['text!./subtitleuploader.template.html'], function (template) { - currentItemId = options.itemId; currentServerId = options.serverId; @@ -143,11 +132,9 @@ define(['dialogHelper', 'connectionManager', 'dom', 'loading', 'scrollHelper', ' // Has to be assigned a z-index after the call to .open() dlg.addEventListener('close', function () { - if (layoutManager.tv) { scrollHelper.centerFocus.off(dlg, false); } - loading.hide(); resolve(hasChanges); }); @@ -159,13 +146,11 @@ define(['dialogHelper', 'connectionManager', 'dom', 'loading', 'scrollHelper', ' var selectLanguage = dlg.querySelector('#selectLanguage'); if (options.languages) { - selectLanguage.innerHTML = options.languages.list || null; selectLanguage.value = options.languages.value || null; } dlg.querySelector('.btnCancel').addEventListener('click', function () { - dialogHelper.close(dlg); }); }); @@ -173,11 +158,8 @@ define(['dialogHelper', 'connectionManager', 'dom', 'loading', 'scrollHelper', ' return { show: function (options) { - return new Promise(function (resolve, reject) { - hasChanges = false; - showEditor(options, resolve, reject); }); } From b4e420df8f23259bf5b9becb095fa39b84d783b7 Mon Sep 17 00:00:00 2001 From: redSpoutnik <15638041+redSpoutnik@users.noreply.github.com> Date: Sat, 16 May 2020 17:25:50 +0200 Subject: [PATCH 004/271] es6 migration --- package.json | 1 + .../subtitleuploader/subtitleuploader.js | 323 +++++++++--------- 2 files changed, 167 insertions(+), 157 deletions(-) diff --git a/package.json b/package.json index 1e7ebfd0c..61b67829b 100644 --- a/package.json +++ b/package.json @@ -97,6 +97,7 @@ "src/components/playback/mediasession.js", "src/components/sanatizefilename.js", "src/components/scrollManager.js", + "src/components/subtitleuploader/subtitleuploader.js", "src/scripts/dfnshelper.js", "src/scripts/dom.js", "src/scripts/filesystem.js", diff --git a/src/components/subtitleuploader/subtitleuploader.js b/src/components/subtitleuploader/subtitleuploader.js index 9b9be4c75..e63197888 100644 --- a/src/components/subtitleuploader/subtitleuploader.js +++ b/src/components/subtitleuploader/subtitleuploader.js @@ -1,167 +1,176 @@ -define(['dialogHelper', 'connectionManager', 'dom', 'loading', 'scrollHelper', 'layoutManager', 'globalize', 'require', 'emby-button', 'emby-select', 'formDialogStyle', 'css!./style'], function (dialogHelper, connectionManager, dom, loading, scrollHelper, layoutManager, globalize, require) { - 'use strict'; +import dialogHelper from 'dialogHelper'; +import connectionManager from 'connectionManager'; +import dom from 'dom'; +import loading from 'loading'; +import scrollHelper from 'scrollHelper'; +import layoutManager from 'layoutManager'; +import globalize from 'globalize'; +import template from 'text!./subtitleuploader.template.html'; +import 'require'; +import 'emby-button'; +import 'emby-select'; +import 'formDialogStyle'; +import 'css!./style'; - var currentItemId; - var currentServerId; - var currentFile; - var hasChanges = false; +var currentItemId; +var currentServerId; +var currentFile; +var hasChanges = false; - function onFileReaderError(evt) { - loading.hide(); +function onFileReaderError(evt) { + loading.hide(); - var error = evt.target.error; - if (error.code !== error.ABORT_ERR) { - require(['toast'], function (toast) { - toast(globalize.translate('MessageFileReadError')); - }); - } - } - - function isValidSubtitleFile(file) { - return file && ['.sub', '.srt', '.vtt', '.ass', '.ssa'] - .some(function(ext) { - return file.name.endsWith(ext); - }); - } - - function setFiles(page, files) { - var file = files[0]; - - if (!isValidSubtitleFile(file)) { - page.querySelector('#subtitleOutput').innerHTML = ''; - page.querySelector('#fldUpload').classList.add('hide'); - page.querySelector('#labelDropSubtitle').classList.remove('hide'); - currentFile = null; - return; - } - - currentFile = file; - - var reader = new FileReader(); - - reader.onerror = onFileReaderError; - reader.onloadstart = function () { - page.querySelector('#fldUpload').classList.add('hide'); - }; - reader.onabort = function () { - loading.hide(); - console.debug('File read cancelled'); - }; - - // Closure to capture the file information. - reader.onload = (function (theFile) { - return function () { - // Render thumbnail. - var html = 'subtitles' + escape(theFile.name) + ''; - - page.querySelector('#subtitleOutput').innerHTML = html; - page.querySelector('#fldUpload').classList.remove('hide'); - page.querySelector('#labelDropSubtitle').classList.add('hide'); - }; - })(file); - - // Read in the subtitle file as a data URL. - reader.readAsDataURL(file); - } - - function onSubmit(e) { - var file = currentFile; - - if (!isValidSubtitleFile(file)) { - require(['toast'], function (toast) { - toast(globalize.translate('MessageSubtitleFileTypeAllowed')); - }); - e.preventDefault(); - return; - } - - loading.show(); - - var dlg = dom.parentWithClass(this, 'dialog'); - var language = dlg.querySelector('#selectLanguage').value; - var isForced = dlg.querySelector('#chkIsForced').checked; - - connectionManager.getApiClient(currentServerId).uploadItemSubtitle(currentItemId, language, isForced, file).then(function () { - dlg.querySelector('#uploadSubtitle').value = ''; - loading.hide(); - hasChanges = true; - dialogHelper.close(dlg); - }); - - e.preventDefault(); - } - - function initEditor(page) { - page.querySelector('.uploadSubtitleForm').addEventListener('submit', onSubmit); - page.querySelector('#uploadSubtitle').addEventListener('change', function () { - setFiles(page, this.files); - }); - page.querySelector('.btnBrowse').addEventListener('click', function () { - page.querySelector('#uploadSubtitle').click(); + const error = evt.target.error; + if (error.code !== error.ABORT_ERR) { + require(['toast'], function (toast) { + toast(globalize.translate('MessageFileReadError')); }); } +} - function showEditor(options, resolve, reject) { - options = options || {}; - - require(['text!./subtitleuploader.template.html'], function (template) { - currentItemId = options.itemId; - currentServerId = options.serverId; - - var dialogOptions = { - removeOnClose: true, - scrollY: false - }; - - if (layoutManager.tv) { - dialogOptions.size = 'fullscreen'; - } else { - dialogOptions.size = 'small'; - } - - var dlg = dialogHelper.createDialog(dialogOptions); - - dlg.classList.add('formDialog'); - dlg.classList.add('subtitleUploaderDialog'); - - dlg.innerHTML = globalize.translateDocument(template, 'core'); - - if (layoutManager.tv) { - scrollHelper.centerFocus.on(dlg, false); - } - - // Has to be assigned a z-index after the call to .open() - dlg.addEventListener('close', function () { - if (layoutManager.tv) { - scrollHelper.centerFocus.off(dlg, false); - } - loading.hide(); - resolve(hasChanges); - }); - - dialogHelper.open(dlg); - - initEditor(dlg); - - var selectLanguage = dlg.querySelector('#selectLanguage'); - - if (options.languages) { - selectLanguage.innerHTML = options.languages.list || null; - selectLanguage.value = options.languages.value || null; - } - - dlg.querySelector('.btnCancel').addEventListener('click', function () { - dialogHelper.close(dlg); - }); +function isValidSubtitleFile(file) { + return file && ['.sub', '.srt', '.vtt', '.ass', '.ssa'] + .some(function(ext) { + return file.name.endsWith(ext); }); +} + +function setFiles(page, files) { + const file = files[0]; + + if (!isValidSubtitleFile(file)) { + page.querySelector('#subtitleOutput').innerHTML = ''; + page.querySelector('#fldUpload').classList.add('hide'); + page.querySelector('#labelDropSubtitle').classList.remove('hide'); + currentFile = null; + return; } - return { - show: function (options) { - return new Promise(function (resolve, reject) { - hasChanges = false; - showEditor(options, resolve, reject); - }); - } + currentFile = file; + + const reader = new FileReader(); + + reader.onerror = onFileReaderError; + reader.onloadstart = function () { + page.querySelector('#fldUpload').classList.add('hide'); }; -}); + reader.onabort = function () { + loading.hide(); + console.debug('File read cancelled'); + }; + + // Closure to capture the file information. + reader.onload = (function (theFile) { + return function () { + // Render file. + const html = 'subtitles' + escape(theFile.name) + ''; + + page.querySelector('#subtitleOutput').innerHTML = html; + page.querySelector('#fldUpload').classList.remove('hide'); + page.querySelector('#labelDropSubtitle').classList.add('hide'); + }; + })(file); + + // Read in the subtitle file as a data URL. + reader.readAsDataURL(file); +} + +function onSubmit(e) { + const file = currentFile; + + if (!isValidSubtitleFile(file)) { + require(['toast'], function (toast) { + toast(globalize.translate('MessageSubtitleFileTypeAllowed')); + }); + e.preventDefault(); + return; + } + + loading.show(); + + const dlg = dom.parentWithClass(this, 'dialog'); + const language = dlg.querySelector('#selectLanguage').value; + const isForced = dlg.querySelector('#chkIsForced').checked; + + connectionManager.getApiClient(currentServerId).uploadItemSubtitle(currentItemId, language, isForced, file).then(function () { + dlg.querySelector('#uploadSubtitle').value = ''; + loading.hide(); + hasChanges = true; + dialogHelper.close(dlg); + }); + + e.preventDefault(); +} + +function initEditor(page) { + page.querySelector('.uploadSubtitleForm').addEventListener('submit', onSubmit); + page.querySelector('#uploadSubtitle').addEventListener('change', function () { + setFiles(page, this.files); + }); + page.querySelector('.btnBrowse').addEventListener('click', function () { + page.querySelector('#uploadSubtitle').click(); + }); +} + +function showEditor(options, resolve, reject) { + options = options || {}; + currentItemId = options.itemId; + currentServerId = options.serverId; + + const dialogOptions = { + removeOnClose: true, + scrollY: false + }; + + if (layoutManager.tv) { + dialogOptions.size = 'fullscreen'; + } else { + dialogOptions.size = 'small'; + } + + const dlg = dialogHelper.createDialog(dialogOptions); + + dlg.classList.add('formDialog'); + dlg.classList.add('subtitleUploaderDialog'); + + dlg.innerHTML = globalize.translateDocument(template, 'core'); + + if (layoutManager.tv) { + scrollHelper.centerFocus.on(dlg, false); + } + + // Has to be assigned a z-index after the call to .open() + dlg.addEventListener('close', function () { + if (layoutManager.tv) { + scrollHelper.centerFocus.off(dlg, false); + } + loading.hide(); + resolve(hasChanges); + }); + + dialogHelper.open(dlg); + + initEditor(dlg); + + const selectLanguage = dlg.querySelector('#selectLanguage'); + + if (options.languages) { + selectLanguage.innerHTML = options.languages.list || null; + selectLanguage.value = options.languages.value || null; + } + + dlg.querySelector('.btnCancel').addEventListener('click', function () { + dialogHelper.close(dlg); + }); +} + +export function show(options) { + return new Promise(function (resolve, reject) { + hasChanges = false; + showEditor(options, resolve, reject); + }); +} + +export default { + show: show +}; From 7613dcfc1d863b450c5b482cdb50660850e4c9fc Mon Sep 17 00:00:00 2001 From: redSpoutnik <15638041+redSpoutnik@users.noreply.github.com> Date: Sat, 16 May 2020 18:02:14 +0200 Subject: [PATCH 005/271] Add subtitleUploader fr and en-us strings --- src/strings/en-us.json | 4 ++++ src/strings/fr.json | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/src/strings/en-us.json b/src/strings/en-us.json index 2014f2d61..683e97c67 100644 --- a/src/strings/en-us.json +++ b/src/strings/en-us.json @@ -301,6 +301,7 @@ "HeaderAddToCollection": "Add to Collection", "HeaderAddToPlaylist": "Add to Playlist", "HeaderAddUpdateImage": "Add/Update Image", + "HeaderAddUpdateSubtitle": "Add/Update Subtitle", "HeaderAddUser": "Add User", "HeaderAdditionalParts": "Additional Parts", "HeaderAdmin": "Admin", @@ -505,6 +506,7 @@ "HeaderTypeText": "Enter Text", "HeaderUpcomingOnTV": "Upcoming On TV", "HeaderUploadImage": "Upload Image", + "HeaderUploadSubtitle": "Upload Subtitle", "HeaderUser": "User", "HeaderUsers": "Users", "HeaderVideoQuality": "Video Quality", @@ -625,6 +627,7 @@ "LabelDropImageHere": "Drop image here, or click to browse.", "LabelDroppedFrames": "Dropped frames:", "LabelDropShadow": "Drop shadow:", + "LabelDropSubtitleHere": "Drop subtitle here, or click to browse.", "LabelDynamicExternalId": "{0} Id:", "LabelEasyPinCode": "Easy pin code:", "LabelEmbedAlbumArtDidl": "Embed album art in Didl", @@ -684,6 +687,7 @@ "LabelInNetworkSignInWithEasyPassword": "Enable in-network sign in with my easy pin code", "LabelInNetworkSignInWithEasyPasswordHelp": "Use the easy pin code to sign in to clients within your local network. Your regular password will only be needed away from home. If the pin code is left blank, you won't need a password within your home network.", "LabelInternetQuality": "Internet quality:", + "LabelIsForced": "Forced", "LabelKeepUpTo": "Keep up to:", "LabelKidsCategories": "Children's categories:", "LabelKodiMetadataDateFormat": "Release date format:", diff --git a/src/strings/fr.json b/src/strings/fr.json index 3f1d22c75..625a15f3b 100644 --- a/src/strings/fr.json +++ b/src/strings/fr.json @@ -271,6 +271,7 @@ "HeaderAddToCollection": "Ajouter à la collection", "HeaderAddToPlaylist": "Ajouter à la liste de lecture", "HeaderAddUpdateImage": "Ajouter/Mettre à jour une image", + "HeaderAddUpdateSubtitle": "Ajouter/Mettre à jour des sous-titres", "HeaderAddUser": "Ajouter un utilisateur", "HeaderAdditionalParts": "Parties additionelles", "HeaderAdmin": "Administrateur", @@ -457,6 +458,7 @@ "HeaderTypeText": "Entrer texte", "HeaderUpcomingOnTV": "Prochainement à la TV", "HeaderUploadImage": "Envoyer une image", + "HeaderUploadSubtitle": "Envoyer des sous-titres", "HeaderUser": "Utilisateur", "HeaderUsers": "Utilisateurs", "HeaderVideoQuality": "Qualité vidéo", @@ -564,6 +566,7 @@ "LabelDownloadLanguages": "Téléchargement des langues :", "LabelDropImageHere": "Faites glisser l'image ici, ou cliquez pour parcourir vos fichiers.", "LabelDropShadow": "Ombre portée :", + "LabelDropSubtitleHere": "Faites glisser les sous-tires ici, ou cliquez pour parcourir vos fichiers.", "LabelDynamicExternalId": "ID {0} :", "LabelEasyPinCode": "Code Easy PIN :", "LabelEmbedAlbumArtDidl": "Intégrer les images d'album dans le DIDL", @@ -620,6 +623,7 @@ "LabelInNetworkSignInWithEasyPassword": "Activer l'authentification simplifiée dans les réseaux domestiques avec mon code Easy PIN", "LabelInNetworkSignInWithEasyPasswordHelp": "Utilisez votre code Easy PIN pour vous connecter aux applications depuis l'intérieur de votre réseau local. Votre mot de passe habituel ne sera requis que depuis l'extérieur. Si le code PIN n'est pas défini, vous n'aurez pas besoin de mot de passe depuis l'intérieur de votre réseau local.", "LabelInternetQuality": "Qualité d'internet :", + "LabelIsForced": "Forcés", "LabelKeepUpTo": "Garder jusqu'à :", "LabelKidsCategories": "Catégories jeunesse :", "LabelKodiMetadataDateFormat": "Format de la date de sortie :", From 0a2f0b770cca47047c33625ae448ef49b93d377a Mon Sep 17 00:00:00 2001 From: ferferga Date: Wed, 27 May 2020 19:30:07 +0200 Subject: [PATCH 006/271] Remove download images in advance from library options --- .../libraryoptionseditor/libraryoptionseditor.js | 4 ---- .../libraryoptionseditor.template.html | 8 -------- src/strings/en-us.json | 2 -- 3 files changed, 14 deletions(-) diff --git a/src/components/libraryoptionseditor/libraryoptionseditor.js b/src/components/libraryoptionseditor/libraryoptionseditor.js index fec465640..05adeec35 100644 --- a/src/components/libraryoptionseditor/libraryoptionseditor.js +++ b/src/components/libraryoptionseditor/libraryoptionseditor.js @@ -243,11 +243,9 @@ define(['globalize', 'dom', 'emby-checkbox', 'emby-select', 'emby-input'], funct elem.innerHTML = html; if (html) { elem.classList.remove('hide'); - page.querySelector('.chkDownloadImagesInAdvanceContainer').classList.remove('hide'); page.querySelector('.chkSaveLocalContainer').classList.remove('hide'); } else { elem.classList.add('hide'); - page.querySelector('.chkDownloadImagesInAdvanceContainer').classList.add('hide'); page.querySelector('.chkSaveLocalContainer').classList.add('hide'); } return true; @@ -500,7 +498,6 @@ define(['globalize', 'dom', 'emby-checkbox', 'emby-select', 'emby-input'], funct EnableRealtimeMonitor: parent.querySelector('.chkEnableRealtimeMonitor').checked, ExtractChapterImagesDuringLibraryScan: parent.querySelector('.chkExtractChaptersDuringLibraryScan').checked, EnableChapterImageExtraction: parent.querySelector('.chkExtractChapterImages').checked, - DownloadImagesInAdvance: parent.querySelector('#chkDownloadImagesInAdvance').checked, EnableInternetProviders: true, ImportMissingEpisodes: parent.querySelector('#chkImportMissingEpisodes').checked, SaveLocalMetadata: parent.querySelector('#chkSaveLocal').checked, @@ -558,7 +555,6 @@ define(['globalize', 'dom', 'emby-checkbox', 'emby-select', 'emby-input'], funct parent.querySelector('.chkEnableRealtimeMonitor').checked = options.EnableRealtimeMonitor; parent.querySelector('.chkExtractChaptersDuringLibraryScan').checked = options.ExtractChapterImagesDuringLibraryScan; parent.querySelector('.chkExtractChapterImages').checked = options.EnableChapterImageExtraction; - parent.querySelector('#chkDownloadImagesInAdvance').checked = options.DownloadImagesInAdvance; parent.querySelector('#chkSaveLocal').checked = options.SaveLocalMetadata; parent.querySelector('#chkImportMissingEpisodes').checked = options.ImportMissingEpisodes; parent.querySelector('.chkAutomaticallyGroupSeries').checked = options.EnableAutomaticSeriesGrouping; diff --git a/src/components/libraryoptionseditor/libraryoptionseditor.template.html b/src/components/libraryoptionseditor/libraryoptionseditor.template.html index caa177108..93033032a 100644 --- a/src/components/libraryoptionseditor/libraryoptionseditor.template.html +++ b/src/components/libraryoptionseditor/libraryoptionseditor.template.html @@ -69,14 +69,6 @@
${LabelSaveLocalMetadataHelp}
-
- -
${OptionDownloadImagesInAdvanceHelp}
-
-
${LabelTranscodingTempPathHelp}
+
+
+
+ +
+ +
+
${LabelFallbackFontPathHelp}
+
+
+ +
${EnableFallbackFontHelp}
+
${LabelDownMixAudioScaleHelp}
diff --git a/src/plugins/htmlVideoPlayer/plugin.js b/src/plugins/htmlVideoPlayer/plugin.js index cc312bb95..36d35eac7 100644 --- a/src/plugins/htmlVideoPlayer/plugin.js +++ b/src/plugins/htmlVideoPlayer/plugin.js @@ -1066,14 +1066,20 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa } function renderSsaAss(videoElement, track, item) { + var avaliableFonts = new Array(); var attachments = self._currentPlayOptions.mediaSource.MediaAttachments || []; + attachments.map(function (i) { + // embedded font url + return avaliableFonts.push(i.DeliveryUrl); + }); var apiClient = connectionManager.getApiClient(item); + var fallbackFont = apiClient.getUrl('/FallbackFont/Font', { + api_key: apiClient.accessToken() + }); var options = { video: videoElement, subUrl: getTextTrackUrl(track, item), - fonts: attachments.map(function (i) { - return apiClient.getUrl(i.DeliveryUrl); - }), + fonts: avaliableFonts, workerUrl: appRouter.baseUrl() + '/libraries/subtitles-octopus-worker.js', legacyWorkerUrl: appRouter.baseUrl() + '/libraries/subtitles-octopus-worker-legacy.js', onError: function() { @@ -1094,7 +1100,13 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa renderAhead: 90 }; require(['JavascriptSubtitlesOctopus'], function(SubtitlesOctopus) { - currentSubtitlesOctopus = new SubtitlesOctopus(options); + apiClient.getNamedConfiguration('encoding').then(function (config) { + if (config.EnableFallbackFont) { + avaliableFonts.push(fallbackFont); + } + + currentSubtitlesOctopus = new SubtitlesOctopus(options); + }); }); } diff --git a/src/strings/en-us.json b/src/strings/en-us.json index c1ea50431..8bd233c01 100644 --- a/src/strings/en-us.json +++ b/src/strings/en-us.json @@ -1565,5 +1565,11 @@ "ButtonCast": "Cast", "ButtonPlayer": "Player", "StopPlayback": "Stop playback", - "ClearQueue": "Clear queue" + "ClearQueue": "Clear queue", + "HeaderSelectFallbackFontPath" : "Select Fallback Font File Path", + "HeaderSelectFallbackFontPathHelp": "Browse or enter the path of the fallback font file to use for rendering ASS/SSA subtitles.", + "LabelFallbackFontPath": "Fallback font file path:", + "LabelFallbackFontPathHelp": "Specify a custom path of the fallback font file to use for rendering ASS/SSA subtitles. The maximum allowed size is 10 Megabytes. It is recommended to use the lightweight and web-friendly woff2 format font. Leave it blank unless the font is rendered incorrectly.", + "EnableFallbackFont" : "Enable fallback fonts", + "EnableFallbackFontHelp" : "Enable custom alternate fonts. This can avoid the problem of incorrect subtitle rendering." } diff --git a/src/strings/zh-cn.json b/src/strings/zh-cn.json index 0b2767fda..cdd931938 100644 --- a/src/strings/zh-cn.json +++ b/src/strings/zh-cn.json @@ -1578,5 +1578,11 @@ "ClearQueue": "清空队列", "StopPlayback": "停止播放", "Writers": "作者", - "ViewAlbumArtist": "查看专辑艺术家" + "ViewAlbumArtist": "查看专辑艺术家", + "HeaderSelectFallbackFontPath" : "选择备用字体路径", + "HeaderSelectFallbackFontPathHelp": "浏览或输入一个备用字体文件的路径用于渲染 ASS/SSA 字幕。", + "LabelFallbackFontPath": "备用字体文件路径:", + "LabelFallbackFontPathHelp": "指定一个备用字体文件用于渲染 ASS/SSA 字幕。允许的最大字体容量为 10 MB。推荐使用轻量且适合网络传输的 woff2 格式字体。除非字体显示不正确,否则将其留空。", + "EnableFallbackFont" : "启用备用字体", + "EnableFallbackFontHelp" : "使用自定义的备用字体。这可以避免一些字幕渲染不正确的问题。" } From 7849f57f694f6563591e14607f35e12f159876da Mon Sep 17 00:00:00 2001 From: nyanmisaka Date: Wed, 29 Jul 2020 03:04:13 +0800 Subject: [PATCH 008/271] allows to use multiple fallback fonts --- src/controllers/dashboard/encodingsettings.js | 1 - src/plugins/htmlVideoPlayer/plugin.js | 17 +++++++++++++---- src/strings/en-us.json | 8 ++++---- src/strings/zh-cn.json | 4 ++-- 4 files changed, 19 insertions(+), 11 deletions(-) diff --git a/src/controllers/dashboard/encodingsettings.js b/src/controllers/dashboard/encodingsettings.js index 1e957171f..47414e4c2 100644 --- a/src/controllers/dashboard/encodingsettings.js +++ b/src/controllers/dashboard/encodingsettings.js @@ -189,7 +189,6 @@ define(['jQuery', 'loading', 'globalize', 'dom', 'libraryMenu'], function ($, lo require(['directorybrowser'], function (directoryBrowser) { var picker = new directoryBrowser(); picker.show({ - includeFiles: true, includeDirectories: true, callback: function (path) { if (path) { diff --git a/src/plugins/htmlVideoPlayer/plugin.js b/src/plugins/htmlVideoPlayer/plugin.js index 36d35eac7..a3e973840 100644 --- a/src/plugins/htmlVideoPlayer/plugin.js +++ b/src/plugins/htmlVideoPlayer/plugin.js @@ -1073,7 +1073,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa return avaliableFonts.push(i.DeliveryUrl); }); var apiClient = connectionManager.getApiClient(item); - var fallbackFont = apiClient.getUrl('/FallbackFont/Font', { + var fallbackFontList = apiClient.getUrl('/FallbackFont/FontList', { api_key: apiClient.accessToken() }); var options = { @@ -1102,10 +1102,19 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa require(['JavascriptSubtitlesOctopus'], function(SubtitlesOctopus) { apiClient.getNamedConfiguration('encoding').then(function (config) { if (config.EnableFallbackFont) { - avaliableFonts.push(fallbackFont); + apiClient.getJSON(fallbackFontList).then(function (fontFiles) { + (fontFiles || []).map(function (font) { + var fontUrl = apiClient.getUrl('/FallbackFont/Font', { + name: font.Name, + api_key: apiClient.accessToken() + }); + return avaliableFonts.push(fontUrl); + }); + currentSubtitlesOctopus = new SubtitlesOctopus(options); + }); + } else { + currentSubtitlesOctopus = new SubtitlesOctopus(options); } - - currentSubtitlesOctopus = new SubtitlesOctopus(options); }); }); } diff --git a/src/strings/en-us.json b/src/strings/en-us.json index 8bd233c01..3e342bea1 100644 --- a/src/strings/en-us.json +++ b/src/strings/en-us.json @@ -1566,10 +1566,10 @@ "ButtonPlayer": "Player", "StopPlayback": "Stop playback", "ClearQueue": "Clear queue", - "HeaderSelectFallbackFontPath" : "Select Fallback Font File Path", - "HeaderSelectFallbackFontPathHelp": "Browse or enter the path of the fallback font file to use for rendering ASS/SSA subtitles.", - "LabelFallbackFontPath": "Fallback font file path:", - "LabelFallbackFontPathHelp": "Specify a custom path of the fallback font file to use for rendering ASS/SSA subtitles. The maximum allowed size is 10 Megabytes. It is recommended to use the lightweight and web-friendly woff2 format font. Leave it blank unless the font is rendered incorrectly.", + "HeaderSelectFallbackFontPath" : "Select Fallback Font Folder Path", + "HeaderSelectFallbackFontPathHelp": "Browse or enter the path of the fallback font folder to use for rendering ASS/SSA subtitles.", + "LabelFallbackFontPath": "Fallback font folder path:", + "LabelFallbackFontPathHelp": "Specify a path containing fallback font for rendering ASS/SSA subtitles. The maximum allowed total font size is 20 Megabytes. It is recommended to use the lightweight and web-friendly woff2 format font. Leave it blank unless the font is rendered incorrectly.", "EnableFallbackFont" : "Enable fallback fonts", "EnableFallbackFontHelp" : "Enable custom alternate fonts. This can avoid the problem of incorrect subtitle rendering." } diff --git a/src/strings/zh-cn.json b/src/strings/zh-cn.json index cdd931938..24c18a025 100644 --- a/src/strings/zh-cn.json +++ b/src/strings/zh-cn.json @@ -1580,9 +1580,9 @@ "Writers": "作者", "ViewAlbumArtist": "查看专辑艺术家", "HeaderSelectFallbackFontPath" : "选择备用字体路径", - "HeaderSelectFallbackFontPathHelp": "浏览或输入一个备用字体文件的路径用于渲染 ASS/SSA 字幕。", + "HeaderSelectFallbackFontPathHelp": "浏览或输入一个包含备用字体文件的路径用于渲染 ASS/SSA 字幕。", "LabelFallbackFontPath": "备用字体文件路径:", - "LabelFallbackFontPathHelp": "指定一个备用字体文件用于渲染 ASS/SSA 字幕。允许的最大字体容量为 10 MB。推荐使用轻量且适合网络传输的 woff2 格式字体。除非字体显示不正确,否则将其留空。", + "LabelFallbackFontPathHelp": "指定一个包含备用字体文件的路径用于渲染 ASS/SSA 字幕。允许的最大字体总容量为 20 MB。推荐使用轻量且适合网络传输的 woff2 格式字体。除非字体显示不正确,否则将其留空。", "EnableFallbackFont" : "启用备用字体", "EnableFallbackFontHelp" : "使用自定义的备用字体。这可以避免一些字幕渲染不正确的问题。" } From fe390efbc52e3fac24a1e5e113acde1e7dc4fb95 Mon Sep 17 00:00:00 2001 From: Nyanmisaka Date: Thu, 30 Jul 2020 16:49:09 +0800 Subject: [PATCH 009/271] follow the server side changes --- src/plugins/htmlVideoPlayer/plugin.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/plugins/htmlVideoPlayer/plugin.js b/src/plugins/htmlVideoPlayer/plugin.js index a3e973840..0bd5eea13 100644 --- a/src/plugins/htmlVideoPlayer/plugin.js +++ b/src/plugins/htmlVideoPlayer/plugin.js @@ -1073,7 +1073,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa return avaliableFonts.push(i.DeliveryUrl); }); var apiClient = connectionManager.getApiClient(item); - var fallbackFontList = apiClient.getUrl('/FallbackFont/FontList', { + var fallbackFontList = apiClient.getUrl('/FallbackFont/Fonts', { api_key: apiClient.accessToken() }); var options = { @@ -1104,8 +1104,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa if (config.EnableFallbackFont) { apiClient.getJSON(fallbackFontList).then(function (fontFiles) { (fontFiles || []).map(function (font) { - var fontUrl = apiClient.getUrl('/FallbackFont/Font', { - name: font.Name, + var fontUrl = apiClient.getUrl(`/FallbackFont/Fonts/${font.Name}`, { api_key: apiClient.accessToken() }); return avaliableFonts.push(fontUrl); From 25ed2680d13e3a07379aebc764cb0c993c9620be Mon Sep 17 00:00:00 2001 From: Nyanmisaka Date: Thu, 30 Jul 2020 17:26:22 +0800 Subject: [PATCH 010/271] disable font when the path is not set --- src/controllers/dashboard/encodingsettings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controllers/dashboard/encodingsettings.js b/src/controllers/dashboard/encodingsettings.js index 47414e4c2..edeb89966 100644 --- a/src/controllers/dashboard/encodingsettings.js +++ b/src/controllers/dashboard/encodingsettings.js @@ -59,7 +59,7 @@ define(['jQuery', 'loading', 'globalize', 'dom', 'libraryMenu'], function ($, lo config.DownMixAudioBoost = $('#txtDownMixAudioBoost', form).val(); config.TranscodingTempPath = $('#txtTranscodingTempPath', form).val(); config.FallbackFontPath = form.querySelector('#txtFallbackFontPath').value; - config.EnableFallbackFont = form.querySelector('#chkEnableFallbackFont').checked; + config.EnableFallbackFont = form.querySelector('#txtFallbackFontPath').value && form.querySelector('#chkEnableFallbackFont').checked; config.EncodingThreadCount = $('#selectThreadCount', form).val(); config.HardwareAccelerationType = $('#selectVideoDecoder', form).val(); config.VaapiDevice = $('#txtVaapiDevice', form).val(); From f9b95a42c2c09349f9d43cbb0bd1b4696d25e4ed Mon Sep 17 00:00:00 2001 From: Nyanmisaka Date: Thu, 30 Jul 2020 17:58:59 +0800 Subject: [PATCH 011/271] optimize the string according to suggestions Co-authored-by: David Mouse --- src/strings/en-us.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/en-us.json b/src/strings/en-us.json index 3e342bea1..55c8d5e59 100644 --- a/src/strings/en-us.json +++ b/src/strings/en-us.json @@ -1569,7 +1569,7 @@ "HeaderSelectFallbackFontPath" : "Select Fallback Font Folder Path", "HeaderSelectFallbackFontPathHelp": "Browse or enter the path of the fallback font folder to use for rendering ASS/SSA subtitles.", "LabelFallbackFontPath": "Fallback font folder path:", - "LabelFallbackFontPathHelp": "Specify a path containing fallback font for rendering ASS/SSA subtitles. The maximum allowed total font size is 20 Megabytes. It is recommended to use the lightweight and web-friendly woff2 format font. Leave it blank unless the font is rendered incorrectly.", + "LabelFallbackFontPathHelp": "Specify a path containing fallback fonts for rendering ASS/SSA subtitles. The maximum allowed total font size is 20 MB. Lightweight and web-friendly font formats such as woff2 are recommended.", "EnableFallbackFont" : "Enable fallback fonts", "EnableFallbackFontHelp" : "Enable custom alternate fonts. This can avoid the problem of incorrect subtitle rendering." } From e06fb53f4880558fff1f9046080202c0388a1fd6 Mon Sep 17 00:00:00 2001 From: Nyanmisaka Date: Thu, 30 Jul 2020 18:00:06 +0800 Subject: [PATCH 012/271] optimize strings --- src/strings/zh-cn.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/zh-cn.json b/src/strings/zh-cn.json index 24c18a025..7c7b420d1 100644 --- a/src/strings/zh-cn.json +++ b/src/strings/zh-cn.json @@ -1582,7 +1582,7 @@ "HeaderSelectFallbackFontPath" : "选择备用字体路径", "HeaderSelectFallbackFontPathHelp": "浏览或输入一个包含备用字体文件的路径用于渲染 ASS/SSA 字幕。", "LabelFallbackFontPath": "备用字体文件路径:", - "LabelFallbackFontPathHelp": "指定一个包含备用字体文件的路径用于渲染 ASS/SSA 字幕。允许的最大字体总容量为 20 MB。推荐使用轻量且适合网络传输的 woff2 格式字体。除非字体显示不正确,否则将其留空。", + "LabelFallbackFontPathHelp": "指定一个包含备用字体文件的路径用于渲染 ASS/SSA 字幕。允许的最大字体总容量为 20 MB。推荐使用轻量且适合网络传输的字体,例如 woff2。", "EnableFallbackFont" : "启用备用字体", "EnableFallbackFontHelp" : "使用自定义的备用字体。这可以避免一些字幕渲染不正确的问题。" } From b232117ff5603ad606fcc28426e6708a01b9f7dc Mon Sep 17 00:00:00 2001 From: nyanmisaka Date: Fri, 31 Jul 2020 00:35:23 +0800 Subject: [PATCH 013/271] minor changes --- src/plugins/htmlVideoPlayer/plugin.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/htmlVideoPlayer/plugin.js b/src/plugins/htmlVideoPlayer/plugin.js index fb0184071..27b0eb830 100644 --- a/src/plugins/htmlVideoPlayer/plugin.js +++ b/src/plugins/htmlVideoPlayer/plugin.js @@ -1035,7 +1035,7 @@ function tryRemoveElement(elem) { * @private */ renderSsaAss(videoElement, track, item) { - const avaliableFonts = new Array(); + const avaliableFonts = []; const attachments = this._currentPlayOptions.mediaSource.MediaAttachments || []; attachments.map(function (i) { // embedded font url From c5cb1028aee54ba89f7b79f2046b26747c02ab25 Mon Sep 17 00:00:00 2001 From: matjaz321 Date: Thu, 13 Aug 2020 22:35:04 +0200 Subject: [PATCH 014/271] Added onError eventListener to the youtube iframe video player to destroy itself whenever it receives any errors --- src/plugins/youtubePlayer/plugin.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/plugins/youtubePlayer/plugin.js b/src/plugins/youtubePlayer/plugin.js index eed75a811..c83fac1b8 100644 --- a/src/plugins/youtubePlayer/plugin.js +++ b/src/plugins/youtubePlayer/plugin.js @@ -142,7 +142,11 @@ function setCurrentSrc(instance, elem, options) { } else if (event.data === YT.PlayerState.PAUSED) { events.trigger(instance, 'pause'); } - } + }, + 'onError': () => { + instance.destroy(); + loading.hide(); + }, }, playerVars: { controls: 0, From a50e4853e3206934c1fcaa9a950beb476e3a416f Mon Sep 17 00:00:00 2001 From: matjaz321 Date: Thu, 13 Aug 2020 22:40:01 +0200 Subject: [PATCH 015/271] linting fixes --- src/plugins/youtubePlayer/plugin.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/youtubePlayer/plugin.js b/src/plugins/youtubePlayer/plugin.js index c83fac1b8..7225de596 100644 --- a/src/plugins/youtubePlayer/plugin.js +++ b/src/plugins/youtubePlayer/plugin.js @@ -146,7 +146,7 @@ function setCurrentSrc(instance, elem, options) { 'onError': () => { instance.destroy(); loading.hide(); - }, + } }, playerVars: { controls: 0, From 68f0f43fdcde169c133d5908b5f9a96399f74594 Mon Sep 17 00:00:00 2001 From: nyanmisaka Date: Wed, 19 Aug 2020 23:02:17 +0800 Subject: [PATCH 016/271] minor changes --- src/controllers/dashboard/encodingsettings.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/controllers/dashboard/encodingsettings.js b/src/controllers/dashboard/encodingsettings.js index f64087784..fdb35d3d9 100644 --- a/src/controllers/dashboard/encodingsettings.js +++ b/src/controllers/dashboard/encodingsettings.js @@ -64,7 +64,7 @@ import libraryMenu from 'libraryMenu'; config.DownMixAudioBoost = $('#txtDownMixAudioBoost', form).val(); config.TranscodingTempPath = $('#txtTranscodingTempPath', form).val(); config.FallbackFontPath = form.querySelector('#txtFallbackFontPath').value; - config.EnableFallbackFont = form.querySelector('#txtFallbackFontPath').value && form.querySelector('#chkEnableFallbackFont').checked; + config.EnableFallbackFont = form.querySelector('#txtFallbackFontPath').value ? form.querySelector('#chkEnableFallbackFont').checked : false; config.EncodingThreadCount = $('#selectThreadCount', form).val(); config.HardwareAccelerationType = $('#selectVideoDecoder', form).val(); config.VaapiDevice = $('#txtVaapiDevice', form).val(); @@ -191,8 +191,8 @@ import libraryMenu from 'libraryMenu'; }); }); $('#btnSelectFallbackFontPath', page).on('click.selectDirectory', function () { - require(['directorybrowser'], function (directoryBrowser) { - var picker = new directoryBrowser(); + import('directorybrowser').then(({default: directoryBrowser}) => { + const picker = new directoryBrowser(); picker.show({ includeDirectories: true, callback: function (path) { From 865e9085ef8fdc32d6ebcee8aaa68fb2b0a79f2f Mon Sep 17 00:00:00 2001 From: matjaz321 Date: Wed, 19 Aug 2020 21:32:22 +0200 Subject: [PATCH 017/271] CR fixes --- src/components/playback/playbackmanager.js | 4 ++++ src/plugins/youtubePlayer/plugin.js | 5 +---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index 3b4099d54..9959544ae 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -2260,6 +2260,10 @@ class PlaybackManager { }, function () { // TODO: show error message self.stop(player); + loading.hide(); + }).catch(() => { + player.destroy(); + loading.hide(); }); }); } diff --git a/src/plugins/youtubePlayer/plugin.js b/src/plugins/youtubePlayer/plugin.js index 7225de596..2ac9a6378 100644 --- a/src/plugins/youtubePlayer/plugin.js +++ b/src/plugins/youtubePlayer/plugin.js @@ -143,10 +143,7 @@ function setCurrentSrc(instance, elem, options) { events.trigger(instance, 'pause'); } }, - 'onError': () => { - instance.destroy(); - loading.hide(); - } + 'onError': () => reject(), }, playerVars: { controls: 0, From 73e6f3c03fa7bdb84d90743e645cafa351315a41 Mon Sep 17 00:00:00 2001 From: matjaz321 Date: Wed, 19 Aug 2020 21:35:51 +0200 Subject: [PATCH 018/271] fixed linting error --- src/plugins/youtubePlayer/plugin.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/youtubePlayer/plugin.js b/src/plugins/youtubePlayer/plugin.js index 2ac9a6378..9079e2bcb 100644 --- a/src/plugins/youtubePlayer/plugin.js +++ b/src/plugins/youtubePlayer/plugin.js @@ -143,7 +143,7 @@ function setCurrentSrc(instance, elem, options) { events.trigger(instance, 'pause'); } }, - 'onError': () => reject(), + 'onError': () => reject() }, playerVars: { controls: 0, From d6441934416cdd916ee5bb187f3c14eda686b7dc Mon Sep 17 00:00:00 2001 From: Dmitry Lyzo Date: Thu, 3 Sep 2020 01:04:21 +0300 Subject: [PATCH 019/271] Return permanent scrollbar (killed by refactoring) --- src/assets/css/site.css | 9 +++++---- src/components/slideshow/slideshow.js | 2 -- src/plugins/htmlVideoPlayer/plugin.js | 3 ++- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/assets/css/site.css b/src/assets/css/site.css index 38e056df8..9eb61de07 100644 --- a/src/assets/css/site.css +++ b/src/assets/css/site.css @@ -44,6 +44,11 @@ body { overflow-x: hidden; background-color: transparent !important; -webkit-font-smoothing: antialiased; + + /* This keeps the scrollbar always present in all pages, so we avoid clipping while switching between pages + that need the scrollbar and pages that don't. + */ + overflow-y: scroll; } .mainAnimatedPage { @@ -122,10 +127,6 @@ div[data-role=page] { padding-bottom: 4em; } -.force-scroll { - overflow-y: scroll; -} - .hide-scroll { overflow-y: hidden; } diff --git a/src/components/slideshow/slideshow.js b/src/components/slideshow/slideshow.js index 028c21b22..f41f86484 100644 --- a/src/components/slideshow/slideshow.js +++ b/src/components/slideshow/slideshow.js @@ -492,7 +492,6 @@ export default function (options) { document.removeEventListener((window.PointerEvent ? 'pointermove' : 'mousemove'), onPointerMove); // Shows page scrollbar document.body.classList.remove('hide-scroll'); - document.body.classList.add('force-scroll'); } /** @@ -657,7 +656,6 @@ export default function (options) { self.show = function () { createElements(options); // Hides page scrollbar - document.body.classList.remove('force-scroll'); document.body.classList.add('hide-scroll'); }; diff --git a/src/plugins/htmlVideoPlayer/plugin.js b/src/plugins/htmlVideoPlayer/plugin.js index d07e6aae5..9b9b7011d 100644 --- a/src/plugins/htmlVideoPlayer/plugin.js +++ b/src/plugins/htmlVideoPlayer/plugin.js @@ -107,7 +107,7 @@ function tryRemoveElement(elem) { const animatedPage = document.querySelector('.page:not(.hide)'); animatedPage.classList.add('hide'); // At this point, we must hide the scrollbar placeholder, so it's not being displayed while the item is being loaded - document.body.classList.remove('force-scroll'); + document.body.classList.add('hide-scroll'); } function zoomIn(elem) { @@ -679,6 +679,7 @@ function tryRemoveElement(elem) { destroyFlvPlayer(this); appRouter.setTransparency('none'); + document.body.classList.remove('hide-scroll'); const videoElement = this.#mediaElement; From 74227f38f53649b8532e2f2e3503f13ad0e7f536 Mon Sep 17 00:00:00 2001 From: Dmitry Lyzo Date: Thu, 3 Sep 2020 01:40:36 +0300 Subject: [PATCH 020/271] Fix scrollbar for Youtube player --- src/plugins/youtubePlayer/plugin.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/plugins/youtubePlayer/plugin.js b/src/plugins/youtubePlayer/plugin.js index eed75a811..57e49e1d1 100644 --- a/src/plugins/youtubePlayer/plugin.js +++ b/src/plugins/youtubePlayer/plugin.js @@ -37,6 +37,9 @@ function createMediaElement(instance, options) { document.body.insertBefore(dlg, document.body.firstChild); instance.videoDialog = dlg; + // At this point, we must hide the scrollbar placeholder, so it's not being displayed while the item is being loaded + document.body.classList.add('hide-scroll'); + if (options.fullscreen && dlg.animate && !browser.slow) { zoomIn(dlg, 1).onfinish = function () { resolve(videoElement); @@ -214,6 +217,7 @@ class YoutubePlayer { } destroy() { appRouter.setTransparency('none'); + document.body.classList.remove('hide-scroll'); const dlg = this.videoDialog; if (dlg) { From cb1d2887fa1d5d8fffafbbebb4636d58d97b6bf0 Mon Sep 17 00:00:00 2001 From: dkanada Date: Thu, 10 Sep 2020 23:20:55 +0900 Subject: [PATCH 021/271] fix startup wizard redirect and standalone mode --- gulpfile.js | 32 ++------------ src/components/appRouter.js | 46 ++++++++++---------- src/components/require/requiretext.js | 2 +- src/controllers/dashboard/general.js | 4 -- src/scripts/clientUtils.js | 61 +++++++++++++-------------- src/scripts/settings/userSettings.js | 2 +- src/scripts/site.js | 44 +++++++++---------- src/standalone.js | 4 -- 8 files changed, 78 insertions(+), 117 deletions(-) delete mode 100644 src/standalone.js diff --git a/gulpfile.js b/gulpfile.js index 8b407ec2a..7d1184dbd 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -2,7 +2,6 @@ const { src, dest, series, parallel, watch } = require('gulp'); const browserSync = require('browser-sync').create(); const del = require('del'); const babel = require('gulp-babel'); -const concat = require('gulp-concat'); const terser = require('gulp-terser'); const htmlmin = require('gulp-htmlmin'); const imagemin = require('gulp-imagemin'); @@ -16,7 +15,6 @@ const stream = require('webpack-stream'); const inject = require('gulp-inject'); const postcss = require('gulp-postcss'); const sass = require('gulp-sass'); -const gulpif = require('gulp-if'); const lazypipe = require('lazypipe'); sass.compiler = require('node-sass'); @@ -30,10 +28,7 @@ if (mode.production()) { const options = { javascript: { - query: ['src/**/*.js', '!src/bundle.js', '!src/standalone.js', '!src/scripts/apploader.js'] - }, - apploader: { - query: ['src/standalone.js', 'src/scripts/apploader.js'] + query: ['src/**/*.js', '!src/bundle.js'] }, css: { query: ['src/**/*.css', 'src/**/*.scss'] @@ -68,8 +63,6 @@ function serve() { } }); - watch(options.apploader.query, apploader(true)); - watch('src/bundle.js', webpack); watch(options.css.query).on('all', function (event, path) { @@ -131,20 +124,6 @@ function javascript(query) { .pipe(browserSync.stream()); } -function apploader(standalone) { - function task() { - return src(options.apploader.query, { base: './src/' }) - .pipe(gulpif(standalone, concat('scripts/apploader.js'))) - .pipe(pipelineJavascript()) - .pipe(dest('dist/')) - .pipe(browserSync.stream()); - } - - task.displayName = 'apploader'; - - return task; -} - function webpack() { return stream(config) .pipe(dest('dist/')) @@ -195,10 +174,5 @@ function injectBundle() { .pipe(browserSync.stream()); } -function build(standalone) { - return series(clean, parallel(javascript, apploader(standalone), webpack, css, html, images, copy)); -} - -exports.default = series(build(false), injectBundle); -exports.standalone = series(build(true), injectBundle); -exports.serve = series(exports.standalone, serve); +exports.default = series(clean, parallel(javascript, webpack, css, html, images, copy), injectBundle); +exports.serve = series(exports.default, serve); diff --git a/src/components/appRouter.js b/src/components/appRouter.js index a6bb6da61..e1c0467d3 100644 --- a/src/components/appRouter.js +++ b/src/components/appRouter.js @@ -8,6 +8,7 @@ import itemHelper from 'itemHelper'; import loading from 'loading'; import page from 'page'; import viewManager from 'viewManager'; +import * as webSettings from 'webSettings'; class AppRouter { allRoutes = []; @@ -72,15 +73,11 @@ class AppRouter { } showVideoOsd() { - return Dashboard.navigate('video'); + Dashboard.navigate('video'); } showSelectServer() { - Dashboard.navigate(AppInfo.isNativeApp ? 'selectserver.html' : 'login.html'); - } - - showWelcome() { - Dashboard.navigate(AppInfo.isNativeApp ? 'selectserver.html' : 'login.html'); + Dashboard.navigate('selectserver.html'); } showSettings() { @@ -282,9 +279,6 @@ class AppRouter { case 'ServerSelection': this.showSelectServer(); break; - case 'ConnectSignIn': - this.showWelcome(); - break; case 'ServerUpdateNeeded': import('alert').then(({default: alert}) =>{ alert({ @@ -510,25 +504,33 @@ class AppRouter { authenticate(ctx, route, callback) { const firstResult = this.firstConnectionResult; - if (firstResult) { - this.firstConnectionResult = null; - if (firstResult.State !== 'SignedIn' && !route.anonymous) { - this.handleConnectionResult(firstResult); - return; - } + this.firstConnectionResult = null; + if (firstResult && firstResult.State === 'ServerSignIn' && !route.anonymous) { + let url = ApiClient.serverAddress() + '/System/Info/Public'; + fetch(url).then(response => { + if (!response.ok) return; + response.json().then(data => { + if (data !== null && data.StartupWizardCompleted === false) { + Dashboard.navigate('wizardstart.html'); + } else { + this.handleConnectionResult(firstResult); + } + }); + }).catch(error => { + console.error(error); + }); } + console.debug('processing path request: ' + pathname); const apiClient = window.connectionManager.currentApiClient(); const pathname = ctx.pathname.toLowerCase(); - console.debug('appRouter - processing path request ' + pathname); - const isCurrentRouteStartup = this.currentRouteInfo ? this.currentRouteInfo.route.startup : true; const shouldExitApp = ctx.isBack && route.isDefaultRoute && isCurrentRouteStartup; if (!shouldExitApp && (!apiClient || !apiClient.isLoggedIn()) && !route.anonymous) { - console.debug('appRouter - route does not allow anonymous access, redirecting to login'); + console.debug('route does not allow anonymous access: redirecting to login'); this.beginConnectionWizard(); return; } @@ -536,16 +538,16 @@ class AppRouter { if (shouldExitApp) { if (appHost.supports('exit')) { appHost.exit(); - return; } + return; } if (apiClient && apiClient.isLoggedIn()) { - console.debug('appRouter - user is authenticated'); + console.debug('user is authenticated'); if (route.isDefaultRoute) { - console.debug('appRouter - loading skin home page'); + console.debug('loading home page'); Emby.Page.goHome(); return; } else if (route.roles) { @@ -556,7 +558,7 @@ class AppRouter { } } - console.debug('appRouter - proceeding to ' + pathname); + console.debug('proceeding to page: ' + pathname); callback(); } diff --git a/src/components/require/requiretext.js b/src/components/require/requiretext.js index 28ddeb21c..ae1edbfc2 100644 --- a/src/components/require/requiretext.js +++ b/src/components/require/requiretext.js @@ -2,7 +2,7 @@ define(function () { 'use strict'; // hack to work around the server's auto-redirection feature - var addRedirectPrevention = window.dashboardVersion != null && window.Dashboard && !window.AppInfo.isNativeApp; + var addRedirectPrevention = window.dashboardVersion != null && window.Dashboard; return { diff --git a/src/controllers/dashboard/general.js b/src/controllers/dashboard/general.js index eb819dc41..78fc8f838 100644 --- a/src/controllers/dashboard/general.js +++ b/src/controllers/dashboard/general.js @@ -44,10 +44,6 @@ import 'emby-button'; ApiClient.updateNamedConfiguration(brandingConfigKey, brandingConfig).then(function () { Dashboard.processServerConfigurationUpdateResult(); - - if (requiresReload && !AppInfo.isNativeApp) { - window.location.reload(true); - } }); }); }, function () { diff --git a/src/scripts/clientUtils.js b/src/scripts/clientUtils.js index 4d3c049e8..097abc4c9 100644 --- a/src/scripts/clientUtils.js +++ b/src/scripts/clientUtils.js @@ -1,35 +1,41 @@ +import * as webSettings from 'webSettings'; export function getCurrentUser() { return window.ApiClient.getCurrentUser(false); } -//TODO: investigate url prefix support for serverAddress function -export function serverAddress() { - if (AppInfo.isNativeApp) { - const apiClient = window.ApiClient; +// TODO: investigate url prefix support for serverAddress function +export async function serverAddress() { + const apiClient = window.ApiClient; - if (apiClient) { - return apiClient.serverAddress(); + if (apiClient) { + return Promise.resolve(apiClient.serverAddress()); + } + + let current = await window.connectionManager.getAvailableServers().then(servers => { + if (servers.length !== 0) { + return Promise.resolve(servers[0].ManualAddress); } + }); - return null; - } + if (current) return Promise.resolve(current); - const urlLower = window.location.href.toLowerCase(); - const index = urlLower.lastIndexOf('/web'); + let urls = []; + urls.push(`${window.location.origin}/System/Info/Public`); + urls.push(`${window.location.protocol}//${window.location.hostname}:8096/System/Info/Public`); - if (index != -1) { - return urlLower.substring(0, index); - } + let promises = urls.map(url => { + return fetch(url).catch(error => { + return Promise.resolve(); + }); + }); - const loc = window.location; - let address = loc.protocol + '//' + loc.hostname; - - if (loc.port) { - address += ':' + loc.port; - } - - return address; + return Promise.all(promises).then(responses => { + return responses.find(response => response && response.ok); + }).then(response => response.url).catch(error => { + console.log(error); + return Promise.resolve(); + }); } export function getCurrentUserId() { @@ -49,16 +55,9 @@ export function onServerChanged(userId, accessToken, apiClient) { export function logout() { window.connectionManager.logout().then(function () { - let loginPage; - - if (AppInfo.isNativeApp) { - loginPage = 'selectserver.html'; - window.ApiClient = null; - } else { - loginPage = 'login.html'; - } - - navigate(loginPage); + webSettings.getMultiServer().then(multi => { + multi ? navigate('selectserver.html') : navigate('login.html'); + }); }); } diff --git a/src/scripts/settings/userSettings.js b/src/scripts/settings/userSettings.js index 1235e0fa5..263d74ed3 100644 --- a/src/scripts/settings/userSettings.js +++ b/src/scripts/settings/userSettings.js @@ -209,7 +209,7 @@ export class UserSettings { } val = this.get('enableBackdrops', false); - return val !== 'false'; + return val === 'true'; } /** diff --git a/src/scripts/site.js b/src/scripts/site.js index f14670d82..adb0d6521 100644 --- a/src/scripts/site.js +++ b/src/scripts/site.js @@ -63,7 +63,7 @@ function initClient() { if (!localApiClient) { var server = window.connectionManager.getLastUsedServer(); - if (server) { + if (server && server.Id) { localApiClient = window.connectionManager.getApiClient(server.Id); } } @@ -83,40 +83,38 @@ function initClient() { } function createConnectionManager() { - return require(['connectionManagerFactory', 'apphost', 'credentialprovider', 'events', 'userSettings'], function (ConnectionManager, appHost, credentialProvider, events, userSettings) { + return require(['connectionManagerFactory', 'apphost', 'credentialprovider', 'events', 'userSettings', 'apiclient', 'clientUtils'], function (ConnectionManager, appHost, credentialProvider, events, userSettings, apiClientFactory, clientUtils) { appHost = appHost.default || appHost; var credentialProviderInstance = new credentialProvider(); var promises = [appHost.init()]; - return Promise.all(promises).then(function (responses) { + return Promise.all(promises).then(responses => { var capabilities = Dashboard.capabilities(appHost); window.connectionManager = new ConnectionManager(credentialProviderInstance, appHost.appName(), appHost.appVersion(), appHost.deviceName(), appHost.deviceId(), capabilities); bindConnectionManagerEvents(window.connectionManager, events, userSettings); + clientUtils.serverAddress().then(server => { + if (!server) { + Dashboard.navigate('selectserver.html'); + return; + } - if (!AppInfo.isNativeApp) { - console.debug('loading ApiClient singleton'); + console.debug('creating apiclient singleton'); + let parts = server.split('/'); + let url = parts[0] + '//' + parts[2]; + var apiClient = new apiClientFactory(url, appHost.appName(), appHost.appVersion(), appHost.deviceName(), appHost.deviceId()); - return require(['apiclient', 'clientUtils'], function (apiClientFactory, clientUtils) { - console.debug('creating ApiClient singleton'); + apiClient.enableAutomaticNetworking = false; + apiClient.manualAddressOnly = true; - var apiClient = new apiClientFactory(Dashboard.serverAddress(), appHost.appName(), appHost.appVersion(), appHost.deviceName(), appHost.deviceId()); + window.connectionManager.addApiClient(apiClient); + window.ApiClient = apiClient; + console.debug('loaded apiclient singleton'); - apiClient.enableAutomaticNetworking = false; - apiClient.manualAddressOnly = true; - - window.connectionManager.addApiClient(apiClient); - - window.ApiClient = apiClient; - localApiClient = apiClient; - - console.debug('loaded ApiClient singleton'); - }); - } - - return Promise.resolve(); + return Promise.resolve(); + }); }); }); } @@ -434,10 +432,6 @@ function initClient() { define('castSenderApiLoader', [componentsPath + '/castSenderApi'], returnFirstDependency); - if (window.appMode === 'cordova' || window.appMode === 'android' || window.appMode === 'standalone') { - AppInfo.isNativeApp = true; - } - init(); } diff --git a/src/standalone.js b/src/standalone.js deleted file mode 100644 index 237872703..000000000 --- a/src/standalone.js +++ /dev/null @@ -1,4 +0,0 @@ -(function() { - 'use strict'; - window.appMode = 'standalone'; -})(); From 5d8fdc311fd43a2ab7576c7ba63c207311f678e5 Mon Sep 17 00:00:00 2001 From: dkanada Date: Sat, 12 Sep 2020 08:34:08 +0900 Subject: [PATCH 022/271] remove standalone build from azure --- .ci/azure-pipelines-build.yml | 6 ------ README.md | 10 ++-------- package.json | 1 - 3 files changed, 2 insertions(+), 15 deletions(-) diff --git a/.ci/azure-pipelines-build.yml b/.ci/azure-pipelines-build.yml index 128fe5460..026afe76a 100644 --- a/.ci/azure-pipelines-build.yml +++ b/.ci/azure-pipelines-build.yml @@ -8,8 +8,6 @@ jobs: BuildConfiguration: development Production: BuildConfiguration: production - Standalone: - BuildConfiguration: standalone pool: vmImage: 'ubuntu-latest' @@ -39,10 +37,6 @@ jobs: displayName: 'Build Production' condition: eq(variables['BuildConfiguration'], 'production') - - script: 'yarn build:standalone' - displayName: 'Build Standalone' - condition: eq(variables['BuildConfiguration'], 'standalone') - - script: 'test -d dist' displayName: 'Check Build' diff --git a/README.md b/README.md index ca42965dd..1108ec9f2 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,7 @@ Jellyfin Web is the frontend used for most of the clients available for end user ### Dependencies -- [Node.js](https://nodejs.org/en/download/) +- [Node.js](https://nodejs.org/en/download) - [Yarn 1.22.4](https://classic.yarnpkg.com/en/docs/install) - Gulp-cli @@ -69,14 +69,8 @@ Jellyfin Web is the frontend used for most of the clients available for end user yarn serve ``` -4. Build the client with sourcemaps. +4. Build the client with sourcemaps available. ```sh yarn build:development ``` - - You can build a nginx compatible version as well. - - ```sh - yarn build:standalone - ``` diff --git a/package.json b/package.json index 3a74cd9d6..df433ed9b 100644 --- a/package.json +++ b/package.json @@ -392,7 +392,6 @@ "prepare": "gulp --production", "build:development": "gulp --development", "build:production": "gulp --production", - "build:standalone": "gulp standalone --development", "lint": "eslint \".\"", "stylelint": "stylelint \"src/**/*.css\"" } From 4553215841936e2c2c089e4869004771007b0c9e Mon Sep 17 00:00:00 2001 From: dkanada Date: Sat, 12 Sep 2020 08:41:04 +0900 Subject: [PATCH 023/271] add code suggestions --- src/components/appRouter.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/components/appRouter.js b/src/components/appRouter.js index e1c0467d3..1d25543c3 100644 --- a/src/components/appRouter.js +++ b/src/components/appRouter.js @@ -509,23 +509,23 @@ class AppRouter { if (firstResult && firstResult.State === 'ServerSignIn' && !route.anonymous) { let url = ApiClient.serverAddress() + '/System/Info/Public'; fetch(url).then(response => { - if (!response.ok) return; - response.json().then(data => { - if (data !== null && data.StartupWizardCompleted === false) { - Dashboard.navigate('wizardstart.html'); - } else { - this.handleConnectionResult(firstResult); - } - }); + if (!response.ok) return Promise.reject('fetch failed'); + return response.json(); + }).then(data => { + if (data !== null && data.StartupWizardCompleted === false) { + Dashboard.navigate('wizardstart.html'); + } else { + this.handleConnectionResult(firstResult); + } }).catch(error => { console.error(error); }); } - console.debug('processing path request: ' + pathname); const apiClient = window.connectionManager.currentApiClient(); const pathname = ctx.pathname.toLowerCase(); + console.debug('processing path request: ' + pathname); const isCurrentRouteStartup = this.currentRouteInfo ? this.currentRouteInfo.route.startup : true; const shouldExitApp = ctx.isBack && route.isDefaultRoute && isCurrentRouteStartup; From 982ae411c59cb95421ea870b0dd1726662fe15d5 Mon Sep 17 00:00:00 2001 From: dkanada Date: Sat, 12 Sep 2020 09:12:40 +0900 Subject: [PATCH 024/271] fix linting issues and add servers to web config --- src/components/appRouter.js | 2 +- src/config.template.json | 1 + src/scripts/clientUtils.js | 15 ++++++++------- src/scripts/settings/webSettings.js | 9 +++++++++ src/scripts/site.js | 10 ++++------ 5 files changed, 23 insertions(+), 14 deletions(-) diff --git a/src/components/appRouter.js b/src/components/appRouter.js index 1d25543c3..0c3c1d453 100644 --- a/src/components/appRouter.js +++ b/src/components/appRouter.js @@ -507,7 +507,7 @@ class AppRouter { this.firstConnectionResult = null; if (firstResult && firstResult.State === 'ServerSignIn' && !route.anonymous) { - let url = ApiClient.serverAddress() + '/System/Info/Public'; + const url = ApiClient.serverAddress() + '/System/Info/Public'; fetch(url).then(response => { if (!response.ok) return Promise.reject('fetch failed'); return response.json(); diff --git a/src/config.template.json b/src/config.template.json index 0f308ccc1..2ea8f8945 100644 --- a/src/config.template.json +++ b/src/config.template.json @@ -1,5 +1,6 @@ { "multiserver": false, + "servers": [], "themes": [ { "name": "Apple TV", diff --git a/src/scripts/clientUtils.js b/src/scripts/clientUtils.js index 097abc4c9..d16566673 100644 --- a/src/scripts/clientUtils.js +++ b/src/scripts/clientUtils.js @@ -12,7 +12,7 @@ export async function serverAddress() { return Promise.resolve(apiClient.serverAddress()); } - let current = await window.connectionManager.getAvailableServers().then(servers => { + const current = await window.connectionManager.getAvailableServers().then(servers => { if (servers.length !== 0) { return Promise.resolve(servers[0].ManualAddress); } @@ -20,19 +20,20 @@ export async function serverAddress() { if (current) return Promise.resolve(current); - let urls = []; - urls.push(`${window.location.origin}/System/Info/Public`); - urls.push(`${window.location.protocol}//${window.location.hostname}:8096/System/Info/Public`); + const urls = []; + urls.push(window.location.origin); + urls.push(`${window.location.protocol}//${window.location.hostname}:8096`); + urls.push(await webSettings.getServers()); - let promises = urls.map(url => { - return fetch(url).catch(error => { + const promises = urls.map(url => { + return fetch(`${url}/System/Info/Public`).catch(error => { return Promise.resolve(); }); }); return Promise.all(promises).then(responses => { return responses.find(response => response && response.ok); - }).then(response => response.url).catch(error => { + }).then(response => response.url.replace('/System/Info/Public', '')).catch(error => { console.log(error); return Promise.resolve(); }); diff --git a/src/scripts/settings/webSettings.js b/src/scripts/settings/webSettings.js index 2ffe290d8..be28ae730 100644 --- a/src/scripts/settings/webSettings.js +++ b/src/scripts/settings/webSettings.js @@ -46,6 +46,15 @@ export function getMultiServer() { }); } +export function getServers() { + return getConfig().then(config => { + return config.servers; + }).catch(error => { + console.log('cannot get web config:', error); + return []; + }); +} + export function getThemes() { return getConfig().then(config => { return config.themes; diff --git a/src/scripts/site.js b/src/scripts/site.js index adb0d6521..0123eceed 100644 --- a/src/scripts/site.js +++ b/src/scripts/site.js @@ -86,11 +86,11 @@ function initClient() { return require(['connectionManagerFactory', 'apphost', 'credentialprovider', 'events', 'userSettings', 'apiclient', 'clientUtils'], function (ConnectionManager, appHost, credentialProvider, events, userSettings, apiClientFactory, clientUtils) { appHost = appHost.default || appHost; - var credentialProviderInstance = new credentialProvider(); - var promises = [appHost.init()]; + const credentialProviderInstance = new credentialProvider(); + const promises = [appHost.init()]; return Promise.all(promises).then(responses => { - var capabilities = Dashboard.capabilities(appHost); + const capabilities = Dashboard.capabilities(appHost); window.connectionManager = new ConnectionManager(credentialProviderInstance, appHost.appName(), appHost.appVersion(), appHost.deviceName(), appHost.deviceId(), capabilities); @@ -102,9 +102,7 @@ function initClient() { } console.debug('creating apiclient singleton'); - let parts = server.split('/'); - let url = parts[0] + '//' + parts[2]; - var apiClient = new apiClientFactory(url, appHost.appName(), appHost.appVersion(), appHost.deviceName(), appHost.deviceId()); + const apiClient = new apiClientFactory(server, appHost.appName(), appHost.appVersion(), appHost.deviceName(), appHost.deviceId()); apiClient.enableAutomaticNetworking = false; apiClient.manualAddressOnly = true; From b973a5eace34f81a1ccb59239c95fa1545cbfb17 Mon Sep 17 00:00:00 2001 From: Dmitry Lyzo Date: Sat, 26 Sep 2020 21:16:34 +0300 Subject: [PATCH 025/271] Make all fullscreen dialogs hide scrollbar --- src/components/dialogHelper/dialogHelper.js | 8 ++++---- src/components/slideshow/slideshow.js | 4 ---- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/src/components/dialogHelper/dialogHelper.js b/src/components/dialogHelper/dialogHelper.js index eb46d98b1..65f2a07a1 100644 --- a/src/components/dialogHelper/dialogHelper.js +++ b/src/components/dialogHelper/dialogHelper.js @@ -310,10 +310,6 @@ import 'scrollStyles'; const supportsOverscrollBehavior = 'overscroll-behavior-y' in document.body.style; function shouldLockDocumentScroll(options) { - if (supportsOverscrollBehavior && (options.size || !browser.touch)) { - return false; - } - if (options.lockScroll != null) { return options.lockScroll; } @@ -322,6 +318,10 @@ import 'scrollStyles'; return true; } + if (supportsOverscrollBehavior && (options.size || !browser.touch)) { + return false; + } + if (options.size) { return true; } diff --git a/src/components/slideshow/slideshow.js b/src/components/slideshow/slideshow.js index f41f86484..e825bd0b8 100644 --- a/src/components/slideshow/slideshow.js +++ b/src/components/slideshow/slideshow.js @@ -490,8 +490,6 @@ export default function (options) { inputManager.off(window, onInputCommand); /* eslint-disable-next-line compat/compat */ document.removeEventListener((window.PointerEvent ? 'pointermove' : 'mousemove'), onPointerMove); - // Shows page scrollbar - document.body.classList.remove('hide-scroll'); } /** @@ -655,8 +653,6 @@ export default function (options) { */ self.show = function () { createElements(options); - // Hides page scrollbar - document.body.classList.add('hide-scroll'); }; /** From 78a3c971ff0e508b1fc367d25bcf3915c0bf319d Mon Sep 17 00:00:00 2001 From: Dmitry Lyzo Date: Sat, 26 Sep 2020 21:48:22 +0300 Subject: [PATCH 026/271] Fix unstyled scrollbar --- src/assets/css/site.css | 9 ++++----- src/scripts/autoThemes.js | 6 +++++- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/assets/css/site.css b/src/assets/css/site.css index 9eb61de07..38e056df8 100644 --- a/src/assets/css/site.css +++ b/src/assets/css/site.css @@ -44,11 +44,6 @@ body { overflow-x: hidden; background-color: transparent !important; -webkit-font-smoothing: antialiased; - - /* This keeps the scrollbar always present in all pages, so we avoid clipping while switching between pages - that need the scrollbar and pages that don't. - */ - overflow-y: scroll; } .mainAnimatedPage { @@ -127,6 +122,10 @@ div[data-role=page] { padding-bottom: 4em; } +.force-scroll { + overflow-y: scroll; +} + .hide-scroll { overflow-y: hidden; } diff --git a/src/scripts/autoThemes.js b/src/scripts/autoThemes.js index e278a80dc..daf8ae581 100644 --- a/src/scripts/autoThemes.js +++ b/src/scripts/autoThemes.js @@ -3,7 +3,11 @@ import skinManager from 'skinManager'; import events from 'events'; // Set the default theme when loading -skinManager.setTheme(userSettings.theme()); +skinManager.setTheme(userSettings.theme()) + /* This keeps the scrollbar always present in all pages, so we avoid clipping while switching between pages + that need the scrollbar and pages that don't. + */ + .then(() => document.body.classList.add('force-scroll')); // Set the user's prefered theme when signing in events.on(window.connectionManager, 'localusersignedin', function (e, user) { From da50605b4e9eed88be771a38d5b6a0362fca8cd8 Mon Sep 17 00:00:00 2001 From: Dmitry Lyzo Date: Sat, 26 Sep 2020 23:55:02 +0300 Subject: [PATCH 027/271] Hide scrollbar only for fullscreen --- src/plugins/youtubePlayer/plugin.js | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/plugins/youtubePlayer/plugin.js b/src/plugins/youtubePlayer/plugin.js index 57e49e1d1..5b921010a 100644 --- a/src/plugins/youtubePlayer/plugin.js +++ b/src/plugins/youtubePlayer/plugin.js @@ -15,6 +15,10 @@ function zoomIn(elem, iterations) { return elem.animate(keyframes, timing); } +function hideScroll() { + document.body.classList.add('hide-scroll'); +} + function createMediaElement(instance, options) { return new Promise(function (resolve, reject) { const dlg = document.querySelector('.youtubePlayerContainer'); @@ -37,8 +41,9 @@ function createMediaElement(instance, options) { document.body.insertBefore(dlg, document.body.firstChild); instance.videoDialog = dlg; - // At this point, we must hide the scrollbar placeholder, so it's not being displayed while the item is being loaded - document.body.classList.add('hide-scroll'); + if (options.fullscreen) { + hideScroll(); + } if (options.fullscreen && dlg.animate && !browser.slow) { zoomIn(dlg, 1).onfinish = function () { @@ -49,6 +54,10 @@ function createMediaElement(instance, options) { } }); } else { + if (options.fullscreen) { + hideScroll(); + } + resolve(dlg.querySelector('#player')); } }); From d969fc2cdb1174dce15d7121e1877cb2f463b72b Mon Sep 17 00:00:00 2001 From: Dmitry Lyzo Date: Thu, 29 Oct 2020 21:45:28 +0300 Subject: [PATCH 028/271] Check variable --- src/components/playback/playbackmanager.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index 7796dafec..a096d255c 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -2939,7 +2939,7 @@ class PlaybackManager { state.NextMediaType = nextMediaType; - if (isServerItem(streamInfo.item)) { + if (streamInfo && isServerItem(streamInfo.item)) { if (player.supportsProgress === false && state.PlayState && !state.PlayState.PositionTicks) { state.PlayState.PositionTicks = streamInfo.item.RunTimeTicks; } From f805bef9e51ca1de0e8623bf8bb6ad57d18af6e3 Mon Sep 17 00:00:00 2001 From: Dmitry Lyzo Date: Thu, 29 Oct 2020 22:08:06 +0300 Subject: [PATCH 029/271] Split then/catch. Remove explicit player destroying --- src/components/playback/playbackmanager.js | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index a096d255c..54831094e 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -2240,17 +2240,14 @@ class PlaybackManager { const streamInfo = createStreamInfoFromUrlItem(item); streamInfo.fullscreen = playOptions.fullscreen; getPlayerData(player).isChangingStream = false; - return player.play(streamInfo).then(function () { + return player.play(streamInfo).then(() => { loading.hide(); onPlaybackStartedFn(); onPlaybackStarted(player, playOptions, streamInfo); - }, function () { + }).catch(() => { // TODO: show error message self.stop(player); loading.hide(); - }).catch(() => { - player.destroy(); - loading.hide(); }); }); } From 6aa0d7c31870de4b75bad2cc44d1477de95e85f2 Mon Sep 17 00:00:00 2001 From: Dmitry Lyzo Date: Thu, 29 Oct 2020 23:52:52 +0300 Subject: [PATCH 030/271] Add error message --- src/components/playback/playbackmanager.js | 4 ++-- src/plugins/youtubePlayer/plugin.js | 10 +++++++++- src/strings/en-us.json | 6 +++++- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index 54831094e..dcb947967 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -2244,10 +2244,10 @@ class PlaybackManager { loading.hide(); onPlaybackStartedFn(); onPlaybackStarted(player, playOptions, streamInfo); - }).catch(() => { - // TODO: show error message + }).catch((errorCode) => { self.stop(player); loading.hide(); + showPlaybackInfoErrorMessage(self, errorCode || ''); }); }); } diff --git a/src/plugins/youtubePlayer/plugin.js b/src/plugins/youtubePlayer/plugin.js index 9079e2bcb..2976f52e5 100644 --- a/src/plugins/youtubePlayer/plugin.js +++ b/src/plugins/youtubePlayer/plugin.js @@ -5,6 +5,14 @@ import loading from 'loading'; /* globals YT */ +const errorCodes = { + 2: 'YoutubeBadRequest', + 5: 'YoutubePlaybackError', + 100: 'YoutubeNotFound', + 101: 'YoutubeDenied', + 150: 'YoutubeDenied' +}; + function zoomIn(elem, iterations) { const keyframes = [ { transform: 'scale3d(.2, .2, .2) ', opacity: '.6', offset: 0 }, @@ -143,7 +151,7 @@ function setCurrentSrc(instance, elem, options) { events.trigger(instance, 'pause'); } }, - 'onError': () => reject() + 'onError': (e) => reject(errorCodes[e.data] || '') // FIXME: default error code/text? }, playerVars: { controls: 0, diff --git a/src/strings/en-us.json b/src/strings/en-us.json index ab547f385..a5a2279bd 100644 --- a/src/strings/en-us.json +++ b/src/strings/en-us.json @@ -1421,5 +1421,9 @@ "SubtitleVerticalPositionHelp": "Line number where text appears. Positive numbers indicate top down. Negative numbers indicate bottom up.", "Preview": "Preview", "LabelMaxMuxingQueueSize": "Max muxing queue size:", - "LabelMaxMuxingQueueSizeHelp": "Maximum number of packets that can be buffered while waiting for all streams to initialize. Try to increase it if you still encounter \"Too many packets buffered for output stream\" error in ffmpeg logs. The recommended value is 2048." + "LabelMaxMuxingQueueSizeHelp": "Maximum number of packets that can be buffered while waiting for all streams to initialize. Try to increase it if you still encounter \"Too many packets buffered for output stream\" error in ffmpeg logs. The recommended value is 2048.", + "YoutubeBadRequest": "Bad request.", + "YoutubePlaybackError": "Requested video cannot be played.", + "YoutubeNotFound": "Video not found.", + "YoutubeDenied": "Requested video is not allowed to be played in embedded players." } From b76f5a0a0fa62328f655705f669e2fc7a311b1f6 Mon Sep 17 00:00:00 2001 From: dkanada Date: Fri, 30 Oct 2020 22:13:56 +0900 Subject: [PATCH 031/271] return empty array when servers missing from config Co-authored-by: Dmitry Lyzo <56478732+dmitrylyzo@users.noreply.github.com> --- src/scripts/settings/webSettings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/scripts/settings/webSettings.js b/src/scripts/settings/webSettings.js index 45ac6b00e..461951f06 100644 --- a/src/scripts/settings/webSettings.js +++ b/src/scripts/settings/webSettings.js @@ -87,7 +87,7 @@ export function getMultiServer() { export function getServers() { return getConfig().then(config => { - return config.servers; + return config.servers || []; }).catch(error => { console.log('cannot get web config:', error); return []; From 69439bbff0d91a4162288fd3bf3beacf7ca8d397 Mon Sep 17 00:00:00 2001 From: dkanada Date: Fri, 30 Oct 2020 22:14:45 +0900 Subject: [PATCH 032/271] fix issue with multiple entries in server array Co-authored-by: Dmitry Lyzo <56478732+dmitrylyzo@users.noreply.github.com> --- src/scripts/clientUtils.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/scripts/clientUtils.js b/src/scripts/clientUtils.js index 0b31727cc..986507171 100644 --- a/src/scripts/clientUtils.js +++ b/src/scripts/clientUtils.js @@ -23,7 +23,7 @@ export async function serverAddress() { const urls = []; urls.push(window.location.origin); urls.push(`${window.location.protocol}//${window.location.hostname}:8096`); - urls.push(await webSettings.getServers()); + urls.push(...await webSettings.getServers()); const promises = urls.map(url => { return fetch(`${url}/System/Info/Public`).catch(error => { From 5787069b313d4ae8360d76cdd48c8445374d32d9 Mon Sep 17 00:00:00 2001 From: Dmitry Lyzo Date: Sat, 31 Oct 2020 12:54:40 +0300 Subject: [PATCH 033/271] Add some comments --- src/plugins/htmlVideoPlayer/plugin.js | 1 + src/plugins/youtubePlayer/plugin.js | 1 + 2 files changed, 2 insertions(+) diff --git a/src/plugins/htmlVideoPlayer/plugin.js b/src/plugins/htmlVideoPlayer/plugin.js index 08db55ac7..f996c5de6 100644 --- a/src/plugins/htmlVideoPlayer/plugin.js +++ b/src/plugins/htmlVideoPlayer/plugin.js @@ -1342,6 +1342,7 @@ function tryRemoveElement(elem) { } }); } else { + // we need to hide scrollbar when starting playback from page with animated background if (options.fullscreen) { hidePrePlaybackPage(); } diff --git a/src/plugins/youtubePlayer/plugin.js b/src/plugins/youtubePlayer/plugin.js index 5b921010a..838a13c99 100644 --- a/src/plugins/youtubePlayer/plugin.js +++ b/src/plugins/youtubePlayer/plugin.js @@ -54,6 +54,7 @@ function createMediaElement(instance, options) { } }); } else { + // we need to hide scrollbar when starting playback from page with animated background if (options.fullscreen) { hideScroll(); } From 47f6d198b63456483969b85884ba254ee2560d9f Mon Sep 17 00:00:00 2001 From: Dmitry Lyzo Date: Sat, 31 Oct 2020 12:58:34 +0300 Subject: [PATCH 034/271] Fix playback of tv show or playlist and restoring of scrollbar after history back --- src/plugins/htmlVideoPlayer/plugin.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/plugins/htmlVideoPlayer/plugin.js b/src/plugins/htmlVideoPlayer/plugin.js index f996c5de6..e8e16693c 100644 --- a/src/plugins/htmlVideoPlayer/plugin.js +++ b/src/plugins/htmlVideoPlayer/plugin.js @@ -103,9 +103,7 @@ function tryRemoveElement(elem) { }); } - function hidePrePlaybackPage() { - const animatedPage = document.querySelector('.page:not(.hide)'); - animatedPage.classList.add('hide'); + function hideScroll() { // At this point, we must hide the scrollbar placeholder, so it's not being displayed while the item is being loaded document.body.classList.add('hide-scroll'); } @@ -1329,7 +1327,7 @@ function tryRemoveElement(elem) { this.#mediaElement = videoElement; if (options.fullscreen) { - hidePrePlaybackPage(); + hideScroll(); } // don't animate on smart tv's, too slow @@ -1344,7 +1342,7 @@ function tryRemoveElement(elem) { } else { // we need to hide scrollbar when starting playback from page with animated background if (options.fullscreen) { - hidePrePlaybackPage(); + hideScroll(); } return Promise.resolve(dlg.querySelector('video')); From 3a692f4ed2d071183ff082740d6c779511b774bf Mon Sep 17 00:00:00 2001 From: Dmitry Lyzo Date: Sat, 31 Oct 2020 13:16:24 +0300 Subject: [PATCH 035/271] Fix alphapicker positioning at the top when starting playback --- src/components/alphaPicker/style.css | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/alphaPicker/style.css b/src/components/alphaPicker/style.css index 4e94c0f75..8feb3e50e 100644 --- a/src/components/alphaPicker/style.css +++ b/src/components/alphaPicker/style.css @@ -12,7 +12,6 @@ .alphaPicker-fixed { position: fixed; bottom: 5.5em; - z-index: 999999; } .alphaPickerRow { From 0d846fa06d33b1c2d8ab84417340e30f30779fc4 Mon Sep 17 00:00:00 2001 From: nyanmisaka Date: Sat, 31 Oct 2020 21:20:20 +0800 Subject: [PATCH 036/271] adjust the first codec for hls streaming --- src/scripts/browserDeviceProfile.js | 48 +++++++++++++---------------- 1 file changed, 21 insertions(+), 27 deletions(-) diff --git a/src/scripts/browserDeviceProfile.js b/src/scripts/browserDeviceProfile.js index 03663b288..217518133 100644 --- a/src/scripts/browserDeviceProfile.js +++ b/src/scripts/browserDeviceProfile.js @@ -338,54 +338,48 @@ define(['browser'], function (browser) { } const canPlayAacVideoAudio = videoTestElement.canPlayType('video/mp4; codecs="avc1.640029, mp4a.40.2"').replace(/no/, ''); + const canPlayAc3VideoAudio = supportsAc3(videoTestElement); + const canPlayEac3VideoAudio = supportsEac3(videoTestElement); + const canPlayAc3VideoAudioInHls = supportsAc3InHls(videoTestElement); - // Only put mp3 first if mkv support is there - // Otherwise with HLS and mp3 audio we're seeing some browsers - // safari is lying - if (supportsAc3(videoTestElement)) { + if (canPlayAc3VideoAudio) { videoAudioCodecs.push('ac3'); - - const eAc3 = supportsEac3(videoTestElement); - if (eAc3) { + if (canPlayEac3VideoAudio) { videoAudioCodecs.push('eac3'); } // This works in edge desktop, but not mobile // TODO: Retest this on mobile - if (supportsAc3InHls(videoTestElement)) { + // Transcoding codec is the first in hlsVideoAudioCodecs + // Put ac3/eac3 first only when the audio channels > 2 and need transcoding + if (canPlayAc3VideoAudioInHls && physicalAudioChannels > 2) { hlsVideoAudioCodecs.push('ac3'); - if (eAc3) { + if (canPlayEac3VideoAudio) { hlsVideoAudioCodecs.push('eac3'); } } } + if (canPlayAacVideoAudio) { + videoAudioCodecs.push('aac'); + hlsVideoAudioCodecs.push('aac'); + } + if (supportsMp3VideoAudio) { videoAudioCodecs.push('mp3'); // PS4 fails to load HLS with mp3 audio if (!browser.ps4) { - // mp3 encoder only supports 2 channels, so only make that preferred if we're only requesting 2 channels - // Also apply it for chromecast because it no longer supports AAC 5.1 - if (physicalAudioChannels <= 2) { - hlsVideoAudioCodecs.push('mp3'); - } + hlsVideoAudioCodecs.push('mp3'); } } - if (canPlayAacVideoAudio) { - if (videoAudioCodecs.indexOf('aac') === -1) { - videoAudioCodecs.push('aac'); - } - - hlsVideoAudioCodecs.push('aac'); - } - - if (supportsMp3VideoAudio) { - // PS4 fails to load HLS with mp3 audio - if (!browser.ps4) { - if (hlsVideoAudioCodecs.indexOf('mp3') === -1) { - hlsVideoAudioCodecs.push('mp3'); + // For ac3/eac3 directstream + if (canPlayAc3VideoAudio) { + if (canPlayAc3VideoAudioInHls && hlsVideoAudioCodecs.indexOf('ac3') === -1) { + hlsVideoAudioCodecs.push('ac3'); + if (canPlayEac3VideoAudio && hlsVideoAudioCodecs.indexOf('eac3') === -1) { + hlsVideoAudioCodecs.push('eac3'); } } } From 517b69550e5c14931c816391b1fe8f7680cb6bf6 Mon Sep 17 00:00:00 2001 From: Dmitry Lyzo Date: Sat, 31 Oct 2020 22:39:30 +0300 Subject: [PATCH 037/271] Fix permanent scrollbar for screensaver --- src/libraries/screensavermanager.css | 4 ++++ src/libraries/screensavermanager.js | 7 ++++++- src/plugins/backdropScreensaver/plugin.js | 1 + src/plugins/logoScreensaver/plugin.js | 23 ++++++++++++++--------- 4 files changed, 25 insertions(+), 10 deletions(-) create mode 100644 src/libraries/screensavermanager.css diff --git a/src/libraries/screensavermanager.css b/src/libraries/screensavermanager.css new file mode 100644 index 000000000..b11bbddb5 --- /dev/null +++ b/src/libraries/screensavermanager.css @@ -0,0 +1,4 @@ +/* own "noScroll" class to avoid conflicts and the need for a scrollbar manager */ +.screensaver-noScroll { + overflow: hidden !important; +} diff --git a/src/libraries/screensavermanager.js b/src/libraries/screensavermanager.js index 68a7dda73..1d6370b9c 100644 --- a/src/libraries/screensavermanager.js +++ b/src/libraries/screensavermanager.js @@ -3,6 +3,7 @@ import playbackManager from 'playbackManager'; import pluginManager from 'pluginManager'; import inputManager from 'inputManager'; import * as userSettings from 'userSettings'; +import 'css!./screensavermanager.css'; function getMinIdleTime() { // Returns the minimum amount of idle time required before the screen saver can be displayed @@ -52,6 +53,8 @@ function ScreenSaverManager() { console.debug('Showing screensaver ' + screensaver.name); + document.body.classList.add('screensaver-noScroll'); + screensaver.show(); activeScreenSaver = screensaver; @@ -69,7 +72,9 @@ function ScreenSaverManager() { function hide() { if (activeScreenSaver) { console.debug('Hiding screensaver'); - activeScreenSaver.hide(); + activeScreenSaver.hide().then(() => { + document.body.classList.remove('screensaver-noScroll'); + }); activeScreenSaver = null; } diff --git a/src/plugins/backdropScreensaver/plugin.js b/src/plugins/backdropScreensaver/plugin.js index 917d8f48a..c261d7508 100644 --- a/src/plugins/backdropScreensaver/plugin.js +++ b/src/plugins/backdropScreensaver/plugin.js @@ -42,6 +42,7 @@ class BackdropScreensaver { this.currentSlideshow.hide(); this.currentSlideshow = null; } + return Promise.resolve(); } } /* eslint-enable indent */ diff --git a/src/plugins/logoScreensaver/plugin.js b/src/plugins/logoScreensaver/plugin.js index 61b8f8a6d..51c9362d3 100644 --- a/src/plugins/logoScreensaver/plugin.js +++ b/src/plugins/logoScreensaver/plugin.js @@ -150,16 +150,21 @@ export default function () { const elem = document.querySelector('.logoScreenSaver'); if (elem) { - const onAnimationFinish = function () { - elem.parentNode.removeChild(elem); - }; + return new Promise((resolve) => { + const onAnimationFinish = function () { + elem.parentNode.removeChild(elem); + resolve(); + }; - if (elem.animate) { - const animation = fadeOut(elem, 1); - animation.onfinish = onAnimationFinish; - } else { - onAnimationFinish(); - } + if (elem.animate) { + const animation = fadeOut(elem, 1); + animation.onfinish = onAnimationFinish; + } else { + onAnimationFinish(); + } + }); } + + return Promise.resolve(); }; } From c7cc220c22d27a57390f7600334f3874d0f6676a Mon Sep 17 00:00:00 2001 From: nyanmisaka Date: Sun, 1 Nov 2020 04:15:46 +0800 Subject: [PATCH 038/271] audio directplay profile cleanup --- src/scripts/browserDeviceProfile.js | 22 +++++++--------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/src/scripts/browserDeviceProfile.js b/src/scripts/browserDeviceProfile.js index 217518133..3ce60cfe7 100644 --- a/src/scripts/browserDeviceProfile.js +++ b/src/scripts/browserDeviceProfile.js @@ -518,21 +518,14 @@ define(['browser'], function (browser) { }); ['opus', 'mp3', 'mp2', 'aac', 'flac', 'alac', 'webma', 'wma', 'wav', 'ogg', 'oga'].filter(canPlayAudioFormat).forEach(function (audioFormat) { - if (audioFormat === 'mp2') { + profile.DirectPlayProfiles.push({ + Container: audioFormat, + Type: 'Audio' + }); + + if (audioFormat === 'webma') { profile.DirectPlayProfiles.push({ - Container: 'mp2,mp3', - Type: 'Audio', - AudioCodec: audioFormat - }); - } else if (audioFormat === 'mp3') { - profile.DirectPlayProfiles.push({ - Container: audioFormat, - Type: 'Audio', - AudioCodec: audioFormat - }); - } else { - profile.DirectPlayProfiles.push({ - Container: audioFormat === 'webma' ? 'webma,webm' : audioFormat, + Container: 'webm', Type: 'Audio' }); } @@ -541,7 +534,6 @@ define(['browser'], function (browser) { if (audioFormat === 'aac' || audioFormat === 'alac') { profile.DirectPlayProfiles.push({ Container: 'm4a,m4b', - AudioCodec: audioFormat, Type: 'Audio' }); } From a7c4be105dcb9e25de8ae14f82a4bf25d617584a Mon Sep 17 00:00:00 2001 From: Mister Rajoy Date: Mon, 2 Nov 2020 02:36:07 +0100 Subject: [PATCH 039/271] Hide progress bar when playing theme media --- CONTRIBUTORS.md | 1 + src/components/themeMediaPlayer.js | 1 + 2 files changed, 2 insertions(+) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 1bdf1cd90..9f9be018b 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -41,6 +41,7 @@ - [Cromefire_](https://github.com/cromefire) - [Orry Verducci](https://github.com/orryverducci) - [Camc314](https://github.com/camc314) + - [danieladov](https://github.com/danieladov) # Emby Contributors diff --git a/src/components/themeMediaPlayer.js b/src/components/themeMediaPlayer.js index 8f288a534..7e6574e90 100644 --- a/src/components/themeMediaPlayer.js +++ b/src/components/themeMediaPlayer.js @@ -27,6 +27,7 @@ function playThemeMedia(items, ownerId) { }).then(function () { currentOwnerId = ownerId; }); + document.getElementsByClassName("nowPlayingBarTop")[0].style.display = "none"; } else { stopIfPlaying(); } From 648ec4d8aee5d4ac9b1333720fa84ee04f93f3ac Mon Sep 17 00:00:00 2001 From: Mister Rajoy Date: Tue, 3 Nov 2020 19:41:50 +0100 Subject: [PATCH 040/271] Hide bar in nowPlayingBar.js --- src/components/nowPlayingBar/nowPlayingBar.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/nowPlayingBar/nowPlayingBar.js b/src/components/nowPlayingBar/nowPlayingBar.js index 621819770..b3da8baaf 100644 --- a/src/components/nowPlayingBar/nowPlayingBar.js +++ b/src/components/nowPlayingBar/nowPlayingBar.js @@ -664,7 +664,7 @@ import 'emby-ratingbutton'; console.debug('nowplaying event: ' + event.type); const player = this; - if (!state.NowPlayingItem || layoutManager.tv) { + if (!state.NowPlayingItem || layoutManager.tv || !state.IsFullscreen) { hideNowPlayingBar(); return; } From 5582777d3487ee216f34d1874b2dc602f9d21b16 Mon Sep 17 00:00:00 2001 From: Mister Rajoy Date: Tue, 3 Nov 2020 19:44:48 +0100 Subject: [PATCH 041/271] Remove old solution --- src/components/themeMediaPlayer.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/themeMediaPlayer.js b/src/components/themeMediaPlayer.js index 7e6574e90..8266c9c2b 100644 --- a/src/components/themeMediaPlayer.js +++ b/src/components/themeMediaPlayer.js @@ -26,8 +26,8 @@ function playThemeMedia(items, ownerId) { enableRemotePlayers: false }).then(function () { currentOwnerId = ownerId; - }); - document.getElementsByClassName("nowPlayingBarTop")[0].style.display = "none"; + }) + } else { stopIfPlaying(); } From 5a319b86ca4f4953c388c1e400f908ea57fa8efd Mon Sep 17 00:00:00 2001 From: Daniel Date: Tue, 3 Nov 2020 19:54:16 +0100 Subject: [PATCH 042/271] Update src/components/themeMediaPlayer.js Co-authored-by: Dmitry Lyzo <56478732+dmitrylyzo@users.noreply.github.com> --- src/components/themeMediaPlayer.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/components/themeMediaPlayer.js b/src/components/themeMediaPlayer.js index 8266c9c2b..8f288a534 100644 --- a/src/components/themeMediaPlayer.js +++ b/src/components/themeMediaPlayer.js @@ -26,8 +26,7 @@ function playThemeMedia(items, ownerId) { enableRemotePlayers: false }).then(function () { currentOwnerId = ownerId; - }) - + }); } else { stopIfPlaying(); } From 1a635e2f81ffb43ec6041c4b5e107a7ffc3ed6c9 Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Fri, 14 Aug 2020 06:36:46 +0200 Subject: [PATCH 043/271] Migrate site.js to ES6 --- src/components/appFooter/appFooter.js | 2 +- src/components/layoutManager.js | 23 +- src/components/nowPlayingBar/nowPlayingBar.js | 2 +- src/components/playback/playbackmanager.js | 12 +- src/components/viewManager/viewManager.js | 5 +- src/scripts/site.js | 703 +++++------------- 6 files changed, 235 insertions(+), 512 deletions(-) diff --git a/src/components/appFooter/appFooter.js b/src/components/appFooter/appFooter.js index 260aea828..4c032ea7d 100644 --- a/src/components/appFooter/appFooter.js +++ b/src/components/appFooter/appFooter.js @@ -33,4 +33,4 @@ class appFooter { } } -export default appFooter; +export default new appFooter({}); diff --git a/src/components/layoutManager.js b/src/components/layoutManager.js index 88a7265f8..fe4258366 100644 --- a/src/components/layoutManager.js +++ b/src/components/layoutManager.js @@ -1,5 +1,6 @@ -import browser from 'browser'; -import appSettings from 'appSettings'; +import appHost from './apphost'; +import browser from '../scripts/browser'; +import { set, get } from '../scripts/settings/appSettings'; import events from 'events'; function setLayout(instance, layout, selectedLayout) { @@ -18,7 +19,7 @@ class LayoutManager { this.autoLayout(); if (save !== false) { - appSettings.set('layout', ''); + set('layout', ''); } } else { setLayout(this, 'mobile', layout); @@ -26,15 +27,15 @@ class LayoutManager { setLayout(this, 'desktop', layout); if (save !== false) { - appSettings.set('layout', layout); + set('layout', layout); } } events.trigger(this, 'modechange'); } - getSavedLayout(layout) { - return appSettings.get('layout'); + getSavedLayout() { + return get('layout'); } autoLayout() { @@ -58,4 +59,12 @@ class LayoutManager { } } -export default new LayoutManager(); +const layoutManager = new LayoutManager(); + +if (appHost.getDefaultLayout) { + layoutManager.defaultLayout = appHost.getDefaultLayout(); +} + +layoutManager.init(); + +export default layoutManager; diff --git a/src/components/nowPlayingBar/nowPlayingBar.js b/src/components/nowPlayingBar/nowPlayingBar.js index 621819770..40337d51e 100644 --- a/src/components/nowPlayingBar/nowPlayingBar.js +++ b/src/components/nowPlayingBar/nowPlayingBar.js @@ -256,7 +256,7 @@ import 'emby-ratingbutton'; return new Promise(function (resolve, reject) { Promise.all([ - import('appFooter-shared'), + import('appFooter'), import('itemShortcuts'), import('css!./nowPlayingBar.css'), import('emby-slider') diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index a68663a76..6fcc05ea6 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -3757,4 +3757,14 @@ class PlaybackManager { } } -export default new PlaybackManager(); +const playbackManager = new PlayQueueManager(); + +window.addEventListener('beforeunload', function () { + try { + playbackManager.onAppClose(); + } catch (err) { + console.error('error in onAppClose: ' + err); + } +}); + +export default playbackManager; diff --git a/src/components/viewManager/viewManager.js b/src/components/viewManager/viewManager.js index 00c301859..a4ee22e75 100644 --- a/src/components/viewManager/viewManager.js +++ b/src/components/viewManager/viewManager.js @@ -169,4 +169,7 @@ class ViewManager { } } -export default new ViewManager(); +const viewManager = new ViewManager(); +viewManager.default.dispatchPageEvents(true); + +export default viewManager; diff --git a/src/scripts/site.js b/src/scripts/site.js index 92b7b513e..db22b6a17 100644 --- a/src/scripts/site.js +++ b/src/scripts/site.js @@ -1,6 +1,16 @@ -window.getWindowLocationSearch = function(win) { - 'use strict'; +import 'core-js/stable'; +import 'regenerator-runtime/runtime'; +import 'jquery'; +import 'fast-text-encoding'; +import 'intersection-observer'; +import 'classlist-polyfill'; +import 'whatwg-fetch'; +import 'resize-observer-polyfill'; +import 'jellyfin-noto'; +import '../assets/css/site.css'; +// TODO: Move this elsewhere +window.getWindowLocationSearch = function(win) { let search = (win || window).location.search; if (!search) { @@ -14,9 +24,8 @@ window.getWindowLocationSearch = function(win) { return search || ''; }; +// TODO: Move this elsewhere window.getParameterByName = function(name, url) { - 'use strict'; - name = name.replace(/[\[]/, '\\[').replace(/[\]]/, '\\]'); const regexS = '[\\?&]' + name + '=([^&#]*)'; const regex = new RegExp(regexS, 'i'); @@ -29,9 +38,8 @@ window.getParameterByName = function(name, url) { return decodeURIComponent(results[1].replace(/\+/g, ' ')); }; +// TODO: Move this elsewhere window.pageClassOn = function(eventName, className, fn) { - 'use strict'; - document.addEventListener(eventName, function (event) { const target = event.target; @@ -41,9 +49,8 @@ window.pageClassOn = function(eventName, className, fn) { }); }; +// TODO: Move this elsewhere window.pageIdOn = function(eventName, id, fn) { - 'use strict'; - document.addEventListener(eventName, function (event) { const target = event.target; @@ -83,146 +90,89 @@ function initClient() { } function createConnectionManager() { - return require(['connectionManagerFactory', 'apphost', 'credentialprovider', 'events', 'userSettings'], function (ConnectionManager, appHost, credentialProvider, events, userSettings) { - appHost = appHost.default || appHost; + return Promise.all([ + import('jellyfin-apiclient/src/connectionManager'), + import('../components/apphost'), + import('jellyfin-apiclient/src/connectionManager'), + import('jellyfin-apiclient/src/events'), + import('./settings/userSettings') + ]) + .then(([ConnectionManager, appHost, credentialProvider, events, userSettings]) => { + appHost = appHost.default || appHost; - const credentialProviderInstance = new credentialProvider(); - const promises = [appHost.init()]; + const credentialProviderInstance = new credentialProvider(); + const promises = [appHost.init()]; - return Promise.all(promises).then(function (responses) { - const capabilities = Dashboard.capabilities(appHost); + return Promise.all(promises).then(function (responses) { + const capabilities = Dashboard.capabilities(appHost); - window.connectionManager = new ConnectionManager(credentialProviderInstance, appHost.appName(), appHost.appVersion(), appHost.deviceName(), appHost.deviceId(), capabilities); + window.ConnectionManager = new ConnectionManager(credentialProviderInstance, appHost.appName(), appHost.appVersion(), appHost.deviceName(), appHost.deviceId(), capabilities); - bindConnectionManagerEvents(window.connectionManager, events, userSettings); + bindConnectionManagerEvents(window.ConnectionManager, events, userSettings); - if (!AppInfo.isNativeApp) { - console.debug('loading ApiClient singleton'); + if (!AppInfo.isNativeApp) { + console.debug('loading ApiClient singleton'); - return require(['apiclient', 'clientUtils'], function (apiClientFactory, clientUtils) { - console.debug('creating ApiClient singleton'); + return Promise.all([ + import('jellyfin-apiclient/src/apiClient'), + import('./clientUtils') + ]) + .then(([apiClientFactory, clientUtils]) => { + console.debug('creating ApiClient singleton'); - const apiClient = new apiClientFactory(Dashboard.serverAddress(), appHost.appName(), appHost.appVersion(), appHost.deviceName(), appHost.deviceId()); + var apiClient = new apiClientFactory(Dashboard.serverAddress(), appHost.appName(), appHost.appVersion(), appHost.deviceName(), appHost.deviceId()); - apiClient.enableAutomaticNetworking = false; - apiClient.manualAddressOnly = true; + apiClient.enableAutomaticNetworking = false; + apiClient.manualAddressOnly = true; - window.connectionManager.addApiClient(apiClient); + window.ConnectionManager.addApiClient(apiClient); - window.ApiClient = apiClient; - localApiClient = apiClient; + window.ApiClient = apiClient; + localApiClient = apiClient; - console.debug('loaded ApiClient singleton'); - }); - } + console.debug('loaded ApiClient singleton'); + }); + } - return Promise.resolve(); + return Promise.resolve(); + }); }); - }); - } - - function returnFirstDependency(obj) { - return obj; - } - - function returnDefault(obj) { - if (obj.default === null) { - throw new Error('Object has no default!'); - } - return obj.default; - } - - function getBowerPath() { - return 'libraries'; - } - - function getComponentsPath() { - return 'components'; - } - - function getElementsPath() { - return 'elements'; - } - - function getScriptsPath() { - return 'scripts'; - } - - function getPlaybackManager(playbackManager) { - window.addEventListener('beforeunload', function () { - try { - playbackManager.default.onAppClose(); - } catch (err) { - console.error('error in onAppClose: ' + err); - } - }); - return playbackManager; - } - - function getLayoutManager(layoutManager, appHost) { - layoutManager = layoutManager.default || layoutManager; - appHost = appHost.default || appHost; - if (appHost.getDefaultLayout) { - layoutManager.defaultLayout = appHost.getDefaultLayout(); - } - - layoutManager.init(); - return layoutManager; - } - - function createSharedAppFooter({default: appFooter}) { - return new appFooter({}); - } - - function onRequireJsError(requireType, requireModules) { - console.error('RequireJS error: ' + (requireType || 'unknown') + '. Failed modules: ' + (requireModules || []).join(',')); - } - - function defineResizeObserver() { - if (window.ResizeObserver) { - define('ResizeObserver', [], function () { - return window.ResizeObserver; - }); - } else { - define('ResizeObserver', ['resize-observer-polyfill'], returnFirstDependency); - } } function init() { - define('livetvcss', ['css!assets/css/livetv.css'], returnFirstDependency); - define('detailtablecss', ['css!assets/css/detailtable.css'], returnFirstDependency); + import('./clientUtils') + .then(function () { + createConnectionManager().then(function () { + console.debug('initAfterDependencies promises resolved'); - require(['clientUtils']); - - const promises = []; - if (!window.fetch) { - promises.push(require(['fetch'])); - } - - Promise.all(promises).then(function () { - createConnectionManager().then(function () { - console.debug('initAfterDependencies promises resolved'); - - require(['globalize', 'browser'], function (globalize, {default: browser}) { - window.Globalize = globalize; - loadCoreDictionary(globalize).then(function () { - onGlobalizeInit(browser, globalize); + Promise.all([ + import('./globalize'), + import('./browser') + ]) + .then(([globalize, {default: browser}]) => { + window.Globalize = globalize; + loadCoreDictionary(globalize).then(function () { + onGlobalizeInit(browser, globalize); + }); + }); + import('./keyboardNavigation') + .then((keyboardnavigation) => { + keyboardnavigation.enable(); + }); + import(['./mouseManager']); + import('../components/autoFocuser').then((autoFocuser) => { + autoFocuser.enable(); }); - }); - require(['keyboardnavigation'], function(keyboardnavigation) { - keyboardnavigation.enable(); - }); - require(['mouseManager']); - require(['focusPreventScroll']); - require(['vendorStyles']); - require(['autoFocuser'], function(autoFocuser) { - autoFocuser.enable(); - }); - require(['globalize', 'events'], function (globalize, events) { - events.on(window.connectionManager, 'localusersignedin', globalize.updateCurrentCulture); + Promise.all([ + import('./globalize'), + import('jellyfin-apiclient/src/connectionManager'), + import('jellyfin-apiclient/src/events') + ]) + .then((globalize, connectionManager, events) => { + events.on(connectionManager, 'localusersignedin', globalize.updateCurrentCulture); + }); }); }); - }); } function loadCoreDictionary(globalize) { @@ -251,15 +201,16 @@ function initClient() { if (browser.tv && !browser.android) { console.debug('using system fonts with explicit sizes'); - require(['systemFontsSizedCss']); + import('../assets/css/fonts.sized.css'); } else { console.debug('using default fonts'); - require(['systemFontsCss']); + import('../assets/css/fonts.css'); } - require(['apphost', 'css!assets/css/librarybrowser'], function (appHost) { - appHost = appHost.default || appHost; - + Promise.all([ + import('../components/apphost'), + import('../assets/css/librarybrowser.css') + ]).then((appHost) => { loadPlugins(appHost, browser).then(function () { onAppReady(browser); }); @@ -269,44 +220,47 @@ function initClient() { function loadPlugins(appHost, browser, shell) { console.groupCollapsed('loading installed plugins'); return new Promise(function (resolve, reject) { - require(['webSettings'], function (webSettings) { - webSettings.getPlugins().then(function (list) { - // these two plugins are dependent on features - if (!appHost.supports('remotecontrol')) { - list.splice(list.indexOf('sessionPlayer'), 1); + import('./settings/webSettings') + .then((webSettings) => { + webSettings.getPlugins().then(function (list) { + // these two plugins are dependent on features + if (!appHost.supports('remotecontrol')) { + list.splice(list.indexOf('sessionPlayer'), 1); - if (!browser.chrome && !browser.opera) { - list.splice(list.indexOf('chromecastPlayer', 1)); + if (!browser.chrome && !browser.opera) { + list.splice(list.indexOf('chromecastPlayer', 1)); + } } - } - // add any native plugins - if (window.NativeShell) { - list = list.concat(window.NativeShell.getPlugins()); - } + // add any native plugins + if (window.NativeShell) { + list = list.concat(window.NativeShell.getPlugins()); + } - Promise.all(list.map(loadPlugin)) - .then(function () { - console.debug('finished loading plugins'); - }) - .catch(() => reject) - .finally(() => { - console.groupEnd('loading installed plugins'); - require(['packageManager'], function (packageManager) { - packageManager.default.init().then(resolve, reject); - }); - }) - ; + Promise.all(list.map(loadPlugin)) + .then(function () { + console.debug('finished loading plugins'); + }) + .catch(() => reject) + .finally(() => { + console.groupEnd('loading installed plugins'); + import('../components/packageManager') + .then((packageManager) => { + packageManager.default.init().then(resolve, reject); + }); + }) + ; + }); }); - }); }); } function loadPlugin(url) { return new Promise(function (resolve, reject) { - require(['pluginManager'], function (pluginManager) { - pluginManager.default.loadPlugin(url).then(resolve, reject); - }); + import('pluginManager') + .then((pluginManager) => { + pluginManager.default.loadPlugin(url).then(resolve, reject); + }); }); } @@ -314,85 +268,97 @@ function initClient() { console.debug('begin onAppReady'); // ensure that appHost is loaded in this point - require(['apphost', 'appRouter'], function (appHost, appRouter) { - appRouter = appRouter.default || appRouter; - appHost = appHost.default || appHost; + Promise.all([ + import('jellyfin-apiclient/src/apiClient'), + import('../components/appRouter') + ]) + .then(([appHost, appRouter]) => { + appRouter = appRouter.default || appRouter; + appHost = appHost.default || appHost; - window.Emby = {}; + window.Emby = {}; - console.debug('onAppReady: loading dependencies'); - if (browser.iOS) { - require(['css!assets/css/ios.css']); - } - - window.Emby.Page = appRouter; - - require(['emby-button', 'scripts/autoThemes', 'libraryMenu', 'scripts/routes'], function () { - Emby.Page.start({ - click: false, - hashbang: true - }); - - require(['components/themeMediaPlayer', 'scripts/autoBackdrops']); - - if (!browser.tv && !browser.xboxOne && !browser.ps4) { - require(['components/nowPlayingBar/nowPlayingBar']); + console.debug('onAppReady: loading dependencies'); + if (browser.iOS) { + import('../assets/css/ios.css'); } - if (appHost.supports('remotecontrol')) { - require(['playerSelectionMenu', 'components/playback/remotecontrolautoplay']); - } + window.Emby.Page = appRouter; - require(['libraries/screensavermanager']); - - if (!appHost.supports('physicalvolumecontrol') || browser.touch) { - require(['components/playback/volumeosd']); - } - - /* eslint-disable-next-line compat/compat */ - if (navigator.mediaSession || window.NativeShell) { - require(['mediaSession']); - } - require(['serverNotifications']); - require(['date-fns', 'date-fns/locale']); - - if (!browser.tv && !browser.xboxOne) { - require(['components/playback/playbackorientation']); - registerServiceWorker(); - - if (window.Notification) { - require(['components/notifications/notifications']); - } - } - - require(['playerSelectionMenu']); - - const apiClient = window.connectionManager && window.connectionManager.currentApiClient(); - if (apiClient) { - fetch(apiClient.getUrl('Branding/Css')) - .then(function(response) { - if (!response.ok) { - throw new Error(response.status + ' ' + response.statusText); - } - return response.text(); - }) - .then(function(css) { - let style = document.querySelector('#cssBranding'); - if (!style) { - // Inject the branding css as a dom element in body so it will take - // precedence over other stylesheets - style = document.createElement('style'); - style.id = 'cssBranding'; - document.body.appendChild(style); - } - style.textContent = css; - }) - .catch(function(err) { - console.warn('Error applying custom css', err); + Promise.all([ + import('../elements/emby-button/emby-button'), + import('./autoThemes'), + import('./libraryMenu'), + import('./routes') + ]) + .then(() => { + Emby.Page.start({ + click: false, + hashbang: true }); - } + + import('../components/themeMediaPlayer'); + import('./autoBackdrops'); + + if (!browser.tv && !browser.xboxOne && !browser.ps4) { + import('../components/nowPlayingBar/nowPlayingBar'); + } + + if (appHost.supports('remotecontrol')) { + import('../components/playback/playerSelectionMenu'); + import('../components/playback/remotecontrolautoplay'); + } + + import('../libraries/screensavermanager'); + + if (!appHost.supports('physicalvolumecontrol') || browser.touch) { + import('../components/playback/volumeosd'); + } + + /* eslint-disable-next-line compat/compat */ + if (navigator.mediaSession || window.NativeShell) { + import('../components/playback/mediasession'); + } + + import('./serverNotifications'); + + if (!browser.tv && !browser.xboxOne) { + import('../components/playback/playbackorientation'); + registerServiceWorker(); + + if (window.Notification) { + import('../components/notifications/notifications'); + } + } + + import('../components/playback/playerSelectionMenu'); + + const apiClient = window.ConnectionManager && window.ConnectionManager.currentApiClient(); + if (apiClient) { + fetch(apiClient.getUrl('Branding/Css')) + .then(function(response) { + if (!response.ok) { + throw new Error(response.status + ' ' + response.statusText); + } + return response.text(); + }) + .then(function(css) { + let style = document.querySelector('#cssBranding'); + if (!style) { + // Inject the branding css as a dom element in body so it will take + // precedence over other stylesheets + style = document.createElement('style'); + style.id = 'cssBranding'; + document.body.appendChild(style); + } + style.textContent = css; + }) + .catch(function(err) { + console.warn('Error applying custom css', err); + }); + } + }); }); - }); } function registerServiceWorker() { @@ -409,278 +375,13 @@ function initClient() { /* eslint-enable compat/compat */ } - function onWebComponentsReady() { - const componentsPath = getComponentsPath(); - const scriptsPath = getScriptsPath(); - - define('filesystem', [scriptsPath + '/filesystem'], returnFirstDependency); - - define('lazyLoader', [componentsPath + '/lazyLoader/lazyLoaderIntersectionObserver'], returnFirstDependency); - define('shell', [scriptsPath + '/shell'], returnFirstDependency); - - define('alert', [componentsPath + '/alert'], returnFirstDependency); - - defineResizeObserver(); - - define('dialog', [componentsPath + '/dialog/dialog'], returnFirstDependency); - - define('confirm', [componentsPath + '/confirm/confirm'], returnFirstDependency); - - define('prompt', [componentsPath + '/prompt/prompt'], returnFirstDependency); - - define('loading', [componentsPath + '/loading/loading'], returnFirstDependency); - define('multi-download', [scriptsPath + '/multiDownload'], returnFirstDependency); - define('fileDownloader', [scriptsPath + '/fileDownloader'], returnFirstDependency); - - define('castSenderApiLoader', [componentsPath + '/castSenderApi'], returnFirstDependency); - - if (window.appMode === 'cordova' || window.appMode === 'android' || window.appMode === 'standalone') { - AppInfo.isNativeApp = true; - } - - init(); - } - - let promise; let localApiClient; - function initRequireJs() { - const urlArgs = 'v=' + (window.dashboardVersion || new Date().getDate()); - - const bowerPath = getBowerPath(); - const componentsPath = getComponentsPath(); - const elementsPath = getElementsPath(); - const scriptsPath = getScriptsPath(); - - const paths = { - browserdeviceprofile: 'scripts/browserDeviceProfile', - browser: 'scripts/browser', - libraryBrowser: 'scripts/libraryBrowser', - inputManager: 'scripts/inputManager', - datetime: 'scripts/datetime', - globalize: 'scripts/globalize', - dfnshelper: 'scripts/dfnshelper', - libraryMenu: 'scripts/libraryMenu', - playlisteditor: componentsPath + '/playlisteditor/playlisteditor', - medialibrarycreator: componentsPath + '/mediaLibraryCreator/mediaLibraryCreator', - medialibraryeditor: componentsPath + '/mediaLibraryEditor/mediaLibraryEditor', - imageoptionseditor: componentsPath + '/imageOptionsEditor/imageOptionsEditor', - apphost: componentsPath + '/apphost', - visibleinviewport: bowerPath + '/visibleinviewport', - qualityoptions: componentsPath + '/qualityOptions', - focusManager: componentsPath + '/focusManager', - itemHelper: componentsPath + '/itemHelper', - itemShortcuts: componentsPath + '/shortcuts', - playQueueManager: componentsPath + '/playback/playqueuemanager', - nowPlayingHelper: componentsPath + '/playback/nowplayinghelper', - pluginManager: componentsPath + '/pluginManager', - packageManager: componentsPath + '/packageManager', - screensaverManager: componentsPath + '/screensavermanager', - clientUtils: scriptsPath + '/clientUtils', - appRouter: 'components/appRouter' - }; - - requirejs.onError = onRequireJsError; - requirejs.config({ - waitSeconds: 0, - map: { - '*': { - css: 'components/require/requirecss', - text: 'components/require/requiretext' - } - }, - bundles: { - bundle: [ - 'fetch', - 'flvjs', - 'jstree', - 'epubjs', - 'pdfjs', - 'jQuery', - 'hlsjs', - 'howler', - 'native-promise-only', - 'resize-observer-polyfill', - 'swiper', - 'queryString', - 'sortable', - 'webcomponents', - 'material-icons', - 'date-fns', - 'page', - 'polyfill', - 'fast-text-encoding', - 'intersection-observer', - 'classlist-polyfill', - 'screenfull', - 'headroom', - 'apiclient', - 'events', - 'credentialprovider', - 'connectionManagerFactory', - 'appStorage', - 'comicReader' - ] - }, - urlArgs: urlArgs, - paths: paths, - onError: onRequireJsError - }); - - promise = require(['fetch']) - .then(() => require(['jQuery', 'polyfill', 'fast-text-encoding', 'intersection-observer', 'classlist-polyfill', 'css!assets/css/site'], (jQuery) => { - // Expose jQuery globally - window.$ = jQuery; - window.jQuery = jQuery; - })); - - // define styles - // TODO determine which of these files can be moved to the components themselves - define('systemFontsCss', ['css!assets/css/fonts'], returnFirstDependency); - define('systemFontsSizedCss', ['css!assets/css/fonts.sized'], returnFirstDependency); - define('scrollStyles', ['css!assets/css/scrollstyles'], returnFirstDependency); - define('dashboardcss', ['css!assets/css/dashboard'], returnFirstDependency); - define('programStyles', ['css!' + componentsPath + '/guide/programs'], returnFirstDependency); - define('listViewStyle', ['css!' + componentsPath + '/listview/listview'], returnFirstDependency); - define('formDialogStyle', ['css!' + componentsPath + '/formdialog'], returnFirstDependency); - define('clearButtonStyle', ['css!assets/css/clearbutton'], returnFirstDependency); - define('cardStyle', ['css!' + componentsPath + '/cardbuilder/card'], returnFirstDependency); - define('flexStyles', ['css!assets/css/flexstyles'], returnFirstDependency); - - // there are several objects that need to be instantiated - // TODO find a better way to do this - define('appFooter', [componentsPath + '/appFooter/appFooter'], returnFirstDependency); - define('appFooter-shared', ['appFooter'], createSharedAppFooter); - - // TODO remove these libraries - // all of these have been modified so we need to fix that first - define('scroller', [bowerPath + '/scroller'], returnFirstDependency); - define('navdrawer', [bowerPath + '/navdrawer/navdrawer'], returnFirstDependency); - - define('emby-button', [elementsPath + '/emby-button/emby-button'], returnFirstDependency); - define('paper-icon-button-light', [elementsPath + '/emby-button/paper-icon-button-light'], returnFirstDependency); - define('emby-checkbox', [elementsPath + '/emby-checkbox/emby-checkbox'], returnFirstDependency); - define('emby-collapse', [elementsPath + '/emby-collapse/emby-collapse'], returnFirstDependency); - define('emby-input', [elementsPath + '/emby-input/emby-input'], returnFirstDependency); - define('emby-progressring', [elementsPath + '/emby-progressring/emby-progressring'], returnFirstDependency); - define('emby-radio', [elementsPath + '/emby-radio/emby-radio'], returnFirstDependency); - define('emby-select', [elementsPath + '/emby-select/emby-select'], returnFirstDependency); - define('emby-slider', [elementsPath + '/emby-slider/emby-slider'], returnFirstDependency); - define('emby-textarea', [elementsPath + '/emby-textarea/emby-textarea'], returnFirstDependency); - define('emby-toggle', [elementsPath + '/emby-toggle/emby-toggle'], returnFirstDependency); - define('emby-scroller', [elementsPath + '/emby-scroller/emby-scroller'], returnFirstDependency); - define('emby-tabs', [elementsPath + '/emby-tabs/emby-tabs'], returnFirstDependency); - define('emby-scrollbuttons', [elementsPath + '/emby-scrollbuttons/emby-scrollbuttons'], returnFirstDependency); - define('emby-itemrefreshindicator', [elementsPath + '/emby-itemrefreshindicator/emby-itemrefreshindicator'], returnFirstDependency); - define('emby-itemscontainer', [elementsPath + '/emby-itemscontainer/emby-itemscontainer'], returnFirstDependency); - define('emby-playstatebutton', [elementsPath + '/emby-playstatebutton/emby-playstatebutton'], returnFirstDependency); - define('emby-ratingbutton', [elementsPath + '/emby-ratingbutton/emby-ratingbutton'], returnFirstDependency); - define('emby-progressbar', [elementsPath + '/emby-progressbar/emby-progressbar'], returnFirstDependency); - define('emby-programcell', [elementsPath + '/emby-programcell/emby-programcell'], returnFirstDependency); - - define('webSettings', [scriptsPath + '/settings/webSettings'], returnFirstDependency); - define('appSettings', [scriptsPath + '/settings/appSettings'], returnFirstDependency); - define('userSettings', [scriptsPath + '/settings/userSettings'], returnFirstDependency); - define('autocast', [scriptsPath + '/autocast'], returnFirstDependency); - - define('mediaSession', [componentsPath + '/playback/mediasession'], returnFirstDependency); - define('actionsheet', [componentsPath + '/actionSheet/actionSheet'], returnFirstDependency); - define('tunerPicker', [componentsPath + '/tunerPicker'], returnFirstDependency); - define('mainTabsManager', [componentsPath + '/maintabsmanager'], returnFirstDependency); - define('imageLoader', [componentsPath + '/images/imageLoader'], returnFirstDependency); - define('directorybrowser', [componentsPath + '/directorybrowser/directorybrowser'], returnFirstDependency); - define('metadataEditor', [componentsPath + '/metadataEditor/metadataEditor'], returnFirstDependency); - define('personEditor', [componentsPath + '/metadataEditor/personEditor'], returnFirstDependency); - define('playerSelectionMenu', [componentsPath + '/playback/playerSelectionMenu'], returnFirstDependency); - define('playerSettingsMenu', [componentsPath + '/playback/playersettingsmenu'], returnFirstDependency); - define('playMethodHelper', [componentsPath + '/playback/playmethodhelper'], returnFirstDependency); - define('brightnessOsd', [componentsPath + '/playback/brightnessosd'], returnFirstDependency); - define('alphaNumericShortcuts', [scriptsPath + '/alphanumericshortcuts'], returnFirstDependency); - define('multiSelect', [componentsPath + '/multiSelect/multiSelect'], returnFirstDependency); - define('alphaPicker', [componentsPath + '/alphaPicker/alphaPicker'], returnFirstDependency); - define('tabbedView', [componentsPath + '/tabbedview/tabbedview'], returnFirstDependency); - define('collectionEditor', [componentsPath + '/collectionEditor/collectionEditor'], returnFirstDependency); - define('playlistEditor', [componentsPath + '/playlisteditor/playlisteditor'], returnFirstDependency); - define('recordingCreator', [componentsPath + '/recordingcreator/recordingcreator'], returnFirstDependency); - define('recordingEditor', [componentsPath + '/recordingcreator/recordingeditor'], returnFirstDependency); - define('seriesRecordingEditor', [componentsPath + '/recordingcreator/seriesrecordingeditor'], returnFirstDependency); - define('recordingFields', [componentsPath + '/recordingcreator/recordingfields'], returnFirstDependency); - define('recordingButton', [componentsPath + '/recordingcreator/recordingbutton'], returnFirstDependency); - define('recordingHelper', [componentsPath + '/recordingcreator/recordinghelper'], returnFirstDependency); - define('subtitleEditor', [componentsPath + '/subtitleeditor/subtitleeditor'], returnFirstDependency); - define('subtitleSync', [componentsPath + '/subtitlesync/subtitlesync'], returnFirstDependency); - define('itemIdentifier', [componentsPath + '/itemidentifier/itemidentifier'], returnFirstDependency); - define('itemMediaInfo', [componentsPath + '/itemMediaInfo/itemMediaInfo'], returnFirstDependency); - define('mediaInfo', [componentsPath + '/mediainfo/mediainfo'], returnFirstDependency); - define('itemContextMenu', [componentsPath + '/itemContextMenu'], returnFirstDependency); - define('imageEditor', [componentsPath + '/imageeditor/imageeditor'], returnFirstDependency); - define('imageDownloader', [componentsPath + '/imageDownloader/imageDownloader'], returnFirstDependency); - define('dom', [scriptsPath + '/dom'], returnFirstDependency); - define('playerStats', [componentsPath + '/playerstats/playerstats'], returnFirstDependency); - define('searchFields', [componentsPath + '/search/searchfields'], returnFirstDependency); - define('searchResults', [componentsPath + '/search/searchresults'], returnFirstDependency); - define('upNextDialog', [componentsPath + '/upnextdialog/upnextdialog'], returnFirstDependency); - define('subtitleAppearanceHelper', [componentsPath + '/subtitlesettings/subtitleappearancehelper'], returnFirstDependency); - define('subtitleSettings', [componentsPath + '/subtitlesettings/subtitlesettings'], returnFirstDependency); - define('settingsHelper', [componentsPath + '/settingshelper'], returnFirstDependency); - define('displaySettings', [componentsPath + '/displaySettings/displaySettings'], returnFirstDependency); - define('playbackSettings', [componentsPath + '/playbackSettings/playbackSettings'], returnFirstDependency); - define('homescreenSettings', [componentsPath + '/homeScreenSettings/homeScreenSettings'], returnFirstDependency); - define('quickConnectSettings', [componentsPath + '/quickConnectSettings/quickConnectSettings'], returnFirstDependency); - define('playbackManager', [componentsPath + '/playback/playbackmanager'], getPlaybackManager); - define('timeSyncManager', [componentsPath + '/syncPlay/timeSyncManager'], returnDefault); - define('groupSelectionMenu', [componentsPath + '/syncPlay/groupSelectionMenu'], returnFirstDependency); - define('syncPlayManager', [componentsPath + '/syncPlay/syncPlayManager'], returnDefault); - define('playbackPermissionManager', [componentsPath + '/syncPlay/playbackPermissionManager'], returnDefault); - define('layoutManager', [componentsPath + '/layoutManager', 'apphost'], getLayoutManager); - define('homeSections', [componentsPath + '/homesections/homesections'], returnFirstDependency); - define('playMenu', [componentsPath + '/playmenu'], returnFirstDependency); - define('refreshDialog', [componentsPath + '/refreshdialog/refreshdialog'], returnFirstDependency); - define('backdrop', [componentsPath + '/backdrop/backdrop'], returnFirstDependency); - define('fetchHelper', [componentsPath + '/fetchhelper'], returnFirstDependency); - define('cardBuilder', [componentsPath + '/cardbuilder/cardBuilder'], returnFirstDependency); - define('peoplecardbuilder', [componentsPath + '/cardbuilder/peoplecardbuilder'], returnFirstDependency); - define('chaptercardbuilder', [componentsPath + '/cardbuilder/chaptercardbuilder'], returnFirstDependency); - define('deleteHelper', [scriptsPath + '/deleteHelper'], returnFirstDependency); - define('tvguide', [componentsPath + '/guide/guide'], returnFirstDependency); - define('guide-settings-dialog', [componentsPath + '/guide/guide-settings'], returnFirstDependency); - define('viewManager', [componentsPath + '/viewManager/viewManager'], function (viewManager) { - window.ViewManager = viewManager.default; - viewManager.default.dispatchPageEvents(true); - return viewManager; - }); - define('slideshow', [componentsPath + '/slideshow/slideshow'], returnFirstDependency); - define('focusPreventScroll', ['legacy/focusPreventScroll'], returnFirstDependency); - define('vendorStyles', ['legacy/vendorStyles'], returnFirstDependency); - define('userdataButtons', [componentsPath + '/userdatabuttons/userdatabuttons'], returnFirstDependency); - define('listView', [componentsPath + '/listview/listview'], returnFirstDependency); - define('indicators', [componentsPath + '/indicators/indicators'], returnFirstDependency); - define('viewSettings', [componentsPath + '/viewSettings/viewSettings'], returnFirstDependency); - define('filterMenu', [componentsPath + '/filtermenu/filtermenu'], returnFirstDependency); - define('sortMenu', [componentsPath + '/sortmenu/sortmenu'], returnFirstDependency); - define('sanitizefilename', [componentsPath + '/sanitizeFilename'], returnFirstDependency); - define('toast', [componentsPath + '/toast/toast'], returnFirstDependency); - define('scrollHelper', [scriptsPath + '/scrollHelper'], returnFirstDependency); - define('touchHelper', [scriptsPath + '/touchHelper'], returnFirstDependency); - define('imageUploader', [componentsPath + '/imageUploader/imageUploader'], returnFirstDependency); - define('htmlMediaHelper', [componentsPath + '/htmlMediaHelper'], returnFirstDependency); - define('viewContainer', [componentsPath + '/viewContainer'], returnFirstDependency); - define('dialogHelper', [componentsPath + '/dialogHelper/dialogHelper'], returnFirstDependency); - define('serverNotifications', [scriptsPath + '/serverNotifications'], returnFirstDependency); - define('skinManager', [scriptsPath + '/themeManager'], returnFirstDependency); - define('keyboardnavigation', [scriptsPath + '/keyboardNavigation'], returnFirstDependency); - define('mouseManager', [scriptsPath + '/mouseManager'], returnFirstDependency); - define('scrollManager', [componentsPath + '/scrollManager'], returnFirstDependency); - define('autoFocuser', [componentsPath + '/autoFocuser'], returnFirstDependency); - define('apiClientResolver', [], function () { - return function () { - return window.ApiClient; - }; - }); + if (self.appMode === 'cordova' || self.appMode === 'android' || self.appMode === 'standalone') { + AppInfo.isNativeApp = true; } - initRequireJs(); - promise.then(onWebComponentsReady); + init(); } initClient(); From bfb8c7c1f6aecbb1d5cc63dea296ea0944182c48 Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Fri, 14 Aug 2020 08:46:34 +0200 Subject: [PATCH 044/271] Make import paths ES6-compatible --- src/bundle.js | 2 +- .../accessSchedule/accessSchedule.js | 15 +-- src/components/actionSheet/actionSheet.js | 20 ++-- src/components/activitylog.js | 17 ++-- src/components/alert.js | 7 +- src/components/alphaPicker/alphaPicker.js | 12 +-- src/components/appFooter/appFooter.js | 2 +- src/components/appRouter.js | 27 +++--- src/components/apphost.js | 16 ++-- src/components/autoFocuser.js | 4 +- src/components/backdrop/backdrop.js | 11 ++- src/components/cardbuilder/cardBuilder.js | 37 ++++---- .../cardbuilder/chaptercardbuilder.js | 9 +- .../cardbuilder/peoplecardbuilder.js | 2 +- src/components/channelMapper/channelMapper.js | 23 ++--- .../collectionEditor/collectionEditor.js | 33 +++---- src/components/confirm/confirm.js | 6 +- src/components/dialog/dialog.js | 27 +++--- src/components/dialogHelper/dialogHelper.js | 18 ++-- .../directorybrowser/directorybrowser.js | 22 ++--- .../displaySettings/displaySettings.js | 31 ++++--- src/components/favoriteitems.js | 18 ++-- src/components/filterdialog/filterdialog.js | 17 ++-- src/components/filtermenu/filtermenu.js | 35 +++---- src/components/focusManager.js | 4 +- src/components/groupedcards.js | 5 +- src/components/guide/guide-settings.js | 20 ++-- src/components/guide/guide.js | 57 ++++++------ .../homeScreenSettings/homeScreenSettings.js | 26 +++--- src/components/homesections/homesections.js | 25 ++--- src/components/htmlMediaHelper.js | 7 +- .../imageDownloader/imageDownloader.js | 31 ++++--- .../imageOptionsEditor/imageOptionsEditor.js | 12 +-- src/components/imageUploader/imageUploader.js | 31 ++++--- src/components/imageeditor/imageeditor.js | 43 ++++----- src/components/images/imageLoader.js | 6 +- src/components/indicators/indicators.js | 10 +- src/components/itemContextMenu.js | 49 +++++----- src/components/itemHelper.js | 4 +- src/components/itemMediaInfo/itemMediaInfo.js | 25 ++--- .../itemidentifier/itemidentifier.js | 33 +++---- src/components/itemsrefresher.js | 6 +- src/components/layoutManager.js | 2 +- .../libraryoptionseditor.js | 12 +-- src/components/listview/listview.js | 21 +++-- src/components/loading/loading.js | 2 +- src/components/maintabsmanager.js | 12 +-- .../mediaLibraryCreator.js | 36 ++++---- .../mediaLibraryEditor/mediaLibraryEditor.js | 36 ++++---- src/components/mediainfo/mediainfo.js | 18 ++-- .../metadataEditor/metadataEditor.js | 53 +++++------ src/components/metadataEditor/personEditor.js | 19 ++-- src/components/multiSelect/multiSelect.css | 1 + src/components/multiSelect/multiSelect.js | 29 +++--- src/components/notifications/notifications.js | 8 +- src/components/nowPlayingBar/nowPlayingBar.js | 35 +++---- src/components/packageManager.js | 4 +- src/components/playback/brightnessosd.js | 12 +-- src/components/playback/mediasession.js | 8 +- src/components/playback/playbackmanager.js | 29 +++--- .../playback/playbackorientation.js | 7 +- .../playback/playerSelectionMenu.js | 36 ++++---- src/components/playback/playersettingsmenu.js | 9 +- .../playback/remotecontrolautoplay.js | 4 +- src/components/playback/volumeosd.js | 13 +-- .../playbackSettings/playbackSettings.js | 25 ++--- src/components/playerstats/playerstats.js | 17 ++-- .../playlisteditor/playlisteditor.js | 31 ++++--- src/components/playmenu.js | 8 +- src/components/pluginManager.js | 4 +- src/components/prompt/prompt.js | 24 ++--- src/components/qualityOptions.js | 2 +- .../recordingcreator/recordingbutton.js | 11 ++- .../recordingcreator/recordingcreator.js | 46 +++++----- .../recordingcreator/recordingeditor.js | 34 +++---- .../recordingcreator/recordingfields.js | 29 +++--- .../recordingcreator/recordinghelper.js | 17 ++-- .../recordingcreator/seriesrecordingeditor.js | 39 ++++---- src/components/refreshdialog/refreshdialog.js | 29 +++--- src/components/remotecontrol/remotecontrol.js | 45 ++++----- src/components/scrollManager.js | 8 +- src/components/search/searchfields.js | 20 ++-- src/components/search/searchresults.js | 17 ++-- src/components/settingshelper.js | 2 +- src/components/shortcuts.js | 30 +++--- src/components/slideshow/slideshow.js | 23 ++--- src/components/sortmenu/sortmenu.js | 24 ++--- .../subtitleeditor/subtitleeditor.js | 43 ++++----- .../subtitlesettings/subtitlesettings.js | 39 ++++---- src/components/subtitlesync/subtitlesync.js | 9 +- src/components/syncPlay/groupSelectionMenu.js | 19 ++-- src/components/syncPlay/syncPlayManager.js | 11 ++- src/components/syncPlay/timeSyncManager.js | 3 +- src/components/tabbedview/tabbedview.js | 8 +- src/components/themeMediaPlayer.js | 5 +- src/components/toast/toast.js | 4 +- src/components/tunerPicker.js | 27 +++--- src/components/tvproviders/schedulesdirect.js | 20 ++-- src/components/tvproviders/xmltv.js | 16 ++-- src/components/upnextdialog/upnextdialog.js | 23 ++--- .../userdatabuttons/userdatabuttons.js | 19 ++-- src/components/viewContainer.js | 2 +- src/components/viewManager/viewManager.js | 10 +- src/components/viewSettings/viewSettings.js | 28 +++--- src/controllers/dashboard/apikeys.js | 14 +-- src/controllers/dashboard/dashboard.js | 52 +++++------ src/controllers/dashboard/devices/device.js | 8 +- src/controllers/dashboard/devices/devices.js | 27 +++--- src/controllers/dashboard/dlna/profile.js | 18 ++-- src/controllers/dashboard/dlna/profiles.js | 14 +-- src/controllers/dashboard/dlna/settings.js | 8 +- src/controllers/dashboard/encodingsettings.js | 20 ++-- src/controllers/dashboard/general.js | 22 ++--- src/controllers/dashboard/library.js | 32 +++---- src/controllers/dashboard/librarydisplay.js | 10 +- src/controllers/dashboard/logs.js | 10 +- src/controllers/dashboard/metadataImages.js | 10 +- src/controllers/dashboard/metadatanfo.js | 10 +- src/controllers/dashboard/networking.js | 12 +-- .../notifications/notification/index.js | 4 +- .../notifications/notifications/index.js | 8 +- src/controllers/dashboard/playback.js | 8 +- .../dashboard/plugins/add/index.js | 12 +-- .../dashboard/plugins/available/index.js | 14 +-- .../dashboard/plugins/installed/index.js | 16 ++-- .../dashboard/plugins/repositories/index.js | 18 ++-- .../dashboard/scheduledtasks/scheduledtask.js | 20 ++-- .../scheduledtasks/scheduledtasks.js | 22 ++--- src/controllers/dashboard/serveractivity.js | 4 +- src/controllers/dashboard/streaming.js | 8 +- src/controllers/dashboard/users/useredit.js | 10 +- .../dashboard/users/userlibraryaccess.js | 10 +- src/controllers/dashboard/users/usernew.js | 10 +- .../dashboard/users/userparentalcontrol.js | 20 ++-- .../dashboard/users/userpasswordpage.js | 20 ++-- .../dashboard/users/userprofilespage.js | 26 +++--- src/controllers/edititemmetadata.js | 6 +- src/controllers/favorites.js | 19 ++-- src/controllers/home.js | 10 +- src/controllers/hometab.js | 11 ++- src/controllers/itemDetails/index.js | 82 ++++++++--------- src/controllers/list.js | 33 +++---- src/controllers/livetv/livetvchannels.js | 16 ++-- src/controllers/livetv/livetvguide.js | 2 +- src/controllers/livetv/livetvrecordings.js | 12 +-- src/controllers/livetv/livetvschedule.js | 14 +-- src/controllers/livetv/livetvseriestimers.js | 10 +- src/controllers/livetv/livetvsuggested.js | 26 +++--- src/controllers/livetvguideprovider.js | 8 +- src/controllers/livetvsettings.js | 18 ++-- src/controllers/livetvstatus.js | 38 ++++---- src/controllers/livetvtuner.js | 18 ++-- src/controllers/movies/moviecollections.js | 20 ++-- src/controllers/movies/moviegenres.js | 16 ++-- src/controllers/movies/movies.js | 22 ++--- src/controllers/movies/moviesrecommended.js | 33 +++---- src/controllers/movies/movietrailers.js | 22 ++--- src/controllers/music/musicalbums.js | 26 +++--- src/controllers/music/musicartists.js | 22 ++--- src/controllers/music/musicgenres.js | 10 +- src/controllers/music/musicplaylists.js | 10 +- src/controllers/music/musicrecommended.js | 36 ++++---- src/controllers/music/songs.js | 21 +++-- src/controllers/playback/queue/index.js | 6 +- src/controllers/playback/video/index.js | 60 ++++++------ src/controllers/searchpage.js | 6 +- src/controllers/session/addServer/index.js | 12 +-- .../session/forgotPassword/index.js | 2 +- src/controllers/session/login/index.js | 25 ++--- .../session/resetPassword/index.js | 2 +- src/controllers/session/selectServer/index.js | 35 +++---- src/controllers/shows/episodes.js | 22 ++--- src/controllers/shows/tvgenres.js | 16 ++-- src/controllers/shows/tvrecommended.js | 31 ++++--- src/controllers/shows/tvshows.js | 24 ++--- src/controllers/shows/tvstudios.js | 8 +- src/controllers/shows/tvupcoming.js | 16 ++-- src/controllers/user/display/index.js | 6 +- src/controllers/user/home/index.js | 8 +- src/controllers/user/menu/index.js | 10 +- src/controllers/user/playback/index.js | 9 +- src/controllers/user/profile/index.js | 20 ++-- src/controllers/user/subtitles/index.js | 6 +- src/controllers/wizard/finish/index.js | 2 +- src/controllers/wizard/remote/index.js | 8 +- src/controllers/wizard/settings/index.js | 8 +- src/controllers/wizard/start/index.js | 8 +- src/controllers/wizard/user/index.js | 12 +-- src/elements/emby-button/emby-button.js | 23 +++-- .../emby-button/paper-icon-button-light.js | 10 +- src/elements/emby-checkbox/emby-checkbox.js | 8 +- src/elements/emby-collapse/emby-collapse.js | 6 +- src/elements/emby-input/emby-input.js | 8 +- .../emby-itemrefreshindicator.js | 10 +- .../emby-itemscontainer.js | 40 ++++---- .../emby-playstatebutton.js | 9 +- .../emby-progressring/emby-progressring.js | 6 +- src/elements/emby-radio/emby-radio.js | 8 +- .../emby-ratingbutton/emby-ratingbutton.js | 9 +- .../emby-scrollbuttons/emby-scrollbuttons.js | 6 +- src/elements/emby-scroller/emby-scroller.js | 22 ++--- src/elements/emby-select/emby-select.js | 11 ++- src/elements/emby-slider/emby-slider.js | 14 +-- src/elements/emby-tabs/emby-tabs.js | 14 +-- src/elements/emby-textarea/emby-textarea.js | 6 +- src/elements/emby-toggle/emby-toggle.js | 4 +- src/libraries/navdrawer/navdrawer.js | 8 +- src/libraries/screensavermanager.js | 11 ++- src/libraries/scroller.js | 12 +-- src/plugins/bookPlayer/plugin.js | 12 +-- src/plugins/chromecastPlayer/plugin.js | 4 +- src/plugins/htmlAudioPlayer/plugin.js | 2 +- src/plugins/htmlVideoPlayer/plugin.js | 6 +- src/plugins/logoScreensaver/plugin.js | 2 +- src/plugins/youtubePlayer/plugin.js | 6 +- src/scripts/alphanumericshortcuts.js | 4 +- src/scripts/autoBackdrops.js | 6 +- src/scripts/autoThemes.js | 9 +- src/scripts/autocast.js | 6 +- src/scripts/clientUtils.js | 38 ++++---- src/scripts/datetime.js | 2 +- src/scripts/deleteHelper.js | 10 +- src/scripts/dfnshelper.js | 2 +- src/scripts/editorsidebar.js | 8 +- src/scripts/fileDownloader.js | 4 +- src/scripts/globalize.js | 4 +- src/scripts/inputManager.js | 10 +- src/scripts/itembynamedetailpage.js | 13 +-- src/scripts/keyboardNavigation.js | 6 +- src/scripts/libraryBrowser.js | 10 +- src/scripts/libraryMenu.js | 45 ++++----- src/scripts/livetvcomponents.js | 6 +- src/scripts/mouseManager.js | 12 +-- src/scripts/multiDownload.js | 2 +- src/scripts/playlistedit.js | 92 +++++++++---------- src/scripts/playlists.js | 6 +- src/scripts/routes.js | 26 +++--- src/scripts/scrollHelper.js | 6 +- src/scripts/serverNotifications.js | 17 ++-- src/scripts/settings/appSettings.js | 4 +- src/scripts/settings/userSettings.js | 4 +- src/scripts/site.js | 23 ++--- src/scripts/taskbutton.js | 8 +- src/scripts/themeManager.js | 2 +- src/scripts/touchHelper.js | 4 +- 245 files changed, 2073 insertions(+), 1995 deletions(-) diff --git a/src/bundle.js b/src/bundle.js index 2693ede52..9363cd885 100644 --- a/src/bundle.js +++ b/src/bundle.js @@ -86,7 +86,7 @@ _define('JavascriptSubtitlesOctopus', function() { // material-icons const materialIcons = require('material-design-icons-iconfont/dist/material-design-icons.css'); -_define('material-icons', function() { +_define('material-design-icons-iconfont', function() { return materialIcons; }); diff --git a/src/components/accessSchedule/accessSchedule.js b/src/components/accessSchedule/accessSchedule.js index b513766d0..9e0e3d5cf 100644 --- a/src/components/accessSchedule/accessSchedule.js +++ b/src/components/accessSchedule/accessSchedule.js @@ -1,3 +1,4 @@ + /* eslint-disable indent */ /** @@ -5,12 +6,12 @@ * @module components/accessSchedule/accessSchedule */ -import dialogHelper from 'dialogHelper'; -import datetime from 'datetime'; -import globalize from 'globalize'; -import 'emby-select'; -import 'paper-icon-button-light'; -import 'formDialogStyle'; +import dialogHelper from '../dialogHelper/dialogHelper'; +import datetime from '../../scripts/datetime'; +import globalize from '../../scripts/globalize'; +import '../../elements/emby-select/emby-select'; +import '../../elements/emby-button/paper-icon-button-light'; +import '../formdialog.css'; function getDisplayTime(hours) { let minutes = 0; @@ -59,7 +60,7 @@ import 'formDialogStyle'; export function show(options) { return new Promise((resolve, reject) => { - import('text!./accessSchedule.template.html').then(({default: template}) => { + import('./accessSchedule.template.html').then(({default: template}) => { const dlg = dialogHelper.createDialog({ removeOnClose: true, size: 'small' diff --git a/src/components/actionSheet/actionSheet.js b/src/components/actionSheet/actionSheet.js index be84cf0a0..85df1b2c6 100644 --- a/src/components/actionSheet/actionSheet.js +++ b/src/components/actionSheet/actionSheet.js @@ -1,12 +1,12 @@ -import dialogHelper from 'dialogHelper'; -import layoutManager from 'layoutManager'; -import globalize from 'globalize'; -import dom from 'dom'; -import 'emby-button'; -import 'css!./actionSheet'; -import 'material-icons'; -import 'scrollStyles'; -import 'listViewStyle'; +import dialogHelper from '../dialogHelper/dialogHelper'; +import layoutManager from '../layoutManager'; +import globalize from '../../scripts/globalize'; +import dom from '../../scripts/dom'; +import '../../elements/emby-button/emby-button'; +import './actionSheet.css'; +import 'material-design-icons-iconfont'; +import '../../assets/css/scrollstyles.css'; +import '../../components/listview/listview.css'; function getOffsets(elems) { const results = []; @@ -71,7 +71,7 @@ function getPosition(options, dlg) { } function centerFocus(elem, horiz, on) { - import('scrollHelper').then(({default: scrollHelper}) => { + import('../../scripts/scrollHelper').then((scrollHelper) => { const fn = on ? 'on' : 'off'; scrollHelper.centerFocus[fn](elem, horiz); }); diff --git a/src/components/activitylog.js b/src/components/activitylog.js index 3878d0335..df2ea5f61 100644 --- a/src/components/activitylog.js +++ b/src/components/activitylog.js @@ -1,11 +1,12 @@ -import events from 'events'; -import globalize from 'globalize'; -import dom from 'dom'; +import events from 'jellyfin-apiclient'; +import globalize from '../scripts/globalize'; +import dom from '../scripts/dom'; import * as datefns from 'date-fns'; -import dfnshelper from 'dfnshelper'; -import serverNotifications from 'serverNotifications'; -import 'emby-button'; -import 'listViewStyle'; +import dfnshelper from '../scripts/dfnshelper'; +import serverNotifications from '../scripts/serverNotifications'; +import connectionManager from 'jellyfin-apiclient'; +import '../elements/emby-button/emby-button'; +import './listview/listview.css'; /* eslint-disable indent */ @@ -127,7 +128,7 @@ import 'listViewStyle'; } function showItemOverview(item) { - import('alert').then(({default: alert}) => { + import('./alert').then((alert) => { alert({ text: item.Overview }); diff --git a/src/components/alert.js b/src/components/alert.js index 1420c7f42..2938cb7c7 100644 --- a/src/components/alert.js +++ b/src/components/alert.js @@ -1,6 +1,7 @@ -import browser from 'browser'; -import dialog from 'dialog'; -import globalize from 'globalize'; + +import browser from '../scripts/browser'; +import dialog from './dialog/dialog'; +import globalize from '../scripts/globalize'; /* eslint-disable indent */ diff --git a/src/components/alphaPicker/alphaPicker.js b/src/components/alphaPicker/alphaPicker.js index 95b588167..9caa1b015 100644 --- a/src/components/alphaPicker/alphaPicker.js +++ b/src/components/alphaPicker/alphaPicker.js @@ -5,12 +5,12 @@ * @module components/alphaPicker/alphaPicker */ -import focusManager from 'focusManager'; -import layoutManager from 'layoutManager'; -import dom from 'dom'; -import 'css!./style.css'; -import 'paper-icon-button-light'; -import 'material-icons'; +import focusManager from '../focusManager'; +import layoutManager from '../layoutManager'; +import dom from '../../scripts/dom'; +import './style.css'; +import '../../elements/emby-button/paper-icon-button-light'; +import 'material-design-icons-iconfont'; const selectedButtonClass = 'alphaPickerButton-selected'; diff --git a/src/components/appFooter/appFooter.js b/src/components/appFooter/appFooter.js index 4c032ea7d..3b6582449 100644 --- a/src/components/appFooter/appFooter.js +++ b/src/components/appFooter/appFooter.js @@ -1,4 +1,4 @@ -import 'css!./appFooter'; +import './appFooter.css'; function render(options) { const elem = document.createElement('div'); diff --git a/src/components/appRouter.js b/src/components/appRouter.js index a6bb6da61..b8df9d9f1 100644 --- a/src/components/appRouter.js +++ b/src/components/appRouter.js @@ -1,13 +1,14 @@ -import appHost from 'apphost'; -import appSettings from 'appSettings'; -import backdrop from 'backdrop'; -import browser from 'browser'; -import events from 'events'; -import globalize from 'globalize'; -import itemHelper from 'itemHelper'; -import loading from 'loading'; +import appHost from './apphost'; +import appSettings from '../scripts/settings/appSettings'; +import backdrop from './backdrop/backdrop'; +import browser from '../scripts/browser'; +import connectionManager from 'jellyfin-apiclient'; +import events from 'jellyfin-apiclient'; +import globalize from '../scripts/globalize'; +import itemHelper from './itemHelper'; +import loading from './loading/loading'; import page from 'page'; -import viewManager from 'viewManager'; +import viewManager from './viewManager/viewManager'; class AppRouter { allRoutes = []; @@ -286,7 +287,7 @@ class AppRouter { this.showWelcome(); break; case 'ServerUpdateNeeded': - import('alert').then(({default: alert}) =>{ + import('./alert').then((alert) =>{ alert({ text: globalize.translate('ServerUpdateNeeded', 'https://github.com/jellyfin/jellyfin'), html: globalize.translate('ServerUpdateNeeded', '
https://github.com/jellyfin/jellyfin') @@ -323,7 +324,7 @@ class AppRouter { url += '?' + ctx.querystring; } - import('text!' + url).then(({default: html}) => { + import('' + url).then(({default: html}) => { this.loadContent(ctx, route, html, request); }); } @@ -340,7 +341,7 @@ class AppRouter { }; if (route.controller) { - import('controllers/' + route.controller).then(onInitComplete); + import('../controllers/' + route.controller).then(onInitComplete); } else { onInitComplete(); } @@ -407,7 +408,7 @@ class AppRouter { this.forcedLogoutMsg = null; if (msg) { - import('alert').then((alert) => { + import('./alert').then((alert) => { alert(msg); }); } diff --git a/src/components/apphost.js b/src/components/apphost.js index df2f7c2d2..c4b1396b1 100644 --- a/src/components/apphost.js +++ b/src/components/apphost.js @@ -1,9 +1,9 @@ -import appSettings from 'appSettings'; -import browser from 'browser'; -import events from 'events'; -import * as htmlMediaHelper from 'htmlMediaHelper'; -import * as webSettings from 'webSettings'; -import globalize from 'globalize'; +import appSettings from '../scripts/settings/appSettings'; +import browser from '../scripts/browser'; +import events from 'jellyfin-apiclient'; +import * as htmlMediaHelper from '../components/htmlMediaHelper'; +import * as webSettings from '../scripts/settings/webSettings'; +import globalize from '../scripts/globalize'; function getBaseProfileOptions(item) { const disableHlsVideoAudioCodecs = []; @@ -26,7 +26,7 @@ function getBaseProfileOptions(item) { function getDeviceProfile(item, options = {}) { return new Promise(function (resolve) { - import('browserdeviceprofile').then(({default: profileBuilder}) => { + import('../scripts/browserDeviceProfile').then((profileBuilder) => { let profile; if (window.NativeShell) { @@ -296,7 +296,7 @@ function askForExit() { return; } - import('actionsheet').then(({default: actionsheet}) => { + import('../components/actionSheet/actionSheet').then((actionsheet) => { exitPromise = actionsheet.show({ title: globalize.translate('MessageConfirmAppExit'), items: [ diff --git a/src/components/autoFocuser.js b/src/components/autoFocuser.js index 0a10cabd2..aa88e0c29 100644 --- a/src/components/autoFocuser.js +++ b/src/components/autoFocuser.js @@ -5,8 +5,8 @@ * @module components/autoFocuser */ -import focusManager from 'focusManager'; -import layoutManager from 'layoutManager'; +import focusManager from './focusManager'; +import layoutManager from './layoutManager'; /** * Previously selected element. diff --git a/src/components/backdrop/backdrop.js b/src/components/backdrop/backdrop.js index 83888b81b..acde031c2 100644 --- a/src/components/backdrop/backdrop.js +++ b/src/components/backdrop/backdrop.js @@ -1,8 +1,9 @@ -import browser from 'browser'; -import playbackManager from 'playbackManager'; -import dom from 'dom'; -import * as userSettings from 'userSettings'; -import 'css!./backdrop'; +import browser from '../../scripts/browser'; +import connectionManager from 'jellyfin-apiclient'; +import playbackManager from '../playback/playbackmanager'; +import dom from '../../scripts/dom'; +import * as userSettings from '../../scripts/settings/userSettings'; +import './backdrop.css'; /* eslint-disable indent */ diff --git a/src/components/cardbuilder/cardBuilder.js b/src/components/cardbuilder/cardBuilder.js index 63b2e26ad..70c3c4f80 100644 --- a/src/components/cardbuilder/cardBuilder.js +++ b/src/components/cardbuilder/cardBuilder.js @@ -5,21 +5,22 @@ * @module components/cardBuilder/cardBuilder */ -import datetime from 'datetime'; -import imageLoader from 'imageLoader'; -import itemHelper from 'itemHelper'; -import focusManager from 'focusManager'; -import indicators from 'indicators'; -import globalize from 'globalize'; -import layoutManager from 'layoutManager'; -import dom from 'dom'; -import browser from 'browser'; -import playbackManager from 'playbackManager'; -import itemShortcuts from 'itemShortcuts'; -import imageHelper from 'scripts/imagehelper'; -import 'css!./card'; -import 'paper-icon-button-light'; -import 'programStyles'; +import datetime from '../../scripts/datetime'; +import imageLoader from '../images/imageLoader'; +import connectionManager from 'jellyfin-apiclient'; +import itemHelper from '../itemHelper'; +import focusManager from '../focusManager'; +import indicators from '../indicators/indicators'; +import globalize from '../../scripts/globalize'; +import layoutManager from '../layoutManager'; +import dom from '../../scripts/dom'; +import browser from '../../scripts/browser'; +import playbackManager from '../playback/playbackmanager'; +import itemShortcuts from '../shortcuts'; +import imageHelper from '../../scripts/imagehelper'; +import './card.css'; +import '../../elements/emby-button/paper-icon-button-light'; +import '../guide/programs.css'; const enableFocusTransform = !browser.slow && !browser.edge; @@ -1121,7 +1122,7 @@ import 'programStyles'; if (!refreshIndicatorLoaded) { refreshIndicatorLoaded = true; /* eslint-disable-next-line @babel/no-unused-expressions */ - import('emby-itemrefreshindicator'); + import('../../elements/emby-itemrefreshindicator/emby-itemrefreshindicator'); } } @@ -1453,7 +1454,7 @@ import 'programStyles'; if (itemHelper.canMarkPlayed(item)) { /* eslint-disable-next-line @babel/no-unused-expressions */ - import('emby-playstatebutton'); + import('../../elements/emby-playstatebutton/emby-playstatebutton'); html += ''; } @@ -1461,7 +1462,7 @@ import 'programStyles'; const likes = userData.Likes == null ? '' : userData.Likes; /* eslint-disable-next-line @babel/no-unused-expressions */ - import('emby-ratingbutton'); + import('../../elements/emby-ratingbutton/emby-ratingbutton'); html += ''; } diff --git a/src/components/cardbuilder/chaptercardbuilder.js b/src/components/cardbuilder/chaptercardbuilder.js index 35ae2b0cd..2ebdcbe82 100644 --- a/src/components/cardbuilder/chaptercardbuilder.js +++ b/src/components/cardbuilder/chaptercardbuilder.js @@ -5,10 +5,11 @@ * @module components/cardBuilder/chaptercardbuilder */ -import datetime from 'datetime'; -import imageLoader from 'imageLoader'; -import layoutManager from 'layoutManager'; -import browser from 'browser'; +import datetime from '../../scripts/datetime'; +import imageLoader from '../images/imageLoader'; +import connectionManager from 'jellyfin-apiclient'; +import layoutManager from '../layoutManager'; +import browser from '../../scripts/browser'; const enableFocusTransform = !browser.slow && !browser.edge; diff --git a/src/components/cardbuilder/peoplecardbuilder.js b/src/components/cardbuilder/peoplecardbuilder.js index 5fc9e8ade..de2dfb64a 100644 --- a/src/components/cardbuilder/peoplecardbuilder.js +++ b/src/components/cardbuilder/peoplecardbuilder.js @@ -5,7 +5,7 @@ * @module components/cardBuilder/peoplecardbuilder */ -import cardBuilder from 'cardBuilder'; +import cardBuilder from '../cardbuilder/cardBuilder'; export function buildPeopleCards(items, options) { options = Object.assign(options || {}, { diff --git a/src/components/channelMapper/channelMapper.js b/src/components/channelMapper/channelMapper.js index 294f9e223..b3a3dc41b 100644 --- a/src/components/channelMapper/channelMapper.js +++ b/src/components/channelMapper/channelMapper.js @@ -1,14 +1,15 @@ -import dom from 'dom'; -import dialogHelper from 'dialogHelper'; -import loading from 'loading'; -import globalize from 'globalize'; -import actionsheet from 'actionsheet'; -import 'emby-input'; -import 'paper-icon-button-light'; -import 'emby-button'; -import 'listViewStyle'; -import 'material-icons'; -import 'formDialogStyle'; +import dom from '../../scripts/dom'; +import dialogHelper from '../dialogHelper/dialogHelper'; +import loading from '../loading/loading'; +import connectionManager from 'jellyfin-apiclient'; +import globalize from '../../scripts/globalize'; +import actionsheet from '../actionSheet/actionSheet'; +import '../../elements/emby-input/emby-input'; +import '../../elements/emby-button/paper-icon-button-light'; +import '../../elements/emby-button/emby-button'; +import '../listview/listview.css'; +import 'material-design-icons-iconfont'; +import '../formdialog.css'; export default class channelMapper { constructor(options) { diff --git a/src/components/collectionEditor/collectionEditor.js b/src/components/collectionEditor/collectionEditor.js index 2d0d02592..e36abd7e0 100644 --- a/src/components/collectionEditor/collectionEditor.js +++ b/src/components/collectionEditor/collectionEditor.js @@ -1,17 +1,18 @@ -import dom from 'dom'; -import dialogHelper from 'dialogHelper'; -import loading from 'loading'; -import layoutManager from 'layoutManager'; -import appRouter from 'appRouter'; -import globalize from 'globalize'; -import 'emby-checkbox'; -import 'emby-input'; -import 'paper-icon-button-light'; -import 'emby-select'; -import 'material-icons'; -import 'css!./../formdialog'; -import 'emby-button'; -import 'flexStyles'; +import dom from '../../scripts/dom'; +import dialogHelper from '../dialogHelper/dialogHelper'; +import loading from '../loading/loading'; +import layoutManager from '../layoutManager'; +import connectionManager from 'jellyfin-apiclient'; +import appRouter from '../appRouter'; +import globalize from '../../scripts/globalize'; +import '../../elements/emby-button/emby-button'; +import '../../elements/emby-button/paper-icon-button-light'; +import '../../elements/emby-checkbox/emby-checkbox'; +import '../../elements/emby-input/emby-input'; +import '../../elements/emby-select/emby-select'; +import 'material-design-icons-iconfont'; +import '../formdialog.css'; +import '../../assets/css/flexstyles.css'; /* eslint-disable indent */ @@ -80,7 +81,7 @@ import 'flexStyles'; dlg.submitted = true; dialogHelper.close(dlg); - import('toast').then(({default: toast}) => { + import('../toast/toast').then((toast) => { toast(globalize.translate('MessageItemsAdded')); }); }); @@ -199,7 +200,7 @@ import 'flexStyles'; } function centerFocus(elem, horiz, on) { - import('scrollHelper').then((scrollHelper) => { + import('../../scripts/scrollHelper').then((scrollHelper) => { const fn = on ? 'on' : 'off'; scrollHelper.centerFocus[fn](elem, horiz); }); diff --git a/src/components/confirm/confirm.js b/src/components/confirm/confirm.js index eca612ccb..4f3b09c2d 100644 --- a/src/components/confirm/confirm.js +++ b/src/components/confirm/confirm.js @@ -1,6 +1,6 @@ -import browser from 'browser'; -import dialog from 'dialog'; -import globalize from 'globalize'; +import browser from '../../scripts/browser'; +import dialog from '../dialog/dialog'; +import globalize from '../../scripts/globalize'; /* eslint-disable indent */ export default (() => { diff --git a/src/components/dialog/dialog.js b/src/components/dialog/dialog.js index 1b13900d8..cb765242c 100644 --- a/src/components/dialog/dialog.js +++ b/src/components/dialog/dialog.js @@ -1,14 +1,14 @@ -import dialogHelper from 'dialogHelper'; -import dom from 'dom'; -import layoutManager from 'layoutManager'; -import scrollHelper from 'scrollHelper'; -import globalize from 'globalize'; -import 'material-icons'; -import 'emby-button'; -import 'paper-icon-button-light'; -import 'emby-input'; -import 'formDialogStyle'; -import 'flexStyles'; +import dialogHelper from '../dialogHelper/dialogHelper'; +import dom from '../../scripts/dom'; +import layoutManager from '../layoutManager'; +import scrollHelper from '../../scripts/scrollHelper'; +import globalize from '../../scripts/globalize'; +import 'material-design-icons-iconfont'; +import '../../elements/emby-button/emby-button'; +import '../../elements/emby-button/paper-icon-button-light'; +import '../../elements/emby-input/emby-input'; +import '../formdialog.css'; +import '../../assets/css/flexstyles.css'; /* eslint-disable indent */ @@ -80,7 +80,8 @@ import 'flexStyles'; buttonClass += ' formDialogFooterItem-vertical formDialogFooterItem-nomarginbottom'; } - html += ``; + html += ``; if (item.description) { html += `
${item.description}
`; @@ -128,7 +129,7 @@ import 'flexStyles'; options = text; } - const { default: template } = await import('text!./dialog.template.html'); + const { default: template } = await import('./dialog.template.html'); return new Promise((resolve, reject) => { showDialog(options, template).then(resolve, reject); }); diff --git a/src/components/dialogHelper/dialogHelper.js b/src/components/dialogHelper/dialogHelper.js index eb46d98b1..4eee793a3 100644 --- a/src/components/dialogHelper/dialogHelper.js +++ b/src/components/dialogHelper/dialogHelper.js @@ -1,11 +1,11 @@ -import appRouter from 'appRouter'; -import focusManager from 'focusManager'; -import browser from 'browser'; -import layoutManager from 'layoutManager'; -import inputManager from 'inputManager'; -import dom from 'dom'; -import 'css!./dialoghelper.css'; -import 'scrollStyles'; +import appRouter from '../appRouter'; +import focusManager from '../focusManager'; +import browser from '../../scripts/browser'; +import layoutManager from '../layoutManager'; +import inputManager from '../../scripts/inputManager'; +import dom from '../../scripts/dom'; +import './dialoghelper.css'; +import '../../assets/css/scrollstyles.css'; /* eslint-disable indent */ @@ -354,7 +354,7 @@ import 'scrollStyles'; } function centerFocus(elem, horiz, on) { - import('scrollHelper').then((scrollHelper) => { + import('../../scripts/scrollHelper').then((scrollHelper) => { const fn = on ? 'on' : 'off'; scrollHelper.centerFocus[fn](elem, horiz); }); diff --git a/src/components/directorybrowser/directorybrowser.js b/src/components/directorybrowser/directorybrowser.js index 3dd3302b2..939fedbf0 100644 --- a/src/components/directorybrowser/directorybrowser.js +++ b/src/components/directorybrowser/directorybrowser.js @@ -1,13 +1,13 @@ -import loading from 'loading'; -import dialogHelper from 'dialogHelper'; -import dom from 'dom'; -import globalize from 'globalize'; -import 'listViewStyle'; -import 'emby-input'; -import 'paper-icon-button-light'; -import 'css!./directorybrowser'; -import 'formDialogStyle'; -import 'emby-button'; +import loading from '../loading/loading'; +import dialogHelper from '../dialogHelper/dialogHelper'; +import dom from '../../scripts/dom'; +import globalize from '../../scripts/globalize'; +import '../listview/listview.css'; +import '../../elements/emby-input/emby-input'; +import '../../elements/emby-button/paper-icon-button-light'; +import './directorybrowser.css'; +import '../formdialog.css'; +import '../../elements/emby-button/emby-button'; /* eslint-disable indent */ @@ -157,7 +157,7 @@ import 'emby-button'; } function alertTextWithOptions(options) { - import('alert').then(({default: alert}) => { + import('../alert').then((alert) => { alert(options); }); } diff --git a/src/components/displaySettings/displaySettings.js b/src/components/displaySettings/displaySettings.js index efaab16b3..d6e4bee2f 100644 --- a/src/components/displaySettings/displaySettings.js +++ b/src/components/displaySettings/displaySettings.js @@ -1,16 +1,17 @@ -import browser from 'browser'; -import layoutManager from 'layoutManager'; -import pluginManager from 'pluginManager'; -import appHost from 'apphost'; -import focusManager from 'focusManager'; -import datetime from 'datetime'; -import globalize from 'globalize'; -import loading from 'loading'; -import skinManager from 'skinManager'; -import events from 'events'; -import 'emby-select'; -import 'emby-checkbox'; -import 'emby-button'; +import browser from '../../scripts/browser'; +import layoutManager from '../layoutManager'; +import pluginManager from '../pluginManager'; +import appHost from '../apphost'; +import focusManager from '../focusManager'; +import datetime from '../../scripts/datetime'; +import globalize from '../../scripts/globalize'; +import loading from '../loading/loading'; +import connectionManager from 'jellyfin-apiclient'; +import skinManager from '../../scripts/themeManager'; +import events from 'jellyfin-apiclient'; +import '../../elements/emby-select/emby-select'; +import '../../elements/emby-checkbox/emby-checkbox'; +import '../../elements/emby-button/emby-button'; /* eslint-disable indent */ @@ -168,7 +169,7 @@ import 'emby-button'; saveUser(context, user, userSettings, apiClient).then(() => { loading.hide(); if (enableSaveConfirmation) { - import('toast').then(({default: toast}) => { + import('../toast/toast').then((toast) => { toast(globalize.translate('SettingsSaved')); }); } @@ -198,7 +199,7 @@ import 'emby-button'; } async function embed(options, self) { - const { default: template } = await import('text!./displaySettings.template.html'); + const { default: template } = await import('./displaySettings.template.html'); options.element.innerHTML = globalize.translateHtml(template, 'core'); options.element.querySelector('form').addEventListener('submit', onSubmit.bind(self)); if (options.enableSaveButton) { diff --git a/src/components/favoriteitems.js b/src/components/favoriteitems.js index 86cd05021..7b56967fd 100644 --- a/src/components/favoriteitems.js +++ b/src/components/favoriteitems.js @@ -1,12 +1,12 @@ -import loading from 'loading'; -import cardBuilder from 'cardBuilder'; -import dom from 'dom'; -import appHost from 'apphost'; -import imageLoader from 'imageLoader'; -import globalize from 'globalize'; -import layoutManager from 'layoutManager'; -import 'scrollStyles'; -import 'emby-itemscontainer'; +import loading from './loading/loading'; +import cardBuilder from './cardbuilder/cardBuilder'; +import dom from '../scripts/dom'; +import appHost from './apphost'; +import imageLoader from './images/imageLoader'; +import globalize from '../scripts/globalize'; +import layoutManager from './layoutManager'; +import '../assets/css/scrollstyles.css'; +import '../elements/emby-itemscontainer/emby-itemscontainer'; /* eslint-disable indent */ diff --git a/src/components/filterdialog/filterdialog.js b/src/components/filterdialog/filterdialog.js index d11edb40a..9c5ad5f71 100644 --- a/src/components/filterdialog/filterdialog.js +++ b/src/components/filterdialog/filterdialog.js @@ -1,10 +1,11 @@ -import dom from 'dom'; -import dialogHelper from 'dialogHelper'; -import globalize from 'globalize'; -import events from 'events'; -import 'emby-checkbox'; -import 'emby-collapse'; -import 'css!./style.css'; +import dom from '../../scripts/dom'; +import dialogHelper from '../dialogHelper/dialogHelper'; +import globalize from '../../scripts/globalize'; +import connectionManager from 'jellyfin-apiclient'; +import events from 'jellyfin-apiclient'; +import '../../elements/emby-checkbox/emby-checkbox'; +import '../../elements/emby-collapse/emby-collapse'; +import './style.css'; /* eslint-disable indent */ function renderOptions(context, selector, cssClass, items, isCheckedFn) { @@ -401,7 +402,7 @@ import 'css!./style.css'; } show() { - return import('text!./filterdialog.template.html').then(({default: template}) => { + return import('./filterdialog.template.html').then(({default: template}) => { return new Promise((resolve) => { const dlg = dialogHelper.createDialog({ removeOnClose: true, diff --git a/src/components/filtermenu/filtermenu.js b/src/components/filtermenu/filtermenu.js index 7cef08303..46c3fc87b 100644 --- a/src/components/filtermenu/filtermenu.js +++ b/src/components/filtermenu/filtermenu.js @@ -1,18 +1,19 @@ -import dom from 'dom'; -import focusManager from 'focusManager'; -import dialogHelper from 'dialogHelper'; -import inputManager from 'inputManager'; -import layoutManager from 'layoutManager'; -import globalize from 'globalize'; -import * as userSettings from 'userSettings'; -import 'emby-checkbox'; -import 'emby-input'; -import 'paper-icon-button-light'; -import 'emby-select'; -import 'material-icons'; -import 'css!./../formdialog'; -import 'emby-button'; -import 'flexStyles'; +import dom from '../../scripts/dom'; +import focusManager from '../focusManager'; +import dialogHelper from '../dialogHelper/dialogHelper'; +import inputManager from '../../scripts/inputManager'; +import layoutManager from '../layoutManager'; +import connectionManager from 'jellyfin-apiclient'; +import globalize from '../../scripts/globalize'; +import * as userSettings from '../../scripts/settings/userSettings'; +import '../../elements/emby-checkbox/emby-checkbox'; +import '../../elements/emby-input/emby-input'; +import '../../elements/emby-button/emby-button'; +import '../../elements/emby-button/paper-icon-button-light'; +import '../../elements/emby-select/emby-select'; +import 'material-design-icons-iconfont'; +import '../formdialog.css'; +import '../../assets/css/flexstyles.css'; function onSubmit(e) { e.preventDefault(); @@ -80,7 +81,7 @@ function moveCheckboxFocus(elem, offset) { } } function centerFocus(elem, horiz, on) { - import('scrollHelper').then(({ default: scrollHelper }) => { + import('../../scripts/scrollHelper').then((scrollHelper) => { const fn = on ? 'on' : 'off'; scrollHelper.centerFocus[fn](elem, horiz); }); @@ -209,7 +210,7 @@ function loadDynamicFilters(context, options) { class FilterMenu { show(options) { return new Promise( (resolve, reject) => { - import('text!./filtermenu.template.html').then(({ default: template }) => { + import('./filtermenu.template.html').then(({ default: template }) => { const dialogOptions = { removeOnClose: true, scrollY: false diff --git a/src/components/focusManager.js b/src/components/focusManager.js index d45984bf5..b0fc18851 100644 --- a/src/components/focusManager.js +++ b/src/components/focusManager.js @@ -1,7 +1,7 @@ /* eslint-disable indent */ -import dom from 'dom'; -import scrollManager from 'scrollManager'; +import dom from '../scripts/dom'; +import scrollManager from './scrollManager'; const scopes = []; function pushScope(elem) { diff --git a/src/components/groupedcards.js b/src/components/groupedcards.js index 947b3b856..c2714eba8 100644 --- a/src/components/groupedcards.js +++ b/src/components/groupedcards.js @@ -1,7 +1,8 @@ /* eslint-disable indent */ -import dom from 'dom'; -import appRouter from 'appRouter'; +import dom from '../scripts/dom'; +import appRouter from './appRouter'; +import connectionManager from 'jellyfin-apiclient'; function onGroupedCardClick(e, card) { const itemId = card.getAttribute('data-id'); diff --git a/src/components/guide/guide-settings.js b/src/components/guide/guide-settings.js index 35f0d3e06..8132ac3bb 100644 --- a/src/components/guide/guide-settings.js +++ b/src/components/guide/guide-settings.js @@ -1,12 +1,12 @@ -import dialogHelper from 'dialogHelper'; -import globalize from 'globalize'; -import * as userSettings from 'userSettings'; -import layoutManager from 'layoutManager'; -import scrollHelper from 'scrollHelper'; -import 'emby-checkbox'; -import 'emby-radio'; -import 'css!./../formdialog'; -import 'material-icons'; +import dialogHelper from '../dialogHelper/dialogHelper'; +import globalize from '../../scripts/globalize'; +import * as userSettings from '../../scripts/settings/userSettings'; +import layoutManager from '../layoutManager'; +import scrollHelper from '../../scripts/scrollHelper'; +import '../../elements/emby-checkbox/emby-checkbox'; +import '../../elements/emby-radio/emby-radio'; +import '../formdialog.css'; +import 'material-design-icons-iconfont'; function saveCategories(context, options) { const categories = []; @@ -88,7 +88,7 @@ function showEditor(options) { return new Promise(function (resolve, reject) { let settingsChanged = false; - import('text!./guide-settings.template.html').then(({ default: template }) => { + import('./guide-settings.template.html').then(({ default: template }) => { const dialogOptions = { removeOnClose: true, scrollY: false diff --git a/src/components/guide/guide.js b/src/components/guide/guide.js index a5ed55e67..92a528f00 100644 --- a/src/components/guide/guide.js +++ b/src/components/guide/guide.js @@ -1,32 +1,33 @@ -import inputManager from 'inputManager'; -import browser from 'browser'; -import globalize from 'globalize'; -import scrollHelper from 'scrollHelper'; -import serverNotifications from 'serverNotifications'; -import loading from 'loading'; -import datetime from 'datetime'; -import focusManager from 'focusManager'; -import playbackManager from 'playbackManager'; -import * as userSettings from 'userSettings'; -import imageLoader from 'imageLoader'; -import events from 'events'; -import layoutManager from 'layoutManager'; -import itemShortcuts from 'itemShortcuts'; -import dom from 'dom'; -import 'css!./guide.css'; -import 'programStyles'; -import 'material-icons'; -import 'scrollStyles'; -import 'emby-programcell'; -import 'emby-button'; -import 'paper-icon-button-light'; -import 'emby-tabs'; -import 'emby-scroller'; -import 'flexStyles'; -import 'webcomponents'; +import inputManager from '../../scripts/inputManager'; +import browser from '../../scripts/browser'; +import globalize from '../../scripts/globalize'; +import connectionManager from 'jellyfin-apiclient'; +import scrollHelper from '../../scripts/scrollHelper'; +import serverNotifications from '../../scripts/serverNotifications'; +import loading from '../loading/loading'; +import datetime from '../../scripts/datetime'; +import focusManager from '../focusManager'; +import playbackManager from '../playback/playbackmanager'; +import * as userSettings from '../../scripts/settings/userSettings'; +import imageLoader from '../images/imageLoader'; +import events from 'jellyfin-apiclient'; +import layoutManager from '../layoutManager'; +import itemShortcuts from '../shortcuts'; +import dom from '../../scripts/dom'; +import './guide.css'; +import './programs.css'; +import 'material-design-icons-iconfont'; +import '../../assets/css/scrollstyles.css'; +import '../../elements/emby-programcell/emby-programcell'; +import '../../elements/emby-button/emby-button'; +import '../../elements/emby-button/paper-icon-button-light'; +import '../../elements/emby-tabs/emby-tabs'; +import '../../elements/emby-scroller/emby-scroller'; +import '../../assets/css/flexstyles.css'; +import 'webcomponents.js'; function showViewSettings(instance) { - import('guide-settings-dialog').then(({default: guideSettingsDialog}) => { + import('./guide-settings').then((guideSettingsDialog) => { guideSettingsDialog.show(instance.categoryOptions).then(function () { instance.refresh(); }); @@ -1091,7 +1092,7 @@ function Guide(options) { } } - import('text!./tvguide.template.html').then(({default: template}) => { + import('./tvguide.template.html').then(({default: template}) => { const context = options.element; context.classList.add('tvguide'); diff --git a/src/components/homeScreenSettings/homeScreenSettings.js b/src/components/homeScreenSettings/homeScreenSettings.js index 513893540..361a91a9e 100644 --- a/src/components/homeScreenSettings/homeScreenSettings.js +++ b/src/components/homeScreenSettings/homeScreenSettings.js @@ -1,13 +1,15 @@ -import layoutManager from 'layoutManager'; -import focusManager from 'focusManager'; -import globalize from 'globalize'; -import loading from 'loading'; -import homeSections from 'homeSections'; -import dom from 'dom'; -import events from 'events'; -import 'listViewStyle'; -import 'emby-select'; -import 'emby-checkbox'; + +import layoutManager from '../layoutManager'; +import focusManager from '../focusManager'; +import globalize from '../../scripts/globalize'; +import loading from '../loading/loading'; +import connectionManager from 'jellyfin-apiclient'; +import homeSections from '../homesections/homesections'; +import dom from '../../scripts/dom'; +import events from 'jellyfin-apiclient'; +import '../listview/listview.css'; +import '../../elements/emby-select/emby-select'; +import '../../elements/emby-checkbox/emby-checkbox'; /* eslint-disable indent */ @@ -369,7 +371,7 @@ import 'emby-checkbox'; saveUser(context, user, userSettings, apiClient).then(() => { loading.hide(); if (enableSaveConfirmation) { - import('toast').then(({default: toast}) => { + import('../toast/toast').then((toast) => { toast(globalize.translate('SettingsSaved')); }); } @@ -417,7 +419,7 @@ import 'emby-checkbox'; } function embed(options, self) { - return import('text!./homeScreenSettings.template.html').then(({default: template}) => { + return import('./homeScreenSettings.template.html').then(({default: template}) => { for (let i = 1; i <= numConfigurableSections; i++) { template = template.replace(`{section${i}label}`, globalize.translate('LabelHomeScreenSectionValue', i)); } diff --git a/src/components/homesections/homesections.js b/src/components/homesections/homesections.js index 758773689..60c5fc0ac 100644 --- a/src/components/homesections/homesections.js +++ b/src/components/homesections/homesections.js @@ -1,15 +1,16 @@ -import cardBuilder from 'cardBuilder'; -import dom from 'dom'; -import layoutManager from 'layoutManager'; -import imageLoader from 'imageLoader'; -import globalize from 'globalize'; -import appRouter from 'appRouter'; -import imageHelper from 'scripts/imagehelper'; -import 'paper-icon-button-light'; -import 'emby-itemscontainer'; -import 'emby-scroller'; -import 'emby-button'; -import 'css!./homesections'; +import connectionManager from 'jellyfin-apiclient'; +import cardBuilder from '../cardbuilder/cardBuilder'; +import dom from '../../scripts/dom'; +import layoutManager from '../layoutManager'; +import imageLoader from '../images/imageLoader'; +import globalize from '../../scripts/globalize'; +import appRouter from '../appRouter'; +import imageHelper from '../../scripts/imagehelper'; +import '../../elements/emby-button/paper-icon-button-light'; +import '../../elements/emby-itemscontainer/emby-itemscontainer'; +import '../../elements/emby-scroller/emby-scroller'; +import '../../elements/emby-button/emby-button'; +import './homesections'; /* eslint-disable indent */ diff --git a/src/components/htmlMediaHelper.js b/src/components/htmlMediaHelper.js index be506b449..1fab10ef2 100644 --- a/src/components/htmlMediaHelper.js +++ b/src/components/htmlMediaHelper.js @@ -1,8 +1,9 @@ + /* eslint-disable indent */ -import appSettings from 'appSettings' ; -import browser from 'browser'; -import events from 'events'; +import appSettings from '../scripts/settings/appSettings' ; +import browser from '../scripts/browser'; +import events from 'jellyfin-apiclient'; export function getSavedVolume() { return appSettings.get('volume') || 1; diff --git a/src/components/imageDownloader/imageDownloader.js b/src/components/imageDownloader/imageDownloader.js index 1ec459ff8..5abdd588f 100644 --- a/src/components/imageDownloader/imageDownloader.js +++ b/src/components/imageDownloader/imageDownloader.js @@ -1,17 +1,18 @@ -import dom from 'dom'; -import loading from 'loading'; -import appHost from 'apphost'; -import dialogHelper from 'dialogHelper'; -import imageLoader from 'imageLoader'; -import browser from 'browser'; -import layoutManager from 'layoutManager'; -import scrollHelper from 'scrollHelper'; -import globalize from 'globalize'; -import 'emby-checkbox'; -import 'paper-icon-button-light'; -import 'emby-button'; -import 'formDialogStyle'; -import 'cardStyle'; +import dom from '../../scripts/dom'; +import loading from '../loading/loading'; +import appHost from '../apphost'; +import dialogHelper from '../dialogHelper/dialogHelper'; +import connectionManager from 'jellyfin-apiclient'; +import imageLoader from '../images/imageLoader'; +import browser from '../../scripts/browser'; +import layoutManager from '../layoutManager'; +import scrollHelper from '../../scripts/scrollHelper'; +import globalize from '../../scripts/globalize'; +import '../../elements/emby-checkbox/emby-checkbox'; +import '../../elements/emby-button/paper-icon-button-light'; +import '../../elements/emby-button/emby-button'; +import '../formdialog.css'; +import '../cardbuilder/card.css'; /* eslint-disable indent */ @@ -315,7 +316,7 @@ import 'cardStyle'; function showEditor(itemId, serverId, itemType) { loading.show(); - import('text!./imageDownloader.template.html').then(({default: template}) => { + import('./imageDownloader.template.html').then(({default: template}) => { const apiClient = window.connectionManager.getApiClient(serverId); currentItemId = itemId; diff --git a/src/components/imageOptionsEditor/imageOptionsEditor.js b/src/components/imageOptionsEditor/imageOptionsEditor.js index d112dd65c..a220a65c5 100644 --- a/src/components/imageOptionsEditor/imageOptionsEditor.js +++ b/src/components/imageOptionsEditor/imageOptionsEditor.js @@ -5,12 +5,12 @@ * @module components/imageOptionsEditor/imageOptionsEditor */ -import globalize from 'globalize'; -import dom from 'dom'; -import dialogHelper from 'dialogHelper'; -import 'emby-checkbox'; -import 'emby-select'; -import 'emby-input'; +import globalize from '../../scripts/globalize'; +import dom from '../../scripts/dom'; +import dialogHelper from '../dialogHelper/dialogHelper'; +import '../../elements/emby-checkbox/emby-checkbox'; +import '../../elements/emby-select/emby-select'; +import '../../elements/emby-input/emby-input'; function getDefaultImageConfig(itemType, type) { return { diff --git a/src/components/imageUploader/imageUploader.js b/src/components/imageUploader/imageUploader.js index e89cbda2a..2c32accca 100644 --- a/src/components/imageUploader/imageUploader.js +++ b/src/components/imageUploader/imageUploader.js @@ -5,16 +5,17 @@ * @module components/imageUploader/imageUploader */ -import dialogHelper from 'dialogHelper'; -import dom from 'dom'; -import loading from 'loading'; -import scrollHelper from 'scrollHelper'; -import layoutManager from 'layoutManager'; -import globalize from 'globalize'; -import 'emby-button'; -import 'emby-select'; -import 'formDialogStyle'; -import 'css!./style'; +import dialogHelper from '../dialogHelper/dialogHelper'; +import connectionManager from 'jellyfin-apiclient'; +import dom from '../../scripts/dom'; +import loading from '../loading/loading'; +import scrollHelper from '../../scripts/scrollHelper'; +import layoutManager from '../layoutManager'; +import globalize from '../../scripts/globalize'; +import '../../elements/emby-button/emby-button'; +import '../../elements/emby-select/emby-select'; +import '../formdialog.css'; +import './style.css'; let currentItemId; let currentServerId; @@ -26,14 +27,14 @@ import 'css!./style'; switch (evt.target.error.code) { case evt.target.error.NOT_FOUND_ERR: - import('toast').then(({default: toast}) => { + import('../toast/toast').then((toast) => { toast(globalize.translate('MessageFileReadError')); }); break; case evt.target.error.ABORT_ERR: break; // noop default: - import('toast').then(({default: toast}) => { + import('../toast/toast').then((toast) => { toast(globalize.translate('MessageFileReadError')); }); break; @@ -87,7 +88,7 @@ import 'css!./style'; } if (!file.type.startsWith('image/')) { - import('toast').then(({default: toast}) => { + import('../toast/toast').then((toast) => { toast(globalize.translate('MessageImageFileTypeAllowed')); }); e.preventDefault(); @@ -100,7 +101,7 @@ import 'css!./style'; const imageType = dlg.querySelector('#selectImageType').value; if (imageType === 'None') { - import('toast').then(({default: toast}) => { + import('../toast/toast').then((toast) => { toast(globalize.translate('MessageImageTypeNotSelected')); }); e.preventDefault(); @@ -134,7 +135,7 @@ import 'css!./style'; function showEditor(options, resolve) { options = options || {}; - return import('text!./imageUploader.template.html').then(({default: template}) => { + return import('./imageUploader.template.html').then(({default: template}) => { currentItemId = options.itemId; currentServerId = options.serverId; diff --git a/src/components/imageeditor/imageeditor.js b/src/components/imageeditor/imageeditor.js index e5b59cfb2..09edc072f 100644 --- a/src/components/imageeditor/imageeditor.js +++ b/src/components/imageeditor/imageeditor.js @@ -1,18 +1,19 @@ -import dialogHelper from 'dialogHelper'; -import loading from 'loading'; -import dom from 'dom'; -import layoutManager from 'layoutManager'; -import focusManager from 'focusManager'; -import globalize from 'globalize'; -import scrollHelper from 'scrollHelper'; -import imageLoader from 'imageLoader'; -import browser from 'browser'; -import appHost from 'apphost'; -import 'cardStyle'; -import 'formDialogStyle'; -import 'emby-button'; -import 'paper-icon-button-light'; -import 'css!./imageeditor'; +import dialogHelper from '../dialogHelper/dialogHelper'; +import connectionManager from 'jellyfin-apiclient'; +import loading from '../loading/loading'; +import dom from '../../scripts/dom'; +import layoutManager from '../layoutManager'; +import focusManager from '../focusManager'; +import globalize from '../../scripts/globalize'; +import scrollHelper from '../../scripts/scrollHelper'; +import imageLoader from '../images/imageLoader'; +import browser from '../../scripts/browser'; +import appHost from '../apphost'; +import '../cardbuilder/card.css'; +import '../formdialog.css'; +import '../../elements/emby-button/emby-button'; +import '../../elements/emby-button/paper-icon-button-light'; +import './imageeditor.css'; /* eslint-disable indent */ @@ -199,7 +200,7 @@ import 'css!./imageeditor'; return; } - import('confirm').then(({default: confirm}) => { + import('../confirm/confirm').then(({default: confirm}) => { confirm({ text: globalize.translate('ConfirmDeleteImage'), @@ -215,7 +216,7 @@ import 'css!./imageeditor'; hasChanges = true; reload(context, null, focusContext); }, function () { - import('alert').then(({default: alert}) => { + import('../alert').then((alert) => { alert(globalize.translate('ErrorDefault')); }); }); @@ -281,7 +282,7 @@ import 'css!./imageeditor'; } function showImageDownloader(page, imageType) { - import('imageDownloader').then(({default: ImageDownloader}) => { + import('../imageDownloader/imageDownloader').then((ImageDownloader) => { ImageDownloader.show(currentItem.Id, currentItem.ServerId, currentItem.Type, imageType).then(function () { hasChanges = true; reload(page); @@ -299,7 +300,7 @@ import 'css!./imageeditor'; const providerCount = parseInt(imageCard.getAttribute('data-providers')); const numImages = parseInt(imageCard.getAttribute('data-numimages')); - import('actionsheet').then(({default: actionSheet}) => { + import('../actionSheet/actionSheet').then(({default: actionSheet}) => { const commands = []; commands.push({ @@ -370,7 +371,7 @@ import 'css!./imageeditor'; addListeners(context, 'btnOpenUploadMenu', 'click', function () { const imageType = this.getAttribute('data-imagetype'); - import('imageUploader').then(({default: imageUploader}) => { + import('../imageUploader/imageUploader').then(({default: imageUploader}) => { imageUploader.show({ theme: options.theme, @@ -422,7 +423,7 @@ import 'css!./imageeditor'; loading.show(); - import('text!./imageeditor.template.html').then(({default: template}) => { + import('./imageeditor.template.html').then(({default: template}) => { const apiClient = window.connectionManager.getApiClient(serverId); apiClient.getItem(apiClient.getCurrentUserId(), itemId).then(function (item) { const dialogOptions = { diff --git a/src/components/images/imageLoader.js b/src/components/images/imageLoader.js index 9dc708098..f4a141bc9 100644 --- a/src/components/images/imageLoader.js +++ b/src/components/images/imageLoader.js @@ -1,7 +1,7 @@ -import * as lazyLoader from 'lazyLoader'; -import * as userSettings from 'userSettings'; +import * as lazyLoader from '../lazyLoader/lazyLoaderIntersectionObserver'; +import * as userSettings from '../../scripts/settings/userSettings'; import * as blurhash from 'blurhash'; -import 'css!./style'; +import './style.css'; /* eslint-disable indent */ export function lazyImage(elem, source = elem.getAttribute('data-src')) { diff --git a/src/components/indicators/indicators.js b/src/components/indicators/indicators.js index bbd672ef7..5f8a8691d 100644 --- a/src/components/indicators/indicators.js +++ b/src/components/indicators/indicators.js @@ -1,8 +1,8 @@ -import datetime from 'datetime'; -import itemHelper from 'itemHelper'; -import 'emby-progressbar'; -import 'css!./indicators.css'; -import 'material-icons'; +import datetime from '../../scripts/datetime'; +import itemHelper from '../itemHelper'; +import '../../elements/emby-progressbar/emby-progressbar'; +import './indicators.css'; +import 'material-design-icons-iconfont'; export function enableProgressIndicator(item) { if (item.MediaType === 'Video' && item.Type !== 'TvChannel') { diff --git a/src/components/itemContextMenu.js b/src/components/itemContextMenu.js index f36f623d9..ff58a901f 100644 --- a/src/components/itemContextMenu.js +++ b/src/components/itemContextMenu.js @@ -1,10 +1,11 @@ -import appHost from 'apphost'; -import globalize from 'globalize'; -import itemHelper from 'itemHelper'; -import appRouter from 'appRouter'; -import playbackManager from 'playbackManager'; -import browser from 'browser'; -import actionsheet from 'actionsheet'; +import connectionManager from 'jellyfin-apiclient'; +import browser from '../scripts/browser'; +import globalize from '../scripts/globalize'; +import actionsheet from './actionSheet/actionSheet'; +import appHost from './apphost'; +import appRouter from './appRouter'; +import itemHelper from './itemHelper'; +import playbackManager from './playback/playbackmanager'; /* eslint-disable indent */ export function getCommands(options) { @@ -334,7 +335,7 @@ import actionsheet from 'actionsheet'; return new Promise(function (resolve, reject) { switch (id) { case 'addtocollection': - import('collectionEditor').then(({default: collectionEditor}) => { + import('./collectionEditor/collectionEditor').then((collectionEditor) => { new collectionEditor({ items: [itemId], serverId: serverId @@ -342,7 +343,7 @@ import actionsheet from 'actionsheet'; }); break; case 'addtoplaylist': - import('playlistEditor').then(({default: playlistEditor}) => { + import('./playlisteditor/playlisteditor').then((playlistEditor) => { new playlistEditor({ items: [itemId], serverId: serverId @@ -350,7 +351,7 @@ import actionsheet from 'actionsheet'; }); break; case 'download': - import('fileDownloader').then((fileDownloader) => { + import('../scripts/fileDownloader').then((fileDownloader) => { const downloadHref = apiClient.getItemDownloadUrl(itemId); fileDownloader.download([{ url: downloadHref, @@ -372,7 +373,7 @@ import actionsheet from 'actionsheet'; textArea.select(); if (document.execCommand('copy')) { - import('toast').then(({default: toast}) => { + import('./toast/toast').then((toast) => { toast(globalize.translate('CopyStreamURLSuccess')); }); } else { @@ -387,7 +388,7 @@ import actionsheet from 'actionsheet'; } else { /* eslint-disable-next-line compat/compat */ navigator.clipboard.writeText(downloadHref).then(function () { - import('toast').then(({default: toast}) => { + import('./toast/toast').then((toast) => { toast(globalize.translate('CopyStreamURLSuccess')); }); }).catch(function () { @@ -398,7 +399,7 @@ import actionsheet from 'actionsheet'; break; } case 'editsubtitles': - import('subtitleEditor').then(({default: subtitleEditor}) => { + import('./subtitleeditor/subtitleeditor').then((subtitleEditor) => { subtitleEditor.show(itemId, serverId).then(getResolveFunction(resolve, id, true), getResolveFunction(resolve, id)); }); break; @@ -406,7 +407,7 @@ import actionsheet from 'actionsheet'; editItem(apiClient, item).then(getResolveFunction(resolve, id, true), getResolveFunction(resolve, id)); break; case 'editimages': - import('imageEditor').then(({default: imageEditor}) => { + import('./imageeditor/imageeditor').then((imageEditor) => { imageEditor.show({ itemId: itemId, serverId: serverId @@ -414,12 +415,12 @@ import actionsheet from 'actionsheet'; }); break; case 'identify': - import('itemIdentifier').then(({default: itemIdentifier}) => { + import('./itemidentifier/itemidentifier').then((itemIdentifier) => { itemIdentifier.show(itemId, serverId).then(getResolveFunction(resolve, id, true), getResolveFunction(resolve, id)); }); break; case 'moremediainfo': - import('itemMediaInfo').then(({default: itemMediaInfo}) => { + import('./itemMediaInfo/itemMediaInfo').then((itemMediaInfo) => { itemMediaInfo.show(itemId, serverId).then(getResolveFunction(resolve, id), getResolveFunction(resolve, id)); }); break; @@ -454,7 +455,7 @@ import actionsheet from 'actionsheet'; playbackManager.clearQueue(); break; case 'record': - import('recordingCreator').then(({default: recordingCreator}) => { + import('./recordingcreator/recordingcreator').then((recordingCreator) => { recordingCreator.show(itemId, serverId).then(getResolveFunction(resolve, id, true), getResolveFunction(resolve, id)); }); break; @@ -525,7 +526,7 @@ import actionsheet from 'actionsheet'; } function deleteTimer(apiClient, item, resolve, command) { - import('recordingHelper').then(({default: recordingHelper}) => { + import('./recordingcreator/recordinghelper').then((recordingHelper) => { const timerId = item.TimerId || item.Id; recordingHelper.cancelTimerWithConfirmation(timerId, item.ServerId).then(function () { getResolveFunction(resolve, command, true)(); @@ -534,7 +535,7 @@ import actionsheet from 'actionsheet'; } function deleteSeriesTimer(apiClient, item, resolve, command) { - import('recordingHelper').then(({default: recordingHelper}) => { + import('./recordingcreator/recordinghelper').then((recordingHelper) => { recordingHelper.cancelSeriesTimerWithConfirmation(item.Id, item.ServerId).then(function () { getResolveFunction(resolve, command, true)(); }); @@ -568,15 +569,15 @@ import actionsheet from 'actionsheet'; const serverId = apiClient.serverInfo().Id; if (item.Type === 'Timer') { - import('recordingEditor').then(({default: recordingEditor}) => { + import('./recordingcreator/recordingeditor').then((recordingEditor) => { recordingEditor.show(item.Id, serverId).then(resolve, reject); }); } else if (item.Type === 'SeriesTimer') { - import('seriesRecordingEditor').then(({default: recordingEditor}) => { + import('./recordingcreator/seriesrecordingeditor').then((recordingEditor) => { recordingEditor.show(item.Id, serverId).then(resolve, reject); }); } else { - import('metadataEditor').then(({default: metadataEditor}) => { + import('./metadataEditor/metadataEditor').then((metadataEditor) => { metadataEditor.show(item.Id, serverId).then(resolve, reject); }); } @@ -585,7 +586,7 @@ import actionsheet from 'actionsheet'; function deleteItem(apiClient, item) { return new Promise(function (resolve, reject) { - import('deleteHelper').then(({default: deleteHelper}) => { + import('../scripts/deleteHelper').then((deleteHelper) => { deleteHelper.deleteItem({ item: item, navigate: false @@ -597,7 +598,7 @@ import actionsheet from 'actionsheet'; } function refresh(apiClient, item) { - import('refreshDialog').then(({default: refreshDialog}) => { + import('./refreshdialog/refreshdialog').then((refreshDialog) => { new refreshDialog({ itemIds: [item.Id], serverId: apiClient.serverInfo().Id, diff --git a/src/components/itemHelper.js b/src/components/itemHelper.js index 7d1ac0e11..b6f30d7ab 100644 --- a/src/components/itemHelper.js +++ b/src/components/itemHelper.js @@ -1,5 +1,5 @@ -import appHost from 'apphost'; -import globalize from 'globalize'; +import appHost from './apphost'; +import globalize from '../scripts/globalize'; export function getDisplayName(item, options = {}) { if (!item) { diff --git a/src/components/itemMediaInfo/itemMediaInfo.js b/src/components/itemMediaInfo/itemMediaInfo.js index bd3a157da..9e036fba9 100644 --- a/src/components/itemMediaInfo/itemMediaInfo.js +++ b/src/components/itemMediaInfo/itemMediaInfo.js @@ -5,17 +5,18 @@ * @module components/itemMediaInfo/itemMediaInfo */ -import dialogHelper from 'dialogHelper'; -import layoutManager from 'layoutManager'; -import globalize from 'globalize'; -import loading from 'loading'; -import 'emby-select'; -import 'listViewStyle'; -import 'paper-icon-button-light'; -import 'css!./../formdialog'; -import 'material-icons'; -import 'emby-button'; -import 'flexStyles'; +import dialogHelper from '../dialogHelper/dialogHelper'; +import layoutManager from '../layoutManager'; +import globalize from '../../scripts/globalize'; +import connectionManager from 'jellyfin-apiclient'; +import loading from '../loading/loading'; +import '../../elements/emby-select/emby-select'; +import '../listview/listview.css'; +import '../../elements/emby-button/emby-button'; +import '../../elements/emby-button/paper-icon-button-light'; +import '../formdialog.css'; +import 'material-design-icons-iconfont'; +import '../../assets/css/flexstyles.css'; function setMediaInfo(user, page, item) { let html = item.MediaSources.map(version => { @@ -193,7 +194,7 @@ import 'flexStyles'; export function show(itemId, serverId) { loading.show(); - return import('text!./itemMediaInfo.template.html').then(({default: template}) => { + return import('./itemMediaInfo.template.html').then(({default: template}) => { return new Promise((resolve, reject) => { loadMediaInfo(itemId, serverId, template).then(resolve, reject); }); diff --git a/src/components/itemidentifier/itemidentifier.js b/src/components/itemidentifier/itemidentifier.js index 956cbb4f6..77b04a1a5 100644 --- a/src/components/itemidentifier/itemidentifier.js +++ b/src/components/itemidentifier/itemidentifier.js @@ -5,19 +5,20 @@ * @module components/itemidentifier/itemidentifier */ -import dialogHelper from 'dialogHelper'; -import loading from 'loading'; -import globalize from 'globalize'; -import scrollHelper from 'scrollHelper'; -import layoutManager from 'layoutManager'; -import focusManager from 'focusManager'; -import browser from 'browser'; -import 'emby-input'; -import 'emby-checkbox'; -import 'paper-icon-button-light'; -import 'css!./../formdialog'; -import 'material-icons'; -import 'cardStyle'; +import dialogHelper from '../dialogHelper/dialogHelper'; +import loading from '../loading/loading'; +import connectionManager from 'jellyfin-apiclient'; +import globalize from '../../scripts/globalize'; +import scrollHelper from '../../scripts/scrollHelper'; +import layoutManager from '../layoutManager'; +import focusManager from '../focusManager'; +import browser from '../../scripts/browser'; +import '../../elements/emby-input/emby-input'; +import '../../elements/emby-checkbox/emby-checkbox'; +import '../../elements/emby-button/paper-icon-button-light'; +import '../formdialog.css'; +import 'material-design-icons-iconfont'; +import '../cardbuilder/card.css'; const enableFocusTransform = !browser.slow && !browser.edge; @@ -67,7 +68,7 @@ import 'cardStyle'; } if (!hasId && !lookupInfo.Name) { - import('toast').then(({default: toast}) => { + import('../toast/toast').then((toast) => { toast(globalize.translate('PleaseEnterNameOrId')); }); return; @@ -334,7 +335,7 @@ import 'cardStyle'; function showEditor(itemId) { loading.show(); - return import('text!./itemidentifier.template.html').then(({default: template}) => { + return import('./itemidentifier.template.html').then(({default: template}) => { const apiClient = getApiClient(); apiClient.getItem(apiClient.getCurrentUserId(), itemId).then(item => { @@ -416,7 +417,7 @@ import 'cardStyle'; currentItem = null; currentItemType = itemType; - return import('text!./itemidentifier.template.html').then(({default: template}) => { + return import('./itemidentifier.template.html').then(({default: template}) => { const dialogOptions = { size: 'small', removeOnClose: true, diff --git a/src/components/itemsrefresher.js b/src/components/itemsrefresher.js index 3883e6e49..d28361999 100644 --- a/src/components/itemsrefresher.js +++ b/src/components/itemsrefresher.js @@ -1,6 +1,6 @@ -import playbackManager from 'playbackManager'; -import serverNotifications from 'serverNotifications'; -import events from 'events'; +import playbackManager from './playback/playbackmanager'; +import serverNotifications from '../scripts/serverNotifications'; +import events from 'jellyfin-apiclient'; function onUserDataChanged(e, apiClient, userData) { const instance = this; diff --git a/src/components/layoutManager.js b/src/components/layoutManager.js index fe4258366..c5555d0eb 100644 --- a/src/components/layoutManager.js +++ b/src/components/layoutManager.js @@ -1,7 +1,7 @@ import appHost from './apphost'; import browser from '../scripts/browser'; import { set, get } from '../scripts/settings/appSettings'; -import events from 'events'; +import events from 'jellyfin-apiclient'; function setLayout(instance, layout, selectedLayout) { if (layout === selectedLayout) { diff --git a/src/components/libraryoptionseditor/libraryoptionseditor.js b/src/components/libraryoptionseditor/libraryoptionseditor.js index 91dbe5ab9..cdc4f6a28 100644 --- a/src/components/libraryoptionseditor/libraryoptionseditor.js +++ b/src/components/libraryoptionseditor/libraryoptionseditor.js @@ -5,11 +5,11 @@ * @module components/libraryoptionseditor/libraryoptionseditor */ -import globalize from 'globalize'; -import dom from 'dom'; -import 'emby-checkbox'; -import 'emby-select'; -import 'emby-input'; +import globalize from '../../scripts/globalize'; +import dom from '../../scripts/dom'; +import '../../elements/emby-checkbox/emby-checkbox'; +import '../../elements/emby-select/emby-select'; +import '../../elements/emby-input/emby-input'; function populateLanguages(parent) { return ApiClient.getCultures().then(languages => { @@ -306,7 +306,7 @@ import 'emby-input'; } function showImageOptionsForType(type) { - import('imageoptionseditor').then(({default: ImageOptionsEditor}) => { + import('../imageOptionsEditor/imageOptionsEditor').then(({default: ImageOptionsEditor}) => { let typeOptions = getTypeOptions(currentLibraryOptions, type); if (!typeOptions) { typeOptions = { diff --git a/src/components/listview/listview.js b/src/components/listview/listview.js index e0fbc2fd2..33bbdc756 100644 --- a/src/components/listview/listview.js +++ b/src/components/listview/listview.js @@ -5,16 +5,17 @@ * @module components/listview/listview */ -import itemHelper from 'itemHelper'; -import mediaInfo from 'mediaInfo'; -import indicators from 'indicators'; -import layoutManager from 'layoutManager'; -import globalize from 'globalize'; -import datetime from 'datetime'; -import cardBuilder from 'cardBuilder'; -import 'css!./listview'; -import 'emby-ratingbutton'; -import 'emby-playstatebutton'; +import itemHelper from '../itemHelper'; +import mediaInfo from '../mediainfo/mediainfo'; +import indicators from '../indicators/indicators'; +import connectionManager from 'jellyfin-apiclient'; +import layoutManager from '../layoutManager'; +import globalize from '../../scripts/globalize'; +import datetime from '../../scripts/datetime'; +import cardBuilder from '../cardbuilder/cardBuilder'; +import './listview.css'; +import '../../elements/emby-ratingbutton/emby-ratingbutton'; +import '../../elements/emby-playstatebutton/emby-playstatebutton'; function getIndex(item, options) { if (options.index === 'disc') { diff --git a/src/components/loading/loading.js b/src/components/loading/loading.js index 823761137..c91cd8beb 100644 --- a/src/components/loading/loading.js +++ b/src/components/loading/loading.js @@ -1,4 +1,4 @@ -import 'css!./loading'; +import './loading'; let loadingElem; let layer1; diff --git a/src/components/maintabsmanager.js b/src/components/maintabsmanager.js index 1be1cf622..07a150282 100644 --- a/src/components/maintabsmanager.js +++ b/src/components/maintabsmanager.js @@ -1,8 +1,8 @@ -import dom from 'dom'; -import browser from 'browser'; -import events from 'events'; -import 'emby-tabs'; -import 'emby-button'; +import dom from '../scripts/dom'; +import browser from '../scripts/browser'; +import events from 'jellyfin-apiclient'; +import '../elements/emby-tabs/emby-tabs'; +import '../elements/emby-button/emby-button'; /* eslint-disable indent */ @@ -65,7 +65,7 @@ import 'emby-button'; } }; - import('touchHelper').then(({default: TouchHelper}) => { + import('../scripts/touchHelper').then((TouchHelper) => { const touchHelper = new TouchHelper(view.parentNode.parentNode); events.on(touchHelper, 'swipeleft', onSwipeLeft); diff --git a/src/components/mediaLibraryCreator/mediaLibraryCreator.js b/src/components/mediaLibraryCreator/mediaLibraryCreator.js index 4e0d7b026..f3141ebee 100644 --- a/src/components/mediaLibraryCreator/mediaLibraryCreator.js +++ b/src/components/mediaLibraryCreator/mediaLibraryCreator.js @@ -5,20 +5,20 @@ * @module components/mediaLibraryCreator/mediaLibraryCreator */ -import loading from 'loading'; -import dialogHelper from 'dialogHelper'; -import dom from 'dom'; -import $ from 'jQuery'; -import libraryoptionseditor from 'components/libraryoptionseditor/libraryoptionseditor'; -import globalize from 'globalize'; -import 'emby-toggle'; -import 'emby-input'; -import 'emby-select'; -import 'paper-icon-button-light'; -import 'listViewStyle'; -import 'formDialogStyle'; -import 'emby-button'; -import 'flexStyles'; +import loading from '../loading/loading'; +import dialogHelper from '../dialogHelper/dialogHelper'; +import dom from '../../scripts/dom'; +import 'jquery'; +import libraryoptionseditor from '../libraryoptionseditor/libraryoptionseditor'; +import globalize from '../../scripts/globalize'; +import '../../elements/emby-button/emby-button'; +import '../../elements/emby-button/paper-icon-button-light'; +import '../../elements/emby-input/emby-input'; +import '../../elements/emby-select/emby-select'; +import '../../elements/emby-toggle/emby-toggle'; +import '../listview/listview.css'; +import '../formdialog.css'; +import '../../assets/css/flexstyles.css'; function onAddLibrary() { if (isCreating) { @@ -26,7 +26,7 @@ import 'flexStyles'; } if (pathInfos.length == 0) { - import('alert').then(({default: alert}) => { + import('../alert').then((alert) => { alert({ text: globalize.translate('PleaseAddAtLeastOneFolder'), type: 'error' @@ -54,7 +54,7 @@ import 'flexStyles'; loading.hide(); dialogHelper.close(dlg); }, () => { - import('toast').then(({default: toast}) => { + import('../toast/toast').then((toast) => { toast(globalize.translate('ErrorAddingMediaPathToVirtualFolder')); }); @@ -109,7 +109,7 @@ import 'flexStyles'; function onAddButtonClick() { const page = dom.parentWithClass(this, 'dlg-librarycreator'); - import('directorybrowser').then(({default: directoryBrowser}) => { + import('../directorybrowser/directorybrowser').then((directoryBrowser) => { const picker = new directoryBrowser(); picker.show({ enableNetworkSharePath: true, @@ -200,7 +200,7 @@ export class showEditor { currentOptions = options; currentResolve = resolve; hasChanges = false; - import('text!./components/mediaLibraryCreator/mediaLibraryCreator.template.html').then(({default: template}) => { + import('./mediaLibraryCreator.template.html').then(({default: template}) => { const dlg = dialogHelper.createDialog({ size: 'small', modal: false, diff --git a/src/components/mediaLibraryEditor/mediaLibraryEditor.js b/src/components/mediaLibraryEditor/mediaLibraryEditor.js index 13d264f4c..15f01bb7e 100644 --- a/src/components/mediaLibraryEditor/mediaLibraryEditor.js +++ b/src/components/mediaLibraryEditor/mediaLibraryEditor.js @@ -5,18 +5,18 @@ * @module components/mediaLibraryEditor/mediaLibraryEditor */ -import jQuery from 'jQuery'; -import loading from 'loading'; -import dialogHelper from 'dialogHelper'; -import dom from 'dom'; -import libraryoptionseditor from 'components/libraryoptionseditor/libraryoptionseditor'; -import globalize from 'globalize'; -import 'emby-button'; -import 'listViewStyle'; -import 'paper-icon-button-light'; -import 'formDialogStyle'; -import 'emby-toggle'; -import 'flexStyles'; +import 'jquery'; +import loading from '../loading/loading'; +import dialogHelper from '../dialogHelper/dialogHelper'; +import dom from '../../scripts/dom'; +import libraryoptionseditor from '../libraryoptionseditor/libraryoptionseditor'; +import globalize from '../../scripts/globalize'; +import '../../elements/emby-button/emby-button'; +import '../listview/listview.css'; +import '../../elements/emby-button/paper-icon-button-light'; +import '../formdialog.css'; +import '../../elements/emby-toggle/emby-toggle'; +import '../../assets/css/flexstyles.css'; function onEditLibrary() { if (isCreating) { @@ -47,7 +47,7 @@ import 'flexStyles'; hasChanges = true; refreshLibraryFromServer(page); }, () => { - import('toast').then(({default: toast}) => { + import('../toast/toast').then((toast) => { toast(globalize.translate('ErrorAddingMediaPathToVirtualFolder')); }); }); @@ -62,7 +62,7 @@ import 'flexStyles'; hasChanges = true; refreshLibraryFromServer(page); }, () => { - import('toast').then(({default: toast}) => { + import('../toast/toast').then((toast) => { toast(globalize.translate('ErrorAddingMediaPathToVirtualFolder')); }); }); @@ -72,7 +72,7 @@ import 'flexStyles'; const button = btnRemovePath; const virtualFolder = currentOptions.library; - import('confirm').then(({default: confirm}) => { + import('../confirm/confirm').then(({default: confirm}) => { confirm({ title: globalize.translate('HeaderRemoveMediaLocation'), text: globalize.translate('MessageConfirmRemoveMediaLocation'), @@ -84,7 +84,7 @@ import 'flexStyles'; hasChanges = true; refreshLibraryFromServer(dom.parentWithClass(button, 'dlg-libraryeditor')); }, () => { - import('toast').then(({default: toast}) => { + import('../toast/toast').then((toast) => { toast(globalize.translate('ErrorDefault')); }); }); @@ -167,7 +167,7 @@ import 'flexStyles'; } function showDirectoryBrowser(context, originalPath, networkPath) { - import('directorybrowser').then(({default: directoryBrowser}) => { + import('../directorybrowser/directorybrowser').then((directoryBrowser) => { const picker = new directoryBrowser(); picker.show({ enableNetworkSharePath: true, @@ -215,7 +215,7 @@ export class showEditor { currentOptions = options; currentDeferred = deferred; hasChanges = false; - import('text!./components/mediaLibraryEditor/mediaLibraryEditor.template.html').then(({default: template}) => { + import('./mediaLibraryEditor.template.html').then((template) => { const dlg = dialogHelper.createDialog({ size: 'small', modal: false, diff --git a/src/components/mediainfo/mediainfo.js b/src/components/mediainfo/mediainfo.js index d5da29d3b..270cfae6d 100644 --- a/src/components/mediainfo/mediainfo.js +++ b/src/components/mediainfo/mediainfo.js @@ -1,12 +1,12 @@ -import datetime from 'datetime'; -import globalize from 'globalize'; -import appRouter from 'appRouter'; -import itemHelper from 'itemHelper'; -import indicators from 'indicators'; -import 'material-icons'; -import 'css!./mediainfo.css'; -import 'programStyles'; -import 'emby-button'; +import datetime from '../../scripts/datetime'; +import globalize from '../../scripts/globalize'; +import appRouter from '../appRouter'; +import itemHelper from '../itemHelper'; +import indicators from '../indicators/indicators'; +import 'material-design-icons-iconfont'; +import './mediainfo.css'; +import '../guide/programs.css'; +import '../../elements/emby-button/emby-button'; /* eslint-disable indent */ function getTimerIndicator(item) { diff --git a/src/components/metadataEditor/metadataEditor.js b/src/components/metadataEditor/metadataEditor.js index b768e77c4..32a0a3751 100644 --- a/src/components/metadataEditor/metadataEditor.js +++ b/src/components/metadataEditor/metadataEditor.js @@ -1,21 +1,22 @@ -import dom from 'dom'; -import layoutManager from 'layoutManager'; -import dialogHelper from 'dialogHelper'; -import datetime from 'datetime'; -import loading from 'loading'; -import focusManager from 'focusManager'; -import globalize from 'globalize'; -import shell from 'shell'; -import 'emby-checkbox'; -import 'emby-input'; -import 'emby-select'; -import 'listViewStyle'; -import 'emby-textarea'; -import 'emby-button'; -import 'paper-icon-button-light'; -import 'css!./../formdialog'; -import 'clearButtonStyle'; -import 'flexStyles'; +import dom from '../../scripts/dom'; +import layoutManager from '../layoutManager'; +import dialogHelper from '../dialogHelper/dialogHelper'; +import datetime from '../../scripts/datetime'; +import loading from '../loading/loading'; +import focusManager from '../focusManager'; +import connectionManager from 'jellyfin-apiclient'; +import globalize from '../../scripts/globalize'; +import shell from '../../scripts/shell'; +import '../../elements/emby-checkbox/emby-checkbox'; +import '../../elements/emby-input/emby-input'; +import '../../elements/emby-select/emby-select'; +import '../listview/listview.css'; +import '../../elements/emby-textarea/emby-textarea'; +import '../../elements/emby-button/emby-button'; +import '../../elements/emby-button/paper-icon-button-light'; +import '../formdialog.css'; +import '../../assets/css/clearbutton.css'; +import '../../assets/css/flexstyles.css'; /* eslint-disable indent */ @@ -35,7 +36,7 @@ import 'flexStyles'; function submitUpdatedItem(form, item) { function afterContentTypeUpdated() { - import('toast').then(({default: toast}) => { + import('../toast/toast').then(({default: toast}) => { toast(globalize.translate('MessageItemSaved')); }); @@ -207,7 +208,7 @@ import 'flexStyles'; } function addElementToList(source, sortCallback) { - import('prompt').then(({default: prompt}) => { + import('../prompt/prompt').then(({default: prompt}) => { prompt({ label: 'Value:' }).then(function (text) { @@ -225,7 +226,7 @@ import 'flexStyles'; } function editPerson(context, person, index) { - import('personEditor').then(({default: personEditor}) => { + import('./personEditor').then((personEditor) => { personEditor.show(person).then(function (updatedPerson) { const isNew = index === -1; @@ -244,14 +245,14 @@ import 'flexStyles'; if (parentId) { reload(context, parentId, item.ServerId); } else { - import('appRouter').then(({default: appRouter}) => { + import('../appRouter').then((appRouter) => { appRouter.goHome(); }); } } function showMoreMenu(context, button, user) { - import('itemContextMenu').then(({default: itemContextMenu}) => { + import('../itemContextMenu').then(({default: itemContextMenu}) => { const item = currentItem; itemContextMenu.show({ @@ -1020,7 +1021,7 @@ import 'flexStyles'; } function centerFocus(elem, horiz, on) { - import('scrollHelper').then(({default: scrollHelper}) => { + import('../../scripts/scrollHelper').then((scrollHelper) => { const fn = on ? 'on' : 'off'; scrollHelper.centerFocus[fn](elem, horiz); }); @@ -1029,7 +1030,7 @@ import 'flexStyles'; function show(itemId, serverId, resolve, reject) { loading.show(); - import('text!./metadataEditor.template.html').then(({default: template}) => { + import('./metadataEditor.template.html').then(({default: template}) => { const dialogOptions = { removeOnClose: true, scrollY: false @@ -1084,7 +1085,7 @@ import 'flexStyles'; return new Promise(function (resolve, reject) { loading.show(); - import('text!./metadataEditor.template.html').then(({default: template}) => { + import('./metadataEditor.template.html').then(({default: template}) => { elem.innerHTML = globalize.translateHtml(template, 'core'); elem.querySelector('.formDialogFooter').classList.remove('formDialogFooter'); diff --git a/src/components/metadataEditor/personEditor.js b/src/components/metadataEditor/personEditor.js index 832697124..f64f7330d 100644 --- a/src/components/metadataEditor/personEditor.js +++ b/src/components/metadataEditor/personEditor.js @@ -1,15 +1,16 @@ -import dialogHelper from 'dialogHelper'; -import layoutManager from 'layoutManager'; -import globalize from 'globalize'; -import 'paper-icon-button-light'; -import 'emby-input'; -import 'emby-select'; -import 'css!./../formdialog'; + +import dialogHelper from '../dialogHelper/dialogHelper'; +import layoutManager from '../layoutManager'; +import globalize from '../../scripts/globalize'; +import '../../elements/emby-button/paper-icon-button-light'; +import '../../elements/emby-input/emby-input'; +import '../../elements/emby-select/emby-select'; +import '../formdialog.css'; /* eslint-disable indent */ function centerFocus(elem, horiz, on) { - import('scrollHelper').then(({default: scrollHelper}) => { + import('../../scripts/scrollHelper').then((scrollHelper) => { const fn = on ? 'on' : 'off'; scrollHelper.centerFocus[fn](elem, horiz); }); @@ -17,7 +18,7 @@ import 'css!./../formdialog'; function show(person) { return new Promise(function (resolve, reject) { - import('text!./personEditor.template.html').then(({default: template}) => { + import('./personEditor.template.html').then(({default: template}) => { const dialogOptions = { removeOnClose: true, scrollY: false diff --git a/src/components/multiSelect/multiSelect.css b/src/components/multiSelect/multiSelect.css index e9c66c57a..39b50aa17 100644 --- a/src/components/multiSelect/multiSelect.css +++ b/src/components/multiSelect/multiSelect.css @@ -1,3 +1,4 @@ + .itemSelectionPanel { position: absolute; bottom: 0; diff --git a/src/components/multiSelect/multiSelect.js b/src/components/multiSelect/multiSelect.js index e7ce440f0..52182d440 100644 --- a/src/components/multiSelect/multiSelect.js +++ b/src/components/multiSelect/multiSelect.js @@ -1,9 +1,10 @@ -import browser from 'browser'; -import appHost from 'apphost'; -import loading from 'loading'; -import globalize from 'globalize'; -import dom from 'dom'; -import 'css!./multiSelect'; +import browser from '../../scripts/browser'; +import appHost from '../apphost'; +import loading from '../loading/loading'; +import connectionManager from 'jellyfin-apiclient'; +import globalize from '../../scripts/globalize'; +import dom from '../../scripts/dom'; +import './multiSelect.css'; /* eslint-disable indent */ @@ -138,7 +139,7 @@ import 'css!./multiSelect'; function alertText(options) { return new Promise((resolve, reject) => { - import('alert').then(({default: alert}) => { + import('../alert').then((alert) => { alert(options).then(resolve, resolve); }); }); @@ -154,7 +155,7 @@ import 'css!./multiSelect'; title = globalize.translate('HeaderDeleteItems'); } - import('confirm').then(({default: confirm}) => { + import('../confirm/confirm').then((confirm) => { confirm(msg, title).then(() => { const promises = itemIds.map(itemId => { apiClient.deleteItem(itemId); @@ -229,7 +230,7 @@ import 'css!./multiSelect'; icon: 'refresh' }); - import('actionsheet').then(({default: actionsheet}) => { + import('../actionSheet/actionSheet').then((actionsheet) => { actionsheet.show({ items: menuItems, positionTo: e.target, @@ -239,7 +240,7 @@ import 'css!./multiSelect'; switch (id) { case 'addtocollection': - import('collectionEditor').then(({default: collectionEditor}) => { + import('../collectionEditor/collectionEditor').then((collectionEditor) => { new collectionEditor({ items: items, serverId: serverId @@ -249,7 +250,7 @@ import 'css!./multiSelect'; dispatchNeedsRefresh(); break; case 'playlist': - import('playlistEditor').then(({default: playlistEditor}) => { + import('../playlisteditor/playlisteditor').then((laylistEditor) => { new playlistEditor({ items: items, serverId: serverId @@ -281,7 +282,7 @@ import 'css!./multiSelect'; dispatchNeedsRefresh(); break; case 'refresh': - import('refreshDialog').then(({default: refreshDialog}) => { + import('../refreshdialog/refreshdialog').then((refreshDialog) => { new refreshDialog({ itemIds: items, serverId: serverId @@ -317,7 +318,7 @@ import 'css!./multiSelect'; function combineVersions(apiClient, selection) { if (selection.length < 2) { - import('alert').then(({default: alert}) => { + import('../alert').then((alert) => { alert({ text: globalize.translate('PleaseSelectTwoItems') @@ -341,7 +342,7 @@ import 'css!./multiSelect'; } function showSelections(initialCard) { - import('emby-checkbox').then(() => { + import('../../elements/emby-checkbox/emby-checkbox').then(() => { const cards = document.querySelectorAll('.card'); for (let i = 0, length = cards.length; i < length; i++) { showSelection(cards[i], initialCard === cards[i]); diff --git a/src/components/notifications/notifications.js b/src/components/notifications/notifications.js index 7f0e68f1d..1eca2c380 100644 --- a/src/components/notifications/notifications.js +++ b/src/components/notifications/notifications.js @@ -1,7 +1,7 @@ -import serverNotifications from 'serverNotifications'; -import playbackManager from 'playbackManager'; -import events from 'events'; -import globalize from 'globalize'; +import serverNotifications from '../../scripts/serverNotifications'; +import playbackManager from '../playback/playbackmanager'; +import events from 'jellyfin-apiclient'; +import globalize from '../../scripts/globalize'; function onOneDocumentClick() { document.removeEventListener('click', onOneDocumentClick); diff --git a/src/components/nowPlayingBar/nowPlayingBar.js b/src/components/nowPlayingBar/nowPlayingBar.js index 40337d51e..9607fadcb 100644 --- a/src/components/nowPlayingBar/nowPlayingBar.js +++ b/src/components/nowPlayingBar/nowPlayingBar.js @@ -1,15 +1,16 @@ -import datetime from 'datetime'; -import events from 'events'; -import browser from 'browser'; -import imageLoader from 'imageLoader'; -import layoutManager from 'layoutManager'; -import playbackManager from 'playbackManager'; -import nowPlayingHelper from 'nowPlayingHelper'; -import appHost from 'apphost'; -import dom from 'dom'; -import itemContextMenu from 'itemContextMenu'; -import 'paper-icon-button-light'; -import 'emby-ratingbutton'; +import datetime from '../../scripts/datetime'; +import events from 'jellyfin-apiclient'; +import browser from '../../scripts/browser'; +import imageLoader from '../../scripts/imagehelper'; +import layoutManager from '../layoutManager'; +import playbackManager from '../playback/playbackmanager'; +import nowPlayingHelper from '../playback/nowplayinghelper'; +import appHost from '../apphost'; +import dom from '../../scripts/dom'; +import connectionManager from 'jellyfin-apiclient'; +import itemContextMenu from '../itemContextMenu'; +import '../../elements/emby-button/paper-icon-button-light'; +import '../../elements/emby-ratingbutton/emby-ratingbutton'; /* eslint-disable indent */ @@ -243,7 +244,7 @@ import 'emby-ratingbutton'; } function showRemoteControl() { - import('appRouter').then(({default: appRouter}) => { + import('../appRouter').then(({default: appRouter}) => { appRouter.showNowPlaying(); }); } @@ -256,10 +257,10 @@ import 'emby-ratingbutton'; return new Promise(function (resolve, reject) { Promise.all([ - import('appFooter'), - import('itemShortcuts'), - import('css!./nowPlayingBar.css'), - import('emby-slider') + import('../appFooter/appFooter'), + import('../shortcuts'), + import('./nowPlayingBar.css'), + import('../../elements/emby-slider/emby-slider') ]) .then(([appfooter, itemShortcuts]) => { const parentContainer = appfooter.element; diff --git a/src/components/packageManager.js b/src/components/packageManager.js index c4b4701e9..0fd5bb750 100644 --- a/src/components/packageManager.js +++ b/src/components/packageManager.js @@ -1,5 +1,5 @@ -import appSettings from 'appSettings'; -import pluginManager from 'pluginManager'; +import appSettings from '../scripts/settings/appSettings'; +import pluginManager from './pluginManager'; /* eslint-disable indent */ class PackageManager { diff --git a/src/components/playback/brightnessosd.js b/src/components/playback/brightnessosd.js index 78c40d10c..935656e23 100644 --- a/src/components/playback/brightnessosd.js +++ b/src/components/playback/brightnessosd.js @@ -1,9 +1,9 @@ -import events from 'events'; -import playbackManager from 'playbackManager'; -import dom from 'dom'; -import browser from 'browser'; -import 'css!./iconosd'; -import 'material-icons'; +import events from 'jellyfin-apiclient'; +import playbackManager from './playbackmanager'; +import dom from '../../scripts/dom'; +import browser from '../../scripts/browser'; +import './iconosd.css'; +import 'material-design-icons-iconfont'; let currentPlayer; let osdElement; diff --git a/src/components/playback/mediasession.js b/src/components/playback/mediasession.js index b75fa69a8..52ef5c36e 100644 --- a/src/components/playback/mediasession.js +++ b/src/components/playback/mediasession.js @@ -1,7 +1,7 @@ -import playbackManager from 'playbackManager'; -import nowPlayingHelper from 'nowPlayingHelper'; -import shell from 'shell'; -import events from 'events'; +import playbackManager from '../playback/playbackmanager'; +import nowPlayingHelper from '../playback/nowplayinghelper'; +import events from 'jellyfin-apiclient'; +import connectionManager from 'jellyfin-apiclient'; /* eslint-disable indent */ // Reports media playback to the device for lock screen control diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index 6fcc05ea6..af60dd61d 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -1,13 +1,14 @@ -import events from 'events'; -import datetime from 'datetime'; -import appSettings from 'appSettings'; -import itemHelper from 'itemHelper'; -import pluginManager from 'pluginManager'; -import PlayQueueManager from 'playQueueManager'; -import * as userSettings from 'userSettings'; -import globalize from 'globalize'; -import loading from 'loading'; -import appHost from 'apphost'; +import events from 'jellyfin-apiclient'; +import datetime from '../../scripts/datetime'; +import appSettings from '../../scripts/settings/appSettings'; +import itemHelper from '../itemHelper'; +import pluginManager from '../pluginManager'; +import PlayQueueManager from './playqueuemanager'; +import * as userSettings from '../../scripts/settings/userSettings'; +import globalize from '../../scripts/globalize'; +import connectionManager from 'jellyfin-apiclient'; +import loading from '../loading/loading'; +import appHost from '../apphost'; import screenfull from 'screenfull'; function enableLocalPlaylistManagement(player) { @@ -619,7 +620,7 @@ function supportsDirectPlay(apiClient, item, mediaSource) { } else if (mediaSource.Protocol === 'File') { return new Promise(function (resolve, reject) { // Determine if the file can be accessed directly - import('filesystem').then((filesystem) => { + import('../../scripts/filesystem').then((filesystem) => { const method = isFolderRip ? 'directoryExists' : 'fileExists'; @@ -647,7 +648,7 @@ function validatePlaybackInfoResult(instance, result) { } function showPlaybackInfoErrorMessage(instance, errorCode) { - import('alert').then(({ default: alert }) => { + import('../alert').then(({ default: alert }) => { alert({ text: globalize.translate(errorCode), title: globalize.translate('HeaderPlaybackError') @@ -1161,7 +1162,7 @@ class PlaybackManager { if (!brightnessOsdLoaded) { brightnessOsdLoaded = true; // TODO: Have this trigger an event instead to get the osd out of here - import('brightnessOsd').then(); + import('./brightnessosd').then(); } player.setBrightness(val); } @@ -3190,7 +3191,7 @@ class PlaybackManager { }; if (appHost.supports('remotecontrol')) { - import('serverNotifications').then(({ default: serverNotifications }) => { + import('../../scripts/serverNotifications').then((serverNotifications) => { events.on(serverNotifications, 'ServerShuttingDown', self.setDefaultPlayerActive.bind(self)); events.on(serverNotifications, 'ServerRestarting', self.setDefaultPlayerActive.bind(self)); }); diff --git a/src/components/playback/playbackorientation.js b/src/components/playback/playbackorientation.js index f585f25ae..6c44d5bbc 100644 --- a/src/components/playback/playbackorientation.js +++ b/src/components/playback/playbackorientation.js @@ -1,6 +1,7 @@ -import playbackManager from 'playbackManager'; -import layoutManager from 'layoutManager'; -import events from 'events'; + +import playbackManager from './playbackmanager'; +import layoutManager from '../layoutManager'; +import events from 'jellyfin-apiclient'; let orientationLocked; diff --git a/src/components/playback/playerSelectionMenu.js b/src/components/playback/playerSelectionMenu.js index 38ff399a9..1bd909025 100644 --- a/src/components/playback/playerSelectionMenu.js +++ b/src/components/playback/playerSelectionMenu.js @@ -1,12 +1,12 @@ -import appSettings from 'appSettings'; -import events from 'events'; -import browser from 'browser'; -import loading from 'loading'; -import playbackManager from 'playbackManager'; -import appRouter from 'appRouter'; -import globalize from 'globalize'; -import appHost from 'apphost'; -import * as autocast from 'autocast'; +import appSettings from '../../scripts/settings/appSettings'; +import events from 'jellyfin-apiclient'; +import browser from '../../scripts/browser'; +import loading from '../loading/loading'; +import playbackManager from '../playback/playbackmanager'; +import appRouter from '../appRouter'; +import globalize from '../../scripts/globalize'; +import appHost from '../apphost'; +import { enable, isEnabled, supported } from '../../scripts/autocast'; function mirrorItem(info, player) { const item = info.item; @@ -108,7 +108,7 @@ export function show(button) { }; }); - import('actionsheet').then(({default: actionsheet}) => { + import('../actionSheet/actionSheet').then((actionsheet) => { loading.hide(); const menuOptions = { @@ -141,10 +141,10 @@ export function show(button) { function showActivePlayerMenu(playerInfo) { Promise.all([ - import('dialogHelper'), - import('dialog'), - import('emby-checkbox'), - import('emby-button') + import('../dialogHelper/dialogHelper'), + import('../dialog/dialog'), + import('../../elements/emby-checkbox/emby-checkbox'), + import('../../elements/emby-button/emby-button') ]).then(([dialogHelper]) => { showActivePlayerMenuInternal(dialogHelper, playerInfo); }); @@ -152,7 +152,7 @@ function showActivePlayerMenu(playerInfo) { function disconnectFromPlayer(currentDeviceName) { if (playbackManager.getSupportedCommands().indexOf('EndSession') !== -1) { - import('dialog').then(({default: dialog}) => { + import('../dialog/dialog').then(({default: dialog}) => { const menuItems = []; menuItems.push({ @@ -222,9 +222,9 @@ function showActivePlayerMenuInternal(dialogHelper, playerInfo) { html += '
'; - if (autocast.supported()) { + if (supported()) { html += '
'; @@ -285,7 +285,7 @@ function onMirrorChange() { } function onAutoCastChange() { - autocast.enable(this.checked); + enable(this.checked); } document.addEventListener('viewshow', function (e) { diff --git a/src/components/playback/playersettingsmenu.js b/src/components/playback/playersettingsmenu.js index 40819f62e..acec83091 100644 --- a/src/components/playback/playersettingsmenu.js +++ b/src/components/playback/playersettingsmenu.js @@ -1,7 +1,8 @@ -import actionsheet from 'actionsheet'; -import playbackManager from 'playbackManager'; -import globalize from 'globalize'; -import qualityoptions from 'qualityoptions'; +import connectionManager from 'jellyfin-apiclient'; +import actionsheet from '../actionSheet/actionSheet'; +import playbackManager from '../playback/playbackmanager'; +import globalize from '../../scripts/globalize'; +import qualityoptions from '../qualityOptions'; function showQualityMenu(player, btn) { const videoStream = playbackManager.currentMediaSource(player).MediaStreams.filter(function (stream) { diff --git a/src/components/playback/remotecontrolautoplay.js b/src/components/playback/remotecontrolautoplay.js index c0adb57a4..532a71237 100644 --- a/src/components/playback/remotecontrolautoplay.js +++ b/src/components/playback/remotecontrolautoplay.js @@ -1,5 +1,5 @@ -import events from 'events'; -import playbackManager from 'playbackManager'; +import events from 'jellyfin-apiclient'; +import playbackManager from '../playback/playbackmanager'; function transferPlayback(oldPlayer, newPlayer) { const state = playbackManager.getPlayerState(oldPlayer); diff --git a/src/components/playback/volumeosd.js b/src/components/playback/volumeosd.js index c35914b19..9e8401783 100644 --- a/src/components/playback/volumeosd.js +++ b/src/components/playback/volumeosd.js @@ -1,9 +1,10 @@ -import events from 'events'; -import playbackManager from 'playbackManager'; -import dom from 'dom'; -import browser from 'browser'; -import 'css!./iconosd'; -import 'material-icons'; + +import events from 'jellyfin-apiclient'; +import playbackManager from './playbackmanager'; +import dom from '../../scripts/dom'; +import browser from '../../scripts/browser'; +import './iconosd.css'; +import 'material-design-icons-iconfont'; let currentPlayer; let osdElement; diff --git a/src/components/playbackSettings/playbackSettings.js b/src/components/playbackSettings/playbackSettings.js index 782e3d38e..4d123bb73 100644 --- a/src/components/playbackSettings/playbackSettings.js +++ b/src/components/playbackSettings/playbackSettings.js @@ -1,13 +1,14 @@ -import browser from 'browser'; -import appSettings from 'appSettings'; -import appHost from 'apphost'; -import focusManager from 'focusManager'; -import qualityoptions from 'qualityoptions'; -import globalize from 'globalize'; -import loading from 'loading'; -import events from 'events'; -import 'emby-select'; -import 'emby-checkbox'; +import browser from '../../scripts/browser'; +import appSettings from '../../scripts/settings/appSettings'; +import appHost from '../apphost'; +import focusManager from '../focusManager'; +import qualityoptions from '../qualityOptions'; +import globalize from '../../scripts/globalize'; +import loading from '../loading/loading'; +import connectionManager from 'jellyfin-apiclient'; +import events from 'jellyfin-apiclient'; +import '../../elements/emby-select/emby-select'; +import '../../elements/emby-checkbox/emby-checkbox'; /* eslint-disable indent */ @@ -243,7 +244,7 @@ import 'emby-checkbox'; saveUser(context, user, userSettings, apiClient).then(() => { loading.hide(); if (enableSaveConfirmation) { - import('toast').then(({default: toast}) => { + import('../toast/toast').then((toast) => { toast(globalize.translate('SettingsSaved')); }); } @@ -274,7 +275,7 @@ import 'emby-checkbox'; } function embed(options, self) { - return import('text!./playbackSettings.template.html').then(({default: template}) => { + return import('./playbackSettings.template.html').then(({default: template}) => { options.element.innerHTML = globalize.translateHtml(template, 'core'); options.element.querySelector('form').addEventListener('submit', onSubmit.bind(self)); diff --git a/src/components/playerstats/playerstats.js b/src/components/playerstats/playerstats.js index e100dee59..59f885f32 100644 --- a/src/components/playerstats/playerstats.js +++ b/src/components/playerstats/playerstats.js @@ -1,11 +1,12 @@ -import events from 'events'; -import globalize from 'globalize'; -import playbackManager from 'playbackManager'; -import syncPlayManager from 'syncPlayManager'; -import playMethodHelper from 'playMethodHelper'; -import layoutManager from 'layoutManager'; -import 'paper-icon-button-light'; -import 'css!./playerstats'; +import connectionManager from 'jellyfin-apiclient'; +import events from 'jellyfin-apiclient'; +import '../../elements/emby-button/paper-icon-button-light'; +import globalize from '../../scripts/globalize'; +import layoutManager from '../layoutManager'; +import playbackManager from '../playback/playbackmanager'; +import playMethodHelper from '../playback/playmethodhelper'; +import syncPlayManager from '../syncPlay/syncPlayManager'; +import './playerstats.css'; /* eslint-disable indent */ diff --git a/src/components/playlisteditor/playlisteditor.js b/src/components/playlisteditor/playlisteditor.js index dda9436a2..a3221ff3c 100644 --- a/src/components/playlisteditor/playlisteditor.js +++ b/src/components/playlisteditor/playlisteditor.js @@ -1,17 +1,18 @@ -import dom from 'dom'; -import dialogHelper from 'dialogHelper'; -import loading from 'loading'; -import layoutManager from 'layoutManager'; -import playbackManager from 'playbackManager'; -import * as userSettings from 'userSettings'; -import appRouter from 'appRouter'; -import globalize from 'globalize'; -import 'emby-input'; -import 'paper-icon-button-light'; -import 'emby-select'; -import 'material-icons'; -import 'css!./../formdialog'; -import 'emby-button'; +import dom from '../../scripts/dom'; +import dialogHelper from '../dialogHelper/dialogHelper'; +import loading from '../loading/loading'; +import layoutManager from '../layoutManager'; +import playbackManager from '../playback/playbackmanager'; +import connectionManager from 'jellyfin-apiclient'; +import * as userSettings from '../../scripts/settings/userSettings'; +import appRouter from '../appRouter'; +import globalize from '../../scripts/globalize'; +import '../../elements/emby-button/emby-button'; +import '../../elements/emby-input/emby-input'; +import '../../elements/emby-button/paper-icon-button-light'; +import '../../elements/emby-select/emby-select'; +import 'material-design-icons-iconfont'; +import '../formdialog.css'; /* eslint-disable indent */ @@ -209,7 +210,7 @@ import 'emby-button'; } function centerFocus(elem, horiz, on) { - import('scrollHelper').then((scrollHelper) => { + import('../../scripts/scrollHelper').then((scrollHelper) => { const fn = on ? 'on' : 'off'; scrollHelper.centerFocus[fn](elem, horiz); }); diff --git a/src/components/playmenu.js b/src/components/playmenu.js index 57ee5ca6e..8831b4d7b 100644 --- a/src/components/playmenu.js +++ b/src/components/playmenu.js @@ -1,7 +1,7 @@ -import actionsheet from 'actionsheet'; -import datetime from 'datetime'; -import playbackManager from 'playbackManager'; -import globalize from 'globalize'; +import actionsheet from './actionSheet/actionSheet'; +import datetime from '../scripts/datetime'; +import playbackManager from './playback/playbackmanager'; +import globalize from '../scripts/globalize'; export function show(options) { const item = options.item; diff --git a/src/components/pluginManager.js b/src/components/pluginManager.js index c07c77b73..116281c48 100644 --- a/src/components/pluginManager.js +++ b/src/components/pluginManager.js @@ -1,5 +1,5 @@ -import events from 'events'; -import globalize from 'globalize'; +import events from 'jellyfin-apiclient'; +import globalize from '../scripts/globalize'; /* eslint-disable indent */ // TODO: replace with each plugin version diff --git a/src/components/prompt/prompt.js b/src/components/prompt/prompt.js index 868f1d865..c2c52bd41 100644 --- a/src/components/prompt/prompt.js +++ b/src/components/prompt/prompt.js @@ -1,14 +1,14 @@ -import browser from 'browser'; -import dialogHelper from 'dialogHelper'; -import layoutManager from 'layoutManager'; -import scrollHelper from 'scrollHelper'; -import globalize from 'globalize'; -import dom from 'dom'; -import 'material-icons'; -import 'emby-button'; -import 'paper-icon-button-light'; -import 'emby-input'; -import 'formDialogStyle'; +import browser from '../../scripts/browser'; +import dialogHelper from '../dialogHelper/dialogHelper'; +import layoutManager from '../layoutManager'; +import scrollHelper from '../../scripts/scrollHelper'; +import globalize from '../../scripts/globalize'; +import dom from '../../scripts/dom'; +import 'material-design-icons-iconfont'; +import '../../elements/emby-button/emby-button'; +import '../../elements/emby-button/paper-icon-button-light'; +import '../../elements/emby-input/emby-input'; +import '../formdialog.css'; /* eslint-disable indent */ export default (() => { @@ -117,7 +117,7 @@ export default (() => { } else { return options => { return new Promise((resolve, reject) => { - import('text!./prompt.template.html').then(({default: template}) => { + import('./prompt.template.html').then(({default: template}) => { if (typeof options === 'string') { options = { title: '', diff --git a/src/components/qualityOptions.js b/src/components/qualityOptions.js index 93a8d5fe7..2037cb8cc 100644 --- a/src/components/qualityOptions.js +++ b/src/components/qualityOptions.js @@ -1,4 +1,4 @@ -import globalize from 'globalize'; +import globalize from '../scripts/globalize'; export function getVideoQualityOptions(options) { const maxStreamingBitrate = options.currentMaxBitrate; diff --git a/src/components/recordingcreator/recordingbutton.js b/src/components/recordingcreator/recordingbutton.js index dc7da836d..a898cf4a5 100644 --- a/src/components/recordingcreator/recordingbutton.js +++ b/src/components/recordingcreator/recordingbutton.js @@ -1,8 +1,9 @@ -import dom from 'dom'; -import recordingHelper from 'recordingHelper'; -import 'paper-icon-button-light'; -import 'emby-button'; -import 'css!./recordingfields'; +import connectionManager from 'jellyfin-apiclient'; +import dom from '../../scripts/dom'; +import recordingHelper from './recordinghelper'; +import '../../elements/emby-button/paper-icon-button-light'; +import '../../elements/emby-button/emby-button'; +import './recordingfields.css'; function onRecordingButtonClick(e) { const item = this.item; diff --git a/src/components/recordingcreator/recordingcreator.js b/src/components/recordingcreator/recordingcreator.js index 27ad0584d..fe5b506c9 100644 --- a/src/components/recordingcreator/recordingcreator.js +++ b/src/components/recordingcreator/recordingcreator.js @@ -1,22 +1,22 @@ -import dialogHelper from 'dialogHelper'; -import globalize from 'globalize'; -import layoutManager from 'layoutManager'; -import mediaInfo from 'mediaInfo'; -import require from 'require'; -import loading from 'loading'; -import scrollHelper from 'scrollHelper'; -import datetime from 'datetime'; -import imageLoader from 'imageLoader'; -import recordingFields from 'recordingFields'; -import events from 'events'; -import 'emby-checkbox'; -import 'emby-button'; -import 'emby-collapse'; -import 'emby-input'; -import 'paper-icon-button-light'; -import 'css!./../formdialog'; -import 'css!./recordingcreator'; -import 'material-icons'; +import dialogHelper from '../dialogHelper/dialogHelper'; +import globalize from '../../scripts/globalize'; +import layoutManager from '../layoutManager'; +import mediaInfo from '../mediainfo/mediainfo'; +import connectionManager from 'jellyfin-apiclient'; +import loading from '../loading/loading'; +import scrollHelper from '../../scripts/scrollHelper'; +import datetime from '../../scripts/datetime'; +import imageLoader from '../images/imageLoader'; +import recordingFields from './recordingfields'; +import events from 'jellyfin-apiclient'; +import '../../elements/emby-button/emby-button'; +import '../../elements/emby-button/paper-icon-button-light'; +import '../../elements/emby-checkbox/emby-checkbox'; +import '../../elements/emby-collapse/emby-collapse'; +import '../../elements/emby-input/emby-input'; +import '../formdialog.css'; +import './recordingcreator.css'; +import 'material-design-icons-iconfont'; let currentDialog; let closeAction; @@ -68,7 +68,7 @@ function renderRecording(context, defaultTimer, program, apiClient, refreshRecor const imageContainer = context.querySelector('.recordingDialog-imageContainer'); if (imgUrl) { - imageContainer.innerHTML = ''; + imageContainer.innerHTML = ''; imageContainer.classList.remove('hide'); imageLoader.lazyChildren(imageContainer); @@ -117,8 +117,8 @@ function reload(context, programId, serverId, refreshRecordingStateOnly) { function executeCloseAction(action, programId, serverId) { if (action === 'play') { - import('playbackManager').then(({ default: playbackManager }) => { - const apiClient = window.connectionManager.getApiClient(serverId); + import('../playback/playbackmanager').then(({ default: playbackManager }) => { + const apiClient = connectionManager.getApiClient(serverId); apiClient.getLiveTvProgram(programId, apiClient.getCurrentUserId()).then(function (item) { playbackManager.play({ @@ -137,7 +137,7 @@ function showEditor(itemId, serverId) { loading.show(); - import('text!./recordingcreator.template.html').then(({ default: template }) => { + import('./recordingcreator.template.html').then(({ default: template }) => { const dialogOptions = { removeOnClose: true, scrollY: false diff --git a/src/components/recordingcreator/recordingeditor.js b/src/components/recordingcreator/recordingeditor.js index 37b55e4ee..6c5a380d1 100644 --- a/src/components/recordingcreator/recordingeditor.js +++ b/src/components/recordingcreator/recordingeditor.js @@ -1,17 +1,19 @@ -import dialogHelper from 'dialogHelper'; -import globalize from 'globalize'; -import layoutManager from 'layoutManager'; -import loading from 'loading'; -import scrollHelper from 'scrollHelper'; -import 'scrollStyles'; -import 'emby-button'; -import 'emby-collapse'; -import 'emby-input'; -import 'paper-icon-button-light'; -import 'css!./../formdialog'; -import 'css!./recordingcreator'; -import 'material-icons'; -import 'flexStyles'; + +import dialogHelper from '../dialogHelper/dialogHelper'; +import globalize from '../../scripts/globalize'; +import layoutManager from '../layoutManager'; +import connectionManager from 'jellyfin-apiclient'; +import loading from '../loading/loading'; +import scrollHelper from '../../scripts/scrollHelper'; +import '../../assets/css/scrollstyles.css'; +import '../../elements/emby-button/emby-button'; +import '../../elements/emby-collapse/emby-collapse'; +import '../../elements/emby-input/emby-input'; +import '../../elements/emby-button/paper-icon-button-light'; +import '../formdialog.css'; +import './recordingcreator.css'; +import 'material-design-icons-iconfont'; +import '../../assets/css/flexstyles.css'; let currentDialog; let recordingDeleted = false; @@ -20,7 +22,7 @@ let currentServerId; let currentResolve; function deleteTimer(apiClient, timerId) { - return import('recordingHelper').then(({ default: recordingHelper }) => { + return import('./recordinghelper').then((recordingHelper) => { recordingHelper.cancelTimerWithConfirmation(timerId, apiClient.serverId()); }); } @@ -89,7 +91,7 @@ function showEditor(itemId, serverId, options) { options = options || {}; currentResolve = resolve; - import('text!./recordingeditor.template.html').then(({default: template}) => { + import('./recordingeditor.template.html').then(({default: template}) => { const dialogOptions = { removeOnClose: true, scrollY: false diff --git a/src/components/recordingcreator/recordingfields.js b/src/components/recordingcreator/recordingfields.js index 9b3f0d16a..39e549ee8 100644 --- a/src/components/recordingcreator/recordingfields.js +++ b/src/components/recordingcreator/recordingfields.js @@ -1,13 +1,14 @@ -import globalize from 'globalize'; -import serverNotifications from 'serverNotifications'; -import loading from 'loading'; -import dom from 'dom'; -import recordingHelper from 'recordingHelper'; -import events from 'events'; -import 'paper-icon-button-light'; -import 'emby-button'; -import 'css!./recordingfields'; -import 'flexStyles'; +import globalize from '../../scripts/globalize'; +import connectionManager from 'jellyfin-apiclient'; +import serverNotifications from '../../scripts/serverNotifications'; +import loading from '../loading/loading'; +import dom from '../../scripts/dom'; +import recordingHelper from './recordinghelper'; +import events from 'jellyfin-apiclient'; +import '../../elements/emby-button/emby-button'; +import '../../elements/emby-button/paper-icon-button-light'; +import './recordingfields.css'; +import '../../assets/css/flexstyles.css'; /*eslint prefer-const: "error"*/ @@ -117,7 +118,7 @@ class RecordingEditor { embed() { const self = this; return new Promise(function (resolve, reject) { - import('text!./recordingfields.template.html').then(({default: template}) => { + import('./recordingfields.template.html').then(({default: template}) => { const options = self.options; const context = options.parent; context.innerHTML = globalize.translateHtml(template, 'core'); @@ -162,7 +163,7 @@ function onManageRecordingClick(e) { } const self = this; - import('recordingEditor').then(({default: recordingEditor}) => { + import('./recordingeditor').then((recordingEditor) => { recordingEditor.show(self.TimerId, options.serverId, { enableCancel: false }).then(function () { @@ -180,7 +181,7 @@ function onManageSeriesRecordingClick(e) { const self = this; - import('seriesRecordingEditor').then(({default: seriesRecordingEditor}) => { + import('./seriesrecordingeditor').then((seriesRecordingEditor) => { seriesRecordingEditor.show(self.SeriesTimerId, options.serverId, { enableCancel: false @@ -225,7 +226,7 @@ function onRecordChange(e) { } function sendToast(msg) { - import('toast').then(({default: toast}) => { + import('../toast/toast').then((toast) => { toast(msg); }); } diff --git a/src/components/recordingcreator/recordinghelper.js b/src/components/recordingcreator/recordinghelper.js index 495378106..8ba1c4dfe 100644 --- a/src/components/recordingcreator/recordinghelper.js +++ b/src/components/recordingcreator/recordinghelper.js @@ -1,5 +1,6 @@ -import globalize from 'globalize'; -import loading from 'loading'; +import globalize from '../../scripts/globalize'; +import loading from '../loading/loading'; +import connectionManager from 'jellyfin-apiclient'; /*eslint prefer-const: "error"*/ @@ -28,7 +29,7 @@ function changeRecordingToSeries(apiClient, timerId, programId, confirmTimerCanc function cancelTimerWithConfirmation(timerId, serverId) { return new Promise(function (resolve, reject) { - import('confirm').then(({ default: confirm }) => { + import('../confirm/confirm').then((confirm) => { confirm.default({ text: globalize.translate('MessageConfirmRecordingCancellation'), @@ -48,7 +49,7 @@ function cancelTimerWithConfirmation(timerId, serverId) { function cancelSeriesTimerWithConfirmation(timerId, serverId) { return new Promise(function (resolve, reject) { - import('confirm').then(({ default: confirm }) => { + import('../confirm/confirm').then((confirm) => { confirm.default({ text: globalize.translate('MessageConfirmRecordingCancellation'), @@ -61,7 +62,7 @@ function cancelSeriesTimerWithConfirmation(timerId, serverId) { const apiClient = window.connectionManager.getApiClient(serverId); apiClient.cancelLiveTvSeriesTimer(timerId).then(function () { - import('toast').then(({default: toast}) => { + import('../toast/toast').then((toast) => { toast(globalize.translate('SeriesCancelled')); }); @@ -98,14 +99,14 @@ function createRecording(apiClient, programId, isSeries) { } function sendToast(msg) { - import('toast').then(({ default: toast }) => { + import('../toast/toast').then((toast) => { toast(msg); }); } function showMultiCancellationPrompt(serverId, programId, timerId, timerStatus, seriesTimerId) { return new Promise(function (resolve, reject) { - import('dialog').then(({ default: dialog }) => { + import('../dialog/dialog').then((dialog) => { const items = []; items.push({ @@ -150,7 +151,7 @@ function showMultiCancellationPrompt(serverId, programId, timerId, timerStatus, loading.show(); apiClient.cancelLiveTvSeriesTimer(seriesTimerId).then(function () { - import('toast').then(({ default: toast }) => { + import('../toast/toast').then((toast) => { toast(globalize.translate('SeriesCancelled')); }); diff --git a/src/components/recordingcreator/seriesrecordingeditor.js b/src/components/recordingcreator/seriesrecordingeditor.js index e3a6ae685..6b887280e 100644 --- a/src/components/recordingcreator/seriesrecordingeditor.js +++ b/src/components/recordingcreator/seriesrecordingeditor.js @@ -1,19 +1,20 @@ -import dialogHelper from 'dialogHelper'; -import globalize from 'globalize'; -import layoutManager from 'layoutManager'; -import loading from 'loading'; -import scrollHelper from 'scrollHelper'; -import datetime from 'datetime'; -import 'scrollStyles'; -import 'emby-button'; -import 'emby-checkbox'; -import 'emby-input'; -import 'emby-select'; -import 'paper-icon-button-light'; -import 'css!./../formdialog'; -import 'css!./recordingcreator'; -import 'material-icons'; -import 'flexStyles'; +import dialogHelper from '../dialogHelper/dialogHelper'; +import globalize from '../../scripts/globalize'; +import layoutManager from '../layoutManager'; +import connectionManager from 'jellyfin-apiclient'; +import loading from '../loading/loading'; +import scrollHelper from '../../scripts/scrollHelper'; +import datetime from '../../scripts/datetime'; +import '../../assets/css/scrollstyles.css'; +import '../../elements/emby-button/emby-button'; +import '../../elements/emby-checkbox/emby-checkbox'; +import '../../elements/emby-input/emby-input'; +import '../../elements/emby-select/emby-select'; +import '../../elements/emby-button/paper-icon-button-light'; +import '../formdialog.css'; +import './recordingcreator.css'; +import 'material-design-icons-iconfont'; +import '../../assets/css/flexstyles.css'; /*eslint prefer-const: "error"*/ @@ -25,7 +26,7 @@ let currentServerId; function deleteTimer(apiClient, timerId) { return new Promise(function (resolve, reject) { - import('recordingHelper').then(({ default: recordingHelper }) => { + import('./recordinghelper').then((recordingHelper) => { recordingHelper.cancelSeriesTimerWithConfirmation(timerId, apiClient.serverId()).then(resolve, reject); }); }); @@ -150,7 +151,7 @@ function embed(itemId, serverId, options) { loading.show(); options = options || {}; - import('text!./seriesrecordingeditor.template.html').then(({ default: template }) => { + import('./seriesrecordingeditor.template.html').then(({ default: template }) => { const dialogOptions = { removeOnClose: true, scrollY: false @@ -192,7 +193,7 @@ function showEditor(itemId, serverId, options) { loading.show(); options = options || {}; - import('text!./seriesrecordingeditor.template.html').then(({ default: template }) => { + import('./seriesrecordingeditor.template.html').then(({ default: template }) => { const dialogOptions = { removeOnClose: true, scrollY: false diff --git a/src/components/refreshdialog/refreshdialog.js b/src/components/refreshdialog/refreshdialog.js index e5ceb1e6e..1338e4b72 100644 --- a/src/components/refreshdialog/refreshdialog.js +++ b/src/components/refreshdialog/refreshdialog.js @@ -1,15 +1,16 @@ -import dom from 'dom'; -import dialogHelper from 'dialogHelper'; -import loading from 'loading'; -import layoutManager from 'layoutManager'; -import globalize from 'globalize'; -import 'emby-input'; -import 'emby-checkbox'; -import 'paper-icon-button-light'; -import 'emby-select'; -import 'material-icons'; -import 'css!./../formdialog'; -import 'emby-button'; +import dom from '../../scripts/dom'; +import dialogHelper from '../dialogHelper/dialogHelper'; +import loading from '../loading/loading'; +import layoutManager from '../layoutManager'; +import connectionManager from 'jellyfin-apiclient'; +import globalize from '../../scripts/globalize'; +import '../../elements/emby-input/emby-input'; +import '../../elements/emby-button/emby-button'; +import '../../elements/emby-button/paper-icon-button-light'; +import '../../elements/emby-checkbox/emby-checkbox'; +import '../../elements/emby-select/emby-select'; +import 'material-design-icons-iconfont'; +import '../formdialog.css'; /*eslint prefer-const: "error"*/ @@ -52,7 +53,7 @@ function getEditorHtml() { } function centerFocus(elem, horiz, on) { - import('scrollHelper').then(({default: scrollHelper}) => { + import('../../scripts/scrollHelper').then((scrollHelper) => { const fn = on ? 'on' : 'off'; scrollHelper.centerFocus[fn](elem, horiz); }); @@ -85,7 +86,7 @@ function onSubmit(e) { dialogHelper.close(dlg); - import('toast').then(({default: toast}) => { + import('../toast/toast').then((toast) => { toast(globalize.translate('RefreshQueued')); }); diff --git a/src/components/remotecontrol/remotecontrol.js b/src/components/remotecontrol/remotecontrol.js index ac9ceaae0..eb897d1fe 100644 --- a/src/components/remotecontrol/remotecontrol.js +++ b/src/components/remotecontrol/remotecontrol.js @@ -1,20 +1,21 @@ -import datetime from 'datetime'; -import backdrop from 'backdrop'; -import listView from 'listView'; -import imageLoader from 'imageLoader'; -import playbackManager from 'playbackManager'; -import nowPlayingHelper from 'nowPlayingHelper'; -import events from 'events'; -import appHost from 'apphost'; -import globalize from 'globalize'; -import layoutManager from 'layoutManager'; -import * as userSettings from 'userSettings'; -import cardBuilder from 'cardBuilder'; -import itemContextMenu from 'itemContextMenu'; -import 'cardStyle'; -import 'emby-itemscontainer'; -import 'css!./remotecontrol.css'; -import 'emby-ratingbutton'; +import datetime from '../../scripts/datetime'; +import backdrop from '../backdrop/backdrop'; +import listView from '../listview/listview'; +import imageLoader from '../images/imageLoader'; +import playbackManager from '../playback/playbackmanager'; +import nowPlayingHelper from '../playback/nowplayinghelper'; +import events from 'jellyfin-apiclient'; +import connectionManager from 'jellyfin-apiclient'; +import appHost from '../apphost'; +import globalize from '../../scripts/globalize'; +import layoutManager from '../layoutManager'; +import * as userSettings from '../../scripts/settings/userSettings'; +import cardBuilder from '../cardbuilder/cardBuilder'; +import itemContextMenu from '../itemContextMenu'; +import '../cardbuilder/card.css'; +import '../../elements/emby-itemscontainer/emby-itemscontainer'; +import './remotecontrol.css'; +import '../../elements/emby-ratingbutton/emby-ratingbutton'; /*eslint prefer-const: "error"*/ @@ -37,7 +38,7 @@ function showAudioMenu(context, player, button, item) { return menuItem; }); - import('actionsheet').then(({ default: actionsheet }) => { + import('../actionSheet/actionSheet').then((actionsheet) => { actionsheet.show({ items: menuItems, positionTo: button, @@ -69,7 +70,7 @@ function showSubtitleMenu(context, player, button, item) { selected: currentIndex == null }); - import('actionsheet').then(({ default: actionsheet }) => { + import('../actionSheet/actionSheet').then((actionsheet) => { actionsheet.show({ items: menuItems, positionTo: button, @@ -693,7 +694,7 @@ export default function () { } function savePlaylist() { - import('playlistEditor').then(({ default: playlistEditor }) => { + import('../playlisteditor/playlisteditor').then((playlistEditor) => { getSaveablePlaylistItems().then(function (items) { const serverId = items.length ? items[0].ServerId : ApiClient.serverId(); new playlistEditor({ @@ -863,7 +864,7 @@ export default function () { }, currentPlayer); form.querySelector('input').value = ''; - import('toast').then(({ default: toast }) => { + import('../toast/toast').then((toast) => { toast('Message sent.'); }); @@ -882,7 +883,7 @@ export default function () { }, currentPlayer); form.querySelector('input').value = ''; - import('toast').then(({ default: toast }) => { + import('../toast/toast').then((toast) => { toast('Text sent.'); }); diff --git a/src/components/scrollManager.js b/src/components/scrollManager.js index 549cb9445..51a718476 100644 --- a/src/components/scrollManager.js +++ b/src/components/scrollManager.js @@ -5,9 +5,9 @@ * @module components/scrollManager */ -import dom from 'dom'; -import browser from 'browser'; -import layoutManager from 'layoutManager'; +import dom from '../scripts/dom'; +import browser from '../scripts/browser'; +import layoutManager from './layoutManager'; /** * Scroll time in ms. @@ -223,7 +223,7 @@ import layoutManager from 'layoutManager'; let parent = element.parentElement; while (parent) { - // Skip 'emby-scroller' because it scrolls by itself + // Skip '../../elements/emby-scroller/emby-scroller' because it scrolls by itself if (!parent.classList.contains('emby-scroller') && parent[nameScroll] > parent[nameClient] && parent.classList.contains(nameClass)) { return parent; diff --git a/src/components/search/searchfields.js b/src/components/search/searchfields.js index b3cb3cf4c..3b985c05a 100644 --- a/src/components/search/searchfields.js +++ b/src/components/search/searchfields.js @@ -1,12 +1,12 @@ -import layoutManager from 'layoutManager'; -import globalize from 'globalize'; -import events from 'events'; -import browser from 'browser'; -import AlphaPicker from 'alphaPicker'; -import 'emby-input'; -import 'flexStyles'; -import 'material-icons'; -import 'css!./searchfields'; +import layoutManager from '../layoutManager'; +import globalize from '../../scripts/globalize'; +import events from 'jellyfin-apiclient'; +import browser from '../../scripts/browser'; +import AlphaPicker from '../alphaPicker/alphaPicker'; +import '../../elements/emby-input/emby-input'; +import '../../assets/css/flexstyles.css'; +import 'material-design-icons-iconfont'; +import './searchfields.css'; /* eslint-disable indent */ @@ -61,7 +61,7 @@ import 'css!./searchfields'; } function embed(elem, instance, options) { - import('text!./searchfields.template.html').then(({default: template}) => { + import('./searchfields.template.html').then(({default: template}) => { let html = globalize.translateHtml(template, 'core'); if (browser.tizen || browser.orsay) { diff --git a/src/components/search/searchresults.js b/src/components/search/searchresults.js index d35868d43..9fe1e7b60 100644 --- a/src/components/search/searchresults.js +++ b/src/components/search/searchresults.js @@ -1,10 +1,11 @@ -import layoutManager from 'layoutManager'; -import globalize from 'globalize'; -import cardBuilder from 'cardBuilder'; -import appRouter from 'appRouter'; -import 'emby-scroller'; -import 'emby-itemscontainer'; -import 'emby-button'; +import layoutManager from '../layoutManager'; +import globalize from '../../scripts/globalize'; +import connectionManager from 'jellyfin-apiclient'; +import cardBuilder from '../cardbuilder/cardBuilder'; +import appRouter from '../appRouter'; +import '../../elements/emby-scroller/emby-scroller'; +import '../../elements/emby-itemscontainer/emby-itemscontainer'; +import '../../elements/emby-button/emby-button'; /* eslint-disable indent */ @@ -584,7 +585,7 @@ import 'emby-button'; } function embed(elem, instance, options) { - import('text!./searchresults.template.html').then(({default: template}) => { + import('./searchresults.template.html').then(({default: template}) => { if (!enableScrollX()) { template = replaceAll(template, 'data-horizontal="true"', 'data-horizontal="false"'); template = replaceAll(template, 'itemsContainer scrollSlider', 'itemsContainer scrollSlider vertical-wrap'); diff --git a/src/components/settingshelper.js b/src/components/settingshelper.js index 3db638c7a..ca78369ed 100644 --- a/src/components/settingshelper.js +++ b/src/components/settingshelper.js @@ -1,4 +1,4 @@ -import globalize from 'globalize'; +import globalize from '../scripts/globalize'; /** * Helper for handling settings. diff --git a/src/components/shortcuts.js b/src/components/shortcuts.js index 2959fd337..2f83a342f 100644 --- a/src/components/shortcuts.js +++ b/src/components/shortcuts.js @@ -5,12 +5,13 @@ * @module components/shortcuts */ -import playbackManager from 'playbackManager'; -import inputManager from 'inputManager'; -import appRouter from 'appRouter'; -import globalize from 'globalize'; -import dom from 'dom'; -import recordingHelper from 'recordingHelper'; +import playbackManager from './playback/playbackmanager'; +import inputManager from '../scripts/inputManager'; +import connectionManager from 'jellyfin-apiclient'; +import appRouter from './appRouter'; +import globalize from '../scripts/globalize'; +import dom from '../scripts/dom'; +import recordingHelper from './recordingcreator/recordinghelper'; function playAllFromHere(card, serverId, queue) { const parent = card.parentNode; @@ -69,7 +70,8 @@ import recordingHelper from 'recordingHelper'; } function showProgramDialog(item) { - import('recordingCreator').then(({default:recordingCreator}) => { + import('./recordingcreator/recordingcreator' + + '').then(({default:recordingCreator}) => { recordingCreator.show(item.Id, item.ServerId); }); } @@ -109,7 +111,7 @@ import recordingHelper from 'recordingHelper'; item.PlaylistItemId = elem ? elem.getAttribute('data-playlistitemid') : null; } - import('itemContextMenu').then(({default: itemContextMenu}) => { + import('./itemContextMenu').then((itemContextMenu) => { window.connectionManager.getApiClient(item.ServerId).getCurrentUser().then(user => { itemContextMenu.show(Object.assign({ item: item, @@ -153,7 +155,7 @@ import recordingHelper from 'recordingHelper'; function showPlayMenu(card, target) { const item = getItemInfoFromCard(card); - import('playMenu').then(({default: playMenu}) => { + import('./playmenu').then((playMenu) => { playMenu.show({ item: item, @@ -163,7 +165,7 @@ import recordingHelper from 'recordingHelper'; } function sendToast(text) { - import('toast').then(({default: toast}) => { + import('./toast/toast').then((toast) => { toast(text); }); } @@ -269,7 +271,7 @@ import recordingHelper from 'recordingHelper'; } function addToPlaylist(item) { - import('playlistEditor').then(({default: playlistEditor}) => { + import('./playlisteditor/playlisteditor').then((playlistEditor) => { new playlistEditor().show({ items: [item.Id], serverId: item.ServerId @@ -294,16 +296,16 @@ import recordingHelper from 'recordingHelper'; if (item.Type === 'Timer') { if (item.ProgramId) { - import('recordingCreator').then(({default: recordingCreator}) => { + import('./recordingcreator/recordingcreator').then((recordingCreator) => { recordingCreator.show(item.ProgramId, serverId).then(resolve, reject); }); } else { - import('recordingEditor').then(({default: recordingEditor}) => { + import('./recordingcreator/recordingeditor').then((recordingEditor) => { recordingEditor.show(item.Id, serverId).then(resolve, reject); }); } } else { - import('metadataEditor').then(({default: metadataEditor}) => { + import('./metadataEditor/metadataEditor').then((metadataEditor) => { metadataEditor.show(item.Id, serverId).then(resolve, reject); }); } diff --git a/src/components/slideshow/slideshow.js b/src/components/slideshow/slideshow.js index 028c21b22..a33e06b27 100644 --- a/src/components/slideshow/slideshow.js +++ b/src/components/slideshow/slideshow.js @@ -2,16 +2,17 @@ * Image viewer component * @module components/slideshow/slideshow */ -import dialogHelper from 'dialogHelper'; -import inputManager from 'inputManager'; -import layoutManager from 'layoutManager'; -import focusManager from 'focusManager'; -import browser from 'browser'; -import appHost from 'apphost'; -import dom from 'dom'; -import 'css!./style'; -import 'material-icons'; -import 'paper-icon-button-light'; +import dialogHelper from '../dialogHelper/dialogHelper'; +import inputManager from '../../scripts/inputManager'; +import connectionManager from 'jellyfin-apiclient'; +import layoutManager from '../layoutManager'; +import focusManager from '../focusManager'; +import browser from '../../scripts/browser'; +import appHost from '../apphost'; +import dom from '../../scripts/dom'; +import './style.css'; +import 'material-design-icons-iconfont'; +import '../../elements/emby-button/paper-icon-button-light'; /** * Name of transition event. @@ -431,7 +432,7 @@ export default function (options) { function download() { const imageInfo = getCurrentImageInfo(); - import('fileDownloader').then(({default: fileDownloader}) => { + import('../../scripts/fileDownloader').then((fileDownloader) => { fileDownloader.download([imageInfo]); }); } diff --git a/src/components/sortmenu/sortmenu.js b/src/components/sortmenu/sortmenu.js index d38d98c09..110844845 100644 --- a/src/components/sortmenu/sortmenu.js +++ b/src/components/sortmenu/sortmenu.js @@ -1,13 +1,13 @@ -import dialogHelper from 'dialogHelper'; -import layoutManager from 'layoutManager'; -import globalize from 'globalize'; -import * as userSettings from 'userSettings'; -import 'emby-select'; -import 'paper-icon-button-light'; -import 'material-icons'; -import 'css!./../formdialog'; -import 'emby-button'; -import 'flexStyles'; +import dialogHelper from '../dialogHelper/dialogHelper'; +import layoutManager from '../layoutManager'; +import globalize from '../../scripts/globalize'; +import * as userSettings from '../../scripts/settings/userSettings'; +import '../../elements/emby-select/emby-select'; +import '../../elements/emby-button/paper-icon-button-light'; +import 'material-design-icons-iconfont'; +import '../formdialog.css'; +import '../../elements/emby-button/emby-button'; +import '../../assets/css/flexstyles.css'; function onSubmit(e) { e.preventDefault(); @@ -22,7 +22,7 @@ function initEditor(context, settings) { } function centerFocus(elem, horiz, on) { - import('scrollHelper').then(({default: scrollHelper}) => { + import('../../scripts/scrollHelper').then((scrollHelper) => { const fn = on ? 'on' : 'off'; scrollHelper.centerFocus[fn](elem, horiz); }); @@ -44,7 +44,7 @@ function saveValues(context, settingsKey) { class SortMenu { show(options) { return new Promise(function (resolve, reject) { - import('text!./sortmenu.template.html').then(({default: template}) => { + import('./sortmenu.template.html').then(({default: template}) => { const dialogOptions = { removeOnClose: true, scrollY: false diff --git a/src/components/subtitleeditor/subtitleeditor.js b/src/components/subtitleeditor/subtitleeditor.js index 8e6fb497d..6a53b4f54 100644 --- a/src/components/subtitleeditor/subtitleeditor.js +++ b/src/components/subtitleeditor/subtitleeditor.js @@ -1,19 +1,20 @@ -import appHost from 'apphost'; -import dialogHelper from 'dialogHelper'; -import layoutManager from 'layoutManager'; -import globalize from 'globalize'; -import * as userSettings from 'userSettings'; -import loading from 'loading'; -import focusManager from 'focusManager'; -import dom from 'dom'; -import 'emby-select'; -import 'listViewStyle'; -import 'paper-icon-button-light'; -import 'css!./../formdialog'; -import 'material-icons'; -import 'css!./subtitleeditor'; -import 'emby-button'; -import 'flexStyles'; +import appHost from '../apphost'; +import dialogHelper from '../dialogHelper/dialogHelper'; +import layoutManager from '../layoutManager'; +import globalize from '../../scripts/globalize'; +import * as userSettings from '../../scripts/settings/userSettings'; +import connectionManager from 'jellyfin-apiclient'; +import loading from '../loading/loading'; +import focusManager from '../focusManager'; +import dom from '../../scripts/dom'; +import '../../elements/emby-select/emby-select'; +import '../listview/listview.css'; +import '../../elements/emby-button/paper-icon-button-light'; +import '../formdialog.css'; +import 'material-design-icons-iconfont'; +import './subtitleeditor.css'; +import '../../elements/emby-button/emby-button'; +import '../../assets/css/flexstyles.css'; let currentItem; let hasChanges; @@ -30,7 +31,7 @@ function downloadRemoteSubtitles(context, id) { }).then(function () { hasChanges = true; - import('toast').then(({default: toast}) => { + import('../toast/toast').then((toast) => { toast(globalize.translate('MessageDownloadQueued')); }); @@ -41,7 +42,7 @@ function downloadRemoteSubtitles(context, id) { function deleteLocalSubtitle(context, index) { const msg = globalize.translate('MessageAreYouSureDeleteSubtitles'); - import('confirm').then(({default: confirm}) => { + import('../confirm/confirm').then((confirm) => { confirm({ title: globalize.translate('ConfirmDeletion'), @@ -329,7 +330,7 @@ function showDownloadOptions(button, context, subtitleId) { id: 'download' }); - import('actionsheet').then(({default: actionsheet}) => { + import('../actionSheet/actionSheet').then((actionsheet) => { actionsheet.show({ items: items, positionTo: button @@ -347,7 +348,7 @@ function showDownloadOptions(button, context, subtitleId) { } function centerFocus(elem, horiz, on) { - import('scrollHelper').then(({default: scrollHelper}) => { + import('../../scripts/scrollHelper').then(({default: scrollHelper}) => { const fn = on ? 'on' : 'off'; scrollHelper.centerFocus[fn](elem, horiz); }); @@ -431,7 +432,7 @@ function showEditor(itemId, serverId) { loading.show(); return new Promise(function (resolve, reject) { - import('text!./subtitleeditor.template.html').then(({default: template}) => { + import('./subtitleeditor.template.html').then(({default: template}) => { showEditorInternal(itemId, serverId, template).then(resolve, reject); }); }); diff --git a/src/components/subtitlesettings/subtitlesettings.js b/src/components/subtitlesettings/subtitlesettings.js index 0e2c4e366..3462d9542 100644 --- a/src/components/subtitlesettings/subtitlesettings.js +++ b/src/components/subtitlesettings/subtitlesettings.js @@ -1,20 +1,21 @@ -import globalize from 'globalize'; -import appHost from 'apphost'; -import appSettings from 'appSettings'; -import focusManager from 'focusManager'; -import layoutManager from 'layoutManager'; -import loading from 'loading'; -import subtitleAppearanceHelper from 'subtitleAppearanceHelper'; -import settingsHelper from 'settingsHelper'; -import dom from 'dom'; -import events from 'events'; -import 'listViewStyle'; -import 'emby-select'; -import 'emby-slider'; -import 'emby-input'; -import 'emby-checkbox'; -import 'flexStyles'; -import 'css!./subtitlesettings'; +import globalize from '../../scripts/globalize'; +import appHost from '../apphost'; +import appSettings from '../../scripts/settings/appSettings'; +import focusManager from '../focusManager'; +import layoutManager from '../layoutManager'; +import loading from '../loading/loading'; +import connectionManager from 'jellyfin-apiclient'; +import subtitleAppearanceHelper from './subtitleappearancehelper'; +import settingsHelper from '../settingshelper'; +import dom from '../../scripts/dom'; +import events from 'jellyfin-apiclient'; +import '../listview/listview.css'; +import '../../elements/emby-select/emby-select'; +import '../../elements/emby-slider/emby-slider'; +import '../../elements/emby-input/emby-input'; +import '../../elements/emby-checkbox/emby-checkbox'; +import '../../assets/css/flexstyles.css'; +import './subtitlesettings.css'; /** * Subtitle settings. @@ -87,7 +88,7 @@ function save(instance, context, userId, userSettings, apiClient, enableSaveConf saveUser(context, user, userSettings, instance.appearanceKey, apiClient).then(function () { loading.hide(); if (enableSaveConfirmation) { - import('toast').then(({default: toast}) => { + import('../toast/toast').then((toast) => { toast(globalize.translate('SettingsSaved')); }); } @@ -158,7 +159,7 @@ function hideSubtitlePreview(persistent) { } function embed(options, self) { - import('text!./subtitlesettings.template.html').then(({default: template}) => { + import('./subtitlesettings.template.html').then(({default: template}) => { options.element.classList.add('subtitlesettings'); options.element.innerHTML = globalize.translateHtml(template, 'core'); diff --git a/src/components/subtitlesync/subtitlesync.js b/src/components/subtitlesync/subtitlesync.js index efb2087a1..c6d38d2f5 100644 --- a/src/components/subtitlesync/subtitlesync.js +++ b/src/components/subtitlesync/subtitlesync.js @@ -1,7 +1,8 @@ -import playbackManager from 'playbackManager'; -import layoutManager from 'layoutManager'; -import template from 'text!./subtitlesync.template.html'; -import 'css!./subtitlesync'; + +import playbackManager from '../playback/playbackmanager'; +import layoutManager from '../layoutManager'; +import template from './subtitlesync.template.html'; +import './subtitlesync.css'; let player; let subtitleSyncSlider; diff --git a/src/components/syncPlay/groupSelectionMenu.js b/src/components/syncPlay/groupSelectionMenu.js index b554817b8..8882548e9 100644 --- a/src/components/syncPlay/groupSelectionMenu.js +++ b/src/components/syncPlay/groupSelectionMenu.js @@ -1,11 +1,12 @@ -import events from 'events'; -import playbackManager from 'playbackManager'; -import syncPlayManager from 'syncPlayManager'; -import loading from 'loading'; -import toast from 'toast'; -import actionsheet from 'actionsheet'; -import globalize from 'globalize'; -import playbackPermissionManager from 'playbackPermissionManager'; +import events from 'jellyfin-apiclient'; +import connectionManager from 'jellyfin-apiclient'; +import playbackManager from '../playback/playbackmanager'; +import syncPlayManager from './syncPlayManager'; +import loading from '../loading/loading'; +import toast from '../toast/toast'; +import actionsheet from '../actionSheet/actionSheet'; +import globalize from '../../scripts/globalize'; +import playbackPermissionManager from './playbackPermissionManager'; /** * Gets active player id. @@ -158,7 +159,7 @@ events.on(syncPlayManager, 'enabled', function (e, enabled) { * Shows a menu to handle SyncPlay groups. * @param {HTMLElement} button - Element where to place the menu. */ -export function show (button) { +export default function show (button) { loading.show(); // TODO: should feature be disabled if playback permission is missing? diff --git a/src/components/syncPlay/syncPlayManager.js b/src/components/syncPlay/syncPlayManager.js index c72d20a11..3a9b6e889 100644 --- a/src/components/syncPlay/syncPlayManager.js +++ b/src/components/syncPlay/syncPlayManager.js @@ -3,11 +3,12 @@ * @module components/syncPlay/syncPlayManager */ -import events from 'events'; -import playbackManager from 'playbackManager'; -import timeSyncManager from 'timeSyncManager'; -import toast from 'toast'; -import globalize from 'globalize'; +import events from 'jellyfin-apiclient'; +import connectionManager from 'jellyfin-apiclient'; +import playbackManager from '../playback/playbackmanager'; +import timeSyncManager from './timeSyncManager'; +import toast from '../toast/toast'; +import globalize from '../../scripts//globalize'; /** * Waits for an event to be triggered on an object. An optional timeout can specified after which the promise is rejected. diff --git a/src/components/syncPlay/timeSyncManager.js b/src/components/syncPlay/timeSyncManager.js index 6ded631de..d824b2e1d 100644 --- a/src/components/syncPlay/timeSyncManager.js +++ b/src/components/syncPlay/timeSyncManager.js @@ -3,7 +3,8 @@ * @module components/syncPlay/timeSyncManager */ -import events from 'events'; +import events from 'jellyfin-apiclient'; +import connectionManager from 'jellyfin-apiclient'; /** * Time estimation diff --git a/src/components/tabbedview/tabbedview.js b/src/components/tabbedview/tabbedview.js index 4e7ccb652..655ca1ace 100644 --- a/src/components/tabbedview/tabbedview.js +++ b/src/components/tabbedview/tabbedview.js @@ -1,7 +1,7 @@ -import backdrop from 'backdrop'; -import * as mainTabsManager from 'mainTabsManager'; -import layoutManager from 'layoutManager'; -import 'emby-tabs'; +import backdrop from '../backdrop/backdrop'; +import * as mainTabsManager from '../maintabsmanager'; +import layoutManager from '../layoutManager'; +import '../../elements/emby-tabs/emby-tabs'; function onViewDestroy(e) { const tabControllers = this.tabControllers; diff --git a/src/components/themeMediaPlayer.js b/src/components/themeMediaPlayer.js index 8f288a534..b1b382e9b 100644 --- a/src/components/themeMediaPlayer.js +++ b/src/components/themeMediaPlayer.js @@ -1,5 +1,6 @@ -import playbackManager from 'playbackManager'; -import * as userSettings from 'userSettings'; +import playbackManager from './playback/playbackmanager'; +import * as userSettings from '../scripts/settings/userSettings'; +import connectionManager from 'jellyfin-apiclient'; let currentOwnerId; let currentThemeIds = []; diff --git a/src/components/toast/toast.js b/src/components/toast/toast.js index d97188067..a26143ea1 100644 --- a/src/components/toast/toast.js +++ b/src/components/toast/toast.js @@ -1,4 +1,4 @@ -import 'css!./toast'; +import './toast'; function remove(elem) { setTimeout(function () { @@ -21,7 +21,7 @@ export default function (options) { } const elem = document.createElement('div'); - elem.classList.add('toast'); + elem.classList.add('../toast/toast'); elem.innerHTML = options.text; document.body.appendChild(elem); diff --git a/src/components/tunerPicker.js b/src/components/tunerPicker.js index 2e7629a3c..e2793bf9d 100644 --- a/src/components/tunerPicker.js +++ b/src/components/tunerPicker.js @@ -1,16 +1,17 @@ -import dialogHelper from 'dialogHelper'; -import dom from 'dom'; -import layoutManager from 'layoutManager'; -import globalize from 'globalize'; -import loading from 'loading'; -import browser from 'browser'; -import focusManager from 'focusManager'; -import scrollHelper from 'scrollHelper'; -import 'material-icons'; -import 'formDialogStyle'; -import 'emby-button'; -import 'emby-itemscontainer'; -import 'cardStyle'; +import dialogHelper from './dialogHelper/dialogHelper'; +import dom from '../scripts/dom'; +import layoutManager from './layoutManager'; +import connectionManager from 'jellyfin-apiclient'; +import globalize from '../scripts/globalize'; +import loading from './loading/loading'; +import browser from '../scripts/browser'; +import focusManager from './focusManager'; +import scrollHelper from '../scripts/scrollHelper'; +import 'material-design-icons-iconfont'; +import './formdialog.css'; +import '../elements/emby-button/emby-button'; +import '../elements/emby-itemscontainer/emby-itemscontainer'; +import './cardbuilder/card.css'; const enableFocusTransform = !browser.slow && !browser.edge; diff --git a/src/components/tvproviders/schedulesdirect.js b/src/components/tvproviders/schedulesdirect.js index de469e184..b6160f93e 100644 --- a/src/components/tvproviders/schedulesdirect.js +++ b/src/components/tvproviders/schedulesdirect.js @@ -1,13 +1,13 @@ -import $ from 'jQuery'; -import loading from 'loading'; -import globalize from 'globalize'; -import 'emby-checkbox'; -import 'emby-input'; -import 'listViewStyle'; -import 'paper-icon-button-light'; -import 'emby-select'; -import 'emby-button'; -import 'flexStyles'; +import 'jquery'; +import loading from '../loading/loading'; +import globalize from '../../scripts/globalize'; +import '../../elements/emby-checkbox/emby-checkbox'; +import '../../elements/emby-input/emby-input'; +import '../listview/listview.css'; +import '../../elements/emby-button/paper-icon-button-light'; +import '../../elements/emby-select/emby-select'; +import '../../elements/emby-button/emby-button'; +import '../../assets/css/flexstyles.css'; export default function (page, providerId, options) { function reload() { diff --git a/src/components/tvproviders/xmltv.js b/src/components/tvproviders/xmltv.js index a75b29eeb..9d23f7710 100644 --- a/src/components/tvproviders/xmltv.js +++ b/src/components/tvproviders/xmltv.js @@ -1,10 +1,10 @@ -import $ from 'jQuery'; -import loading from 'loading'; -import globalize from 'globalize'; -import 'emby-checkbox'; -import 'emby-input'; -import 'listViewStyle'; -import 'paper-icon-button-light'; +import 'jquery'; +import loading from '../loading/loading'; +import globalize from '../../scripts/globalize'; +import '../../elements/emby-checkbox/emby-checkbox'; +import '../../elements/emby-input/emby-input'; +import '../listview/listview.css'; +import '../../elements/emby-button/paper-icon-button-light'; export default function (page, providerId, options) { function getListingProvider(config, id) { @@ -143,7 +143,7 @@ export default function (page, providerId, options) { function onSelectPathClick(e) { const page = $(e.target).parents('.xmltvForm')[0]; - import('directorybrowser').then(({default: directoryBrowser}) => { + import('../directorybrowser/directorybrowser').then((directoryBrowser) => { const picker = new directoryBrowser(); picker.show({ includeFiles: true, diff --git a/src/components/upnextdialog/upnextdialog.js b/src/components/upnextdialog/upnextdialog.js index 45ac72b13..9515e2ef3 100644 --- a/src/components/upnextdialog/upnextdialog.js +++ b/src/components/upnextdialog/upnextdialog.js @@ -1,14 +1,15 @@ -import dom from 'dom'; -import playbackManager from 'playbackManager'; -import events from 'events'; -import mediaInfo from 'mediaInfo'; -import layoutManager from 'layoutManager'; -import focusManager from 'focusManager'; -import globalize from 'globalize'; -import itemHelper from 'itemHelper'; -import 'css!./upnextdialog'; -import 'emby-button'; -import 'flexStyles'; +import dom from '../../scripts/dom'; +import playbackManager from '../playback/playbackmanager'; +import connectionManager from 'jellyfin-apiclient'; +import events from 'jellyfin-apiclient'; +import mediaInfo from '../mediainfo/mediainfo'; +import layoutManager from '../layoutManager'; +import focusManager from '../focusManager'; +import globalize from '../../scripts/globalize'; +import itemHelper from '../itemHelper'; +import './upnextdialog.css'; +import '../../elements/emby-button/emby-button'; +import '../../assets/css/flexstyles.css'; /* eslint-disable indent */ diff --git a/src/components/userdatabuttons/userdatabuttons.js b/src/components/userdatabuttons/userdatabuttons.js index 6c0cbb8a2..cd906e3bb 100644 --- a/src/components/userdatabuttons/userdatabuttons.js +++ b/src/components/userdatabuttons/userdatabuttons.js @@ -1,10 +1,11 @@ -import globalize from 'globalize'; -import dom from 'dom'; -import itemHelper from 'itemHelper'; -import 'paper-icon-button-light'; -import 'material-icons'; -import 'emby-button'; -import 'css!./userdatabuttons'; +import connectionManager from 'jellyfin-apiclient'; +import globalize from '../../scripts/globalize'; +import dom from '../../scripts/dom'; +import itemHelper from '../itemHelper'; +import '../../elements/emby-button/paper-icon-button-light'; +import 'material-design-icons-iconfont'; +import '../../elements/emby-button/emby-button'; +import './userdatabuttons.css'; const userDataMethods = { markPlayed: markPlayed, @@ -19,7 +20,7 @@ function getUserDataButtonHtml(method, itemId, serverId, buttonCssClass, iconCss buttonCssClass = buttonCssClass ? (buttonCssClass + ' mini') : 'mini'; } - const is = style === 'fab' ? 'emby-button' : 'paper-icon-button-light'; + const is = style === 'fab' ? '../../elements/emby-button/emby-button' : '../../elements/emby-button/paper-icon-button-light'; let className = style === 'fab' ? 'autoSize fab' : 'autoSize'; if (buttonCssClass) { @@ -32,7 +33,7 @@ function getUserDataButtonHtml(method, itemId, serverId, buttonCssClass, iconCss iconCssClass = ''; } - iconCssClass += 'material-icons'; + iconCssClass += 'material-design-icons-iconfont'; return ''; } diff --git a/src/components/viewContainer.js b/src/components/viewContainer.js index 6f9059cb1..5672da9c9 100644 --- a/src/components/viewContainer.js +++ b/src/components/viewContainer.js @@ -1,4 +1,4 @@ -import 'css!components/viewManager/viewContainer'; +import './viewManager/viewContainer.css'; /* eslint-disable indent */ function setControllerClass(view, options) { diff --git a/src/components/viewManager/viewManager.js b/src/components/viewManager/viewManager.js index a4ee22e75..cfcd67cf8 100644 --- a/src/components/viewManager/viewManager.js +++ b/src/components/viewManager/viewManager.js @@ -1,7 +1,7 @@ -import viewContainer from 'viewContainer'; -import focusManager from 'focusManager'; -import queryString from 'queryString'; -import layoutManager from 'layoutManager'; +import viewContainer from '../viewContainer'; +import focusManager from '../focusManager'; +import queryString from 'query-string'; +import layoutManager from '../layoutManager'; let currentView; let dispatchPageEvents; @@ -170,6 +170,6 @@ class ViewManager { } const viewManager = new ViewManager(); -viewManager.default.dispatchPageEvents(true); +viewManager.dispatchPageEvents(true); export default viewManager; diff --git a/src/components/viewSettings/viewSettings.js b/src/components/viewSettings/viewSettings.js index fd5b5c3f9..2e54f7f22 100644 --- a/src/components/viewSettings/viewSettings.js +++ b/src/components/viewSettings/viewSettings.js @@ -1,15 +1,15 @@ -import dialogHelper from 'dialogHelper'; -import layoutManager from 'layoutManager'; -import globalize from 'globalize'; -import * as userSettings from 'userSettings'; -import 'emby-checkbox'; -import 'emby-input'; -import 'paper-icon-button-light'; -import 'emby-select'; -import 'material-icons'; -import 'css!./../formdialog'; -import 'emby-button'; -import 'flexStyles'; +import dialogHelper from '../dialogHelper/dialogHelper'; +import layoutManager from '../layoutManager'; +import globalize from '../../scripts/globalize'; +import * as userSettings from '../../scripts/settings/userSettings'; +import '../../elements/emby-checkbox/emby-checkbox'; +import '../../elements/emby-input/emby-input'; +import '../../elements/emby-button/emby-button'; +import '../../elements/emby-button/paper-icon-button-light'; +import '../../elements/emby-select/emby-select'; +import 'material-design-icons-iconfont'; +import '../formdialog.css'; +import '../../assets/css/flexstyles.css'; function onSubmit(e) { e.preventDefault(); @@ -38,7 +38,7 @@ function saveValues(context, settings, settingsKey) { } function centerFocus(elem, horiz, on) { - import('scrollHelper').then(({default: scrollHelper}) => { + import('../../scripts/scrollHelper').then((scrollHelper) => { const fn = on ? 'on' : 'off'; scrollHelper.centerFocus[fn](elem, horiz); }); @@ -59,7 +59,7 @@ class ViewSettings { } show(options) { return new Promise(function (resolve, reject) { - import('text!./viewSettings.template.html').then(({default: template}) => { + import('./viewSettings.template.html').then(({default: template}) => { const dialogOptions = { removeOnClose: true, scrollY: false diff --git a/src/controllers/dashboard/apikeys.js b/src/controllers/dashboard/apikeys.js index 2b526aa8c..fccdc189d 100644 --- a/src/controllers/dashboard/apikeys.js +++ b/src/controllers/dashboard/apikeys.js @@ -1,13 +1,13 @@ -import datetime from 'datetime'; -import loading from 'loading'; -import dom from 'dom'; -import globalize from 'globalize'; -import 'emby-button'; +import datetime from '../../scripts/datetime'; +import loading from '../../components/loading/loading'; +import dom from '../../scripts/dom'; +import globalize from '../../scripts/globalize'; +import '../../elements/emby-button/emby-button'; /* eslint-disable indent */ function revoke(page, key) { - import('confirm').then(({default: confirm}) => { + import('../../components/confirm/confirm').then(({default: confirm}) => { confirm(globalize.translate('MessageConfirmRevokeApiKey'), globalize.translate('HeaderConfirmRevokeApiKey')).then(function () { loading.show(); ApiClient.ajax({ @@ -51,7 +51,7 @@ import 'emby-button'; } function showNewKeyPrompt(page) { - import('prompt').then(({default: prompt}) => { + import('../../components/prompt/prompt').then(({default: prompt}) => { prompt({ title: globalize.translate('HeaderNewApiKey'), label: globalize.translate('LabelAppName'), diff --git a/src/controllers/dashboard/dashboard.js b/src/controllers/dashboard/dashboard.js index 855ce3ff0..692cc020b 100644 --- a/src/controllers/dashboard/dashboard.js +++ b/src/controllers/dashboard/dashboard.js @@ -1,28 +1,28 @@ -import datetime from 'datetime'; -import events from 'events'; -import itemHelper from 'itemHelper'; -import serverNotifications from 'serverNotifications'; -import dom from 'dom'; -import taskButton from 'scripts/taskbutton'; -import globalize from 'globalize'; -import * as datefns from 'date-fns'; -import dfnshelper from 'dfnshelper'; -import loading from 'loading'; -import playMethodHelper from 'playMethodHelper'; -import cardBuilder from 'cardBuilder'; -import imageLoader from 'imageLoader'; -import ActivityLog from 'components/activitylog'; -import imageHelper from 'scripts/imagehelper'; -import indicators from 'indicators'; -import 'listViewStyle'; -import 'emby-button'; -import 'flexStyles'; -import 'emby-itemscontainer'; +import datetime from '../../scripts/datetime'; +import { connectionManager, events } from 'jellyfin-apiclient'; +import itemHelper from '../../components/itemHelper'; +import serverNotifications from '../../scripts/serverNotifications'; +import dom from '../../scripts/dom'; +import globalize from '../../scripts/globalize'; +import { formatDistanceToNow } from 'date-fns'; +import { localeWithSuffix } from '../../scripts/dfnshelper'; +import loading from '../../components/loading/loading'; +import playMethodHelper from '../../components/playback/playmethodhelper'; +import cardBuilder from '../../components/cardbuilder/cardBuilder'; +import imageLoader from '../../components/images/imageLoader'; +import ActivityLog from '../../components/activitylog'; +import imageHelper from '../../scripts/imagehelper'; +import indicators from '../../components/indicators/indicators'; +import '../../components/listview/listview.css'; +import '../../elements/emby-button/emby-button'; +import '../../assets/css/flexstyles.css'; +import '../../elements/emby-itemscontainer/emby-itemscontainer'; +import taskButton from '../../scripts/taskbutton'; /* eslint-disable indent */ function showPlaybackInfo(btn, session) { - import('alert').then(({default: alert}) => { + import('../../components/alert').then(({default: alert}) => { let title; const text = []; const displayPlayMethod = playMethodHelper.getDisplayPlayMethod(session); @@ -53,7 +53,7 @@ import 'emby-itemscontainer'; } function showSendMessageForm(btn, session) { - import('prompt').then(({default: prompt}) => { + import('../../components/prompt/prompt').then(({default: prompt}) => { prompt({ title: globalize.translate('HeaderSendMessage'), label: globalize.translate('LabelMessageText'), @@ -70,7 +70,7 @@ import 'emby-itemscontainer'; } function showOptionsMenu(btn, session) { - import('actionsheet').then(({default: actionsheet}) => { + import('../../components/actionSheet/actionSheet').then(({default: actionsheet}) => { const menuItems = []; if (session.ServerId && session.DeviceId !== window.connectionManager.deviceId()) { @@ -473,7 +473,7 @@ import 'emby-itemscontainer'; // how dates are returned by the server when the session is active and show something like 'Active now', instead of past/future sentences if (!nowPlayingItem) { return { - html: globalize.translate('LastSeen', datefns.formatDistanceToNow(Date.parse(session.LastActivityDate), dfnshelper.localeWithSuffix)), + html: globalize.translate('LastSeen', formatDistanceToNow(Date.parse(session.LastActivityDate), localeWithSuffix)), image: imgUrl }; } @@ -720,7 +720,7 @@ import 'emby-itemscontainer'; }); }, restart: function (btn) { - import('confirm').then(({default: confirm}) => { + import('../../components/confirm/confirm').then(({default: confirm}) => { confirm({ title: globalize.translate('Restart'), text: globalize.translate('MessageConfirmRestart'), @@ -735,7 +735,7 @@ import 'emby-itemscontainer'; }); }, shutdown: function (btn) { - import('confirm').then(({default: confirm}) => { + import('../../components/confirm/confirm').then(({default: confirm}) => { confirm({ title: globalize.translate('ButtonShutdown'), text: globalize.translate('MessageConfirmShutdown'), diff --git a/src/controllers/dashboard/devices/device.js b/src/controllers/dashboard/devices/device.js index 17e28b9bd..ec9932d38 100644 --- a/src/controllers/dashboard/devices/device.js +++ b/src/controllers/dashboard/devices/device.js @@ -1,7 +1,7 @@ -import loading from 'loading'; -import dom from 'dom'; -import 'emby-input'; -import 'emby-button'; +import loading from '../../../components/loading/loading'; +import dom from '../../../scripts/dom'; +import '../../../elements/emby-input/emby-input'; +import '../../../elements/emby-button/emby-button'; /* eslint-disable indent */ diff --git a/src/controllers/dashboard/devices/devices.js b/src/controllers/dashboard/devices/devices.js index c6e728164..2466b24d7 100644 --- a/src/controllers/dashboard/devices/devices.js +++ b/src/controllers/dashboard/devices/devices.js @@ -1,12 +1,12 @@ -import loading from 'loading'; -import dom from 'dom'; -import globalize from 'globalize'; -import imageHelper from 'scripts/imagehelper'; -import * as datefns from 'date-fns'; -import dfnshelper from 'dfnshelper'; -import 'emby-button'; -import 'emby-itemscontainer'; -import 'cardStyle'; +import loading from '../../../components/loading/loading'; +import dom from '../../../scripts/dom'; +import globalize from '../../../scripts/globalize'; +import imageHelper from '../../../scripts/imagehelper'; +import { formatDistanceToNow } from 'date-fns'; +import { localeWithSuffix } from '../../../scripts/dfnshelper'; +import '../../../elements/emby-button/emby-button'; +import '../../../elements/emby-itemscontainer/emby-itemscontainer'; +import '../../../components/cardbuilder/card.css'; /* eslint-disable indent */ @@ -39,7 +39,7 @@ import 'cardStyle'; function deleteDevice(page, id) { const msg = globalize.translate('DeleteDeviceConfirmation'); - import('confirm').then(({default: confirm}) => { + import('../../../components/confirm/confirm').then(({default: confirm}) => { confirm({ text: msg, title: globalize.translate('HeaderDeleteDevice'), @@ -72,7 +72,7 @@ import 'cardStyle'; }); } - import('actionsheet').then(({default: actionsheet}) => { + import('../../../components/actionSheet/actionSheet').then(({default: actionsheet}) => { actionsheet.show({ items: menuItems, positionTo: btn, @@ -118,7 +118,8 @@ import 'cardStyle'; deviceHtml += ''; } - deviceHtml += "
"; + deviceHtml += "
"; deviceHtml += device.Name; deviceHtml += '
'; deviceHtml += "
"; @@ -128,7 +129,7 @@ import 'cardStyle'; if (device.LastUserName) { deviceHtml += device.LastUserName; - deviceHtml += ', ' + datefns.formatDistanceToNow(Date.parse(device.DateLastActivity), dfnshelper.localeWithSuffix); + deviceHtml += ', ' + formatDistanceToNow(Date.parse(device.DateLastActivity), localeWithSuffix); } deviceHtml += ' '; diff --git a/src/controllers/dashboard/dlna/profile.js b/src/controllers/dashboard/dlna/profile.js index 478b5ca87..2a770bf91 100644 --- a/src/controllers/dashboard/dlna/profile.js +++ b/src/controllers/dashboard/dlna/profile.js @@ -1,11 +1,11 @@ -import $ from 'jQuery'; -import loading from 'loading'; -import globalize from 'globalize'; -import 'emby-select'; -import 'emby-button'; -import 'emby-input'; -import 'emby-checkbox'; -import 'listViewStyle'; +import 'jquery'; +import loading from '../../../components/loading/loading'; +import globalize from '../../../scripts/globalize'; +import '../../../elements/emby-select/emby-select'; +import '../../../elements/emby-button/emby-button'; +import '../../../elements/emby-input/emby-input'; +import '../../../elements/emby-checkbox/emby-checkbox'; +import '../../../components/listview/listview.css'; /* eslint-disable indent */ @@ -633,7 +633,7 @@ import 'listViewStyle'; data: JSON.stringify(profile), contentType: 'application/json' }).then(function () { - import('toast').then(({default: toast}) => { + import('../../../components/toast/toast').then((toast) => { toast('Settings saved.'); }); }, Dashboard.processErrorResponse); diff --git a/src/controllers/dashboard/dlna/profiles.js b/src/controllers/dashboard/dlna/profiles.js index 4eb830df6..6d3616864 100644 --- a/src/controllers/dashboard/dlna/profiles.js +++ b/src/controllers/dashboard/dlna/profiles.js @@ -1,9 +1,9 @@ -import $ from 'jQuery'; -import globalize from 'globalize'; -import loading from 'loading'; -import libraryMenu from 'libraryMenu'; -import 'listViewStyle'; -import 'emby-button'; +import 'jquery'; +import globalize from '../../../scripts/globalize'; +import loading from '../../../components/loading/loading'; +import libraryMenu from '../../../scripts/libraryMenu'; +import '../../../components/listview/listview.css'; +import '../../../elements/emby-button/emby-button'; /* eslint-disable indent */ @@ -64,7 +64,7 @@ import 'emby-button'; } function deleteProfile(page, id) { - import('confirm').then(({default: confirm}) => { + import('../../../components/confirm/confirm').then(({default: confirm}) => { confirm(globalize.translate('MessageConfirmProfileDeletion'), globalize.translate('HeaderConfirmProfileDeletion')).then(function () { loading.show(); ApiClient.ajax({ diff --git a/src/controllers/dashboard/dlna/settings.js b/src/controllers/dashboard/dlna/settings.js index fb93441a5..f5591cdef 100644 --- a/src/controllers/dashboard/dlna/settings.js +++ b/src/controllers/dashboard/dlna/settings.js @@ -1,7 +1,7 @@ -import $ from 'jQuery'; -import loading from 'loading'; -import libraryMenu from 'libraryMenu'; -import globalize from 'globalize'; +import 'jquery'; +import loading from '../../../components/loading/loading'; +import libraryMenu from '../../../scripts/libraryMenu'; +import globalize from '../../../scripts/globalize'; /* eslint-disable indent */ diff --git a/src/controllers/dashboard/encodingsettings.js b/src/controllers/dashboard/encodingsettings.js index 6a54e8105..7bd611df6 100644 --- a/src/controllers/dashboard/encodingsettings.js +++ b/src/controllers/dashboard/encodingsettings.js @@ -1,8 +1,8 @@ -import $ from 'jQuery'; -import loading from 'loading'; -import globalize from 'globalize'; -import dom from 'dom'; -import libraryMenu from 'libraryMenu'; +import 'jquery'; +import loading from '../../components/loading/loading'; +import globalize from '../../scripts/globalize'; +import dom from '../../scripts/dom'; +import libraryMenu from '../../scripts/libraryMenu'; /* eslint-disable indent */ @@ -45,7 +45,7 @@ import libraryMenu from 'libraryMenu'; let msg = ''; msg = globalize.translate('FFmpegSavePathNotFound'); - import('alert').then(({default: alert}) => { + import('../../components/alert').then(({default: alert}) => { alert(msg); }); } @@ -101,7 +101,7 @@ import libraryMenu from 'libraryMenu'; ApiClient.updateNamedConfiguration('encoding', config).then(function () { updateEncoder(form); }, function () { - import('alert').then(({default: alert}) => { + import('../../components/alert').then(({default: alert}) => { alert(globalize.translate('ErrorDefault')); }); @@ -111,7 +111,7 @@ import libraryMenu from 'libraryMenu'; }; if ($('#selectVideoDecoder', form).val()) { - import('alert').then(({default: alert}) => { + import('../../components/alert').then(({default: alert}) => { alert({ title: globalize.translate('TitleHardwareAcceleration'), text: globalize.translate('HardwareAccelerationWarning') @@ -186,7 +186,7 @@ import libraryMenu from 'libraryMenu'; setDecodingCodecsVisible(page, this.value); }); $('#btnSelectEncoderPath', page).on('click.selectDirectory', function () { - import('directorybrowser').then(({default: directoryBrowser}) => { + import('../../components/directorybrowser/directorybrowser').then(({default: directoryBrowser}) => { const picker = new directoryBrowser(); picker.show({ includeFiles: true, @@ -201,7 +201,7 @@ import libraryMenu from 'libraryMenu'; }); }); $('#btnSelectTranscodingTempPath', page).on('click.selectDirectory', function () { - import('directorybrowser').then(({default: directoryBrowser}) => { + import('../../components/directorybrowser/directorybrowser').then(({default: directoryBrowser}) => { const picker = new directoryBrowser(); picker.show({ callback: function (path) { diff --git a/src/controllers/dashboard/general.js b/src/controllers/dashboard/general.js index eb819dc41..fb7b1c59d 100644 --- a/src/controllers/dashboard/general.js +++ b/src/controllers/dashboard/general.js @@ -1,11 +1,11 @@ -import $ from 'jQuery'; -import loading from 'loading'; -import globalize from 'globalize'; -import 'emby-checkbox'; -import 'emby-textarea'; -import 'emby-input'; -import 'emby-select'; -import 'emby-button'; +import 'jquery'; +import loading from '../../components/loading/loading'; +import globalize from '../../scripts/globalize'; +import '../../elements/emby-checkbox/emby-checkbox'; +import '../../elements/emby-textarea/emby-textarea'; +import '../../elements/emby-input/emby-input'; +import '../../elements/emby-select/emby-select'; +import '../../elements/emby-button/emby-button'; /* eslint-disable indent */ @@ -51,7 +51,7 @@ import 'emby-button'; }); }); }, function () { - import('alert').then(({default: alert}) => { + import('../../components/alert').then(({default: alert}) => { alert(globalize.translate('ErrorDefault')); }); @@ -66,7 +66,7 @@ import 'emby-button'; const brandingConfigKey = 'branding'; export default function (view, params) { $('#btnSelectCachePath', view).on('click.selectDirectory', function () { - import('directorybrowser').then(({default: directoryBrowser}) => { + import('../../components/directorybrowser/directorybrowser').then(({default: directoryBrowser}) => { const picker = new directoryBrowser(); picker.show({ callback: function (path) { @@ -83,7 +83,7 @@ import 'emby-button'; }); }); $('#btnSelectMetadataPath', view).on('click.selectDirectory', function () { - import('directorybrowser').then(({default: directoryBrowser}) => { + import('../../components/directorybrowser/directorybrowser').then(({default: directoryBrowser}) => { const picker = new directoryBrowser(); picker.show({ path: $('#txtMetadataPath', view).val(), diff --git a/src/controllers/dashboard/library.js b/src/controllers/dashboard/library.js index 0abda33b6..9ef5f77fa 100644 --- a/src/controllers/dashboard/library.js +++ b/src/controllers/dashboard/library.js @@ -1,17 +1,17 @@ -import $ from 'jQuery'; -import taskButton from 'scripts/taskbutton'; -import loading from 'loading'; -import libraryMenu from 'libraryMenu'; -import globalize from 'globalize'; -import dom from 'dom'; -import imageHelper from 'scripts/imagehelper'; -import 'cardStyle'; -import 'emby-itemrefreshindicator'; +import 'jquery'; +import taskButton from '../../scripts/taskbutton'; +import loading from '../../components/loading/loading'; +import libraryMenu from '../../scripts/libraryMenu'; +import globalize from '../../scripts/globalize'; +import dom from '../../scripts/dom'; +import imageHelper from '../../scripts/imagehelper'; +import '../../components/cardbuilder/card.css'; +import '../../elements/emby-itemrefreshindicator/emby-itemrefreshindicator'; /* eslint-disable indent */ function addVirtualFolder(page) { - import('medialibrarycreator').then(({default: medialibrarycreator}) => { + import('../../components/mediaLibraryCreator/mediaLibraryCreator').then((medialibrarycreator) => { new medialibrarycreator({ collectionTypeOptions: getCollectionTypeOptions().filter(function (f) { return !f.hidden; @@ -26,7 +26,7 @@ import 'emby-itemrefreshindicator'; } function editVirtualFolder(page, virtualFolder) { - import('medialibraryeditor').then(({default: medialibraryeditor}) => { + import('../../components/mediaLibraryEditor/mediaLibraryEditor').then((medialibraryeditor) => { new medialibraryeditor({ refresh: shouldRefreshLibraryAfterChanges(page), library: virtualFolder @@ -46,7 +46,7 @@ import 'emby-itemrefreshindicator'; msg += virtualFolder.Locations.join('
'); } - import('confirm').then(({default: confirm}) => { + import('../../components/confirm/confirm').then((confirm) => { confirm({ text: msg, title: globalize.translate('HeaderRemoveMediaFolder'), @@ -62,7 +62,7 @@ import 'emby-itemrefreshindicator'; } function refreshVirtualFolder(page, virtualFolder) { - import('refreshDialog').then(({default: refreshDialog}) => { + import('../../components/refreshdialog/refreshdialog').then((refreshDialog) => { new refreshDialog({ itemIds: [virtualFolder.ItemId], serverId: ApiClient.serverId(), @@ -72,7 +72,7 @@ import 'emby-itemrefreshindicator'; } function renameVirtualFolder(page, virtualFolder) { - import('prompt').then(({default: prompt}) => { + import('../../components/prompt/prompt').then((prompt) => { prompt({ label: globalize.translate('LabelNewName'), confirmText: globalize.translate('ButtonRename') @@ -118,7 +118,7 @@ import 'emby-itemrefreshindicator'; icon: 'refresh' }); - import('actionsheet').then(({default: actionsheet}) => { + import('../../components/actionSheet/actionSheet').then((actionsheet) => { actionsheet.show({ items: menuItems, positionTo: elem, @@ -199,7 +199,7 @@ import 'emby-itemrefreshindicator'; } function editImages(page, virtualFolder) { - import('imageEditor').then(({default: imageEditor}) => { + import('../../components/imageeditor/imageeditor').then((imageEditor) => { imageEditor.show({ itemId: virtualFolder.ItemId, serverId: ApiClient.serverId() diff --git a/src/controllers/dashboard/librarydisplay.js b/src/controllers/dashboard/librarydisplay.js index 06e366b98..fbae27fe7 100644 --- a/src/controllers/dashboard/librarydisplay.js +++ b/src/controllers/dashboard/librarydisplay.js @@ -1,8 +1,8 @@ -import globalize from 'globalize'; -import loading from 'loading'; -import libraryMenu from 'libraryMenu'; -import 'emby-checkbox'; -import 'emby-button'; +import globalize from '../../scripts/globalize'; +import loading from '../../components/loading/loading'; +import libraryMenu from '../../scripts/libraryMenu'; +import '../../elements/emby-checkbox/emby-checkbox'; +import '../../elements/emby-button/emby-button'; /* eslint-disable indent */ diff --git a/src/controllers/dashboard/logs.js b/src/controllers/dashboard/logs.js index e28c2ac12..68431441c 100644 --- a/src/controllers/dashboard/logs.js +++ b/src/controllers/dashboard/logs.js @@ -1,8 +1,8 @@ -import datetime from 'datetime'; -import loading from 'loading'; -import 'emby-button'; -import 'listViewStyle'; -import 'flexStyles'; +import datetime from '../../scripts/datetime'; +import loading from '../../components/loading/loading'; +import '../../elements/emby-button/emby-button'; +import '../../components/listview/listview.css'; +import '../../assets/css/flexstyles.css'; /* eslint-disable indent */ diff --git a/src/controllers/dashboard/metadataImages.js b/src/controllers/dashboard/metadataImages.js index 649ca9ac3..afc19c0ed 100644 --- a/src/controllers/dashboard/metadataImages.js +++ b/src/controllers/dashboard/metadataImages.js @@ -1,8 +1,8 @@ -import $ from 'jQuery'; -import loading from 'loading'; -import libraryMenu from 'libraryMenu'; -import globalize from 'globalize'; -import 'listViewStyle'; +import 'jquery'; +import loading from '../../components/loading/loading'; +import libraryMenu from '../../scripts/libraryMenu'; +import globalize from '../../scripts/globalize'; +import '../../components/listview/listview.css'; /* eslint-disable indent */ diff --git a/src/controllers/dashboard/metadatanfo.js b/src/controllers/dashboard/metadatanfo.js index 16e1018e4..e3fd0df00 100644 --- a/src/controllers/dashboard/metadatanfo.js +++ b/src/controllers/dashboard/metadatanfo.js @@ -1,7 +1,7 @@ -import $ from 'jQuery'; -import loading from 'loading'; -import libraryMenu from 'libraryMenu'; -import globalize from 'globalize'; +import 'jquery'; +import loading from '../../components/loading/loading'; +import libraryMenu from '../../scripts/libraryMenu'; +import globalize from '../../scripts/globalize'; /* eslint-disable indent */ @@ -39,7 +39,7 @@ import globalize from 'globalize'; const msg = []; msg.push(globalize.translate('MetadataSettingChangeHelp')); - import('alert').then(({default: alert}) => { + import('../../components/alert').then(({default: alert}) => { alert({ text: msg.join('

') }); diff --git a/src/controllers/dashboard/networking.js b/src/controllers/dashboard/networking.js index 7fc161a90..a68a33487 100644 --- a/src/controllers/dashboard/networking.js +++ b/src/controllers/dashboard/networking.js @@ -1,7 +1,7 @@ -import loading from 'loading'; -import globalize from 'globalize'; -import 'emby-checkbox'; -import 'emby-select'; +import loading from '../../components/loading/loading'; +import globalize from '../../scripts/globalize'; +import '../../elements/emby-checkbox/emby-checkbox'; +import '../../elements/emby-select/emby-select'; /* eslint-disable indent */ @@ -89,7 +89,7 @@ import 'emby-select'; function showAlertText(options) { return new Promise(function (resolve, reject) { - import('alert').then(({default: alert}) => { + import('../../components/alert').then(({default: alert}) => { alert(options).then(resolve, reject); }); }); @@ -145,7 +145,7 @@ import 'emby-select'; } }); view.querySelector('#btnSelectCertPath').addEventListener('click', function () { - import('directorybrowser').then(({default: directoryBrowser}) => { + import('../../components/directorybrowser/directorybrowser').then(({default: directoryBrowser}) => { const picker = new directoryBrowser(); picker.show({ includeFiles: true, diff --git a/src/controllers/dashboard/notifications/notification/index.js b/src/controllers/dashboard/notifications/notification/index.js index 2ab3720cc..1501a9a7b 100644 --- a/src/controllers/dashboard/notifications/notification/index.js +++ b/src/controllers/dashboard/notifications/notification/index.js @@ -1,5 +1,5 @@ -import $ from 'jQuery'; -import 'emby-checkbox'; +import 'jquery'; +import '../../../../elements/emby-checkbox/emby-checkbox'; function fillItems(elem, items, cssClass, idPrefix, currentList, isEnabledList) { let html = '
'; diff --git a/src/controllers/dashboard/notifications/notifications/index.js b/src/controllers/dashboard/notifications/notifications/index.js index b97403f8e..1e0575df8 100644 --- a/src/controllers/dashboard/notifications/notifications/index.js +++ b/src/controllers/dashboard/notifications/notifications/index.js @@ -1,7 +1,7 @@ -import loading from 'loading'; -import globalize from 'globalize'; -import 'listViewStyle'; -import 'emby-button'; +import loading from '../../../../components/loading/loading'; +import globalize from '../../../../scripts/globalize'; +import '../../../../components/listview/listview.css'; +import '../../../../elements/emby-button/emby-button'; function reload(page) { loading.show(); diff --git a/src/controllers/dashboard/playback.js b/src/controllers/dashboard/playback.js index 101c3ac0a..0ea7dc320 100644 --- a/src/controllers/dashboard/playback.js +++ b/src/controllers/dashboard/playback.js @@ -1,7 +1,7 @@ -import $ from 'jQuery'; -import loading from 'loading'; -import libraryMenu from 'libraryMenu'; -import globalize from 'globalize'; +import 'jquery'; +import loading from '../../components/loading/loading'; +import libraryMenu from '../../scripts/libraryMenu'; +import globalize from '../../scripts/globalize'; /* eslint-disable indent */ diff --git a/src/controllers/dashboard/plugins/add/index.js b/src/controllers/dashboard/plugins/add/index.js index 5cc1dd321..3854087e7 100644 --- a/src/controllers/dashboard/plugins/add/index.js +++ b/src/controllers/dashboard/plugins/add/index.js @@ -1,7 +1,7 @@ -import $ from 'jQuery'; -import loading from 'loading'; -import globalize from 'globalize'; -import 'emby-button'; +import 'jquery'; +import loading from '../../../../components/loading/loading'; +import globalize from '../../../../scripts/globalize'; +import '../../../../elements/emby-button/emby-button'; function populateHistory(packageInfo, page) { let html = ''; @@ -68,7 +68,7 @@ function renderPackage(pkg, installedPlugins, page) { } function alertText(options) { - import('alert').then(({default: alert}) => { + import('../../../../components/alert').then(({default: alert}) => { alert(options); }); } @@ -94,7 +94,7 @@ function performInstallation(page, name, guid, version) { msg += '
'; msg += globalize.translate('PleaseConfirmPluginInstallation'); - import('confirm').then(({default: confirm}) => { + import('../../../../components/confirm/confirm').then(({default: confirm}) => { confirm(msg, globalize.translate('HeaderConfirmPluginInstallation')).then(function () { alertCallback(); }).catch(() => { diff --git a/src/controllers/dashboard/plugins/available/index.js b/src/controllers/dashboard/plugins/available/index.js index b7c3505aa..7dc4a9e42 100644 --- a/src/controllers/dashboard/plugins/available/index.js +++ b/src/controllers/dashboard/plugins/available/index.js @@ -1,10 +1,10 @@ -import loading from 'loading'; -import libraryMenu from 'libraryMenu'; -import globalize from 'globalize'; -import 'cardStyle'; -import 'emby-button'; -import 'emby-checkbox'; -import 'emby-select'; +import loading from '../../../../components/loading/loading'; +import libraryMenu from '../../../../scripts/libraryMenu'; +import globalize from '../../../../scripts/globalize'; +import '../../../../components/cardbuilder/card.css'; +import '../../../../elements/emby-button/emby-button'; +import '../../../../elements/emby-checkbox/emby-checkbox'; +import '../../../../elements/emby-select/emby-select'; function reloadList(page) { loading.show(); diff --git a/src/controllers/dashboard/plugins/installed/index.js b/src/controllers/dashboard/plugins/installed/index.js index cdf21d6a3..26e98a327 100644 --- a/src/controllers/dashboard/plugins/installed/index.js +++ b/src/controllers/dashboard/plugins/installed/index.js @@ -1,14 +1,14 @@ -import loading from 'loading'; -import libraryMenu from 'libraryMenu'; -import dom from 'dom'; -import globalize from 'globalize'; -import 'cardStyle'; -import 'emby-button'; +import loading from '../../../../components/loading/loading'; +import libraryMenu from '../../../../scripts/libraryMenu'; +import dom from '../../../../scripts/dom'; +import globalize from '../../../../scripts/globalize'; +import '../../../../components/cardbuilder/card.css'; +import '../../../../elements/emby-button/emby-button'; function deletePlugin(page, uniqueid, name) { const msg = globalize.translate('UninstallPluginConfirmation', name); - import('confirm').then(({default: confirm}) => { + import('../../../../components/confirm/confirm').then((confirm) => { confirm.default({ title: globalize.translate('HeaderUninstallPlugin'), text: msg, @@ -132,7 +132,7 @@ function showPluginMenu(page, elem) { }); } - import('actionsheet').then(({default: actionsheet}) => { + import('../../../../components/actionSheet/actionSheet').then((actionsheet) => { actionsheet.show({ items: menuItems, positionTo: elem, diff --git a/src/controllers/dashboard/plugins/repositories/index.js b/src/controllers/dashboard/plugins/repositories/index.js index 3abee6c90..08a411545 100644 --- a/src/controllers/dashboard/plugins/repositories/index.js +++ b/src/controllers/dashboard/plugins/repositories/index.js @@ -1,12 +1,12 @@ -import loading from 'loading'; -import libraryMenu from 'libraryMenu'; -import globalize from 'globalize'; -import dialogHelper from 'dialogHelper'; -import 'emby-button'; -import 'emby-checkbox'; -import 'emby-select'; -import 'formDialogStyle'; -import 'listViewStyle'; +import loading from '../../../../components/loading/loading'; +import libraryMenu from '../../../../scripts/libraryMenu'; +import globalize from '../../../../scripts/globalize'; +import dialogHelper from '../../../../components/dialogHelper/dialogHelper'; +import '../../../../elements/emby-button/emby-button'; +import '../../../../elements/emby-checkbox/emby-checkbox'; +import '../../../../elements/emby-select/emby-select'; +import '../../../../components/formdialog.css'; +import '../../../../components/listview/listview.css'; let repositories = []; diff --git a/src/controllers/dashboard/scheduledtasks/scheduledtask.js b/src/controllers/dashboard/scheduledtasks/scheduledtask.js index 64c09c6d8..fe131767e 100644 --- a/src/controllers/dashboard/scheduledtasks/scheduledtask.js +++ b/src/controllers/dashboard/scheduledtasks/scheduledtask.js @@ -1,11 +1,11 @@ -import $ from 'jQuery'; -import loading from 'loading'; -import datetime from 'datetime'; -import dom from 'dom'; -import globalize from 'globalize'; -import 'emby-input'; -import 'emby-button'; -import 'emby-select'; +import 'jquery'; +import loading from '../../../components/loading/loading'; +import datetime from '../../../scripts/datetime'; +import dom from '../../../scripts/dom'; +import globalize from '../../../scripts/globalize'; +import '../../../elements/emby-input/emby-input'; +import '../../../elements/emby-button/emby-button'; +import '../../../elements/emby-select/emby-select'; /* eslint-disable indent */ @@ -42,7 +42,7 @@ import 'emby-select'; $('.taskName', view).html(task.Name); $('#pTaskDescription', view).html(task.Description); - import('listViewStyle').then(() => { + import('../../../components/listview/listview.css').then(() => { ScheduledTaskPage.loadTaskTriggers(view, task); }); @@ -135,7 +135,7 @@ import 'emby-select'; $('#popupAddTrigger', view).removeClass('hide'); }, confirmDeleteTrigger: function (view, index) { - import('confirm').then(({default: confirm}) => { + import('../../../components/confirm/confirm').then(({default: confirm}) => { confirm(globalize.translate('MessageDeleteTaskTrigger'), globalize.translate('HeaderDeleteTaskTrigger')).then(function () { ScheduledTaskPage.deleteTrigger(view, index); }); diff --git a/src/controllers/dashboard/scheduledtasks/scheduledtasks.js b/src/controllers/dashboard/scheduledtasks/scheduledtasks.js index 81a34d4fa..436a06b74 100644 --- a/src/controllers/dashboard/scheduledtasks/scheduledtasks.js +++ b/src/controllers/dashboard/scheduledtasks/scheduledtasks.js @@ -1,12 +1,12 @@ -import $ from 'jQuery'; -import loading from 'loading'; -import events from 'events'; -import globalize from 'globalize'; -import serverNotifications from 'serverNotifications'; -import * as datefns from 'date-fns'; -import dfnshelper from 'dfnshelper'; -import 'listViewStyle'; -import 'emby-button'; +import 'jquery'; +import loading from '../../../components/loading/loading'; +import events from 'jellyfin-apiclient'; +import globalize from '../../../scripts/globalize'; +import serverNotifications from '../../../scripts/serverNotifications'; +import { formatDistance, formatDistanceToNow } from 'date-fns'; +import { getLocale, localeWithSuffix } from '../../../scripts/dfnshelper'; +import '../../../components/listview/listview.css'; +import '../../../elements/emby-button/emby-button'; /* eslint-disable indent */ @@ -77,8 +77,8 @@ import 'emby-button'; if (task.LastExecutionResult) { const endtime = Date.parse(task.LastExecutionResult.EndTimeUtc); const starttime = Date.parse(task.LastExecutionResult.StartTimeUtc); - html += globalize.translate('LabelScheduledTaskLastRan', datefns.formatDistanceToNow(endtime, dfnshelper.localeWithSuffix), - datefns.formatDistance(starttime, endtime, { locale: dfnshelper.getLocale() })); + html += globalize.translate('LabelScheduledTaskLastRan', formatDistanceToNow(endtime, localeWithSuffix), + formatDistance(starttime, endtime, { locale: getLocale() })); if (task.LastExecutionResult.Status === 'Failed') { html += " (" + globalize.translate('LabelFailed') + ')'; } else if (task.LastExecutionResult.Status === 'Cancelled') { diff --git a/src/controllers/dashboard/serveractivity.js b/src/controllers/dashboard/serveractivity.js index ed5612626..1f44b9eef 100644 --- a/src/controllers/dashboard/serveractivity.js +++ b/src/controllers/dashboard/serveractivity.js @@ -1,5 +1,5 @@ -import ActivityLog from 'components/activitylog'; -import globalize from 'globalize'; +import ActivityLog from '../../components/activitylog'; +import globalize from '../../scripts/globalize'; /* eslint-disable indent */ diff --git a/src/controllers/dashboard/streaming.js b/src/controllers/dashboard/streaming.js index 5db888dfc..5fbf67491 100644 --- a/src/controllers/dashboard/streaming.js +++ b/src/controllers/dashboard/streaming.js @@ -1,7 +1,7 @@ -import $ from 'jQuery'; -import libraryMenu from 'libraryMenu'; -import loading from 'loading'; -import globalize from 'globalize'; +import 'jquery'; +import libraryMenu from '../../scripts/libraryMenu'; +import loading from '../../components/loading/loading'; +import globalize from '../../scripts/globalize'; /* eslint-disable indent */ diff --git a/src/controllers/dashboard/users/useredit.js b/src/controllers/dashboard/users/useredit.js index 3d6e7d8bd..3532f8262 100644 --- a/src/controllers/dashboard/users/useredit.js +++ b/src/controllers/dashboard/users/useredit.js @@ -1,7 +1,7 @@ -import $ from 'jQuery'; -import loading from 'loading'; -import libraryMenu from 'libraryMenu'; -import globalize from 'globalize'; +import 'jquery'; +import loading from '../../../components/loading/loading'; +import libraryMenu from '../../../scripts/libraryMenu'; +import globalize from '../../../scripts/globalize'; /* eslint-disable indent */ @@ -110,7 +110,7 @@ import globalize from 'globalize'; Dashboard.navigate('userprofiles.html'); loading.hide(); - import('toast').then(({default: toast}) => { + import('../../../components/toast/toast').then((toast) => { toast(globalize.translate('SettingsSaved')); }); } diff --git a/src/controllers/dashboard/users/userlibraryaccess.js b/src/controllers/dashboard/users/userlibraryaccess.js index d840092c4..d07cc8f57 100644 --- a/src/controllers/dashboard/users/userlibraryaccess.js +++ b/src/controllers/dashboard/users/userlibraryaccess.js @@ -1,7 +1,7 @@ -import $ from 'jQuery'; -import loading from 'loading'; -import libraryMenu from 'libraryMenu'; -import globalize from 'globalize'; +import 'jquery'; +import loading from '../../../components/loading/loading'; +import libraryMenu from '../../../scripts/libraryMenu'; +import globalize from '../../../scripts/globalize'; /* eslint-disable indent */ @@ -92,7 +92,7 @@ import globalize from 'globalize'; function onSaveComplete(page) { loading.hide(); - import('toast').then(({default: toast}) => { + import('../../../components/toast/toast').then((toast) => { toast(globalize.translate('SettingsSaved')); }); } diff --git a/src/controllers/dashboard/users/usernew.js b/src/controllers/dashboard/users/usernew.js index 68b6365c0..9e6ffc3fc 100644 --- a/src/controllers/dashboard/users/usernew.js +++ b/src/controllers/dashboard/users/usernew.js @@ -1,7 +1,7 @@ -import $ from 'jQuery'; -import loading from 'loading'; -import globalize from 'globalize'; -import 'emby-checkbox'; +import 'jquery'; +import loading from '../../../components/loading/loading'; +import globalize from '../../../scripts/globalize'; +import '../../../elements/emby-checkbox/emby-checkbox'; /* eslint-disable indent */ @@ -88,7 +88,7 @@ import 'emby-checkbox'; Dashboard.navigate('useredit.html?userId=' + user.Id); }); }, function (response) { - import('toast').then(({default: toast}) => { + import('../../../components/toast/toast').then((toast) => { toast(globalize.translate('ErrorDefault')); }); diff --git a/src/controllers/dashboard/users/userparentalcontrol.js b/src/controllers/dashboard/users/userparentalcontrol.js index efe00aec0..8a23a5c41 100644 --- a/src/controllers/dashboard/users/userparentalcontrol.js +++ b/src/controllers/dashboard/users/userparentalcontrol.js @@ -1,10 +1,10 @@ -import $ from 'jQuery'; -import datetime from 'datetime'; -import loading from 'loading'; -import libraryMenu from 'libraryMenu'; -import globalize from 'globalize'; -import 'listViewStyle'; -import 'paper-icon-button-light'; +import 'jquery'; +import datetime from '../../../scripts/datetime'; +import loading from '../../../components/loading/loading'; +import libraryMenu from '../../../scripts/libraryMenu'; +import globalize from '../../../scripts/globalize'; +import '../../../components/listview/listview.css'; +import '../../../elements/emby-button/paper-icon-button-light'; /* eslint-disable indent */ @@ -163,7 +163,7 @@ import 'paper-icon-button-light'; function onSaveComplete(page) { loading.hide(); - import('toast').then(({default: toast}) => { + import('../../../components/toast/toast').then((toast) => { toast(globalize.translate('SettingsSaved')); }); } @@ -195,7 +195,7 @@ import 'paper-icon-button-light'; function showSchedulePopup(page, schedule, index) { schedule = schedule || {}; - import('components/accessSchedule/accessSchedule').then(({default: accessschedule}) => { + import('../../../components/accessSchedule/accessSchedule').then(({default: accessschedule}) => { accessschedule.show({ schedule: schedule }).then(function (updatedSchedule) { @@ -228,7 +228,7 @@ import 'paper-icon-button-light'; } function showBlockedTagPopup(page) { - import('prompt').then(({default: prompt}) => { + import('../../../components/prompt/prompt').then(({default: prompt}) => { prompt({ label: globalize.translate('LabelTag') }).then(function (value) { diff --git a/src/controllers/dashboard/users/userpasswordpage.js b/src/controllers/dashboard/users/userpasswordpage.js index 880dccf9f..2f5246c54 100644 --- a/src/controllers/dashboard/users/userpasswordpage.js +++ b/src/controllers/dashboard/users/userpasswordpage.js @@ -1,7 +1,7 @@ -import loading from 'loading'; -import libraryMenu from 'libraryMenu'; -import globalize from 'globalize'; -import 'emby-button'; +import loading from '../../../components/loading/loading'; +import libraryMenu from '../../../scripts/libraryMenu'; +import globalize from '../../../scripts/globalize'; +import '../../../elements/emby-button/emby-button'; /* eslint-disable indent */ @@ -52,7 +52,7 @@ import 'emby-button'; page.querySelector('.chkEnableLocalEasyPassword').checked = user.Configuration.EnableLocalPassword; - import('autoFocuser').then(({default: autoFocuser}) => { + import('../../../components/autoFocuser').then(({default: autoFocuser}) => { autoFocuser.autoFocus(page); }); }); @@ -82,7 +82,7 @@ import 'emby-button'; ApiClient.updateUserConfiguration(user.Id, user.Configuration).then(function () { loading.hide(); - import('toast').then(({default: toast}) => { + import('../../../components/toast/toast').then((toast) => { toast(globalize.translate('SettingsSaved')); }); @@ -105,7 +105,7 @@ import 'emby-button'; ApiClient.updateUserPassword(userId, currentPassword, newPassword).then(function () { loading.hide(); - import('toast').then(({default: toast}) => { + import('../../../components/toast/toast').then((toast) => { toast(globalize.translate('PasswordSaved')); }); @@ -123,7 +123,7 @@ import 'emby-button'; const form = this; if (form.querySelector('#txtNewPassword').value != form.querySelector('#txtNewPasswordConfirm').value) { - import('toast').then(({default: toast}) => { + import('../../../components/toast/toast').then((toast) => { toast(globalize.translate('PasswordMatchError')); }); } else { @@ -144,7 +144,7 @@ import 'emby-button'; function resetPassword() { const msg = globalize.translate('PasswordResetConfirmation'); - import('confirm').then(({default: confirm}) => { + import('../../../components/confirm/confirm').then(({default: confirm}) => { confirm(msg, globalize.translate('ResetPassword')).then(function () { const userId = params.userId; loading.show(); @@ -163,7 +163,7 @@ import 'emby-button'; function resetEasyPassword() { const msg = globalize.translate('PinCodeResetConfirmation'); - import('confirm').then(({default: confirm}) => { + import('../../../components/confirm/confirm').then(({default: confirm}) => { confirm(msg, globalize.translate('HeaderPinCodeReset')).then(function () { const userId = params.userId; loading.show(); diff --git a/src/controllers/dashboard/users/userprofilespage.js b/src/controllers/dashboard/users/userprofilespage.js index bfd8d96d9..d0c5270d4 100644 --- a/src/controllers/dashboard/users/userprofilespage.js +++ b/src/controllers/dashboard/users/userprofilespage.js @@ -1,20 +1,20 @@ -import loading from 'loading'; -import dom from 'dom'; -import globalize from 'globalize'; -import * as datefns from 'date-fns'; -import dfnshelper from 'dfnshelper'; -import 'paper-icon-button-light'; -import 'cardStyle'; -import 'emby-button'; -import 'indicators'; -import 'flexStyles'; +import loading from '../../../components/loading/loading'; +import dom from '../../../scripts/dom'; +import globalize from '../../../scripts/globalize'; +import { formatDistanceToNow } from 'date-fns'; +import { localeWithSuffix } from '../../../scripts/dfnshelper'; +import '../../../elements/emby-button/paper-icon-button-light'; +import '../../../components/cardbuilder/card.css'; +import '../../../elements/emby-button/emby-button'; +import '../../../components/indicators/indicators.css'; +import '../../../assets/css/flexstyles.css'; /* eslint-disable indent */ function deleteUser(page, id) { const msg = globalize.translate('DeleteUserConfirmation'); - import('confirm').then(({default: confirm}) => { + import('../../../components/confirm/confirm').then(({default: confirm}) => { confirm({ title: globalize.translate('DeleteUser'), text: msg, @@ -55,7 +55,7 @@ import 'flexStyles'; icon: 'delete' }); - import('actionsheet').then(({default: actionsheet}) => { + import('../../../components/actionSheet/actionSheet').then(({default: actionsheet}) => { actionsheet.show({ items: menuItems, positionTo: card, @@ -139,7 +139,7 @@ import 'flexStyles'; // how dates are returned by the server when the session is active and show something like 'Active now', instead of past/future sentences function getLastSeenText(lastActivityDate) { if (lastActivityDate) { - return globalize.translate('LastSeen', datefns.formatDistanceToNow(Date.parse(lastActivityDate), dfnshelper.localeWithSuffix)); + return globalize.translate('LastSeen', formatDistanceToNow(Date.parse(lastActivityDate), localeWithSuffix)); } return ''; diff --git a/src/controllers/edititemmetadata.js b/src/controllers/edititemmetadata.js index dd51ba258..c28bda2ae 100644 --- a/src/controllers/edititemmetadata.js +++ b/src/controllers/edititemmetadata.js @@ -1,11 +1,11 @@ -import loading from 'loading'; -import 'scripts/editorsidebar'; +import loading from '../components/loading/loading'; +import '../scripts/editorsidebar'; function reload(context, itemId) { loading.show(); if (itemId) { - import('metadataEditor').then(({ default: metadataEditor }) => { + import('../components/metadataEditor/metadataEditor').then((metadataEditor) => { metadataEditor.embed(context.querySelector('.editPageInnerContent'), itemId, ApiClient.serverInfo().Id); }); } else { diff --git a/src/controllers/favorites.js b/src/controllers/favorites.js index fc37f4eef..01cd75e6e 100644 --- a/src/controllers/favorites.js +++ b/src/controllers/favorites.js @@ -1,12 +1,13 @@ -import appRouter from 'appRouter'; -import cardBuilder from 'cardBuilder'; -import dom from 'dom'; -import globalize from 'globalize'; -import appHost from 'apphost'; -import layoutManager from 'layoutManager'; -import focusManager from 'focusManager'; -import 'emby-itemscontainer'; -import 'emby-scroller'; +import appRouter from '../components/appRouter'; +import cardBuilder from '../components/cardbuilder/cardBuilder'; +import dom from '../scripts/dom'; +import globalize from '../scripts/globalize'; +import connectionManager from 'jellyfin-apiclient'; +import appHost from '../components/apphost'; +import layoutManager from '../components/layoutManager'; +import focusManager from '../components/focusManager'; +import '../elements/emby-itemscontainer/emby-itemscontainer'; +import '../elements/emby-scroller/emby-scroller'; /* eslint-disable indent */ diff --git a/src/controllers/home.js b/src/controllers/home.js index 72e326e46..56ad48126 100644 --- a/src/controllers/home.js +++ b/src/controllers/home.js @@ -1,8 +1,8 @@ -import TabbedView from 'tabbedView'; -import globalize from 'globalize'; -import 'emby-tabs'; -import 'emby-button'; -import 'emby-scroller'; +import TabbedView from '../components/tabbedview/tabbedview'; +import globalize from '../scripts/globalize'; +import '../elements/emby-tabs/emby-tabs'; +import '../elements/emby-button/emby-button'; +import '../elements/emby-scroller/emby-scroller'; class HomeView extends TabbedView { constructor(view, params) { diff --git a/src/controllers/hometab.js b/src/controllers/hometab.js index ff56e08d1..65047dbaa 100644 --- a/src/controllers/hometab.js +++ b/src/controllers/hometab.js @@ -1,8 +1,9 @@ -import * as userSettings from 'userSettings'; -import loading from 'loading'; -import focusManager from 'focusManager'; -import homeSections from 'homeSections'; -import 'emby-itemscontainer'; +import * as userSettings from '../scripts/settings/userSettings'; +import loading from '../components/loading/loading'; +import connectionManager from 'jellyfin-apiclient'; +import focusManager from '../components/focusManager'; +import homeSections from '../components/homesections/homesections'; +import '../elements/emby-itemscontainer/emby-itemscontainer'; class HomeTab { constructor(view, params) { diff --git a/src/controllers/itemDetails/index.js b/src/controllers/itemDetails/index.js index 4c2d29538..16a77076a 100644 --- a/src/controllers/itemDetails/index.js +++ b/src/controllers/itemDetails/index.js @@ -1,32 +1,32 @@ -import appHost from 'apphost'; -import loading from 'loading'; -import appRouter from 'appRouter'; -import itemShortcuts from 'itemShortcuts'; -import layoutManager from 'layoutManager'; -import * as userSettings from 'userSettings'; -import cardBuilder from 'cardBuilder'; -import datetime from 'datetime'; -import mediaInfo from 'mediaInfo'; -import backdrop from 'backdrop'; -import listView from 'listView'; -import itemContextMenu from 'itemContextMenu'; -import itemHelper from 'itemHelper'; -import dom from 'dom'; -import indicators from 'indicators'; -import imageLoader from 'imageLoader'; -import libraryMenu from 'libraryMenu'; -import globalize from 'globalize'; -import browser from 'browser'; -import events from 'events'; -import playbackManager from 'playbackManager'; -import 'scrollStyles'; -import 'emby-itemscontainer'; -import 'emby-checkbox'; -import 'emby-button'; -import 'emby-playstatebutton'; -import 'emby-ratingbutton'; -import 'emby-scroller'; -import 'emby-select'; +import appHost from '../../components/apphost'; +import loading from '../../components/loading/loading'; +import appRouter from '../../components/appRouter'; +import layoutManager from '../../components/layoutManager'; +import { connectionManager, events } from 'jellyfin-apiclient'; +import * as userSettings from '../../scripts/settings/userSettings'; +import cardBuilder from '../../components/cardbuilder/cardBuilder'; +import datetime from '../../scripts/datetime'; +import mediaInfo from '../../components/mediainfo/mediainfo'; +import backdrop from '../../components/backdrop/backdrop'; +import listView from '../../components/listview/listview'; +import itemContextMenu from '../../components/itemContextMenu'; +import itemHelper from '../../components/itemHelper'; +import dom from '../../scripts/dom'; +import indicators from '../../components/indicators/indicators'; +import imageLoader from '../../components/images/imageLoader'; +import libraryMenu from '../../scripts/libraryMenu'; +import globalize from '../../scripts/globalize'; +import browser from '../../scripts/browser'; +import playbackManager from '../../components/playback/playbackmanager'; +import '../../assets/css/scrollstyles.css'; +import '../../elements/emby-itemscontainer/emby-itemscontainer'; +import '../../elements/emby-checkbox/emby-checkbox'; +import '../../elements/emby-button/emby-button'; +import '../../elements/emby-playstatebutton/emby-playstatebutton'; +import '../../elements/emby-ratingbutton/emby-ratingbutton'; +import '../../elements/emby-scroller/emby-scroller'; +import '../../elements/emby-select/emby-select'; +import itemShortcuts from '../../components/shortcuts'; function getPromise(apiClient, params) { const id = params.id; @@ -140,7 +140,7 @@ function renderSeriesTimerEditor(page, item, apiClient, user) { } if (user.Policy.EnableLiveTvManagement) { - import('seriesRecordingEditor').then(({ default: seriesRecordingEditor }) => { + import('../../components/recordingcreator/seriesrecordingeditor').then(({ default: seriesRecordingEditor }) => { seriesRecordingEditor.embed(item, apiClient.serverId(), { context: page.querySelector('.seriesRecordingEditor') }); @@ -666,7 +666,7 @@ function reloadFromItem(instance, page, params, item, user) { hideAll(page, 'btnDownload', true); } - import('autoFocuser').then(({ default: autoFocuser }) => { + import('../../components/autoFocuser').then(({ default: autoFocuser }) => { autoFocuser.autoFocus(page); }); } @@ -708,7 +708,7 @@ function showRecordingFields(instance, page, item, user) { const recordingFieldsElement = page.querySelector('.recordingFields'); if (item.Type == 'Program' && user.Policy.EnableLiveTvManagement) { - import('recordingFields').then(({ default: recordingFields }) => { + import('../../components/recordingcreator/recordingfields').then(({ default: recordingFields }) => { instance.currentRecordingFields = new recordingFields({ parent: recordingFieldsElement, programId: item.Id, @@ -1485,13 +1485,13 @@ function renderChildren(page, item) { } function renderItemsByName(page, item) { - import('scripts/itembynamedetailpage').then(() => { + import('../../scripts/itembynamedetailpage').then(() => { window.ItemsByName.renderItems(page, item); }); } function renderPlaylistItems(page, item) { - import('scripts/playlistedit').then(() => { + import('../../scripts/playlistedit').then(() => { PlaylistViewer.render(page, item); }); } @@ -1695,7 +1695,7 @@ function renderCollectionItems(page, parentItem, types, items) { // HACK: Call autoFocuser again because btnPlay may be hidden, but focused by reloadFromItem // FIXME: Sometimes focus does not move until all (?) sections are loaded - import('autoFocuser').then(({ default: autoFocuser }) => { + import('../../components/autoFocuser').then(({ default: autoFocuser }) => { autoFocuser.autoFocus(page); }); } @@ -1770,7 +1770,7 @@ function renderScenes(page, item) { page.querySelector('#scenesCollapsible').classList.remove('hide'); const scenesContent = page.querySelector('#scenesContent'); - import('chaptercardbuilder').then(({ default: chaptercardbuilder }) => { + import('../../components/cardbuilder/chaptercardbuilder').then(({ default: chaptercardbuilder }) => { chaptercardbuilder.buildChapterCards(item, chapters, { itemsContainer: scenesContent, backdropShape: 'overflowBackdrop', @@ -1815,7 +1815,7 @@ function renderCast(page, item) { page.querySelector('#castCollapsible').classList.remove('hide'); const castContent = page.querySelector('#castContent'); - import('peoplecardbuilder').then(({ default: peoplecardbuilder }) => { + import('../../components/cardbuilder/peoplecardbuilder').then(({ default: peoplecardbuilder }) => { peoplecardbuilder.buildPeopleCards(people, { itemsContainer: castContent, coverImage: true, @@ -1863,7 +1863,7 @@ export default function (view, params) { } function splitVersions(instance, page, apiClient, params) { - import('confirm').then(({ default: confirm }) => { + import('../../components/confirm/confirm').then(({ default: confirm }) => { confirm('Are you sure you wish to split the media sources into separate items?', 'Split Media Apart').then(function () { loading.show(); apiClient.ajax({ @@ -1929,7 +1929,7 @@ export default function (view, params) { } function onCancelSeriesTimerClick() { - import('recordingHelper').then(({ default: recordingHelper }) => { + import('../../components/recordingcreator/recordinghelper').then(({ default: recordingHelper }) => { recordingHelper.cancelSeriesTimerWithConfirmation(currentItem.Id, currentItem.ServerId).then(function () { Dashboard.navigate('livetv.html'); }); @@ -1937,7 +1937,7 @@ export default function (view, params) { } function onCancelTimerClick() { - import('recordingHelper').then(({ default: recordingHelper }) => { + import('../../components/recordingcreator/recordinghelper').then(({ default: recordingHelper }) => { recordingHelper.cancelTimer(window.connectionManager.getApiClient(currentItem.ServerId), currentItem.TimerId).then(function () { reload(self, view, params); }); @@ -1949,7 +1949,7 @@ export default function (view, params) { } function onDownloadClick() { - import('fileDownloader').then(({ default: fileDownloader }) => { + import('../../scripts/fileDownloader').then(({ default: fileDownloader }) => { const downloadHref = apiClient.getItemDownloadUrl(currentItem.Id); fileDownloader.download([{ url: downloadHref, diff --git a/src/controllers/list.js b/src/controllers/list.js index 07e07eeb0..d356d800a 100644 --- a/src/controllers/list.js +++ b/src/controllers/list.js @@ -1,15 +1,16 @@ -import globalize from 'globalize'; -import listView from 'listView'; -import layoutManager from 'layoutManager'; -import * as userSettings from 'userSettings'; -import focusManager from 'focusManager'; -import cardBuilder from 'cardBuilder'; -import loading from 'loading'; -import AlphaNumericShortcuts from 'alphaNumericShortcuts'; -import playbackManager from 'playbackManager'; -import AlphaPicker from 'alphaPicker'; -import 'emby-itemscontainer'; -import 'emby-scroller'; +import globalize from '../scripts/globalize'; +import listView from '../components/listview/listview'; +import layoutManager from '../components/layoutManager'; +import * as userSettings from '../scripts/settings/userSettings'; +import focusManager from '../components/focusManager'; +import cardBuilder from '../components/cardbuilder/cardBuilder'; +import loading from '../components/loading/loading'; +import connectionManager from 'jellyfin-apiclient'; +import AlphaNumericShortcuts from '../scripts/alphanumericshortcuts'; +import playbackManager from '../components/playback/playbackmanager'; +import AlphaPicker from '../components/alphaPicker/alphaPicker'; +import '../elements/emby-itemscontainer/emby-itemscontainer'; +import '../elements/emby-scroller/emby-scroller'; /* eslint-disable indent */ @@ -345,7 +346,7 @@ import 'emby-scroller'; function showViewSettingsMenu() { const instance = this; - import('viewSettings').then(({default: ViewSettings}) => { + import('../components/viewSettings/viewSettings').then((ViewSettings) => { new ViewSettings().show({ settingsKey: instance.getSettingsKey(), settings: instance.getViewSettings(), @@ -360,7 +361,7 @@ import 'emby-scroller'; function showFilterMenu() { const instance = this; - import('filterMenu').then(({default: FilterMenu}) => { + import('../components/filtermenu/filtermenu').then(({default: FilterMenu}) => { new FilterMenu().show({ settingsKey: instance.getSettingsKey(), settings: instance.getFilters(), @@ -379,7 +380,7 @@ import 'emby-scroller'; function showSortMenu() { const instance = this; - import('sortMenu').then(({default: SortMenu}) => { + import('../components/sortmenu/sortmenu').then((SortMenu) => { new SortMenu().show({ settingsKey: instance.getSettingsKey(), settings: instance.getSortValues(), @@ -397,7 +398,7 @@ import 'emby-scroller'; function onNewItemClick() { const instance = this; - import('playlistEditor').then(({default: playlistEditor}) => { + import('../components/playlisteditor/playlisteditor').then((playlistEditor) => { new playlistEditor({ items: [], serverId: instance.params.serverId diff --git a/src/controllers/livetv/livetvchannels.js b/src/controllers/livetv/livetvchannels.js index 278200c63..9de6e7178 100644 --- a/src/controllers/livetv/livetvchannels.js +++ b/src/controllers/livetv/livetvchannels.js @@ -1,10 +1,10 @@ -import cardBuilder from 'cardBuilder'; -import imageLoader from 'imageLoader'; -import libraryBrowser from 'libraryBrowser'; -import loading from 'loading'; -import events from 'events'; -import * as userSettings from 'userSettings'; -import 'emby-itemscontainer'; +import cardBuilder from '../../components/cardbuilder/cardBuilder'; +import imageLoader from '../../components/images/imageLoader'; +import libraryBrowser from '../../scripts/libraryBrowser'; +import loading from '../../components/loading/loading'; +import events from 'jellyfin-apiclient'; +import * as userSettings from '../../scripts/settings/userSettings'; +import '../../elements/emby-itemscontainer/emby-itemscontainer'; export default function (view, params, tabContent) { function getPageData() { @@ -115,7 +115,7 @@ export default function (view, params, tabContent) { loading.hide(); isLoading = false; - import('autoFocuser').then(({default: autoFocuser}) => { + import('../../components/autoFocuser').then(({default: autoFocuser}) => { autoFocuser.autoFocus(view); }); }); diff --git a/src/controllers/livetv/livetvguide.js b/src/controllers/livetv/livetvguide.js index f8b49bd22..c56d4ebd0 100644 --- a/src/controllers/livetv/livetvguide.js +++ b/src/controllers/livetv/livetvguide.js @@ -1,4 +1,4 @@ -import tvguide from 'tvguide'; +import tvguide from '../../components/guide/guide'; export default function (view, params, tabContent) { let guideInstance; diff --git a/src/controllers/livetv/livetvrecordings.js b/src/controllers/livetv/livetvrecordings.js index ec2f57e14..23197da6c 100644 --- a/src/controllers/livetv/livetvrecordings.js +++ b/src/controllers/livetv/livetvrecordings.js @@ -1,9 +1,9 @@ -import loading from 'loading'; -import cardBuilder from 'cardBuilder'; -import imageLoader from 'imageLoader'; -import 'scripts/livetvcomponents'; -import 'listViewStyle'; -import 'emby-itemscontainer'; +import loading from '../../components/loading/loading'; +import cardBuilder from '../../components/cardbuilder/cardBuilder'; +import imageLoader from '../../components/images/imageLoader'; +import '../../scripts/livetvcomponents'; +import '../../components/listview/listview.css'; +import '../../elements/emby-itemscontainer/emby-itemscontainer'; function renderRecordings(elem, recordings, cardOptions, scrollX) { if (!elem) { diff --git a/src/controllers/livetv/livetvschedule.js b/src/controllers/livetv/livetvschedule.js index d7bfbad05..2e795f0c7 100644 --- a/src/controllers/livetv/livetvschedule.js +++ b/src/controllers/livetv/livetvschedule.js @@ -1,10 +1,10 @@ -import layoutManager from 'layoutManager'; -import cardBuilder from 'cardBuilder'; -import imageLoader from 'imageLoader'; -import loading from 'loading'; -import 'scripts/livetvcomponents'; -import 'emby-button'; -import 'emby-itemscontainer'; +import layoutManager from '../../components/layoutManager'; +import cardBuilder from '../../components/cardbuilder/cardBuilder'; +import imageLoader from '../../components/images/imageLoader'; +import loading from '../../components/loading/loading'; +import '../../scripts/livetvcomponents'; +import '../../elements/emby-button/emby-button'; +import '../../elements/emby-itemscontainer/emby-itemscontainer'; function enableScrollX() { return !layoutManager.desktop; diff --git a/src/controllers/livetv/livetvseriestimers.js b/src/controllers/livetv/livetvseriestimers.js index 4f6bfaaa6..3029fca5a 100644 --- a/src/controllers/livetv/livetvseriestimers.js +++ b/src/controllers/livetv/livetvseriestimers.js @@ -1,8 +1,8 @@ -import cardBuilder from 'cardBuilder'; -import imageLoader from 'imageLoader'; -import loading from 'loading'; -import 'paper-icon-button-light'; -import 'emby-button'; +import cardBuilder from '../../components/cardbuilder/cardBuilder'; +import imageLoader from '../../components/images/imageLoader'; +import loading from '../../components/loading/loading'; +import '../../elements/emby-button/paper-icon-button-light'; +import '../../elements/emby-button/emby-button'; function renderTimers(context, timers) { const html = cardBuilder.getCardsHtml({ diff --git a/src/controllers/livetv/livetvsuggested.js b/src/controllers/livetv/livetvsuggested.js index 346630012..d820715f5 100644 --- a/src/controllers/livetv/livetvsuggested.js +++ b/src/controllers/livetv/livetvsuggested.js @@ -1,15 +1,15 @@ -import layoutManager from 'layoutManager'; -import * as userSettings from 'userSettings'; -import inputManager from 'inputManager'; -import loading from 'loading'; -import globalize from 'globalize'; -import * as mainTabsManager from 'mainTabsManager'; -import cardBuilder from 'cardBuilder'; -import imageLoader from 'imageLoader'; -import 'scrollStyles'; -import 'emby-itemscontainer'; -import 'emby-tabs'; -import 'emby-button'; +import layoutManager from '../../components/layoutManager'; +import * as userSettings from '../../scripts/settings/userSettings'; +import inputManager from '../../scripts/inputManager'; +import loading from '../../components/loading/loading'; +import globalize from '../../scripts/globalize'; +import * as mainTabsManager from '../../components/maintabsmanager'; +import cardBuilder from '../../components/cardbuilder/cardBuilder'; +import imageLoader from '../../components/images/imageLoader'; +import '../../assets/css/scrollstyles.css'; +import '../../elements/emby-itemscontainer/emby-itemscontainer'; +import '../../elements/emby-tabs/emby-tabs'; +import '../../elements/emby-button/emby-button'; function enableScrollX() { return !layoutManager.desktop; @@ -60,7 +60,7 @@ function loadRecommendedPrograms(page) { }); loading.hide(); - import('autoFocuser').then(({default: autoFocuser}) => { + import('../../components/autoFocuser').then(({default: autoFocuser}) => { autoFocuser.autoFocus(page); }); }); diff --git a/src/controllers/livetvguideprovider.js b/src/controllers/livetvguideprovider.js index 6ab195a08..750bbff47 100644 --- a/src/controllers/livetvguideprovider.js +++ b/src/controllers/livetvguideprovider.js @@ -1,6 +1,6 @@ -import events from 'events'; -import loading from 'loading'; -import globalize from 'globalize'; +import events from 'jellyfin-apiclient'; +import loading from '../components/loading/loading'; +import globalize from '../scripts/globalize'; function onListingsSubmitted() { Dashboard.navigate('livetvstatus.html'); @@ -17,7 +17,7 @@ function init(page, type, providerId) { } function loadTemplate(page, type, providerId) { - import('text!./../components/tvproviders/' + type + '.template.html').then(({default: html}) => { + import('./../components/tvproviders/' + type + '.template.html').then(({default: html}) => { page.querySelector('.providerTemplate').innerHTML = globalize.translateHtml(html); init(page, type, providerId); }); diff --git a/src/controllers/livetvsettings.js b/src/controllers/livetvsettings.js index 29ec4a10a..8946a4452 100644 --- a/src/controllers/livetvsettings.js +++ b/src/controllers/livetvsettings.js @@ -1,7 +1,7 @@ -import $ from 'jQuery'; -import loading from 'loading'; -import globalize from 'globalize'; -import 'emby-button'; +import 'jquery'; +import loading from '../components/loading/loading'; +import globalize from '../scripts/globalize'; +import '../elements/emby-button/emby-button'; function loadPage(page, config) { $('.liveTvSettingsForm', page).show(); @@ -50,7 +50,7 @@ function showSaveMessage(recordingPathChanged) { } if (msg) { - import('alert').then(({default: alert}) => { + import('../components/alert').then(({default: alert}) => { alert(msg); }); } @@ -61,7 +61,7 @@ export default function () { const page = this; $('.liveTvSettingsForm').off('submit', onSubmit).on('submit', onSubmit); $('#btnSelectRecordingPath', page).on('click.selectDirectory', function () { - import('directorybrowser').then(({default: directoryBrowser}) => { + import('../components/directorybrowser/directorybrowser').then(({default: directoryBrowser}) => { const picker = new directoryBrowser(); picker.show({ callback: function (path) { @@ -76,7 +76,7 @@ export default function () { }); }); $('#btnSelectMovieRecordingPath', page).on('click.selectDirectory', function () { - import('directorybrowser').then(({default: directoryBrowser}) => { + import('../components/directorybrowser/directorybrowser').then(({default: directoryBrowser}) => { const picker = new directoryBrowser(); picker.show({ callback: function (path) { @@ -91,7 +91,7 @@ export default function () { }); }); $('#btnSelectSeriesRecordingPath', page).on('click.selectDirectory', function () { - import('directorybrowser').then(({default: directoryBrowser}) => { + import('../components/directorybrowser/directorybrowser').then(({default: directoryBrowser}) => { const picker = new directoryBrowser(); picker.show({ callback: function (path) { @@ -106,7 +106,7 @@ export default function () { }); }); $('#btnSelectPostProcessorPath', page).on('click.selectDirectory', function () { - import('directorybrowser').then(({default: directoryBrowser}) => { + import('../components/directorybrowser/directorybrowser').then(({default: directoryBrowser}) => { const picker = new directoryBrowser(); picker.show({ includeFiles: true, diff --git a/src/controllers/livetvstatus.js b/src/controllers/livetvstatus.js index dcf15adf0..ac44336cc 100644 --- a/src/controllers/livetvstatus.js +++ b/src/controllers/livetvstatus.js @@ -1,16 +1,16 @@ -import $ from 'jQuery'; -import globalize from 'globalize'; -import taskButton from 'scripts/taskbutton'; -import dom from 'dom'; -import layoutManager from 'layoutManager'; -import loading from 'loading'; -import browser from 'browser'; -import 'listViewStyle'; -import 'flexStyles'; -import 'emby-itemscontainer'; -import 'cardStyle'; -import 'material-icons'; -import 'emby-button'; +import 'jquery'; +import globalize from '../scripts/globalize'; +import taskButton from '../scripts/taskbutton'; +import dom from '../scripts/dom'; +import layoutManager from '../components/layoutManager'; +import loading from '../components/loading/loading'; +import browser from '../scripts/browser'; +import '../components/listview/listview.css'; +import '../assets/css/flexstyles.css'; +import '../elements/emby-itemscontainer/emby-itemscontainer'; +import '../components/cardbuilder/card.css'; +import 'material-design-icons-iconfont'; +import '../elements/emby-button/emby-button'; const enableFocusTransform = !browser.slow && !browser.edge; @@ -56,7 +56,7 @@ function renderDevices(page, devices) { function deleteDevice(page, id) { const message = globalize.translate('MessageConfirmDeleteTunerDevice'); - import('confirm').then(({default: confirm}) => { + import('../components/confirm/confirm').then(({default: confirm}) => { confirm(message, globalize.translate('HeaderDeleteDevice')).then(function () { loading.show(); ApiClient.ajax({ @@ -145,7 +145,7 @@ function showProviderOptions(page, providerId, button) { id: 'map' }); - import('actionsheet').then(({default: actionsheet}) => { + import('../components/actionSheet/actionSheet').then(({default: actionsheet}) => { actionsheet.show({ items: items, positionTo: button @@ -163,7 +163,7 @@ function showProviderOptions(page, providerId, button) { } function mapChannels(page, providerId) { - import('components/channelMapper/channelMapper').then(({default: channelMapper}) => { + import('../components/channelMapper/channelMapper').then(({default: channelMapper}) => { new channelMapper({ serverId: ApiClient.serverInfo().Id, providerId: providerId @@ -174,7 +174,7 @@ function mapChannels(page, providerId) { function deleteProvider(page, id) { const message = globalize.translate('MessageConfirmDeleteGuideProvider'); - import('confirm').then(({default: confirm}) => { + import('../components/confirm/confirm').then(({default: confirm}) => { confirm(message, globalize.translate('HeaderDeleteProvider')).then(function () { loading.show(); ApiClient.ajax({ @@ -237,7 +237,7 @@ function addProvider(button) { id: 'xmltv' }); - import('actionsheet').then(({default: actionsheet}) => { + import('../components/actionSheet/actionSheet').then(({default: actionsheet}) => { actionsheet.show({ items: menuItems, positionTo: button, @@ -263,7 +263,7 @@ function showDeviceMenu(button, tunerDeviceId) { id: 'edit' }); - import('actionsheet').then(({default: actionsheet}) => { + import('../components/actionSheet/actionSheet').then(({default: actionsheet}) => { actionsheet.show({ items: items, positionTo: button diff --git a/src/controllers/livetvtuner.js b/src/controllers/livetvtuner.js index 0e3b2b689..383e52faf 100644 --- a/src/controllers/livetvtuner.js +++ b/src/controllers/livetvtuner.js @@ -1,10 +1,10 @@ -import globalize from 'globalize'; -import loading from 'loading'; -import dom from 'dom'; -import 'emby-input'; -import 'emby-button'; -import 'emby-checkbox'; -import 'emby-select'; +import globalize from '../scripts/globalize'; +import loading from '../components/loading/loading'; +import dom from '../scripts/dom'; +import '../elements/emby-input/emby-input'; +import '../elements/emby-button/emby-button'; +import '../elements/emby-checkbox/emby-checkbox'; +import '../elements/emby-select/emby-select'; function isM3uVariant(type) { return ['nextpvr'].indexOf(type || '') !== -1; @@ -102,7 +102,7 @@ function submitForm(page) { } function getDetectedDevice() { - return import('tunerPicker').then(({default: tunerPicker}) => { + return import('../components/tunerPicker').then((tunerPicker) => { return new tunerPicker().show({ serverId: ApiClient.serverId() }); @@ -211,7 +211,7 @@ export default function (view, params) { }); }); view.querySelector('.btnSelectPath').addEventListener('click', function () { - import('directorybrowser').then(({default: directorybrowser}) => { + import('../components/directorybrowser/directorybrowser').then(({default: directorybrowser}) => { const picker = new directorybrowser(); picker.show({ includeFiles: true, diff --git a/src/controllers/movies/moviecollections.js b/src/controllers/movies/moviecollections.js index 6aed25f9a..cfabe016c 100644 --- a/src/controllers/movies/moviecollections.js +++ b/src/controllers/movies/moviecollections.js @@ -1,11 +1,11 @@ -import loading from 'loading'; -import libraryBrowser from 'libraryBrowser'; -import imageLoader from 'imageLoader'; -import listView from 'listView'; -import cardBuilder from 'cardBuilder'; -import * as userSettings from 'userSettings'; -import globalize from 'globalize'; -import 'emby-itemscontainer'; +import loading from '../../components/loading/loading'; +import libraryBrowser from '../../scripts/libraryBrowser'; +import imageLoader from '../../components/images/imageLoader'; +import listView from '../../components/listview/listview'; +import cardBuilder from '../../components/cardbuilder/cardBuilder'; +import * as userSettings from '../../scripts/settings/userSettings'; +import globalize from '../../scripts/globalize'; +import '../../elements/emby-itemscontainer/emby-itemscontainer'; /* eslint-disable indent */ @@ -193,7 +193,7 @@ import 'emby-itemscontainer'; loading.hide(); isLoading = false; - import('autoFocuser').then(({default: autoFocuser}) => { + import('../../components/autoFocuser').then(({default: autoFocuser}) => { autoFocuser.autoFocus(page); }); }); @@ -246,7 +246,7 @@ import 'emby-itemscontainer'; reloadItems(tabContent); }); tabContent.querySelector('.btnNewCollection').addEventListener('click', () => { - import('collectionEditor').then(({default: collectionEditor}) => { + import('../../components/collectionEditor/collectionEditor').then(({default: collectionEditor}) => { const serverId = ApiClient.serverInfo().Id; new collectionEditor({ items: [], diff --git a/src/controllers/movies/moviegenres.js b/src/controllers/movies/moviegenres.js index ca02ede36..2b106dc36 100644 --- a/src/controllers/movies/moviegenres.js +++ b/src/controllers/movies/moviegenres.js @@ -1,11 +1,11 @@ -import layoutManager from 'layoutManager'; -import loading from 'loading'; -import libraryBrowser from 'libraryBrowser'; -import cardBuilder from 'cardBuilder'; -import lazyLoader from 'lazyLoader'; -import globalize from 'globalize'; -import appRouter from 'appRouter'; -import 'emby-button'; +import layoutManager from '../../components/layoutManager'; +import loading from '../../components/loading/loading'; +import libraryBrowser from '../../scripts/libraryBrowser'; +import cardBuilder from '../../components/cardbuilder/cardBuilder'; +import lazyLoader from '../../components/lazyLoader/lazyLoaderIntersectionObserver'; +import globalize from '../../scripts/globalize'; +import appRouter from '../../components/appRouter'; +import '../../elements/emby-button/emby-button'; /* eslint-disable indent */ diff --git a/src/controllers/movies/movies.js b/src/controllers/movies/movies.js index 09be5a71f..648290abe 100644 --- a/src/controllers/movies/movies.js +++ b/src/controllers/movies/movies.js @@ -1,12 +1,12 @@ -import loading from 'loading'; -import * as userSettings from 'userSettings'; -import events from 'events'; -import libraryBrowser from 'libraryBrowser'; -import AlphaPicker from 'alphaPicker'; -import listView from 'listView'; -import cardBuilder from 'cardBuilder'; -import globalize from 'globalize'; -import 'emby-itemscontainer'; +import loading from '../../components/loading/loading'; +import * as userSettings from '../../scripts/settings/userSettings'; +import events from 'jellyfin-apiclient'; +import libraryBrowser from '../../scripts/libraryBrowser'; +import { AlphaPicker } from '../../components/alphaPicker/alphaPicker'; +import listView from '../../components/listview/listview'; +import cardBuilder from '../../components/cardbuilder/cardBuilder'; +import globalize from '../../scripts/globalize'; +import '../../elements/emby-itemscontainer/emby-itemscontainer'; /* eslint-disable indent */ @@ -91,7 +91,7 @@ import 'emby-itemscontainer'; isLoading = false; loading.hide(); - import('autoFocuser').then(({default: autoFocuser}) => { + import('../../components/autoFocuser').then(({default: autoFocuser}) => { autoFocuser.autoFocus(tabContent); }); } @@ -278,7 +278,7 @@ import 'emby-itemscontainer'; query = userSettings.loadQuerySettings(savedQueryKey, query); this.showFilterMenu = function () { - import('components/filterdialog/filterdialog').then(({default: filterDialogFactory}) => { + import('../../components/filterdialog/filterdialog').then(({default: filterDialogFactory}) => { const filterDialog = new filterDialogFactory({ query: query, mode: 'movies', diff --git a/src/controllers/movies/moviesrecommended.js b/src/controllers/movies/moviesrecommended.js index 80e391c5e..1270e9f13 100644 --- a/src/controllers/movies/moviesrecommended.js +++ b/src/controllers/movies/moviesrecommended.js @@ -1,18 +1,19 @@ -import events from 'events'; -import layoutManager from 'layoutManager'; -import inputManager from 'inputManager'; -import * as userSettings from 'userSettings'; -import libraryMenu from 'libraryMenu'; -import * as mainTabsManager from 'mainTabsManager'; -import cardBuilder from 'cardBuilder'; -import dom from 'dom'; -import imageLoader from 'imageLoader'; -import playbackManager from 'playbackManager'; -import globalize from 'globalize'; -import 'emby-scroller'; -import 'emby-itemscontainer'; -import 'emby-tabs'; -import 'emby-button'; + +import events from 'jellyfin-apiclient'; +import layoutManager from '../../components/layoutManager'; +import inputManager from '../../scripts/inputManager'; +import * as userSettings from '../../scripts/settings/userSettings'; +import libraryMenu from '../../scripts/libraryMenu'; +import * as mainTabsManager from '../../components/maintabsmanager'; +import cardBuilder from '../../components/cardbuilder/cardBuilder'; +import dom from '../../scripts/dom'; +import imageLoader from '../../components/images/imageLoader'; +import playbackManager from '../../components/playback/playbackmanager'; +import globalize from '../../scripts/globalize'; +import '../../elements/emby-scroller/emby-scroller'; +import '../../elements/emby-itemscontainer/emby-itemscontainer'; +import '../../elements/emby-tabs/emby-tabs'; +import '../../elements/emby-button/emby-button'; /* eslint-disable indent */ @@ -182,7 +183,7 @@ import 'emby-button'; } function autoFocus(page) { - import('autoFocuser').then(({default: autoFocuser}) => { + import('../../components/autoFocuser').then(({default: autoFocuser}) => { autoFocuser.autoFocus(page); }); } diff --git a/src/controllers/movies/movietrailers.js b/src/controllers/movies/movietrailers.js index def55d919..4f92b139b 100644 --- a/src/controllers/movies/movietrailers.js +++ b/src/controllers/movies/movietrailers.js @@ -1,13 +1,13 @@ -import loading from 'loading'; -import events from 'events'; -import libraryBrowser from 'libraryBrowser'; -import imageLoader from 'imageLoader'; -import AlphaPicker from 'alphaPicker'; -import listView from 'listView'; -import cardBuilder from 'cardBuilder'; -import * as userSettings from 'userSettings'; -import globalize from 'globalize'; -import 'emby-itemscontainer'; +import loading from '../../components/loading/loading'; +import events from 'jellyfin-apiclient'; +import libraryBrowser from '../../scripts/libraryBrowser'; +import imageLoader from '../../components/images/imageLoader'; +import { AlphaPicker } from '../../components/alphaPicker/alphaPicker'; +import listView from '../../components/listview/listview'; +import cardBuilder from '../../components/cardbuilder/cardBuilder'; +import * as userSettings from '../../scripts/settings/userSettings'; +import globalize from '../../scripts/globalize'; +import '../../elements/emby-itemscontainer/emby-itemscontainer'; /* eslint-disable indent */ @@ -192,7 +192,7 @@ import 'emby-itemscontainer'; let isLoading = false; this.showFilterMenu = function () { - import('components/filterdialog/filterdialog').then(({default: filterDialogFactory}) => { + import('../../components/filterdialog/filterdialog').then(({default: filterDialogFactory}) => { const filterDialog = new filterDialogFactory({ query: getQuery(tabContent), mode: 'movies', diff --git a/src/controllers/music/musicalbums.js b/src/controllers/music/musicalbums.js index 55e59b628..d9abe48fe 100644 --- a/src/controllers/music/musicalbums.js +++ b/src/controllers/music/musicalbums.js @@ -1,14 +1,14 @@ -import playbackManager from 'playbackManager'; -import loading from 'loading'; -import events from 'events'; -import libraryBrowser from 'libraryBrowser'; -import imageLoader from 'imageLoader'; -import AlphaPicker from 'alphaPicker'; -import listView from 'listView'; -import cardBuilder from 'cardBuilder'; -import * as userSettings from 'userSettings'; -import globalize from 'globalize'; -import 'emby-itemscontainer'; +import playbackManager from '../../components/playback/playbackmanager'; +import loading from '../../components/loading/loading'; +import events from 'jellyfin-apiclient'; +import libraryBrowser from '../../scripts/libraryBrowser'; +import imageLoader from '../../components/images/imageLoader'; +import AlphaPicker from '../../components/alphaPicker/alphaPicker'; +import listView from '../../components/listview/listview'; +import cardBuilder from '../../components/cardbuilder/cardBuilder'; +import * as userSettings from '../../scripts/settings/userSettings'; +import globalize from '../../scripts/globalize'; +import '../../elements/emby-itemscontainer/emby-itemscontainer'; /* eslint-disable indent */ @@ -179,7 +179,7 @@ import 'emby-itemscontainer'; loading.hide(); isLoading = false; - import('autoFocuser').then(({default: autoFocuser}) => { + import('../../components/autoFocuser').then(({default: autoFocuser}) => { autoFocuser.autoFocus(tabContent); }); }); @@ -204,7 +204,7 @@ import 'emby-itemscontainer'; let isLoading = false; this.showFilterMenu = function () { - import('components/filterdialog/filterdialog').then(({default: filterDialogFactory}) => { + import('../../components/filterdialog/filterdialog').then(({default: filterDialogFactory}) => { const filterDialog = new filterDialogFactory({ query: getQuery(), mode: 'albums', diff --git a/src/controllers/music/musicartists.js b/src/controllers/music/musicartists.js index 351743762..a7c01220c 100644 --- a/src/controllers/music/musicartists.js +++ b/src/controllers/music/musicartists.js @@ -1,12 +1,12 @@ -import loading from 'loading'; -import events from 'events'; -import libraryBrowser from 'libraryBrowser'; -import imageLoader from 'imageLoader'; -import AlphaPicker from 'alphaPicker'; -import listView from 'listView'; -import cardBuilder from 'cardBuilder'; -import * as userSettings from 'userSettings'; -import 'emby-itemscontainer'; +import loading from '../../components/loading/loading'; +import events from 'jellyfin-apiclient'; +import libraryBrowser from '../../scripts/libraryBrowser'; +import imageLoader from '../../components/images/imageLoader'; +import { AlphaPicker } from '../../components/alphaPicker/alphaPicker'; +import listView from '../../components/listview/listview'; +import cardBuilder from '../../components/cardbuilder/cardBuilder'; +import * as userSettings from '../../scripts/settings/userSettings'; +import '../../elements/emby-itemscontainer/emby-itemscontainer'; /* eslint-disable indent */ @@ -161,7 +161,7 @@ import 'emby-itemscontainer'; loading.hide(); isLoading = false; - import('autoFocuser').then(({default: autoFocuser}) => { + import('../../components/autoFocuser').then(({default: autoFocuser}) => { autoFocuser.autoFocus(tabContent); }); }); @@ -176,7 +176,7 @@ import 'emby-itemscontainer'; let isLoading = false; this.showFilterMenu = function () { - import('components/filterdialog/filterdialog').then(({default: filterDialogFactory}) => { + import('../../components/filterdialog/filterdialog').then(({default: filterDialogFactory}) => { const filterDialog = new filterDialogFactory({ query: getQuery(tabContent), mode: this.mode, diff --git a/src/controllers/music/musicgenres.js b/src/controllers/music/musicgenres.js index 2cd9e2114..c0e48e9a5 100644 --- a/src/controllers/music/musicgenres.js +++ b/src/controllers/music/musicgenres.js @@ -1,7 +1,7 @@ -import libraryBrowser from 'libraryBrowser'; -import cardBuilder from 'cardBuilder'; -import imageLoader from 'imageLoader'; -import loading from 'loading'; +import libraryBrowser from '../../scripts/libraryBrowser'; +import cardBuilder from '../../components/cardbuilder/cardBuilder'; +import imageLoader from '../../components/images/imageLoader'; +import loading from '../../components/loading/loading'; /* eslint-disable indent */ @@ -92,7 +92,7 @@ import loading from 'loading'; libraryBrowser.saveQueryValues(getSavedQueryKey(), query); loading.hide(); - import('autoFocuser').then(({default: autoFocuser}) => { + import('../../components/autoFocuser').then(({default: autoFocuser}) => { autoFocuser.autoFocus(context); }); }); diff --git a/src/controllers/music/musicplaylists.js b/src/controllers/music/musicplaylists.js index 67e6a959e..2d98aa5a9 100644 --- a/src/controllers/music/musicplaylists.js +++ b/src/controllers/music/musicplaylists.js @@ -1,7 +1,7 @@ -import libraryBrowser from 'libraryBrowser'; -import cardBuilder from 'cardBuilder'; -import imageLoader from 'imageLoader'; -import loading from 'loading'; +import libraryBrowser from '../../scripts/libraryBrowser'; +import cardBuilder from '../../components/cardbuilder/cardBuilder'; +import imageLoader from '../../components/images/imageLoader'; +import loading from '../../components/loading/loading'; /* eslint-disable indent */ @@ -63,7 +63,7 @@ import loading from 'loading'; libraryBrowser.saveQueryValues(getSavedQueryKey(), query); loading.hide(); - import('autoFocuser').then(({default: autoFocuser}) => { + import('../../components/autoFocuser').then(({default: autoFocuser}) => { autoFocuser.autoFocus(context); }); }); diff --git a/src/controllers/music/musicrecommended.js b/src/controllers/music/musicrecommended.js index 32137ccaa..d0f701041 100644 --- a/src/controllers/music/musicrecommended.js +++ b/src/controllers/music/musicrecommended.js @@ -1,19 +1,19 @@ -import browser from 'browser'; -import layoutManager from 'layoutManager'; -import * as userSettings from 'userSettings'; -import inputManager from 'inputManager'; -import loading from 'loading'; -import cardBuilder from 'cardBuilder'; -import dom from 'dom'; -import imageLoader from 'imageLoader'; -import libraryMenu from 'libraryMenu'; -import * as mainTabsManager from 'mainTabsManager'; -import globalize from 'globalize'; -import 'scrollStyles'; -import 'emby-itemscontainer'; -import 'emby-tabs'; -import 'emby-button'; -import 'flexStyles'; +import browser from '../../scripts/browser'; +import layoutManager from '../../components/layoutManager'; +import * as userSettings from '../../scripts/settings/userSettings'; +import inputManager from '../../scripts/inputManager'; +import loading from '../../components/loading/loading'; +import cardBuilder from '../../components/cardbuilder/cardBuilder'; +import dom from '../../scripts/dom'; +import imageLoader from '../../components/images/imageLoader'; +import libraryMenu from '../../scripts/libraryMenu'; +import * as mainTabsManager from '../../components/maintabsmanager'; +import globalize from '../../scripts/globalize'; +import '../../assets/css/scrollstyles.css'; +import '../../elements/emby-itemscontainer/emby-itemscontainer'; +import '../../elements/emby-tabs/emby-tabs'; +import '../../elements/emby-button/emby-button'; +import '../../assets/css/flexstyles.css'; /* eslint-disable indent */ @@ -74,7 +74,7 @@ import 'flexStyles'; imageLoader.lazyChildren(elem); loading.hide(); - import('autoFocuser').then(({default: autoFocuser}) => { + import('../../components/autoFocuser').then(({default: autoFocuser}) => { autoFocuser.autoFocus(page); }); }); @@ -170,7 +170,7 @@ import 'flexStyles'; loadRecentlyPlayed(tabContent, parentId); loadFrequentlyPlayed(tabContent, parentId); - import('components/favoriteitems').then(({default: favoriteItems}) => { + import('../../components/favoriteitems').then(({default: favoriteItems}) => { favoriteItems.render(tabContent, ApiClient.getCurrentUserId(), parentId, ['favoriteArtists', 'favoriteAlbums', 'favoriteSongs']); }); } diff --git a/src/controllers/music/songs.js b/src/controllers/music/songs.js index d30c74deb..cc526df6b 100644 --- a/src/controllers/music/songs.js +++ b/src/controllers/music/songs.js @@ -1,11 +1,12 @@ -import events from 'events'; -import libraryBrowser from 'libraryBrowser'; -import imageLoader from 'imageLoader'; -import listView from 'listView'; -import loading from 'loading'; -import * as userSettings from 'userSettings'; -import globalize from 'globalize'; -import 'emby-itemscontainer'; + +import events from 'jellyfin-apiclient'; +import libraryBrowser from '../../scripts/libraryBrowser'; +import imageLoader from '../../components/images/imageLoader'; +import listView from '../../components/listview/listview'; +import loading from '../../components/loading/loading'; +import * as userSettings from '../../scripts/settings/userSettings'; +import globalize from '../../scripts/globalize'; +import '../../elements/emby-itemscontainer/emby-itemscontainer'; /* eslint-disable indent */ @@ -119,7 +120,7 @@ import 'emby-itemscontainer'; loading.hide(); isLoading = false; - import('autoFocuser').then(({default: autoFocuser}) => { + import('../../components/autoFocuser').then(({default: autoFocuser}) => { autoFocuser.autoFocus(page); }); }); @@ -130,7 +131,7 @@ import 'emby-itemscontainer'; let isLoading = false; self.showFilterMenu = function () { - import('components/filterdialog/filterdialog').then(({default: filterDialogFactory}) => { + import('../../components/filterdialog/filterdialog').then(({default: filterDialogFactory}) => { const filterDialog = new filterDialogFactory({ query: getQuery(tabContent), mode: 'songs', diff --git a/src/controllers/playback/queue/index.js b/src/controllers/playback/queue/index.js index 581b5f4b8..8bece4eb3 100644 --- a/src/controllers/playback/queue/index.js +++ b/src/controllers/playback/queue/index.js @@ -1,6 +1,6 @@ -import remotecontrolFactory from 'components/remotecontrol/remotecontrol'; -import libraryMenu from 'libraryMenu'; -import 'emby-button'; +import remotecontrolFactory from '../../../components/remotecontrol/remotecontrol'; +import libraryMenu from '../../../scripts/libraryMenu'; +import '../../../elements/emby-button/emby-button'; export default function (view, params) { const remoteControl = new remotecontrolFactory(); diff --git a/src/controllers/playback/video/index.js b/src/controllers/playback/video/index.js index 492f4aeee..5e99971a8 100644 --- a/src/controllers/playback/video/index.js +++ b/src/controllers/playback/video/index.js @@ -1,22 +1,22 @@ -import playbackManager from 'playbackManager'; -import dom from 'dom'; -import inputManager from 'inputManager'; -import mouseManager from 'mouseManager'; -import datetime from 'datetime'; -import itemHelper from 'itemHelper'; -import mediaInfo from 'mediaInfo'; -import focusManager from 'focusManager'; -import events from 'events'; -import browser from 'browser'; -import globalize from 'globalize'; -import appHost from 'apphost'; -import layoutManager from 'layoutManager'; -import * as userSettings from 'userSettings'; -import keyboardnavigation from 'keyboardnavigation'; -import 'scrollStyles'; -import 'emby-slider'; -import 'paper-icon-button-light'; -import 'css!assets/css/videoosd'; +import playbackManager from '../../../components/playback/playbackmanager'; +import dom from '../../../scripts/dom'; +import inputManager from '../../../scripts/inputManager'; +import mouseManager from '../../../scripts/mouseManager'; +import datetime from '../../../scripts/datetime'; +import itemHelper from '../../../components/itemHelper'; +import mediaInfo from '../../../components/mediainfo/mediainfo'; +import focusManager from '../../../components/focusManager'; +import { connectionManager, events } from 'jellyfin-apiclient';; +import browser from '../../../scripts/browser'; +import globalize from '../../../scripts/globalize'; +import appHost from '../../../components/apphost'; +import layoutManager from '../../../components/layoutManager'; +import * as userSettings from '../../../scripts/settings/userSettings'; +import keyboardnavigation from '../../../scripts/keyboardNavigation'; +import '../../../assets/css/scrollstyles.css'; +import '../../../elements/emby-slider/emby-slider'; +import '../../../elements/emby-button/paper-icon-button-light'; +import '../../../assets/css/videoosd.css'; /* eslint-disable indent */ @@ -99,7 +99,7 @@ import 'css!assets/css/videoosd'; window.connectionManager.getApiClient(item.ServerId).getCurrentUser().then(function (user) { if (user.Policy.EnableLiveTvManagement) { - import('recordingButton').then(({default: RecordingButton}) => { + import('../../../components/recordingcreator/recordingbutton').then((RecordingButton) => { if (recordingButtonManager) { return void recordingButtonManager.refreshItem(item); } @@ -613,7 +613,7 @@ import 'css!assets/css/videoosd'; } function showComingUpNext(player) { - import('upNextDialog').then(({default: UpNextDialog}) => { + import('../../../components/upnextdialog/upnextdialog').then((UpNextDialog) => { if (!(currentVisibleMenu || currentUpNextDialog)) { currentVisibleMenu = 'upnext'; comingUpNextDisplayed = true; @@ -852,7 +852,7 @@ import 'css!assets/css/videoosd'; function onSettingsButtonClick(e) { const btn = this; - import('playerSettingsMenu').then(({default: playerSettingsMenu}) => { + import('../../../components/playback/playersettingsmenu').then((playerSettingsMenu) => { const player = currentPlayer; if (player) { @@ -889,7 +889,7 @@ import 'css!assets/css/videoosd'; } function toggleStats() { - import('playerStats').then(({default: PlayerStats}) => { + import('../../../components/playerstats/playerstats').then((PlayerStats) => { const player = currentPlayer; if (player) { @@ -929,7 +929,7 @@ import 'css!assets/css/videoosd'; }); const positionTo = this; - import('actionsheet').then(({default: actionsheet}) => { + import('../../../components/actionSheet/actionSheet').then(({default: actionsheet}) => { actionsheet.show({ items: menuItems, title: globalize.translate('Audio'), @@ -975,7 +975,7 @@ import 'css!assets/css/videoosd'; }); const positionTo = this; - import('actionsheet').then(({default: actionsheet}) => { + import('../../../components/actionSheet/actionSheet').then(({default: actionsheet}) => { actionsheet.show({ title: globalize.translate('Subtitles'), items: menuItems, @@ -997,7 +997,7 @@ import 'css!assets/css/videoosd'; } function toggleSubtitleSync(action) { - import('subtitleSync').then(({default: SubtitleSync}) => { + import('../../../components/subtitlesync/subtitlesync').then((SubtitleSync) => { const player = currentPlayer; if (subtitleSyncOverlay) { subtitleSyncOverlay.toggle(action); @@ -1228,7 +1228,7 @@ import 'css!assets/css/videoosd'; let playPauseClickTimeout; function onViewHideStopPlayback() { if (playbackManager.isPlayingVideo()) { - import('shell').then(({default: shell}) => { + import('../../../scripts/shell').then((shell) => { shell.disableFullscreen(); }); @@ -1248,7 +1248,7 @@ import 'css!assets/css/videoosd'; } } - import('shell').then(({default: shell}) => { + import('../../../scripts/shell').then(({default: shell}) => { shell.enableFullscreen(); }); @@ -1337,7 +1337,7 @@ import 'css!assets/css/videoosd'; passive: true }); } catch (e) { - import('appRouter').then(({default: appRouter}) => { + import('../../../components/appRouter').then(({default: appRouter}) => { appRouter.goHome(); }); } @@ -1548,7 +1548,7 @@ import 'css!assets/css/videoosd'; if (browser.touch) { (function () { - import('touchHelper').then(({default: TouchHelper}) => { + import('../../../scripts/touchHelper').then((TouchHelper) => { self.touchHelper = new TouchHelper(view, { swipeYThreshold: 30, triggerOnMove: true, diff --git a/src/controllers/searchpage.js b/src/controllers/searchpage.js index ffb7fbac0..9b40f6a06 100644 --- a/src/controllers/searchpage.js +++ b/src/controllers/searchpage.js @@ -1,6 +1,6 @@ -import SearchFields from 'searchFields'; -import SearchResults from 'searchResults'; -import events from 'events'; +import SearchFields from '../components/search/searchfields'; +import SearchResults from '../components/search/searchresults'; +import events from 'jellyfin-apiclient'; export default function (view, params) { function onSearch(e, value) { diff --git a/src/controllers/session/addServer/index.js b/src/controllers/session/addServer/index.js index 472d1274a..1a16d7374 100644 --- a/src/controllers/session/addServer/index.js +++ b/src/controllers/session/addServer/index.js @@ -1,7 +1,7 @@ -import appSettings from 'appSettings'; -import loading from 'loading'; -import globalize from 'globalize'; -import 'emby-button'; +import appSettings from '../../../scripts/settings/appSettings'; +import loading from '../../../components/loading/loading'; +import globalize from '../../../scripts/globalize'; +import '../../../elements/emby-button/emby-button'; /* eslint-disable indent */ @@ -51,7 +51,7 @@ import 'emby-button'; view.querySelector('.addServerForm').addEventListener('submit', onServerSubmit); view.querySelector('.btnCancel').addEventListener('click', goBack); - import('autoFocuser').then(({default: autoFocuser}) => { + import('../../../components/autoFocuser').then(({default: autoFocuser}) => { autoFocuser.autoFocus(view); }); @@ -62,7 +62,7 @@ import 'emby-button'; } function goBack() { - import('appRouter').then(({default: appRouter}) => { + import('../../../components/appRouter').then(({default: appRouter}) => { appRouter.back(); }); } diff --git a/src/controllers/session/forgotPassword/index.js b/src/controllers/session/forgotPassword/index.js index 5b92e255d..02de41e34 100644 --- a/src/controllers/session/forgotPassword/index.js +++ b/src/controllers/session/forgotPassword/index.js @@ -1,4 +1,4 @@ -import globalize from 'globalize'; +import globalize from '../../../scripts/globalize'; /* eslint-disable indent */ diff --git a/src/controllers/session/login/index.js b/src/controllers/session/login/index.js index 1592e6b11..4aef28b17 100644 --- a/src/controllers/session/login/index.js +++ b/src/controllers/session/login/index.js @@ -1,13 +1,14 @@ -import appHost from 'apphost'; -import appSettings from 'appSettings'; -import dom from 'dom'; -import loading from 'loading'; -import layoutManager from 'layoutManager'; -import libraryMenu from 'libraryMenu'; -import browser from 'browser'; -import globalize from 'globalize'; -import 'cardStyle'; -import 'emby-checkbox'; +import appHost from '../../../components/apphost'; +import appSettings from '../../../scripts/settings/appSettings'; +import dom from '../../../scripts/dom'; +import connectionManager from 'jellyfin-apiclient'; +import loading from '../../../components/loading/loading'; +import layoutManager from '../../../components/layoutManager'; +import libraryMenu from '../../../scripts/libraryMenu'; +import browser from '../../../scripts/browser'; +import globalize from '../../../scripts/globalize'; +import '../../../components/cardbuilder/card.css'; +import '../../../elements/emby-checkbox/emby-checkbox'; /* eslint-disable indent */ @@ -27,7 +28,7 @@ import 'emby-checkbox'; const UnauthorizedOrForbidden = [401, 403]; if (UnauthorizedOrForbidden.includes(response.status)) { - import('toast').then(({default: toast}) => { + import('../../../components/toast/toast').then((toast) => { const messageKey = response.status === 401 ? 'MessageInvalidUser' : 'MessageUnauthorizedUser'; toast(globalize.translate(messageKey)); }); @@ -202,7 +203,7 @@ import 'emby-checkbox'; view.querySelector('.manualLoginForm').classList.add('hide'); view.querySelector('.btnManual').classList.remove('hide'); - import('autoFocuser').then(({default: autoFocuser}) => { + import('../../../components/autoFocuser').then(({default: autoFocuser}) => { autoFocuser.autoFocus(view); }); } diff --git a/src/controllers/session/resetPassword/index.js b/src/controllers/session/resetPassword/index.js index d4f7df5bb..8ed9c18dd 100644 --- a/src/controllers/session/resetPassword/index.js +++ b/src/controllers/session/resetPassword/index.js @@ -1,4 +1,4 @@ -import globalize from 'globalize'; +import globalize from '../../../scripts/globalize'; /* eslint-disable indent */ diff --git a/src/controllers/session/selectServer/index.js b/src/controllers/session/selectServer/index.js index 6a590fc31..721cc8c10 100644 --- a/src/controllers/session/selectServer/index.js +++ b/src/controllers/session/selectServer/index.js @@ -1,19 +1,20 @@ -import loading from 'loading'; -import appRouter from 'appRouter'; -import layoutManager from 'layoutManager'; -import libraryMenu from 'libraryMenu'; -import appSettings from 'appSettings'; -import focusManager from 'focusManager'; -import globalize from 'globalize'; -import actionSheet from 'actionsheet'; -import dom from 'dom'; -import browser from 'browser'; -import 'material-icons'; -import 'flexStyles'; -import 'emby-scroller'; -import 'emby-itemscontainer'; -import 'cardStyle'; -import 'emby-button'; +import loading from '../../../components/loading/loading'; +import appRouter from '../../../components/appRouter'; +import layoutManager from '../../../components/layoutManager'; +import libraryMenu from '../../../scripts/libraryMenu'; +import appSettings from '../../../scripts/settings/appSettings'; +import focusManager from '../../../components/focusManager'; +import connectionManager from 'jellyfin-apiclient'; +import globalize from '../../../scripts/globalize'; +import actionSheet from '../../../components/actionSheet/actionSheet'; +import dom from '../../../scripts/dom'; +import browser from '../../../scripts/browser'; +import 'material-design-icons-iconfont'; +import '../../../assets/css/flexstyles.css'; +import '../../../elements/emby-scroller/emby-scroller'; +import '../../../elements/emby-itemscontainer/emby-itemscontainer'; +import '../../../components/cardbuilder/card.css'; +import '../../../elements/emby-button/emby-button'; /* eslint-disable indent */ @@ -100,7 +101,7 @@ import 'emby-button'; } function alertTextWithOptions(options) { - import('alert').then(({default: alert}) => { + import('../../../components/alert').then(({default: alert}) => { alert(options); }); } diff --git a/src/controllers/shows/episodes.js b/src/controllers/shows/episodes.js index 6dd633d7b..fb78c47b8 100644 --- a/src/controllers/shows/episodes.js +++ b/src/controllers/shows/episodes.js @@ -1,12 +1,12 @@ -import loading from 'loading'; -import events from 'events'; -import libraryBrowser from 'libraryBrowser'; -import imageLoader from 'imageLoader'; -import listView from 'listView'; -import cardBuilder from 'cardBuilder'; -import * as userSettings from 'userSettings'; -import globalize from 'globalize'; -import 'emby-itemscontainer'; +import loading from '../../components/loading/loading'; +import events from 'jellyfin-apiclient'; +import libraryBrowser from '../../scripts/libraryBrowser'; +import imageLoader from '../../components/images/imageLoader'; +import listView from '../../components/listview/listview'; +import cardBuilder from '../../components/cardbuilder/cardBuilder'; +import * as userSettings from '../../scripts/settings/userSettings'; +import globalize from '../../scripts/globalize'; +import '../../elements/emby-itemscontainer/emby-itemscontainer'; /* eslint-disable indent */ @@ -160,7 +160,7 @@ import 'emby-itemscontainer'; loading.hide(); isLoading = false; - import('autoFocuser').then(({default: autoFocuser}) => { + import('../../components/autoFocuser').then(({default: autoFocuser}) => { autoFocuser.autoFocus(page); }); }); @@ -171,7 +171,7 @@ import 'emby-itemscontainer'; let isLoading = false; self.showFilterMenu = function () { - import('components/filterdialog/filterdialog').then(({default: filterDialogFactory}) => { + import('../../components/filterdialog/filterdialog').then(({default: filterDialogFactory}) => { const filterDialog = new filterDialogFactory({ query: getQuery(tabContent), mode: 'episodes', diff --git a/src/controllers/shows/tvgenres.js b/src/controllers/shows/tvgenres.js index 3a17fd799..75e89ea9c 100644 --- a/src/controllers/shows/tvgenres.js +++ b/src/controllers/shows/tvgenres.js @@ -1,11 +1,11 @@ -import layoutManager from 'layoutManager'; -import loading from 'loading'; -import libraryBrowser from 'libraryBrowser'; -import cardBuilder from 'cardBuilder'; -import lazyLoader from 'lazyLoader'; -import globalize from 'globalize'; -import appRouter from 'appRouter'; -import 'emby-button'; +import layoutManager from '../../components/layoutManager'; +import loading from '../../components/loading/loading'; +import libraryBrowser from '../../scripts/libraryBrowser'; +import cardBuilder from '../../components/cardbuilder/cardBuilder'; +import lazyLoader from '../../components/lazyLoader/lazyLoaderIntersectionObserver'; +import globalize from '../../scripts/globalize'; +import appRouter from '../../components/appRouter'; +import '../../elements/emby-button/emby-button'; /* eslint-disable indent */ diff --git a/src/controllers/shows/tvrecommended.js b/src/controllers/shows/tvrecommended.js index db7bef2d5..d778beebf 100644 --- a/src/controllers/shows/tvrecommended.js +++ b/src/controllers/shows/tvrecommended.js @@ -1,17 +1,18 @@ -import events from 'events'; -import inputManager from 'inputManager'; -import libraryMenu from 'libraryMenu'; -import layoutManager from 'layoutManager'; -import loading from 'loading'; -import dom from 'dom'; -import * as userSettings from 'userSettings'; -import cardBuilder from 'cardBuilder'; -import playbackManager from 'playbackManager'; -import * as mainTabsManager from 'mainTabsManager'; -import globalize from 'globalize'; -import 'scrollStyles'; -import 'emby-itemscontainer'; -import 'emby-button'; + +import events from 'jellyfin-apiclient'; +import inputManager from '../../scripts/inputManager'; +import libraryMenu from '../../scripts/libraryMenu'; +import layoutManager from '../../components/layoutManager'; +import loading from '../../components/loading/loading'; +import dom from '../../scripts/dom'; +import * as userSettings from '../../scripts/settings/userSettings'; +import cardBuilder from '../../components/cardbuilder/cardBuilder'; +import playbackManager from '../../components/playback/playbackmanager'; +import * as mainTabsManager from '../../components/maintabsmanager'; +import globalize from '../../scripts/globalize'; +import '../../assets/css/scrollstyles.css'; +import '../../elements/emby-itemscontainer/emby-itemscontainer'; +import '../../elements/emby-button/emby-button'; /* eslint-disable indent */ @@ -127,7 +128,7 @@ import 'emby-button'; }); loading.hide(); - import('autoFocuser').then(({default: autoFocuser}) => { + import('../../components/autoFocuser').then(({default: autoFocuser}) => { autoFocuser.autoFocus(view); }); }); diff --git a/src/controllers/shows/tvshows.js b/src/controllers/shows/tvshows.js index 949c99460..b59e5a2c4 100644 --- a/src/controllers/shows/tvshows.js +++ b/src/controllers/shows/tvshows.js @@ -1,13 +1,13 @@ -import loading from 'loading'; -import events from 'events'; -import libraryBrowser from 'libraryBrowser'; -import imageLoader from 'imageLoader'; -import listView from 'listView'; -import cardBuilder from 'cardBuilder'; -import AlphaPicker from 'alphaPicker'; -import * as userSettings from 'userSettings'; -import globalize from 'globalize'; -import 'emby-itemscontainer'; +import loading from '../../components/loading/loading'; +import events from 'jellyfin-apiclient'; +import libraryBrowser from '../../scripts/libraryBrowser'; +import imageLoader from '../../components/images/imageLoader'; +import listView from '../../components/listview/listview'; +import cardBuilder from '../../components/cardbuilder/cardBuilder'; +import AlphaPicker from '../../components/alphaPicker/alphaPicker'; +import * as userSettings from '../../scripts/settings/userSettings'; +import globalize from '../../scripts/globalize'; +import '../../elements/emby-itemscontainer/emby-itemscontainer'; /* eslint-disable indent */ @@ -190,7 +190,7 @@ import 'emby-itemscontainer'; loading.hide(); isLoading = false; - import('autoFocuser').then(({default: autoFocuser}) => { + import('../../components/autoFocuser').then(({default: autoFocuser}) => { autoFocuser.autoFocus(page); }); }); @@ -214,7 +214,7 @@ import 'emby-itemscontainer'; let isLoading = false; this.showFilterMenu = function () { - import('components/filterdialog/filterdialog').then(({default: filterDialogFactory}) => { + import('../../components/filterdialog/filterdialog').then(({default: filterDialogFactory}) => { const filterDialog = new filterDialogFactory({ query: getQuery(tabContent), mode: 'series', diff --git a/src/controllers/shows/tvstudios.js b/src/controllers/shows/tvstudios.js index 4be717fb7..5a0276e5f 100644 --- a/src/controllers/shows/tvstudios.js +++ b/src/controllers/shows/tvstudios.js @@ -1,6 +1,6 @@ -import loading from 'loading'; -import libraryBrowser from 'libraryBrowser'; -import cardBuilder from 'cardBuilder'; +import loading from '../../components/loading/loading'; +import libraryBrowser from '../../scripts/libraryBrowser'; +import cardBuilder from '../../components/cardbuilder/cardBuilder'; /* eslint-disable indent */ @@ -50,7 +50,7 @@ import cardBuilder from 'cardBuilder'; }); loading.hide(); - import('autoFocuser').then(({default: autoFocuser}) => { + import('../../components/autoFocuser').then(({default: autoFocuser}) => { autoFocuser.autoFocus(context); }); }); diff --git a/src/controllers/shows/tvupcoming.js b/src/controllers/shows/tvupcoming.js index f9df3df34..897c02b5a 100644 --- a/src/controllers/shows/tvupcoming.js +++ b/src/controllers/shows/tvupcoming.js @@ -1,11 +1,11 @@ -import layoutManager from 'layoutManager'; -import loading from 'loading'; -import datetime from 'datetime'; -import cardBuilder from 'cardBuilder'; -import imageLoader from 'imageLoader'; -import globalize from 'globalize'; -import 'scrollStyles'; -import 'emby-itemscontainer'; +import layoutManager from '../../components/layoutManager'; +import loading from '../../components/loading/loading'; +import datetime from '../../scripts/datetime'; +import cardBuilder from '../../components/cardbuilder/cardBuilder'; +import imageLoader from '../../components/images/imageLoader'; +import globalize from '../../scripts/globalize'; +import '../../assets/css/scrollstyles.css'; +import '../../elements/emby-itemscontainer/emby-itemscontainer'; /* eslint-disable indent */ diff --git a/src/controllers/user/display/index.js b/src/controllers/user/display/index.js index 54f71ad57..322da7377 100644 --- a/src/controllers/user/display/index.js +++ b/src/controllers/user/display/index.js @@ -1,6 +1,6 @@ -import DisplaySettings from 'displaySettings'; -import * as userSettings from 'userSettings'; -import autoFocuser from 'autoFocuser'; +import DisplaySettings from '../../../components/displaySettings/displaySettings'; +import * as userSettings from '../../../scripts/settings/userSettings'; +import autoFocuser from '../../../components/autoFocuser'; /* eslint-disable indent */ diff --git a/src/controllers/user/home/index.js b/src/controllers/user/home/index.js index 539365ff9..a1bb503ad 100644 --- a/src/controllers/user/home/index.js +++ b/src/controllers/user/home/index.js @@ -1,7 +1,7 @@ -import HomescreenSettings from 'homescreenSettings'; -import * as userSettings from 'userSettings'; -import autoFocuser from 'autoFocuser'; -import 'listViewStyle'; +import HomescreenSettings from '../../../components/homeScreenSettings/homeScreenSettings'; +import * as userSettings from '../../../scripts/settings/userSettings'; +import autoFocuser from '../../../components/autoFocuser'; +import '../../../components/listview/listview.css'; /* eslint-disable indent */ diff --git a/src/controllers/user/menu/index.js b/src/controllers/user/menu/index.js index 88cf28a21..e480d0258 100644 --- a/src/controllers/user/menu/index.js +++ b/src/controllers/user/menu/index.js @@ -1,7 +1,7 @@ -import appHost from 'apphost'; -import layoutManager from 'layoutManager'; -import 'listViewStyle'; -import 'emby-button'; +import appHost from '../../../components/apphost'; +import '../../../components/listview/listview.css'; +import '../../../elements/emby-button/emby-button'; +import layoutManager from '../../../components/layoutManager'; export default function (view, params) { view.querySelector('.btnLogout').addEventListener('click', function () { @@ -53,7 +53,7 @@ export default function (view, params) { page.querySelector('.adminSection').classList.add('hide'); } - import('autoFocuser').then(({default: autoFocuser}) => { + import('../../../components/autoFocuser').then(({default: autoFocuser}) => { autoFocuser.autoFocus(view); }); }); diff --git a/src/controllers/user/playback/index.js b/src/controllers/user/playback/index.js index 34a5ae0b1..a44e96ec1 100644 --- a/src/controllers/user/playback/index.js +++ b/src/controllers/user/playback/index.js @@ -1,7 +1,8 @@ -import PlaybackSettings from 'playbackSettings'; -import * as userSettings from 'userSettings'; -import autoFocuser from 'autoFocuser'; -import 'listViewStyle'; + +import PlaybackSettings from '../../../components/playbackSettings/playbackSettings'; +import * as userSettings from '../../../scripts/settings/userSettings'; +import autoFocuser from '../../../components/autoFocuser'; +import '../../../components/listview/listview.css'; /* eslint-disable indent */ diff --git a/src/controllers/user/profile/index.js b/src/controllers/user/profile/index.js index 631253d01..deedaf306 100644 --- a/src/controllers/user/profile/index.js +++ b/src/controllers/user/profile/index.js @@ -1,9 +1,9 @@ -import UserPasswordPage from 'controllers/dashboard/users/userpasswordpage'; -import loading from 'loading'; -import libraryMenu from 'libraryMenu'; -import appHost from 'apphost'; -import globalize from 'globalize'; -import 'emby-button'; +import UserPasswordPage from '../../dashboard/users/userpasswordpage'; +import loading from '../../../components/loading/loading'; +import libraryMenu from '../../../scripts/libraryMenu'; +import appHost from '../../../components/apphost'; +import globalize from '../../../scripts/globalize'; +import '../../../elements/emby-button/emby-button'; function reloadUser(page) { const userId = getParameterByName('userId'); @@ -40,7 +40,7 @@ function onFileReaderError(evt) { loading.hide(); switch (evt.target.error.code) { case evt.target.error.NOT_FOUND_ERR: - import('toast').then(({default: toast}) => { + import('../../../components/toast/toast').then((toast) => { toast(globalize.translate('FileNotFound')); }); break; @@ -49,7 +49,7 @@ function onFileReaderError(evt) { break; case evt.target.error.NOT_READABLE_ERR: default: - import('toast').then(({default: toast}) => { + import('../../../components/toast/toast').then((toast) => { toast(globalize.translate('FileReadError')); }); } @@ -57,7 +57,7 @@ function onFileReaderError(evt) { function onFileReaderAbort(evt) { loading.hide(); - import('toast').then(({default: toast}) => { + import('../../../components/toast/toast').then((toast) => { toast(globalize.translate('FileReadCancelled')); }); } @@ -89,7 +89,7 @@ export default function (view, params) { reloadUser(view); new UserPasswordPage(view, params); view.querySelector('#btnDeleteImage').addEventListener('click', function () { - import('confirm').then(({default: confirm}) => { + import('../../../components/confirm/confirm').then(({default: confirm}) => { confirm(globalize.translate('DeleteImageConfirmation'), globalize.translate('DeleteImage')).then(function () { loading.show(); const userId = getParameterByName('userId'); diff --git a/src/controllers/user/subtitles/index.js b/src/controllers/user/subtitles/index.js index efa2f1bea..deb86535d 100644 --- a/src/controllers/user/subtitles/index.js +++ b/src/controllers/user/subtitles/index.js @@ -1,6 +1,6 @@ -import SubtitleSettings from 'subtitleSettings'; -import * as userSettings from 'userSettings'; -import autoFocuser from 'autoFocuser'; +import SubtitleSettings from '../../../components/subtitlesettings/subtitlesettings'; +import * as userSettings from '../../../scripts/settings/userSettings'; +import autoFocuser from '../../../components/autoFocuser'; /* eslint-disable indent */ diff --git a/src/controllers/wizard/finish/index.js b/src/controllers/wizard/finish/index.js index 5451d6665..446d01e61 100644 --- a/src/controllers/wizard/finish/index.js +++ b/src/controllers/wizard/finish/index.js @@ -1,4 +1,4 @@ -import loading from 'loading'; +import loading from '../../../components/loading/loading'; function onFinish() { loading.show(); diff --git a/src/controllers/wizard/remote/index.js b/src/controllers/wizard/remote/index.js index b967d668a..8f0aff72f 100644 --- a/src/controllers/wizard/remote/index.js +++ b/src/controllers/wizard/remote/index.js @@ -1,7 +1,7 @@ -import loading from 'loading'; -import 'emby-checkbox'; -import 'emby-button'; -import 'emby-select'; +import loading from '../../../components/loading/loading'; +import '../../../elements/emby-checkbox/emby-checkbox'; +import '../../../elements/emby-button/emby-button'; +import '../../../elements/emby-select/emby-select'; function save(page) { loading.show(); diff --git a/src/controllers/wizard/settings/index.js b/src/controllers/wizard/settings/index.js index 6e3a82cd9..87cae0527 100644 --- a/src/controllers/wizard/settings/index.js +++ b/src/controllers/wizard/settings/index.js @@ -1,7 +1,7 @@ -import loading from 'loading'; -import 'emby-checkbox'; -import 'emby-button'; -import 'emby-select'; +import loading from '../../../components/loading/loading'; +import '../../../elements/emby-checkbox/emby-checkbox'; +import '../../../elements/emby-button/emby-button'; +import '../../../elements/emby-select/emby-select'; function save(page) { loading.show(); diff --git a/src/controllers/wizard/start/index.js b/src/controllers/wizard/start/index.js index 3cd53b4ce..54e3d8e7d 100644 --- a/src/controllers/wizard/start/index.js +++ b/src/controllers/wizard/start/index.js @@ -1,7 +1,7 @@ -import $ from 'jQuery'; -import loading from 'loading'; -import 'emby-button'; -import 'emby-select'; +import 'jquery'; +import loading from '../../../components/loading/loading'; +import '../../../elements/emby-button/emby-button'; +import '../../../elements/emby-select/emby-select'; function loadPage(page, config, languageOptions) { $('#selectLocalizationLanguage', page).html(languageOptions.map(function (l) { diff --git a/src/controllers/wizard/user/index.js b/src/controllers/wizard/user/index.js index ec587fec8..75cfde5b9 100644 --- a/src/controllers/wizard/user/index.js +++ b/src/controllers/wizard/user/index.js @@ -1,8 +1,8 @@ -import loading from 'loading'; -import globalize from 'globalize'; -import 'dashboardcss'; -import 'emby-input'; -import 'emby-button'; +import loading from '../../../components/loading/loading'; +import globalize from '../../../scripts/globalize'; +import '../../../assets/css/dashboard.css'; +import '../../../elements/emby-input/emby-input'; +import '../../../elements/emby-button/emby-button'; function getApiClient() { return ApiClient; @@ -36,7 +36,7 @@ function onSubmit(e) { const form = this; if (form.querySelector('#txtManualPassword').value != form.querySelector('#txtPasswordConfirm').value) { - import('toast').then(({default: toast}) => { + import('../../../components/toast/toast').then((toast) => { toast(globalize.translate('PasswordMatchError')); }); } else { diff --git a/src/elements/emby-button/emby-button.js b/src/elements/emby-button/emby-button.js index 213bbc8e7..9eefbcbed 100644 --- a/src/elements/emby-button/emby-button.js +++ b/src/elements/emby-button/emby-button.js @@ -1,10 +1,9 @@ -import dom from 'dom'; -import layoutManager from 'layoutManager'; -import shell from 'shell'; -import appRouter from 'appRouter'; -import appHost from 'apphost'; -import 'css!./emby-button'; -import 'webcomponents'; +import { removeEventListener, addEventListener } from '../../scripts/dom'; +import layoutManager from '../../components/layoutManager'; +import shell from '../../scripts/shell'; +import appRouter from '../../components/appRouter'; +import appHost from '../../components/apphost'; +import './emby-button.css'; const EmbyButtonPrototype = Object.create(HTMLButtonElement.prototype); const EmbyLinkButtonPrototype = Object.create(HTMLAnchorElement.prototype); @@ -30,7 +29,7 @@ EmbyButtonPrototype.createdCallback = function () { return; } - this.classList.add('emby-button'); + this.classList.add('../../elements/emby-button/emby-button'); // TODO replace all instances of element-showfocus with this method if (layoutManager.tv) { // handles all special css for tv layout @@ -41,8 +40,8 @@ EmbyButtonPrototype.createdCallback = function () { EmbyButtonPrototype.attachedCallback = function () { if (this.tagName === 'A') { - dom.removeEventListener(this, 'click', onAnchorClick, {}); - dom.addEventListener(this, 'click', onAnchorClick, {}); + removeEventListener(this, 'click', onAnchorClick, {}); + addEventListener(this, 'click', onAnchorClick, {}); if (this.getAttribute('data-autohide') === 'true') { if (appHost.supports('externallinks')) { @@ -55,13 +54,13 @@ EmbyButtonPrototype.attachedCallback = function () { }; EmbyButtonPrototype.detachedCallback = function () { - dom.removeEventListener(this, 'click', onAnchorClick, {}); + removeEventListener(this, 'click', onAnchorClick, {}); }; EmbyLinkButtonPrototype.createdCallback = EmbyButtonPrototype.createdCallback; EmbyLinkButtonPrototype.attachedCallback = EmbyButtonPrototype.attachedCallback; -document.registerElement('emby-button', { +document.registerElement('../../elements/emby-button/emby-button', { prototype: EmbyButtonPrototype, extends: 'button' }); diff --git a/src/elements/emby-button/paper-icon-button-light.js b/src/elements/emby-button/paper-icon-button-light.js index f6c754fed..4ecfb5b7c 100644 --- a/src/elements/emby-button/paper-icon-button-light.js +++ b/src/elements/emby-button/paper-icon-button-light.js @@ -1,18 +1,18 @@ -import layoutManager from 'layoutManager'; -import 'css!./emby-button'; -import 'webcomponents'; +import layoutManager from '../../components/layoutManager'; +import './emby-button.css'; +import 'webcomponents.js'; const EmbyButtonPrototype = Object.create(HTMLButtonElement.prototype); EmbyButtonPrototype.createdCallback = function () { - this.classList.add('paper-icon-button-light'); + this.classList.add('../../elements/emby-button/paper-icon-button-light'); if (layoutManager.tv) { this.classList.add('show-focus'); } }; -document.registerElement('paper-icon-button-light', { +document.registerElement('../../elements/emby-button/paper-icon-button-light', { prototype: EmbyButtonPrototype, extends: 'button' }); diff --git a/src/elements/emby-checkbox/emby-checkbox.js b/src/elements/emby-checkbox/emby-checkbox.js index d44c58ed4..a03b23843 100644 --- a/src/elements/emby-checkbox/emby-checkbox.js +++ b/src/elements/emby-checkbox/emby-checkbox.js @@ -1,7 +1,7 @@ -import browser from 'browser'; -import dom from 'dom'; -import 'css!./emby-checkbox'; -import 'webcomponents'; +import browser from '../../scripts/browser'; +import dom from '../../scripts/dom'; +import './emby-checkbox.css'; +import 'webcomponents.js'; /* eslint-disable indent */ diff --git a/src/elements/emby-collapse/emby-collapse.js b/src/elements/emby-collapse/emby-collapse.js index c87e73d48..711e67920 100644 --- a/src/elements/emby-collapse/emby-collapse.js +++ b/src/elements/emby-collapse/emby-collapse.js @@ -1,6 +1,6 @@ -import 'css!./emby-collapse'; -import 'webcomponents'; -import 'emby-button'; +import './emby-collapse'; +import 'webcomponents.js'; +import '../../elements/emby-button/emby-button'; /* eslint-disable indent */ diff --git a/src/elements/emby-input/emby-input.js b/src/elements/emby-input/emby-input.js index 3a71e29a6..713559bca 100644 --- a/src/elements/emby-input/emby-input.js +++ b/src/elements/emby-input/emby-input.js @@ -1,7 +1,7 @@ -import browser from 'browser'; -import dom from 'dom'; -import 'css!./emby-input'; -import 'webcomponents'; +import browser from '../../scripts/browser'; +import dom from '../../scripts/dom'; +import './emby-input.css'; +import 'webcomponents.js'; /* eslint-disable indent */ diff --git a/src/elements/emby-itemrefreshindicator/emby-itemrefreshindicator.js b/src/elements/emby-itemrefreshindicator/emby-itemrefreshindicator.js index 51f3fc5be..0fd9eeb95 100644 --- a/src/elements/emby-itemrefreshindicator/emby-itemrefreshindicator.js +++ b/src/elements/emby-itemrefreshindicator/emby-itemrefreshindicator.js @@ -1,8 +1,8 @@ -import EmbyProgressRing from 'emby-progressring'; -import dom from 'dom'; -import serverNotifications from 'serverNotifications'; -import events from 'events'; -import 'webcomponents'; +import EmbyProgressRing from '../emby-progressring/emby-progressring'; +import dom from '../../scripts/dom'; +import serverNotifications from '../../scripts/serverNotifications'; +import events from 'jellyfin-apiclient'; +import 'webcomponents.js'; /* eslint-disable indent */ diff --git a/src/elements/emby-itemscontainer/emby-itemscontainer.js b/src/elements/emby-itemscontainer/emby-itemscontainer.js index 7d8f94160..1f8b1607a 100644 --- a/src/elements/emby-itemscontainer/emby-itemscontainer.js +++ b/src/elements/emby-itemscontainer/emby-itemscontainer.js @@ -1,15 +1,17 @@ -import itemShortcuts from 'itemShortcuts'; -import inputManager from 'inputManager'; -import playbackManager from 'playbackManager'; -import imageLoader from 'imageLoader'; -import layoutManager from 'layoutManager'; -import browser from 'browser'; -import dom from 'dom'; -import loading from 'loading'; -import focusManager from 'focusManager'; -import serverNotifications from 'serverNotifications'; -import events from 'events'; -import 'webcomponents'; + +import itemShortcuts from '../../components/shortcuts'; +import inputManager from '../../scripts/inputManager'; +import connectionManager from 'jellyfin-apiclient'; +import playbackManager from '../../components/playback/playbackmanager'; +import imageLoader from '../../components/images/imageLoader'; +import layoutManager from '../../components/layoutManager'; +import browser from '../../scripts/browser'; +import dom from '../../scripts/dom'; +import loading from '../../components/loading/loading'; +import focusManager from '../../components/focusManager'; +import serverNotifications from '../../scripts/serverNotifications'; +import events from 'jellyfin-apiclient'; +import 'webcomponents.js'; /* eslint-disable indent */ @@ -72,7 +74,7 @@ import 'webcomponents'; } const self = this; - import('multiSelect').then(({default: MultiSelect}) => { + import('../../components/multiSelect/multiSelect').then((MultiSelect) => { self.multiSelect = new MultiSelect({ container: self, bindOnClick: false @@ -132,7 +134,7 @@ import 'webcomponents'; } const self = this; - import('sortable').then(({default: Sortable}) => { + import('sortablejs').then((Sortable) => { self.sortable = new Sortable(self, { draggable: '.listItem', handle: '.listViewDragHandle', @@ -148,7 +150,7 @@ import 'webcomponents'; function onUserDataChanged(e, apiClient, userData) { const itemsContainer = this; - import('cardBuilder').then(({default: cardBuilder}) => { + import('../../components/cardbuilder/cardBuilder').then((cardBuilder) => { cardBuilder.onUserDataChanged(userData, itemsContainer); }); @@ -183,7 +185,7 @@ import 'webcomponents'; // This could be null, not supported by all tv providers const newTimerId = data.Id; - import('cardBuilder').then(({default: cardBuilder}) => { + import('../../components/cardbuilder/cardBuilder').then((cardBuilder) => { cardBuilder.onTimerCreated(programId, newTimerId, itemsContainer); }); } @@ -203,7 +205,7 @@ import 'webcomponents'; return; } - import('cardBuilder').then(({default: cardBuilder}) => { + import('../../components/cardbuilder/cardBuilder').then((cardBuilder) => { cardBuilder.onTimerCancelled(data.Id, itemsContainer); }); } @@ -215,7 +217,7 @@ import 'webcomponents'; return; } - import('cardBuilder').then(({default: cardBuilder}) => { + import('../../components/cardbuilder/cardBuilder').then((cardBuilder) => { cardBuilder.onSeriesTimerCancelled(data.Id, itemsContainer); }); } @@ -482,7 +484,7 @@ import 'webcomponents'; focusManager.autoFocus(itemsContainer); } - document.registerElement('emby-itemscontainer', { + document.registerElement('../../elements/emby-itemscontainer/emby-itemscontainer', { prototype: ItemsContainerPrototype, extends: 'div' }); diff --git a/src/elements/emby-playstatebutton/emby-playstatebutton.js b/src/elements/emby-playstatebutton/emby-playstatebutton.js index 8d17ddf9f..26a5c8280 100644 --- a/src/elements/emby-playstatebutton/emby-playstatebutton.js +++ b/src/elements/emby-playstatebutton/emby-playstatebutton.js @@ -1,7 +1,8 @@ -import serverNotifications from 'serverNotifications'; -import events from 'events'; -import globalize from 'globalize'; -import EmbyButtonPrototype from 'emby-button'; +import connectionManager from 'jellyfin-apiclient'; +import serverNotifications from '../../scripts/serverNotifications'; +import events from 'jellyfin-apiclient'; +import globalize from '../../scripts/globalize'; +import EmbyButtonPrototype from '../../elements/emby-button/emby-button'; /* eslint-disable indent */ diff --git a/src/elements/emby-progressring/emby-progressring.js b/src/elements/emby-progressring/emby-progressring.js index 63b9f73f1..83b49b7ba 100644 --- a/src/elements/emby-progressring/emby-progressring.js +++ b/src/elements/emby-progressring/emby-progressring.js @@ -1,5 +1,5 @@ -import 'css!./emby-progressring'; -import 'webcomponents'; +import './emby-progressring'; +import 'webcomponents.js'; /* eslint-disable indent */ @@ -9,7 +9,7 @@ import 'webcomponents'; this.classList.add('progressring'); const instance = this; - import('text!./emby-progressring.template.html').then(({default: template}) => { + import('./emby-progressring.template.html').then(({default: template}) => { instance.innerHTML = template; if (window.MutationObserver) { diff --git a/src/elements/emby-radio/emby-radio.js b/src/elements/emby-radio/emby-radio.js index 7c468a84a..f2b7fdf81 100644 --- a/src/elements/emby-radio/emby-radio.js +++ b/src/elements/emby-radio/emby-radio.js @@ -1,7 +1,7 @@ -import layoutManager from 'layoutManager'; -import 'css!./emby-radio'; -import 'webcomponents'; -import browser from 'browser'; +import layoutManager from '../../components/layoutManager'; +import browser from '../../scripts/browser'; +import 'webcomponents.js'; +import './emby-radio.css'; /* eslint-disable indent */ diff --git a/src/elements/emby-ratingbutton/emby-ratingbutton.js b/src/elements/emby-ratingbutton/emby-ratingbutton.js index 865d918b4..42f7be68f 100644 --- a/src/elements/emby-ratingbutton/emby-ratingbutton.js +++ b/src/elements/emby-ratingbutton/emby-ratingbutton.js @@ -1,7 +1,8 @@ -import serverNotifications from 'serverNotifications'; -import events from 'events'; -import globalize from 'globalize'; -import EmbyButtonPrototype from 'emby-button'; +import connectionManager from 'jellyfin-apiclient'; +import serverNotifications from '../../scripts/serverNotifications'; +import events from 'jellyfin-apiclient'; +import globalize from '../../scripts/globalize'; +import EmbyButtonPrototype from '../emby-button/emby-button'; /* eslint-disable indent */ diff --git a/src/elements/emby-scrollbuttons/emby-scrollbuttons.js b/src/elements/emby-scrollbuttons/emby-scrollbuttons.js index f7665c061..ad4f59106 100644 --- a/src/elements/emby-scrollbuttons/emby-scrollbuttons.js +++ b/src/elements/emby-scrollbuttons/emby-scrollbuttons.js @@ -1,6 +1,6 @@ -import 'css!./emby-scrollbuttons'; -import 'webcomponents'; -import 'paper-icon-button-light'; +import './emby-scrollbuttons'; +import 'webcomponents.js'; +import '../../elements/emby-button/paper-icon-button-light'; /* eslint-disable indent */ diff --git a/src/elements/emby-scroller/emby-scroller.js b/src/elements/emby-scroller/emby-scroller.js index d7133e317..9bdbc6c8e 100644 --- a/src/elements/emby-scroller/emby-scroller.js +++ b/src/elements/emby-scroller/emby-scroller.js @@ -1,18 +1,18 @@ -import scroller from 'scroller'; -import dom from 'dom'; -import layoutManager from 'layoutManager'; -import inputManager from 'inputManager'; -import focusManager from 'focusManager'; -import browser from 'browser'; -import 'webcomponents'; -import 'css!./emby-scroller'; +import scroller from '../../libraries/scroller'; +import dom from '../../scripts/dom'; +import layoutManager from '../../components/layoutManager'; +import inputManager from '../../scripts/inputManager'; +import focusManager from '../../components/focusManager'; +import browser from '../../scripts/browser'; +import 'webcomponents.js'; +import './emby-scroller.css'; /* eslint-disable indent */ const ScrollerPrototype = Object.create(HTMLDivElement.prototype); ScrollerPrototype.createdCallback = function () { - this.classList.add('emby-scroller'); + this.classList.add('../../elements/emby-scroller/emby-scroller'); }; function initCenterFocus(elem, scrollerInstance) { @@ -156,7 +156,7 @@ import 'css!./emby-scroller'; }; function loadScrollButtons(scroller) { - import('emby-scrollbuttons').then(() => { + import('../emby-scrollbuttons/emby-scrollbuttons').then(() => { scroller.insertAdjacentHTML('beforebegin', '
'); }); } @@ -193,7 +193,7 @@ import 'css!./emby-scroller'; } }; - document.registerElement('emby-scroller', { + document.registerElement('../../elements/emby-scroller/emby-scroller', { prototype: ScrollerPrototype, extends: 'div' }); diff --git a/src/elements/emby-select/emby-select.js b/src/elements/emby-select/emby-select.js index 0629a74e5..b75045b8d 100644 --- a/src/elements/emby-select/emby-select.js +++ b/src/elements/emby-select/emby-select.js @@ -1,8 +1,9 @@ -import layoutManager from 'layoutManager'; -import browser from 'browser'; -import actionsheet from 'actionsheet'; -import 'css!./emby-select'; -import 'webcomponents'; + +import layoutManager from '../../components/layoutManager'; +import browser from '../../scripts/browser'; +import actionsheet from '../../components/actionSheet/actionSheet'; +import './emby-select.css'; +import 'webcomponents.js'; /* eslint-disable indent */ diff --git a/src/elements/emby-slider/emby-slider.js b/src/elements/emby-slider/emby-slider.js index 555394af0..943fbeeeb 100644 --- a/src/elements/emby-slider/emby-slider.js +++ b/src/elements/emby-slider/emby-slider.js @@ -1,10 +1,10 @@ -import browser from 'browser'; -import dom from 'dom'; -import layoutManager from 'layoutManager'; -import keyboardnavigation from 'keyboardnavigation'; -import 'css!./emby-slider'; -import 'webcomponents'; -import 'emby-input'; +import browser from '../../scripts/browser'; +import dom from '../../scripts/dom'; +import layoutManager from '../../components/layoutManager'; +import keyboardnavigation from '../../scripts/keyboardNavigation'; +import './emby-slider.css'; +import 'webcomponents.js'; +import '../emby-input/emby-input'; /* eslint-disable indent */ diff --git a/src/elements/emby-tabs/emby-tabs.js b/src/elements/emby-tabs/emby-tabs.js index 7e16e31dd..e34d30d47 100644 --- a/src/elements/emby-tabs/emby-tabs.js +++ b/src/elements/emby-tabs/emby-tabs.js @@ -1,10 +1,10 @@ -import dom from 'dom'; -import scroller from 'scroller'; -import browser from 'browser'; -import focusManager from 'focusManager'; -import 'webcomponents'; -import 'css!./emby-tabs'; -import 'scrollStyles'; +import dom from '../../scripts/dom'; +import scroller from '../../libraries/scroller'; +import browser from '../../scripts/browser'; +import focusManager from '../../components/focusManager'; +import 'webcomponents.js'; +import './emby-tabs.css'; +import '../../assets/css/scrollstyles.css'; /* eslint-disable indent */ diff --git a/src/elements/emby-textarea/emby-textarea.js b/src/elements/emby-textarea/emby-textarea.js index c14724346..63a932b6c 100644 --- a/src/elements/emby-textarea/emby-textarea.js +++ b/src/elements/emby-textarea/emby-textarea.js @@ -1,6 +1,6 @@ -import 'css!./emby-textarea'; -import 'webcomponents'; -import 'emby-input'; +import './emby-textarea.css'; +import 'webcomponents.js'; +import '../emby-input/emby-input'; /* eslint-disable indent */ diff --git a/src/elements/emby-toggle/emby-toggle.js b/src/elements/emby-toggle/emby-toggle.js index 5e78b38dd..f359f25cc 100644 --- a/src/elements/emby-toggle/emby-toggle.js +++ b/src/elements/emby-toggle/emby-toggle.js @@ -1,5 +1,5 @@ -import 'css!./emby-toggle'; -import 'webcomponents'; +import './emby-toggle'; +import 'webcomponents.js'; /* eslint-disable indent */ diff --git a/src/libraries/navdrawer/navdrawer.js b/src/libraries/navdrawer/navdrawer.js index 6dcf6783d..4af9f56a1 100644 --- a/src/libraries/navdrawer/navdrawer.js +++ b/src/libraries/navdrawer/navdrawer.js @@ -3,10 +3,10 @@ */ /* eslint-disable no-var */ -import browser from 'browser'; -import dom from 'dom'; -import 'css!./navdrawer'; -import 'scrollStyles'; +import browser from '../../scripts/browser'; +import dom from '../../scripts/dom'; +import './navdrawer.css'; +import '../../assets/css/scrollstyles.css'; export default function (options) { function getTouches(e) { diff --git a/src/libraries/screensavermanager.js b/src/libraries/screensavermanager.js index 68a7dda73..93625449f 100644 --- a/src/libraries/screensavermanager.js +++ b/src/libraries/screensavermanager.js @@ -1,8 +1,9 @@ -import events from 'events'; -import playbackManager from 'playbackManager'; -import pluginManager from 'pluginManager'; -import inputManager from 'inputManager'; -import * as userSettings from 'userSettings'; +import events from 'jellyfin-apiclient'; +import playbackManager from '../components/playback/playbackmanager'; +import pluginManager from '../components/pluginManager'; +import inputManager from '../scripts/inputManager'; +import connectionManager from 'jellyfin-apiclient'; +import * as userSettings from '../scripts/settings/userSettings'; function getMinIdleTime() { // Returns the minimum amount of idle time required before the screen saver can be displayed diff --git a/src/libraries/scroller.js b/src/libraries/scroller.js index de6469c74..f2baf5157 100644 --- a/src/libraries/scroller.js +++ b/src/libraries/scroller.js @@ -2,12 +2,12 @@ * and will be replaced soon by a Vue component. */ -import browser from 'browser'; -import layoutManager from 'layoutManager'; -import dom from 'dom'; -import focusManager from 'focusManager'; -import ResizeObserver from 'ResizeObserver'; -import 'scrollStyles'; +import browser from '../scripts/browser'; +import layoutManager from '../components/layoutManager'; +import dom from '../scripts/dom'; +import focusManager from '../components/focusManager'; +import ResizeObserver from 'resize-observer-polyfill'; +import '../assets/css/scrollstyles.css'; /** * Return type of the value. diff --git a/src/plugins/bookPlayer/plugin.js b/src/plugins/bookPlayer/plugin.js index c56777f37..60f12f2b5 100644 --- a/src/plugins/bookPlayer/plugin.js +++ b/src/plugins/bookPlayer/plugin.js @@ -1,12 +1,12 @@ -import browser from 'browser'; -import loading from 'loading'; +import connectionManager from 'jellyfin-apiclient'; +import loading from '../../components/loading/loading'; import keyboardnavigation from 'keyboardnavigation'; import dialogHelper from 'dialogHelper'; import dom from 'dom'; -import events from 'events'; -import 'css!./style'; -import 'material-icons'; -import 'paper-icon-button-light'; +import events from 'jellyfin-apiclient'; +import './style'; +import 'material-design-icons-iconfont'; +import '../../elements/emby-button/paper-icon-button-light'; import TableOfContents from './tableOfContents'; diff --git a/src/plugins/chromecastPlayer/plugin.js b/src/plugins/chromecastPlayer/plugin.js index f61a0055a..ba09f9e20 100644 --- a/src/plugins/chromecastPlayer/plugin.js +++ b/src/plugins/chromecastPlayer/plugin.js @@ -1,8 +1,8 @@ import appSettings from 'appSettings'; -import * as userSettings from 'userSettings'; +import * as userSettings from '../../scripts/settings/userSettings'; import playbackManager from 'playbackManager'; import globalize from 'globalize'; -import events from 'events'; +import events from 'jellyfin-apiclient'; import castSenderApiLoader from 'castSenderApiLoader'; // Based on https://github.com/googlecast/CastVideos-chrome/blob/master/CastVideos.js diff --git a/src/plugins/htmlAudioPlayer/plugin.js b/src/plugins/htmlAudioPlayer/plugin.js index 6f413fac5..68380bcdb 100644 --- a/src/plugins/htmlAudioPlayer/plugin.js +++ b/src/plugins/htmlAudioPlayer/plugin.js @@ -1,4 +1,4 @@ -import events from 'events'; +import events from 'jellyfin-apiclient'; import browser from 'browser'; import appHost from 'apphost'; import * as htmlMediaHelper from 'htmlMediaHelper'; diff --git a/src/plugins/htmlVideoPlayer/plugin.js b/src/plugins/htmlVideoPlayer/plugin.js index 32f96c8e2..f4c7f25b7 100644 --- a/src/plugins/htmlVideoPlayer/plugin.js +++ b/src/plugins/htmlVideoPlayer/plugin.js @@ -1,7 +1,7 @@ import browser from 'browser'; -import events from 'events'; +import events from 'jellyfin-apiclient'; import appHost from 'apphost'; -import loading from 'loading'; +import loading from '../../components/loading/loading'; import dom from 'dom'; import playbackManager from 'playbackManager'; import appRouter from 'appRouter'; @@ -1282,7 +1282,7 @@ function tryRemoveElement(elem) { const dlg = document.querySelector('.videoPlayerContainer'); if (!dlg) { - return import('css!./style').then(() => { + return import('./style').then(() => { loading.show(); const dlg = document.createElement('div'); diff --git a/src/plugins/logoScreensaver/plugin.js b/src/plugins/logoScreensaver/plugin.js index 61b8f8a6d..619c0de25 100644 --- a/src/plugins/logoScreensaver/plugin.js +++ b/src/plugins/logoScreensaver/plugin.js @@ -128,7 +128,7 @@ export default function () { } self.show = function () { - import('css!' + pluginManager.mapPath(self, 'style.css')).then(() => { + import('' + pluginManager.mapPath(self, 'style.css')).then(() => { let elem = document.querySelector('.logoScreenSaver'); if (!elem) { diff --git a/src/plugins/youtubePlayer/plugin.js b/src/plugins/youtubePlayer/plugin.js index eed75a811..568077b0f 100644 --- a/src/plugins/youtubePlayer/plugin.js +++ b/src/plugins/youtubePlayer/plugin.js @@ -1,7 +1,7 @@ -import events from 'events'; +import events from 'jellyfin-apiclient'; import browser from 'browser'; import appRouter from 'appRouter'; -import loading from 'loading'; +import loading from '../../components/loading/loading'; /* globals YT */ @@ -20,7 +20,7 @@ function createMediaElement(instance, options) { const dlg = document.querySelector('.youtubePlayerContainer'); if (!dlg) { - import('css!./style').then(() => { + import('./style').then(() => { loading.show(); const dlg = document.createElement('div'); diff --git a/src/scripts/alphanumericshortcuts.js b/src/scripts/alphanumericshortcuts.js index e76d5b11f..22d2605b3 100644 --- a/src/scripts/alphanumericshortcuts.js +++ b/src/scripts/alphanumericshortcuts.js @@ -1,5 +1,5 @@ -import dom from 'dom'; -import focusManager from 'focusManager'; +import dom from './dom'; +import focusManager from '../components/focusManager'; let inputDisplayElement; let currentDisplayText = ''; diff --git a/src/scripts/autoBackdrops.js b/src/scripts/autoBackdrops.js index 051204ef1..0ecd583f4 100644 --- a/src/scripts/autoBackdrops.js +++ b/src/scripts/autoBackdrops.js @@ -1,6 +1,6 @@ -import backdrop from 'backdrop'; -import * as userSettings from 'userSettings'; -import libraryMenu from 'libraryMenu'; +import backdrop from '../components/backdrop/backdrop'; +import * as userSettings from './settings/userSettings'; +import libraryMenu from './libraryMenu'; const cache = {}; diff --git a/src/scripts/autoThemes.js b/src/scripts/autoThemes.js index 9dffda5d2..e28353798 100644 --- a/src/scripts/autoThemes.js +++ b/src/scripts/autoThemes.js @@ -1,7 +1,8 @@ -import * as userSettings from 'userSettings'; -import * as webSettings from 'webSettings'; -import skinManager from 'skinManager'; -import events from 'events'; +import * as userSettings from './settings/userSettings'; +import * as webSettings from './settings/webSettings'; +import skinManager from './themeManager'; +import connectionManager from 'jellyfin-apiclient'; +import events from 'jellyfin-apiclient'; // set the default theme when loading skinManager.setTheme(userSettings.theme()); diff --git a/src/scripts/autocast.js b/src/scripts/autocast.js index 8d9045126..9bed47066 100644 --- a/src/scripts/autocast.js +++ b/src/scripts/autocast.js @@ -1,5 +1,5 @@ -import events from 'events'; -import playbackManager from 'playbackManager'; +import { Events } from 'jellyfin-apiclient'; +import playbackManager from '../components/playback/playbackmanager'; export function supported() { return typeof(Storage) !== 'undefined'; @@ -43,5 +43,5 @@ function onOpen() { const apiClient = window.connectionManager.currentApiClient(); if (apiClient && supported()) { - events.on(apiClient, 'websocketopen', onOpen); + Events.on(apiClient, 'websocketopen', onOpen); } diff --git a/src/scripts/clientUtils.js b/src/scripts/clientUtils.js index 73801867c..9f1519732 100644 --- a/src/scripts/clientUtils.js +++ b/src/scripts/clientUtils.js @@ -1,4 +1,3 @@ - export function getCurrentUser() { return window.ApiClient.getCurrentUser(false); } @@ -78,7 +77,7 @@ export function navigate(url, preserveQueryString) { } return new Promise(function (resolve, reject) { - import('appRouter').then(({default: appRouter}) => { + import('../components/appRouter').then((appRouter) => { return appRouter.show(url).then(resolve, reject); }); }); @@ -86,28 +85,28 @@ export function navigate(url, preserveQueryString) { export function processPluginConfigurationUpdateResult() { Promise.all([ - import('loading'), - import('toast') + import('../components/loading/loading'), + import('../components/toast/toast') ]) - .then(([{default: loading}, {default: toast}]) => { + .then(([loading, toast]) => { loading.hide(); - toast(Globalize.translate('SettingsSaved')); + toast(Globalize.translate('MessageSettingsSaved')); }); } export function processServerConfigurationUpdateResult(result) { Promise.all([ - import('loading'), - import('toast') + import('../components/loading/loading'), + import('../components/toast/toast') ]) - .then(([{default: loading}, {default: toast}]) => { + .then(([loading, toast]) => { loading.hide(); - toast(Globalize.translate('SettingsSaved')); + toast.default(Globalize.translate('MessageSettingsSaved')); }); } export function processErrorResponse(response) { - import('loading').then(({default: loading}) => { + import('../components/loading/loading').then((loading) => { loading.hide(); }); @@ -125,15 +124,15 @@ export function processErrorResponse(response) { export function alert(options) { if (typeof options == 'string') { - return void import('toast').then(({default: toast}) => { - toast({ + return void import('../components/toast/toast').then((toast) => { + toast.default({ text: options }); }); } - import('alert').then(({default: alert}) => { - alert({ + import('../components/alert').then((alert) => { + alert.default({ title: options.title || Globalize.translate('HeaderAlert'), text: options.message }).then(options.callback || function () {}); @@ -147,7 +146,8 @@ export function capabilities(appHost) { SupportsPersistentIdentifier: window.appMode === 'cordova' || window.appMode === 'android', SupportsMediaControl: true }; - return Object.assign(capabilities, appHost.getPushTokenInfo()); + appHost.getPushTokenInfo(); + return capabilities = Object.assign(capabilities, appHost.getPushTokenInfo()); } export function selectServer() { @@ -159,19 +159,19 @@ export function selectServer() { } export function hideLoadingMsg() { - import('loading').then(({default: loading}) => { + import('../components/loading/loading').then(({default: loading}) => { loading.hide(); }); } export function showLoadingMsg() { - import('loading').then(({default: loading}) => { + import('../components/loading/loading').then(({default: loading}) => { loading.show(); }); } export function confirm(message, title, callback) { - import('confirm').then(({default: confirm}) => { + import('../components/confirm/confirm').then((confirm) => { confirm(message, title).then(function() { callback(!0); }).catch(function() { diff --git a/src/scripts/datetime.js b/src/scripts/datetime.js index c6baa28ed..34171cb4d 100644 --- a/src/scripts/datetime.js +++ b/src/scripts/datetime.js @@ -1,4 +1,4 @@ -import globalize from 'globalize'; +import globalize from './globalize'; /* eslint-disable indent */ diff --git a/src/scripts/deleteHelper.js b/src/scripts/deleteHelper.js index a18d951e6..d20ec362d 100644 --- a/src/scripts/deleteHelper.js +++ b/src/scripts/deleteHelper.js @@ -1,10 +1,12 @@ -import confirm from 'confirm'; -import appRouter from 'appRouter'; -import globalize from 'globalize'; + +import connectionManager from 'jellyfin-apiclient'; +import confirm from '../components/confirm/confirm'; +import appRouter from '../components/appRouter'; +import globalize from './globalize'; function alertText(options) { return new Promise(function (resolve, reject) { - import('alert').then(({default: alert}) => { + import('../components/alert').then((alert) => { alert(options).then(resolve, resolve); }); }); diff --git a/src/scripts/dfnshelper.js b/src/scripts/dfnshelper.js index 6ad2ee970..116ba4167 100644 --- a/src/scripts/dfnshelper.js +++ b/src/scripts/dfnshelper.js @@ -1,6 +1,6 @@ import { ar, be, bg, ca, cs, da, de, el, enGB, enUS, es, faIR, fi, fr, frCA, he, hi, hr, hu, id, it, ja, kk, ko, lt, ms, nb, nl, pl, ptBR, pt, ro, ru, sk, sl, sv, tr, uk, vi, zhCN, zhTW } from 'date-fns/locale'; -import globalize from 'globalize'; +import globalize from './globalize'; const dateLocales = (locale) => ({ 'ar': ar, diff --git a/src/scripts/editorsidebar.js b/src/scripts/editorsidebar.js index 3711520f0..ab9f5864b 100644 --- a/src/scripts/editorsidebar.js +++ b/src/scripts/editorsidebar.js @@ -1,6 +1,6 @@ -import $ from 'jQuery'; -import globalize from 'globalize'; -import 'material-icons'; +import 'jquery'; +import globalize from './globalize'; +import 'material-design-icons-iconfont'; /* eslint-disable indent */ @@ -303,7 +303,7 @@ import 'material-icons'; updateEditorNode(this, item); }).on('pagebeforeshow', '.metadataEditorPage', function () { /* eslint-disable-next-line @babel/no-unused-expressions */ - import('css!assets/css/metadataeditor.css'); + import('../assets/css/metadataeditor.css'); }).on('pagebeforeshow', '.metadataEditorPage', function () { const page = this; Dashboard.getCurrentUser().then(function (user) { diff --git a/src/scripts/fileDownloader.js b/src/scripts/fileDownloader.js index c99a6c3e3..24f163101 100644 --- a/src/scripts/fileDownloader.js +++ b/src/scripts/fileDownloader.js @@ -1,5 +1,5 @@ -import multiDownload from 'multi-download'; -import shell from 'shell'; +import multiDownload from './multiDownload'; +import shell from './shell'; export function download(items) { if (!shell.downloadFiles(items)) { diff --git a/src/scripts/globalize.js b/src/scripts/globalize.js index d237fdcce..a3cbb8cd2 100644 --- a/src/scripts/globalize.js +++ b/src/scripts/globalize.js @@ -1,5 +1,5 @@ -import * as userSettings from 'userSettings'; -import events from 'events'; +import * as userSettings from './settings/userSettings'; +import events from 'jellyfin-apiclient'; /* eslint-disable indent */ diff --git a/src/scripts/inputManager.js b/src/scripts/inputManager.js index baa3deb0a..4f98c6974 100644 --- a/src/scripts/inputManager.js +++ b/src/scripts/inputManager.js @@ -1,8 +1,8 @@ -import playbackManager from 'playbackManager'; -import focusManager from 'focusManager'; -import appRouter from 'appRouter'; -import dom from 'dom'; -import appHost from 'apphost'; +import playbackManager from '../components/playback/playbackmanager'; +import focusManager from '../components/focusManager'; +import appRouter from '../components/appRouter'; +import dom from './dom'; +import appHost from '../components/apphost'; /* eslint-disable indent */ diff --git a/src/scripts/itembynamedetailpage.js b/src/scripts/itembynamedetailpage.js index e30926723..186cc3f70 100644 --- a/src/scripts/itembynamedetailpage.js +++ b/src/scripts/itembynamedetailpage.js @@ -1,9 +1,10 @@ -import listView from 'listView'; -import cardBuilder from 'cardBuilder'; -import imageLoader from 'imageLoader'; -import globalize from 'globalize'; -import 'emby-itemscontainer'; -import 'emby-button'; +import connectionManager from 'jellyfin-apiclient'; +import listView from '../components/listview/listview'; +import cardBuilder from '../components/cardbuilder/cardBuilder'; +import imageLoader from '../components/images/imageLoader'; +import globalize from './globalize'; +import '../elements/emby-itemscontainer/emby-itemscontainer'; +import '../elements/emby-button/emby-button'; function renderItems(page, item) { const sections = []; diff --git a/src/scripts/keyboardNavigation.js b/src/scripts/keyboardNavigation.js index ec354a7ba..e10110d5c 100644 --- a/src/scripts/keyboardNavigation.js +++ b/src/scripts/keyboardNavigation.js @@ -3,8 +3,8 @@ * @module components/input/keyboardnavigation */ -import inputManager from 'inputManager'; -import layoutManager from 'layoutManager'; +import inputManager from './inputManager'; +import layoutManager from '../components/layoutManager'; /** * Key name mapping. @@ -156,7 +156,7 @@ function attachGamepadScript(e) { console.log('Gamepad connected! Attaching gamepadtokey.js script'); window.removeEventListener('gamepadconnected', attachGamepadScript); /* eslint-disable-next-line @babel/no-unused-expressions */ - import('scripts/gamepadtokey'); + import('./gamepadtokey'); } // No need to check for gamepads manually at load time, the eventhandler will be fired for that diff --git a/src/scripts/libraryBrowser.js b/src/scripts/libraryBrowser.js index 5c6db1925..a928902cb 100644 --- a/src/scripts/libraryBrowser.js +++ b/src/scripts/libraryBrowser.js @@ -1,5 +1,5 @@ -import * as userSettings from 'userSettings'; -import globalize from 'globalize'; +import * as userSettings from './settings/userSettings'; +import globalize from './globalize'; export function getSavedQueryKey(modifier) { return window.location.href.split('#')[0] + (modifier || ''); @@ -55,7 +55,7 @@ export function showLayoutMenu (button, currentLayout, views) { }; }); - import('actionsheet').then(({default: actionsheet}) => { + import('../components/actionSheet/actionSheet').then(({default: actionsheet}) => { actionsheet.show({ items: menuItems, positionTo: button, @@ -120,8 +120,8 @@ export function getQueryPagingHtml (options) { export function showSortMenu (options) { Promise.all([ - import('dialogHelper'), - import('emby-radio') + import('../components/dialogHelper/dialogHelper'), + import('../elements/emby-radio/emby-radio') ]).then(([{default: dialogHelper}]) => { function onSortByChange() { const newValue = this.value; diff --git a/src/scripts/libraryMenu.js b/src/scripts/libraryMenu.js index f2dde3b09..fcd4e75d5 100644 --- a/src/scripts/libraryMenu.js +++ b/src/scripts/libraryMenu.js @@ -1,20 +1,21 @@ -import dom from 'dom'; -import layoutManager from 'layoutManager'; -import inputManager from 'inputManager'; -import events from 'events'; -import viewManager from 'viewManager'; -import appRouter from 'appRouter'; -import appHost from 'apphost'; -import playbackManager from 'playbackManager'; -import syncPlayManager from 'syncPlayManager'; -import * as groupSelectionMenu from 'groupSelectionMenu'; -import browser from 'browser'; -import globalize from 'globalize'; -import imageHelper from 'scripts/imagehelper'; -import 'paper-icon-button-light'; -import 'material-icons'; -import 'scrollStyles'; -import 'flexStyles'; +import dom from './dom'; +import layoutManager from '../components/layoutManager'; +import inputManager from './inputManager'; +import connectionManager from 'jellyfin-apiclient'; +import events from 'jellyfin-apiclient'; +import viewManager from '../components/viewManager/viewManager'; +import appRouter from '../components/appRouter'; +import appHost from '../components/apphost'; +import playbackManager from '../components/playback/playbackmanager'; +import syncPlayManager from '../components/syncPlay/syncPlayManager'; +import groupSelectionMenu from '../components/syncPlay/groupSelectionMenu'; +import browser from './browser'; +import globalize from './globalize'; +import imageHelper from './imagehelper'; +import '../elements/emby-button/paper-icon-button-light'; +import 'material-design-icons-iconfont'; +import '../assets/css/scrollstyles.css'; +import '../assets/css/flexstyles.css'; /* eslint-disable indent */ @@ -67,7 +68,7 @@ import 'flexStyles'; } function lazyLoadViewMenuBarImages() { - import('imageLoader').then(({default: imageLoader}) => { + import('../components/images/imageLoader').then((imageLoader) => { imageLoader.lazyChildren(skinHeader); }); } @@ -220,7 +221,7 @@ import 'flexStyles'; function onCastButtonClicked() { const btn = this; - import('playerSelectionMenu').then(({default: playerSelectionMenu}) => { + import('../components/playback/playerSelectionMenu').then((playerSelectionMenu) => { playerSelectionMenu.show(btn); }); } @@ -799,7 +800,7 @@ import 'flexStyles'; } function initHeadRoom(elem) { - import('headroom').then(({default: Headroom}) => { + import('headroom.js').then((Headroom) => { const headroom = new Headroom(elem); headroom.init(); }); @@ -839,7 +840,7 @@ import 'flexStyles'; navDrawerScrollContainer = navDrawerElement.querySelector('.scrollContainer'); navDrawerScrollContainer.addEventListener('click', onMainDrawerClick); return new Promise(function (resolve, reject) { - import('navdrawer').then(({default: navdrawer}) => { + import('../libraries/navdrawer/navdrawer').then((navdrawer) => { navDrawerInstance = new navdrawer(getNavDrawerOptions()); if (!layoutManager.tv) { @@ -871,7 +872,7 @@ import 'flexStyles'; let requiresUserRefresh = true; function setTabs (type, selectedIndex, builder) { - import('mainTabsManager').then((mainTabsManager) => { + import('../components/maintabsmanager').then((mainTabsManager) => { if (type) { mainTabsManager.setTabs(viewManager.currentView(), selectedIndex, builder, function () { return []; diff --git a/src/scripts/livetvcomponents.js b/src/scripts/livetvcomponents.js index 46fb71476..9fb999dd0 100644 --- a/src/scripts/livetvcomponents.js +++ b/src/scripts/livetvcomponents.js @@ -1,6 +1,6 @@ -import layoutManager from 'layoutManager'; -import datetime from 'datetime'; -import cardBuilder from 'cardBuilder'; +import layoutManager from '../components/layoutManager'; +import datetime from './datetime'; +import cardBuilder from '../components/cardbuilder/cardBuilder'; function enableScrollX() { return !layoutManager.desktop; diff --git a/src/scripts/mouseManager.js b/src/scripts/mouseManager.js index 40253fb91..0c942fd4d 100644 --- a/src/scripts/mouseManager.js +++ b/src/scripts/mouseManager.js @@ -1,9 +1,9 @@ -import inputManager from 'inputManager'; -import focusManager from 'focusManager'; -import browser from 'browser'; -import layoutManager from 'layoutManager'; -import events from 'events'; -import dom from 'dom'; +import inputManager from './inputManager'; +import focusManager from '../components/focusManager'; +import browser from '../scripts/browser'; +import layoutManager from '../components/layoutManager'; +import events from 'jellyfin-apiclient'; +import dom from '../scripts/dom'; /* eslint-disable indent */ const self = {}; diff --git a/src/scripts/multiDownload.js b/src/scripts/multiDownload.js index 6d47427ed..54921bf4e 100644 --- a/src/scripts/multiDownload.js +++ b/src/scripts/multiDownload.js @@ -1,4 +1,4 @@ -import browser from 'browser'; +import browser from '../scripts/browser'; function fallback(urls) { let i = 0; diff --git a/src/scripts/playlistedit.js b/src/scripts/playlistedit.js index a4b519e04..1dc5481c1 100644 --- a/src/scripts/playlistedit.js +++ b/src/scripts/playlistedit.js @@ -1,50 +1,48 @@ -define(['listView'], function (listView) { - 'use strict'; +import listView from '../components/listview/listview'; - function getFetchPlaylistItemsFn(itemId) { - return function () { - const query = { - Fields: 'PrimaryImageAspectRatio,UserData', - EnableImageTypes: 'Primary,Backdrop,Banner,Thumb', - UserId: ApiClient.getCurrentUserId() - }; - return ApiClient.getJSON(ApiClient.getUrl(`Playlists/${itemId}/Items`, query)); +function getFetchPlaylistItemsFn(itemId) { + return function () { + const query = { + Fields: 'PrimaryImageAspectRatio,UserData', + EnableImageTypes: 'Primary,Backdrop,Banner,Thumb', + UserId: ApiClient.getCurrentUserId() }; - } - - function getItemsHtmlFn(itemId) { - return function (items) { - return listView.getListViewHtml({ - items: items, - showIndex: false, - showRemoveFromPlaylist: true, - playFromHere: true, - action: 'playallfromhere', - smallIcon: true, - dragHandle: true, - playlistId: itemId - }); - }; - } - - function init(page, item) { - const elem = page.querySelector('#childrenContent .itemsContainer'); - elem.classList.add('vertical-list'); - elem.classList.remove('vertical-wrap'); - elem.enableDragReordering(true); - elem.fetchData = getFetchPlaylistItemsFn(item.Id); - elem.getItemsHtml = getItemsHtmlFn(item.Id); - } - - window.PlaylistViewer = { - render: function (page, item) { - if (!page.playlistInit) { - page.playlistInit = true; - init(page, item); - } - - page.querySelector('#childrenContent').classList.add('verticalSection-extrabottompadding'); - page.querySelector('#childrenContent .itemsContainer').refreshItems(); - } + return ApiClient.getJSON(ApiClient.getUrl(`Playlists/${itemId}/Items`, query)); }; -}); +} + +function getItemsHtmlFn(itemId) { + return function (items) { + return listView.getListViewHtml({ + items: items, + showIndex: false, + showRemoveFromPlaylist: true, + playFromHere: true, + action: 'playallfromhere', + smallIcon: true, + dragHandle: true, + playlistId: itemId + }); + }; +} + +function init(page, item) { + const elem = page.querySelector('#childrenContent .itemsContainer'); + elem.classList.add('vertical-list'); + elem.classList.remove('vertical-wrap'); + elem.enableDragReordering(true); + elem.fetchData = getFetchPlaylistItemsFn(item.Id); + elem.getItemsHtml = getItemsHtmlFn(item.Id); +} + +window.PlaylistViewer = { + render: function (page, item) { + if (!page.playlistInit) { + page.playlistInit = true; + init(page, item); + } + + page.querySelector('#childrenContent').classList.add('verticalSection-extrabottompadding'); + page.querySelector('#childrenContent .itemsContainer').refreshItems(); + } +}; diff --git a/src/scripts/playlists.js b/src/scripts/playlists.js index bdfd155c5..3f09f621b 100644 --- a/src/scripts/playlists.js +++ b/src/scripts/playlists.js @@ -1,11 +1,11 @@ -import loading from 'loading'; +import loading from '../../components/loading/loading'; import listView from 'listView'; import cardBuilder from 'cardBuilder'; import libraryMenu from 'libraryMenu'; import libraryBrowser from 'libraryBrowser'; import imageLoader from 'imageLoader'; -import userSettings from 'userSettings'; -import 'emby-itemscontainer'; +import * as userSettings from '../scripts/settings/userSettings'; +import '../../elements/emby-itemscontainer/emby-itemscontainer'; export default function (view, params) { function getPageData(context) { diff --git a/src/scripts/routes.js b/src/scripts/routes.js index ebe6f3cf5..2ebfabbe6 100644 --- a/src/scripts/routes.js +++ b/src/scripts/routes.js @@ -1,16 +1,16 @@ -import 'emby-button'; -import 'emby-input'; -import 'scripts/livetvcomponents'; -import 'paper-icon-button-light'; -import 'emby-itemscontainer'; -import 'emby-collapse'; -import 'emby-select'; -import 'livetvcss'; -import 'emby-checkbox'; -import 'emby-slider'; -import 'listViewStyle'; -import 'dashboardcss'; -import 'detailtablecss'; +import '../elements/emby-button/emby-button'; +import '../elements/emby-input/emby-input'; +import '../scripts/livetvcomponents'; +import '../elements/emby-button/paper-icon-button-light'; +import '../elements/emby-itemscontainer/emby-itemscontainer'; +import '../elements/emby-collapse/emby-collapse'; +import '../elements/emby-select/emby-select'; +import '../elements/emby-checkbox/emby-checkbox'; +import '../elements/emby-slider/emby-slider'; +import '../assets/css/livetv.css'; +import '../components/listview/listview.css'; +import '../assets/css/dashboard.css'; +import '../assets/css/detailtable.css'; /* eslint-disable indent */ diff --git a/src/scripts/scrollHelper.js b/src/scripts/scrollHelper.js index b86712368..633216dcf 100644 --- a/src/scripts/scrollHelper.js +++ b/src/scripts/scrollHelper.js @@ -1,6 +1,6 @@ -import focusManager from 'focusManager'; -import dom from 'dom'; -import 'scrollStyles'; +import focusManager from '../components/focusManager'; +import dom from './dom'; +import '../assets/css/scrollstyles.css'; function getBoundingClientRect(elem) { // Support: BlackBerry 5, iOS 3 (original iPhone) diff --git a/src/scripts/serverNotifications.js b/src/scripts/serverNotifications.js index c14a133d6..7a4a5f3e3 100644 --- a/src/scripts/serverNotifications.js +++ b/src/scripts/serverNotifications.js @@ -1,9 +1,10 @@ -import playbackManager from 'playbackManager'; -import syncPlayManager from 'syncPlayManager'; -import events from 'events'; -import inputManager from 'inputManager'; -import focusManager from 'focusManager'; -import appRouter from 'appRouter'; +import connectionManager from 'jellyfin-apiclient'; +import playbackManager from '../components/playback/playbackmanager'; +import syncPlayManager from '../components/syncPlay/syncPlayManager'; +import events from 'jellyfin-apiclient'; +import inputManager from '../scripts/inputManager'; +import focusManager from '../components/focusManager'; +import appRouter from '../components/appRouter'; const serverNotifications = {}; @@ -14,11 +15,11 @@ function notifyApp() { function displayMessage(cmd) { const args = cmd.Arguments; if (args.TimeoutMs) { - import('toast').then(({default: toast}) => { + import('../components/toast/toast').then((toast) => { toast({ title: args.Header, text: args.Text }); }); } else { - import('alert').then(({default: alert}) => { + import('../components/alert').then(({default: alert}) => { alert({ title: args.Header, text: args.Text }); }); } diff --git a/src/scripts/settings/appSettings.js b/src/scripts/settings/appSettings.js index ded62c94a..b167ba93b 100644 --- a/src/scripts/settings/appSettings.js +++ b/src/scripts/settings/appSettings.js @@ -1,7 +1,5 @@ /* eslint-disable indent */ - -import appStorage from 'appStorage'; -import events from 'events'; +import { appStorage, events } from 'jellyfin-apiclient'; function getKey(name, userId) { if (userId) { diff --git a/src/scripts/settings/userSettings.js b/src/scripts/settings/userSettings.js index 263d74ed3..6ba41ce98 100644 --- a/src/scripts/settings/userSettings.js +++ b/src/scripts/settings/userSettings.js @@ -1,5 +1,5 @@ -import appSettings from 'appSettings'; -import events from 'events'; +import appSettings from './appSettings'; +import events from 'jellyfin-apiclient'; function onSaveTimeout() { const self = this; diff --git a/src/scripts/site.js b/src/scripts/site.js index db22b6a17..77c6279bd 100644 --- a/src/scripts/site.js +++ b/src/scripts/site.js @@ -3,10 +3,11 @@ import 'regenerator-runtime/runtime'; import 'jquery'; import 'fast-text-encoding'; import 'intersection-observer'; -import 'classlist-polyfill'; +import 'classlist.js'; import 'whatwg-fetch'; import 'resize-observer-polyfill'; import 'jellyfin-noto'; +import 'webcomponents.js'; import '../assets/css/site.css'; // TODO: Move this elsewhere @@ -91,10 +92,10 @@ function initClient() { function createConnectionManager() { return Promise.all([ - import('jellyfin-apiclient/src/connectionManager'), + import('jellyfin-apiclient'), import('../components/apphost'), - import('jellyfin-apiclient/src/connectionManager'), - import('jellyfin-apiclient/src/events'), + import('jellyfin-apiclient'), + import('jellyfin-apiclient'), import('./settings/userSettings') ]) .then(([ConnectionManager, appHost, credentialProvider, events, userSettings]) => { @@ -114,7 +115,7 @@ function initClient() { console.debug('loading ApiClient singleton'); return Promise.all([ - import('jellyfin-apiclient/src/apiClient'), + import('jellyfin-apiclient'), import('./clientUtils') ]) .then(([apiClientFactory, clientUtils]) => { @@ -165,8 +166,8 @@ function initClient() { }); Promise.all([ import('./globalize'), - import('jellyfin-apiclient/src/connectionManager'), - import('jellyfin-apiclient/src/events') + import('jellyfin-apiclient'), + import('jellyfin-apiclient') ]) .then((globalize, connectionManager, events) => { events.on(connectionManager, 'localusersignedin', globalize.updateCurrentCulture); @@ -246,7 +247,7 @@ function initClient() { console.groupEnd('loading installed plugins'); import('../components/packageManager') .then((packageManager) => { - packageManager.default.init().then(resolve, reject); + packageManager.init().then(resolve, reject); }); }) ; @@ -257,9 +258,9 @@ function initClient() { function loadPlugin(url) { return new Promise(function (resolve, reject) { - import('pluginManager') + import('../components/pluginManager') .then((pluginManager) => { - pluginManager.default.loadPlugin(url).then(resolve, reject); + pluginManager.loadPlugin(url).then(resolve, reject); }); }); } @@ -269,7 +270,7 @@ function initClient() { // ensure that appHost is loaded in this point Promise.all([ - import('jellyfin-apiclient/src/apiClient'), + import('jellyfin-apiclient'), import('../components/appRouter') ]) .then(([appHost, appRouter]) => { diff --git a/src/scripts/taskbutton.js b/src/scripts/taskbutton.js index 43a46301a..85ee56b86 100644 --- a/src/scripts/taskbutton.js +++ b/src/scripts/taskbutton.js @@ -1,8 +1,8 @@ -import events from 'events'; -import serverNotifications from 'serverNotifications'; -import globalize from 'globalize'; -import 'emby-button'; +import { connectionManager, events } from 'jellyfin-apiclient'; +import serverNotifications from '../scripts/serverNotifications'; +import globalize from '../scripts/globalize'; +import '../elements/emby-button/emby-button'; export default function (options) { function pollTasks() { diff --git a/src/scripts/themeManager.js b/src/scripts/themeManager.js index 56d336221..f7dcf597d 100644 --- a/src/scripts/themeManager.js +++ b/src/scripts/themeManager.js @@ -1,4 +1,4 @@ -import * as webSettings from 'webSettings'; +import * as webSettings from './settings/webSettings'; let themeStyleElement = document.querySelector('#cssTheme'); let currentThemeId; diff --git a/src/scripts/touchHelper.js b/src/scripts/touchHelper.js index fa05c83d9..578ca02c0 100644 --- a/src/scripts/touchHelper.js +++ b/src/scripts/touchHelper.js @@ -1,5 +1,5 @@ -import dom from 'dom'; -import events from 'events'; +import dom from '../scripts/dom'; +import events from 'jellyfin-apiclient'; function getTouches(e) { return e.changedTouches || e.targetTouches || e.touches; From 96eccd2ecdf9914960e2b5f574d2449ffc8642f8 Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Sat, 15 Aug 2020 12:44:52 +0200 Subject: [PATCH 045/271] Rework Webpack config --- package.json | 312 +----- src/bundle.js | 182 ---- src/{ => scripts}/standalone.js | 0 webpack.common.js | 54 +- webpack.dev.js | 26 +- webpack.prod.js | 1 + yarn.lock | 1695 ++++++++++++++++++------------- 7 files changed, 1034 insertions(+), 1236 deletions(-) delete mode 100644 src/bundle.js rename src/{ => scripts}/standalone.js (100%) diff --git a/package.json b/package.json index 03f27954a..bfba7b363 100644 --- a/package.json +++ b/package.json @@ -10,13 +10,13 @@ "@babel/eslint-plugin": "^7.12.1", "@babel/plugin-proposal-class-properties": "^7.10.1", "@babel/plugin-proposal-private-methods": "^7.12.1", - "@babel/plugin-transform-modules-amd": "^7.12.1", - "@babel/polyfill": "^7.12.1", + "@babel/polyfill": "^7.11.5", "@babel/preset-env": "^7.12.1", "autoprefixer": "^9.8.6", "babel-loader": "^8.0.6", "browser-sync": "^2.26.13", "confusing-browser-globals": "^1.0.10", + "clean-webpack-plugin": "^3.0.0", "copy-webpack-plugin": "^5.1.1", "css-loader": "^5.0.0", "cssnano": "^4.1.10", @@ -40,6 +40,7 @@ "gulp-sass": "^4.0.2", "gulp-sourcemaps": "^2.6.5", "gulp-terser": "^1.4.1", + "html-loader": "^1.1.0", "html-webpack-plugin": "^4.5.0", "lazypipe": "^1.0.2", "node-sass": "^5.0.0", @@ -51,6 +52,8 @@ "stylelint-no-browser-hacks": "^1.2.1", "stylelint-order": "^4.1.0", "webpack": "^5.3.2", + "webpack-cli": "^4.0.0", + "webpack-concat-plugin": "^3.0.0", "webpack-merge": "^4.2.2", "webpack-stream": "^6.1.0", "worker-plugin": "^5.0.0" @@ -87,292 +90,17 @@ }, "babel": { "presets": [ - "@babel/preset-env" + [ + "@babel/preset-env", + { + "useBuiltIns": "usage", + "corejs": 3 + } + ] ], - "overrides": [ - { - "test": [ - "src/components/accessSchedule/accessSchedule.js", - "src/components/actionSheet/actionSheet.js", - "src/components/activitylog.js", - "src/components/alert.js", - "src/components/alphaPicker/alphaPicker.js", - "src/components/appFooter/appFooter.js", - "src/components/apphost.js", - "src/components/appRouter.js", - "src/components/autoFocuser.js", - "src/components/backdrop/backdrop.js", - "src/components/cardbuilder/cardBuilder.js", - "src/components/cardbuilder/chaptercardbuilder.js", - "src/components/cardbuilder/peoplecardbuilder.js", - "src/components/channelMapper/channelMapper.js", - "src/components/collectionEditor/collectionEditor.js", - "src/components/confirm/confirm.js", - "src/components/dialog/dialog.js", - "src/components/dialogHelper/dialogHelper.js", - "src/components/directorybrowser/directorybrowser.js", - "src/components/displaySettings/displaySettings.js", - "src/components/favoriteitems.js", - "src/components/fetchhelper.js", - "src/components/filterdialog/filterdialog.js", - "src/components/filtermenu/filtermenu.js", - "src/components/focusManager.js", - "src/components/groupedcards.js", - "src/components/guide/guide.js", - "src/components/guide/guide-settings.js", - "src/components/homeScreenSettings/homeScreenSettings.js", - "src/components/homesections/homesections.js", - "src/components/htmlMediaHelper.js", - "src/components/imageOptionsEditor/imageOptionsEditor.js", - "src/components/images/imageLoader.js", - "src/components/imageDownloader/imageDownloader.js", - "src/components/imageeditor/imageeditor.js", - "src/components/imageUploader/imageUploader.js", - "src/components/indicators/indicators.js", - "src/components/itemContextMenu.js", - "src/components/itemHelper.js", - "src/components/itemidentifier/itemidentifier.js", - "src/components/itemMediaInfo/itemMediaInfo.js", - "src/components/itemsrefresher.js", - "src/components/layoutManager.js", - "src/components/lazyLoader/lazyLoaderIntersectionObserver.js", - "src/components/libraryoptionseditor/libraryoptionseditor.js", - "src/components/listview/listview.js", - "src/components/loading/loading.js", - "src/components/maintabsmanager.js", - "src/components/mediainfo/mediainfo.js", - "src/components/mediaLibraryCreator/mediaLibraryCreator.js", - "src/components/mediaLibraryEditor/mediaLibraryEditor.js", - "src/components/metadataEditor/metadataEditor.js", - "src/components/metadataEditor/personEditor.js", - "src/components/multiSelect/multiSelect.js", - "src/components/notifications/notifications.js", - "src/components/nowPlayingBar/nowPlayingBar.js", - "src/components/packageManager.js", - "src/components/playback/brightnessosd.js", - "src/components/playback/mediasession.js", - "src/components/playback/nowplayinghelper.js", - "src/components/playback/playbackorientation.js", - "src/components/playback/playbackmanager.js", - "src/components/playback/playerSelectionMenu.js", - "src/components/playback/playersettingsmenu.js", - "src/components/playback/playmethodhelper.js", - "src/components/playback/playqueuemanager.js", - "src/components/playback/remotecontrolautoplay.js", - "src/components/playback/volumeosd.js", - "src/components/playbackSettings/playbackSettings.js", - "src/components/playerstats/playerstats.js", - "src/components/playlisteditor/playlisteditor.js", - "src/components/playmenu.js", - "src/components/pluginManager.js", - "src/components/prompt/prompt.js", - "src/components/qualityOptions.js", - "src/components/quickConnectSettings/quickConnectSettings.js", - "src/components/recordingcreator/recordingbutton.js", - "src/components/recordingcreator/recordingcreator.js", - "src/components/recordingcreator/seriesrecordingeditor.js", - "src/components/recordingcreator/recordinghelper.js", - "src/components/refreshdialog/refreshdialog.js", - "src/components/recordingcreator/recordingeditor.js", - "src/components/recordingcreator/recordingfields.js", - "src/components/remotecontrol/remotecontrol.js", - "src/components/sanatizefilename.js", - "src/components/scrollManager.js", - "src/plugins/experimentalWarnings/plugin.js", - "src/plugins/sessionPlayer/plugin.js", - "src/plugins/htmlAudioPlayer/plugin.js", - "src/plugins/comicsPlayer/plugin.js", - "src/plugins/chromecastPlayer/plugin.js", - "src/components/slideshow/slideshow.js", - "src/components/sortmenu/sortmenu.js", - "src/plugins/htmlVideoPlayer/plugin.js", - "src/plugins/logoScreensaver/plugin.js", - "src/plugins/playAccessValidation/plugin.js", - "src/components/search/searchfields.js", - "src/components/search/searchresults.js", - "src/components/settingshelper.js", - "src/components/shortcuts.js", - "src/components/subtitleeditor/subtitleeditor.js", - "src/components/subtitlesync/subtitlesync.js", - "src/components/subtitlesettings/subtitleappearancehelper.js", - "src/components/subtitlesettings/subtitlesettings.js", - "src/components/syncPlay/groupSelectionMenu.js", - "src/components/syncPlay/playbackPermissionManager.js", - "src/components/syncPlay/syncPlayManager.js", - "src/components/syncPlay/timeSyncManager.js", - "src/components/themeMediaPlayer.js", - "src/components/tabbedview/tabbedview.js", - "src/components/viewManager/viewManager.js", - "src/components/tvproviders/schedulesdirect.js", - "src/components/tvproviders/xmltv.js", - "src/components/toast/toast.js", - "src/components/tunerPicker.js", - "src/components/upnextdialog/upnextdialog.js", - "src/components/userdatabuttons/userdatabuttons.js", - "src/components/viewContainer.js", - "src/components/viewSettings/viewSettings.js", - "src/components/castSenderApi.js", - "src/controllers/session/addServer/index.js", - "src/controllers/session/forgotPassword/index.js", - "src/controllers/session/resetPassword/index.js", - "src/controllers/session/login/index.js", - "src/controllers/session/selectServer/index.js", - "src/controllers/dashboard/apikeys.js", - "src/controllers/dashboard/dashboard.js", - "src/controllers/dashboard/devices/device.js", - "src/controllers/dashboard/devices/devices.js", - "src/controllers/dashboard/dlna/profile.js", - "src/controllers/dashboard/dlna/profiles.js", - "src/controllers/dashboard/dlna/settings.js", - "src/controllers/dashboard/encodingsettings.js", - "src/controllers/dashboard/general.js", - "src/controllers/dashboard/librarydisplay.js", - "src/controllers/dashboard/logs.js", - "src/controllers/music/musicalbums.js", - "src/controllers/music/musicartists.js", - "src/controllers/music/musicgenres.js", - "src/controllers/music/musicplaylists.js", - "src/controllers/music/musicrecommended.js", - "src/controllers/music/songs.js", - "src/controllers/dashboard/library.js", - "src/controllers/dashboard/metadataImages.js", - "src/controllers/dashboard/metadatanfo.js", - "src/controllers/dashboard/networking.js", - "src/controllers/dashboard/notifications/notification/index.js", - "src/controllers/dashboard/notifications/notifications/index.js", - "src/controllers/dashboard/playback.js", - "src/controllers/dashboard/plugins/add/index.js", - "src/controllers/dashboard/plugins/installed/index.js", - "src/controllers/dashboard/plugins/available/index.js", - "src/controllers/dashboard/plugins/repositories/index.js", - "src/controllers/dashboard/quickConnect.js", - "src/controllers/dashboard/scheduledtasks/scheduledtask.js", - "src/controllers/dashboard/scheduledtasks/scheduledtasks.js", - "src/controllers/dashboard/serveractivity.js", - "src/controllers/dashboard/streaming.js", - "src/controllers/dashboard/users/useredit.js", - "src/controllers/dashboard/users/userlibraryaccess.js", - "src/controllers/dashboard/users/usernew.js", - "src/controllers/dashboard/users/userparentalcontrol.js", - "src/controllers/dashboard/users/userpasswordpage.js", - "src/controllers/dashboard/users/userprofilespage.js", - "src/controllers/home.js", - "src/controllers/list.js", - "src/controllers/edititemmetadata.js", - "src/controllers/favorites.js", - "src/controllers/hometab.js", - "src/controllers/movies/moviecollections.js", - "src/controllers/movies/moviegenres.js", - "src/controllers/movies/movies.js", - "src/controllers/movies/moviesrecommended.js", - "src/controllers/movies/movietrailers.js", - "src/controllers/playback/nowplaying.js", - "src/controllers/playback/videoosd.js", - "src/controllers/itemDetails/index.js", - "src/controllers/playback/queue/index.js", - "src/controllers/playback/video/index.js", - "src/controllers/searchpage.js", - "src/controllers/livetv/livetvguide.js", - "src/controllers/livetvtuner.js", - "src/controllers/livetv/livetvsuggested.js", - "src/controllers/livetvstatus.js", - "src/controllers/livetvguideprovider.js", - "src/controllers/livetvsettings.js", - "src/controllers/livetv/livetvrecordings.js", - "src/controllers/livetv/livetvschedule.js", - "src/controllers/livetv/livetvseriestimers.js", - "src/controllers/livetv/livetvchannels.js", - "src/controllers/shows/episodes.js", - "src/controllers/shows/tvgenres.js", - "src/controllers/shows/tvlatest.js", - "src/controllers/shows/tvrecommended.js", - "src/controllers/shows/tvshows.js", - "src/controllers/shows/tvstudios.js", - "src/controllers/shows/tvupcoming.js", - "src/controllers/user/display/index.js", - "src/controllers/user/home/index.js", - "src/controllers/user/menu/index.js", - "src/controllers/user/playback/index.js", - "src/controllers/user/profile/index.js", - "src/controllers/user/quickConnect/index.js", - "src/controllers/user/subtitles/index.js", - "src/controllers/wizard/finish/index.js", - "src/controllers/wizard/remote/index.js", - "src/controllers/wizard/settings/index.js", - "src/controllers/wizard/start/index.js", - "src/controllers/wizard/user/index.js", - "src/elements/emby-button/emby-button.js", - "src/elements/emby-button/paper-icon-button-light.js", - "src/elements/emby-checkbox/emby-checkbox.js", - "src/elements/emby-collapse/emby-collapse.js", - "src/elements/emby-input/emby-input.js", - "src/elements/emby-itemrefreshindicator/emby-itemrefreshindicator.js", - "src/elements/emby-itemscontainer/emby-itemscontainer.js", - "src/elements/emby-playstatebutton/emby-playstatebutton.js", - "src/elements/emby-programcell/emby-programcell.js", - "src/elements/emby-progressbar/emby-progressbar.js", - "src/elements/emby-progressring/emby-progressring.js", - "src/elements/emby-radio/emby-radio.js", - "src/elements/emby-ratingbutton/emby-ratingbutton.js", - "src/elements/emby-scrollbuttons/emby-scrollbuttons.js", - "src/elements/emby-scroller/emby-scroller.js", - "src/elements/emby-select/emby-select.js", - "src/elements/emby-slider/emby-slider.js", - "src/elements/emby-tabs/emby-tabs.js", - "src/elements/emby-textarea/emby-textarea.js", - "src/elements/emby-toggle/emby-toggle.js", - "src/libraries/screensavermanager.js", - "src/libraries/navdrawer/navdrawer.js", - "src/libraries/scroller.js", - "src/plugins/backdropScreensaver/plugin.js", - "src/plugins/bookPlayer/plugin.js", - "src/plugins/pdfPlayer/plugin.js", - "src/plugins/bookPlayer/tableOfContents.js", - "src/plugins/chromecastPlayer/chromecastHelper.js", - "src/plugins/photoPlayer/plugin.js", - "src/plugins/youtubePlayer/plugin.js", - "src/scripts/alphanumericshortcuts.js", - "src/scripts/autoBackdrops.js", - "src/scripts/autocast.js", - "src/scripts/browser.js", - "src/scripts/clientUtils.js", - "src/scripts/datetime.js", - "src/scripts/deleteHelper.js", - "src/scripts/dfnshelper.js", - "src/scripts/dom.js", - "src/scripts/editorsidebar.js", - "src/scripts/fileDownloader.js", - "src/scripts/filesystem.js", - "src/scripts/globalize.js", - "src/scripts/imagehelper.js", - "src/scripts/itembynamedetailpage.js", - "src/scripts/inputManager.js", - "src/scripts/autoThemes.js", - "src/scripts/themeManager.js", - "src/scripts/keyboardNavigation.js", - "src/scripts/libraryMenu.js", - "src/scripts/libraryBrowser.js", - "src/scripts/livetvcomponents.js", - "src/scripts/mouseManager.js", - "src/scripts/multiDownload.js", - "src/scripts/playlists.js", - "src/scripts/scrollHelper.js", - "src/scripts/serverNotifications.js", - "src/scripts/routes.js", - "src/scripts/settings/appSettings.js", - "src/scripts/settings/userSettings.js", - "src/scripts/settings/webSettings.js", - "src/scripts/shell.js", - "src/scripts/taskbutton.js", - "src/scripts/themeLoader.js", - "src/scripts/touchHelper.js" - ], - "plugins": [ - "@babel/plugin-transform-modules-amd", - "@babel/plugin-proposal-class-properties", - "@babel/plugin-proposal-private-methods" - ] - } + "plugins": [ + "@babel/plugin-proposal-class-properties", + "@babel/plugin-proposal-private-methods" ] }, "browserslist": [ @@ -393,11 +121,11 @@ ], "scripts": { "start": "yarn serve", - "serve": "gulp serve --development", - "prepare": "gulp --production", - "build:development": "gulp --development", - "build:production": "gulp --production", - "build:standalone": "gulp standalone --development", + "serve": "webpack-dev-server --config webpack.dev.js --open", + "prepare": "webpack --config webpack.prod.js", + "build:development": "webpack --config webpack.dev.js", + "build:production": "webpack --config webpack.prod.js", + "build:standalone": "webpack --config webpack.standalone.js", "lint": "eslint \".\"", "stylelint": "stylelint \"src/**/*.css\"" } diff --git a/src/bundle.js b/src/bundle.js deleted file mode 100644 index 9363cd885..000000000 --- a/src/bundle.js +++ /dev/null @@ -1,182 +0,0 @@ -/** - * require.js module definitions bundled by webpack - */ -// Use define from require.js not webpack's define -const _define = window.define; - -// fetch -const fetch = require('whatwg-fetch'); -_define('fetch', function() { - return fetch; -}); - -// Blurhash -const blurhash = require('blurhash'); -_define('blurhash', function() { - return blurhash; -}); - -// query-string -const query = require('query-string'); -_define('queryString', function() { - return query; -}); - -// flvjs -const flvjs = require('flv.js/dist/flv').default; -_define('flvjs', function() { - return flvjs; -}); - -// jstree -const jstree = require('jstree'); -require('jstree/dist/themes/default/style.css'); -_define('jstree', function() { - return jstree; -}); - -// jquery -const jquery = require('jquery'); -_define('jQuery', function() { - return jquery; -}); - -// hlsjs -const hlsjs = require('hls.js'); -_define('hlsjs', function() { - return hlsjs; -}); - -// howler -const howler = require('howler'); -_define('howler', function() { - return howler; -}); - -// resize-observer-polyfill -const resize = require('resize-observer-polyfill').default; -_define('resize-observer-polyfill', function() { - return resize; -}); - -// swiper -const swiper = require('swiper/swiper-bundle'); -require('swiper/swiper-bundle.css'); -_define('swiper', function() { - return swiper; -}); - -// sortable -const sortable = require('sortablejs').default; -_define('sortable', function() { - return sortable; -}); - -// webcomponents -const webcomponents = require('webcomponents.js/webcomponents-lite'); -_define('webcomponents', function() { - return webcomponents; -}); - -// libass-wasm -const libassWasm = require('libass-wasm'); -_define('JavascriptSubtitlesOctopus', function() { - return libassWasm; -}); - -// material-icons -const materialIcons = require('material-design-icons-iconfont/dist/material-design-icons.css'); -_define('material-design-icons-iconfont', function() { - return materialIcons; -}); - -const epubjs = require('epubjs'); -_define('epubjs', function () { - return epubjs; -}); - -const pdfjs = require('pdfjs-dist/build/pdf'); -_define('pdfjs', function () { - return pdfjs; -}); - -// page.js -const page = require('page'); -_define('page', function() { - return page; -}); - -// core-js -const polyfill = require('@babel/polyfill/dist/polyfill'); -_define('polyfill', function () { - return polyfill; -}); - -// domtokenlist-shim -const classlist = require('classlist.js'); -_define('classlist-polyfill', function () { - return classlist; -}); - -// Date-FNS -const dateFns = require('date-fns'); -_define('date-fns', function () { - return dateFns; -}); - -const dateFnsLocale = require('date-fns/locale'); -_define('date-fns/locale', function () { - return dateFnsLocale; -}); - -const fast_text_encoding = require('fast-text-encoding'); -_define('fast-text-encoding', function () { - return fast_text_encoding; -}); - -// intersection-observer -const intersection_observer = require('intersection-observer'); -_define('intersection-observer', function () { - return intersection_observer; -}); - -// screenfull -const screenfull = require('screenfull'); -_define('screenfull', function () { - return screenfull; -}); - -// headroom.js -const headroom = require('headroom.js/dist/headroom'); -_define('headroom', function () { - return headroom; -}); - -// apiclient -const apiclient = require('jellyfin-apiclient'); - -_define('apiclient', function () { - return apiclient.ApiClient; -}); - -_define('events', function () { - return apiclient.Events; -}); - -_define('credentialprovider', function () { - return apiclient.Credentials; -}); - -_define('connectionManagerFactory', function () { - return apiclient.ConnectionManager; -}); - -_define('appStorage', function () { - return apiclient.AppStorage; -}); - -// libarchive.js -const libarchive = require('libarchive.js'); -_define('libarchive', function () { - return libarchive; -}); diff --git a/src/standalone.js b/src/scripts/standalone.js similarity index 100% rename from src/standalone.js rename to src/scripts/standalone.js diff --git a/webpack.common.js b/webpack.common.js index f93f816ed..59f78e755 100644 --- a/webpack.common.js +++ b/webpack.common.js @@ -1,57 +1,19 @@ const path = require('path'); - -const CopyPlugin = require('copy-webpack-plugin'); -const WorkerPlugin = require('worker-plugin'); - -const Assets = [ - 'alameda/alameda.js', - 'native-promise-only/npo.js', - 'libarchive.js/dist/worker-bundle.js', - 'libass-wasm/dist/js/subtitles-octopus-worker.js', - 'libass-wasm/dist/js/subtitles-octopus-worker.data', - 'libass-wasm/dist/js/subtitles-octopus-worker.wasm', - 'libass-wasm/dist/js/subtitles-octopus-worker-legacy.js', - 'libass-wasm/dist/js/subtitles-octopus-worker-legacy.data', - 'libass-wasm/dist/js/subtitles-octopus-worker-legacy.js.mem', - 'pdfjs-dist/build/pdf.worker.js' -]; - -const LibarchiveWasm = [ - 'libarchive.js/dist/wasm-gen/libarchive.js', - 'libarchive.js/dist/wasm-gen/libarchive.wasm' -]; +const { CleanWebpackPlugin } = require('clean-webpack-plugin'); module.exports = { context: path.resolve(__dirname, 'src'), - entry: './bundle.js', - stats: 'errors-only', + target: 'web', resolve: { modules: [ path.resolve(__dirname, 'node_modules') ] }, - output: { - filename: 'bundle.js', - path: path.resolve(__dirname, 'dist'), - libraryTarget: 'amd-require' - }, plugins: [ - new CopyPlugin( - Assets.map(asset => { - return { - from: path.resolve(__dirname, `./node_modules/${asset}`), - to: path.resolve(__dirname, './dist/libraries') - }; - }) - ), - new CopyPlugin( - LibarchiveWasm.map(asset => { - return { - from: path.resolve(__dirname, `./node_modules/${asset}`), - to: path.resolve(__dirname, './dist/libraries/wasm-gen/') - }; - }) - ), - new WorkerPlugin() - ] + (new CleanWebpackPlugin()) + ], + output: { + filename: '[name].bundle.js', + path: path.resolve(__dirname, 'dist') + } }; diff --git a/webpack.dev.js b/webpack.dev.js index 33e171daa..9c52bef3b 100644 --- a/webpack.dev.js +++ b/webpack.dev.js @@ -1,18 +1,20 @@ -const path = require('path'); const common = require('./webpack.common'); const merge = require('webpack-merge'); const packageConfig = require('./package.json'); +const HtmlWebpackPlugin = require('html-webpack-plugin'); module.exports = merge(common, { mode: 'development', - output: { - filename: 'bundle.js', - path: path.resolve(__dirname, 'dist'), - libraryTarget: 'amd-require' - }, - devtool: 'inline-source-map', + entry: './scripts/standalone.js', + devtool: 'source-map', module: { rules: [ + { + test: /\.(html)$/, + use: { + loader: 'html-loader' + } + }, { test: /\.js$/, exclude: /node_modules[\\/](?!date-fns|epubjs|libarchive|jellyfin-apiclient|query-string|split-on-first|strict-uri-encode|xmldom)/, @@ -39,7 +41,7 @@ module.exports = merge(common, { ] }, { - test: /\.(png|jpg|gif)$/i, + test: /\.(png|jpg|gif|svg)$/i, use: ['file-loader'] }, { @@ -53,5 +55,11 @@ module.exports = merge(common, { use: ['file-loader'] } ] - } + }, + plugins: [ + new HtmlWebpackPlugin({ + filename: 'index.html', + template: 'index.html' + }) + ] }); diff --git a/webpack.prod.js b/webpack.prod.js index 408eb4bb5..d27e32b7a 100644 --- a/webpack.prod.js +++ b/webpack.prod.js @@ -4,6 +4,7 @@ const packageConfig = require('./package.json'); module.exports = merge(common, { mode: 'production', + entry: './scripts/site.js', module: { rules: [ { diff --git a/yarn.lock b/yarn.lock index 31abce5fd..6c0535a82 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9,10 +9,10 @@ dependencies: "@babel/highlight" "^7.10.4" -"@babel/compat-data@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.12.1.tgz#d7386a689aa0ddf06255005b4b991988021101a0" - integrity sha512-725AQupWJZ8ba0jbKceeFblZTY90McUBWMwHhkFQ9q1zKPJ95GUktljFcgcsIVwRnTnRKlcYzfiNImg5G9m6ZQ== +"@babel/compat-data@^7.12.1", "@babel/compat-data@^7.12.5": + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.12.5.tgz#f56db0c4bb1bbbf221b4e81345aab4141e7cb0e9" + integrity sha512-DTsS7cxrsH3by8nqQSpFSyjSfSYl57D6Cf4q8dW3LK83tBKBDCkfcay1nYkXq1nIHXnpX8WMMb/O25HOy3h1zg== "@babel/core@>=7.2.2", "@babel/core@>=7.9.0", "@babel/core@^7.12.3": version "7.12.3" @@ -52,12 +52,12 @@ dependencies: eslint-rule-composer "^0.3.0" -"@babel/generator@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.1.tgz#0d70be32bdaa03d7c51c8597dda76e0df1f15468" - integrity sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg== +"@babel/generator@^7.12.1", "@babel/generator@^7.12.5": + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.5.tgz#a2c50de5c8b6d708ab95be5e6053936c1884a4de" + integrity sha512-m16TQQJ8hPt7E+OS/XVQg/7U184MLXtvuGbCdA7na61vha+ImkyyNM/9DDA0unYCVZn3ZOhng+qz48/KBOT96A== dependencies: - "@babel/types" "^7.12.1" + "@babel/types" "^7.12.5" jsesc "^2.5.1" source-map "^0.5.0" @@ -77,13 +77,13 @@ "@babel/types" "^7.10.4" "@babel/helper-compilation-targets@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.1.tgz#310e352888fbdbdd8577be8dfdd2afb9e7adcf50" - integrity sha512-jtBEif7jsPwP27GPHs06v4WBV0KrE8a/P7n0N0sSvHn2hwUCYnolP/CLmz51IzAW4NlN+HuoBtb9QcwnRo9F/g== + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.5.tgz#cb470c76198db6a24e9dbc8987275631e5d29831" + integrity sha512-+qH6NrscMolUlzOYngSBMIOQpKUGPPsc61Bu5W10mg84LxZ7cmvnBHzARKbDoFxVvqqAbj6Tg6N7bSrWSPXMyw== dependencies: - "@babel/compat-data" "^7.12.1" + "@babel/compat-data" "^7.12.5" "@babel/helper-validator-option" "^7.12.1" - browserslist "^4.12.0" + browserslist "^4.14.5" semver "^5.5.0" "@babel/helper-create-class-features-plugin@^7.12.1": @@ -107,21 +107,20 @@ regexpu-core "^4.7.1" "@babel/helper-define-map@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.10.4.tgz#f037ad794264f729eda1889f4ee210b870999092" - integrity sha512-nIij0oKErfCnLUCWaCaHW0Bmtl2RO9cN7+u2QT8yqTywgALKlyUVOvHDElh+b5DwVC6YB1FOYFOTWcN/+41EDA== + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz#b53c10db78a640800152692b13393147acb9bb30" + integrity sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ== dependencies: "@babel/helper-function-name" "^7.10.4" - "@babel/types" "^7.10.4" - lodash "^4.17.13" + "@babel/types" "^7.10.5" + lodash "^4.17.19" "@babel/helper-explode-assignable-expression@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.4.tgz#40a1cd917bff1288f699a94a75b37a1a2dbd8c7c" - integrity sha512-4K71RyRQNPRrR85sr5QY4X3VwG4wtVoXZB9+L3r1Gp38DhELyHCtovqydRi7c1Ovb17eRGiQ/FD5s8JdU0Uy5A== + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.1.tgz#8006a466695c4ad86a2a5f2fb15b5f2c31ad5633" + integrity sha512-dmUwH8XmlrUpVqgtZ737tK88v07l840z9j3OEhCLwKTkjlvKpfqXVIZ0wpK3aeOxspwGrf/5AP5qLx4rO3w5rA== dependencies: - "@babel/traverse" "^7.10.4" - "@babel/types" "^7.10.4" + "@babel/types" "^7.12.1" "@babel/helper-function-name@^7.10.4": version "7.10.4" @@ -154,11 +153,11 @@ "@babel/types" "^7.12.1" "@babel/helper-module-imports@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.12.1.tgz#1644c01591a15a2f084dd6d092d9430eb1d1216c" - integrity sha512-ZeC1TlMSvikvJNy1v/wPIazCu3NdOwgYZLIkmIyAsGhqkNpiDoQQRmaCK8YP4Pq3GPTLPV9WXaPCJKvx06JxKA== + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz#1bfc0229f794988f76ed0a4d4e90860850b54dfb" + integrity sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA== dependencies: - "@babel/types" "^7.12.1" + "@babel/types" "^7.12.5" "@babel/helper-module-transforms@^7.12.1": version "7.12.1" @@ -188,11 +187,11 @@ integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== "@babel/helper-regex@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.10.4.tgz#59b373daaf3458e5747dece71bbaf45f9676af6d" - integrity sha512-inWpnHGgtg5NOF0eyHlC0/74/VkdRITY9dtTpB2PrxKKn+AkVMRiZz/Adrx+Ssg+MLDesi2zohBW6MVq6b4pOQ== + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.10.5.tgz#32dfbb79899073c415557053a19bd055aae50ae0" + integrity sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg== dependencies: - lodash "^4.17.13" + lodash "^4.17.19" "@babel/helper-remap-async-to-generator@^7.12.1": version "7.12.1" @@ -204,14 +203,14 @@ "@babel/types" "^7.12.1" "@babel/helper-replace-supers@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.12.1.tgz#f15c9cc897439281891e11d5ce12562ac0cf3fa9" - integrity sha512-zJjTvtNJnCFsCXVi5rUInstLd/EIVNmIKA1Q9ynESmMBWPWd+7sdR+G4/wdu+Mppfep0XLyG2m7EBPvjCeFyrw== + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz#f009a17543bbbbce16b06206ae73b63d3fca68d9" + integrity sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA== dependencies: "@babel/helper-member-expression-to-functions" "^7.12.1" "@babel/helper-optimise-call-expression" "^7.10.4" - "@babel/traverse" "^7.12.1" - "@babel/types" "^7.12.1" + "@babel/traverse" "^7.12.5" + "@babel/types" "^7.12.5" "@babel/helper-simple-access@^7.12.1": version "7.12.1" @@ -227,14 +226,7 @@ dependencies: "@babel/types" "^7.12.1" -"@babel/helper-split-export-declaration@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz#2c70576eaa3b5609b24cb99db2888cc3fc4251d1" - integrity sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg== - dependencies: - "@babel/types" "^7.10.4" - -"@babel/helper-split-export-declaration@^7.11.0": +"@babel/helper-split-export-declaration@^7.10.4", "@babel/helper-split-export-declaration@^7.11.0": version "7.11.0" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz#f8a491244acf6a676158ac42072911ba83ad099f" integrity sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg== @@ -252,9 +244,9 @@ integrity sha512-YpJabsXlJVWP0USHjnC/AQDTLlZERbON577YUVO/wLpqyj6HAtVYnWaQaN0iUN+1/tWn3c+uKKXjRut5115Y2A== "@babel/helper-wrap-function@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz#8a6f701eab0ff39f765b5a1cfef409990e624b87" - integrity sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug== + version "7.12.3" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.12.3.tgz#3332339fc4d1fbbf1c27d7958c27d34708e990d9" + integrity sha512-Cvb8IuJDln3rs6tzjW3Y8UeelAOdnpB8xtQ4sme2MSZ9wOxrbThporC0y/EtE16VAtoyEfLM404Xr1e0OOp+ow== dependencies: "@babel/helper-function-name" "^7.10.4" "@babel/template" "^7.10.4" @@ -262,13 +254,13 @@ "@babel/types" "^7.10.4" "@babel/helpers@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.12.1.tgz#8a8261c1d438ec18cb890434df4ec768734c1e79" - integrity sha512-9JoDSBGoWtmbay98efmT2+mySkwjzeFeAL9BuWNoVQpkPFQF8SIIFUfY5os9u8wVzglzoiPRSW7cuJmBDUt43g== + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.12.5.tgz#1a1ba4a768d9b58310eda516c449913fe647116e" + integrity sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA== dependencies: "@babel/template" "^7.10.4" - "@babel/traverse" "^7.12.1" - "@babel/types" "^7.12.1" + "@babel/traverse" "^7.12.5" + "@babel/types" "^7.12.5" "@babel/highlight@^7.10.4": version "7.10.4" @@ -279,10 +271,10 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.10.4", "@babel/parser@^7.12.1", "@babel/parser@^7.12.3": - version "7.12.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.3.tgz#a305415ebe7a6c7023b40b5122a0662d928334cd" - integrity sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw== +"@babel/parser@^7.10.4", "@babel/parser@^7.12.3", "@babel/parser@^7.12.5": + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.5.tgz#b4af32ddd473c0bfa643bd7ff0728b8e71b81ea0" + integrity sha512-FVM6RZQ0mn2KCf1VUED7KepYeUWoVShczewOCfm3nzoBybaih51h+sYVVGthW9M6lPByEPTQf+xm27PBdlpwmQ== "@babel/plugin-proposal-async-generator-functions@^7.12.1": version "7.12.1" @@ -342,9 +334,9 @@ "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" "@babel/plugin-proposal-numeric-separator@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.1.tgz#0e2c6774c4ce48be412119b4d693ac777f7685a6" - integrity sha512-MR7Ok+Af3OhNTCxYVjJZHS0t97ydnJZt/DbR4WISO39iDnhiD8XHrY12xuSJ90FFEGjir0Fzyyn7g/zY6hxbxA== + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.5.tgz#b1ce757156d40ed79d59d467cb2b154a5c4149ba" + integrity sha512-UiAnkKuOrCyjZ3sYNHlRlfuZJbBHknMQ9VMwVeX97Ofwx7RpD6gS2HfqTCh8KNUQgcOm8IKt103oR4KIjh7Q8g== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-numeric-separator" "^7.10.4" @@ -725,7 +717,7 @@ "@babel/helper-create-regexp-features-plugin" "^7.12.1" "@babel/helper-plugin-utils" "^7.10.4" -"@babel/polyfill@^7.12.1": +"@babel/polyfill@^7.11.5": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.12.1.tgz#1f2d6371d1261bbd961f3c5d5909150e12d0bd96" integrity sha512-X0pi0V6gxLi6lFZpGmeNa4zxtwEmCs42isWLNjZZDE0Y8yVfgu0T2OAHlzBbdYlqbW/YXVvoBHpATEM+goCj8g== @@ -806,9 +798,9 @@ semver "^5.5.0" "@babel/preset-modules@^0.1.3": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.3.tgz#13242b53b5ef8c883c3cf7dddd55b36ce80fbc72" - integrity sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg== + version "0.1.4" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.4.tgz#362f2b68c662842970fdb5e254ffc8fc1c2e415e" + integrity sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" @@ -817,9 +809,9 @@ esutils "^2.0.2" "@babel/runtime@^7.8.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.10.4.tgz#a6724f1a6b8d2f6ea5236dbfe58c7d7ea9c5eb99" - integrity sha512-UpTN5yUJr9b4EX2CnGNWIvER7Ab83ibv0pcvvHc4UOdrBI5jb8bj+32cCwPX6xu0mt2daFNjYhoi+X7beH0RSw== + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.5.tgz#410e7e487441e1b360c29be715d870d9b985882e" + integrity sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg== dependencies: regenerator-runtime "^0.13.4" @@ -832,25 +824,25 @@ "@babel/parser" "^7.10.4" "@babel/types" "^7.10.4" -"@babel/traverse@^7.10.4", "@babel/traverse@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.1.tgz#941395e0c5cc86d5d3e75caa095d3924526f0c1e" - integrity sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw== +"@babel/traverse@^7.10.4", "@babel/traverse@^7.12.1", "@babel/traverse@^7.12.5": + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.5.tgz#78a0c68c8e8a35e4cacfd31db8bb303d5606f095" + integrity sha512-xa15FbQnias7z9a62LwYAA5SZZPkHIXpd42C6uW68o8uTuua96FHZy1y61Va5P/i83FAAcMpW8+A/QayntzuqA== dependencies: "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.12.1" + "@babel/generator" "^7.12.5" "@babel/helper-function-name" "^7.10.4" "@babel/helper-split-export-declaration" "^7.11.0" - "@babel/parser" "^7.12.1" - "@babel/types" "^7.12.1" + "@babel/parser" "^7.12.5" + "@babel/types" "^7.12.5" debug "^4.1.0" globals "^11.1.0" lodash "^4.17.19" -"@babel/types@^7.10.4", "@babel/types@^7.11.0", "@babel/types@^7.12.1", "@babel/types@^7.4.4": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.1.tgz#e109d9ab99a8de735be287ee3d6a9947a190c4ae" - integrity sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA== +"@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.11.0", "@babel/types@^7.12.1", "@babel/types@^7.12.5", "@babel/types@^7.4.4": + version "7.12.6" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.6.tgz#ae0e55ef1cce1fbc881cd26f8234eb3e657edc96" + integrity sha512-hwyjw6GvjBLiyy3W0YQf0Z5Zf4NpYejUnKFcfcUhZCSffoBBp30w6wP2Wn6pk31jMYZvcOrB/1b7cGXvEoKogA== dependencies: "@babel/helper-validator-identifier" "^7.10.4" lodash "^4.17.19" @@ -955,11 +947,6 @@ resolved "https://registry.yarnpkg.com/@types/anymatch/-/anymatch-1.3.1.tgz#336badc1beecb9dacc38bea2cf32adf627a8421a" integrity sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA== -"@types/color-name@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" - integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== - "@types/eslint-scope@^3.7.0": version "3.7.0" resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.0.tgz#4792816e31119ebd506902a482caec4951fabd86" @@ -981,35 +968,24 @@ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.45.tgz#e9387572998e5ecdac221950dab3e8c3b16af884" integrity sha512-jnqIUKDUqJbDIUxm0Uj7bnlMnRm1T/eZ9N+AVMqhPgzrba2GhGG5o/jCTwmdPK709nEZsGoMzXEDUjcXHa3W0g== -"@types/events@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" - integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== - "@types/glob@^7.1.1": - version "7.1.1" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" - integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w== + version "7.1.3" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.3.tgz#e6ba80f36b7daad2c685acd9266382e68985c183" + integrity sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w== dependencies: - "@types/events" "*" "@types/minimatch" "*" "@types/node" "*" "@types/html-minifier-terser@^5.0.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-5.1.0.tgz#551a4589b6ee2cc9c1dff08056128aec29b94880" - integrity sha512-iYCgjm1dGPRuo12+BStjd1HiVQqhlRhWDOQigNxn023HcjnhsiFz9pc6CzJj4HwDCSQca9bxTL4PxJDbkdm3PA== + version "5.1.1" + resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz#3c9ee980f1a10d6021ae6632ca3e79ca2ec4fb50" + integrity sha512-giAlZwstKbmvMk1OO7WXSj4OZ0keXAcl2TQq4LWHiiPH2ByaH7WeUzng+Qej8UPxxv+8lRTuouo0iaNDBuzIBA== -"@types/json-schema@*", "@types/json-schema@^7.0.6": +"@types/json-schema@*", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.6": version "7.0.6" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.6.tgz#f4c7ec43e81b319a9815115031709f26987891f0" integrity sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw== -"@types/json-schema@^7.0.5": - version "7.0.5" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.5.tgz#dcce4430e64b443ba8945f0290fb564ad5bac6dd" - integrity sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ== - "@types/json5@^0.0.29": version "0.0.29" resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" @@ -1033,9 +1009,9 @@ integrity sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY= "@types/node@*": - version "13.13.4" - resolved "https://registry.yarnpkg.com/@types/node/-/node-13.13.4.tgz#1581d6c16e3d4803eb079c87d4ac893ee7501c2c" - integrity sha512-x26ur3dSXgv5AwKS0lNfbjpCakGIduWU1DU91Zz58ONRWrIKGunmZBNv4P7N+e27sJkiGDsw/3fT4AtsqQBrBA== + version "14.14.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.6.tgz#146d3da57b3c636cc0d1769396ce1cfa8991147f" + integrity sha512-6QlRuqsQ/Ox/aJEQWBEJG7A9+u7oSYl3mem/K8IzxXG/kAGbV1YPD9Bg9Zw3vyxC/YP+zONKwy8hGkSt1jxFMw== "@types/normalize-package-data@^2.4.0": version "2.4.0" @@ -1048,9 +1024,9 @@ integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== "@types/q@^1.5.1": - version "1.5.2" - resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8" - integrity sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw== + version "1.5.4" + resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.4.tgz#15925414e0ad2cd765bfef58842f7e26a7accb24" + integrity sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug== "@types/source-list-map@*": version "0.1.2" @@ -1058,14 +1034,14 @@ integrity sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA== "@types/tapable@*", "@types/tapable@^1.0.5": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.5.tgz#9adbc12950582aa65ead76bffdf39fe0c27a3c02" - integrity sha512-/gG2M/Imw7cQFp8PGvz/SwocNrmKFjFsm5Pb8HdbHkZ1K8pmuPzOX4VeVoiEecFCVf4CsN1r3/BRvx+6sNqwtQ== + version "1.0.6" + resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.6.tgz#a9ca4b70a18b270ccb2bc0aaafefd1d486b7ea74" + integrity sha512-W+bw9ds02rAQaMvaLYxAbJ6cvguW/iJXNT6lTssS1ps6QdrMKttqEAMEG/b5CR8TZl3/L7/lH0ZV5nNR1LXikA== "@types/uglify-js@*": - version "3.9.0" - resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.9.0.tgz#4490a140ca82aa855ad68093829e7fd6ae94ea87" - integrity sha512-3ZcoyPYHVOCcLpnfZwD47KFLr8W/mpUcgjpf1M4Q78TMJIw7KMAHSjiCLJp1z3ZrBR9pTLbe191O0TldFK5zcw== + version "3.11.1" + resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.11.1.tgz#97ff30e61a0aa6876c270b5f538737e2d6ab8ceb" + integrity sha512-7npvPKV+jINLu1SpSYVWG8KvyJBhBa8tmzMMdDoVc2pWUYHN8KIXlPJhjJ4LT97c4dXJA2SHL/q6ADbDriZN+Q== dependencies: source-map "^0.6.1" @@ -1091,18 +1067,18 @@ "@types/vfile-message" "*" "@types/webpack-sources@*": - version "0.1.7" - resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-0.1.7.tgz#0a330a9456113410c74a5d64180af0cbca007141" - integrity sha512-XyaHrJILjK1VHVC4aVlKsdNN5KBTwufMb43cQs+flGxtPAf/1Qwl8+Q0tp5BwEGaI8D6XT1L+9bSWXckgkjTLw== + version "2.0.0" + resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-2.0.0.tgz#08216ab9be2be2e1499beaebc4d469cec81e82a7" + integrity sha512-a5kPx98CNFRKQ+wqawroFunvFqv7GHm/3KOI52NY9xWADgc8smu4R6prt4EU/M4QfVjvgBkMqU4fBhw3QfMVkg== dependencies: "@types/node" "*" "@types/source-list-map" "*" - source-map "^0.6.1" + source-map "^0.7.3" -"@types/webpack@^4.41.8": - version "4.41.12" - resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.12.tgz#0386ee2a2814368e2f2397abb036c0bf173ff6c3" - integrity sha512-BpCtM4NnBen6W+KEhrL9jKuZCXVtiH6+0b6cxdvNt2EwU949Al334PjQSl2BeAyvAX9mgoNNG21wvjP3xZJJ5w== +"@types/webpack@^4.4.31", "@types/webpack@^4.41.8": + version "4.41.24" + resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.24.tgz#75b664abe3d5bcfe54e64313ca3b43e498550422" + integrity sha512-1A0MXPwZiMOD3DPMuOKUKcpkdPo8Lq33UGggZ7xio6wJ/jV1dAu5cXDrOfGDnldUroPIRLsr/DT43/GqOA4RFQ== dependencies: "@types/anymatch" "*" "@types/node" "*" @@ -1256,6 +1232,18 @@ "@webassemblyjs/wast-parser" "1.9.0" "@xtuc/long" "4.2.2" +"@webpack-cli/info@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.1.0.tgz#c596d5bc48418b39df00c5ed7341bf0f102dbff1" + integrity sha512-uNWSdaYHc+f3LdIZNwhdhkjjLDDl3jP2+XBqAq9H8DjrJUvlOKdP8TNruy1yEaDfgpAIgbSAN7pye4FEHg9tYQ== + dependencies: + envinfo "^7.7.3" + +"@webpack-cli/serve@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.1.0.tgz#13ad38f89b6e53d1133bac0006a128217a6ebf92" + integrity sha512-7RfnMXCpJ/NThrhq4gYQYILB18xWyoQcBey81oIyVbmgbc6m5ZHHyFK+DyH7pLHJf0p14MxL4mTsoPAgBSTpIg== + "@xtuc/ieee754@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" @@ -1280,9 +1268,9 @@ accepts@~1.3.4: negotiator "0.6.2" acorn-jsx@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe" - integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ== + version "5.3.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" + integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== acorn@5.X, acorn@^5.0.3: version "5.7.4" @@ -1290,14 +1278,14 @@ acorn@5.X, acorn@^5.0.3: integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg== acorn@^6.4.1: - version "6.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" - integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== + version "6.4.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" + integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== acorn@^7.4.0: - version "7.4.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.0.tgz#e1ad486e6c54501634c6c397c5c121daa383607c" - integrity sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w== + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== acorn@^8.0.4: version "8.0.4" @@ -1310,9 +1298,9 @@ after@0.8.2: integrity sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8= aggregate-error@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.0.1.tgz#db2fe7246e536f40d9b5442a39e117d7dd6a24e0" - integrity sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA== + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== dependencies: clean-stack "^2.0.0" indent-string "^4.0.0" @@ -1327,7 +1315,7 @@ ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== -ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.5.5: +ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -1409,11 +1397,10 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1: color-convert "^1.9.0" ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" - integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: - "@types/color-name" "^1.1.1" color-convert "^2.0.1" ansi-wrap@0.1.0, ansi-wrap@^0.1.0: @@ -1455,9 +1442,9 @@ aproba@^1.0.3, aproba@^1.1.1: integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== arch@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/arch/-/arch-2.1.1.tgz#8f5c2731aa35a30929221bb0640eed65175ec84e" - integrity sha512-BLM56aPo9vLLFVa8+/+pJLnrZ7QGGTVHWsCwieAWT9o9K8UeGaQbzZbGoabWLOo2ksBCztoXdqBZBplqLDDCSg== + version "2.2.0" + resolved "https://registry.yarnpkg.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11" + integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ== archive-type@^4.0.0: version "4.0.0" @@ -1515,6 +1502,11 @@ arr-union@^3.1.0: resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= +array-back@^4.0.0, array-back@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/array-back/-/array-back-4.0.1.tgz#9b80312935a52062e1a233a9c7abeb5481b30e90" + integrity sha512-Z/JnaVEXv+A9xabHzN43FiiiWEE7gPCRXMrVmRm00tWbjZRul1iHm7ECzlyNq1p4a4ATXz+G9FJ3GqGOkOV3fg== + array-differ@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" @@ -1613,14 +1605,15 @@ arrify@^2.0.1: resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== -asn1.js@^4.0.0: - version "4.10.1" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" - integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== +asn1.js@^5.2.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" + integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== dependencies: bn.js "^4.0.0" inherits "^2.0.1" minimalistic-assert "^1.0.0" + safer-buffer "^2.1.0" asn1@~0.2.3: version "0.2.4" @@ -1733,9 +1726,9 @@ aws-sign2@~0.7.0: integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= aws4@^1.8.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.1.tgz#7e33d8f7d449b3f673cd72deb9abdc552dbe528e" - integrity sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug== + version "1.11.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" + integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== axios@0.19.0: version "0.19.0" @@ -1793,12 +1786,17 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= +base64-arraybuffer@0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz#9818c79e059b1355f97e0428a017c838e90ba812" + integrity sha1-mBjHngWbE1X5fgQooBfIOOkLqBI= + base64-arraybuffer@0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8" integrity sha1-c5JncZI7Whl0etZmqlzUv5xunOg= -base64-js@^1.0.2: +base64-js@^1.0.2, base64-js@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== @@ -1945,11 +1943,16 @@ blurhash@^1.1.3: resolved "https://registry.yarnpkg.com/blurhash/-/blurhash-1.1.3.tgz#dc325af7da836d07a0861d830bdd63694382483e" integrity sha512-yUhPJvXexbqbyijCIE/T2NCXcj9iNPhWmOKbPTuR/cm7Q5snXYIfnVnz6m7MWOXxODMz/Cr3UcVkRdHiuDVRDw== -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.4.0: version "4.11.9" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.9.tgz#26d556829458f9d1e81fc48952493d0ba3507828" integrity sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw== +bn.js@^5.1.1: + version "5.1.3" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.3.tgz#beca005408f642ebebea80b042b4d18d2ac0ee6b" + integrity sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ== + boolbase@^1.0.0, boolbase@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" @@ -2080,7 +2083,7 @@ browserify-des@^1.0.0: inherits "^2.0.1" safe-buffer "^5.1.2" -browserify-rsa@^4.0.0: +browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= @@ -2089,17 +2092,19 @@ browserify-rsa@^4.0.0: randombytes "^2.0.1" browserify-sign@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" - integrity sha1-qk62jl17ZYuqa/alfmMMvXqT0pg= + version "4.2.1" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" + integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== dependencies: - bn.js "^4.1.1" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.2" - elliptic "^6.0.0" - inherits "^2.0.1" - parse-asn1 "^5.0.0" + bn.js "^5.1.1" + browserify-rsa "^4.0.1" + create-hash "^1.2.0" + create-hmac "^1.1.7" + elliptic "^6.5.3" + inherits "^2.0.4" + parse-asn1 "^5.1.5" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" browserify-zlib@^0.2.0: version "0.2.0" @@ -2117,14 +2122,14 @@ browserslist@^1.1.3: electron-to-chromium "^1.2.7" browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.12.2, browserslist@^4.14.5, browserslist@^4.6.4, browserslist@^4.8.5: - version "4.14.5" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.14.5.tgz#1c751461a102ddc60e40993639b709be7f2c4015" - integrity sha512-Z+vsCZIvCBvqLoYkBFTwEYH3v5MCQbsAjp50ERycpOjnPmolg1Gjy4+KaWWpm8QOJt9GHkhdqAl14NpCX73CWA== + version "4.14.6" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.14.6.tgz#97702a9c212e0c6b6afefad913d3a1538e348457" + integrity sha512-zeFYcUo85ENhc/zxHbiIp0LGzzTrE2Pv2JhxvS7kpUb9Q9D38kUX6Bie7pGutJ/5iF5rOxE7CepAuWD56xJ33A== dependencies: - caniuse-lite "^1.0.30001135" - electron-to-chromium "^1.3.571" - escalade "^3.1.0" - node-releases "^1.1.61" + caniuse-lite "^1.0.30001154" + electron-to-chromium "^1.3.585" + escalade "^3.1.1" + node-releases "^1.1.65" bs-recipes@1.3.4: version "1.3.4" @@ -2184,12 +2189,12 @@ buffer@^4.3.0: isarray "^1.0.0" buffer@^5.2.1: - version "5.6.0" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.6.0.tgz#a31749dc7d81d84db08abf937b6b8c4033f62786" - integrity sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw== + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" + base64-js "^1.3.1" + ieee754 "^1.1.13" builtin-status-codes@^3.0.0: version "3.0.0" @@ -2250,6 +2255,14 @@ cacheable-request@^2.1.1: normalize-url "2.0.1" responselike "1.0.2" +call-bind@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.0.tgz#24127054bb3f9bdcb4b1fb82418186072f77b8ce" + integrity sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.0" + call-me-maybe@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" @@ -2346,10 +2359,10 @@ camelcase@^5.0.0, camelcase@^5.3.1: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -camelcase@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.1.0.tgz#27dc176173725fb0adf8a48b647f4d7871944d78" - integrity sha512-WCMml9ivU60+8rEJgELlFp1gxFcEGxwYleE3bziHEDeqsqAWGHdimB7beBFGjLzVNgPGyDsfgXLQEYMpmIFnVQ== +camelcase@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" + integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== caniuse-api@^3.0.0: version "3.0.0" @@ -2361,25 +2374,15 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-db@^1.0.30000639: - version "1.0.30001036" - resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30001036.tgz#8761fb6cd423ef2d3f8d96a21d898932252dc477" - integrity sha512-plRkihXQyiDaFUXC7x/jAIXXTKiiaWvfAagsruh/vmstnRQ+a2a95HyENxiTr5WrkPSvmFUIvsRUalVFyeh2/w== +caniuse-db@^1.0.30000639, caniuse-db@^1.0.30001090: + version "1.0.30001156" + resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30001156.tgz#279f2188d3f7a29313ec0e7e9efb600ca9c61418" + integrity sha512-L9vmkUDqH5QWgnB3RUukW1B5P6Vvkf44pjvaoPOUbIkchkUsq+vwXjzjQl9Hw3Ri8xS3XJmfm3H0UGyTx+s+Rg== -caniuse-db@^1.0.30001090: - version "1.0.30001093" - resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30001093.tgz#5a1cae72d94df1156f40f15d9079456e1b29d050" - integrity sha512-XqXxHR6Z9IN0BXLKMaTJ1NZ+US74cbKritholD6uaDLUWHiDj0QilpSb708wOcoGz0PmPRsXT/6zE+bjx+QSMw== - -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001109: - version "1.0.30001109" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001109.tgz#a9f3f26a0c3753b063d7acbb48dfb9c0e46f2b19" - integrity sha512-4JIXRodHzdS3HdK8nSgIqXYLExOvG+D2/EenSvcub2Kp3QEADjo2v2oUn5g0n0D+UNwG9BtwKOyGcSq2qvQXvQ== - -caniuse-lite@^1.0.30001135: - version "1.0.30001148" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001148.tgz#dc97c7ed918ab33bf8706ddd5e387287e015d637" - integrity sha512-E66qcd0KMKZHNJQt9hiLZGE3J4zuTqE1OnU53miEVtylFbwOEmeA5OsRu90noZful+XGSQOni1aT2tiqu/9yYw== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001154: + version "1.0.30001156" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001156.tgz#75c20937b6012fe2b02ab58b30d475bf0718de97" + integrity sha512-z7qztybA2eFZTB6Z3yvaQBIoJpQtsewRD74adw2UbRWwsRq3jIPvgrQGawBMbfafekQaD21FWuXNcywtTDGGCw== caseless@~0.12.0: version "0.12.0" @@ -2397,9 +2400,9 @@ caw@^2.0.0, caw@^2.0.1: url-to-options "^1.0.1" ccount@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.0.5.tgz#ac82a944905a65ce204eb03023157edf29425c17" - integrity sha512-MOli1W+nfbPLlKEhInaxhRdp7KVLFxLN5ykwzHgLsLI3H3gs5jjFAK4Eoj3OzzcxCtumDaI8onoVDeQyWaNTkw== + version "1.1.0" + resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.1.0.tgz#246687debb6014735131be8abab2d93898f8d043" + integrity sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg== chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" @@ -2477,9 +2480,9 @@ chokidar@^2.0.0, chokidar@^2.1.8: fsevents "^1.2.7" chokidar@^3.4.1: - version "3.4.1" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.1.tgz#e905bdecf10eaa0a0b1db0c664481cc4cbc22ba1" - integrity sha512-TQTJyr2stihpC4Sya9hs2Xh+O2wf+igjL36Y75xx2WdHuiICcn/XJza46Jwt0eT5hVpQOzo3FpY3cj3RVYLX0g== + version "3.4.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.3.tgz#c1df38231448e45ca4ac588e6c79573ba6a57d5b" + integrity sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ== dependencies: anymatch "~3.1.1" braces "~3.0.2" @@ -2487,7 +2490,7 @@ chokidar@^3.4.1: is-binary-path "~2.1.0" is-glob "~4.0.1" normalize-path "~3.0.0" - readdirp "~3.4.0" + readdirp "~3.5.0" optionalDependencies: fsevents "~2.1.2" @@ -2542,6 +2545,14 @@ clean-stack@^2.0.0: resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== +clean-webpack-plugin@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/clean-webpack-plugin/-/clean-webpack-plugin-3.0.0.tgz#a99d8ec34c1c628a4541567aa7b457446460c62b" + integrity sha512-MciirUH5r+cYLGCOL5JX/ZLzOZbVr1ot3Fw+KcvbhUb6PM+yycqd9ZhIlcigQ5gl+XhppNmw3bEFuaaMNyLj3A== + dependencies: + "@types/webpack" "^4.4.31" + del "^4.1.1" + cliui@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" @@ -2685,10 +2696,10 @@ color-name@^1.0.0, color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -color-string@^1.5.2: - version "1.5.3" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.3.tgz#c9bbc5f01b58b5492f3d6857459cb6590ce204cc" - integrity sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw== +color-string@^1.5.4: + version "1.5.4" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.4.tgz#dd51cd25cfee953d138fe4002372cc3d0e504cb6" + integrity sha512-57yF5yt8Xa3czSEW1jfQDE79Idk0+AkN/4KWad6tbdxUmAs3MvjxlWSWD4deYytcRfoZ9nhKyFl1kj5tBvidbw== dependencies: color-name "^1.0.0" simple-swizzle "^0.2.2" @@ -2699,12 +2710,12 @@ color-support@^1.1.3: integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== color@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/color/-/color-3.1.2.tgz#68148e7f85d41ad7649c5fa8c8106f098d229e10" - integrity sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg== + version "3.1.3" + resolved "https://registry.yarnpkg.com/color/-/color-3.1.3.tgz#ca67fb4e7b97d611dcde39eceed422067d91596e" + integrity sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ== dependencies: color-convert "^1.9.1" - color-string "^1.5.2" + color-string "^1.5.4" colorette@^1.2.1: version "1.2.1" @@ -2718,12 +2729,22 @@ combined-stream@^1.0.6, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" +command-line-usage@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/command-line-usage/-/command-line-usage-6.1.0.tgz#f28376a3da3361ff3d36cfd31c3c22c9a64c7cb6" + integrity sha512-Ew1clU4pkUeo6AFVDFxCbnN7GIZfXl48HIOQeFQnkO3oOqvpI7wdqtLRwv9iOCZ/7A+z4csVZeiDdEcj8g6Wiw== + dependencies: + array-back "^4.0.0" + chalk "^2.4.2" + table-layout "^1.0.0" + typical "^5.2.0" + commander@2.17.x: version "2.17.1" resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg== -commander@^2.2.0, commander@^2.20.0: +commander@^2.2.0, commander@^2.20.0, commander@^2.8.1: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== @@ -2733,18 +2754,21 @@ commander@^4.1.1: resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== +commander@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.0.tgz#b990bfb8ac030aedc6d11bc04d1488ffef56db75" + integrity sha512-zP4jEKbe8SHzKJYQmq8Y9gYjtO/POJLgIdKgV7B9qNmABVFVc+ctqSX6iXh4mCpJfRBOabiZ2YKPg8ciDw6C+Q== + +commander@~2.13.0: + version "2.13.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" + integrity sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA== + commander@~2.19.0: version "2.19.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== -commander@~2.8.1: - version "2.8.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.8.1.tgz#06be367febfda0c330aa1e2a072d3dc9762425d4" - integrity sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ= - dependencies: - graceful-readlink ">= 1.0.0" - commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" @@ -2760,7 +2784,7 @@ component-emitter@1.2.1: resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= -component-emitter@^1.2.1: +component-emitter@^1.2.1, component-emitter@~1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== @@ -2785,7 +2809,7 @@ concat-stream@^1.5.0, concat-stream@^1.6.0: readable-stream "^2.2.2" typedarray "^0.0.6" -concat-with-sourcemaps@^1.0.0: +concat-with-sourcemaps@^1.0.0, concat-with-sourcemaps@^1.0.5: version "1.1.0" resolved "https://registry.yarnpkg.com/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz#d4ea93f05ae25790951b99e7b3b09e3908a4082e" integrity sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg== @@ -2890,9 +2914,9 @@ copy-props@^2.0.1: is-plain-object "^2.0.1" copy-webpack-plugin@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-5.1.1.tgz#5481a03dea1123d88a988c6ff8b78247214f0b88" - integrity sha512-P15M5ZC8dyCjQHWwd4Ia/dm0SgVvZJMYeykVIVYXbGyqO4dWB5oyPHp9i7wjwo5LhtlhKbiBCdS2NvM07Wlybg== + version "5.1.2" + resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-5.1.2.tgz#8a889e1dcafa6c91c6cd4be1ad158f1d3823bae2" + integrity sha512-Uh7crJAco3AjBvgAy9Z75CjK8IG+gxaErro71THQ+vv/bl4HaQcpkexAY8KVW/T6D2W2IRr+couF/knIRkZMIQ== dependencies: cacache "^12.0.3" find-cache-dir "^2.1.0" @@ -2904,7 +2928,7 @@ copy-webpack-plugin@^5.1.1: normalize-path "^3.0.0" p-limit "^2.2.1" schema-utils "^1.0.0" - serialize-javascript "^2.1.2" + serialize-javascript "^4.0.0" webpack-log "^2.0.0" core-js-compat@^3.6.2: @@ -2952,14 +2976,14 @@ cosmiconfig@^7.0.0: yaml "^1.10.0" create-ecdh@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" - integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw== + version "4.0.4" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" + integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== dependencies: bn.js "^4.1.0" - elliptic "^6.0.0" + elliptic "^6.5.3" -create-hash@^1.1.0, create-hash@^1.1.2: +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== @@ -2970,7 +2994,7 @@ create-hash@^1.1.0, create-hash@^1.1.2: ripemd160 "^2.0.1" sha.js "^2.4.0" -create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: +create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== @@ -3010,7 +3034,7 @@ cross-spawn@^6.0.0: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^7.0.2, cross-spawn@^7.0.3: +cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -3065,15 +3089,15 @@ css-has-pseudo@^0.10.0: postcss-selector-parser "^5.0.0-rc.4" css-loader@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-5.0.0.tgz#f0a48dfacc3ab9936a05ee16a09e7f313872e117" - integrity sha512-9g35eXRBgjvswyJWoqq/seWp+BOxvUl8IinVNTsUBFFxtwfEYvlmEn6ciyn0liXGbGh5HyJjPGCuobDSfqMIVg== + version "5.0.1" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-5.0.1.tgz#9e4de0d6636a6266a585bd0900b422c85539d25f" + integrity sha512-cXc2ti9V234cq7rJzFKhirb2L2iPy8ZjALeVJAozXYz9te3r4eqLSixNAbMDJSgJEQywqXzs8gonxaboeKqwiw== dependencies: - camelcase "^6.1.0" + camelcase "^6.2.0" cssesc "^3.0.0" icss-utils "^5.0.0" loader-utils "^2.0.0" - postcss "^8.1.1" + postcss "^8.1.4" postcss-modules-extract-imports "^3.0.0" postcss-modules-local-by-default "^4.0.0" postcss-modules-scope "^3.0.0" @@ -3122,12 +3146,12 @@ css-tree@1.0.0-alpha.37: mdn-data "2.0.4" source-map "^0.6.1" -css-tree@1.0.0-alpha.39: - version "1.0.0-alpha.39" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.39.tgz#2bff3ffe1bb3f776cf7eefd91ee5cba77a149eeb" - integrity sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA== +css-tree@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0.tgz#21993fa270d742642a90409a2c0cb3ac0298adf6" + integrity sha512-CdVYz/Yuqw0VdKhXPBIgi8DO3NicJVYZNWeX9XcIuSp9ZoFT5IcleVRW07O5rMjdcx1mb+MEJPknTTEW7DdsYw== dependencies: - mdn-data "2.0.6" + mdn-data "2.0.12" source-map "^0.6.1" css-what@2.1: @@ -3136,9 +3160,9 @@ css-what@2.1: integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg== css-what@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.2.1.tgz#f4a8f12421064621b456755e34a03a2c22df5da1" - integrity sha512-WwOrosiQTvyms+Ti5ZC5vGEK0Vod3FTt1ca+payZqvKuGJF+dq7bG63DstxtN0dpm6FxY27a/zS3Wten+gEtGw== + version "3.4.2" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.4.2.tgz#ea7026fcb01777edbde52124e21f327e7ae950e4" + integrity sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ== css@2.X, css@^2.2.1: version "2.2.4" @@ -3234,11 +3258,11 @@ cssnano@^4.1.10: postcss "^7.0.0" csso@^4.0.2: - version "4.0.3" - resolved "https://registry.yarnpkg.com/csso/-/csso-4.0.3.tgz#0d9985dc852c7cc2b2cacfbbe1079014d1a8e903" - integrity sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ== + version "4.1.0" + resolved "https://registry.yarnpkg.com/csso/-/csso-4.1.0.tgz#1d31193efa99b87aa6bad6c0cef155e543d09e8b" + integrity sha512-h+6w/W1WqXaJA4tb1dk7r5tVbOm97MsKxzwnvOR04UQ6GILroryjMWu3pmCCtL2mLaEStQ0fZgeGiy99mo7iyg== dependencies: - css-tree "1.0.0-alpha.39" + css-tree "^1.0.0" currently-unhandled@^0.4.1: version "0.4.1" @@ -3300,7 +3324,7 @@ debug@3.X: dependencies: ms "^2.1.1" -debug@4.1.1, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@~4.1.0: +debug@4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== @@ -3314,6 +3338,13 @@ debug@=3.1.0, debug@~3.1.0: dependencies: ms "2.0.0" +debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: + version "4.2.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1" + integrity sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg== + dependencies: + ms "2.1.2" + decamelize-keys@^1.0.0, decamelize-keys@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" @@ -3392,6 +3423,11 @@ decompress@^4.0.0, decompress@^4.2.0: pify "^2.3.0" strip-dirs "^2.0.0" +deep-extend@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + deep-is@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" @@ -3438,6 +3474,19 @@ define-property@^2.0.2: is-descriptor "^1.0.2" isobject "^3.0.1" +del@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" + integrity sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ== + dependencies: + "@types/glob" "^7.1.1" + globby "^6.1.0" + is-path-cwd "^2.0.0" + is-path-in-cwd "^2.0.0" + p-map "^2.0.0" + pify "^4.0.1" + rimraf "^2.6.3" + del@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/del/-/del-6.0.0.tgz#0b40d0332cea743f1614f818be4feb717714c952" @@ -3504,6 +3553,14 @@ diffie-hellman@^5.0.0: miller-rabin "^4.0.0" randombytes "^2.0.0" +dir-glob@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034" + integrity sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag== + dependencies: + arrify "^1.0.1" + path-type "^3.0.0" + dir-glob@^2.0.0, dir-glob@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" @@ -3553,10 +3610,19 @@ dom-serializer@0: domelementtype "^2.0.1" entities "^2.0.0" +dom-serializer@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.1.0.tgz#5f7c828f1bfc44887dc2a315ab5c45691d544b58" + integrity sha512-ox7bvGXt2n+uLWtCRLybYx60IrOlWL/aCebWJk1T0d4m3y2tzf4U3ij9wBMUb6YJZpz06HCCYuyCDveE2xXmzQ== + dependencies: + domelementtype "^2.0.1" + domhandler "^3.0.0" + entities "^2.0.0" + dom7@^3.0.0-alpha.7: - version "3.0.0-alpha.7" - resolved "https://registry.yarnpkg.com/dom7/-/dom7-3.0.0-alpha.7.tgz#3b4ba156a83fa37fb3fa34b8ab40a1a41a56feb1" - integrity sha512-3epkQPsKsbk2Dixqqgm2DT/KzhiAPByjDK7emu6owwFLbM5UoiqWKgdsH+6PpMEgoeR6Ex/bW1UbOe0FWZU0zg== + version "3.0.0-alpha.9" + resolved "https://registry.yarnpkg.com/dom7/-/dom7-3.0.0-alpha.9.tgz#0110c21181b8bad3a1ee72443e04d3c2e3f1d38f" + integrity sha512-wTxPe1vJqLAy2PzAROh/n1PsRF/ZklAJyRIn9shm2dAQjP4JhjsgDKQ1YTbuzf1KVlqOlqYPmwupQExcB9jOUg== dependencies: ssr-window "^3.0.0-alpha.1" @@ -3571,9 +3637,9 @@ domelementtype@1, domelementtype@^1.3.1: integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== domelementtype@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.1.tgz#1f8bdfe91f5a78063274e803b4bdcedf6e94f94d" - integrity sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ== + version "2.0.2" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.2.tgz#f3b6e549201e46f588b59463dd77187131fe6971" + integrity sha512-wFwTwCVebUrMgGeAwRL/NhZtHAUyT9n9yg4IMDwf10+6iCMxSkVq9MGCVEH+QZWo1nNidy8kNvwmv4zWHDTqvA== domhandler@^2.3.0: version "2.4.2" @@ -3582,6 +3648,13 @@ domhandler@^2.3.0: dependencies: domelementtype "1" +domhandler@^3.0.0, domhandler@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-3.3.0.tgz#6db7ea46e4617eb15cf875df68b2b8524ce0037a" + integrity sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA== + dependencies: + domelementtype "^2.0.1" + domutils@1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" @@ -3598,6 +3671,15 @@ domutils@^1.5.1, domutils@^1.7.0: dom-serializer "0" domelementtype "1" +domutils@^2.0.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.4.2.tgz#7ee5be261944e1ad487d9aa0616720010123922b" + integrity sha512-NKbgaM8ZJOecTZsIzW5gSuplsX2IWW2mIK7xVr8hTQF2v1CJWTmLZ1HOCh5sH+IzVPAGE5IucooOkvwBRAdowA== + dependencies: + dom-serializer "^1.0.1" + domelementtype "^2.0.1" + domhandler "^3.3.0" + dot-case@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.3.tgz#21d3b52efaaba2ea5fda875bb1aa8124521cf4aa" @@ -3607,9 +3689,9 @@ dot-case@^3.0.3: tslib "^1.10.0" dot-prop@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.2.0.tgz#c34ecc29556dc45f1f4c22697b6f4904e0cc4fcb" - integrity sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A== + version "5.3.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" + integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== dependencies: is-obj "^2.0.0" @@ -3661,9 +3743,9 @@ duplexer3@^0.1.4: integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= duplexer@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" - integrity sha1-rOb/gIwc5mtX0ev5eXessCM0z8E= + version "0.1.2" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" + integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== duplexify@^3.4.2, duplexify@^3.6.0: version "3.7.1" @@ -3720,17 +3802,12 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -electron-to-chromium@^1.2.7: - version "1.3.427" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.427.tgz#ea43d02908a8c71f47ebb46e09de5a3cf8236f04" - integrity sha512-/rG5G7Opcw68/Yrb4qYkz07h3bESVRJjUl4X/FrKLXzoUJleKm6D7K7rTTz8V5LUWnd+BbTOyxJX2XprRqHD8A== +electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.585: + version "1.3.589" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.589.tgz#bd26183ed8697dde6ac19acbc16a3bf33b1f8220" + integrity sha512-rQItBTFnol20HaaLm26UgSUduX7iGerwW7pEYX17MB1tI6LzFajiLV7iZ7LVcUcsN/7HrZUoCLrBauChy/IqEg== -electron-to-chromium@^1.3.571: - version "1.3.578" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.578.tgz#e6671936f4571a874eb26e2e833aa0b2c0b776e0" - integrity sha512-z4gU6dA1CbBJsAErW5swTGAaU2TBzc2mPAonJb00zqW1rOraDo2zfBMDRvaz9cVic+0JEZiYbHWPw/fTaZlG2Q== - -elliptic@^6.0.0: +elliptic@^6.5.3: version "6.5.3" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.3.tgz#cb59eb2efdaf73a0bd78ccd7015a62ad6e0f93d6" integrity sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw== @@ -3788,18 +3865,18 @@ engine.io-client@~3.2.0: yeast "0.1.2" engine.io-client@~3.4.0: - version "3.4.1" - resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.4.1.tgz#922ddb47eecdcb541136a93aeead24718fd05461" - integrity sha512-RJNmA+A9Js+8Aoq815xpGAsgWH1VoSYM//2VgIiu9lNOaHFfLpTjH4tOzktBpjIs5lvOfiNY1dwf+NuU6D38Mw== + version "3.4.4" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.4.4.tgz#77d8003f502b0782dd792b073a4d2cf7ca5ab967" + integrity sha512-iU4CRr38Fecj8HoZEnFtm2EiKGbYZcPn3cHxqNGl/tmdWRf60KhK+9vE0JeSjgnlS/0oynEfLgKbT9ALpim0sQ== dependencies: - component-emitter "1.2.1" + component-emitter "~1.3.0" component-inherit "0.0.3" - debug "~4.1.0" + debug "~3.1.0" engine.io-parser "~2.2.0" has-cors "1.1.0" indexof "0.0.1" - parseqs "0.0.5" - parseuri "0.0.5" + parseqs "0.0.6" + parseuri "0.0.6" ws "~6.1.0" xmlhttprequest-ssl "~1.5.4" yeast "0.1.2" @@ -3816,13 +3893,13 @@ engine.io-parser@~2.1.0, engine.io-parser@~2.1.1: has-binary2 "~1.0.2" engine.io-parser@~2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-2.2.0.tgz#312c4894f57d52a02b420868da7b5c1c84af80ed" - integrity sha512-6I3qD9iUxotsC5HEMuuGsKA0cXerGz+4uGcXQEkfBidgKf0amsjrrtwcbwK/nzpZBxclXlV7gGl9dgWvu4LF6w== + version "2.2.1" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-2.2.1.tgz#57ce5611d9370ee94f99641b589f94c97e4f5da7" + integrity sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg== dependencies: after "0.8.2" arraybuffer.slice "~0.0.7" - base64-arraybuffer "0.1.5" + base64-arraybuffer "0.1.4" blob "0.0.5" has-binary2 "~1.0.2" @@ -3855,7 +3932,7 @@ enhanced-resolve@^5.3.1: graceful-fs "^4.2.4" tapable "^2.0.0" -enquirer@^2.3.5: +enquirer@^2.3.5, enquirer@^2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== @@ -3868,15 +3945,20 @@ entities@^1.1.1: integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== entities@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.0.tgz#68d6084cab1b079767540d80e56a39b423e4abf4" - integrity sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw== + version "2.1.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.1.0.tgz#992d3129cf7df6870b96c57858c249a120f8b8b5" + integrity sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w== env-paths@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.0.tgz#cdca557dc009152917d6166e2febe1f039685e43" integrity sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA== +envinfo@^7.7.3: + version "7.7.3" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.7.3.tgz#4b2d8622e3e7366afb8091b23ed95569ea0208cc" + integrity sha512-46+j5QxbPWza0PB1i15nZx0xQ4I/EfQxg9J8Had3b408SV63nEtor2e+oiY63amTo9KTuh2a3XLObNwduxYwwA== + epubjs@^0.3.85: version "0.3.88" resolved "https://registry.yarnpkg.com/epubjs/-/epubjs-0.3.88.tgz#bc365e7e21893cf2d92717ce10927c1071275347" @@ -3906,39 +3988,40 @@ error-ex@^1.2.0, error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.5: - version "1.17.6" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.6.tgz#9142071707857b2cacc7b89ecb670316c3e2d52a" - integrity sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw== +es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.2: + version "1.17.7" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.7.tgz#a4de61b2f66989fc7421676c1cb9787573ace54c" + integrity sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g== dependencies: es-to-primitive "^1.2.1" function-bind "^1.1.1" has "^1.0.3" has-symbols "^1.0.1" - is-callable "^1.2.0" - is-regex "^1.1.0" - object-inspect "^1.7.0" + is-callable "^1.2.2" + is-regex "^1.1.1" + object-inspect "^1.8.0" object-keys "^1.1.1" - object.assign "^4.1.0" + object.assign "^4.1.1" string.prototype.trimend "^1.0.1" string.prototype.trimstart "^1.0.1" -es-abstract@^1.17.2: - version "1.17.5" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.5.tgz#d8c9d1d66c8981fb9200e2251d799eee92774ae9" - integrity sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg== +es-abstract@^1.18.0-next.1: + version "1.18.0-next.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.1.tgz#6e3a0a4bda717e5023ab3b8e90bec36108d22c68" + integrity sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA== dependencies: es-to-primitive "^1.2.1" function-bind "^1.1.1" has "^1.0.3" has-symbols "^1.0.1" - is-callable "^1.1.5" - is-regex "^1.0.5" - object-inspect "^1.7.0" + is-callable "^1.2.2" + is-negative-zero "^2.0.0" + is-regex "^1.1.1" + object-inspect "^1.8.0" object-keys "^1.1.1" - object.assign "^4.1.0" - string.prototype.trimleft "^2.1.1" - string.prototype.trimright "^2.1.1" + object.assign "^4.1.1" + string.prototype.trimend "^1.0.1" + string.prototype.trimstart "^1.0.1" es-to-primitive@^1.2.1: version "1.2.1" @@ -3990,10 +4073,10 @@ es6-weak-map@^2.0.1, es6-weak-map@^2.0.2: es6-iterator "^2.0.3" es6-symbol "^3.1.1" -escalade@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.0.tgz#e8e2d7c7a8b76f6ee64c2181d6b8151441602d4e" - integrity sha512-mAk+hPSO8fLDkhV7V0dXazH5pDc6MrjBTPyD3VeKzxnVFjH1MIxbCdqGZB9O8+EwWakZs3ZCbDS4IpRt79V1ig== +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== escape-html@~1.0.3: version "1.0.3" @@ -4182,31 +4265,19 @@ esquery@^1.2.0: dependencies: estraverse "^5.1.0" -esrecurse@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" - integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== - dependencies: - estraverse "^4.1.0" - -esrecurse@^4.3.0: +esrecurse@^4.1.0, esrecurse@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: estraverse "^5.2.0" -estraverse@^4.1.0, estraverse@^4.1.1: +estraverse@^4.1.1: version "4.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== -estraverse@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.1.0.tgz#374309d39fd935ae500e7b92e8a6b4c720e59642" - integrity sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw== - -estraverse@^5.2.0: +estraverse@^5.1.0, estraverse@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== @@ -4230,9 +4301,9 @@ event-emitter@^0.3.5: es5-ext "~0.10.14" eventemitter3@^4.0.0, eventemitter3@^4.0.3: - version "4.0.4" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.4.tgz#b5463ace635a083d018bdc7c917b4c5f10a85384" - integrity sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ== + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== events@^3.0.0, events@^3.2.0: version "3.2.0" @@ -4284,6 +4355,21 @@ execa@^1.0.0: signal-exit "^3.0.0" strip-eof "^1.0.0" +execa@^4.0.0, execa@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" + integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + human-signals "^1.1.1" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.0" + onetime "^5.1.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + execall@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/execall/-/execall-1.0.0.tgz#73d0904e395b3cab0658b08d09ec25307f29bb73" @@ -4406,7 +4492,7 @@ fast-deep-equal@^3.1.1: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-glob@^2.2.6: +fast-glob@^2.0.2, fast-glob@^2.2.6: version "2.2.7" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d" integrity sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw== @@ -4435,6 +4521,11 @@ fast-json-stable-stringify@^2.0.0: resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== +fast-levenshtein@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-1.1.4.tgz#e6a754cc8f15e58987aa9cbd27af66fd6f4e5af9" + integrity sha1-5qdUzI8V5YmHqpy9J69m/W9OWvk= + fast-levenshtein@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" @@ -4451,9 +4542,9 @@ fastest-levenshtein@^1.0.12: integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow== fastq@^1.6.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.7.0.tgz#fcd79a08c5bd7ec5b55cd3f5c4720db551929801" - integrity sha512-YOadQRnHd5q6PogvAR/x62BGituF2ufiEA6s8aavQANw5YKHERI4AREboX6KotzP8oX2klxYF2wcV/7bn1clfQ== + version "1.9.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.9.0.tgz#e16a72f338eaca48e91b5c23593bcc2ef66b7947" + integrity sha512-i7FVWL8HhVY+CTkwFxkN2mk3h+787ixS5S63eb78diVRc1MCssarHq3W5cj0av7YDSwmaV928RNag+U1etRQ7w== dependencies: reusify "^1.0.4" @@ -4708,9 +4799,9 @@ follow-redirects@1.5.10: debug "=3.1.0" follow-redirects@^1.0.0: - version "1.12.1" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.12.1.tgz#de54a6205311b93d60398ebc01cf7015682312b6" - integrity sha512-tmRv0AVuR7ZyouUHLeNSiO6pqulF7dYa3s19c6t+wz9LD69/uSzdMxJ2S91nTI9U3rt/IldxpzMOFejp6f0hjg== + version "1.13.0" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.0.tgz#b42e8d93a2a7eea5ed88633676d6597bc8e384db" + integrity sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA== for-in@^1.0.1, for-in@^1.0.2: version "1.0.2" @@ -4808,9 +4899,9 @@ fs.realpath@^1.0.0: integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= fsevents@^1.2.7: - version "1.2.12" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.12.tgz#db7e0d8ec3b0b45724fd4d83d43554a8f1f0de5c" - integrity sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q== + version "1.2.13" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" + integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== dependencies: bindings "^1.5.0" nan "^2.12.1" @@ -4867,9 +4958,9 @@ gaze@^1.0.0: globule "^1.0.0" gensync@^1.0.0-beta.1: - version "1.0.0-beta.1" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" - integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== get-caller-file@^1.0.1: version "1.0.3" @@ -4881,6 +4972,15 @@ get-caller-file@^2.0.1: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== +get-intrinsic@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.0.1.tgz#94a9768fcbdd0595a1c9273aacf4c89d075631be" + integrity sha512-ZnWP+AmS1VUaLgTRy47+zKtjTxz+0xMpx3I52i+aalBK1QP19ggLF3Db89KJX7kjfOfP2eoa01qc++GwPgufPg== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + get-proxy@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/get-proxy/-/get-proxy-2.1.0.tgz#349f2b4d91d44c4d4d4e9cba2ad90143fac5ef93" @@ -4923,6 +5023,13 @@ get-stream@^4.0.0: dependencies: pump "^3.0.0" +get-stream@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" @@ -4943,13 +5050,13 @@ getpass@^0.1.1: assert-plus "^1.0.0" gifsicle@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/gifsicle/-/gifsicle-5.0.0.tgz#d1ca7f223e949966d373eb1fb6e7ce156d257750" - integrity sha512-GZ1ym4uY12FHXsf26Kk1G06Edwago9zctqUqin69pm8ObA13jb3urgHU9PgKmtH6kHaCjEcjoRzNjxUyYvb1Bg== + version "5.1.0" + resolved "https://registry.yarnpkg.com/gifsicle/-/gifsicle-5.1.0.tgz#08f878e9048c70adf046185115a6350516a1fdc0" + integrity sha512-hQsOH7yjC7fMokntysN6f2QuxrnX+zmKKKVy0sC3Vhtnk8WrOxLdfH/Z2PNn7lVVx+1+drzIeAe8ufcmdSC/8g== dependencies: bin-build "^3.0.0" bin-wrapper "^4.0.0" - execa "^1.0.0" + execa "^4.0.0" logalot "^2.0.0" glob-parent@^3.1.0: @@ -4994,15 +5101,16 @@ glob-to-regexp@^0.4.1: integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== glob-watcher@^5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/glob-watcher/-/glob-watcher-5.0.3.tgz#88a8abf1c4d131eb93928994bc4a593c2e5dd626" - integrity sha512-8tWsULNEPHKQ2MR4zXuzSmqbdyV5PtwwCaWSGQ1WwHsJ07ilNeN1JB8ntxhckbnpSHaf9dXFUHzIWvm1I13dsg== + version "5.0.5" + resolved "https://registry.yarnpkg.com/glob-watcher/-/glob-watcher-5.0.5.tgz#aa6bce648332924d9a8489be41e3e5c52d4186dc" + integrity sha512-zOZgGGEHPklZNjZQaZ9f41i7F2YwE+tS5ZHrDhbBCk3stwahn5vQxnFmBJZHoYdusR6R1bLSXeGUy/BhctwKzw== dependencies: anymatch "^2.0.0" async-done "^1.2.0" chokidar "^2.0.0" is-negated-glob "^1.0.0" just-debounce "^1.0.0" + normalize-path "^3.0.0" object.defaults "^1.1.0" glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@~7.1.1: @@ -5091,6 +5199,17 @@ globby@^11.0.1: merge2 "^1.3.0" slash "^3.0.0" +globby@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" + integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= + dependencies: + array-union "^1.0.1" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + globby@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/globby/-/globby-7.1.1.tgz#fb2ccff9401f8600945dfada97440cca972b8680" @@ -5103,6 +5222,19 @@ globby@^7.1.1: pify "^3.0.0" slash "^1.0.0" +globby@^8.0.1: + version "8.0.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-8.0.2.tgz#5697619ccd95c5275dbb2d6faa42087c1a941d8d" + integrity sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w== + dependencies: + array-union "^1.0.1" + dir-glob "2.0.0" + fast-glob "^2.0.2" + glob "^7.1.2" + ignore "^3.3.5" + pify "^3.0.0" + slash "^1.0.0" + globby@^9.0.0: version "9.2.0" resolved "https://registry.yarnpkg.com/globby/-/globby-9.2.0.tgz#fd029a706c703d29bdd170f4b6db3a3f7a7cb63d" @@ -5123,12 +5255,12 @@ globjoin@^0.1.4: integrity sha1-L0SUrIkZ43Z8XLtpHp9GMyQoXUM= globule@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/globule/-/globule-1.3.1.tgz#90a25338f22b7fbeb527cee63c629aea754d33b9" - integrity sha512-OVyWOHgw29yosRHCHo7NncwR1hW5ew0W/UrvtwvjefVJeQ26q4/8r8FmPsSF1hJ93IgWkyv16pCTz6WblMzm/g== + version "1.3.2" + resolved "https://registry.yarnpkg.com/globule/-/globule-1.3.2.tgz#d8bdd9e9e4eef8f96e245999a5dee7eb5d8529c4" + integrity sha512-7IDTQTIu2xzXkT+6mlluidnWo+BypnbSoEVVQCGfzqnl5Ik8d3e1d4wycb8Rj9tWW+Z39uPWsdlquqiqPCd/pA== dependencies: glob "~7.1.1" - lodash "~4.17.12" + lodash "~4.17.10" minimatch "~3.0.2" glogg@^1.0.0: @@ -5138,14 +5270,7 @@ glogg@^1.0.0: dependencies: sparkles "^1.0.0" -gonzales-pe@^4.2.3: - version "4.2.4" - resolved "https://registry.yarnpkg.com/gonzales-pe/-/gonzales-pe-4.2.4.tgz#356ae36a312c46fe0f1026dd6cb539039f8500d2" - integrity sha512-v0Ts/8IsSbh9n1OJRnSfa7Nlxi4AkXIsWB6vPept8FDbL4bXn3FNuxjYtO/nmBGu7GDkL9MFeGebeSu6l55EPQ== - dependencies: - minimist "1.1.x" - -gonzales-pe@^4.3.0: +gonzales-pe@^4.2.3, gonzales-pe@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/gonzales-pe/-/gonzales-pe-4.3.0.tgz#fe9dec5f3c557eead09ff868c65826be54d067b3" integrity sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ== @@ -5200,11 +5325,6 @@ graceful-fs@4.X, graceful-fs@^4.0.0, graceful-fs@^4.1.10, graceful-fs@^4.1.11, g resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== -"graceful-readlink@>= 1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" - integrity sha1-TK+tdrxi8C+gObL5Tpo906ORpyU= - group-array@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/group-array/-/group-array-1.0.0.tgz#e2e8d8890e5b46f72eb49b71e8af675173a9d0f7" @@ -5424,11 +5544,11 @@ har-schema@^2.0.0: integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= har-validator@~5.1.3: - version "5.1.3" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" - integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== + version "5.1.5" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" + integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== dependencies: - ajv "^6.5.5" + ajv "^6.12.3" har-schema "^2.0.0" hard-rejection@^2.1.0: @@ -5482,7 +5602,7 @@ has-symbol-support-x@^1.4.1: resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455" integrity sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw== -has-symbols@^1.0.0, has-symbols@^1.0.1: +has-symbols@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== @@ -5618,10 +5738,20 @@ html-comment-regex@^1.1.0, html-comment-regex@^1.1.2: resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7" integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ== -html-minifier-terser@^5.0.1: - version "5.1.0" - resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-5.1.0.tgz#95d3df037f04835e9d1a09d1767c0e361a7de916" - integrity sha512-tiYE76O1zunboByeB/nFGwUEb263Z3nkNv6Lz2oLC1s6M36bLKfTrjQ+7ssVfaucVllE+N7hh/FbpbxvnIA+LQ== +html-loader@^1.1.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/html-loader/-/html-loader-1.3.2.tgz#5a72ebba420d337083497c9aba7866c9e1aee340" + integrity sha512-DEkUwSd0sijK5PF3kRWspYi56XP7bTNkyg5YWSzBdjaSDmvCufep5c4Vpb3PBf6lUL0YPtLwBfy9fL0t5hBAGA== + dependencies: + html-minifier-terser "^5.1.1" + htmlparser2 "^4.1.0" + loader-utils "^2.0.0" + schema-utils "^3.0.0" + +html-minifier-terser@^5.0.1, html-minifier-terser@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz#922e96f1f3bb60832c2634b79884096389b1f054" + integrity sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg== dependencies: camel-case "^4.1.1" clean-css "^4.2.3" @@ -5681,6 +5811,16 @@ htmlparser2@^3.10.0, htmlparser2@^3.3.0: inherits "^2.0.1" readable-stream "^3.1.1" +htmlparser2@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-4.1.0.tgz#9a4ef161f2e4625ebf7dfbe6c0a2f52d18a59e78" + integrity sha512-4zDq1a1zhE4gQso/c5LP1OtrhYTncXNSpvJYtWJBtXAETPlMfi3IFNjGuQbYLuVY4ZR0QMqRVvo4Pdy9KLyP8Q== + dependencies: + domelementtype "^2.0.1" + domhandler "^3.0.0" + domutils "^2.0.0" + entities "^2.0.0" + http-cache-semantics@3.8.1: version "3.8.1" resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2" @@ -5730,6 +5870,11 @@ https-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= +human-signals@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" + integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== + iconv-lite@0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -5742,10 +5887,10 @@ icss-utils@^5.0.0: resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.0.0.tgz#03ed56c3accd32f9caaf1752ebf64ef12347bb84" integrity sha512-aF2Cf/CkEZrI/vsu5WI/I+akFgdbwQHVE9YRZxATrhH4PVIe6a3BIjwjEcW+z+jP/hNh+YvM3lAAn1wJQ6opSg== -ieee754@^1.1.4: - version "1.1.13" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" - integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== +ieee754@^1.1.13, ieee754@^1.1.4: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== iferr@^0.1.5: version "0.1.5" @@ -5841,9 +5986,9 @@ import-fresh@^2.0.0: resolve-from "^3.0.0" import-fresh@^3.0.0, import-fresh@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" - integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== + version "3.2.2" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.2.tgz#fc129c160c5d68235507f4331a6baad186bdbc3e" + integrity sha512-cTPNrlvJT6twpYy+YmKUKrTSjWFs3bjYjAhCwm+z4EOCubZxAuO+hHpRN64TqjEaYSHs7tJAE0w1CKMGmsG/lw== dependencies: parent-module "^1.0.0" resolve-from "^4.0.0" @@ -5865,6 +6010,14 @@ import-lazy@^4.0.0: resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-4.0.0.tgz#e8eb627483a0a43da3c03f3e35548be5cb0cc153" integrity sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw== +import-local@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.2.tgz#a8cfd0431d1de4a2199703d003e3e62364fa6db6" + integrity sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" @@ -5940,6 +6093,11 @@ interpret@^1.4.0: resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== +interpret@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" + integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== + intersection-observer@^0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/intersection-observer/-/intersection-observer-0.11.0.tgz#f4ea067070326f68393ee161cc0a2ca4c0040c6f" @@ -6043,14 +6201,14 @@ is-buffer@^1.1.5: integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== is-buffer@^2.0.0, is-buffer@^2.0.2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623" - integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A== + version "2.0.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" + integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== -is-callable@^1.1.4, is-callable@^1.1.5, is-callable@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.0.tgz#83336560b54a38e35e3a2df7afd0454d691468bb" - integrity sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw== +is-callable@^1.1.4, is-callable@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.2.tgz#c7c6715cd22d4ddb48d3e19970223aceabb080d9" + integrity sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA== is-color-stop@^1.0.0: version "1.1.0" @@ -6064,6 +6222,13 @@ is-color-stop@^1.0.0: rgb-regex "^1.0.1" rgba-regex "^1.0.0" +is-core-module@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.1.0.tgz#a4cc031d9b1aca63eecbd18a650e13cb4eeab946" + integrity sha512-YcV7BgVMRFRua2FqQzKtTDMz8iCuLEyGKjr70q8Zm1yy2qKcurbFEd79PAdHV77oL3NrAaOVQIbMmiHQCHB7ZA== + dependencies: + has "^1.0.3" + is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" @@ -6083,7 +6248,7 @@ is-date-object@^1.0.1: resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== -is-decimal@^1.0.0, is-decimal@^1.0.2: +is-decimal@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== @@ -6191,6 +6356,11 @@ is-negated-glob@^1.0.0: resolved "https://registry.yarnpkg.com/is-negated-glob/-/is-negated-glob-1.0.0.tgz#6910bca5da8c95e784b5751b976cf5a10fee36d2" integrity sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI= +is-negative-zero@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.0.tgz#9553b121b0fac28869da9ed459e20c7543788461" + integrity sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE= + is-number-like@^1.0.3: version "1.0.8" resolved "https://registry.yarnpkg.com/is-number-like/-/is-number-like-1.0.8.tgz#2e129620b50891042e44e9bbbb30593e75cfbbe3" @@ -6225,11 +6395,25 @@ is-object@^1.0.1: resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470" integrity sha1-iVJojF7C/9awPsyF52ngKQMINHA= -is-path-cwd@^2.2.0: +is-path-cwd@^2.0.0, is-path-cwd@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== +is-path-in-cwd@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz#bfe2dca26c69f397265a4009963602935a053acb" + integrity sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ== + dependencies: + is-path-inside "^2.1.0" + +is-path-inside@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-2.1.0.tgz#7c9810587d659a40d27bcdb4d5616eab059494b2" + integrity sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg== + dependencies: + path-is-inside "^1.0.2" + is-path-inside@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.2.tgz#f5220fc82a3e233757291dddc9c5877f2a1f3017" @@ -6267,10 +6451,10 @@ is-promise@^4.0.0: resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-4.0.0.tgz#42ff9f84206c1991d26debf520dd5c01042dd2f3" integrity sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ== -is-regex@^1.0.5, is-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.0.tgz#ece38e389e490df0dc21caea2bd596f987f767ff" - integrity sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw== +is-regex@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.1.tgz#c6f98aacc546f6cec5468a07b7b153ab564a57b9" + integrity sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg== dependencies: has-symbols "^1.0.1" @@ -6306,6 +6490,11 @@ is-stream@^1.0.0, is-stream@^1.1.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= +is-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" + integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== + is-string@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" @@ -6430,9 +6619,9 @@ jellyfin-apiclient@^1.4.2: integrity sha512-xUvt1G0cDlam6hJgC5Jr6EE5botzdEMGxeer3Vm0+zhM7nb8iFnRmQRmTpVbXtYS8NLiHsiUmK1RLlelgtWDYg== jest-worker@^26.6.1: - version "26.6.1" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.1.tgz#c2ae8cde6802cc14056043f997469ec170d9c32a" - integrity sha512-R5IE3qSGz+QynJx8y+ICEkdI2OJ3RJjRQVEyCcFAd3yVhQSEtquziPO29Mlzgn07LOVE8u8jhJ1FqcwegiXWOw== + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" + integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== dependencies: "@types/node" "*" merge-stream "^2.0.0" @@ -6444,9 +6633,9 @@ jquery@>=1.9.1, jquery@^3.5.1: integrity sha512-XwIBPqcMn57FxfT+Go5pzySnm4KWkT1Tv7gjrpT1srtf8Weynl6R273VJ5GjkRb51IzMp5nbaPjJXMWeju2MKg== js-base64@^2.1.8, js-base64@^2.1.9: - version "2.5.2" - resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.5.2.tgz#313b6274dda718f714d00b3330bbae6e38e90209" - integrity sha512-Vg8czh0Q7sFBSUMWWArX/miJeBWYBPpdU/3M/DKSaekLMqrqVPaedp+5mZhie/r0lgrcaYBfwXatEew6gwgiQQ== + version "2.6.4" + resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.6.4.tgz#f4e686c5de1ea1f867dbcad3d46d969428df98c4" + integrity sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ== js-tokens@^4.0.0: version "4.0.0" @@ -6486,6 +6675,11 @@ json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" @@ -6646,6 +6840,11 @@ leven@^2.1.0: resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" integrity sha1-wuep93IJTe6dNCAq6KzORoeHVYA= +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + levn@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" @@ -6769,9 +6968,9 @@ loader-utils@^2.0.0: json5 "^2.1.2" localforage@*, localforage@^1.7.3: - version "1.7.4" - resolved "https://registry.yarnpkg.com/localforage/-/localforage-1.7.4.tgz#88b59cc9b25ae54c76bb2c080b21ec832c22d3f6" - integrity sha512-3EmVZatmNVeCo/t6Te7P06h2alGwbq8wXlSkcSXMvDE2/edPmsVqTPlzGnZaqwZZDBs6v+kxWpqjVsqsNJT8jA== + version "1.9.0" + resolved "https://registry.yarnpkg.com/localforage/-/localforage-1.9.0.tgz#f3e4d32a8300b362b4634cc4e066d9d00d2f09d1" + integrity sha512-rR1oyNrKulpe+VM9cYmcFn6tsHuokyVHFaCM3+osEmxaHTbEk8oQu6eGDfS6DQLWi/N67XRmB8ECG37OES368g== dependencies: lie "3.1.1" @@ -6947,7 +7146,7 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash@^4.0.0, lodash@^4.1.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.4, lodash@~4.17.12: +lodash@^4.0.0, lodash@^4.1.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.4, lodash@~4.17.10: version "4.17.20" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== @@ -7175,22 +7374,22 @@ mdast-util-compact@^2.0.0: unist-util-visit "^2.0.0" mdn-browser-compat-data@^1.0.28: - version "1.0.29" - resolved "https://registry.yarnpkg.com/mdn-browser-compat-data/-/mdn-browser-compat-data-1.0.29.tgz#9edddaa953221050c6959a538c993e915e619220" - integrity sha512-R9/8Xi1d9by2Ag5O7Sur3zoe8k/61a+yYeC4f6S5UhbEZb2ICmYNZuprm+2IO9bBcT3Pa2BtEx+xKoX/8v8tPw== + version "1.1.2" + resolved "https://registry.yarnpkg.com/mdn-browser-compat-data/-/mdn-browser-compat-data-1.1.2.tgz#90d2a25ce731b34a14329396887dadfd657ea7b2" + integrity sha512-uBNX2P4iu3PZcXP20rL+n7fxN9PWZLj0y43QMe/1aXzqP3H6HbVOeePS0cBZCtMwcfr2Tugf1OHj+/wLam+dUg== dependencies: extend "3.0.2" +mdn-data@2.0.12: + version "2.0.12" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.12.tgz#bbb658d08b38f574bbb88f7b83703defdcc46844" + integrity sha512-ULbAlgzVb8IqZ0Hsxm6hHSlQl3Jckst2YEQS7fODu9ilNWy2LvcoSY7TRFIktABP2mdppBioc66va90T+NUs8Q== + mdn-data@2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== -mdn-data@2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.6.tgz#852dc60fcaa5daa2e8cf6c9189c440ed3e042978" - integrity sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA== - memoizee@0.4.X: version "0.4.14" resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.4.14.tgz#07a00f204699f9a95c2d9e77218271c7cd610d57" @@ -7275,9 +7474,9 @@ merge-stream@^2.0.0: integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== merge2@^1.2.3, merge2@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.3.0.tgz#5b366ee83b2f1582c48f87e47cf1a9352103ca81" - integrity sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw== + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: version "3.1.10" @@ -7314,11 +7513,16 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -mime-db@1.44.0, mime-db@^1.28.0: +mime-db@1.44.0: version "1.44.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== +mime-db@^1.28.0: + version "1.45.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.45.0.tgz#cceeda21ccd7c3a745eba2decd55d4b73e7879ea" + integrity sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w== + mime-types@^2.1.12, mime-types@^2.1.27, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24: version "2.1.27" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" @@ -7331,15 +7535,20 @@ mime@1.4.1: resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + mimic-response@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== min-indent@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.0.tgz#cfc45c37e9ec0d8f0a0ec3dd4ef7f7c3abe39256" - integrity sha1-z8RcN+nsDY8KDsPdTvf3w6vjklY= + version "1.0.1" + resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" @@ -7375,11 +7584,6 @@ minimist-options@^3.0.1: arrify "^1.0.1" is-plain-obj "^1.1.0" -minimist@1.1.x: - version "1.1.3" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.1.3.tgz#3bedfd91a92d39016fcfaa1c681e8faa1a1efda8" - integrity sha1-O+39kaktOQFvz6ocaB6Pqhoe/ag= - minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" @@ -7467,7 +7671,7 @@ ms@2.0.0: resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= -ms@^2.1.1: +ms@2.1.2, ms@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== @@ -7485,14 +7689,14 @@ mute-stdout@^1.0.0: integrity sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg== nan@^2.12.1, nan@^2.13.2: - version "2.14.1" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.1.tgz#d7be34dfa3105b91494c3147089315eff8874b01" - integrity sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw== + version "2.14.2" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19" + integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ== -nanoid@^3.1.12: - version "3.1.12" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.12.tgz#6f7736c62e8d39421601e4a0c77623a97ea69654" - integrity sha512-1qstj9z5+x491jfiC4Nelk+f8XBad7LN20PmyWINJEMRSf3wcAjAWysw1qaA8z6NSKe2sjq1hRSDpBH5paCb6A== +nanoid@^3.1.16: + version "3.1.16" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.16.tgz#b21f0a7d031196faf75314d7c65d36352beeef64" + integrity sha512-+AK8MN0WHji40lj8AEuwLOvLSbWYApQpre/aFJZD71r43wVRLrOYS4FmJOPQYon1TqB462RzrrxlfA74XRES8w== nanomatch@^1.2.9: version "1.2.13" @@ -7624,15 +7828,15 @@ node-libs-browser@^2.2.1: util "^0.11.0" vm-browserify "^1.0.1" -node-releases@^1.1.61: - version "1.1.61" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.61.tgz#707b0fca9ce4e11783612ba4a2fcba09047af16e" - integrity sha512-DD5vebQLg8jLCOzwupn954fbIiZht05DAZs0k2u8NStSe6h9XdsuIQL8hSRKYiU8WUQRznmSDrKGbv3ObOmC7g== +node-releases@^1.1.65: + version "1.1.65" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.65.tgz#52d9579176bd60f23eba05c4438583f341944b81" + integrity sha512-YpzJOe2WFIW0V4ZkJQd/DGR/zdVwc/pI4Nl1CZrBO19FdRcSTmsuhdttw9rsTzzJLrNcSloLiBbEYx1C4f6gpA== node-sass@^4.8.3: - version "4.14.0" - resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.14.0.tgz#a8e9d7720f8e15b4a1072719dcf04006f5648eeb" - integrity sha512-AxqU+DFpk0lEz95sI6jO0hU0Rwyw7BXVEv6o9OItoXLyeygPeaSpiV4rwQb10JiTghHaa0gZeD21sz+OsQluaw== + version "4.14.1" + resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.14.1.tgz#99c87ec2efb7047ed638fb4c9db7f3a42e2217b5" + integrity sha512-sjCuOlvGyCJS40R8BscF5vhVlQjNN069NtQ1gSxyK1u9iqvn6tf7O1R4GNowVZfiZUCRt5MmMs1xd+4V/7Yr0g== dependencies: async-foreach "^0.1.3" chalk "^1.1.1" @@ -7648,7 +7852,7 @@ node-sass@^4.8.3: node-gyp "^3.8.0" npmlog "^4.0.0" request "^2.88.0" - sass-graph "^2.2.4" + sass-graph "2.2.5" stdout-stream "^1.4.0" "true-case-path" "^1.0.2" @@ -7756,6 +7960,13 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" +npm-run-path@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + "npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" @@ -7812,12 +8023,12 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" -object-inspect@^1.7.0: +object-inspect@^1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0" integrity sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA== -object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: +object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== @@ -7829,15 +8040,15 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" -object.assign@^4.0.4, object.assign@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" - integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== +object.assign@^4.0.4, object.assign@^4.1.0, object.assign@^4.1.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== dependencies: - define-properties "^1.1.2" - function-bind "^1.1.1" - has-symbols "^1.0.0" - object-keys "^1.0.11" + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" object.defaults@^1.0.0, object.defaults@^1.1.0: version "1.1.0" @@ -7904,6 +8115,13 @@ once@^1.3.0, once@^1.3.1, once@^1.3.2, once@^1.4.0: dependencies: wrappy "1" +onetime@^5.1.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + openurl@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/openurl/-/openurl-1.1.1.tgz#3875b4b0ef7a52c156f0db41d4609dbb0f94b387" @@ -8064,6 +8282,11 @@ p-map-series@^1.0.0: dependencies: p-reduce "^1.0.0" +p-map@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" + integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== + p-map@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" @@ -8072,9 +8295,9 @@ p-map@^4.0.0: aggregate-error "^3.0.0" p-pipe@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-pipe/-/p-pipe-3.0.0.tgz#ab1fb87c0b8dd79b3bb03a8a23680fc9d054e132" - integrity sha512-gwwdRFmaxsT3IU+Tl3vYKVRdjfhg8Bbdjw7B+E0y6F7Yz6l+eaQLn0BRmGMXIhcPDONPtOkMoNwx1etZh4zPJA== + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-pipe/-/p-pipe-3.1.0.tgz#48b57c922aa2e1af6a6404cb7c6bf0eb9cc8e60e" + integrity sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw== p-reduce@^1.0.0: version "1.0.0" @@ -8148,14 +8371,13 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" -parse-asn1@^5.0.0: - version "5.1.5" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.5.tgz#003271343da58dc94cace494faef3d2147ecea0e" - integrity sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ== +parse-asn1@^5.0.0, parse-asn1@^5.1.5: + version "5.1.6" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" + integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== dependencies: - asn1.js "^4.0.0" + asn1.js "^5.2.0" browserify-aes "^1.0.0" - create-hash "^1.1.0" evp_bytestokey "^1.0.0" pbkdf2 "^3.0.3" safe-buffer "^5.1.1" @@ -8209,13 +8431,13 @@ parse-json@^4.0.0: json-parse-better-errors "^1.0.1" parse-json@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.0.0.tgz#73e5114c986d143efa3712d4ea24db9a4266f60f" - integrity sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw== + version "5.1.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.1.0.tgz#f96088cdf24a8faa9aea9a009f2d9d942c999646" + integrity sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ== dependencies: "@babel/code-frame" "^7.0.0" error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" + json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" parse-node-version@^1.0.0: @@ -8235,6 +8457,11 @@ parseqs@0.0.5: dependencies: better-assert "~1.0.0" +parseqs@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.6.tgz#8e4bb5a19d1cdc844a08ac974d34e273afa670d5" + integrity sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w== + parseuri@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a" @@ -8242,6 +8469,11 @@ parseuri@0.0.5: dependencies: better-assert "~1.0.0" +parseuri@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.6.tgz#e1496e829e3ac2ff47f39a4dd044b32823c4a25a" + integrity sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow== + parseurl@~1.3.2: version "1.3.3" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" @@ -8292,12 +8524,17 @@ path-is-absolute@^1.0.0: resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= +path-is-inside@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + path-key@^2.0.0, path-key@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= -path-key@^3.1.0: +path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== @@ -8360,9 +8597,9 @@ path-webpack@0.0.3: integrity sha1-/23sdJ7sWpRgXATV9j/FVgegOhY= pbkdf2@^3.0.3: - version "3.0.17" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" - integrity sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA== + version "3.1.1" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.1.tgz#cb8724b0fada984596856d1a6ebafd3584654b94" + integrity sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg== dependencies: create-hash "^1.1.2" create-hmac "^1.1.4" @@ -8484,9 +8721,9 @@ postcss-attribute-case-insensitive@^4.0.1: postcss-selector-parser "^6.0.2" postcss-calc@^7.0.1: - version "7.0.2" - resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.2.tgz#504efcd008ca0273120568b0792b16cdcde8aac1" - integrity sha512-rofZFHUg6ZIrvRwPeFktv06GdbDYLcGqh9EwiMutZg+a0oePCCw1zHOEiji6LCpyRcjTREtPASuUqeAvYlEVvQ== + version "7.0.5" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.5.tgz#f8a6e99f12e619c2ebc23cf6c486fdc15860933e" + integrity sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg== dependencies: postcss "^7.0.27" postcss-selector-parser "^6.0.2" @@ -8643,9 +8880,9 @@ postcss-focus-within@^3.0.0: postcss "^7.0.2" postcss-font-variant@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-4.0.0.tgz#71dd3c6c10a0d846c5eda07803439617bbbabacc" - integrity sha512-M8BFYKOvCrI2aITzDad7kWuXXTm0YhGdP9Q8HanmN4EF1Hmcgs1KK5rSHylt/lUJe8yLxiSwWAHdScoEiIxztg== + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-4.0.1.tgz#42d4c0ab30894f60f98b17561eb5c0321f502641" + integrity sha512-I3ADQSTNtLTTd8uxZhtSOrTCQ9G4qUVKPjHiDk0bV75QSxXjVWiJVJ2VLdspGUi9fbW9BcjKJoRvxAH1pckqmA== dependencies: postcss "^7.0.2" @@ -8703,9 +8940,9 @@ postcss-less@^3.1.0, postcss-less@^3.1.4: postcss "^7.0.14" postcss-load-config@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.1.0.tgz#c84d692b7bb7b41ddced94ee62e8ab31b417b003" - integrity sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q== + version "2.1.2" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.1.2.tgz#c5ea504f2c4aef33c7359a34de3573772ad7502a" + integrity sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw== dependencies: cosmiconfig "^5.0.0" import-cwd "^2.0.0" @@ -9132,16 +9369,7 @@ postcss-selector-parser@^5.0.0-rc.3, postcss-selector-parser@^5.0.0-rc.4: indexes-of "^1.0.1" uniq "^1.0.1" -postcss-selector-parser@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz#934cf799d016c83411859e09dcecade01286ec5c" - integrity sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg== - dependencies: - cssesc "^3.0.0" - indexes-of "^1.0.1" - uniq "^1.0.1" - -postcss-selector-parser@^6.0.4: +postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: version "6.0.4" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz#56075a1380a04604c38b063ea7767a129af5c2b3" integrity sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw== @@ -9221,22 +9449,22 @@ postcss@^5.0.0, postcss@^5.0.18: supports-color "^3.2.3" postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.13, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.21, postcss@^7.0.26, postcss@^7.0.27, postcss@^7.0.31, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6, postcss@^7.0.7: - version "7.0.32" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.32.tgz#4310d6ee347053da3433db2be492883d62cec59d" - integrity sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw== + version "7.0.35" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.35.tgz#d2be00b998f7f211d8a276974079f2e92b970e24" + integrity sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg== dependencies: chalk "^2.4.2" source-map "^0.6.1" supports-color "^6.1.0" -postcss@^8.1.1: - version "8.1.2" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.1.2.tgz#9731fcaa4f7b0bef47121821bdae9eeb609a324c" - integrity sha512-mToqEVFq8jF9TFhlIK4HhE34zknFJuNTgqtsr60vUvrWn+9TIYugCwiV1JZRxCuOrej2jjstun1bn4Bc7/1HkA== +postcss@^8.1.4: + version "8.1.6" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.1.6.tgz#b022ba2cfb8701da234d073ed3128c5a384c35ff" + integrity sha512-JuifSl4h8dJ70SiMXKjzCxhalE6p2TnMHuq9G8ftyXj2jg6SXzqCsEuxMj9RkmJoO5D+Z9YrWunNkxqpRT02qg== dependencies: colorette "^1.2.1" line-column "^1.0.2" - nanoid "^3.1.12" + nanoid "^3.1.16" source-map "^0.6.1" prelude-ls@^1.2.1: @@ -9255,17 +9483,17 @@ prepend-http@^2.0.0: integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= pretty-bytes@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.3.0.tgz#f2849e27db79fb4d6cfe24764fc4134f165989f2" - integrity sha512-hjGrh+P926p4R4WbaB6OckyRtO0F0/lQBiT+0gnxjV+5kjPBrfVBFCsCLbMqVQeydvIoouYTCmmEURiH3R1Bdg== + version "5.4.1" + resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.4.1.tgz#cd89f79bbcef21e3d21eb0da68ffe93f803e884b" + integrity sha512-s1Iam6Gwz3JI5Hweaz4GoCD1WUNUIyzePFy5+Js2hjwGVt2Z79wNN+ZKOZ2vB6C+Xs6njyB84Z1IthQg8d9LxA== pretty-error@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.1.tgz#5f4f87c8f91e5ae3f3ba87ab4cf5e03b1a17f1a3" - integrity sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM= + version "2.1.2" + resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.2.tgz#be89f82d81b1c86ec8fdfbc385045882727f93b6" + integrity sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw== dependencies: - renderkid "^2.0.1" - utila "~0.4" + lodash "^4.17.20" + renderkid "^2.0.4" pretty-hrtime@^1.0.0: version "1.0.3" @@ -9389,9 +9617,9 @@ query-string@^5.0.1: strict-uri-encode "^1.0.0" query-string@^6.13.6: - version "6.13.6" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.13.6.tgz#e5ac7c74f2a5da43fbca0b883b4f0bafba439966" - integrity sha512-/WWZ7d9na6s2wMEGdVCVgKWE9Rt7nYyNIf7k8xmHXcesPMlEzicWo3lbYwHyA4wBktI2KrXxxZeACLbE84hvSQ== + version "6.13.7" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.13.7.tgz#af53802ff6ed56f3345f92d40a056f93681026ee" + integrity sha512-CsGs8ZYb39zu0WLkeOhe0NMePqgYdAuCqxOYKDR5LVCytDZYMGx3Bb+xypvQvPHVPijRXB0HZNFllCzHRe4gEA== dependencies: decode-uri-component "^0.2.0" split-on-first "^1.0.0" @@ -9565,10 +9793,10 @@ readdirp@^2.2.1: micromatch "^3.1.10" readable-stream "^2.0.2" -readdirp@~3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.4.0.tgz#9fdccdf9e9155805449221ac645e8303ab5b9ada" - integrity sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ== +readdirp@~3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" + integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== dependencies: picomatch "^2.2.1" @@ -9579,6 +9807,13 @@ rechoir@^0.6.2: dependencies: resolve "^1.1.6" +rechoir@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.0.tgz#32650fd52c21ab252aa5d65b19310441c7e03aca" + integrity sha512-ADsDEH2bvbjltXEP+hTIAmeFekTFK0V2BTxMkok6qILyAJEXV0AFfoWcAq4yfll5VdIMd/RVXq0lR+wQi5ZU3Q== + dependencies: + resolve "^1.9.0" + redent@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" @@ -9603,6 +9838,11 @@ redent@^3.0.0: indent-string "^4.0.0" strip-indent "^3.0.0" +reduce-flatten@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/reduce-flatten/-/reduce-flatten-2.0.0.tgz#734fd84e65f375d7ca4465c69798c25c9d10ae27" + integrity sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w== + regenerate-unicode-properties@^8.2.0: version "8.2.0" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" @@ -9611,14 +9851,14 @@ regenerate-unicode-properties@^8.2.0: regenerate "^1.4.0" regenerate@^1.4.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.1.tgz#cad92ad8e6b591773485fbe05a485caf4f457e6f" - integrity sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A== + version "1.4.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== regenerator-runtime@^0.13.4: - version "0.13.5" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697" - integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA== + version "0.13.7" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" + integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== regenerator-transform@^0.14.2: version "0.14.5" @@ -9691,9 +9931,9 @@ remark-parse@^6.0.0: xtend "^4.0.1" remark-parse@^8.0.0: - version "8.0.2" - resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-8.0.2.tgz#5999bc0b9c2e3edc038800a64ff103d0890b318b" - integrity sha512-eMI6kMRjsAGpMXXBAywJwiwAse+KNpmt+BK55Oofy4KvBZEqUDj6mWbGLJZrujoPIPPxDXzn3T9baRlpsm2jnQ== + version "8.0.3" + resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-8.0.3.tgz#9c62aa3b35b79a486454c690472906075f40c7e1" + integrity sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q== dependencies: ccount "^1.0.0" collapse-white-space "^1.0.2" @@ -9733,9 +9973,9 @@ remark-stringify@^6.0.0: xtend "^4.0.1" remark-stringify@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-8.0.0.tgz#33423ab8bf3076fb197f4cf582aaaf866b531625" - integrity sha512-cABVYVloFH+2ZI5bdqzoOmemcz/ZuhQSH6W6ZNYnLojAUUn3xtX7u+6BpnYp35qHoGr2NFBsERV14t4vCIeW8w== + version "8.1.1" + resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-8.1.1.tgz#e2a9dc7a7bf44e46a155ec78996db896780d8ce5" + integrity sha512-q4EyPZT3PcA3Eq7vPpT6bIdokXzFGp9i85igjmhRyXWmPs0Y6/d2FYwUNotKAWyLch7g0ASZJn/KHHcHZQ163A== dependencies: ccount "^1.0.0" is-alphanumeric "^1.0.0" @@ -9762,9 +10002,9 @@ remark@^10.0.1: unified "^7.0.0" remark@^12.0.0: - version "12.0.0" - resolved "https://registry.yarnpkg.com/remark/-/remark-12.0.0.tgz#d1c145c07341c9232f93b2f8539d56da15a2548c" - integrity sha512-oX4lMIS0csgk8AEbzY0h2jdR0ngiCHOpwwpxjmRa5TqAkeknY+tkhjRJGZqnCmvyuWh55/0SW5WY3R3nn3PH9A== + version "12.0.1" + resolved "https://registry.yarnpkg.com/remark/-/remark-12.0.1.tgz#f1ddf68db7be71ca2bad0a33cd3678b86b9c709f" + integrity sha512-gS7HDonkdIaHmmP/+shCPejCEEW+liMp/t/QwmF0Xt47Rpuhl32lLtDV1uKWvGoq+kxr5jSgg5oAIpGuyULjUw== dependencies: remark-parse "^8.0.0" remark-stringify "^8.0.0" @@ -9792,16 +10032,16 @@ remove-trailing-separator@^1.0.1, remove-trailing-separator@^1.1.0: resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= -renderkid@^2.0.1: - version "2.0.3" - resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.3.tgz#380179c2ff5ae1365c522bf2fcfcff01c5b74149" - integrity sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA== +renderkid@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.4.tgz#d325e532afb28d3f8796ffee306be8ffd6fc864c" + integrity sha512-K2eXrSOJdq+HuKzlcjOlGoOarUu5SDguDEhE7+Ah4zuOWL40j8A/oHvLlLob9PSTNvVnBd+/q0Er1QfpEuem5g== dependencies: css-select "^1.1.0" dom-converter "^0.2" htmlparser2 "^3.3.0" + lodash "^4.17.20" strip-ansi "^3.0.0" - utila "^0.4.0" repeat-element@^1.1.2: version "1.1.3" @@ -9895,6 +10135,13 @@ resize-observer-polyfill@^1.5.1: resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg== +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + resolve-dir@^1.0.0, resolve-dir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" @@ -9930,11 +10177,12 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.13.1, resolve@^1.17.0, resolve@^1.3.2, resolve@^1.4.0: - version "1.17.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" - integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== +resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.13.1, resolve@^1.17.0, resolve@^1.3.2, resolve@^1.4.0, resolve@^1.9.0: + version "1.18.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.18.1.tgz#018fcb2c5b207d2a6424aee361c5a266da8f4130" + integrity sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA== dependencies: + is-core-module "^2.0.0" path-parse "^1.0.6" resp-modifier@6.0.2: @@ -10002,9 +10250,9 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: inherits "^2.0.1" run-parallel@^1.1.9: - version "1.1.9" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679" - integrity sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q== + version "1.1.10" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.10.tgz#60a51b2ae836636c81377df16cb107351bcd13ef" + integrity sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw== run-queue@^1.0.0, run-queue@^1.0.3: version "1.0.3" @@ -10057,21 +10305,19 @@ sass-graph@2.2.5: scss-tokenizer "^0.2.3" yargs "^13.3.2" -sass-graph@^2.2.4: - version "2.2.6" - resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.6.tgz#09fda0e4287480e3e4967b72a2d133ba09b8d827" - integrity sha512-MKuEYXFSGuRSi8FZ3A7imN1CeVn9Gpw0/SFJKdL1ejXJneI9a5rwlEZrKejhEFAA3O6yr3eIyl/WuvASvlT36g== - dependencies: - glob "^7.0.0" - lodash "^4.0.0" - scss-tokenizer "^0.2.3" - yargs "^7.0.0" - sax@~1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== +schema-utils@^0.4.5: + version "0.4.7" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.7.tgz#ba74f597d2be2ea880131746ee17d0a093c68187" + integrity sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ== + dependencies: + ajv "^6.1.0" + ajv-keywords "^3.1.0" + schema-utils@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" @@ -10113,11 +10359,11 @@ scss-tokenizer@^0.2.3: source-map "^0.4.2" seek-bzip@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/seek-bzip/-/seek-bzip-1.0.5.tgz#cfe917cb3d274bcffac792758af53173eb1fabdc" - integrity sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w= + version "1.0.6" + resolved "https://registry.yarnpkg.com/seek-bzip/-/seek-bzip-1.0.6.tgz#35c4171f55a680916b52a07859ecf3b5857f21c4" + integrity sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ== dependencies: - commander "~2.8.1" + commander "^2.8.1" semver-greatest-satisfied-range@^1.1.0: version "1.1.0" @@ -10182,10 +10428,12 @@ send@0.16.2: range-parser "~1.2.0" statuses "~1.4.0" -serialize-javascript@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-2.1.2.tgz#ecec53b0e0317bdc95ef76ab7074b7384785fa61" - integrity sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ== +serialize-javascript@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" + integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== + dependencies: + randombytes "^2.1.0" serialize-javascript@^5.0.1: version "5.0.1" @@ -10397,22 +10645,19 @@ socket.io-client@2.1.1: to-array "0.1.4" socket.io-client@^2.0.4: - version "2.3.0" - resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.3.0.tgz#14d5ba2e00b9bcd145ae443ab96b3f86cbcc1bb4" - integrity sha512-cEQQf24gET3rfhxZ2jJ5xzAOo/xhZwK+mOqtGRg5IowZsMgwvHwnf/mCRapAAkadhM26y+iydgwsXGObBB5ZdA== + version "2.3.1" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.3.1.tgz#91a4038ef4d03c19967bb3c646fec6e0eaa78cff" + integrity sha512-YXmXn3pA8abPOY//JtYxou95Ihvzmg8U6kQyolArkIyLd0pgVhrfor/iMsox8cn07WCOOvvuJ6XKegzIucPutQ== dependencies: backo2 "1.0.2" - base64-arraybuffer "0.1.5" component-bind "1.0.0" - component-emitter "1.2.1" - debug "~4.1.0" + component-emitter "~1.3.0" + debug "~3.1.0" engine.io-client "~3.4.0" has-binary2 "~1.0.2" - has-cors "1.1.0" indexof "0.0.1" - object-component "0.0.3" - parseqs "0.0.5" - parseuri "0.0.5" + parseqs "0.0.6" + parseuri "0.0.6" socket.io-parser "~3.3.0" to-array "0.1.4" @@ -10426,11 +10671,11 @@ socket.io-parser@~3.2.0: isarray "2.0.1" socket.io-parser@~3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.3.0.tgz#2b52a96a509fdf31440ba40fed6094c7d4f1262f" - integrity sha512-hczmV6bDgdaEbVqhAeVMM/jfUfzuEZHsQg6eOmLgJht6G3mPKMxYm75w2+qhAQZ+4X+1+ATZ+QFKeOZD5riHng== + version "3.3.1" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.3.1.tgz#f07d9c8cb3fb92633aa93e76d98fd3a334623199" + integrity sha512-1QLvVAe8dTz+mKmZ07Swxt+LAo4Y1ff50rlyoEx00TQmDFVQYPfcqGvIDJLGaBdhdNCecXtyKpD+EgKGcmmbuQ== dependencies: - component-emitter "1.2.1" + component-emitter "~1.3.0" debug "~3.1.0" isarray "2.0.1" @@ -10518,7 +10763,7 @@ source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -source-map@~0.7.2: +source-map@^0.7.3, source-map@~0.7.2: version "0.7.3" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== @@ -10550,9 +10795,9 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.5" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" - integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== + version "3.0.6" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz#c80757383c28abf7296744998cbc106ae8b854ce" + integrity sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw== specificity@^0.4.1: version "0.4.1" @@ -10767,39 +11012,21 @@ string-width@^4.1.0, string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" -string.prototype.trimend@^1.0.0, string.prototype.trimend@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" - integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g== +string.prototype.trimend@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.2.tgz#6ddd9a8796bc714b489a3ae22246a208f37bfa46" + integrity sha512-8oAG/hi14Z4nOVP0z6mdiVZ/wqjDtWSLygMigTzAb+7aPEDTleeFf+WrF+alzecxIRkckkJVn+dTlwzJXORATw== dependencies: define-properties "^1.1.3" - es-abstract "^1.17.5" + es-abstract "^1.18.0-next.1" -string.prototype.trimleft@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz#4408aa2e5d6ddd0c9a80739b087fbc067c03b3cc" - integrity sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw== +string.prototype.trimstart@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.2.tgz#22d45da81015309cd0cdd79787e8919fc5c613e7" + integrity sha512-7F6CdBTl5zyu30BJFdzSTlSlLPwODC23Od+iLoVH8X6+3fvDPPuBVVj9iaB1GOsSTSIgVfsfm27R2FGrAPznWg== dependencies: define-properties "^1.1.3" - es-abstract "^1.17.5" - string.prototype.trimstart "^1.0.0" - -string.prototype.trimright@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz#c76f1cef30f21bbad8afeb8db1511496cfb0f2a3" - integrity sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.5" - string.prototype.trimend "^1.0.0" - -string.prototype.trimstart@^1.0.0, string.prototype.trimstart@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54" - integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.5" + es-abstract "^1.18.0-next.1" string_decoder@^1.0.0, string_decoder@^1.1.1: version "1.3.0" @@ -10831,15 +11058,13 @@ stringify-entities@^1.0.1: is-hexadecimal "^1.0.0" stringify-entities@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-3.0.0.tgz#455abe501f8b7859ba5726a25a8872333c65b0a7" - integrity sha512-h7NJJIssprqlyjHT2eQt2W1F+MCcNmwPGlKb0bWEdET/3N44QN3QbUF/ueKCgAssyKRZ3Br9rQ7FcXjHr0qLHw== + version "3.1.0" + resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-3.1.0.tgz#b8d3feac256d9ffcc9fa1fefdcf3ca70576ee903" + integrity sha512-3FP+jGMmMV/ffZs86MoghGqAoqXAdxLrJP4GUdrDN1aIScYih5tuIO3eF4To5AJZ79KDZ8Fpdy7QJnK8SsL1Vg== dependencies: character-entities-html4 "^1.0.0" character-entities-legacy "^1.0.0" - is-alphanumerical "^1.0.0" - is-decimal "^1.0.2" - is-hexadecimal "^1.0.0" + xtend "^4.0.0" strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" @@ -10898,6 +11123,11 @@ strip-eof@^1.0.0: resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + strip-indent@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" @@ -11194,6 +11424,16 @@ symbol-observable@1.0.1: resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4" integrity sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ= +table-layout@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/table-layout/-/table-layout-1.0.1.tgz#8411181ee951278ad0638aea2f779a9ce42894f9" + integrity sha512-dEquqYNJiGwY7iPfZ3wbXDI944iqanTSchrACLL2nOB+1r+h1Nzu2eH+DuPPvWvm5Ry7iAPeFlgEtP5bIp5U7Q== + dependencies: + array-back "^4.0.1" + deep-extend "~0.6.0" + typical "^5.2.0" + wordwrapjs "^4.0.0" + table@^5.0.0, table@^5.2.3: version "5.4.6" resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" @@ -11205,9 +11445,9 @@ table@^5.0.0, table@^5.2.3: string-width "^3.0.0" table@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/table/-/table-6.0.1.tgz#334fd5d74590251f6893f1296c29d533bbac1b32" - integrity sha512-fmr6168splcy/3XIvhSm5w6hYYOqyr3plAsd7OqoerzyoMnIpoxYuwrpdO2Cm22dh6KCnvirvigPrFZp+tdWFA== + version "6.0.3" + resolved "https://registry.yarnpkg.com/table/-/table-6.0.3.tgz#e5b8a834e37e27ad06de2e0fda42b55cfd8a0123" + integrity sha512-8321ZMcf1B9HvVX/btKv8mMZahCjn2aYrDlpqHaBFCfnox64edeH9kEid0vTLTRR8gWR2A20aDgeuTTea4sVtw== dependencies: ajv "^6.12.4" lodash "^4.17.20" @@ -11282,15 +11522,15 @@ ternary-stream@^3.0.0: through2 "^3.0.1" terser-webpack-plugin@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz#5ecaf2dbdc5fb99745fd06791f46fc9ddb1c9a7c" - integrity sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA== + version "1.4.5" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz#a217aefaea330e734ffacb6120ec1fa312d6040b" + integrity sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw== dependencies: cacache "^12.0.2" find-cache-dir "^2.1.0" is-wsl "^1.1.0" schema-utils "^1.0.0" - serialize-javascript "^2.1.2" + serialize-javascript "^4.0.0" source-map "^0.6.1" terser "^4.1.2" webpack-sources "^1.4.0" @@ -11363,10 +11603,11 @@ through2@2.X, through2@^2.0.0, through2@^2.0.3, through2@~2.0.0: xtend "~4.0.1" through2@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.1.tgz#39276e713c3302edf9e388dd9c812dd3b825bd5a" - integrity sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww== + version "3.0.2" + resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.2.tgz#99f88931cfc761ec7678b41d5d7336b5b6a07bf4" + integrity sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ== dependencies: + inherits "^2.0.4" readable-stream "2 || 3" through2@^4.0.2: @@ -11392,9 +11633,9 @@ timed-out@^4.0.0, timed-out@^4.0.1: integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= timers-browserify@^2.0.4: - version "2.0.11" - resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.11.tgz#800b1f3eee272e5bc53ee465a04d0e804c31211f" - integrity sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ== + version "2.0.12" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" + integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ== dependencies: setimmediate "^1.0.4" @@ -11514,9 +11755,9 @@ trim-repeated@^1.0.0: escape-string-regexp "^1.0.2" trim-trailing-lines@^1.0.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-1.1.3.tgz#7f0739881ff76657b7776e10874128004b625a94" - integrity sha512-4ku0mmjXifQcTVfYDfR5lpgV7zVqPg6zV9rdZmwOPqq0+Zq19xDqEgagqVbc4pOOShbncuAOIs59R3+3gcF3ZA== + version "1.1.4" + resolved "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz#bd4abbec7cc880462f10b2c8b5ce1d8d1ec7c2c0" + integrity sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ== trim@0.0.1: version "0.0.1" @@ -11545,15 +11786,10 @@ tsconfig-paths@^3.9.0: minimist "^1.2.0" strip-bom "^3.0.0" -tslib@^1.10.0: - version "1.11.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35" - integrity sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA== - -tslib@^1.9.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" - integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== +tslib@^1.10.0, tslib@^1.9.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== tty-browserify@0.0.0: version "0.0.0" @@ -11600,9 +11836,9 @@ type@^1.0.1: integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== type@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/type/-/type-2.0.0.tgz#5f16ff6ef2eb44f260494dae271033b29c09a9c3" - integrity sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow== + version "2.1.0" + resolved "https://registry.yarnpkg.com/type/-/type-2.1.0.tgz#9bdc22c648cf8cf86dd23d32336a41cfb6475e3f" + integrity sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA== typedarray-to-buffer@^3.1.5: version "3.1.5" @@ -11616,10 +11852,23 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= +typical@^5.0.0, typical@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/typical/-/typical-5.2.0.tgz#4daaac4f2b5315460804f0acf6cb69c52bb93066" + integrity sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg== + ua-parser-js@^0.7.18: - version "0.7.21" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.21.tgz#853cf9ce93f642f67174273cc34565ae6f308777" - integrity sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ== + version "0.7.22" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.22.tgz#960df60a5f911ea8f1c818f3747b99c6e177eae3" + integrity sha512-YUxzMjJ5T71w6a8WWVcMGM6YWOTX27rCoIQgLXiWaxqXSx9D7DNjiGWn1aJIRSQ5qr0xuhra77bSIh6voR/46Q== + +uglify-es@^3.3.9: + version "3.3.9" + resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677" + integrity sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ== + dependencies: + commander "~2.13.0" + source-map "~0.6.1" uglify-js@3.4.x: version "3.4.10" @@ -11635,9 +11884,9 @@ ultron@~1.1.0: integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og== unbzip2-stream@^1.0.9: - version "1.4.2" - resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.4.2.tgz#84eb9e783b186d8fb397515fbb656f312f1a7dbf" - integrity sha512-pZMVAofMrrHX6Ik39hCk470kulCbmZ2SWfQLPmTWqfJV/oUm0gn1CblvHdUu4+54Je6Jq34x8kY6XjTy6dMkOg== + version "1.4.3" + resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz#b0da04c4371311df771cdc215e87f2130991ace7" + integrity sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg== dependencies: buffer "^5.2.1" through "^2.3.8" @@ -11653,15 +11902,16 @@ undertaker-registry@^1.0.0: integrity sha1-XkvaMI5KiirlhPm5pDWaSZglzFA= undertaker@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/undertaker/-/undertaker-1.2.1.tgz#701662ff8ce358715324dfd492a4f036055dfe4b" - integrity sha512-71WxIzDkgYk9ZS+spIB8iZXchFhAdEo2YU8xYqBYJ39DIUIqziK78ftm26eecoIY49X0J2MLhG4hr18Yp6/CMA== + version "1.3.0" + resolved "https://registry.yarnpkg.com/undertaker/-/undertaker-1.3.0.tgz#363a6e541f27954d5791d6fa3c1d321666f86d18" + integrity sha512-/RXwi5m/Mu3H6IHQGww3GNt1PNXlbeCuclF2QYR14L/2CHPz3DFZkvB5hZ0N/QUkiXWCACML2jXViIQEQc2MLg== dependencies: 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" + fast-levenshtein "^1.0.0" last-run "^1.1.0" object.defaults "^1.0.0" object.reduce "^1.0.0" @@ -11713,9 +11963,9 @@ unified@^7.0.0: x-is-string "^0.1.0" unified@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/unified/-/unified-9.0.0.tgz#12b099f97ee8b36792dbad13d278ee2f696eed1d" - integrity sha512-ssFo33gljU3PdlWLjNp15Inqb77d6JnJSfyplGJPT/a+fNRNyCBeveBAYJdO5khKdF6WVHa/yYCC7Xl6BDwZUQ== + version "9.2.0" + resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.0.tgz#67a62c627c40589edebbf60f53edfd4d822027f8" + integrity sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg== dependencies: bail "^1.0.0" extend "^3.0.0" @@ -11782,9 +12032,9 @@ unist-util-find-all-after@^1.0.2: unist-util-is "^3.0.0" unist-util-find-all-after@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/unist-util-find-all-after/-/unist-util-find-all-after-3.0.1.tgz#95cc62f48812d879b4685a0512bf1b838da50e9a" - integrity sha512-0GICgc++sRJesLwEYDjFVJPJttBpVQaTNgc6Jw0Jhzvfs+jtKePEMu+uD+PqkRUrAvGQqwhpDwLGWo1PK8PDEw== + version "3.0.2" + resolved "https://registry.yarnpkg.com/unist-util-find-all-after/-/unist-util-find-all-after-3.0.2.tgz#fdfecd14c5b7aea5e9ef38d5e0d5f774eeb561f6" + integrity sha512-xaTC/AGZ0rIM2gM28YVRAFPIZpzbpDtU3dRmp7EXlNVA8ziQc4hY3H7BHXM1J49nEmiqc3svnqMReW+PGqbZKQ== dependencies: unist-util-is "^4.0.0" @@ -11794,9 +12044,9 @@ unist-util-is@^3.0.0: integrity sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A== unist-util-is@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.0.2.tgz#c7d1341188aa9ce5b3cff538958de9895f14a5de" - integrity sha512-Ofx8uf6haexJwI1gxWMGg6I/dLnF2yE+KibhD3/diOqY2TinLcqHXCV6OI5gFVn3xQqDH+u0M625pfKwIwgBKQ== + version "4.0.3" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.0.3.tgz#e8b44db55fc20c43752b3346c116344d45d7c91d" + integrity sha512-bTofCFVx0iQM8Jqb1TBDVRIQW03YkD3p66JOd/aCWuqzlLyUtx1ZAGw/u+Zw+SttKvSVcvTiKYbfrtLoLefykw== unist-util-remove-position@^1.0.0: version "1.1.4" @@ -11832,9 +12082,9 @@ unist-util-visit-parents@^2.0.0: unist-util-is "^3.0.0" unist-util-visit-parents@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.0.2.tgz#d4076af3011739c71d2ce99d05de37d545f4351d" - integrity sha512-yJEfuZtzFpQmg1OSCyS9M5NJRrln/9FbYosH3iW0MG402QbdbaB8ZESwUv9RO6nRfLAKvWcMxCwdLWOov36x/g== + version "3.1.1" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz#65a6ce698f78a6b0f56aa0e88f13801886cdaef6" + integrity sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg== dependencies: "@types/unist" "^2.0.0" unist-util-is "^4.0.0" @@ -11847,9 +12097,9 @@ unist-util-visit@^1.1.0: unist-util-visit-parents "^2.0.0" unist-util-visit@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.2.tgz#3843782a517de3d2357b4c193b24af2d9366afb7" - integrity sha512-HoHNhGnKj6y+Sq+7ASo2zpVdfdRifhTgX2KTU3B/sO/TTlZchp7E3S4vjRzDJ7L60KmrCPsQkVK3lEF3cz36XQ== + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.3.tgz#c3703893146df47203bb8a9795af47d7b971208c" + integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q== dependencies: "@types/unist" "^2.0.0" unist-util-is "^4.0.0" @@ -11878,7 +12128,7 @@ unset-value@^1.0.0: has-value "^0.3.1" isobject "^3.0.0" -upath@^1.1.1: +upath@^1.1.0, upath@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== @@ -11889,9 +12139,9 @@ upper-case@^1.1.1: integrity sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg= uri-js@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" - integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + version "4.4.0" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.0.tgz#aa714261de793e8a82347a7bcc9ce74e86f28602" + integrity sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g== dependencies: punycode "^2.1.0" @@ -11920,9 +12170,9 @@ url-to-options@^1.0.1: integrity sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k= url-toolkit@^2.1.6: - version "2.1.6" - resolved "https://registry.yarnpkg.com/url-toolkit/-/url-toolkit-2.1.6.tgz#6d03246499e519aad224c44044a4ae20544154f2" - integrity sha512-UaZ2+50am4HwrV2crR/JAf63Q4VvPYphe63WGeoJxeu8gmOm0qxPt+KsukfakPNrX9aymGNEkkaoICwn+OuvBw== + version "2.2.1" + resolved "https://registry.yarnpkg.com/url-toolkit/-/url-toolkit-2.2.1.tgz#89009ed3d62a3574de079532a7266c14d2cc1c4f" + integrity sha512-8+DzgrtDZYZGhHaAop5WGVghMdCfOLGbhcArsJD0qDll71FXa7EeKxi2hilPIscn2nwMz4PRjML32Sz4JTN0Xw== url@^0.11.0: version "0.11.0" @@ -11974,7 +12224,7 @@ util@^0.11.0: dependencies: inherits "2.0.3" -utila@^0.4.0, utila@~0.4: +utila@~0.4: version "0.4.0" resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw= @@ -11989,10 +12239,10 @@ uuid@^3.0.1, uuid@^3.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== -v8-compile-cache@^2.0.3, v8-compile-cache@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz#54bc3cdd43317bca91e35dcaf305b1a7237de745" - integrity sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ== +v8-compile-cache@^2.0.3, v8-compile-cache@^2.1.1, v8-compile-cache@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz#9471efa3ef9128d2f7c6a7ca39c4dd6b5055b132" + integrity sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q== v8flags@^3.2.0: version "3.2.0" @@ -12034,14 +12284,14 @@ vfile-location@^2.0.0: integrity sha512-sSFdyCP3G6Ka0CEmN83A2YCMKIieHx0EDaj5IDP4g1pa5ZJ4FJDvpO0WODLxo4LUX4oe52gmSCK7Jw4SBghqxA== vfile-location@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-3.0.1.tgz#d78677c3546de0f7cd977544c367266764d31bb3" - integrity sha512-yYBO06eeN/Ki6Kh1QAkgzYpWT1d3Qln+ZCtSbJqFExPl1S3y2qqotJQXoh6qEvl/jDlgpUJolBn3PItVnnZRqQ== + version "3.2.0" + resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-3.2.0.tgz#d8e41fbcbd406063669ebf6c33d56ae8721d0f3c" + integrity sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA== -vfile-message@*: - version "2.0.3" - resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.3.tgz#0dd4f6879fb240a8099b22bd3755536c92e59ba5" - integrity sha512-qQg/2z8qnnBHL0psXyF72kCjb9YioIynvyltuNKFaUhRtqTIcIMP3xnBaPzirVZNuBrUe1qwFciSx2yApa4byw== +vfile-message@*, vfile-message@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a" + integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ== dependencies: "@types/unist" "^2.0.0" unist-util-stringify-position "^2.0.0" @@ -12053,14 +12303,6 @@ vfile-message@^1.0.0: dependencies: unist-util-stringify-position "^1.1.1" -vfile-message@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a" - integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ== - dependencies: - "@types/unist" "^2.0.0" - unist-util-stringify-position "^2.0.0" - vfile@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/vfile/-/vfile-3.0.1.tgz#47331d2abe3282424f4a4bb6acd20a44c4121803" @@ -12072,9 +12314,9 @@ vfile@^3.0.0: vfile-message "^1.0.0" vfile@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.1.0.tgz#d79248957f43225d57ff67a56effc67bef08946e" - integrity sha512-BaTPalregj++64xbGK6uIlsurN3BCRNM/P2Pg8HezlGzKd1O9PrwIac6bd9Pdx2uTb0QHoioZ+rXKolbVXEgJg== + version "4.2.0" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.2.0.tgz#26c78ac92eb70816b01d4565e003b7e65a2a0e01" + integrity sha512-a/alcwCvtuc8OX92rqqo7PflxiCgXRFjdyoGVuYV+qbgCb0GgZJRvIgCD4+U/Kl1yhaRsaTwksF88xbPyGsgpw== dependencies: "@types/unist" "^2.0.0" is-buffer "^2.0.0" @@ -12135,9 +12377,9 @@ vinyl@^0.5.0: replace-ext "0.0.1" vinyl@^2.0.0, vinyl@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.2.0.tgz#d85b07da96e458d25b2ffe19fece9f2caa13ed86" - integrity sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg== + version "2.2.1" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.2.1.tgz#23cfb8bbab5ece3803aa2c0a1eb28af7cbba1974" + integrity sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw== dependencies: clone "^2.1.1" clone-buffer "^1.0.0" @@ -12170,9 +12412,9 @@ watchpack@^1.7.4: watchpack-chokidar2 "^2.0.0" watchpack@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.0.0.tgz#b12248f32f0fd4799b7be0802ad1f6573a45955c" - integrity sha512-xSdCxxYZWNk3VK13bZRYhsQpfa8Vg63zXG+3pyU8ouqSLRCv4IGXIp9Kr226q6GBkGRlZrST2wwKtjfKz2m7Cg== + version "2.0.1" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.0.1.tgz#2f2192c542c82a3bcde76acd3411470c120426a8" + integrity sha512-vO8AKGX22ZRo6PiOFM9dC0re8IcKh8Kd/aH2zeqUc6w4/jBGlTy2P7fTC6ekT0NjVeGjgU2dGC5rNstKkeLEQg== dependencies: glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" @@ -12182,6 +12424,36 @@ webcomponents.js@^0.7.24: resolved "https://registry.yarnpkg.com/webcomponents.js/-/webcomponents.js-0.7.24.tgz#2116fbfa1468ec416a7befdaa333e1d118f69c04" integrity sha1-IRb7+hRo7EFqe+/aozPh0Rj2nAQ= +webpack-cli@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.2.0.tgz#10a09030ad2bd4d8b0f78322fba6ea43ec56aaaa" + integrity sha512-EIl3k88vaF4fSxWSgtAQR+VwicfLMTZ9amQtqS4o+TDPW9HGaEpbFBbAZ4A3ZOT5SOnMxNOzROsSTPiE8tBJPA== + dependencies: + "@webpack-cli/info" "^1.1.0" + "@webpack-cli/serve" "^1.1.0" + colorette "^1.2.1" + command-line-usage "^6.1.0" + commander "^6.2.0" + enquirer "^2.3.6" + execa "^4.1.0" + import-local "^3.0.2" + interpret "^2.2.0" + leven "^3.1.0" + rechoir "^0.7.0" + v8-compile-cache "^2.2.0" + webpack-merge "^4.2.2" + +webpack-concat-plugin@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/webpack-concat-plugin/-/webpack-concat-plugin-3.0.0.tgz#db34ae230794b634061bc2944053ed407619f138" + integrity sha512-DLdDbZXyrFR99wyAVC9P06HLjr2XujBmQdSbnQMK2o01H9U2NHsN5W76jeTVeXDq5OLvZf8r/se65ftRo3Prow== + dependencies: + concat-with-sourcemaps "^1.0.5" + globby "^8.0.1" + schema-utils "^0.4.5" + uglify-es "^3.3.9" + upath "^1.1.0" + webpack-log@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f" @@ -12258,9 +12530,9 @@ webpack@^4.26.1: webpack-sources "^1.4.1" webpack@^5.3.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.3.2.tgz#f88f6f2c54eaa1f68c8f37d8984657eaf68b00f0" - integrity sha512-DXsfHoI6lQAR3KnQh7+FsRfs9fs+TEvzXCA35UbKv4kVuzslg7QCMAcpFRZNDMjdtm9N/PoO54XEzGN9TeacQg== + version "5.4.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.4.0.tgz#4fdc6ec8a0ff9160701fb8f2eb8d06b33ecbae0f" + integrity sha512-udpYTyqz8toTTdaOsL2QKPLeZLt2IEm9qY7yTXuFEQhKu5bk0yQD9BtAdVQksmz4jFbbWOiWmm3NHarO0zr/ng== dependencies: "@types/eslint-scope" "^3.7.0" "@types/estree" "^0.0.45" @@ -12333,6 +12605,14 @@ word-wrap@^1.2.3: resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== +wordwrapjs@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/wordwrapjs/-/wordwrapjs-4.0.0.tgz#9aa9394155993476e831ba8e59fb5795ebde6800" + integrity sha512-Svqw723a3R34KvsMgpjFBYCgNOSdcW3mQFK4wIfhGQhtaFVOJmdYoXgi63ne3dTlWgatVcUc7t4HtQ/+bUVIzQ== + dependencies: + reduce-flatten "^2.0.0" + typical "^5.0.0" + worker-farm@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" @@ -12466,6 +12746,14 @@ yaml@^1.10.0: resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e" integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg== +yargs-parser@5.0.0-security.0: + version "5.0.0-security.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0-security.0.tgz#4ff7271d25f90ac15643b86076a2ab499ec9ee24" + integrity sha512-T69y4Ps64LNesYxeYGYPvfoMTt/7y1XtfpIslUeK4um+9Hu7hlGoRtaDLvdXb7+/tfq4opVa2HRY5xGip022rQ== + dependencies: + camelcase "^3.0.0" + object.assign "^4.1.0" + yargs-parser@^10.0.0: version "10.1.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" @@ -12489,13 +12777,6 @@ yargs-parser@^18.1.2, yargs-parser@^18.1.3: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a" - integrity sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo= - dependencies: - camelcase "^3.0.0" - yargs@13.3.0: version "13.3.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.0.tgz#4c657a55e07e5f2cf947f8a366567c04a0dedc83" @@ -12545,10 +12826,10 @@ yargs@^15.4.1: y18n "^4.0.0" yargs-parser "^18.1.2" -yargs@^7.0.0, yargs@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" - integrity sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg= +yargs@^7.1.0: + version "7.1.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.1.tgz#67f0ef52e228d4ee0d6311acede8850f53464df6" + integrity sha512-huO4Fr1f9PmiJJdll5kwoS2e4GqzGSsMT3PPMpOwoVkOK8ckqAewMTZyA6LXVQWflleb/Z8oPBEvNsMft0XE+g== dependencies: camelcase "^3.0.0" cliui "^3.2.0" @@ -12562,7 +12843,7 @@ yargs@^7.0.0, yargs@^7.1.0: string-width "^1.0.2" which-module "^1.0.0" y18n "^3.2.1" - yargs-parser "^5.0.0" + yargs-parser "5.0.0-security.0" yauzl@^2.4.2: version "2.10.0" From 7d9208e951d07438fe63c4db5327a4bfca35aa19 Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Sun, 16 Aug 2020 20:24:45 +0200 Subject: [PATCH 046/271] WIP --- .eslintrc.js | 1 - package.json | 3 +- src/components/activitylog.js | 7 +- src/components/appRouter.js | 23 +- src/components/apphost.js | 7 +- src/components/backdrop/backdrop.js | 5 +- src/components/cardbuilder/cardBuilder.js | 5 +- .../cardbuilder/chaptercardbuilder.js | 4 +- src/components/channelMapper/channelMapper.js | 6 +- .../collectionEditor/collectionEditor.js | 8 +- src/components/dialogHelper/dialogHelper.js | 2 +- .../displaySettings/displaySettings.js | 11 +- src/components/favoriteitems.js | 2 +- src/components/filterdialog/filterdialog.js | 5 +- src/components/filtermenu/filtermenu.js | 4 +- src/components/groupedcards.js | 6 +- src/components/guide/guide.js | 9 +- .../homeScreenSettings/homeScreenSettings.js | 7 +- src/components/homesections/homesections.js | 17 +- src/components/htmlMediaHelper.js | 2 +- .../imageDownloader/imageDownloader.js | 6 +- src/components/imageUploader/imageUploader.js | 4 +- src/components/imageeditor/imageeditor.js | 16 +- src/components/images/imageLoader.js | 13 +- src/components/itemContextMenu.js | 10 +- src/components/itemHelper.js | 2 +- src/components/itemMediaInfo/itemMediaInfo.js | 4 +- .../itemidentifier/itemidentifier.js | 4 +- src/components/itemsrefresher.js | 4 +- src/components/layoutManager.js | 5 +- src/components/listview/listview.js | 6 +- src/components/maintabsmanager.js | 2 +- src/components/mediainfo/mediainfo.js | 2 +- .../metadataEditor/metadataEditor.js | 12 +- src/components/multiSelect/multiSelect.js | 6 +- src/components/notifications/notifications.js | 4 +- src/components/nowPlayingBar/nowPlayingBar.js | 19 +- src/components/packageManager.js | 2 +- src/components/playback/brightnessosd.js | 4 +- src/components/playback/mediasession.js | 15 +- src/components/playback/playbackmanager.js | 73 ++--- .../playback/playbackorientation.js | 4 +- .../playback/playerSelectionMenu.js | 8 +- src/components/playback/playersettingsmenu.js | 6 +- .../playback/remotecontrolautoplay.js | 4 +- src/components/playback/volumeosd.js | 4 +- .../playbackSettings/playbackSettings.js | 9 +- src/components/playerstats/playerstats.js | 9 +- .../playlisteditor/playlisteditor.js | 10 +- src/components/playmenu.js | 2 +- src/components/pluginManager.js | 50 ++- .../recordingcreator/recordingbutton.js | 4 +- .../recordingcreator/recordingcreator.js | 9 +- .../recordingcreator/recordingeditor.js | 8 +- .../recordingcreator/recordingfields.js | 9 +- .../recordingcreator/recordinghelper.js | 10 +- .../recordingcreator/seriesrecordingeditor.js | 8 +- src/components/refreshdialog/refreshdialog.js | 4 +- src/components/remotecontrol/remotecontrol.js | 19 +- src/components/search/searchfields.js | 2 +- src/components/search/searchresults.js | 6 +- src/components/shortcuts.js | 14 +- src/components/slideshow/slideshow.js | 6 +- .../subtitleeditor/subtitleeditor.js | 10 +- .../subtitlesettings/subtitlesettings.js | 9 +- src/components/subtitlesync/subtitlesync.js | 2 +- src/components/syncPlay/groupSelectionMenu.js | 9 +- src/components/syncPlay/syncPlayManager.js | 13 +- src/components/syncPlay/timeSyncManager.js | 5 +- src/components/themeMediaPlayer.js | 6 +- src/components/tunerPicker.js | 4 +- src/components/upnextdialog/upnextdialog.js | 5 +- .../userdatabuttons/userdatabuttons.js | 10 +- src/components/viewManager/viewManager.js | 3 +- src/controllers/dashboard/dashboard.js | 12 +- .../scheduledtasks/scheduledtasks.js | 2 +- src/controllers/favorites.js | 8 +- src/controllers/home.js | 6 +- src/controllers/hometab.js | 3 +- src/controllers/itemDetails/index.js | 32 +- src/controllers/list.js | 10 +- src/controllers/livetv/livetvchannels.js | 2 +- src/controllers/livetvguideprovider.js | 2 +- src/controllers/movies/moviegenres.js | 2 +- src/controllers/movies/movies.js | 2 +- src/controllers/movies/moviesrecommended.js | 4 +- src/controllers/movies/movietrailers.js | 2 +- src/controllers/music/musicalbums.js | 4 +- src/controllers/music/musicartists.js | 2 +- src/controllers/music/songs.js | 2 +- src/controllers/playback/video/index.js | 12 +- src/controllers/searchpage.js | 2 +- src/controllers/session/login/index.js | 6 +- src/controllers/session/selectServer/index.js | 10 +- src/controllers/shows/episodes.js | 2 +- src/controllers/shows/tvgenres.js | 2 +- src/controllers/shows/tvrecommended.js | 4 +- src/controllers/shows/tvshows.js | 2 +- src/controllers/user/menu/index.js | 2 +- src/controllers/user/profile/index.js | 2 +- src/elements/emby-button/emby-button.js | 109 ++++--- .../emby-itemrefreshindicator.js | 2 +- .../emby-itemscontainer.js | 7 +- .../emby-playstatebutton.js | 5 +- .../emby-ratingbutton/emby-ratingbutton.js | 5 +- src/elements/emby-tabs/emby-tabs.js | 305 +++++++++--------- src/libraries/navdrawer/navdrawer.js | 2 +- src/libraries/screensavermanager.js | 9 +- src/libraries/scroller.js | 1 + src/plugins/backdropScreensaver/plugin.js | 5 +- src/plugins/bookPlayer/plugin.js | 13 +- src/plugins/bookPlayer/tableOfContents.js | 2 +- src/plugins/chromecastPlayer/plugin.js | 26 +- src/plugins/experimentalWarnings/plugin.js | 8 +- src/plugins/htmlAudioPlayer/plugin.js | 14 +- src/plugins/htmlVideoPlayer/plugin.js | 44 +-- src/plugins/logoScreensaver/plugin.js | 4 +- src/plugins/photoPlayer/plugin.js | 9 +- src/plugins/playAccessValidation/plugin.js | 7 +- src/plugins/sessionPlayer/plugin.js | 10 +- src/plugins/youtubePlayer/plugin.js | 104 +++--- src/scripts/autoThemes.js | 5 +- src/scripts/browserDeviceProfile.js | 10 +- src/scripts/clientUtils.js | 2 +- src/scripts/deleteHelper.js | 6 +- src/scripts/gamepadtokey.js | 2 +- src/scripts/globalize.js | 26 +- src/scripts/inputManager.js | 6 +- src/scripts/itembynamedetailpage.js | 4 +- src/scripts/libraryMenu.js | 31 +- src/scripts/mouseManager.js | 3 +- src/scripts/routes.js | 132 ++++---- src/scripts/serverNotifications.js | 11 +- src/scripts/settings/userSettings.js | 2 +- src/scripts/settings/webSettings.js | 22 +- src/scripts/site.js | 68 ++-- src/scripts/standalone.js | 7 +- src/scripts/taskbutton.js | 12 +- src/scripts/themeManager.js | 8 + src/scripts/touchHelper.js | 2 +- webpack.common.js | 15 +- webpack.dev.js | 9 +- yarn.lock | 167 ++++++---- 143 files changed, 1000 insertions(+), 1008 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index e5ee2dfe8..d0c5cef89 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -25,7 +25,6 @@ module.exports = { 'eslint:recommended', // 'plugin:promise/recommended', 'plugin:import/errors', - 'plugin:import/warnings', 'plugin:eslint-comments/recommended', 'plugin:compat/recommended' ], diff --git a/package.json b/package.json index bfba7b363..22b2a6ada 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "browser-sync": "^2.26.13", "confusing-browser-globals": "^1.0.10", "clean-webpack-plugin": "^3.0.0", - "copy-webpack-plugin": "^5.1.1", + "copy-webpack-plugin": "^6.0.3", "css-loader": "^5.0.0", "cssnano": "^4.1.10", "del": "^6.0.0", @@ -80,7 +80,6 @@ "material-design-icons-iconfont": "^6.1.0", "native-promise-only": "^0.8.0-a", "page": "^1.11.6", - "query-string": "^6.13.6", "resize-observer-polyfill": "^1.5.1", "screenfull": "^5.0.2", "sortablejs": "^1.12.0", diff --git a/src/components/activitylog.js b/src/components/activitylog.js index df2ea5f61..c00856e3a 100644 --- a/src/components/activitylog.js +++ b/src/components/activitylog.js @@ -1,10 +1,9 @@ -import events from 'jellyfin-apiclient'; +import { ConnectionManager, events } from 'jellyfin-apiclient'; import globalize from '../scripts/globalize'; import dom from '../scripts/dom'; import * as datefns from 'date-fns'; import dfnshelper from '../scripts/dfnshelper'; import serverNotifications from '../scripts/serverNotifications'; -import connectionManager from 'jellyfin-apiclient'; import '../elements/emby-button/emby-button'; import './listview/listview.css'; @@ -141,7 +140,7 @@ class ActivityLog { const element = options.element; element.classList.add('activityLogListWidget'); element.addEventListener('click', onListClick.bind(this)); - const apiClient = window.connectionManager.getApiClient(options.serverId); + const apiClient = ConnectionManager.getApiClient(options.serverId); reloadData(this, element, apiClient); const onUpdate = onActivityLogUpdate.bind(this); this.updateFn = onUpdate; @@ -153,7 +152,7 @@ class ActivityLog { if (options) { options.element.classList.remove('activityLogListWidget'); - window.connectionManager.getApiClient(options.serverId).sendMessage('ActivityLogEntryStop', '0,1500'); + ConnectionManager.getApiClient(options.serverId).sendMessage('ActivityLogEntryStop', '0,1500'); } const onUpdate = this.updateFn; diff --git a/src/components/appRouter.js b/src/components/appRouter.js index b8df9d9f1..2ec42be3a 100644 --- a/src/components/appRouter.js +++ b/src/components/appRouter.js @@ -1,9 +1,8 @@ -import appHost from './apphost'; +import { appHost } from './apphost'; import appSettings from '../scripts/settings/appSettings'; import backdrop from './backdrop/backdrop'; import browser from '../scripts/browser'; -import connectionManager from 'jellyfin-apiclient'; -import events from 'jellyfin-apiclient'; +import { events } from 'jellyfin-apiclient'; import globalize from '../scripts/globalize'; import itemHelper from './itemHelper'; import loading from './loading/loading'; @@ -95,7 +94,7 @@ class AppRouter { beginConnectionWizard() { backdrop.clearBackdrop(); loading.show(); - window.connectionManager.connect({ + window.ConnectionManager.connect({ enableAutoLogin: appSettings.enableAutoLogin() }).then((result) => { this.handleConnectionResult(result); @@ -154,7 +153,7 @@ class AppRouter { events.on(appHost, 'beforeexit', this.onBeforeExit); events.on(appHost, 'resume', this.onAppResume); - window.connectionManager.connect({ + window.ConnectionManager.connect({ enableAutoLogin: appSettings.enableAutoLogin() }).then((result) => { this.firstConnectionResult = result; @@ -210,7 +209,7 @@ class AppRouter { showItem(item, serverId, options) { // TODO: Refactor this so it only gets items, not strings. if (typeof (item) === 'string') { - const apiClient = serverId ? window.connectionManager.getApiClient(serverId) : window.connectionManager.currentApiClient(); + const apiClient = serverId ? window.ConnectionManager.getApiClient(serverId) : window.ConnectionManager.currentApiClient(); apiClient.getItem(apiClient.getCurrentUserId(), item).then((itemObject) => { this.showItem(itemObject, options); }); @@ -324,7 +323,7 @@ class AppRouter { url += '?' + ctx.querystring; } - import('' + url).then(({default: html}) => { + import(/* webpackChunkName: "[request]" */ `../controllers/${url}`).then((html) => { this.loadContent(ctx, route, html, request); }); } @@ -494,15 +493,15 @@ class AppRouter { } initApiClients() { - window.connectionManager.getApiClients().forEach((apiClient) => { + window.ConnectionManager.getApiClients().forEach((apiClient) => { this.initApiClient(apiClient, this); }); - events.on(window.connectionManager, 'apiclientcreated', this.onApiClientCreated); + events.on(window.ConnectionManager, 'apiclientcreated', this.onApiClientCreated); } onAppResume() { - const apiClient = window.connectionManager.currentApiClient(); + const apiClient = window.ConnectionManager.currentApiClient(); if (apiClient) { apiClient.ensureWebSocket(); @@ -520,7 +519,7 @@ class AppRouter { } } - const apiClient = window.connectionManager.currentApiClient(); + const apiClient = window.ConnectionManager.currentApiClient(); const pathname = ctx.pathname.toLowerCase(); console.debug('appRouter - processing path request ' + pathname); @@ -847,4 +846,4 @@ class AppRouter { } } -export default new AppRouter(); +export const appRouter = new AppRouter(); diff --git a/src/components/apphost.js b/src/components/apphost.js index c4b1396b1..281e070c7 100644 --- a/src/components/apphost.js +++ b/src/components/apphost.js @@ -1,6 +1,7 @@ + import appSettings from '../scripts/settings/appSettings'; import browser from '../scripts/browser'; -import events from 'jellyfin-apiclient'; +import { events } from 'jellyfin-apiclient'; import * as htmlMediaHelper from '../components/htmlMediaHelper'; import * as webSettings from '../scripts/settings/webSettings'; import globalize from '../scripts/globalize'; @@ -318,7 +319,7 @@ let deviceName; const appName = 'Jellyfin Web'; const appVersion = '10.7.0'; -const appHost = { +export const appHost = { getWindowState: function () { return document.windowState || 'Normal'; }, @@ -406,5 +407,3 @@ if (window.addEventListener) { window.addEventListener('focus', onAppVisible); window.addEventListener('blur', onAppHidden); } - -export default appHost; diff --git a/src/components/backdrop/backdrop.js b/src/components/backdrop/backdrop.js index acde031c2..98b577009 100644 --- a/src/components/backdrop/backdrop.js +++ b/src/components/backdrop/backdrop.js @@ -1,6 +1,5 @@ import browser from '../../scripts/browser'; -import connectionManager from 'jellyfin-apiclient'; -import playbackManager from '../playback/playbackmanager'; +import { playbackManager } from '../playback/playbackmanager'; import dom from '../../scripts/dom'; import * as userSettings from '../../scripts/settings/userSettings'; import './backdrop.css'; @@ -177,7 +176,7 @@ import './backdrop.css'; function getItemImageUrls(item, imageOptions) { imageOptions = imageOptions || {}; - const apiClient = window.connectionManager.getApiClient(item.ServerId); + const apiClient = window.ConnectionManager.getApiClient(item.ServerId); if (item.BackdropImageTags && item.BackdropImageTags.length > 0) { return item.BackdropImageTags.map((imgTag, index) => { return apiClient.getScaledImageUrl(item.BackdropItemId || item.Id, Object.assign(imageOptions, { diff --git a/src/components/cardbuilder/cardBuilder.js b/src/components/cardbuilder/cardBuilder.js index 70c3c4f80..a000a0640 100644 --- a/src/components/cardbuilder/cardBuilder.js +++ b/src/components/cardbuilder/cardBuilder.js @@ -7,7 +7,6 @@ import datetime from '../../scripts/datetime'; import imageLoader from '../images/imageLoader'; -import connectionManager from 'jellyfin-apiclient'; import itemHelper from '../itemHelper'; import focusManager from '../focusManager'; import indicators from '../indicators/indicators'; @@ -15,7 +14,7 @@ import globalize from '../../scripts/globalize'; import layoutManager from '../layoutManager'; import dom from '../../scripts/dom'; import browser from '../../scripts/browser'; -import playbackManager from '../playback/playbackmanager'; +import { playbackManager } from '../playback/playbackmanager'; import itemShortcuts from '../shortcuts'; import imageHelper from '../../scripts/imagehelper'; import './card.css'; @@ -371,7 +370,7 @@ import '../guide/programs.css'; if (serverId !== lastServerId) { lastServerId = serverId; - apiClient = window.connectionManager.getApiClient(lastServerId); + apiClient = window.ConnectionManager.getApiClient(lastServerId); } if (options.indexBy) { diff --git a/src/components/cardbuilder/chaptercardbuilder.js b/src/components/cardbuilder/chaptercardbuilder.js index 2ebdcbe82..33e978c48 100644 --- a/src/components/cardbuilder/chaptercardbuilder.js +++ b/src/components/cardbuilder/chaptercardbuilder.js @@ -7,7 +7,7 @@ import datetime from '../../scripts/datetime'; import imageLoader from '../images/imageLoader'; -import connectionManager from 'jellyfin-apiclient'; +import { ConnectionManager } from 'jellyfin-apiclient'; import layoutManager from '../layoutManager'; import browser from '../../scripts/browser'; @@ -48,7 +48,7 @@ import browser from '../../scripts/browser'; let html = ''; let itemsInRow = 0; - const apiClient = window.connectionManager.getApiClient(item.ServerId); + const apiClient = ConnectionManager.getApiClient(item.ServerId); for (let i = 0, length = chapters.length; i < length; i++) { if (options.rows && itemsInRow === 0) { diff --git a/src/components/channelMapper/channelMapper.js b/src/components/channelMapper/channelMapper.js index b3a3dc41b..f7c2dcc5c 100644 --- a/src/components/channelMapper/channelMapper.js +++ b/src/components/channelMapper/channelMapper.js @@ -1,7 +1,7 @@ import dom from '../../scripts/dom'; import dialogHelper from '../dialogHelper/dialogHelper'; import loading from '../loading/loading'; -import connectionManager from 'jellyfin-apiclient'; +import { ConnectionManager } from 'jellyfin-apiclient'; import globalize from '../../scripts/globalize'; import actionsheet from '../actionSheet/actionSheet'; import '../../elements/emby-input/emby-input'; @@ -16,7 +16,7 @@ export default class channelMapper { function mapChannel(button, channelId, providerChannelId) { loading.show(); const providerId = options.providerId; - window.connectionManager.getApiClient(options.serverId).ajax({ + ConnectionManager.getApiClient(options.serverId).ajax({ type: 'POST', url: ApiClient.getUrl('LiveTv/ChannelMappings'), data: JSON.stringify({ @@ -59,7 +59,7 @@ export default class channelMapper { } function getChannelMappingOptions(serverId, providerId) { - const apiClient = window.connectionManager.getApiClient(serverId); + const apiClient = ConnectionManager.getApiClient(serverId); return apiClient.getJSON(apiClient.getUrl('LiveTv/ChannelMappingOptions', { providerId: providerId })); diff --git a/src/components/collectionEditor/collectionEditor.js b/src/components/collectionEditor/collectionEditor.js index e36abd7e0..11de5af8f 100644 --- a/src/components/collectionEditor/collectionEditor.js +++ b/src/components/collectionEditor/collectionEditor.js @@ -2,8 +2,8 @@ import dom from '../../scripts/dom'; import dialogHelper from '../dialogHelper/dialogHelper'; import loading from '../loading/loading'; import layoutManager from '../layoutManager'; -import connectionManager from 'jellyfin-apiclient'; -import appRouter from '../appRouter'; +import { ConnectionManager } from 'jellyfin-apiclient'; +import { appRouter } from '../appRouter'; import globalize from '../../scripts/globalize'; import '../../elements/emby-button/emby-button'; import '../../elements/emby-button/paper-icon-button-light'; @@ -25,7 +25,7 @@ import '../../assets/css/flexstyles.css'; const collectionId = panel.querySelector('#selectCollectionToAddTo').value; - const apiClient = window.connectionManager.getApiClient(currentServerId); + const apiClient = ConnectionManager.getApiClient(currentServerId); if (collectionId) { addToCollection(apiClient, panel, collectionId); @@ -106,7 +106,7 @@ import '../../assets/css/flexstyles.css'; EnableTotalRecordCount: false }; - const apiClient = window.connectionManager.getApiClient(currentServerId); + const apiClient = ConnectionManager.getApiClient(currentServerId); apiClient.getItems(apiClient.getCurrentUserId(), options).then(result => { let html = ''; diff --git a/src/components/dialogHelper/dialogHelper.js b/src/components/dialogHelper/dialogHelper.js index 4eee793a3..20c658df4 100644 --- a/src/components/dialogHelper/dialogHelper.js +++ b/src/components/dialogHelper/dialogHelper.js @@ -1,4 +1,4 @@ -import appRouter from '../appRouter'; +import { appRouter } from '../appRouter'; import focusManager from '../focusManager'; import browser from '../../scripts/browser'; import layoutManager from '../layoutManager'; diff --git a/src/components/displaySettings/displaySettings.js b/src/components/displaySettings/displaySettings.js index d6e4bee2f..575858648 100644 --- a/src/components/displaySettings/displaySettings.js +++ b/src/components/displaySettings/displaySettings.js @@ -1,14 +1,13 @@ import browser from '../../scripts/browser'; import layoutManager from '../layoutManager'; -import pluginManager from '../pluginManager'; -import appHost from '../apphost'; +import { pluginManager } from '../pluginManager'; +import { appHost } from '../apphost'; import focusManager from '../focusManager'; import datetime from '../../scripts/datetime'; import globalize from '../../scripts/globalize'; import loading from '../loading/loading'; -import connectionManager from 'jellyfin-apiclient'; import skinManager from '../../scripts/themeManager'; -import events from 'jellyfin-apiclient'; +import { ConnectionManager, events } from 'jellyfin-apiclient'; import '../../elements/emby-select/emby-select'; import '../../elements/emby-checkbox/emby-checkbox'; import '../../elements/emby-button/emby-button'; @@ -182,7 +181,7 @@ import '../../elements/emby-button/emby-button'; function onSubmit(e) { const self = this; - const apiClient = window.connectionManager.getApiClient(self.options.serverId); + const apiClient = ConnectionManager.getApiClient(self.options.serverId); const userId = self.options.userId; const userSettings = self.options.userSettings; @@ -221,7 +220,7 @@ import '../../elements/emby-button/emby-button'; loading.show(); const userId = self.options.userId; - const apiClient = window.connectionManager.getApiClient(self.options.serverId); + const apiClient = ConnectionManager.getApiClient(self.options.serverId); const userSettings = self.options.userSettings; return apiClient.getUser(userId).then(user => { diff --git a/src/components/favoriteitems.js b/src/components/favoriteitems.js index 7b56967fd..cb1b61c43 100644 --- a/src/components/favoriteitems.js +++ b/src/components/favoriteitems.js @@ -1,7 +1,7 @@ import loading from './loading/loading'; import cardBuilder from './cardbuilder/cardBuilder'; import dom from '../scripts/dom'; -import appHost from './apphost'; +import { appHost } from './apphost'; import imageLoader from './images/imageLoader'; import globalize from '../scripts/globalize'; import layoutManager from './layoutManager'; diff --git a/src/components/filterdialog/filterdialog.js b/src/components/filterdialog/filterdialog.js index 9c5ad5f71..6c694c18f 100644 --- a/src/components/filterdialog/filterdialog.js +++ b/src/components/filterdialog/filterdialog.js @@ -1,8 +1,7 @@ import dom from '../../scripts/dom'; import dialogHelper from '../dialogHelper/dialogHelper'; import globalize from '../../scripts/globalize'; -import connectionManager from 'jellyfin-apiclient'; -import events from 'jellyfin-apiclient'; +import { ConnectionManager, events } from 'jellyfin-apiclient'; import '../../elements/emby-checkbox/emby-checkbox'; import '../../elements/emby-collapse/emby-collapse'; import './style.css'; @@ -420,7 +419,7 @@ import './style.css'; this.bindEvents(dlg); if (enableDynamicFilters(this.options.mode)) { dlg.classList.add('dynamicFilterDialog'); - const apiClient = window.connectionManager.getApiClient(this.options.serverId); + const apiClient = ConnectionManager.getApiClient(this.options.serverId); loadDynamicFilters(dlg, apiClient, apiClient.getCurrentUserId(), this.options.query); } }); diff --git a/src/components/filtermenu/filtermenu.js b/src/components/filtermenu/filtermenu.js index 46c3fc87b..f098cc457 100644 --- a/src/components/filtermenu/filtermenu.js +++ b/src/components/filtermenu/filtermenu.js @@ -3,7 +3,7 @@ import focusManager from '../focusManager'; import dialogHelper from '../dialogHelper/dialogHelper'; import inputManager from '../../scripts/inputManager'; import layoutManager from '../layoutManager'; -import connectionManager from 'jellyfin-apiclient'; +import { ConnectionManager } from 'jellyfin-apiclient'; import globalize from '../../scripts/globalize'; import * as userSettings from '../../scripts/settings/userSettings'; import '../../elements/emby-checkbox/emby-checkbox'; @@ -194,7 +194,7 @@ function initEditor(context, settings) { } } function loadDynamicFilters(context, options) { - const apiClient = window.connectionManager.getApiClient(options.serverId); + var apiClient = ConnectionManager.getApiClient(options.serverId); const filterMenuOptions = Object.assign(options.filterMenuOptions, { diff --git a/src/components/groupedcards.js b/src/components/groupedcards.js index c2714eba8..3dd7f6140 100644 --- a/src/components/groupedcards.js +++ b/src/components/groupedcards.js @@ -1,13 +1,13 @@ /* eslint-disable indent */ import dom from '../scripts/dom'; -import appRouter from './appRouter'; -import connectionManager from 'jellyfin-apiclient'; +import { appRouter } from './appRouter'; +import { ConnectionManager } from 'jellyfin-apiclient'; function onGroupedCardClick(e, card) { const itemId = card.getAttribute('data-id'); const serverId = card.getAttribute('data-serverid'); - const apiClient = window.connectionManager.getApiClient(serverId); + const apiClient = window.ConnectionManager.getApiClient(serverId); const userId = apiClient.getCurrentUserId(); const playedIndicator = card.querySelector('.playedIndicator'); const playedIndicatorHtml = playedIndicator ? playedIndicator.innerHTML : null; diff --git a/src/components/guide/guide.js b/src/components/guide/guide.js index 92a528f00..16d6813bd 100644 --- a/src/components/guide/guide.js +++ b/src/components/guide/guide.js @@ -1,16 +1,15 @@ import inputManager from '../../scripts/inputManager'; import browser from '../../scripts/browser'; import globalize from '../../scripts/globalize'; -import connectionManager from 'jellyfin-apiclient'; +import { ConnectionManager, events } from 'jellyfin-apiclient'; import scrollHelper from '../../scripts/scrollHelper'; import serverNotifications from '../../scripts/serverNotifications'; import loading from '../loading/loading'; import datetime from '../../scripts/datetime'; import focusManager from '../focusManager'; -import playbackManager from '../playback/playbackmanager'; +import { playbackManager } from '../playback/playbackmanager'; import * as userSettings from '../../scripts/settings/userSettings'; import imageLoader from '../images/imageLoader'; -import events from 'jellyfin-apiclient'; import layoutManager from '../layoutManager'; import itemShortcuts from '../shortcuts'; import dom from '../../scripts/dom'; @@ -213,7 +212,7 @@ function Guide(options) { } function reloadGuide(context, newStartDate, scrollToTimeMs, focusToTimeMs, startTimeOfDayMs, focusProgramOnRender) { - const apiClient = window.connectionManager.getApiClient(options.serverId); + const apiClient = ConnectionManager.getApiClient(options.serverId); const channelQuery = { @@ -873,7 +872,7 @@ function Guide(options) { function reloadPage(page) { showLoading(); - const apiClient = window.connectionManager.getApiClient(options.serverId); + const apiClient = ConnectionManager.getApiClient(options.serverId); apiClient.getLiveTvGuideInfo().then(function (guideInfo) { setDateRange(page, guideInfo); diff --git a/src/components/homeScreenSettings/homeScreenSettings.js b/src/components/homeScreenSettings/homeScreenSettings.js index 361a91a9e..6c6228332 100644 --- a/src/components/homeScreenSettings/homeScreenSettings.js +++ b/src/components/homeScreenSettings/homeScreenSettings.js @@ -3,10 +3,9 @@ import layoutManager from '../layoutManager'; import focusManager from '../focusManager'; import globalize from '../../scripts/globalize'; import loading from '../loading/loading'; -import connectionManager from 'jellyfin-apiclient'; +import { ConnectionManager, events } from 'jellyfin-apiclient'; import homeSections from '../homesections/homesections'; import dom from '../../scripts/dom'; -import events from 'jellyfin-apiclient'; import '../listview/listview.css'; import '../../elements/emby-select/emby-select'; import '../../elements/emby-checkbox/emby-checkbox'; @@ -385,7 +384,7 @@ import '../../elements/emby-checkbox/emby-checkbox'; function onSubmit(e) { const self = this; - const apiClient = window.connectionManager.getApiClient(self.options.serverId); + const apiClient = ConnectionManager.getApiClient(self.options.serverId); const userId = self.options.userId; const userSettings = self.options.userSettings; @@ -457,7 +456,7 @@ import '../../elements/emby-checkbox/emby-checkbox'; loading.show(); const userId = self.options.userId; - const apiClient = window.connectionManager.getApiClient(self.options.serverId); + const apiClient = ConnectionManager.getApiClient(self.options.serverId); const userSettings = self.options.userSettings; apiClient.getUser(userId).then(user => { diff --git a/src/components/homesections/homesections.js b/src/components/homesections/homesections.js index 60c5fc0ac..27f1c4d79 100644 --- a/src/components/homesections/homesections.js +++ b/src/components/homesections/homesections.js @@ -1,16 +1,15 @@ -import connectionManager from 'jellyfin-apiclient'; import cardBuilder from '../cardbuilder/cardBuilder'; import dom from '../../scripts/dom'; import layoutManager from '../layoutManager'; import imageLoader from '../images/imageLoader'; import globalize from '../../scripts/globalize'; -import appRouter from '../appRouter'; +import { appRouter } from '../appRouter'; import imageHelper from '../../scripts/imagehelper'; import '../../elements/emby-button/paper-icon-button-light'; import '../../elements/emby-itemscontainer/emby-itemscontainer'; import '../../elements/emby-scroller/emby-scroller'; import '../../elements/emby-button/emby-button'; -import './homesections'; +import './homesections.css'; /* eslint-disable indent */ @@ -212,7 +211,7 @@ import './homesections'; function getFetchLatestItemsFn(serverId, parentId, collectionType) { return function () { - const apiClient = window.connectionManager.getApiClient(serverId); + const apiClient = window.ConnectionManager.getApiClient(serverId); let limit = 16; if (enableScrollX()) { @@ -368,7 +367,7 @@ import './homesections'; function getContinueWatchingFetchFn(serverId) { return function () { - const apiClient = window.connectionManager.getApiClient(serverId); + const apiClient = window.ConnectionManager.getApiClient(serverId); const screenWidth = dom.getWindowSize().innerWidth; let limit; @@ -441,7 +440,7 @@ import './homesections'; function getContinueListeningFetchFn(serverId) { return function () { - const apiClient = window.connectionManager.getApiClient(serverId); + const apiClient = window.ConnectionManager.getApiClient(serverId); const screenWidth = dom.getWindowSize().innerWidth; let limit; @@ -514,7 +513,7 @@ import './homesections'; function getOnNowFetchFn(serverId) { return function () { - const apiClient = window.connectionManager.getApiClient(serverId); + const apiClient = window.ConnectionManager.getApiClient(serverId); return apiClient.getLiveTvRecommendedPrograms({ userId: apiClient.getCurrentUserId(), IsAiring: true, @@ -657,7 +656,7 @@ import './homesections'; function getNextUpFetchFn(serverId) { return function () { - const apiClient = window.connectionManager.getApiClient(serverId); + const apiClient = window.ConnectionManager.getApiClient(serverId); return apiClient.getNextUpEpisodes({ Limit: enableScrollX() ? 24 : 15, Fields: 'PrimaryImageAspectRatio,SeriesInfo,DateCreated,BasicSyncInfo,Path', @@ -728,7 +727,7 @@ import './homesections'; function getLatestRecordingsFetchFn(serverId, activeRecordingsOnly) { return function () { - const apiClient = window.connectionManager.getApiClient(serverId); + const apiClient = window.ConnectionManager.getApiClient(serverId); return apiClient.getLiveTvRecordings({ userId: apiClient.getCurrentUserId(), Limit: enableScrollX() ? 12 : 5, diff --git a/src/components/htmlMediaHelper.js b/src/components/htmlMediaHelper.js index 1fab10ef2..45ab7f1e8 100644 --- a/src/components/htmlMediaHelper.js +++ b/src/components/htmlMediaHelper.js @@ -3,7 +3,7 @@ import appSettings from '../scripts/settings/appSettings' ; import browser from '../scripts/browser'; -import events from 'jellyfin-apiclient'; +import { events } from 'jellyfin-apiclient'; export function getSavedVolume() { return appSettings.get('volume') || 1; diff --git a/src/components/imageDownloader/imageDownloader.js b/src/components/imageDownloader/imageDownloader.js index 5abdd588f..66b6c1ff4 100644 --- a/src/components/imageDownloader/imageDownloader.js +++ b/src/components/imageDownloader/imageDownloader.js @@ -1,8 +1,8 @@ import dom from '../../scripts/dom'; import loading from '../loading/loading'; -import appHost from '../apphost'; +import { appHost } from '../apphost'; import dialogHelper from '../dialogHelper/dialogHelper'; -import connectionManager from 'jellyfin-apiclient'; +import { ConnectionManager } from 'jellyfin-apiclient'; import imageLoader from '../images/imageLoader'; import browser from '../../scripts/browser'; import layoutManager from '../layoutManager'; @@ -317,7 +317,7 @@ import '../cardbuilder/card.css'; loading.show(); import('./imageDownloader.template.html').then(({default: template}) => { - const apiClient = window.connectionManager.getApiClient(serverId); + const apiClient = ConnectionManager.getApiClient(serverId); currentItemId = itemId; currentItemType = itemType; diff --git a/src/components/imageUploader/imageUploader.js b/src/components/imageUploader/imageUploader.js index 2c32accca..b6305fadb 100644 --- a/src/components/imageUploader/imageUploader.js +++ b/src/components/imageUploader/imageUploader.js @@ -6,7 +6,7 @@ */ import dialogHelper from '../dialogHelper/dialogHelper'; -import connectionManager from 'jellyfin-apiclient'; +import { ConnectionManager } from 'jellyfin-apiclient'; import dom from '../../scripts/dom'; import loading from '../loading/loading'; import scrollHelper from '../../scripts/scrollHelper'; @@ -108,7 +108,7 @@ import './style.css'; return false; } - window.connectionManager.getApiClient(currentServerId).uploadItemImage(currentItemId, imageType, file).then(() => { + ConnectionManager.getApiClient(currentServerId).uploadItemImage(currentItemId, imageType, file).then(() => { dlg.querySelector('#uploadImage').value = ''; loading.hide(); diff --git a/src/components/imageeditor/imageeditor.js b/src/components/imageeditor/imageeditor.js index 09edc072f..acb678c87 100644 --- a/src/components/imageeditor/imageeditor.js +++ b/src/components/imageeditor/imageeditor.js @@ -1,5 +1,5 @@ import dialogHelper from '../dialogHelper/dialogHelper'; -import connectionManager from 'jellyfin-apiclient'; +import { ConnectionManager } from 'jellyfin-apiclient'; import loading from '../loading/loading'; import dom from '../../scripts/dom'; import layoutManager from '../layoutManager'; @@ -8,7 +8,7 @@ import globalize from '../../scripts/globalize'; import scrollHelper from '../../scripts/scrollHelper'; import imageLoader from '../images/imageLoader'; import browser from '../../scripts/browser'; -import appHost from '../apphost'; +import { appHost } from '../apphost'; import '../cardbuilder/card.css'; import '../formdialog.css'; import '../../elements/emby-button/emby-button'; @@ -36,10 +36,10 @@ import './imageeditor.css'; let apiClient; if (item) { - apiClient = window.connectionManager.getApiClient(item.ServerId); + apiClient = ConnectionManager.getApiClient(item.ServerId); reloadItem(page, item, apiClient, focusContext); } else { - apiClient = window.connectionManager.getApiClient(currentItem.ServerId); + apiClient = ConnectionManager.getApiClient(currentItem.ServerId); apiClient.getItem(apiClient.getCurrentUserId(), currentItem.Id).then(function (item) { reloadItem(page, item, apiClient, focusContext); }); @@ -293,7 +293,7 @@ import './imageeditor.css'; function showActionSheet(context, imageCard) { const itemId = imageCard.getAttribute('data-id'); const serverId = imageCard.getAttribute('data-serverid'); - const apiClient = window.connectionManager.getApiClient(serverId); + const apiClient = ConnectionManager.getApiClient(serverId); const type = imageCard.getAttribute('data-imagetype'); const index = parseInt(imageCard.getAttribute('data-index')); @@ -404,7 +404,7 @@ import './imageeditor.css'; const type = this.getAttribute('data-imagetype'); let index = this.getAttribute('data-index'); index = index === 'null' ? null : parseInt(index); - const apiClient = window.connectionManager.getApiClient(currentItem.ServerId); + const apiClient = ConnectionManager.getApiClient(currentItem.ServerId); deleteImage(context, currentItem.Id, type, index, apiClient, true); }); @@ -412,7 +412,7 @@ import './imageeditor.css'; const type = this.getAttribute('data-imagetype'); const index = this.getAttribute('data-index'); const newIndex = this.getAttribute('data-newindex'); - const apiClient = window.connectionManager.getApiClient(currentItem.ServerId); + const apiClient = ConnectionManager.getApiClient(currentItem.ServerId); moveImage(context, apiClient, currentItem.Id, type, index, newIndex, dom.parentWithClass(this, 'itemsContainer')); }); } @@ -424,7 +424,7 @@ import './imageeditor.css'; loading.show(); import('./imageeditor.template.html').then(({default: template}) => { - const apiClient = window.connectionManager.getApiClient(serverId); + const apiClient = ConnectionManager.getApiClient(serverId); apiClient.getItem(apiClient.getCurrentUserId(), itemId).then(function (item) { const dialogOptions = { removeOnClose: true diff --git a/src/components/images/imageLoader.js b/src/components/images/imageLoader.js index f4a141bc9..47ea38205 100644 --- a/src/components/images/imageLoader.js +++ b/src/components/images/imageLoader.js @@ -1,6 +1,6 @@ import * as lazyLoader from '../lazyLoader/lazyLoaderIntersectionObserver'; import * as userSettings from '../../scripts/settings/userSettings'; -import * as blurhash from 'blurhash'; +import { decode, isBlurhashValid } from 'blurhash'; import './style.css'; /* eslint-disable indent */ @@ -13,7 +13,7 @@ import './style.css'; } function itemBlurhashing(target, blurhashstr) { - if (blurhash.isBlurhashValid(blurhashstr)) { + if (isBlurhashValid(blurhashstr)) { // Although the default values recommended by Blurhash developers is 32x32, a size of 18x18 seems to be the sweet spot for us, // improving the performance and reducing the memory usage, while retaining almost full blur quality. // Lower values had more visible pixelation @@ -21,7 +21,7 @@ import './style.css'; const height = 18; let pixels; try { - pixels = blurhash.decode(blurhashstr, width, height); + pixels = decode(blurhashstr, width, height); } catch (err) { console.error('Blurhash decode error: ', err); target.classList.add('non-blurhashable'); @@ -124,15 +124,18 @@ import './style.css'; export function lazyChildren(elem) { if (userSettings.enableBlurhash()) { - for (const lazyElem of elem.querySelectorAll('.lazy')) { + const lazyElems = Array.from(elem.querySelectorAll('.lazy')); + console.warn(lazyElems); + lazyElems.forEach((lazyElem) => { const blurhashstr = lazyElem.getAttribute('data-blurhash'); if (!lazyElem.classList.contains('blurhashed', 'non-blurhashable') && blurhashstr) { itemBlurhashing(lazyElem, blurhashstr); } else if (!blurhashstr && !lazyElem.classList.contains('blurhashed')) { lazyElem.classList.add('non-blurhashable'); } - } + }); } + console.warn(elem); lazyLoader.lazyChildren(elem, fillImage); } diff --git a/src/components/itemContextMenu.js b/src/components/itemContextMenu.js index ff58a901f..e16063f64 100644 --- a/src/components/itemContextMenu.js +++ b/src/components/itemContextMenu.js @@ -1,11 +1,11 @@ -import connectionManager from 'jellyfin-apiclient'; +import { ConnectionManager } from 'jellyfin-apiclient'; import browser from '../scripts/browser'; import globalize from '../scripts/globalize'; import actionsheet from './actionSheet/actionSheet'; -import appHost from './apphost'; -import appRouter from './appRouter'; +import { appHost } from './apphost'; +import { appRouter } from './appRouter'; import itemHelper from './itemHelper'; -import playbackManager from './playback/playbackmanager'; +import { playbackManager } from './playback/playbackmanager'; /* eslint-disable indent */ export function getCommands(options) { @@ -330,7 +330,7 @@ import playbackManager from './playback/playbackmanager'; function executeCommand(item, id, options) { const itemId = item.Id; const serverId = item.ServerId; - const apiClient = window.connectionManager.getApiClient(serverId); + const apiClient = ConnectionManager.getApiClient(serverId); return new Promise(function (resolve, reject) { switch (id) { diff --git a/src/components/itemHelper.js b/src/components/itemHelper.js index b6f30d7ab..de771546b 100644 --- a/src/components/itemHelper.js +++ b/src/components/itemHelper.js @@ -1,4 +1,4 @@ -import appHost from './apphost'; +import { appHost } from './apphost'; import globalize from '../scripts/globalize'; export function getDisplayName(item, options = {}) { diff --git a/src/components/itemMediaInfo/itemMediaInfo.js b/src/components/itemMediaInfo/itemMediaInfo.js index 9e036fba9..1d254c264 100644 --- a/src/components/itemMediaInfo/itemMediaInfo.js +++ b/src/components/itemMediaInfo/itemMediaInfo.js @@ -8,7 +8,7 @@ import dialogHelper from '../dialogHelper/dialogHelper'; import layoutManager from '../layoutManager'; import globalize from '../../scripts/globalize'; -import connectionManager from 'jellyfin-apiclient'; +import { ConnectionManager } from 'jellyfin-apiclient'; import loading from '../loading/loading'; import '../../elements/emby-select/emby-select'; import '../listview/listview.css'; @@ -163,7 +163,7 @@ import '../../assets/css/flexstyles.css'; } function loadMediaInfo(itemId, serverId, template) { - const apiClient = window.connectionManager.getApiClient(serverId); + const apiClient = ConnectionManager.getApiClient(serverId); return apiClient.getItem(apiClient.getCurrentUserId(), itemId).then(item => { const dialogOptions = { size: 'small', diff --git a/src/components/itemidentifier/itemidentifier.js b/src/components/itemidentifier/itemidentifier.js index 77b04a1a5..b65a986de 100644 --- a/src/components/itemidentifier/itemidentifier.js +++ b/src/components/itemidentifier/itemidentifier.js @@ -7,7 +7,7 @@ import dialogHelper from '../dialogHelper/dialogHelper'; import loading from '../loading/loading'; -import connectionManager from 'jellyfin-apiclient'; +import { ConnectionManager } from 'jellyfin-apiclient'; import globalize from '../../scripts/globalize'; import scrollHelper from '../../scripts/scrollHelper'; import layoutManager from '../layoutManager'; @@ -31,7 +31,7 @@ import '../cardbuilder/card.css'; let currentSearchResult; function getApiClient() { - return window.connectionManager.getApiClient(currentServerId); + return ConnectionManager.getApiClient(currentServerId); } function searchForIdentificationResults(page) { diff --git a/src/components/itemsrefresher.js b/src/components/itemsrefresher.js index d28361999..9960cac33 100644 --- a/src/components/itemsrefresher.js +++ b/src/components/itemsrefresher.js @@ -1,6 +1,6 @@ -import playbackManager from './playback/playbackmanager'; +import { playbackManager } from './playback/playbackmanager'; import serverNotifications from '../scripts/serverNotifications'; -import events from 'jellyfin-apiclient'; +import { events } from 'jellyfin-apiclient'; function onUserDataChanged(e, apiClient, userData) { const instance = this; diff --git a/src/components/layoutManager.js b/src/components/layoutManager.js index c5555d0eb..eaa1dc50b 100644 --- a/src/components/layoutManager.js +++ b/src/components/layoutManager.js @@ -1,7 +1,8 @@ -import appHost from './apphost'; + +import { appHost } from './apphost'; import browser from '../scripts/browser'; import { set, get } from '../scripts/settings/appSettings'; -import events from 'jellyfin-apiclient'; +import { events } from 'jellyfin-apiclient'; function setLayout(instance, layout, selectedLayout) { if (layout === selectedLayout) { diff --git a/src/components/listview/listview.js b/src/components/listview/listview.js index 33bbdc756..a94e3a143 100644 --- a/src/components/listview/listview.js +++ b/src/components/listview/listview.js @@ -8,7 +8,7 @@ import itemHelper from '../itemHelper'; import mediaInfo from '../mediainfo/mediainfo'; import indicators from '../indicators/indicators'; -import connectionManager from 'jellyfin-apiclient'; +import { ConnectionManager } from 'jellyfin-apiclient'; import layoutManager from '../layoutManager'; import globalize from '../../scripts/globalize'; import datetime from '../../scripts/datetime'; @@ -77,7 +77,7 @@ import '../../elements/emby-playstatebutton/emby-playstatebutton'; } function getImageUrl(item, width) { - const apiClient = window.connectionManager.getApiClient(item.ServerId); + const apiClient = ConnectionManager.getApiClient(item.ServerId); let itemId; const options = { @@ -106,7 +106,7 @@ import '../../elements/emby-playstatebutton/emby-playstatebutton'; } function getChannelImageUrl(item, width) { - const apiClient = window.connectionManager.getApiClient(item.ServerId); + const apiClient = ConnectionManager.getApiClient(item.ServerId); const options = { maxWidth: width, type: 'Primary' diff --git a/src/components/maintabsmanager.js b/src/components/maintabsmanager.js index 07a150282..2884794bc 100644 --- a/src/components/maintabsmanager.js +++ b/src/components/maintabsmanager.js @@ -1,6 +1,6 @@ import dom from '../scripts/dom'; import browser from '../scripts/browser'; -import events from 'jellyfin-apiclient'; +import { events } from 'jellyfin-apiclient'; import '../elements/emby-tabs/emby-tabs'; import '../elements/emby-button/emby-button'; diff --git a/src/components/mediainfo/mediainfo.js b/src/components/mediainfo/mediainfo.js index 270cfae6d..73193f375 100644 --- a/src/components/mediainfo/mediainfo.js +++ b/src/components/mediainfo/mediainfo.js @@ -1,6 +1,6 @@ import datetime from '../../scripts/datetime'; import globalize from '../../scripts/globalize'; -import appRouter from '../appRouter'; +import { appRouter } from '../appRouter'; import itemHelper from '../itemHelper'; import indicators from '../indicators/indicators'; import 'material-design-icons-iconfont'; diff --git a/src/components/metadataEditor/metadataEditor.js b/src/components/metadataEditor/metadataEditor.js index 32a0a3751..b6c33f4af 100644 --- a/src/components/metadataEditor/metadataEditor.js +++ b/src/components/metadataEditor/metadataEditor.js @@ -4,7 +4,7 @@ import dialogHelper from '../dialogHelper/dialogHelper'; import datetime from '../../scripts/datetime'; import loading from '../loading/loading'; import focusManager from '../focusManager'; -import connectionManager from 'jellyfin-apiclient'; +import { ConnectionManager } from 'jellyfin-apiclient'; import globalize from '../../scripts/globalize'; import shell from '../../scripts/shell'; import '../../elements/emby-checkbox/emby-checkbox'; @@ -290,7 +290,7 @@ import '../../assets/css/flexstyles.css'; } function getApiClient() { - return window.connectionManager.getApiClient(currentItem.ServerId); + return ConnectionManager.getApiClient(currentItem.ServerId); } function bindAll(elems, eventName, fn) { @@ -370,7 +370,7 @@ import '../../assets/css/flexstyles.css'; } function getItem(itemId, serverId) { - const apiClient = window.connectionManager.getApiClient(serverId); + const apiClient = ConnectionManager.getApiClient(serverId); if (itemId) { return apiClient.getItem(apiClient.getCurrentUserId(), itemId); @@ -380,7 +380,7 @@ import '../../assets/css/flexstyles.css'; } function getEditorConfig(itemId, serverId) { - const apiClient = window.connectionManager.getApiClient(serverId); + const apiClient = ConnectionManager.getApiClient(serverId); if (itemId) { return apiClient.getJSON(apiClient.getUrl('Items/' + itemId + '/MetadataEditor')); @@ -1068,7 +1068,7 @@ import '../../assets/css/flexstyles.css'; currentContext = dlg; - init(dlg, window.connectionManager.getApiClient(serverId)); + init(dlg, ConnectionManager.getApiClient(serverId)); reload(dlg, itemId, serverId); }); @@ -1095,7 +1095,7 @@ import '../../assets/css/flexstyles.css'; currentContext = elem; - init(elem, window.connectionManager.getApiClient(serverId)); + init(elem, ConnectionManager.getApiClient(serverId)); reload(elem, itemId, serverId); focusManager.autoFocus(elem); diff --git a/src/components/multiSelect/multiSelect.js b/src/components/multiSelect/multiSelect.js index 52182d440..e37deb2d3 100644 --- a/src/components/multiSelect/multiSelect.js +++ b/src/components/multiSelect/multiSelect.js @@ -1,7 +1,7 @@ import browser from '../../scripts/browser'; -import appHost from '../apphost'; +import { appHost } from '../apphost'; import loading from '../loading/loading'; -import connectionManager from 'jellyfin-apiclient'; +import { ConnectionManager } from 'jellyfin-apiclient'; import globalize from '../../scripts/globalize'; import dom from '../../scripts/dom'; import './multiSelect.css'; @@ -170,7 +170,7 @@ import './multiSelect.css'; } function showMenuForSelectedItems(e) { - const apiClient = window.connectionManager.currentApiClient(); + const apiClient = ConnectionManager.currentApiClient(); apiClient.getCurrentUser().then(user => { const menuItems = []; diff --git a/src/components/notifications/notifications.js b/src/components/notifications/notifications.js index 1eca2c380..c50fbc68e 100644 --- a/src/components/notifications/notifications.js +++ b/src/components/notifications/notifications.js @@ -1,6 +1,6 @@ import serverNotifications from '../../scripts/serverNotifications'; -import playbackManager from '../playback/playbackmanager'; -import events from 'jellyfin-apiclient'; +import { playbackManager } from '../playback/playbackmanager'; +import { events } from 'jellyfin-apiclient'; import globalize from '../../scripts/globalize'; function onOneDocumentClick() { diff --git a/src/components/nowPlayingBar/nowPlayingBar.js b/src/components/nowPlayingBar/nowPlayingBar.js index 9607fadcb..4a794c956 100644 --- a/src/components/nowPlayingBar/nowPlayingBar.js +++ b/src/components/nowPlayingBar/nowPlayingBar.js @@ -1,13 +1,12 @@ import datetime from '../../scripts/datetime'; -import events from 'jellyfin-apiclient'; +import { ConnectionManager, events } from 'jellyfin-apiclient'; import browser from '../../scripts/browser'; import imageLoader from '../../scripts/imagehelper'; import layoutManager from '../layoutManager'; -import playbackManager from '../playback/playbackmanager'; +import { playbackManager } from '../playback/playbackmanager'; import nowPlayingHelper from '../playback/nowplayinghelper'; -import appHost from '../apphost'; +import { appHost } from '../apphost'; import dom from '../../scripts/dom'; -import connectionManager from 'jellyfin-apiclient'; import itemContextMenu from '../itemContextMenu'; import '../../elements/emby-button/paper-icon-button-light'; import '../../elements/emby-ratingbutton/emby-ratingbutton'; @@ -452,7 +451,7 @@ import '../../elements/emby-ratingbutton/emby-ratingbutton'; if (item.SeriesPrimaryImageTag) { options.tag = item.SeriesPrimaryImageTag; - return window.connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options); + return ConnectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options); } } @@ -460,12 +459,12 @@ import '../../elements/emby-ratingbutton/emby-ratingbutton'; if (item.SeriesThumbImageTag) { options.tag = item.SeriesThumbImageTag; - return window.connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options); + return ConnectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options); } if (item.ParentThumbImageTag) { options.tag = item.ParentThumbImageTag; - return window.connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.ParentThumbItemId, options); + return ConnectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.ParentThumbItemId, options); } } @@ -482,12 +481,12 @@ import '../../elements/emby-ratingbutton/emby-ratingbutton'; if (item.ImageTags && item.ImageTags[options.type]) { options.tag = item.ImageTags[options.type]; - return window.connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.PrimaryImageItemId || item.Id, options); + return ConnectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.PrimaryImageItemId || item.Id, options); } if (item.AlbumId && item.AlbumPrimaryImageTag) { options.tag = item.AlbumPrimaryImageTag; - return window.connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.AlbumId, options); + return ConnectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.AlbumId, options); } return null; @@ -548,7 +547,7 @@ import '../../elements/emby-ratingbutton/emby-ratingbutton'; if (nowPlayingItem.Id) { if (isRefreshing) { - const apiClient = window.connectionManager.getApiClient(nowPlayingItem.ServerId); + const apiClient = ConnectionManager.getApiClient(nowPlayingItem.ServerId); apiClient.getItem(apiClient.getCurrentUserId(), nowPlayingItem.Id).then(function (item) { const userData = item.UserData || {}; const likes = userData.Likes == null ? '' : userData.Likes; diff --git a/src/components/packageManager.js b/src/components/packageManager.js index 0fd5bb750..3890577b2 100644 --- a/src/components/packageManager.js +++ b/src/components/packageManager.js @@ -1,5 +1,5 @@ import appSettings from '../scripts/settings/appSettings'; -import pluginManager from './pluginManager'; +import { pluginManager } from './pluginManager'; /* eslint-disable indent */ class PackageManager { diff --git a/src/components/playback/brightnessosd.js b/src/components/playback/brightnessosd.js index 935656e23..044cb6b75 100644 --- a/src/components/playback/brightnessosd.js +++ b/src/components/playback/brightnessosd.js @@ -1,5 +1,5 @@ -import events from 'jellyfin-apiclient'; -import playbackManager from './playbackmanager'; +import { events } from 'jellyfin-apiclient'; +import { playbackManager } from './playbackmanager'; import dom from '../../scripts/dom'; import browser from '../../scripts/browser'; import './iconosd.css'; diff --git a/src/components/playback/mediasession.js b/src/components/playback/mediasession.js index 52ef5c36e..6283b978f 100644 --- a/src/components/playback/mediasession.js +++ b/src/components/playback/mediasession.js @@ -1,7 +1,6 @@ -import playbackManager from '../playback/playbackmanager'; +import { playbackManager } from '../playback/playbackmanager'; import nowPlayingHelper from '../playback/nowplayinghelper'; -import events from 'jellyfin-apiclient'; -import connectionManager from 'jellyfin-apiclient'; +import { ConnectionManager, events } from 'jellyfin-apiclient'; /* eslint-disable indent */ // Reports media playback to the device for lock screen control @@ -16,16 +15,16 @@ import connectionManager from 'jellyfin-apiclient'; } else if (options.type === 'Primary' && item.SeriesPrimaryImageTag) { options.tag = item.SeriesPrimaryImageTag; - return window.connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options); + return ConnectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options); } else if (options.type === 'Thumb') { if (item.SeriesThumbImageTag) { options.tag = item.SeriesThumbImageTag; - return window.connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options); + return ConnectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options); } else if (item.ParentThumbImageTag) { options.tag = item.ParentThumbImageTag; - return window.connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.ParentThumbItemId, options); + return ConnectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.ParentThumbItemId, options); } } @@ -38,11 +37,11 @@ import connectionManager from 'jellyfin-apiclient'; if (item.ImageTags && item.ImageTags[options.type]) { options.tag = item.ImageTags[options.type]; - return window.connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.Id, options); + return ConnectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.Id, options); } else if (item.AlbumId && item.AlbumPrimaryImageTag) { options.tag = item.AlbumPrimaryImageTag; - return window.connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.AlbumId, options); + return ConnectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.AlbumId, options); } return null; diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index af60dd61d..f602a8e49 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -1,15 +1,14 @@ -import events from 'jellyfin-apiclient'; +import { ConnectionManager, events } from 'jellyfin-apiclient'; import datetime from '../../scripts/datetime'; import appSettings from '../../scripts/settings/appSettings'; import itemHelper from '../itemHelper'; -import pluginManager from '../pluginManager'; +import { pluginManager } from '../pluginManager'; import PlayQueueManager from './playqueuemanager'; import * as userSettings from '../../scripts/settings/userSettings'; import globalize from '../../scripts/globalize'; -import connectionManager from 'jellyfin-apiclient'; import loading from '../loading/loading'; -import appHost from '../apphost'; -import screenfull from 'screenfull'; +import { appHost } from '../apphost'; +import * as Screenfull from 'screenfull'; function enableLocalPlaylistManagement(player) { if (player.getPlaylist) { @@ -24,8 +23,8 @@ function enableLocalPlaylistManagement(player) { } function bindToFullscreenChange(player) { - if (screenfull.isEnabled) { - screenfull.on('change', function () { + if (Screenfull.isEnabled) { + Screenfull.on('change', function () { events.trigger(player, 'fullscreenchange'); }); } else { @@ -69,7 +68,7 @@ function reportPlayback(playbackManagerInstance, state, player, reportPlaylist, addPlaylistToPlaybackReport(playbackManagerInstance, info, player, serverId); } - const apiClient = window.connectionManager.getApiClient(serverId); + const apiClient = ConnectionManager.getApiClient(serverId); const reportPlaybackPromise = apiClient[method](info); // Notify that report has been sent reportPlaybackPromise.then(() => { @@ -106,7 +105,7 @@ function normalizeName(t) { } function getItemsForPlayback(serverId, query) { - const apiClient = window.connectionManager.getApiClient(serverId); + const apiClient = ConnectionManager.getApiClient(serverId); if (query.Ids && query.Ids.split(',').length === 1) { const itemId = query.Ids.split(','); @@ -870,7 +869,7 @@ class PlaybackManager { const promises = players.filter(displayPlayerIndividually).map(getPlayerTargets); return Promise.all(promises).then(function (responses) { - return window.connectionManager.currentApiClient().getCurrentUser().then(function (user) { + return ConnectionManager.currentApiClient().getCurrentUser().then(function (user) { const targets = []; targets.push({ @@ -1368,7 +1367,7 @@ class PlaybackManager { function getSavedMaxStreamingBitrate(apiClient, mediaType) { if (!apiClient) { // This should hopefully never happen - apiClient = window.connectionManager.currentApiClient(); + apiClient = ConnectionManager.currentApiClient(); } const endpointInfo = apiClient.getSavedEndpointInfo() || {}; @@ -1391,7 +1390,7 @@ class PlaybackManager { const mediaType = playerData.streamInfo ? playerData.streamInfo.mediaType : null; const currentItem = self.currentItem(player); - const apiClient = currentItem ? window.connectionManager.getApiClient(currentItem.ServerId) : window.connectionManager.currentApiClient(); + const apiClient = currentItem ? ConnectionManager.getApiClient(currentItem.ServerId) : ConnectionManager.currentApiClient(); return getSavedMaxStreamingBitrate(apiClient, mediaType); }; @@ -1405,7 +1404,7 @@ class PlaybackManager { const mediaType = playerData.streamInfo ? playerData.streamInfo.mediaType : null; const currentItem = self.currentItem(player); - const apiClient = currentItem ? window.connectionManager.getApiClient(currentItem.ServerId) : window.connectionManager.currentApiClient(); + const apiClient = currentItem ? ConnectionManager.getApiClient(currentItem.ServerId) : ConnectionManager.currentApiClient(); const endpointInfo = apiClient.getSavedEndpointInfo() || {}; return appSettings.enableAutomaticBitrateDetection(endpointInfo.IsInNetwork, mediaType); @@ -1417,7 +1416,7 @@ class PlaybackManager { return player.setMaxStreamingBitrate(options); } - const apiClient = window.connectionManager.getApiClient(self.currentItem(player).ServerId); + const apiClient = ConnectionManager.getApiClient(self.currentItem(player).ServerId); apiClient.getEndpointInfo().then(function (endpointInfo) { const playerData = getPlayerData(player); @@ -1448,12 +1447,12 @@ class PlaybackManager { return player.isFullscreen(); } - if (!screenfull.isEnabled) { + if (!Screenfull.isEnabled) { // iOS Safari return document.webkitIsFullScreen; } - return screenfull.isFullscreen; + return Screenfull.isFullscreen; }; self.toggleFullscreen = function (player) { @@ -1462,8 +1461,8 @@ class PlaybackManager { return player.toggleFullscreen(); } - if (screenfull.isEnabled) { - screenfull.toggle(); + if (Screenfull.isEnabled) { + Screenfull.toggle(); } else { // iOS Safari if (document.webkitIsFullScreen && document.webkitCancelFullscreen) { @@ -1679,7 +1678,7 @@ class PlaybackManager { const subtitleStreamIndex = params.SubtitleStreamIndex == null ? getPlayerData(player).subtitleStreamIndex : params.SubtitleStreamIndex; let currentMediaSource = self.currentMediaSource(player); - const apiClient = window.connectionManager.getApiClient(currentItem.ServerId); + const apiClient = ConnectionManager.getApiClient(currentItem.ServerId); if (ticks) { ticks = parseInt(ticks); @@ -1835,7 +1834,7 @@ class PlaybackManager { }, queryOptions)); } else if (firstItem.Type === 'Episode' && items.length === 1 && getPlayer(firstItem, options).supportsProgress !== false) { promise = new Promise(function (resolve, reject) { - const apiClient = window.connectionManager.getApiClient(firstItem.ServerId); + const apiClient = ConnectionManager.getApiClient(firstItem.ServerId); apiClient.getCurrentUser().then(function (user) { if (!user.Configuration.EnableNextEpisodeAutoPlay || !firstItem.SeriesId) { @@ -2066,7 +2065,7 @@ class PlaybackManager { return playOther(items, options, user); } - const apiClient = window.connectionManager.getApiClient(firstItem.ServerId); + const apiClient = ConnectionManager.getApiClient(firstItem.ServerId); return getIntros(firstItem, apiClient, options).then(function (introsResult) { const introItems = introsResult.Items; @@ -2129,14 +2128,14 @@ class PlaybackManager { const mediaType = item.MediaType; const onBitrateDetectionFailure = function () { - return playAfterBitrateDetect(getSavedMaxStreamingBitrate(window.connectionManager.getApiClient(item.ServerId), mediaType), item, playOptions, onPlaybackStartedFn); + return playAfterBitrateDetect(getSavedMaxStreamingBitrate(ConnectionManager.getApiClient(item.ServerId), mediaType), item, playOptions, onPlaybackStartedFn); }; if (!isServerItem(item) || itemHelper.isLocalItem(item)) { return onBitrateDetectionFailure(); } - const apiClient = window.connectionManager.getApiClient(item.ServerId); + const apiClient = ConnectionManager.getApiClient(item.ServerId); apiClient.getEndpointInfo().then(function (endpointInfo) { if ((mediaType === 'Video' || mediaType === 'Audio') && appSettings.enableAutomaticBitrateDetection(endpointInfo.IsInNetwork, mediaType)) { return apiClient.detectBitrate().then(function (bitrate) { @@ -2255,7 +2254,7 @@ class PlaybackManager { return Promise.all([promise, player.getDeviceProfile(item)]).then(function (responses) { const deviceProfile = responses[1]; - const apiClient = window.connectionManager.getApiClient(item.ServerId); + const apiClient = ConnectionManager.getApiClient(item.ServerId); const mediaSourceId = playOptions.mediaSourceId; const audioStreamIndex = playOptions.audioStreamIndex; @@ -2300,11 +2299,11 @@ class PlaybackManager { const startPosition = options.startPositionTicks || 0; const mediaType = options.mediaType || item.MediaType; const player = getPlayer(item, options); - const apiClient = window.connectionManager.getApiClient(item.ServerId); + const apiClient = ConnectionManager.getApiClient(item.ServerId); // Call this just to ensure the value is recorded, it is needed with getSavedMaxStreamingBitrate return apiClient.getEndpointInfo().then(function () { - const maxBitrate = getSavedMaxStreamingBitrate(window.connectionManager.getApiClient(item.ServerId), mediaType); + const maxBitrate = getSavedMaxStreamingBitrate(ConnectionManager.getApiClient(item.ServerId), mediaType); return player.getDeviceProfile(item).then(function (deviceProfile) { return getPlaybackMediaSource(player, apiClient, deviceProfile, maxBitrate, item, startPosition, options.mediaSourceId, options.audioStreamIndex, options.subtitleStreamIndex).then(function (mediaSource) { @@ -2320,11 +2319,11 @@ class PlaybackManager { const mediaType = options.mediaType || item.MediaType; // TODO: Remove the true forceLocalPlayer hack const player = getPlayer(item, options, true); - const apiClient = window.connectionManager.getApiClient(item.ServerId); + const apiClient = ConnectionManager.getApiClient(item.ServerId); // Call this just to ensure the value is recorded, it is needed with getSavedMaxStreamingBitrate return apiClient.getEndpointInfo().then(function () { - const maxBitrate = getSavedMaxStreamingBitrate(window.connectionManager.getApiClient(item.ServerId), mediaType); + const maxBitrate = getSavedMaxStreamingBitrate(ConnectionManager.getApiClient(item.ServerId), mediaType); return player.getDeviceProfile(item).then(function (deviceProfile) { return getPlaybackInfo(player, apiClient, item, deviceProfile, maxBitrate, startPosition, false, null, null, null, null).then(function (playbackInfoResult) { @@ -2708,7 +2707,7 @@ class PlaybackManager { const queueDirectToPlayer = player && !enableLocalPlaylistManagement(player); if (queueDirectToPlayer) { - const apiClient = window.connectionManager.getApiClient(items[0].ServerId); + const apiClient = ConnectionManager.getApiClient(items[0].ServerId); player.getDeviceProfile(items[0]).then(function (profile) { setStreamUrls(items, profile, self.getMaxStreamingBitrate(player), apiClient, 0).then(function () { @@ -3158,13 +3157,13 @@ class PlaybackManager { streamInfo.lastMediaInfoQuery = new Date().getTime(); - const apiClient = window.connectionManager.getApiClient(serverId); + const apiClient = ConnectionManager.getApiClient(serverId); if (!apiClient.isMinServerVersion('3.2.70.7')) { return; } - window.connectionManager.getApiClient(serverId).getLiveStreamMediaInfo(liveStreamId).then(function (info) { + ConnectionManager.getApiClient(serverId).getLiveStreamMediaInfo(liveStreamId).then(function (info) { mediaSource.MediaStreams = info.MediaStreams; events.trigger(player, 'mediastreamschange'); }, function () { @@ -3221,7 +3220,7 @@ class PlaybackManager { return Promise.reject(); } - const apiClient = window.connectionManager.getApiClient(nextItem.item.ServerId); + const apiClient = ConnectionManager.getApiClient(nextItem.item.ServerId); return apiClient.getItem(apiClient.getCurrentUserId(), nextItem.item.Id); } @@ -3362,7 +3361,7 @@ class PlaybackManager { return player.playTrailers(item); } - const apiClient = window.connectionManager.getApiClient(item.ServerId); + const apiClient = ConnectionManager.getApiClient(item.ServerId); const instance = this; @@ -3394,7 +3393,7 @@ class PlaybackManager { } getSubtitleUrl(textStream, serverId) { - const apiClient = window.connectionManager.getApiClient(serverId); + const apiClient = ConnectionManager.getApiClient(serverId); return !textStream.IsExternalUrl ? apiClient.getUrl(textStream.DeliveryUrl) : textStream.DeliveryUrl; } @@ -3474,7 +3473,7 @@ class PlaybackManager { return player.instantMix(item); } - const apiClient = window.connectionManager.getApiClient(item.ServerId); + const apiClient = ConnectionManager.getApiClient(item.ServerId); const options = {}; options.UserId = apiClient.getCurrentUserId(); @@ -3758,7 +3757,7 @@ class PlaybackManager { } } -const playbackManager = new PlayQueueManager(); +export const playbackManager = new PlaybackManager(); window.addEventListener('beforeunload', function () { try { @@ -3767,5 +3766,3 @@ window.addEventListener('beforeunload', function () { console.error('error in onAppClose: ' + err); } }); - -export default playbackManager; diff --git a/src/components/playback/playbackorientation.js b/src/components/playback/playbackorientation.js index 6c44d5bbc..79776abd0 100644 --- a/src/components/playback/playbackorientation.js +++ b/src/components/playback/playbackorientation.js @@ -1,7 +1,7 @@ -import playbackManager from './playbackmanager'; +import { playbackManager } from './playbackmanager'; import layoutManager from '../layoutManager'; -import events from 'jellyfin-apiclient'; +import { events } from 'jellyfin-apiclient'; let orientationLocked; diff --git a/src/components/playback/playerSelectionMenu.js b/src/components/playback/playerSelectionMenu.js index 1bd909025..acc6e2481 100644 --- a/src/components/playback/playerSelectionMenu.js +++ b/src/components/playback/playerSelectionMenu.js @@ -1,11 +1,11 @@ import appSettings from '../../scripts/settings/appSettings'; -import events from 'jellyfin-apiclient'; +import { events } from 'jellyfin-apiclient'; import browser from '../../scripts/browser'; import loading from '../loading/loading'; -import playbackManager from '../playback/playbackmanager'; -import appRouter from '../appRouter'; +import { playbackManager } from '../playback/playbackmanager'; +import { appRouter } from '../appRouter'; import globalize from '../../scripts/globalize'; -import appHost from '../apphost'; +import { appHost } from '../apphost'; import { enable, isEnabled, supported } from '../../scripts/autocast'; function mirrorItem(info, player) { diff --git a/src/components/playback/playersettingsmenu.js b/src/components/playback/playersettingsmenu.js index acec83091..510748949 100644 --- a/src/components/playback/playersettingsmenu.js +++ b/src/components/playback/playersettingsmenu.js @@ -1,6 +1,6 @@ -import connectionManager from 'jellyfin-apiclient'; +import { ConnectionManager } from 'jellyfin-apiclient'; import actionsheet from '../actionSheet/actionSheet'; -import playbackManager from '../playback/playbackmanager'; +import { playbackManager } from '../playback/playbackmanager'; import globalize from '../../scripts/globalize'; import qualityoptions from '../qualityOptions'; @@ -251,7 +251,7 @@ export function show(options) { return showWithUser(options, player, null); } - const apiClient = window.connectionManager.getApiClient(currentItem.ServerId); + var apiClient = ConnectionManager.getApiClient(currentItem.ServerId); return apiClient.getCurrentUser().then(function (user) { return showWithUser(options, player, user); }); diff --git a/src/components/playback/remotecontrolautoplay.js b/src/components/playback/remotecontrolautoplay.js index 532a71237..8e8e8797f 100644 --- a/src/components/playback/remotecontrolautoplay.js +++ b/src/components/playback/remotecontrolautoplay.js @@ -1,5 +1,5 @@ -import events from 'jellyfin-apiclient'; -import playbackManager from '../playback/playbackmanager'; +import { events } from 'jellyfin-apiclient'; +import { playbackManager } from '../playback/playbackmanager'; function transferPlayback(oldPlayer, newPlayer) { const state = playbackManager.getPlayerState(oldPlayer); diff --git a/src/components/playback/volumeosd.js b/src/components/playback/volumeosd.js index 9e8401783..7096c246a 100644 --- a/src/components/playback/volumeosd.js +++ b/src/components/playback/volumeosd.js @@ -1,6 +1,6 @@ -import events from 'jellyfin-apiclient'; -import playbackManager from './playbackmanager'; +import { events } from 'jellyfin-apiclient'; +import { playbackManager } from './playbackmanager'; import dom from '../../scripts/dom'; import browser from '../../scripts/browser'; import './iconosd.css'; diff --git a/src/components/playbackSettings/playbackSettings.js b/src/components/playbackSettings/playbackSettings.js index 4d123bb73..aefa69dbc 100644 --- a/src/components/playbackSettings/playbackSettings.js +++ b/src/components/playbackSettings/playbackSettings.js @@ -1,12 +1,11 @@ import browser from '../../scripts/browser'; import appSettings from '../../scripts/settings/appSettings'; -import appHost from '../apphost'; +import { appHost } from '../apphost'; import focusManager from '../focusManager'; import qualityoptions from '../qualityOptions'; import globalize from '../../scripts/globalize'; import loading from '../loading/loading'; -import connectionManager from 'jellyfin-apiclient'; -import events from 'jellyfin-apiclient'; +import { ConnectionManager, events } from 'jellyfin-apiclient'; import '../../elements/emby-select/emby-select'; import '../../elements/emby-checkbox/emby-checkbox'; @@ -258,7 +257,7 @@ import '../../elements/emby-checkbox/emby-checkbox'; function onSubmit(e) { const self = this; - const apiClient = window.connectionManager.getApiClient(self.options.serverId); + const apiClient = ConnectionManager.getApiClient(self.options.serverId); const userId = self.options.userId; const userSettings = self.options.userSettings; @@ -305,7 +304,7 @@ import '../../elements/emby-checkbox/emby-checkbox'; loading.show(); const userId = self.options.userId; - const apiClient = window.connectionManager.getApiClient(self.options.serverId); + const apiClient = ConnectionManager.getApiClient(self.options.serverId); const userSettings = self.options.userSettings; apiClient.getUser(userId).then(user => { diff --git a/src/components/playerstats/playerstats.js b/src/components/playerstats/playerstats.js index 59f885f32..66d87aad9 100644 --- a/src/components/playerstats/playerstats.js +++ b/src/components/playerstats/playerstats.js @@ -1,9 +1,8 @@ -import connectionManager from 'jellyfin-apiclient'; -import events from 'jellyfin-apiclient'; +import { ConnectionManager, events } from 'jellyfin-apiclient'; import '../../elements/emby-button/paper-icon-button-light'; import globalize from '../../scripts/globalize'; import layoutManager from '../layoutManager'; -import playbackManager from '../playback/playbackmanager'; +import { playbackManager } from '../playback/playbackmanager'; import playMethodHelper from '../playback/playmethodhelper'; import syncPlayManager from '../syncPlay/syncPlayManager'; import './playerstats.css'; @@ -95,7 +94,7 @@ import './playerstats.css'; return Promise.resolve(instance.lastSession); } - const apiClient = window.connectionManager.getApiClient(playbackManager.currentItem(player).ServerId); + const apiClient = ConnectionManager.getApiClient(playbackManager.currentItem(player).ServerId); return apiClient.getSessions({ deviceId: apiClient.deviceId() @@ -414,7 +413,7 @@ import './playerstats.css'; name: 'Original Media Info' }); - const apiClient = window.connectionManager.getApiClient(playbackManager.currentItem(player).ServerId); + var apiClient = ConnectionManager.getApiClient(playbackManager.currentItem(player).ServerId); if (syncPlayManager.isSyncPlayEnabled() && apiClient.isMinServerVersion('10.6.0')) { categories.push({ stats: getSyncPlayStats(), diff --git a/src/components/playlisteditor/playlisteditor.js b/src/components/playlisteditor/playlisteditor.js index a3221ff3c..340fe5a99 100644 --- a/src/components/playlisteditor/playlisteditor.js +++ b/src/components/playlisteditor/playlisteditor.js @@ -2,10 +2,10 @@ import dom from '../../scripts/dom'; import dialogHelper from '../dialogHelper/dialogHelper'; import loading from '../loading/loading'; import layoutManager from '../layoutManager'; -import playbackManager from '../playback/playbackmanager'; -import connectionManager from 'jellyfin-apiclient'; +import { playbackManager } from '../playback/playbackmanager'; +import { ConnectionManager } from 'jellyfin-apiclient'; import * as userSettings from '../../scripts/settings/userSettings'; -import appRouter from '../appRouter'; +import { appRouter } from '../appRouter'; import globalize from '../../scripts/globalize'; import '../../elements/emby-button/emby-button'; import '../../elements/emby-input/emby-input'; @@ -22,7 +22,7 @@ import '../formdialog.css'; const panel = dom.parentWithClass(this, 'dialog'); const playlistId = panel.querySelector('#selectPlaylistToAddTo').value; - const apiClient = window.connectionManager.getApiClient(currentServerId); + const apiClient = ConnectionManager.getApiClient(currentServerId); if (playlistId) { userSettings.set('playlisteditor-lastplaylistid', playlistId); @@ -113,7 +113,7 @@ import '../formdialog.css'; EnableTotalRecordCount: false }; - const apiClient = window.connectionManager.getApiClient(currentServerId); + const apiClient = ConnectionManager.getApiClient(currentServerId); apiClient.getItems(apiClient.getCurrentUserId(), options).then(result => { let html = ''; diff --git a/src/components/playmenu.js b/src/components/playmenu.js index 8831b4d7b..412c5375e 100644 --- a/src/components/playmenu.js +++ b/src/components/playmenu.js @@ -1,6 +1,6 @@ import actionsheet from './actionSheet/actionSheet'; import datetime from '../scripts/datetime'; -import playbackManager from './playback/playbackmanager'; +import { playbackManager } from './playback/playbackmanager'; import globalize from '../scripts/globalize'; export function show(options) { diff --git a/src/components/pluginManager.js b/src/components/pluginManager.js index 116281c48..e794a2c98 100644 --- a/src/components/pluginManager.js +++ b/src/components/pluginManager.js @@ -1,4 +1,4 @@ -import events from 'jellyfin-apiclient'; +import { events } from 'jellyfin-apiclient'; import globalize from '../scripts/globalize'; /* eslint-disable indent */ @@ -41,7 +41,7 @@ import globalize from '../scripts/globalize'; return Promise.resolve(plugin); } else { return new Promise((resolve, reject) => { - this.#loadStrings(plugin) + PluginManager.loadStrings(plugin) .then(function () { resolve(plugin); }) @@ -52,39 +52,35 @@ import globalize from '../scripts/globalize'; loadPlugin(pluginSpec) { if (typeof pluginSpec === 'string') { - console.debug('Loading plugin (via deprecated requirejs method): ' + pluginSpec); + console.debug('Loading plugin (via dynamic import): ' + pluginSpec); - return new Promise((resolve, reject) => { - require([pluginSpec], (pluginFactory) => { - const plugin = pluginFactory.default ? new pluginFactory.default() : new pluginFactory(); + import(/* webpackChunkName: "[request]" */ `../plugins/${pluginSpec}`).then((plugin) => { + // See if it's already installed + const existing = this.plugins.filter(function (p) { + return p.id === plugin.id; + })[0]; - // See if it's already installed - const existing = this.pluginsList.filter(function (p) { - return p.id === plugin.id; - })[0]; + if (existing) { + return Promise.resolve(pluginSpec); + } - if (existing) { - resolve(pluginSpec); - } + plugin.installUrl = pluginSpec; - plugin.installUrl = pluginSpec; + const separatorIndex = Math.max(pluginSpec.lastIndexOf('/'), pluginSpec.lastIndexOf('\\')); + plugin.baseUrl = pluginSpec.substring(0, separatorIndex); - const separatorIndex = Math.max(pluginSpec.lastIndexOf('/'), pluginSpec.lastIndexOf('\\')); - plugin.baseUrl = pluginSpec.substring(0, separatorIndex); + const paths = {}; + paths[plugin.id] = plugin.baseUrl; - const paths = {}; - paths[plugin.id] = plugin.baseUrl; - - requirejs.config({ - waitSeconds: 0, - paths: paths - }); - - this.#registerPlugin(plugin).then(resolve).catch(reject); + requirejs.config({ + waitSeconds: 0, + paths: paths }); + + this.#registerPlugin(plugin).then(Promise.resolve).catch(Promise.reject); }); } else if (pluginSpec.then) { - return pluginSpec.then(pluginBuilder => { + return pluginSpec.then(({ default: pluginBuilder }) => { return pluginBuilder(); }).then((plugin) => { console.debug(`Plugin loaded: ${plugin.id}`); @@ -148,4 +144,4 @@ import globalize from '../scripts/globalize'; /* eslint-enable indent */ -export default new PluginManager(); +export const pluginManager = new PluginManager(); diff --git a/src/components/recordingcreator/recordingbutton.js b/src/components/recordingcreator/recordingbutton.js index a898cf4a5..41195961d 100644 --- a/src/components/recordingcreator/recordingbutton.js +++ b/src/components/recordingcreator/recordingbutton.js @@ -1,4 +1,4 @@ -import connectionManager from 'jellyfin-apiclient'; +import { ConnectionManager } from 'jellyfin-apiclient'; import dom from '../../scripts/dom'; import recordingHelper from './recordinghelper'; import '../../elements/emby-button/paper-icon-button-light'; @@ -53,7 +53,7 @@ class RecordingButton { } refresh(serverId, itemId) { - const apiClient = window.connectionManager.getApiClient(serverId); + const apiClient = ConnectionManager.getApiClient(serverId); const self = this; apiClient.getItem(apiClient.getCurrentUserId(), itemId).then(function (item) { self.refreshItem(item); diff --git a/src/components/recordingcreator/recordingcreator.js b/src/components/recordingcreator/recordingcreator.js index fe5b506c9..06d17de75 100644 --- a/src/components/recordingcreator/recordingcreator.js +++ b/src/components/recordingcreator/recordingcreator.js @@ -2,13 +2,12 @@ import dialogHelper from '../dialogHelper/dialogHelper'; import globalize from '../../scripts/globalize'; import layoutManager from '../layoutManager'; import mediaInfo from '../mediainfo/mediainfo'; -import connectionManager from 'jellyfin-apiclient'; import loading from '../loading/loading'; import scrollHelper from '../../scripts/scrollHelper'; import datetime from '../../scripts/datetime'; import imageLoader from '../images/imageLoader'; import recordingFields from './recordingfields'; -import events from 'jellyfin-apiclient'; +import { ConnectionManager, events } from 'jellyfin-apiclient'; import '../../elements/emby-button/emby-button'; import '../../elements/emby-button/paper-icon-button-light'; import '../../elements/emby-checkbox/emby-checkbox'; @@ -102,7 +101,7 @@ function renderRecording(context, defaultTimer, program, apiClient, refreshRecor function reload(context, programId, serverId, refreshRecordingStateOnly) { loading.show(); - const apiClient = window.connectionManager.getApiClient(serverId); + const apiClient = ConnectionManager.getApiClient(serverId); const promise1 = apiClient.getNewLiveTvTimerDefaults({ programId: programId }); const promise2 = apiClient.getLiveTvProgram(programId, apiClient.getCurrentUserId()); @@ -117,8 +116,8 @@ function reload(context, programId, serverId, refreshRecordingStateOnly) { function executeCloseAction(action, programId, serverId) { if (action === 'play') { - import('../playback/playbackmanager').then(({ default: playbackManager }) => { - const apiClient = connectionManager.getApiClient(serverId); + import('../playback/playbackmanager').then((playbackManager) => { + const apiClient = ConnectionManager.getApiClient(serverId); apiClient.getLiveTvProgram(programId, apiClient.getCurrentUserId()).then(function (item) { playbackManager.play({ diff --git a/src/components/recordingcreator/recordingeditor.js b/src/components/recordingcreator/recordingeditor.js index 6c5a380d1..068fc60a4 100644 --- a/src/components/recordingcreator/recordingeditor.js +++ b/src/components/recordingcreator/recordingeditor.js @@ -2,7 +2,7 @@ import dialogHelper from '../dialogHelper/dialogHelper'; import globalize from '../../scripts/globalize'; import layoutManager from '../layoutManager'; -import connectionManager from 'jellyfin-apiclient'; +import { ConnectionManager } from 'jellyfin-apiclient'; import loading from '../loading/loading'; import scrollHelper from '../../scripts/scrollHelper'; import '../../assets/css/scrollstyles.css'; @@ -42,7 +42,7 @@ function closeDialog(isDeleted) { function onSubmit(e) { const form = this; - const apiClient = window.connectionManager.getApiClient(currentServerId); + const apiClient = ConnectionManager.getApiClient(currentServerId); apiClient.getLiveTvTimer(currentItemId).then(function (item) { item.PrePaddingSeconds = form.querySelector('#txtPrePaddingMinutes').value * 60; @@ -62,7 +62,7 @@ function init(context) { }); context.querySelector('.btnCancelRecording').addEventListener('click', function () { - const apiClient = window.connectionManager.getApiClient(currentServerId); + const apiClient = ConnectionManager.getApiClient(currentServerId); deleteTimer(apiClient, currentItemId).then(function () { closeDialog(true); @@ -76,7 +76,7 @@ function reload(context, id) { loading.show(); currentItemId = id; - const apiClient = window.connectionManager.getApiClient(currentServerId); + const apiClient = ConnectionManager.getApiClient(currentServerId); apiClient.getLiveTvTimer(id).then(function (result) { renderTimer(context, result, apiClient); loading.hide(); diff --git a/src/components/recordingcreator/recordingfields.js b/src/components/recordingcreator/recordingfields.js index 39e549ee8..ad14ff273 100644 --- a/src/components/recordingcreator/recordingfields.js +++ b/src/components/recordingcreator/recordingfields.js @@ -1,10 +1,9 @@ import globalize from '../../scripts/globalize'; -import connectionManager from 'jellyfin-apiclient'; +import { ConnectionManager, events } from 'jellyfin-apiclient'; import serverNotifications from '../../scripts/serverNotifications'; import loading from '../loading/loading'; import dom from '../../scripts/dom'; import recordingHelper from './recordinghelper'; -import events from 'jellyfin-apiclient'; import '../../elements/emby-button/emby-button'; import '../../elements/emby-button/paper-icon-button-light'; import './recordingfields.css'; @@ -46,7 +45,7 @@ function loadData(parent, program, apiClient) { function fetchData(instance) { const options = instance.options; - const apiClient = window.connectionManager.getApiClient(options.serverId); + const apiClient = ConnectionManager.getApiClient(options.serverId); options.parent.querySelector('.recordingFields').classList.remove('hide'); return apiClient.getLiveTvProgram(options.programId, apiClient.getCurrentUserId()).then(function (program) { @@ -197,7 +196,7 @@ function onRecordChange(e) { const self = this; const options = this.options; - const apiClient = window.connectionManager.getApiClient(options.serverId); + const apiClient = ConnectionManager.getApiClient(options.serverId); const button = dom.parentWithTag(e.target, 'BUTTON'); const isChecked = !button.querySelector('.material-icons').classList.contains('recordingIcon-active'); @@ -236,7 +235,7 @@ function onRecordSeriesChange(e) { const self = this; const options = this.options; - const apiClient = window.connectionManager.getApiClient(options.serverId); + const apiClient = ConnectionManager.getApiClient(options.serverId); const button = dom.parentWithTag(e.target, 'BUTTON'); const isChecked = !button.querySelector('.material-icons').classList.contains('recordingIcon-active'); diff --git a/src/components/recordingcreator/recordinghelper.js b/src/components/recordingcreator/recordinghelper.js index 8ba1c4dfe..9ff64f681 100644 --- a/src/components/recordingcreator/recordinghelper.js +++ b/src/components/recordingcreator/recordinghelper.js @@ -1,6 +1,6 @@ import globalize from '../../scripts/globalize'; import loading from '../loading/loading'; -import connectionManager from 'jellyfin-apiclient'; +import { ConnectionManager } from 'jellyfin-apiclient'; /*eslint prefer-const: "error"*/ @@ -40,7 +40,7 @@ function cancelTimerWithConfirmation(timerId, serverId) { }).then(function () { loading.show(); - const apiClient = window.connectionManager.getApiClient(serverId); + const apiClient = ConnectionManager.getApiClient(serverId); cancelTimer(apiClient, timerId, true).then(resolve, reject); }, reject); }); @@ -60,7 +60,7 @@ function cancelSeriesTimerWithConfirmation(timerId, serverId) { }).then(function () { loading.show(); - const apiClient = window.connectionManager.getApiClient(serverId); + const apiClient = ConnectionManager.getApiClient(serverId); apiClient.cancelLiveTvSeriesTimer(timerId).then(function () { import('../toast/toast').then((toast) => { toast(globalize.translate('SeriesCancelled')); @@ -141,7 +141,7 @@ function showMultiCancellationPrompt(serverId, programId, timerId, timerStatus, buttons: items }).then(function (result) { - const apiClient = window.connectionManager.getApiClient(serverId); + const apiClient = ConnectionManager.getApiClient(serverId); if (result === 'canceltimer') { loading.show(); @@ -167,7 +167,7 @@ function showMultiCancellationPrompt(serverId, programId, timerId, timerStatus, } function toggleRecording(serverId, programId, timerId, timerStatus, seriesTimerId) { - const apiClient = window.connectionManager.getApiClient(serverId); + const apiClient = ConnectionManager.getApiClient(serverId); const hasTimer = timerId && timerStatus !== 'Cancelled'; if (seriesTimerId && hasTimer) { // cancel diff --git a/src/components/recordingcreator/seriesrecordingeditor.js b/src/components/recordingcreator/seriesrecordingeditor.js index 6b887280e..282794bb3 100644 --- a/src/components/recordingcreator/seriesrecordingeditor.js +++ b/src/components/recordingcreator/seriesrecordingeditor.js @@ -1,7 +1,7 @@ import dialogHelper from '../dialogHelper/dialogHelper'; import globalize from '../../scripts/globalize'; import layoutManager from '../layoutManager'; -import connectionManager from 'jellyfin-apiclient'; +import { ConnectionManager } from 'jellyfin-apiclient'; import loading from '../loading/loading'; import scrollHelper from '../../scripts/scrollHelper'; import datetime from '../../scripts/datetime'; @@ -64,7 +64,7 @@ function closeDialog(isDeleted) { function onSubmit(e) { const form = this; - const apiClient = window.connectionManager.getApiClient(currentServerId); + const apiClient = ConnectionManager.getApiClient(currentServerId); apiClient.getLiveTvSeriesTimer(currentItemId).then(function (item) { item.PrePaddingSeconds = form.querySelector('#txtPrePaddingMinutes').value * 60; @@ -92,7 +92,7 @@ function init(context) { }); context.querySelector('.btnCancelRecording').addEventListener('click', function () { - const apiClient = window.connectionManager.getApiClient(currentServerId); + const apiClient = ConnectionManager.getApiClient(currentServerId); deleteTimer(apiClient, currentItemId).then(function () { closeDialog(true); }); @@ -102,7 +102,7 @@ function init(context) { } function reload(context, id) { - const apiClient = window.connectionManager.getApiClient(currentServerId); + const apiClient = ConnectionManager.getApiClient(currentServerId); loading.show(); if (typeof id === 'string') { diff --git a/src/components/refreshdialog/refreshdialog.js b/src/components/refreshdialog/refreshdialog.js index 1338e4b72..b6ea07f46 100644 --- a/src/components/refreshdialog/refreshdialog.js +++ b/src/components/refreshdialog/refreshdialog.js @@ -2,7 +2,7 @@ import dom from '../../scripts/dom'; import dialogHelper from '../dialogHelper/dialogHelper'; import loading from '../loading/loading'; import layoutManager from '../layoutManager'; -import connectionManager from 'jellyfin-apiclient'; +import { ConnectionManager } from 'jellyfin-apiclient'; import globalize from '../../scripts/globalize'; import '../../elements/emby-input/emby-input'; import '../../elements/emby-button/emby-button'; @@ -66,7 +66,7 @@ function onSubmit(e) { const dlg = dom.parentWithClass(e.target, 'dialog'); const options = instance.options; - const apiClient = window.connectionManager.getApiClient(options.serverId); + const apiClient = ConnectionManager.getApiClient(options.serverId); const replaceAllMetadata = dlg.querySelector('#selectMetadataRefreshMode').value === 'all'; diff --git a/src/components/remotecontrol/remotecontrol.js b/src/components/remotecontrol/remotecontrol.js index eb897d1fe..d3410274e 100644 --- a/src/components/remotecontrol/remotecontrol.js +++ b/src/components/remotecontrol/remotecontrol.js @@ -2,11 +2,10 @@ import datetime from '../../scripts/datetime'; import backdrop from '../backdrop/backdrop'; import listView from '../listview/listview'; import imageLoader from '../images/imageLoader'; -import playbackManager from '../playback/playbackmanager'; +import { playbackManager } from '../playback/playbackmanager'; import nowPlayingHelper from '../playback/nowplayinghelper'; -import events from 'jellyfin-apiclient'; -import connectionManager from 'jellyfin-apiclient'; -import appHost from '../apphost'; +import { ConnectionManager, events } from 'jellyfin-apiclient'; +import { appHost } from '../apphost'; import globalize from '../../scripts/globalize'; import layoutManager from '../layoutManager'; import * as userSettings from '../../scripts/settings/userSettings'; @@ -96,18 +95,18 @@ function seriesImageUrl(item, options) { options.type = options.type || 'Primary'; if (options.type === 'Primary' && item.SeriesPrimaryImageTag) { options.tag = item.SeriesPrimaryImageTag; - return window.connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options); + return ConnectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options); } if (options.type === 'Thumb') { if (item.SeriesThumbImageTag) { options.tag = item.SeriesThumbImageTag; - return window.connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options); + return ConnectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options); } if (item.ParentThumbImageTag) { options.tag = item.ParentThumbImageTag; - return window.connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.ParentThumbItemId, options); + return ConnectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.ParentThumbItemId, options); } } @@ -120,12 +119,12 @@ function imageUrl(item, options) { if (item.ImageTags && item.ImageTags[options.type]) { options.tag = item.ImageTags[options.type]; - return window.connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.PrimaryImageItemId || item.Id, options); + return ConnectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.PrimaryImageItemId || item.Id, options); } if (item.AlbumId && item.AlbumPrimaryImageTag) { options.tag = item.AlbumPrimaryImageTag; - return window.connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.AlbumId, options); + return ConnectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.AlbumId, options); } return null; @@ -216,7 +215,7 @@ function updateNowPlayingInfo(context, state, serverId) { openAlbum: false, positionTo: contextButton }; - const apiClient = window.connectionManager.getApiClient(item.ServerId); + const apiClient = ConnectionManager.getApiClient(item.ServerId); apiClient.getItem(apiClient.getCurrentUserId(), item.Id).then(function (fullItem) { apiClient.getCurrentUser().then(function (user) { contextButton.addEventListener('click', function () { diff --git a/src/components/search/searchfields.js b/src/components/search/searchfields.js index 3b985c05a..01cd504fd 100644 --- a/src/components/search/searchfields.js +++ b/src/components/search/searchfields.js @@ -1,6 +1,6 @@ import layoutManager from '../layoutManager'; import globalize from '../../scripts/globalize'; -import events from 'jellyfin-apiclient'; +import { events } from 'jellyfin-apiclient'; import browser from '../../scripts/browser'; import AlphaPicker from '../alphaPicker/alphaPicker'; import '../../elements/emby-input/emby-input'; diff --git a/src/components/search/searchresults.js b/src/components/search/searchresults.js index 9fe1e7b60..a73c489d9 100644 --- a/src/components/search/searchresults.js +++ b/src/components/search/searchresults.js @@ -1,8 +1,8 @@ import layoutManager from '../layoutManager'; import globalize from '../../scripts/globalize'; -import connectionManager from 'jellyfin-apiclient'; +import { ConnectionManager } from 'jellyfin-apiclient'; import cardBuilder from '../cardbuilder/cardBuilder'; -import appRouter from '../appRouter'; +import { appRouter } from '../appRouter'; import '../../elements/emby-scroller/emby-scroller'; import '../../elements/emby-itemscontainer/emby-itemscontainer'; import '../../elements/emby-button/emby-button'; @@ -606,7 +606,7 @@ class SearchResults { embed(options.element, this, options); } search(value) { - const apiClient = window.connectionManager.getApiClient(this.options.serverId); + const apiClient = ConnectionManager.getApiClient(this.options.serverId); search(this, apiClient, this.options.element, value); } diff --git a/src/components/shortcuts.js b/src/components/shortcuts.js index 2f83a342f..3472d7a72 100644 --- a/src/components/shortcuts.js +++ b/src/components/shortcuts.js @@ -5,10 +5,10 @@ * @module components/shortcuts */ -import playbackManager from './playback/playbackmanager'; +import { playbackManager } from './playback/playbackmanager'; import inputManager from '../scripts/inputManager'; -import connectionManager from 'jellyfin-apiclient'; -import appRouter from './appRouter'; +import { ConnectionManager } from 'jellyfin-apiclient'; +import { appRouter } from './appRouter'; import globalize from '../scripts/globalize'; import dom from '../scripts/dom'; import recordingHelper from './recordingcreator/recordinghelper'; @@ -82,7 +82,7 @@ import recordingHelper from './recordingcreator/recordinghelper'; const id = button.getAttribute('data-id'); const type = button.getAttribute('data-type'); - const apiClient = window.connectionManager.getApiClient(serverId); + const apiClient = ConnectionManager.getApiClient(serverId); if (type === 'Timer') { return apiClient.getLiveTvTimer(id); @@ -112,7 +112,7 @@ import recordingHelper from './recordingcreator/recordinghelper'; } import('./itemContextMenu').then((itemContextMenu) => { - window.connectionManager.getApiClient(item.ServerId).getCurrentUser().then(user => { + ConnectionManager.getApiClient(item.ServerId).getCurrentUser().then(user => { itemContextMenu.show(Object.assign({ item: item, play: true, @@ -281,7 +281,7 @@ import recordingHelper from './recordingcreator/recordinghelper'; } function playTrailer(item) { - const apiClient = window.connectionManager.getApiClient(item.ServerId); + const apiClient = ConnectionManager.getApiClient(item.ServerId); apiClient.getLocalTrailers(apiClient.getCurrentUserId(), item.Id).then(trailers => { playbackManager.play({ items: trailers }); @@ -289,7 +289,7 @@ import recordingHelper from './recordingcreator/recordinghelper'; } function editItem(item, serverId) { - const apiClient = window.connectionManager.getApiClient(serverId); + const apiClient = ConnectionManager.getApiClient(serverId); return new Promise((resolve, reject) => { const serverId = apiClient.serverInfo().Id; diff --git a/src/components/slideshow/slideshow.js b/src/components/slideshow/slideshow.js index a33e06b27..4b8a4929b 100644 --- a/src/components/slideshow/slideshow.js +++ b/src/components/slideshow/slideshow.js @@ -4,11 +4,11 @@ */ import dialogHelper from '../dialogHelper/dialogHelper'; import inputManager from '../../scripts/inputManager'; -import connectionManager from 'jellyfin-apiclient'; +import { ConnectionManager } from 'jellyfin-apiclient'; import layoutManager from '../layoutManager'; import focusManager from '../focusManager'; import browser from '../../scripts/browser'; -import appHost from '../apphost'; +import { appHost } from '../apphost'; import dom from '../../scripts/dom'; import './style.css'; import 'material-design-icons-iconfont'; @@ -85,7 +85,7 @@ function getBackdropImageUrl(item, options, apiClient) { * @returns {string} URL of the item's image. */ function getImgUrl(item, user) { - const apiClient = window.connectionManager.getApiClient(item.ServerId); + const apiClient = ConnectionManager.getApiClient(item.ServerId); const imageOptions = {}; if (item.BackdropImageTags && item.BackdropImageTags.length) { diff --git a/src/components/subtitleeditor/subtitleeditor.js b/src/components/subtitleeditor/subtitleeditor.js index 6a53b4f54..c3c174ea8 100644 --- a/src/components/subtitleeditor/subtitleeditor.js +++ b/src/components/subtitleeditor/subtitleeditor.js @@ -3,7 +3,7 @@ import dialogHelper from '../dialogHelper/dialogHelper'; import layoutManager from '../layoutManager'; import globalize from '../../scripts/globalize'; import * as userSettings from '../../scripts/settings/userSettings'; -import connectionManager from 'jellyfin-apiclient'; +import { ConnectionManager } from 'jellyfin-apiclient'; import loading from '../loading/loading'; import focusManager from '../focusManager'; import dom from '../../scripts/dom'; @@ -22,7 +22,7 @@ let hasChanges; function downloadRemoteSubtitles(context, id) { const url = 'Items/' + currentItem.Id + '/RemoteSearch/Subtitles/' + id; - const apiClient = window.connectionManager.getApiClient(currentItem.ServerId); + const apiClient = ConnectionManager.getApiClient(currentItem.ServerId); apiClient.ajax({ type: 'POST', @@ -56,7 +56,7 @@ function deleteLocalSubtitle(context, index) { const itemId = currentItem.Id; const url = 'Videos/' + itemId + '/Subtitles/' + index; - const apiClient = window.connectionManager.getApiClient(currentItem.ServerId); + const apiClient = ConnectionManager.getApiClient(currentItem.ServerId); apiClient.ajax({ @@ -244,7 +244,7 @@ function searchForSubtitles(context, language) { loading.show(); - const apiClient = window.connectionManager.getApiClient(currentItem.ServerId); + const apiClient = ConnectionManager.getApiClient(currentItem.ServerId); const url = apiClient.getUrl('Items/' + currentItem.Id + '/RemoteSearch/Subtitles/' + language); apiClient.getJSON(url).then(function (results) { @@ -357,7 +357,7 @@ function centerFocus(elem, horiz, on) { function showEditorInternal(itemId, serverId, template) { hasChanges = false; - const apiClient = window.connectionManager.getApiClient(serverId); + const apiClient = ConnectionManager.getApiClient(serverId); return apiClient.getItem(apiClient.getCurrentUserId(), itemId).then(function (item) { const dialogOptions = { removeOnClose: true, diff --git a/src/components/subtitlesettings/subtitlesettings.js b/src/components/subtitlesettings/subtitlesettings.js index 3462d9542..082781d8b 100644 --- a/src/components/subtitlesettings/subtitlesettings.js +++ b/src/components/subtitlesettings/subtitlesettings.js @@ -1,14 +1,13 @@ import globalize from '../../scripts/globalize'; -import appHost from '../apphost'; +import { appHost } from '../apphost'; import appSettings from '../../scripts/settings/appSettings'; import focusManager from '../focusManager'; import layoutManager from '../layoutManager'; import loading from '../loading/loading'; -import connectionManager from 'jellyfin-apiclient'; import subtitleAppearanceHelper from './subtitleappearancehelper'; import settingsHelper from '../settingshelper'; import dom from '../../scripts/dom'; -import events from 'jellyfin-apiclient'; +import { ConnectionManager, events } from 'jellyfin-apiclient'; import '../listview/listview.css'; import '../../elements/emby-select/emby-select'; import '../../elements/emby-slider/emby-slider'; @@ -232,7 +231,7 @@ export class SubtitleSettings { loading.show(); const userId = self.options.userId; - const apiClient = window.connectionManager.getApiClient(self.options.serverId); + const apiClient = ConnectionManager.getApiClient(self.options.serverId); const userSettings = self.options.userSettings; apiClient.getUser(userId).then(function (user) { @@ -256,7 +255,7 @@ export class SubtitleSettings { onSubmit(e) { const self = this; - const apiClient = window.connectionManager.getApiClient(self.options.serverId); + const apiClient = ConnectionManager.getApiClient(self.options.serverId); const userId = self.options.userId; const userSettings = self.options.userSettings; diff --git a/src/components/subtitlesync/subtitlesync.js b/src/components/subtitlesync/subtitlesync.js index c6d38d2f5..d3477932c 100644 --- a/src/components/subtitlesync/subtitlesync.js +++ b/src/components/subtitlesync/subtitlesync.js @@ -1,5 +1,5 @@ -import playbackManager from '../playback/playbackmanager'; +import { playbackManager } from '../playback/playbackmanager'; import layoutManager from '../layoutManager'; import template from './subtitlesync.template.html'; import './subtitlesync.css'; diff --git a/src/components/syncPlay/groupSelectionMenu.js b/src/components/syncPlay/groupSelectionMenu.js index 8882548e9..9269a584c 100644 --- a/src/components/syncPlay/groupSelectionMenu.js +++ b/src/components/syncPlay/groupSelectionMenu.js @@ -1,6 +1,5 @@ -import events from 'jellyfin-apiclient'; -import connectionManager from 'jellyfin-apiclient'; -import playbackManager from '../playback/playbackmanager'; +import { ConnectionManager, events } from 'jellyfin-apiclient'; +import { playbackManager } from '../playback/playbackmanager'; import syncPlayManager from './syncPlayManager'; import loading from '../loading/loading'; import toast from '../toast/toast'; @@ -172,8 +171,8 @@ export default function show (button) { }); }); - const apiClient = window.connectionManager.currentApiClient(); - window.connectionManager.user(apiClient).then((user) => { + const apiClient = ConnectionManager.currentApiClient(); + ConnectionManager.user(apiClient).then((user) => { if (syncPlayEnabled) { showLeaveGroupSelection(button, user, apiClient); } else { diff --git a/src/components/syncPlay/syncPlayManager.js b/src/components/syncPlay/syncPlayManager.js index 3a9b6e889..0ff6ad346 100644 --- a/src/components/syncPlay/syncPlayManager.js +++ b/src/components/syncPlay/syncPlayManager.js @@ -3,9 +3,8 @@ * @module components/syncPlay/syncPlayManager */ -import events from 'jellyfin-apiclient'; -import connectionManager from 'jellyfin-apiclient'; -import playbackManager from '../playback/playbackmanager'; +import { ConnectionManager, events } from 'jellyfin-apiclient'; +import { playbackManager } from '../playback/playbackmanager'; import timeSyncManager from './timeSyncManager'; import toast from '../toast/toast'; import globalize from '../../scripts//globalize'; @@ -128,7 +127,7 @@ class SyncPlayManager { // Report ping if (this.syncEnabled) { - const apiClient = window.connectionManager.currentApiClient(); + const apiClient = ConnectionManager.currentApiClient(); const sessionId = getActivePlayerId(); if (!sessionId) { @@ -660,7 +659,7 @@ class SyncPlayManager { * Overrides PlaybackManager's unpause method. */ playRequest (player) { - const apiClient = window.connectionManager.currentApiClient(); + const apiClient = ConnectionManager.currentApiClient(); apiClient.requestSyncPlayStart(); } @@ -668,7 +667,7 @@ class SyncPlayManager { * Overrides PlaybackManager's pause method. */ pauseRequest (player) { - const apiClient = window.connectionManager.currentApiClient(); + const apiClient = ConnectionManager.currentApiClient(); apiClient.requestSyncPlayPause(); // Pause locally as well, to give the user some little control playbackManager._localUnpause(player); @@ -678,7 +677,7 @@ class SyncPlayManager { * Overrides PlaybackManager's seek method. */ seekRequest (PositionTicks, player) { - const apiClient = window.connectionManager.currentApiClient(); + const apiClient = ConnectionManager.currentApiClient(); apiClient.requestSyncPlaySeek({ PositionTicks: PositionTicks }); diff --git a/src/components/syncPlay/timeSyncManager.js b/src/components/syncPlay/timeSyncManager.js index d824b2e1d..a39b06968 100644 --- a/src/components/syncPlay/timeSyncManager.js +++ b/src/components/syncPlay/timeSyncManager.js @@ -3,8 +3,7 @@ * @module components/syncPlay/timeSyncManager */ -import events from 'jellyfin-apiclient'; -import connectionManager from 'jellyfin-apiclient'; +import { ConnectionManager, events } from 'jellyfin-apiclient'; /** * Time estimation @@ -114,7 +113,7 @@ class TimeSyncManager { if (!this.poller) { this.poller = setTimeout(() => { this.poller = null; - const apiClient = window.connectionManager.currentApiClient(); + const apiClient = ConnectionManager.currentApiClient(); const requestSent = new Date(); apiClient.getServerTime().then((response) => { const responseReceived = new Date(); diff --git a/src/components/themeMediaPlayer.js b/src/components/themeMediaPlayer.js index b1b382e9b..164d144d4 100644 --- a/src/components/themeMediaPlayer.js +++ b/src/components/themeMediaPlayer.js @@ -1,6 +1,6 @@ -import playbackManager from './playback/playbackmanager'; +import { playbackManager } from './playback/playbackmanager'; import * as userSettings from '../scripts/settings/userSettings'; -import connectionManager from 'jellyfin-apiclient'; +import { ConnectionManager } from 'jellyfin-apiclient'; let currentOwnerId; let currentThemeIds = []; @@ -62,7 +62,7 @@ function loadThemeMedia(item) { return; } - const apiClient = window.connectionManager.getApiClient(item.ServerId); + const apiClient = ConnectionManager.getApiClient(item.ServerId); apiClient.getThemeMedia(apiClient.getCurrentUserId(), item.Id, true).then(function (themeMediaResult) { const ownerId = themeMediaResult.ThemeVideosResult.Items.length ? themeMediaResult.ThemeVideosResult.OwnerId : themeMediaResult.ThemeSongsResult.OwnerId; diff --git a/src/components/tunerPicker.js b/src/components/tunerPicker.js index e2793bf9d..d47b768d8 100644 --- a/src/components/tunerPicker.js +++ b/src/components/tunerPicker.js @@ -1,7 +1,7 @@ import dialogHelper from './dialogHelper/dialogHelper'; import dom from '../scripts/dom'; import layoutManager from './layoutManager'; -import connectionManager from 'jellyfin-apiclient'; +import { ConnectionManager } from 'jellyfin-apiclient'; import globalize from '../scripts/globalize'; import loading from './loading/loading'; import browser from '../scripts/browser'; @@ -163,7 +163,7 @@ function tunerPicker() { scrollHelper.centerFocus.on(dlg.querySelector('.formDialogContent'), false); } - const apiClient = window.connectionManager.getApiClient(options.serverId); + const apiClient = ConnectionManager.getApiClient(options.serverId); discoverDevices(dlg, apiClient); if (layoutManager.tv) { diff --git a/src/components/upnextdialog/upnextdialog.js b/src/components/upnextdialog/upnextdialog.js index 9515e2ef3..a7f6ac21d 100644 --- a/src/components/upnextdialog/upnextdialog.js +++ b/src/components/upnextdialog/upnextdialog.js @@ -1,7 +1,6 @@ import dom from '../../scripts/dom'; -import playbackManager from '../playback/playbackmanager'; -import connectionManager from 'jellyfin-apiclient'; -import events from 'jellyfin-apiclient'; +import { playbackManager } from '../playback/playbackmanager'; +import { events } from 'jellyfin-apiclient'; import mediaInfo from '../mediainfo/mediainfo'; import layoutManager from '../layoutManager'; import focusManager from '../focusManager'; diff --git a/src/components/userdatabuttons/userdatabuttons.js b/src/components/userdatabuttons/userdatabuttons.js index cd906e3bb..d9edda505 100644 --- a/src/components/userdatabuttons/userdatabuttons.js +++ b/src/components/userdatabuttons/userdatabuttons.js @@ -1,4 +1,4 @@ -import connectionManager from 'jellyfin-apiclient'; +import { ConnectionManager } from 'jellyfin-apiclient'; import globalize from '../../scripts/globalize'; import dom from '../../scripts/dom'; import itemHelper from '../itemHelper'; @@ -188,12 +188,12 @@ function markPlayed(link) { } function likes(id, serverId, isLiked) { - const apiClient = window.connectionManager.getApiClient(serverId); + const apiClient = ConnectionManager.getApiClient(serverId); return apiClient.updateUserItemRating(apiClient.getCurrentUserId(), id, isLiked); } function played(id, serverId, isPlayed) { - const apiClient = window.connectionManager.getApiClient(serverId); + const apiClient = ConnectionManager.getApiClient(serverId); const method = isPlayed ? 'markPlayed' : 'markUnplayed'; @@ -201,13 +201,13 @@ function played(id, serverId, isPlayed) { } function favorite(id, serverId, isFavorite) { - const apiClient = window.connectionManager.getApiClient(serverId); + const apiClient = ConnectionManager.getApiClient(serverId); return apiClient.updateFavoriteStatus(apiClient.getCurrentUserId(), id, isFavorite); } function clearLike(id, serverId) { - const apiClient = window.connectionManager.getApiClient(serverId); + const apiClient = ConnectionManager.getApiClient(serverId); return apiClient.clearUserItemRating(apiClient.getCurrentUserId(), id); } diff --git a/src/components/viewManager/viewManager.js b/src/components/viewManager/viewManager.js index cfcd67cf8..91212e2cc 100644 --- a/src/components/viewManager/viewManager.js +++ b/src/components/viewManager/viewManager.js @@ -1,6 +1,5 @@ import viewContainer from '../viewContainer'; import focusManager from '../focusManager'; -import queryString from 'query-string'; import layoutManager from '../layoutManager'; let currentView; @@ -101,7 +100,7 @@ function dispatchViewEvent(view, eventInfo, eventName, isCancellable) { function getViewEventDetail(view, options, isRestore) { const url = options.url; const index = url.indexOf('?'); - const params = index === -1 ? {} : queryString.parse(url.substring(index + 1)); + const params = new URLSearchParams(url.substring(index + 1)); return { detail: { diff --git a/src/controllers/dashboard/dashboard.js b/src/controllers/dashboard/dashboard.js index 692cc020b..e5a34eadc 100644 --- a/src/controllers/dashboard/dashboard.js +++ b/src/controllers/dashboard/dashboard.js @@ -1,5 +1,5 @@ import datetime from '../../scripts/datetime'; -import { connectionManager, events } from 'jellyfin-apiclient'; +import { ConnectionManager, events } from 'jellyfin-apiclient'; import itemHelper from '../../components/itemHelper'; import serverNotifications from '../../scripts/serverNotifications'; import dom from '../../scripts/dom'; @@ -60,7 +60,7 @@ import taskButton from '../../scripts/taskbutton'; confirmText: globalize.translate('ButtonSend') }).then(function (text) { if (text) { - window.connectionManager.getApiClient(session.ServerId).sendMessageCommand(session.Id, { + ConnectionManager.getApiClient(session.ServerId).sendMessageCommand(session.Id, { Text: text, TimeoutMs: 5e3 }); @@ -73,7 +73,7 @@ import taskButton from '../../scripts/taskbutton'; import('../../components/actionSheet/actionSheet').then(({default: actionsheet}) => { const menuItems = []; - if (session.ServerId && session.DeviceId !== window.connectionManager.deviceId()) { + if (session.ServerId && session.DeviceId !== ConnectionManager.deviceId()) { menuItems.push({ name: globalize.translate('SendMessage'), id: 'sendmessage' @@ -123,9 +123,9 @@ import taskButton from '../../scripts/taskbutton'; } else if (btn.classList.contains('btnSessionSendMessage')) { showSendMessageForm(btn, session); } else if (btn.classList.contains('btnSessionStop')) { - window.connectionManager.getApiClient(session.ServerId).sendPlayStateCommand(session.Id, 'Stop'); + ConnectionManager.getApiClient(session.ServerId).sendPlayStateCommand(session.Id, 'Stop'); } else if (btn.classList.contains('btnSessionPlayPause') && session.PlayState) { - window.connectionManager.getApiClient(session.ServerId).sendPlayStateCommand(session.Id, 'PlayPause'); + ConnectionManager.getApiClient(session.ServerId).sendPlayStateCommand(session.Id, 'PlayPause'); } } } @@ -313,7 +313,7 @@ import taskButton from '../../scripts/taskbutton'; btnCssClass = session.TranscodingInfo && session.TranscodingInfo.TranscodeReasons && session.TranscodingInfo.TranscodeReasons.length ? '' : ' hide'; html += ''; - btnCssClass = session.ServerId && session.SupportedCommands.indexOf('DisplayMessage') !== -1 && session.DeviceId !== window.connectionManager.deviceId() ? '' : ' hide'; + btnCssClass = session.ServerId && session.SupportedCommands.indexOf('DisplayMessage') !== -1 && session.DeviceId !== ConnectionManager.deviceId() ? '' : ' hide'; html += ''; html += '
'; diff --git a/src/controllers/dashboard/scheduledtasks/scheduledtasks.js b/src/controllers/dashboard/scheduledtasks/scheduledtasks.js index 436a06b74..7c35bf1fc 100644 --- a/src/controllers/dashboard/scheduledtasks/scheduledtasks.js +++ b/src/controllers/dashboard/scheduledtasks/scheduledtasks.js @@ -1,6 +1,6 @@ import 'jquery'; import loading from '../../../components/loading/loading'; -import events from 'jellyfin-apiclient'; +import { events } from 'jellyfin-apiclient'; import globalize from '../../../scripts/globalize'; import serverNotifications from '../../../scripts/serverNotifications'; import { formatDistance, formatDistanceToNow } from 'date-fns'; diff --git a/src/controllers/favorites.js b/src/controllers/favorites.js index 01cd75e6e..41372aa21 100644 --- a/src/controllers/favorites.js +++ b/src/controllers/favorites.js @@ -1,9 +1,9 @@ -import appRouter from '../components/appRouter'; +import { appRouter } from '../components/appRouter'; import cardBuilder from '../components/cardbuilder/cardBuilder'; import dom from '../scripts/dom'; import globalize from '../scripts/globalize'; -import connectionManager from 'jellyfin-apiclient'; -import appHost from '../components/apphost'; +import { ConnectionManager } from 'jellyfin-apiclient'; +import { appHost } from '../components/apphost'; import layoutManager from '../components/layoutManager'; import focusManager from '../components/focusManager'; import '../elements/emby-itemscontainer/emby-itemscontainer'; @@ -270,7 +270,7 @@ class FavoritesTab { constructor(view, params) { this.view = view; this.params = params; - this.apiClient = window.connectionManager.currentApiClient(); + this.apiClient = ConnectionManager.currentApiClient(); this.sectionsContainer = view.querySelector('.sections'); createSections(this, this.sectionsContainer, this.apiClient); } diff --git a/src/controllers/home.js b/src/controllers/home.js index 56ad48126..ed447cac8 100644 --- a/src/controllers/home.js +++ b/src/controllers/home.js @@ -44,15 +44,15 @@ class HomeView extends TabbedView { switch (index) { case 0: - depends = 'controllers/hometab'; + depends = 'hometab'; break; case 1: - depends = 'controllers/favorites'; + depends = 'favorites'; } const instance = this; - return import(depends).then(({ default: controllerFactory }) => { + return import(/* webpackChunkName: "[request]" */ `../controllers/${depends}`).then(({ default: controllerFactory }) => { let controller = instance.tabControllers[index]; if (!controller) { diff --git a/src/controllers/hometab.js b/src/controllers/hometab.js index 65047dbaa..d1e18b42c 100644 --- a/src/controllers/hometab.js +++ b/src/controllers/hometab.js @@ -1,6 +1,5 @@ import * as userSettings from '../scripts/settings/userSettings'; import loading from '../components/loading/loading'; -import connectionManager from 'jellyfin-apiclient'; import focusManager from '../components/focusManager'; import homeSections from '../components/homesections/homesections'; import '../elements/emby-itemscontainer/emby-itemscontainer'; @@ -9,7 +8,7 @@ class HomeTab { constructor(view, params) { this.view = view; this.params = params; - this.apiClient = window.connectionManager.currentApiClient(); + this.apiClient = window.ConnectionManager.currentApiClient(); this.sectionsContainer = view.querySelector('.sections'); view.querySelector('.sections').addEventListener('settingschange', onHomeScreenSettingsChanged.bind(this)); } diff --git a/src/controllers/itemDetails/index.js b/src/controllers/itemDetails/index.js index 16a77076a..02da9460c 100644 --- a/src/controllers/itemDetails/index.js +++ b/src/controllers/itemDetails/index.js @@ -1,8 +1,8 @@ -import appHost from '../../components/apphost'; +import { appHost } from '../../components/apphost'; import loading from '../../components/loading/loading'; -import appRouter from '../../components/appRouter'; +import { appRouter } from '../../components/appRouter'; import layoutManager from '../../components/layoutManager'; -import { connectionManager, events } from 'jellyfin-apiclient'; +import { ConnectionManager, events } from 'jellyfin-apiclient'; import * as userSettings from '../../scripts/settings/userSettings'; import cardBuilder from '../../components/cardbuilder/cardBuilder'; import datetime from '../../scripts/datetime'; @@ -17,7 +17,7 @@ import imageLoader from '../../components/images/imageLoader'; import libraryMenu from '../../scripts/libraryMenu'; import globalize from '../../scripts/globalize'; import browser from '../../scripts/browser'; -import playbackManager from '../../components/playback/playbackmanager'; +import { playbackManager } from '../../components/playback/playbackmanager'; import '../../assets/css/scrollstyles.css'; import '../../elements/emby-itemscontainer/emby-itemscontainer'; import '../../elements/emby-checkbox/emby-checkbox'; @@ -563,7 +563,7 @@ function renderDetailPageBackdrop(page, item, apiClient) { } function reloadFromItem(instance, page, params, item, user) { - const apiClient = window.connectionManager.getApiClient(item.ServerId); + const apiClient = ConnectionManager.getApiClient(item.ServerId); Emby.Page.setTitle(''); @@ -805,7 +805,7 @@ function renderNextUp(page, item, user) { return void section.classList.add('hide'); } - window.connectionManager.getApiClient(item.ServerId).getNextUpEpisodes({ + ConnectionManager.getApiClient(item.ServerId).getNextUpEpisodes({ SeriesId: item.Id, UserId: user.Id }).then(function (result) { @@ -1209,7 +1209,7 @@ function renderSimilarItems(page, item, context) { } similarCollapsible.classList.remove('hide'); - const apiClient = window.connectionManager.getApiClient(item.ServerId); + const apiClient = ConnectionManager.getApiClient(item.ServerId); const options = { userId: apiClient.getCurrentUserId(), limit: 12, @@ -1323,7 +1323,7 @@ function renderChildren(page, item) { } let promise; - const apiClient = window.connectionManager.getApiClient(item.ServerId); + const apiClient = ConnectionManager.getApiClient(item.ServerId); const userId = apiClient.getCurrentUserId(); if (item.Type == 'Series') { @@ -1571,7 +1571,7 @@ function renderChannelGuide(page, apiClient, item) { } function renderSeriesSchedule(page, item) { - const apiClient = window.connectionManager.getApiClient(item.ServerId); + const apiClient = ConnectionManager.getApiClient(item.ServerId); apiClient.getLiveTvPrograms({ UserId: apiClient.getCurrentUserId(), HasAired: false, @@ -1731,7 +1731,7 @@ function renderCollectionItemType(page, parentItem, type, items) { } function renderMusicVideos(page, item, user) { - window.connectionManager.getApiClient(item.ServerId).getItems(user.Id, { + ConnectionManager.getApiClient(item.ServerId).getItems(user.Id, { SortBy: 'SortName', SortOrder: 'Ascending', IncludeItemTypes: 'MusicVideo', @@ -1751,7 +1751,7 @@ function renderMusicVideos(page, item, user) { } function renderAdditionalParts(page, item, user) { - window.connectionManager.getApiClient(item.ServerId).getAdditionalVideoParts(user.Id, item.Id).then(function (result) { + ConnectionManager.getApiClient(item.ServerId).getAdditionalVideoParts(user.Id, item.Id).then(function (result) { if (result.Items.length) { page.querySelector('#additionalPartsCollapsible').classList.remove('hide'); const additionalPartsContent = page.querySelector('#additionalPartsContent'); @@ -1796,7 +1796,7 @@ function getVideosHtml(items) { } function renderSpecials(page, item, user) { - window.connectionManager.getApiClient(item.ServerId).getSpecialFeatures(user.Id, item.Id).then(function (specials) { + ConnectionManager.getApiClient(item.ServerId).getSpecialFeatures(user.Id, item.Id).then(function (specials) { const specialsContent = page.querySelector('#specialsContent'); specialsContent.innerHTML = getVideosHtml(specials); imageLoader.lazyChildren(specialsContent); @@ -1852,7 +1852,7 @@ export default function (view, params) { function reload(instance, page, params) { loading.show(); - const apiClient = params.serverId ? window.connectionManager.getApiClient(params.serverId) : ApiClient; + const apiClient = params.serverId ? ConnectionManager.getApiClient(params.serverId) : ApiClient; Promise.all([getPromise(apiClient, params), apiClient.getCurrentUser()]).then(([item, user]) => { currentItem = item; @@ -1901,7 +1901,7 @@ export default function (view, params) { const item = currentItem; if (item.Type === 'Program') { - const apiClient = window.connectionManager.getApiClient(item.ServerId); + const apiClient = ConnectionManager.getApiClient(item.ServerId); return void apiClient.getLiveTvChannel(item.ChannelId, apiClient.getCurrentUserId()).then(function (channel) { playbackManager.play({ items: [channel] @@ -1938,7 +1938,7 @@ export default function (view, params) { function onCancelTimerClick() { import('../../components/recordingcreator/recordinghelper').then(({ default: recordingHelper }) => { - recordingHelper.cancelTimer(window.connectionManager.getApiClient(currentItem.ServerId), currentItem.TimerId).then(function () { + recordingHelper.cancelTimer(ConnectionManager.getApiClient(currentItem.ServerId), currentItem.TimerId).then(function () { reload(self, view, params); }); }); @@ -2002,7 +2002,7 @@ export default function (view, params) { let currentItem; const self = this; - const apiClient = params.serverId ? window.connectionManager.getApiClient(params.serverId) : ApiClient; + const apiClient = params.serverId ? ConnectionManager.getApiClient(params.serverId) : ApiClient; const btnResume = view.querySelector('.mainDetailButtons .btnResume'); const btnPlay = view.querySelector('.mainDetailButtons .btnPlay'); diff --git a/src/controllers/list.js b/src/controllers/list.js index d356d800a..a18fbeb7f 100644 --- a/src/controllers/list.js +++ b/src/controllers/list.js @@ -5,9 +5,9 @@ import * as userSettings from '../scripts/settings/userSettings'; import focusManager from '../components/focusManager'; import cardBuilder from '../components/cardbuilder/cardBuilder'; import loading from '../components/loading/loading'; -import connectionManager from 'jellyfin-apiclient'; +import { ConnectionManager } from 'jellyfin-apiclient'; import AlphaNumericShortcuts from '../scripts/alphanumericshortcuts'; -import playbackManager from '../components/playback/playbackmanager'; +import { playbackManager } from '../components/playback/playbackmanager'; import AlphaPicker from '../components/alphaPicker/alphaPicker'; import '../elements/emby-itemscontainer/emby-itemscontainer'; import '../elements/emby-scroller/emby-scroller'; @@ -16,7 +16,7 @@ import '../elements/emby-scroller/emby-scroller'; function getInitialLiveTvQuery(instance, params) { const query = { - UserId: window.connectionManager.getApiClient(params.serverId).getCurrentUserId(), + UserId: ConnectionManager.getApiClient(params.serverId).getCurrentUserId(), StartIndex: 0, Fields: 'ChannelInfo,PrimaryImageAspectRatio', Limit: 300 @@ -232,7 +232,7 @@ import '../elements/emby-scroller/emby-scroller'; } function getItems(instance, params, item, sortBy, startIndex, limit) { - const apiClient = window.connectionManager.getApiClient(params.serverId); + const apiClient = ConnectionManager.getApiClient(params.serverId); instance.queryRecursive = false; if (params.type === 'Recordings') { @@ -333,7 +333,7 @@ import '../elements/emby-scroller/emby-scroller'; return Promise.resolve(null); } - const apiClient = window.connectionManager.getApiClient(params.serverId); + const apiClient = ConnectionManager.getApiClient(params.serverId); const itemId = params.genreId || params.musicGenreId || params.studioId || params.personId || params.parentId; if (itemId) { diff --git a/src/controllers/livetv/livetvchannels.js b/src/controllers/livetv/livetvchannels.js index 9de6e7178..4ab1f45ed 100644 --- a/src/controllers/livetv/livetvchannels.js +++ b/src/controllers/livetv/livetvchannels.js @@ -2,7 +2,7 @@ import cardBuilder from '../../components/cardbuilder/cardBuilder'; import imageLoader from '../../components/images/imageLoader'; import libraryBrowser from '../../scripts/libraryBrowser'; import loading from '../../components/loading/loading'; -import events from 'jellyfin-apiclient'; +import { events } from 'jellyfin-apiclient'; import * as userSettings from '../../scripts/settings/userSettings'; import '../../elements/emby-itemscontainer/emby-itemscontainer'; diff --git a/src/controllers/livetvguideprovider.js b/src/controllers/livetvguideprovider.js index 750bbff47..59a19d599 100644 --- a/src/controllers/livetvguideprovider.js +++ b/src/controllers/livetvguideprovider.js @@ -1,4 +1,4 @@ -import events from 'jellyfin-apiclient'; +import { events } from 'jellyfin-apiclient'; import loading from '../components/loading/loading'; import globalize from '../scripts/globalize'; diff --git a/src/controllers/movies/moviegenres.js b/src/controllers/movies/moviegenres.js index 2b106dc36..153cc6494 100644 --- a/src/controllers/movies/moviegenres.js +++ b/src/controllers/movies/moviegenres.js @@ -4,7 +4,7 @@ import libraryBrowser from '../../scripts/libraryBrowser'; import cardBuilder from '../../components/cardbuilder/cardBuilder'; import lazyLoader from '../../components/lazyLoader/lazyLoaderIntersectionObserver'; import globalize from '../../scripts/globalize'; -import appRouter from '../../components/appRouter'; +import { appRouter } from '../../components/appRouter'; import '../../elements/emby-button/emby-button'; /* eslint-disable indent */ diff --git a/src/controllers/movies/movies.js b/src/controllers/movies/movies.js index 648290abe..736489d3d 100644 --- a/src/controllers/movies/movies.js +++ b/src/controllers/movies/movies.js @@ -1,6 +1,6 @@ import loading from '../../components/loading/loading'; import * as userSettings from '../../scripts/settings/userSettings'; -import events from 'jellyfin-apiclient'; +import { events } from 'jellyfin-apiclient'; import libraryBrowser from '../../scripts/libraryBrowser'; import { AlphaPicker } from '../../components/alphaPicker/alphaPicker'; import listView from '../../components/listview/listview'; diff --git a/src/controllers/movies/moviesrecommended.js b/src/controllers/movies/moviesrecommended.js index 1270e9f13..0c02e7c01 100644 --- a/src/controllers/movies/moviesrecommended.js +++ b/src/controllers/movies/moviesrecommended.js @@ -1,5 +1,5 @@ -import events from 'jellyfin-apiclient'; +import { events } from 'jellyfin-apiclient'; import layoutManager from '../../components/layoutManager'; import inputManager from '../../scripts/inputManager'; import * as userSettings from '../../scripts/settings/userSettings'; @@ -8,7 +8,7 @@ import * as mainTabsManager from '../../components/maintabsmanager'; import cardBuilder from '../../components/cardbuilder/cardBuilder'; import dom from '../../scripts/dom'; import imageLoader from '../../components/images/imageLoader'; -import playbackManager from '../../components/playback/playbackmanager'; +import { playbackManager } from '../../components/playback/playbackmanager'; import globalize from '../../scripts/globalize'; import '../../elements/emby-scroller/emby-scroller'; import '../../elements/emby-itemscontainer/emby-itemscontainer'; diff --git a/src/controllers/movies/movietrailers.js b/src/controllers/movies/movietrailers.js index 4f92b139b..92be37720 100644 --- a/src/controllers/movies/movietrailers.js +++ b/src/controllers/movies/movietrailers.js @@ -1,5 +1,5 @@ import loading from '../../components/loading/loading'; -import events from 'jellyfin-apiclient'; +import { events } from 'jellyfin-apiclient'; import libraryBrowser from '../../scripts/libraryBrowser'; import imageLoader from '../../components/images/imageLoader'; import { AlphaPicker } from '../../components/alphaPicker/alphaPicker'; diff --git a/src/controllers/music/musicalbums.js b/src/controllers/music/musicalbums.js index d9abe48fe..32eb38a84 100644 --- a/src/controllers/music/musicalbums.js +++ b/src/controllers/music/musicalbums.js @@ -1,6 +1,6 @@ -import playbackManager from '../../components/playback/playbackmanager'; +import { playbackManager } from '../../components/playback/playbackmanager'; import loading from '../../components/loading/loading'; -import events from 'jellyfin-apiclient'; +import { events } from 'jellyfin-apiclient'; import libraryBrowser from '../../scripts/libraryBrowser'; import imageLoader from '../../components/images/imageLoader'; import AlphaPicker from '../../components/alphaPicker/alphaPicker'; diff --git a/src/controllers/music/musicartists.js b/src/controllers/music/musicartists.js index a7c01220c..232b2fdd1 100644 --- a/src/controllers/music/musicartists.js +++ b/src/controllers/music/musicartists.js @@ -1,5 +1,5 @@ import loading from '../../components/loading/loading'; -import events from 'jellyfin-apiclient'; +import { events } from 'jellyfin-apiclient'; import libraryBrowser from '../../scripts/libraryBrowser'; import imageLoader from '../../components/images/imageLoader'; import { AlphaPicker } from '../../components/alphaPicker/alphaPicker'; diff --git a/src/controllers/music/songs.js b/src/controllers/music/songs.js index cc526df6b..133d9bdab 100644 --- a/src/controllers/music/songs.js +++ b/src/controllers/music/songs.js @@ -1,5 +1,5 @@ -import events from 'jellyfin-apiclient'; +import { events } from 'jellyfin-apiclient'; import libraryBrowser from '../../scripts/libraryBrowser'; import imageLoader from '../../components/images/imageLoader'; import listView from '../../components/listview/listview'; diff --git a/src/controllers/playback/video/index.js b/src/controllers/playback/video/index.js index 5e99971a8..9d531bfdc 100644 --- a/src/controllers/playback/video/index.js +++ b/src/controllers/playback/video/index.js @@ -1,4 +1,4 @@ -import playbackManager from '../../../components/playback/playbackmanager'; +import { playbackManager } from '../../../components/playback/playbackmanager'; import dom from '../../../scripts/dom'; import inputManager from '../../../scripts/inputManager'; import mouseManager from '../../../scripts/mouseManager'; @@ -6,10 +6,10 @@ import datetime from '../../../scripts/datetime'; import itemHelper from '../../../components/itemHelper'; import mediaInfo from '../../../components/mediainfo/mediainfo'; import focusManager from '../../../components/focusManager'; -import { connectionManager, events } from 'jellyfin-apiclient';; +import { ConnectionManager, events } from 'jellyfin-apiclient'; import browser from '../../../scripts/browser'; import globalize from '../../../scripts/globalize'; -import appHost from '../../../components/apphost'; +import { appHost } from '../../../components/apphost'; import layoutManager from '../../../components/layoutManager'; import * as userSettings from '../../../scripts/settings/userSettings'; import keyboardnavigation from '../../../scripts/keyboardNavigation'; @@ -73,7 +73,7 @@ import '../../../assets/css/videoosd.css'; function getDisplayItem(item) { if (item.Type === 'TvChannel') { - const apiClient = window.connectionManager.getApiClient(item.ServerId); + const apiClient = ConnectionManager.getApiClient(item.ServerId); return apiClient.getItem(apiClient.getCurrentUserId(), item.Id).then(function (refreshedItem) { return { originalItem: refreshedItem, @@ -97,7 +97,7 @@ import '../../../assets/css/videoosd.css'; return void view.querySelector('.btnRecord').classList.add('hide'); } - window.connectionManager.getApiClient(item.ServerId).getCurrentUser().then(function (user) { + ConnectionManager.getApiClient(item.ServerId).getCurrentUser().then(function (user) { if (user.Policy.EnableLiveTvManagement) { import('../../../components/recordingcreator/recordingbutton').then((RecordingButton) => { if (recordingButtonManager) { @@ -1515,7 +1515,7 @@ import '../../../assets/css/videoosd.css'; const item = currentItem; if (item && item.Chapters && item.Chapters.length && item.Chapters[0].ImageTag) { - const html = getChapterBubbleHtml(window.connectionManager.getApiClient(item.ServerId), item, item.Chapters, ticks); + const html = getChapterBubbleHtml(ConnectionManager.getApiClient(item.ServerId), item, item.Chapters, ticks); if (html) { return html; diff --git a/src/controllers/searchpage.js b/src/controllers/searchpage.js index 9b40f6a06..f8cfce373 100644 --- a/src/controllers/searchpage.js +++ b/src/controllers/searchpage.js @@ -1,6 +1,6 @@ import SearchFields from '../components/search/searchfields'; import SearchResults from '../components/search/searchresults'; -import events from 'jellyfin-apiclient'; +import { events } from 'jellyfin-apiclient'; export default function (view, params) { function onSearch(e, value) { diff --git a/src/controllers/session/login/index.js b/src/controllers/session/login/index.js index 4aef28b17..e1ac1d125 100644 --- a/src/controllers/session/login/index.js +++ b/src/controllers/session/login/index.js @@ -1,7 +1,7 @@ -import appHost from '../../../components/apphost'; +import { appHost } from '../../../components/apphost'; import appSettings from '../../../scripts/settings/appSettings'; import dom from '../../../scripts/dom'; -import connectionManager from 'jellyfin-apiclient'; +import { ConnectionManager } from 'jellyfin-apiclient'; import loading from '../../../components/loading/loading'; import layoutManager from '../../../components/layoutManager'; import libraryMenu from '../../../scripts/libraryMenu'; @@ -192,7 +192,7 @@ import '../../../elements/emby-checkbox/emby-checkbox'; const serverId = params.serverid; if (serverId) { - return window.connectionManager.getOrCreateApiClient(serverId); + return ConnectionManager.getOrCreateApiClient(serverId); } return ApiClient; diff --git a/src/controllers/session/selectServer/index.js b/src/controllers/session/selectServer/index.js index 721cc8c10..accc828ba 100644 --- a/src/controllers/session/selectServer/index.js +++ b/src/controllers/session/selectServer/index.js @@ -1,10 +1,10 @@ import loading from '../../../components/loading/loading'; -import appRouter from '../../../components/appRouter'; +import { appRouter } from '../../../components/appRouter'; import layoutManager from '../../../components/layoutManager'; import libraryMenu from '../../../scripts/libraryMenu'; import appSettings from '../../../scripts/settings/appSettings'; import focusManager from '../../../components/focusManager'; -import connectionManager from 'jellyfin-apiclient'; +import { ConnectionManager } from 'jellyfin-apiclient'; import globalize from '../../../scripts/globalize'; import actionSheet from '../../../components/actionSheet/actionSheet'; import dom from '../../../scripts/dom'; @@ -113,7 +113,7 @@ import '../../../elements/emby-button/emby-button'; export default function (view, params) { function connectToServer(server) { loading.show(); - window.connectionManager.connectToServer(server, { + ConnectionManager.connectToServer(server, { enableAutoLogin: appSettings.enableAutoLogin() }).then(function (result) { loading.hide(); @@ -145,7 +145,7 @@ import '../../../elements/emby-button/emby-button'; function deleteServer(server) { loading.show(); - window.connectionManager.deleteServer(server.Id).then(function () { + ConnectionManager.deleteServer(server.Id).then(function () { loading.hide(); loadServers(); }); @@ -187,7 +187,7 @@ import '../../../elements/emby-button/emby-button'; function loadServers() { loading.show(); - window.connectionManager.getAvailableServers().then(onServersRetrieved); + ConnectionManager.getAvailableServers().then(onServersRetrieved); } let servers; diff --git a/src/controllers/shows/episodes.js b/src/controllers/shows/episodes.js index fb78c47b8..76c620f10 100644 --- a/src/controllers/shows/episodes.js +++ b/src/controllers/shows/episodes.js @@ -1,5 +1,5 @@ import loading from '../../components/loading/loading'; -import events from 'jellyfin-apiclient'; +import { events } from 'jellyfin-apiclient'; import libraryBrowser from '../../scripts/libraryBrowser'; import imageLoader from '../../components/images/imageLoader'; import listView from '../../components/listview/listview'; diff --git a/src/controllers/shows/tvgenres.js b/src/controllers/shows/tvgenres.js index 75e89ea9c..82a15bb0c 100644 --- a/src/controllers/shows/tvgenres.js +++ b/src/controllers/shows/tvgenres.js @@ -4,7 +4,7 @@ import libraryBrowser from '../../scripts/libraryBrowser'; import cardBuilder from '../../components/cardbuilder/cardBuilder'; import lazyLoader from '../../components/lazyLoader/lazyLoaderIntersectionObserver'; import globalize from '../../scripts/globalize'; -import appRouter from '../../components/appRouter'; +import { appRouter } from '../../components/appRouter'; import '../../elements/emby-button/emby-button'; /* eslint-disable indent */ diff --git a/src/controllers/shows/tvrecommended.js b/src/controllers/shows/tvrecommended.js index d778beebf..33cd66657 100644 --- a/src/controllers/shows/tvrecommended.js +++ b/src/controllers/shows/tvrecommended.js @@ -1,5 +1,5 @@ -import events from 'jellyfin-apiclient'; +import { events } from 'jellyfin-apiclient'; import inputManager from '../../scripts/inputManager'; import libraryMenu from '../../scripts/libraryMenu'; import layoutManager from '../../components/layoutManager'; @@ -7,7 +7,7 @@ import loading from '../../components/loading/loading'; import dom from '../../scripts/dom'; import * as userSettings from '../../scripts/settings/userSettings'; import cardBuilder from '../../components/cardbuilder/cardBuilder'; -import playbackManager from '../../components/playback/playbackmanager'; +import { playbackManager } from '../../components/playback/playbackmanager'; import * as mainTabsManager from '../../components/maintabsmanager'; import globalize from '../../scripts/globalize'; import '../../assets/css/scrollstyles.css'; diff --git a/src/controllers/shows/tvshows.js b/src/controllers/shows/tvshows.js index b59e5a2c4..2fe940a06 100644 --- a/src/controllers/shows/tvshows.js +++ b/src/controllers/shows/tvshows.js @@ -1,5 +1,5 @@ import loading from '../../components/loading/loading'; -import events from 'jellyfin-apiclient'; +import { events } from 'jellyfin-apiclient'; import libraryBrowser from '../../scripts/libraryBrowser'; import imageLoader from '../../components/images/imageLoader'; import listView from '../../components/listview/listview'; diff --git a/src/controllers/user/menu/index.js b/src/controllers/user/menu/index.js index e480d0258..f3f92386e 100644 --- a/src/controllers/user/menu/index.js +++ b/src/controllers/user/menu/index.js @@ -1,4 +1,4 @@ -import appHost from '../../../components/apphost'; +import { appHost } from '../../../components/apphost'; import '../../../components/listview/listview.css'; import '../../../elements/emby-button/emby-button'; import layoutManager from '../../../components/layoutManager'; diff --git a/src/controllers/user/profile/index.js b/src/controllers/user/profile/index.js index deedaf306..113f08c4d 100644 --- a/src/controllers/user/profile/index.js +++ b/src/controllers/user/profile/index.js @@ -1,7 +1,7 @@ import UserPasswordPage from '../../dashboard/users/userpasswordpage'; import loading from '../../../components/loading/loading'; import libraryMenu from '../../../scripts/libraryMenu'; -import appHost from '../../../components/apphost'; +import { appHost } from '../../../components/apphost'; import globalize from '../../../scripts/globalize'; import '../../../elements/emby-button/emby-button'; diff --git a/src/elements/emby-button/emby-button.js b/src/elements/emby-button/emby-button.js index 9eefbcbed..e86901b9a 100644 --- a/src/elements/emby-button/emby-button.js +++ b/src/elements/emby-button/emby-button.js @@ -1,12 +1,65 @@ import { removeEventListener, addEventListener } from '../../scripts/dom'; import layoutManager from '../../components/layoutManager'; import shell from '../../scripts/shell'; -import appRouter from '../../components/appRouter'; -import appHost from '../../components/apphost'; +import { appRouter } from '../../components/appRouter'; +import { appHost } from '../../components/apphost'; import './emby-button.css'; -const EmbyButtonPrototype = Object.create(HTMLButtonElement.prototype); -const EmbyLinkButtonPrototype = Object.create(HTMLAnchorElement.prototype); +class EmbyButton extends HTMLButtonElement { + createdCallback() { + if (this.classList.contains('emby-button')) { + return; + } + + this.classList.add('../../elements/emby-button/emby-button'); + // TODO replace all instances of element-showfocus with this method + if (layoutManager.tv) { + // handles all special css for tv layout + // this method utilizes class chaining + this.classList.add('show-focus'); + } + } + + attachedCallback() { + if (this.tagName === 'A') { + removeEventListener(this, 'click', onAnchorClick, {}); + addEventListener(this, 'click', onAnchorClick, {}); + + if (this.getAttribute('data-autohide') === 'true') { + if (appHost.supports('externallinks')) { + this.classList.remove('hide'); + } else { + this.classList.add('hide'); + } + } + } + } + + detachedCallback() { + removeEventListener(this, 'click', onAnchorClick, {}); + } +} + +class EmbyLinkButton extends HTMLAnchorElement { + attachedCallback() { + if (this.tagName === 'A') { + removeEventListener(this, 'click', onAnchorClick, {}); + addEventListener(this, 'click', onAnchorClick, {}); + + if (this.getAttribute('data-autohide') === 'true') { + if (appHost.supports('externallinks')) { + this.classList.remove('hide'); + } else { + this.classList.add('hide'); + } + } + } + } + + detachedCallback() { + removeEventListener(this, 'click', onAnchorClick, {}); + } +} function onAnchorClick(e) { const href = this.getAttribute('href') || ''; @@ -24,50 +77,8 @@ function onAnchorClick(e) { } } -EmbyButtonPrototype.createdCallback = function () { - if (this.classList.contains('emby-button')) { - return; - } +customElements.define('emby-button', EmbyButton, { extends: 'button' }); - this.classList.add('../../elements/emby-button/emby-button'); - // TODO replace all instances of element-showfocus with this method - if (layoutManager.tv) { - // handles all special css for tv layout - // this method utilizes class chaining - this.classList.add('show-focus'); - } -}; +customElements.define('emby-linkbutton', EmbyLinkButton, { extends: 'a' }); -EmbyButtonPrototype.attachedCallback = function () { - if (this.tagName === 'A') { - removeEventListener(this, 'click', onAnchorClick, {}); - addEventListener(this, 'click', onAnchorClick, {}); - - if (this.getAttribute('data-autohide') === 'true') { - if (appHost.supports('externallinks')) { - this.classList.remove('hide'); - } else { - this.classList.add('hide'); - } - } - } -}; - -EmbyButtonPrototype.detachedCallback = function () { - removeEventListener(this, 'click', onAnchorClick, {}); -}; - -EmbyLinkButtonPrototype.createdCallback = EmbyButtonPrototype.createdCallback; -EmbyLinkButtonPrototype.attachedCallback = EmbyButtonPrototype.attachedCallback; - -document.registerElement('../../elements/emby-button/emby-button', { - prototype: EmbyButtonPrototype, - extends: 'button' -}); - -document.registerElement('emby-linkbutton', { - prototype: EmbyLinkButtonPrototype, - extends: 'a' -}); - -export default EmbyButtonPrototype; +export default EmbyButton; diff --git a/src/elements/emby-itemrefreshindicator/emby-itemrefreshindicator.js b/src/elements/emby-itemrefreshindicator/emby-itemrefreshindicator.js index 0fd9eeb95..b71a5ab4e 100644 --- a/src/elements/emby-itemrefreshindicator/emby-itemrefreshindicator.js +++ b/src/elements/emby-itemrefreshindicator/emby-itemrefreshindicator.js @@ -1,7 +1,7 @@ import EmbyProgressRing from '../emby-progressring/emby-progressring'; import dom from '../../scripts/dom'; import serverNotifications from '../../scripts/serverNotifications'; -import events from 'jellyfin-apiclient'; +import { events } from 'jellyfin-apiclient'; import 'webcomponents.js'; /* eslint-disable indent */ diff --git a/src/elements/emby-itemscontainer/emby-itemscontainer.js b/src/elements/emby-itemscontainer/emby-itemscontainer.js index 1f8b1607a..eff9ba255 100644 --- a/src/elements/emby-itemscontainer/emby-itemscontainer.js +++ b/src/elements/emby-itemscontainer/emby-itemscontainer.js @@ -1,8 +1,7 @@ import itemShortcuts from '../../components/shortcuts'; import inputManager from '../../scripts/inputManager'; -import connectionManager from 'jellyfin-apiclient'; -import playbackManager from '../../components/playback/playbackmanager'; +import { playbackManager } from '../../components/playback/playbackmanager'; import imageLoader from '../../components/images/imageLoader'; import layoutManager from '../../components/layoutManager'; import browser from '../../scripts/browser'; @@ -10,7 +9,7 @@ import dom from '../../scripts/dom'; import loading from '../../components/loading/loading'; import focusManager from '../../components/focusManager'; import serverNotifications from '../../scripts/serverNotifications'; -import events from 'jellyfin-apiclient'; +import { ConnectionManager, events } from 'jellyfin-apiclient'; import 'webcomponents.js'; /* eslint-disable indent */ @@ -104,7 +103,7 @@ import 'webcomponents.js'; } const serverId = el.getAttribute('data-serverid'); - const apiClient = window.connectionManager.getApiClient(serverId); + const apiClient = ConnectionManager.getApiClient(serverId); loading.show(); diff --git a/src/elements/emby-playstatebutton/emby-playstatebutton.js b/src/elements/emby-playstatebutton/emby-playstatebutton.js index 26a5c8280..610d732c9 100644 --- a/src/elements/emby-playstatebutton/emby-playstatebutton.js +++ b/src/elements/emby-playstatebutton/emby-playstatebutton.js @@ -1,6 +1,5 @@ -import connectionManager from 'jellyfin-apiclient'; import serverNotifications from '../../scripts/serverNotifications'; -import events from 'jellyfin-apiclient'; +import { ConnectionManager, events } from 'jellyfin-apiclient'; import globalize from '../../scripts/globalize'; import EmbyButtonPrototype from '../../elements/emby-button/emby-button'; @@ -24,7 +23,7 @@ import EmbyButtonPrototype from '../../elements/emby-button/emby-button'; const button = this; const id = button.getAttribute('data-id'); const serverId = button.getAttribute('data-serverid'); - const apiClient = window.connectionManager.getApiClient(serverId); + const apiClient = ConnectionManager.getApiClient(serverId); if (!button.classList.contains('playstatebutton-played')) { apiClient.markPlayed(apiClient.getCurrentUserId(), id, new Date()); diff --git a/src/elements/emby-ratingbutton/emby-ratingbutton.js b/src/elements/emby-ratingbutton/emby-ratingbutton.js index 42f7be68f..15c290fa6 100644 --- a/src/elements/emby-ratingbutton/emby-ratingbutton.js +++ b/src/elements/emby-ratingbutton/emby-ratingbutton.js @@ -1,6 +1,5 @@ -import connectionManager from 'jellyfin-apiclient'; import serverNotifications from '../../scripts/serverNotifications'; -import events from 'jellyfin-apiclient'; +import { ConnectionManager, events } from 'jellyfin-apiclient'; import globalize from '../../scripts/globalize'; import EmbyButtonPrototype from '../emby-button/emby-button'; @@ -28,7 +27,7 @@ import EmbyButtonPrototype from '../emby-button/emby-button'; const button = this; const id = button.getAttribute('data-id'); const serverId = button.getAttribute('data-serverid'); - const apiClient = window.connectionManager.getApiClient(serverId); + const apiClient = ConnectionManager.getApiClient(serverId); let likes = this.getAttribute('data-likes'); const isFavorite = this.getAttribute('data-isfavorite') === 'true'; diff --git a/src/elements/emby-tabs/emby-tabs.js b/src/elements/emby-tabs/emby-tabs.js index e34d30d47..51144c7d3 100644 --- a/src/elements/emby-tabs/emby-tabs.js +++ b/src/elements/emby-tabs/emby-tabs.js @@ -7,8 +7,6 @@ import './emby-tabs.css'; import '../../assets/css/scrollstyles.css'; /* eslint-disable indent */ - - const EmbyTabs = Object.create(HTMLDivElement.prototype); const buttonClass = 'emby-tab-button'; const activeButtonClass = buttonClass + '-active'; @@ -145,182 +143,181 @@ import '../../assets/css/scrollstyles.css'; } } - EmbyTabs.createdCallback = function () { - if (this.classList.contains('emby-tabs')) { - return; + class EmbyTabs extends HTMLDivElement { + createdCallback() { + if (this.classList.contains('emby-tabs')) { + return; + } + this.classList.add('emby-tabs'); + this.classList.add('focusable'); + + dom.addEventListener(this, 'click', onClick, { + passive: true + }); + + dom.addEventListener(this, 'focusout', onFocusOut); } - this.classList.add('emby-tabs'); - this.classList.add('focusable'); - dom.addEventListener(this, 'click', onClick, { - passive: true - }); + focus() { + const selected = this.querySelector('.' + activeButtonClass); - dom.addEventListener(this, 'focusout', onFocusOut); - }; - - EmbyTabs.focus = function onFocusIn() { - const selectedTab = this.querySelector('.' + activeButtonClass); - const lastFocused = this.querySelector('.lastFocused'); - - if (lastFocused) { - focusManager.focus(lastFocused); - } else if (selectedTab) { - focusManager.focus(selectedTab); - } else { - focusManager.autoFocus(this); - } - }; - - EmbyTabs.refresh = function () { - if (this.scroller) { - this.scroller.reload(); - } - }; - - EmbyTabs.attachedCallback = function () { - initScroller(this); - - const current = this.querySelector('.' + activeButtonClass); - const currentIndex = current ? parseInt(current.getAttribute('data-index')) : parseInt(this.getAttribute('data-index') || '0'); - - if (currentIndex !== -1) { - this.selectedTabIndex = currentIndex; - - const tabButtons = this.querySelectorAll('.' + buttonClass); - - const newTabButton = tabButtons[currentIndex]; - - if (newTabButton) { - setActiveTabButton(newTabButton); + if (this.lastFocused) { + focusManager.focus(this.lastFocused); + } else if (this.selectedTab) { + focusManager.focus(this.selectedTab); + } else { + focusManager.autoFocus(this); } } - if (!this.readyFired) { - this.readyFired = true; - this.dispatchEvent(new CustomEvent('ready', {})); - } - }; - - EmbyTabs.detachedCallback = function () { - if (this.scroller) { - this.scroller.destroy(); - this.scroller = null; + refresh() { + if (this.scroller) { + this.scroller.reload(); + } } - dom.removeEventListener(this, 'click', onClick, { - passive: true - }); - }; + attachedCallback() { + console.warn(this); + initScroller(this); - function getSelectedTabButton(elem) { - return elem.querySelector('.' + activeButtonClass); - } + const current = this.querySelector('.' + activeButtonClass); + const currentIndex = current ? parseInt(current.getAttribute('data-index')) : parseInt(this.getAttribute('data-index') || '0'); - EmbyTabs.selectedIndex = function (selected, triggerEvent) { - const tabs = this; + if (currentIndex !== -1) { + this.selectedTabIndex = currentIndex; - if (selected == null) { - return tabs.selectedTabIndex || 0; + const tabButtons = this.querySelectorAll('.' + buttonClass); + + const newTabButton = tabButtons[currentIndex]; + + if (newTabButton) { + setActiveTabButton(newTabButton); + } + } + + if (!this.readyFired) { + this.readyFired = true; + this.dispatchEvent(new CustomEvent('ready', {})); + } } - const current = tabs.selectedIndex(); + detachedCallback() { + if (this.scroller) { + this.scroller.destroy(); + this.scroller = null; + } - tabs.selectedTabIndex = selected; + dom.removeEventListener(this, 'click', onClick, { + passive: true + }); + } - const tabButtons = tabs.querySelectorAll('.' + buttonClass); + getSelectedTabButton(elem) { + return elem.querySelector('.' + activeButtonClass); + } - if (current === selected || triggerEvent === false) { - triggerBeforeTabChange(tabs, selected, current); + selectedIndex(selected, triggerEvent) { + const tabs = this; + + if (selected == null) { + return tabs.selectedTabIndex || 0; + } + + const current = tabs.selectedIndex(); + + tabs.selectedTabIndex = selected; + + const tabButtons = tabs.querySelectorAll('.' + buttonClass); + + if (current === selected || triggerEvent === false) { + triggerBeforeTabChange(tabs, selected, current); + + tabs.dispatchEvent(new CustomEvent('tabchange', { + detail: { + selectedTabIndex: selected + } + })); + + const currentTabButton = tabButtons[current]; + setActiveTabButton(tabButtons[selected]); + + if (current !== selected && currentTabButton) { + currentTabButton.classList.remove(activeButtonClass); + } + } else { + onClick.call(tabs, { + target: tabButtons[selected] + }); + } + } + + getSibling(elem, method) { + let sibling = elem[method]; + + while (sibling) { + if (sibling.classList.contains(buttonClass)) { + if (!sibling.classList.contains('hide')) { + return sibling; + } + } + + sibling = sibling[method]; + } + + return null; + } + + selectNext() { + const current = this.getSelectedTabButton(this); + + const sibling = this.getSibling(current, 'nextSibling'); + + if (sibling) { + onClick.call(this, { + target: sibling + }); + } + } + + selectPrevious() { + const current = this.getSelectedTabButton(this); + + const sibling = this.getSibling(current, 'previousSibling'); + + if (sibling) { + onClick.call(this, { + target: sibling + }); + } + } + + triggerBeforeTabChange(selected) { + const tabs = this; + + triggerBeforeTabChange(tabs, tabs.selectedIndex()); + } + + triggerTabChange(selected) { + const tabs = this; tabs.dispatchEvent(new CustomEvent('tabchange', { detail: { - selectedTabIndex: selected + selectedTabIndex: tabs.selectedIndex() } })); - - const currentTabButton = tabButtons[current]; - setActiveTabButton(tabButtons[selected]); - - if (current !== selected && currentTabButton) { - currentTabButton.classList.remove(activeButtonClass); - } - } else { - onClick.call(tabs, { - target: tabButtons[selected] - }); - } - }; - - function getSibling(elem, method) { - let sibling = elem[method]; - - while (sibling) { - if (sibling.classList.contains(buttonClass)) { - if (!sibling.classList.contains('hide')) { - return sibling; - } - } - - sibling = sibling[method]; } - return null; + setTabEnabled(index, enabled) { + const btn = this.querySelector('.emby-tab-button[data-index="' + index + '"]'); + + if (enabled) { + btn.classList.remove('hide'); + } else { + btn.classList.remove('add'); + } + } } - EmbyTabs.selectNext = function () { - const current = getSelectedTabButton(this); - - const sibling = getSibling(current, 'nextSibling'); - - if (sibling) { - onClick.call(this, { - target: sibling - }); - } - }; - - EmbyTabs.selectPrevious = function () { - const current = getSelectedTabButton(this); - - const sibling = getSibling(current, 'previousSibling'); - - if (sibling) { - onClick.call(this, { - target: sibling - }); - } - }; - - EmbyTabs.triggerBeforeTabChange = function (selected) { - const tabs = this; - - triggerBeforeTabChange(tabs, tabs.selectedIndex()); - }; - - EmbyTabs.triggerTabChange = function (selected) { - const tabs = this; - - tabs.dispatchEvent(new CustomEvent('tabchange', { - detail: { - selectedTabIndex: tabs.selectedIndex() - } - })); - }; - - EmbyTabs.setTabEnabled = function (index, enabled) { - const btn = this.querySelector('.emby-tab-button[data-index="' + index + '"]'); - - if (enabled) { - btn.classList.remove('hide'); - } else { - btn.classList.remove('add'); - } - }; - - document.registerElement('emby-tabs', { - prototype: EmbyTabs, - extends: 'div' - }); + customElements.define('emby-tabs', EmbyTabs, { extends: 'div' }); /* eslint-enable indent */ diff --git a/src/libraries/navdrawer/navdrawer.js b/src/libraries/navdrawer/navdrawer.js index 4af9f56a1..214d86a02 100644 --- a/src/libraries/navdrawer/navdrawer.js +++ b/src/libraries/navdrawer/navdrawer.js @@ -8,7 +8,7 @@ import dom from '../../scripts/dom'; import './navdrawer.css'; import '../../assets/css/scrollstyles.css'; -export default function (options) { +export function NavigationDrawer(options) { function getTouches(e) { return e.changedTouches || e.targetTouches || e.touches; } diff --git a/src/libraries/screensavermanager.js b/src/libraries/screensavermanager.js index 93625449f..7d180fb7f 100644 --- a/src/libraries/screensavermanager.js +++ b/src/libraries/screensavermanager.js @@ -1,8 +1,7 @@ -import events from 'jellyfin-apiclient'; -import playbackManager from '../components/playback/playbackmanager'; -import pluginManager from '../components/pluginManager'; +import { ConnectionManager, events } from 'jellyfin-apiclient'; +import { playbackManager } from '../components/playback/playbackmanager'; +import { pluginManager } from '../components/pluginManager'; import inputManager from '../scripts/inputManager'; -import connectionManager from 'jellyfin-apiclient'; import * as userSettings from '../scripts/settings/userSettings'; function getMinIdleTime() { @@ -85,7 +84,7 @@ function ScreenSaverManager() { this.show = function () { let isLoggedIn; - const apiClient = window.connectionManager.currentApiClient(); + const apiClient = ConnectionManager.currentApiClient(); if (apiClient && apiClient.isLoggedIn()) { isLoggedIn = true; diff --git a/src/libraries/scroller.js b/src/libraries/scroller.js index f2baf5157..e6b7aeae0 100644 --- a/src/libraries/scroller.js +++ b/src/libraries/scroller.js @@ -195,6 +195,7 @@ const scrollerFactory = function (frame, options) { self.frameResizeObserver = new ResizeObserver(onResize, observerOptions); + console.warn(frame); self.frameResizeObserver.observe(frame); } diff --git a/src/plugins/backdropScreensaver/plugin.js b/src/plugins/backdropScreensaver/plugin.js index 917d8f48a..0def71878 100644 --- a/src/plugins/backdropScreensaver/plugin.js +++ b/src/plugins/backdropScreensaver/plugin.js @@ -1,4 +1,5 @@ /* eslint-disable indent */ +import { ConnectionManager } from 'jellyfin-apiclient'; class BackdropScreensaver { constructor() { @@ -20,10 +21,10 @@ class BackdropScreensaver { Limit: 200 }; - const apiClient = window.connectionManager.currentApiClient(); + const apiClient = ConnectionManager.currentApiClient(); apiClient.getItems(apiClient.getCurrentUserId(), query).then((result) => { if (result.Items.length) { - import('slideshow').then(({default: Slideshow}) => { + import('../../components/slideshow/slideshow').then(({default: Slideshow}) => { const newSlideShow = new Slideshow({ showTitle: true, cover: true, diff --git a/src/plugins/bookPlayer/plugin.js b/src/plugins/bookPlayer/plugin.js index 60f12f2b5..b513cfe60 100644 --- a/src/plugins/bookPlayer/plugin.js +++ b/src/plugins/bookPlayer/plugin.js @@ -1,10 +1,9 @@ -import connectionManager from 'jellyfin-apiclient'; import loading from '../../components/loading/loading'; -import keyboardnavigation from 'keyboardnavigation'; -import dialogHelper from 'dialogHelper'; -import dom from 'dom'; -import events from 'jellyfin-apiclient'; -import './style'; +import keyboardnavigation from '../../scripts/keyboardNavigation'; +import dialogHelper from '../../components/dialogHelper/dialogHelper'; +import dom from '../../scripts/dom'; +import { ConnectionManager, events } from 'jellyfin-apiclient'; +import './style.css'; import 'material-design-icons-iconfont'; import '../../elements/emby-button/paper-icon-button-light'; @@ -260,7 +259,7 @@ export class BookPlayer { }; const serverId = item.ServerId; - const apiClient = window.connectionManager.getApiClient(serverId); + const apiClient = ConnectionManager.getApiClient(serverId); return new Promise((resolve, reject) => { import('epubjs').then(({default: epubjs}) => { diff --git a/src/plugins/bookPlayer/tableOfContents.js b/src/plugins/bookPlayer/tableOfContents.js index 165c1fa9a..db498c10f 100644 --- a/src/plugins/bookPlayer/tableOfContents.js +++ b/src/plugins/bookPlayer/tableOfContents.js @@ -1,4 +1,4 @@ -import dialogHelper from 'dialogHelper'; +import dialogHelper from '../../components/dialogHelper/dialogHelper'; export default class TableOfContents { constructor(bookPlayer) { diff --git a/src/plugins/chromecastPlayer/plugin.js b/src/plugins/chromecastPlayer/plugin.js index ba09f9e20..ad8ecc0b9 100644 --- a/src/plugins/chromecastPlayer/plugin.js +++ b/src/plugins/chromecastPlayer/plugin.js @@ -1,9 +1,9 @@ -import appSettings from 'appSettings'; +import appSettings from '../../scripts/settings/appSettings'; import * as userSettings from '../../scripts/settings/userSettings'; -import playbackManager from 'playbackManager'; -import globalize from 'globalize'; -import events from 'jellyfin-apiclient'; -import castSenderApiLoader from 'castSenderApiLoader'; +import { playbackManager } from '../../components/playback/playbackmanager'; +import globalize from '../../scripts/globalize'; +import { ConnectionManager, events } from 'jellyfin-apiclient'; +import castSenderApiLoader from '../../components/castSenderApi'; // Based on https://github.com/googlecast/CastVideos-chrome/blob/master/CastVideos.js @@ -324,11 +324,11 @@ class CastPlayer { let apiClient; if (message.options && message.options.ServerId) { - apiClient = window.connectionManager.getApiClient(message.options.ServerId); + apiClient = ConnectionManager.getApiClient(message.options.ServerId); } else if (message.options && message.options.items && message.options.items.length) { - apiClient = window.connectionManager.getApiClient(message.options.items[0].ServerId); + apiClient = ConnectionManager.getApiClient(message.options.items[0].ServerId); } else { - apiClient = window.connectionManager.currentApiClient(); + apiClient = ConnectionManager.currentApiClient(); } message = Object.assign(message, { @@ -439,7 +439,7 @@ class CastPlayer { } function alertText(text, title) { - import('alert').then(({default: alert}) => { + import('../../components/alert').then(({default: alert}) => { alert({ text: text, title: title @@ -672,7 +672,7 @@ class ChromecastPlayer { playWithCommand(options, command) { if (!options.items) { - const apiClient = window.connectionManager.getApiClient(options.serverId); + const apiClient = ConnectionManager.getApiClient(options.serverId); const instance = this; return apiClient.getItem(apiClient.getCurrentUserId(), options.ids[0]).then(function (item) { @@ -984,7 +984,7 @@ class ChromecastPlayer { } shuffle(item) { - const apiClient = window.connectionManager.getApiClient(item.ServerId); + const apiClient = ConnectionManager.getApiClient(item.ServerId); const userId = apiClient.getCurrentUserId(); const instance = this; @@ -997,7 +997,7 @@ class ChromecastPlayer { } instantMix(item) { - const apiClient = window.connectionManager.getApiClient(item.ServerId); + const apiClient = ConnectionManager.getApiClient(item.ServerId); const userId = apiClient.getCurrentUserId(); const instance = this; @@ -1035,7 +1035,7 @@ class ChromecastPlayer { } const instance = this; - const apiClient = window.connectionManager.getApiClient(options.serverId); + const apiClient = ConnectionManager.getApiClient(options.serverId); return getItemsForPlayback(apiClient, { Ids: options.ids.join(',') diff --git a/src/plugins/experimentalWarnings/plugin.js b/src/plugins/experimentalWarnings/plugin.js index bc301f01a..fb9957aea 100644 --- a/src/plugins/experimentalWarnings/plugin.js +++ b/src/plugins/experimentalWarnings/plugin.js @@ -1,6 +1,6 @@ -import globalize from 'globalize'; -import * as userSettings from 'userSettings'; -import appHost from 'apphost'; +import globalize from '../../scripts/globalize'; +import * as userSettings from '../../scripts/settings/userSettings'; +import { appHost } from '../../components/apphost'; // TODO: Replace with date-fns // https://stackoverflow.com/questions/6117814/get-week-of-year-in-javascript-like-in-php @@ -29,7 +29,7 @@ function showMessage(text, userSettingsKey, appHostFeature) { return new Promise(function (resolve, reject) { userSettings.set(userSettingsKey, '1', false); - import('alert').then(({default: alert}) => { + import('../../components/alert').then(({default: alert}) => { return alert(text).then(resolve, resolve); }); }); diff --git a/src/plugins/htmlAudioPlayer/plugin.js b/src/plugins/htmlAudioPlayer/plugin.js index 68380bcdb..342a8a208 100644 --- a/src/plugins/htmlAudioPlayer/plugin.js +++ b/src/plugins/htmlAudioPlayer/plugin.js @@ -1,10 +1,10 @@ -import events from 'jellyfin-apiclient'; -import browser from 'browser'; -import appHost from 'apphost'; -import * as htmlMediaHelper from 'htmlMediaHelper'; +import { events } from 'jellyfin-apiclient'; +import browser from '../../scripts/browser'; +import { appHost } from '../../components/apphost'; +import * as htmlMediaHelper from '../../components/htmlMediaHelper'; function getDefaultProfile() { - return import('browserdeviceprofile').then(({ default: profileBuilder }) => { + return import('../../scripts/browserDeviceProfile').then(({ default: profileBuilder }) => { return profileBuilder({}); }); } @@ -51,7 +51,7 @@ function supportsFade() { } function requireHlsPlayer(callback) { - import('hlsjs').then(({ default: hls }) => { + import('hls.js').then(({ default: hls }) => { window.Hls = hls; callback(); }); @@ -68,7 +68,7 @@ function enableHlsPlayer(url, item, mediaSource, mediaType) { // issue head request to get content type return new Promise(function (resolve, reject) { - import('fetchHelper').then((fetchHelper) => { + import('../../components/fetchhelper').then((fetchHelper) => { fetchHelper.ajax({ url: url, type: 'HEAD' diff --git a/src/plugins/htmlVideoPlayer/plugin.js b/src/plugins/htmlVideoPlayer/plugin.js index f4c7f25b7..2c5072a07 100644 --- a/src/plugins/htmlVideoPlayer/plugin.js +++ b/src/plugins/htmlVideoPlayer/plugin.js @@ -1,10 +1,10 @@ -import browser from 'browser'; -import events from 'jellyfin-apiclient'; -import appHost from 'apphost'; +import browser from '../../scripts/browser'; +import { ConnectionManager, events } from 'jellyfin-apiclient'; +import { appHost } from '../../components/apphost'; import loading from '../../components/loading/loading'; -import dom from 'dom'; -import playbackManager from 'playbackManager'; -import appRouter from 'appRouter'; +import dom from '../../scripts/dom'; +import { playbackManager } from '../../components/playback/playbackmanager'; +import { appRouter } from '../../components/appRouter'; import { bindEventsToHlsPlayer, destroyHlsPlayer, @@ -22,10 +22,10 @@ import { getSavedVolume, isValidDuration, getBufferedRanges -} from 'htmlMediaHelper'; -import itemHelper from 'itemHelper'; -import screenfull from 'screenfull'; -import globalize from 'globalize'; +} from '../../components/htmlMediaHelper'; +import itemHelper from '../../components/itemHelper'; +import Screenfull from 'screenfull'; +import globalize from '../../scripts/globalize'; /* eslint-disable indent */ @@ -85,7 +85,7 @@ function tryRemoveElement(elem) { } function requireHlsPlayer(callback) { - import('hlsjs').then(({default: hls}) => { + import('hls.js').then(({default: hls}) => { window.Hls = hls; callback(); }); @@ -139,7 +139,7 @@ function tryRemoveElement(elem) { } function getDefaultProfile() { - return import('browserdeviceprofile').then(({default: profileBuilder}) => { + return import('../../scripts/browserDeviceProfile').then(({default: profileBuilder}) => { return profileBuilder({}); }); } @@ -323,7 +323,7 @@ function tryRemoveElement(elem) { console.debug(`prefetching hls playlist: ${hlsPlaylistUrl}`); - return window.connectionManager.getApiClient(item.ServerId).ajax({ + return ConnectionManager.getApiClient(item.ServerId).ajax({ type: 'GET', url: hlsPlaylistUrl @@ -362,7 +362,7 @@ function tryRemoveElement(elem) { * @private */ setSrcWithFlvJs(elem, options, url) { - return import('flvjs').then(({default: flvjs}) => { + return import('flv.js').then(({default: flvjs}) => { const flvPlayer = flvjs.createPlayer({ type: 'flv', url: url @@ -704,8 +704,8 @@ function tryRemoveElement(elem) { dlg.parentNode.removeChild(dlg); } - if (screenfull.isEnabled) { - screenfull.exit(); + if (Screenfull.isEnabled) { + Screenfull.exit(); } else { // iOS Safari if (document.webkitIsFullScreen && document.webkitCancelFullscreen) { @@ -1031,7 +1031,7 @@ function tryRemoveElement(elem) { */ renderSsaAss(videoElement, track, item) { const attachments = this._currentPlayOptions.mediaSource.MediaAttachments || []; - const apiClient = window.connectionManager.getApiClient(item); + const apiClient = ConnectionManager.getApiClient(item); const htmlVideoPlayer = this; const options = { video: videoElement, @@ -1058,7 +1058,7 @@ function tryRemoveElement(elem) { resizeVariation: 0.2, renderAhead: 90 }; - import('JavascriptSubtitlesOctopus').then(({default: SubtitlesOctopus}) => { + import('libass-wasm').then(({default: SubtitlesOctopus}) => { this.#currentSubtitlesOctopus = new SubtitlesOctopus(options); }); } @@ -1114,7 +1114,7 @@ function tryRemoveElement(elem) { * @private */ setSubtitleAppearance(elem, innerElem) { - Promise.all([import('userSettings'), import('subtitleAppearanceHelper')]).then(([userSettings, subtitleAppearanceHelper]) => { + Promise.all([import('../../scripts/settings/userSettings'), import('../../components/subtitlesettings/subtitleappearancehelper')]).then(([userSettings, subtitleAppearanceHelper]) => { subtitleAppearanceHelper.applyStyles({ text: innerElem, window: elem @@ -1135,7 +1135,7 @@ function tryRemoveElement(elem) { * @private */ setCueAppearance() { - Promise.all([import('userSettings'), import('subtitleAppearanceHelper')]).then(([userSettings, subtitleAppearanceHelper]) => { + Promise.all([import('../../scripts/settings/userSettings'), import('../../components/subtitlesettings/subtitleappearancehelper')]).then(([userSettings, subtitleAppearanceHelper]) => { const elementId = `${this.id}-cuestyle`; let styleElem = document.querySelector(`#${elementId}`); @@ -1190,7 +1190,7 @@ function tryRemoveElement(elem) { // download the track json this.fetchSubtitles(track, item).then(function (data) { - import('userSettings').then((userSettings) => { + import('../../scripts/settings/userSettings').then((userSettings) => { // show in ui console.debug(`downloaded ${data.TrackEvents.length} track events`); @@ -1282,7 +1282,7 @@ function tryRemoveElement(elem) { const dlg = document.querySelector('.videoPlayerContainer'); if (!dlg) { - return import('./style').then(() => { + return import('./style.css').then(() => { loading.show(); const dlg = document.createElement('div'); diff --git a/src/plugins/logoScreensaver/plugin.js b/src/plugins/logoScreensaver/plugin.js index 619c0de25..7c2b71342 100644 --- a/src/plugins/logoScreensaver/plugin.js +++ b/src/plugins/logoScreensaver/plugin.js @@ -1,5 +1,3 @@ -import pluginManager from 'pluginManager'; - export default function () { const self = this; @@ -128,7 +126,7 @@ export default function () { } self.show = function () { - import('' + pluginManager.mapPath(self, 'style.css')).then(() => { + import('./style.css').then(() => { let elem = document.querySelector('.logoScreenSaver'); if (!elem) { diff --git a/src/plugins/photoPlayer/plugin.js b/src/plugins/photoPlayer/plugin.js index c40477778..9ea48a11a 100644 --- a/src/plugins/photoPlayer/plugin.js +++ b/src/plugins/photoPlayer/plugin.js @@ -1,3 +1,4 @@ +import { ConnectionManager } from 'jellyfin-apiclient'; export default class PhotoPlayer { constructor() { @@ -9,12 +10,12 @@ export default class PhotoPlayer { play(options) { return new Promise(function (resolve, reject) { - import('slideshow').then(({default: slideshow}) => { - const index = options.startIndex || 0; + import('../../components/slideshow/slideshow').then(({default: Slideshow}) => { + var index = options.startIndex || 0; - const apiClient = window.connectionManager.currentApiClient(); + var apiClient = ConnectionManager.currentApiClient(); apiClient.getCurrentUser().then(function(result) { - const newSlideShow = new slideshow({ + var newSlideShow = new Slideshow({ showTitle: false, cover: false, items: options.items, diff --git a/src/plugins/playAccessValidation/plugin.js b/src/plugins/playAccessValidation/plugin.js index c64b63332..65f6732c2 100644 --- a/src/plugins/playAccessValidation/plugin.js +++ b/src/plugins/playAccessValidation/plugin.js @@ -1,7 +1,8 @@ -import globalize from 'globalize'; +import { ConnectionManager } from 'jellyfin-apiclient'; +import globalize from '../../scripts/globalize'; function showErrorMessage() { - return import('alert').then(({default: alert}) => { + return import('../../components/alert').then(({default: alert}) => { return alert(globalize.translate('MessagePlayAccessRestricted')); }); } @@ -24,7 +25,7 @@ class PlayAccessValidation { return Promise.resolve(); } - return window.connectionManager.getApiClient(serverId).getCurrentUser().then(function (user) { + return ConnectionManager.getApiClient(serverId).getCurrentUser().then(function (user) { if (user.Policy.EnableMediaPlayback) { return Promise.resolve(); } diff --git a/src/plugins/sessionPlayer/plugin.js b/src/plugins/sessionPlayer/plugin.js index 619266b01..bbf13ffb4 100644 --- a/src/plugins/sessionPlayer/plugin.js +++ b/src/plugins/sessionPlayer/plugin.js @@ -1,6 +1,6 @@ -import playbackManager from 'playbackManager'; -import events from 'events'; -import serverNotifications from 'serverNotifications'; +import { playbackManager } from '../../components/playback/playbackmanager'; +import { ConnectionManager, events } from 'jellyfin-apiclient'; +import serverNotifications from '../../scripts/serverNotifications'; function getActivePlayerId() { const info = playbackManager.getPlayerInfo(); @@ -53,10 +53,10 @@ function getCurrentApiClient(instance) { const currentServerId = instance.currentServerId; if (currentServerId) { - return window.connectionManager.getApiClient(currentServerId); + return ConnectionManager.getApiClient(currentServerId); } - return window.connectionManager.currentApiClient(); + return ConnectionManager.currentApiClient(); } function sendCommandByName(instance, name, options) { diff --git a/src/plugins/youtubePlayer/plugin.js b/src/plugins/youtubePlayer/plugin.js index 568077b0f..a975d8e34 100644 --- a/src/plugins/youtubePlayer/plugin.js +++ b/src/plugins/youtubePlayer/plugin.js @@ -1,6 +1,6 @@ -import events from 'jellyfin-apiclient'; -import browser from 'browser'; -import appRouter from 'appRouter'; +import { events } from 'jellyfin-apiclient'; +import browser from '../../scripts/browser'; +import { appRouter } from '../../components/appRouter'; import loading from '../../components/loading/loading'; /* globals YT */ @@ -20,7 +20,7 @@ function createMediaElement(instance, options) { const dlg = document.querySelector('.youtubePlayerContainer'); if (!dlg) { - import('./style').then(() => { + import('./style.css').then(() => { loading.show(); const dlg = document.createElement('div'); @@ -114,7 +114,7 @@ function onPlaying(instance, playOptions, resolve) { instance.videoDialog.classList.remove('onTop'); } - import('loading').then(({default: loading}) => { + import('../../components/loading/loading').then(({default: loading}) => { loading.hide(); }); } @@ -122,60 +122,58 @@ function onPlaying(instance, playOptions, resolve) { function setCurrentSrc(instance, elem, options) { return new Promise(function (resolve, reject) { - import('queryString').then(({default: queryString}) => { - instance._currentSrc = options.url; - const params = queryString.parse(options.url.split('?')[1]); - // 3. This function creates an