aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--.dev/.sasslintrc17
-rw-r--r--.dev/.stylelintrc.js15
-rw-r--r--.github/mailmap1
-rw-r--r--.htaccess23
-rw-r--r--.travis.yml26
-rw-r--r--AUTHORS14
-rw-r--r--CHANGELOG.md30
-rw-r--r--Makefile8
-rw-r--r--README.md6
-rw-r--r--application/Languages.php3
-rw-r--r--application/Utils.php4
-rw-r--r--application/api/ApiMiddleware.php10
-rw-r--r--application/bookmark/BookmarkArray.php9
-rw-r--r--application/bookmark/BookmarkFileService.php17
-rw-r--r--application/bookmark/BookmarkFilter.php17
-rw-r--r--application/bookmark/BookmarkInitializer.php74
-rw-r--r--application/bookmark/BookmarkServiceInterface.php9
-rw-r--r--application/bookmark/LinkUtils.php2
-rw-r--r--application/config/ConfigJson.php2
-rw-r--r--application/container/ContainerBuilder.php4
-rw-r--r--application/container/ShaarliContainer.php9
-rw-r--r--application/feed/FeedBuilder.php8
-rw-r--r--application/formatter/BookmarkFormatter.php26
-rw-r--r--application/formatter/BookmarkMarkdownExtraFormatter.php24
-rw-r--r--application/front/ShaarliMiddleware.php2
-rw-r--r--application/front/controller/admin/ConfigureController.php2
-rw-r--r--application/front/controller/admin/ManageShaareController.php16
-rw-r--r--application/front/controller/admin/ManageTagController.php4
-rw-r--r--application/front/controller/admin/PluginsController.php1
-rw-r--r--application/front/controller/admin/ShaarliAdminController.php2
-rw-r--r--application/front/controller/visitor/BookmarkListController.php7
-rw-r--r--application/front/controller/visitor/DailyController.php2
-rw-r--r--application/front/controller/visitor/ErrorNotFoundController.php29
-rw-r--r--application/front/controller/visitor/FeedController.php4
-rw-r--r--application/front/controller/visitor/ShaarliVisitorController.php33
-rw-r--r--application/front/controller/visitor/TagCloudController.php12
-rw-r--r--application/http/HttpUtils.php8
-rw-r--r--application/legacy/LegacyController.php44
-rw-r--r--application/legacy/LegacyRouter.php134
-rw-r--r--application/plugin/PluginManager.php25
-rw-r--r--application/render/PageBuilder.php4
-rw-r--r--application/security/SessionManager.php1
-rw-r--r--assets/default/js/base.js48
-rw-r--r--assets/default/scss/shaarli.scss47
-rw-r--r--assets/vintage/css/shaarli.css2
-rw-r--r--composer.json15
-rw-r--r--composer.lock862
-rw-r--r--doc/md/3rd-party-libraries.md21
-rw-r--r--doc/md/Backup-and-restore.md11
-rw-r--r--doc/md/Browsing-and-searching.md37
-rw-r--r--doc/md/Community-and-related-software.md (renamed from doc/md/Community-&-Related-software.md)60
-rw-r--r--doc/md/Continuous-integration-tools.md32
-rw-r--r--doc/md/Development-guidelines.md13
-rw-r--r--doc/md/Directory-structure.md54
-rw-r--r--doc/md/Docker.md227
-rw-r--r--doc/md/Download-and-Installation.md124
-rw-r--r--doc/md/FAQ.md46
-rw-r--r--doc/md/Installation.md78
-rw-r--r--doc/md/Link-structure.md18
-rw-r--r--doc/md/Plugins.md61
-rw-r--r--doc/md/REST-API.md159
-rw-r--r--doc/md/RSS-feeds.md28
-rw-r--r--doc/md/Release-Shaarli.md161
-rw-r--r--doc/md/Reverse-proxy.md141
-rw-r--r--doc/md/Security.md25
-rw-r--r--doc/md/Server-configuration.md644
-rw-r--r--doc/md/Server-security.md76
-rw-r--r--doc/md/Shaarli-configuration.md217
-rw-r--r--doc/md/Sharing-content.md71
-rw-r--r--doc/md/Static-analysis.md13
-rw-r--r--doc/md/Troubleshooting.md140
-rw-r--r--doc/md/Unit-tests.md119
-rw-r--r--doc/md/Upgrade-and-migration.md144
-rw-r--r--doc/md/Usage.md111
-rw-r--r--doc/md/dev/Development.md179
-rw-r--r--doc/md/dev/GnuPG-signature.md (renamed from doc/md/GnuPG-signature.md)20
-rw-r--r--doc/md/dev/Plugin-system.md (renamed from doc/md/Plugin-System.md)154
-rw-r--r--doc/md/dev/Release-Shaarli.md145
-rw-r--r--doc/md/dev/Theming.md (renamed from doc/md/Theming.md)3
-rw-r--r--doc/md/dev/Translations.md (renamed from doc/md/Translations.md)71
-rw-r--r--doc/md/dev/Unit-tests.md133
-rw-r--r--doc/md/dev/Versioning.md (renamed from doc/md/Versioning-and-Branches.md)28
-rw-r--r--doc/md/dev/images/poedit-1.jpg (renamed from doc/md/images/poedit-1.jpg)bin72956 -> 72956 bytes
-rw-r--r--doc/md/docker/docker-101.md140
-rw-r--r--doc/md/docker/resources.md19
-rw-r--r--doc/md/docker/reverse-proxy-configuration.md123
-rw-r--r--doc/md/docker/shaarli-images.md118
-rw-r--r--doc/md/guides/backup-restore-import-export.md64
-rw-r--r--doc/md/guides/images/01-create-droplet-distro.jpgbin20909 -> 0 bytes
-rw-r--r--doc/md/guides/images/02-create-droplet-region.jpgbin21603 -> 0 bytes
-rw-r--r--doc/md/guides/images/03-create-droplet-size.jpgbin20860 -> 0 bytes
-rw-r--r--doc/md/guides/images/04-finalize.jpgbin28233 -> 0 bytes
-rw-r--r--doc/md/guides/images/05-droplet.jpgbin11977 -> 0 bytes
-rw-r--r--doc/md/guides/images/06-domain.jpgbin4499 -> 0 bytes
-rw-r--r--doc/md/guides/install-shaarli-with-debian9-and-docker.md257
-rw-r--r--doc/md/guides/various-hacks.md24
-rw-r--r--doc/md/images/07-installation.jpg (renamed from doc/md/guides/images/07-installation.jpg)bin42832 -> 42832 bytes
-rw-r--r--doc/md/images/bookmarklet.pngbin53346 -> 0 bytes
-rw-r--r--doc/md/images/firefoxshare.pngbin715 -> 0 bytes
-rw-r--r--doc/md/images/install-shaarli.pngbin33827 -> 0 bytes
-rw-r--r--doc/md/index.md127
-rw-r--r--docker-compose.yml2
-rw-r--r--inc/languages/fr/LC_MESSAGES/shaarli.po269
-rw-r--r--inc/languages/jp/LC_MESSAGES/shaarli.po (renamed from inc/languages/ja/LC_MESSAGES/shaarli.po)0
-rw-r--r--index.php5
-rw-r--r--mkdocs.yml46
-rw-r--r--package.json31
-rw-r--r--plugins/archiveorg/archiveorg.php6
-rw-r--r--plugins/default_colors/default_colors.php56
-rw-r--r--plugins/isso/isso.php2
-rw-r--r--plugins/playvideos/README.md9
-rw-r--r--plugins/qrcode/qrcode.php2
-rw-r--r--tests/ApplicationUtilsTest.php21
-rw-r--r--tests/FileUtilsTest.php22
-rw-r--r--tests/HistoryTest.php17
-rw-r--r--tests/LanguagesTest.php4
-rw-r--r--tests/PluginManagerTest.php51
-rw-r--r--tests/TestCase.php77
-rw-r--r--tests/ThumbnailerTest.php5
-rw-r--r--tests/TimeZoneTest.php4
-rw-r--r--tests/UtilsTest.php8
-rw-r--r--tests/api/ApiMiddlewareTest.php65
-rw-r--r--tests/api/ApiUtilsTest.php76
-rw-r--r--tests/api/controllers/history/HistoryTest.php6
-rw-r--r--tests/api/controllers/info/InfoTest.php6
-rw-r--r--tests/api/controllers/links/DeleteLinkTest.php10
-rw-r--r--tests/api/controllers/links/GetLinkIdTest.php12
-rw-r--r--tests/api/controllers/links/GetLinksTest.php6
-rw-r--r--tests/api/controllers/links/PostLinkTest.php6
-rw-r--r--tests/api/controllers/links/PutLinkTest.php12
-rw-r--r--tests/api/controllers/tags/DeleteTagTest.php12
-rw-r--r--tests/api/controllers/tags/GetTagNameTest.php12
-rw-r--r--tests/api/controllers/tags/GetTagsTest.php6
-rw-r--r--tests/api/controllers/tags/PutTagTest.php18
-rw-r--r--tests/bookmark/BookmarkArrayTest.php29
-rw-r--r--tests/bookmark/BookmarkFileServiceTest.php141
-rw-r--r--tests/bookmark/BookmarkFilterTest.php30
-rw-r--r--tests/bookmark/BookmarkInitializerTest.php72
-rw-r--r--tests/bookmark/BookmarkTest.php12
-rw-r--r--tests/bookmark/LinkUtilsTest.php35
-rw-r--r--tests/bootstrap.php1
-rw-r--r--tests/config/ConfigJsonTest.php25
-rw-r--r--tests/config/ConfigManagerTest.php26
-rw-r--r--tests/config/ConfigPhpTest.php4
-rw-r--r--tests/config/ConfigPluginTest.php6
-rw-r--r--tests/container/ContainerBuilderTest.php4
-rw-r--r--tests/feed/CachedPageTest.php6
-rw-r--r--tests/feed/FeedBuilderTest.php41
-rw-r--r--tests/formatter/BookmarkDefaultFormatterTest.php4
-rw-r--r--tests/formatter/BookmarkMarkdownExtraFormatterTest.php162
-rw-r--r--tests/formatter/BookmarkMarkdownFormatterTest.php4
-rw-r--r--tests/formatter/BookmarkRawFormatterTest.php4
-rw-r--r--tests/formatter/FormatterFactoryTest.php4
-rw-r--r--tests/front/ShaarliAdminMiddlewareTest.php2
-rw-r--r--tests/front/ShaarliMiddlewareTest.php2
-rw-r--r--tests/front/controller/admin/ConfigureControllerTest.php6
-rw-r--r--tests/front/controller/admin/ExportControllerTest.php4
-rw-r--r--tests/front/controller/admin/ImportControllerTest.php2
-rw-r--r--tests/front/controller/admin/LogoutControllerTest.php3
-rw-r--r--tests/front/controller/admin/ManageShaareControllerTest/AddShaareTest.php2
-rw-r--r--tests/front/controller/admin/ManageShaareControllerTest/ChangeVisibilityBookmarkTest.php2
-rw-r--r--tests/front/controller/admin/ManageShaareControllerTest/DeleteBookmarkTest.php2
-rw-r--r--tests/front/controller/admin/ManageShaareControllerTest/DisplayCreateFormTest.php12
-rw-r--r--tests/front/controller/admin/ManageShaareControllerTest/DisplayEditFormTest.php2
-rw-r--r--tests/front/controller/admin/ManageShaareControllerTest/PinBookmarkTest.php2
-rw-r--r--tests/front/controller/admin/ManageShaareControllerTest/SaveBookmarkTest.php68
-rw-r--r--tests/front/controller/admin/ManageTagControllerTest.php2
-rw-r--r--tests/front/controller/admin/PasswordControllerTest.php2
-rw-r--r--tests/front/controller/admin/PluginsControllerTest.php7
-rw-r--r--tests/front/controller/admin/SessionFilterControllerTest.php10
-rw-r--r--tests/front/controller/admin/ShaarliAdminControllerTest.php2
-rw-r--r--tests/front/controller/admin/ThumbnailsControllerTest.php2
-rw-r--r--tests/front/controller/admin/TokenControllerTest.php2
-rw-r--r--tests/front/controller/admin/ToolsControllerTest.php8
-rw-r--r--tests/front/controller/visitor/BookmarkListControllerTest.php2
-rw-r--r--tests/front/controller/visitor/DailyControllerTest.php60
-rw-r--r--tests/front/controller/visitor/ErrorControllerTest.php2
-rw-r--r--tests/front/controller/visitor/ErrorNotFoundControllerTest.php81
-rw-r--r--tests/front/controller/visitor/FeedControllerTest.php38
-rw-r--r--tests/front/controller/visitor/FrontControllerMockHelper.php7
-rw-r--r--tests/front/controller/visitor/InstallControllerTest.php37
-rw-r--r--tests/front/controller/visitor/LoginControllerTest.php2
-rw-r--r--tests/front/controller/visitor/OpenSearchControllerTest.php4
-rw-r--r--tests/front/controller/visitor/PictureWallControllerTest.php18
-rw-r--r--tests/front/controller/visitor/PublicSessionFilterControllerTest.php8
-rw-r--r--tests/front/controller/visitor/ShaarliVisitorControllerTest.php47
-rw-r--r--tests/front/controller/visitor/TagCloudControllerTest.php74
-rw-r--r--tests/front/controller/visitor/TagControllerTest.php2
-rw-r--r--tests/http/HttpUtils/ClientIpIdTest.php2
-rw-r--r--tests/http/HttpUtils/GetHttpUrlTest.php2
-rw-r--r--tests/http/HttpUtils/GetIpAdressFromProxyTest.php2
-rw-r--r--tests/http/HttpUtils/IndexUrlTest.php36
-rw-r--r--tests/http/HttpUtils/IndexUrlTestWithConstant.php51
-rw-r--r--tests/http/HttpUtils/IsHttpsTest.php2
-rw-r--r--tests/http/HttpUtils/PageUrlTest.php2
-rw-r--r--tests/http/HttpUtils/ServerUrlTest.php2
-rw-r--r--tests/http/UrlTest.php2
-rw-r--r--tests/http/UrlUtils/CleanupUrlTest.php2
-rw-r--r--tests/http/UrlUtils/GetUrlSchemeTest.php2
-rw-r--r--tests/http/UrlUtils/UnparseUrlTest.php2
-rw-r--r--tests/http/UrlUtils/WhitelistProtocolsTest.php2
-rw-r--r--tests/languages/fr/LanguagesFrTest.php6
-rw-r--r--tests/legacy/LegacyControllerTest.php10
-rw-r--r--tests/legacy/LegacyLinkDBTest.php28
-rw-r--r--tests/legacy/LegacyLinkFilterTest.php18
-rw-r--r--tests/legacy/LegacyRouterTest.php512
-rw-r--r--tests/legacy/LegacyUpdaterTest.php24
-rw-r--r--tests/netscape/BookmarkExportTest.php9
-rw-r--r--tests/netscape/BookmarkImportTest.php10
-rw-r--r--tests/plugins/PluginAddlinkTest.php4
-rw-r--r--tests/plugins/PluginArchiveorgTest.php37
-rw-r--r--tests/plugins/PluginDefaultColorsTest.php25
-rw-r--r--tests/plugins/PluginIssoTest.php23
-rw-r--r--tests/plugins/PluginPlayvideosTest.php4
-rw-r--r--tests/plugins/PluginPubsubhubbubTest.php4
-rw-r--r--tests/plugins/PluginQrcodeTest.php4
-rw-r--r--tests/plugins/PluginWallabagTest.php4
-rw-r--r--tests/plugins/WallabagInstanceTest.php4
-rw-r--r--tests/plugins/test/test.php3
-rw-r--r--tests/render/PageCacheManagerTest.php6
-rw-r--r--tests/render/ThemeUtilsTest.php2
-rw-r--r--tests/security/BanManagerTest.php4
-rw-r--r--tests/security/LoginManagerTest.php4
-rw-r--r--tests/security/SessionManagerTest.php19
-rw-r--r--tests/updater/DummyUpdater.php8
-rw-r--r--tests/updater/UpdaterTest.php20
-rw-r--r--tpl/default/includes.html2
-rw-r--r--tpl/default/linklist.html16
-rw-r--r--tpl/default/linklist.paging.html57
-rw-r--r--tpl/default/tag.cloud.html6
-rw-r--r--tpl/default/tag.list.html10
-rw-r--r--tpl/default/tag.sort.html4
-rw-r--r--tpl/vintage/editlink.html1
-rw-r--r--tpl/vintage/linklist.paging.html2
-rw-r--r--webpack.config.js68
-rw-r--r--yarn.lock7569
236 files changed, 8359 insertions, 8395 deletions
diff --git a/.dev/.sasslintrc b/.dev/.sasslintrc
deleted file mode 100644
index 47c3145d..00000000
--- a/.dev/.sasslintrc
+++ /dev/null
@@ -1,17 +0,0 @@
1options:
2 max-warnings: 0
3rules:
4 property-sort-order:
5 - 0
6# Sort order rule does not work with CSS variables: https://github.com/sasstools/sass-lint/issues/1161
7# - 1
8# -
9# order: 'concentric'
10 no-important:
11 - 0
12 no-vendor-prefixes:
13 - 0 # this will be fixed with v2: see https://github.com/sasstools/sass-lint/pull/1137
14 nesting-depth:
15 - 1
16 -
17 max-depth: 4
diff --git a/.dev/.stylelintrc.js b/.dev/.stylelintrc.js
new file mode 100644
index 00000000..a754e33b
--- /dev/null
+++ b/.dev/.stylelintrc.js
@@ -0,0 +1,15 @@
1module.exports = {
2 extends: 'stylelint-config-standard',
3 plugins: [
4 "stylelint-scss"
5 ],
6 rules: {
7 "indentation": [2],
8 "number-leading-zero": null,
9 // Replace CSS @ with SASS ones
10 "at-rule-no-unknown": null,
11 "scss/at-rule-no-unknown": true,
12 // not compatible with SASS apparently
13 "no-descending-specificity": null
14 },
15}
diff --git a/.github/mailmap b/.github/mailmap
index 366946e8..15a25e43 100644
--- a/.github/mailmap
+++ b/.github/mailmap
@@ -3,6 +3,7 @@ ArthurHoaro <arthur@hoa.ro> Arthur
3Florian Eula <eula.florian@gmail.com> feula 3Florian Eula <eula.florian@gmail.com> feula
4Florian Eula <eula.florian@gmail.com> <mr.pikzen@gmail.com> 4Florian Eula <eula.florian@gmail.com> <mr.pikzen@gmail.com>
5Immánuel Fodor <immanuelfactor+github@gmail.com> 5Immánuel Fodor <immanuelfactor+github@gmail.com>
6Immánuel Fodor <immanuelfactor+github@gmail.com> Immánuel! <21174107+immanuelfodor@users.noreply.github.com>
6kalvn <kalvnthereal@gmail.com> <kalvn@users.noreply.github.com> 7kalvn <kalvnthereal@gmail.com> <kalvn@users.noreply.github.com>
7kalvn <kalvnthereal@gmail.com> <kalvn@pm.me> 8kalvn <kalvnthereal@gmail.com> <kalvn@pm.me>
8Neros <contact@neros.fr> <NerosTie@users.noreply.github.com> 9Neros <contact@neros.fr> <NerosTie@users.noreply.github.com>
diff --git a/.htaccess b/.htaccess
index 4c004271..25fcfb03 100644
--- a/.htaccess
+++ b/.htaccess
@@ -7,31 +7,20 @@ RewriteEngine On
7RewriteRule ^(.git|doxygen|vendor) - [F] 7RewriteRule ^(.git|doxygen|vendor) - [F]
8 8
9# Forward the "Authorization" HTTP header 9# Forward the "Authorization" HTTP header
10# fixes JWT token not correctly forwarded on some Apache/FastCGI setups
10RewriteCond %{HTTP:Authorization} ^(.*) 11RewriteCond %{HTTP:Authorization} ^(.*)
11RewriteRule .* - [e=HTTP_AUTHORIZATION:%1] 12RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]
13# Alternative (if the 2 lines above don't work)
14# SetEnvIf Authorization .+ HTTP_AUTHORIZATION=$0
12 15
13# REST API 16# REST API
17# Ionos Hosting needs RewriteBase /
18# RewriteBase /
14RewriteCond %{REQUEST_FILENAME} !-f 19RewriteCond %{REQUEST_FILENAME} !-f
15RewriteCond %{REQUEST_FILENAME} !-d 20RewriteCond %{REQUEST_FILENAME} !-d
16RewriteRule ^ index.php [QSA,L] 21RewriteRule ^ index.php [QSA,L]
17 22
18<Limit GET POST PUT DELETE OPTIONS> 23<LimitExcept GET POST PUT DELETE PATCH OPTIONS>
19 <IfModule version_module>
20 <IfVersion >= 2.4>
21 Require all granted
22 </IfVersion>
23 <IfVersion < 2.4>
24 Allow from all
25 Deny from none
26 </IfVersion>
27 </IfModule>
28
29 <IfModule !version_module>
30 Require all granted
31 </IfModule>
32</Limit>
33
34<LimitExcept GET POST PUT DELETE OPTIONS>
35 <IfModule version_module> 24 <IfModule version_module>
36 <IfVersion >= 2.4> 25 <IfVersion >= 2.4>
37 Require all denied 26 Require all denied
diff --git a/.travis.yml b/.travis.yml
index d04a45d1..d7460947 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -2,6 +2,15 @@ dist: bionic
2 2
3matrix: 3matrix:
4 include: 4 include:
5 # jobs for each supported php version
6 - language: php
7 php: nightly # PHP 8.0
8 install:
9 - composer self-update --2
10 - composer update --ignore-platform-req=php
11 - composer remove --dev --ignore-platform-req=php phpunit/phpunit
12 - composer require --dev --ignore-platform-req=php phpunit/php-text-template ^2.0
13 - composer require --dev --ignore-platform-req=php phpunit/phpunit ^9.0
5 - language: php 14 - language: php
6 php: 7.4 15 php: 7.4
7 - language: php 16 - language: php
@@ -10,23 +19,22 @@ matrix:
10 php: 7.2 19 php: 7.2
11 - language: php 20 - language: php
12 php: 7.1 21 php: 7.1
22 # jobs for frontend builds
13 - language: node_js 23 - language: node_js
14 node_js: 8 24 node_js: 10
15 cache: 25 cache:
16 yarn: true 26 yarn: true
17 directories: 27 directories:
18 - $HOME/.cache/yarn 28 - $HOME/.cache/yarn
19
20 install: 29 install:
21 - yarn install 30 - yarn install
22
23 before_script: 31 before_script:
24 - PATH=${PATH//:\.\/node_modules\/\.bin/} 32 - PATH=${PATH//:\.\/node_modules\/\.bin/}
25
26 script: 33 script:
27 - yarn run build # Just to be sure that the build isn't broken 34 - yarn run build # verify successful frontend builds
28 - make eslint 35 - make eslint # javascript static analysis
29 - make sasslint 36 - make sasslint # linter for SASS syntax
37 # jobs for documentation builds
30 - language: python 38 - language: python
31 python: 3.6 39 python: 3.6
32 cache: 40 cache:
@@ -42,7 +50,9 @@ cache:
42 - $HOME/.composer/cache 50 - $HOME/.composer/cache
43 51
44install: 52install:
45 - composer install --prefer-dist 53 # install/update composer and php dependencies
54 - composer config --unset platform && composer config platform.php $TRAVIS_PHP_VERSION
55 - composer update
46 56
47before_script: 57before_script:
48 - PATH=${PATH//:\.\/node_modules\/\.bin/} 58 - PATH=${PATH//:\.\/node_modules\/\.bin/}
diff --git a/AUTHORS b/AUTHORS
index 9c5028eb..0ec52acc 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -1,23 +1,26 @@
1 903 ArthurHoaro <arthur@hoa.ro> 1 991 ArthurHoaro <arthur@hoa.ro>
2 402 VirtualTam <virtualtam@flibidi.net> 2 402 VirtualTam <virtualtam@flibidi.net>
3 250 nodiscc <nodiscc@gmail.com> 3 294 nodiscc <nodiscc@gmail.com>
4 56 Sébastien Sauvage <sebsauvage@sebsauvage.net> 4 56 Sébastien Sauvage <sebsauvage@sebsauvage.net>
5 16 Luce Carević <lcarevic@access42.net> 5 16 Luce Carević <lcarevic@access42.net>
6 15 Florian Eula <eula.florian@gmail.com> 6 15 Florian Eula <eula.florian@gmail.com>
7 13 Emilien Klein <emilien@klein.st> 7 13 Emilien Klein <emilien@klein.st>
8 12 Nicolas Danelon <hi@nicolasmd.com.ar> 8 12 Nicolas Danelon <hi@nicolasmd.com.ar>
9 9 Lucas Cimon <lucas.cimon@gmail.com>
9 9 Willi Eggeling <thewilli@gmail.com> 10 9 Willi Eggeling <thewilli@gmail.com>
10 8 Christophe HENRY <christophe.henry@sbgodin.fr> 11 8 Christophe HENRY <christophe.henry@sbgodin.fr>
11 7 Lucas Cimon <lucas.cimon@gmail.com>
12 6 B. van Berkum <dev@dotmpe.com> 12 6 B. van Berkum <dev@dotmpe.com>
13 6 Immánuel Fodor <immanuelfactor+github@gmail.com>
14 6 Keith Carangelo <mail@kcaran.com>
13 6 kalvn <kalvnthereal@gmail.com> 15 6 kalvn <kalvnthereal@gmail.com>
14 6 llune <llune@users.noreply.github.com> 16 6 llune <llune@users.noreply.github.com>
15 5 Mark Schmitz <kramred@gmail.com> 17 5 Mark Schmitz <kramred@gmail.com>
16 5 Sébastien NOBILI <code@pipoprods.org> 18 5 Sébastien NOBILI <code@pipoprods.org>
19 5 dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
17 4 Alexandre Alapetite <alexandre@alapetite.fr> 20 4 Alexandre Alapetite <alexandre@alapetite.fr>
18 4 David Sferruzza <david.sferruzza@gmail.com> 21 4 David Sferruzza <david.sferruzza@gmail.com>
19 4 Immánuel Fodor <immanuelfactor+github@gmail.com>
20 3 Agurato <mail.vmonot@gmail.com> 22 3 Agurato <mail.vmonot@gmail.com>
23 3 Christoph Stoettner <christoph.stoettner@stoeps.de>
21 3 Teromene <teromene@teromene.fr> 24 3 Teromene <teromene@teromene.fr>
22 2 Alexandre G.-Raymond <alex@ndre.gr> 25 2 Alexandre G.-Raymond <alex@ndre.gr>
23 2 Chris Kuethe <chris.kuethe@gmail.com> 26 2 Chris Kuethe <chris.kuethe@gmail.com>
@@ -30,7 +33,6 @@
30 2 Qwerty <champlywood@free.fr> 33 2 Qwerty <champlywood@free.fr>
31 2 Stephen Muth <smuth4@gmail.com> 34 2 Stephen Muth <smuth4@gmail.com>
32 2 Timo Van Neerden <fire@lehollandaisvolant.net> 35 2 Timo Van Neerden <fire@lehollandaisvolant.net>
33 2 dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
34 2 flow.gunso <flow.gunso@gmail.com> 36 2 flow.gunso <flow.gunso@gmail.com>
35 2 julienCXX <software@chmodplusx.eu> 37 2 julienCXX <software@chmodplusx.eu>
36 2 philipp-r <philipp-r@users.noreply.github.com> 38 2 philipp-r <philipp-r@users.noreply.github.com>
@@ -75,4 +77,6 @@
75 1 dimtion <zizou.xena@gmail.com> 77 1 dimtion <zizou.xena@gmail.com>
76 1 durcheinandr <jochen@durcheinandr.de> 78 1 durcheinandr <jochen@durcheinandr.de>
77 1 lapineige <lapineige@users.noreply.github.com> 79 1 lapineige <lapineige@users.noreply.github.com>
80 1 owen bell <66233223+xfnw@users.noreply.github.com>
78 1 rfolo9li <50079896+rfolo9li@users.noreply.github.com> 81 1 rfolo9li <50079896+rfolo9li@users.noreply.github.com>
82 1 sprak3000 <sprak3000+github@gmail.com>
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4bae5b48..f1686d67 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,19 +4,20 @@ All notable changes to this project will be documented in this file.
4The format is based on [Keep a Changelog](http://keepachangelog.com/) 4The format is based on [Keep a Changelog](http://keepachangelog.com/)
5and this project adheres to [Semantic Versioning](http://semver.org/). 5and this project adheres to [Semantic Versioning](http://semver.org/).
6 6
7## [v0.12.0](https://github.com/shaarli/Shaarli/releases/tag/v0.12.0-beta) - UNRELEASED [beta 2020-08-27] 7## [v0.12.1]() - UNRELEASED
8 8
9**Save you `data/` folder before updating!** 9## [v0.12.0](https://github.com/shaarli/Shaarli/releases/tag/v0.12.0) - 2020-10-13
10 10
11This is a beta version containing major changes, including new URLs for Shaarli and datastore format update. 11**Save you `data/` folder before updating!**
12Be aware that by using a beta version you might encounter bugs, and that 3rd party themes or plugins might not be compatible.
13 12
14### Added 13### Added
15- Thumbnailer: add soundcloud.com to list of common media domains 14- Thumbnailer: add soundcloud.com to list of common media domains
16- Markdown rendering is now integrated into Shaarli core 15- Markdown rendering is now integrated into Shaarli core
17- Add autofocus on tag cloud filter input 16- Add autofocus on tag cloud filter input
18- Japanese translations 17- Japanese translations
19- Support for local anchor URL (startting with `#`) 18- Japanese translation: add language to admin configuration page
19- Support for PHP 8.0
20- Support for local anchor URL (starting with `#`)
20- LDAP authentication 21- LDAP authentication
21- Encapsulated PageCacheManager 22- Encapsulated PageCacheManager
22- Docs: 23- Docs:
@@ -24,18 +25,24 @@ Be aware that by using a beta version you might encounter bugs, and that 3rd par
24 - section about mkdocs 25 - section about mkdocs
25 - Ulauncher extension 26 - Ulauncher extension
26- CI: run against PHP 7.4 27- CI: run against PHP 7.4
28- Added $links_per_page variable to template and display on default
29- Inject BookmarkServiceInterface in plugins data
30- Add manual configuration for root URL
31- Added PATCH to the allowed Apache request methods.
32- REST API: compatibility with ionos Apache's headers
27 33
28### Changed 34### Changed
29- Introduce Bookmark object and Service layer 35- Introduce Bookmark object and Service layer
30 - Save bookmark as objects in the datastore 36 - Save bookmark as objects in the datastore
31 - Handle bookmark as objects across the whole codebase (except templates and plugins) 37 - Handle bookmark as objects across the whole codebase (except templates and plugins)
32- Process all Shaarli page through Slim controller, with proper URL rewriting (see #1516) 38- Process all Shaarli page through Slim controller, with proper URL rewriting (see #1516)
39- Docs: the entire documentation has been reviewed, updated and improved, thanks to @nodiscc!
33- ATOM feed: use instance name as author name instead of URL 40- ATOM feed: use instance name as author name instead of URL
34- Updated French translation 41- Updated French translation
35- Docs: 42- Default colors plugin: generate CSS file during initialization
36 - Troubleshooting page rewritten 43- Improve default bookmarks after install
37 - Updated unit tests page 44- Upgrade all front end dependencies and webpack build
38 - Updated Server security page 45- Default theme: Make tag cloud/list views buttons more obvious
39 46
40### Fixed 47### Fixed
41- Undefined index: thumbnail in daily page 48- Undefined index: thumbnail in daily page
@@ -54,15 +61,20 @@ Be aware that by using a beta version you might encounter bugs, and that 3rd par
54- Division by zero in tag cloud 61- Division by zero in tag cloud
55- CI: deprecated linux distribution and sudo directive 62- CI: deprecated linux distribution and sudo directive
56- Docker build: gcc is no longer included in python alpine image 63- Docker build: gcc is no longer included in python alpine image
64- Default template: display pin button in mobile view
65- Pinned bookmarks are not longer displayed first in ATOM/RSS feeds
57- Docs: 66- Docs:
58 - Outdated Docker documentation for stable branch 67 - Outdated Docker documentation for stable branch
59 - Outdated links 68 - Outdated links
60 - Plugin description in meta files 69 - Plugin description in meta files
70- docker-compose.yml: pin traefik image to 1.7-alpine
61 71
62### Removed 72### Removed
63- Markdown plugin 73- Markdown plugin
64- Docs: 74- Docs:
65 - emojione & twemoji removed 75 - emojione & twemoji removed
76- Makefile: remove static_analysis_summary from all: target
77- doc/Makefile: remove references to composer update
66 78
67## [v0.11.1](https://github.com/shaarli/Shaarli/releases/tag/v0.11.1) - 2019-08-03 79## [v0.11.1](https://github.com/shaarli/Shaarli/releases/tag/v0.11.1) - 2019-08-03
68 80
diff --git a/Makefile b/Makefile
index b52ba22f..0ff6bd3f 100644
--- a/Makefile
+++ b/Makefile
@@ -3,7 +3,7 @@
3 3
4BIN = vendor/bin 4BIN = vendor/bin
5 5
6all: static_analysis_summary check_permissions test 6all: check_permissions test
7 7
8## 8##
9# Docker test adapter 9# Docker test adapter
@@ -85,6 +85,10 @@ all_tests: test locale_test_de_DE locale_test_en_US locale_test_fr_FR
85 @# --text doesn't work with phpunit 4.* (v5 requires PHP 5.6) 85 @# --text doesn't work with phpunit 4.* (v5 requires PHP 5.6)
86 @#$(BIN)/phpcov merge --text coverage/txt coverage 86 @#$(BIN)/phpcov merge --text coverage/txt coverage
87 87
88### download 3rd-party PHP libraries, including dev dependencies
89composer_dependencies_dev: clean
90 composer install --prefer-dist
91
88## 92##
89# Custom release archive generation 93# Custom release archive generation
90# 94#
@@ -174,4 +178,4 @@ eslint:
174 178
175### Run CSSLint check against Shaarli's SCSS files 179### Run CSSLint check against Shaarli's SCSS files
176sasslint: 180sasslint:
177 @yarn run sass-lint -c .dev/.sasslintrc 'assets/default/scss/*.scss' -v -q 181 @yarn run stylelint --config .dev/.stylelintrc.js 'assets/default/scss/*.scss'
diff --git a/README.md b/README.md
index 4fb0bfe0..46dda8d5 100644
--- a/README.md
+++ b/README.md
@@ -6,13 +6,13 @@ _Do you want to share the links you discover?_
6_Shaarli is a minimalist link sharing service that you can install on your own server._ 6_Shaarli is a minimalist link sharing service that you can install on your own server._
7_It is designed to be personal (single-user), fast and handy._ 7_It is designed to be personal (single-user), fast and handy._
8 8
9[![](https://img.shields.io/badge/stable-v0.10.4-blue.svg)](https://github.com/shaarli/Shaarli/releases/tag/v0.10.4) 9[![](https://img.shields.io/badge/stable-v0.11.1-blue.svg)](https://github.com/shaarli/Shaarli/releases/tag/v0.11.1)
10[![](https://img.shields.io/travis/shaarli/Shaarli/stable.svg?label=stable)](https://travis-ci.org/shaarli/Shaarli) 10[![](https://img.shields.io/travis/shaarli/Shaarli/stable.svg?label=stable)](https://travis-ci.org/shaarli/Shaarli)
11&bull; 11&bull;
12[![](https://img.shields.io/badge/latest-v0.11.1-blue.svg)](https://github.com/shaarli/Shaarli/releases/tag/v0.11.1) 12[![](https://img.shields.io/badge/latest-v0.12.0-blue.svg)](https://github.com/shaarli/Shaarli/releases/tag/v0.12.0)
13[![](https://img.shields.io/travis/shaarli/Shaarli/latest.svg?label=latest)](https://travis-ci.org/shaarli/Shaarli) 13[![](https://img.shields.io/travis/shaarli/Shaarli/latest.svg?label=latest)](https://travis-ci.org/shaarli/Shaarli)
14&bull; 14&bull;
15[![](https://img.shields.io/badge/master-v0.11.x-blue.svg)](https://github.com/shaarli/Shaarli) 15[![](https://img.shields.io/badge/master-v0.12.x-blue.svg)](https://github.com/shaarli/Shaarli)
16[![](https://img.shields.io/travis/shaarli/Shaarli.svg?label=master)](https://travis-ci.org/shaarli/Shaarli) 16[![](https://img.shields.io/travis/shaarli/Shaarli.svg?label=master)](https://travis-ci.org/shaarli/Shaarli)
17 17
18[![Join the chat at https://gitter.im/shaarli/Shaarli](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/shaarli/Shaarli) 18[![Join the chat at https://gitter.im/shaarli/Shaarli](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/shaarli/Shaarli)
diff --git a/application/Languages.php b/application/Languages.php
index 5cda802e..d83e0765 100644
--- a/application/Languages.php
+++ b/application/Languages.php
@@ -179,9 +179,10 @@ class Languages
179 { 179 {
180 return [ 180 return [
181 'auto' => t('Automatic'), 181 'auto' => t('Automatic'),
182 'de' => t('German'),
182 'en' => t('English'), 183 'en' => t('English'),
183 'fr' => t('French'), 184 'fr' => t('French'),
184 'de' => t('German'), 185 'jp' => t('Japanese'),
185 ]; 186 ];
186 } 187 }
187} 188}
diff --git a/application/Utils.php b/application/Utils.php
index 9c9eaaa2..bcfda65c 100644
--- a/application/Utils.php
+++ b/application/Utils.php
@@ -95,14 +95,14 @@ function escape($input)
95 return null; 95 return null;
96 } 96 }
97 97
98 if (is_bool($input)) { 98 if (is_bool($input) || is_int($input) || is_float($input) || $input instanceof DateTimeInterface) {
99 return $input; 99 return $input;
100 } 100 }
101 101
102 if (is_array($input)) { 102 if (is_array($input)) {
103 $out = array(); 103 $out = array();
104 foreach ($input as $key => $value) { 104 foreach ($input as $key => $value) {
105 $out[$key] = escape($value); 105 $out[escape($key)] = escape($value);
106 } 106 }
107 return $out; 107 return $out;
108 } 108 }
diff --git a/application/api/ApiMiddleware.php b/application/api/ApiMiddleware.php
index 09ce6445..f5b53b01 100644
--- a/application/api/ApiMiddleware.php
+++ b/application/api/ApiMiddleware.php
@@ -107,7 +107,9 @@ class ApiMiddleware
107 */ 107 */
108 protected function checkToken($request) 108 protected function checkToken($request)
109 { 109 {
110 if (! $request->hasHeader('Authorization')) { 110 if (!$request->hasHeader('Authorization')
111 && !isset($this->container->environment['REDIRECT_HTTP_AUTHORIZATION'])
112 ) {
111 throw new ApiAuthorizationException('JWT token not provided'); 113 throw new ApiAuthorizationException('JWT token not provided');
112 } 114 }
113 115
@@ -115,7 +117,11 @@ class ApiMiddleware
115 throw new ApiAuthorizationException('Token secret must be set in Shaarli\'s administration'); 117 throw new ApiAuthorizationException('Token secret must be set in Shaarli\'s administration');
116 } 118 }
117 119
118 $authorization = $request->getHeaderLine('Authorization'); 120 if (isset($this->container->environment['REDIRECT_HTTP_AUTHORIZATION'])) {
121 $authorization = $this->container->environment['REDIRECT_HTTP_AUTHORIZATION'];
122 } else {
123 $authorization = $request->getHeaderLine('Authorization');
124 }
119 125
120 if (! preg_match('/^Bearer (.*)/i', $authorization, $matches)) { 126 if (! preg_match('/^Bearer (.*)/i', $authorization, $matches)) {
121 throw new ApiAuthorizationException('Invalid JWT header'); 127 throw new ApiAuthorizationException('Invalid JWT header');
diff --git a/application/bookmark/BookmarkArray.php b/application/bookmark/BookmarkArray.php
index d87d43b4..3bd5eb20 100644
--- a/application/bookmark/BookmarkArray.php
+++ b/application/bookmark/BookmarkArray.php
@@ -234,16 +234,17 @@ class BookmarkArray implements \Iterator, \Countable, \ArrayAccess
234 * 234 *
235 * Also update the urls and ids mapping arrays. 235 * Also update the urls and ids mapping arrays.
236 * 236 *
237 * @param string $order ASC|DESC 237 * @param string $order ASC|DESC
238 * @param bool $ignoreSticky If set to true, sticky bookmarks won't be first
238 */ 239 */
239 public function reorder($order = 'DESC') 240 public function reorder(string $order = 'DESC', bool $ignoreSticky = false): void
240 { 241 {
241 $order = $order === 'ASC' ? -1 : 1; 242 $order = $order === 'ASC' ? -1 : 1;
242 // Reorder array by dates. 243 // Reorder array by dates.
243 usort($this->bookmarks, function ($a, $b) use ($order) { 244 usort($this->bookmarks, function ($a, $b) use ($order, $ignoreSticky) {
244 /** @var $a Bookmark */ 245 /** @var $a Bookmark */
245 /** @var $b Bookmark */ 246 /** @var $b Bookmark */
246 if ($a->isSticky() !== $b->isSticky()) { 247 if (false === $ignoreSticky && $a->isSticky() !== $b->isSticky()) {
247 return $a->isSticky() ? -1 : 1; 248 return $a->isSticky() ? -1 : 1;
248 } 249 }
249 return $a->getCreated() < $b->getCreated() ? 1 * $order : -1 * $order; 250 return $a->getCreated() < $b->getCreated() ? 1 * $order : -1 * $order;
diff --git a/application/bookmark/BookmarkFileService.php b/application/bookmark/BookmarkFileService.php
index b3a90ed4..c9ec2609 100644
--- a/application/bookmark/BookmarkFileService.php
+++ b/application/bookmark/BookmarkFileService.php
@@ -114,8 +114,13 @@ class BookmarkFileService implements BookmarkServiceInterface
114 /** 114 /**
115 * @inheritDoc 115 * @inheritDoc
116 */ 116 */
117 public function search($request = [], $visibility = null, $caseSensitive = false, $untaggedOnly = false) 117 public function search(
118 { 118 $request = [],
119 $visibility = null,
120 $caseSensitive = false,
121 $untaggedOnly = false,
122 bool $ignoreSticky = false
123 ) {
119 if ($visibility === null) { 124 if ($visibility === null) {
120 $visibility = $this->isLoggedIn ? BookmarkFilter::$ALL : BookmarkFilter::$PUBLIC; 125 $visibility = $this->isLoggedIn ? BookmarkFilter::$ALL : BookmarkFilter::$PUBLIC;
121 } 126 }
@@ -124,6 +129,10 @@ class BookmarkFileService implements BookmarkServiceInterface
124 $searchtags = isset($request['searchtags']) ? $request['searchtags'] : ''; 129 $searchtags = isset($request['searchtags']) ? $request['searchtags'] : '';
125 $searchterm = isset($request['searchterm']) ? $request['searchterm'] : ''; 130 $searchterm = isset($request['searchterm']) ? $request['searchterm'] : '';
126 131
132 if ($ignoreSticky) {
133 $this->bookmarks->reorder('DESC', true);
134 }
135
127 return $this->bookmarkFilter->filter( 136 return $this->bookmarkFilter->filter(
128 BookmarkFilter::$FILTER_TAG | BookmarkFilter::$FILTER_TEXT, 137 BookmarkFilter::$FILTER_TAG | BookmarkFilter::$FILTER_TEXT,
129 [$searchtags, $searchterm], 138 [$searchtags, $searchterm],
@@ -353,7 +362,9 @@ class BookmarkFileService implements BookmarkServiceInterface
353 */ 362 */
354 public function filterDay($request) 363 public function filterDay($request)
355 { 364 {
356 return $this->bookmarkFilter->filter(BookmarkFilter::$FILTER_DAY, $request); 365 $visibility = $this->isLoggedIn ? BookmarkFilter::$ALL : BookmarkFilter::$PUBLIC;
366
367 return $this->bookmarkFilter->filter(BookmarkFilter::$FILTER_DAY, $request, false, $visibility);
357 } 368 }
358 369
359 /** 370 /**
diff --git a/application/bookmark/BookmarkFilter.php b/application/bookmark/BookmarkFilter.php
index 797a36b8..6636bbfe 100644
--- a/application/bookmark/BookmarkFilter.php
+++ b/application/bookmark/BookmarkFilter.php
@@ -115,7 +115,7 @@ class BookmarkFilter
115 return $this->filterTags($request, $casesensitive, $visibility); 115 return $this->filterTags($request, $casesensitive, $visibility);
116 } 116 }
117 case self::$FILTER_DAY: 117 case self::$FILTER_DAY:
118 return $this->filterDay($request); 118 return $this->filterDay($request, $visibility);
119 default: 119 default:
120 return $this->noFilter($visibility); 120 return $this->noFilter($visibility);
121 } 121 }
@@ -425,21 +425,26 @@ class BookmarkFilter
425 * print_r($mydb->filterDay('20120125')); 425 * print_r($mydb->filterDay('20120125'));
426 * 426 *
427 * @param string $day day to filter. 427 * @param string $day day to filter.
428 * 428 * @param string $visibility return only all/private/public bookmarks.
429
429 * @return array all link matching given day. 430 * @return array all link matching given day.
430 * 431 *
431 * @throws Exception if date format is invalid. 432 * @throws Exception if date format is invalid.
432 */ 433 */
433 public function filterDay($day) 434 public function filterDay($day, $visibility)
434 { 435 {
435 if (!checkDateFormat('Ymd', $day)) { 436 if (!checkDateFormat('Ymd', $day)) {
436 throw new Exception('Invalid date format'); 437 throw new Exception('Invalid date format');
437 } 438 }
438 439
439 $filtered = []; 440 $filtered = [];
440 foreach ($this->bookmarks as $key => $l) { 441 foreach ($this->bookmarks as $key => $bookmark) {
441 if ($l->getCreated()->format('Ymd') == $day) { 442 if ($visibility === static::$PUBLIC && $bookmark->isPrivate()) {
442 $filtered[$key] = $l; 443 continue;
444 }
445
446 if ($bookmark->getCreated()->format('Ymd') == $day) {
447 $filtered[$key] = $bookmark;
443 } 448 }
444 } 449 }
445 450
diff --git a/application/bookmark/BookmarkInitializer.php b/application/bookmark/BookmarkInitializer.php
index cd2d1724..815047e3 100644
--- a/application/bookmark/BookmarkInitializer.php
+++ b/application/bookmark/BookmarkInitializer.php
@@ -34,25 +34,77 @@ class BookmarkInitializer
34 public function initialize() 34 public function initialize()
35 { 35 {
36 $bookmark = new Bookmark(); 36 $bookmark = new Bookmark();
37 $bookmark->setTitle(t('My secret stuff... - Pastebin.com')); 37 $bookmark->setTitle('quicksilver (loop) on Vimeo ' . t('(private bookmark with thumbnail demo)'));
38 $bookmark->setUrl('http://sebsauvage.net/paste/?8434b27936c09649#bR7XsXhoTiLcqCpQbmOpBi3rq2zzQUC5hBI7ZT1O3x8='); 38 $bookmark->setUrl('https://vimeo.com/153493904');
39 $bookmark->setDescription(t('Shhhh! I\'m a private link only YOU can see. You can delete me too.')); 39 $bookmark->setDescription(t(
40 $bookmark->setTagsString('secretstuff'); 40'Shaarli will automatically pick up the thumbnail for links to a variety of websites.
41
42Explore your new Shaarli instance by trying out controls and menus.
43Visit the project on [Github](https://github.com/shaarli/Shaarli) or [the documentation](https://shaarli.readthedocs.io/en/master/) to learn more about Shaarli.
44
45Now you can edit or delete the default shaares.
46'
47 ));
48 $bookmark->setTagsString('shaarli help thumbnail');
49 $bookmark->setPrivate(true);
50 $this->bookmarkService->add($bookmark, false);
51
52 $bookmark = new Bookmark();
53 $bookmark->setTitle(t('Note: Shaare descriptions'));
54 $bookmark->setDescription(t(
55'Adding a shaare without entering a URL creates a text-only "note" post such as this one.
56This note is private, so you are the only one able to see it while logged in.
57
58You can use this to keep notes, post articles, code snippets, and much more.
59
60The Markdown formatting setting allows you to format your notes and bookmark description:
61
62### Title headings
63
64#### Multiple headings levels
65 * bullet lists
66 * _italic_ text
67 * **bold** text
68 * ~~strike through~~ text
69 * `code` blocks
70 * images
71 * [links](https://en.wikipedia.org/wiki/Markdown)
72
73Markdown also supports tables:
74
75| Name | Type | Color | Qty |
76| ------- | --------- | ------ | ----- |
77| Orange | Fruit | Orange | 126 |
78| Apple | Fruit | Any | 62 |
79| Lemon | Fruit | Yellow | 30 |
80| Carrot | Vegetable | Red | 14 |
81'
82 ));
83 $bookmark->setTagsString('shaarli help');
41 $bookmark->setPrivate(true); 84 $bookmark->setPrivate(true);
42 $this->bookmarkService->add($bookmark, false); 85 $this->bookmarkService->add($bookmark, false);
43 86
44 $bookmark = new Bookmark(); 87 $bookmark = new Bookmark();
45 $bookmark->setTitle(t('The personal, minimalist, super-fast, database free, bookmarking service')); 88 $bookmark->setTitle(
46 $bookmark->setUrl('https://shaarli.readthedocs.io', []); 89 'Shaarli - ' . t('The personal, minimalist, super-fast, database free, bookmarking service')
90 );
47 $bookmark->setDescription(t( 91 $bookmark->setDescription(t(
48 'Welcome to Shaarli! This is your first public bookmark. ' 92'Welcome to Shaarli!
49 . 'To edit or delete me, you must first login. 93
94Shaarli allows you to bookmark your favorite pages, and share them with others or store them privately.
95You can add a description to your bookmarks, such as this one, and tag them.
96
97Create a new shaare by clicking the `+Shaare` button, or using any of the recommended tools (browser extension, mobile app, bookmarklet, REST API, etc.).
50 98
51To learn how to use Shaarli, consult the link "Documentation" at the bottom of this page. 99You can easily retrieve your links, even with thousands of them, using the internal search engine, or search through tags (e.g. this Shaare is tagged with `shaarli` and `help`).
100Hashtags such as #shaarli #help are also supported.
101You can also filter the available [RSS feed](/feed/atom) and picture wall by tag or plaintext search.
52 102
53You use the community supported version of the original Shaarli project, by Sebastien Sauvage.' 103We hope that you will enjoy using Shaarli, maintained with ❤️ by the community!
104Feel free to open [an issue](https://github.com/shaarli/Shaarli/issues) if you have a suggestion or encounter an issue.
105'
54 )); 106 ));
55 $bookmark->setTagsString('opensource software'); 107 $bookmark->setTagsString('shaarli help');
56 $this->bookmarkService->add($bookmark, false); 108 $this->bookmarkService->add($bookmark, false);
57 } 109 }
58} 110}
diff --git a/application/bookmark/BookmarkServiceInterface.php b/application/bookmark/BookmarkServiceInterface.php
index ce8bd912..b9b483eb 100644
--- a/application/bookmark/BookmarkServiceInterface.php
+++ b/application/bookmark/BookmarkServiceInterface.php
@@ -49,10 +49,17 @@ interface BookmarkServiceInterface
49 * @param string $visibility 49 * @param string $visibility
50 * @param bool $caseSensitive 50 * @param bool $caseSensitive
51 * @param bool $untaggedOnly 51 * @param bool $untaggedOnly
52 * @param bool $ignoreSticky
52 * 53 *
53 * @return Bookmark[] 54 * @return Bookmark[]
54 */ 55 */
55 public function search($request = [], $visibility = null, $caseSensitive = false, $untaggedOnly = false); 56 public function search(
57 $request = [],
58 $visibility = null,
59 $caseSensitive = false,
60 $untaggedOnly = false,
61 bool $ignoreSticky = false
62 );
56 63
57 /** 64 /**
58 * Get a single bookmark by its ID. 65 * Get a single bookmark by its ID.
diff --git a/application/bookmark/LinkUtils.php b/application/bookmark/LinkUtils.php
index 68914fca..e7af4d55 100644
--- a/application/bookmark/LinkUtils.php
+++ b/application/bookmark/LinkUtils.php
@@ -26,7 +26,7 @@ function html_extract_title($html)
26 */ 26 */
27function header_extract_charset($header) 27function header_extract_charset($header)
28{ 28{
29 preg_match('/charset="?([^; ]+)/i', $header, $match); 29 preg_match('/charset=["\']?([^; "\']+)/i', $header, $match);
30 if (! empty($match[1])) { 30 if (! empty($match[1])) {
31 return strtolower(trim($match[1])); 31 return strtolower(trim($match[1]));
32 } 32 }
diff --git a/application/config/ConfigJson.php b/application/config/ConfigJson.php
index 4509357c..c0c0dab9 100644
--- a/application/config/ConfigJson.php
+++ b/application/config/ConfigJson.php
@@ -46,7 +46,7 @@ class ConfigJson implements ConfigIO
46 // JSON_PRETTY_PRINT is available from PHP 5.4. 46 // JSON_PRETTY_PRINT is available from PHP 5.4.
47 $print = defined('JSON_PRETTY_PRINT') ? JSON_PRETTY_PRINT : 0; 47 $print = defined('JSON_PRETTY_PRINT') ? JSON_PRETTY_PRINT : 0;
48 $data = self::getPhpHeaders() . json_encode($conf, $print) . self::getPhpSuffix(); 48 $data = self::getPhpHeaders() . json_encode($conf, $print) . self::getPhpSuffix();
49 if (!file_put_contents($filepath, $data)) { 49 if (empty($filepath) || !file_put_contents($filepath, $data)) {
50 throw new \Shaarli\Exceptions\IOException( 50 throw new \Shaarli\Exceptions\IOException(
51 $filepath, 51 $filepath,
52 t('Shaarli could not create the config file. '. 52 t('Shaarli could not create the config file. '.
diff --git a/application/container/ContainerBuilder.php b/application/container/ContainerBuilder.php
index 58067c99..55bb51b5 100644
--- a/application/container/ContainerBuilder.php
+++ b/application/container/ContainerBuilder.php
@@ -10,6 +10,7 @@ use Shaarli\Config\ConfigManager;
10use Shaarli\Feed\FeedBuilder; 10use Shaarli\Feed\FeedBuilder;
11use Shaarli\Formatter\FormatterFactory; 11use Shaarli\Formatter\FormatterFactory;
12use Shaarli\Front\Controller\Visitor\ErrorController; 12use Shaarli\Front\Controller\Visitor\ErrorController;
13use Shaarli\Front\Controller\Visitor\ErrorNotFoundController;
13use Shaarli\History; 14use Shaarli\History;
14use Shaarli\Http\HttpAccess; 15use Shaarli\Http\HttpAccess;
15use Shaarli\Netscape\NetscapeBookmarkUtils; 16use Shaarli\Netscape\NetscapeBookmarkUtils;
@@ -149,6 +150,9 @@ class ContainerBuilder
149 ); 150 );
150 }; 151 };
151 152
153 $container['notFoundHandler'] = function (ShaarliContainer $container): ErrorNotFoundController {
154 return new ErrorNotFoundController($container);
155 };
152 $container['errorHandler'] = function (ShaarliContainer $container): ErrorController { 156 $container['errorHandler'] = function (ShaarliContainer $container): ErrorController {
153 return new ErrorController($container); 157 return new ErrorController($container);
154 }; 158 };
diff --git a/application/container/ShaarliContainer.php b/application/container/ShaarliContainer.php
index 9a9a974a..66e669aa 100644
--- a/application/container/ShaarliContainer.php
+++ b/application/container/ShaarliContainer.php
@@ -24,21 +24,22 @@ use Slim\Container;
24/** 24/**
25 * Extension of Slim container to document the injected objects. 25 * Extension of Slim container to document the injected objects.
26 * 26 *
27 * @property string $basePath Shaarli's instance base path (e.g. `/shaarli/`) 27 * @property string $basePath Shaarli's instance base path (e.g. `/shaarli/`)
28 * @property BookmarkServiceInterface $bookmarkService 28 * @property BookmarkServiceInterface $bookmarkService
29 * @property CookieManager $cookieManager 29 * @property CookieManager $cookieManager
30 * @property ConfigManager $conf 30 * @property ConfigManager $conf
31 * @property mixed[] $environment $_SERVER automatically injected by Slim 31 * @property mixed[] $environment $_SERVER automatically injected by Slim
32 * @property callable $errorHandler Overrides default Slim exception display 32 * @property callable $errorHandler Overrides default Slim exception display
33 * @property FeedBuilder $feedBuilder 33 * @property FeedBuilder $feedBuilder
34 * @property FormatterFactory $formatterFactory 34 * @property FormatterFactory $formatterFactory
35 * @property History $history 35 * @property History $history
36 * @property HttpAccess $httpAccess 36 * @property HttpAccess $httpAccess
37 * @property LoginManager $loginManager 37 * @property LoginManager $loginManager
38 * @property NetscapeBookmarkUtils $netscapeBookmarkUtils 38 * @property NetscapeBookmarkUtils $netscapeBookmarkUtils
39 * @property callable $notFoundHandler Overrides default Slim exception display
39 * @property PageBuilder $pageBuilder 40 * @property PageBuilder $pageBuilder
40 * @property PageCacheManager $pageCacheManager 41 * @property PageCacheManager $pageCacheManager
41 * @property callable $phpErrorHandler Overrides default Slim PHP error display 42 * @property callable $phpErrorHandler Overrides default Slim PHP error display
42 * @property PluginManager $pluginManager 43 * @property PluginManager $pluginManager
43 * @property SessionManager $sessionManager 44 * @property SessionManager $sessionManager
44 * @property Thumbnailer $thumbnailer 45 * @property Thumbnailer $thumbnailer
diff --git a/application/feed/FeedBuilder.php b/application/feed/FeedBuilder.php
index 269ad877..f6def630 100644
--- a/application/feed/FeedBuilder.php
+++ b/application/feed/FeedBuilder.php
@@ -102,7 +102,7 @@ class FeedBuilder
102 } 102 }
103 103
104 // Optionally filter the results: 104 // Optionally filter the results:
105 $linksToDisplay = $this->linkDB->search($userInput); 105 $linksToDisplay = $this->linkDB->search($userInput, null, false, false, true);
106 106
107 $nblinksToDisplay = $this->getNbLinks(count($linksToDisplay), $userInput); 107 $nblinksToDisplay = $this->getNbLinks(count($linksToDisplay), $userInput);
108 108
@@ -122,9 +122,9 @@ class FeedBuilder
122 $data['language'] = $this->getTypeLanguage($feedType); 122 $data['language'] = $this->getTypeLanguage($feedType);
123 $data['last_update'] = $this->getLatestDateFormatted($feedType); 123 $data['last_update'] = $this->getLatestDateFormatted($feedType);
124 $data['show_dates'] = !$this->hideDates || $this->isLoggedIn; 124 $data['show_dates'] = !$this->hideDates || $this->isLoggedIn;
125 // Remove leading slash from REQUEST_URI. 125 // Remove leading path from REQUEST_URI (already contained in $pageaddr).
126 $data['self_link'] = escape(server_url($this->serverInfo)) 126 $requestUri = preg_replace('#(.*?/)(feed.*)#', '$2', escape($this->serverInfo['REQUEST_URI']));
127 . escape($this->serverInfo['REQUEST_URI']); 127 $data['self_link'] = $pageaddr . $requestUri;
128 $data['index_url'] = $pageaddr; 128 $data['index_url'] = $pageaddr;
129 $data['usepermalinks'] = $this->usePermalinks === true; 129 $data['usepermalinks'] = $this->usePermalinks === true;
130 $data['links'] = $linkDisplayed; 130 $data['links'] = $linkDisplayed;
diff --git a/application/formatter/BookmarkFormatter.php b/application/formatter/BookmarkFormatter.php
index 22ba7aae..0042dafe 100644
--- a/application/formatter/BookmarkFormatter.php
+++ b/application/formatter/BookmarkFormatter.php
@@ -58,7 +58,9 @@ abstract class BookmarkFormatter
58 $out['title'] = $this->formatTitle($bookmark); 58 $out['title'] = $this->formatTitle($bookmark);
59 $out['description'] = $this->formatDescription($bookmark); 59 $out['description'] = $this->formatDescription($bookmark);
60 $out['thumbnail'] = $this->formatThumbnail($bookmark); 60 $out['thumbnail'] = $this->formatThumbnail($bookmark);
61 $out['urlencoded_taglist'] = $this->formatUrlEncodedTagList($bookmark);
61 $out['taglist'] = $this->formatTagList($bookmark); 62 $out['taglist'] = $this->formatTagList($bookmark);
63 $out['urlencoded_tags'] = $this->formatUrlEncodedTagString($bookmark);
62 $out['tags'] = $this->formatTagString($bookmark); 64 $out['tags'] = $this->formatTagString($bookmark);
63 $out['sticky'] = $bookmark->isSticky(); 65 $out['sticky'] = $bookmark->isSticky();
64 $out['private'] = $bookmark->isPrivate(); 66 $out['private'] = $bookmark->isPrivate();
@@ -182,6 +184,18 @@ abstract class BookmarkFormatter
182 } 184 }
183 185
184 /** 186 /**
187 * Format Url Encoded Tags
188 *
189 * @param Bookmark $bookmark instance
190 *
191 * @return array formatted Tags
192 */
193 protected function formatUrlEncodedTagList($bookmark)
194 {
195 return array_map('urlencode', $this->filterTagList($bookmark->getTags()));
196 }
197
198 /**
185 * Format TagString 199 * Format TagString
186 * 200 *
187 * @param Bookmark $bookmark instance 201 * @param Bookmark $bookmark instance
@@ -194,6 +208,18 @@ abstract class BookmarkFormatter
194 } 208 }
195 209
196 /** 210 /**
211 * Format TagString
212 *
213 * @param Bookmark $bookmark instance
214 *
215 * @return string formatted TagString
216 */
217 protected function formatUrlEncodedTagString($bookmark)
218 {
219 return implode(' ', $this->formatUrlEncodedTagList($bookmark));
220 }
221
222 /**
197 * Format Class 223 * Format Class
198 * Used to add specific CSS class for a link 224 * Used to add specific CSS class for a link
199 * 225 *
diff --git a/application/formatter/BookmarkMarkdownExtraFormatter.php b/application/formatter/BookmarkMarkdownExtraFormatter.php
new file mode 100644
index 00000000..0694b23f
--- /dev/null
+++ b/application/formatter/BookmarkMarkdownExtraFormatter.php
@@ -0,0 +1,24 @@
1<?php
2
3namespace Shaarli\Formatter;
4
5use Shaarli\Config\ConfigManager;
6
7/**
8 * Class BookmarkMarkdownExtraFormatter
9 *
10 * Format bookmark description into MarkdownExtra format.
11 *
12 * @see https://michelf.ca/projects/php-markdown/extra/
13 *
14 * @package Shaarli\Formatter
15 */
16class BookmarkMarkdownExtraFormatter extends BookmarkMarkdownFormatter
17{
18 public function __construct(ConfigManager $conf, bool $isLoggedIn)
19 {
20 parent::__construct($conf, $isLoggedIn);
21
22 $this->parsedown = new \ParsedownExtra();
23 }
24}
diff --git a/application/front/ShaarliMiddleware.php b/application/front/ShaarliMiddleware.php
index c015c0c6..d1aa1399 100644
--- a/application/front/ShaarliMiddleware.php
+++ b/application/front/ShaarliMiddleware.php
@@ -94,7 +94,7 @@ class ShaarliMiddleware
94 && $this->container->conf->get('privacy.force_login') 94 && $this->container->conf->get('privacy.force_login')
95 // and the current page isn't already the login page 95 // and the current page isn't already the login page
96 // and the user is not requesting a feed (which would lead to a different content-type as expected) 96 // and the user is not requesting a feed (which would lead to a different content-type as expected)
97 && !in_array($next->getName(), ['login', 'atom', 'rss'], true) 97 && !in_array($next->getName(), ['login', 'processLogin', 'atom', 'rss'], true)
98 ) { 98 ) {
99 throw new UnauthorizedException(); 99 throw new UnauthorizedException();
100 } 100 }
diff --git a/application/front/controller/admin/ConfigureController.php b/application/front/controller/admin/ConfigureController.php
index e675fcca..0ed7ad81 100644
--- a/application/front/controller/admin/ConfigureController.php
+++ b/application/front/controller/admin/ConfigureController.php
@@ -30,7 +30,7 @@ class ConfigureController extends ShaarliAdminController
30 'theme_available', 30 'theme_available',
31 ThemeUtils::getThemes($this->container->conf->get('resource.raintpl_tpl')) 31 ThemeUtils::getThemes($this->container->conf->get('resource.raintpl_tpl'))
32 ); 32 );
33 $this->assignView('formatter_available', ['default', 'markdown']); 33 $this->assignView('formatter_available', ['default', 'markdown', 'markdownExtra']);
34 list($continents, $cities) = generateTimeZoneData( 34 list($continents, $cities) = generateTimeZoneData(
35 timezone_identifiers_list(), 35 timezone_identifiers_list(),
36 $this->container->conf->get('general.timezone') 36 $this->container->conf->get('general.timezone')
diff --git a/application/front/controller/admin/ManageShaareController.php b/application/front/controller/admin/ManageShaareController.php
index 33e1188e..bb083486 100644
--- a/application/front/controller/admin/ManageShaareController.php
+++ b/application/front/controller/admin/ManageShaareController.php
@@ -69,7 +69,7 @@ class ManageShaareController extends ShaarliAdminController
69 $retrieveDescription 69 $retrieveDescription
70 ) 70 )
71 ); 71 );
72 if (! empty($title) && strtolower($charset) !== 'utf-8') { 72 if (! empty($title) && strtolower($charset) !== 'utf-8' && mb_check_encoding($charset)) {
73 $title = mb_convert_encoding($title, 'utf-8', $charset); 73 $title = mb_convert_encoding($title, 'utf-8', $charset);
74 } 74 }
75 } 75 }
@@ -78,13 +78,13 @@ class ManageShaareController extends ShaarliAdminController
78 $title = $this->container->conf->get('general.default_note_title', t('Note: ')); 78 $title = $this->container->conf->get('general.default_note_title', t('Note: '));
79 } 79 }
80 80
81 $link = escape([ 81 $link = [
82 'title' => $title, 82 'title' => $title,
83 'url' => $url ?? '', 83 'url' => $url ?? '',
84 'description' => $description ?? '', 84 'description' => $description ?? '',
85 'tags' => $tags ?? '', 85 'tags' => $tags ?? '',
86 'private' => $private, 86 'private' => $private,
87 ]); 87 ];
88 } else { 88 } else {
89 $formatter = $this->container->formatterFactory->getFormatter('raw'); 89 $formatter = $this->container->formatterFactory->getFormatter('raw');
90 $link = $formatter->format($bookmark); 90 $link = $formatter->format($bookmark);
@@ -127,7 +127,7 @@ class ManageShaareController extends ShaarliAdminController
127 $this->checkToken($request); 127 $this->checkToken($request);
128 128
129 // lf_id should only be present if the link exists. 129 // lf_id should only be present if the link exists.
130 $id = $request->getParam('lf_id') ? intval(escape($request->getParam('lf_id'))) : null; 130 $id = $request->getParam('lf_id') !== null ? intval(escape($request->getParam('lf_id'))) : null;
131 if (null !== $id && true === $this->container->bookmarkService->exists($id)) { 131 if (null !== $id && true === $this->container->bookmarkService->exists($id)) {
132 // Edit 132 // Edit
133 $bookmark = $this->container->bookmarkService->get($id); 133 $bookmark = $this->container->bookmarkService->get($id);
@@ -169,7 +169,7 @@ class ManageShaareController extends ShaarliAdminController
169 return $this->redirectFromReferer( 169 return $this->redirectFromReferer(
170 $request, 170 $request,
171 $response, 171 $response,
172 ['add-shaare', 'shaare'], ['addlink', 'post', 'edit_link'], 172 ['/admin/add-shaare', '/admin/shaare'], ['addlink', 'post', 'edit_link'],
173 $bookmark->getShortUrl() 173 $bookmark->getShortUrl()
174 ); 174 );
175 } 175 }
@@ -345,14 +345,14 @@ class ManageShaareController extends ShaarliAdminController
345 $tags[BookmarkMarkdownFormatter::NO_MD_TAG] = 1; 345 $tags[BookmarkMarkdownFormatter::NO_MD_TAG] = 1;
346 } 346 }
347 347
348 $data = [ 348 $data = escape([
349 'link' => $link, 349 'link' => $link,
350 'link_is_new' => $isNew, 350 'link_is_new' => $isNew,
351 'http_referer' => escape($this->container->environment['HTTP_REFERER'] ?? ''), 351 'http_referer' => $this->container->environment['HTTP_REFERER'] ?? '',
352 'source' => $request->getParam('source') ?? '', 352 'source' => $request->getParam('source') ?? '',
353 'tags' => $tags, 353 'tags' => $tags,
354 'default_private_links' => $this->container->conf->get('privacy.default_private_links', false), 354 'default_private_links' => $this->container->conf->get('privacy.default_private_links', false),
355 ]; 355 ]);
356 356
357 $this->executePageHooks('render_editlink', $data, TemplatePage::EDIT_LINK); 357 $this->executePageHooks('render_editlink', $data, TemplatePage::EDIT_LINK);
358 358
diff --git a/application/front/controller/admin/ManageTagController.php b/application/front/controller/admin/ManageTagController.php
index 0380ef1f..2065c3e2 100644
--- a/application/front/controller/admin/ManageTagController.php
+++ b/application/front/controller/admin/ManageTagController.php
@@ -41,8 +41,8 @@ class ManageTagController extends ShaarliAdminController
41 41
42 $isDelete = null !== $request->getParam('deletetag') && null === $request->getParam('renametag'); 42 $isDelete = null !== $request->getParam('deletetag') && null === $request->getParam('renametag');
43 43
44 $fromTag = escape(trim($request->getParam('fromtag') ?? '')); 44 $fromTag = trim($request->getParam('fromtag') ?? '');
45 $toTag = escape(trim($request->getParam('totag') ?? '')); 45 $toTag = trim($request->getParam('totag') ?? '');
46 46
47 if (0 === strlen($fromTag) || false === $isDelete && 0 === strlen($toTag)) { 47 if (0 === strlen($fromTag) || false === $isDelete && 0 === strlen($toTag)) {
48 $this->saveWarningMessage(t('Invalid tags provided.')); 48 $this->saveWarningMessage(t('Invalid tags provided.'));
diff --git a/application/front/controller/admin/PluginsController.php b/application/front/controller/admin/PluginsController.php
index 0e09116e..8e059681 100644
--- a/application/front/controller/admin/PluginsController.php
+++ b/application/front/controller/admin/PluginsController.php
@@ -62,6 +62,7 @@ class PluginsController extends ShaarliAdminController
62 62
63 if (isset($parameters['parameters_form'])) { 63 if (isset($parameters['parameters_form'])) {
64 unset($parameters['parameters_form']); 64 unset($parameters['parameters_form']);
65 unset($parameters['token']);
65 foreach ($parameters as $param => $value) { 66 foreach ($parameters as $param => $value) {
66 $this->container->conf->set('plugins.'. $param, escape($value)); 67 $this->container->conf->set('plugins.'. $param, escape($value));
67 } 68 }
diff --git a/application/front/controller/admin/ShaarliAdminController.php b/application/front/controller/admin/ShaarliAdminController.php
index 3b5939bb..c26c9cbe 100644
--- a/application/front/controller/admin/ShaarliAdminController.php
+++ b/application/front/controller/admin/ShaarliAdminController.php
@@ -4,9 +4,7 @@ declare(strict_types=1);
4 4
5namespace Shaarli\Front\Controller\Admin; 5namespace Shaarli\Front\Controller\Admin;
6 6
7use Shaarli\Container\ShaarliContainer;
8use Shaarli\Front\Controller\Visitor\ShaarliVisitorController; 7use Shaarli\Front\Controller\Visitor\ShaarliVisitorController;
9use Shaarli\Front\Exception\UnauthorizedException;
10use Shaarli\Front\Exception\WrongTokenException; 8use Shaarli\Front\Exception\WrongTokenException;
11use Shaarli\Security\SessionManager; 9use Shaarli\Security\SessionManager;
12use Slim\Http\Request; 10use Slim\Http\Request;
diff --git a/application/front/controller/visitor/BookmarkListController.php b/application/front/controller/visitor/BookmarkListController.php
index 2988bee6..18368751 100644
--- a/application/front/controller/visitor/BookmarkListController.php
+++ b/application/front/controller/visitor/BookmarkListController.php
@@ -34,7 +34,7 @@ class BookmarkListController extends ShaarliVisitorController
34 $formatter = $this->container->formatterFactory->getFormatter(); 34 $formatter = $this->container->formatterFactory->getFormatter();
35 $formatter->addContextData('base_path', $this->container->basePath); 35 $formatter->addContextData('base_path', $this->container->basePath);
36 36
37 $searchTags = escape(normalize_spaces($request->getParam('searchtags') ?? '')); 37 $searchTags = normalize_spaces($request->getParam('searchtags') ?? '');
38 $searchTerm = escape(normalize_spaces($request->getParam('searchterm') ?? ''));; 38 $searchTerm = escape(normalize_spaces($request->getParam('searchterm') ?? ''));;
39 39
40 // Filter bookmarks according search parameters. 40 // Filter bookmarks according search parameters.
@@ -104,8 +104,9 @@ class BookmarkListController extends ShaarliVisitorController
104 'page_current' => $page, 104 'page_current' => $page,
105 'page_max' => $pageCount, 105 'page_max' => $pageCount,
106 'result_count' => count($linksToDisplay), 106 'result_count' => count($linksToDisplay),
107 'search_term' => $searchTerm, 107 'search_term' => escape($searchTerm),
108 'search_tags' => $searchTags, 108 'search_tags' => escape($searchTags),
109 'search_tags_url' => array_map('urlencode', explode(' ', $searchTags)),
109 'visibility' => $visibility, 110 'visibility' => $visibility,
110 'links' => $linkDisp, 111 'links' => $linkDisp,
111 ] 112 ]
diff --git a/application/front/controller/visitor/DailyController.php b/application/front/controller/visitor/DailyController.php
index 54a4778f..07617cf1 100644
--- a/application/front/controller/visitor/DailyController.php
+++ b/application/front/controller/visitor/DailyController.php
@@ -132,7 +132,7 @@ class DailyController extends ShaarliVisitorController
132 'date' => $dayDatetime, 132 'date' => $dayDatetime,
133 'date_rss' => $dayDatetime->format(DateTime::RSS), 133 'date_rss' => $dayDatetime->format(DateTime::RSS),
134 'date_human' => format_date($dayDatetime, false, true), 134 'date_human' => format_date($dayDatetime, false, true),
135 'absolute_url' => $indexUrl . '/daily?day=' . $day, 135 'absolute_url' => $indexUrl . 'daily?day=' . $day,
136 'links' => [], 136 'links' => [],
137 ]; 137 ];
138 138
diff --git a/application/front/controller/visitor/ErrorNotFoundController.php b/application/front/controller/visitor/ErrorNotFoundController.php
new file mode 100644
index 00000000..758dd83b
--- /dev/null
+++ b/application/front/controller/visitor/ErrorNotFoundController.php
@@ -0,0 +1,29 @@
1<?php
2
3declare(strict_types=1);
4
5namespace Shaarli\Front\Controller\Visitor;
6
7use Slim\Http\Request;
8use Slim\Http\Response;
9
10/**
11 * Controller used to render the 404 error page.
12 */
13class ErrorNotFoundController extends ShaarliVisitorController
14{
15 public function __invoke(Request $request, Response $response): Response
16 {
17 // Request from the API
18 if (false !== strpos($request->getRequestTarget(), '/api/v1')) {
19 return $response->withStatus(404);
20 }
21
22 // This is required because the middleware is ignored if the route is not found.
23 $this->container->basePath = rtrim($request->getUri()->getBasePath(), '/');
24
25 $this->assignView('error_message', t('Requested page could not be found.'));
26
27 return $response->withStatus(404)->write($this->render('404'));
28 }
29}
diff --git a/application/front/controller/visitor/FeedController.php b/application/front/controller/visitor/FeedController.php
index da2848c2..8d8b546a 100644
--- a/application/front/controller/visitor/FeedController.php
+++ b/application/front/controller/visitor/FeedController.php
@@ -46,10 +46,10 @@ class FeedController extends ShaarliVisitorController
46 46
47 $data = $this->container->feedBuilder->buildData($feedType, $request->getParams()); 47 $data = $this->container->feedBuilder->buildData($feedType, $request->getParams());
48 48
49 $this->executePageHooks('render_feed', $data, $feedType); 49 $this->executePageHooks('render_feed', $data, 'feed.' . $feedType);
50 $this->assignAllView($data); 50 $this->assignAllView($data);
51 51
52 $content = $this->render('feed.'. $feedType); 52 $content = $this->render('feed.' . $feedType);
53 53
54 $cache->cache($content); 54 $cache->cache($content);
55 55
diff --git a/application/front/controller/visitor/ShaarliVisitorController.php b/application/front/controller/visitor/ShaarliVisitorController.php
index f17c8ed3..55c075a2 100644
--- a/application/front/controller/visitor/ShaarliVisitorController.php
+++ b/application/front/controller/visitor/ShaarliVisitorController.php
@@ -78,16 +78,14 @@ abstract class ShaarliVisitorController
78 'footer', 78 'footer',
79 ]; 79 ];
80 80
81 $parameters = $this->buildPluginParameters($template);
82
81 foreach ($common_hooks as $name) { 83 foreach ($common_hooks as $name) {
82 $pluginData = []; 84 $pluginData = [];
83 $this->container->pluginManager->executeHooks( 85 $this->container->pluginManager->executeHooks(
84 'render_' . $name, 86 'render_' . $name,
85 $pluginData, 87 $pluginData,
86 [ 88 $parameters
87 'target' => $template,
88 'loggedin' => $this->container->loginManager->isLoggedIn(),
89 'basePath' => $this->container->basePath,
90 ]
91 ); 89 );
92 $this->assignView('plugins_' . $name, $pluginData); 90 $this->assignView('plugins_' . $name, $pluginData);
93 } 91 }
@@ -95,19 +93,23 @@ abstract class ShaarliVisitorController
95 93
96 protected function executePageHooks(string $hook, array &$data, string $template = null): void 94 protected function executePageHooks(string $hook, array &$data, string $template = null): void
97 { 95 {
98 $params = [
99 'target' => $template,
100 'loggedin' => $this->container->loginManager->isLoggedIn(),
101 'basePath' => $this->container->basePath,
102 ];
103
104 $this->container->pluginManager->executeHooks( 96 $this->container->pluginManager->executeHooks(
105 $hook, 97 $hook,
106 $data, 98 $data,
107 $params 99 $this->buildPluginParameters($template)
108 ); 100 );
109 } 101 }
110 102
103 protected function buildPluginParameters(?string $template): array
104 {
105 return [
106 'target' => $template,
107 'loggedin' => $this->container->loginManager->isLoggedIn(),
108 'basePath' => $this->container->basePath,
109 'bookmarkService' => $this->container->bookmarkService
110 ];
111 }
112
111 /** 113 /**
112 * Simple helper which prepend the base path to redirect path. 114 * Simple helper which prepend the base path to redirect path.
113 * 115 *
@@ -140,6 +142,13 @@ abstract class ShaarliVisitorController
140 142
141 if (null !== $referer) { 143 if (null !== $referer) {
142 $currentUrl = parse_url($referer); 144 $currentUrl = parse_url($referer);
145 // If the referer is not related to Shaarli instance, redirect to default
146 if (isset($currentUrl['host'])
147 && strpos(index_url($this->container->environment), $currentUrl['host']) === false
148 ) {
149 return $response->withRedirect($defaultPath);
150 }
151
143 parse_str($currentUrl['query'] ?? '', $params); 152 parse_str($currentUrl['query'] ?? '', $params);
144 $path = $currentUrl['path'] ?? $defaultPath; 153 $path = $currentUrl['path'] ?? $defaultPath;
145 } else { 154 } else {
diff --git a/application/front/controller/visitor/TagCloudController.php b/application/front/controller/visitor/TagCloudController.php
index f9c529bc..76ed7690 100644
--- a/application/front/controller/visitor/TagCloudController.php
+++ b/application/front/controller/visitor/TagCloudController.php
@@ -66,10 +66,18 @@ class TagCloudController extends ShaarliVisitorController
66 $tags = $this->formatTagsForCloud($tags); 66 $tags = $this->formatTagsForCloud($tags);
67 } 67 }
68 68
69 $tagsUrl = [];
70 foreach ($tags as $tag => $value) {
71 $tagsUrl[escape($tag)] = urlencode((string) $tag);
72 }
73
69 $searchTags = implode(' ', escape($filteringTags)); 74 $searchTags = implode(' ', escape($filteringTags));
75 $searchTagsUrl = urlencode(implode(' ', $filteringTags));
70 $data = [ 76 $data = [
71 'search_tags' => $searchTags, 77 'search_tags' => escape($searchTags),
72 'tags' => $tags, 78 'search_tags_url' => $searchTagsUrl,
79 'tags' => escape($tags),
80 'tags_url' => $tagsUrl,
73 ]; 81 ];
74 $this->executePageHooks('render_tag' . $type, $data, 'tag.' . $type); 82 $this->executePageHooks('render_tag' . $type, $data, 'tag.' . $type);
75 $this->assignAllView($data); 83 $this->assignAllView($data);
diff --git a/application/http/HttpUtils.php b/application/http/HttpUtils.php
index 4fc4e3dc..9f414073 100644
--- a/application/http/HttpUtils.php
+++ b/application/http/HttpUtils.php
@@ -369,7 +369,11 @@ function server_url($server)
369 */ 369 */
370function index_url($server) 370function index_url($server)
371{ 371{
372 $scriptname = $server['SCRIPT_NAME'] ?? ''; 372 if (defined('SHAARLI_ROOT_URL') && null !== SHAARLI_ROOT_URL) {
373 return rtrim(SHAARLI_ROOT_URL, '/') . '/';
374 }
375
376 $scriptname = !empty($server['SCRIPT_NAME']) ? $server['SCRIPT_NAME'] : '/';
373 if (endsWith($scriptname, 'index.php')) { 377 if (endsWith($scriptname, 'index.php')) {
374 $scriptname = substr($scriptname, 0, -9); 378 $scriptname = substr($scriptname, 0, -9);
375 } 379 }
@@ -392,7 +396,7 @@ function page_url($server)
392 $scriptname = substr($scriptname, 0, -9); 396 $scriptname = substr($scriptname, 0, -9);
393 } 397 }
394 398
395 $route = ltrim($server['REQUEST_URI'] ?? '', $scriptname); 399 $route = preg_replace('@^' . $scriptname . '@', '', $server['REQUEST_URI'] ?? '');
396 if (! empty($server['QUERY_STRING'])) { 400 if (! empty($server['QUERY_STRING'])) {
397 return index_url($server) . $route . '?' . $server['QUERY_STRING']; 401 return index_url($server) . $route . '?' . $server['QUERY_STRING'];
398 } 402 }
diff --git a/application/legacy/LegacyController.php b/application/legacy/LegacyController.php
index 26465d2c..826604e7 100644
--- a/application/legacy/LegacyController.php
+++ b/application/legacy/LegacyController.php
@@ -39,29 +39,44 @@ class LegacyController extends ShaarliVisitorController
39 /** Legacy route: ?post= */ 39 /** Legacy route: ?post= */
40 public function post(Request $request, Response $response): Response 40 public function post(Request $request, Response $response): Response
41 { 41 {
42 $parameters = count($request->getQueryParams()) > 0 ? '?' . http_build_query($request->getQueryParams()) : ''; 42 $route = '/admin/shaare';
43 $buildParameters = function (?array $parameters, bool $encode) {
44 if ($encode) {
45 $parameters = array_map('urlencode', $parameters);
46 }
47
48 return count($parameters) > 0 ? '?' . http_build_query($parameters) : '';
49 };
50
43 51
44 if (!$this->container->loginManager->isLoggedIn()) { 52 if (!$this->container->loginManager->isLoggedIn()) {
45 return $this->redirect($response, '/login' . $parameters); 53 $parameters = $buildParameters($request->getQueryParams(), true);
54 return $this->redirect($response, '/login?returnurl='. $this->getBasePath() . $route . $parameters);
46 } 55 }
47 56
48 return $this->redirect($response, '/admin/shaare' . $parameters); 57 $parameters = $buildParameters($request->getQueryParams(), false);
58
59 return $this->redirect($response, $route . $parameters);
49 } 60 }
50 61
51 /** Legacy route: ?addlink= */ 62 /** Legacy route: ?addlink= */
52 protected function addlink(Request $request, Response $response): Response 63 protected function addlink(Request $request, Response $response): Response
53 { 64 {
65 $route = '/admin/add-shaare';
66
54 if (!$this->container->loginManager->isLoggedIn()) { 67 if (!$this->container->loginManager->isLoggedIn()) {
55 return $this->redirect($response, '/login'); 68 return $this->redirect($response, '/login?returnurl=' . $this->getBasePath() . $route);
56 } 69 }
57 70
58 return $this->redirect($response, '/admin/add-shaare'); 71 return $this->redirect($response, $route);
59 } 72 }
60 73
61 /** Legacy route: ?do=login */ 74 /** Legacy route: ?do=login */
62 protected function login(Request $request, Response $response): Response 75 protected function login(Request $request, Response $response): Response
63 { 76 {
64 return $this->redirect($response, '/login'); 77 $returnUrl = $request->getQueryParam('returnurl');
78
79 return $this->redirect($response, '/login' . ($returnUrl ? '?returnurl=' . $returnUrl : ''));
65 } 80 }
66 81
67 /** Legacy route: ?do=logout */ 82 /** Legacy route: ?do=logout */
@@ -127,4 +142,21 @@ class LegacyController extends ShaarliVisitorController
127 142
128 return $this->redirect($response, '/feed/' . $feedType . $parameters); 143 return $this->redirect($response, '/feed/' . $feedType . $parameters);
129 } 144 }
145
146 /** Legacy route: ?do=configure */
147 protected function configure(Request $request, Response $response): Response
148 {
149 $route = '/admin/configure';
150
151 if (!$this->container->loginManager->isLoggedIn()) {
152 return $this->redirect($response, '/login?returnurl=' . $this->getBasePath() . $route);
153 }
154
155 return $this->redirect($response, $route);
156 }
157
158 protected function getBasePath(): string
159 {
160 return $this->container->basePath ?: '';
161 }
130} 162}
diff --git a/application/legacy/LegacyRouter.php b/application/legacy/LegacyRouter.php
index cea99154..0449c7e1 100644
--- a/application/legacy/LegacyRouter.php
+++ b/application/legacy/LegacyRouter.php
@@ -17,15 +17,15 @@ class LegacyRouter
17 17
18 public static $PAGE_PICWALL = 'picwall'; 18 public static $PAGE_PICWALL = 'picwall';
19 19
20 public static $PAGE_TAGCLOUD = 'tagcloud'; 20 public static $PAGE_TAGCLOUD = 'tag.cloud';
21 21
22 public static $PAGE_TAGLIST = 'taglist'; 22 public static $PAGE_TAGLIST = 'tag.list';
23 23
24 public static $PAGE_DAILY = 'daily'; 24 public static $PAGE_DAILY = 'daily';
25 25
26 public static $PAGE_FEED_ATOM = 'atom'; 26 public static $PAGE_FEED_ATOM = 'feed.atom';
27 27
28 public static $PAGE_FEED_RSS = 'rss'; 28 public static $PAGE_FEED_RSS = 'feed.rss';
29 29
30 public static $PAGE_TOOLS = 'tools'; 30 public static $PAGE_TOOLS = 'tools';
31 31
@@ -37,7 +37,7 @@ class LegacyRouter
37 37
38 public static $PAGE_ADDLINK = 'addlink'; 38 public static $PAGE_ADDLINK = 'addlink';
39 39
40 public static $PAGE_EDITLINK = 'edit_link'; 40 public static $PAGE_EDITLINK = 'editlink';
41 41
42 public static $PAGE_DELETELINK = 'delete_link'; 42 public static $PAGE_DELETELINK = 'delete_link';
43 43
@@ -60,128 +60,4 @@ class LegacyRouter
60 public static $PAGE_THUMBS_UPDATE = 'thumbs_update'; 60 public static $PAGE_THUMBS_UPDATE = 'thumbs_update';
61 61
62 public static $GET_TOKEN = 'token'; 62 public static $GET_TOKEN = 'token';
63
64 /**
65 * Reproducing renderPage() if hell, to avoid regression.
66 *
67 * This highlights how bad this needs to be rewrite,
68 * but let's focus on plugins for now.
69 *
70 * @param string $query $_SERVER['QUERY_STRING'].
71 * @param array $get $_SERVER['GET'].
72 * @param bool $loggedIn true if authenticated user.
73 *
74 * @return string page found.
75 */
76 public static function findPage($query, $get, $loggedIn)
77 {
78 $loggedIn = ($loggedIn === true) ? true : false;
79
80 if (empty($query) && !isset($get['edit_link']) && !isset($get['post'])) {
81 return self::$PAGE_LINKLIST;
82 }
83
84 if (startsWith($query, 'do=' . self::$PAGE_LOGIN) && $loggedIn === false) {
85 return self::$PAGE_LOGIN;
86 }
87
88 if (startsWith($query, 'do=' . self::$PAGE_PICWALL)) {
89 return self::$PAGE_PICWALL;
90 }
91
92 if (startsWith($query, 'do=' . self::$PAGE_TAGCLOUD)) {
93 return self::$PAGE_TAGCLOUD;
94 }
95
96 if (startsWith($query, 'do=' . self::$PAGE_TAGLIST)) {
97 return self::$PAGE_TAGLIST;
98 }
99
100 if (startsWith($query, 'do=' . self::$PAGE_OPENSEARCH)) {
101 return self::$PAGE_OPENSEARCH;
102 }
103
104 if (startsWith($query, 'do=' . self::$PAGE_DAILY)) {
105 return self::$PAGE_DAILY;
106 }
107
108 if (startsWith($query, 'do=' . self::$PAGE_FEED_ATOM)) {
109 return self::$PAGE_FEED_ATOM;
110 }
111
112 if (startsWith($query, 'do=' . self::$PAGE_FEED_RSS)) {
113 return self::$PAGE_FEED_RSS;
114 }
115
116 if (startsWith($query, 'do=' . self::$PAGE_THUMBS_UPDATE)) {
117 return self::$PAGE_THUMBS_UPDATE;
118 }
119
120 if (startsWith($query, 'do=' . self::$AJAX_THUMB_UPDATE)) {
121 return self::$AJAX_THUMB_UPDATE;
122 }
123
124 // At this point, only loggedin pages.
125 if (!$loggedIn) {
126 return self::$PAGE_LINKLIST;
127 }
128
129 if (startsWith($query, 'do=' . self::$PAGE_TOOLS)) {
130 return self::$PAGE_TOOLS;
131 }
132
133 if (startsWith($query, 'do=' . self::$PAGE_CHANGEPASSWORD)) {
134 return self::$PAGE_CHANGEPASSWORD;
135 }
136
137 if (startsWith($query, 'do=' . self::$PAGE_CONFIGURE)) {
138 return self::$PAGE_CONFIGURE;
139 }
140
141 if (startsWith($query, 'do=' . self::$PAGE_CHANGETAG)) {
142 return self::$PAGE_CHANGETAG;
143 }
144
145 if (startsWith($query, 'do=' . self::$PAGE_ADDLINK)) {
146 return self::$PAGE_ADDLINK;
147 }
148
149 if (isset($get['edit_link']) || isset($get['post'])) {
150 return self::$PAGE_EDITLINK;
151 }
152
153 if (isset($get['delete_link'])) {
154 return self::$PAGE_DELETELINK;
155 }
156
157 if (isset($get[self::$PAGE_CHANGE_VISIBILITY])) {
158 return self::$PAGE_CHANGE_VISIBILITY;
159 }
160
161 if (startsWith($query, 'do=' . self::$PAGE_PINLINK)) {
162 return self::$PAGE_PINLINK;
163 }
164
165 if (startsWith($query, 'do=' . self::$PAGE_EXPORT)) {
166 return self::$PAGE_EXPORT;
167 }
168
169 if (startsWith($query, 'do=' . self::$PAGE_IMPORT)) {
170 return self::$PAGE_IMPORT;
171 }
172
173 if (startsWith($query, 'do=' . self::$PAGE_PLUGINSADMIN)) {
174 return self::$PAGE_PLUGINSADMIN;
175 }
176
177 if (startsWith($query, 'do=' . self::$PAGE_SAVE_PLUGINSADMIN)) {
178 return self::$PAGE_SAVE_PLUGINSADMIN;
179 }
180
181 if (startsWith($query, 'do=' . self::$GET_TOKEN)) {
182 return self::$GET_TOKEN;
183 }
184
185 return self::$PAGE_LINKLIST;
186 }
187} 63}
diff --git a/application/plugin/PluginManager.php b/application/plugin/PluginManager.php
index 2d93cb3a..1b2197c9 100644
--- a/application/plugin/PluginManager.php
+++ b/application/plugin/PluginManager.php
@@ -100,16 +100,17 @@ class PluginManager
100 */ 100 */
101 public function executeHooks($hook, &$data, $params = array()) 101 public function executeHooks($hook, &$data, $params = array())
102 { 102 {
103 if (!empty($params['target'])) { 103 $metadataParameters = [
104 $data['_PAGE_'] = $params['target']; 104 'target' => '_PAGE_',
105 } 105 'loggedin' => '_LOGGEDIN_',
106 106 'basePath' => '_BASE_PATH_',
107 if (isset($params['loggedin'])) { 107 'bookmarkService' => '_BOOKMARK_SERVICE_',
108 $data['_LOGGEDIN_'] = $params['loggedin']; 108 ];
109 } 109
110 110 foreach ($metadataParameters as $parameter => $metaKey) {
111 if (isset($params['basePath'])) { 111 if (array_key_exists($parameter, $params)) {
112 $data['_BASE_PATH_'] = $params['basePath']; 112 $data[$metaKey] = $params[$parameter];
113 }
113 } 114 }
114 115
115 foreach ($this->loadedPlugins as $plugin) { 116 foreach ($this->loadedPlugins as $plugin) {
@@ -124,6 +125,10 @@ class PluginManager
124 } 125 }
125 } 126 }
126 } 127 }
128
129 foreach ($metadataParameters as $metaKey) {
130 unset($data[$metaKey]);
131 }
127 } 132 }
128 133
129 /** 134 /**
diff --git a/application/render/PageBuilder.php b/application/render/PageBuilder.php
index 7a716673..41b357dd 100644
--- a/application/render/PageBuilder.php
+++ b/application/render/PageBuilder.php
@@ -137,7 +137,7 @@ class PageBuilder
137 $this->tpl->assign('language', $this->conf->get('translation.language')); 137 $this->tpl->assign('language', $this->conf->get('translation.language'));
138 138
139 if ($this->bookmarkService !== null) { 139 if ($this->bookmarkService !== null) {
140 $this->tpl->assign('tags', $this->bookmarkService->bookmarksCountPerTag()); 140 $this->tpl->assign('tags', escape($this->bookmarkService->bookmarksCountPerTag()));
141 } 141 }
142 142
143 $this->tpl->assign( 143 $this->tpl->assign(
@@ -149,6 +149,8 @@ class PageBuilder
149 149
150 $this->tpl->assign('formatter', $this->conf->get('formatter', 'default')); 150 $this->tpl->assign('formatter', $this->conf->get('formatter', 'default'));
151 151
152 $this->tpl->assign('links_per_page', $this->session['LINKS_PER_PAGE']);
153
152 // To be removed with a proper theme configuration. 154 // To be removed with a proper theme configuration.
153 $this->tpl->assign('conf', $this->conf); 155 $this->tpl->assign('conf', $this->conf);
154 } 156 }
diff --git a/application/security/SessionManager.php b/application/security/SessionManager.php
index 76b0afe8..36df8c1c 100644
--- a/application/security/SessionManager.php
+++ b/application/security/SessionManager.php
@@ -183,7 +183,6 @@ class SessionManager
183 unset($this->session['expires_on']); 183 unset($this->session['expires_on']);
184 unset($this->session['username']); 184 unset($this->session['username']);
185 unset($this->session['visibility']); 185 unset($this->session['visibility']);
186 unset($this->session['untaggedonly']);
187 } 186 }
188 } 187 }
189 188
diff --git a/assets/default/js/base.js b/assets/default/js/base.js
index 0f29799d..be986ae0 100644
--- a/assets/default/js/base.js
+++ b/assets/default/js/base.js
@@ -10,7 +10,7 @@ import Awesomplete from 'awesomplete';
10 * @returns Found element or null. 10 * @returns Found element or null.
11 */ 11 */
12function findParent(element, tagName, attributes) { 12function findParent(element, tagName, attributes) {
13 const parentMatch = key => attributes[key] !== '' && element.getAttribute(key).indexOf(attributes[key]) !== -1; 13 const parentMatch = (key) => attributes[key] !== '' && element.getAttribute(key).indexOf(attributes[key]) !== -1;
14 while (element) { 14 while (element) {
15 if (element.tagName.toLowerCase() === tagName) { 15 if (element.tagName.toLowerCase() === tagName) {
16 if (Object.keys(attributes).find(parentMatch)) { 16 if (Object.keys(attributes).find(parentMatch)) {
@@ -25,16 +25,18 @@ function findParent(element, tagName, attributes) {
25/** 25/**
26 * Ajax request to refresh the CSRF token. 26 * Ajax request to refresh the CSRF token.
27 */ 27 */
28function refreshToken(basePath) { 28function refreshToken(basePath, callback) {
29 console.log('refresh');
30 const xhr = new XMLHttpRequest(); 29 const xhr = new XMLHttpRequest();
31 xhr.open('GET', `${basePath}/admin/token`); 30 xhr.open('GET', `${basePath}/admin/token`);
32 xhr.onload = () => { 31 xhr.onload = () => {
33 const elements = document.querySelectorAll('input[name="token"]'); 32 const elements = document.querySelectorAll('input[name="token"]');
34 [...elements].forEach((element) => { 33 [...elements].forEach((element) => {
35 console.log(element);
36 element.setAttribute('value', xhr.responseText); 34 element.setAttribute('value', xhr.responseText);
37 }); 35 });
36
37 if (callback) {
38 callback(xhr.response);
39 }
38 }; 40 };
39 xhr.send(); 41 xhr.send();
40} 42}
@@ -99,7 +101,7 @@ function updateAwesompleteList(selector, tags, instances) {
99 * @see http://stackoverflow.com/questions/18749591/encode-html-entities-in-javascript 101 * @see http://stackoverflow.com/questions/18749591/encode-html-entities-in-javascript
100 */ 102 */
101function htmlEntities(str) { 103function htmlEntities(str) {
102 return str.replace(/[\u00A0-\u9999<>&]/gim, i => `&#${i.charCodeAt(0)};`); 104 return str.replace(/[\u00A0-\u9999<>&]/gim, (i) => `&#${i.charCodeAt(0)};`);
103} 105}
104 106
105/** 107/**
@@ -192,8 +194,8 @@ function removeClass(element, classname) {
192function init(description) { 194function init(description) {
193 function resize() { 195 function resize() {
194 /* Fix jumpy resizing: https://stackoverflow.com/a/18262927/1484919 */ 196 /* Fix jumpy resizing: https://stackoverflow.com/a/18262927/1484919 */
195 const scrollTop = window.pageYOffset || 197 const scrollTop = window.pageYOffset
196 (document.documentElement || document.body.parentNode || document.body).scrollTop; 198 || (document.documentElement || document.body.parentNode || document.body).scrollTop;
197 199
198 description.style.height = 'auto'; 200 description.style.height = 'auto';
199 description.style.height = `${description.scrollHeight + 10}px`; 201 description.style.height = `${description.scrollHeight + 10}px`;
@@ -488,9 +490,10 @@ function init(description) {
488 }); 490 });
489 }); 491 });
490 492
491 const ids = links.map(item => item.id); 493 const ids = links.map((item) => item.id);
492 window.location = 494 window.location = (
493 `${basePath}/admin/shaare/visibility?token=${token.value}&newVisibility=${visibility}&id=${ids.join('+')}`; 495 `${basePath}/admin/shaare/visibility?token=${token.value}&newVisibility=${visibility}&id=${ids.join('+')}`
496 );
494 }); 497 });
495 }); 498 });
496 } 499 }
@@ -552,6 +555,7 @@ function init(description) {
552 } 555 }
553 const refreshedToken = document.getElementById('token').value; 556 const refreshedToken = document.getElementById('token').value;
554 const fromtag = block.getAttribute('data-tag'); 557 const fromtag = block.getAttribute('data-tag');
558 const fromtagUrl = block.getAttribute('data-tag-url');
555 const xhr = new XMLHttpRequest(); 559 const xhr = new XMLHttpRequest();
556 xhr.open('POST', `${basePath}/admin/tags`); 560 xhr.open('POST', `${basePath}/admin/tags`);
557 xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); 561 xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
@@ -561,6 +565,7 @@ function init(description) {
561 location.reload(); 565 location.reload();
562 } else { 566 } else {
563 block.setAttribute('data-tag', totag); 567 block.setAttribute('data-tag', totag);
568 block.setAttribute('data-tag-url', encodeURIComponent(totag));
564 input.setAttribute('name', totag); 569 input.setAttribute('name', totag);
565 input.setAttribute('value', totag); 570 input.setAttribute('value', totag);
566 findParent(input, 'div', { class: 'rename-tag-form' }).style.display = 'none'; 571 findParent(input, 'div', { class: 'rename-tag-form' }).style.display = 'none';
@@ -569,15 +574,18 @@ function init(description) {
569 .querySelector('a.tag-link') 574 .querySelector('a.tag-link')
570 .setAttribute('href', `${basePath}/?searchtags=${encodeURIComponent(totag)}`); 575 .setAttribute('href', `${basePath}/?searchtags=${encodeURIComponent(totag)}`);
571 block 576 block
577 .querySelector('a.count')
578 .setAttribute('href', `${basePath}/add-tag/${encodeURIComponent(totag)}`);
579 block
572 .querySelector('a.rename-tag') 580 .querySelector('a.rename-tag')
573 .setAttribute('href', `${basePath}/admin/tags?fromtag=${encodeURIComponent(totag)}`); 581 .setAttribute('href', `${basePath}/admin/tags?fromtag=${encodeURIComponent(totag)}`);
574 582
575 // Refresh awesomplete values 583 // Refresh awesomplete values
576 existingTags = existingTags.map(tag => (tag === fromtag ? totag : tag)); 584 existingTags = existingTags.map((tag) => (tag === fromtag ? totag : tag));
577 awesomepletes = updateAwesompleteList('.rename-tag-input', existingTags, awesomepletes); 585 awesomepletes = updateAwesompleteList('.rename-tag-input', existingTags, awesomepletes);
578 } 586 }
579 }; 587 };
580 xhr.send(`renametag=1&fromtag=${encodeURIComponent(fromtag)}&totag=${encodeURIComponent(totag)}&token=${refreshedToken}`); 588 xhr.send(`renametag=1&fromtag=${fromtagUrl}&totag=${encodeURIComponent(totag)}&token=${refreshedToken}`);
581 refreshToken(basePath); 589 refreshToken(basePath);
582 }); 590 });
583 }); 591 });
@@ -600,6 +608,7 @@ function init(description) {
600 event.preventDefault(); 608 event.preventDefault();
601 const block = findParent(event.target, 'div', { class: 'tag-list-item' }); 609 const block = findParent(event.target, 'div', { class: 'tag-list-item' });
602 const tag = block.getAttribute('data-tag'); 610 const tag = block.getAttribute('data-tag');
611 const tagUrl = block.getAttribute('data-tag-url');
603 const refreshedToken = document.getElementById('token').value; 612 const refreshedToken = document.getElementById('token').value;
604 613
605 if (confirm(`Are you sure you want to delete the tag "${tag}"?`)) { 614 if (confirm(`Are you sure you want to delete the tag "${tag}"?`)) {
@@ -609,10 +618,10 @@ function init(description) {
609 xhr.onload = () => { 618 xhr.onload = () => {
610 block.remove(); 619 block.remove();
611 }; 620 };
612 xhr.send(encodeURI(`deletetag=1&fromtag=${tag}&token=${refreshedToken}`)); 621 xhr.send(`deletetag=1&fromtag=${tagUrl}&token=${refreshedToken}`);
613 refreshToken(basePath); 622 refreshToken(basePath);
614 623
615 existingTags = existingTags.filter(tagItem => tagItem !== tag); 624 existingTags = existingTags.filter((tagItem) => tagItem !== tag);
616 awesomepletes = updateAwesompleteList('.rename-tag-input', existingTags, awesomepletes); 625 awesomepletes = updateAwesompleteList('.rename-tag-input', existingTags, awesomepletes);
617 } 626 }
618 }); 627 });
@@ -622,4 +631,15 @@ function init(description) {
622 [...autocompleteFields].forEach((autocompleteField) => { 631 [...autocompleteFields].forEach((autocompleteField) => {
623 awesomepletes.push(createAwesompleteInstance(autocompleteField)); 632 awesomepletes.push(createAwesompleteInstance(autocompleteField));
624 }); 633 });
634
635 const exportForm = document.querySelector('#exportform');
636 if (exportForm != null) {
637 exportForm.addEventListener('submit', (event) => {
638 event.preventDefault();
639
640 refreshToken(basePath, () => {
641 event.target.submit();
642 });
643 });
644 }
625})(); 645})();
diff --git a/assets/default/scss/shaarli.scss b/assets/default/scss/shaarli.scss
index 759dff29..a528adb0 100644
--- a/assets/default/scss/shaarli.scss
+++ b/assets/default/scss/shaarli.scss
@@ -69,20 +69,22 @@ pre {
69 font-family: 'Roboto'; 69 font-family: 'Roboto';
70 font-weight: 400; 70 font-weight: 400;
71 font-style: normal; 71 font-style: normal;
72 src: local('Roboto'), 72 src:
73 local('Roboto-Regular'), 73 local('Roboto'),
74 url('../fonts/Roboto-Regular.woff2') format('woff2'), 74 local('Roboto-Regular'),
75 url('../fonts/Roboto-Regular.woff') format('woff'); 75 url('../fonts/Roboto-Regular.woff2') format('woff2'),
76 url('../fonts/Roboto-Regular.woff') format('woff');
76} 77}
77 78
78@font-face { 79@font-face {
79 font-family: 'Roboto'; 80 font-family: 'Roboto';
80 font-weight: 700; 81 font-weight: 700;
81 font-style: normal; 82 font-style: normal;
82 src: local('Roboto'), 83 src:
83 local('Roboto-Bold'), 84 local('Roboto'),
84 url('../fonts/Roboto-Bold.woff2') format('woff2'), 85 local('Roboto-Bold'),
85 url('../fonts/Roboto-Bold.woff') format('woff'); 86 url('../fonts/Roboto-Bold.woff2') format('woff2'),
87 url('../fonts/Roboto-Bold.woff') format('woff');
86} 88}
87 89
88body, 90body,
@@ -375,7 +377,7 @@ body,
375} 377}
376 378
377@media screen and (max-width: 64em) { 379@media screen and (max-width: 64em) {
378 .header-search , 380 .header-search,
379 .header-search * { 381 .header-search * {
380 visibility: hidden; 382 visibility: hidden;
381 } 383 }
@@ -554,7 +556,6 @@ body,
554 color: $dark-grey; 556 color: $dark-grey;
555 font-size: .9em; 557 font-size: .9em;
556 558
557
558 a { 559 a {
559 display: inline-block; 560 display: inline-block;
560 margin: 3px 0; 561 margin: 3px 0;
@@ -616,6 +617,11 @@ body,
616 padding: 5px; 617 padding: 5px;
617 text-decoration: none; 618 text-decoration: none;
618 color: $dark-grey; 619 color: $dark-grey;
620
621 &.selected {
622 background: var(--main-color);
623 color: $white;
624 }
619 } 625 }
620 626
621 input { 627 input {
@@ -1552,11 +1558,11 @@ form {
1552 text-align: center; 1558 text-align: center;
1553 1559
1554 a { 1560 a {
1561 background: $almost-white;
1555 display: inline-block; 1562 display: inline-block;
1556 margin: 0 15px; 1563 padding: 5px;
1557 text-decoration: none; 1564 text-decoration: none;
1558 color: $white; 1565 color: $dark-grey;
1559 font-weight: bold;
1560 } 1566 }
1561} 1567}
1562 1568
@@ -1604,13 +1610,14 @@ form {
1604 1610
1605 > div { 1611 > div {
1606 border-radius: 10px; 1612 border-radius: 10px;
1607 background: repeating-linear-gradient( 1613 background:
1608 -45deg, 1614 repeating-linear-gradient(
1609 $almost-white, 1615 -45deg,
1610 $almost-white 6px, 1616 $almost-white,
1611 var(--background-color) 6px, 1617 $almost-white 6px,
1612 var(--background-color) 12px 1618 var(--background-color) 6px,
1613 ); 1619 var(--background-color) 12px
1620 );
1614 width: 0%; 1621 width: 0%;
1615 height: 10px; 1622 height: 10px;
1616 } 1623 }
diff --git a/assets/vintage/css/shaarli.css b/assets/vintage/css/shaarli.css
index 87c440c8..1688dce0 100644
--- a/assets/vintage/css/shaarli.css
+++ b/assets/vintage/css/shaarli.css
@@ -746,8 +746,6 @@ a.bigbutton, #pageheader a.bigbutton {
746 text-align: left; 746 text-align: left;
747 background-color: transparent; 747 background-color: transparent;
748 background-color: rgba(0, 0, 0, 0.4); 748 background-color: rgba(0, 0, 0, 0.4);
749 /* FF3+, Saf3+, Opera 10.10+, Chrome, IE9 */
750 filter: progid: DXImageTransform.Microsoft.gradient(startColorstr=#66000000, endColorstr=#66000000);
751 /* IE6–IE9 */ 749 /* IE6–IE9 */
752 text-shadow: 2px 2px 1px #000000; 750 text-shadow: 2px 2px 1px #000000;
753} 751}
diff --git a/composer.json b/composer.json
index 738d9f58..7e675623 100644
--- a/composer.json
+++ b/composer.json
@@ -10,6 +10,7 @@
10 }, 10 },
11 "keywords": ["bookmark", "link", "share", "web"], 11 "keywords": ["bookmark", "link", "share", "web"],
12 "config": { 12 "config": {
13 "sort-packages": true,
13 "platform": { 14 "platform": {
14 "php": "7.1.29" 15 "php": "7.1.29"
15 } 16 }
@@ -18,18 +19,18 @@
18 "php": ">=7.1", 19 "php": ">=7.1",
19 "ext-json": "*", 20 "ext-json": "*",
20 "ext-zlib": "*", 21 "ext-zlib": "*",
21 "shaarli/netscape-bookmark-parser": "^2.1",
22 "erusev/parsedown": "^1.6",
23 "slim/slim": "^3.0",
24 "arthurhoaro/web-thumbnailer": "^2.0", 22 "arthurhoaro/web-thumbnailer": "^2.0",
23 "erusev/parsedown": "^1.6",
24 "erusev/parsedown-extra": "^0.8.1",
25 "gettext/gettext": "^4.4",
25 "pubsubhubbub/publisher": "dev-master", 26 "pubsubhubbub/publisher": "dev-master",
26 "gettext/gettext": "^4.4" 27 "shaarli/netscape-bookmark-parser": "^2.1",
28 "slim/slim": "^3.0"
27 }, 29 },
28 "require-dev": { 30 "require-dev": {
29 "roave/security-advisories": "dev-master", 31 "roave/security-advisories": "dev-master",
30 "phpunit/phpcov": "*", 32 "squizlabs/php_codesniffer": "3.*",
31 "phpunit/phpunit": "^7.5", 33 "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0"
32 "squizlabs/php_codesniffer": "3.*"
33 }, 34 },
34 "suggest": { 35 "suggest": {
35 "ext-curl": "Allows fetching web pages and thumbnails in a more robust way", 36 "ext-curl": "Allows fetching web pages and thumbnails in a more robust way",
diff --git a/composer.lock b/composer.lock
index ae7a9269..e02491ff 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,29 +4,31 @@
4 "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", 4 "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
5 "This file is @generated automatically" 5 "This file is @generated automatically"
6 ], 6 ],
7 "content-hash": "37e420b4b6e9fa74b27e127dd422d9a6", 7 "content-hash": "f84918821b0dceb0cd569875c0418bb8",
8 "packages": [ 8 "packages": [
9 { 9 {
10 "name": "arthurhoaro/web-thumbnailer", 10 "name": "arthurhoaro/web-thumbnailer",
11 "version": "v2.0.1", 11 "version": "v2.0.3",
12 "source": { 12 "source": {
13 "type": "git", 13 "type": "git",
14 "url": "https://github.com/ArthurHoaro/web-thumbnailer.git", 14 "url": "https://github.com/ArthurHoaro/web-thumbnailer.git",
15 "reference": "4aa27a1b54b9823341fedd7ca2dcfb11a6b3186a" 15 "reference": "39bfd4f3136d9e6096496b9720e877326cfe4775"
16 }, 16 },
17 "dist": { 17 "dist": {
18 "type": "zip", 18 "type": "zip",
19 "url": "https://api.github.com/repos/ArthurHoaro/web-thumbnailer/zipball/4aa27a1b54b9823341fedd7ca2dcfb11a6b3186a", 19 "url": "https://api.github.com/repos/ArthurHoaro/web-thumbnailer/zipball/39bfd4f3136d9e6096496b9720e877326cfe4775",
20 "reference": "4aa27a1b54b9823341fedd7ca2dcfb11a6b3186a", 20 "reference": "39bfd4f3136d9e6096496b9720e877326cfe4775",
21 "shasum": "" 21 "shasum": ""
22 }, 22 },
23 "require": { 23 "require": {
24 "php": ">=7.1", 24 "php": ">=7.1",
25 "phpunit/php-text-template": "^1.2" 25 "phpunit/php-text-template": "^1.2 || ^2.0"
26 }, 26 },
27 "require-dev": { 27 "require-dev": {
28 "gskema/phpcs-type-sniff": "^0.13.1",
28 "php-coveralls/php-coveralls": "^2.0", 29 "php-coveralls/php-coveralls": "^2.0",
29 "phpunit/phpunit": "^7.0 || ^8.0", 30 "phpstan/phpstan": "^0.12.9",
31 "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0",
30 "squizlabs/php_codesniffer": "^3.0" 32 "squizlabs/php_codesniffer": "^3.0"
31 }, 33 },
32 "type": "library", 34 "type": "library",
@@ -49,7 +51,11 @@
49 } 51 }
50 ], 52 ],
51 "description": "PHP library which will retrieve a thumbnail for any given URL", 53 "description": "PHP library which will retrieve a thumbnail for any given URL",
52 "time": "2020-01-17T19:42:49+00:00" 54 "support": {
55 "issues": "https://github.com/ArthurHoaro/web-thumbnailer/issues",
56 "source": "https://github.com/ArthurHoaro/web-thumbnailer/tree/v2.0.3"
57 },
58 "time": "2020-09-29T15:51:03+00:00"
53 }, 59 },
54 { 60 {
55 "name": "erusev/parsedown", 61 "name": "erusev/parsedown",
@@ -95,9 +101,64 @@
95 "markdown", 101 "markdown",
96 "parser" 102 "parser"
97 ], 103 ],
104 "support": {
105 "issues": "https://github.com/erusev/parsedown/issues",
106 "source": "https://github.com/erusev/parsedown/tree/1.7.x"
107 },
98 "time": "2019-12-30T22:54:17+00:00" 108 "time": "2019-12-30T22:54:17+00:00"
99 }, 109 },
100 { 110 {
111 "name": "erusev/parsedown-extra",
112 "version": "0.8.1",
113 "source": {
114 "type": "git",
115 "url": "https://github.com/erusev/parsedown-extra.git",
116 "reference": "91ac3ff98f0cea243bdccc688df43810f044dcef"
117 },
118 "dist": {
119 "type": "zip",
120 "url": "https://api.github.com/repos/erusev/parsedown-extra/zipball/91ac3ff98f0cea243bdccc688df43810f044dcef",
121 "reference": "91ac3ff98f0cea243bdccc688df43810f044dcef",
122 "shasum": ""
123 },
124 "require": {
125 "erusev/parsedown": "^1.7.4"
126 },
127 "require-dev": {
128 "phpunit/phpunit": "^4.8.35"
129 },
130 "type": "library",
131 "autoload": {
132 "psr-0": {
133 "ParsedownExtra": ""
134 }
135 },
136 "notification-url": "https://packagist.org/downloads/",
137 "license": [
138 "MIT"
139 ],
140 "authors": [
141 {
142 "name": "Emanuil Rusev",
143 "email": "hello@erusev.com",
144 "homepage": "http://erusev.com"
145 }
146 ],
147 "description": "An extension of Parsedown that adds support for Markdown Extra.",
148 "homepage": "https://github.com/erusev/parsedown-extra",
149 "keywords": [
150 "markdown",
151 "markdown extra",
152 "parsedown",
153 "parser"
154 ],
155 "support": {
156 "issues": "https://github.com/erusev/parsedown-extra/issues",
157 "source": "https://github.com/erusev/parsedown-extra/tree/0.8.x"
158 },
159 "time": "2019-12-30T23:20:37+00:00"
160 },
161 {
101 "name": "gettext/gettext", 162 "name": "gettext/gettext",
102 "version": "v4.8.2", 163 "version": "v4.8.2",
103 "source": { 164 "source": {
@@ -157,6 +218,11 @@
157 "po", 218 "po",
158 "translation" 219 "translation"
159 ], 220 ],
221 "support": {
222 "email": "oom@oscarotero.com",
223 "issues": "https://github.com/oscarotero/Gettext/issues",
224 "source": "https://github.com/php-gettext/Gettext/tree/v4.8.2"
225 },
160 "time": "2019-12-02T10:21:14+00:00" 226 "time": "2019-12-02T10:21:14+00:00"
161 }, 227 },
162 { 228 {
@@ -218,6 +284,10 @@
218 "translations", 284 "translations",
219 "unicode" 285 "unicode"
220 ], 286 ],
287 "support": {
288 "issues": "https://github.com/php-gettext/Languages/issues",
289 "source": "https://github.com/php-gettext/Languages/tree/2.6.0"
290 },
221 "time": "2019-11-13T10:30:21+00:00" 291 "time": "2019-11-13T10:30:21+00:00"
222 }, 292 },
223 { 293 {
@@ -268,6 +338,10 @@
268 "keywords": [ 338 "keywords": [
269 "logging" 339 "logging"
270 ], 340 ],
341 "support": {
342 "issues": "https://github.com/katzgrau/KLogger/issues",
343 "source": "https://github.com/katzgrau/KLogger/tree/master"
344 },
271 "time": "2016-11-07T19:29:14+00:00" 345 "time": "2016-11-07T19:29:14+00:00"
272 }, 346 },
273 { 347 {
@@ -314,6 +388,10 @@
314 "router", 388 "router",
315 "routing" 389 "routing"
316 ], 390 ],
391 "support": {
392 "issues": "https://github.com/nikic/FastRoute/issues",
393 "source": "https://github.com/nikic/FastRoute/tree/master"
394 },
317 "time": "2018-02-13T20:26:39+00:00" 395 "time": "2018-02-13T20:26:39+00:00"
318 }, 396 },
319 { 397 {
@@ -355,6 +433,10 @@
355 "keywords": [ 433 "keywords": [
356 "template" 434 "template"
357 ], 435 ],
436 "support": {
437 "issues": "https://github.com/sebastianbergmann/php-text-template/issues",
438 "source": "https://github.com/sebastianbergmann/php-text-template/tree/1.2.1"
439 },
358 "time": "2015-06-21T13:50:34+00:00" 440 "time": "2015-06-21T13:50:34+00:00"
359 }, 441 },
360 { 442 {
@@ -405,6 +487,10 @@
405 "container", 487 "container",
406 "dependency injection" 488 "dependency injection"
407 ], 489 ],
490 "support": {
491 "issues": "https://github.com/silexphp/Pimple/issues",
492 "source": "https://github.com/silexphp/Pimple/tree/master"
493 },
408 "time": "2018-01-21T07:42:36+00:00" 494 "time": "2018-01-21T07:42:36+00:00"
409 }, 495 },
410 { 496 {
@@ -454,6 +540,10 @@
454 "container-interop", 540 "container-interop",
455 "psr" 541 "psr"
456 ], 542 ],
543 "support": {
544 "issues": "https://github.com/php-fig/container/issues",
545 "source": "https://github.com/php-fig/container/tree/master"
546 },
457 "time": "2017-02-14T16:28:37+00:00" 547 "time": "2017-02-14T16:28:37+00:00"
458 }, 548 },
459 { 549 {
@@ -504,6 +594,9 @@
504 "request", 594 "request",
505 "response" 595 "response"
506 ], 596 ],
597 "support": {
598 "source": "https://github.com/php-fig/http-message/tree/master"
599 },
507 "time": "2016-08-06T14:39:51+00:00" 600 "time": "2016-08-06T14:39:51+00:00"
508 }, 601 },
509 { 602 {
@@ -551,6 +644,9 @@
551 "psr", 644 "psr",
552 "psr-3" 645 "psr-3"
553 ], 646 ],
647 "support": {
648 "source": "https://github.com/php-fig/log/tree/1.1.3"
649 },
554 "time": "2020-03-23T09:12:05+00:00" 650 "time": "2020-03-23T09:12:05+00:00"
555 }, 651 },
556 { 652 {
@@ -571,6 +667,7 @@
571 "ext-curl": "*", 667 "ext-curl": "*",
572 "php": "~5.4 || ~7.0" 668 "php": "~5.4 || ~7.0"
573 }, 669 },
670 "default-branch": true,
574 "type": "library", 671 "type": "library",
575 "autoload": { 672 "autoload": {
576 "psr-4": { 673 "psr-4": {
@@ -596,20 +693,24 @@
596 "pubsubhubbub", 693 "pubsubhubbub",
597 "websub" 694 "websub"
598 ], 695 ],
696 "support": {
697 "issues": "https://github.com/pubsubhubbub/php-publisher/issues",
698 "source": "https://github.com/pubsubhubbub/php-publisher/tree/master"
699 },
599 "time": "2018-10-09T05:20:28+00:00" 700 "time": "2018-10-09T05:20:28+00:00"
600 }, 701 },
601 { 702 {
602 "name": "shaarli/netscape-bookmark-parser", 703 "name": "shaarli/netscape-bookmark-parser",
603 "version": "v2.1.0", 704 "version": "v2.2.0",
604 "source": { 705 "source": {
605 "type": "git", 706 "type": "git",
606 "url": "https://github.com/shaarli/netscape-bookmark-parser.git", 707 "url": "https://github.com/shaarli/netscape-bookmark-parser.git",
607 "reference": "819008ee42c4dd7e45d988176a4a22d6ed689577" 708 "reference": "432a010af2bb1832d6fbc4763e6b0100b980a1df"
608 }, 709 },
609 "dist": { 710 "dist": {
610 "type": "zip", 711 "type": "zip",
611 "url": "https://api.github.com/repos/shaarli/netscape-bookmark-parser/zipball/819008ee42c4dd7e45d988176a4a22d6ed689577", 712 "url": "https://api.github.com/repos/shaarli/netscape-bookmark-parser/zipball/432a010af2bb1832d6fbc4763e6b0100b980a1df",
612 "reference": "819008ee42c4dd7e45d988176a4a22d6ed689577", 713 "reference": "432a010af2bb1832d6fbc4763e6b0100b980a1df",
613 "shasum": "" 714 "shasum": ""
614 }, 715 },
615 "require": { 716 "require": {
@@ -649,9 +750,13 @@
649 "bookmark", 750 "bookmark",
650 "link", 751 "link",
651 "netscape", 752 "netscape",
652 "parser" 753 "parse"
653 ], 754 ],
654 "time": "2018-10-06T14:43:38+00:00" 755 "support": {
756 "issues": "https://github.com/shaarli/netscape-bookmark-parser/issues",
757 "source": "https://github.com/shaarli/netscape-bookmark-parser/tree/v2.2.0"
758 },
759 "time": "2020-06-06T15:53:53+00:00"
655 }, 760 },
656 { 761 {
657 "name": "slim/slim", 762 "name": "slim/slim",
@@ -724,26 +829,30 @@
724 "micro", 829 "micro",
725 "router" 830 "router"
726 ], 831 ],
832 "support": {
833 "issues": "https://github.com/slimphp/Slim/issues",
834 "source": "https://github.com/slimphp/Slim/tree/3.x"
835 },
727 "time": "2019-11-28T17:40:33+00:00" 836 "time": "2019-11-28T17:40:33+00:00"
728 } 837 }
729 ], 838 ],
730 "packages-dev": [ 839 "packages-dev": [
731 { 840 {
732 "name": "doctrine/instantiator", 841 "name": "doctrine/instantiator",
733 "version": "1.3.0", 842 "version": "1.3.1",
734 "source": { 843 "source": {
735 "type": "git", 844 "type": "git",
736 "url": "https://github.com/doctrine/instantiator.git", 845 "url": "https://github.com/doctrine/instantiator.git",
737 "reference": "ae466f726242e637cebdd526a7d991b9433bacf1" 846 "reference": "f350df0268e904597e3bd9c4685c53e0e333feea"
738 }, 847 },
739 "dist": { 848 "dist": {
740 "type": "zip", 849 "type": "zip",
741 "url": "https://api.github.com/repos/doctrine/instantiator/zipball/ae466f726242e637cebdd526a7d991b9433bacf1", 850 "url": "https://api.github.com/repos/doctrine/instantiator/zipball/f350df0268e904597e3bd9c4685c53e0e333feea",
742 "reference": "ae466f726242e637cebdd526a7d991b9433bacf1", 851 "reference": "f350df0268e904597e3bd9c4685c53e0e333feea",
743 "shasum": "" 852 "shasum": ""
744 }, 853 },
745 "require": { 854 "require": {
746 "php": "^7.1" 855 "php": "^7.1 || ^8.0"
747 }, 856 },
748 "require-dev": { 857 "require-dev": {
749 "doctrine/coding-standard": "^6.0", 858 "doctrine/coding-standard": "^6.0",
@@ -782,24 +891,42 @@
782 "constructor", 891 "constructor",
783 "instantiate" 892 "instantiate"
784 ], 893 ],
785 "time": "2019-10-21T16:45:58+00:00" 894 "support": {
895 "issues": "https://github.com/doctrine/instantiator/issues",
896 "source": "https://github.com/doctrine/instantiator/tree/1.3.x"
897 },
898 "funding": [
899 {
900 "url": "https://www.doctrine-project.org/sponsorship.html",
901 "type": "custom"
902 },
903 {
904 "url": "https://www.patreon.com/phpdoctrine",
905 "type": "patreon"
906 },
907 {
908 "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator",
909 "type": "tidelift"
910 }
911 ],
912 "time": "2020-05-29T17:27:14+00:00"
786 }, 913 },
787 { 914 {
788 "name": "myclabs/deep-copy", 915 "name": "myclabs/deep-copy",
789 "version": "1.9.5", 916 "version": "1.10.1",
790 "source": { 917 "source": {
791 "type": "git", 918 "type": "git",
792 "url": "https://github.com/myclabs/DeepCopy.git", 919 "url": "https://github.com/myclabs/DeepCopy.git",
793 "reference": "b2c28789e80a97badd14145fda39b545d83ca3ef" 920 "reference": "969b211f9a51aa1f6c01d1d2aef56d3bd91598e5"
794 }, 921 },
795 "dist": { 922 "dist": {
796 "type": "zip", 923 "type": "zip",
797 "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/b2c28789e80a97badd14145fda39b545d83ca3ef", 924 "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/969b211f9a51aa1f6c01d1d2aef56d3bd91598e5",
798 "reference": "b2c28789e80a97badd14145fda39b545d83ca3ef", 925 "reference": "969b211f9a51aa1f6c01d1d2aef56d3bd91598e5",
799 "shasum": "" 926 "shasum": ""
800 }, 927 },
801 "require": { 928 "require": {
802 "php": "^7.1" 929 "php": "^7.1 || ^8.0"
803 }, 930 },
804 "replace": { 931 "replace": {
805 "myclabs/deep-copy": "self.version" 932 "myclabs/deep-copy": "self.version"
@@ -830,7 +957,17 @@
830 "object", 957 "object",
831 "object graph" 958 "object graph"
832 ], 959 ],
833 "time": "2020-01-17T21:11:47+00:00" 960 "support": {
961 "issues": "https://github.com/myclabs/DeepCopy/issues",
962 "source": "https://github.com/myclabs/DeepCopy/tree/1.x"
963 },
964 "funding": [
965 {
966 "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy",
967 "type": "tidelift"
968 }
969 ],
970 "time": "2020-06-29T13:22:24+00:00"
834 }, 971 },
835 { 972 {
836 "name": "phar-io/manifest", 973 "name": "phar-io/manifest",
@@ -885,6 +1022,10 @@
885 } 1022 }
886 ], 1023 ],
887 "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", 1024 "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
1025 "support": {
1026 "issues": "https://github.com/phar-io/manifest/issues",
1027 "source": "https://github.com/phar-io/manifest/tree/master"
1028 },
888 "time": "2018-07-08T19:23:20+00:00" 1029 "time": "2018-07-08T19:23:20+00:00"
889 }, 1030 },
890 { 1031 {
@@ -932,6 +1073,10 @@
932 } 1073 }
933 ], 1074 ],
934 "description": "Library for handling version information and constraints", 1075 "description": "Library for handling version information and constraints",
1076 "support": {
1077 "issues": "https://github.com/phar-io/version/issues",
1078 "source": "https://github.com/phar-io/version/tree/master"
1079 },
935 "time": "2018-07-08T19:19:57+00:00" 1080 "time": "2018-07-08T19:19:57+00:00"
936 }, 1081 },
937 { 1082 {
@@ -981,6 +1126,10 @@
981 "reflection", 1126 "reflection",
982 "static analysis" 1127 "static analysis"
983 ], 1128 ],
1129 "support": {
1130 "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues",
1131 "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/master"
1132 },
984 "time": "2020-04-27T09:25:28+00:00" 1133 "time": "2020-04-27T09:25:28+00:00"
985 }, 1134 },
986 { 1135 {
@@ -1033,6 +1182,10 @@
1033 } 1182 }
1034 ], 1183 ],
1035 "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", 1184 "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
1185 "support": {
1186 "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues",
1187 "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/release/4.x"
1188 },
1036 "time": "2019-12-28T18:55:12+00:00" 1189 "time": "2019-12-28T18:55:12+00:00"
1037 }, 1190 },
1038 { 1191 {
@@ -1080,6 +1233,10 @@
1080 } 1233 }
1081 ], 1234 ],
1082 "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", 1235 "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names",
1236 "support": {
1237 "issues": "https://github.com/phpDocumentor/TypeResolver/issues",
1238 "source": "https://github.com/phpDocumentor/TypeResolver/tree/0.7.2"
1239 },
1083 "time": "2019-08-22T18:11:29+00:00" 1240 "time": "2019-08-22T18:11:29+00:00"
1084 }, 1241 },
1085 { 1242 {
@@ -1143,6 +1300,10 @@
1143 "spy", 1300 "spy",
1144 "stub" 1301 "stub"
1145 ], 1302 ],
1303 "support": {
1304 "issues": "https://github.com/phpspec/prophecy/issues",
1305 "source": "https://github.com/phpspec/prophecy/tree/v1.10.3"
1306 },
1146 "time": "2020-03-05T15:02:03+00:00" 1307 "time": "2020-03-05T15:02:03+00:00"
1147 }, 1308 },
1148 { 1309 {
@@ -1206,6 +1367,10 @@
1206 "testing", 1367 "testing",
1207 "xunit" 1368 "xunit"
1208 ], 1369 ],
1370 "support": {
1371 "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
1372 "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/master"
1373 },
1209 "time": "2018-10-31T16:06:48+00:00" 1374 "time": "2018-10-31T16:06:48+00:00"
1210 }, 1375 },
1211 { 1376 {
@@ -1256,6 +1421,10 @@
1256 "filesystem", 1421 "filesystem",
1257 "iterator" 1422 "iterator"
1258 ], 1423 ],
1424 "support": {
1425 "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues",
1426 "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/2.0.2"
1427 },
1259 "time": "2018-09-13T20:33:42+00:00" 1428 "time": "2018-09-13T20:33:42+00:00"
1260 }, 1429 },
1261 { 1430 {
@@ -1305,6 +1474,10 @@
1305 "keywords": [ 1474 "keywords": [
1306 "timer" 1475 "timer"
1307 ], 1476 ],
1477 "support": {
1478 "issues": "https://github.com/sebastianbergmann/php-timer/issues",
1479 "source": "https://github.com/sebastianbergmann/php-timer/tree/master"
1480 },
1308 "time": "2019-06-07T04:22:29+00:00" 1481 "time": "2019-06-07T04:22:29+00:00"
1309 }, 1482 },
1310 { 1483 {
@@ -1354,59 +1527,12 @@
1354 "keywords": [ 1527 "keywords": [
1355 "tokenizer" 1528 "tokenizer"
1356 ], 1529 ],
1357 "time": "2019-09-17T06:23:10+00:00" 1530 "support": {
1358 }, 1531 "issues": "https://github.com/sebastianbergmann/php-token-stream/issues",
1359 { 1532 "source": "https://github.com/sebastianbergmann/php-token-stream/tree/3.1.1"
1360 "name": "phpunit/phpcov",
1361 "version": "5.0.0",
1362 "source": {
1363 "type": "git",
1364 "url": "https://github.com/sebastianbergmann/phpcov.git",
1365 "reference": "72fb974e6fe9b39d7e0b0d44061d2ba4c49ee0b8"
1366 },
1367 "dist": {
1368 "type": "zip",
1369 "url": "https://api.github.com/repos/sebastianbergmann/phpcov/zipball/72fb974e6fe9b39d7e0b0d44061d2ba4c49ee0b8",
1370 "reference": "72fb974e6fe9b39d7e0b0d44061d2ba4c49ee0b8",
1371 "shasum": ""
1372 },
1373 "require": {
1374 "php": "^7.1",
1375 "phpunit/php-code-coverage": "^6.0",
1376 "phpunit/phpunit": "^7.0",
1377 "sebastian/diff": "^3.0",
1378 "sebastian/finder-facade": "^1.1",
1379 "sebastian/version": "^2.0",
1380 "symfony/console": "^3.0 || ^4.0"
1381 },
1382 "bin": [
1383 "phpcov"
1384 ],
1385 "type": "library",
1386 "extra": {
1387 "branch-alias": {
1388 "dev-master": "5.0-dev"
1389 }
1390 },
1391 "autoload": {
1392 "classmap": [
1393 "src/"
1394 ]
1395 }, 1533 },
1396 "notification-url": "https://packagist.org/downloads/", 1534 "abandoned": true,
1397 "license": [ 1535 "time": "2019-09-17T06:23:10+00:00"
1398 "BSD-3-Clause"
1399 ],
1400 "authors": [
1401 {
1402 "name": "Sebastian Bergmann",
1403 "email": "sebastian@phpunit.de",
1404 "role": "lead"
1405 }
1406 ],
1407 "description": "CLI frontend for php-code-coverage",
1408 "homepage": "https://github.com/sebastianbergmann/phpcov",
1409 "time": "2018-02-04T10:18:50+00:00"
1410 }, 1536 },
1411 { 1537 {
1412 "name": "phpunit/phpunit", 1538 "name": "phpunit/phpunit",
@@ -1490,6 +1616,10 @@
1490 "testing", 1616 "testing",
1491 "xunit" 1617 "xunit"
1492 ], 1618 ],
1619 "support": {
1620 "issues": "https://github.com/sebastianbergmann/phpunit/issues",
1621 "source": "https://github.com/sebastianbergmann/phpunit/tree/7.5.20"
1622 },
1493 "time": "2020-01-08T08:45:45+00:00" 1623 "time": "2020-01-08T08:45:45+00:00"
1494 }, 1624 },
1495 { 1625 {
@@ -1498,12 +1628,12 @@
1498 "source": { 1628 "source": {
1499 "type": "git", 1629 "type": "git",
1500 "url": "https://github.com/Roave/SecurityAdvisories.git", 1630 "url": "https://github.com/Roave/SecurityAdvisories.git",
1501 "reference": "5a342e2dc0408d026b97ee3176b5b406e54e3766" 1631 "reference": "ba5d234b3a1559321b816b64aafc2ce6728799ff"
1502 }, 1632 },
1503 "dist": { 1633 "dist": {
1504 "type": "zip", 1634 "type": "zip",
1505 "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/5a342e2dc0408d026b97ee3176b5b406e54e3766", 1635 "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/ba5d234b3a1559321b816b64aafc2ce6728799ff",
1506 "reference": "5a342e2dc0408d026b97ee3176b5b406e54e3766", 1636 "reference": "ba5d234b3a1559321b816b64aafc2ce6728799ff",
1507 "shasum": "" 1637 "shasum": ""
1508 }, 1638 },
1509 "conflict": { 1639 "conflict": {
@@ -1512,12 +1642,15 @@
1512 "alterphp/easyadmin-extension-bundle": ">=1.2,<1.2.11|>=1.3,<1.3.1", 1642 "alterphp/easyadmin-extension-bundle": ">=1.2,<1.2.11|>=1.3,<1.3.1",
1513 "amphp/artax": "<1.0.6|>=2,<2.0.6", 1643 "amphp/artax": "<1.0.6|>=2,<2.0.6",
1514 "amphp/http": "<1.0.1", 1644 "amphp/http": "<1.0.1",
1645 "amphp/http-client": ">=4,<4.4",
1515 "api-platform/core": ">=2.2,<2.2.10|>=2.3,<2.3.6", 1646 "api-platform/core": ">=2.2,<2.2.10|>=2.3,<2.3.6",
1516 "asymmetricrypt/asymmetricrypt": ">=0,<9.9.99", 1647 "asymmetricrypt/asymmetricrypt": ">=0,<9.9.99",
1517 "aws/aws-sdk-php": ">=3,<3.2.1", 1648 "aws/aws-sdk-php": ">=3,<3.2.1",
1518 "bagisto/bagisto": "<0.1.5", 1649 "bagisto/bagisto": "<0.1.5",
1519 "barrelstrength/sprout-base-email": "<3.9", 1650 "barrelstrength/sprout-base-email": "<1.2.7",
1520 "bolt/bolt": "<3.6.10", 1651 "barrelstrength/sprout-forms": "<3.9",
1652 "baserproject/basercms": ">=4,<=4.3.6",
1653 "bolt/bolt": "<3.7.1",
1521 "brightlocal/phpwhois": "<=4.2.5", 1654 "brightlocal/phpwhois": "<=4.2.5",
1522 "buddypress/buddypress": "<5.1.2", 1655 "buddypress/buddypress": "<5.1.2",
1523 "bugsnag/bugsnag-laravel": ">=2,<2.0.2", 1656 "bugsnag/bugsnag-laravel": ">=2,<2.0.2",
@@ -1530,10 +1663,11 @@
1530 "composer/composer": "<=1-alpha.11", 1663 "composer/composer": "<=1-alpha.11",
1531 "contao-components/mediaelement": ">=2.14.2,<2.21.1", 1664 "contao-components/mediaelement": ">=2.14.2,<2.21.1",
1532 "contao/core": ">=2,<3.5.39", 1665 "contao/core": ">=2,<3.5.39",
1533 "contao/core-bundle": ">=4,<4.4.46|>=4.5,<4.8.6", 1666 "contao/core-bundle": ">=4,<4.4.52|>=4.5,<4.9.6|= 4.10.0",
1534 "contao/listing-bundle": ">=4,<4.4.8", 1667 "contao/listing-bundle": ">=4,<4.4.8",
1535 "datadog/dd-trace": ">=0.30,<0.30.2", 1668 "datadog/dd-trace": ">=0.30,<0.30.2",
1536 "david-garcia/phpwhois": "<=4.3.1", 1669 "david-garcia/phpwhois": "<=4.3.1",
1670 "derhansen/sf_event_mgt": "<4.3.1|>=5,<5.1.1",
1537 "doctrine/annotations": ">=1,<1.2.7", 1671 "doctrine/annotations": ">=1,<1.2.7",
1538 "doctrine/cache": ">=1,<1.3.2|>=1.4,<1.4.2", 1672 "doctrine/cache": ">=1,<1.3.2|>=1.4,<1.4.2",
1539 "doctrine/common": ">=2,<2.4.3|>=2.5,<2.5.1", 1673 "doctrine/common": ">=2,<2.4.3|>=2.5,<2.5.1",
@@ -1543,10 +1677,10 @@
1543 "doctrine/mongodb-odm": ">=1,<1.0.2", 1677 "doctrine/mongodb-odm": ">=1,<1.0.2",
1544 "doctrine/mongodb-odm-bundle": ">=2,<3.0.1", 1678 "doctrine/mongodb-odm-bundle": ">=2,<3.0.1",
1545 "doctrine/orm": ">=2,<2.4.8|>=2.5,<2.5.1", 1679 "doctrine/orm": ">=2,<2.4.8|>=2.5,<2.5.1",
1546 "dolibarr/dolibarr": "<=10.0.6", 1680 "dolibarr/dolibarr": "<11.0.4",
1547 "dompdf/dompdf": ">=0.6,<0.6.2", 1681 "dompdf/dompdf": ">=0.6,<0.6.2",
1548 "drupal/core": ">=7,<7.69|>=8,<8.7.12|>=8.8,<8.8.4", 1682 "drupal/core": ">=7,<7.73|>=8,<8.8.10|>=8.9,<8.9.6|>=9,<9.0.6",
1549 "drupal/drupal": ">=7,<7.69|>=8,<8.7.12|>=8.8,<8.8.4", 1683 "drupal/drupal": ">=7,<7.73|>=8,<8.8.10|>=8.9,<8.9.6|>=9,<9.0.6",
1550 "endroid/qr-code-bundle": "<3.4.2", 1684 "endroid/qr-code-bundle": "<3.4.2",
1551 "enshrined/svg-sanitize": "<0.13.1", 1685 "enshrined/svg-sanitize": "<0.13.1",
1552 "erusev/parsedown": "<1.7.2", 1686 "erusev/parsedown": "<1.7.2",
@@ -1555,10 +1689,12 @@
1555 "ezsystems/ezfind-ls": ">=5.3,<5.3.6.1|>=5.4,<5.4.11.1|>=2017.12,<2017.12.0.1", 1689 "ezsystems/ezfind-ls": ">=5.3,<5.3.6.1|>=5.4,<5.4.11.1|>=2017.12,<2017.12.0.1",
1556 "ezsystems/ezplatform": ">=1.7,<1.7.9.1|>=1.13,<1.13.5.1|>=2.5,<2.5.4", 1690 "ezsystems/ezplatform": ">=1.7,<1.7.9.1|>=1.13,<1.13.5.1|>=2.5,<2.5.4",
1557 "ezsystems/ezplatform-admin-ui": ">=1.3,<1.3.5|>=1.4,<1.4.6", 1691 "ezsystems/ezplatform-admin-ui": ">=1.3,<1.3.5|>=1.4,<1.4.6",
1558 "ezsystems/ezplatform-admin-ui-assets": ">=4,<4.2", 1692 "ezsystems/ezplatform-admin-ui-assets": ">=4,<4.2.1|>=5,<5.0.1|>=5.1,<5.1.1",
1693 "ezsystems/ezplatform-kernel": ">=1,<1.0.2.1",
1559 "ezsystems/ezplatform-user": ">=1,<1.0.1", 1694 "ezsystems/ezplatform-user": ">=1,<1.0.1",
1560 "ezsystems/ezpublish-kernel": ">=5.3,<5.3.12.1|>=5.4,<5.4.14.1|>=6,<6.7.9.1|>=6.8,<6.13.6.2|>=7,<7.2.4.1|>=7.3,<7.3.2.1|>=7.5,<7.5.6.2", 1695 "ezsystems/ezpublish-kernel": ">=5.3,<5.3.12.1|>=5.4,<5.4.14.2|>=6,<6.7.9.1|>=6.8,<6.13.6.3|>=7,<7.2.4.1|>=7.3,<7.3.2.1|>=7.5,<7.5.7.1",
1561 "ezsystems/ezpublish-legacy": ">=5.3,<5.3.12.6|>=5.4,<5.4.14.1|>=2011,<2017.12.7.2|>=2018.6,<2018.6.1.4|>=2018.9,<2018.9.1.3|>=2019.3,<2019.3.4.2", 1696 "ezsystems/ezpublish-legacy": ">=5.3,<5.3.12.6|>=5.4,<5.4.14.2|>=2011,<2017.12.7.3|>=2018.6,<2018.6.1.4|>=2018.9,<2018.9.1.3|>=2019.3,<2019.3.5.1",
1697 "ezsystems/platform-ui-assets-bundle": ">=4.2,<4.2.3",
1562 "ezsystems/repository-forms": ">=2.3,<2.3.2.1", 1698 "ezsystems/repository-forms": ">=2.3,<2.3.2.1",
1563 "ezyang/htmlpurifier": "<4.1.1", 1699 "ezyang/htmlpurifier": "<4.1.1",
1564 "firebase/php-jwt": "<2", 1700 "firebase/php-jwt": "<2",
@@ -1567,14 +1703,16 @@
1567 "friendsofsymfony/oauth2-php": "<1.3", 1703 "friendsofsymfony/oauth2-php": "<1.3",
1568 "friendsofsymfony/rest-bundle": ">=1.2,<1.2.2", 1704 "friendsofsymfony/rest-bundle": ">=1.2,<1.2.2",
1569 "friendsofsymfony/user-bundle": ">=1.2,<1.3.5", 1705 "friendsofsymfony/user-bundle": ">=1.2,<1.3.5",
1706 "friendsoftypo3/mediace": ">=7.6.2,<7.6.5",
1570 "fuel/core": "<1.8.1", 1707 "fuel/core": "<1.8.1",
1571 "getgrav/grav": "<1.7-beta.8", 1708 "getgrav/grav": "<1.7-beta.8",
1709 "gos/web-socket-bundle": "<1.10.4|>=2,<2.6.1|>=3,<3.3",
1572 "gree/jose": "<=2.2", 1710 "gree/jose": "<=2.2",
1573 "gregwar/rst": "<1.0.3", 1711 "gregwar/rst": "<1.0.3",
1574 "guzzlehttp/guzzle": ">=4-rc.2,<4.2.4|>=5,<5.3.1|>=6,<6.2.1", 1712 "guzzlehttp/guzzle": ">=4-rc.2,<4.2.4|>=5,<5.3.1|>=6,<6.2.1",
1575 "illuminate/auth": ">=4,<4.0.99|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.10", 1713 "illuminate/auth": ">=4,<4.0.99|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.10",
1576 "illuminate/cookie": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.42|>=5.6,<5.6.30", 1714 "illuminate/cookie": ">=4,<=4.0.11|>=4.1,<=4.1.99999|>=4.2,<=4.2.99999|>=5,<=5.0.99999|>=5.1,<=5.1.99999|>=5.2,<=5.2.99999|>=5.3,<=5.3.99999|>=5.4,<=5.4.99999|>=5.5,<=5.5.49|>=5.6,<=5.6.99999|>=5.7,<=5.7.99999|>=5.8,<=5.8.99999|>=6,<6.18.31|>=7,<7.22.4",
1577 "illuminate/database": ">=4,<4.0.99|>=4.1,<4.1.29", 1715 "illuminate/database": ">=4,<4.0.99|>=4.1,<4.1.29|>=5.5,<=5.5.44|>=6,<6.18.34|>=7,<7.23.2",
1578 "illuminate/encryption": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.40|>=5.6,<5.6.15", 1716 "illuminate/encryption": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.40|>=5.6,<5.6.15",
1579 "illuminate/view": ">=7,<7.1.2", 1717 "illuminate/view": ">=7,<7.1.2",
1580 "ivankristianto/phpwhois": "<=4.3", 1718 "ivankristianto/phpwhois": "<=4.3",
@@ -1582,22 +1720,34 @@
1582 "joomla/session": "<1.3.1", 1720 "joomla/session": "<1.3.1",
1583 "jsmitty12/phpwhois": "<5.1", 1721 "jsmitty12/phpwhois": "<5.1",
1584 "kazist/phpwhois": "<=4.2.6", 1722 "kazist/phpwhois": "<=4.2.6",
1723 "kitodo/presentation": "<3.1.2",
1585 "kreait/firebase-php": ">=3.2,<3.8.1", 1724 "kreait/firebase-php": ">=3.2,<3.8.1",
1586 "la-haute-societe/tcpdf": "<6.2.22", 1725 "la-haute-societe/tcpdf": "<6.2.22",
1587 "laravel/framework": ">=4,<4.0.99|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.42|>=5.6,<5.6.30|>=7,<7.1.2", 1726 "laravel/framework": ">=4,<4.0.99|>=4.1,<=4.1.99999|>=4.2,<=4.2.99999|>=5,<=5.0.99999|>=5.1,<=5.1.99999|>=5.2,<=5.2.99999|>=5.3,<=5.3.99999|>=5.4,<=5.4.99999|>=5.5,<=5.5.49|>=5.6,<=5.6.99999|>=5.7,<=5.7.99999|>=5.8,<=5.8.99999|>=6,<6.18.34|>=7,<7.23.2",
1588 "laravel/socialite": ">=1,<1.0.99|>=2,<2.0.10", 1727 "laravel/socialite": ">=1,<1.0.99|>=2,<2.0.10",
1589 "league/commonmark": "<0.18.3", 1728 "league/commonmark": "<0.18.3",
1590 "librenms/librenms": "<1.53", 1729 "librenms/librenms": "<1.53",
1730 "livewire/livewire": ">2.2.4,<2.2.6",
1591 "magento/community-edition": ">=2,<2.2.10|>=2.3,<2.3.3", 1731 "magento/community-edition": ">=2,<2.2.10|>=2.3,<2.3.3",
1592 "magento/magento1ce": "<1.9.4.3", 1732 "magento/magento1ce": "<1.9.4.3",
1593 "magento/magento1ee": ">=1,<1.14.4.3", 1733 "magento/magento1ee": ">=1,<1.14.4.3",
1594 "magento/product-community-edition": ">=2,<2.2.10|>=2.3,<2.3.2-p.2", 1734 "magento/product-community-edition": ">=2,<2.2.10|>=2.3,<2.3.2-p.2",
1735 "marcwillmann/turn": "<0.3.3",
1736 "mittwald/typo3_forum": "<1.2.1",
1595 "monolog/monolog": ">=1.8,<1.12", 1737 "monolog/monolog": ">=1.8,<1.12",
1596 "namshi/jose": "<2.2", 1738 "namshi/jose": "<2.2",
1739 "nette/application": ">=2,<2.0.19|>=2.1,<2.1.13|>=2.2,<2.2.10|>=2.3,<2.3.14|>=2.4,<2.4.16|>=3,<3.0.6",
1740 "nette/nette": ">=2,<2.0.19|>=2.1,<2.1.13",
1741 "nystudio107/craft-seomatic": "<3.3",
1597 "nzo/url-encryptor-bundle": ">=4,<4.3.2|>=5,<5.0.1", 1742 "nzo/url-encryptor-bundle": ">=4,<4.3.2|>=5,<5.0.1",
1743 "october/backend": ">=1.0.319,<1.0.467",
1744 "october/cms": ">=1.0.319,<1.0.466",
1745 "october/october": ">=1.0.319,<1.0.466",
1746 "october/rain": ">=1.0.319,<1.0.468",
1598 "onelogin/php-saml": "<2.10.4", 1747 "onelogin/php-saml": "<2.10.4",
1599 "oneup/uploader-bundle": "<1.9.3|>=2,<2.1.5", 1748 "oneup/uploader-bundle": "<1.9.3|>=2,<2.1.5",
1600 "openid/php-openid": "<2.3", 1749 "openid/php-openid": "<2.3",
1750 "openmage/magento-lts": "<19.4.6|>=20,<20.0.2",
1601 "oro/crm": ">=1.7,<1.7.4", 1751 "oro/crm": ">=1.7,<1.7.4",
1602 "oro/platform": ">=1.7,<1.7.4", 1752 "oro/platform": ">=1.7,<1.7.4",
1603 "padraic/humbug_get_contents": "<1.1.2", 1753 "padraic/humbug_get_contents": "<1.1.2",
@@ -1605,8 +1755,10 @@
1605 "paragonie/random_compat": "<2", 1755 "paragonie/random_compat": "<2",
1606 "paypal/merchant-sdk-php": "<3.12", 1756 "paypal/merchant-sdk-php": "<3.12",
1607 "pear/archive_tar": "<1.4.4", 1757 "pear/archive_tar": "<1.4.4",
1758 "personnummer/personnummer": "<3.0.2",
1608 "phpfastcache/phpfastcache": ">=5,<5.0.13", 1759 "phpfastcache/phpfastcache": ">=5,<5.0.13",
1609 "phpmailer/phpmailer": ">=5,<5.2.27|>=6,<6.0.6", 1760 "phpmailer/phpmailer": "<6.1.6",
1761 "phpmussel/phpmussel": ">=1,<1.6",
1610 "phpmyadmin/phpmyadmin": "<4.9.2", 1762 "phpmyadmin/phpmyadmin": "<4.9.2",
1611 "phpoffice/phpexcel": "<1.8.2", 1763 "phpoffice/phpexcel": "<1.8.2",
1612 "phpoffice/phpspreadsheet": "<1.8", 1764 "phpoffice/phpspreadsheet": "<1.8",
@@ -1615,25 +1767,31 @@
1615 "phpxmlrpc/extras": "<0.6.1", 1767 "phpxmlrpc/extras": "<0.6.1",
1616 "pimcore/pimcore": "<6.3", 1768 "pimcore/pimcore": "<6.3",
1617 "prestashop/autoupgrade": ">=4,<4.10.1", 1769 "prestashop/autoupgrade": ">=4,<4.10.1",
1770 "prestashop/contactform": ">1.0.1,<4.3",
1618 "prestashop/gamification": "<2.3.2", 1771 "prestashop/gamification": "<2.3.2",
1619 "prestashop/ps_facetedsearch": "<3.4.1", 1772 "prestashop/ps_facetedsearch": "<3.4.1",
1620 "privatebin/privatebin": "<1.2.2|>=1.3,<1.3.2", 1773 "privatebin/privatebin": "<1.2.2|>=1.3,<1.3.2",
1621 "propel/propel": ">=2-alpha.1,<=2-alpha.7", 1774 "propel/propel": ">=2-alpha.1,<=2-alpha.7",
1622 "propel/propel1": ">=1,<=1.7.1", 1775 "propel/propel1": ">=1,<=1.7.1",
1776 "pterodactyl/panel": "<0.7.19|>=1-rc.0,<=1-rc.6",
1623 "pusher/pusher-php-server": "<2.2.1", 1777 "pusher/pusher-php-server": "<2.2.1",
1778 "rainlab/debugbar-plugin": "<3.1",
1624 "robrichards/xmlseclibs": "<3.0.4", 1779 "robrichards/xmlseclibs": "<3.0.4",
1780 "sabberworm/php-css-parser": ">=1,<1.0.1|>=2,<2.0.1|>=3,<3.0.1|>=4,<4.0.1|>=5,<5.0.9|>=5.1,<5.1.3|>=5.2,<5.2.1|>=6,<6.0.2|>=7,<7.0.4|>=8,<8.0.1|>=8.1,<8.1.1|>=8.2,<8.2.1|>=8.3,<8.3.1",
1625 "sabre/dav": ">=1.6,<1.6.99|>=1.7,<1.7.11|>=1.8,<1.8.9", 1781 "sabre/dav": ">=1.6,<1.6.99|>=1.7,<1.7.11|>=1.8,<1.8.9",
1626 "scheb/two-factor-bundle": ">=0,<3.26|>=4,<4.11", 1782 "scheb/two-factor-bundle": ">=0,<3.26|>=4,<4.11",
1627 "sensiolabs/connect": "<4.2.3", 1783 "sensiolabs/connect": "<4.2.3",
1628 "serluck/phpwhois": "<=4.2.6", 1784 "serluck/phpwhois": "<=4.2.6",
1785 "shopware/core": "<=6.3.1",
1786 "shopware/platform": "<=6.3.1",
1629 "shopware/shopware": "<5.3.7", 1787 "shopware/shopware": "<5.3.7",
1630 "silverstripe/admin": ">=1.0.3,<1.0.4|>=1.1,<1.1.1", 1788 "silverstripe/admin": ">=1.0.3,<1.0.4|>=1.1,<1.1.1",
1631 "silverstripe/assets": ">=1,<1.4.7|>=1.5,<1.5.2", 1789 "silverstripe/assets": ">=1,<1.4.7|>=1.5,<1.5.2",
1632 "silverstripe/cms": "<4.3.6|>=4.4,<4.4.4", 1790 "silverstripe/cms": "<4.3.6|>=4.4,<4.4.4",
1633 "silverstripe/comments": ">=1.3,<1.9.99|>=2,<2.9.99|>=3,<3.1.1", 1791 "silverstripe/comments": ">=1.3,<1.9.99|>=2,<2.9.99|>=3,<3.1.1",
1634 "silverstripe/forum": "<=0.6.1|>=0.7,<=0.7.3", 1792 "silverstripe/forum": "<=0.6.1|>=0.7,<=0.7.3",
1635 "silverstripe/framework": "<4.4.5|>=4.5,<4.5.2", 1793 "silverstripe/framework": "<4.4.7|>=4.5,<4.5.4",
1636 "silverstripe/graphql": ">=2,<2.0.5|>=3,<3.1.2", 1794 "silverstripe/graphql": ">=2,<2.0.5|>=3,<3.1.2|>=3.2,<3.2.4",
1637 "silverstripe/registry": ">=2.1,<2.1.2|>=2.2,<2.2.1", 1795 "silverstripe/registry": ">=2.1,<2.1.2|>=2.2,<2.2.1",
1638 "silverstripe/restfulserver": ">=1,<1.0.9|>=2,<2.0.4", 1796 "silverstripe/restfulserver": ">=1,<1.0.9|>=2,<2.0.4",
1639 "silverstripe/subsites": ">=2,<2.1.1", 1797 "silverstripe/subsites": ">=2,<2.1.1",
@@ -1652,11 +1810,12 @@
1652 "ssddanbrown/bookstack": "<0.29.2", 1810 "ssddanbrown/bookstack": "<0.29.2",
1653 "stormpath/sdk": ">=0,<9.9.99", 1811 "stormpath/sdk": ">=0,<9.9.99",
1654 "studio-42/elfinder": "<2.1.49", 1812 "studio-42/elfinder": "<2.1.49",
1813 "sulu/sulu": "<1.6.34|>=2,<2.0.10|>=2.1,<2.1.1",
1655 "swiftmailer/swiftmailer": ">=4,<5.4.5", 1814 "swiftmailer/swiftmailer": ">=4,<5.4.5",
1656 "sylius/admin-bundle": ">=1,<1.0.17|>=1.1,<1.1.9|>=1.2,<1.2.2", 1815 "sylius/admin-bundle": ">=1,<1.0.17|>=1.1,<1.1.9|>=1.2,<1.2.2",
1657 "sylius/grid": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", 1816 "sylius/grid": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1",
1658 "sylius/grid-bundle": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", 1817 "sylius/grid-bundle": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1",
1659 "sylius/resource-bundle": "<1.3.13|>=1.4,<1.4.6|>=1.5,<1.5.1|>=1.6,<1.6.3", 1818 "sylius/resource-bundle": "<1.3.14|>=1.4,<1.4.7|>=1.5,<1.5.2|>=1.6,<1.6.4",
1660 "sylius/sylius": "<1.3.16|>=1.4,<1.4.12|>=1.5,<1.5.9|>=1.6,<1.6.5", 1819 "sylius/sylius": "<1.3.16|>=1.4,<1.4.12|>=1.5,<1.5.9|>=1.6,<1.6.5",
1661 "symbiote/silverstripe-multivaluefield": ">=3,<3.0.99", 1820 "symbiote/silverstripe-multivaluefield": ">=3,<3.0.99",
1662 "symbiote/silverstripe-versionedfiles": "<=2.0.3", 1821 "symbiote/silverstripe-versionedfiles": "<=2.0.3",
@@ -1666,7 +1825,7 @@
1666 "symfony/form": ">=2.3,<2.3.35|>=2.4,<2.6.12|>=2.7,<2.7.50|>=2.8,<2.8.49|>=3,<3.4.20|>=4,<4.0.15|>=4.1,<4.1.9|>=4.2,<4.2.1", 1825 "symfony/form": ">=2.3,<2.3.35|>=2.4,<2.6.12|>=2.7,<2.7.50|>=2.8,<2.8.49|>=3,<3.4.20|>=4,<4.0.15|>=4.1,<4.1.9|>=4.2,<4.2.1",
1667 "symfony/framework-bundle": ">=2,<2.3.18|>=2.4,<2.4.8|>=2.5,<2.5.2|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", 1826 "symfony/framework-bundle": ">=2,<2.3.18|>=2.4,<2.4.8|>=2.5,<2.5.2|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7",
1668 "symfony/http-foundation": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7", 1827 "symfony/http-foundation": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7",
1669 "symfony/http-kernel": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8", 1828 "symfony/http-kernel": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.4.13|>=5,<5.1.5",
1670 "symfony/intl": ">=2.7,<2.7.38|>=2.8,<2.8.31|>=3,<3.2.14|>=3.3,<3.3.13", 1829 "symfony/intl": ">=2.7,<2.7.38|>=2.8,<2.8.31|>=3,<3.2.14|>=3.3,<3.3.13",
1671 "symfony/mime": ">=4.3,<4.3.8", 1830 "symfony/mime": ">=4.3,<4.3.8",
1672 "symfony/phpunit-bridge": ">=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", 1831 "symfony/phpunit-bridge": ">=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7",
@@ -1681,12 +1840,13 @@
1681 "symfony/security-guard": ">=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", 1840 "symfony/security-guard": ">=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11",
1682 "symfony/security-http": ">=2.3,<2.3.41|>=2.4,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7", 1841 "symfony/security-http": ">=2.3,<2.3.41|>=2.4,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7",
1683 "symfony/serializer": ">=2,<2.0.11", 1842 "symfony/serializer": ">=2,<2.0.11",
1684 "symfony/symfony": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7", 1843 "symfony/symfony": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.4.13|>=5,<5.1.5",
1685 "symfony/translation": ">=2,<2.0.17", 1844 "symfony/translation": ">=2,<2.0.17",
1686 "symfony/validator": ">=2,<2.0.24|>=2.1,<2.1.12|>=2.2,<2.2.5|>=2.3,<2.3.3", 1845 "symfony/validator": ">=2,<2.0.24|>=2.1,<2.1.12|>=2.2,<2.2.5|>=2.3,<2.3.3",
1687 "symfony/var-exporter": ">=4.2,<4.2.12|>=4.3,<4.3.8", 1846 "symfony/var-exporter": ">=4.2,<4.2.12|>=4.3,<4.3.8",
1688 "symfony/web-profiler-bundle": ">=2,<2.3.19|>=2.4,<2.4.9|>=2.5,<2.5.4", 1847 "symfony/web-profiler-bundle": ">=2,<2.3.19|>=2.4,<2.4.9|>=2.5,<2.5.4",
1689 "symfony/yaml": ">=2,<2.0.22|>=2.1,<2.1.7", 1848 "symfony/yaml": ">=2,<2.0.22|>=2.1,<2.1.7",
1849 "t3g/svg-sanitizer": "<1.0.3",
1690 "tecnickcom/tcpdf": "<6.2.22", 1850 "tecnickcom/tcpdf": "<6.2.22",
1691 "thelia/backoffice-default-template": ">=2.1,<2.1.2", 1851 "thelia/backoffice-default-template": ">=2.1,<2.1.2",
1692 "thelia/thelia": ">=2.1-beta.1,<2.1.3", 1852 "thelia/thelia": ">=2.1-beta.1,<2.1.3",
@@ -1694,11 +1854,12 @@
1694 "titon/framework": ">=0,<9.9.99", 1854 "titon/framework": ">=0,<9.9.99",
1695 "truckersmp/phpwhois": "<=4.3.1", 1855 "truckersmp/phpwhois": "<=4.3.1",
1696 "twig/twig": "<1.38|>=2,<2.7", 1856 "twig/twig": "<1.38|>=2,<2.7",
1697 "typo3/cms": ">=6.2,<6.2.30|>=7,<7.6.32|>=8,<8.7.30|>=9,<9.5.17|>=10,<10.4.2", 1857 "typo3/cms": ">=6.2,<6.2.30|>=7,<7.6.32|>=8,<8.7.30|>=9,<9.5.20|>=10,<10.4.6",
1698 "typo3/cms-core": ">=8,<8.7.30|>=9,<9.5.17|>=10,<10.4.2", 1858 "typo3/cms-core": ">=8,<8.7.30|>=9,<9.5.20|>=10,<10.4.6",
1699 "typo3/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.10|>=3.1,<3.1.7|>=3.2,<3.2.7|>=3.3,<3.3.5", 1859 "typo3/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.10|>=3.1,<3.1.7|>=3.2,<3.2.7|>=3.3,<3.3.5",
1700 "typo3/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4", 1860 "typo3/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4",
1701 "typo3/phar-stream-wrapper": ">=1,<2.1.1|>=3,<3.1.1", 1861 "typo3/phar-stream-wrapper": ">=1,<2.1.1|>=3,<3.1.1",
1862 "typo3fluid/fluid": ">=2,<2.0.5|>=2.1,<2.1.4|>=2.2,<2.2.1|>=2.3,<2.3.5|>=2.4,<2.4.1|>=2.5,<2.5.5|>=2.6,<2.6.1",
1702 "ua-parser/uap-php": "<3.8", 1863 "ua-parser/uap-php": "<3.8",
1703 "usmanhalalit/pixie": "<1.0.3|>=2,<2.0.2", 1864 "usmanhalalit/pixie": "<1.0.3|>=2,<2.0.2",
1704 "verot/class.upload.php": "<=1.0.3|>=2,<=2.0.4", 1865 "verot/class.upload.php": "<=1.0.3|>=2,<=2.0.4",
@@ -1706,7 +1867,7 @@
1706 "willdurand/js-translation-bundle": "<2.1.1", 1867 "willdurand/js-translation-bundle": "<2.1.1",
1707 "yii2mod/yii2-cms": "<1.9.2", 1868 "yii2mod/yii2-cms": "<1.9.2",
1708 "yiisoft/yii": ">=1.1.14,<1.1.15", 1869 "yiisoft/yii": ">=1.1.14,<1.1.15",
1709 "yiisoft/yii2": "<2.0.15", 1870 "yiisoft/yii2": "<2.0.38",
1710 "yiisoft/yii2-bootstrap": "<2.0.4", 1871 "yiisoft/yii2-bootstrap": "<2.0.4",
1711 "yiisoft/yii2-dev": "<2.0.15", 1872 "yiisoft/yii2-dev": "<2.0.15",
1712 "yiisoft/yii2-elasticsearch": "<2.0.5", 1873 "yiisoft/yii2-elasticsearch": "<2.0.5",
@@ -1758,7 +1919,21 @@
1758 } 1919 }
1759 ], 1920 ],
1760 "description": "Prevents installation of composer packages with known security vulnerabilities: no API, simply require it", 1921 "description": "Prevents installation of composer packages with known security vulnerabilities: no API, simply require it",
1761 "time": "2020-05-12T11:18:47+00:00" 1922 "support": {
1923 "issues": "https://github.com/Roave/SecurityAdvisories/issues",
1924 "source": "https://github.com/Roave/SecurityAdvisories/tree/latest"
1925 },
1926 "funding": [
1927 {
1928 "url": "https://github.com/Ocramius",
1929 "type": "github"
1930 },
1931 {
1932 "url": "https://tidelift.com/funding/github/packagist/roave/security-advisories",
1933 "type": "tidelift"
1934 }
1935 ],
1936 "time": "2020-10-08T21:02:27+00:00"
1762 }, 1937 },
1763 { 1938 {
1764 "name": "sebastian/code-unit-reverse-lookup", 1939 "name": "sebastian/code-unit-reverse-lookup",
@@ -1803,6 +1978,10 @@
1803 ], 1978 ],
1804 "description": "Looks up which function or method a line of code belongs to", 1979 "description": "Looks up which function or method a line of code belongs to",
1805 "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", 1980 "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
1981 "support": {
1982 "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues",
1983 "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/master"
1984 },
1806 "time": "2017-03-04T06:30:41+00:00" 1985 "time": "2017-03-04T06:30:41+00:00"
1807 }, 1986 },
1808 { 1987 {
@@ -1867,6 +2046,10 @@
1867 "compare", 2046 "compare",
1868 "equality" 2047 "equality"
1869 ], 2048 ],
2049 "support": {
2050 "issues": "https://github.com/sebastianbergmann/comparator/issues",
2051 "source": "https://github.com/sebastianbergmann/comparator/tree/master"
2052 },
1870 "time": "2018-07-12T15:12:46+00:00" 2053 "time": "2018-07-12T15:12:46+00:00"
1871 }, 2054 },
1872 { 2055 {
@@ -1923,6 +2106,10 @@
1923 "unidiff", 2106 "unidiff",
1924 "unified diff" 2107 "unified diff"
1925 ], 2108 ],
2109 "support": {
2110 "issues": "https://github.com/sebastianbergmann/diff/issues",
2111 "source": "https://github.com/sebastianbergmann/diff/tree/master"
2112 },
1926 "time": "2019-02-04T06:01:07+00:00" 2113 "time": "2019-02-04T06:01:07+00:00"
1927 }, 2114 },
1928 { 2115 {
@@ -1976,6 +2163,10 @@
1976 "environment", 2163 "environment",
1977 "hhvm" 2164 "hhvm"
1978 ], 2165 ],
2166 "support": {
2167 "issues": "https://github.com/sebastianbergmann/environment/issues",
2168 "source": "https://github.com/sebastianbergmann/environment/tree/4.2.3"
2169 },
1979 "time": "2019-11-20T08:46:58+00:00" 2170 "time": "2019-11-20T08:46:58+00:00"
1980 }, 2171 },
1981 { 2172 {
@@ -2043,50 +2234,11 @@
2043 "export", 2234 "export",
2044 "exporter" 2235 "exporter"
2045 ], 2236 ],
2046 "time": "2019-09-14T09:02:43+00:00" 2237 "support": {
2047 }, 2238 "issues": "https://github.com/sebastianbergmann/exporter/issues",
2048 { 2239 "source": "https://github.com/sebastianbergmann/exporter/tree/master"
2049 "name": "sebastian/finder-facade",
2050 "version": "1.2.3",
2051 "source": {
2052 "type": "git",
2053 "url": "https://github.com/sebastianbergmann/finder-facade.git",
2054 "reference": "167c45d131f7fc3d159f56f191a0a22228765e16"
2055 },
2056 "dist": {
2057 "type": "zip",
2058 "url": "https://api.github.com/repos/sebastianbergmann/finder-facade/zipball/167c45d131f7fc3d159f56f191a0a22228765e16",
2059 "reference": "167c45d131f7fc3d159f56f191a0a22228765e16",
2060 "shasum": ""
2061 },
2062 "require": {
2063 "php": "^7.1",
2064 "symfony/finder": "^2.3|^3.0|^4.0|^5.0",
2065 "theseer/fdomdocument": "^1.6"
2066 },
2067 "type": "library",
2068 "extra": {
2069 "branch-alias": []
2070 },
2071 "autoload": {
2072 "classmap": [
2073 "src/"
2074 ]
2075 }, 2240 },
2076 "notification-url": "https://packagist.org/downloads/", 2241 "time": "2019-09-14T09:02:43+00:00"
2077 "license": [
2078 "BSD-3-Clause"
2079 ],
2080 "authors": [
2081 {
2082 "name": "Sebastian Bergmann",
2083 "email": "sebastian@phpunit.de",
2084 "role": "lead"
2085 }
2086 ],
2087 "description": "FinderFacade is a convenience wrapper for Symfony's Finder component.",
2088 "homepage": "https://github.com/sebastianbergmann/finder-facade",
2089 "time": "2020-01-16T08:08:45+00:00"
2090 }, 2242 },
2091 { 2243 {
2092 "name": "sebastian/global-state", 2244 "name": "sebastian/global-state",
@@ -2137,6 +2289,10 @@
2137 "keywords": [ 2289 "keywords": [
2138 "global state" 2290 "global state"
2139 ], 2291 ],
2292 "support": {
2293 "issues": "https://github.com/sebastianbergmann/global-state/issues",
2294 "source": "https://github.com/sebastianbergmann/global-state/tree/2.0.0"
2295 },
2140 "time": "2017-04-27T15:39:26+00:00" 2296 "time": "2017-04-27T15:39:26+00:00"
2141 }, 2297 },
2142 { 2298 {
@@ -2184,6 +2340,10 @@
2184 ], 2340 ],
2185 "description": "Traverses array structures and object graphs to enumerate all referenced objects", 2341 "description": "Traverses array structures and object graphs to enumerate all referenced objects",
2186 "homepage": "https://github.com/sebastianbergmann/object-enumerator/", 2342 "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
2343 "support": {
2344 "issues": "https://github.com/sebastianbergmann/object-enumerator/issues",
2345 "source": "https://github.com/sebastianbergmann/object-enumerator/tree/master"
2346 },
2187 "time": "2017-08-03T12:35:26+00:00" 2347 "time": "2017-08-03T12:35:26+00:00"
2188 }, 2348 },
2189 { 2349 {
@@ -2229,6 +2389,10 @@
2229 ], 2389 ],
2230 "description": "Allows reflection of object attributes, including inherited and non-public ones", 2390 "description": "Allows reflection of object attributes, including inherited and non-public ones",
2231 "homepage": "https://github.com/sebastianbergmann/object-reflector/", 2391 "homepage": "https://github.com/sebastianbergmann/object-reflector/",
2392 "support": {
2393 "issues": "https://github.com/sebastianbergmann/object-reflector/issues",
2394 "source": "https://github.com/sebastianbergmann/object-reflector/tree/master"
2395 },
2232 "time": "2017-03-29T09:07:27+00:00" 2396 "time": "2017-03-29T09:07:27+00:00"
2233 }, 2397 },
2234 { 2398 {
@@ -2282,6 +2446,10 @@
2282 ], 2446 ],
2283 "description": "Provides functionality to recursively process PHP variables", 2447 "description": "Provides functionality to recursively process PHP variables",
2284 "homepage": "http://www.github.com/sebastianbergmann/recursion-context", 2448 "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
2449 "support": {
2450 "issues": "https://github.com/sebastianbergmann/recursion-context/issues",
2451 "source": "https://github.com/sebastianbergmann/recursion-context/tree/master"
2452 },
2285 "time": "2017-03-03T06:23:57+00:00" 2453 "time": "2017-03-03T06:23:57+00:00"
2286 }, 2454 },
2287 { 2455 {
@@ -2324,6 +2492,10 @@
2324 ], 2492 ],
2325 "description": "Provides a list of PHP built-in functions that operate on resources", 2493 "description": "Provides a list of PHP built-in functions that operate on resources",
2326 "homepage": "https://www.github.com/sebastianbergmann/resource-operations", 2494 "homepage": "https://www.github.com/sebastianbergmann/resource-operations",
2495 "support": {
2496 "issues": "https://github.com/sebastianbergmann/resource-operations/issues",
2497 "source": "https://github.com/sebastianbergmann/resource-operations/tree/master"
2498 },
2327 "time": "2018-10-04T04:07:39+00:00" 2499 "time": "2018-10-04T04:07:39+00:00"
2328 }, 2500 },
2329 { 2501 {
@@ -2367,20 +2539,24 @@
2367 ], 2539 ],
2368 "description": "Library that helps with managing the version number of Git-hosted PHP projects", 2540 "description": "Library that helps with managing the version number of Git-hosted PHP projects",
2369 "homepage": "https://github.com/sebastianbergmann/version", 2541 "homepage": "https://github.com/sebastianbergmann/version",
2542 "support": {
2543 "issues": "https://github.com/sebastianbergmann/version/issues",
2544 "source": "https://github.com/sebastianbergmann/version/tree/master"
2545 },
2370 "time": "2016-10-03T07:35:21+00:00" 2546 "time": "2016-10-03T07:35:21+00:00"
2371 }, 2547 },
2372 { 2548 {
2373 "name": "squizlabs/php_codesniffer", 2549 "name": "squizlabs/php_codesniffer",
2374 "version": "3.5.5", 2550 "version": "3.5.6",
2375 "source": { 2551 "source": {
2376 "type": "git", 2552 "type": "git",
2377 "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", 2553 "url": "https://github.com/squizlabs/PHP_CodeSniffer.git",
2378 "reference": "73e2e7f57d958e7228fce50dc0c61f58f017f9f6" 2554 "reference": "e97627871a7eab2f70e59166072a6b767d5834e0"
2379 }, 2555 },
2380 "dist": { 2556 "dist": {
2381 "type": "zip", 2557 "type": "zip",
2382 "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/73e2e7f57d958e7228fce50dc0c61f58f017f9f6", 2558 "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/e97627871a7eab2f70e59166072a6b767d5834e0",
2383 "reference": "73e2e7f57d958e7228fce50dc0c61f58f017f9f6", 2559 "reference": "e97627871a7eab2f70e59166072a6b767d5834e0",
2384 "shasum": "" 2560 "shasum": ""
2385 }, 2561 },
2386 "require": { 2562 "require": {
@@ -2418,145 +2594,25 @@
2418 "phpcs", 2594 "phpcs",
2419 "standards" 2595 "standards"
2420 ], 2596 ],
2421 "time": "2020-04-17T01:09:41+00:00" 2597 "support": {
2422 }, 2598 "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues",
2423 { 2599 "source": "https://github.com/squizlabs/PHP_CodeSniffer",
2424 "name": "symfony/console", 2600 "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki"
2425 "version": "v4.4.8",
2426 "source": {
2427 "type": "git",
2428 "url": "https://github.com/symfony/console.git",
2429 "reference": "10bb3ee3c97308869d53b3e3d03f6ac23ff985f7"
2430 },
2431 "dist": {
2432 "type": "zip",
2433 "url": "https://api.github.com/repos/symfony/console/zipball/10bb3ee3c97308869d53b3e3d03f6ac23ff985f7",
2434 "reference": "10bb3ee3c97308869d53b3e3d03f6ac23ff985f7",
2435 "shasum": ""
2436 },
2437 "require": {
2438 "php": "^7.1.3",
2439 "symfony/polyfill-mbstring": "~1.0",
2440 "symfony/polyfill-php73": "^1.8",
2441 "symfony/service-contracts": "^1.1|^2"
2442 },
2443 "conflict": {
2444 "symfony/dependency-injection": "<3.4",
2445 "symfony/event-dispatcher": "<4.3|>=5",
2446 "symfony/lock": "<4.4",
2447 "symfony/process": "<3.3"
2448 }, 2601 },
2449 "provide": { 2602 "time": "2020-08-10T04:50:15+00:00"
2450 "psr/log-implementation": "1.0"
2451 },
2452 "require-dev": {
2453 "psr/log": "~1.0",
2454 "symfony/config": "^3.4|^4.0|^5.0",
2455 "symfony/dependency-injection": "^3.4|^4.0|^5.0",
2456 "symfony/event-dispatcher": "^4.3",
2457 "symfony/lock": "^4.4|^5.0",
2458 "symfony/process": "^3.4|^4.0|^5.0",
2459 "symfony/var-dumper": "^4.3|^5.0"
2460 },
2461 "suggest": {
2462 "psr/log": "For using the console logger",
2463 "symfony/event-dispatcher": "",
2464 "symfony/lock": "",
2465 "symfony/process": ""
2466 },
2467 "type": "library",
2468 "extra": {
2469 "branch-alias": {
2470 "dev-master": "4.4-dev"
2471 }
2472 },
2473 "autoload": {
2474 "psr-4": {
2475 "Symfony\\Component\\Console\\": ""
2476 },
2477 "exclude-from-classmap": [
2478 "/Tests/"
2479 ]
2480 },
2481 "notification-url": "https://packagist.org/downloads/",
2482 "license": [
2483 "MIT"
2484 ],
2485 "authors": [
2486 {
2487 "name": "Fabien Potencier",
2488 "email": "fabien@symfony.com"
2489 },
2490 {
2491 "name": "Symfony Community",
2492 "homepage": "https://symfony.com/contributors"
2493 }
2494 ],
2495 "description": "Symfony Console Component",
2496 "homepage": "https://symfony.com",
2497 "time": "2020-03-30T11:41:10+00:00"
2498 },
2499 {
2500 "name": "symfony/finder",
2501 "version": "v4.4.8",
2502 "source": {
2503 "type": "git",
2504 "url": "https://github.com/symfony/finder.git",
2505 "reference": "5729f943f9854c5781984ed4907bbb817735776b"
2506 },
2507 "dist": {
2508 "type": "zip",
2509 "url": "https://api.github.com/repos/symfony/finder/zipball/5729f943f9854c5781984ed4907bbb817735776b",
2510 "reference": "5729f943f9854c5781984ed4907bbb817735776b",
2511 "shasum": ""
2512 },
2513 "require": {
2514 "php": "^7.1.3"
2515 },
2516 "type": "library",
2517 "extra": {
2518 "branch-alias": {
2519 "dev-master": "4.4-dev"
2520 }
2521 },
2522 "autoload": {
2523 "psr-4": {
2524 "Symfony\\Component\\Finder\\": ""
2525 },
2526 "exclude-from-classmap": [
2527 "/Tests/"
2528 ]
2529 },
2530 "notification-url": "https://packagist.org/downloads/",
2531 "license": [
2532 "MIT"
2533 ],
2534 "authors": [
2535 {
2536 "name": "Fabien Potencier",
2537 "email": "fabien@symfony.com"
2538 },
2539 {
2540 "name": "Symfony Community",
2541 "homepage": "https://symfony.com/contributors"
2542 }
2543 ],
2544 "description": "Symfony Finder Component",
2545 "homepage": "https://symfony.com",
2546 "time": "2020-03-27T16:54:36+00:00"
2547 }, 2603 },
2548 { 2604 {
2549 "name": "symfony/polyfill-ctype", 2605 "name": "symfony/polyfill-ctype",
2550 "version": "v1.17.0", 2606 "version": "v1.18.1",
2551 "source": { 2607 "source": {
2552 "type": "git", 2608 "type": "git",
2553 "url": "https://github.com/symfony/polyfill-ctype.git", 2609 "url": "https://github.com/symfony/polyfill-ctype.git",
2554 "reference": "e94c8b1bbe2bc77507a1056cdb06451c75b427f9" 2610 "reference": "1c302646f6efc070cd46856e600e5e0684d6b454"
2555 }, 2611 },
2556 "dist": { 2612 "dist": {
2557 "type": "zip", 2613 "type": "zip",
2558 "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/e94c8b1bbe2bc77507a1056cdb06451c75b427f9", 2614 "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/1c302646f6efc070cd46856e600e5e0684d6b454",
2559 "reference": "e94c8b1bbe2bc77507a1056cdb06451c75b427f9", 2615 "reference": "1c302646f6efc070cd46856e600e5e0684d6b454",
2560 "shasum": "" 2616 "shasum": ""
2561 }, 2617 },
2562 "require": { 2618 "require": {
@@ -2568,7 +2624,11 @@
2568 "type": "library", 2624 "type": "library",
2569 "extra": { 2625 "extra": {
2570 "branch-alias": { 2626 "branch-alias": {
2571 "dev-master": "1.17-dev" 2627 "dev-master": "1.18-dev"
2628 },
2629 "thanks": {
2630 "name": "symfony/polyfill",
2631 "url": "https://github.com/symfony/polyfill"
2572 } 2632 }
2573 }, 2633 },
2574 "autoload": { 2634 "autoload": {
@@ -2601,222 +2661,24 @@
2601 "polyfill", 2661 "polyfill",
2602 "portable" 2662 "portable"
2603 ], 2663 ],
2604 "time": "2020-05-12T16:14:59+00:00" 2664 "support": {
2605 }, 2665 "source": "https://github.com/symfony/polyfill-ctype/tree/v1.18.0"
2606 {
2607 "name": "symfony/polyfill-mbstring",
2608 "version": "v1.17.0",
2609 "source": {
2610 "type": "git",
2611 "url": "https://github.com/symfony/polyfill-mbstring.git",
2612 "reference": "fa79b11539418b02fc5e1897267673ba2c19419c"
2613 },
2614 "dist": {
2615 "type": "zip",
2616 "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fa79b11539418b02fc5e1897267673ba2c19419c",
2617 "reference": "fa79b11539418b02fc5e1897267673ba2c19419c",
2618 "shasum": ""
2619 },
2620 "require": {
2621 "php": ">=5.3.3"
2622 },
2623 "suggest": {
2624 "ext-mbstring": "For best performance"
2625 },
2626 "type": "library",
2627 "extra": {
2628 "branch-alias": {
2629 "dev-master": "1.17-dev"
2630 }
2631 },
2632 "autoload": {
2633 "psr-4": {
2634 "Symfony\\Polyfill\\Mbstring\\": ""
2635 },
2636 "files": [
2637 "bootstrap.php"
2638 ]
2639 },
2640 "notification-url": "https://packagist.org/downloads/",
2641 "license": [
2642 "MIT"
2643 ],
2644 "authors": [
2645 {
2646 "name": "Nicolas Grekas",
2647 "email": "p@tchwork.com"
2648 },
2649 {
2650 "name": "Symfony Community",
2651 "homepage": "https://symfony.com/contributors"
2652 }
2653 ],
2654 "description": "Symfony polyfill for the Mbstring extension",
2655 "homepage": "https://symfony.com",
2656 "keywords": [
2657 "compatibility",
2658 "mbstring",
2659 "polyfill",
2660 "portable",
2661 "shim"
2662 ],
2663 "time": "2020-05-12T16:47:27+00:00"
2664 },
2665 {
2666 "name": "symfony/polyfill-php73",
2667 "version": "v1.17.0",
2668 "source": {
2669 "type": "git",
2670 "url": "https://github.com/symfony/polyfill-php73.git",
2671 "reference": "a760d8964ff79ab9bf057613a5808284ec852ccc"
2672 },
2673 "dist": {
2674 "type": "zip",
2675 "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/a760d8964ff79ab9bf057613a5808284ec852ccc",
2676 "reference": "a760d8964ff79ab9bf057613a5808284ec852ccc",
2677 "shasum": ""
2678 },
2679 "require": {
2680 "php": ">=5.3.3"
2681 }, 2666 },
2682 "type": "library", 2667 "funding": [
2683 "extra": {
2684 "branch-alias": {
2685 "dev-master": "1.17-dev"
2686 }
2687 },
2688 "autoload": {
2689 "psr-4": {
2690 "Symfony\\Polyfill\\Php73\\": ""
2691 },
2692 "files": [
2693 "bootstrap.php"
2694 ],
2695 "classmap": [
2696 "Resources/stubs"
2697 ]
2698 },
2699 "notification-url": "https://packagist.org/downloads/",
2700 "license": [
2701 "MIT"
2702 ],
2703 "authors": [
2704 { 2668 {
2705 "name": "Nicolas Grekas", 2669 "url": "https://symfony.com/sponsor",
2706 "email": "p@tchwork.com" 2670 "type": "custom"
2707 }, 2671 },
2708 { 2672 {
2709 "name": "Symfony Community", 2673 "url": "https://github.com/fabpot",
2710 "homepage": "https://symfony.com/contributors" 2674 "type": "github"
2711 }
2712 ],
2713 "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions",
2714 "homepage": "https://symfony.com",
2715 "keywords": [
2716 "compatibility",
2717 "polyfill",
2718 "portable",
2719 "shim"
2720 ],
2721 "time": "2020-05-12T16:47:27+00:00"
2722 },
2723 {
2724 "name": "symfony/service-contracts",
2725 "version": "v1.1.8",
2726 "source": {
2727 "type": "git",
2728 "url": "https://github.com/symfony/service-contracts.git",
2729 "reference": "ffc7f5692092df31515df2a5ecf3b7302b3ddacf"
2730 },
2731 "dist": {
2732 "type": "zip",
2733 "url": "https://api.github.com/repos/symfony/service-contracts/zipball/ffc7f5692092df31515df2a5ecf3b7302b3ddacf",
2734 "reference": "ffc7f5692092df31515df2a5ecf3b7302b3ddacf",
2735 "shasum": ""
2736 },
2737 "require": {
2738 "php": "^7.1.3",
2739 "psr/container": "^1.0"
2740 },
2741 "suggest": {
2742 "symfony/service-implementation": ""
2743 },
2744 "type": "library",
2745 "extra": {
2746 "branch-alias": {
2747 "dev-master": "1.1-dev"
2748 }
2749 },
2750 "autoload": {
2751 "psr-4": {
2752 "Symfony\\Contracts\\Service\\": ""
2753 }
2754 },
2755 "notification-url": "https://packagist.org/downloads/",
2756 "license": [
2757 "MIT"
2758 ],
2759 "authors": [
2760 {
2761 "name": "Nicolas Grekas",
2762 "email": "p@tchwork.com"
2763 }, 2675 },
2764 { 2676 {
2765 "name": "Symfony Community", 2677 "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
2766 "homepage": "https://symfony.com/contributors" 2678 "type": "tidelift"
2767 }
2768 ],
2769 "description": "Generic abstractions related to writing services",
2770 "homepage": "https://symfony.com",
2771 "keywords": [
2772 "abstractions",
2773 "contracts",
2774 "decoupling",
2775 "interfaces",
2776 "interoperability",
2777 "standards"
2778 ],
2779 "time": "2019-10-14T12:27:06+00:00"
2780 },
2781 {
2782 "name": "theseer/fdomdocument",
2783 "version": "1.6.6",
2784 "source": {
2785 "type": "git",
2786 "url": "https://github.com/theseer/fDOMDocument.git",
2787 "reference": "6e8203e40a32a9c770bcb62fe37e68b948da6dca"
2788 },
2789 "dist": {
2790 "type": "zip",
2791 "url": "https://api.github.com/repos/theseer/fDOMDocument/zipball/6e8203e40a32a9c770bcb62fe37e68b948da6dca",
2792 "reference": "6e8203e40a32a9c770bcb62fe37e68b948da6dca",
2793 "shasum": ""
2794 },
2795 "require": {
2796 "ext-dom": "*",
2797 "lib-libxml": "*",
2798 "php": ">=5.3.3"
2799 },
2800 "type": "library",
2801 "autoload": {
2802 "classmap": [
2803 "src/"
2804 ]
2805 },
2806 "notification-url": "https://packagist.org/downloads/",
2807 "license": [
2808 "BSD-3-Clause"
2809 ],
2810 "authors": [
2811 {
2812 "name": "Arne Blankerts",
2813 "email": "arne@blankerts.de",
2814 "role": "lead"
2815 } 2679 }
2816 ], 2680 ],
2817 "description": "The classes contained within this repository extend the standard DOM to use exceptions at all occasions of errors instead of PHP warnings or notices. They also add various custom methods and shortcuts for convenience and to simplify the usage of DOM.", 2681 "time": "2020-07-14T12:35:20+00:00"
2818 "homepage": "https://github.com/theseer/fDOMDocument",
2819 "time": "2017-06-30T11:53:12+00:00"
2820 }, 2682 },
2821 { 2683 {
2822 "name": "theseer/tokenizer", 2684 "name": "theseer/tokenizer",
@@ -2856,27 +2718,32 @@
2856 } 2718 }
2857 ], 2719 ],
2858 "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", 2720 "description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
2721 "support": {
2722 "issues": "https://github.com/theseer/tokenizer/issues",
2723 "source": "https://github.com/theseer/tokenizer/tree/master"
2724 },
2859 "time": "2019-06-13T22:48:21+00:00" 2725 "time": "2019-06-13T22:48:21+00:00"
2860 }, 2726 },
2861 { 2727 {
2862 "name": "webmozart/assert", 2728 "name": "webmozart/assert",
2863 "version": "1.8.0", 2729 "version": "1.9.1",
2864 "source": { 2730 "source": {
2865 "type": "git", 2731 "type": "git",
2866 "url": "https://github.com/webmozart/assert.git", 2732 "url": "https://github.com/webmozart/assert.git",
2867 "reference": "ab2cb0b3b559010b75981b1bdce728da3ee90ad6" 2733 "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389"
2868 }, 2734 },
2869 "dist": { 2735 "dist": {
2870 "type": "zip", 2736 "type": "zip",
2871 "url": "https://api.github.com/repos/webmozart/assert/zipball/ab2cb0b3b559010b75981b1bdce728da3ee90ad6", 2737 "url": "https://api.github.com/repos/webmozart/assert/zipball/bafc69caeb4d49c39fd0779086c03a3738cbb389",
2872 "reference": "ab2cb0b3b559010b75981b1bdce728da3ee90ad6", 2738 "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389",
2873 "shasum": "" 2739 "shasum": ""
2874 }, 2740 },
2875 "require": { 2741 "require": {
2876 "php": "^5.3.3 || ^7.0", 2742 "php": "^5.3.3 || ^7.0 || ^8.0",
2877 "symfony/polyfill-ctype": "^1.8" 2743 "symfony/polyfill-ctype": "^1.8"
2878 }, 2744 },
2879 "conflict": { 2745 "conflict": {
2746 "phpstan/phpstan": "<0.12.20",
2880 "vimeo/psalm": "<3.9.1" 2747 "vimeo/psalm": "<3.9.1"
2881 }, 2748 },
2882 "require-dev": { 2749 "require-dev": {
@@ -2904,7 +2771,11 @@
2904 "check", 2771 "check",
2905 "validate" 2772 "validate"
2906 ], 2773 ],
2907 "time": "2020-04-18T12:12:48+00:00" 2774 "support": {
2775 "issues": "https://github.com/webmozart/assert/issues",
2776 "source": "https://github.com/webmozart/assert/tree/master"
2777 },
2778 "time": "2020-07-08T17:02:28+00:00"
2908 } 2779 }
2909 ], 2780 ],
2910 "aliases": [], 2781 "aliases": [],
@@ -2923,5 +2794,6 @@
2923 "platform-dev": [], 2794 "platform-dev": [],
2924 "platform-overrides": { 2795 "platform-overrides": {
2925 "php": "7.1.29" 2796 "php": "7.1.29"
2926 } 2797 },
2798 "plugin-api-version": "2.0.0"
2927} 2799}
diff --git a/doc/md/3rd-party-libraries.md b/doc/md/3rd-party-libraries.md
deleted file mode 100644
index 7e7dd334..00000000
--- a/doc/md/3rd-party-libraries.md
+++ /dev/null
@@ -1,21 +0,0 @@
1## CSS
2
3- Yahoo UI [CSS Reset](http://yuilibrary.com/yui/docs/cssreset/) - standardize cross-browser rendering
4
5## Javascript
6
7- [Awesomeplete](https://leaverou.github.io/awesomplete/) ([GitHub](https://github.com/LeaVerou/awesomplete)) - autocompletion in input forms
8- [bLazy](http://dinbror.dk/blazy/) ([GitHub](https://github.com/dinbror/blazy)) - lazy loading for thumbnails
9- [qr.js](http://neocotic.com/qr.js/) ([GitHub](https://github.com/neocotic/qr.js)) - QR code generation
10
11## PHP
12
13- [RainTPL](https://github.com/rainphp/raintpl) - HTML templating for PHP
14
15### Composer
16
17Library | Usage
18---|---
19[`shaarli/netscape-bookmark-parser`](https://packagist.org/packages/shaarli/netscape-bookmark-parser) | Import bookmarks from Netscape files
20[`erusev/parsedown`](https://packagist.org/packages/erusev/parsedown) | Parse MarkDown syntax for the MarkDown plugin
21[`slim/slim`](https://packagist.org/packages/slim/slim) | Handle routes and middleware for the REST API
diff --git a/doc/md/Backup-and-restore.md b/doc/md/Backup-and-restore.md
new file mode 100644
index 00000000..e7e2775c
--- /dev/null
+++ b/doc/md/Backup-and-restore.md
@@ -0,0 +1,11 @@
1## Backup and restore
2
3All data and [configuration](Shaarli-configuration.md) is kept in the `data` directory. Backup this directory:
4
5```bash
6rsync -avzP my.server.com:/var/www/shaarli.mydomain.org/data ~/backups/shaarli-data-$(date +%Y-%m-%d_%H%M)
7```
8
9It is strongly recommended to do periodic, automatic backups to a seperate machine. You can automate the command above using a cron job or full-featured backup solutions such as [rsnapshot](https://rsnapshot.org/)
10
11To restore a backup, simply put back the `data/` directory in place, owerwriting any existing files. \ No newline at end of file
diff --git a/doc/md/Browsing-and-searching.md b/doc/md/Browsing-and-searching.md
deleted file mode 100644
index 16c69855..00000000
--- a/doc/md/Browsing-and-searching.md
+++ /dev/null
@@ -1,37 +0,0 @@
1## Plain text search
2
3Use the `Search text` field to search in _any_ of the fields of all links (Title, URL, Description...)
4
5**Exclude text/tags:** Use the `-` operator before a word or tag (example `-uninteresting`) to prevent entries containing (or tagged) `uninteresting` from showing up in the search results.
6
7**Exact text search:** Use double-quotes (example `"exact search"`) to search for the exact expression.
8
9Both exclude patterns and exact searches can be combined with normal searches (example `"exact search" term otherterm -notthis "very exact" stuff -notagain`)
10
11## Tags search
12
13Use the `Filter by tags` field to restrict displayed links to entries tagged with one or multiple tags (use space to separate tags).
14
15**Hidden tags:** Tags starting with a dot `.` (example `.secret`) are private. They can only be seen and searched when logged in.
16
17### Tag cloud
18
19The `Tag cloud` page diplays a "cloud" view of all tags in your Shaarli.
20
21 * The most frequently used tags are displayed with a bigger font size.
22 * When sorting by `Most used` or `Alphabetical`, tags are displayed as a _list_, along with counters and edit/delete buttons for each tag.
23 * Clicking on any tag will display a list of all Shaares matching this tag.
24 * Clicking on the counter next to a tag `example`, will filter the tag cloud to only display tags found in Shaares tagged `example`. Repeat this any number of times to further filter the tag cloud. Click `List all links with those tags` to display Shaares matching your current tag filter.
25
26## Filtering RSS feeds/Picture wall
27
28RSS feeds can also be restricted to only return items matching a text/tag search: see [RSS feeds](RSS-feeds).
29
30## Filter buttons
31
32Filter buttons can be found at the top left of the link list. They allow you to apply different filters to the list:
33
34 * **Private links:** When this toggle button is enabled, only shaares set to `private` will be shown.
35 * **Untagged links:** When the this toggle button is enabled (top left of the link list), only shaares _without any tags_ will be shown in the link list.
36
37Filter buttons are only available when logged in.
diff --git a/doc/md/Community-&-Related-software.md b/doc/md/Community-and-related-software.md
index 54f18c8e..53a7555e 100644
--- a/doc/md/Community-&-Related-software.md
+++ b/doc/md/Community-and-related-software.md
@@ -1,66 +1,87 @@
1# Community & related software
2
1_Unofficial but related work on Shaarli. If you maintain one of these, 3_Unofficial but related work on Shaarli. If you maintain one of these,
2please get in touch with us to help us find a way to adapt your work to our fork._ 4please get in touch with us to help us find a way to adapt your work to our fork._
3 5
4## Related software
5 6
7## Related software
6 8
7### REST API clients 9### REST API clients
8See [REST API](REST-API) for a list of official and community clients. 10See [REST API](REST-API) for a list of official and community clients.
9 11
10 12
11### Third party plugins 13### Third party plugins
12- [autosave](https://github.com/kalvn/shaarli-plugin-autosave) by [@kalvn](https://github.com/kalvn): Automatically saves data when editing a link to avoid any loss in case of crash or unexpected shutdown. 14
13- [Code Coloration](https://github.com/ArthurHoaro/code-coloration) by [@ArthurHoaro](https://github.com/ArthurHoaro): client side code syntax highlighter. 15- [autosave](https://github.com/kalvn/shaarli-plugin-autosave) by [@kalvn](https://github.com/kalvn): Automatically saves data when editing a Shaare to avoid any loss in case of crash or unexpected shutdown.
14- [Disqus](https://github.com/kalvn/shaarli-plugin-disqus) by [@kalvn](https://github.com/kalvn): Adds Disqus comment system to your Shaarli. 16- [code-coloration](https://github.com/ArthurHoaro/code-coloration) by [@ArthurHoaro](https://github.com/ArthurHoaro): client side code syntax highlighter.
17- [custom-css](https://github.com/immanuelfodor/shaarli-custom-css) by [@immanuelfodor](https://github.com/immanuelfodor) - Customize the look and feel of the UI with custom CSS rules
18- [disqus](https://github.com/kalvn/shaarli-plugin-disqus) by [@kalvn](https://github.com/kalvn): Adds Disqus comment system to your Shaarli.
19- [emojione](https://github.com/immanuelfodor/emojione) by [@immanuelfodor](https://github.com/immanuelfodor) - Resurrected fork of the original emojione project
20- [favicons](https://github.com/trailjeep/shaarli-favicons) by [@trailjeep](https://github.com/trailjeep) - Shaarli plugin to add favicon/filetype icons to Shaares.
15- [google analytics](https://github.com/ericjuden/Shaarli-Google-Analytics-Plugin) by [@ericjuden](http://github.com/ericjuden): Adds Google Analytics tracking support 21- [google analytics](https://github.com/ericjuden/Shaarli-Google-Analytics-Plugin) by [@ericjuden](http://github.com/ericjuden): Adds Google Analytics tracking support
16- [launch](https://github.com/ArthurHoaro/launch-plugin) - Launch Plugin is a plugin designed to enhance and customize Launch Theme for Shaarli. 22- [launch](https://github.com/ArthurHoaro/launch-plugin) - Launch Plugin is a plugin designed to enhance and customize Launch Theme for Shaarli.
17- [markdown-toolbar](https://github.com/immanuelfodor/shaarli-markdown-toolbar) by [@immanuelfodor](https://github.com/immanuelfodor) - Easily insert markdown syntax into the Description field when editing a link. 23- [markdown-toolbar](https://github.com/immanuelfodor/shaarli-markdown-toolbar) by [@immanuelfodor](https://github.com/immanuelfodor) - Easily insert markdown syntax into the Description field when editing a Shaare.
18- [related](https://github.com/ilesinge/shaarli-related) by [@ilesinge](https://github.com/ilesinge) - Show related links based on the number of identical tags. 24- [related](https://github.com/ilesinge/shaarli-related) by [@ilesinge](https://github.com/ilesinge) - Show related Shaares based on the number of identical tags.
19- [social](https://github.com/alexisju/social) by [@alexisju](https://github.com/alexisju): share links to social networks. 25- [shaarli-descriptor](https://github.com/immanuelfodor/shaarli-descriptor) by [@immanuelfodor](https://github.com/immanuelfodor) - Customize the default height/number of rows of the Description field when editing a Shaare.
20- [shaarli2twitter](https://github.com/ArthurHoaro/shaarli2twitter) by [@ArthurHoaro](https://github.com/ArthurHoaro) - Automatically tweet your shared links from Shaarli
21- [shaarli2mastodon](https://github.com/kalvn/shaarli2mastodon) by [@kalvn](https://github.com/kalvn) - This Shaarli plugin allows you to automatically publish links you post on your Mastodon timeline. 26- [shaarli2mastodon](https://github.com/kalvn/shaarli2mastodon) by [@kalvn](https://github.com/kalvn) - This Shaarli plugin allows you to automatically publish links you post on your Mastodon timeline.
22- [shaarli-descriptor](https://github.com/immanuelfodor/shaarli-descriptor) by [@immanuelfodor](https://github.com/immanuelfodor) - Customize the default height/number of rows of the Description field when editing a link. 27- [shaarli2twitter](https://github.com/ArthurHoaro/shaarli2twitter) by [@ArthurHoaro](https://github.com/ArthurHoaro) - Automatically tweet your Shaares from Shaarli
28- [social](https://github.com/alexisju/social) by [@alexisju](https://github.com/alexisju): share links to social networks.
23- [urlextern](https://github.com/trailjeep/shaarli-urlextern) by [@trailjeep](https://github.com/trailjeep) - Shaarli plugin to open external links in a new tab/window. 29- [urlextern](https://github.com/trailjeep/shaarli-urlextern) by [@trailjeep](https://github.com/trailjeep) - Shaarli plugin to open external links in a new tab/window.
24- [favicons](https://github.com/trailjeep/shaarli-favicons) by [@trailjeep](https://github.com/trailjeep) - Shaarli plugin to add favicon/filetype icons to links. 30- [webhooks](https://gitlab.com/flow.gunso/shaarli-webhooks) by [@flow.gunso](https://gitlab.com/flow.gunso) - Shaarli plugin that enables user-defined callback URL, i.e. webhooks, for specific Shaarli events (link saving, deletion...)
31
25 32
26### Third-party themes 33### Third-party themes
34
27See [Theming](Theming) for a list of community-contributed themes, and an installation guide. 35See [Theming](Theming) for a list of community-contributed themes, and an installation guide.
28 36
29 37
30### Integration with other platforms 38### Integration with other platforms
39
31- [tt-rss-shaarli](https://github.com/jcsaaddupuy/tt-rss-shaarli) - [Tiny-Tiny RSS](http://tt-rss.org/) plugin that adds support for sharing articles with Shaarli 40- [tt-rss-shaarli](https://github.com/jcsaaddupuy/tt-rss-shaarli) - [Tiny-Tiny RSS](http://tt-rss.org/) plugin that adds support for sharing articles with Shaarli
32- [octopress-shaarli](https://github.com/ahmet2mir/octopress-shaarli) - Octopress plugin to retrieve Shaarli links on the sidebar 41- [octopress-shaarli](https://github.com/ahmet2mir/octopress-shaarli) - Octopress plugin to retrieve Shaarli Shaares on the sidebar
33- [Scuttle to Shaarli](https://github.com/q2apro/scuttle-to-shaarli) - Import bookmarks from Scuttle 42- [Scuttle to Shaarli](https://github.com/q2apro/scuttle-to-shaarli) - Import bookmarks from Scuttle
34- [Shaarli app for Cloudron](https://git.cloudron.io/cloudron/shaarli-app) - Effortlessly run Shaarli with the help of [Cloudron](https://cloudron.io/) [![Install](https://cloudron.io/img/button.svg)](https://cloudron.io/button.html?app=com.github.shaarli) 43- [Shaarli app for Cloudron](https://git.cloudron.io/cloudron/shaarli-app) - Effortlessly run Shaarli with the help of [Cloudron](https://cloudron.io/) [![Install](https://cloudron.io/img/button.svg)](https://cloudron.io/button.html?app=com.github.shaarli)
35- [Shaarli_ynh](https://github.com/YunoHost-Apps/shaarli_ynh) - Shaarli is available as a [Yunohost](https://yunohost.org) app [![Install Shaarli with YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=shaarli) 44- [Shaarli_ynh](https://github.com/YunoHost-Apps/shaarli_ynh) - Shaarli is available as a [Yunohost](https://yunohost.org) app [![Install Shaarli with YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=shaarli)
36- [pelican](https://blog.getpelican.com) static blog generator plugin to auto-post articles on a Shaarli instance: [shaarli_poster](https://github.com/getpelican/pelican-plugins/tree/master/shaarli_poster) 45- [pelican](https://blog.getpelican.com) static blog generator plugin to auto-post articles on a Shaarli instance: [shaarli_poster](https://github.com/getpelican/pelican-plugins/tree/master/shaarli_poster)
37 46
47
38### Mobile Apps 48### Mobile Apps
49
39- [ShaarliOS](https://github.com/mro/ShaarliOS) - Apple iOS share extension. 50- [ShaarliOS](https://github.com/mro/ShaarliOS) - Apple iOS share extension.
40- [Shaarli for Android](http://sebsauvage.net/links/?ZAyDzg) - Android application that adds Shaarli as a sharing provider 51- [Shaarli for Android](http://sebsauvage.net/links/?ZAyDzg) - Android application that adds Shaarli as a sharing provider
41- [Shaarlier for Android](https://github.com/dimtion/Shaarlier) - Android application to simply add links directly into your Shaarli 52- [Shaarlier for Android](https://github.com/dimtion/Shaarlier) - Android application to simply add Shaares directly into your Shaarli
42- [Stakali for Android](https://stakali.toneiv.eu) - Stakali is a personal bookmark manager which synchronizes with Shaarli 53- [Stakali for Android](https://stakali.toneiv.eu) - Stakali is a personal bookmark manager which synchronizes with Shaarli
43 54
55
44### Desktop Apps 56### Desktop Apps
57
45- [Ulauncher Extension](https://github.com/sebw/ulauncher-shaarli) - Ulauncher is an an application launcher for Linux, this extension allows research in your Shaarli 58- [Ulauncher Extension](https://github.com/sebw/ulauncher-shaarli) - Ulauncher is an an application launcher for Linux, this extension allows research in your Shaarli
46 59
60
47### Browser addons 61### Browser addons
62
48- [Shaarli Firefox Extension](https://github.com/ikipatang/shaarli-web-extension) - toolbar button to share your current tab with Shaarli. 63- [Shaarli Firefox Extension](https://github.com/ikipatang/shaarli-web-extension) - toolbar button to share your current tab with Shaarli.
49- [Shaarli Chrome Extension](https://github.com/octplane/Shiny-Shaarli) - toolbar button to share your current tab with Shaarli. 64- [Shaarli Chrome Extension](https://github.com/octplane/Shiny-Shaarli) - toolbar button to share your current tab with Shaarli.
50 65
66
51### Server apps 67### Server apps
68
52- [shaarchiver](https://github.com/nodiscc/shaarchiver) - Archive your Shaarli bookmarks and their content 69- [shaarchiver](https://github.com/nodiscc/shaarchiver) - Archive your Shaarli bookmarks and their content
53- [shaarli-river](https://github.com/mknexen/shaarli-river) - An aggregator for shaarlis with many features 70- [shaarli-river](https://github.com/mknexen/shaarli-river) - An aggregator for shaarlis with many features
54- [Shaarlo](https://github.com/DMeloni/shaarlo) - An aggregator for shaarlis with many features (a very popular running instance among French shaarliers: [shaarli.fr](http://shaarli.fr/)) 71- [Shaarlo](https://github.com/DMeloni/shaarlo) - An aggregator for shaarlis with many features
55- [Shaarlimages](https://github.com/BoboTiG/shaarlimages) - An image-oriented aggregator for Shaarlis 72- [Shaarlimages](https://github.com/BoboTiG/shaarlimages) - An image-oriented aggregator for Shaarlis
56- [mknexen/shaarli-api](https://github.com/mknexen/shaarli-api) - A REST API for Shaarli 73- [mknexen/shaarli-api](https://github.com/mknexen/shaarli-api) - A REST API for Shaarli
57- [Self dead link](https://framagit.org/qwertygc/shaarli-dev-code/blob/master/self-dead-link.php) - Detect dead links on shaarli. This version use the database of shaarli. [Another version](https://framagit.org/qwertygc/shaarli-dev-code/blob/master/dead-link.php), can be used for other shaarli instances (but is more resource consuming). 74- [Self dead link](https://framagit.org/qwertygc/shaarli-dev-code/blob/master/self-dead-link.php) - Detect dead links on shaarli. This version use the database of shaarli. [Another version](https://framagit.org/qwertygc/shaarli-dev-code/blob/master/dead-link.php), can be used for other shaarli instances (but is more resource consuming).
58- [Bookmark Archiver](https://github.com/pirate/bookmark-archiver) - Save an archived copy of all websites starred using browser bookmarks/Shaarli/Delicious/Instapaper/Unmark.it/Pocket/Pinboard. Outputs browseable html. 75- [Bookmark Archiver](https://github.com/pirate/bookmark-archiver) - Save an archived copy of all websites starred using browser bookmarks/Shaarli/Delicious/Instapaper/Unmark.it/Pocket/Pinboard. Outputs browseable html.
59 76
77
60## Alternatives to Shaarli 78## Alternatives to Shaarli
79
61See [awesome-selfhosted: bookmarks & link sharing](https://github.com/Kickball/awesome-selfhosted/#bookmarks--link-sharing). 80See [awesome-selfhosted: bookmarks & link sharing](https://github.com/Kickball/awesome-selfhosted/#bookmarks--link-sharing).
62 81
82
63## Community 83## Community
84
64- [Liens en vrac de sebsauvage](http://sebsauvage.net/links/) - the original Shaarli 85- [Liens en vrac de sebsauvage](http://sebsauvage.net/links/) - the original Shaarli
65- [A large list of Shaarlis](http://porneia.free.fr/pub/links/ou-est-shaarli.html) 86- [A large list of Shaarlis](http://porneia.free.fr/pub/links/ou-est-shaarli.html)
66- [A list of working Shaarli aggregators](https://raw.githubusercontent.com/Oros42/find_shaarlis/master/annuaires.json) 87- [A list of working Shaarli aggregators](https://raw.githubusercontent.com/Oros42/find_shaarlis/master/annuaires.json)
@@ -71,8 +92,17 @@ See [awesome-selfhosted: bookmarks & link sharing](https://github.com/Kickball/a
71- [Original revisions history](http://sebsauvage.net/wiki/doku.php?id=php:shaarli:history) 92- [Original revisions history](http://sebsauvage.net/wiki/doku.php?id=php:shaarli:history)
72- [Shaarli.fr/my](https://www.shaarli.fr/my.php) - Unofficial, unsupported (old fork) hosted Shaarlis provider, courtesy of [DMeloni](https://github.com/DMeloni) 93- [Shaarli.fr/my](https://www.shaarli.fr/my.php) - Unofficial, unsupported (old fork) hosted Shaarlis provider, courtesy of [DMeloni](https://github.com/DMeloni)
73 94
95
74### Articles and social media discussions 96### Articles and social media discussions
75- 2016-09-22 - Hacker News - https://news.ycombinator.com/item?id=12552176 97- 2020-04-05 - Hacker News - [Self-hosted instance of Shaarli - it is simple, fast and reliable](https://news.ycombinator.com/item?id=22780219)
98- 2016-10-10 - Framasoft - [MyFrama : vos favoris partout, avec vous, rien qu’à vous !](https://framablog.org/2016/10/10/myframa-vos-favoris-et-framasofteries-partout-avec-vous-rien-qua-vous/)
99- 2016-09-22 - Hacker News - [Shaarli – Personal, minimalist, database-free, bookmarking service (github.com)](https://news.ycombinator.com/item?id=12552176)
76- 2015-08-15 - Reddit - [Question about migrating from WordPress to Shaarli.](https://www.reddit.com/r/selfhosted/comments/3h3zwh/question_about_migrating_from_wordpress_to_shaarli/) 100- 2015-08-15 - Reddit - [Question about migrating from WordPress to Shaarli.](https://www.reddit.com/r/selfhosted/comments/3h3zwh/question_about_migrating_from_wordpress_to_shaarli/)
77- 2015-06-22 - Hacker News - https://news.ycombinator.com/item?id=9755366 101- 2015-06-22 - Hacker News - [Shaarli: Self-hosted del.icio.us alternative (sebsauvage.net)](https://news.ycombinator.com/item?id=9755366)
78- 2015-05-12 - Reddit - [shaarli - Self hosted Bookmarking / Delicious (PHP, MySQL)](https://www.reddit.com/r/selfhosted/comments/35pkkc/shaarli_self_hosted_bookmarking_delicious_php/) 102- 2015-05-12 - Reddit - [shaarli - Self hosted Bookmarking / Delicious (PHP, MySQL)](https://www.reddit.com/r/selfhosted/comments/35pkkc/shaarli_self_hosted_bookmarking_delicious_php/)
103- 2014-10-15 - OpenSource.com - [Five open source alternatives to popular web apps](https://opensource.com/life/14/10/five-open-source-alternatives-popular-web-apps)
104
105It also appears in the following recommendation lists:
106- [AlternativeTo](https://alternativeto.net/software/shaarli/)
107- [FramaLibre](https://framalibre.org/content/shaarli)
108- [Project Awesome: Selfhosted Bookmarks and Link Sharing](https://project-awesome.org/Kickball/awesome-selfhosted)
diff --git a/doc/md/Continuous-integration-tools.md b/doc/md/Continuous-integration-tools.md
deleted file mode 100644
index f7819d5a..00000000
--- a/doc/md/Continuous-integration-tools.md
+++ /dev/null
@@ -1,32 +0,0 @@
1## Local development
2A [`Makefile`](https://github.com/shaarli/Shaarli/blob/master/Makefile) is available to perform project-related operations:
3
4- Documentation - generate a local HTML copy of the GitHub wiki
5- [Static analysis](Static-analysis) - check that the code is compliant to PHP conventions
6- [Unit tests](Unit-tests) - ensure there are no regressions introduced by new commits
7
8## Automatic builds
9[Travis CI](http://docs.travis-ci.com/) is a Continuous Integration build server, that runs a build:
10
11- each time a commit is merged to the mainline (`master` branch)
12- each time a Pull Request is submitted or updated
13
14A build is composed of several jobs: one for each supported PHP version (see [Server requirements](Server requirements)).
15
16Each build job:
17
18- updates Composer
19- installs 3rd-party test dependencies with Composer
20- runs [Unit tests](Unit-tests)
21- runs ESLint check
22
23After all jobs have finished, Travis returns the results to GitHub:
24
25- a status icon represents the result for the `master` branch: [![](https://api.travis-ci.org/shaarli/Shaarli.svg)](https://travis-ci.org/shaarli/Shaarli)
26- Pull Requests are updated with the Travis result
27 - Green: all tests have passed
28 - Red: some tests failed
29 - Orange: tests are pending
30
31## Documentation
32[mkdocs](https://www.mkdocs.org/) is used to convert markdown documentation to HTML pages. The [public documentation](https://shaarli.readthedocs.io/en/master/) website is rendered and hosted by [readthedocs.org](https://readthedocs.org/). A copy of the documentation is also included in prebuilt [release archives](https://github.com/shaarli/Shaarli/releases) (`doc/html/` path in your Shaarli installation). To generate the HTML documentation locally, install a recent version of Python `setuptools` and run `make doc`.
diff --git a/doc/md/Development-guidelines.md b/doc/md/Development-guidelines.md
deleted file mode 100644
index 46b7c6f8..00000000
--- a/doc/md/Development-guidelines.md
+++ /dev/null
@@ -1,13 +0,0 @@
1## Development guidelines
2
3Please have a look at the following pages:
4
5- [Contributing to Shaarli](https://github.com/shaarli/Shaarli/tree/master/CONTRIBUTING.md)
6- [Static analysis](Static-analysis) - patches should try to stick to the
7[PHP Standard Recommendations](http://www.php-fig.org/psr/) (PSR), especially:
8 - [PSR-1](http://www.php-fig.org/psr/psr-1/) - Basic Coding Standard
9 - [PSR-2](http://www.php-fig.org/psr/psr-2/) - Coding Style Guide
10- [Unit tests](Unit-tests)
11- Javascript linting - Shaarli uses [Airbnb JavaScript Style Guide](https://github.com/airbnb/javascript).
12Run `make eslint` to check JS style.
13- [GnuPG signature](GnuPG-signature) for tags/releases
diff --git a/doc/md/Directory-structure.md b/doc/md/Directory-structure.md
deleted file mode 100644
index c0b49393..00000000
--- a/doc/md/Directory-structure.md
+++ /dev/null
@@ -1,54 +0,0 @@
1## Directory structure
2
3Here is the directory structure of Shaarli and the purpose of the different files:
4
5```bash
6 index.php # Main program
7 application/ # Shaarli classes
8 ├── LinkDB.php
9
10 ...
11
12 └── Utils.php
13 tests/ # Shaarli unitary & functional tests
14 ├── LinkDBTest.php
15
16 ...
17
18 ├── utils # utilities to ease testing
19 │ └── ReferenceLinkDB.php
20 └── UtilsTest.php
21 assets/
22 ├── common/ # Assets shared by multiple themes
23 ├── ...
24 ├── default/ # Assets for the default template, before compilation
25 ├── fonts/ # Font files
26 ├── img/ # Images used by the default theme
27 ├── js/ # JavaScript files in ES6 syntax
28 ├── scss/ # SASS files
29 └── vintage/ # Assets for the vintage template, before compilation
30 └── ...
31 COPYING # Shaarli license
32 inc/ # static assets and 3rd party libraries
33 └── rain.tpl.class.php # RainTPL templating library
34 images/ # Images and icons used in Shaarli
35 data/ # data storage: bookmark database, configuration, logs, banlist...
36 ├── config.json.php # Shaarli configuration (login, password, timezone, title...)
37 ├── datastore.php # Your link database (compressed).
38 ├── ipban.php # IP address ban system data
39 ├── lastupdatecheck.txt # Update check timestamp file
40 └── log.txt # login/IPban log.
41 tpl/ # RainTPL templates for Shaarli. They are used to build the pages.
42 ├── default/ # Default Shaarli theme
43 ├── fonts/ # Font files
44 ├── img/ # Images
45 ├── js/ # JavaScript files compiled by Babel and compatible with all browsers
46 ├── css/ # CSS files compiled with SASS
47 └── vintage/ # Legacy Shaarli theme
48 └── ...
49 cache/ # thumbnails cache
50 # This directory is automatically created. You can erase it anytime you want.
51 tmp/ # Temporary directory for compiled RainTPL templates.
52 # This directory is automatically created. You can erase it anytime you want.
53 vendor/ # Third-party dependencies. This directory is created by Composer
54```
diff --git a/doc/md/Docker.md b/doc/md/Docker.md
new file mode 100644
index 00000000..c152fe92
--- /dev/null
+++ b/doc/md/Docker.md
@@ -0,0 +1,227 @@
1# Docker
2
3[Docker](https://docs.docker.com/get-started/overview/) is an open platform for developing, shipping, and running applications
4
5## Install Docker
6
7Install [Docker](https://docs.docker.com/engine/install/), by following the instructions relevant to your OS / distribution, and start the service. For example on [Debian](https://docs.docker.com/engine/install/debian/):
8
9```bash
10# update your package lists
11sudo apt update
12# remove old versions
13sudo apt-get remove docker docker-engine docker.io containerd runc
14# install requirements
15sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
16# add docker's GPG signing key
17curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
18# add the repository
19sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"
20# install docker engine
21sudo apt-get update
22sudo apt-get install docker-ce docker-ce-cli containerd.io
23# Start and enable Docker service
24sudo systemctl enable docker && sudo systemctl start docker
25# verify that Docker is properly configured
26sudo docker run hello-world
27```
28
29In order to run Docker commands as a non-root user, you must add the `docker` group to this user:
30
31```bash
32# Add docker group as secondary group
33sudo usermod -aG docker your-user
34# Reboot or logout
35# Then verify that Docker is properly configured, as "your-user"
36docker run hello-world
37```
38
39## Get and run a Shaarli image
40
41Shaarli images are available on [DockerHub](https://hub.docker.com/r/shaarli/shaarli/) `shaarli/shaarli`:
42
43- `latest`: latest branch (last release)
44- `stable`: stable branch (last release in previous major version)
45- `master`: master branch (development branch)
46
47These images are built automatically on DockerHub and rely on:
48
49- [Alpine Linux](https://www.alpinelinux.org/)
50- [PHP7-FPM](http://php-fpm.org/)
51- [Nginx](http://nginx.org/)
52
53Additional Dockerfiles are provided for the `arm32v7` platform, relying on [Linuxserver.io Alpine armhf images](https://hub.docker.com/r/lsiobase/alpine.armhf/). These images must be built using [`docker build`](https://docs.docker.com/engine/reference/commandline/build/) on an `arm32v7` machine or using an emulator such as [qemu](https://resin.io/blog/building-arm-containers-on-any-x86-machine-even-dockerhub/).
54
55Here is an example of how to run Shaarli latest image using Docker:
56
57```bash
58# download the 'latest' image from dockerhub
59docker pull shaarli/shaarli
60
61# create persistent data volumes/directories on the host
62docker volume create shaarli-data
63docker volume create shaarli-cache
64
65# create a new container using the Shaarli image
66# --detach: run the container in background
67# --name: name of the created container/instance
68# --publish: map the host's :8000 port to the container's :80 port
69# --rm: automatically remove the container when it exits
70# --volume: mount persistent volumes in the container ($volume_name:$volume_mountpoint)
71docker run --detach \
72 --name myshaarli \
73 --publish 8000:80 \
74 --rm \
75 --volume shaarli-data:/var/www/shaarli/data \
76 --volume shaarli-cache:/var/www/shaarli/cache \
77 shaarli/shaarli:latest
78
79# verify that the container is running
80docker ps | grep myshaarli
81
82# to completely remove the container
83docker stop myshaarli # stop the running container
84docker ps | grep myshaarli # verify the container is no longer running
85docker ps -a | grep myshaarli # verify the container is stopped
86docker rm myshaarli # destroy the container
87docker ps -a | grep myshaarli # verify th container has been destroyed
88
89```
90
91After running `docker run` command, your Shaarli instance should be available on the host machine at [localhost:8000](http://localhost:8000). In order to access your instance through a reverse proxy, we recommend using our [Docker Compose](#docker-compose) build.
92
93## Docker Compose
94
95A [Compose file](https://docs.docker.com/compose/compose-file/) is a common format for defining and running multi-container Docker applications.
96
97A `docker-compose.yml` file can be used to run a persistent/autostarted shaarli service using [Docker Compose](https://docs.docker.com/compose/) or in a [Docker stack](https://docs.docker.com/engine/reference/commandline/stack_deploy/).
98
99Shaarli provides configuration file for Docker Compose, that will setup a Shaarli instance, a [Træfik](https://containo.us/traefik/) instance (reverse proxy) with [Let's Encrypt](https://letsencrypt.org/) certificates, a Docker network, and volumes for Shaarli data and Træfik TLS configuration and certificates.
100
101Download docker-compose from the [release page](https://docs.docker.com/compose/install/):
102
103```bash
104$ sudo curl -L "https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
105$ sudo chmod +x /usr/local/bin/docker-compose
106```
107
108To run Shaarli container and its reverse proxy, you can execute the following commands:
109
110```bash
111# create a new directory to store the configuration:
112$ mkdir shaarli && cd shaarli
113# Download the latest version of Shaarli's docker-compose.yml
114$ curl -L https://raw.githubusercontent.com/shaarli/Shaarli/latest/docker-compose.yml -o docker-compose.yml
115# Create the .env file and fill in your VPS and domain information
116# (replace <MY_SHAARLI_DOMAIN> and <MY_CONTACT_EMAIL> with your actual information)
117$ echo 'SHAARLI_VIRTUAL_HOST=shaarli.mydomain.org' > .env
118$ echo 'SHAARLI_LETSENCRYPT_EMAIL=admin@mydomain.org' >> .env
119# Pull the Docker images
120$ docker-compose pull
121# Run!
122$ docker-compose up -d
123```
124
125After a few seconds, you should be able to access your Shaarli instance at [https://shaarli.mydomain.org](https://shaarli.mydomain.org) (replace your own domain name).
126
127## Running dockerized Shaarli as a systemd service
128
129It is possible to start a dockerized Shaarli instance as a systemd service (systemd is the service management tool on several distributions). After installing Docker, use the following steps to run your shaarli container Shaarli to run on system start.
130
131As root, create `/etc/systemd/system/docker.shaarli.service`:
132
133```ini
134[Unit]
135Description=Shaarli Bookmark Manager Container
136After=docker.service
137Requires=docker.service
138
139
140[Service]
141Restart=always
142
143# Put any environment you want in an included file, like $host- or $domainname in this example
144EnvironmentFile=/etc/sysconfig/box-environment
145
146# It's just an example..
147ExecStart=/usr/bin/docker run \
148 -p 28010:80 \
149 --name ${hostname}-shaarli \
150 --hostname shaarli.${domainname} \
151 -v /srv/docker-volumes-local/shaarli-data:/var/www/shaarli/data:rw \
152 -v /etc/localtime:/etc/localtime:ro \
153 shaarli/shaarli:latest
154
155ExecStop=/usr/bin/docker rm -f ${hostname}-shaarli
156
157[Install]
158WantedBy=multi-user.target
159```
160
161```bash
162# reload systemd services definitions
163systemctl daemon-reload
164# start the servie and enable it a boot time
165systemctl enable docker.shaarli.service --now
166# verify that the service is running
167systemctl status docker.*
168# inspect system log if needed
169journalctl -f
170```
171
172
173
174## Docker cheatsheet
175
176```bash
177# pull/update an image
178$ docker pull shaarli/shaarli:release
179# run a container from an image
180$ docker run shaarli/shaarli:latest
181# list available images
182$ docker images ls
183# list running containers
184$ docker ps
185# list running AND stopped containers
186$ docker ps -a
187# run a command in a running container
188$ docker exec -ti <container-name-or-first-letters-of-id> bash
189# follow logs of a running container
190$ docker logs -f <container-name-or-first-letters-of-id>
191# delete unused images to free up disk space
192$ docker system prune --images
193# delete unused volumes to free up disk space (CAUTION all data in unused volumes will be lost)
194$ docker system prunt --volumes
195# delete unused containers
196$ docker system prune
197```
198
199
200## References
201
202- [Docker: using volumes](https://docs.docker.com/storage/volumes/)
203- [Dockerfile best practices](https://docs.docker.com/articles/dockerfile_best-practices/)
204- [Dockerfile reference](https://docs.docker.com/reference/builder/)
205- [DockerHub: GitHub automated build](https://docs.docker.com/docker-hub/github/)
206- [DockerHub: Repositories](https://docs.docker.com/userguide/dockerrepos/)
207- [DockerHub: Teams and organizations](https://docs.docker.com/docker-hub/orgs/)
208- [Get Docker CE for Debian](https://docs.docker.com/install/linux/docker-ce/debian/)
209- [Install Docker Compose](https://docs.docker.com/compose/install/)
210- [Interactive Docker training portal](https://www.katacoda.com/courses/docker/) on [Katakoda](https://www.katacoda.com/)
211- [Service management: Nginx in the foreground](http://nginx.org/en/docs/ngx_core_module.html#daemon)
212- [Service management: Using supervisord](https://docs.docker.com/articles/using_supervisord/)
213- [Volumes](https://docs.docker.com/storage/volumes/)
214- [Volumes](https://docs.docker.com/userguide/dockervolumes/)
215- [Where are Docker images stored?](http://blog.thoward37.me/articles/where-are-docker-images-stored/)
216- [docker create](https://docs.docker.com/engine/reference/commandline/create/)
217- [Docker Documentation](https://docs.docker.com/)
218- [docker exec](https://docs.docker.com/engine/reference/commandline/exec/)
219- [docker images](https://docs.docker.com/engine/reference/commandline/images/)
220- [docker logs](https://docs.docker.com/engine/reference/commandline/logs/)
221- [docker logs](https://docs.docker.com/engine/reference/commandline/logs/)
222- [Docker Overview](https://docs.docker.com/engine/docker-overview/)
223- [docker ps](https://docs.docker.com/engine/reference/commandline/ps/)
224- [docker pull](https://docs.docker.com/engine/reference/commandline/pull/)
225- [docker run](https://docs.docker.com/engine/reference/commandline/run/)
226- [docker-compose logs](https://docs.docker.com/compose/reference/logs/)
227- Træfik: [Getting Started](https://docs.traefik.io/), [Docker backend](https://docs.traefik.io/configuration/backends/docker/), [Let's Encrypt](https://docs.traefik.io/user-guide/docker-and-lets-encrypt/), [Docker image](https://hub.docker.com/_/traefik/) \ No newline at end of file
diff --git a/doc/md/Download-and-Installation.md b/doc/md/Download-and-Installation.md
deleted file mode 100644
index ec68762e..00000000
--- a/doc/md/Download-and-Installation.md
+++ /dev/null
@@ -1,124 +0,0 @@
1To install Shaarli, simply place the files in a directory under your webserver's
2Document Root (or directly at the document root).
3
4Also, please make sure your server is properly [configured](Server-configuration.md).
5
6Multiple releases branches are available:
7
8- latest (last release)
9- stable (previous major release)
10- master (development)
11
12Using one of the following methods:
13
14- by downloading full release archives including all dependencies
15- by downloading Github archives
16- by cloning the Git repository
17- using Docker: [see the documentation](docker/shaarli-images.md)
18
19--------------------------------------------------------------------------------
20
21## Latest release (recommended)
22
23### Download as an archive
24
25In most cases, you should download the latest Shaarli release from the [releases](https://github.com/shaarli/Shaarli/releases) page. Download our **shaarli-full** archive to include dependencies.
26
27The current latest released version is `v0.10.4`
28
29```bash
30$ wget https://github.com/shaarli/Shaarli/releases/download/v0.10.4/shaarli-v0.10.4-full.zip
31$ unzip shaarli-v0.10.4-full.zip
32$ mv Shaarli /path/to/shaarli/
33```
34
35### Using git
36
37Cloning using `git` or downloading Github branches as zip files requires additional steps:
38
39 * Install [Composer](Unit-tests.md#install_composer) to manage third-party [PHP dependencies](3rd-party-libraries.md#composer).
40 * Install [yarn](https://yarnpkg.com/lang/en/docs/install/) to build the frontend dependencies.
41 * Install [python3-virtualenv](https://pypi.python.org/pypi/virtualenv) to build the local HTML documentation.
42
43```
44$ mkdir -p /path/to/shaarli && cd /path/to/shaarli/
45$ git clone -b latest https://github.com/shaarli/Shaarli.git .
46$ composer install --no-dev --prefer-dist
47$ make build_frontend
48$ make translate
49$ make htmldoc
50```
51
52--------------------------------------------------------------------------------
53
54## Stable version
55
56The stable version has been experienced by Shaarli users, and will receive security updates.
57
58
59### Download as an archive
60
61As a .zip archive:
62
63```bash
64$ wget https://github.com/shaarli/Shaarli/archive/stable.zip
65$ unzip stable.zip
66$ mv Shaarli-stable /path/to/shaarli/
67```
68
69As a .tar.gz archive :
70
71```bash
72$ wget https://github.com/shaarli/Shaarli/archive/stable.tar.gz
73$ tar xvf stable.tar.gz
74$ mv Shaarli-stable /path/to/shaarli/
75```
76
77### Using git
78
79Install [Composer](Unit-tests.md#install_composer) to manage Shaarli dependencies.
80
81```bash
82$ git clone https://github.com/shaarli/Shaarli.git -b stable /path/to/shaarli/
83# install/update third-party dependencies
84$ cd /path/to/shaarli/
85$ composer install --no-dev --prefer-dist
86```
87
88
89--------------------------------------------------------------------------------
90
91## Development version (mainline)
92
93_Use at your own risk!_
94
95Install [Composer](Unit-tests.md#install_composer) to manage Shaarli PHP dependencies,
96and [yarn](https://yarnpkg.com/lang/en/docs/install/)
97for front-end dependencies.
98
99To get the latest changes from the `master` branch:
100
101```bash
102# clone the repository
103$ git clone https://github.com/shaarli/Shaarli.git -b master /path/to/shaarli/
104# install/update third-party dependencies
105$ cd /path/to/shaarli
106$ composer install --no-dev --prefer-dist
107$ make build_frontend
108$ make translate
109$ make htmldoc
110```
111
112-------------------------------------------------------------------------------
113
114## Finish Installation
115
116Once Shaarli is downloaded and files have been placed at the correct location, open it this location your favorite browser.
117
118![install screenshot](images/install-shaarli.png)
119
120Setup your Shaarli installation, and it's ready to use!
121
122## Updating Shaarli
123
124See [Upgrade and Migration](Upgrade-and-migration)
diff --git a/doc/md/FAQ.md b/doc/md/FAQ.md
deleted file mode 100644
index a2ec7d57..00000000
--- a/doc/md/FAQ.md
+++ /dev/null
@@ -1,46 +0,0 @@
1### Why did you create Shaarli ?
2
3I was a StumbleUpon user. Then I got fed up with they big toolbar. I switched to delicious, which was lighter, faster and more beautiful. Until Yahoo bought it. Then the export API broke all the time, delicious became slow and was ditched by Yahoo. I switched to Diigo, which is not bad, but does too much. And Diigo is sslllooooowww and their Firefox extension a bit buggy. And… oh… **their Firefox addon sends to Diigo every single URL you visit** (Don't believe me ? Use [Tamper Data](https://addons.mozilla.org/en-US/firefox/addon/tamper-data/) and open any page).
4
5Enough is enough. Saving simple links should not be a complicated heavy thing. I ditched them all and wrote my own: Shaarli. It's simple, but it does the job and does it well. And my data is not hosted on a foreign server, but on my server.
6
7### Why use Shaarli and not Delicious/Diigo ?
8
9With Shaarli:
10
11- The data is yours: It's hosted on your server.
12- Never fear of having your data locked-in.
13- Never fear to have your data sold to third party.
14- Your private links are not hosted on a third party server.
15- You are not tracked by browser addons (like Diigo does)
16- You can change the look and feel of the pages if you want.
17- You can change the behaviour of the program.
18- It's magnitude faster than most bookmarking services.
19
20### What does Shaarli mean?
21
22Shaarli stands for _shaaring_ your _links_.
23
24### My Shaarli is broken!
25First of all, ensure that both the [web server](Server-configuration) and
26[Shaarli](Shaarli-configuration) are correctly configured, and that your
27installation is [supported](Server-configuration).
28
29If everything looks right but the issue(s) remain(s), please:
30
31- take a look at the [troubleshooting](Troubleshooting) section
32- come [chat with us](https://gitter.im/shaarli/Shaarli) on Gitter, we'll be happy to help ;-)
33- browse active [issues](https://github.com/shaarli/Shaarli/issues) and [Pull Requests](https://github.com/shaarli/Shaarli/pulls)
34 - if you find one that is related to the issue, feel free to comment and provide additional details (host/Shaarli setup)
35 - else, [open a new issue](https://github.com/shaarli/Shaarli/issues/new), and provide information about the problem:
36 - _what happens?_ - display glitches, invalid data, security flaws...
37 - _what is your configuration?_ - OS, server version, activated extensions, web browser...
38 - _is it reproducible?_
39
40### Why not use a real database? Files are slow!
41
42Does browsing [this page](http://sebsauvage.net/links/) feel slow? Try browsing older pages, too.
43
44It's not slow at all, is it? And don't forget the database contains more than 16000 links, and it's on a shared host, with 32000 visitors/day for my website alone. And it's still damn fast. Why?
45
46The data file is only 3.7 Mb. It's read 99% of the time, and is probably already in the operation system disk cache. So generating a page involves no I/O at all most of the time.
diff --git a/doc/md/Installation.md b/doc/md/Installation.md
new file mode 100644
index 00000000..11b5da85
--- /dev/null
+++ b/doc/md/Installation.md
@@ -0,0 +1,78 @@
1# Installation
2
3Once your server is [configured](Server-configuration.md), install Shaarli:
4
5## From release ZIP
6
7To install Shaarli, simply place the files from the latest [release .zip archive](https://github.com/shaarli/Shaarli/releases) under your webserver's document root (directly at the document root, or in a subdirectory). Download the **shaarli-vX.X.X-full** archive to include dependencies.
8
9```bash
10wget https://github.com/shaarli/Shaarli/releases/download/v0.11.1/shaarli-v0.11.1-full.zip
11unzip shaarli-v0.11.1-full.zip
12sudo rsync -avP Shaarli/ /var/www/shaarli.mydomain.org/
13```
14
15## From sources
16
17These components are required to build Shaarli:
18
19- [Composer](dev/Development.md#install-composer) to manage third-party [PHP dependencies](dev/Development#third-party-libraries).
20- [yarn](https://yarnpkg.com/lang/en/docs/install/) to build frontend dependencies.
21- [python3-virtualenv](https://pypi.python.org/pypi/virtualenv) to build local HTML documentation.
22
23Clone the repository, either pointing to:
24
25- any [tagged release](https://github.com/shaarli/Shaarli/releases)
26- `latest`: the latest tagged release
27- `master`: development branch
28
29```bash
30# clone the branch/tag of your choice
31$ git clone -b latest https://github.com/shaarli/Shaarli.git /home/me/Shaarli
32# OR download/extract the tar.gz/zip: wget https://github.com/shaarli/Shaarli/archive/latest.tar.gz...
33
34# enter the directory
35$ cd /home/me/Shaarli
36# install 3rd-party PHP dependencies
37$ composer install --no-dev --prefer-dist
38# build frontend static assets
39$ make build_frontend
40# build translations
41$ make translate
42# build HTML documentation
43$ make htmldoc
44# copy the resulting shaarli directory under your webserver's document root
45$ rsync -avP /home/me/Shaarli/ /var/www/shaarli.mydomain.org/
46```
47
48## Set file permissions
49
50Regardless of the installation method, appropriate [file permissions](dev/Development.md#directory-structure) must be set:
51
52```bash
53sudo chown -R root:www-data /var/www/shaarli.mydomain.org
54sudo chmod -R g+rX /var/www/shaarli.mydomain.org
55sudo chmod -R g+rwX /var/www/shaarli.mydomain.org/{cache/,data/,pagecache/,tmp/}
56```
57
58## Using Docker
59
60[See the documentation](Docker.md)
61
62
63## Finish Installation
64
65Once Shaarli is downloaded and files have been placed at the correct location, open this location your web browser.
66
67Enter basic settings for your Shaarli installation, and it's ready to use!
68
69![](images/07-installation.jpg)
70
71Congratulations! Your Shaarli is now available at `https://shaarli.mydomain.org`.
72
73You can further [configure Shaarli](Shaarli-configuration.md), setup [Plugins](Plugins.md) or [additional software](Community-and-related-software.md).
74
75
76## Upgrading Shaarli
77
78See [Upgrade and Migration](Upgrade-and-migration)
diff --git a/doc/md/Link-structure.md b/doc/md/Link-structure.md
deleted file mode 100644
index 0a2d0f88..00000000
--- a/doc/md/Link-structure.md
+++ /dev/null
@@ -1,18 +0,0 @@
1## Link structure
2
3Every link available through the `LinkDB` object is represented as an array
4containing the following fields:
5
6 * `id` (integer): Unique identifier.
7 * `title` (string): Title of the link.
8 * `url` (string): URL of the link. Used for displayable links (without redirector, url encoding, etc.).
9 Can be absolute or relative for Notes.
10 * `real_url` (string): Real destination URL, can be redirected, encoded, etc.
11 * `shorturl` (string): Permalink small hash.
12 * `description` (string): Link text description.
13 * `private` (boolean): whether the link is private or not.
14 * `tags` (string): all link tags separated by a single space
15 * `thumbnail` (string|boolean): relative path of the thumbnail cache file, or false if there isn't any.
16 * `created` (DateTime): link creation date time.
17 * `updated` (DateTime): last modification date time.
18 \ No newline at end of file
diff --git a/doc/md/Plugins.md b/doc/md/Plugins.md
index 3e261815..a9f5f1a8 100644
--- a/doc/md/Plugins.md
+++ b/doc/md/Plugins.md
@@ -1,14 +1,13 @@
1## Plugin installation 1# Plugins
2 2
3There is a bunch of plugins shipped with Shaarli, where there is nothing to do to install them. 3## Installation
4 4
5If you want to install a third party plugin: 5For plugins shipped with Shaarli, no installation is required.
6 6
7- Download it. 7If you want to install a third party plugin, download it to the `plugins` directory in Shaarli's installation folder:
8- Put it in the `plugins` directory in Shaarli's installation folder.
9- Make sure you put it correctly:
10 8
11``` 9```bash
10# example directory structure
12| index.php 11| index.php
13| plugins/ 12| plugins/
14|---| custom_plugin/ 13|---| custom_plugin/
@@ -17,63 +16,47 @@ If you want to install a third party plugin:
17 16
18``` 17```
19 18
20 * Make sure your webserver can read and write the files in your plugin folder. 19Make sure your webserver can read and write the files in your plugin folder.
21 20
22## Plugin configuration
23 21
24In Shaarli's administration page (`Tools` link), go to `Plugin administration`. 22## Configuration
25 23
26Here you can enable and disable all plugins available, and configure them. 24From Shaarli's administration page (`Tools` link), go to `Plugin administration`. Here you can enable and disable all plugins available, and configure them.
27 25
28![administration screenshot](https://camo.githubusercontent.com/5da68e191969007492ca0fbeb25f3b2357b748cc/687474703a2f2f692e696d6775722e636f6d2f766837544643712e706e67) 26![administration screenshot](https://camo.githubusercontent.com/5da68e191969007492ca0fbeb25f3b2357b748cc/687474703a2f2f692e696d6775722e636f6d2f766837544643712e706e67)
29 27
30## Plugin order 28
29## Order
31 30
32In the plugin administration page, you can move enabled plugins to the top or bottom of the list. The first plugins in the list will be processed first. 31In the plugin administration page, you can move enabled plugins to the top or bottom of the list. The first plugins in the list will be processed first.
33 32
34This is important in case plugins are depending on each other. Read plugins README details for more information. 33This is important in case plugins depend on each other. Read plugins READMEs for more information.
35 34
36**Use case**: The (non existent) plugin `shaares_footer` adds a footer to every shaare in Markdown syntax. It needs to be processed *before* (higher in the list) the Markdown plugin. Otherwise its syntax won't be translated in HTML. 35**Use case**: The (non existent) plugin `shaares_footer` adds a footer to every shaare in Markdown syntax. It needs to be processed *before* (higher in the list) the Markdown plugin. Otherwise its syntax won't be translated in HTML.
37 36
38## File mode
39 37
40Enabled plugin are stored in your `config.json.php` parameters file, under the `array`: 38## Configuration file
41 39
42```php 40Enabled plugins are stored in your [Configuration file](Shaarli-configuration).
43$GLOBALS['config']['ENABLED_PLUGINS']
44```
45 41
46You can edit them manually here. 42## Usage
47Example:
48 43
49```php 44### Official plugins
50$GLOBALS['config']['ENABLED_PLUGINS'] = array(
51 'qrcode',
52 'archiveorg',
53 'wallabag',
54 'markdown',
55);
56```
57
58### Plugin usage
59
60#### Official plugins
61 45
62Usage of each plugin is documented in it's README file: 46Usage of each plugin is documented in it's README file:
63 47
64 * `addlink-toolbar`: Adds the addlink input on the linklist page 48 * `addlink-toolbar`: Adds the addlink input on the Shaares list page
65 * `archiveorg`: For each link, add an Archive.org icon 49 * `archiveorg`: For each Shaare, add a link to the archived page on Archive.org
66 * `default_colors`: Override default theme colors. 50 * `default_colors`: Override default theme colors.
67 * `isso`: Let visitor comment your shaares on permalinks with Isso. 51 * `isso`: Let visitor comment your shaares on permalinks with Isso.
68 * [`markdown`](https://github.com/shaarli/Shaarli/blob/master/plugins/markdown/README.md): Render shaare description with Markdown syntax. 52 * [`markdown`](https://github.com/shaarli/Shaarli/blob/master/plugins/markdown/README.md): Render shaare description with Markdown syntax.
69 * `piwik`: A plugin that adds Piwik tracking code to Shaarli pages. 53 * `piwik`: A plugin that adds Piwik tracking code to Shaarli pages.
70 * [`playvideos`](https://github.com/shaarli/Shaarli/blob/master/plugins/playvideos/README.md): Add a button in the toolbar allowing to watch all videos. 54 * [`playvideos`](https://github.com/shaarli/Shaarli/blob/master/plugins/playvideos/README.md): Add a button in the toolbar allowing to watch all videos.
71 * `pubsubhubbub`: Enable PubSubHubbub feed publishing 55 * `pubsubhubbub`: Enable PubSubHubbub feed publishing
72 * `qrcode`: For each link, add a QRCode icon. 56 * `qrcode`: For each Shaare, add a QRCode icon.
73 * [`wallabag`](https://github.com/shaarli/Shaarli/blob/master/plugins/wallabag/README.md): For each link, add a Wallabag icon to save it in your instance. 57 * [`wallabag`](https://github.com/shaarli/Shaarli/blob/master/plugins/wallabag/README.md): For each Shaare, add a Wallabag icon to save it in your instance.
74
75 58
76 59
77#### Third party plugins 60### Third party plugins
78 61
79See [Community & related software](https://shaarli.readthedocs.io/en/master/Community-&-Related-software/) 62See [Community & related software](https://shaarli.readthedocs.io/en/master/Community-and-Related-software/)
diff --git a/doc/md/REST-API.md b/doc/md/REST-API.md
index 11bd1cd2..01071d8e 100644
--- a/doc/md/REST-API.md
+++ b/doc/md/REST-API.md
@@ -1,101 +1,24 @@
1## Usage and Prerequisites 1# REST API
2 2
3See the [REST API documentation](http://shaarli.github.io/api-documentation/) 3## Server requirements
4for a list of available endpoints and parameters.
5 4
6Please ensure that your server meets the 5See the **[REST API documentation](http://shaarli.github.io/api-documentation/)** for a list of available endpoints and parameters.
7[requirements](Server-configuration#prerequisites) and is properly 6
8[configured](Server-configuration): 7Please ensure that your server meets the requirements and is properly [configured](Server-configuration):
9 8
10- URL rewriting is enabled (see specific Apache and Nginx sections) 9- URL rewriting is enabled (see specific Apache and Nginx sections)
11- the server's timezone is properly defined 10- the server's timezone is properly defined
12- the server's clock is synchronized with 11- the server's clock is synchronized with [NTP](https://en.wikipedia.org/wiki/Network_Time_Protocol)
13 [NTP](https://en.wikipedia.org/wiki/Network_Time_Protocol)
14
15The host where the API client is invoked should also be synchronized with NTP,
16see [token expiration](#payload).
17
18## Authentication
19
20All requests to Shaarli's API must include a JWT token to verify their authenticity.
21
22This token has to be included as an HTTP header called `Authentication: Bearer <jwt token>`.
23
24JWT resources :
25
26- [jwt.io](https://jwt.io) (including a list of client per language).
27- RFC : https://tools.ietf.org/html/rfc7519
28- https://float-middle.com/json-web-tokens-jwt-vs-sessions/
29- HackerNews thread: https://news.ycombinator.com/item?id=11929267
30
31
32### Shaarli JWT Token
33
34JWT tokens are composed by three parts, separated by a dot `.` and encoded in base64:
35
36```
37[header].[payload].[signature]
38```
39
40#### Header
41
42Shaarli only allow one hash algorithm, so the header will always be the same:
43
44```json
45{
46 "typ": "JWT",
47 "alg": "HS512"
48}
49```
50
51Encoded in base64, it gives:
52
53```
54ewogICAgICAgICJ0eXAiOiAiSldUIiwKICAgICAgICAiYWxnIjogIkhTNTEyIgogICAgfQ==
55```
56
57#### Payload
58
59**Token expiration**
60
61To avoid infinite token validity, JWT tokens must include their creation date
62in UNIX timestamp format (timezone independent - UTC) under the key `iat` (issued at).
63This token will be valid during **9 minutes**.
64
65```json
66{
67 "iat": 1468663519
68}
69```
70
71See [RFC reference](https://tools.ietf.org/html/rfc7519#section-4.1.6).
72
73 12
74#### Signature 13The host where the API client is invoked should also be synchronized with NTP, see _payload/token expiration_
75
76The signature authenticate the token validity. It contains the base64 of the header and the body, separated by a dot `.`, hashed in SHA512 with the API secret available in Shaarli administration page.
77
78Signature example with PHP:
79
80```php
81$content = base64_encode($header) . '.' . base64_encode($payload);
82$signature = hash_hmac('sha512', $content, $secret);
83```
84 14
85 15
86## Clients and examples 16## Clients and examples
87### Android, Java, Kotlin
88
89- [Android client example with Kotlin](https://gitlab.com/snippets/1665808)
90 by [Braincoke](https://github.com/Braincoke)
91
92### Javascript, NodeJS
93 17
94- [shaarli-client](https://www.npmjs.com/package/shaarli-client) 18- **[python-shaarli-client](https://github.com/shaarli/python-shaarli-client)** - the reference API client ([Documentation](http://python-shaarli-client.readthedocs.io/en/latest/))
95 ([source code](https://github.com/laBecasse/shaarli-client)) 19- [shaarli-client](https://www.npmjs.com/package/shaarli-client) - NodeJs client ([source code](https://github.com/laBecasse/shaarli-client)) by [laBecasse](https://github.com/laBecasse)
96 by [laBecasse](https://github.com/laBecasse) 20- [Android client example with Kotlin](https://gitlab.com/snippets/1665808) by [Braincoke](https://github.com/Braincoke)
97 21
98### PHP
99 22
100This example uses the [PHP cURL](http://php.net/manual/en/book.curl.php) library. 23This example uses the [PHP cURL](http://php.net/manual/en/book.curl.php) library.
101 24
@@ -145,13 +68,57 @@ function getInfo($baseUrl, $secret) {
145var_dump(getInfo($baseUrl, $secret)); 68var_dump(getInfo($baseUrl, $secret));
146``` 69```
147 70
71## Implementation
72
73### Authentication
74
75- All requests to Shaarli's API must include a **JWT token** to verify their authenticity.
76- This token must be included as an HTTP header called `Authentication: Bearer <jwt token>`.
77- JWT tokens are composed by three parts, separated by a dot `.` and encoded in base64:
78
79```
80[header].[payload].[signature]
81```
82
83##### Header
84
85Shaarli only allow one hash algorithm, so the header will always be the same:
86
87```json
88{
89 "typ": "JWT",
90 "alg": "HS512"
91}
92```
93
94Encoded in base64, it gives:
148 95
149### Python 96```
97ewogICAgICAgICJ0eXAiOiAiSldUIiwKICAgICAgICAiYWxnIjogIkhTNTEyIgogICAgfQ==
98```
99
100##### Payload
101
102Token expiration: To avoid infinite token validity, JWT tokens must include their creation date in UNIX timestamp format (timezone independent - UTC) under the key `iat` (issued at) field ([1](https://tools.ietf.org/html/rfc7519#section-4.1.6)). This token will be valid during **9 minutes**.
103
104```json
105{
106 "iat": 1468663519
107}
108```
109
110##### Signature
111
112The signature authenticates the token validity. It contains the base64 of the header and the body, separated by a dot `.`, hashed in SHA512 with the API secret available in Shaarli administration page.
113
114Example signature with PHP:
115
116```php
117$content = base64_encode($header) . '.' . base64_encode($payload);
118$signature = hash_hmac('sha512', $content, $secret);
119```
150 120
151See the reference API client:
152 121
153- [Documentation](http://python-shaarli-client.readthedocs.io/en/latest/) on ReadTheDocs
154- [python-shaarli-client](https://github.com/shaarli/python-shaarli-client) on Github
155 122
156## Troubleshooting 123## Troubleshooting
157 124
@@ -171,3 +138,13 @@ to get the actual error message in the HTTP response body with:
171 } 138 }
172} 139}
173``` 140```
141
142## References
143
144- [jwt.io](https://jwt.io) (including a list of client per language).
145- [RFC - JSON Web Token (JWT)](https://tools.ietf.org/html/rfc7519)
146- [JSON Web Tokens (JWT) vs Sessions](https://float-middle.com/json-web-tokens-jwt-vs-sessions/), [HackerNews thread](https://news.ycombinator.com/item?id=11929267)
147
148
149
150
diff --git a/doc/md/RSS-feeds.md b/doc/md/RSS-feeds.md
deleted file mode 100644
index ecbff09a..00000000
--- a/doc/md/RSS-feeds.md
+++ /dev/null
@@ -1,28 +0,0 @@
1### Feeds options
2
3Feeds are available in ATOM with `/feed/atom` and RSS with `/feed/rss`.
4
5Options:
6
7- You can use `permalinks` in the feed URL to get permalink to Shaares instead of direct link to shaared URL.
8 - E.G. `https://my.shaarli.domain/feed/atom?permalinks`.
9- You can use `nb` parameter in the feed URL to specify the number of Shaares you want in a feed (default if not specified: `50`). The keyword `all` is available if you want everything.
10 - `https://my.shaarli.domain/feed/atom?permalinks&nb=42`
11 - `https://my.shaarli.domain/feed/atom?permalinks&nb=all`
12
13### RSS Feeds or Picture Wall for a specific search/tag
14
15It is possible to filter RSS/ATOM feeds and Picture Wall on a Shaarli to **only display results of a specific search, or for a specific tag**.
16
17For example, if you want to subscribe only to links tagged `photography`:
18
19- Go to the desired Shaarli instance.
20- Search for the `photography` tag in the _Filter by tag_ box. Links tagged `photography` are displayed.
21- Click on the `RSS Feed` button.
22- You are presented with an RSS feed showing only these links. Subscribe to it to receive only updates with this tag.
23- The same method **also works for a full-text search** (_Search_ box) **and for the Picture Wall** (want to only see pictures about `nature`?)
24- You can also build the URLs manually:
25 - `https://my.shaarli.domain/?do=rss&searchtags=nature`
26 - `https://my.shaarli.domain/links/picture-wall?searchterm=poney`
27
28![](images/rss-filter-1.png) ![](images/rss-filter-2.png)
diff --git a/doc/md/Release-Shaarli.md b/doc/md/Release-Shaarli.md
deleted file mode 100644
index e22eabc9..00000000
--- a/doc/md/Release-Shaarli.md
+++ /dev/null
@@ -1,161 +0,0 @@
1See [Git - Maintaining a project - Tagging your
2releases](http://git-scm.com/book/en/v2/Distributed-Git-Maintaining-a-Project#Tagging-Your-Releases).
3
4## Prerequisites
5This guide assumes that you have:
6
7- a GPG key matching your GitHub authentication credentials
8 - i.e., the email address identified by the GPG key is the same as the one in your `~/.gitconfig`
9- a GitHub fork of Shaarli
10- a local clone of your Shaarli fork, with the following remotes:
11 - `origin` pointing to your GitHub fork
12 - `upstream` pointing to the main Shaarli repository
13- maintainer permissions on the main Shaarli repository, to:
14 - push the signed tag
15 - create a new release
16- [Composer](https://getcomposer.org/) needs to be installed
17- The [venv](https://docs.python.org/3/library/venv.html) Python 3 module needs to be installed for HTML documentation generation.
18
19## GitHub release draft and `CHANGELOG.md`
20See http://keepachangelog.com/en/0.3.0/ for changelog formatting.
21
22### GitHub release draft
23GitHub allows drafting the release note for the upcoming release, from the [Releases](https://github.com/shaarli/Shaarli/releases) page. This way, the release note can be drafted while contributions are merged to `master`.
24
25### `CHANGELOG.md`
26This file should contain the same information as the release note draft for the upcoming version.
27
28Update it to:
29
30- add new entries (additions, fixes, etc.)
31- mark the current version as released by setting its date and link
32- add a new section for the future unreleased version
33
34```bash
35$ cd /path/to/shaarli
36
37$ nano CHANGELOG.md
38
39[...]
40## vA.B.C - UNRELEASED
41TBA
42
43## [vX.Y.Z](https://github.com/shaarli/Shaarli/releases/tag/vX.Y.Z) - YYYY-MM-DD
44[...]
45```
46
47
48## Increment the version code, update docs, create and push a signed tag
49### Update the list of Git contributors
50```bash
51$ make authors
52$ git commit -s -m "Update AUTHORS"
53```
54
55### Create and merge a Pull Request
56This one is pretty straightforward ;-)
57
58### Bump Shaarli version to v0.x branch
59
60```bash
61$ git checkout master
62$ git fetch upstream
63$ git pull upstream master
64
65# IF the branch doesn't exists
66$ git checkout -b v0.5
67# OR if the branch already exists
68$ git checkout v0.5
69$ git rebase upstream/master
70
71# Bump shaarli version from dev to 0.5.0, **without the `v`**
72$ vim shaarli_version.php
73$ git add shaarli_version
74$ git commit -s -m "Bump Shaarli version to v0.5.0"
75$ git push upstream v0.5
76```
77
78### Create and push a signed tag
79```bash
80# update your local copy
81$ git checkout v0.5
82$ git fetch upstream
83$ git pull upstream v0.5
84
85# create a signed tag
86$ git tag -s -m "Release v0.5.0" v0.5.0
87
88# push it to "upstream"
89$ git push --tags upstream
90```
91
92### Verify a signed tag
93[`v0.5.0`](https://github.com/shaarli/Shaarli/releases/tag/v0.5.0) is the first GPG-signed tag pushed on the Community Shaarli.
94
95Let's have a look at its signature!
96
97```bash
98$ cd /path/to/shaarli
99$ git fetch upstream
100
101# get the SHA1 reference of the tag
102$ git show-ref tags/v0.5.0
103f7762cf803f03f5caf4b8078359a63783d0090c1 refs/tags/v0.5.0
104
105# verify the tag signature information
106$ git verify-tag f7762cf803f03f5caf4b8078359a63783d0090c1
107gpg: Signature made Thu 30 Jul 2015 11:46:34 CEST using RSA key ID 4100DF6F
108gpg: Good signature from "VirtualTam <virtualtam@flibidi.net>" [ultimate]
109```
110
111## Publish the GitHub release
112### Update release badges
113Update `README.md` so version badges display and point to the newly released Shaarli version(s), in the `master` branch.
114
115### Create a GitHub release from a Git tag
116From the previously drafted release:
117
118- edit the release notes (if needed)
119- specify the appropriate Git tag
120- publish the release
121- profit!
122
123### Generate and upload all-in-one release archives
124Users with a shared hosting may have:
125
126- no SSH access
127- no possibility to install PHP packages or server extensions
128- no possibility to run scripts
129
130To ease Shaarli installations, it is possible to generate and upload additional release archives,
131that will contain Shaarli code plus all required third-party libraries.
132
133**From the `v0.5` branch:**
134
135```bash
136$ make release_archive
137```
138
139This will create the following archives:
140
141- `shaarli-vX.Y.Z-full.tar`
142- `shaarli-vX.Y.Z-full.zip`
143
144The archives need to be manually uploaded on the previously created GitHub release.
145
146### Update `stable` and `latest` branches
147
148```
149$ git checkout latest
150# latest release
151$ git merge v0.5.0
152# fix eventual conflicts
153$ make test
154$ git push upstream latest
155$ git checkout stable
156# latest previous major
157$ git merge v0.4.5
158# fix eventual conflicts
159$ make test
160$ git push upstream stable
161```
diff --git a/doc/md/Reverse-proxy.md b/doc/md/Reverse-proxy.md
new file mode 100644
index 00000000..b7e347d5
--- /dev/null
+++ b/doc/md/Reverse-proxy.md
@@ -0,0 +1,141 @@
1# Reverse proxy
2
3If Shaarli is hosted on a server behind a [reverse proxy](https://en.wikipedia.org/wiki/Reverse_proxy) (i.e. there is a proxy server between clients and the web server hosting Shaarli), configure it accordingly. See [Reverse proxy](Reverse-proxy.md) configuration. In this example:
4
5- The Shaarli application server exposes port `10080` to the proxy (for example docker container started with `--publish 127.0.0.1:10080:80`).
6- The Shaarli application server runs at `127.0.0.1` (container). Replace with the server's IP address if running on a different machine.
7- Shaarli's Fully Qualified Domain Name (FQDN) is `shaarli.mydomain.org`.
8- No HTTPS is setup on the application server, SSL termination is done at the reverse proxy.
9
10In your [Shaarli configuration](Shaarli-configuration) `data/config.json.php`, add the public IP of your proxy under `security.trusted_proxies`.
11
12See also [proxy-related](https://github.com/shaarli/Shaarli/issues?utf8=%E2%9C%93&q=label%3Aproxy+) issues.
13
14
15## Apache
16
17```apache
18<VirtualHost *:80>
19 ServerName shaarli.mydomain.org
20
21 # For SSL/TLS certificates acquired with certbot or self-signed certificates
22 # Redirect HTTP requests to HTTPS, except Let's Encrypt ACME challenge requests
23 RewriteEngine on
24 RewriteRule ^.well-known/acme-challenge/ - [L]
25 RewriteCond %{HTTP_HOST} =shaarli.mydomain.org
26 RewriteRule ^ https://shaarli.mydomain.org%{REQUEST_URI} [END,NE,R=permanent]
27</VirtualHost>
28
29# SSL/TLS configuration for Let's Encrypt certificates managed with mod_md
30#MDomain shaarli.mydomain.org
31#MDCertificateAgreement accepted
32#MDContactEmail admin@shaarli.mydomain.org
33#MDPrivateKeys RSA 4096
34
35<VirtualHost *:443>
36 ServerName shaarli.mydomain.org
37
38 # SSL/TLS configuration for Let's Encrypt certificates acquired with certbot standalone
39 SSLEngine on
40 SSLCertificateFile /etc/letsencrypt/live/shaarli.mydomain.org/fullchain.pem
41 SSLCertificateKeyFile /etc/letsencrypt/live/shaarli.mydomain.org/privkey.pem
42 # Let's Encrypt settings from https://github.com/certbot/certbot/blob/master/certbot-apache/certbot_apache/_internal/tls_configs/current-options-ssl-apache.conf
43 SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
44 SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
45 SSLHonorCipherOrder off
46 SSLSessionTickets off
47 SSLOptions +StrictRequire
48
49 # SSL/TLS configuration for self-signed certificates
50 #SSLEngine on
51 #SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
52 #SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
53
54 # let the proxied shaarli server/container know HTTPS URLs should be served
55 RequestHeader set X-Forwarded-Proto "https"
56
57 # send the original SERVER_NAME to the proxied host
58 ProxyPreserveHost On
59
60 # pass requests to the proxied host
61 # sets X-Forwarded-For, X-Forwarded-Host and X-Forwarded-Server headers
62 ProxyPass / http://127.0.0.1:10080/
63 ProxyPassReverse / http://127.0.0.1:10080/
64</VirtualHost>
65```
66
67
68## HAProxy
69
70
71```conf
72global
73 [...]
74
75defaults
76 [...]
77
78frontend http-in
79 bind :80
80 redirect scheme https code 301 if !{ ssl_fc }
81 bind :443 ssl crt /path/to/cert.pem
82 default_backend shaarli
83
84backend shaarli
85 mode http
86 option http-server-close
87 option forwardfor
88 reqadd X-Forwarded-Proto: https
89 server shaarli1 127.0.0.1:10080
90```
91
92- [HAProxy documentation](https://cbonte.github.io/haproxy-dconv/)
93
94## Nginx
95
96
97```nginx
98http {
99 [...]
100
101 index index.html index.php;
102
103 root /home/john/web;
104 access_log /var/log/nginx/access.log combined;
105 error_log /var/log/nginx/error.log;
106
107 server {
108 listen 80;
109 server_name shaarli.mydomain.org;
110 # redirect HTTP to HTTPS
111 return 301 https://shaarli.mydomain.org$request_uri;
112 }
113
114 server {
115 listen 443 ssl http2;
116 server_name shaarli.mydomain.org;
117
118 ssl_certificate /path/to/certificate
119 ssl_certificate_key /path/to/private/key
120
121 location / {
122 proxy_set_header X-Real-IP $remote_addr;
123 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
124 proxy_set_header X-Forwarded-Proto $scheme;
125 proxy_set_header X-Forwarded-Host $host;
126
127 # pass requests to the proxied host
128 proxy_pass http://localhost:10080/;
129 proxy_set_header Host $host;
130 proxy_connect_timeout 30s;
131 proxy_read_timeout 120s;
132 }
133 }
134}
135```
136
137## References
138
139- [`X-Forwarded-Proto`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-Proto)
140- [`X-Forwarded-Host`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-Host)
141- [`X-Forwarded-For`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-For)
diff --git a/doc/md/Security.md b/doc/md/Security.md
deleted file mode 100644
index 65db4225..00000000
--- a/doc/md/Security.md
+++ /dev/null
@@ -1,25 +0,0 @@
1## Client browser
2- Shaarli relies on `HTTP_REFERER` for some functions (like redirects and clicking on tags). If you have disabled or masqueraded `HTTP_REFERER` in your browser, some features of Shaarli may not work
3
4## Server and sessions
5- Directories are protected using `.htaccess` files
6- Forms are protected against XSRF (Cross-site requests forgery):
7 - Forms which act on data (save,delete…) contain a token generated by the server.
8 - Any posted form which does not contain a valid token is rejected.
9 - Any token can only be used once.
10 - Tokens are attached to the session and cannot be reused in another session.
11- Sessions automatically expire after 60 minutes.
12- Sessions are protected against hijacking: the session ID cannot be used from a different IP address.
13
14## Shaarli datastore and configuration
15- The password is salted, hashed and stored in the data subdirectory, in a PHP file, and protected by htaccess. Even if the webserver does not support htaccess, the hash is not readable by URL. Even if the .php file is stolen, the password cannot deduced from the hash. The salt prevents rainbow-tables attacks.
16- Links are stored as an associative array which is serialized, compressed (with deflate), base64-encoded and saved as a comment in a `.php` file.
17- Even if the server does not support `.htaccess` files, the data file will still not be readable by URL.
18- The database looks like this:
19
20```php
21<?php /* zP1ZjxxJtiYIvvevEPJ2lDOaLrZv7o...
22...ka7gaco/Z+TFXM2i7BlfMf8qxpaSSYfKlvqv/x8= */ ?>
23```
24
25- Small hashes are used to make a link to an entry in Shaarli. They are unique. In fact, the date of the items (eg. `20110923_150523`) is hashed with CRC32, then converted to base64 and some characters are replaced. They are always 6 characters longs and use only `A-Z a-z 0-9 - _` and `@`.
diff --git a/doc/md/Server-configuration.md b/doc/md/Server-configuration.md
index f9ea2ed2..297d7c29 100644
--- a/doc/md/Server-configuration.md
+++ b/doc/md/Server-configuration.md
@@ -1,20 +1,46 @@
1# Server configuration
1 2
2- [Prerequisites](#prerequisistes) 3## Requirements
3- [Apache](#apache)
4- [Nginx](#nginx)
5- [Proxies](#proxies)
6- [See also](#see-also)
7 4
8## Prerequisites 5### Operating system and web server
9### Shaarli
10 6
11- A web server and PHP interpreter module/service have been installed. 7Shaarli can be hosted on dedicated/virtual servers, or shared hosting.
12- You have write access to the Shaarli installation directory. 8
13- The correct read/write permissions have been granted to the web server user and group. 9You need write access to the Shaarli installation directory - you should have received instructions from your hosting provider on how to connect to the server using SSH (or FTP for shared hosts).
14- Your PHP interpreter is compatible with supported PHP versions: 10
11Examples in this documentation are given for [Debian](https://www.debian.org/), a GNU/Linux distribution widely used in server environments. Please adapt them to your specific Linux distribution.
12
13A $5/month VPS (1 CPU, 1 GiB RAM and 25 GiB SSD) will run any Shaarli installation without problems. Some hosting providers: [DigitalOcean](https://www.digitalocean.com/) ([1](https://www.digitalocean.com/docs/droplets/overview/), [2](https://www.digitalocean.com/pricing/), [3](https://www.digitalocean.com/docs/droplets/how-to/create/), [4](https://www.digitalocean.com/docs/droplets/how-to/add-ssh-keys/), [5](https://www.digitalocean.com/community/tutorials/initial-server-setup-with-debian-8), [6](https://www.digitalocean.com/community/tutorials/an-introduction-to-securing-your-linux-vps)), [Gandi](https://www.gandi.net/en), [OVH](https://www.ovh.co.uk/), [RackSpace](https://www.rackspace.com/), etc.
14
15
16### Network and domain name
17
18Try to host the server in a region that is geographically close to your users.
19
20A **domain name** ([DNS record](https://opensource.com/article/17/4/introduction-domain-name-system-dns)) pointing to the server's public IP address is required to obtain a SSL/TLS certificate and setup HTTPS to secure client traffic to your Shaarli instance.
21
22You can obtain a domain name from a [registrar](https://en.wikipedia.org/wiki/Domain_name_registrar) ([1](https://www.ovh.co.uk/domains), [2](https://www.gandi.net/en/domain)), or from free subdomain providers ([1](https://freedns.afraid.org/)). If you don't have a domain name, please set up a private domain name ([FQDN](ttps://en.wikipedia.org/wiki/Fully_qualified_domain_name)) in your clients' [hosts files](https://en.wikipedia.org/wiki/Hosts_(file)) to access the server (direct access by IP address can result in unexpected behavior).
23
24Setup a **firewall** (using `iptables`, [ufw](https://www.digitalocean.com/community/tutorials/how-to-set-up-a-firewall-with-ufw-on-debian-10), [fireHOL](https://firehol.org/) or any frontend of your choice) to deny all incoming traffic except `tcp/80` and `tcp/443`, which are needed to access the web server (and any other posrts you might need, like SSH). If the server is in a private network behind a NAT, ensure these **ports are forwarded** to the server.
25
26Shaarli makes outbound HTTP/HTTPS connections to websites you bookmark to fetch page information (title, thumbnails), the server must then have access to the Internet as well, and a working DNS resolver.
27
28
29### Screencast
30
31Here is a screencast of the installation procedure
32
33[![asciicast](https://asciinema.org/a/z3RXxcJIRgWk0jM2ws6EnUFgO.svg)](https://asciinema.org/a/z3RXxcJIRgWk0jM2ws6EnUFgO)
34
35--------------------------------------------------------------------------------
36
37### PHP
38
39Supported PHP versions:
15 40
16Version | Status | Shaarli compatibility 41Version | Status | Shaarli compatibility
17:---:|:---:|:---: 42:---:|:---:|:---:
437.3 | Supported | Yes
187.2 | Supported | Yes 447.2 | Supported | Yes
197.1 | Supported | Yes 457.1 | Supported | Yes
207.0 | EOL: 2018-12-03 | Yes (up to Shaarli 0.10.x) 467.0 | EOL: 2018-12-03 | Yes (up to Shaarli 0.10.x)
@@ -23,420 +49,398 @@ Version | Status | Shaarli compatibility
235.4 | EOL: 2015-09-14 | Yes (up to Shaarli 0.8.x) 495.4 | EOL: 2015-09-14 | Yes (up to Shaarli 0.8.x)
245.3 | EOL: 2014-08-14 | Yes (up to Shaarli 0.8.x) 505.3 | EOL: 2014-08-14 | Yes (up to Shaarli 0.8.x)
25 51
26- The following PHP extensions are installed on the server: 52Required PHP extensions:
27 53
28Extension | Required? | Usage 54Extension | Required? | Usage
29---|:---:|--- 55---|:---:|---
30[`openssl`](http://php.net/manual/en/book.openssl.php) | All | OpenSSL, HTTPS 56[`openssl`](http://php.net/manual/en/book.openssl.php) | requires | OpenSSL, HTTPS
31[`php-json`](http://php.net/manual/en/book.json.php) | required | configuration parsing 57[`php-json`](http://php.net/manual/en/book.json.php) | required | configuration parsing
58[`php-simplexml`](https://www.php.net/manual/en/book.simplexml.php) | required | REST API (Slim framework)
32[`php-mbstring`](http://php.net/manual/en/book.mbstring.php) | CentOS, Fedora, RHEL, Windows, some hosting providers | multibyte (Unicode) string support 59[`php-mbstring`](http://php.net/manual/en/book.mbstring.php) | CentOS, Fedora, RHEL, Windows, some hosting providers | multibyte (Unicode) string support
33[`php-gd`](http://php.net/manual/en/book.image.php) | optional | required to use thumbnails 60[`php-gd`](http://php.net/manual/en/book.image.php) | optional | required to use thumbnails
34[`php-intl`](http://php.net/manual/en/book.intl.php) | optional | localized text sorting (e.g. `e->è->f`) 61[`php-intl`](http://php.net/manual/en/book.intl.php) | optional | localized text sorting (e.g. `e->è->f`)
35[`php-curl`](http://php.net/manual/en/book.curl.php) | optional | using cURL for fetching webpages and thumbnails in a more robust way 62[`php-curl`](http://php.net/manual/en/book.curl.php) | optional | using cURL for fetching webpages and thumbnails in a more robust way
36[`php-gettext`](http://php.net/manual/en/book.gettext.php) | optional | Use the translation system in gettext mode (faster) 63[`php-gettext`](http://php.net/manual/en/book.gettext.php) | optional | Use the translation system in gettext mode (faster)
37--------------------------------------------------------------------------------
38
39### SSL/TLS configuration
40 64
41To setup HTTPS / SSL on your webserver (recommended), you must generate a public/private **key pair** and a **certificate**, and install, configure and activate the appropriate **webserver SSL extension**. 65Some [plugins](Plugins.md) may require additional configuration.
42 66
43#### Let's Encrypt 67- [PHP: Supported versions](http://php.net/supported-versions.php)
68- [PHP: Unsupported versions (EOL/End-of-life)](http://php.net/eol.php)
69- [PHP 7 Changelog](http://php.net/ChangeLog-7.php)
70- [PHP 5 Changelog](http://php.net/ChangeLog-5.php)
71- [PHP: Bugs](https://bugs.php.net/)
44 72
45[Let's Encrypt](https://en.wikipedia.org/wiki/Let%27s_Encrypt) is a certificate authority that provides free TLS/X.509 certificates via an automated process.
46 73
47 * Install `certbot` using the appropriate method described on https://certbot.eff.org/. 74## SSL/TLS (HTTPS)
48
49Location of the `certbot` program and template configuration files may vary depending on which installation method was used. Change the file paths below accordingly. Here is an easy way to create a signed certificate using `certbot`, it assumes `certbot` was installed through APT on a Debian-based distribution:
50 75
51 * Stop the apache2/nginx service. 76We recommend setting up [HTTPS](https://en.wikipedia.org/wiki/HTTPS) (SSL/[TLS](https://en.wikipedia.org/wiki/Transport_Layer_Security)) on your webserver for secure communication between clients and the server.
52 * Run `certbot --agree-tos --standalone --preferred-challenges tls-sni --email "youremail@example.com" --domain yourdomain.example.com`
53 * For the Apache webserver, copy `/usr/lib/python2.7/dist-packages/certbot_apache/options-ssl-apache.conf` to `/etc/letsencrypt/options-ssl-apache.conf` (paths may vary depending on installation method)
54 * For Nginx: TODO
55 * Setup your webserver as described below
56 * Restart the apache2/nginx service.
57 77
58#### Self-signed certificates 78### Let's Encrypt
59 79
60If you don't want to request a certificate from Let's Encrypt, or are unable to (for example, webserver on a LAN, or domain name not registered in the public DNS system), you can generate a self-signed certificate. This certificate will trigger security warnings in web browsers, unless you add it to the browser's SSL store manually. 80For public-facing web servers this can be done using free SSL/TLS certificates from [Let's Encrypt](https://en.wikipedia.org/wiki/Let's_Encrypt), a non-profit certificate authority provididing free certificates.
61 81
62* Apache: run `make-ssl-cert generate-default-snakeoil --force-overwrite` 82 - [How to secure Apache with Let's Encrypt](https://www.digitalocean.com/community/tutorials/how-to-secure-apache-with-let-s-encrypt-on-debian-10)
63* Nginx: TODO 83 - [How to secure Nginx with Let's Encrypt](https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-debian-10)
84 - [How To Use Certbot Standalone Mode to Retrieve Let's Encrypt SSL Certificates](https://www.digitalocean.com/community/tutorials/how-to-use-certbot-standalone-mode-to-retrieve-let-s-encrypt-ssl-certificates-on-debian-10).
64 85
65-------------------------------------------------------------------------------- 86In short:
66 87
67## Apache 88```bash
89# install certbot
90sudo apt install certbot
68 91
69Here is a basic configuration example for the Apache web server with `mod_php`. 92# stop your webserver if you already have one running
93# certbot in standalone mode needs to bind to port 80 (only needed on initial generation)
94sudo systemctl stop apache2
95sudo systemctl stop nginx
70 96
71In `/etc/apache2/sites-available/shaarli.conf`: 97# generate initial certificates
98# Let's Encrypt ACME servers must be able to access your server! port forwarding and firewall must be properly configured
99sudo certbot certonly --standalone --noninteractive --agree-tos --email "admin@shaarli.mydomain.org" -d shaarli.mydomain.org
100# this will generate a private key and certificate at /etc/letsencrypt/live/shaarli.mydomain.org/{privkey,fullchain}.pem
72 101
73```apache 102# restart the web server
74<VirtualHost *:443> 103sudo systemctl start apache2
75 ServerName shaarli.my-domain.org 104sudo systemctl start nginx
76 DocumentRoot /absolute/path/to/shaarli/ 105```
77 106
78 # Logging 107On apache `2.4.43+`, you can also delegate LE certificate management to [mod_md](https://httpd.apache.org/docs/2.4/mod/mod_md.html) [[1](https://www.cyberciti.biz/faq/how-to-secure-apache-with-mod_md-lets-encrypt-on-ubuntu-20-04-lts/)] in which case you don't need certbot and manual SSL configuration in virtualhosts.
79 # Possible values include: debug, info, notice, warn, error, crit, alert, emerg.
80 LogLevel warn
81 ErrorLog /var/log/apache2/shaarli-error.log
82 CustomLog /var/log/apache2/shaarli-access.log combined
83 108
84 # Let's Encrypt SSL configuration (recommended) 109### Self-signed
85 SSLEngine on
86 SSLCertificateFile /etc/letsencrypt/live/yourdomain.example.com/fullchain.pem
87 SSLCertificateKeyFile /etc/letsencrypt/live/yourdomain.example.com/privkey.pem
88 Include /etc/letsencrypt/options-ssl-apache.conf
89 110
90 # Self-signed SSL cert configuration 111If you don't want to rely on a certificate authority, or the server can only be accessed from your own network, you can also generate self-signed certificates. Not that this will generate security warnings in web browsers/clients trying to access Shaarli:
91 #SSLEngine on
92 #SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
93 #SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
94 112
95 # Optional, log PHP errors, useful for debugging 113- [How To Create a Self-Signed SSL Certificate for Apache](https://www.digitalocean.com/community/tutorials/how-to-create-a-self-signed-ssl-certificate-for-apache-on-debian-10)
96 #php_flag log_errors on 114- [How To Create a Self-Signed SSL Certificate for Nginx](https://www.digitalocean.com/community/tutorials/how-to-create-a-self-signed-ssl-certificate-for-nginx-on-debian-10)
97 #php_flag display_errors on 115- [How to Create Self-Signed SSL Certificates with OpenSSL](http://www.xenocafe.com/tutorials/linux/centos/openssl/self_signed_certificates/index.php)
98 #php_value error_reporting 2147483647 116- [How do I create my own Certificate Authority?](https://workaround.org/certificate-authority)
99 #php_value error_log /var/log/apache2/shaarli-php-error.log
100 117
101 <Directory /absolute/path/to/shaarli/> 118--------------------------------------------------------------------------------
102 #Required for .htaccess support
103 AllowOverride All
104 Order allow,deny
105 Allow from all
106 119
107 Options Indexes FollowSymLinks MultiViews #TODO is Indexes/Multiviews required? 120## Examples
108 121
109 # Optional - required for playvideos plugin 122The following examples assume a Debian-based operating system is installed. On other distributions you may have to adapt details such as package installation procedures, configuration file locations, and webserver username/group (`www-data` or `httpd` are common values). In these examples we assume the document root for your web server/virtualhost is at `/var/www/shaarli.mydomain.org/`:
110 #Header set Content-Security-Policy "script-src 'self' 'unsafe-inline' https://www.youtube.com https://s.ytimg.com 'unsafe-eval'"
111 </Directory>
112 123
113</VirtualHost> 124```bash
125# create the document root (replace with your own domain name)
126sudo mkdir -p /var/www/shaarli.mydomain.org/
114``` 127```
115 128
116Enable this configuration with `sudo a2ensite shaarli` 129You can install Shaarli at the root of your virtualhost, or in a subdirectory as well. See [Directory structure](Directory-structure)
117 130
118_Note: If you use Apache 2.2 or lower, you need [mod_version](https://httpd.apache.org/docs/current/mod/mod_version.html) to be installed and enabled._
119 131
120_Note: Apache module `mod_rewrite` must be enabled to use the REST API._ 132### Apache
121 133
134```bash
135# Install apache + mod_php and PHP modules
136sudo apt update
137sudo apt install apache2 libapache2-mod-php php-json php-mbstring php-gd php-intl php-curl php-gettext
122 138
123## Nginx 139# Edit the virtualhost configuration file with your favorite editor (replace the example domain name)
140sudo nano /etc/apache2/sites-available/shaarli.mydomain.org.conf
141```
124 142
125Here is a basic configuration example for the Nginx web server, using the [php-fpm](http://php-fpm.org) PHP FastCGI Process Manager, and Nginx's [FastCGI](https://en.wikipedia.org/wiki/FastCGI) module. 143```apache
144<VirtualHost *:80>
145 ServerName shaarli.mydomain.org
146 DocumentRoot /var/www/shaarli.mydomain.org/
147
148 # For SSL/TLS certificates acquired with certbot or self-signed certificates
149 # Redirect HTTP requests to HTTPS, except Let's Encrypt ACME challenge requests
150 RewriteEngine on
151 RewriteRule ^.well-known/acme-challenge/ - [L]
152 RewriteCond %{HTTP_HOST} =shaarli.mydomain.org
153 RewriteRule ^ https://shaarli.mydomain.org%{REQUEST_URI} [END,NE,R=permanent]
154</VirtualHost>
126 155
127<!--- TODO refactor everything below this point ---> 156# SSL/TLS configuration for Let's Encrypt certificates managed with mod_md
157#MDomain shaarli.mydomain.org
158#MDCertificateAgreement accepted
159#MDContactEmail admin@shaarli.mydomain.org
160#MDPrivateKeys RSA 4096
161
162<VirtualHost *:443>
163 ServerName shaarli.mydomain.org
164 DocumentRoot /var/www/shaarli.mydomain.org/
128 165
129### Common setup 166 # SSL/TLS configuration for Let's Encrypt certificates acquired with certbot standalone
130Once Nginx and PHP-FPM are installed, we need to ensure: 167 SSLEngine on
168 SSLCertificateFile /etc/letsencrypt/live/shaarli.mydomain.org/fullchain.pem
169 SSLCertificateKeyFile /etc/letsencrypt/live/shaarli.mydomain.org/privkey.pem
170 # Let's Encrypt settings from https://github.com/certbot/certbot/blob/master/certbot-apache/certbot_apache/_internal/tls_configs/current-options-ssl-apache.conf
171 SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
172 SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
173 SSLHonorCipherOrder off
174 SSLSessionTickets off
175 SSLOptions +StrictRequire
176
177 # SSL/TLS configuration for self-signed certificates
178 #SSLEngine on
179 #SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
180 #SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
131 181
132- Nginx and PHP-FPM are running using the _same user and group_ 182 # Optional, log PHP errors, useful for debugging
133- both these user and group have 183 #php_flag log_errors on
134 - `read` permissions for Shaarli resources 184 #php_flag display_errors on
135 - `execute` permissions for Shaarli directories _AND_ their parent directories 185 #php_value error_reporting 2147483647
186 #php_value error_log /var/log/apache2/shaarli-php-error.log
136 187
137On a production server: 188 <Directory /var/www/shaarli.mydomain.org/>
189 # Required for .htaccess support
190 AllowOverride All
191 Require all granted
192 </Directory>
138 193
139- `user:group` will likely be `http:http`, `www:www` or `www-data:www-data` 194 <LocationMatch "/\.">
140- files will be located under `/var/www`, `/var/http` or `/usr/share/nginx` 195 # Prevent accessing dotfiles
196 RedirectMatch 404 ".*"
197 </LocationMatch>
141 198
142On a development server: 199 <LocationMatch "\.(?:ico|css|js|gif|jpe?g|png)$">
200 # allow client-side caching of static files
201 Header set Cache-Control "max-age=2628000, public, must-revalidate, proxy-revalidate"
202 </LocationMatch>
143 203
144- files may be located in a user's home directory 204 # serve the Shaarli favicon from its custom location
145- in this case, make sure both Nginx and PHP-FPM are running as the local user/group! 205 Alias favicon.ico /var/www/shaarli.mydomain.org/images/favicon.ico
146 206
147For all following configuration examples, this user/group pair will be used: 207</VirtualHost>
208```
148 209
149- `user:group = john:users`, 210```bash
211# Enable the virtualhost
212sudo a2ensite shaarli.mydomain.org
150 213
151which corresponds to the following service configuration: 214# mod_ssl must be enabled to use TLS/SSL certificates
215# https://httpd.apache.org/docs/current/mod/mod_ssl.html
216sudo a2enmod ssl
152 217
153```ini 218# mod_rewrite must be enabled to use the REST API
154; /etc/php/php-fpm.conf 219# https://httpd.apache.org/docs/current/mod/mod_rewrite.html
155user = john 220sudo a2enmod rewrite
156group = users
157 221
158[...] 222# mod_headers must be enabled to set custom headers from the server config
159listen.owner = john 223sudo a2enmod headers
160listen.group = users
161```
162 224
163```nginx 225# mod_version must only be enabled if you use Apache 2.2 or lower
164# /etc/nginx/nginx.conf 226# https://httpd.apache.org/docs/current/mod/mod_version.html
165user john users; 227# sudo a2enmod version
166 228
167http { 229# restart the apache service
168 [...] 230sudo systemctl restart apache2
169}
170``` 231```
171 232
172### (Optional) Increase the maximum file upload size 233- [How to install the Apache web server](https://www.digitalocean.com/community/tutorials/how-to-install-the-apache-web-server-on-debian-10)
173Some bookmark dumps generated by web browsers can be _huge_ due to the presence of Base64-encoded images and favicons, as well as extra verbosity when nesting links in (sub-)folders. 234- [Apache/PHP - error log per VirtualHost - StackOverflow](http://stackoverflow.com/q/176)
235- [Apache - PHP: php_value vs php_admin_value and the use of php_flag explained](https://ma.ttias.be/php-php_value-vs-php_admin_value-and-the-use-of-php_flag-explained/)
236- [Server-side TLS (Apache) - Mozilla](https://wiki.mozilla.org/Security/Server_Side_TLS#Apache)
237- [Apache 2.4 documentation](https://httpd.apache.org/docs/2.4/)
238- [Apache mod_proxy](https://httpd.apache.org/docs/2.4/mod/mod_proxy.html)
239- [Apache Reverse Proxy Request Headers](https://httpd.apache.org/docs/2.4/mod/mod_proxy.html#x-headers)
174 240
175To increase upload size, you will need to modify both nginx and PHP configuration:
176 241
177```nginx 242### Nginx
178# /etc/nginx/nginx.conf
179 243
180http { 244This examples uses nginx and the [PHP-FPM](https://www.digitalocean.com/community/tutorials/how-to-install-linux-nginx-mariadb-php-lemp-stack-on-debian-10#step-3-%E2%80%94-installing-php-for-processing) PHP interpreter. Nginx and PHP-FPM must be running using the same user and group, here we assume the user/group to be `www-data:www-data`.
181 [...]
182 245
183 client_max_body_size 10m;
184 246
185 [...] 247```bash
186} 248# install nginx and php-fpm
187``` 249sudo apt update
188 250sudo apt install nginx php-fpm
189```ini
190# /etc/php/<PHP_VERSION>/fpm/php.ini
191 251
192[...] 252# Edit the virtualhost configuration file with your favorite editor
193post_max_size = 10M 253sudo nano /etc/nginx/sites-available/shaarli.mydomain.org
194[...]
195upload_max_filesize = 10M
196``` 254```
197 255
198### Minimal
199_WARNING: Use for development only!_
200
201```nginx 256```nginx
202user john users; 257server {
203worker_processes 1; 258 listen 80;
204events { 259 server_name shaarli.mydomain.org;
205 worker_connections 1024; 260
261 # redirect all plain HTTP requests to HTTPS
262 return 301 https://shaarli.mydomain.org$request_uri;
206} 263}
207 264
208http { 265server {
209 include mime.types; 266 # ipv4 listening port/protocol
210 default_type application/octet-stream; 267 listen 443 ssl http2;
211 keepalive_timeout 20; 268 # ipv6 listening port/protocol
212 269 listen [::]:443 ssl http2;
213 index index.html index.php; 270 server_name shaarli.mydomain.org;
214 271 root /var/www/shaarli.mydomain.org;
215 server { 272
216 listen 80; 273 # log file locations
217 server_name localhost; 274 # combined log format prepends the virtualhost/domain name to log entries
218 root /home/john/web; 275 access_log /var/log/nginx/access.log combined;
219 276 error_log /var/log/nginx/error.log;
220 access_log /var/log/nginx/access.log; 277
221 error_log /var/log/nginx/error.log; 278 # paths to private key and certificates for SSL/TLS
222 279 ssl_certificate /etc/ssl/shaarli.mydomain.org.crt;
223 location /shaarli/ { 280 ssl_certificate_key /etc/ssl/private/shaarli.mydomain.org.key;
224 try_files $uri /shaarli/index.php$is_args$args; 281
225 access_log /var/log/nginx/shaarli.access.log; 282 # Let's Encrypt SSL settings from https://github.com/certbot/certbot/blob/master/certbot-nginx/certbot_nginx/_internal/tls_configs/options-ssl-nginx.conf
226 error_log /var/log/nginx/shaarli.error.log; 283 ssl_session_cache shared:le_nginx_SSL:10m;
227 } 284 ssl_session_timeout 1440m;
228 285 ssl_session_tickets off;
229 location ~ (index)\.php$ { 286 ssl_protocols TLSv1.2 TLSv1.3;
230 try_files $uri =404; 287 ssl_prefer_server_ciphers off;
231 fastcgi_split_path_info ^(.+\.php)(/.+)$; 288 ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384";
232 fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock; 289
233 fastcgi_index index.php; 290 # increase the maximum file upload size if needed: by default nginx limits file upload to 1MB (413 Entity Too Large error)
234 include fastcgi.conf; 291 client_max_body_size 100m;
235 } 292
293 # relative path to shaarli from the root of the webserver
294 location / {
295 # default index file when no file URI is requested
296 index index.php;
297 try_files $uri /index.php$is_args$args;
236 } 298 }
237}
238```
239 299
240### Modular 300 location ~ (index)\.php$ {
241The previous setup is sufficient for development purposes, but has several major caveats: 301 try_files $uri =404;
302 # slim API - split URL path into (script_filename, path_info)
303 fastcgi_split_path_info ^(.+\.php)(/.+)$;
304 # pass PHP requests to PHP-FPM
305 fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
306 fastcgi_index index.php;
307 include fastcgi.conf;
308 }
242 309
243- every content that does not match the PHP rule will be sent to client browsers: 310 location ~ \.php$ {
244 - dotfiles - in our case, `.htaccess` 311 # deny access to all other PHP scripts
245 - temporary files, e.g. Vim or Emacs files: `index.php~` 312 # disable this if you host other PHP applications on the same virtualhost
246- asset / static resource caching is not optimized 313 deny all;
247- if serving several PHP sites, there will be a lot of duplication: `location /shaarli/`, `location /mysite/`, etc. 314 }
248 315
249To solve this, we will split Nginx configuration in several parts, that will be included when needed: 316 location ~ /\. {
317 # deny access to dotfiles
318 deny all;
319 }
250 320
251```nginx 321 location ~ ~$ {
252# /etc/nginx/deny.conf 322 # deny access to temp editor files, e.g. "script.php~"
253location ~ /\. { 323 deny all;
254 # deny access to dotfiles 324 }
255 access_log off;
256 log_not_found off;
257 deny all;
258}
259 325
260location ~ ~$ { 326 location = /favicon.ico {
261 # deny access to temp editor files, e.g. "script.php~" 327 # serve the Shaarli favicon from its custom location
262 access_log off; 328 alias /var/www/shaarli/images/favicon.ico;
263 log_not_found off; 329 }
264 deny all;
265}
266```
267 330
268```nginx 331 # allow client-side caching of static files
269# /etc/nginx/php.conf 332 location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {
270location ~ (index)\.php$ { 333 expires max;
271 # Slim - split URL path into (script_filename, path_info) 334 add_header Cache-Control "public, must-revalidate, proxy-revalidate";
272 try_files $uri =404; 335 # HTTP 1.0 compatibility
273 fastcgi_split_path_info ^(.+\.php)(/.+)$; 336 add_header Pragma public;
274 337 }
275 # filter and proxy PHP requests to PHP-FPM
276 fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
277 fastcgi_index index.php;
278 include fastcgi.conf;
279}
280 338
281location ~ \.php$ {
282 # deny access to all other PHP scripts
283 deny all;
284} 339}
285``` 340```
286 341
287```nginx 342```bash
288# /etc/nginx/static_assets.conf 343# enable the configuration/virtualhost
289location ~* \.(?:ico|css|js|gif|jpe?g|png)$ { 344sudo ln -s /etc/nginx/sites-available/shaarli.mydomain.org /etc/nginx/sites-enabled/shaarli.mydomain.org
290 expires max; 345# reload nginx configuration
291 add_header Pragma public; 346sudo systemctl reload nginx
292 add_header Cache-Control "public, must-revalidate, proxy-revalidate";
293}
294``` 347```
295 348
296```nginx 349- [How to install the Nginx web server](https://www.digitalocean.com/community/tutorials/how-to-install-nginx-on-debian-10)
297# /etc/nginx/nginx.conf 350- [Nginx Beginner's guide](http://nginx.org/en/docs/beginners_guide.html)
298[...] 351- [Nginx documentation](https://nginx.org/en/docs/)
299 352- [Nginx ngx_http_fastcgi_module](http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html)
300http { 353- [Nginx Pitfalls](http://wiki.nginx.org/Pitfalls)
301 [...] 354- [Nginx PHP configuration examples - Karl Blessing](http://kbeezie.com/nginx-configuration-examples/)
302 355- [Server-side TLS (Nginx) - Mozilla](https://wiki.mozilla.org/Security/Server_Side_TLS#Nginx)
303 root /home/john/web;
304 access_log /var/log/nginx/access.log;
305 error_log /var/log/nginx/error.log;
306 356
307 server {
308 # virtual host for a first domain
309 listen 80;
310 server_name my.first.domain.org;
311 357
312 location /shaarli/ {
313 # Slim - rewrite URLs
314 try_files $uri /shaarli/index.php$is_args$args;
315 358
316 access_log /var/log/nginx/shaarli.access.log; 359## Reverse proxies
317 error_log /var/log/nginx/shaarli.error.log;
318 }
319 360
320 location = /shaarli/favicon.ico { 361If Shaarli is hosted on a server behind a [reverse proxy](https://en.wikipedia.org/wiki/Reverse_proxy) (i.e. there is a proxy server between clients and the web server hosting Shaarli), configure it accordingly. See [Reverse proxy](Reverse-proxy.md) configuration.
321 # serve the Shaarli favicon from its custom location
322 alias /var/www/shaarli/images/favicon.ico;
323 }
324 362
325 include deny.conf;
326 include static_assets.conf;
327 include php.conf;
328 }
329 363
330 server {
331 # virtual host for a second domain
332 listen 80;
333 server_name second.domain.com;
334 364
335 location /minigal/ { 365## Allow import of large browser bookmarks export
336 access_log /var/log/nginx/minigal.access.log;
337 error_log /var/log/nginx/minigal.error.log;
338 }
339 366
340 include deny.conf; 367Web browser bookmark exports can be large due to the presence of base64-encoded images and favicons/long subfolder names. Edit the PHP configuration file.
341 include static_assets.conf;
342 include php.conf;
343 }
344}
345```
346 368
347### Redirect HTTP to HTTPS 369- Apache: `/etc/php/<PHP_VERSION>/apache2/php.ini`
348Assuming you have generated a (self-signed) key and certificate, and they are 370- Nginx + PHP-FPM: `/etc/php/<PHP_VERSION>/fpm/php.ini` (in addition to `client_max_body_size` in the [Nginx configuration](#nginx))
349located under `/home/john/ssl/localhost.{key,crt}`, it is pretty straightforward
350to set an HTTP (:80) to HTTPS (:443) redirection to force SSL/TLS usage.
351 371
352```nginx 372```ini
353# /etc/nginx/nginx.conf
354[...] 373[...]
374# (optional) increase the maximum file upload size:
375post_max_size = 100M
376[...]
377# (optional) increase the maximum file upload size:
378upload_max_filesize = 100M
379```
355 380
356http { 381To verify PHP settings currently set on the server, create a `phpinfo.php` in your webserver's document root
357 [...]
358
359 index index.html index.php;
360
361 root /home/john/web;
362 access_log /var/log/nginx/access.log;
363 error_log /var/log/nginx/error.log;
364
365 server {
366 listen 80;
367 server_name localhost;
368 382
369 return 301 https://localhost$request_uri; 383```bash
370 } 384# example
385echo '<?php phpinfo(); ?>' | sudo tee /var/www/shaarli.mydomain.org/phpinfo.php
386#give read-only access to this file to the webserver user
387sudo chown www-data:root /var/www/shaarli.mydomain.org/phpinfo.php
388sudo chmod 0400 /var/www/shaarli.mydomain.org/phpinfo.php
389```
371 390
372 server { 391Access the file from a web browser (eg. <https://shaarli.mydomain.org/phpinfo.php> and look at the _Loaded Configuration File_ and _Scan this dir for additional .ini files_ entries
373 listen 443 ssl;
374 server_name localhost;
375 392
376 ssl_certificate /home/john/ssl/localhost.crt; 393It is recommended to remove the `phpinfo.php` when no longer needed as it publicly discloses details about your webserver configuration.
377 ssl_certificate_key /home/john/ssl/localhost.key;
378 394
379 location /shaarli/ {
380 # Slim - rewrite URLs
381 try_files $uri /index.php$is_args$args;
382 395
383 access_log /var/log/nginx/shaarli.access.log; 396## Robots and crawlers
384 error_log /var/log/nginx/shaarli.error.log;
385 }
386 397
387 location = /shaarli/favicon.ico { 398To opt-out of indexing your Shaarli instance by search engines, create a `robots.txt` file at the root of your virtualhost:
388 # serve the Shaarli favicon from its custom location
389 alias /var/www/shaarli/images/favicon.ico;
390 }
391 399
392 include deny.conf; 400```
393 include static_assets.conf; 401User-agent: *
394 include php.conf; 402Disallow: /
395 }
396}
397``` 403```
398 404
399## Proxies 405By default Shaarli already disallows indexing of your local copy of the documentation by default, using `<meta name="robots">` HTML tags. Your Shaarli instance may still be indexed by various robots on the public Internet, that do not respect this header or the robots standard.
400
401If Shaarli is served behind a proxy (i.e. there is a proxy server between clients and the web server hosting Shaarli), please refer to the proxy server documentation for proper configuration. In particular, you have to ensure that the following server variables are properly set:
402 406
403- `X-Forwarded-Proto` 407- [Robots exclusion standard](https://en.wikipedia.org/wiki/Robots_exclusion_standard)
404- `X-Forwarded-Host` 408- [Introduction to robots.txt](https://support.google.com/webmasters/answer/6062608?hl=en)
405- `X-Forwarded-For` 409- [Robots meta tag, data-nosnippet, and X-Robots-Tag specifications](https://developers.google.com/search/reference/robots_meta_tag)
410- [About robots.txt](http://www.robotstxt.org)
411- [About the robots META tag](https://www.robotstxt.org/meta.html)
406 412
407In you [Shaarli configuration](Shaarli-configuration) `data/config.json.php`, add the public IP of your proxy under `security.trusted_proxies`.
408 413
409See also [proxy-related](https://github.com/shaarli/Shaarli/issues?utf8=%E2%9C%93&q=label%3Aproxy+) issues. 414## Fail2ban
410 415
411## Robots and crawlers 416[fail2ban](http://www.fail2ban.org/wiki/index.php/Main_Page) is an intrusion prevention framework that reads server (Apache, SSH, etc.) and uses `iptables` profiles to block brute-force attempts. You need to create a filter to detect shaarli login failures in logs, and a jail configuation to configure the behavior when failed login attempts are detected:
412 417
413Shaarli disallows indexing and crawling of your local documentation pages by search engines, using `<meta name="robots">` HTML tags. 418```ini
414Your Shaarli instance and other pages you host may still be indexed by various robots on the public Internet. 419# /etc/fail2ban/filter.d/shaarli-auth.conf
415You may want to setup a robots.txt file or other crawler control mechanism on your server. 420[INCLUDES]
416See [[1]](https://en.wikipedia.org/wiki/Robots_exclusion_standard), [[2]](https://support.google.com/webmasters/answer/6062608?hl=en) and [[3]](https://developers.google.com/search/reference/robots_meta_tag) 421before = common.conf
422[Definition]
423failregex = \s-\s<HOST>\s-\sLogin failed for user.*$
424ignoreregex =
425```
417 426
418## See also 427```ini
428# /etc/fail2ban/jail.local
429[shaarli-auth]
430enabled = true
431port = https,http
432filter = shaarli-auth
433logpath = /var/www/shaarli.mydomain.org/data/log.txt
434# allow 3 login attempts per IP address
435# (over a period specified by findtime = in /etc/fail2ban/jail.conf)
436maxretry = 3
437# permanently ban the IP address after reaching the limit
438bantime = -1
439```
419 440
420 * [Server security](Server-security.md) 441Then restart the service: `sudo systemctl restart fail2ban`
421 442
422#### Webservers
423 443
424- [Apache/PHP - error log per VirtualHost](http://stackoverflow.com/q/176) (StackOverflow) 444## What next?
425- [Apache - PHP: php_value vs php_admin_value and the use of php_flag explained](https://ma.ttias.be/php-php_value-vs-php_admin_value-and-the-use-of-php_flag-explained/)
426- [Server-side TLS (Apache)](https://wiki.mozilla.org/Security/Server_Side_TLS#Apache) (Mozilla)
427- [Nginx Beginner's guide](http://nginx.org/en/docs/beginners_guide.html)
428- [Nginx ngx_http_fastcgi_module](http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html)
429- [Nginx Pitfalls](http://wiki.nginx.org/Pitfalls)
430- [Nginx PHP configuration examples](http://kbeezie.com/nginx-configuration-examples/) (Karl Blessing)
431- [Server-side TLS (Nginx)](https://wiki.mozilla.org/Security/Server_Side_TLS#Nginx) (Mozilla)
432- [How to Create Self-Signed SSL Certificates with OpenSSL](http://www.xenocafe.com/tutorials/linux/centos/openssl/self_signed_certificates/index.php)
433- [How do I create my own Certificate Authority?](https://workaround.org/certificate-authority)
434
435#### PHP
436 445
437- [Travis configuration](https://github.com/shaarli/Shaarli/blob/master/.travis.yml) 446[Shaarli installation](Installation.md)
438- [PHP: Supported versions](http://php.net/supported-versions.php)
439- [PHP: Unsupported versions](http://php.net/eol.php) _(EOL - End Of Life)_
440- [PHP 7 Changelog](http://php.net/ChangeLog-7.php)
441- [PHP 5 Changelog](http://php.net/ChangeLog-5.php)
442- [PHP: Bugs](https://bugs.php.net/)
diff --git a/doc/md/Server-security.md b/doc/md/Server-security.md
deleted file mode 100644
index ea1b637d..00000000
--- a/doc/md/Server-security.md
+++ /dev/null
@@ -1,76 +0,0 @@
1## php.ini
2PHP settings are defined in:
3
4- a main configuration file, usually found under `/etc/php/$php_version/php.ini`; some distributions provide different configuration environments, e.g.
5 - `/etc/php/$php_version/cli/php.ini` - used when running console scripts
6 - `/etc/php/$php_version/apache2/php.ini` - used when a client requests PHP resources from Apache
7 - `/etc/php/$php_version/php-fpm.conf` - used when PHP requests are proxied to PHP-FPM
8- additional configuration files/entries, depending on the installed/enabled extensions:
9 - `/etc/php/conf.d/xdebug.ini`
10
11### Locate .ini files
12#### Console environment
13```bash
14$ php --ini
15Configuration File (php.ini) Path: /etc/php
16Loaded Configuration File: /etc/php/php.ini
17Scan for additional .ini files in: /etc/php/conf.d
18Additional .ini files parsed: /etc/php/conf.d/xdebug.ini
19```
20
21#### Server environment
22- create a `phpinfo.php` script located in a path supported by the web server, e.g.
23 - Apache (with user dirs enabled): `/home/myself/public_html/phpinfo.php`
24 - `/var/www/test/phpinfo.php`
25- make sure the script is readable by the web server user/group (usually, `www`, `www-data` or `httpd`)
26- access the script from a web browser
27- look at the _Loaded Configuration File_ and _Scan this dir for additional .ini files_ entries
28```php
29<?php phpinfo(); ?>
30```
31
32## fail2ban
33`fail2ban` is an intrusion prevention framework that reads server (Apache, SSH, etc.) and uses `iptables` profiles to block brute-force attempts:
34
35- [Official website](http://www.fail2ban.org/wiki/index.php/Main_Page)
36- [Source code](https://github.com/fail2ban/fail2ban)
37
38### Read Shaarli logs to ban IPs
39Example configuration:
40- allow 3 login attempts per IP address
41- after 3 failures, permanently ban the corresponding IP adddress
42
43`/etc/fail2ban/jail.local`
44```ini
45[shaarli-auth]
46enabled = true
47port = https,http
48filter = shaarli-auth
49logpath = /var/www/path/to/shaarli/data/log.txt
50maxretry = 3
51bantime = -1
52```
53
54`/etc/fail2ban/filter.d/shaarli-auth.conf`
55```ini
56[INCLUDES]
57before = common.conf
58[Definition]
59failregex = \s-\s<HOST>\s-\sLogin failed for user.*$
60ignoreregex =
61```
62
63## Robots - Restricting search engines and web crawler traffic
64
65Creating a `robots.txt` with the following contents at the root of your Shaarli installation will prevent _honest_ web crawlers from indexing each and every link and Daily page from a Shaarli instance, thus getting rid of a certain amount of unsollicited network traffic.
66
67```
68User-agent: *
69Disallow: /
70```
71
72See:
73
74- http://www.robotstxt.org
75- http://www.robotstxt.org/robotstxt.html
76- http://www.robotstxt.org/meta.html
diff --git a/doc/md/Shaarli-configuration.md b/doc/md/Shaarli-configuration.md
index 2462e20e..263fb761 100644
--- a/doc/md/Shaarli-configuration.md
+++ b/doc/md/Shaarli-configuration.md
@@ -1,126 +1,19 @@
1## Foreword 1# Shaarli configuration
2
3**Do not edit configuration options in index.php! Your changes would be lost.**
4 2
5Once your Shaarli instance is installed, the file `data/config.json.php` is generated: 3Once your Shaarli instance is installed, the file `data/config.json.php` is generated:
6* it contains all settings in JSON format, and can be edited to customize values
7* it defines which [plugins](Plugin-System) are enabled
8* its values override those defined in `index.php`
9* it is wrap in a PHP comment to prevent anyone accessing it, regardless of server configuration
10
11## File and directory permissions
12
13The server process running Shaarli must have:
14
15- `read` access to the following resources:
16 - PHP scripts: `index.php`, `application/*.php`, `plugins/*.php`
17 - 3rd party PHP and Javascript libraries: `inc/*.php`, `inc/*.js`
18 - static assets:
19 - CSS stylesheets: `inc/*.css`
20 - `images/*`
21 - RainTPL templates: `tpl/*.html`
22- `read`, `write` and `execution` access to the following directories:
23 - `cache` - thumbnail cache
24 - `data` - link data store, configuration options
25 - `pagecache` - Atom/RSS feed cache
26 - `tmp` - RainTPL page cache
27
28On a Linux distribution:
29
30- the web server user will likely be `www` or `http` (for Apache2)
31- it will be a member of a group of the same name: `www:www`, `http:http`
32- to give it access to Shaarli, either:
33 - unzip Shaarli in the default web server location (usually `/var/www/`) and set the web server user as the owner
34 - put users in the same group as the web server, and set the appropriate access rights
35- if you have a domain / subdomain to serve Shaarli, [configure the server](Server-configuration) accordingly
36
37## Configuration
38
39In `data/config.json.php`.
40
41See also [Plugin System](Plugin-System).
42
43### Credentials
44
45_These settings should not be edited_
46
47- **login**: Login username.
48- **hash**: Generated password hash.
49- **salt**: Password salt.
50
51### General
52
53- **title**: Shaarli's instance title.
54- **header_link**: Link to the homepage.
55- **links_per_page**: Number of shaares displayed per page.
56- **timezone**: See [the list of supported timezones](http://php.net/manual/en/timezones.php).
57- **enabled_plugins**: List of enabled plugins.
58- **default_note_title**: Default title of a new note.
59- **retrieve_description** (boolean): If set to true, for every new links Shaarli will try
60to retrieve the description and keywords from the HTML meta tags.
61
62### Security
63
64- **session_protection_disabled**: Disable session cookie hijacking protection (not recommended).
65 It might be useful if your IP adress often changes.
66- **ban_after**: Failed login attempts before being IP banned.
67- **ban_duration**: IP ban duration in seconds.
68- **open_shaarli**: Anyone can add a new link while logged out if enabled.
69- **trusted_proxies**: List of trusted IP which won't be banned after failed login attemps. Useful if Shaarli is behind a reverse proxy.
70- **allowed_protocols**: List of allowed protocols in shaare URLs or markdown-rendered descriptions. Useful if you want to store `javascript:` links (bookmarklets) in Shaarli (default: `["ftp", "ftps", "magnet"]`).
71
72### Resources
73 4
74- **data_dir**: Data directory. 5- it contains all settings in JSON format, and can be edited to customize values
75- **datastore**: Shaarli's links database file path. 6- it defines which [plugins](Plugins.md) are enabled
76- **history**: Shaarli's operation history file path. 7- its values override those defined in `index.php`
77- **updates**: File path for the ran updates file. 8- it is wrapped in a PHP comment so that its contents are never served by the web server, regardless of configuration
78- **log**: Log file path.
79- **update_check**: Last update check file path.
80- **raintpl_tpl**: Templates directory.
81- **raintpl_tmp**: Template engine cache directory.
82- **thumbnails_cache**: Thumbnails cache directory.
83- **page_cache**: Shaarli's internal cache directory.
84- **ban_file**: Banned IP file path.
85 9
86### Translation 10**Do not edit configuration options in index.php! Your changes would be lost.**
87 11
88- **language**: translation language (also see [Translations](Translations)) 12## Tools menu
89 - **auto** (default): The translation language is chosen from the browser locale.
90 It means that the language can be different for 2 different visitors depending on their locale.
91 - **en**: Use the English translation.
92 - **fr**: Use the French translation.
93- **mode**:
94 - **auto** or **php** (default): Use the PHP implementation of gettext (slower)
95 - **gettext**: Use PHP builtin gettext extension
96 (faster, but requires `php-gettext` to be installed and to reload the web server on update)
97- **extension**: Translation extensions for custom themes or plugins.
98Must be an associative array: `translation domain => translation path`.
99
100### Updates
101
102- **check_updates**: Enable or disable update check to the git repository.
103- **check_updates_branch**: Git branch used to check updates (e.g. `stable` or `master`).
104- **check_updates_interval**: Look for new version every N seconds (default: every day).
105 13
106### Privacy 14Some settings can be configured directly from a web browser by accesing the `Tools` menu. Values are read/written to/from the configuration file.
107
108- **default_private_links**: Check the private checkbox by default for every new link.
109- **hide_public_links**: All links are hidden while logged out.
110- **force_login**: if **hide_public_links** and this are set to `true`, all anonymous users are redirected to the login page.
111- **hide_timestamps**: Timestamps are hidden.
112- **remember_user_default**: Default state of the login page's *remember me* checkbox
113 - `true`: checked by default, `false`: unchecked by default
114
115### Feed
116
117- **rss_permalinks**: Enable this to redirect RSS links to Shaarli's permalinks instead of shaared URL.
118- **show_atom**: Display ATOM feed button.
119
120### Thumbnail
121 15
122- **enable_thumbnails**: Enable or disable thumbnail display. 16![](https://i.imgur.com/boaaibC.png)
123- **enable_localcache**: Enable or disable local cache.
124 17
125### LDAP 18### LDAP
126 19
@@ -182,6 +75,9 @@ Must be an associative array: `translation domain => translation path`.
182 "title": "My Shaarli", 75 "title": "My Shaarli",
183 "header_link": "?" 76 "header_link": "?"
184 }, 77 },
78 "dev": {
79 "debug": false,
80 }
185 "extras": { 81 "extras": {
186 "show_atom": false, 82 "show_atom": false,
187 "hide_public_links": false, 83 "hide_public_links": false,
@@ -236,9 +132,90 @@ Must be an associative array: `translation domain => translation path`.
236} ?> 132} ?>
237``` 133```
238 134
239## Additional configuration 135## Settings
136
137### Credentials
138
139_These settings should not be edited_
140
141- **login**: Login username.
142- **hash**: Generated password hash.
143- **salt**: Password salt.
144
145### General
146
147- **title**: Shaarli's instance title.
148- **header_link**: Link to the homepage.
149- **links_per_page**: Number of Shaares displayed per page.
150- **timezone**: See [the list of supported timezones](http://php.net/manual/en/timezones.php).
151- **enabled_plugins**: List of enabled plugins.
152- **default_note_title**: Default title of a new note.
153- **retrieve_description** (boolean): If set to true, for every new Shaare Shaarli will try to retrieve the description and keywords from the HTML meta tags.
154- **root_url**: Overrides automatic discovery of Shaarli instance's URL (e.g.) `https://sub.domain.tld/shaarli-folder/`.
155
156### Security
157
158- **session_protection_disabled**: Disable session cookie hijacking protection (not recommended).
159 It might be useful if your IP adress often changes.
160- **ban_after**: Failed login attempts before being IP banned.
161- **ban_duration**: IP ban duration in seconds.
162- **open_shaarli**: Anyone can add a new Shaare while logged out if enabled.
163- **trusted_proxies**: List of trusted IP which won't be banned after failed login attemps. Useful if Shaarli is behind a reverse proxy.
164- **allowed_protocols**: List of allowed protocols in shaare URLs or markdown-rendered descriptions. Useful if you want to store `javascript:` links (bookmarklets) in Shaarli (default: `["ftp", "ftps", "magnet"]`).
165
166### Resources
167
168- **data_dir**: Data directory.
169- **datastore**: Shaarli's Shaares database file path.
170- **history**: Shaarli's operation history file path.
171- **updates**: File path for the ran updates file.
172- **log**: Log file path.
173- **update_check**: Last update check file path.
174- **raintpl_tpl**: Templates directory.
175- **raintpl_tmp**: Template engine cache directory.
176- **thumbnails_cache**: Thumbnails cache directory.
177- **page_cache**: Shaarli's internal cache directory.
178- **ban_file**: Banned IP file path.
179
180### Translation
181
182- **language**: translation language (also see [Translations](Translations))
183 - **auto** (default): The translation language is chosen from the browser locale.
184 It means that the language can be different for 2 different visitors depending on their locale.
185 - **en**: Use the English translation.
186 - **fr**: Use the French translation.
187- **mode**:
188 - **auto** or **php** (default): Use the PHP implementation of gettext (slower)
189 - **gettext**: Use PHP builtin gettext extension
190 (faster, but requires `php-gettext` to be installed and to reload the web server on update)
191- **extension**: Translation extensions for custom themes or plugins.
192Must be an associative array: `translation domain => translation path`.
193
194### Updates
195
196- **check_updates**: Enable or disable update check to the git repository.
197- **check_updates_branch**: Git branch used to check updates (e.g. `stable` or `master`).
198- **check_updates_interval**: Look for new version every N seconds (default: every day).
199
200### Privacy
201
202- **default_private_links**: Check the private checkbox by default for every new Shaare.
203- **hide_public_links**: All Shaares are hidden while logged out.
204- **force_login**: if **hide_public_links** and this are set to `true`, all anonymous users are redirected to the login page.
205- **hide_timestamps**: Timestamps are hidden.
206- **remember_user_default**: Default state of the login page's *remember me* checkbox
207 - `true`: checked by default, `false`: unchecked by default
208
209### Feed
210
211- **rss_permalinks**: Enable this to redirect RSS links to Shaarli's permalinks instead of shaared URL.
212- **show_atom**: Display ATOM feed button.
213
214### Thumbnail
215
216- **enable_thumbnails**: Enable or disable thumbnail display.
217- **enable_localcache**: Enable or disable local cache.
240 218
241The `playvideos` plugin may require that you adapt your server's 219## Plugins configuration
242[Content Security Policy](https://github.com/shaarli/Shaarli/blob/master/plugins/playvideos/README.md#troubleshooting)
243configuration to work properly.
244 220
221See [Plugins](Plugins.md)
diff --git a/doc/md/Sharing-content.md b/doc/md/Sharing-content.md
deleted file mode 100644
index 9a16fc62..00000000
--- a/doc/md/Sharing-content.md
+++ /dev/null
@@ -1,71 +0,0 @@
1Content posted to Shaarli is separated in items called _Shaares_. For each Shaare,
2you can customize the following aspects:
3
4 * URL to link to
5 * Title
6 * Free-text description
7 * Tags
8 * Public/private status
9
10--------------------------------------------------------------------------------
11
12## Adding new Shaares
13
14While logged in to your Shaarli, you can add new Shaares in several ways:
15
16 * [+Shaare button](#shaare-button)
17 * [Bookmarklet](#bookmarklet)
18 * Third-party [apps and browser addons](Community-&-Related-software.md#mobile-apps)
19 * [REST API](https://shaarli.github.io/api-documentation/)
20
21### +Shaare button
22
23 * While logged in to your Shaarli, click the **`+Shaare`** button located in the toolbar.
24 * Enter the URL of a link you want to share.
25 * Click `Add link`
26 * The `New Shaare` dialog appears, allowing you to fill in the details of your Shaare.
27 * The Description, Title, and Tags will help you find your Shaare later using tags or full-text search.
28 * You can also check the “Private” box so that the link is saved but only visible to you (the logged-in user).
29 * Click `Save`.
30
31<!-- TODO Add screenshot of add/edit link dialog -->
32
33### Bookmarklet
34
35The _Bookmarklet_ \[[1](https://en.wikipedia.org/wiki/Bookmarklet)\] is a special
36browser bookmark you can use to add new content to your Shaarli. This bookmarklet is
37compatible with Firefox, Opera, Chrome and Safari. To set it up:
38
39 * Access the `Tools` page from the button in the toolbar.
40 * Drag the **`✚Shaare link` button** to your browser's bookmarks bar.
41
42Once this is done, you can shaare any URL you are visiting simply by clicking the
43bookmarklet in your browser! The same `New Shaare` dialog as above is displayed.
44
45| Note | Websites which enforce Content Security Policy (CSP), such as github.com, disallow usage of bookmarklets. Unfortunately, there is nothing Shaarli can do about it. \[[1](https://github.com/shaarli/Shaarli/issues/196)]\ \[[2](https://bugzilla.mozilla.org/show_bug.cgi?id=866522)]\ \[[3](https://code.google.com/p/chromium/issues/detail?id=233903)]\ |
46|---------|---------|
47
48| Note | Under Opera, you can't drag'n drop the button: You have to right-click on it and add a bookmark to your personal toolbar. |
49|---------|---------|
50
51![](images/bookmarklet.png)
52
53
54--------------------------------------------------------------------------------
55
56## Editing Shaares
57
58Any Shaare can edited by clicking its ![](images/edit_icon.png) `Edit` button.
59
60Editing a Shaare will not change it's permalink, each permalink always points to the
61latest revision of a Shaare.
62
63--------------------------------------------------------------------------------
64
65## Using shaarli as a blog, notepad, pastebin...
66
67While adding or editing a link, leave the URL field blank to create a text-only
68("note") post. This allows you to post any kind of text content, such as blog
69articles, private or public notes, snippets... There is no character limit! You can
70access your Shaare from its permalink.
71
diff --git a/doc/md/Static-analysis.md b/doc/md/Static-analysis.md
deleted file mode 100644
index 29d98362..00000000
--- a/doc/md/Static-analysis.md
+++ /dev/null
@@ -1,13 +0,0 @@
1## WIP
2This topic is currently being discussed here:
3
4- [Fix coding style (static analysis)](https://github.com/shaarli/Shaarli/issues/95) (#95)
5- [Continuous Integration tools & features](https://github.com/shaarli/Shaarli/issues/130) (#130)
6
7### Usage
8Static analysis tools can be installed with Composer, and used through Shaarli's [Makefile](https://github.com/shaarli/Shaarli/blob/master/Makefile).
9
10For an overview of the available features, see:
11
12- [Code quality: Makefile to run static code checkers](https://github.com/shaarli/Shaarli/pull/124) (#124)
13- [Run PHPCS against different coding standards](https://github.com/shaarli/Shaarli/pull/276) (#276)
diff --git a/doc/md/Troubleshooting.md b/doc/md/Troubleshooting.md
index 01fd9840..e1ed5e00 100644
--- a/doc/md/Troubleshooting.md
+++ b/doc/md/Troubleshooting.md
@@ -1,5 +1,8 @@
1# Troubleshooting 1# Troubleshooting
2 2
3First of all, ensure that both the [web server](Server-configuration.md) and [Shaarli](Shaarli-configuration.md) are correctly configured.
4
5
3## Login 6## Login
4 7
5### I forgot my password! 8### I forgot my password!
@@ -8,38 +11,48 @@ Delete the file `data/config.json.php` and display the page again. You will be a
8 11
9### I'm locked out - Login bruteforce protection 12### I'm locked out - Login bruteforce protection
10 13
11Login form is protected against brute force attacks: 4 failed logins will ban the IP address from login for 30 minutes. Banned IPs can still browse links. 14Login form is protected against brute force attacks: 4 failed logins will ban the IP address from login for 30 minutes. Banned IPs can still browse Shaares.
12 15
13- To remove the current IP bans, delete the file `data/ipbans.php` 16- To remove the current IP bans, delete the file `data/ipbans.php`
14- To list all login attempts, see `data/log.txt` (succesful/failed logins, bans/lifted bans) 17- To list all login attempts, see `data/log.txt` (succesful/failed logins, bans/lifted bans)
15 18
19--------------------------------------
20
16## Browser issues 21## Browser issues
17 22
18### Redirection issues (HTTP Referer) 23### Redirection issues (HTTP Referer)
19 24
20Depending on its configuration and installed plugins, the browser may remove or alter (spoof) [HTTP referers](https://en.wikipedia.org/wiki/HTTP_referer), thus preventing Shaarli from properly redirecting between pages. Referer settings are available by browsing `about:config` and are documented [here](https://wiki.mozilla.org/Security/Referrer). `network.http.referer.spoofSource = true` in particular is known to break some functionality in Shaarli. 25Shaarli relies on `HTTP_REFERER` for some functions (like redirects and clicking on tags). If you have disabled or altered/spoofed [HTTP referers](https://en.wikipedia.org/wiki/HTTP_referer) in your browser, some features of Shaarli may not work as expected (depending on configuration and installed plugins), notably redirections between pages.
26
27Firefox Referer settings are available by browsing `about:config` and are documented [here](https://wiki.mozilla.org/Security/Referrer). `network.http.referer.spoofSource = true` in particular is known to break some functionality in Shaarli.
28
21 29
22### Firefox, localhost and redirections 30### Firefox, localhost and redirections
23 31
24`localhost` is not a proper Fully Qualified Domain Name (FQDN); if Firefox has been set up to spoof referers, or only accept requests from the same base domain/host, 32`localhost` is not a proper Fully Qualified Domain Name (FQDN); if Firefox has been set up to spoof referers, or only accept requests from the same base domain/host,
25Shaarli redirections will not work properly. To solve this, assign a local domain to your host, e.g. `localhost.lan` in your [hosts file](https://en.wikipedia.org/wiki/Hosts_(file)) and browse Shaarli at http://localhost.lan/. 33Shaarli redirections will not work properly. To solve this, assign a local domain to your host, e.g. `localhost.lan` in your [hosts file](https://en.wikipedia.org/wiki/Hosts_(file)) and browse Shaarli at http://localhost.lan/.
26 34
35-----------------------------------------
36
27## Hosting problems 37## Hosting problems
28 38
29### Old PHP versions 39### Old PHP versions
30 40
31On **free.fr**: free.fr now supports php 5.6.x([link](http://les.pages.perso.chez.free.fr/migrations/php5v6.io)) 41- On hosts (such as **free.fr**) which only support PHP 5.6, Shaarli [v0.10.4](https://github.com/shaarli/Shaarli/releases/tag/v0.10.4) is the maximum supported version. At the root of your webspace create a `sessions` directory and a `.htaccess` file containing:
32and so support now the tag autocompletion but you have to do the following.
33
34At the root of your webspace create a `sessions` directory and a `.htaccess` file containing:
35 42
36```xml 43```xml
37<IfDefine Free> 44<IfDefine Free>
38php56 1 45php56 1
39</IfDefine> 46</IfDefine>
47<Files ".ht*">
48Order allow,deny
49Deny from all
50Satisfy all
51</Files>
52Options -Indexes
40``` 53```
41 54
42- If you have an error such as: `Parse error: syntax error, unexpected '=', expecting '(' in /links/index.php on line xxx`, it means that your host is using php4, not php5. Shaarli requires php 5.1. Try changing the file extension to `.php5` 55- If you have an error such as: `Parse error: syntax error, unexpected '=', expecting '(' in /links/index.php on line xxx`, it means that your host is using PHP 4, not PHP 5. Shaarli requires PHP 5.1. Try changing the file extension to `.php5`
43- On **1and1** : If you add the link from the page (and not from the bookmarklet), Shaarli will no be able to get the title of the page. You will have to enter it manually. (Because they have disabled the ability to download a file through HTTP). 56- On **1and1** : If you add the link from the page (and not from the bookmarklet), Shaarli will no be able to get the title of the page. You will have to enter it manually. (Because they have disabled the ability to download a file through HTTP).
44- If you have the error `Warning: file_get_contents() [function.file-get-contents]: URL file-access is disabled in the server configuration in /…/index.php on line xxx`, it means that your host has disabled the ability to fetch a file by HTTP in the php config (Typically in 1and1 hosting). Bad host. Change host. Or comment the following lines: 57- If you have the error `Warning: file_get_contents() [function.file-get-contents]: URL file-access is disabled in the server configuration in /…/index.php on line xxx`, it means that your host has disabled the ability to fetch a file by HTTP in the php config (Typically in 1and1 hosting). Bad host. Change host. Or comment the following lines:
45 58
@@ -49,9 +62,11 @@ php56 1
49//if (strpos($status,'200 OK')) $title=html_extract_title($data); 62//if (strpos($status,'200 OK')) $title=html_extract_title($data);
50``` 63```
51 64
52- On hosts which forbid outgoing HTTP requests (such as free.fr), some thumbnails will not work. 65- On hosts (such as **free.fr**) which forbid outgoing HTTP requests, some thumbnails will not work.
66- On hosts (such as **free.fr**) which limit the number of FTP connections, setup your FTP client accordingly (else some files may be missing after upload).
53- On **lost-oasis**, RSS doesn't work correctly, because of this message at the begining of the RSS/ATOM feed : `<? // tout ce qui est charge ici (generalement des includes et require) est charge en permanence. ?>`. To fix this, remove this message from `php-include/prepend.php` 67- On **lost-oasis**, RSS doesn't work correctly, because of this message at the begining of the RSS/ATOM feed : `<? // tout ce qui est charge ici (generalement des includes et require) est charge en permanence. ?>`. To fix this, remove this message from `php-include/prepend.php`
54 68
69
55### Dates are not properly formatted 70### Dates are not properly formatted
56 71
57Shaarli tries to sniff the language of the browser (using `HTTP_ACCEPT_LANGUAGE` headers) 72Shaarli tries to sniff the language of the browser (using `HTTP_ACCEPT_LANGUAGE` headers)
@@ -71,11 +86,118 @@ This can be caused by several things:
71- You may be using OperaTurbo or OperaMini, which use their own proxies which may change from time to time. 86- You may be using OperaTurbo or OperaMini, which use their own proxies which may change from time to time.
72- If you have another application on the same webserver where Shaarli is installed, these application may forcefully expire php sessions. 87- If you have another application on the same webserver where Shaarli is installed, these application may forcefully expire php sessions.
73 88
89
74### Old apache versions, Internal Server Error 90### Old apache versions, Internal Server Error
75 91
76If you hosting provider only provides apache 2.2 and no support for `mod_version`, `.htaccess` files may cause 500 errors (Internal Server Error). See [this workaround](https://github.com/shaarli/Shaarli/issues/1196#issuecomment-412271085). 92If you hosting provider only provides apache 2.2 and no support for `mod_version`, `.htaccess` files may cause 500 errors (Internal Server Error). See [this workaround](https://github.com/shaarli/Shaarli/issues/1196#issuecomment-412271085).
77 93
78## Sessions do not seem to work correctly on your server 94
95### Sessions do not seem to work correctly on your server
79 96
80Follow the instructions in the error message. Make sure you are accessing shaarli via a direct IP address or a proper hostname. If you have **no dots** in the hostname (e.g. `localhost` or `http://my-webserver/shaarli/`), some browsers will not store cookies at all (this respects the [HTTP cookie specification](http://curl.haxx.se/rfc/cookie_spec.html)). 97Follow the instructions in the error message. Make sure you are accessing shaarli via a direct IP address or a proper hostname. If you have **no dots** in the hostname (e.g. `localhost` or `http://my-webserver/shaarli/`), some browsers will not store cookies at all (this respects the [HTTP cookie specification](http://curl.haxx.se/rfc/cookie_spec.html)).
81 98
99----------------------------------------------------------
100
101## Upgrades
102
103### You must specify an integer as a key
104
105In `v0.8.1` we changed how Shaare keys are handled (from timestamps to incremental integers). Take a look at `data/updates.txt` content.
106
107
108### `updates.txt` contains `updateMethodDatastoreIds`
109
110Try to delete it and refresh your page while being logged in.
111
112### `updates.txt` doesn't exist or doesn't contain `updateMethodDatastoreIds`
113
1141. Create `data/updates.txt` if it doesn't exist
1152. Paste this string in the update file `;updateMethodRenameDashTags;`
1163. Login to Shaarli
1174. Delete the update file
1185. Refresh
119
120
121
122--------------------------------------------------------
123
124## Import/export
125
126### Importing shaarli data to Firefox
127
128- In Firefox, open the bookmark manager (`Bookmarks menu > Show all bookmarks` or `Ctrl+Shift+B`), select `Import and Backup > Import bookmarks in HTML format`
129- Make sure the `Prepend note permalinks with this Shaarli instance's URL` box is checked when exporting, so that text-only/notes Shaares still point to the Shaarli instance you exported them from.
130- Depending on the number of bookmarks, the import can take some time.
131
132You may be interested in these Firefox addons to manage bookmarks imported from Shaarli
133
134- [Bookmark Deduplicator](https://addons.mozilla.org/en-US/firefox/addon/bookmark-deduplicator/) - provides an easy way to deduplicate your bookmarks
135- [TagSieve](https://addons.mozilla.org/en-US/firefox/addon/tagsieve/) - browse your bookmarks by their tags
136
137### Diigo
138
139If you export your bookmark from Diigo, make sure you use the Delicious export, not the Netscape export. (Their Netscape export is broken, and they don't seem to be interested in fixing it.)
140
141### Mister Wong
142
143See [this issue](https://github.com/sebsauvage/Shaarli/issues/146) for import tweaks.
144
145### SemanticScuttle
146
147To correctly import the tags from a [SemanticScuttle](http://semanticscuttle.sourceforge.net/) HTML export, edit the HTML file before importing and replace all occurences of `tags=` (lowercase) to `TAGS=` (uppercase).
148
149### Scuttle
150
151Shaarli cannot import data directly from [Scuttle](https://github.com/scronide/scuttle).
152
153However, you can use the third-party [scuttle-to-shaarli](https://github.com/q2apro/scuttle-to-shaarli)
154tool to export the Scuttle database to the Netscape HTML format compatible with the Shaarli importer.
155
156### Refind.com
157
158You can use the third-party tool [Derefind](https://github.com/ShawnPConroy/Derefind) to convert refind.com bookmark exports to a format that can be imported into Shaarli.
159
160
161-------------------------------------------------------
162
163## Other
164
165### The bookmarklet doesn't work
166
167Websites which enforce Content Security Policy (CSP), such as github.com, disallow usage of bookmarklets. Unfortunately, there is nothing Shaarli can do about it ([1](https://github.com/shaarli/Shaarli/issues/196), [2](https://bugzilla.mozilla.org/show_bug.cgi?id=866522), [3](https://code.google.com/p/chromium/issues/detail?id=233903).
168
169Under Opera, you can't drag'n drop the button: You have to right-click on it and add a bookmark to your personal toolbar.
170
171
172### Changing the timestamp for a shaare
173
174- Look for `<input type="hidden" name="lf_linkdate" value="{$link.linkdate}">` in `tpl/editlink.tpl` (line 14)
175- Replace `type="hidden"` with `type="text"` from this line
176- A new date/time field becomes available in the edit/new Shaare dialog.
177- You can set the timestamp manually by entering it in the format `YYYMMDD_HHMMS`.
178
179### Clearing Shaarli caches
180
181For debugging purposes:
182
183```bash
184# clear raintpl cache and temporary files
185find /var/www/links/cache/ /var/www/links/pagecache/ /var/www/links/tmp/ -type f -exec rm -v '{}' \;
186# if you have a php accelerator such as php-apcu, restart the webserver
187sudo systemctl restart apache2
188```
189
190-------------------------------------------------------
191
192## Support
193
194If the solutions above did not help, please:
195
196- Come and ask question on the [Gitter chat](https://gitter.im/shaarli/Shaarli) (also reachable via [IRC](https://irc.gitter.im/))
197- Search for [issues](https://github.com/shaarli/Shaarli/issues) and [Pull Requests](https://github.com/shaarli/Shaarli/pulls)
198 - if you find one that is related to the issue, feel free to comment and provide additional details (host/Shaarli setup...)
199 - check issues labeled [`feature`](https://github.com/shaarli/Shaarli/labels/feature), [`enhancement`](https://github.com/shaarli/Shaarli/labels/enhancement), and [`plugin`](https://github.com/shaarli/Shaarli/labels/plugin) if you would like a feature added to Shaarli.
200 - else, [open a new issue](https://github.com/shaarli/Shaarli/issues/new), and provide information about the problem:
201 - _what happens?_ - display glitches, invalid data, security flaws...
202 - _what is your configuration?_ - OS, server version, activated extensions, web browser...
203 - _is it reproducible?_ \ No newline at end of file
diff --git a/doc/md/Unit-tests.md b/doc/md/Unit-tests.md
deleted file mode 100644
index a9544656..00000000
--- a/doc/md/Unit-tests.md
+++ /dev/null
@@ -1,119 +0,0 @@
1The testing framework used is [PHPUnit](https://phpunit.de/); it can be installed with [Composer](https://getcomposer.org/), which is a dependency management tool.
2
3## Setup a testing environment
4
5### Install composer
6
7You can either use:
8
9- a system-wide version, e.g. installed through your distro's package manager (eg. `sudo apt install composer`)
10- a local version, downloadable [here](https://getcomposer.org/download/). To update a local composer installation, run `php composer.phar self-update`
11
12
13### Install Shaarli development dependencies
14
15```bash
16$ cd /path/to/shaarli
17$ composer install
18```
19
20### Install Xdebug
21
22Xdebug must be installed and enable for PHPUnit to generate coverage reports. See http://xdebug.org/docs/install.
23
24```bash
25# for Debian-based distributions
26$ aptitude install php-xdebug
27
28# for ArchLinux:
29$ pacman -S xdebug
30```
31
32Then add the following line to `/etc/php/<PHP_VERSION>/cli/php.ini`:
33
34```ini
35zend_extension=xdebug.so
36```
37
38## Run unit tests
39
40Run `make test` and ensure tests return `OK`. If tests return failures, refer to PHPUnit messages and fix your code/tests accordingly.
41
42By default, PHPUnit will run all suitable tests found under the `tests` directory. Each test has 3 possible outcomes:
43
44- `.` - success
45- `F` - failure: the test was run but its results are invalid
46 - the code does not behave as expected
47 - dependencies to external elements: globals, session, cache...
48- `E` - error: something went wrong and the tested code has crashed
49 - typos in the code, or in the test code
50 - dependencies to missing external elements
51
52If Xdebug has been installed and activated, two coverage reports will be generated:
53
54- a summary in the console
55- a detailed HTML report with metrics for tested code
56 - to open it in a web browser: `firefox coverage/index.html &`
57
58### Executing specific tests
59
60Add a [`@group`](https://phpunit.de/manual/current/en/appendixes.annotations.html#appendixes.annotations.group) annotation in a test class or method comment:
61
62```php
63/**
64 * Netscape bookmark import
65 * @group WIP
66 */
67class BookmarkImportTest extends PHPUnit_Framework_TestCase
68{
69 [...]
70}
71```
72
73To run all tests annotated with `@group WIP`:
74```bash
75$ vendor/bin/phpunit --group WIP tests/
76```
77
78### Running tests inside Docker containers
79
80Test Dockerfiles are located under `tests/docker/<distribution>/Dockerfile`,
81and can be used to build Docker images to run Shaarli test suites under common
82Linux environments.
83
84Dockerfiles are provided for the following environments:
85
86- `alpine36` - [Alpine 3.6](https://www.alpinelinux.org/downloads/)
87- `debian8` - [Debian 8 Jessie](https://www.debian.org/DebianJessie) (oldstable)
88- `debian9` - [Debian 9 Stretch](https://wiki.debian.org/DebianStretch) (stable)
89- `ubuntu16` - [Ubuntu 16.04 Xenial Xerus](http://releases.ubuntu.com/16.04/) (LTS)
90
91What's behind the curtains:
92
93- each image provides:
94 - a base Linux OS
95 - Shaarli PHP dependencies (OS packages)
96 - test PHP dependencies (OS packages)
97 - Composer
98- the local workspace is mapped to the container's `/shaarli/` directory,
99- the files are rsync'd so tests are run using a standard Linux user account
100 (running tests as `root` would bypass permission checks and may hide issues)
101- the tests are run inside the container.
102
103To run tests inside a Docker container:
104
105```bash
106# build the Debian 9 Docker image for unit tests
107$ cd /path/to/shaarli
108$ cd tests/docker/debian9
109$ docker build -t shaarli-test:debian9 .
110
111# install/update 3rd-party test dependencies
112$ composer install --prefer-dist
113
114# run tests using the freshly built image
115$ docker run -v $PWD:/shaarli shaarli-test:debian9 docker_test
116
117# run the full test campaign
118$ docker run -v $PWD:/shaarli shaarli-test:debian9 docker_all_tests
119```
diff --git a/doc/md/Upgrade-and-migration.md b/doc/md/Upgrade-and-migration.md
index d5682a34..bfef3e8c 100644
--- a/doc/md/Upgrade-and-migration.md
+++ b/doc/md/Upgrade-and-migration.md
@@ -1,96 +1,83 @@
1## Preparation 1# Upgrade and migration
2 2
3### Note your current version 3## Note your current version
4 4
5If anything goes wrong, it's important for us to know which version you're upgrading from. 5If anything goes wrong, it's important for us to know which version you're upgrading from.
6The current version is present in the `shaarli_version.php` file. 6The current version is present in the `shaarli_version.php` file.
7 7
8### Backup your data
9 8
10Shaarli stores all user data under the `data` directory: 9## Backup your data
11 10
12- `data/config.json.php` (or `data/config.php` for older Shaarli versions) - main configuration file 11Shaarli stores all user data and [configuration](Shaarli-configuration.md) under the `data` directory. [Backup](Backup-and-restore.md) this repository _before_ upgrading Shaarli. You will need to restore it after the following upgrade steps.
13- `data/datastore.php` - bookmarked links
14- `data/ipbans.php` - banned IP addresses
15- `data/updates.txt` - contains all automatic update to the configuration and datastore files already run
16 12
17See [Shaarli configuration](Shaarli-configuration) for more information about Shaarli resources. 13```bash
18 14sudo cp -r /var/www/shaarli.mydomain.org/data ~/shaarli-data-backup
19It is recommended to backup this repository _before_ starting updating/upgrading Shaarli: 15```
20
21- users with SSH access: copy or archive the directory to a temporary location
22- users with FTP access: download a local copy of your Shaarli installation using your favourite client
23 16
24### Migrating data from a previous installation 17## Upgrading from ZIP archives
25 18
26As all user data is kept under `data`, this is the only directory you need to worry about when migrating to a new installation, which corresponds to the following steps: 19If you installed Shaarli from a [release ZIP archive](Installation.md#from-release-zip):
27 20
28- backup the `data` directory 21```bash
29- install or update Shaarli: 22# Download the archive to the server, and extract it
30 - fresh installation - see [Download and Installation](Download-and-Installation) 23cd ~
31 - update - see the following sections 24wget https://github.com/shaarli/Shaarli/releases/download/v0.X.Y/shaarli-v0.X.Y-full.zip
32- check or restore the `data` directory 25unzip shaarli-v0.X.Y-full.zip
33 26
34## Recommended : Upgrading from release archives 27# overwrite your Shaarli installation with the new release **All data will be lost, see _Backup your data_ above.**
28sudo rsync -avP --delete Shaarli/ /var/www/shaarli.mydomain.org/
35 29
36All tagged revisions can be downloaded as tarballs or ZIP archives from the [releases](https://github.com/shaarli/Shaarli/releases) page. 30# restore file permissions as described on the installation page
31sudo chown -R root:www-data /var/www/shaarli.mydomain.org
32sudo chmod -R g+rX /var/www/shaarli.mydomain.org
33sudo chmod -R g+rwX /var/www/shaarli.mydomain.org/{cache/,data/,pagecache/,tmp/}
37 34
38We recommend that you use the latest release tarball with the `-full` suffix. It contains the dependencies, please read [Download and Installation](Download-and-Installation) for `git` complete instructions. 35# restore backups of the data directory
36sudo cp -r ~/shaarli-data-backup/* /var/www/shaarli.mydomain.org/data/
39 37
40Once downloaded, extract the archive locally and update your remote installation (e.g. via FTP) -be sure you keep the content of the `data` directory! 38# If you use gettext mode for translations (not the default), reload your web server.
39sudo systemctl restart apache2
40sudo systemctl restart nginx
41```
41 42
42If you use translations in gettext mode - meaning you manually changed the default mode -, 43If you don't have shell access (eg. on shared hosting), backup the shaarli data directory, download the ZIP archive locally, extract it, upload it to the server using file transfer, and restore the data directory backup.
43reload your web server.
44 44
45After upgrading, access your fresh Shaarli installation from a web browser; the configuration and data store will then be automatically updated, and new settings added to `data/config.json.php` (see [Shaarli configuration](Shaarli configuration) for more details). 45Access your fresh Shaarli installation from a web browser; the configuration and data store will then be automatically updated, and new settings added to `data/config.json.php` (see [Shaarli configuration](Shaarli-configuration.md) for more details).
46 46
47## Upgrading with Git
48 47
49### Updating a community Shaarli 48## Upgrading from Git
50 49
51If you have installed Shaarli from the [community Git repository](Download#clone-with-git-recommended), simply [pull new changes](https://www.git-scm.com/docs/git-pull) from your local clone: 50If you have installed Shaarli [from sources](Installation.md#from-sources):
52 51
53```bash 52```bash
54$ cd /path/to/shaarli 53# pull new changes from your local clone
55$ git pull 54cd /var/www/shaarli.mydomain.org/
56 55sudo git pull
57From github.com:shaarli/Shaarli
58 * branch master -> FETCH_HEAD
59Updating ebd67c6..521f0e6
60Fast-forward
61 application/Url.php | 1 +
62 shaarli_version.php | 2 +-
63 tests/Url/UrlTest.php | 1 +
64 3 files changed, 3 insertions(+), 1 deletion(-)
65```
66 56
67Shaarli >= `v0.8.x`: install/update third-party PHP dependencies using [Composer](https://getcomposer.org/): 57# update PHP dependencies (Shaarli >= v0.8)
58sudo composer install --no-dev
68 59
69```bash 60# update translations (Shaarli >= v0.9.2)
70$ composer install --no-dev 61sudo make translate
71 62
72Loading composer repositories with package information 63# If you use translations in gettext mode (not the default), reload your web server.
73Updating dependencies 64sudo systemctl reload apache
74 - Installing shaarli/netscape-bookmark-parser (v1.0.1) 65sudo systemctl reload nginx
75 Downloading: 100%
76```
77 66
78Shaarli >= `v0.9.2` supports translations: 67# update front-end dependencies (Shaarli >= v0.10.0)
68sudo make build_frontend
79 69
80```bash 70# restore file permissions as described on the installation page
81$ make translate 71sudo chown -R root:www-data /var/www/shaarli.mydomain.org
82``` 72sudo chmod -R g+rX /var/www/shaarli.mydomain.org
73sudo chmod -R g+rwX /var/www/shaarli.mydomain.org/{cache/,data/,pagecache/,tmp/}
74```
83 75
84If you use translations in gettext mode, reload your web server. 76Access your fresh Shaarli installation from a web browser; the configuration and data store will then be automatically updated, and new settings added to `data/config.json.php` (see [Shaarli configuration](Shaarli-configuration.md) for more details).
85 77
86Shaarli >= `v0.10.0` manages its front-end dependencies with nodejs. You need to install 78---------------------------------------------------------------
87[yarn](https://yarnpkg.com/lang/en/docs/install/):
88 79
89```bash 80## Migrating and upgrading from Sebsauvage's repository
90$ make build_frontend
91```
92
93### Migrating and upgrading from Sebsauvage's repository
94 81
95If you have installed Shaarli from [Sebsauvage's original Git repository](https://github.com/sebsauvage/Shaarli), you can use [Git remotes](https://git-scm.com/book/en/v2/Git-Basics-Working-with-Remotes) to update your working copy. 82If you have installed Shaarli from [Sebsauvage's original Git repository](https://github.com/sebsauvage/Shaarli), you can use [Git remotes](https://git-scm.com/book/en/v2/Git-Basics-Working-with-Remotes) to update your working copy.
96 83
@@ -104,7 +91,7 @@ The following guide assumes that:
104 - no versioned file has been locally modified 91 - no versioned file has been locally modified
105 - no untracked files are present 92 - no untracked files are present
106 93
107#### Step 0: show repository information 94### Step 0: show repository information
108 95
109```bash 96```bash
110$ cd /path/to/shaarli 97$ cd /path/to/shaarli
@@ -122,7 +109,7 @@ Your branch is up-to-date with 'origin/master'.
122nothing to commit, working directory clean 109nothing to commit, working directory clean
123``` 110```
124 111
125#### Step 1: update Git remotes 112### Step 1: update Git remotes
126 113
127``` 114```
128$ git remote rename origin sebsauvage 115$ git remote rename origin sebsauvage
@@ -146,7 +133,7 @@ From https://github.com/shaarli/Shaarli
146 * [new tag] v0.7.0 -> v0.7.0 133 * [new tag] v0.7.0 -> v0.7.0
147``` 134```
148 135
149#### Step 2: use the stable community branch 136### Step 2: use the stable community branch
150 137
151```bash 138```bash
152$ git checkout origin/stable -b stable 139$ git checkout origin/stable -b stable
@@ -177,8 +164,7 @@ $ make translate
177 164
178If you use translations in gettext mode, reload your web server. 165If you use translations in gettext mode, reload your web server.
179 166
180Shaarli >= `v0.10.0` manages its front-end dependencies with nodejs. You need to install 167Shaarli >= `v0.10.0` manages its front-end dependencies with nodejs. You need to install [yarn](https://yarnpkg.com/lang/en/docs/install/):
181[yarn](https://yarnpkg.com/lang/en/docs/install/):
182 168
183```bash 169```bash
184$ make build_frontend 170$ make build_frontend
@@ -204,30 +190,14 @@ Writing objects: 100% (3317/3317), done.
204Total 3317 (delta 2050), reused 3301 (delta 2034)to 190Total 3317 (delta 2050), reused 3301 (delta 2034)to
205``` 191```
206 192
207#### Step 3: configuration 193### Step 3: configuration
208 194
209After migrating, access your fresh Shaarli installation from a web browser; the 195After migrating, access your fresh Shaarli installation from a web browser; the
210configuration will then be automatically updated, and new settings added to 196configuration will then be automatically updated, and new settings added to
211`data/config.json.php` (see [Shaarli configuration](Shaarli-configuration) for more 197`data/config.json.php` (see [Shaarli configuration](Shaarli-configuration.md) for more
212details). 198details).
213 199
214## Troubleshooting 200## Troubleshooting
215 201
216If the solutions provided here don't work, please open an issue specifying which version you're upgrading from and to. 202If the solutions provided here don't work, see [Troubleshooting](Troubleshooting.md) and/or open an issue specifying which version you're upgrading from and to.
217
218### You must specify an integer as a key
219
220In `v0.8.1` we changed how link keys are handled (from timestamps to incremental integers).
221Take a look at `data/updates.txt` content.
222
223#### `updates.txt` contains `updateMethodDatastoreIds`
224
225Try to delete it and refresh your page while being logged in.
226
227#### `updates.txt` doesn't exist or doesn't contain `updateMethodDatastoreIds`
228 203
2291. Create `data/updates.txt` if it doesn't exist
2302. Paste this string in the update file `;updateMethodRenameDashTags;`
2313. Login to Shaarli
2324. Delete the update file
2335. Refresh
diff --git a/doc/md/Usage.md b/doc/md/Usage.md
new file mode 100644
index 00000000..6dadde0a
--- /dev/null
+++ b/doc/md/Usage.md
@@ -0,0 +1,111 @@
1## Features
2
3For any item posted to Shaarli (called a _Shaare_), you can customize the following aspects:
4
5- URL to link to
6- Title
7- Free-text description
8- Tags
9- Public/private status
10
11
12### Adding/editing Shaares
13
14While logged in to your Shaarli, you can add, edit or delete Shaares:
15
16- Using the **+Shaare** button: enter the URL you want to share, click `Add link`, fill in the details of your Shaare, and `Save`
17- Using the [Bookmarklet](https://en.wikipedia.org/wiki/Bookmarklet): drag the `✚Shaare link` button from the `Tools` page to your browser's bookmarks bar, click it to share the current page.
18- Using [apps and browser addons](Community-and-related-software.md#mobile-apps)
19- Using the [REST API](https://shaarli.github.io/api-documentation/)
20- Any Shaare can edited by clicking its ![](images/edit_icon.png) `Edit` button.
21
22
23### Tags
24
25Tags can be be used to organize and categorize your Shaares:
26
27- You can rename, merge and delete tags from the _Tools_ menu or the [tag cloud/list](#tag-cloud)
28- Tags are auto-completed (from the list of existing tags) in all dialogs
29- Tags can be combined with text in [search](#search) queries
30
31
32### Public/private Shaares
33
34Additional filter buttons can be found at the top left of the Shaare list **only when logged in**:
35
36- **Only show private Shaares:** Private shares can be searched by clicking the `only show private links` toggle button top left of the Shaares list (only when logged in)
37
38
39### Permalinks
40
41Permalinks are fixed, short links attached to each Shaare. Editing a Shaare will not change it's permalink, each permalink always points to the latest revision of a Shaare.
42
43
44### Text-only (note) Shaares
45
46Shaarli can be used as a minimal blog, notepad, pastebin...: While adding or editing a Shaare, leave the URL field blank to create a text-only ("note") post. This allows you to post any kind of text content, such as blog articles, private or public notes, snippets... There is no character limit! You can access your post from its permalink.
47
48
49### Search
50
51- **Plain text search:** Use `Search text` to search in all fields of all Shaares (Title, URL, Description...). Use double-quotes (example `"exact search"`) to search for the exact expression.
52- **Tags search:** `Filter by tags` allow only displaying Shaares tagged with one or multiple tags (use space to separate tags).
53- **Hidden tags:** tags starting with a dot `.` (example `.secret`) are private. They can only be seen and searched when logged in.
54- **Exclude text/tags:** Use the `-` operator before a word or tag to exclude Shaares matching this word from search results (`NOT` operator).
55- **Untagged links:** Shaares without tags can be searched by clicking the `untagged` toggle button top left of the Shaares list (only when logged in).
56
57Both exclude patterns and exact searches can be combined with normal searches (example `"exact search" term otherterm -notthis "very exact" stuff -notagain`). Only AND (and NOT) search is currrently supported.
58
59Active search terms are displayed on top of the link list. To remove terms/tags from the curent search, click the `x` next to any of them, or simply clear text/tag search fields.
60
61
62### Tag cloud
63
64The `Tag cloud` page diplays a "cloud" or list view of all tags in your Shaarli (most frequently used tags are displayed with a bigger font size)
65
66
67- **Tags list:** click on `Most used` or `Alphabetical` to display tags as a list. You can also edit/delete tags for this page.
68- Click on any tag to search all Shaares matching this tag.
69- **Filtering the tag cloud/list:** Click on the counter next to a tag to show other tags of Shaares with this tag. Repeat this any number of times to further filter the tag cloud. Click `List all links with those tags` to display Shaares matching your current tag filter set.
70
71
72
73### RSS feeds
74
75RSS/ATOM feeds feeds are available (in ATOM with `/feed/atom` and RSS with `/feed/rss`)
76
77- **Filtering RSS feeds:** RSS feeds and picture wall can also be restricted to only return items matching a text/tag search. For example, search for `photography` (text or tags) in Shaarli, then click the `RSS Feed` button. A feed with only matching results is displayed.
78- Add the `&nb` parameter in feed URLs to specify the number of Shaares you want in a feed (default if not specified: `50`). The keyword `all` is available if you want everything.
79- Add the `&permalinks` parameter in feed URLs to point permalinks to the corresponding shaarly entry/link instead of the direct, Shaare URL attribute
80
81![](images/rss-filter-1.png) ![](images/rss-filter-2.png)
82
83```bash
84# examples
85https://shaarli.mydomain.org/feed/atom?permalinks
86https://shaarli.mydomain.org/feed/atom?permalinks&nb=42
87https://shaarli.mydomain.org/feed/atom?permalinks&nb=all
88https://shaarli.mydomain.org/feed/rss?searchtags=nature
89https://shaarli.mydomain.org/links/picture-wall?searchterm=poney
90```
91
92
93### Picture wall
94
95- The picture wall can be filtered by text or tags search in the same way as [RSS feeds](#rss-feeds)
96
97
98### Import/export
99
100To **export Shaares as a HTML file**, under _Tools > Export_, choose:
101
102- `Export all` to export both public and private Shaares
103- `Export public` to export public Shaares only
104- `Export private` to export private Shaares only
105
106Restore by using the `Import` feature.
107
108- These exports contain the full data (URL, title, tags, date, description, public/private status of your Shaares)
109- They can also be imported to your web browser bookmarks.
110
111To **import a HTML bookmarks file** exported from your browser, just use the `Import` feature. For each "folder" in the bookmarks you imported, a new tag will be created (for example a bookmark in `Movies > Sci-fi` folder will be tagged `Movies` `Sci-fi`).
diff --git a/doc/md/dev/Development.md b/doc/md/dev/Development.md
new file mode 100644
index 00000000..5c085e03
--- /dev/null
+++ b/doc/md/dev/Development.md
@@ -0,0 +1,179 @@
1# Development
2
3Please read [Contributing to Shaarli](https://github.com/shaarli/Shaarli/tree/master/CONTRIBUTING.md)
4
5## Guidelines
6
7
8- [Unit tests](Unit-tests)
9- Javascript linting - Shaarli uses [Airbnb JavaScript Style Guide](https://github.com/airbnb/javascript).
10Run `make eslint` to check JS style.
11- [GnuPG signature](GnuPG-signature) for tags/releases
12
13
14## Third-party libraries
15
16CSS:
17
18- Yahoo UI [CSS Reset](http://yuilibrary.com/yui/docs/cssreset/) - standardize cross-browser rendering
19
20Javascript:
21
22- [Awesomeplete](https://leaverou.github.io/awesomplete/) ([GitHub](https://github.com/LeaVerou/awesomplete)) - autocompletion in input forms
23- [bLazy](http://dinbror.dk/blazy/) ([GitHub](https://github.com/dinbror/blazy)) - lazy loading for thumbnails
24- [qr.js](http://neocotic.com/qr.js/) ([GitHub](https://github.com/neocotic/qr.js)) - QR code generation
25
26PHP (managed through [`composer.json`](https://github.com/shaarli/Shaarli/blob/master/composer.json)):
27
28- [RainTPL](https://github.com/rainphp/raintpl) - HTML templating for PHP
29- [`shaarli/netscape-bookmark-parser`](https://packagist.org/packages/shaarli/netscape-bookmark-parser) - Import bookmarks from Netscape files
30- [`erusev/parsedown`](https://packagist.org/packages/erusev/parsedown) - Parse MarkDown syntax for the MarkDown plugin
31- [`slim/slim`](https://packagist.org/packages/slim/slim) - Handle routes and middleware for the REST API
32- [`ArthurHoaro/web-thumbnailer`](https://github.com/ArthurHoaro/web-thumbnailer) - PHP library which will retrieve a thumbnail for any given URL
33- [`pubsubhubbub/publisher`](https://github.com/pubsubhubbub/php-publisher) - A PubSubHubbub publisher module for PHP.
34- [`gettext/gettext`](https://github.com/php-gettext/Gettext) - PHP library to collect and manipulate gettext (.po, .mo, .php, .json, etc)
35
36
37## Security
38
39- The password is salted, hashed and stored in the data subdirectory, in a PHP file, and protected by htaccess. Even if the webserver does not support htaccess, the hash is not readable by URL. Even if the .php file is stolen, the password cannot deduced from the hash. The salt prevents rainbow-tables attacks.
40- Directories are protected using `.htaccess` files
41- Forms are protected against [XSRF](http://en.wikipedia.org/wiki/Cross-site_request_forgery):
42 - Forms which act on data (save,delete…) contain a token generated by the server.
43 - Any posted form which does not contain a valid token is rejected.
44 - Any token can only be used once.
45 - Tokens are attached to the session and cannot be reused in another session.
46- Sessions automatically expire after 60 minutes.
47- Sessions are protected against hijacking: the session ID cannot be used from a different IP address.
48- Links are stored as an associative array which is serialized, compressed (with deflate), base64-encoded and saved as a comment in a `.php` file - even if the server does not support `.htaccess` files, the data file will still not be readable by URL.
49- Bruteforce protection: Successful and failed login attempts are logged - IP bans are enforced after a configurable amount of failures. Logs can also be used consumed by [fail2ban](../Server-configuration.md#fail2ban)
50- A pop-up notification is shown when a new release is available.
51
52## Link structure
53
54Every link available through the `LinkDB` object is represented as an array
55containing the following fields:
56
57 * `id` (integer): Unique identifier.
58 * `title` (string): Title of the link.
59 * `url` (string): URL of the link. Used for displayable links (without redirector, url encoding, etc.).
60 Can be absolute or relative for Notes.
61 * `real_url` (string): Real destination URL, can be redirected, encoded, etc.
62 * `shorturl` (string): Permalink small hash.
63 * `description` (string): Link text description.
64 * `private` (boolean): whether the link is private or not.
65 * `tags` (string): all link tags separated by a single space
66 * `thumbnail` (string|boolean): relative path of the thumbnail cache file, or false if there isn't any.
67 * `created` (DateTime): link creation date time.
68 * `updated` (DateTime): last modification date time.
69
70Small hashes are used to make a link to an entry in Shaarli. They are unique: the date of the item (eg. `20110923_150523`) is hashed with CRC32, then converted to base64 and some characters are replaced. They are always 6 characters longs and use only `A-Z a-z 0-9 - _` and `@`.
71
72
73## Directory structure
74
75Here is the directory structure of Shaarli and the purpose of the different files:
76
77```bash
78 index.php # Main program
79 application/ # Shaarli classes
80 ├── LinkDB.php
81
82 ...
83
84 └── Utils.php
85 tests/ # Shaarli unitary & functional tests
86 ├── LinkDBTest.php
87
88 ...
89
90 ├── utils # utilities to ease testing
91 │ └── ReferenceLinkDB.php
92 └── UtilsTest.php
93 assets/
94 ├── common/ # Assets shared by multiple themes
95 ├── ...
96 ├── default/ # Assets for the default template, before compilation
97 ├── fonts/ # Font files
98 ├── img/ # Images used by the default theme
99 ├── js/ # JavaScript files in ES6 syntax
100 ├── scss/ # SASS files
101 └── vintage/ # Assets for the vintage template, before compilation
102 └── ...
103 COPYING # Shaarli license
104 inc/ # static assets and 3rd party libraries
105 └── rain.tpl.class.php # RainTPL templating library
106 images/ # Images and icons used in Shaarli
107 data/ # data storage: bookmark database, configuration, logs, banlist...
108 ├── config.json.php # Shaarli configuration (login, password, timezone, title...)
109 ├── datastore.php # Your link database (compressed).
110 ├── ipban.php # IP address ban system data
111 ├── lastupdatecheck.txt # Update check timestamp file
112 └── log.txt # login/IPban log.
113 tpl/ # RainTPL templates for Shaarli. They are used to build the pages.
114 ├── default/ # Default Shaarli theme
115 ├── fonts/ # Font files
116 ├── img/ # Images
117 ├── js/ # JavaScript files compiled by Babel and compatible with all browsers
118 ├── css/ # CSS files compiled with SASS
119 └── vintage/ # Legacy Shaarli theme
120 └── ...
121 cache/ # thumbnails cache
122 # This directory is automatically created. You can erase it anytime you want.
123 tmp/ # Temporary directory for compiled RainTPL templates.
124 # This directory is automatically created. You can erase it anytime you want.
125 vendor/ # Third-party dependencies. This directory is created by Composer
126```
127
128Shaarli needs read access to:
129
130- the root index.php file
131- the `application/`, `plugins/` and `inc/` directories (recursively)
132
133Shaarli needs read/write access to the `cache/`, `data/`, `pagecache/`, and `tmp/` directories
134
135
136## Automation
137
138A [`Makefile`](https://github.com/shaarli/Shaarli/blob/master/Makefile) is available to perform project-related operations:
139
140- [Static analysis](#Static-analysis) - check that the code is compliant to PHP conventions
141- [Unit tests](#Unit-tests) - ensure there are no regressions introduced by new commits
142- Documentation - generate a local HTML copy of the markdown documentation
143
144### Continuous Integration
145
146[Travis CI](http://docs.travis-ci.com/) is a Continuous Integration build server, that runs a build:
147
148- each time a commit is merged to the mainline (`master` branch)
149- each time a Pull Request is submitted or updated
150
151After all jobs have finished, Travis returns the results to GitHub:
152
153- a status icon represents the result for the `master` branch: [![](https://api.travis-ci.org/shaarli/Shaarli.svg)](https://travis-ci.org/shaarli/Shaarli)
154- Pull Requests are updated with the Travis build result.
155
156See [`.travis.yml`](https://github.com/shaarli/Shaarli/blob/master/.travis.yml).
157
158
159### Documentation
160
161[mkdocs](https://www.mkdocs.org/) is used to convert markdown documentation to HTML pages. The [public documentation](https://shaarli.readthedocs.io/en/master/) website is rendered and hosted by [readthedocs.org](https://readthedocs.org/). A copy of the documentation is also included in prebuilt [release archives](https://github.com/shaarli/Shaarli/releases) (`doc/html/` path in your Shaarli installation). To generate the HTML documentation locally, install a recent version of Python `setuptools` and run `make doc`.
162
163
164## Static analysis
165
166Patches should try to stick to the [PHP Standard Recommendations](http://www.php-fig.org/psr/) (PSR), especially:
167
168- [PSR-1](http://www.php-fig.org/psr/psr-1/) - Basic Coding Standard
169- [PSR-2](http://www.php-fig.org/psr/psr-2/) - Coding Style Guide
170
171
172**Work in progress:** Static analysis is currently being discussed here: in [#95 - Fix coding style (static analysis)](https://github.com/shaarli/Shaarli/issues/95), [#130 - Continuous Integration tools & features](https://github.com/shaarli/Shaarli/issues/130)
173
174Static analysis tools can be installed with Composer, and used through Shaarli's [Makefile](https://github.com/shaarli/Shaarli/blob/master/Makefile).
175
176For an overview of the available features, see:
177
178- [Code quality: Makefile to run static code checkers](https://github.com/shaarli/Shaarli/pull/124) (#124)
179- [Run PHPCS against different coding standards](https://github.com/shaarli/Shaarli/pull/276) (#276)
diff --git a/doc/md/GnuPG-signature.md b/doc/md/dev/GnuPG-signature.md
index d1fc10a5..25578001 100644
--- a/doc/md/GnuPG-signature.md
+++ b/doc/md/dev/GnuPG-signature.md
@@ -1,24 +1,16 @@
1## Introduction 1## Introduction
2### PGP and GPG 2### PGP and GPG
3[Gnu Privacy Guard](https://gnupg.org/) (GnuPG) is an Open Source implementation of the 3[Gnu Privacy Guard](https://gnupg.org/) (GnuPG) is an Open Source implementation of the [Pretty Good Privacy](https://en.wikipedia.org/wiki/Pretty_Good_Privacy#OpenPGP) (OpenPGP) specification. Its main purposes are digital authentication, signature and encryption. It is often used by the [FLOSS](https://en.wikipedia.org/wiki/Free_and_open-source_software) community to verify:
4[Pretty Good Privacy](https://en.wikipedia.org/wiki/Pretty_Good_Privacy#OpenPGP)
5(OpenPGP) specification. Its main purposes are digital authentication, signature and encryption.
6 4
7It is often used by the [FLOSS](https://en.wikipedia.org/wiki/Free_and_open-source_software) community to verify: 5- Linux package signatures: Debian [SecureApt](https://wiki.debian.org/SecureApt), ArchLinux [Master Keys](https://www.archlinux.org/master-keys/)
6- [Version control](https://en.wikipedia.org/wiki/Revision_control) releases & maintainer identity
8 7
9- Linux package signatures: Debian [SecureApt](https://wiki.debian.org/SecureApt), ArchLinux [Master 8> You MUST understand that presence of data in the keyserver (pools) in no way connotes trust. Anyone can generate a key, with any name or email address, and upload it. All security and trust comes from evaluating security at the “object level”, via PGP [Web of trust](https://en.wikipedia.org/wiki/Web_of_trust) signatures. This keyserver makes it possible to retrieve keys, looking them up via various indices, but the collection of keys in this public pool is KNOWN to contain malicious and fraudulent keys. It is the common expectation of server operators that users understand this and use software which, like all known common OpenPGP implementations, evaluates trust accordingly. This expectation is so common that it is not normally explicitly stated.
10Keys](https://www.archlinux.org/master-keys/)
11- [SCM](https://en.wikipedia.org/wiki/Revision_control) releases & maintainer identity
12 9
13### Trust 10-- Phil Pennock (author of the [SKS](https://bitbucket.org/skskeyserver/sks-keyserver/wiki/Home) key server - http://sks.spodhuis.org/)
14To quote Phil Pennock (the author of the [SKS](https://bitbucket.org/skskeyserver/sks-keyserver/wiki/Home) key server - http://sks.spodhuis.org/):
15 11
16> You MUST understand that presence of data in the keyserver (pools) in no way connotes trust. Anyone can generate a key, with any name or email address, and upload it. All security and trust comes from evaluating security at the “object level”, via PGP Web-Of-Trust signatures. This keyserver makes it possible to retrieve keys, looking them up via various indices, but the collection of keys in this public pool is KNOWN to contain malicious and fraudulent keys. It is the common expectation of server operators that users understand this and use software which, like all known common OpenPGP implementations, evaluates trust accordingly. This expectation is so common that it is not normally explicitly stated. 12Trust can be gained by having your key signed by other people (and signing their key back, too :) ), for instance during [key signing parties](https://en.wikipedia.org/wiki/Key_signing_party): [Keysigning party HOWTO](http://www.cryptnet.net/fdp/crypto/keysigning_party/en/keysigning_party.html),
17 13
18Trust can be gained by having your key signed by other people (and signing their key back, too :) ), for instance during [key signing parties](https://en.wikipedia.org/wiki/Key_signing_party), see:
19
20- [The Keysigning party HOWTO](http://www.cryptnet.net/fdp/crypto/keysigning_party/en/keysigning_party.html)
21- [Web of trust](https://en.wikipedia.org/wiki/Web_of_trust)
22 14
23## Generate a GPG key 15## Generate a GPG key
24- [Generating a GPG key for Git tagging](http://stackoverflow.com/a/16725717) (StackOverflow) 16- [Generating a GPG key for Git tagging](http://stackoverflow.com/a/16725717) (StackOverflow)
diff --git a/doc/md/Plugin-System.md b/doc/md/dev/Plugin-system.md
index f264e873..c29774de 100644
--- a/doc/md/Plugin-System.md
+++ b/doc/md/dev/Plugin-system.md
@@ -1,19 +1,16 @@
1[**I am a developer: ** Developer API](#developer-api) 1# Plugin system
2
3[**I am a template designer: ** Guide for template designers](#guide-for-template-designer)
4
5---
6 2
7## Developer API 3## Developer API
8 4
9### What can I do with plugins? 5### What can I do with plugins?
10 6
11The plugin system let you: 7The plugin system lets you:
12 8
13- insert content into specific places across templates. 9- insert content into specific places across templates.
14- alter data before templates rendering. 10- alter data before templates rendering.
15- alter data before saving new links. 11- alter data before saving new links.
16 12
13
17### How can I create a plugin for Shaarli? 14### How can I create a plugin for Shaarli?
18 15
19First, chose a plugin name, such as `demo_plugin`. 16First, chose a plugin name, such as `demo_plugin`.
@@ -30,6 +27,7 @@ You should have the following tree view:
30| |---| demo_plugin.php 27| |---| demo_plugin.php
31``` 28```
32 29
30
33### Plugin initialization 31### Plugin initialization
34 32
35At the beginning of Shaarli execution, all enabled plugins are loaded. At this point, the plugin system looks for an `init()` function in the <plugin_name>.php to execute and run it if it exists. This function must be named this way, and takes the `ConfigManager` as parameter. 33At the beginning of Shaarli execution, all enabled plugins are loaded. At this point, the plugin system looks for an `init()` function in the <plugin_name>.php to execute and run it if it exists. This function must be named this way, and takes the `ConfigManager` as parameter.
@@ -63,6 +61,7 @@ For example, if my plugin want to add data to the header, this function is neede
63 61
64If this function is declared, and the plugin enabled, it will be called every time Shaarli is rendering the header. 62If this function is declared, and the plugin enabled, it will be called every time Shaarli is rendering the header.
65 63
64
66### Plugin's data 65### Plugin's data
67 66
68#### Parameters 67#### Parameters
@@ -73,6 +72,26 @@ Every hook function has a `$data` parameter. Its content differs for each hooks.
73 72
74 return $data; 73 return $data;
75 74
75#### Special data
76
77Special additional data are passed to every hook through the
78`$data` parameter to give you access to additional context, and services.
79
80Complete list:
81
82 * `_PAGE_` (string): if the current hook is used to render a template, its name is passed through this additional parameter.
83 * `_LOGGEDIN_` (bool): whether the user is logged in or not.
84 * `_BASE_PATH_` (string): if Shaarli instance is hosted under a subfolder, contains the subfolder path to `index.php` (e.g. `https://domain.tld/shaarli/` -> `/shaarli/`).
85 * `_BOOKMARK_SERVICE_` (`BookmarkServiceInterface`): bookmark service instance, for advanced usage.
86
87Example:
88
89```php
90if ($data['_PAGE_'] === TemplatePage::LINKLIST && $data['LOGGEDIN'] === true) {
91 // Do something for logged in users when the link list is rendered
92}
93```
94
76#### Filling templates placeholder 95#### Filling templates placeholder
77 96
78Template placeholders are displayed in template in specific places. 97Template placeholders are displayed in template in specific places.
@@ -89,13 +108,14 @@ array_push($data['top_placeholder'], 'My', 'content');
89return $data; 108return $data;
90``` 109```
91 110
111
92#### Data manipulation 112#### Data manipulation
93 113
94When a page is displayed, every variable send to the template engine is passed to plugins before that in `$data`. 114When a page is displayed, every variable send to the template engine is passed to plugins before that in `$data`.
95 115
96The data contained by this array can be altered before template rendering. 116The data contained by this array can be altered before template rendering.
97 117
98For exemple, in linklist, it is possible to alter every title: 118For example, in linklist, it is possible to alter every title:
99 119
100```php 120```php
101// mind the reference if you want $data to be altered 121// mind the reference if you want $data to be altered
@@ -119,12 +139,28 @@ Each file contain two keys:
119 139
120> Note: In PHP, `parse_ini_file()` seems to want strings to be between by quotes `"` in the ini file. 140> Note: In PHP, `parse_ini_file()` seems to want strings to be between by quotes `"` in the ini file.
121 141
142### Understanding relative paths
143
144Because Shaarli is a self-hosted tool, an instance can either be installed at the root directory, or under a subfolder.
145This means that you can *never* use absolute paths (eg `/plugins/mything/file.png`).
146
147If a file needs to be included in server end, use simple relative path:
148`PluginManager::$PLUGINS_PATH . '/mything/template.html'`.
149
150If it needs to be included in front end side (e.g. an image),
151the relative path must be prefixed with special data `_BASE_PATH_`:
152`($data['_BASE_PATH_'] ?? '') . '/' . PluginManager::$PLUGINS_PATH . '/mything/picture.png`.
153
154Note that special placeholders for CSS and JS files (respectively `css_files` and `js_files`) are already prefixed
155with the base path in template files.
156
122### It's not working! 157### It's not working!
123 158
124Use `demo_plugin` as a functional example. It covers most of the plugin system features. 159Use `demo_plugin` as a functional example. It covers most of the plugin system features.
125 160
126If it's still not working, please [open an issue](https://github.com/shaarli/Shaarli/issues/new). 161If it's still not working, please [open an issue](https://github.com/shaarli/Shaarli/issues/new).
127 162
163
128### Hooks 164### Hooks
129 165
130| Hooks | Description | 166| Hooks | Description |
@@ -145,19 +181,16 @@ If it's still not working, please [open an issue](https://github.com/shaarli/Sha
145| [save_plugin_parameters](#save_plugin_parameters) | Allow to manipulate plugin parameters before they're saved. | 181| [save_plugin_parameters](#save_plugin_parameters) | Allow to manipulate plugin parameters before they're saved. |
146 182
147 183
148
149#### render_header 184#### render_header
150 185
151Triggered on every page. 186Triggered on every page - allows plugins to add content in page headers.
152 187
153Allow plugin to add content in page headers.
154 188
155##### Data 189##### Data
156 190
157`$data` is an array containing: 191`$data` is an array containing:
158 192
159- `_PAGE_`: current target page (eg: `linklist`, `picwall`, etc.). 193 - [Special data](#special-data)
160- `_LOGGEDIN_`: true if user is logged in, false otherwise.
161 194
162##### Template placeholders 195##### Template placeholders
163 196
@@ -175,18 +208,16 @@ List of placeholders:
175 208
176![fields_toolbar_example](http://i.imgur.com/3GMifI2.png) 209![fields_toolbar_example](http://i.imgur.com/3GMifI2.png)
177 210
178#### render_includes
179 211
180Triggered on every page. 212#### render_includes
181 213
182Allow plugin to include their own CSS files. 214Triggered on every page - allows plugins to include their own CSS files.
183 215
184##### Data 216##### data
185 217
186`$data` is an array containing: 218`$data` is an array containing:
187 219
188- `_PAGE_`: current target page (eg: `linklist`, `picwall`, etc.). 220 - [Special data](#special-data)
189- `_LOGGEDIN_`: true if user is logged in, false otherwise.
190 221
191##### Template placeholders 222##### Template placeholders
192 223
@@ -198,18 +229,18 @@ List of placeholders:
198 229
199> Note: only add the path of the CSS file. E.g: `plugins/demo_plugin/custom_demo.css`. 230> Note: only add the path of the CSS file. E.g: `plugins/demo_plugin/custom_demo.css`.
200 231
232
201#### render_footer 233#### render_footer
202 234
203Triggered on every page. 235Triggered on every page.
204 236
205Allow plugin to add content in page footer and include their own JS files. 237Allow plugin to add content in page footer and include their own JS files.
206 238
207##### Data 239##### data
208 240
209`$data` is an array containing: 241`$data` is an array containing:
210 242
211- `_PAGE_`: current target page (eg: `linklist`, `picwall`, etc.). 243 - [Special data](#special-data)
212- `_LOGGEDIN_`: true if user is logged in, false otherwise.
213 244
214##### Template placeholders 245##### Template placeholders
215 246
@@ -226,20 +257,21 @@ List of placeholders:
226 257
227> Note: only add the path of the JS file. E.g: `plugins/demo_plugin/custom_demo.js`. 258> Note: only add the path of the JS file. E.g: `plugins/demo_plugin/custom_demo.js`.
228 259
260
229#### render_linklist 261#### render_linklist
230 262
231Triggered when `linklist` is displayed (list of links, permalink, search, tag filtered, etc.). 263Triggered when `linklist` is displayed (list of links, permalink, search, tag filtered, etc.).
232 264
233It allows to add content at the begining and end of the page, after every link displayed and to alter link data. 265It allows to add content at the begining and end of the page, after every link displayed and to alter link data.
234 266
235##### Data 267##### data
236 268
237`$data` is an array containing: 269`$data` is an array containing:
238 270
239- `_LOGGEDIN_`: true if user is logged in, false otherwise. 271 - All templates data, including links.
240- All templates data, including links. 272 - [Special data](#special-data)
241 273
242##### Template placeholders 274##### template placeholders
243 275
244Items can be displayed in templates by adding an entry in `$data['<placeholder>']` array. 276Items can be displayed in templates by adding an entry in `$data['<placeholder>']` array.
245 277
@@ -261,19 +293,21 @@ List of placeholders:
261 293
262![plugin_end_zone_example](http://i.imgur.com/6IoRuop.png) 294![plugin_end_zone_example](http://i.imgur.com/6IoRuop.png)
263 295
296
264#### render_editlink 297#### render_editlink
265 298
266Triggered when the link edition form is displayed. 299Triggered when the link edition form is displayed.
267 300
268Allow to add fields in the form, or display elements. 301Allow to add fields in the form, or display elements.
269 302
270##### Data 303##### data
271 304
272`$data` is an array containing: 305`$data` is an array containing:
273 306
274- All templates data. 307 - All templates data.
308 - [Special data](#special-data)
275 309
276##### Template placeholders 310##### template placeholders
277 311
278Items can be displayed in templates by adding an entry in `$data['<placeholder>']` array. 312Items can be displayed in templates by adding an entry in `$data['<placeholder>']` array.
279 313
@@ -283,19 +317,21 @@ List of placeholders:
283 317
284![edit_link_plugin_example](http://i.imgur.com/5u17Ens.png) 318![edit_link_plugin_example](http://i.imgur.com/5u17Ens.png)
285 319
320
286#### render_tools 321#### render_tools
287 322
288Triggered when the "tools" page is displayed. 323Triggered when the "tools" page is displayed.
289 324
290Allow to add content at the end of the page. 325Allow to add content at the end of the page.
291 326
292##### Data 327##### data
293 328
294`$data` is an array containing: 329`$data` is an array containing:
295 330
296- All templates data. 331 - All templates data.
332 - [Special data](#special-data)
297 333
298##### Template placeholders 334##### template placeholders
299 335
300Items can be displayed in templates by adding an entry in `$data['<placeholder>']` array. 336Items can be displayed in templates by adding an entry in `$data['<placeholder>']` array.
301 337
@@ -305,20 +341,21 @@ List of placeholders:
305 341
306![tools_plugin_example](http://i.imgur.com/Bqhu9oQ.png) 342![tools_plugin_example](http://i.imgur.com/Bqhu9oQ.png)
307 343
344
308#### render_picwall 345#### render_picwall
309 346
310Triggered when picwall is displayed. 347Triggered when picwall is displayed.
311 348
312Allow to add content at the top and bottom of the page. 349Allow to add content at the top and bottom of the page.
313 350
314##### Data 351##### data
315 352
316`$data` is an array containing: 353`$data` is an array containing:
317 354
318- `_LOGGEDIN_`: true if user is logged in, false otherwise. 355 - All templates data.
319- All templates data. 356 - [Special data](#special-data)
320 357
321##### Template placeholders 358##### template placeholders
322 359
323Items can be displayed in templates by adding an entry in `$data['<placeholder>']` array. 360Items can be displayed in templates by adding an entry in `$data['<placeholder>']` array.
324 361
@@ -329,18 +366,19 @@ List of placeholders:
329 366
330![plugin_start_end_zone_example](http://i.imgur.com/tVTQFER.png) 367![plugin_start_end_zone_example](http://i.imgur.com/tVTQFER.png)
331 368
369
332#### render_tagcloud 370#### render_tagcloud
333 371
334Triggered when tagcloud is displayed. 372Triggered when tagcloud is displayed.
335 373
336Allow to add content at the top and bottom of the page. 374Allow to add content at the top and bottom of the page.
337 375
338##### Data 376##### data
339 377
340`$data` is an array containing: 378`$data` is an array containing:
341 379
342- `_LOGGEDIN_`: true if user is logged in, false otherwise. 380 - All templates data.
343- All templates data. 381 - [Special data](#special-data)
344 382
345##### Template placeholders 383##### Template placeholders
346 384
@@ -360,16 +398,14 @@ For each tag, the following placeholder can be used:
360 398
361#### render_taglist 399#### render_taglist
362 400
363Triggered when taglist is displayed. 401Triggered when taglist is displayed - allows to add content at the top and bottom of the page.
364
365Allow to add content at the top and bottom of the page.
366 402
367##### Data 403##### data
368 404
369`$data` is an array containing: 405`$data` is an array containing:
370 406
371- `_LOGGEDIN_`: true if user is logged in, false otherwise. 407 - All templates data.
372- All templates data. 408 - [Special data](#special-data)
373 409
374##### Template placeholders 410##### Template placeholders
375 411
@@ -390,12 +426,13 @@ Triggered when tagcloud is displayed.
390 426
391Allow to add content at the top and bottom of the page, the bottom of each link and to alter data. 427Allow to add content at the top and bottom of the page, the bottom of each link and to alter data.
392 428
393##### Data 429
430##### data
394 431
395`$data` is an array containing: 432`$data` is an array containing:
396 433
397- `_LOGGEDIN_`: true if user is logged in, false otherwise. 434 - All templates data, including links.
398- All templates data, including links. 435 - [Special data](#special-data)
399 436
400##### Template placeholders 437##### Template placeholders
401 438
@@ -410,19 +447,19 @@ List of placeholders:
410- `plugin_start_zone`: before displaying the template content. 447- `plugin_start_zone`: before displaying the template content.
411- `plugin_end_zone`: after displaying the template content. 448- `plugin_end_zone`: after displaying the template content.
412 449
450
413#### render_feed 451#### render_feed
414 452
415Triggered when the ATOM or RSS feed is displayed. 453Triggered when the ATOM or RSS feed is displayed.
416 454
417Allow to add tags in the feed, either in the header or for each items. Items (links) can also be altered before being rendered. 455Allow to add tags in the feed, either in the header or for each items. Items (links) can also be altered before being rendered.
418 456
419##### Data 457##### data
420 458
421`$data` is an array containing: 459`$data` is an array containing:
422 460
423- `_LOGGEDIN_`: true if user is logged in, false otherwise. 461 - All templates data, including links.
424- `_PAGE_`: containing either `rss` or `atom`. 462 - [Special data](#special-data)
425- All templates data, including links.
426 463
427##### Template placeholders 464##### Template placeholders
428 465
@@ -436,13 +473,14 @@ For each links:
436 473
437- `feed_plugins`: additional tag for every link entry. 474- `feed_plugins`: additional tag for every link entry.
438 475
476
439#### save_link 477#### save_link
440 478
441Triggered when a link is save (new link or edit). 479Triggered when a link is save (new link or edit).
442 480
443Allow to alter the link being saved in the datastore. 481Allow to alter the link being saved in the datastore.
444 482
445##### Data 483##### data
446 484
447`$data` is an array containing the link being saved: 485`$data` is an array containing the link being saved:
448 486
@@ -456,6 +494,8 @@ Allow to alter the link being saved in the datastore.
456- created 494- created
457- updated 495- updated
458 496
497Also [special data](#special-data).
498
459 499
460#### delete_link 500#### delete_link
461 501
@@ -463,9 +503,9 @@ Triggered when a link is deleted.
463 503
464Allow to execute any action before the link is actually removed from the datastore 504Allow to execute any action before the link is actually removed from the datastore
465 505
466##### Data 506##### data
467 507
468`$data` is an array containing the link being saved: 508`$data` is an array containing the link being deleted:
469 509
470- id 510- id
471- title 511- title
@@ -477,6 +517,7 @@ Allow to execute any action before the link is actually removed from the datasto
477- created 517- created
478- updated 518- updated
479 519
520Also [special data](#special-data).
480 521
481#### save_plugin_parameters 522#### save_plugin_parameters
482 523
@@ -485,15 +526,16 @@ Triggered when the plugin parameters are saved from the plugin administration pa
485Plugins can perform an action every times their settings are updated. 526Plugins can perform an action every times their settings are updated.
486For example it is used to update the CSS file of the `default_colors` plugins. 527For example it is used to update the CSS file of the `default_colors` plugins.
487 528
488##### Data 529##### data
489 530
490`$data` input contains the `$_POST` array. 531`$data` input contains the `$_POST` array.
491 532
492So if the plugin has a parameter called `MYPLUGIN_PARAMETER`, 533So if the plugin has a parameter called `MYPLUGIN_PARAMETER`,
493the array will contain an entry with `MYPLUGIN_PARAMETER` as a key. 534the array will contain an entry with `MYPLUGIN_PARAMETER` as a key.
494 535
536Also [special data](#special-data).
495 537
496## Guide for template designer 538## Guide for template designers
497 539
498### Plugin administration 540### Plugin administration
499 541
diff --git a/doc/md/dev/Release-Shaarli.md b/doc/md/dev/Release-Shaarli.md
new file mode 100644
index 00000000..2c772406
--- /dev/null
+++ b/doc/md/dev/Release-Shaarli.md
@@ -0,0 +1,145 @@
1# Release Shaarli
2
3## Requirements
4
5This guide assumes that you have:
6
7- a GPG key matching your GitHub authentication credentials/email (the email address identified by the GPG key is the same as the one in your `~/.gitconfig`)
8- a GitHub fork of Shaarli
9- a local clone of your Shaarli fork, with the following remotes:
10 - `origin` pointing to your GitHub fork
11 - `upstream` pointing to the main Shaarli repository
12- maintainer permissions on the main Shaarli repository, to:
13 - push the signed tag
14 - create a new release
15- [Composer](https://getcomposer.org/) needs to be installed
16- The [venv](https://docs.python.org/3/library/venv.html) Python 3 module needs to be installed for HTML documentation generation.
17
18## Release notes and `CHANGELOG.md`
19
20GitHub allows drafting the release notes for the upcoming release, from the [Releases](https://github.com/shaarli/Shaarli/releases) page. This way, the release note can be drafted while contributions are merged to `master`. See http://keepachangelog.com/en/0.3.0/ for changelog formatting.
21
22`CHANGELOG.md` should contain the same information as the release note draft for the upcoming version. Update it to:
23
24- add new entries (additions, fixes, etc.)
25- mark the current version as released by setting its date and link
26- add a new section for the future unreleased version
27
28```bash
29## [v0.x.y](https://github.com/shaarli/Shaarli/releases/tag/v0.x.y) - UNRELEASES
30
31### Added
32
33### Changed
34
35### Fixed
36
37### Removed
38
39### Deprecated
40
41### Security
42
43```
44
45
46## Update the list of Git contributors
47
48```bash
49$ make authors
50$ git commit -s -m "Update AUTHORS"
51```
52
53## Create and merge a Pull Request
54
55Create a Pull Request to marge changes from your remote, into `master` in the community Shaarli repository, and have it merged.
56
57
58## Create the release branch and update shaarli_version.php
59
60```bash
61# fetch latest changes from master to your local copy
62git checkout master
63git pull upstream master
64
65# If releasing a new minor version, create a release branch
66$ git checkout -b v0.x
67
68# Bump shaarli_version.php from dev to 0.x.0, **without the v**
69$ vim shaarli_version.php
70$ git add shaarli_version
71$ git commit -s -m "Bump Shaarli version to v0.x.0"
72$ git push upstream v0.x
73```
74
75## Create and push a signed tag
76
77Git [tags](http://git-scm.com/book/en/v2/Distributed-Git-Maintaining-a-Project#Tagging-Your-Releases) are used to identify specific revisions with a unique version number that follows [semantic versioning](https://semver.org/)
78
79```bash
80# update your local copy
81git checkout v0.5
82git pull upstream v0.5
83
84# create a signed tag
85git tag -s -m "Release v0.5.0" v0.5.0
86
87# push the tag to upstream
88git push --tags upstream
89```
90
91Here is how to verify a signed tag. [`v0.5.0`](https://github.com/shaarli/Shaarli/releases/tag/v0.5.0) is the first GPG-signed tag pushed on the Community Shaarli. Let's have a look at its signature!
92
93```bash
94# update the list of available tags
95git fetch upstream
96
97# get the SHA1 reference of the tag
98git show-ref tags/v0.5.0
99# gives: f7762cf803f03f5caf4b8078359a63783d0090c1 refs/tags/v0.5.0
100
101# verify the tag signature information
102git verify-tag f7762cf803f03f5caf4b8078359a63783d0090c1
103# gpg: Signature made Thu 30 Jul 2015 11:46:34 CEST using RSA key ID 4100DF6F
104# gpg: Good signature from "VirtualTam <virtualtam@flibidi.net>" [ultimate]
105```
106
107## Publish the GitHub release
108
109- In the `master` banch, update version badges in `README.md` to point to the newly released Shaarli version
110- Update the previously drafted [release](https://github.com/shaarli/Shaarli/releases) (notes, tag) and publish it
111- Profit!
112
113
114## Generate full release zip archives
115
116Release archives will contain Shaarli code plus all required third-party libraries. They are useful for users who:
117
118- have no SSH access, no possibility to install PHP packages/server extensions, no possibility to run scripts (shared hosting)
119- do not want to install build/dev dependencies on their server
120
121 `git checkout` the appropriate branch, then:
122
123```bash
124# checkout the appropriate branch
125git checkout 0.x.y
126# generate zip archives
127make release_archive
128```
129
130This will create `shaarli-v0.x.y-full.tar`, `shaarli-v0.x.y-full.zip`. These archives need to be manually uploaded on the previously created GitHub [release](https://github.com/shaarli/Shaarli/releases).
131
132
133### Update the `latest` branch
134
135```bash
136# checkout the 'latest' branch
137git checkout latest
138# merge changes from your newly published release branch
139git merge v0.x.y
140# fix eventual conflicts with git mergetool...
141# run tests
142make test
143# push the latest branch
144git push upstream latest
145```
diff --git a/doc/md/Theming.md b/doc/md/dev/Theming.md
index eb84e11c..1ad30465 100644
--- a/doc/md/Theming.md
+++ b/doc/md/dev/Theming.md
@@ -1,3 +1,5 @@
1# Theming
2
1## Foreword 3## Foreword
2 4
3There are two ways of customizing how Shaarli looks: 5There are two ways of customizing how Shaarli looks:
@@ -43,6 +45,7 @@ Installation:
43- [kalvn/shaarli-blocks](https://github.com/kalvn/shaarli-blocks) - A template/theme for Shaarli 45- [kalvn/shaarli-blocks](https://github.com/kalvn/shaarli-blocks) - A template/theme for Shaarli
44- [kalvn/Shaarli-Material](https://github.com/kalvn/Shaarli-Material) - A theme (template) based on Google's Material Design for Shaarli, the superfast delicious clone 46- [kalvn/Shaarli-Material](https://github.com/kalvn/Shaarli-Material) - A theme (template) based on Google's Material Design for Shaarli, the superfast delicious clone
45- [ManufacturaInd/shaarli-2004licious-theme](https://github.com/ManufacturaInd/shaarli-2004licious-theme) - A template/theme as a humble homage to the early looks of the del.icio.us site 47- [ManufacturaInd/shaarli-2004licious-theme](https://github.com/ManufacturaInd/shaarli-2004licious-theme) - A template/theme as a humble homage to the early looks of the del.icio.us site
48- [xfnw/shaarli-default-dark](https://github.com/xfnw/shaarli-default-dark) - The default theme but nice and dark for your eyeballs
46 49
47### Shaarli forks 50### Shaarli forks
48 51
diff --git a/doc/md/Translations.md b/doc/md/dev/Translations.md
index c23ec962..8f3b8f10 100644
--- a/doc/md/Translations.md
+++ b/doc/md/dev/Translations.md
@@ -7,87 +7,80 @@ Note that only the `default` theme supports translations.
7 7
8### Contributing 8### Contributing
9 9
10We encourage the community to contribute to Shaarli's translation either by improving existing 10We encourage the community to contribute to Shaarli translations, either by improving existing translations or submitting a new language.
11translations or submitting a new language.
12 11
13Contributing to the translation does not require development skill. 12Contributing to the translation does not require software development knowledge.
14 13
15Please submit a pull request with the `.po` file updated/created. Note that the compiled file (`.mo`) 14Please submit a pull request with the `.po` file updated/created. Note that the compiled file (`.mo`) is not stored on the repository, and is generated during the release process.
16is not stored on the repository, and is generated during the release process.
17 15
18### How to
19
20First, install [Poedit](https://poedit.net/) tool.
21
22Poedit will extract strings to translate from the PHP source code.
23 16
24**Important**: due to the usage of a template engine, it's important to generate PHP cache files to extract 17### How to
25every translatable string.
26 18
27You can either use [this script](https://gist.github.com/ArthurHoaro/5d0323f758ab2401ef444a53f54e9a07) (recommended) 19Install [Poedit](https://poedit.net/) (used to extract strings to translate from the PHP source code, and generate `.po` files).
28or visit every template page in your browser to generate cache files, while logged in.
29 20
30Here is a list : 21Due to the usage of a template engine, it's important to generate PHP cache files to extract every translatable string. You can either use [this script](https://gist.github.com/ArthurHoaro/5d0323f758ab2401ef444a53f54e9a07) (recommended) or visit every template page in your browser to generate cache files, while logged in. Here is a list :
31 22
32``` 23```
33http://<replace_domain>/ 24http://<replace_domain>/
25http://<replace_domain>/login
26http://<replace_domain>/daily
27http://<replace_domain>/tags/cloud
28http://<replace_domain>/tags/list
29http://<replace_domain>/picture-wall
34http://<replace_domain>/?nonope 30http://<replace_domain>/?nonope
35http://<replace_domain>/admin/add-shaare 31http://<replace_domain>/admin/add-shaare
36http://<replace_domain>/admin/password 32http://<replace_domain>/admin/password
37http://<replace_domain>/admin/tags 33http://<replace_domain>/admin/tags
38http://<replace_domain>/admin/configure 34http://<replace_domain>/admin/configure
39http://<replace_domain>/admin/tools 35http://<replace_domain>/admin/tools
40http://<replace_domain>/daily
41http://<replace_domain>/admin/shaare 36http://<replace_domain>/admin/shaare
42http://<replace_domain>/admin/export 37http://<replace_domain>/admin/export
43http://<replace_domain>/admin/import 38http://<replace_domain>/admin/import
44http://<replace_domain>/login
45http://<replace_domain>/picture-wall
46http://<replace_domain>/admin/plugins 39http://<replace_domain>/admin/plugins
47http://<replace_domain>/tags/cloud
48http://<replace_domain>/tags/list
49``` 40```
50 41
51#### Improve existing translation
52
53In Poedit, click on "Edit a Translation", and from Shaarli's directory open
54`inc/languages/<lang>/LC_MESSAGES/shaarli.po`.
55 42
56The existing list of translatable strings should have been loaded, then click on the "Update" button. 43#### Improve existing translations
57 44
58You can start editing the translation. 45- In Poedit, click on "Edit a Translation
46- Open `inc/languages/<lang>/LC_MESSAGES/shaarli.po` under Shaarli's directory
47- The existing list of translatable strings should load
48- Click on the "Update" button.
49- Start editing translations.
59 50
60![poedit-screenshot](images/poedit-1.jpg) 51![poedit-screenshot](images/poedit-1.jpg)
61 52
62Save when you're done, then you can submit a pull request containing the updated `shaarli.po`. 53Save when you're done, then you can submit a pull request containing the updated `shaarli.po`.
63 54
64#### Add a new language
65
66Open Poedit and select "Create New Translation", then from Shaarli's directory open
67`inc/languages/<lang>/LC_MESSAGES/shaarli.po`.
68
69Then select the language you want to create.
70 55
71Click on `File > Save as...`, and save your file in `<shaarli directory>/inc/language/<new language>/LC_MESSAGES/shaarli.po`. 56#### Add a new language
72`<new language>` here should be the language code respecting the [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-2)
73format in lowercase (e.g. `de` for German).
74 57
75Then click on the "Update" button, and you can start to translate every available string. 58- In Poedit select "Create New Translation"
59- Open `inc/languages/<lang>/LC_MESSAGES/shaarli.po` under Shaarli's directory
60- Select the language you want to create.
61- Click on `File > Save as...`, save your file in `<shaarli directory>/inc/language/<new language>/LC_MESSAGES/shaarli.po` (`<new language>` here should be the language code respecting the [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-2) format in lowercase - e.g. `de` for German)
62- Click on the "Update" button
63- Start editing translations.
76 64
77Save when you're done, then you can submit a pull request containing the new `shaarli.po`. 65Save when you're done, then you can submit a pull request containing the new `shaarli.po`.
78 66
67
79### Theme translations 68### Theme translations
80 69
81Theme translation extensions are loaded automatically if they're present. 70[Theme](Theming) translation extensions are loaded automatically if they're present.
82 71
83As a theme developer, all you have to do is to add the `.po` and `.mo` compiled file like this: 72As a theme developer, all you have to do is to add the `.po` and `.mo` compiled file like this:
84 73
85 tpl/<theme name>/language/<lang>/LC_MESSAGES/<theme name>.po 74```
86 tpl/<theme name>/language/<lang>/LC_MESSAGES/<theme name>.mo 75tpl/<theme name>/language/<lang>/LC_MESSAGES/<theme name>.po
76tpl/<theme name>/language/<lang>/LC_MESSAGES/<theme name>.mo
77```
87 78
88Where `<lang>` is the ISO 3166-1 alpha-2 language code. 79Where `<lang>` is the ISO 3166-1 alpha-2 language code.
80
89Read the following section "Extend Shaarli's translation" to learn how to generate those files. 81Read the following section "Extend Shaarli's translation" to learn how to generate those files.
90 82
83
91### Extend Shaarli's translation 84### Extend Shaarli's translation
92 85
93If you're writing a custom theme, or a non official plugin, you might want to use the translation system, 86If you're writing a custom theme, or a non official plugin, you might want to use the translation system,
diff --git a/doc/md/dev/Unit-tests.md b/doc/md/dev/Unit-tests.md
new file mode 100644
index 00000000..fd286bf0
--- /dev/null
+++ b/doc/md/dev/Unit-tests.md
@@ -0,0 +1,133 @@
1# Unit tests
2
3Shaarli uses the [PHPUnit](https://phpunit.de/) test framework; it can be installed with [Composer](https://getcomposer.org/), which is a dependency management tool.
4
5## Install composer
6
7You can either use:
8
9- a system-wide version, e.g. installed through your distro's package manager
10- a local version, downloadable [here](https://getcomposer.org/download/).
11
12```bash
13# for Debian-based distros
14sudo apt install composer
15```
16
17
18## Install Shaarli dev dependencies
19
20```bash
21$ cd /path/to/shaarli
22$ make composer_dependencies_dev
23```
24
25## Install and enable Xdebug to generate PHPUnit coverage reports
26
27
28[Xdebug](http://xdebug.org/docs/install) is a PHP extension which provides debugging and profiling capabilities. Install Xdebug:
29
30```bash
31# for Debian-based distros:
32sudo apt install php-xdebug
33
34# for ArchLinux:
35pacman -S xdebug
36
37# then add the following line to /etc/php/php.ini
38zend_extension=xdebug.so
39```
40
41## Run unit tests
42
43Ensure tests pass successuflly:
44
45```bash
46make test
47# ...
48# OK (36 tests, 65 assertions)
49```
50
51In case of failure the test suite will point you to actual errors and output a summary:
52
53```bash
54make test
55# ...
56# FAILURES!
57# Tests: 36, Assertions: 63, Errors: 1, Failures: 2.
58```
59
60By default, PHPUnit will run all suitable tests found under the `tests` directory. Each test has 3 possible outcomes:
61
62- `.` - success
63- `F` - failure: the test was run but its results are invalid
64 - the code does not behave as expected
65 - dependencies to external elements: globals, session, cache...
66- `E` - error: something went wrong and the tested code has crashed
67 - typos in the code, or in the test code
68 - dependencies to missing external elements
69
70If Xdebug has been installed and activated, two coverage reports will be generated:
71
72- a summary in the console
73- a detailed HTML report with metrics for tested code
74 - to open it in a web browser: `firefox coverage/index.html &`
75
76
77### Executing specific tests
78
79Add a [`@group`](https://phpunit.de/manual/current/en/appendixes.annotations.html#appendixes.annotations.group) annotation in a test class or method comment:
80
81```php
82/**
83 * Netscape bookmark import
84 * @group WIP
85 */
86class BookmarkImportTest extends PHPUnit_Framework_TestCase
87{
88 [...]
89}
90```
91
92To run all tests annotated with `@group WIP`:
93```bash
94$ vendor/bin/phpunit --group WIP tests/
95```
96
97## Running tests inside Docker containers
98
99Unit tests can be run inside [Docker](../Docker.md) containers.
100
101Test Dockerfiles are located under `tests/docker/<distribution>/Dockerfile`, and can be used to build Docker images to run Shaarli test suites under commonLinux environments. Dockerfiles are provided for the following environments:
102
103- [`alpine36`](https://github.com/shaarli/Shaarli/blob/master/tests/docker/alpine36/Dockerfile) - [Alpine Linux 3.6](https://www.alpinelinux.org/downloads/)
104- [`debian8`](https://github.com/shaarli/Shaarli/blob/master/tests/docker/debian8/Dockerfile) - [Debian 8 Jessie](https://www.debian.org/DebianJessie) (oldoldstable)
105- [`debian9`](https://github.com/shaarli/Shaarli/blob/master/tests/docker/debian9/Dockerfile) - [Debian 9 Stretch](https://wiki.debian.org/DebianStretch) (oldstable)
106- [`ubuntu16`](https://github.com/shaarli/Shaarli/blob/master/tests/docker/ubuntu16/Dockerfile) - [Ubuntu 16.04 Xenial Xerus](http://releases.ubuntu.com/16.04/) (old LTS)
107
108Each image provides:
109- a base Linux OS
110- Shaarli PHP dependencies (OS packages)
111- test PHP dependencies (OS packages)
112- Composer
113- Tests that run inside the conatiner using a standard Linux user account (running tests as `root` would bypass permission checks and may hide issues)
114
115Build a test image:
116
117```bash
118# build the Debian 9 Docker image
119cd /path/to/shaarli/tests/docker/debian9
120docker build -t shaarli-test:debian9 .
121```
122
123Run unit tests in a container:
124
125```bash
126cd /path/to/shaarli
127# install/update 3rd-party test dependencies
128composer install --prefer-dist
129# run tests using the freshly built image
130docker run -v $PWD:/shaarli shaarli-test:debian9 docker_test
131# run the full test campaign
132docker run -v $PWD:/shaarli shaarli-test:debian9 docker_all_tests
133```
diff --git a/doc/md/Versioning-and-Branches.md b/doc/md/dev/Versioning.md
index 7097ca0a..32c80a5c 100644
--- a/doc/md/Versioning-and-Branches.md
+++ b/doc/md/dev/Versioning.md
@@ -1,6 +1,7 @@
1**WORK IN PROGRESS** 1# Versioning
2
3If you're maintaining a 3rd party tool for Shaarli (theme, plugin, etc.), It's important to understand how Shaarli branches work ensure your tool stays compatible.
2 4
3It's important to understand how Shaarli branches work, especially if you're maintaining a 3rd party tools for Shaarli (theme, plugin, etc.), to be sure stay compatible.
4 5
5## `master` branch 6## `master` branch
6 7
@@ -11,39 +12,26 @@ Remarks:
11- This branch shouldn't be used for production as it isn't necessary stable. 12- This branch shouldn't be used for production as it isn't necessary stable.
12- 3rd party aren't required to be compatible with the latest changes. 13- 3rd party aren't required to be compatible with the latest changes.
13- Official plugins, themes and libraries (contained within Shaarli organization repos) must be compatible with the master branch. 14- Official plugins, themes and libraries (contained within Shaarli organization repos) must be compatible with the master branch.
14- The version in this branch is always `dev`.
15 15
16## `v0.x` branch
17 16
18This `v0.x` branch, points to the latest `v0.x.y` release. 17## `v0.x` branch
19 18
20Explanation: 19The `v0.x` branch points to the latest `v0.x.y` release.
21 20
22When a new version is released, it might contains a major bug which isn't detected right away. For example, a new PHP version is released, containing backward compatibility issue which doesn't work with Shaarli. 21If a major bug affects the original `v0.x.0` release, we may [backport](https://en.wikipedia.org/wiki/Backporting) a fix for this bug from master, to the `v0.x` branch, and create a new bugfix release (eg. `v0.x.1`) from this branch.
23 22
24In this case, the issue is fixed in the `master` branch, and the fix is backported the to the `v0.x` branch. Then a new release is made from the `v0.x` branch. 23This allows users of the original release to upgrade to the fixed version, without having to upgrade to a completely new minor/major release.
25 24
26This workflow allow us to fix any major bug detected, without having to release bleeding edge feature too soon.
27 25
28## `latest` branch 26## `latest` branch
29 27
30This branch point the latest release. It recommended to use it to get the latest tested changes. 28This branch point the latest release. It recommended to use it to get the latest tested changes.
31 29
32## `stable` branch
33
34The `stable` branch doesn't contain any major bug, and is one major digit version behind the latest release.
35
36For example, the current latest release is `v0.8.3`, the stable branch is an alias to the latest `v0.7.x` release. When the `v0.9.0` version will be released, the stable will move to the latest `v0.8.x` release.
37
38Remarks:
39
40- Shaarli release pace isn't fast, and the stable branch might be a few months behind the latest release.
41 30
42## Releases 31## Releases
43 32
44Releases are always made from the latest `v0.x` branch. 33For every release, we manually generate a .zip file which contains all Shaarli dependencies, making Shaarli's installation only one step.
45 34
46Note that for every release, we manually generate a tarball which contains all Shaarli dependencies, making Shaarli's installation only one step.
47 35
48## Advices on 3rd party git repos workflow 36## Advices on 3rd party git repos workflow
49 37
diff --git a/doc/md/images/poedit-1.jpg b/doc/md/dev/images/poedit-1.jpg
index 673ae6d6..673ae6d6 100644
--- a/doc/md/images/poedit-1.jpg
+++ b/doc/md/dev/images/poedit-1.jpg
Binary files differ
diff --git a/doc/md/docker/docker-101.md b/doc/md/docker/docker-101.md
deleted file mode 100644
index a9c00b85..00000000
--- a/doc/md/docker/docker-101.md
+++ /dev/null
@@ -1,140 +0,0 @@
1## Basics
2Install [Docker](https://www.docker.com/), by following the instructions relevant
3to your OS / distribution, and start the service.
4
5### Search an image on [DockerHub](https://hub.docker.com/)
6
7```bash
8$ docker search debian
9
10NAME DESCRIPTION STARS OFFICIAL AUTOMATED
11ubuntu Ubuntu is a Debian-based Linux operating s... 2065 [OK]
12debian Debian is a Linux distribution that's comp... 603 [OK]
13google/debian 47 [OK]
14```
15
16### Show available tags for a repository
17```bash
18$ curl https://index.docker.io/v1/repositories/debian/tags | python -m json.tool
19
20% Total % Received % Xferd Average Speed Time Time Time Current
21Dload Upload Total Spent Left Speed
22100 1283 0 1283 0 0 433 0 --:--:-- 0:00:02 --:--:-- 433
23```
24
25Sample output:
26```json
27[
28 {
29 "layer": "85a02782",
30 "name": "stretch"
31 },
32 {
33 "layer": "59abecbc",
34 "name": "testing"
35 },
36 {
37 "layer": "bf0fd686",
38 "name": "unstable"
39 },
40 {
41 "layer": "60c52dbe",
42 "name": "wheezy"
43 },
44 {
45 "layer": "c5b806fe",
46 "name": "wheezy-backports"
47 }
48]
49
50```
51
52### Pull an image from DockerHub
53```bash
54$ docker pull repository[:tag]
55
56$ docker pull debian:wheezy
57wheezy: Pulling from debian
584c8cbfd2973e: Pull complete
5960c52dbe9d91: Pull complete
60Digest: sha256:c584131da2ac1948aa3e66468a4424b6aea2f33acba7cec0b631bdb56254c4fe
61Status: Downloaded newer image for debian:wheezy
62```
63
64Docker re-uses layers already downloaded. In other words if you have images based on Alpine or some Ubuntu version for example, those can share disk space.
65
66### Start a container
67A container is an instance created from an image, that can be run and that keeps running until its main process exits. Or until the user stops the container.
68
69The simplest way to start a container from image is ``docker run``. It also pulls the image for you if it is not locally available. For more advanced use, refer to ``docker create``.
70
71Stopped containers are not destroyed, unless you specify ``--rm``. To view all created, running and stopped containers, enter:
72```bash
73$ docker ps -a
74```
75
76Some containers may be designed or configured to be restarted, others are not. Also remember both network ports and volumes of a container are created on start, and not editable later.
77
78### Access a running container
79A running container is accessible using ``docker exec``, or ``docker copy``. You can use ``exec`` to start a root shell in the Shaarli container:
80```bash
81$ docker exec -ti <container-name-or-id> bash
82```
83Note the names and ID's of containers are listed in ``docker ps``. You can even type only one or two letters of the ID, given they are unique.
84
85Access can also be through one or more network ports, or disk volumes. Both are specified on and fixed on ``docker create`` or ``run``.
86
87You can view the console output of the main container process too:
88```bash
89$ docker logs -f <container-name-or-id>
90```
91
92### Docker disk use
93Trying out different images can fill some gigabytes of disk quickly. Besides images, the docker volumes usually take up most disk space.
94
95If you care only about trying out docker and not about what is running or saved, the following commands should help you out quickly if you run low on disk space:
96
97```bash
98$ docker rmi -f $(docker images -aq) # remove or mark all images for disposal
99$ docker volume rm $(docker volume ls -q) # remove all volumes
100```
101
102### Systemd config
103Systemd is the process manager of choice on Debian-based distributions. Once you have a ``docker`` service installed, you can use the following steps to set up Shaarli to run on system start.
104
105```bash
106systemctl enable /etc/systemd/system/docker.shaarli.service
107systemctl start docker.shaarli
108systemctl status docker.*
109journalctl -f # inspect system log if needed
110```
111
112You will need sudo or a root terminal to perform some or all of the steps above. Here are the contents for the service file:
113```
114[Unit]
115Description=Shaarli Bookmark Manager Container
116After=docker.service
117Requires=docker.service
118
119
120[Service]
121Restart=always
122
123# Put any environment you want in an included file, like $host- or $domainname in this example
124EnvironmentFile=/etc/sysconfig/box-environment
125
126# It's just an example..
127ExecStart=/usr/bin/docker run \
128 -p 28010:80 \
129 --name ${hostname}-shaarli \
130 --hostname shaarli.${domainname} \
131 -v /srv/docker-volumes-local/shaarli-data:/var/www/shaarli/data:rw \
132 -v /etc/localtime:/etc/localtime:ro \
133 shaarli/shaarli:latest
134
135ExecStop=/usr/bin/docker rm -f ${hostname}-shaarli
136
137
138[Install]
139WantedBy=multi-user.target
140```
diff --git a/doc/md/docker/resources.md b/doc/md/docker/resources.md
deleted file mode 100644
index 082d4a46..00000000
--- a/doc/md/docker/resources.md
+++ /dev/null
@@ -1,19 +0,0 @@
1### Docker
2
3- [Interactive Docker training portal](https://www.katacoda.com/courses/docker/) on [Katakoda](https://www.katacoda.com/)
4- [Where are Docker images stored?](http://blog.thoward37.me/articles/where-are-docker-images-stored/)
5- [Dockerfile reference](https://docs.docker.com/reference/builder/)
6- [Dockerfile best practices](https://docs.docker.com/articles/dockerfile_best-practices/)
7- [Volumes](https://docs.docker.com/userguide/dockervolumes/)
8
9### DockerHub
10
11- [Repositories](https://docs.docker.com/userguide/dockerrepos/)
12- [Teams and organizations](https://docs.docker.com/docker-hub/orgs/)
13- [GitHub automated build](https://docs.docker.com/docker-hub/github/)
14
15### Service management
16
17- [Using supervisord](https://docs.docker.com/articles/using_supervisord/)
18- [Nginx in the foreground](http://nginx.org/en/docs/ngx_core_module.html#daemon)
19- [supervisord](http://supervisord.org/)
diff --git a/doc/md/docker/reverse-proxy-configuration.md b/doc/md/docker/reverse-proxy-configuration.md
deleted file mode 100644
index e53c9422..00000000
--- a/doc/md/docker/reverse-proxy-configuration.md
+++ /dev/null
@@ -1,123 +0,0 @@
1## Foreword
2
3This guide assumes that:
4
5- Shaarli runs in a Docker container
6- The host's `10080` port is mapped to the container's `80` port
7- Shaarli's Fully Qualified Domain Name (FQDN) is `shaarli.domain.tld`
8- HTTP traffic is redirected to HTTPS
9
10## Apache
11
12- [Apache 2.4 documentation](https://httpd.apache.org/docs/2.4/)
13 - [mod_proxy](https://httpd.apache.org/docs/2.4/mod/mod_proxy.html)
14 - [Reverse Proxy Request Headers](https://httpd.apache.org/docs/2.4/mod/mod_proxy.html#x-headers)
15
16The following HTTP headers are set when the `ProxyPass` directive is set:
17
18- `X-Forwarded-For`
19- `X-Forwarded-Host`
20- `X-Forwarded-Server`
21
22The original `SERVER_NAME` can be sent to the proxied host by setting the [`ProxyPreserveHost`](https://httpd.apache.org/docs/2.4/mod/mod_proxy.html#ProxyPreserveHost) directive to `On`.
23
24```apache
25<VirtualHost *:80>
26 ServerName shaarli.domain.tld
27 Redirect permanent / https://shaarli.domain.tld
28</VirtualHost>
29
30<VirtualHost *:443>
31 ServerName shaarli.domain.tld
32
33 SSLEngine on
34 SSLCertificateFile /path/to/cert
35 SSLCertificateKeyFile /path/to/certkey
36
37 LogLevel warn
38 ErrorLog /var/log/apache2/shaarli-error.log
39 CustomLog /var/log/apache2/shaarli-access.log combined
40
41 RequestHeader set X-Forwarded-Proto "https"
42 ProxyPreserveHost On
43
44 ProxyPass / http://127.0.0.1:10080/
45 ProxyPassReverse / http://127.0.0.1:10080/
46</VirtualHost>
47```
48
49
50## HAProxy
51
52- [HAProxy documentation](https://cbonte.github.io/haproxy-dconv/)
53
54```conf
55global
56 [...]
57
58defaults
59 [...]
60
61frontend http-in
62 bind :80
63 redirect scheme https code 301 if !{ ssl_fc }
64
65 bind :443 ssl crt /path/to/cert.pem
66
67 default_backend shaarli
68
69
70backend shaarli
71 mode http
72 option http-server-close
73 option forwardfor
74 reqadd X-Forwarded-Proto: https
75
76 server shaarli1 127.0.0.1:10080
77```
78
79
80## Nginx
81
82- [Nginx documentation](https://nginx.org/en/docs/)
83
84```nginx
85http {
86 [...]
87
88 index index.html index.php;
89
90 root /home/john/web;
91 access_log /var/log/nginx/access.log;
92 error_log /var/log/nginx/error.log;
93
94 server {
95 listen 80;
96 server_name shaarli.domain.tld;
97 return 301 https://shaarli.domain.tld$request_uri;
98 }
99
100 server {
101 listen 443 ssl http2;
102 server_name shaarli.domain.tld;
103
104 ssl_certificate /path/to/cert
105 ssl_certificate_key /path/to/certkey
106
107 location / {
108 proxy_set_header X-Real-IP $remote_addr;
109 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
110 proxy_set_header X-Forwarded-Proto $scheme;
111 proxy_set_header X-Forwarded-Host $host;
112
113 proxy_pass http://localhost:10080/;
114 proxy_set_header Host $host;
115 proxy_connect_timeout 30s;
116 proxy_read_timeout 120s;
117
118 access_log /var/log/nginx/shaarli.access.log;
119 error_log /var/log/nginx/shaarli.error.log;
120 }
121 }
122}
123```
diff --git a/doc/md/docker/shaarli-images.md b/doc/md/docker/shaarli-images.md
deleted file mode 100644
index 14971d54..00000000
--- a/doc/md/docker/shaarli-images.md
+++ /dev/null
@@ -1,118 +0,0 @@
1A brief guide on getting starting using docker is given in [Docker 101](docker-101.md).
2To learn more about user data and how to keep it across versions, please see [Upgrade and Migration](../Upgrade-and-migration.md).
3
4## Get and run a Shaarli image
5
6### DockerHub repository
7The images can be found in the [`shaarli/shaarli`](https://hub.docker.com/r/shaarli/shaarli/)
8repository.
9
10### Available image tags
11- `latest`: latest branch
12- `master`: master branch
13- `stable`: stable branch
14
15The `latest`, `master` and `stable` images rely on:
16
17- [Alpine Linux](https://www.alpinelinux.org/)
18- [PHP7-FPM](http://php-fpm.org/)
19- [Nginx](http://nginx.org/)
20
21Additional Dockerfiles are provided for the `arm32v7` platform, relying on
22[Linuxserver.io Alpine armhf
23images](https://hub.docker.com/r/lsiobase/alpine.armhf/). These images must be
24built using [`docker
25build`](https://docs.docker.com/engine/reference/commandline/build/) on an
26`arm32v7` machine or using an emulator such as
27[qemu](https://resin.io/blog/building-arm-containers-on-any-x86-machine-even-dockerhub/).
28
29### Download from Docker Hub
30```shell
31$ docker pull shaarli/shaarli
32
33latest: Pulling from shaarli/shaarli
3432716d9fcddb: Pull complete
3584899d045435: Pull complete
364b6ad7444763: Pull complete
37e0345ef7a3e0: Pull complete
385c1dd344094f: Pull complete
396422305a200b: Pull complete
407d63f861dbef: Pull complete
413eb97210645c: Pull complete
42869319d746ff: Already exists
43869319d746ff: Pulling fs layer
44902b87aaaec9: Already exists
45Digest: sha256:f836b4627b958b3f83f59c332f22f02fcd495ace3056f2be2c4912bd8704cc98
46Status: Downloaded newer image for shaarli/shaarli:latest
47```
48
49### Create and start a new container from the image
50```shell
51# map the host's :8000 port to the container's :80 port
52$ docker create -p 8000:80 shaarli/shaarli
53d40b7af693d678958adedfb88f87d6ea0237186c23de5c4102a55a8fcb499101
54
55# launch the container in the background
56$ docker start d40b7af693d678958adedfb88f87d6ea0237186c23de5c4102a55a8fcb499101
57d40b7af693d678958adedfb88f87d6ea0237186c23de5c4102a55a8fcb499101
58
59# list active containers
60$ docker ps
61CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
62d40b7af693d6 shaarli/shaarli /usr/bin/supervisor 15 seconds ago Up 4 seconds 0.0.0.0:8000->80/tcp backstabbing_galileo
63```
64
65### Stop and destroy a container
66```shell
67$ docker stop backstabbing_galileo # those docker guys are really rude to physicists!
68backstabbing_galileo
69
70# check the container is stopped
71$ docker ps
72CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
73
74# list ALL containers
75$ docker ps -a
76CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
77d40b7af693d6 shaarli/shaarli /usr/bin/supervisor 5 minutes ago Exited (0) 48 seconds ago backstabbing_galileo
78
79# destroy the container
80$ docker rm backstabbing_galileo # let's put an end to these barbarian practices
81backstabbing_galileo
82
83$ docker ps -a
84CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
85```
86
87### Automatic builds
88Docker users can start a personal instance from an
89[autobuild image](https://hub.docker.com/r/shaarli/shaarli/).
90For example to start a temporary Shaarli at ``localhost:8000``, and keep session
91data (config, storage):
92
93```shell
94MY_SHAARLI_VOLUME=$(cd /path/to/shaarli/data/ && pwd -P)
95docker run -ti --rm \
96 -p 8000:80 \
97 -v $MY_SHAARLI_VOLUME:/var/www/shaarli/data \
98 shaarli/shaarli
99```
100
101### Volumes and data persistence
102Data can be persisted by [using volumes](https://docs.docker.com/storage/volumes/).
103Volumes allow to keep your data when renewing and/or updating container images:
104
105```shell
106# Create data volumes
107$ docker volume create shaarli-data
108$ docker volume create shaarli-cache
109
110# Create and start a Shaarli container using these volumes to persist data
111$ docker create \
112 --name shaarli \
113 -v shaarli-cache:/var/www/shaarli/cache \
114 -v shaarli-data:/var/www/shaarli/data \
115 -p 8000:80 \
116 shaarli/shaarli:master
117$ docker start shaarli
118```
diff --git a/doc/md/guides/backup-restore-import-export.md b/doc/md/guides/backup-restore-import-export.md
deleted file mode 100644
index bb790074..00000000
--- a/doc/md/guides/backup-restore-import-export.md
+++ /dev/null
@@ -1,64 +0,0 @@
1## Backup and restore the datastore file
2
3Backup the file `data/datastore.php` (by FTP or SSH). Restore by putting the file back in place.
4
5Example command:
6```bash
7rsync -avzP my.server.com:/var/www/shaarli/data/datastore.php datastore-$(date +%Y-%m-%d_%H%M).php
8```
9
10## Export links as...
11
12To export links as an HTML file, under _Tools > Export_, choose:
13
14- _Export all_ to export both public and private links
15- _Export public_ to export public links only
16- _Export private_ to export private links only
17
18Restore by using the `Import` feature.
19
20- This can be done using the [shaarchiver](https://github.com/nodiscc/shaarchiver) tool.
21
22Example command:
23```bash
24./export-bookmarks.py --url=https://my.server.com/shaarli --username=myusername --password=mysupersecretpassword --download-dir=./ --type=all
25```
26
27## Import links from...
28
29### Diigo
30
31If you export your bookmark from Diigo, make sure you use the Delicious export, not the Netscape export. (Their Netscape export is broken, and they don't seem to be interested in fixing it.)
32
33### Mister Wong
34
35See [this issue](https://github.com/sebsauvage/Shaarli/issues/146) for import tweaks.
36
37### SemanticScuttle
38
39To correctly import the tags from a [SemanticScuttle](http://semanticscuttle.sourceforge.net/) HTML export, edit the HTML file before importing and replace all occurences of `tags=` (lowercase) to `TAGS=` (uppercase).
40
41### Scuttle
42
43Shaarli cannot import data directly from [Scuttle](https://github.com/scronide/scuttle).
44
45However, you can use the third-party [scuttle-to-shaarli](https://github.com/q2apro/scuttle-to-shaarli)
46tool to export the Scuttle database to the Netscape HTML format compatible with the Shaarli importer.
47
48### Refind
49
50You can use the third-party tool [Derefind](https://github.com/ShawnPConroy/Derefind) to convert refind.com bookmark exports to a format that can be imported into Shaarli.
51
52## Import Shaarli links to Firefox
53
54- Export your Shaarli links as described above.
55 - For compatibility reasons, check `Prepend note permalinks with this Shaarli instance's URL (useful to import bookmarks in a web browser)`
56- In Firefox, open the bookmark manager (not the sidebar! `Bookmarks menu > Show all bookmarks` or `Ctrl+Shift+B`)
57- Select `Import and Backup > Import bookmarks in HTML format`
58
59Your bookmarks will be imported in Firefox, ready to use, with tags and descriptions retained. "Self" (notes) shaares will still point to the Shaarli instance you exported them from, but the note text can be viewed directly in the bookmark properties inside your browser. Depending on the number of bookmarks, the import can take some time.
60
61You may be interested in these Firefox addons to manage links imported from Shaarli
62
63- [Bookmark Deduplicator](https://addons.mozilla.org/en-US/firefox/addon/bookmark-deduplicator/) - provides an easy way to deduplicate your bookmarks
64- [TagSieve](https://addons.mozilla.org/en-US/firefox/addon/tagsieve/) - browse your bookmarks by their tags
diff --git a/doc/md/guides/images/01-create-droplet-distro.jpg b/doc/md/guides/images/01-create-droplet-distro.jpg
deleted file mode 100644
index 63682ba8..00000000
--- a/doc/md/guides/images/01-create-droplet-distro.jpg
+++ /dev/null
Binary files differ
diff --git a/doc/md/guides/images/02-create-droplet-region.jpg b/doc/md/guides/images/02-create-droplet-region.jpg
deleted file mode 100644
index 135a78be..00000000
--- a/doc/md/guides/images/02-create-droplet-region.jpg
+++ /dev/null
Binary files differ
diff --git a/doc/md/guides/images/03-create-droplet-size.jpg b/doc/md/guides/images/03-create-droplet-size.jpg
deleted file mode 100644
index aa5b2fd2..00000000
--- a/doc/md/guides/images/03-create-droplet-size.jpg
+++ /dev/null
Binary files differ
diff --git a/doc/md/guides/images/04-finalize.jpg b/doc/md/guides/images/04-finalize.jpg
deleted file mode 100644
index 68ec0dc5..00000000
--- a/doc/md/guides/images/04-finalize.jpg
+++ /dev/null
Binary files differ
diff --git a/doc/md/guides/images/05-droplet.jpg b/doc/md/guides/images/05-droplet.jpg
deleted file mode 100644
index 44e93a1e..00000000
--- a/doc/md/guides/images/05-droplet.jpg
+++ /dev/null
Binary files differ
diff --git a/doc/md/guides/images/06-domain.jpg b/doc/md/guides/images/06-domain.jpg
deleted file mode 100644
index 5827dd93..00000000
--- a/doc/md/guides/images/06-domain.jpg
+++ /dev/null
Binary files differ
diff --git a/doc/md/guides/install-shaarli-with-debian9-and-docker.md b/doc/md/guides/install-shaarli-with-debian9-and-docker.md
deleted file mode 100644
index f1b26d47..00000000
--- a/doc/md/guides/install-shaarli-with-debian9-and-docker.md
+++ /dev/null
@@ -1,257 +0,0 @@
1_Last updated on 2018-07-01._
2
3## Goals
4- Getting a Virtual Private Server (VPS)
5- Running Shaarli:
6 - as a Docker container,
7 - using the Træfik reverse proxy,
8 - securized with TLS certificates from Let's Encrypt.
9
10
11The following components and tools will be used:
12
13- [Debian](https://www.debian.org/), a GNU/Linux distribution widely used in
14 server environments;
15- [Docker](https://docs.docker.com/engine/docker-overview/), an open platform
16 for developing, shipping, and running applications;
17- [Docker Compose](https://docs.docker.com/compose/), a tool for defining and
18 running multi-container Docker applications.
19
20
21More information can be found in the [Resources](#resources) section at the
22bottom of the guide.
23
24## Getting a Virtual Private Server
25For this guide, I went for the smallest VPS available from DigitalOcean,
26a Droplet with 1 CPU, 1 GiB RAM and 25 GiB SSD storage, which costs
27$5/month ($0.007/hour):
28
29- [Droplets Overview](https://www.digitalocean.com/docs/droplets/overview/)
30- [Pricing](https://www.digitalocean.com/pricing/)
31- [How to Create a Droplet from the DigitalOcean Control Panel](https://www.digitalocean.com/docs/droplets/how-to/create/)
32- [How to Add SSH Keys to Droplets](https://www.digitalocean.com/docs/droplets/how-to/add-ssh-keys/)
33- [Initial Server Setup with Debian 8](https://www.digitalocean.com/community/tutorials/initial-server-setup-with-debian-8) (also applies to Debian 9)
34- [An Introduction to Securing your Linux VPS](https://www.digitalocean.com/community/tutorials/an-introduction-to-securing-your-linux-vps)
35
36### Creating a Droplet
37Select `Debian 9` as the Droplet distribution:
38
39<img src="../images/01-create-droplet-distro.jpg"
40 width="500px"
41 alt="Droplet distribution" />
42
43Choose a region that is geographically close to you:
44
45<img src="../images/02-create-droplet-region.jpg"
46 width="500px"
47 alt="Droplet region" />
48
49Choose a Droplet size that corresponds to your usage and budget:
50
51<img src="../images/03-create-droplet-size.jpg"
52 width="500px"
53 alt="Droplet size" />
54
55Finalize the Droplet creation:
56
57<img src="../images/04-finalize.jpg"
58 width="500px"
59 alt="Droplet finalization" />
60
61Droplet information is displayed on the Control Panel:
62
63<img src="../images/05-droplet.jpg"
64 width="500px"
65 alt="Droplet summary" />
66
67Once your VPS has been created, you will receive an e-mail with connection
68instructions.
69
70## Obtaining a domain name
71After creating your VPS, it will be reachable using its IP address; some hosting
72providers also create a DNS record, e.g. `ns4853142.ip-01-47-127.eu`.
73
74A domain name (DNS record) is required to obtain a certificate and setup HTTPS
75(HTTP with TLS encryption).
76
77Domain names can be obtained from registrars through hosting providers such as
78[Gandi](https://www.gandi.net/en/domain).
79
80Once you have your own domain, you need to create a new DNS record that points
81to your VPS' IP address:
82
83<img src="../images/06-domain.jpg"
84 width="650px"
85 alt="Domain configuration" />
86
87## Host setup
88Now's the time to connect to your freshly created VPS!
89
90```shell
91$ ssh root@188.166.85.8
92
93Linux stretch-shaarli-02 4.9.0-6-amd64 #1 SMP Debian 4.9.88-1+deb9u1 (2018-05-07) x86_64
94
95The programs included with the Debian GNU/Linux system are free software;
96the exact distribution terms for each program are described in the
97individual files in /usr/share/doc/*/copyright.
98
99Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
100permitted by applicable law.
101Last login: Sun Jul 1 11:20:18 2018 from <REDACTED>
102
103root@stretch-shaarli-02:~$
104```
105
106### Updating the system
107```shell
108root@stretch-shaarli-02:~$ apt update && apt upgrade -y
109```
110
111### Setting up Docker
112_The following instructions are from the
113[Get Docker CE for Debian](https://docs.docker.com/install/linux/docker-ce/debian/)
114guide._
115
116Install package dependencies:
117
118```shell
119root@stretch-shaarli-02:~$ apt install -y apt-transport-https ca-certificates curl gnupg2 software-properties-common
120```
121
122Add Docker's package repository GPG key:
123
124```shell
125root@stretch-shaarli-02:~$ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
126```
127
128Add Docker's package repository:
129
130```shell
131root@stretch-shaarli-02:~$ add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian stretch stable"
132```
133
134Update package lists and install Docker:
135
136```shell
137root@stretch-shaarli-02:~$ apt update && apt install -y docker-ce
138```
139
140Verify Docker is properly configured by running the `hello-world` image:
141
142```shell
143root@stretch-shaarli-02:~$ docker run hello-world
144```
145
146### Setting up Docker Compose
147_The following instructions are from the
148[Install Docker Compose](https://docs.docker.com/compose/install/)
149guide._
150
151Download the current version from the release page:
152
153```shell
154root@stretch-shaarli-02:~$ curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
155root@stretch-shaarli-02:~$ chmod +x /usr/local/bin/docker-compose
156```
157
158## Running Shaarli
159Shaarli comes with a configuration file for Docker Compose, that will setup:
160
161- a local Docker network
162- a Docker [volume](https://docs.docker.com/storage/volumes/) to store Shaarli data
163- a Docker [volume](https://docs.docker.com/storage/volumes/) to store Træfik TLS configuration and certificates
164- a [Shaarli](https://hub.docker.com/r/shaarli/shaarli/) instance
165- a [Træfik](https://hub.docker.com/_/traefik/) instance
166
167[Træfik](https://docs.traefik.io/) is a modern HTTP reverse proxy, with native
168support for Docker and [Let's Encrypt](https://letsencrypt.org/).
169
170### Compose configuration
171Create a new directory to store the configuration:
172
173```shell
174root@stretch-shaarli-02:~$ mkdir shaarli && cd shaarli
175root@stretch-shaarli-02:~/shaarli$
176```
177
178Download the current version of Shaarli's `docker-compose.yml`:
179
180```shell
181root@stretch-shaarli-02:~/shaarli$ curl -L https://raw.githubusercontent.com/shaarli/Shaarli/master/docker-compose.yml -o docker-compose.yml
182```
183
184Create the `.env` file and fill in your VPS and domain information (replace
185`<MY_SHAARLI_DOMAIN>` and `<MY_CONTACT_EMAIL>` with your actual information):
186
187```shell
188root@stretch-shaarli-02:~/shaarli$ vim .env
189```
190
191```shell
192SHAARLI_VIRTUAL_HOST=<MY_SHAARLI_DOMAIN>
193SHAARLI_LETSENCRYPT_EMAIL=<MY_CONTACT_EMAIL>
194```
195
196### Pull the Docker images
197```shell
198root@stretch-shaarli-02:~/shaarli$ docker-compose pull
199Pulling shaarli ... done
200Pulling traefik ... done
201```
202
203### Run!
204```shell
205root@stretch-shaarli-02:~/shaarli$ docker-compose up -d
206Creating network "shaarli_http-proxy" with the default driver
207Creating volume "shaarli_traefik-acme" with default driver
208Creating volume "shaarli_shaarli-data" with default driver
209Creating shaarli_shaarli_1 ... done
210Creating shaarli_traefik_1 ... done
211```
212
213## Conclusion
214Congratulations! Your Shaarli instance should be up and running, and available
215at `https://<MY_SHAARLI_DOMAIN>`.
216
217<img src="../images/07-installation.jpg"
218 width="500px"
219 alt="Shaarli installation page" />
220
221## Resources
222### Related Shaarli documentation
223- [Docker 101](../docker/docker-101.md)
224- [Shaarli images](../docker/shaarli-images.md)
225
226### Hosting providers
227- [DigitalOcean](https://www.digitalocean.com/)
228- [Gandi](https://www.gandi.net/en)
229- [OVH](https://www.ovh.co.uk/)
230- [RackSpace](https://www.rackspace.com/)
231- etc.
232
233### Domain Names and Registrars
234- [Introduction to the Domain Name System (DNS)](https://opensource.com/article/17/4/introduction-domain-name-system-dns)
235- [ICANN](https://www.icann.org/)
236- [Domain name registrar](https://en.wikipedia.org/wiki/Domain_name_registrar)
237- [OVH Domain Registration](https://www.ovh.co.uk/domains/)
238- [Gandi Domain Registration](https://www.gandi.net/en/domain)
239
240### HTTPS and Security
241- [Transport Layer Security](https://en.wikipedia.org/wiki/Transport_Layer_Security)
242- [Let's Encrypt](https://letsencrypt.org/)
243
244### Docker
245- [Docker Overview](https://docs.docker.com/engine/docker-overview/)
246- [Docker Documentation](https://docs.docker.com/)
247- [Get Docker CE for Debian](https://docs.docker.com/install/linux/docker-ce/debian/)
248- [docker logs](https://docs.docker.com/engine/reference/commandline/logs/)
249- [Volumes](https://docs.docker.com/storage/volumes/)
250- [Install Docker Compose](https://docs.docker.com/compose/install/)
251- [docker-compose logs](https://docs.docker.com/compose/reference/logs/)
252
253### Træfik
254- [Getting Started](https://docs.traefik.io/)
255- [Docker backend](https://docs.traefik.io/configuration/backends/docker/)
256- [Let's Encrypt and Docker](https://docs.traefik.io/user-guide/docker-and-lets-encrypt/)
257- [traefik](https://hub.docker.com/_/traefik/) Docker image
diff --git a/doc/md/guides/various-hacks.md b/doc/md/guides/various-hacks.md
deleted file mode 100644
index 0cef99df..00000000
--- a/doc/md/guides/various-hacks.md
+++ /dev/null
@@ -1,24 +0,0 @@
1### Decode datastore content
2
3To display the array representing the data saved in `data/datastore.php`, use the following snippet:
4
5```php
6$data = "tZNdb9MwFIb... <Commented content inside datastore.php>";
7$out = unserialize(gzinflate(base64_decode($data)));
8echo "<pre>"; // Pretty printing is love, pretty printing is life
9print_r($out);
10echo "</pre>";
11exit;
12```
13This will output the internal representation of the datastore, "unobfuscated" (if this can really be considered obfuscation).
14
15Alternatively, you can transform to JSON format (and pretty-print if you have `jq` installed):
16```
17php -r 'print(json_encode(unserialize(gzinflate(base64_decode(preg_replace("!.*/\* (.+) \*/.*!", "$1", file_get_contents("data/datastore.php")))))));' | jq .
18```
19
20### See also
21
22- [Add a new custom field to shaares (example patch)](https://gist.github.com/nodiscc/8b0194921f059d7b9ad89a581ecd482c)
23- [Copy an existing Shaarli installation over SSH, and serve it locally](https://gist.github.com/nodiscc/ed161c66e5b028b5299b0a3733d01c77)
24- [Create multiple Shaarli instances, generate an HTML index of them](https://gist.github.com/nodiscc/52e711cda3bc47717c16065231cf6b20)
diff --git a/doc/md/guides/images/07-installation.jpg b/doc/md/images/07-installation.jpg
index 42cc9f10..42cc9f10 100644
--- a/doc/md/guides/images/07-installation.jpg
+++ b/doc/md/images/07-installation.jpg
Binary files differ
diff --git a/doc/md/images/bookmarklet.png b/doc/md/images/bookmarklet.png
deleted file mode 100644
index 0262578e..00000000
--- a/doc/md/images/bookmarklet.png
+++ /dev/null
Binary files differ
diff --git a/doc/md/images/firefoxshare.png b/doc/md/images/firefoxshare.png
deleted file mode 100644
index 8f8fdba4..00000000
--- a/doc/md/images/firefoxshare.png
+++ /dev/null
Binary files differ
diff --git a/doc/md/images/install-shaarli.png b/doc/md/images/install-shaarli.png
deleted file mode 100644
index d5d5baa7..00000000
--- a/doc/md/images/install-shaarli.png
+++ /dev/null
Binary files differ
diff --git a/doc/md/index.md b/doc/md/index.md
index 1431f9e1..2c4995f8 100644
--- a/doc/md/index.md
+++ b/doc/md/index.md
@@ -2,21 +2,19 @@
2 2
3The personal, minimalist, super-fast, database free, bookmarking service. 3The personal, minimalist, super-fast, database free, bookmarking service.
4 4
5Do you want to share the links you discover? 5Do you want to share the links you discover? Shaarli is a minimalist bookmark manager and link sharing service that you can install on your own server. It is designed to be personal (single-user), fast and handy.
6Shaarli is a minimalist bookmark manager and link sharing service that you can install on your own server.
7It is designed to be personal (single-user), fast and handy.
8
9<!-- TODO screenshots -->
10 6
11Visit the pages in the sidebar to find information on how to setup, use, configure, tweak and troubleshoot Shaarli. 7Visit the pages in the sidebar to find information on how to setup, use, configure, tweak and troubleshoot Shaarli.
12 8
13
14* [GitHub project page](https://github.com/shaarli/Shaarli) 9* [GitHub project page](https://github.com/shaarli/Shaarli)
15* [Online documentation](https://shaarli.readthedocs.io/) 10* [Documentation](https://shaarli.readthedocs.io/)
16* [Latest releases](https://github.com/shaarli/Shaarli/releases)
17* [Changelog](https://github.com/shaarli/Shaarli/blob/master/CHANGELOG.md) 11* [Changelog](https://github.com/shaarli/Shaarli/blob/master/CHANGELOG.md)
18 12
19 13
14[![](https://i.imgur.com/8wEBRSG.png)](https://i.imgur.com/WWPfSj0.png) [![](https://i.imgur.com/93PpLLs.png)](https://i.imgur.com/V09kAQt.png) [![](https://i.imgur.com/rrsjWYy.png)](https://i.imgur.com/TZzGHMs.png) [![](https://i.imgur.com/8iRzHfe.png)](https://i.imgur.com/sfJJ6NT.png) [![](https://i.imgur.com/GjZGvIh.png)](https://i.imgur.com/QsedIuJ.png) [![](https://i.imgur.com/TFZ9PEq.png)](https://i.imgur.com/KdtF8Ll.png) [![](https://i.imgur.com/uICDOle.png)](https://i.imgur.com/27wYsbC.png) [![](https://i.imgur.com/tVvD3gH.png)](https://i.imgur.com/zGF4d6L.jpg)
15
16
17
20## Demo 18## Demo
21 19
22You can use this [public demo instance of Shaarli](https://demo.shaarli.org). 20You can use this [public demo instance of Shaarli](https://demo.shaarli.org).
@@ -25,101 +23,80 @@ It runs the latest development version of Shaarli and is updated/reset daily.
25Login: `demo`; Password: `demo` 23Login: `demo`; Password: `demo`
26 24
27 25
26## Getting started
27
28- [Configure your server](Server-configuration.md)
29- [Install Shaarli](Installation.md)
30- Or install Shaarli using [Docker](Docker.md)
31
32
28## Features 33## Features
29 34
30Shaarli can be used: 35Shaarli can be used:
31 36
32- to share, comment and save interesting links and news 37- to share, comment and save interesting links
33- to bookmark useful/frequent links and share them between computers 38- to bookmark useful/frequent links and share them between computers
34- as a minimal blog/microblog/writing platform 39- as a minimal blog/microblog/writing platform
35- as a read-it-later list 40- as a read-it-later/todo list
36- to draft and save articles/posts/ideas 41- as a notepad to draft and save articles/posts/ideas
37- to keep notes, documentation and code snippets 42- as a knowledge base to keep notes, documentation and code snippets
38- as a shared clipboard/notepad/pastebin between machines 43- as a shared clipboard/notepad/pastebin between computers
39- as a todo list 44- as playlist manager for online media
40- to store media playlists 45- to feed other blogs, aggregators, social networks...
41- to keep extracts/comments from webpages that may disappear.
42- to keep track of ongoing discussions
43- to feed other blogs, aggregators, social networks... using RSS feeds
44 46
45### Edit, view and search your links 47### Edit, view and search your links
46 48
47- Minimalist design 49- Editable URL, title, description, tags, private/public status for all your [Shaares](Usage.md)
48- FAST 50- [Tags](Usage.md#tags) to organize your Shaares
49- Customizable link titles and descriptions 51- [Search](Usage.md#search) in all fields
50- Tags to organize your links (features tag autocompletion, renaming, merging and deletion) 52- Unique [permalinks](Usage.md#permalinks) for easy reference
51- Search by tag or using the full-text search 53- Paginated Shaares list view (with image and video thumbnails)
52- Public and private links (visible only to logged-in users) 54- [Tag cloud/list](Usage#tag-cloud) views
53- Unique permalinks for easy reference 55- [Picture wall](Usage#picture-wall)/thumbnails view (with lazy loading)
54- Paginated link list (with image and video thumbnails) 56- [ATOM and RSS feeds](Usage.md#rss-feeds) (can also be filtered using tags or text search)
55- Tag cloud and list views 57- [Daily](Usage.md#daily): newspaper-like daily digest (and daily RSS feed)
56- Picture wall: image and video thumbnails view (with lazy loading) 58- URL cleanup: automatic removal of `?utm_source=...`, `fb=...` tracking parameters
57- ATOM and RSS feeds (can also be filtered using tags or text search) 59- Extensible through [plugins](Plugins.md)
58- Daily: newspaper-like daily digest (and daily RSS feed) 60- Easily extensible by any client using the [REST API](REST-API.md) exposed by Shaarli
59- URL cleanup: automatic removal of `?utm_source=...`, `fb=...` 61- Bookmarklet and [other tools](Community-and-related-software.md) to share links in one click
60- Extensible through [plugins](https://shaarli.readthedocs.io/en/master/Plugins/#plugin-usage) 62- Responsive/support for mobile browsers, degrades gracefully with Javascript disabled
61
62### Easy setup
63
64- Dead-simple installation: drop the files, open the page
65- Links are stored in a file (no database required, easy backup: simply copy the datastore file)
66- Import and export links as Netscape bookmarks compatible with most Web browsers
67
68### Accessibility
69
70- Bookmarklet and other tools to share links in one click
71- Support for mobile browsers
72- Degrades gracefully with Javascript disabled
73- Easy page customization through HTML/CSS/RainTPL
74
75### Security
76
77- Discreet pop-up notification when a new release is available
78- Bruteforce protection on the login form
79- Protected against [XSRF](http://en.wikipedia.org/wiki/Cross-site_request_forgery) and session cookie hijacking
80 63
81<!-- TODO Limitations -->
82 64
83### REST API 65### Easy setup
84
85- Easily extensible by any client using the REST API exposed by Shaarli ([API documentation](http://shaarli.github.io/api-documentation/)).
86 66
67- Dead-simple [installation](Installation.md): drop the files on your server, open the page
68- Shaares are stored in a file (no database required, easy [backup](Backup-and-restore.md))
69- [Configurable](Shaarli-configuration.md) from dialog and configuration file
70- Extensible through third-party [plugins and themes](Community-and-related-software.md)
87 71
88 72
89## Screenshots 73### Fast
90 74
91[![](https://i.imgur.com/8wEBRSG.png)](https://i.imgur.com/WWPfSj0.png) [![](https://i.imgur.com/rrsjWYy.png)](https://i.imgur.com/TZzGHMs.png) [![](https://i.imgur.com/uICDOle.png)](https://i.imgur.com/27wYsbC.png) [![](https://i.imgur.com/KNvFGVB.png)](https://i.imgur.com/0f5faqw.png) [![](https://i.imgur.com/tVvD3gH.png)](https://i.imgur.com/zGF4d6L.jpg) [![](https://i.imgur.com/8iRzHfe.png)](https://i.imgur.com/sfJJ6NT.png) [![](https://i.imgur.com/GjZGvIh.png)](https://i.imgur.com/QsedIuJ.png) [![](https://i.imgur.com/TFZ9PEq.png)](https://i.imgur.com/KdtF8Ll.png) [![](https://i.imgur.com/IvlqXXK.png)](https://i.imgur.com/boaaibC.png) [![](https://i.imgur.com/nlETouG.png)](https://i.imgur.com/Ib9O7n3.png) 75- Fast! Small datastore file, write-once/read-many, served most of the time from OS disk caches (no disk I/O)
76- Stays fast with even tens of thousands shaares!
92 77
93 78
79### Self-hosted
94 80
81- Shaarli is an alternative to commercial services such as StumbleUpon, Delicio.us, Diigo...
82- The data is yours, [import and export](Usage#import-export) it to HTML bookmarksformat compatible with most web browser, and from a variety of formats
83- Shaarli does not send any telemetry/metrics/private information to developers
84- Shaarli is Free and Open-Source software, inspect and change how the program works in the [source code](https://github.com/shaarli/Shaarli)
85- Built-in [Security](dev/Development.md#security) features to help you protect your Shaarli instance
95 86
96 87
97## About 88## About
98 89
99### Shaarli community fork 90This [community fork](https://github.com/shaarli/Shaarli) of the original [Shaarli](https://github.com/sebsauvage/Shaarli/) project by [Sébastien Sauvage](http://sebsauvage.net/) (now [unmaintained](https://github.com/sebsauvage/Shaarli/issues/191)) has carried on the work to provide [many patches](https://github.com/shaarli/Shaarli/compare/sebsauvage:master...master) for [bug fixes and enhancements](https://github.com/shaarli/Shaarli/issues?q=is%3Aclosed+) in this repository, and will keep maintaining the project for the foreseeable future, while keeping Shaarli simple and efficient.
100
101This friendly fork is maintained by the Shaarli community at <https://github.com/shaarli/Shaarli>
102
103This is a community fork of the original [Shaarli](https://github.com/sebsauvage/Shaarli/) project by [Sébastien Sauvage](http://sebsauvage.net/).
104
105The original project is currently unmaintained, and the developer [has informed us](https://github.com/sebsauvage/Shaarli/issues/191) that he would have no time to work on Shaarli in the near future.
106 91
107The Shaarli community has carried on the work to provide [many 92The original Shaarli instance is still available [here](https://sebsauvage.net/links/) (+25000 shaares!)
108patches](https://github.com/shaarli/Shaarli/compare/sebsauvage:master...master) for
109[bug fixes and enhancements](https://github.com/shaarli/Shaarli/issues?q=is%3Aclosed+)
110in this repository, and will keep maintaining the project for the foreseeable
111future, while keeping Shaarli simple and efficient.
112 93
113 94
114### Contributing and getting help 95### Contributing and getting help
115 96
116Feedback is very appreciated! 97Feedback is very appreciated! Feel free to propose solutions to existing problems, help us improve the documentation and translations, and submit pull requests :-)
117 98
118- If you have any questions or ideas, please join the [chat](https://gitter.im/shaarli/Shaarli) (also reachable via [IRC](https://irc.gitter.im/)), post them in our [general discussion](https://github.com/shaarli/Shaarli/issues/308) or read the current [issues](https://github.com/shaarli/Shaarli/issues). 99See [Support](Troubleshooting.md#support) to get in touch with the Shaarli community.
119- Have a look at the open [issues](https://github.com/shaarli/Shaarli/issues) and [pull requests](https://github.com/shaarli/Shaarli/pulls)
120- If you would like a feature added to Shaarli, check the issues labeled [`feature`](https://github.com/shaarli/Shaarli/labels/feature), [`enhancement`](https://github.com/shaarli/Shaarli/labels/enhancement), and [`plugin`](https://github.com/shaarli/Shaarli/labels/plugin).
121- If you've found a bug, please create a [new issue](https://github.com/shaarli/Shaarli/issues/new).
122- Feel free to propose solutions to existing problems, help us improve the documentation and translations, and submit pull requests :-)
123 100
124 101
125### License 102### License
diff --git a/docker-compose.yml b/docker-compose.yml
index e8ea4271..a3de4b1c 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -33,7 +33,7 @@ services:
33 traefik.frontend.rule: "Host:${SHAARLI_VIRTUAL_HOST}" 33 traefik.frontend.rule: "Host:${SHAARLI_VIRTUAL_HOST}"
34 34
35 traefik: 35 traefik:
36 image: traefik 36 image: traefik:1.7-alpine
37 command: 37 command:
38 - "--defaultentrypoints=http,https" 38 - "--defaultentrypoints=http,https"
39 - "--entrypoints=Name:http Address::80 Redirect.EntryPoint:https" 39 - "--entrypoints=Name:http Address::80 Redirect.EntryPoint:https"
diff --git a/inc/languages/fr/LC_MESSAGES/shaarli.po b/inc/languages/fr/LC_MESSAGES/shaarli.po
index fbb2fe64..9a6e3958 100644
--- a/inc/languages/fr/LC_MESSAGES/shaarli.po
+++ b/inc/languages/fr/LC_MESSAGES/shaarli.po
@@ -1,8 +1,8 @@
1msgid "" 1msgid ""
2msgstr "" 2msgstr ""
3"Project-Id-Version: Shaarli\n" 3"Project-Id-Version: Shaarli\n"
4"POT-Creation-Date: 2020-08-27 12:01+0200\n" 4"POT-Creation-Date: 2020-09-10 16:06+0200\n"
5"PO-Revision-Date: 2020-08-27 12:02+0200\n" 5"PO-Revision-Date: 2020-09-10 16:07+0200\n"
6"Last-Translator: \n" 6"Last-Translator: \n"
7"Language-Team: Shaarli\n" 7"Language-Team: Shaarli\n"
8"Language: fr_FR\n" 8"Language: fr_FR\n"
@@ -60,16 +60,20 @@ msgid "Automatic"
60msgstr "Automatique" 60msgstr "Automatique"
61 61
62#: application/Languages.php:182 62#: application/Languages.php:182
63msgid "German"
64msgstr "Allemand"
65
66#: application/Languages.php:183
63msgid "English" 67msgid "English"
64msgstr "Anglais" 68msgstr "Anglais"
65 69
66#: application/Languages.php:183 70#: application/Languages.php:184
67msgid "French" 71msgid "French"
68msgstr "Français" 72msgstr "Français"
69 73
70#: application/Languages.php:184 74#: application/Languages.php:185
71msgid "German" 75msgid "Japanese"
72msgstr "Allemand" 76msgstr "Japonais"
73 77
74#: application/Thumbnailer.php:62 78#: application/Thumbnailer.php:62
75msgid "" 79msgid ""
@@ -103,36 +107,119 @@ msgstr "Mo"
103msgid "GiB" 107msgid "GiB"
104msgstr "Go" 108msgstr "Go"
105 109
106#: application/bookmark/BookmarkFileService.php:165 110#: application/bookmark/BookmarkFileService.php:174
107#: application/bookmark/BookmarkFileService.php:190 111#: application/bookmark/BookmarkFileService.php:199
108#: application/bookmark/BookmarkFileService.php:215 112#: application/bookmark/BookmarkFileService.php:224
109#: application/bookmark/BookmarkFileService.php:232 113#: application/bookmark/BookmarkFileService.php:241
110msgid "You're not authorized to alter the datastore" 114msgid "You're not authorized to alter the datastore"
111msgstr "Vous n'êtes pas autorisé à modifier les données" 115msgstr "Vous n'êtes pas autorisé à modifier les données"
112 116
113#: application/bookmark/BookmarkFileService.php:168 117#: application/bookmark/BookmarkFileService.php:177
114#: application/bookmark/BookmarkFileService.php:193 118#: application/bookmark/BookmarkFileService.php:202
115#: application/bookmark/BookmarkFileService.php:235 119#: application/bookmark/BookmarkFileService.php:244
116msgid "Provided data is invalid" 120msgid "Provided data is invalid"
117msgstr "Les informations fournies ne sont pas valides" 121msgstr "Les informations fournies ne sont pas valides"
118 122
119#: application/bookmark/BookmarkFileService.php:196 123#: application/bookmark/BookmarkFileService.php:205
120msgid "This bookmarks already exists" 124msgid "This bookmarks already exists"
121msgstr "Ce marque-page existe déjà." 125msgstr "Ce marque-page existe déjà."
122 126
123#: application/bookmark/BookmarkInitializer.php:37 127#: application/bookmark/BookmarkInitializer.php:37
124#: application/legacy/LegacyLinkDB.php:266 128msgid "(private bookmark with thumbnail demo)"
125msgid "My secret stuff... - Pastebin.com" 129msgstr "(marque page privé avec une miniature)"
126msgstr "Mes trucs secrets... - Pastebin.com"
127 130
128#: application/bookmark/BookmarkInitializer.php:39 131#: application/bookmark/BookmarkInitializer.php:40
129#: application/legacy/LegacyLinkDB.php:268 132msgid ""
130msgid "Shhhh! I'm a private link only YOU can see. You can delete me too." 133"Shaarli will automatically pick up the thumbnail for links to a variety of "
134"websites.\n"
135"\n"
136"Explore your new Shaarli instance by trying out controls and menus.\n"
137"Visit the project on [Github](https://github.com/shaarli/Shaarli) or [the "
138"documentation](https://shaarli.readthedocs.io/en/master/) to learn more "
139"about Shaarli.\n"
140"\n"
141"Now you can edit or delete the default shaares.\n"
131msgstr "" 142msgstr ""
132"Pssst ! Je suis un lien privé que VOUS êtes le seul à voir. Vous pouvez me " 143"Shaarli récupérera automatiquement la miniature associée au liens pour de "
133"supprimer aussi." 144"nombreux sites web.\n"
145"\n"
146"Explorez votre nouvelle instance de Shaarli en essayant les différents "
147"contrôles et menus.\n"
148"Visitez le projet sur [Github](https://github.com/shaarli/Shaarli) ou [la "
149"documentation](https://shaarli.readthedocs.io/en/master/) pour en apprendre "
150"plus sur Shaarli.\n"
151"\n"
152"Maintenant, vous pouvez modifier ou supprimer les shaares créés par défaut.\n"
153
154#: application/bookmark/BookmarkInitializer.php:53
155msgid "Note: Shaare descriptions"
156msgstr "Note : Description des Shaares"
134 157
135#: application/bookmark/BookmarkInitializer.php:45 158#: application/bookmark/BookmarkInitializer.php:55
159msgid ""
160"Adding a shaare without entering a URL creates a text-only \"note\" post "
161"such as this one.\n"
162"This note is private, so you are the only one able to see it while logged "
163"in.\n"
164"\n"
165"You can use this to keep notes, post articles, code snippets, and much "
166"more.\n"
167"\n"
168"The Markdown formatting setting allows you to format your notes and bookmark "
169"description:\n"
170"\n"
171"### Title headings\n"
172"\n"
173"#### Multiple headings levels\n"
174" * bullet lists\n"
175" * _italic_ text\n"
176" * **bold** text\n"
177" * ~~strike through~~ text\n"
178" * `code` blocks\n"
179" * images\n"
180" * [links](https://en.wikipedia.org/wiki/Markdown)\n"
181"\n"
182"Markdown also supports tables:\n"
183"\n"
184"| Name | Type | Color | Qty |\n"
185"| ------- | --------- | ------ | ----- |\n"
186"| Orange | Fruit | Orange | 126 |\n"
187"| Apple | Fruit | Any | 62 |\n"
188"| Lemon | Fruit | Yellow | 30 |\n"
189"| Carrot | Vegetable | Red | 14 |\n"
190msgstr ""
191"Ajouter un shaare sans préciser d'URL créé une « note » textuelle, telle que "
192"celle-ci.\n"
193"Cette note est privée, donc vous êtes seul à pouvoir la voir lorsque vous "
194"êtes connecté.\n"
195"\n"
196"Vous pouvez utiliser cette fonctionnalité pour prendre des notes, publier "
197"des articles, des extraits de code, et bien plus.\n"
198"\n"
199"L'option du formatage par Markdown vous permet de formater vos description "
200"de notes et marque-pages :\n"
201"\n"
202"### Titre d'en-tête\n"
203"\n"
204"#### Sur plusieurs niveaux\n"
205" * liste à puce\n"
206" * texte en _italique_\n"
207" * texte en **gras**\n"
208" * texte ~~barré~~\n"
209" * blocs de `code`\n"
210" * images\n"
211" * [liens](https://en.wikipedia.org/wiki/Markdown)\n"
212"\n"
213"Markdown supporte aussi les tableaux :\n"
214"\n"
215"| Nom | Type | Couleur | Qte |\n"
216"| ------- | --------- | ------ | ----- |\n"
217"| Orange | Fruit | Orange | 126 |\n"
218"| Pomme | Fruit | Multiple | 62 |\n"
219"| Citron | Fruit | Jaune | 30 |\n"
220"| Carotte | Légume | Orange | 14 |\n"
221
222#: application/bookmark/BookmarkInitializer.php:89
136#: application/legacy/LegacyLinkDB.php:246 223#: application/legacy/LegacyLinkDB.php:246
137#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:15 224#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:15
138#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:49 225#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:49
@@ -144,26 +231,54 @@ msgstr ""
144"Le gestionnaire de marque-pages personnel, minimaliste, et sans base de " 231"Le gestionnaire de marque-pages personnel, minimaliste, et sans base de "
145"données" 232"données"
146 233
147#: application/bookmark/BookmarkInitializer.php:48 234#: application/bookmark/BookmarkInitializer.php:92
148#: application/legacy/LegacyLinkDB.php:249
149msgid "" 235msgid ""
150"Welcome to Shaarli! This is your first public bookmark. To edit or delete " 236"Welcome to Shaarli!\n"
151"me, you must first login.\n"
152"\n" 237"\n"
153"To learn how to use Shaarli, consult the link \"Documentation\" at the " 238"Shaarli allows you to bookmark your favorite pages, and share them with "
154"bottom of this page.\n" 239"others or store them privately.\n"
240"You can add a description to your bookmarks, such as this one, and tag "
241"them.\n"
155"\n" 242"\n"
156"You use the community supported version of the original Shaarli project, by " 243"Create a new shaare by clicking the `+Shaare` button, or using any of the "
157"Sebastien Sauvage." 244"recommended tools (browser extension, mobile app, bookmarklet, REST API, "
245"etc.).\n"
246"\n"
247"You can easily retrieve your links, even with thousands of them, using the "
248"internal search engine, or search through tags (e.g. this Shaare is tagged "
249"with `shaarli` and `help`).\n"
250"Hashtags such as #shaarli #help are also supported.\n"
251"You can also filter the available [RSS feed](/feed/atom) and picture wall by "
252"tag or plaintext search.\n"
253"\n"
254"We hope that you will enjoy using Shaarli, maintained with ❤️ by the "
255"community!\n"
256"Feel free to open [an issue](https://github.com/shaarli/Shaarli/issues) if "
257"you have a suggestion or encounter an issue.\n"
158msgstr "" 258msgstr ""
159"Bienvenue sur Shaarli ! Ceci est votre premier marque-page public. Pour me " 259"Bienvenue sur Shaarli !\n"
160"modifier ou me supprimer, vous devez d'abord vous connecter.\n"
161"\n" 260"\n"
162"Pour apprendre à utiliser Shaarli, consultez le lien « Documentation » en " 261"Shaarli vous permet de sauvegarder des marque-pages de vos pages favorites, "
163"bas de page.\n" 262"et de les partager avec d'autres, ou de les enregistrer en privé.\n"
263"Vous pouvez ajouter une description à vos marque-pages, comme celle-ci, et y "
264"ajouter des tags.\n"
164"\n" 265"\n"
165"Vous utilisez la version supportée par la communauté du projet original " 266"Créez un nouveau shaare en cliquant sur le bouton `+Shaare`, ou en utilisant "
166"Shaarli de Sébastien Sauvage." 267"l'un des outils recommandés (extension de navigateur, application mobile, "
268"bookmarklet, REST API, etc.).\n"
269"\n"
270"Vous pouvez facilement retrouver vos liens, même parmi des milliers, en "
271"utilisant le moteur de recherche interne, ou en filtrant par tags (par "
272"exemple ce Shaare est taggé avec `shaarli` et `help`).\n"
273"Les hashtags comme #shaarli #help sont aussi supportés.\n"
274"Vous pouvez aussi filtrer les [flux RSS](/feed/atom) et [mur d'images]() par "
275"tag ou par texte brut.\n"
276"\n"
277"Nous espérons que vous apprécierez utiliser Shaarli, maintenu avec ❤️ par la "
278"communauté !\n"
279"N'hésitez pas à ouvrir [un ticket (en)](https://github.com/shaarli/Shaarli/"
280"issues) si vous avez une suggestion ou si vous rencontrez un problème.\n"
281" \n"
167 282
168#: application/bookmark/exception/BookmarkNotFoundException.php:13 283#: application/bookmark/exception/BookmarkNotFoundException.php:13
169msgid "The link you are trying to reach does not exist or has been deleted." 284msgid "The link you are trying to reach does not exist or has been deleted."
@@ -489,6 +604,36 @@ msgstr "Vous devez utiliser un entier comme clé."
489msgid "Array offset and link ID must be equal." 604msgid "Array offset and link ID must be equal."
490msgstr "La clé du tableau et l'ID du lien doivent être identiques." 605msgstr "La clé du tableau et l'ID du lien doivent être identiques."
491 606
607#: application/legacy/LegacyLinkDB.php:249
608msgid ""
609"Welcome to Shaarli! This is your first public bookmark. To edit or delete "
610"me, you must first login.\n"
611"\n"
612"To learn how to use Shaarli, consult the link \"Documentation\" at the "
613"bottom of this page.\n"
614"\n"
615"You use the community supported version of the original Shaarli project, by "
616"Sebastien Sauvage."
617msgstr ""
618"Bienvenue sur Shaarli ! Ceci est votre premier marque-page public. Pour me "
619"modifier ou me supprimer, vous devez d'abord vous connecter.\n"
620"\n"
621"Pour apprendre à utiliser Shaarli, consultez le lien « Documentation » en "
622"bas de page.\n"
623"\n"
624"Vous utilisez la version supportée par la communauté du projet original "
625"Shaarli de Sébastien Sauvage."
626
627#: application/legacy/LegacyLinkDB.php:266
628msgid "My secret stuff... - Pastebin.com"
629msgstr "Mes trucs secrets... - Pastebin.com"
630
631#: application/legacy/LegacyLinkDB.php:268
632msgid "Shhhh! I'm a private link only YOU can see. You can delete me too."
633msgstr ""
634"Pssst ! Je suis un lien privé que VOUS êtes le seul à voir. Vous pouvez me "
635"supprimer aussi."
636
492#: application/legacy/LegacyUpdater.php:104 637#: application/legacy/LegacyUpdater.php:104
493msgid "Couldn't retrieve updater class methods." 638msgid "Couldn't retrieve updater class methods."
494msgstr "Impossible de récupérer les méthodes de la classe Updater." 639msgstr "Impossible de récupérer les méthodes de la classe Updater."
@@ -562,7 +707,7 @@ msgstr "Voir sur archive.org"
562msgid "For each link, add an Archive.org icon." 707msgid "For each link, add an Archive.org icon."
563msgstr "Pour chaque lien, ajoute une icône pour Archive.org." 708msgstr "Pour chaque lien, ajoute une icône pour Archive.org."
564 709
565#: plugins/default_colors/default_colors.php:33 710#: plugins/default_colors/default_colors.php:38
566msgid "" 711msgid ""
567"Default colors plugin error: This plugin is active and no custom color is " 712"Default colors plugin error: This plugin is active and no custom color is "
568"configured." 713"configured."
@@ -570,21 +715,21 @@ msgstr ""
570"Erreur du plugin default colors : ce plugin est actif et aucune couleur " 715"Erreur du plugin default colors : ce plugin est actif et aucune couleur "
571"n'est configurée." 716"n'est configurée."
572 717
573#: plugins/default_colors/default_colors.php:107 718#: plugins/default_colors/default_colors.php:113
574msgid "Override default theme colors. Use any CSS valid color." 719msgid "Override default theme colors. Use any CSS valid color."
575msgstr "" 720msgstr ""
576"Remplacer les couleurs du thème par défaut. Utiliser n'importe quelle " 721"Remplacer les couleurs du thème par défaut. Utiliser n'importe quelle "
577"couleur CSS valide." 722"couleur CSS valide."
578 723
579#: plugins/default_colors/default_colors.php:108 724#: plugins/default_colors/default_colors.php:114
580msgid "Main color (navbar green)" 725msgid "Main color (navbar green)"
581msgstr "Couleur principale (vert de la barre de navigation)" 726msgstr "Couleur principale (vert de la barre de navigation)"
582 727
583#: plugins/default_colors/default_colors.php:109 728#: plugins/default_colors/default_colors.php:115
584msgid "Background color (light grey)" 729msgid "Background color (light grey)"
585msgstr "Couleur de fond (gris léger)" 730msgstr "Couleur de fond (gris léger)"
586 731
587#: plugins/default_colors/default_colors.php:110 732#: plugins/default_colors/default_colors.php:116
588msgid "Dark main color (e.g. visited links)" 733msgid "Dark main color (e.g. visited links)"
589msgstr "Couleur principale sombre (ex : les liens visités)" 734msgstr "Couleur principale sombre (ex : les liens visités)"
590 735
@@ -1168,23 +1313,23 @@ msgstr "Changer statut épinglé"
1168msgid "Sticky" 1313msgid "Sticky"
1169msgstr "Épinglé" 1314msgstr "Épinglé"
1170 1315
1171#: tmp/linklist.paging.b91ef64efc3688266305ea9b42e5017e.rtpl.php:7 1316#: tmp/linklist.paging.b91ef64efc3688266305ea9b42e5017e.rtpl.php:5
1172#: tmp/linklist.paging.cedf684561d925457130839629000a81.rtpl.php:7 1317#: tmp/linklist.paging.cedf684561d925457130839629000a81.rtpl.php:5
1173msgid "Filters" 1318msgid "Filters"
1174msgstr "Filtres" 1319msgstr "Filtres"
1175 1320
1176#: tmp/linklist.paging.b91ef64efc3688266305ea9b42e5017e.rtpl.php:12 1321#: tmp/linklist.paging.b91ef64efc3688266305ea9b42e5017e.rtpl.php:10
1177#: tmp/linklist.paging.cedf684561d925457130839629000a81.rtpl.php:12 1322#: tmp/linklist.paging.cedf684561d925457130839629000a81.rtpl.php:10
1178msgid "Only display private links" 1323msgid "Only display private links"
1179msgstr "Afficher uniquement les liens privés" 1324msgstr "Afficher uniquement les liens privés"
1180 1325
1181#: tmp/linklist.paging.b91ef64efc3688266305ea9b42e5017e.rtpl.php:15 1326#: tmp/linklist.paging.b91ef64efc3688266305ea9b42e5017e.rtpl.php:13
1182#: tmp/linklist.paging.cedf684561d925457130839629000a81.rtpl.php:15 1327#: tmp/linklist.paging.cedf684561d925457130839629000a81.rtpl.php:13
1183msgid "Only display public links" 1328msgid "Only display public links"
1184msgstr "Afficher uniquement les liens publics" 1329msgstr "Afficher uniquement les liens publics"
1185 1330
1186#: tmp/linklist.paging.b91ef64efc3688266305ea9b42e5017e.rtpl.php:20 1331#: tmp/linklist.paging.b91ef64efc3688266305ea9b42e5017e.rtpl.php:18
1187#: tmp/linklist.paging.cedf684561d925457130839629000a81.rtpl.php:20 1332#: tmp/linklist.paging.cedf684561d925457130839629000a81.rtpl.php:18
1188msgid "Filter untagged links" 1333msgid "Filter untagged links"
1189msgstr "Filtrer par liens privés" 1334msgstr "Filtrer par liens privés"
1190 1335
@@ -1193,17 +1338,17 @@ msgstr "Filtrer par liens privés"
1193msgid "Select all" 1338msgid "Select all"
1194msgstr "Tout sélectionner" 1339msgstr "Tout sélectionner"
1195 1340
1196#: tmp/linklist.paging.b91ef64efc3688266305ea9b42e5017e.rtpl.php:27 1341#: tmp/linklist.paging.b91ef64efc3688266305ea9b42e5017e.rtpl.php:29
1197#: tmp/linklist.paging.b91ef64efc3688266305ea9b42e5017e.rtpl.php:79 1342#: tmp/linklist.paging.b91ef64efc3688266305ea9b42e5017e.rtpl.php:89
1198#: tmp/linklist.paging.cedf684561d925457130839629000a81.rtpl.php:27 1343#: tmp/linklist.paging.cedf684561d925457130839629000a81.rtpl.php:29
1199#: tmp/linklist.paging.cedf684561d925457130839629000a81.rtpl.php:79 1344#: tmp/linklist.paging.cedf684561d925457130839629000a81.rtpl.php:89
1200#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:44 1345#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:44
1201#: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:44 1346#: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:44
1202msgid "Fold all" 1347msgid "Fold all"
1203msgstr "Replier tout" 1348msgstr "Replier tout"
1204 1349
1205#: tmp/linklist.paging.b91ef64efc3688266305ea9b42e5017e.rtpl.php:72 1350#: tmp/linklist.paging.b91ef64efc3688266305ea9b42e5017e.rtpl.php:76
1206#: tmp/linklist.paging.cedf684561d925457130839629000a81.rtpl.php:72 1351#: tmp/linklist.paging.cedf684561d925457130839629000a81.rtpl.php:76
1207msgid "Links per page" 1352msgid "Links per page"
1208msgstr "Liens par page" 1353msgstr "Liens par page"
1209 1354
@@ -1429,32 +1574,24 @@ msgid "Rename or delete a tag in all links"
1429msgstr "Renommer ou supprimer un tag dans tous les liens" 1574msgstr "Renommer ou supprimer un tag dans tous les liens"
1430 1575
1431#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:41 1576#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:41
1432#, fuzzy
1433#| msgid ""
1434#| "Import Netscape HTML bookmarks (as exported from Firefox, Chrome, Opera, "
1435#| "delicious…)"
1436msgid "" 1577msgid ""
1437"Import Netscape HTML bookmarks (as exported from Firefox, Chrome, Opera, " 1578"Import Netscape HTML bookmarks (as exported from Firefox, Chrome, Opera, "
1438"delicious...)" 1579"delicious...)"
1439msgstr "" 1580msgstr ""
1440"Importer des marques pages au format Netscape HTML (comme exportés depuis " 1581"Importer des marques pages au format Netscape HTML (comme exportés depuis "
1441"Firefox, Chrome, Opera, delicious)" 1582"Firefox, Chrome, Opera, delicious...)"
1442 1583
1443#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:42 1584#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:42
1444msgid "Import links" 1585msgid "Import links"
1445msgstr "Importer des liens" 1586msgstr "Importer des liens"
1446 1587
1447#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:47 1588#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:47
1448#, fuzzy
1449#| msgid ""
1450#| "Export Netscape HTML bookmarks (which can be imported in Firefox, Chrome, "
1451#| "Opera, delicious…)"
1452msgid "" 1589msgid ""
1453"Export Netscape HTML bookmarks (which can be imported in Firefox, Chrome, " 1590"Export Netscape HTML bookmarks (which can be imported in Firefox, Chrome, "
1454"Opera, delicious...)" 1591"Opera, delicious...)"
1455msgstr "" 1592msgstr ""
1456"Exporter les marques pages au format Netscape HTML (comme exportés depuis " 1593"Exporter les marques pages au format Netscape HTML (comme exportés depuis "
1457"Firefox, Chrome, Opera, delicious)" 1594"Firefox, Chrome, Opera, delicious...)"
1458 1595
1459#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:48 1596#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:48
1460msgid "Export database" 1597msgid "Export database"
diff --git a/inc/languages/ja/LC_MESSAGES/shaarli.po b/inc/languages/jp/LC_MESSAGES/shaarli.po
index b420bb51..b420bb51 100644
--- a/inc/languages/ja/LC_MESSAGES/shaarli.po
+++ b/inc/languages/jp/LC_MESSAGES/shaarli.po
diff --git a/index.php b/index.php
index e7471823..b10397dd 100644
--- a/index.php
+++ b/index.php
@@ -35,6 +35,9 @@ use Slim\App;
35 35
36$conf = new ConfigManager(); 36$conf = new ConfigManager();
37 37
38// Manually override root URL for complex server configurations
39define('SHAARLI_ROOT_URL', $conf->get('general.root_url', null));
40
38// In dev mode, throw exception on any warning 41// In dev mode, throw exception on any warning
39if ($conf->get('dev.debug', false)) { 42if ($conf->get('dev.debug', false)) {
40 // See all errors (for debugging only) 43 // See all errors (for debugging only)
@@ -95,7 +98,7 @@ $app->group('', function () {
95 $this->get('/add-tag/{newTag}', '\Shaarli\Front\Controller\Visitor\TagController:addTag'); 98 $this->get('/add-tag/{newTag}', '\Shaarli\Front\Controller\Visitor\TagController:addTag');
96 $this->get('/remove-tag/{tag}', '\Shaarli\Front\Controller\Visitor\TagController:removeTag'); 99 $this->get('/remove-tag/{tag}', '\Shaarli\Front\Controller\Visitor\TagController:removeTag');
97 $this->get('/links-per-page', '\Shaarli\Front\Controller\Visitor\PublicSessionFilterController:linksPerPage'); 100 $this->get('/links-per-page', '\Shaarli\Front\Controller\Visitor\PublicSessionFilterController:linksPerPage');
98 $this->get('/untagged-only', '\Shaarli\Front\Controller\Admin\PublicSessionFilterController:untaggedOnly'); 101 $this->get('/untagged-only', '\Shaarli\Front\Controller\Visitor\PublicSessionFilterController:untaggedOnly');
99})->add('\Shaarli\Front\ShaarliMiddleware'); 102})->add('\Shaarli\Front\ShaarliMiddleware');
100 103
101$app->group('/admin', function () { 104$app->group('/admin', function () {
diff --git a/mkdocs.yml b/mkdocs.yml
index cee2c5fb..2e201d03 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -15,41 +15,25 @@ site_dir: doc/html
15pages: 15pages:
16- Home: index.md 16- Home: index.md
17- Setup: 17- Setup:
18 - Download and Installation: Download-and-Installation.md
19 - Upgrade and migration: Upgrade-and-migration.md
20 - Server configuration: Server-configuration.md 18 - Server configuration: Server-configuration.md
21 - Server security: Server-security.md 19 - Installation: Installation.md
20 - Docker: Docker.md
21 - Reverse Proxy: Reverse-proxy.md
22 - Backup and restore: Backup-and-restore.md
22 - Shaarli configuration: Shaarli-configuration.md 23 - Shaarli configuration: Shaarli-configuration.md
23 - Plugins: Plugins.md 24 - Plugins: Plugins.md
24- Docker: 25 - Upgrade and migration: Upgrade-and-migration.md
25 - Docker 101: docker/docker-101.md
26 - Shaarli images: docker/shaarli-images.md
27 - Reverse proxy configuration: docker/reverse-proxy-configuration.md
28 - Docker resources: docker/resources.md
29- Usage: 26- Usage:
30 - Browsing and searching: Browsing-and-searching.md 27 - Usage: Usage.md
31 - Sharing content: Sharing-content.md
32 - RSS feeds: RSS-feeds.md
33 - REST API: REST-API.md 28 - REST API: REST-API.md
34 - Community & Related software: Community-&-Related-software.md 29 - Community and Related software: Community-and-related-software.md
35- Guides:
36 - Install Shaarli on Debian 9 with Docker: guides/install-shaarli-with-debian9-and-docker.md
37 - Backup, restore, import and export: guides/backup-restore-import-export.md
38 - Various hacks: guides/various-hacks.md
39- Development: 30- Development:
40 - Development guidelines: Development-guidelines.md 31 - Development: dev/Development.md
41 - Continuous integration tools: Continuous-integration-tools.md 32 - Versioning: dev/Versioning.md
42 - GnuPG signature: GnuPG-signature.md 33 - GnuPG signature: dev/GnuPG-signature.md
43 - Directory structure: Directory-structure.md 34 - Plugin System: dev/Plugin-system.md
44 - Link Structure: Link-structure.md 35 - Translations: dev/Translations.md
45 - 3rd party libraries: 3rd-party-libraries.md 36 - Release Shaarli: dev/Release-Shaarli.md
46 - Plugin System: Plugin-System.md 37 - Theming: dev/Theming.md
47 - Release Shaarli: Release-Shaarli.md 38 - Unit tests: dev/Unit-tests.md
48 - Versioning and Branches: Versioning-and-Branches.md
49 - Security: Security.md
50 - Static analysis: Static-analysis.md
51 - Translations: Translations.md
52 - Theming: Theming.md
53 - Unit tests: Unit-tests.md
54- FAQ: FAQ.md
55- Troubleshooting: Troubleshooting.md 39- Troubleshooting: Troubleshooting.md
diff --git a/package.json b/package.json
index f3d9b51e..8a24512a 100644
--- a/package.json
+++ b/package.json
@@ -11,22 +11,23 @@
11 "purecss": "^1.0.0" 11 "purecss": "^1.0.0"
12 }, 12 },
13 "devDependencies": { 13 "devDependencies": {
14 "babel-core": "^6.26.0", 14 "@babel/core": "^7.11.6",
15 "babel-loader": "^7.1.2", 15 "@babel/preset-env": "^7.11.5",
16 "babel-minify-webpack-plugin": "^0.2.0", 16 "babel-loader": "^8.1.0",
17 "babel-preset-env": "^1.6.1", 17 "css-loader": "^4.3.0",
18 "css-loader": "^0.28.9", 18 "eslint": "^7.9.0",
19 "eslint": "^4.16.0", 19 "eslint-config-airbnb-base": "^14.2.0",
20 "eslint-config-airbnb-base": "^12.1.0", 20 "eslint-plugin-import": "^2.22.0",
21 "eslint-plugin-import": "^2.8.0",
22 "extract-text-webpack-plugin": "^3.0.2",
23 "file-loader": "^1.1.6", 21 "file-loader": "^1.1.6",
24 "node-sass": "^4.12.0", 22 "mini-css-extract-plugin": "^0.11.2",
25 "sass-lint": "^1.12.1", 23 "sass": "^1.26.11",
26 "sass-loader": "^6.0.6", 24 "sass-loader": "^10.0.2",
27 "style-loader": "^0.19.1", 25 "stylelint": "^13.7.1",
28 "url-loader": "^0.6.2", 26 "stylelint-config-standard": "^20.0.0",
29 "webpack": "^3.10.0" 27 "stylelint-scss": "^3.18.0",
28 "terser-webpack-plugin": "^4.2.2",
29 "webpack": "^4.44.2",
30 "webpack-cli": "^3.3.12"
30 }, 31 },
31 "scripts": { 32 "scripts": {
32 "build": "webpack", 33 "build": "webpack",
diff --git a/plugins/archiveorg/archiveorg.php b/plugins/archiveorg/archiveorg.php
index f26e6129..922b5966 100644
--- a/plugins/archiveorg/archiveorg.php
+++ b/plugins/archiveorg/archiveorg.php
@@ -20,10 +20,12 @@ function hook_archiveorg_render_linklist($data)
20 $path = ($data['_BASE_PATH_'] ?? '') . '/' . PluginManager::$PLUGINS_PATH; 20 $path = ($data['_BASE_PATH_'] ?? '') . '/' . PluginManager::$PLUGINS_PATH;
21 21
22 foreach ($data['links'] as &$value) { 22 foreach ($data['links'] as &$value) {
23 if ($value['private'] && preg_match('/^\?[a-zA-Z0-9-_@]{6}($|&|#)/', $value['real_url'])) { 23 $isNote = startsWith($value['real_url'], '/shaare/');
24 if ($value['private'] && $isNote) {
24 continue; 25 continue;
25 } 26 }
26 $archive = sprintf($archive_html, $value['url'], $path, t('View on archive.org')); 27 $url = $isNote ? rtrim(index_url($_SERVER), '/') . $value['real_url'] : $value['real_url'];
28 $archive = sprintf($archive_html, $url, $path, t('View on archive.org'));
27 $value['link_plugin'][] = $archive; 29 $value['link_plugin'][] = $archive;
28 } 30 }
29 31
diff --git a/plugins/default_colors/default_colors.php b/plugins/default_colors/default_colors.php
index 1928cc9f..e1fd5cfb 100644
--- a/plugins/default_colors/default_colors.php
+++ b/plugins/default_colors/default_colors.php
@@ -15,6 +15,8 @@ const DEFAULT_COLORS_PLACEHOLDERS = [
15 'DEFAULT_COLORS_DARK_MAIN', 15 'DEFAULT_COLORS_DARK_MAIN',
16]; 16];
17 17
18const DEFAULT_COLORS_CSS_FILE = '/default_colors/default_colors.css';
19
18/** 20/**
19 * Display an error if the plugin is active a no color is configured. 21 * Display an error if the plugin is active a no color is configured.
20 * 22 *
@@ -24,58 +26,62 @@ const DEFAULT_COLORS_PLACEHOLDERS = [
24 */ 26 */
25function default_colors_init($conf) 27function default_colors_init($conf)
26{ 28{
27 $params = ''; 29 $params = [];
28 foreach (DEFAULT_COLORS_PLACEHOLDERS as $placeholder) { 30 foreach (DEFAULT_COLORS_PLACEHOLDERS as $placeholder) {
29 $params .= trim($conf->get('plugins.'. $placeholder, '')); 31 $value = trim($conf->get('plugins.'. $placeholder, ''));
32 if (strlen($value) > 0) {
33 $params[$placeholder] = $value;
34 }
30 } 35 }
31 36
32 if (empty($params)) { 37 if (empty($params)) {
33 $error = t('Default colors plugin error: '. 38 $error = t('Default colors plugin error: '.
34 'This plugin is active and no custom color is configured.'); 39 'This plugin is active and no custom color is configured.');
35 return array($error); 40 return [$error];
41 }
42
43 // Colors are defined but the custom CSS file does not exist -> generate it
44 if (!file_exists(PluginManager::$PLUGINS_PATH . DEFAULT_COLORS_CSS_FILE)) {
45 default_colors_generate_css_file($params);
36 } 46 }
37} 47}
38 48
39/** 49/**
40 * When plugin parameters are saved, we regenerate the custom CSS file with provided settings. 50 * When linklist is displayed, include default_colors CSS file.
41 * 51 *
42 * @param array $data $_POST array 52 * @param array $data - header data.
43 * 53 *
44 * @return array Updated $_POST array 54 * @return mixed - header data with default_colors CSS file added.
45 */ 55 */
46function hook_default_colors_save_plugin_parameters($data) 56function hook_default_colors_render_includes($data)
47{ 57{
48 $file = PluginManager::$PLUGINS_PATH . '/default_colors/default_colors.css'; 58 $file = PluginManager::$PLUGINS_PATH . '/default_colors/default_colors.css';
49 $template = file_get_contents(PluginManager::$PLUGINS_PATH . '/default_colors/default_colors.css.template'); 59 if (file_exists($file )) {
50 $content = ''; 60 $data['css_files'][] = $file ;
51 foreach (DEFAULT_COLORS_PLACEHOLDERS as $rule) {
52 $content .= ! empty($data[$rule])
53 ? default_colors_format_css_rule($data, $rule) .';'. PHP_EOL
54 : '';
55 }
56
57 if (! empty($content)) {
58 file_put_contents($file, sprintf($template, $content));
59 } 61 }
60 62
61 return $data; 63 return $data;
62} 64}
63 65
64/** 66/**
65 * When linklist is displayed, include default_colors CSS file. 67 * Regenerate the custom CSS file with provided settings.
66 *
67 * @param array $data - header data.
68 * 68 *
69 * @return mixed - header data with default_colors CSS file added. 69 * @param array $params Plugin configuration (CSS rules)
70 */ 70 */
71function hook_default_colors_render_includes($data) 71function default_colors_generate_css_file($params): void
72{ 72{
73 $file = PluginManager::$PLUGINS_PATH . '/default_colors/default_colors.css'; 73 $file = PluginManager::$PLUGINS_PATH . '/default_colors/default_colors.css';
74 if (file_exists($file )) { 74 $template = file_get_contents(PluginManager::$PLUGINS_PATH . '/default_colors/default_colors.css.template');
75 $data['css_files'][] = $file ; 75 $content = '';
76 foreach (DEFAULT_COLORS_PLACEHOLDERS as $rule) {
77 $content .= !empty($params[$rule])
78 ? default_colors_format_css_rule($params, $rule) .';'. PHP_EOL
79 : '';
76 } 80 }
77 81
78 return $data; 82 if (! empty($content)) {
83 file_put_contents($file, sprintf($template, $content));
84 }
79} 85}
80 86
81/** 87/**
diff --git a/plugins/isso/isso.php b/plugins/isso/isso.php
index 16edd9a6..79e7380b 100644
--- a/plugins/isso/isso.php
+++ b/plugins/isso/isso.php
@@ -49,7 +49,7 @@ function hook_isso_render_linklist($data, $conf)
49 $isso = sprintf($issoHtml, $issoUrl, $issoUrl, $link['id'], $link['id']); 49 $isso = sprintf($issoHtml, $issoUrl, $issoUrl, $link['id'], $link['id']);
50 $data['plugin_end_zone'][] = $isso; 50 $data['plugin_end_zone'][] = $isso;
51 } else { 51 } else {
52 $button = '<span><a href="?%s#isso-thread">'; 52 $button = '<span><a href="'. ($data['_BASE_PATH_'] ?? '') . '/shaare/%s#isso-thread">';
53 // For the default theme we use a FontAwesome icon which is better than an image 53 // For the default theme we use a FontAwesome icon which is better than an image
54 if ($conf->get('resource.theme') === 'default') { 54 if ($conf->get('resource.theme') === 'default') {
55 $button .= '<i class="linklist-plugin-icon fa fa-comment"></i>'; 55 $button .= '<i class="linklist-plugin-icon fa fa-comment"></i>';
diff --git a/plugins/playvideos/README.md b/plugins/playvideos/README.md
index ab4be22a..32a94e88 100644
--- a/plugins/playvideos/README.md
+++ b/plugins/playvideos/README.md
@@ -8,22 +8,21 @@ This uses code from https://zaius.github.io/youtube_playlist/ and is currently o
8 8
9#### Installation and setup 9#### Installation and setup
10 10
11This is a default Shaarli plugin, you just have to enable it. See https://shaarli.readthedocs.io/en/master/Shaarli-configuration/ 11This is a default Shaarli plugin, you just have to enable it. See [Shaarli configuration](../../doc/md/Shaarli-configuration.md).
12 12
13 13
14#### Troubleshooting 14#### Troubleshooting
15 15
16If your server has [Content Security Policy](http://content-security-policy.com/) headers enabled, this may prevent the script from loading fully. You should relax the CSP in your server settings. Example CSP rule for apache2: 16If your server has [Content Security Policy](http://content-security-policy.com/) headers enabled, this may prevent the script from loading fully. You should relax the CSP in your server settings. Example CSP rule for apache2:
17
18In `/etc/apache2/conf-available/shaarli-csp.conf`:
19 17
20```apache 18```apache
21<Directory /path/to/shaarli> 19<Directory /path/to/shaarli>
20 # Required for playvideos plugin
22 Header set Content-Security-Policy "script-src 'self' 'unsafe-inline' https://www.youtube.com https://s.ytimg.com 'unsafe-eval'" 21 Header set Content-Security-Policy "script-src 'self' 'unsafe-inline' https://www.youtube.com https://s.ytimg.com 'unsafe-eval'"
23</Directory> 22</Directory>
24``` 23```
25 24
26Then run `a2enconf shaarli-csp; service apache2 reload` 25You may place the `Header` directive in the `<Directory...` section of your [webserver configuration](../../doc/md/Server-configuration.md)/virtualhost file, or write the above snippet to `/etc/apache2/conf-available/shaarli-csp.conf`; then run `a2enconf shaarli-csp; service apache2 reload`.
27 26
28### License 27### License
29``` 28```
diff --git a/plugins/qrcode/qrcode.php b/plugins/qrcode/qrcode.php
index 3b5dae34..95499e39 100644
--- a/plugins/qrcode/qrcode.php
+++ b/plugins/qrcode/qrcode.php
@@ -42,7 +42,7 @@ function hook_qrcode_render_linklist($data)
42function hook_qrcode_render_footer($data) 42function hook_qrcode_render_footer($data)
43{ 43{
44 if ($data['_PAGE_'] == TemplatePage::LINKLIST) { 44 if ($data['_PAGE_'] == TemplatePage::LINKLIST) {
45 $data['js_files'][] = PluginManager::$PLUGINS_PATH . '/qrcode/shaarli-qrcode.js'; 45 $data['js_files'][] = PluginManager::$PLUGINS_PATH . '/qrcode/shaarli-qrcode.js';
46 } 46 }
47 47
48 return $data; 48 return $data;
diff --git a/tests/ApplicationUtilsTest.php b/tests/ApplicationUtilsTest.php
index 15388970..a232b351 100644
--- a/tests/ApplicationUtilsTest.php
+++ b/tests/ApplicationUtilsTest.php
@@ -8,7 +8,7 @@ require_once 'tests/utils/FakeApplicationUtils.php';
8/** 8/**
9 * Unitary tests for Shaarli utilities 9 * Unitary tests for Shaarli utilities
10 */ 10 */
11class ApplicationUtilsTest extends \PHPUnit\Framework\TestCase 11class ApplicationUtilsTest extends \Shaarli\TestCase
12{ 12{
13 protected static $testUpdateFile = 'sandbox/update.txt'; 13 protected static $testUpdateFile = 'sandbox/update.txt';
14 protected static $testVersion = '0.5.0'; 14 protected static $testVersion = '0.5.0';
@@ -17,7 +17,7 @@ class ApplicationUtilsTest extends \PHPUnit\Framework\TestCase
17 /** 17 /**
18 * Reset test data for each test 18 * Reset test data for each test
19 */ 19 */
20 public function setUp() 20 protected function setUp(): void
21 { 21 {
22 FakeApplicationUtils::$VERSION_CODE = ''; 22 FakeApplicationUtils::$VERSION_CODE = '';
23 if (file_exists(self::$testUpdateFile)) { 23 if (file_exists(self::$testUpdateFile)) {
@@ -28,7 +28,7 @@ class ApplicationUtilsTest extends \PHPUnit\Framework\TestCase
28 /** 28 /**
29 * Remove test version file if it exists 29 * Remove test version file if it exists
30 */ 30 */
31 public function tearDown() 31 protected function tearDown(): void
32 { 32 {
33 if (is_file('sandbox/version.php')) { 33 if (is_file('sandbox/version.php')) {
34 unlink('sandbox/version.php'); 34 unlink('sandbox/version.php');
@@ -144,11 +144,12 @@ class ApplicationUtilsTest extends \PHPUnit\Framework\TestCase
144 144
145 /** 145 /**
146 * Test update checks - invalid Git branch 146 * Test update checks - invalid Git branch
147 * @expectedException Exception
148 * @expectedExceptionMessageRegExp /Invalid branch selected for updates/
149 */ 147 */
150 public function testCheckUpdateInvalidGitBranch() 148 public function testCheckUpdateInvalidGitBranch()
151 { 149 {
150 $this->expectException(\Exception::class);
151 $this->expectExceptionMessageRegExp('/Invalid branch selected for updates/');
152
152 ApplicationUtils::checkUpdate('', 'null', 0, true, true, 'unstable'); 153 ApplicationUtils::checkUpdate('', 'null', 0, true, true, 'unstable');
153 } 154 }
154 155
@@ -260,21 +261,23 @@ class ApplicationUtilsTest extends \PHPUnit\Framework\TestCase
260 261
261 /** 262 /**
262 * Check a unsupported PHP version 263 * Check a unsupported PHP version
263 * @expectedException Exception
264 * @expectedExceptionMessageRegExp /Your PHP version is obsolete/
265 */ 264 */
266 public function testCheckSupportedPHPVersion51() 265 public function testCheckSupportedPHPVersion51()
267 { 266 {
267 $this->expectException(\Exception::class);
268 $this->expectExceptionMessageRegExp('/Your PHP version is obsolete/');
269
268 $this->assertTrue(ApplicationUtils::checkPHPVersion('5.3', '5.1.0')); 270 $this->assertTrue(ApplicationUtils::checkPHPVersion('5.3', '5.1.0'));
269 } 271 }
270 272
271 /** 273 /**
272 * Check another unsupported PHP version 274 * Check another unsupported PHP version
273 * @expectedException Exception
274 * @expectedExceptionMessageRegExp /Your PHP version is obsolete/
275 */ 275 */
276 public function testCheckSupportedPHPVersion52() 276 public function testCheckSupportedPHPVersion52()
277 { 277 {
278 $this->expectException(\Exception::class);
279 $this->expectExceptionMessageRegExp('/Your PHP version is obsolete/');
280
278 $this->assertTrue(ApplicationUtils::checkPHPVersion('5.3', '5.2')); 281 $this->assertTrue(ApplicationUtils::checkPHPVersion('5.3', '5.2'));
279 } 282 }
280 283
diff --git a/tests/FileUtilsTest.php b/tests/FileUtilsTest.php
index 57719175..9163bdf1 100644
--- a/tests/FileUtilsTest.php
+++ b/tests/FileUtilsTest.php
@@ -9,7 +9,7 @@ use Exception;
9 * 9 *
10 * Test file utility class. 10 * Test file utility class.
11 */ 11 */
12class FileUtilsTest extends \PHPUnit\Framework\TestCase 12class FileUtilsTest extends \Shaarli\TestCase
13{ 13{
14 /** 14 /**
15 * @var string Test file path. 15 * @var string Test file path.
@@ -19,7 +19,7 @@ class FileUtilsTest extends \PHPUnit\Framework\TestCase
19 /** 19 /**
20 * Delete test file after every test. 20 * Delete test file after every test.
21 */ 21 */
22 public function tearDown() 22 protected function tearDown(): void
23 { 23 {
24 @unlink(self::$file); 24 @unlink(self::$file);
25 } 25 }
@@ -49,12 +49,12 @@ class FileUtilsTest extends \PHPUnit\Framework\TestCase
49 49
50 /** 50 /**
51 * File not writable: raise an exception. 51 * File not writable: raise an exception.
52 *
53 * @expectedException Shaarli\Exceptions\IOException
54 * @expectedExceptionMessage Error accessing "sandbox/flat.db"
55 */ 52 */
56 public function testWriteWithoutPermission() 53 public function testWriteWithoutPermission()
57 { 54 {
55 $this->expectException(\Shaarli\Exceptions\IOException::class);
56 $this->expectExceptionMessage('Error accessing "sandbox/flat.db"');
57
58 touch(self::$file); 58 touch(self::$file);
59 chmod(self::$file, 0440); 59 chmod(self::$file, 0440);
60 FileUtils::writeFlatDB(self::$file, null); 60 FileUtils::writeFlatDB(self::$file, null);
@@ -62,23 +62,23 @@ class FileUtilsTest extends \PHPUnit\Framework\TestCase
62 62
63 /** 63 /**
64 * Folder non existent: raise an exception. 64 * Folder non existent: raise an exception.
65 *
66 * @expectedException Shaarli\Exceptions\IOException
67 * @expectedExceptionMessage Error accessing "nopefolder"
68 */ 65 */
69 public function testWriteFolderDoesNotExist() 66 public function testWriteFolderDoesNotExist()
70 { 67 {
68 $this->expectException(\Shaarli\Exceptions\IOException::class);
69 $this->expectExceptionMessage('Error accessing "nopefolder"');
70
71 FileUtils::writeFlatDB('nopefolder/file', null); 71 FileUtils::writeFlatDB('nopefolder/file', null);
72 } 72 }
73 73
74 /** 74 /**
75 * Folder non writable: raise an exception. 75 * Folder non writable: raise an exception.
76 *
77 * @expectedException Shaarli\Exceptions\IOException
78 * @expectedExceptionMessage Error accessing "sandbox"
79 */ 76 */
80 public function testWriteFolderPermission() 77 public function testWriteFolderPermission()
81 { 78 {
79 $this->expectException(\Shaarli\Exceptions\IOException::class);
80 $this->expectExceptionMessage('Error accessing "sandbox"');
81
82 chmod(dirname(self::$file), 0555); 82 chmod(dirname(self::$file), 0555);
83 try { 83 try {
84 FileUtils::writeFlatDB(self::$file, null); 84 FileUtils::writeFlatDB(self::$file, null);
diff --git a/tests/HistoryTest.php b/tests/HistoryTest.php
index 7189c3a9..6dc0e5b7 100644
--- a/tests/HistoryTest.php
+++ b/tests/HistoryTest.php
@@ -3,10 +3,9 @@
3namespace Shaarli; 3namespace Shaarli;
4 4
5use DateTime; 5use DateTime;
6use Exception;
7use Shaarli\Bookmark\Bookmark; 6use Shaarli\Bookmark\Bookmark;
8 7
9class HistoryTest extends \PHPUnit\Framework\TestCase 8class HistoryTest extends \Shaarli\TestCase
10{ 9{
11 /** 10 /**
12 * @var string History file path 11 * @var string History file path
@@ -16,7 +15,7 @@ class HistoryTest extends \PHPUnit\Framework\TestCase
16 /** 15 /**
17 * Delete history file. 16 * Delete history file.
18 */ 17 */
19 public function setUp() 18 protected function setUp(): void
20 { 19 {
21 if (file_exists(self::$historyFilePath)) { 20 if (file_exists(self::$historyFilePath)) {
22 unlink(self::$historyFilePath); 21 unlink(self::$historyFilePath);
@@ -44,12 +43,12 @@ class HistoryTest extends \PHPUnit\Framework\TestCase
44 43
45 /** 44 /**
46 * Not writable history file: raise an exception. 45 * Not writable history file: raise an exception.
47 *
48 * @expectedException Exception
49 * @expectedExceptionMessage History file isn't readable or writable
50 */ 46 */
51 public function testConstructNotWritable() 47 public function testConstructNotWritable()
52 { 48 {
49 $this->expectException(\Exception::class);
50 $this->expectExceptionMessage('History file isn\'t readable or writable');
51
53 touch(self::$historyFilePath); 52 touch(self::$historyFilePath);
54 chmod(self::$historyFilePath, 0440); 53 chmod(self::$historyFilePath, 0440);
55 $history = new History(self::$historyFilePath); 54 $history = new History(self::$historyFilePath);
@@ -58,12 +57,12 @@ class HistoryTest extends \PHPUnit\Framework\TestCase
58 57
59 /** 58 /**
60 * Not parsable history file: raise an exception. 59 * Not parsable history file: raise an exception.
61 *
62 * @expectedException Exception
63 * @expectedExceptionMessageRegExp /Could not parse history file/
64 */ 60 */
65 public function testConstructNotParsable() 61 public function testConstructNotParsable()
66 { 62 {
63 $this->expectException(\Exception::class);
64 $this->expectExceptionMessageRegExp('/Could not parse history file/');
65
67 file_put_contents(self::$historyFilePath, 'not parsable'); 66 file_put_contents(self::$historyFilePath, 'not parsable');
68 $history = new History(self::$historyFilePath); 67 $history = new History(self::$historyFilePath);
69 // gzinflate generates a warning 68 // gzinflate generates a warning
diff --git a/tests/LanguagesTest.php b/tests/LanguagesTest.php
index de83f291..ce24c160 100644
--- a/tests/LanguagesTest.php
+++ b/tests/LanguagesTest.php
@@ -7,7 +7,7 @@ use Shaarli\Config\ConfigManager;
7/** 7/**
8 * Class LanguagesTest. 8 * Class LanguagesTest.
9 */ 9 */
10class LanguagesTest extends \PHPUnit\Framework\TestCase 10class LanguagesTest extends \Shaarli\TestCase
11{ 11{
12 /** 12 /**
13 * @var string Config file path (without extension). 13 * @var string Config file path (without extension).
@@ -22,7 +22,7 @@ class LanguagesTest extends \PHPUnit\Framework\TestCase
22 /** 22 /**
23 * 23 *
24 */ 24 */
25 public function setUp() 25 protected function setUp(): void
26 { 26 {
27 $this->conf = new ConfigManager(self::$configFile); 27 $this->conf = new ConfigManager(self::$configFile);
28 } 28 }
diff --git a/tests/PluginManagerTest.php b/tests/PluginManagerTest.php
index a5d5dbe9..efef5e87 100644
--- a/tests/PluginManagerTest.php
+++ b/tests/PluginManagerTest.php
@@ -1,4 +1,5 @@
1<?php 1<?php
2
2namespace Shaarli\Plugin; 3namespace Shaarli\Plugin;
3 4
4use Shaarli\Config\ConfigManager; 5use Shaarli\Config\ConfigManager;
@@ -6,7 +7,7 @@ use Shaarli\Config\ConfigManager;
6/** 7/**
7 * Unit tests for Plugins 8 * Unit tests for Plugins
8 */ 9 */
9class PluginManagerTest extends \PHPUnit\Framework\TestCase 10class PluginManagerTest extends \Shaarli\TestCase
10{ 11{
11 /** 12 /**
12 * Path to tests plugin. 13 * Path to tests plugin.
@@ -41,17 +42,31 @@ class PluginManagerTest extends \PHPUnit\Framework\TestCase
41 42
42 $this->assertTrue(function_exists('hook_test_random')); 43 $this->assertTrue(function_exists('hook_test_random'));
43 44
44 $data = array(0 => 'woot'); 45 $data = [0 => 'woot'];
45 $this->pluginManager->executeHooks('random', $data); 46 $this->pluginManager->executeHooks('random', $data);
46 $this->assertEquals('woot', $data[1]);
47 47
48 $data = array(0 => 'woot'); 48 static::assertCount(2, $data);
49 static::assertSame('woot', $data[1]);
50
51 $data = [0 => 'woot'];
49 $this->pluginManager->executeHooks('random', $data, array('target' => 'test')); 52 $this->pluginManager->executeHooks('random', $data, array('target' => 'test'));
50 $this->assertEquals('page test', $data[1]);
51 53
52 $data = array(0 => 'woot'); 54 static::assertCount(2, $data);
55 static::assertSame('page test', $data[1]);
56
57 $data = [0 => 'woot'];
53 $this->pluginManager->executeHooks('random', $data, array('loggedin' => true)); 58 $this->pluginManager->executeHooks('random', $data, array('loggedin' => true));
54 $this->assertEquals('loggedin', $data[1]); 59
60 static::assertCount(2, $data);
61 static::assertEquals('loggedin', $data[1]);
62
63 $data = [0 => 'woot'];
64 $this->pluginManager->executeHooks('random', $data, array('loggedin' => null));
65
66 static::assertCount(3, $data);
67 static::assertEquals('loggedin', $data[1]);
68 static::assertArrayHasKey(2, $data);
69 static::assertNull($data[2]);
55 } 70 }
56 71
57 /** 72 /**
@@ -67,8 +82,8 @@ class PluginManagerTest extends \PHPUnit\Framework\TestCase
67 $data = []; 82 $data = [];
68 $this->pluginManager->executeHooks('error', $data); 83 $this->pluginManager->executeHooks('error', $data);
69 84
70 $this->assertSame( 85 $this->assertRegExp(
71 'test [plugin incompatibility]: Class \'Unknown\' not found', 86 '/test \[plugin incompatibility\]: Class [\'"]Unknown[\'"] not found/',
72 $this->pluginManager->getErrors()[0] 87 $this->pluginManager->getErrors()[0]
73 ); 88 );
74 } 89 }
@@ -78,8 +93,8 @@ class PluginManagerTest extends \PHPUnit\Framework\TestCase
78 */ 93 */
79 public function testPluginNotFound(): void 94 public function testPluginNotFound(): void
80 { 95 {
81 $this->pluginManager->load(array()); 96 $this->pluginManager->load([]);
82 $this->pluginManager->load(array('nope', 'renope')); 97 $this->pluginManager->load(['nope', 'renope']);
83 $this->addToAssertionCount(1); 98 $this->addToAssertionCount(1);
84 } 99 }
85 100
@@ -89,18 +104,18 @@ class PluginManagerTest extends \PHPUnit\Framework\TestCase
89 public function testGetPluginsMeta(): void 104 public function testGetPluginsMeta(): void
90 { 105 {
91 PluginManager::$PLUGINS_PATH = self::$pluginPath; 106 PluginManager::$PLUGINS_PATH = self::$pluginPath;
92 $this->pluginManager->load(array(self::$pluginName)); 107 $this->pluginManager->load([self::$pluginName]);
93 108
94 $expectedParameters = array( 109 $expectedParameters = [
95 'pop' => array( 110 'pop' => [
96 'value' => '', 111 'value' => '',
97 'desc' => 'pop description', 112 'desc' => 'pop description',
98 ), 113 ],
99 'hip' => array( 114 'hip' => [
100 'value' => '', 115 'value' => '',
101 'desc' => '', 116 'desc' => '',
102 ), 117 ],
103 ); 118 ];
104 $meta = $this->pluginManager->getPluginsMeta(); 119 $meta = $this->pluginManager->getPluginsMeta();
105 $this->assertEquals('test plugin', $meta[self::$pluginName]['description']); 120 $this->assertEquals('test plugin', $meta[self::$pluginName]['description']);
106 $this->assertEquals($expectedParameters, $meta[self::$pluginName]['parameters']); 121 $this->assertEquals($expectedParameters, $meta[self::$pluginName]['parameters']);
diff --git a/tests/TestCase.php b/tests/TestCase.php
new file mode 100644
index 00000000..781e7aa3
--- /dev/null
+++ b/tests/TestCase.php
@@ -0,0 +1,77 @@
1<?php
2
3declare(strict_types=1);
4
5namespace Shaarli;
6
7/**
8 * Helper class extending \PHPUnit\Framework\TestCase.
9 * Used to make Shaarli UT run on multiple versions of PHPUnit.
10 */
11class TestCase extends \PHPUnit\Framework\TestCase
12{
13 /**
14 * expectExceptionMessageRegExp has been removed and replaced by expectExceptionMessageMatches in PHPUnit 9.
15 */
16 public function expectExceptionMessageRegExp(string $regularExpression): void
17 {
18 if (method_exists($this, 'expectExceptionMessageMatches')) {
19 $this->expectExceptionMessageMatches($regularExpression);
20 } else {
21 parent::expectExceptionMessageRegExp($regularExpression);
22 }
23 }
24
25 /**
26 * assertContains is now used for iterable, strings should use assertStringContainsString
27 */
28 public function assertContainsPolyfill($expected, $actual, string $message = ''): void
29 {
30 if (is_string($actual) && method_exists($this, 'assertStringContainsString')) {
31 static::assertStringContainsString($expected, $actual, $message);
32 } else {
33 static::assertContains($expected, $actual, $message);
34 }
35 }
36
37 /**
38 * assertNotContains is now used for iterable, strings should use assertStringNotContainsString
39 */
40 public function assertNotContainsPolyfill($expected, $actual, string $message = ''): void
41 {
42 if (is_string($actual) && method_exists($this, 'assertStringNotContainsString')) {
43 static::assertStringNotContainsString($expected, $actual, $message);
44 } else {
45 static::assertNotContains($expected, $actual, $message);
46 }
47 }
48
49 /**
50 * assertFileNotExists has been renamed in assertFileDoesNotExist
51 */
52 public static function assertFileNotExists(string $filename, string $message = ''): void
53 {
54 if (method_exists(TestCase::class, 'assertFileDoesNotExist')) {
55 static::assertFileDoesNotExist($filename, $message);
56 } else {
57 parent::assertFileNotExists($filename, $message);
58 }
59 }
60
61 /**
62 * assertRegExp has been renamed in assertMatchesRegularExpression
63 */
64 public static function assertRegExp(string $pattern, string $string, string $message = ''): void
65 {
66 if (method_exists(TestCase::class, 'assertMatchesRegularExpression')) {
67 static::assertMatchesRegularExpression($pattern, $string, $message);
68 } else {
69 parent::assertRegExp($pattern, $string, $message);
70 }
71 }
72
73 public function isInTestsContext(): bool
74 {
75 return true;
76 }
77}
diff --git a/tests/ThumbnailerTest.php b/tests/ThumbnailerTest.php
index c01849f7..70519aca 100644
--- a/tests/ThumbnailerTest.php
+++ b/tests/ThumbnailerTest.php
@@ -2,7 +2,6 @@
2 2
3namespace Shaarli; 3namespace Shaarli;
4 4
5use PHPUnit\Framework\TestCase;
6use Shaarli\Config\ConfigManager; 5use Shaarli\Config\ConfigManager;
7use WebThumbnailer\Application\ConfigManager as WTConfigManager; 6use WebThumbnailer\Application\ConfigManager as WTConfigManager;
8 7
@@ -30,7 +29,7 @@ class ThumbnailerTest extends TestCase
30 */ 29 */
31 protected $conf; 30 protected $conf;
32 31
33 public function setUp() 32 protected function setUp(): void
34 { 33 {
35 $this->conf = new ConfigManager('tests/utils/config/configJson'); 34 $this->conf = new ConfigManager('tests/utils/config/configJson');
36 $this->conf->set('thumbnails.mode', Thumbnailer::MODE_ALL); 35 $this->conf->set('thumbnails.mode', Thumbnailer::MODE_ALL);
@@ -43,7 +42,7 @@ class ThumbnailerTest extends TestCase
43 WTConfigManager::addFile('tests/utils/config/wt.json'); 42 WTConfigManager::addFile('tests/utils/config/wt.json');
44 } 43 }
45 44
46 public function tearDown() 45 protected function tearDown(): void
47 { 46 {
48 $this->rrmdirContent('sandbox/'); 47 $this->rrmdirContent('sandbox/');
49 } 48 }
diff --git a/tests/TimeZoneTest.php b/tests/TimeZoneTest.php
index 02bf060f..77862855 100644
--- a/tests/TimeZoneTest.php
+++ b/tests/TimeZoneTest.php
@@ -8,14 +8,14 @@ require_once 'application/TimeZone.php';
8/** 8/**
9 * Unitary tests for timezone utilities 9 * Unitary tests for timezone utilities
10 */ 10 */
11class TimeZoneTest extends PHPUnit\Framework\TestCase 11class TimeZoneTest extends \Shaarli\TestCase
12{ 12{
13 /** 13 /**
14 * @var array of timezones 14 * @var array of timezones
15 */ 15 */
16 protected $installedTimezones; 16 protected $installedTimezones;
17 17
18 public function setUp() 18 protected function setUp(): void
19 { 19 {
20 $this->installedTimezones = [ 20 $this->installedTimezones = [
21 'Antarctica/Syowa', 21 'Antarctica/Syowa',
diff --git a/tests/UtilsTest.php b/tests/UtilsTest.php
index 26d2a6b8..6e787d7f 100644
--- a/tests/UtilsTest.php
+++ b/tests/UtilsTest.php
@@ -10,7 +10,7 @@ require_once 'application/Languages.php';
10/** 10/**
11 * Unitary tests for Shaarli utilities 11 * Unitary tests for Shaarli utilities
12 */ 12 */
13class UtilsTest extends PHPUnit\Framework\TestCase 13class UtilsTest extends \Shaarli\TestCase
14{ 14{
15 // Log file 15 // Log file
16 protected static $testLogFile = 'tests.log'; 16 protected static $testLogFile = 'tests.log';
@@ -26,7 +26,7 @@ class UtilsTest extends PHPUnit\Framework\TestCase
26 /** 26 /**
27 * Assign reference data 27 * Assign reference data
28 */ 28 */
29 public static function setUpBeforeClass() 29 public static function setUpBeforeClass(): void
30 { 30 {
31 self::$defaultTimeZone = date_default_timezone_get(); 31 self::$defaultTimeZone = date_default_timezone_get();
32 // Timezone without DST for test consistency 32 // Timezone without DST for test consistency
@@ -36,7 +36,7 @@ class UtilsTest extends PHPUnit\Framework\TestCase
36 /** 36 /**
37 * Reset the timezone 37 * Reset the timezone
38 */ 38 */
39 public static function tearDownAfterClass() 39 public static function tearDownAfterClass(): void
40 { 40 {
41 date_default_timezone_set(self::$defaultTimeZone); 41 date_default_timezone_set(self::$defaultTimeZone);
42 } 42 }
@@ -44,7 +44,7 @@ class UtilsTest extends PHPUnit\Framework\TestCase
44 /** 44 /**
45 * Resets test data before each test 45 * Resets test data before each test
46 */ 46 */
47 protected function setUp() 47 protected function setUp(): void
48 { 48 {
49 if (file_exists(self::$testLogFile)) { 49 if (file_exists(self::$testLogFile)) {
50 unlink(self::$testLogFile); 50 unlink(self::$testLogFile);
diff --git a/tests/api/ApiMiddlewareTest.php b/tests/api/ApiMiddlewareTest.php
index df2fb33a..86700840 100644
--- a/tests/api/ApiMiddlewareTest.php
+++ b/tests/api/ApiMiddlewareTest.php
@@ -18,7 +18,7 @@ use Slim\Http\Response;
18 * 18 *
19 * @package Api 19 * @package Api
20 */ 20 */
21class ApiMiddlewareTest extends \PHPUnit\Framework\TestCase 21class ApiMiddlewareTest extends \Shaarli\TestCase
22{ 22{
23 /** 23 /**
24 * @var string datastore to test write operations 24 * @var string datastore to test write operations
@@ -26,7 +26,7 @@ class ApiMiddlewareTest extends \PHPUnit\Framework\TestCase
26 protected static $testDatastore = 'sandbox/datastore.php'; 26 protected static $testDatastore = 'sandbox/datastore.php';
27 27
28 /** 28 /**
29 * @var \ConfigManager instance 29 * @var ConfigManager instance
30 */ 30 */
31 protected $conf; 31 protected $conf;
32 32
@@ -43,7 +43,7 @@ class ApiMiddlewareTest extends \PHPUnit\Framework\TestCase
43 /** 43 /**
44 * Before every test, instantiate a new Api with its config, plugins and bookmarks. 44 * Before every test, instantiate a new Api with its config, plugins and bookmarks.
45 */ 45 */
46 public function setUp() 46 protected function setUp(): void
47 { 47 {
48 $this->conf = new ConfigManager('tests/utils/config/configJson'); 48 $this->conf = new ConfigManager('tests/utils/config/configJson');
49 $this->conf->set('api.secret', 'NapoleonWasALizard'); 49 $this->conf->set('api.secret', 'NapoleonWasALizard');
@@ -61,12 +61,59 @@ class ApiMiddlewareTest extends \PHPUnit\Framework\TestCase
61 /** 61 /**
62 * After every test, remove the test datastore. 62 * After every test, remove the test datastore.
63 */ 63 */
64 public function tearDown() 64 protected function tearDown(): void
65 { 65 {
66 @unlink(self::$testDatastore); 66 @unlink(self::$testDatastore);
67 } 67 }
68 68
69 /** 69 /**
70 * Invoke the middleware with a valid token
71 */
72 public function testInvokeMiddlewareWithValidToken(): void
73 {
74 $next = function (Request $request, Response $response): Response {
75 return $response;
76 };
77 $mw = new ApiMiddleware($this->container);
78 $env = Environment::mock([
79 'REQUEST_METHOD' => 'GET',
80 'REQUEST_URI' => '/echo',
81 'HTTP_AUTHORIZATION'=> 'Bearer ' . ApiUtilsTest::generateValidJwtToken('NapoleonWasALizard'),
82 ]);
83 $request = Request::createFromEnvironment($env);
84 $response = new Response();
85 /** @var Response $response */
86 $response = $mw($request, $response, $next);
87
88 $this->assertEquals(200, $response->getStatusCode());
89 }
90
91 /**
92 * Invoke the middleware with a valid token
93 * Using specific Apache CGI redirected authorization.
94 */
95 public function testInvokeMiddlewareWithValidTokenFromRedirectedHeader(): void
96 {
97 $next = function (Request $request, Response $response): Response {
98 return $response;
99 };
100
101 $token = 'Bearer ' . ApiUtilsTest::generateValidJwtToken('NapoleonWasALizard');
102 $this->container->environment['REDIRECT_HTTP_AUTHORIZATION'] = $token;
103 $mw = new ApiMiddleware($this->container);
104 $env = Environment::mock([
105 'REQUEST_METHOD' => 'GET',
106 'REQUEST_URI' => '/echo',
107 ]);
108 $request = Request::createFromEnvironment($env);
109 $response = new Response();
110 /** @var Response $response */
111 $response = $mw($request, $response, $next);
112
113 $this->assertEquals(200, $response->getStatusCode());
114 }
115
116 /**
70 * Invoke the middleware with the API disabled: 117 * Invoke the middleware with the API disabled:
71 * should return a 401 error Unauthorized. 118 * should return a 401 error Unauthorized.
72 */ 119 */
@@ -109,7 +156,7 @@ class ApiMiddlewareTest extends \PHPUnit\Framework\TestCase
109 $this->assertEquals(401, $response->getStatusCode()); 156 $this->assertEquals(401, $response->getStatusCode());
110 $body = json_decode((string) $response->getBody()); 157 $body = json_decode((string) $response->getBody());
111 $this->assertEquals('Not authorized: API is disabled', $body->message); 158 $this->assertEquals('Not authorized: API is disabled', $body->message);
112 $this->assertContains('ApiAuthorizationException', $body->stacktrace); 159 $this->assertContainsPolyfill('ApiAuthorizationException', $body->stacktrace);
113 } 160 }
114 161
115 /** 162 /**
@@ -132,7 +179,7 @@ class ApiMiddlewareTest extends \PHPUnit\Framework\TestCase
132 $this->assertEquals(401, $response->getStatusCode()); 179 $this->assertEquals(401, $response->getStatusCode());
133 $body = json_decode((string) $response->getBody()); 180 $body = json_decode((string) $response->getBody());
134 $this->assertEquals('Not authorized: JWT token not provided', $body->message); 181 $this->assertEquals('Not authorized: JWT token not provided', $body->message);
135 $this->assertContains('ApiAuthorizationException', $body->stacktrace); 182 $this->assertContainsPolyfill('ApiAuthorizationException', $body->stacktrace);
136 } 183 }
137 184
138 /** 185 /**
@@ -157,7 +204,7 @@ class ApiMiddlewareTest extends \PHPUnit\Framework\TestCase
157 $this->assertEquals(401, $response->getStatusCode()); 204 $this->assertEquals(401, $response->getStatusCode());
158 $body = json_decode((string) $response->getBody()); 205 $body = json_decode((string) $response->getBody());
159 $this->assertEquals('Not authorized: Token secret must be set in Shaarli\'s administration', $body->message); 206 $this->assertEquals('Not authorized: Token secret must be set in Shaarli\'s administration', $body->message);
160 $this->assertContains('ApiAuthorizationException', $body->stacktrace); 207 $this->assertContainsPolyfill('ApiAuthorizationException', $body->stacktrace);
161 } 208 }
162 209
163 /** 210 /**
@@ -180,7 +227,7 @@ class ApiMiddlewareTest extends \PHPUnit\Framework\TestCase
180 $this->assertEquals(401, $response->getStatusCode()); 227 $this->assertEquals(401, $response->getStatusCode());
181 $body = json_decode((string) $response->getBody()); 228 $body = json_decode((string) $response->getBody());
182 $this->assertEquals('Not authorized: Invalid JWT header', $body->message); 229 $this->assertEquals('Not authorized: Invalid JWT header', $body->message);
183 $this->assertContains('ApiAuthorizationException', $body->stacktrace); 230 $this->assertContainsPolyfill('ApiAuthorizationException', $body->stacktrace);
184 } 231 }
185 232
186 /** 233 /**
@@ -206,6 +253,6 @@ class ApiMiddlewareTest extends \PHPUnit\Framework\TestCase
206 $this->assertEquals(401, $response->getStatusCode()); 253 $this->assertEquals(401, $response->getStatusCode());
207 $body = json_decode((string) $response->getBody()); 254 $body = json_decode((string) $response->getBody());
208 $this->assertEquals('Not authorized: Malformed JWT token', $body->message); 255 $this->assertEquals('Not authorized: Malformed JWT token', $body->message);
209 $this->assertContains('ApiAuthorizationException', $body->stacktrace); 256 $this->assertContainsPolyfill('ApiAuthorizationException', $body->stacktrace);
210 } 257 }
211} 258}
diff --git a/tests/api/ApiUtilsTest.php b/tests/api/ApiUtilsTest.php
index 7efec9bb..7a143859 100644
--- a/tests/api/ApiUtilsTest.php
+++ b/tests/api/ApiUtilsTest.php
@@ -8,12 +8,12 @@ use Shaarli\Http\Base64Url;
8/** 8/**
9 * Class ApiUtilsTest 9 * Class ApiUtilsTest
10 */ 10 */
11class ApiUtilsTest extends \PHPUnit\Framework\TestCase 11class ApiUtilsTest extends \Shaarli\TestCase
12{ 12{
13 /** 13 /**
14 * Force the timezone for ISO datetimes. 14 * Force the timezone for ISO datetimes.
15 */ 15 */
16 public static function setUpBeforeClass() 16 public static function setUpBeforeClass(): void
17 { 17 {
18 date_default_timezone_set('UTC'); 18 date_default_timezone_set('UTC');
19 } 19 }
@@ -66,143 +66,143 @@ class ApiUtilsTest extends \PHPUnit\Framework\TestCase
66 66
67 /** 67 /**
68 * Test validateJwtToken() with a malformed JWT token. 68 * Test validateJwtToken() with a malformed JWT token.
69 *
70 * @expectedException \Shaarli\Api\Exceptions\ApiAuthorizationException
71 * @expectedExceptionMessage Malformed JWT token
72 */ 69 */
73 public function testValidateJwtTokenMalformed() 70 public function testValidateJwtTokenMalformed()
74 { 71 {
72 $this->expectException(\Shaarli\Api\Exceptions\ApiAuthorizationException::class);
73 $this->expectExceptionMessage('Malformed JWT token');
74
75 $token = 'ABC.DEF'; 75 $token = 'ABC.DEF';
76 ApiUtils::validateJwtToken($token, 'foo'); 76 ApiUtils::validateJwtToken($token, 'foo');
77 } 77 }
78 78
79 /** 79 /**
80 * Test validateJwtToken() with an empty JWT token. 80 * Test validateJwtToken() with an empty JWT token.
81 *
82 * @expectedException \Shaarli\Api\Exceptions\ApiAuthorizationException
83 * @expectedExceptionMessage Malformed JWT token
84 */ 81 */
85 public function testValidateJwtTokenMalformedEmpty() 82 public function testValidateJwtTokenMalformedEmpty()
86 { 83 {
84 $this->expectException(\Shaarli\Api\Exceptions\ApiAuthorizationException::class);
85 $this->expectExceptionMessage('Malformed JWT token');
86
87 $token = false; 87 $token = false;
88 ApiUtils::validateJwtToken($token, 'foo'); 88 ApiUtils::validateJwtToken($token, 'foo');
89 } 89 }
90 90
91 /** 91 /**
92 * Test validateJwtToken() with a JWT token without header. 92 * Test validateJwtToken() with a JWT token without header.
93 *
94 * @expectedException \Shaarli\Api\Exceptions\ApiAuthorizationException
95 * @expectedExceptionMessage Malformed JWT token
96 */ 93 */
97 public function testValidateJwtTokenMalformedEmptyHeader() 94 public function testValidateJwtTokenMalformedEmptyHeader()
98 { 95 {
96 $this->expectException(\Shaarli\Api\Exceptions\ApiAuthorizationException::class);
97 $this->expectExceptionMessage('Malformed JWT token');
98
99 $token = '.payload.signature'; 99 $token = '.payload.signature';
100 ApiUtils::validateJwtToken($token, 'foo'); 100 ApiUtils::validateJwtToken($token, 'foo');
101 } 101 }
102 102
103 /** 103 /**
104 * Test validateJwtToken() with a JWT token without payload 104 * Test validateJwtToken() with a JWT token without payload
105 *
106 * @expectedException \Shaarli\Api\Exceptions\ApiAuthorizationException
107 * @expectedExceptionMessage Malformed JWT token
108 */ 105 */
109 public function testValidateJwtTokenMalformedEmptyPayload() 106 public function testValidateJwtTokenMalformedEmptyPayload()
110 { 107 {
108 $this->expectException(\Shaarli\Api\Exceptions\ApiAuthorizationException::class);
109 $this->expectExceptionMessage('Malformed JWT token');
110
111 $token = 'header..signature'; 111 $token = 'header..signature';
112 ApiUtils::validateJwtToken($token, 'foo'); 112 ApiUtils::validateJwtToken($token, 'foo');
113 } 113 }
114 114
115 /** 115 /**
116 * Test validateJwtToken() with a JWT token with an empty signature. 116 * Test validateJwtToken() with a JWT token with an empty signature.
117 *
118 * @expectedException \Shaarli\Api\Exceptions\ApiAuthorizationException
119 * @expectedExceptionMessage Invalid JWT signature
120 */ 117 */
121 public function testValidateJwtTokenInvalidSignatureEmpty() 118 public function testValidateJwtTokenInvalidSignatureEmpty()
122 { 119 {
120 $this->expectException(\Shaarli\Api\Exceptions\ApiAuthorizationException::class);
121 $this->expectExceptionMessage('Invalid JWT signature');
122
123 $token = 'header.payload.'; 123 $token = 'header.payload.';
124 ApiUtils::validateJwtToken($token, 'foo'); 124 ApiUtils::validateJwtToken($token, 'foo');
125 } 125 }
126 126
127 /** 127 /**
128 * Test validateJwtToken() with a JWT token with an invalid signature. 128 * Test validateJwtToken() with a JWT token with an invalid signature.
129 *
130 * @expectedException \Shaarli\Api\Exceptions\ApiAuthorizationException
131 * @expectedExceptionMessage Invalid JWT signature
132 */ 129 */
133 public function testValidateJwtTokenInvalidSignature() 130 public function testValidateJwtTokenInvalidSignature()
134 { 131 {
132 $this->expectException(\Shaarli\Api\Exceptions\ApiAuthorizationException::class);
133 $this->expectExceptionMessage('Invalid JWT signature');
134
135 $token = 'header.payload.nope'; 135 $token = 'header.payload.nope';
136 ApiUtils::validateJwtToken($token, 'foo'); 136 ApiUtils::validateJwtToken($token, 'foo');
137 } 137 }
138 138
139 /** 139 /**
140 * Test validateJwtToken() with a JWT token with a signature generated with the wrong API secret. 140 * Test validateJwtToken() with a JWT token with a signature generated with the wrong API secret.
141 *
142 * @expectedException \Shaarli\Api\Exceptions\ApiAuthorizationException
143 * @expectedExceptionMessage Invalid JWT signature
144 */ 141 */
145 public function testValidateJwtTokenInvalidSignatureSecret() 142 public function testValidateJwtTokenInvalidSignatureSecret()
146 { 143 {
144 $this->expectException(\Shaarli\Api\Exceptions\ApiAuthorizationException::class);
145 $this->expectExceptionMessage('Invalid JWT signature');
146
147 ApiUtils::validateJwtToken(self::generateValidJwtToken('foo'), 'bar'); 147 ApiUtils::validateJwtToken(self::generateValidJwtToken('foo'), 'bar');
148 } 148 }
149 149
150 /** 150 /**
151 * Test validateJwtToken() with a JWT token with a an invalid header (not JSON). 151 * Test validateJwtToken() with a JWT token with a an invalid header (not JSON).
152 *
153 * @expectedException \Shaarli\Api\Exceptions\ApiAuthorizationException
154 * @expectedExceptionMessage Invalid JWT header
155 */ 152 */
156 public function testValidateJwtTokenInvalidHeader() 153 public function testValidateJwtTokenInvalidHeader()
157 { 154 {
155 $this->expectException(\Shaarli\Api\Exceptions\ApiAuthorizationException::class);
156 $this->expectExceptionMessage('Invalid JWT header');
157
158 $token = $this->generateCustomJwtToken('notJSON', '{"JSON":1}', 'secret'); 158 $token = $this->generateCustomJwtToken('notJSON', '{"JSON":1}', 'secret');
159 ApiUtils::validateJwtToken($token, 'secret'); 159 ApiUtils::validateJwtToken($token, 'secret');
160 } 160 }
161 161
162 /** 162 /**
163 * Test validateJwtToken() with a JWT token with a an invalid payload (not JSON). 163 * Test validateJwtToken() with a JWT token with a an invalid payload (not JSON).
164 *
165 * @expectedException \Shaarli\Api\Exceptions\ApiAuthorizationException
166 * @expectedExceptionMessage Invalid JWT payload
167 */ 164 */
168 public function testValidateJwtTokenInvalidPayload() 165 public function testValidateJwtTokenInvalidPayload()
169 { 166 {
167 $this->expectException(\Shaarli\Api\Exceptions\ApiAuthorizationException::class);
168 $this->expectExceptionMessage('Invalid JWT payload');
169
170 $token = $this->generateCustomJwtToken('{"JSON":1}', 'notJSON', 'secret'); 170 $token = $this->generateCustomJwtToken('{"JSON":1}', 'notJSON', 'secret');
171 ApiUtils::validateJwtToken($token, 'secret'); 171 ApiUtils::validateJwtToken($token, 'secret');
172 } 172 }
173 173
174 /** 174 /**
175 * Test validateJwtToken() with a JWT token without issued time. 175 * Test validateJwtToken() with a JWT token without issued time.
176 *
177 * @expectedException \Shaarli\Api\Exceptions\ApiAuthorizationException
178 * @expectedExceptionMessage Invalid JWT issued time
179 */ 176 */
180 public function testValidateJwtTokenInvalidTimeEmpty() 177 public function testValidateJwtTokenInvalidTimeEmpty()
181 { 178 {
179 $this->expectException(\Shaarli\Api\Exceptions\ApiAuthorizationException::class);
180 $this->expectExceptionMessage('Invalid JWT issued time');
181
182 $token = $this->generateCustomJwtToken('{"JSON":1}', '{"JSON":1}', 'secret'); 182 $token = $this->generateCustomJwtToken('{"JSON":1}', '{"JSON":1}', 'secret');
183 ApiUtils::validateJwtToken($token, 'secret'); 183 ApiUtils::validateJwtToken($token, 'secret');
184 } 184 }
185 185
186 /** 186 /**
187 * Test validateJwtToken() with an expired JWT token. 187 * Test validateJwtToken() with an expired JWT token.
188 *
189 * @expectedException \Shaarli\Api\Exceptions\ApiAuthorizationException
190 * @expectedExceptionMessage Invalid JWT issued time
191 */ 188 */
192 public function testValidateJwtTokenInvalidTimeExpired() 189 public function testValidateJwtTokenInvalidTimeExpired()
193 { 190 {
191 $this->expectException(\Shaarli\Api\Exceptions\ApiAuthorizationException::class);
192 $this->expectExceptionMessage('Invalid JWT issued time');
193
194 $token = $this->generateCustomJwtToken('{"JSON":1}', '{"iat":' . (time() - 600) . '}', 'secret'); 194 $token = $this->generateCustomJwtToken('{"JSON":1}', '{"iat":' . (time() - 600) . '}', 'secret');
195 ApiUtils::validateJwtToken($token, 'secret'); 195 ApiUtils::validateJwtToken($token, 'secret');
196 } 196 }
197 197
198 /** 198 /**
199 * Test validateJwtToken() with a JWT token issued in the future. 199 * Test validateJwtToken() with a JWT token issued in the future.
200 *
201 * @expectedException \Shaarli\Api\Exceptions\ApiAuthorizationException
202 * @expectedExceptionMessage Invalid JWT issued time
203 */ 200 */
204 public function testValidateJwtTokenInvalidTimeFuture() 201 public function testValidateJwtTokenInvalidTimeFuture()
205 { 202 {
203 $this->expectException(\Shaarli\Api\Exceptions\ApiAuthorizationException::class);
204 $this->expectExceptionMessage('Invalid JWT issued time');
205
206 $token = $this->generateCustomJwtToken('{"JSON":1}', '{"iat":' . (time() + 60) . '}', 'secret'); 206 $token = $this->generateCustomJwtToken('{"JSON":1}', '{"iat":' . (time() + 60) . '}', 'secret');
207 ApiUtils::validateJwtToken($token, 'secret'); 207 ApiUtils::validateJwtToken($token, 'secret');
208 } 208 }
diff --git a/tests/api/controllers/history/HistoryTest.php b/tests/api/controllers/history/HistoryTest.php
index f4d3b646..84f8716e 100644
--- a/tests/api/controllers/history/HistoryTest.php
+++ b/tests/api/controllers/history/HistoryTest.php
@@ -11,7 +11,7 @@ use Slim\Http\Response;
11 11
12require_once 'tests/utils/ReferenceHistory.php'; 12require_once 'tests/utils/ReferenceHistory.php';
13 13
14class HistoryTest extends \PHPUnit\Framework\TestCase 14class HistoryTest extends \Shaarli\TestCase
15{ 15{
16 /** 16 /**
17 * @var string datastore to test write operations 17 * @var string datastore to test write operations
@@ -41,7 +41,7 @@ class HistoryTest extends \PHPUnit\Framework\TestCase
41 /** 41 /**
42 * Before every test, instantiate a new Api with its config, plugins and bookmarks. 42 * Before every test, instantiate a new Api with its config, plugins and bookmarks.
43 */ 43 */
44 public function setUp() 44 protected function setUp(): void
45 { 45 {
46 $this->conf = new ConfigManager('tests/utils/config/configJson'); 46 $this->conf = new ConfigManager('tests/utils/config/configJson');
47 $this->refHistory = new \ReferenceHistory(); 47 $this->refHistory = new \ReferenceHistory();
@@ -57,7 +57,7 @@ class HistoryTest extends \PHPUnit\Framework\TestCase
57 /** 57 /**
58 * After every test, remove the test datastore. 58 * After every test, remove the test datastore.
59 */ 59 */
60 public function tearDown() 60 protected function tearDown(): void
61 { 61 {
62 @unlink(self::$testHistory); 62 @unlink(self::$testHistory);
63 } 63 }
diff --git a/tests/api/controllers/info/InfoTest.php b/tests/api/controllers/info/InfoTest.php
index b5c938e1..1598e1e8 100644
--- a/tests/api/controllers/info/InfoTest.php
+++ b/tests/api/controllers/info/InfoTest.php
@@ -1,10 +1,10 @@
1<?php 1<?php
2namespace Shaarli\Api\Controllers; 2namespace Shaarli\Api\Controllers;
3 3
4use PHPUnit\Framework\TestCase;
5use Shaarli\Bookmark\BookmarkFileService; 4use Shaarli\Bookmark\BookmarkFileService;
6use Shaarli\Config\ConfigManager; 5use Shaarli\Config\ConfigManager;
7use Shaarli\History; 6use Shaarli\History;
7use Shaarli\TestCase;
8use Slim\Container; 8use Slim\Container;
9use Slim\Http\Environment; 9use Slim\Http\Environment;
10use Slim\Http\Request; 10use Slim\Http\Request;
@@ -47,7 +47,7 @@ class InfoTest extends TestCase
47 /** 47 /**
48 * Before every test, instantiate a new Api with its config, plugins and bookmarks. 48 * Before every test, instantiate a new Api with its config, plugins and bookmarks.
49 */ 49 */
50 public function setUp() 50 protected function setUp(): void
51 { 51 {
52 $this->conf = new ConfigManager('tests/utils/config/configJson'); 52 $this->conf = new ConfigManager('tests/utils/config/configJson');
53 $this->conf->set('resource.datastore', self::$testDatastore); 53 $this->conf->set('resource.datastore', self::$testDatastore);
@@ -67,7 +67,7 @@ class InfoTest extends TestCase
67 /** 67 /**
68 * After every test, remove the test datastore. 68 * After every test, remove the test datastore.
69 */ 69 */
70 public function tearDown() 70 protected function tearDown(): void
71 { 71 {
72 @unlink(self::$testDatastore); 72 @unlink(self::$testDatastore);
73 } 73 }
diff --git a/tests/api/controllers/links/DeleteLinkTest.php b/tests/api/controllers/links/DeleteLinkTest.php
index 6c2b3698..cf9464f0 100644
--- a/tests/api/controllers/links/DeleteLinkTest.php
+++ b/tests/api/controllers/links/DeleteLinkTest.php
@@ -11,7 +11,7 @@ use Slim\Http\Environment;
11use Slim\Http\Request; 11use Slim\Http\Request;
12use Slim\Http\Response; 12use Slim\Http\Response;
13 13
14class DeleteLinkTest extends \PHPUnit\Framework\TestCase 14class DeleteLinkTest extends \Shaarli\TestCase
15{ 15{
16 /** 16 /**
17 * @var string datastore to test write operations 17 * @var string datastore to test write operations
@@ -56,7 +56,7 @@ class DeleteLinkTest extends \PHPUnit\Framework\TestCase
56 /** 56 /**
57 * Before each test, instantiate a new Api with its config, plugins and bookmarks. 57 * Before each test, instantiate a new Api with its config, plugins and bookmarks.
58 */ 58 */
59 public function setUp() 59 protected function setUp(): void
60 { 60 {
61 $this->conf = new ConfigManager('tests/utils/config/configJson'); 61 $this->conf = new ConfigManager('tests/utils/config/configJson');
62 $this->conf->set('resource.datastore', self::$testDatastore); 62 $this->conf->set('resource.datastore', self::$testDatastore);
@@ -78,7 +78,7 @@ class DeleteLinkTest extends \PHPUnit\Framework\TestCase
78 /** 78 /**
79 * After each test, remove the test datastore. 79 * After each test, remove the test datastore.
80 */ 80 */
81 public function tearDown() 81 protected function tearDown(): void
82 { 82 {
83 @unlink(self::$testDatastore); 83 @unlink(self::$testDatastore);
84 @unlink(self::$testHistory); 84 @unlink(self::$testHistory);
@@ -113,11 +113,11 @@ class DeleteLinkTest extends \PHPUnit\Framework\TestCase
113 113
114 /** 114 /**
115 * Test DELETE link endpoint: reach not existing ID. 115 * Test DELETE link endpoint: reach not existing ID.
116 *
117 * @expectedException \Shaarli\Api\Exceptions\ApiLinkNotFoundException
118 */ 116 */
119 public function testDeleteLink404() 117 public function testDeleteLink404()
120 { 118 {
119 $this->expectException(\Shaarli\Api\Exceptions\ApiLinkNotFoundException::class);
120
121 $id = -1; 121 $id = -1;
122 $this->assertFalse($this->bookmarkService->exists($id)); 122 $this->assertFalse($this->bookmarkService->exists($id));
123 $env = Environment::mock([ 123 $env = Environment::mock([
diff --git a/tests/api/controllers/links/GetLinkIdTest.php b/tests/api/controllers/links/GetLinkIdTest.php
index 8bb81dc8..99dc606f 100644
--- a/tests/api/controllers/links/GetLinkIdTest.php
+++ b/tests/api/controllers/links/GetLinkIdTest.php
@@ -20,7 +20,7 @@ use Slim\Http\Response;
20 * 20 *
21 * @package Shaarli\Api\Controllers 21 * @package Shaarli\Api\Controllers
22 */ 22 */
23class GetLinkIdTest extends \PHPUnit\Framework\TestCase 23class GetLinkIdTest extends \Shaarli\TestCase
24{ 24{
25 /** 25 /**
26 * @var string datastore to test write operations 26 * @var string datastore to test write operations
@@ -55,7 +55,7 @@ class GetLinkIdTest extends \PHPUnit\Framework\TestCase
55 /** 55 /**
56 * Before each test, instantiate a new Api with its config, plugins and bookmarks. 56 * Before each test, instantiate a new Api with its config, plugins and bookmarks.
57 */ 57 */
58 public function setUp() 58 protected function setUp(): void
59 { 59 {
60 $this->conf = new ConfigManager('tests/utils/config/configJson'); 60 $this->conf = new ConfigManager('tests/utils/config/configJson');
61 $this->conf->set('resource.datastore', self::$testDatastore); 61 $this->conf->set('resource.datastore', self::$testDatastore);
@@ -74,7 +74,7 @@ class GetLinkIdTest extends \PHPUnit\Framework\TestCase
74 /** 74 /**
75 * After each test, remove the test datastore. 75 * After each test, remove the test datastore.
76 */ 76 */
77 public function tearDown() 77 protected function tearDown(): void
78 { 78 {
79 @unlink(self::$testDatastore); 79 @unlink(self::$testDatastore);
80 } 80 }
@@ -120,12 +120,12 @@ class GetLinkIdTest extends \PHPUnit\Framework\TestCase
120 120
121 /** 121 /**
122 * Test basic getLink service: get non existent link => ApiLinkNotFoundException. 122 * Test basic getLink service: get non existent link => ApiLinkNotFoundException.
123 *
124 * @expectedException Shaarli\Api\Exceptions\ApiLinkNotFoundException
125 * @expectedExceptionMessage Link not found
126 */ 123 */
127 public function testGetLink404() 124 public function testGetLink404()
128 { 125 {
126 $this->expectException(\Shaarli\Api\Exceptions\ApiLinkNotFoundException::class);
127 $this->expectExceptionMessage('Link not found');
128
129 $env = Environment::mock([ 129 $env = Environment::mock([
130 'REQUEST_METHOD' => 'GET', 130 'REQUEST_METHOD' => 'GET',
131 ]); 131 ]);
diff --git a/tests/api/controllers/links/GetLinksTest.php b/tests/api/controllers/links/GetLinksTest.php
index d02e6fad..ca1bfc63 100644
--- a/tests/api/controllers/links/GetLinksTest.php
+++ b/tests/api/controllers/links/GetLinksTest.php
@@ -20,7 +20,7 @@ use Slim\Http\Response;
20 * 20 *
21 * @package Shaarli\Api\Controllers 21 * @package Shaarli\Api\Controllers
22 */ 22 */
23class GetLinksTest extends \PHPUnit\Framework\TestCase 23class GetLinksTest extends \Shaarli\TestCase
24{ 24{
25 /** 25 /**
26 * @var string datastore to test write operations 26 * @var string datastore to test write operations
@@ -55,7 +55,7 @@ class GetLinksTest extends \PHPUnit\Framework\TestCase
55 /** 55 /**
56 * Before every test, instantiate a new Api with its config, plugins and bookmarks. 56 * Before every test, instantiate a new Api with its config, plugins and bookmarks.
57 */ 57 */
58 public function setUp() 58 protected function setUp(): void
59 { 59 {
60 $this->conf = new ConfigManager('tests/utils/config/configJson'); 60 $this->conf = new ConfigManager('tests/utils/config/configJson');
61 $this->conf->set('resource.datastore', self::$testDatastore); 61 $this->conf->set('resource.datastore', self::$testDatastore);
@@ -74,7 +74,7 @@ class GetLinksTest extends \PHPUnit\Framework\TestCase
74 /** 74 /**
75 * After every test, remove the test datastore. 75 * After every test, remove the test datastore.
76 */ 76 */
77 public function tearDown() 77 protected function tearDown(): void
78 { 78 {
79 @unlink(self::$testDatastore); 79 @unlink(self::$testDatastore);
80 } 80 }
diff --git a/tests/api/controllers/links/PostLinkTest.php b/tests/api/controllers/links/PostLinkTest.php
index f969fe1c..20694571 100644
--- a/tests/api/controllers/links/PostLinkTest.php
+++ b/tests/api/controllers/links/PostLinkTest.php
@@ -2,11 +2,11 @@
2 2
3namespace Shaarli\Api\Controllers; 3namespace Shaarli\Api\Controllers;
4 4
5use PHPUnit\Framework\TestCase;
6use Shaarli\Bookmark\Bookmark; 5use Shaarli\Bookmark\Bookmark;
7use Shaarli\Bookmark\BookmarkFileService; 6use Shaarli\Bookmark\BookmarkFileService;
8use Shaarli\Config\ConfigManager; 7use Shaarli\Config\ConfigManager;
9use Shaarli\History; 8use Shaarli\History;
9use Shaarli\TestCase;
10use Slim\Container; 10use Slim\Container;
11use Slim\Http\Environment; 11use Slim\Http\Environment;
12use Slim\Http\Request; 12use Slim\Http\Request;
@@ -70,7 +70,7 @@ class PostLinkTest extends TestCase
70 /** 70 /**
71 * Before every test, instantiate a new Api with its config, plugins and bookmarks. 71 * Before every test, instantiate a new Api with its config, plugins and bookmarks.
72 */ 72 */
73 public function setUp() 73 protected function setUp(): void
74 { 74 {
75 $this->conf = new ConfigManager('tests/utils/config/configJson'); 75 $this->conf = new ConfigManager('tests/utils/config/configJson');
76 $this->conf->set('resource.datastore', self::$testDatastore); 76 $this->conf->set('resource.datastore', self::$testDatastore);
@@ -107,7 +107,7 @@ class PostLinkTest extends TestCase
107 /** 107 /**
108 * After every test, remove the test datastore. 108 * After every test, remove the test datastore.
109 */ 109 */
110 public function tearDown() 110 protected function tearDown(): void
111 { 111 {
112 @unlink(self::$testDatastore); 112 @unlink(self::$testDatastore);
113 @unlink(self::$testHistory); 113 @unlink(self::$testHistory);
diff --git a/tests/api/controllers/links/PutLinkTest.php b/tests/api/controllers/links/PutLinkTest.php
index 302cac0f..a2e87c59 100644
--- a/tests/api/controllers/links/PutLinkTest.php
+++ b/tests/api/controllers/links/PutLinkTest.php
@@ -12,7 +12,7 @@ use Slim\Http\Environment;
12use Slim\Http\Request; 12use Slim\Http\Request;
13use Slim\Http\Response; 13use Slim\Http\Response;
14 14
15class PutLinkTest extends \PHPUnit\Framework\TestCase 15class PutLinkTest extends \Shaarli\TestCase
16{ 16{
17 /** 17 /**
18 * @var string datastore to test write operations 18 * @var string datastore to test write operations
@@ -62,7 +62,7 @@ class PutLinkTest extends \PHPUnit\Framework\TestCase
62 /** 62 /**
63 * Before every test, instantiate a new Api with its config, plugins and bookmarks. 63 * Before every test, instantiate a new Api with its config, plugins and bookmarks.
64 */ 64 */
65 public function setUp() 65 protected function setUp(): void
66 { 66 {
67 $this->conf = new ConfigManager('tests/utils/config/configJson'); 67 $this->conf = new ConfigManager('tests/utils/config/configJson');
68 $this->conf->set('resource.datastore', self::$testDatastore); 68 $this->conf->set('resource.datastore', self::$testDatastore);
@@ -91,7 +91,7 @@ class PutLinkTest extends \PHPUnit\Framework\TestCase
91 /** 91 /**
92 * After every test, remove the test datastore. 92 * After every test, remove the test datastore.
93 */ 93 */
94 public function tearDown() 94 protected function tearDown(): void
95 { 95 {
96 @unlink(self::$testDatastore); 96 @unlink(self::$testDatastore);
97 @unlink(self::$testHistory); 97 @unlink(self::$testHistory);
@@ -218,12 +218,12 @@ class PutLinkTest extends \PHPUnit\Framework\TestCase
218 218
219 /** 219 /**
220 * Test link update on non existent link => ApiLinkNotFoundException. 220 * Test link update on non existent link => ApiLinkNotFoundException.
221 *
222 * @expectedException Shaarli\Api\Exceptions\ApiLinkNotFoundException
223 * @expectedExceptionMessage Link not found
224 */ 221 */
225 public function testGetLink404() 222 public function testGetLink404()
226 { 223 {
224 $this->expectException(\Shaarli\Api\Exceptions\ApiLinkNotFoundException::class);
225 $this->expectExceptionMessage('Link not found');
226
227 $env = Environment::mock([ 227 $env = Environment::mock([
228 'REQUEST_METHOD' => 'PUT', 228 'REQUEST_METHOD' => 'PUT',
229 ]); 229 ]);
diff --git a/tests/api/controllers/tags/DeleteTagTest.php b/tests/api/controllers/tags/DeleteTagTest.php
index c6748872..1326eb47 100644
--- a/tests/api/controllers/tags/DeleteTagTest.php
+++ b/tests/api/controllers/tags/DeleteTagTest.php
@@ -12,7 +12,7 @@ use Slim\Http\Environment;
12use Slim\Http\Request; 12use Slim\Http\Request;
13use Slim\Http\Response; 13use Slim\Http\Response;
14 14
15class DeleteTagTest extends \PHPUnit\Framework\TestCase 15class DeleteTagTest extends \Shaarli\TestCase
16{ 16{
17 /** 17 /**
18 * @var string datastore to test write operations 18 * @var string datastore to test write operations
@@ -57,7 +57,7 @@ class DeleteTagTest extends \PHPUnit\Framework\TestCase
57 /** 57 /**
58 * Before each test, instantiate a new Api with its config, plugins and bookmarks. 58 * Before each test, instantiate a new Api with its config, plugins and bookmarks.
59 */ 59 */
60 public function setUp() 60 protected function setUp(): void
61 { 61 {
62 $this->conf = new ConfigManager('tests/utils/config/configJson'); 62 $this->conf = new ConfigManager('tests/utils/config/configJson');
63 $this->conf->set('resource.datastore', self::$testDatastore); 63 $this->conf->set('resource.datastore', self::$testDatastore);
@@ -79,7 +79,7 @@ class DeleteTagTest extends \PHPUnit\Framework\TestCase
79 /** 79 /**
80 * After each test, remove the test datastore. 80 * After each test, remove the test datastore.
81 */ 81 */
82 public function tearDown() 82 protected function tearDown(): void
83 { 83 {
84 @unlink(self::$testDatastore); 84 @unlink(self::$testDatastore);
85 @unlink(self::$testHistory); 85 @unlink(self::$testHistory);
@@ -150,12 +150,12 @@ class DeleteTagTest extends \PHPUnit\Framework\TestCase
150 150
151 /** 151 /**
152 * Test DELETE tag endpoint: reach not existing tag. 152 * Test DELETE tag endpoint: reach not existing tag.
153 *
154 * @expectedException Shaarli\Api\Exceptions\ApiTagNotFoundException
155 * @expectedExceptionMessage Tag not found
156 */ 153 */
157 public function testDeleteLink404() 154 public function testDeleteLink404()
158 { 155 {
156 $this->expectException(\Shaarli\Api\Exceptions\ApiTagNotFoundException::class);
157 $this->expectExceptionMessage('Tag not found');
158
159 $tagName = 'nopenope'; 159 $tagName = 'nopenope';
160 $tags = $this->bookmarkService->bookmarksCountPerTag(); 160 $tags = $this->bookmarkService->bookmarksCountPerTag();
161 $this->assertFalse(isset($tags[$tagName])); 161 $this->assertFalse(isset($tags[$tagName]));
diff --git a/tests/api/controllers/tags/GetTagNameTest.php b/tests/api/controllers/tags/GetTagNameTest.php
index b9a81f9b..9c05954b 100644
--- a/tests/api/controllers/tags/GetTagNameTest.php
+++ b/tests/api/controllers/tags/GetTagNameTest.php
@@ -18,7 +18,7 @@ use Slim\Http\Response;
18 * 18 *
19 * @package Shaarli\Api\Controllers 19 * @package Shaarli\Api\Controllers
20 */ 20 */
21class GetTagNameTest extends \PHPUnit\Framework\TestCase 21class GetTagNameTest extends \Shaarli\TestCase
22{ 22{
23 /** 23 /**
24 * @var string datastore to test write operations 24 * @var string datastore to test write operations
@@ -53,7 +53,7 @@ class GetTagNameTest extends \PHPUnit\Framework\TestCase
53 /** 53 /**
54 * Before each test, instantiate a new Api with its config, plugins and bookmarks. 54 * Before each test, instantiate a new Api with its config, plugins and bookmarks.
55 */ 55 */
56 public function setUp() 56 protected function setUp(): void
57 { 57 {
58 $this->conf = new ConfigManager('tests/utils/config/configJson'); 58 $this->conf = new ConfigManager('tests/utils/config/configJson');
59 $this->conf->set('resource.datastore', self::$testDatastore); 59 $this->conf->set('resource.datastore', self::$testDatastore);
@@ -72,7 +72,7 @@ class GetTagNameTest extends \PHPUnit\Framework\TestCase
72 /** 72 /**
73 * After each test, remove the test datastore. 73 * After each test, remove the test datastore.
74 */ 74 */
75 public function tearDown() 75 protected function tearDown(): void
76 { 76 {
77 @unlink(self::$testDatastore); 77 @unlink(self::$testDatastore);
78 } 78 }
@@ -117,12 +117,12 @@ class GetTagNameTest extends \PHPUnit\Framework\TestCase
117 117
118 /** 118 /**
119 * Test basic getTag service: get non existent tag => ApiTagNotFoundException. 119 * Test basic getTag service: get non existent tag => ApiTagNotFoundException.
120 *
121 * @expectedException Shaarli\Api\Exceptions\ApiTagNotFoundException
122 * @expectedExceptionMessage Tag not found
123 */ 120 */
124 public function testGetTag404() 121 public function testGetTag404()
125 { 122 {
123 $this->expectException(\Shaarli\Api\Exceptions\ApiTagNotFoundException::class);
124 $this->expectExceptionMessage('Tag not found');
125
126 $env = Environment::mock([ 126 $env = Environment::mock([
127 'REQUEST_METHOD' => 'GET', 127 'REQUEST_METHOD' => 'GET',
128 ]); 128 ]);
diff --git a/tests/api/controllers/tags/GetTagsTest.php b/tests/api/controllers/tags/GetTagsTest.php
index 53a3326d..3459fdfa 100644
--- a/tests/api/controllers/tags/GetTagsTest.php
+++ b/tests/api/controllers/tags/GetTagsTest.php
@@ -17,7 +17,7 @@ use Slim\Http\Response;
17 * 17 *
18 * @package Shaarli\Api\Controllers 18 * @package Shaarli\Api\Controllers
19 */ 19 */
20class GetTagsTest extends \PHPUnit\Framework\TestCase 20class GetTagsTest extends \Shaarli\TestCase
21{ 21{
22 /** 22 /**
23 * @var string datastore to test write operations 23 * @var string datastore to test write operations
@@ -57,7 +57,7 @@ class GetTagsTest extends \PHPUnit\Framework\TestCase
57 /** 57 /**
58 * Before every test, instantiate a new Api with its config, plugins and bookmarks. 58 * Before every test, instantiate a new Api with its config, plugins and bookmarks.
59 */ 59 */
60 public function setUp() 60 protected function setUp(): void
61 { 61 {
62 $this->conf = new ConfigManager('tests/utils/config/configJson'); 62 $this->conf = new ConfigManager('tests/utils/config/configJson');
63 $this->conf->set('resource.datastore', self::$testDatastore); 63 $this->conf->set('resource.datastore', self::$testDatastore);
@@ -78,7 +78,7 @@ class GetTagsTest extends \PHPUnit\Framework\TestCase
78 /** 78 /**
79 * After every test, remove the test datastore. 79 * After every test, remove the test datastore.
80 */ 80 */
81 public function tearDown() 81 protected function tearDown(): void
82 { 82 {
83 @unlink(self::$testDatastore); 83 @unlink(self::$testDatastore);
84 } 84 }
diff --git a/tests/api/controllers/tags/PutTagTest.php b/tests/api/controllers/tags/PutTagTest.php
index 2a3cc15a..74edde78 100644
--- a/tests/api/controllers/tags/PutTagTest.php
+++ b/tests/api/controllers/tags/PutTagTest.php
@@ -12,7 +12,7 @@ use Slim\Http\Environment;
12use Slim\Http\Request; 12use Slim\Http\Request;
13use Slim\Http\Response; 13use Slim\Http\Response;
14 14
15class PutTagTest extends \PHPUnit\Framework\TestCase 15class PutTagTest extends \Shaarli\TestCase
16{ 16{
17 /** 17 /**
18 * @var string datastore to test write operations 18 * @var string datastore to test write operations
@@ -62,7 +62,7 @@ class PutTagTest extends \PHPUnit\Framework\TestCase
62 /** 62 /**
63 * Before every test, instantiate a new Api with its config, plugins and bookmarks. 63 * Before every test, instantiate a new Api with its config, plugins and bookmarks.
64 */ 64 */
65 public function setUp() 65 protected function setUp(): void
66 { 66 {
67 $this->conf = new ConfigManager('tests/utils/config/configJson'); 67 $this->conf = new ConfigManager('tests/utils/config/configJson');
68 $this->conf->set('resource.datastore', self::$testDatastore); 68 $this->conf->set('resource.datastore', self::$testDatastore);
@@ -84,7 +84,7 @@ class PutTagTest extends \PHPUnit\Framework\TestCase
84 /** 84 /**
85 * After every test, remove the test datastore. 85 * After every test, remove the test datastore.
86 */ 86 */
87 public function tearDown() 87 protected function tearDown(): void
88 { 88 {
89 @unlink(self::$testDatastore); 89 @unlink(self::$testDatastore);
90 @unlink(self::$testHistory); 90 @unlink(self::$testHistory);
@@ -159,12 +159,12 @@ class PutTagTest extends \PHPUnit\Framework\TestCase
159 159
160 /** 160 /**
161 * Test tag update with an empty new tag name => ApiBadParametersException 161 * Test tag update with an empty new tag name => ApiBadParametersException
162 *
163 * @expectedException Shaarli\Api\Exceptions\ApiBadParametersException
164 * @expectedExceptionMessage New tag name is required in the request body
165 */ 162 */
166 public function testPutTagEmpty() 163 public function testPutTagEmpty()
167 { 164 {
165 $this->expectException(\Shaarli\Api\Exceptions\ApiBadParametersException::class);
166 $this->expectExceptionMessage('New tag name is required in the request body');
167
168 $tagName = 'gnu'; 168 $tagName = 'gnu';
169 $newName = ''; 169 $newName = '';
170 170
@@ -194,12 +194,12 @@ class PutTagTest extends \PHPUnit\Framework\TestCase
194 194
195 /** 195 /**
196 * Test tag update on non existent tag => ApiTagNotFoundException. 196 * Test tag update on non existent tag => ApiTagNotFoundException.
197 *
198 * @expectedException Shaarli\Api\Exceptions\ApiTagNotFoundException
199 * @expectedExceptionMessage Tag not found
200 */ 197 */
201 public function testPutTag404() 198 public function testPutTag404()
202 { 199 {
200 $this->expectException(\Shaarli\Api\Exceptions\ApiTagNotFoundException::class);
201 $this->expectExceptionMessage('Tag not found');
202
203 $env = Environment::mock([ 203 $env = Environment::mock([
204 'REQUEST_METHOD' => 'PUT', 204 'REQUEST_METHOD' => 'PUT',
205 ]); 205 ]);
diff --git a/tests/bookmark/BookmarkArrayTest.php b/tests/bookmark/BookmarkArrayTest.php
index 0f8f04c5..ebed9bfc 100644
--- a/tests/bookmark/BookmarkArrayTest.php
+++ b/tests/bookmark/BookmarkArrayTest.php
@@ -2,10 +2,7 @@
2 2
3namespace Shaarli\Bookmark; 3namespace Shaarli\Bookmark;
4 4
5use PHPUnit\Framework\TestCase; 5use Shaarli\TestCase;
6use Shaarli\Bookmark\Exception\InvalidBookmarkException;
7use Shaarli\Config\ConfigManager;
8use Shaarli\History;
9 6
10/** 7/**
11 * Class BookmarkArrayTest 8 * Class BookmarkArrayTest
@@ -47,22 +44,22 @@ class BookmarkArrayTest extends TestCase
47 44
48 /** 45 /**
49 * Test adding a bad entry: wrong type 46 * Test adding a bad entry: wrong type
50 *
51 * @expectedException Shaarli\Bookmark\Exception\InvalidBookmarkException
52 */ 47 */
53 public function testArrayAccessAddBadEntryInstance() 48 public function testArrayAccessAddBadEntryInstance()
54 { 49 {
50 $this->expectException(\Shaarli\Bookmark\Exception\InvalidBookmarkException::class);
51
55 $array = new BookmarkArray(); 52 $array = new BookmarkArray();
56 $array[] = 'nope'; 53 $array[] = 'nope';
57 } 54 }
58 55
59 /** 56 /**
60 * Test adding a bad entry: no id 57 * Test adding a bad entry: no id
61 *
62 * @expectedException Shaarli\Bookmark\Exception\InvalidBookmarkException
63 */ 58 */
64 public function testArrayAccessAddBadEntryNoId() 59 public function testArrayAccessAddBadEntryNoId()
65 { 60 {
61 $this->expectException(\Shaarli\Bookmark\Exception\InvalidBookmarkException::class);
62
66 $array = new BookmarkArray(); 63 $array = new BookmarkArray();
67 $bookmark = new Bookmark(); 64 $bookmark = new Bookmark();
68 $array[] = $bookmark; 65 $array[] = $bookmark;
@@ -70,11 +67,11 @@ class BookmarkArrayTest extends TestCase
70 67
71 /** 68 /**
72 * Test adding a bad entry: no url 69 * Test adding a bad entry: no url
73 *
74 * @expectedException Shaarli\Bookmark\Exception\InvalidBookmarkException
75 */ 70 */
76 public function testArrayAccessAddBadEntryNoUrl() 71 public function testArrayAccessAddBadEntryNoUrl()
77 { 72 {
73 $this->expectException(\Shaarli\Bookmark\Exception\InvalidBookmarkException::class);
74
78 $array = new BookmarkArray(); 75 $array = new BookmarkArray();
79 $bookmark = (new Bookmark())->setId(11); 76 $bookmark = (new Bookmark())->setId(11);
80 $array[] = $bookmark; 77 $array[] = $bookmark;
@@ -82,11 +79,11 @@ class BookmarkArrayTest extends TestCase
82 79
83 /** 80 /**
84 * Test adding a bad entry: invalid offset 81 * Test adding a bad entry: invalid offset
85 *
86 * @expectedException Shaarli\Bookmark\Exception\InvalidBookmarkException
87 */ 82 */
88 public function testArrayAccessAddBadEntryOffset() 83 public function testArrayAccessAddBadEntryOffset()
89 { 84 {
85 $this->expectException(\Shaarli\Bookmark\Exception\InvalidBookmarkException::class);
86
90 $array = new BookmarkArray(); 87 $array = new BookmarkArray();
91 $bookmark = (new Bookmark())->setId(11); 88 $bookmark = (new Bookmark())->setId(11);
92 $bookmark->validate(); 89 $bookmark->validate();
@@ -95,11 +92,11 @@ class BookmarkArrayTest extends TestCase
95 92
96 /** 93 /**
97 * Test adding a bad entry: invalid ID type 94 * Test adding a bad entry: invalid ID type
98 *
99 * @expectedException Shaarli\Bookmark\Exception\InvalidBookmarkException
100 */ 95 */
101 public function testArrayAccessAddBadEntryIdType() 96 public function testArrayAccessAddBadEntryIdType()
102 { 97 {
98 $this->expectException(\Shaarli\Bookmark\Exception\InvalidBookmarkException::class);
99
103 $array = new BookmarkArray(); 100 $array = new BookmarkArray();
104 $bookmark = (new Bookmark())->setId('nope'); 101 $bookmark = (new Bookmark())->setId('nope');
105 $bookmark->validate(); 102 $bookmark->validate();
@@ -108,11 +105,11 @@ class BookmarkArrayTest extends TestCase
108 105
109 /** 106 /**
110 * Test adding a bad entry: ID/offset not consistent 107 * Test adding a bad entry: ID/offset not consistent
111 *
112 * @expectedException Shaarli\Bookmark\Exception\InvalidBookmarkException
113 */ 108 */
114 public function testArrayAccessAddBadEntryIdOffset() 109 public function testArrayAccessAddBadEntryIdOffset()
115 { 110 {
111 $this->expectException(\Shaarli\Bookmark\Exception\InvalidBookmarkException::class);
112
116 $array = new BookmarkArray(); 113 $array = new BookmarkArray();
117 $bookmark = (new Bookmark())->setId(11); 114 $bookmark = (new Bookmark())->setId(11);
118 $bookmark->validate(); 115 $bookmark->validate();
diff --git a/tests/bookmark/BookmarkFileServiceTest.php b/tests/bookmark/BookmarkFileServiceTest.php
index 7b1906d3..c399822b 100644
--- a/tests/bookmark/BookmarkFileServiceTest.php
+++ b/tests/bookmark/BookmarkFileServiceTest.php
@@ -6,7 +6,6 @@
6namespace Shaarli\Bookmark; 6namespace Shaarli\Bookmark;
7 7
8use DateTime; 8use DateTime;
9use PHPUnit\Framework\TestCase;
10use ReferenceLinkDB; 9use ReferenceLinkDB;
11use ReflectionClass; 10use ReflectionClass;
12use Shaarli; 11use Shaarli;
@@ -14,6 +13,7 @@ use Shaarli\Bookmark\Exception\BookmarkNotFoundException;
14use Shaarli\Config\ConfigManager; 13use Shaarli\Config\ConfigManager;
15use Shaarli\Formatter\BookmarkMarkdownFormatter; 14use Shaarli\Formatter\BookmarkMarkdownFormatter;
16use Shaarli\History; 15use Shaarli\History;
16use Shaarli\TestCase;
17 17
18/** 18/**
19 * Unitary tests for LegacyLinkDBTest 19 * Unitary tests for LegacyLinkDBTest
@@ -66,7 +66,7 @@ class BookmarkFileServiceTest extends TestCase
66 * 66 *
67 * Resets test data for each test 67 * Resets test data for each test
68 */ 68 */
69 protected function setUp() 69 protected function setUp(): void
70 { 70 {
71 if (file_exists(self::$testDatastore)) { 71 if (file_exists(self::$testDatastore)) {
72 unlink(self::$testDatastore); 72 unlink(self::$testDatastore);
@@ -134,11 +134,11 @@ class BookmarkFileServiceTest extends TestCase
134 134
135 /** 135 /**
136 * Test get() method for an undefined bookmark 136 * Test get() method for an undefined bookmark
137 *
138 * @expectedException Shaarli\Bookmark\Exception\BookmarkNotFoundException
139 */ 137 */
140 public function testGetUndefined() 138 public function testGetUndefined()
141 { 139 {
140 $this->expectException(\Shaarli\Bookmark\Exception\BookmarkNotFoundException::class);
141
142 $this->privateLinkDB->get(666); 142 $this->privateLinkDB->get(666);
143 } 143 }
144 144
@@ -230,13 +230,13 @@ class BookmarkFileServiceTest extends TestCase
230 230
231 /** 231 /**
232 * Test add() method for a bookmark without any field set and without writing the data store 232 * Test add() method for a bookmark without any field set and without writing the data store
233 *
234 * @expectedExceptionMessage Shaarli\Bookmark\Exception\BookmarkNotFoundException
235 */ 233 */
236 public function testAddMinimalNoWrite() 234 public function testAddMinimalNoWrite()
237 { 235 {
236 $this->expectException(\Shaarli\Bookmark\Exception\BookmarkNotFoundException::class);
237
238 $bookmark = new Bookmark(); 238 $bookmark = new Bookmark();
239 $this->privateLinkDB->add($bookmark); 239 $this->privateLinkDB->add($bookmark, false);
240 240
241 $bookmark = $this->privateLinkDB->get(43); 241 $bookmark = $this->privateLinkDB->get(43);
242 $this->assertEquals(43, $bookmark->getId()); 242 $this->assertEquals(43, $bookmark->getId());
@@ -249,34 +249,34 @@ class BookmarkFileServiceTest extends TestCase
249 249
250 /** 250 /**
251 * Test add() method while logged out 251 * Test add() method while logged out
252 *
253 * @expectedException \Exception
254 * @expectedExceptionMessage You're not authorized to alter the datastore
255 */ 252 */
256 public function testAddLoggedOut() 253 public function testAddLoggedOut()
257 { 254 {
255 $this->expectException(\Exception::class);
256 $this->expectExceptionMessage('You\'re not authorized to alter the datastore');
257
258 $this->publicLinkDB->add(new Bookmark()); 258 $this->publicLinkDB->add(new Bookmark());
259 } 259 }
260 260
261 /** 261 /**
262 * Test add() method with an entry which is not a bookmark instance 262 * Test add() method with an entry which is not a bookmark instance
263 *
264 * @expectedException \Exception
265 * @expectedExceptionMessage Provided data is invalid
266 */ 263 */
267 public function testAddNotABookmark() 264 public function testAddNotABookmark()
268 { 265 {
266 $this->expectException(\Exception::class);
267 $this->expectExceptionMessage('Provided data is invalid');
268
269 $this->privateLinkDB->add(['title' => 'hi!']); 269 $this->privateLinkDB->add(['title' => 'hi!']);
270 } 270 }
271 271
272 /** 272 /**
273 * Test add() method with a Bookmark already containing an ID 273 * Test add() method with a Bookmark already containing an ID
274 *
275 * @expectedException \Exception
276 * @expectedExceptionMessage This bookmarks already exists
277 */ 274 */
278 public function testAddWithId() 275 public function testAddWithId()
279 { 276 {
277 $this->expectException(\Exception::class);
278 $this->expectExceptionMessage('This bookmarks already exists');
279
280 $bookmark = new Bookmark(); 280 $bookmark = new Bookmark();
281 $bookmark->setId(43); 281 $bookmark->setId(43);
282 $this->privateLinkDB->add($bookmark); 282 $this->privateLinkDB->add($bookmark);
@@ -397,44 +397,44 @@ class BookmarkFileServiceTest extends TestCase
397 397
398 /** 398 /**
399 * Test set() method while logged out 399 * Test set() method while logged out
400 *
401 * @expectedException \Exception
402 * @expectedExceptionMessage You're not authorized to alter the datastore
403 */ 400 */
404 public function testSetLoggedOut() 401 public function testSetLoggedOut()
405 { 402 {
403 $this->expectException(\Exception::class);
404 $this->expectExceptionMessage('You\'re not authorized to alter the datastore');
405
406 $this->publicLinkDB->set(new Bookmark()); 406 $this->publicLinkDB->set(new Bookmark());
407 } 407 }
408 408
409 /** 409 /**
410 * Test set() method with an entry which is not a bookmark instance 410 * Test set() method with an entry which is not a bookmark instance
411 *
412 * @expectedException \Exception
413 * @expectedExceptionMessage Provided data is invalid
414 */ 411 */
415 public function testSetNotABookmark() 412 public function testSetNotABookmark()
416 { 413 {
414 $this->expectException(\Exception::class);
415 $this->expectExceptionMessage('Provided data is invalid');
416
417 $this->privateLinkDB->set(['title' => 'hi!']); 417 $this->privateLinkDB->set(['title' => 'hi!']);
418 } 418 }
419 419
420 /** 420 /**
421 * Test set() method with a Bookmark without an ID defined. 421 * Test set() method with a Bookmark without an ID defined.
422 *
423 * @expectedException Shaarli\Bookmark\Exception\BookmarkNotFoundException
424 */ 422 */
425 public function testSetWithoutId() 423 public function testSetWithoutId()
426 { 424 {
425 $this->expectException(\Shaarli\Bookmark\Exception\BookmarkNotFoundException::class);
426
427 $bookmark = new Bookmark(); 427 $bookmark = new Bookmark();
428 $this->privateLinkDB->set($bookmark); 428 $this->privateLinkDB->set($bookmark);
429 } 429 }
430 430
431 /** 431 /**
432 * Test set() method with a Bookmark with an unknow ID 432 * Test set() method with a Bookmark with an unknow ID
433 *
434 * @expectedException Shaarli\Bookmark\Exception\BookmarkNotFoundException
435 */ 433 */
436 public function testSetWithUnknownId() 434 public function testSetWithUnknownId()
437 { 435 {
436 $this->expectException(\Shaarli\Bookmark\Exception\BookmarkNotFoundException::class);
437
438 $bookmark = new Bookmark(); 438 $bookmark = new Bookmark();
439 $bookmark->setId(666); 439 $bookmark->setId(666);
440 $this->privateLinkDB->set($bookmark); 440 $this->privateLinkDB->set($bookmark);
@@ -481,23 +481,23 @@ class BookmarkFileServiceTest extends TestCase
481 481
482 /** 482 /**
483 * Test addOrSet() method while logged out 483 * Test addOrSet() method while logged out
484 *
485 * @expectedException \Exception
486 * @expectedExceptionMessage You're not authorized to alter the datastore
487 */ 484 */
488 public function testAddOrSetLoggedOut() 485 public function testAddOrSetLoggedOut()
489 { 486 {
487 $this->expectException(\Exception::class);
488 $this->expectExceptionMessage('You\'re not authorized to alter the datastore');
489
490 $this->publicLinkDB->addOrSet(new Bookmark()); 490 $this->publicLinkDB->addOrSet(new Bookmark());
491 } 491 }
492 492
493 /** 493 /**
494 * Test addOrSet() method with an entry which is not a bookmark instance 494 * Test addOrSet() method with an entry which is not a bookmark instance
495 *
496 * @expectedException \Exception
497 * @expectedExceptionMessage Provided data is invalid
498 */ 495 */
499 public function testAddOrSetNotABookmark() 496 public function testAddOrSetNotABookmark()
500 { 497 {
498 $this->expectException(\Exception::class);
499 $this->expectExceptionMessage('Provided data is invalid');
500
501 $this->privateLinkDB->addOrSet(['title' => 'hi!']); 501 $this->privateLinkDB->addOrSet(['title' => 'hi!']);
502 } 502 }
503 503
@@ -524,11 +524,11 @@ class BookmarkFileServiceTest extends TestCase
524 524
525 /** 525 /**
526 * Test remove() method with an existing Bookmark 526 * Test remove() method with an existing Bookmark
527 *
528 * @expectedException Shaarli\Bookmark\Exception\BookmarkNotFoundException
529 */ 527 */
530 public function testRemoveExisting() 528 public function testRemoveExisting()
531 { 529 {
530 $this->expectException(\Shaarli\Bookmark\Exception\BookmarkNotFoundException::class);
531
532 $bookmark = $this->privateLinkDB->get(42); 532 $bookmark = $this->privateLinkDB->get(42);
533 $this->privateLinkDB->remove($bookmark); 533 $this->privateLinkDB->remove($bookmark);
534 534
@@ -548,34 +548,34 @@ class BookmarkFileServiceTest extends TestCase
548 548
549 /** 549 /**
550 * Test remove() method while logged out 550 * Test remove() method while logged out
551 *
552 * @expectedException \Exception
553 * @expectedExceptionMessage You're not authorized to alter the datastore
554 */ 551 */
555 public function testRemoveLoggedOut() 552 public function testRemoveLoggedOut()
556 { 553 {
554 $this->expectException(\Exception::class);
555 $this->expectExceptionMessage('You\'re not authorized to alter the datastore');
556
557 $bookmark = $this->privateLinkDB->get(42); 557 $bookmark = $this->privateLinkDB->get(42);
558 $this->publicLinkDB->remove($bookmark); 558 $this->publicLinkDB->remove($bookmark);
559 } 559 }
560 560
561 /** 561 /**
562 * Test remove() method with an entry which is not a bookmark instance 562 * Test remove() method with an entry which is not a bookmark instance
563 *
564 * @expectedException \Exception
565 * @expectedExceptionMessage Provided data is invalid
566 */ 563 */
567 public function testRemoveNotABookmark() 564 public function testRemoveNotABookmark()
568 { 565 {
566 $this->expectException(\Exception::class);
567 $this->expectExceptionMessage('Provided data is invalid');
568
569 $this->privateLinkDB->remove(['title' => 'hi!']); 569 $this->privateLinkDB->remove(['title' => 'hi!']);
570 } 570 }
571 571
572 /** 572 /**
573 * Test remove() method with a Bookmark with an unknown ID 573 * Test remove() method with a Bookmark with an unknown ID
574 *
575 * @expectedException Shaarli\Bookmark\Exception\BookmarkNotFoundException
576 */ 574 */
577 public function testRemoveWithUnknownId() 575 public function testRemoveWithUnknownId()
578 { 576 {
577 $this->expectException(\Shaarli\Bookmark\Exception\BookmarkNotFoundException::class);
578
579 $bookmark = new Bookmark(); 579 $bookmark = new Bookmark();
580 $bookmark->setId(666); 580 $bookmark->setId(666);
581 $this->privateLinkDB->remove($bookmark); 581 $this->privateLinkDB->remove($bookmark);
@@ -615,14 +615,18 @@ class BookmarkFileServiceTest extends TestCase
615 { 615 {
616 $dbSize = $this->privateLinkDB->count(); 616 $dbSize = $this->privateLinkDB->count();
617 $this->privateLinkDB->initialize(); 617 $this->privateLinkDB->initialize();
618 $this->assertEquals($dbSize + 2, $this->privateLinkDB->count()); 618 $this->assertEquals($dbSize + 3, $this->privateLinkDB->count());
619 $this->assertEquals( 619 $this->assertStringStartsWith(
620 'My secret stuff... - Pastebin.com', 620 'Shaarli will automatically pick up the thumbnail for links to a variety of websites.',
621 $this->privateLinkDB->get(43)->getTitle() 621 $this->privateLinkDB->get(43)->getDescription()
622 ); 622 );
623 $this->assertEquals( 623 $this->assertStringStartsWith(
624 'The personal, minimalist, super-fast, database free, bookmarking service', 624 'Adding a shaare without entering a URL creates a text-only "note" post such as this one.',
625 $this->privateLinkDB->get(44)->getTitle() 625 $this->privateLinkDB->get(44)->getDescription()
626 );
627 $this->assertStringStartsWith(
628 'Welcome to Shaarli!',
629 $this->privateLinkDB->get(45)->getDescription()
626 ); 630 );
627 } 631 }
628 632
@@ -631,15 +635,14 @@ class BookmarkFileServiceTest extends TestCase
631 * to make sure that nothing have been broken in the migration process. 635 * to make sure that nothing have been broken in the migration process.
632 * They mostly cover search/filters. Some of them might be redundant with the previous ones. 636 * They mostly cover search/filters. Some of them might be redundant with the previous ones.
633 */ 637 */
634
635 /** 638 /**
636 * Attempt to instantiate a LinkDB whereas the datastore is not writable 639 * Attempt to instantiate a LinkDB whereas the datastore is not writable
637 *
638 * @expectedException Shaarli\Bookmark\Exception\NotWritableDataStoreException
639 * @expectedExceptionMessageRegExp #Couldn't load data from the data store file "null".*#
640 */ 640 */
641 public function testConstructDatastoreNotWriteable() 641 public function testConstructDatastoreNotWriteable()
642 { 642 {
643 $this->expectException(\Shaarli\Bookmark\Exception\NotWritableDataStoreException::class);
644 $this->expectExceptionMessageRegExp('#Couldn\'t load data from the data store file "null".*#');
645
643 $conf = new ConfigManager('tests/utils/config/configJson'); 646 $conf = new ConfigManager('tests/utils/config/configJson');
644 $conf->set('resource.datastore', 'null/store.db'); 647 $conf->set('resource.datastore', 'null/store.db');
645 new BookmarkFileService($conf, $this->history, true); 648 new BookmarkFileService($conf, $this->history, true);
@@ -744,7 +747,7 @@ class BookmarkFileServiceTest extends TestCase
744 $link = $this->publicLinkDB->findByUrl('http://mediagoblin.org/'); 747 $link = $this->publicLinkDB->findByUrl('http://mediagoblin.org/');
745 748
746 $this->assertNotEquals(false, $link); 749 $this->assertNotEquals(false, $link);
747 $this->assertContains( 750 $this->assertContainsPolyfill(
748 'A free software media publishing platform', 751 'A free software media publishing platform',
749 $link->getDescription() 752 $link->getDescription()
750 ); 753 );
@@ -1062,6 +1065,36 @@ class BookmarkFileServiceTest extends TestCase
1062 } 1065 }
1063 1066
1064 /** 1067 /**
1068 * Test filterDay while logged in
1069 */
1070 public function testFilterDayLoggedIn(): void
1071 {
1072 $bookmarks = $this->privateLinkDB->filterDay('20121206');
1073 $expectedIds = [4, 9, 1, 0];
1074
1075 static::assertCount(4, $bookmarks);
1076 foreach ($bookmarks as $bookmark) {
1077 $i = ($i ?? -1) + 1;
1078 static::assertSame($expectedIds[$i], $bookmark->getId());
1079 }
1080 }
1081
1082 /**
1083 * Test filterDay while logged out
1084 */
1085 public function testFilterDayLoggedOut(): void
1086 {
1087 $bookmarks = $this->publicLinkDB->filterDay('20121206');
1088 $expectedIds = [4, 9, 1];
1089
1090 static::assertCount(3, $bookmarks);
1091 foreach ($bookmarks as $bookmark) {
1092 $i = ($i ?? -1) + 1;
1093 static::assertSame($expectedIds[$i], $bookmark->getId());
1094 }
1095 }
1096
1097 /**
1065 * Allows to test LinkDB's private methods 1098 * Allows to test LinkDB's private methods
1066 * 1099 *
1067 * @see 1100 * @see
diff --git a/tests/bookmark/BookmarkFilterTest.php b/tests/bookmark/BookmarkFilterTest.php
index d4c71cb9..48c7f824 100644
--- a/tests/bookmark/BookmarkFilterTest.php
+++ b/tests/bookmark/BookmarkFilterTest.php
@@ -3,11 +3,10 @@
3namespace Shaarli\Bookmark; 3namespace Shaarli\Bookmark;
4 4
5use Exception; 5use Exception;
6use PHPUnit\Framework\TestCase;
7use ReferenceLinkDB; 6use ReferenceLinkDB;
8use Shaarli\Config\ConfigManager; 7use Shaarli\Config\ConfigManager;
9use Shaarli\Formatter\FormatterFactory;
10use Shaarli\History; 8use Shaarli\History;
9use Shaarli\TestCase;
11 10
12/** 11/**
13 * Class BookmarkFilterTest. 12 * Class BookmarkFilterTest.
@@ -36,7 +35,7 @@ class BookmarkFilterTest extends TestCase
36 /** 35 /**
37 * Instantiate linkFilter with ReferenceLinkDB data. 36 * Instantiate linkFilter with ReferenceLinkDB data.
38 */ 37 */
39 public static function setUpBeforeClass() 38 public static function setUpBeforeClass(): void
40 { 39 {
41 $conf = new ConfigManager('tests/utils/config/configJson'); 40 $conf = new ConfigManager('tests/utils/config/configJson');
42 $conf->set('resource.datastore', self::$testDatastore); 41 $conf->set('resource.datastore', self::$testDatastore);
@@ -190,6 +189,17 @@ class BookmarkFilterTest extends TestCase
190 } 189 }
191 190
192 /** 191 /**
192 * Return bookmarks for a given day
193 */
194 public function testFilterDayRestrictedVisibility(): void
195 {
196 $this->assertEquals(
197 3,
198 count(self::$linkFilter->filter(BookmarkFilter::$FILTER_DAY, '20121206', false, BookmarkFilter::$PUBLIC))
199 );
200 }
201
202 /**
193 * 404 - day not found 203 * 404 - day not found
194 */ 204 */
195 public function testFilterUnknownDay() 205 public function testFilterUnknownDay()
@@ -202,21 +212,23 @@ class BookmarkFilterTest extends TestCase
202 212
203 /** 213 /**
204 * Use an invalid date format 214 * Use an invalid date format
205 * @expectedException Exception
206 * @expectedExceptionMessageRegExp /Invalid date format/
207 */ 215 */
208 public function testFilterInvalidDayWithChars() 216 public function testFilterInvalidDayWithChars()
209 { 217 {
218 $this->expectException(\Exception::class);
219 $this->expectExceptionMessageRegExp('/Invalid date format/');
220
210 self::$linkFilter->filter(BookmarkFilter::$FILTER_DAY, 'Rainy day, dream away'); 221 self::$linkFilter->filter(BookmarkFilter::$FILTER_DAY, 'Rainy day, dream away');
211 } 222 }
212 223
213 /** 224 /**
214 * Use an invalid date format 225 * Use an invalid date format
215 * @expectedException Exception
216 * @expectedExceptionMessageRegExp /Invalid date format/
217 */ 226 */
218 public function testFilterInvalidDayDigits() 227 public function testFilterInvalidDayDigits()
219 { 228 {
229 $this->expectException(\Exception::class);
230 $this->expectExceptionMessageRegExp('/Invalid date format/');
231
220 self::$linkFilter->filter(BookmarkFilter::$FILTER_DAY, '20'); 232 self::$linkFilter->filter(BookmarkFilter::$FILTER_DAY, '20');
221 } 233 }
222 234
@@ -240,11 +252,11 @@ class BookmarkFilterTest extends TestCase
240 252
241 /** 253 /**
242 * No link for this hash 254 * No link for this hash
243 *
244 * @expectedException \Shaarli\Bookmark\Exception\BookmarkNotFoundException
245 */ 255 */
246 public function testFilterUnknownSmallHash() 256 public function testFilterUnknownSmallHash()
247 { 257 {
258 $this->expectException(\Shaarli\Bookmark\Exception\BookmarkNotFoundException::class);
259
248 self::$linkFilter->filter(BookmarkFilter::$FILTER_HASH, 'Iblaah'); 260 self::$linkFilter->filter(BookmarkFilter::$FILTER_HASH, 'Iblaah');
249 } 261 }
250 262
diff --git a/tests/bookmark/BookmarkInitializerTest.php b/tests/bookmark/BookmarkInitializerTest.php
index 3906cc7f..25704004 100644
--- a/tests/bookmark/BookmarkInitializerTest.php
+++ b/tests/bookmark/BookmarkInitializerTest.php
@@ -2,9 +2,9 @@
2 2
3namespace Shaarli\Bookmark; 3namespace Shaarli\Bookmark;
4 4
5use PHPUnit\Framework\TestCase;
6use Shaarli\Config\ConfigManager; 5use Shaarli\Config\ConfigManager;
7use Shaarli\History; 6use Shaarli\History;
7use Shaarli\TestCase;
8 8
9/** 9/**
10 * Class BookmarkInitializerTest 10 * Class BookmarkInitializerTest
@@ -37,7 +37,7 @@ class BookmarkInitializerTest extends TestCase
37 /** 37 /**
38 * Initialize an empty BookmarkFileService 38 * Initialize an empty BookmarkFileService
39 */ 39 */
40 public function setUp() 40 public function setUp(): void
41 { 41 {
42 if (file_exists(self::$testDatastore)) { 42 if (file_exists(self::$testDatastore)) {
43 unlink(self::$testDatastore); 43 unlink(self::$testDatastore);
@@ -64,17 +64,26 @@ class BookmarkInitializerTest extends TestCase
64 64
65 $this->initializer->initialize(); 65 $this->initializer->initialize();
66 66
67 $this->assertEquals($refDB->countLinks() + 2, $this->bookmarkService->count()); 67 $this->assertEquals($refDB->countLinks() + 3, $this->bookmarkService->count());
68
68 $bookmark = $this->bookmarkService->get(43); 69 $bookmark = $this->bookmarkService->get(43);
69 $this->assertEquals(43, $bookmark->getId()); 70 $this->assertStringStartsWith(
70 $this->assertEquals('My secret stuff... - Pastebin.com', $bookmark->getTitle()); 71 'Shaarli will automatically pick up the thumbnail for links to a variety of websites.',
72 $bookmark->getDescription()
73 );
71 $this->assertTrue($bookmark->isPrivate()); 74 $this->assertTrue($bookmark->isPrivate());
72 75
73 $bookmark = $this->bookmarkService->get(44); 76 $bookmark = $this->bookmarkService->get(44);
74 $this->assertEquals(44, $bookmark->getId()); 77 $this->assertStringStartsWith(
75 $this->assertEquals( 78 'Adding a shaare without entering a URL creates a text-only "note" post such as this one.',
76 'The personal, minimalist, super-fast, database free, bookmarking service', 79 $bookmark->getDescription()
77 $bookmark->getTitle() 80 );
81 $this->assertTrue($bookmark->isPrivate());
82
83 $bookmark = $this->bookmarkService->get(45);
84 $this->assertStringStartsWith(
85 'Welcome to Shaarli!',
86 $bookmark->getDescription()
78 ); 87 );
79 $this->assertFalse($bookmark->isPrivate()); 88 $this->assertFalse($bookmark->isPrivate());
80 89
@@ -82,17 +91,26 @@ class BookmarkInitializerTest extends TestCase
82 91
83 // Reload from file 92 // Reload from file
84 $this->bookmarkService = new BookmarkFileService($this->conf, $this->history, true); 93 $this->bookmarkService = new BookmarkFileService($this->conf, $this->history, true);
85 $this->assertEquals($refDB->countLinks() + 2, $this->bookmarkService->count()); 94 $this->assertEquals($refDB->countLinks() + 3, $this->bookmarkService->count());
95
86 $bookmark = $this->bookmarkService->get(43); 96 $bookmark = $this->bookmarkService->get(43);
87 $this->assertEquals(43, $bookmark->getId()); 97 $this->assertStringStartsWith(
88 $this->assertEquals('My secret stuff... - Pastebin.com', $bookmark->getTitle()); 98 'Shaarli will automatically pick up the thumbnail for links to a variety of websites.',
99 $bookmark->getDescription()
100 );
89 $this->assertTrue($bookmark->isPrivate()); 101 $this->assertTrue($bookmark->isPrivate());
90 102
91 $bookmark = $this->bookmarkService->get(44); 103 $bookmark = $this->bookmarkService->get(44);
92 $this->assertEquals(44, $bookmark->getId()); 104 $this->assertStringStartsWith(
93 $this->assertEquals( 105 'Adding a shaare without entering a URL creates a text-only "note" post such as this one.',
94 'The personal, minimalist, super-fast, database free, bookmarking service', 106 $bookmark->getDescription()
95 $bookmark->getTitle() 107 );
108 $this->assertTrue($bookmark->isPrivate());
109
110 $bookmark = $this->bookmarkService->get(45);
111 $this->assertStringStartsWith(
112 'Welcome to Shaarli!',
113 $bookmark->getDescription()
96 ); 114 );
97 $this->assertFalse($bookmark->isPrivate()); 115 $this->assertFalse($bookmark->isPrivate());
98 } 116 }
@@ -107,17 +125,25 @@ class BookmarkInitializerTest extends TestCase
107 125
108 $this->initializer->initialize(); 126 $this->initializer->initialize();
109 127
110 $this->assertEquals(2, $this->bookmarkService->count()); 128 $this->assertEquals(3, $this->bookmarkService->count());
111 $bookmark = $this->bookmarkService->get(0); 129 $bookmark = $this->bookmarkService->get(0);
112 $this->assertEquals(0, $bookmark->getId()); 130 $this->assertStringStartsWith(
113 $this->assertEquals('My secret stuff... - Pastebin.com', $bookmark->getTitle()); 131 'Shaarli will automatically pick up the thumbnail for links to a variety of websites.',
132 $bookmark->getDescription()
133 );
114 $this->assertTrue($bookmark->isPrivate()); 134 $this->assertTrue($bookmark->isPrivate());
115 135
116 $bookmark = $this->bookmarkService->get(1); 136 $bookmark = $this->bookmarkService->get(1);
117 $this->assertEquals(1, $bookmark->getId()); 137 $this->assertStringStartsWith(
118 $this->assertEquals( 138 'Adding a shaare without entering a URL creates a text-only "note" post such as this one.',
119 'The personal, minimalist, super-fast, database free, bookmarking service', 139 $bookmark->getDescription()
120 $bookmark->getTitle() 140 );
141 $this->assertTrue($bookmark->isPrivate());
142
143 $bookmark = $this->bookmarkService->get(2);
144 $this->assertStringStartsWith(
145 'Welcome to Shaarli!',
146 $bookmark->getDescription()
121 ); 147 );
122 $this->assertFalse($bookmark->isPrivate()); 148 $this->assertFalse($bookmark->isPrivate());
123 } 149 }
diff --git a/tests/bookmark/BookmarkTest.php b/tests/bookmark/BookmarkTest.php
index 4b6a3c07..afec2440 100644
--- a/tests/bookmark/BookmarkTest.php
+++ b/tests/bookmark/BookmarkTest.php
@@ -2,8 +2,8 @@
2 2
3namespace Shaarli\Bookmark; 3namespace Shaarli\Bookmark;
4 4
5use PHPUnit\Framework\TestCase;
6use Shaarli\Bookmark\Exception\InvalidBookmarkException; 5use Shaarli\Bookmark\Exception\InvalidBookmarkException;
6use Shaarli\TestCase;
7 7
8/** 8/**
9 * Class BookmarkTest 9 * Class BookmarkTest
@@ -150,7 +150,7 @@ class BookmarkTest extends TestCase
150 $exception = $e; 150 $exception = $e;
151 } 151 }
152 $this->assertNotNull($exception); 152 $this->assertNotNull($exception);
153 $this->assertContains('- ID: '. PHP_EOL, $exception->getMessage()); 153 $this->assertContainsPolyfill('- ID: '. PHP_EOL, $exception->getMessage());
154 } 154 }
155 155
156 /** 156 /**
@@ -169,7 +169,7 @@ class BookmarkTest extends TestCase
169 $exception = $e; 169 $exception = $e;
170 } 170 }
171 $this->assertNotNull($exception); 171 $this->assertNotNull($exception);
172 $this->assertContains('- ID: str'. PHP_EOL, $exception->getMessage()); 172 $this->assertContainsPolyfill('- ID: str'. PHP_EOL, $exception->getMessage());
173 } 173 }
174 174
175 /** 175 /**
@@ -188,7 +188,7 @@ class BookmarkTest extends TestCase
188 $exception = $e; 188 $exception = $e;
189 } 189 }
190 $this->assertNotNull($exception); 190 $this->assertNotNull($exception);
191 $this->assertContains('- ShortUrl: '. PHP_EOL, $exception->getMessage()); 191 $this->assertContainsPolyfill('- ShortUrl: '. PHP_EOL, $exception->getMessage());
192 } 192 }
193 193
194 /** 194 /**
@@ -207,7 +207,7 @@ class BookmarkTest extends TestCase
207 $exception = $e; 207 $exception = $e;
208 } 208 }
209 $this->assertNotNull($exception); 209 $this->assertNotNull($exception);
210 $this->assertContains('- Created: '. PHP_EOL, $exception->getMessage()); 210 $this->assertContainsPolyfill('- Created: '. PHP_EOL, $exception->getMessage());
211 } 211 }
212 212
213 /** 213 /**
@@ -226,7 +226,7 @@ class BookmarkTest extends TestCase
226 $exception = $e; 226 $exception = $e;
227 } 227 }
228 $this->assertNotNull($exception); 228 $this->assertNotNull($exception);
229 $this->assertContains('- Created: Not a DateTime object'. PHP_EOL, $exception->getMessage()); 229 $this->assertContainsPolyfill('- Created: Not a DateTime object'. PHP_EOL, $exception->getMessage());
230 } 230 }
231 231
232 /** 232 /**
diff --git a/tests/bookmark/LinkUtilsTest.php b/tests/bookmark/LinkUtilsTest.php
index 7d4a7b89..ef00b92f 100644
--- a/tests/bookmark/LinkUtilsTest.php
+++ b/tests/bookmark/LinkUtilsTest.php
@@ -2,7 +2,7 @@
2 2
3namespace Shaarli\Bookmark; 3namespace Shaarli\Bookmark;
4 4
5use PHPUnit\Framework\TestCase; 5use Shaarli\TestCase;
6 6
7require_once 'tests/utils/CurlUtils.php'; 7require_once 'tests/utils/CurlUtils.php';
8 8
@@ -43,6 +43,19 @@ class LinkUtilsTest extends TestCase
43 } 43 }
44 44
45 /** 45 /**
46 * Test headers_extract_charset() when the charset is found with odd quotes.
47 */
48 public function testHeadersExtractExistentCharsetWithQuotes()
49 {
50 $charset = 'x-MacCroatian';
51 $headers = 'text/html; charset="' . $charset . '"otherstuff="test"';
52 $this->assertEquals(strtolower($charset), header_extract_charset($headers));
53
54 $headers = 'text/html; charset=\'' . $charset . '\'otherstuff="test"';
55 $this->assertEquals(strtolower($charset), header_extract_charset($headers));
56 }
57
58 /**
46 * Test headers_extract_charset() when the charset is not found. 59 * Test headers_extract_charset() when the charset is not found.
47 */ 60 */
48 public function testHeadersExtractNonExistentCharset() 61 public function testHeadersExtractNonExistentCharset()
@@ -437,13 +450,13 @@ class LinkUtilsTest extends TestCase
437 カタカナ #カタカナ」カタカナ\n'; 450 カタカナ #カタカナ」カタカナ\n';
438 $autolinkedDescription = hashtag_autolink($rawDescription, $index); 451 $autolinkedDescription = hashtag_autolink($rawDescription, $index);
439 452
440 $this->assertContains($this->getHashtagLink('hashtag', $index), $autolinkedDescription); 453 $this->assertContainsPolyfill($this->getHashtagLink('hashtag', $index), $autolinkedDescription);
441 $this->assertNotContains(' #hashtag', $autolinkedDescription); 454 $this->assertNotContainsPolyfill(' #hashtag', $autolinkedDescription);
442 $this->assertNotContains('>#nothashtag', $autolinkedDescription); 455 $this->assertNotContainsPolyfill('>#nothashtag', $autolinkedDescription);
443 $this->assertContains($this->getHashtagLink('ашок', $index), $autolinkedDescription); 456 $this->assertContainsPolyfill($this->getHashtagLink('ашок', $index), $autolinkedDescription);
444 $this->assertContains($this->getHashtagLink('カタカナ', $index), $autolinkedDescription); 457 $this->assertContainsPolyfill($this->getHashtagLink('カタカナ', $index), $autolinkedDescription);
445 $this->assertContains($this->getHashtagLink('hashtag_hashtag', $index), $autolinkedDescription); 458 $this->assertContainsPolyfill($this->getHashtagLink('hashtag_hashtag', $index), $autolinkedDescription);
446 $this->assertNotContains($this->getHashtagLink('hashtag-nothashtag', $index), $autolinkedDescription); 459 $this->assertNotContainsPolyfill($this->getHashtagLink('hashtag-nothashtag', $index), $autolinkedDescription);
447 } 460 }
448 461
449 /** 462 /**
@@ -454,9 +467,9 @@ class LinkUtilsTest extends TestCase
454 $rawDescription = 'blabla #hashtag x#nothashtag'; 467 $rawDescription = 'blabla #hashtag x#nothashtag';
455 $autolinkedDescription = hashtag_autolink($rawDescription); 468 $autolinkedDescription = hashtag_autolink($rawDescription);
456 469
457 $this->assertContains($this->getHashtagLink('hashtag'), $autolinkedDescription); 470 $this->assertContainsPolyfill($this->getHashtagLink('hashtag'), $autolinkedDescription);
458 $this->assertNotContains(' #hashtag', $autolinkedDescription); 471 $this->assertNotContainsPolyfill(' #hashtag', $autolinkedDescription);
459 $this->assertNotContains('>#nothashtag', $autolinkedDescription); 472 $this->assertNotContainsPolyfill('>#nothashtag', $autolinkedDescription);
460 } 473 }
461 474
462 /** 475 /**
diff --git a/tests/bootstrap.php b/tests/bootstrap.php
index d4ddedd5..2d675c9a 100644
--- a/tests/bootstrap.php
+++ b/tests/bootstrap.php
@@ -18,6 +18,7 @@ require_once 'application/bookmark/LinkUtils.php';
18require_once 'application/Utils.php'; 18require_once 'application/Utils.php';
19require_once 'application/http/UrlUtils.php'; 19require_once 'application/http/UrlUtils.php';
20require_once 'application/http/HttpUtils.php'; 20require_once 'application/http/HttpUtils.php';
21require_once 'tests/TestCase.php';
21require_once 'tests/container/ShaarliTestContainer.php'; 22require_once 'tests/container/ShaarliTestContainer.php';
22require_once 'tests/front/controller/visitor/FrontControllerMockHelper.php'; 23require_once 'tests/front/controller/visitor/FrontControllerMockHelper.php';
23require_once 'tests/front/controller/admin/FrontAdminControllerMockHelper.php'; 24require_once 'tests/front/controller/admin/FrontAdminControllerMockHelper.php';
diff --git a/tests/config/ConfigJsonTest.php b/tests/config/ConfigJsonTest.php
index 33160eb0..c0ba5b8f 100644
--- a/tests/config/ConfigJsonTest.php
+++ b/tests/config/ConfigJsonTest.php
@@ -4,14 +4,14 @@ namespace Shaarli\Config;
4/** 4/**
5 * Class ConfigJsonTest 5 * Class ConfigJsonTest
6 */ 6 */
7class ConfigJsonTest extends \PHPUnit\Framework\TestCase 7class ConfigJsonTest extends \Shaarli\TestCase
8{ 8{
9 /** 9 /**
10 * @var ConfigJson 10 * @var ConfigJson
11 */ 11 */
12 protected $configIO; 12 protected $configIO;
13 13
14 public function setUp() 14 protected function setUp(): void
15 { 15 {
16 $this->configIO = new ConfigJson(); 16 $this->configIO = new ConfigJson();
17 } 17 }
@@ -38,12 +38,12 @@ class ConfigJsonTest extends \PHPUnit\Framework\TestCase
38 38
39 /** 39 /**
40 * Read a non existent config file -> empty array. 40 * Read a non existent config file -> empty array.
41 *
42 * @expectedException \Exception
43 * @expectedExceptionMessageRegExp /An error occurred while parsing JSON configuration file \([\w\/\.]+\): error code #4/
44 */ 41 */
45 public function testReadInvalidJson() 42 public function testReadInvalidJson()
46 { 43 {
44 $this->expectException(\Exception::class);
45 $this->expectExceptionMessageRegExp('/An error occurred while parsing JSON configuration file \\([\\w\\/\\.]+\\): error code #4/');
46
47 $this->configIO->read('tests/utils/config/configInvalid.json.php'); 47 $this->configIO->read('tests/utils/config/configInvalid.json.php');
48 } 48 }
49 49
@@ -110,22 +110,11 @@ class ConfigJsonTest extends \PHPUnit\Framework\TestCase
110 110
111 /** 111 /**
112 * Write to invalid path. 112 * Write to invalid path.
113 *
114 * @expectedException \Shaarli\Exceptions\IOException
115 */
116 public function testWriteInvalidArray()
117 {
118 $conf = array('conf' => 'value');
119 @$this->configIO->write(array(), $conf);
120 }
121
122 /**
123 * Write to invalid path.
124 *
125 * @expectedException \Shaarli\Exceptions\IOException
126 */ 113 */
127 public function testWriteInvalidBlank() 114 public function testWriteInvalidBlank()
128 { 115 {
116 $this->expectException(\Shaarli\Exceptions\IOException::class);
117
129 $conf = array('conf' => 'value'); 118 $conf = array('conf' => 'value');
130 @$this->configIO->write('', $conf); 119 @$this->configIO->write('', $conf);
131 } 120 }
diff --git a/tests/config/ConfigManagerTest.php b/tests/config/ConfigManagerTest.php
index 33830bc9..65d8ba2c 100644
--- a/tests/config/ConfigManagerTest.php
+++ b/tests/config/ConfigManagerTest.php
@@ -7,14 +7,14 @@ namespace Shaarli\Config;
7 * Note: it only test the manager with ConfigJson, 7 * Note: it only test the manager with ConfigJson,
8 * ConfigPhp is only a workaround to handle the transition to JSON type. 8 * ConfigPhp is only a workaround to handle the transition to JSON type.
9 */ 9 */
10class ConfigManagerTest extends \PHPUnit\Framework\TestCase 10class ConfigManagerTest extends \Shaarli\TestCase
11{ 11{
12 /** 12 /**
13 * @var ConfigManager 13 * @var ConfigManager
14 */ 14 */
15 protected $conf; 15 protected $conf;
16 16
17 public function setUp() 17 protected function setUp(): void
18 { 18 {
19 $this->conf = new ConfigManager('tests/utils/config/configJson'); 19 $this->conf = new ConfigManager('tests/utils/config/configJson');
20 } 20 }
@@ -95,44 +95,44 @@ class ConfigManagerTest extends \PHPUnit\Framework\TestCase
95 95
96 /** 96 /**
97 * Set with an empty key. 97 * Set with an empty key.
98 *
99 * @expectedException \Exception
100 * @expectedExceptionMessageRegExp #^Invalid setting key parameter. String expected, got.*#
101 */ 98 */
102 public function testSetEmptyKey() 99 public function testSetEmptyKey()
103 { 100 {
101 $this->expectException(\Exception::class);
102 $this->expectExceptionMessageRegExp('#^Invalid setting key parameter. String expected, got.*#');
103
104 $this->conf->set('', 'stuff'); 104 $this->conf->set('', 'stuff');
105 } 105 }
106 106
107 /** 107 /**
108 * Set with an array key. 108 * Set with an array key.
109 *
110 * @expectedException \Exception
111 * @expectedExceptionMessageRegExp #^Invalid setting key parameter. String expected, got.*#
112 */ 109 */
113 public function testSetArrayKey() 110 public function testSetArrayKey()
114 { 111 {
112 $this->expectException(\Exception::class);
113 $this->expectExceptionMessageRegExp('#^Invalid setting key parameter. String expected, got.*#');
114
115 $this->conf->set(array('foo' => 'bar'), 'stuff'); 115 $this->conf->set(array('foo' => 'bar'), 'stuff');
116 } 116 }
117 117
118 /** 118 /**
119 * Remove with an empty key. 119 * Remove with an empty key.
120 *
121 * @expectedException \Exception
122 * @expectedExceptionMessageRegExp #^Invalid setting key parameter. String expected, got.*#
123 */ 120 */
124 public function testRmoveEmptyKey() 121 public function testRmoveEmptyKey()
125 { 122 {
123 $this->expectException(\Exception::class);
124 $this->expectExceptionMessageRegExp('#^Invalid setting key parameter. String expected, got.*#');
125
126 $this->conf->remove(''); 126 $this->conf->remove('');
127 } 127 }
128 128
129 /** 129 /**
130 * Try to write the config without mandatory parameter (e.g. 'login'). 130 * Try to write the config without mandatory parameter (e.g. 'login').
131 *
132 * @expectedException Shaarli\Config\Exception\MissingFieldConfigException
133 */ 131 */
134 public function testWriteMissingParameter() 132 public function testWriteMissingParameter()
135 { 133 {
134 $this->expectException(\Shaarli\Config\Exception\MissingFieldConfigException::class);
135
136 $this->conf->setConfigFile('tests/utils/config/configTmp'); 136 $this->conf->setConfigFile('tests/utils/config/configTmp');
137 $this->assertFalse(file_exists($this->conf->getConfigFileExt())); 137 $this->assertFalse(file_exists($this->conf->getConfigFileExt()));
138 $this->conf->reload(); 138 $this->conf->reload();
diff --git a/tests/config/ConfigPhpTest.php b/tests/config/ConfigPhpTest.php
index fb91b51b..7bf9fe64 100644
--- a/tests/config/ConfigPhpTest.php
+++ b/tests/config/ConfigPhpTest.php
@@ -8,14 +8,14 @@ namespace Shaarli\Config;
8 * which are kept between tests. 8 * which are kept between tests.
9 * @runTestsInSeparateProcesses 9 * @runTestsInSeparateProcesses
10 */ 10 */
11class ConfigPhpTest extends \PHPUnit\Framework\TestCase 11class ConfigPhpTest extends \Shaarli\TestCase
12{ 12{
13 /** 13 /**
14 * @var ConfigPhp 14 * @var ConfigPhp
15 */ 15 */
16 protected $configIO; 16 protected $configIO;
17 17
18 public function setUp() 18 protected function setUp(): void
19 { 19 {
20 $this->configIO = new ConfigPhp(); 20 $this->configIO = new ConfigPhp();
21 } 21 }
diff --git a/tests/config/ConfigPluginTest.php b/tests/config/ConfigPluginTest.php
index b2cc0045..fa72d8c4 100644
--- a/tests/config/ConfigPluginTest.php
+++ b/tests/config/ConfigPluginTest.php
@@ -9,7 +9,7 @@ require_once 'application/config/ConfigPlugin.php';
9/** 9/**
10 * Unitary tests for Shaarli config related functions 10 * Unitary tests for Shaarli config related functions
11 */ 11 */
12class ConfigPluginTest extends \PHPUnit\Framework\TestCase 12class ConfigPluginTest extends \Shaarli\TestCase
13{ 13{
14 /** 14 /**
15 * Test save_plugin_config with valid data. 15 * Test save_plugin_config with valid data.
@@ -46,11 +46,11 @@ class ConfigPluginTest extends \PHPUnit\Framework\TestCase
46 46
47 /** 47 /**
48 * Test save_plugin_config with invalid data. 48 * Test save_plugin_config with invalid data.
49 *
50 * @expectedException Shaarli\Config\Exception\PluginConfigOrderException
51 */ 49 */
52 public function testSavePluginConfigInvalid() 50 public function testSavePluginConfigInvalid()
53 { 51 {
52 $this->expectException(\Shaarli\Config\Exception\PluginConfigOrderException::class);
53
54 $data = array( 54 $data = array(
55 'plugin2' => 0, 55 'plugin2' => 0,
56 'plugin3' => 0, 56 'plugin3' => 0,
diff --git a/tests/container/ContainerBuilderTest.php b/tests/container/ContainerBuilderTest.php
index c08010ae..5d52daef 100644
--- a/tests/container/ContainerBuilderTest.php
+++ b/tests/container/ContainerBuilderTest.php
@@ -4,12 +4,12 @@ declare(strict_types=1);
4 4
5namespace Shaarli\Container; 5namespace Shaarli\Container;
6 6
7use PHPUnit\Framework\TestCase;
8use Shaarli\Bookmark\BookmarkServiceInterface; 7use Shaarli\Bookmark\BookmarkServiceInterface;
9use Shaarli\Config\ConfigManager; 8use Shaarli\Config\ConfigManager;
10use Shaarli\Feed\FeedBuilder; 9use Shaarli\Feed\FeedBuilder;
11use Shaarli\Formatter\FormatterFactory; 10use Shaarli\Formatter\FormatterFactory;
12use Shaarli\Front\Controller\Visitor\ErrorController; 11use Shaarli\Front\Controller\Visitor\ErrorController;
12use Shaarli\Front\Controller\Visitor\ErrorNotFoundController;
13use Shaarli\History; 13use Shaarli\History;
14use Shaarli\Http\HttpAccess; 14use Shaarli\Http\HttpAccess;
15use Shaarli\Netscape\NetscapeBookmarkUtils; 15use Shaarli\Netscape\NetscapeBookmarkUtils;
@@ -19,6 +19,7 @@ use Shaarli\Render\PageCacheManager;
19use Shaarli\Security\CookieManager; 19use Shaarli\Security\CookieManager;
20use Shaarli\Security\LoginManager; 20use Shaarli\Security\LoginManager;
21use Shaarli\Security\SessionManager; 21use Shaarli\Security\SessionManager;
22use Shaarli\TestCase;
22use Shaarli\Thumbnailer; 23use Shaarli\Thumbnailer;
23use Shaarli\Updater\Updater; 24use Shaarli\Updater\Updater;
24use Slim\Http\Environment; 25use Slim\Http\Environment;
@@ -75,6 +76,7 @@ class ContainerBuilderTest extends TestCase
75 static::assertInstanceOf(PageBuilder::class, $container->pageBuilder); 76 static::assertInstanceOf(PageBuilder::class, $container->pageBuilder);
76 static::assertInstanceOf(PageCacheManager::class, $container->pageCacheManager); 77 static::assertInstanceOf(PageCacheManager::class, $container->pageCacheManager);
77 static::assertInstanceOf(ErrorController::class, $container->phpErrorHandler); 78 static::assertInstanceOf(ErrorController::class, $container->phpErrorHandler);
79 static::assertInstanceOf(ErrorNotFoundController::class, $container->notFoundHandler);
78 static::assertInstanceOf(PluginManager::class, $container->pluginManager); 80 static::assertInstanceOf(PluginManager::class, $container->pluginManager);
79 static::assertInstanceOf(SessionManager::class, $container->sessionManager); 81 static::assertInstanceOf(SessionManager::class, $container->sessionManager);
80 static::assertInstanceOf(Thumbnailer::class, $container->thumbnailer); 82 static::assertInstanceOf(Thumbnailer::class, $container->thumbnailer);
diff --git a/tests/feed/CachedPageTest.php b/tests/feed/CachedPageTest.php
index 2e716432..904db9dc 100644
--- a/tests/feed/CachedPageTest.php
+++ b/tests/feed/CachedPageTest.php
@@ -7,7 +7,7 @@ namespace Shaarli\Feed;
7/** 7/**
8 * Unitary tests for cached pages 8 * Unitary tests for cached pages
9 */ 9 */
10class CachedPageTest extends \PHPUnit\Framework\TestCase 10class CachedPageTest extends \Shaarli\TestCase
11{ 11{
12 // test cache directory 12 // test cache directory
13 protected static $testCacheDir = 'sandbox/pagecache'; 13 protected static $testCacheDir = 'sandbox/pagecache';
@@ -17,7 +17,7 @@ class CachedPageTest extends \PHPUnit\Framework\TestCase
17 /** 17 /**
18 * Create the cache directory if needed 18 * Create the cache directory if needed
19 */ 19 */
20 public static function setUpBeforeClass() 20 public static function setUpBeforeClass(): void
21 { 21 {
22 if (!is_dir(self::$testCacheDir)) { 22 if (!is_dir(self::$testCacheDir)) {
23 mkdir(self::$testCacheDir); 23 mkdir(self::$testCacheDir);
@@ -28,7 +28,7 @@ class CachedPageTest extends \PHPUnit\Framework\TestCase
28 /** 28 /**
29 * Reset the page cache 29 * Reset the page cache
30 */ 30 */
31 public function setUp() 31 protected function setUp(): void
32 { 32 {
33 if (file_exists(self::$filename)) { 33 if (file_exists(self::$filename)) {
34 unlink(self::$filename); 34 unlink(self::$filename);
diff --git a/tests/feed/FeedBuilderTest.php b/tests/feed/FeedBuilderTest.php
index 5c2aaedb..c29e8ef3 100644
--- a/tests/feed/FeedBuilderTest.php
+++ b/tests/feed/FeedBuilderTest.php
@@ -10,13 +10,14 @@ use Shaarli\Bookmark\LinkDB;
10use Shaarli\Config\ConfigManager; 10use Shaarli\Config\ConfigManager;
11use Shaarli\Formatter\FormatterFactory; 11use Shaarli\Formatter\FormatterFactory;
12use Shaarli\History; 12use Shaarli\History;
13use Shaarli\TestCase;
13 14
14/** 15/**
15 * FeedBuilderTest class. 16 * FeedBuilderTest class.
16 * 17 *
17 * Unit tests for FeedBuilder. 18 * Unit tests for FeedBuilder.
18 */ 19 */
19class FeedBuilderTest extends \PHPUnit\Framework\TestCase 20class FeedBuilderTest extends TestCase
20{ 21{
21 /** 22 /**
22 * @var string locale Basque (Spain). 23 * @var string locale Basque (Spain).
@@ -44,7 +45,7 @@ class FeedBuilderTest extends \PHPUnit\Framework\TestCase
44 /** 45 /**
45 * Called before every test method. 46 * Called before every test method.
46 */ 47 */
47 public static function setUpBeforeClass() 48 public static function setUpBeforeClass(): void
48 { 49 {
49 $conf = new ConfigManager('tests/utils/config/configJson'); 50 $conf = new ConfigManager('tests/utils/config/configJson');
50 $conf->set('resource.datastore', self::$testDatastore); 51 $conf->set('resource.datastore', self::$testDatastore);
@@ -60,7 +61,7 @@ class FeedBuilderTest extends \PHPUnit\Framework\TestCase
60 'SERVER_NAME' => 'host.tld', 61 'SERVER_NAME' => 'host.tld',
61 'SERVER_PORT' => '80', 62 'SERVER_PORT' => '80',
62 'SCRIPT_NAME' => '/index.php', 63 'SCRIPT_NAME' => '/index.php',
63 'REQUEST_URI' => '/index.php?do=feed', 64 'REQUEST_URI' => '/feed/atom',
64 ); 65 );
65 } 66 }
66 67
@@ -81,13 +82,13 @@ class FeedBuilderTest extends \PHPUnit\Framework\TestCase
81 $this->assertEquals(self::$RSS_LANGUAGE, $data['language']); 82 $this->assertEquals(self::$RSS_LANGUAGE, $data['language']);
82 $this->assertRegExp('/Wed, 03 Aug 2016 09:30:33 \+\d{4}/', $data['last_update']); 83 $this->assertRegExp('/Wed, 03 Aug 2016 09:30:33 \+\d{4}/', $data['last_update']);
83 $this->assertEquals(true, $data['show_dates']); 84 $this->assertEquals(true, $data['show_dates']);
84 $this->assertEquals('http://host.tld/index.php?do=feed', $data['self_link']); 85 $this->assertEquals('http://host.tld/feed/atom', $data['self_link']);
85 $this->assertEquals('http://host.tld/', $data['index_url']); 86 $this->assertEquals('http://host.tld/', $data['index_url']);
86 $this->assertFalse($data['usepermalinks']); 87 $this->assertFalse($data['usepermalinks']);
87 $this->assertEquals(ReferenceLinkDB::$NB_LINKS_TOTAL, count($data['links'])); 88 $this->assertEquals(ReferenceLinkDB::$NB_LINKS_TOTAL, count($data['links']));
88 89
89 // Test first not pinned link (note link) 90 // Test first not pinned link (note link)
90 $link = $data['links'][array_keys($data['links'])[2]]; 91 $link = $data['links'][array_keys($data['links'])[0]];
91 $this->assertEquals(41, $link['id']); 92 $this->assertEquals(41, $link['id']);
92 $this->assertEquals(DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20150310_114651'), $link['created']); 93 $this->assertEquals(DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20150310_114651'), $link['created']);
93 $this->assertEquals('http://host.tld/shaare/WDWyig', $link['guid']); 94 $this->assertEquals('http://host.tld/shaare/WDWyig', $link['guid']);
@@ -96,9 +97,9 @@ class FeedBuilderTest extends \PHPUnit\Framework\TestCase
96 $pub = DateTime::createFromFormat(DateTime::RSS, $link['pub_iso_date']); 97 $pub = DateTime::createFromFormat(DateTime::RSS, $link['pub_iso_date']);
97 $up = DateTime::createFromFormat(DateTime::ATOM, $link['up_iso_date']); 98 $up = DateTime::createFromFormat(DateTime::ATOM, $link['up_iso_date']);
98 $this->assertEquals($pub, $up); 99 $this->assertEquals($pub, $up);
99 $this->assertContains('Stallman has a beard', $link['description']); 100 $this->assertContainsPolyfill('Stallman has a beard', $link['description']);
100 $this->assertContains('Permalink', $link['description']); 101 $this->assertContainsPolyfill('Permalink', $link['description']);
101 $this->assertContains('http://host.tld/shaare/WDWyig', $link['description']); 102 $this->assertContainsPolyfill('http://host.tld/shaare/WDWyig', $link['description']);
102 $this->assertEquals(1, count($link['taglist'])); 103 $this->assertEquals(1, count($link['taglist']));
103 $this->assertEquals('sTuff', $link['taglist'][0]); 104 $this->assertEquals('sTuff', $link['taglist'][0]);
104 105
@@ -128,7 +129,7 @@ class FeedBuilderTest extends \PHPUnit\Framework\TestCase
128 $data = $feedBuilder->buildData(FeedBuilder::$FEED_ATOM, null); 129 $data = $feedBuilder->buildData(FeedBuilder::$FEED_ATOM, null);
129 $this->assertEquals(ReferenceLinkDB::$NB_LINKS_TOTAL, count($data['links'])); 130 $this->assertEquals(ReferenceLinkDB::$NB_LINKS_TOTAL, count($data['links']));
130 $this->assertRegExp('/2016-08-03T09:30:33\+\d{2}:\d{2}/', $data['last_update']); 131 $this->assertRegExp('/2016-08-03T09:30:33\+\d{2}:\d{2}/', $data['last_update']);
131 $link = $data['links'][array_keys($data['links'])[2]]; 132 $link = $data['links'][array_keys($data['links'])[0]];
132 $this->assertRegExp('/2015-03-10T11:46:51\+\d{2}:\d{2}/', $link['pub_iso_date']); 133 $this->assertRegExp('/2015-03-10T11:46:51\+\d{2}:\d{2}/', $link['pub_iso_date']);
133 $this->assertRegExp('/2016-08-03T09:30:33\+\d{2}:\d{2}/', $data['links'][8]['up_iso_date']); 134 $this->assertRegExp('/2016-08-03T09:30:33\+\d{2}:\d{2}/', $data['links'][8]['up_iso_date']);
134 } 135 }
@@ -173,7 +174,7 @@ class FeedBuilderTest extends \PHPUnit\Framework\TestCase
173 $feedBuilder->setLocale(self::$LOCALE); 174 $feedBuilder->setLocale(self::$LOCALE);
174 $data = $feedBuilder->buildData(FeedBuilder::$FEED_ATOM, $criteria); 175 $data = $feedBuilder->buildData(FeedBuilder::$FEED_ATOM, $criteria);
175 $this->assertEquals(3, count($data['links'])); 176 $this->assertEquals(3, count($data['links']));
176 $link = $data['links'][array_keys($data['links'])[2]]; 177 $link = $data['links'][array_keys($data['links'])[0]];
177 $this->assertEquals(41, $link['id']); 178 $this->assertEquals(41, $link['id']);
178 $this->assertEquals(DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20150310_114651'), $link['created']); 179 $this->assertEquals(DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20150310_114651'), $link['created']);
179 } 180 }
@@ -195,21 +196,21 @@ class FeedBuilderTest extends \PHPUnit\Framework\TestCase
195 $this->assertEquals(ReferenceLinkDB::$NB_LINKS_TOTAL, count($data['links'])); 196 $this->assertEquals(ReferenceLinkDB::$NB_LINKS_TOTAL, count($data['links']));
196 $this->assertTrue($data['usepermalinks']); 197 $this->assertTrue($data['usepermalinks']);
197 // First link is a permalink 198 // First link is a permalink
198 $link = $data['links'][array_keys($data['links'])[2]]; 199 $link = $data['links'][array_keys($data['links'])[0]];
199 $this->assertEquals(41, $link['id']); 200 $this->assertEquals(41, $link['id']);
200 $this->assertEquals(DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20150310_114651'), $link['created']); 201 $this->assertEquals(DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20150310_114651'), $link['created']);
201 $this->assertEquals('http://host.tld/shaare/WDWyig', $link['guid']); 202 $this->assertEquals('http://host.tld/shaare/WDWyig', $link['guid']);
202 $this->assertEquals('http://host.tld/shaare/WDWyig', $link['url']); 203 $this->assertEquals('http://host.tld/shaare/WDWyig', $link['url']);
203 $this->assertContains('Direct link', $link['description']); 204 $this->assertContainsPolyfill('Direct link', $link['description']);
204 $this->assertContains('http://host.tld/shaare/WDWyig', $link['description']); 205 $this->assertContainsPolyfill('http://host.tld/shaare/WDWyig', $link['description']);
205 // Second link is a direct link 206 // Second link is a direct link
206 $link = $data['links'][array_keys($data['links'])[3]]; 207 $link = $data['links'][array_keys($data['links'])[1]];
207 $this->assertEquals(8, $link['id']); 208 $this->assertEquals(8, $link['id']);
208 $this->assertEquals(DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20150310_114633'), $link['created']); 209 $this->assertEquals(DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20150310_114633'), $link['created']);
209 $this->assertEquals('http://host.tld/shaare/RttfEw', $link['guid']); 210 $this->assertEquals('http://host.tld/shaare/RttfEw', $link['guid']);
210 $this->assertEquals('https://static.fsf.org/nosvn/faif-2.0.pdf', $link['url']); 211 $this->assertEquals('https://static.fsf.org/nosvn/faif-2.0.pdf', $link['url']);
211 $this->assertContains('Direct link', $link['description']); 212 $this->assertContainsPolyfill('Direct link', $link['description']);
212 $this->assertContains('https://static.fsf.org/nosvn/faif-2.0.pdf', $link['description']); 213 $this->assertContainsPolyfill('https://static.fsf.org/nosvn/faif-2.0.pdf', $link['description']);
213 } 214 }
214 215
215 /** 216 /**
@@ -253,7 +254,7 @@ class FeedBuilderTest extends \PHPUnit\Framework\TestCase
253 'SERVER_NAME' => 'host.tld', 254 'SERVER_NAME' => 'host.tld',
254 'SERVER_PORT' => '8080', 255 'SERVER_PORT' => '8080',
255 'SCRIPT_NAME' => '/~user/shaarli/index.php', 256 'SCRIPT_NAME' => '/~user/shaarli/index.php',
256 'REQUEST_URI' => '/~user/shaarli/index.php?do=feed', 257 'REQUEST_URI' => '/~user/shaarli/feed/atom',
257 ); 258 );
258 $feedBuilder = new FeedBuilder( 259 $feedBuilder = new FeedBuilder(
259 self::$bookmarkService, 260 self::$bookmarkService,
@@ -265,14 +266,14 @@ class FeedBuilderTest extends \PHPUnit\Framework\TestCase
265 $data = $feedBuilder->buildData(FeedBuilder::$FEED_ATOM, null); 266 $data = $feedBuilder->buildData(FeedBuilder::$FEED_ATOM, null);
266 267
267 $this->assertEquals( 268 $this->assertEquals(
268 'http://host.tld:8080/~user/shaarli/index.php?do=feed', 269 'http://host.tld:8080/~user/shaarli/feed/atom',
269 $data['self_link'] 270 $data['self_link']
270 ); 271 );
271 272
272 // Test first link (note link) 273 // Test first link (note link)
273 $link = $data['links'][array_keys($data['links'])[2]]; 274 $link = $data['links'][array_keys($data['links'])[0]];
274 $this->assertEquals('http://host.tld:8080/~user/shaarli/shaare/WDWyig', $link['guid']); 275 $this->assertEquals('http://host.tld:8080/~user/shaarli/shaare/WDWyig', $link['guid']);
275 $this->assertEquals('http://host.tld:8080/~user/shaarli/shaare/WDWyig', $link['url']); 276 $this->assertEquals('http://host.tld:8080/~user/shaarli/shaare/WDWyig', $link['url']);
276 $this->assertContains('http://host.tld:8080/~user/shaarli/./add-tag/hashtag', $link['description']); 277 $this->assertContainsPolyfill('http://host.tld:8080/~user/shaarli/./add-tag/hashtag', $link['description']);
277 } 278 }
278} 279}
diff --git a/tests/formatter/BookmarkDefaultFormatterTest.php b/tests/formatter/BookmarkDefaultFormatterTest.php
index cf48b00b..9534436e 100644
--- a/tests/formatter/BookmarkDefaultFormatterTest.php
+++ b/tests/formatter/BookmarkDefaultFormatterTest.php
@@ -3,9 +3,9 @@
3namespace Shaarli\Formatter; 3namespace Shaarli\Formatter;
4 4
5use DateTime; 5use DateTime;
6use PHPUnit\Framework\TestCase;
7use Shaarli\Bookmark\Bookmark; 6use Shaarli\Bookmark\Bookmark;
8use Shaarli\Config\ConfigManager; 7use Shaarli\Config\ConfigManager;
8use Shaarli\TestCase;
9 9
10/** 10/**
11 * Class BookmarkDefaultFormatterTest 11 * Class BookmarkDefaultFormatterTest
@@ -25,7 +25,7 @@ class BookmarkDefaultFormatterTest extends TestCase
25 /** 25 /**
26 * Initialize formatter instance. 26 * Initialize formatter instance.
27 */ 27 */
28 public function setUp() 28 protected function setUp(): void
29 { 29 {
30 copy('tests/utils/config/configJson.json.php', self::$testConf .'.json.php'); 30 copy('tests/utils/config/configJson.json.php', self::$testConf .'.json.php');
31 $this->conf = new ConfigManager(self::$testConf); 31 $this->conf = new ConfigManager(self::$testConf);
diff --git a/tests/formatter/BookmarkMarkdownExtraFormatterTest.php b/tests/formatter/BookmarkMarkdownExtraFormatterTest.php
new file mode 100644
index 00000000..d4941ef3
--- /dev/null
+++ b/tests/formatter/BookmarkMarkdownExtraFormatterTest.php
@@ -0,0 +1,162 @@
1<?php
2
3namespace Shaarli\Formatter;
4
5use DateTime;
6use PHPUnit\Framework\TestCase;
7use Shaarli\Bookmark\Bookmark;
8use Shaarli\Config\ConfigManager;
9
10/**
11 * Class BookmarkMarkdownExtraFormatterTest
12 * @package Shaarli\Formatter
13 */
14class BookmarkMarkdownExtraFormatterTest extends TestCase
15{
16 /** @var string Path of test config file */
17 protected static $testConf = 'sandbox/config';
18
19 /** @var BookmarkFormatter */
20 protected $formatter;
21
22 /** @var ConfigManager instance */
23 protected $conf;
24
25 /**
26 * Initialize formatter instance.
27 */
28 public function setUp(): void
29 {
30 copy('tests/utils/config/configJson.json.php', self::$testConf .'.json.php');
31 $this->conf = new ConfigManager(self::$testConf);
32 $this->formatter = new BookmarkMarkdownExtraFormatter($this->conf, true);
33 }
34
35 /**
36 * Test formatting a bookmark with all its attribute filled.
37 */
38 public function testFormatExtra(): void
39 {
40 $bookmark = new Bookmark();
41 $bookmark->setId($id = 11);
42 $bookmark->setShortUrl($short = 'abcdef');
43 $bookmark->setUrl('https://sub.domain.tld?query=here&for=real#hash');
44 $bookmark->setTitle($title = 'This is a <strong>bookmark</strong>');
45 $bookmark->setDescription('<h2>Content</h2><p>`Here is some content</p>');
46 $bookmark->setTags($tags = ['tag1', 'bookmark', 'other', '<script>alert("xss");</script>']);
47 $bookmark->setThumbnail('http://domain2.tdl2/?type=img&name=file.png');
48 $bookmark->setSticky(true);
49 $bookmark->setCreated($created = DateTime::createFromFormat('Ymd_His', '20190521_190412'));
50 $bookmark->setUpdated($updated = DateTime::createFromFormat('Ymd_His', '20190521_191213'));
51 $bookmark->setPrivate(true);
52
53 $link = $this->formatter->format($bookmark);
54 $this->assertEquals($id, $link['id']);
55 $this->assertEquals($short, $link['shorturl']);
56 $this->assertEquals('https://sub.domain.tld?query=here&amp;for=real#hash', $link['url']);
57 $this->assertEquals(
58 'https://sub.domain.tld?query=here&amp;for=real#hash',
59 $link['real_url']
60 );
61 $this->assertEquals('This is a &lt;strong&gt;bookmark&lt;/strong&gt;', $link['title']);
62 $this->assertEquals(
63 '<div class="markdown"><p>'.
64 '&lt;h2&gt;Content&lt;/h2&gt;&lt;p&gt;`Here is some content&lt;/p&gt;'.
65 '</p></div>',
66 $link['description']
67 );
68 $tags[3] = '&lt;script&gt;alert(&quot;xss&quot;);&lt;/script&gt;';
69 $this->assertEquals($tags, $link['taglist']);
70 $this->assertEquals(implode(' ', $tags), $link['tags']);
71 $this->assertEquals(
72 'http://domain2.tdl2/?type=img&amp;name=file.png',
73 $link['thumbnail']
74 );
75 $this->assertEquals($created, $link['created']);
76 $this->assertEquals($created->getTimestamp(), $link['timestamp']);
77 $this->assertEquals($updated, $link['updated']);
78 $this->assertEquals($updated->getTimestamp(), $link['updated_timestamp']);
79 $this->assertTrue($link['private']);
80 $this->assertTrue($link['sticky']);
81 $this->assertEquals('private', $link['class']);
82 }
83
84 /**
85 * Test formatting a bookmark with all its attribute filled.
86 */
87 public function testFormatExtraMinimal(): void
88 {
89 $bookmark = new Bookmark();
90
91 $link = $this->formatter->format($bookmark);
92 $this->assertEmpty($link['id']);
93 $this->assertEmpty($link['shorturl']);
94 $this->assertEmpty($link['url']);
95 $this->assertEmpty($link['real_url']);
96 $this->assertEmpty($link['title']);
97 $this->assertEmpty($link['description']);
98 $this->assertEmpty($link['taglist']);
99 $this->assertEmpty($link['tags']);
100 $this->assertEmpty($link['thumbnail']);
101 $this->assertEmpty($link['created']);
102 $this->assertEmpty($link['timestamp']);
103 $this->assertEmpty($link['updated']);
104 $this->assertEmpty($link['updated_timestamp']);
105 $this->assertFalse($link['private']);
106 $this->assertFalse($link['sticky']);
107 $this->assertEmpty($link['class']);
108 }
109
110 /**
111 * Make sure that the description is properly formatted by the default formatter.
112 */
113 public function testFormatExtrraDescription(): void
114 {
115 $description = 'This a <strong>description</strong>'. PHP_EOL;
116 $description .= 'text https://sub.domain.tld?query=here&for=real#hash more text'. PHP_EOL;
117 $description .= 'Also, there is an #hashtag added'. PHP_EOL;
118 $description .= ' A N D KEEP SPACES ! '. PHP_EOL;
119 $description .= '# Header {.class}'. PHP_EOL;
120
121 $bookmark = new Bookmark();
122 $bookmark->setDescription($description);
123 $link = $this->formatter->format($bookmark);
124
125 $description = '<div class="markdown"><p>';
126 $description .= 'This a &lt;strong&gt;description&lt;/strong&gt;<br />'. PHP_EOL;
127 $url = 'https://sub.domain.tld?query=here&amp;for=real#hash';
128 $description .= 'text <a href="'. $url .'">'. $url .'</a> more text<br />'. PHP_EOL;
129 $description .= 'Also, there is an <a href="./add-tag/hashtag">#hashtag</a> added<br />'. PHP_EOL;
130 $description .= 'A N D KEEP SPACES ! </p>' . PHP_EOL;
131 $description .= '<h1 class="class">Header</h1>';
132 $description .= '</div>';
133
134 $this->assertEquals($description, $link['description']);
135 }
136
137 /**
138 * Test formatting URL with an index_url set
139 * It should prepend relative links.
140 */
141 public function testFormatExtraNoteWithIndexUrl(): void
142 {
143 $bookmark = new Bookmark();
144 $bookmark->setUrl($short = '?abcdef');
145 $description = 'Text #hashtag more text';
146 $bookmark->setDescription($description);
147
148 $this->formatter->addContextData('index_url', $root = 'https://domain.tld/hithere/');
149
150 $description = '<div class="markdown"><p>';
151 $description .= 'Text <a href="'. $root .'./add-tag/hashtag">#hashtag</a> more text';
152 $description .= '</p></div>';
153
154 $link = $this->formatter->format($bookmark);
155 $this->assertEquals($root . $short, $link['url']);
156 $this->assertEquals($root . $short, $link['real_url']);
157 $this->assertEquals(
158 $description,
159 $link['description']
160 );
161 }
162}
diff --git a/tests/formatter/BookmarkMarkdownFormatterTest.php b/tests/formatter/BookmarkMarkdownFormatterTest.php
index 3e72d1ee..ab6b4080 100644
--- a/tests/formatter/BookmarkMarkdownFormatterTest.php
+++ b/tests/formatter/BookmarkMarkdownFormatterTest.php
@@ -3,9 +3,9 @@
3namespace Shaarli\Formatter; 3namespace Shaarli\Formatter;
4 4
5use DateTime; 5use DateTime;
6use PHPUnit\Framework\TestCase;
7use Shaarli\Bookmark\Bookmark; 6use Shaarli\Bookmark\Bookmark;
8use Shaarli\Config\ConfigManager; 7use Shaarli\Config\ConfigManager;
8use Shaarli\TestCase;
9 9
10/** 10/**
11 * Class BookmarkMarkdownFormatterTest 11 * Class BookmarkMarkdownFormatterTest
@@ -25,7 +25,7 @@ class BookmarkMarkdownFormatterTest extends TestCase
25 /** 25 /**
26 * Initialize formatter instance. 26 * Initialize formatter instance.
27 */ 27 */
28 public function setUp() 28 protected function setUp(): void
29 { 29 {
30 copy('tests/utils/config/configJson.json.php', self::$testConf .'.json.php'); 30 copy('tests/utils/config/configJson.json.php', self::$testConf .'.json.php');
31 $this->conf = new ConfigManager(self::$testConf); 31 $this->conf = new ConfigManager(self::$testConf);
diff --git a/tests/formatter/BookmarkRawFormatterTest.php b/tests/formatter/BookmarkRawFormatterTest.php
index 4491b035..c76bb7b9 100644
--- a/tests/formatter/BookmarkRawFormatterTest.php
+++ b/tests/formatter/BookmarkRawFormatterTest.php
@@ -3,9 +3,9 @@
3namespace Shaarli\Formatter; 3namespace Shaarli\Formatter;
4 4
5use DateTime; 5use DateTime;
6use PHPUnit\Framework\TestCase;
7use Shaarli\Bookmark\Bookmark; 6use Shaarli\Bookmark\Bookmark;
8use Shaarli\Config\ConfigManager; 7use Shaarli\Config\ConfigManager;
8use Shaarli\TestCase;
9 9
10/** 10/**
11 * Class BookmarkRawFormatterTest 11 * Class BookmarkRawFormatterTest
@@ -25,7 +25,7 @@ class BookmarkRawFormatterTest extends TestCase
25 /** 25 /**
26 * Initialize formatter instance. 26 * Initialize formatter instance.
27 */ 27 */
28 public function setUp() 28 protected function setUp(): void
29 { 29 {
30 copy('tests/utils/config/configJson.json.php', self::$testConf .'.json.php'); 30 copy('tests/utils/config/configJson.json.php', self::$testConf .'.json.php');
31 $this->conf = new ConfigManager(self::$testConf); 31 $this->conf = new ConfigManager(self::$testConf);
diff --git a/tests/formatter/FormatterFactoryTest.php b/tests/formatter/FormatterFactoryTest.php
index 5adf3ffd..ae476cb5 100644
--- a/tests/formatter/FormatterFactoryTest.php
+++ b/tests/formatter/FormatterFactoryTest.php
@@ -2,8 +2,8 @@
2 2
3namespace Shaarli\Formatter; 3namespace Shaarli\Formatter;
4 4
5use PHPUnit\Framework\TestCase;
6use Shaarli\Config\ConfigManager; 5use Shaarli\Config\ConfigManager;
6use Shaarli\TestCase;
7 7
8/** 8/**
9 * Class FormatterFactoryTest 9 * Class FormatterFactoryTest
@@ -24,7 +24,7 @@ class FormatterFactoryTest extends TestCase
24 /** 24 /**
25 * Initialize FormatterFactory instance 25 * Initialize FormatterFactory instance
26 */ 26 */
27 public function setUp() 27 protected function setUp(): void
28 { 28 {
29 copy('tests/utils/config/configJson.json.php', self::$testConf .'.json.php'); 29 copy('tests/utils/config/configJson.json.php', self::$testConf .'.json.php');
30 $this->conf = new ConfigManager(self::$testConf); 30 $this->conf = new ConfigManager(self::$testConf);
diff --git a/tests/front/ShaarliAdminMiddlewareTest.php b/tests/front/ShaarliAdminMiddlewareTest.php
index 7451330b..44025f11 100644
--- a/tests/front/ShaarliAdminMiddlewareTest.php
+++ b/tests/front/ShaarliAdminMiddlewareTest.php
@@ -4,10 +4,10 @@ declare(strict_types=1);
4 4
5namespace Shaarli\Front; 5namespace Shaarli\Front;
6 6
7use PHPUnit\Framework\TestCase;
8use Shaarli\Config\ConfigManager; 7use Shaarli\Config\ConfigManager;
9use Shaarli\Container\ShaarliContainer; 8use Shaarli\Container\ShaarliContainer;
10use Shaarli\Security\LoginManager; 9use Shaarli\Security\LoginManager;
10use Shaarli\TestCase;
11use Shaarli\Updater\Updater; 11use Shaarli\Updater\Updater;
12use Slim\Http\Request; 12use Slim\Http\Request;
13use Slim\Http\Response; 13use Slim\Http\Response;
diff --git a/tests/front/ShaarliMiddlewareTest.php b/tests/front/ShaarliMiddlewareTest.php
index 05aa34a9..655c5bba 100644
--- a/tests/front/ShaarliMiddlewareTest.php
+++ b/tests/front/ShaarliMiddlewareTest.php
@@ -4,7 +4,6 @@ declare(strict_types=1);
4 4
5namespace Shaarli\Front; 5namespace Shaarli\Front;
6 6
7use PHPUnit\Framework\TestCase;
8use Shaarli\Config\ConfigManager; 7use Shaarli\Config\ConfigManager;
9use Shaarli\Container\ShaarliContainer; 8use Shaarli\Container\ShaarliContainer;
10use Shaarli\Front\Exception\LoginBannedException; 9use Shaarli\Front\Exception\LoginBannedException;
@@ -12,6 +11,7 @@ use Shaarli\Front\Exception\UnauthorizedException;
12use Shaarli\Render\PageBuilder; 11use Shaarli\Render\PageBuilder;
13use Shaarli\Render\PageCacheManager; 12use Shaarli\Render\PageCacheManager;
14use Shaarli\Security\LoginManager; 13use Shaarli\Security\LoginManager;
14use Shaarli\TestCase;
15use Shaarli\Updater\Updater; 15use Shaarli\Updater\Updater;
16use Slim\Http\Request; 16use Slim\Http\Request;
17use Slim\Http\Response; 17use Slim\Http\Response;
diff --git a/tests/front/controller/admin/ConfigureControllerTest.php b/tests/front/controller/admin/ConfigureControllerTest.php
index f2f84bac..d82db0a7 100644
--- a/tests/front/controller/admin/ConfigureControllerTest.php
+++ b/tests/front/controller/admin/ConfigureControllerTest.php
@@ -4,10 +4,10 @@ declare(strict_types=1);
4 4
5namespace Shaarli\Front\Controller\Admin; 5namespace Shaarli\Front\Controller\Admin;
6 6
7use PHPUnit\Framework\TestCase;
8use Shaarli\Config\ConfigManager; 7use Shaarli\Config\ConfigManager;
9use Shaarli\Front\Exception\WrongTokenException; 8use Shaarli\Front\Exception\WrongTokenException;
10use Shaarli\Security\SessionManager; 9use Shaarli\Security\SessionManager;
10use Shaarli\TestCase;
11use Shaarli\Thumbnailer; 11use Shaarli\Thumbnailer;
12use Slim\Http\Request; 12use Slim\Http\Request;
13use Slim\Http\Response; 13use Slim\Http\Response;
@@ -51,7 +51,7 @@ class ConfigureControllerTest extends TestCase
51 static::assertSame('general.title', $assignedVariables['title']); 51 static::assertSame('general.title', $assignedVariables['title']);
52 static::assertSame('resource.theme', $assignedVariables['theme']); 52 static::assertSame('resource.theme', $assignedVariables['theme']);
53 static::assertEmpty($assignedVariables['theme_available']); 53 static::assertEmpty($assignedVariables['theme_available']);
54 static::assertSame(['default', 'markdown'], $assignedVariables['formatter_available']); 54 static::assertSame(['default', 'markdown', 'markdownExtra'], $assignedVariables['formatter_available']);
55 static::assertNotEmpty($assignedVariables['continents']); 55 static::assertNotEmpty($assignedVariables['continents']);
56 static::assertNotEmpty($assignedVariables['cities']); 56 static::assertNotEmpty($assignedVariables['cities']);
57 static::assertSame('general.retrieve_description', $assignedVariables['retrieve_description']); 57 static::assertSame('general.retrieve_description', $assignedVariables['retrieve_description']);
@@ -62,7 +62,7 @@ class ConfigureControllerTest extends TestCase
62 static::assertSame('privacy.hide_public_links', $assignedVariables['hide_public_links']); 62 static::assertSame('privacy.hide_public_links', $assignedVariables['hide_public_links']);
63 static::assertSame('api.enabled', $assignedVariables['api_enabled']); 63 static::assertSame('api.enabled', $assignedVariables['api_enabled']);
64 static::assertSame('api.secret', $assignedVariables['api_secret']); 64 static::assertSame('api.secret', $assignedVariables['api_secret']);
65 static::assertCount(4, $assignedVariables['languages']); 65 static::assertCount(5, $assignedVariables['languages']);
66 static::assertArrayHasKey('gd_enabled', $assignedVariables); 66 static::assertArrayHasKey('gd_enabled', $assignedVariables);
67 static::assertSame('thumbnails.mode', $assignedVariables['thumbnails_mode']); 67 static::assertSame('thumbnails.mode', $assignedVariables['thumbnails_mode']);
68 } 68 }
diff --git a/tests/front/controller/admin/ExportControllerTest.php b/tests/front/controller/admin/ExportControllerTest.php
index 50d9e378..0e6f2762 100644
--- a/tests/front/controller/admin/ExportControllerTest.php
+++ b/tests/front/controller/admin/ExportControllerTest.php
@@ -4,12 +4,12 @@ declare(strict_types=1);
4 4
5namespace Shaarli\Front\Controller\Admin; 5namespace Shaarli\Front\Controller\Admin;
6 6
7use PHPUnit\Framework\TestCase;
8use Shaarli\Bookmark\Bookmark; 7use Shaarli\Bookmark\Bookmark;
9use Shaarli\Formatter\BookmarkFormatter; 8use Shaarli\Formatter\BookmarkFormatter;
10use Shaarli\Formatter\BookmarkRawFormatter; 9use Shaarli\Formatter\BookmarkRawFormatter;
11use Shaarli\Netscape\NetscapeBookmarkUtils; 10use Shaarli\Netscape\NetscapeBookmarkUtils;
12use Shaarli\Security\SessionManager; 11use Shaarli\Security\SessionManager;
12use Shaarli\TestCase;
13use Slim\Http\Request; 13use Slim\Http\Request;
14use Slim\Http\Response; 14use Slim\Http\Response;
15 15
@@ -84,7 +84,7 @@ class ExportControllerTest extends TestCase
84 static::assertInstanceOf(BookmarkRawFormatter::class, $formatter); 84 static::assertInstanceOf(BookmarkRawFormatter::class, $formatter);
85 static::assertSame($parameters['selection'], $selection); 85 static::assertSame($parameters['selection'], $selection);
86 static::assertTrue($prependNoteUrl); 86 static::assertTrue($prependNoteUrl);
87 static::assertSame('http://shaarli', $indexUrl); 87 static::assertSame('http://shaarli/subfolder/', $indexUrl);
88 88
89 return $bookmarks; 89 return $bookmarks;
90 } 90 }
diff --git a/tests/front/controller/admin/ImportControllerTest.php b/tests/front/controller/admin/ImportControllerTest.php
index eb31fad0..c266caa5 100644
--- a/tests/front/controller/admin/ImportControllerTest.php
+++ b/tests/front/controller/admin/ImportControllerTest.php
@@ -4,10 +4,10 @@ declare(strict_types=1);
4 4
5namespace Shaarli\Front\Controller\Admin; 5namespace Shaarli\Front\Controller\Admin;
6 6
7use PHPUnit\Framework\TestCase;
8use Psr\Http\Message\UploadedFileInterface; 7use Psr\Http\Message\UploadedFileInterface;
9use Shaarli\Netscape\NetscapeBookmarkUtils; 8use Shaarli\Netscape\NetscapeBookmarkUtils;
10use Shaarli\Security\SessionManager; 9use Shaarli\Security\SessionManager;
10use Shaarli\TestCase;
11use Slim\Http\Request; 11use Slim\Http\Request;
12use Slim\Http\Response; 12use Slim\Http\Response;
13use Slim\Http\UploadedFile; 13use Slim\Http\UploadedFile;
diff --git a/tests/front/controller/admin/LogoutControllerTest.php b/tests/front/controller/admin/LogoutControllerTest.php
index 45e84dc0..94e53019 100644
--- a/tests/front/controller/admin/LogoutControllerTest.php
+++ b/tests/front/controller/admin/LogoutControllerTest.php
@@ -4,10 +4,9 @@ declare(strict_types=1);
4 4
5namespace Shaarli\Front\Controller\Admin; 5namespace Shaarli\Front\Controller\Admin;
6 6
7use PHPUnit\Framework\TestCase;
8use Shaarli\Security\CookieManager; 7use Shaarli\Security\CookieManager;
9use Shaarli\Security\LoginManager;
10use Shaarli\Security\SessionManager; 8use Shaarli\Security\SessionManager;
9use Shaarli\TestCase;
11use Slim\Http\Request; 10use Slim\Http\Request;
12use Slim\Http\Response; 11use Slim\Http\Response;
13 12
diff --git a/tests/front/controller/admin/ManageShaareControllerTest/AddShaareTest.php b/tests/front/controller/admin/ManageShaareControllerTest/AddShaareTest.php
index 7d5b752a..0f27ec2f 100644
--- a/tests/front/controller/admin/ManageShaareControllerTest/AddShaareTest.php
+++ b/tests/front/controller/admin/ManageShaareControllerTest/AddShaareTest.php
@@ -4,10 +4,10 @@ declare(strict_types=1);
4 4
5namespace Shaarli\Front\Controller\Admin\ManageShaareControllerTest; 5namespace Shaarli\Front\Controller\Admin\ManageShaareControllerTest;
6 6
7use PHPUnit\Framework\TestCase;
8use Shaarli\Front\Controller\Admin\FrontAdminControllerMockHelper; 7use Shaarli\Front\Controller\Admin\FrontAdminControllerMockHelper;
9use Shaarli\Front\Controller\Admin\ManageShaareController; 8use Shaarli\Front\Controller\Admin\ManageShaareController;
10use Shaarli\Http\HttpAccess; 9use Shaarli\Http\HttpAccess;
10use Shaarli\TestCase;
11use Slim\Http\Request; 11use Slim\Http\Request;
12use Slim\Http\Response; 12use Slim\Http\Response;
13 13
diff --git a/tests/front/controller/admin/ManageShaareControllerTest/ChangeVisibilityBookmarkTest.php b/tests/front/controller/admin/ManageShaareControllerTest/ChangeVisibilityBookmarkTest.php
index 5a615791..096d0774 100644
--- a/tests/front/controller/admin/ManageShaareControllerTest/ChangeVisibilityBookmarkTest.php
+++ b/tests/front/controller/admin/ManageShaareControllerTest/ChangeVisibilityBookmarkTest.php
@@ -4,7 +4,6 @@ declare(strict_types=1);
4 4
5namespace Shaarli\Front\Controller\Admin\ManageShaareControllerTest; 5namespace Shaarli\Front\Controller\Admin\ManageShaareControllerTest;
6 6
7use PHPUnit\Framework\TestCase;
8use Shaarli\Bookmark\Bookmark; 7use Shaarli\Bookmark\Bookmark;
9use Shaarli\Bookmark\Exception\BookmarkNotFoundException; 8use Shaarli\Bookmark\Exception\BookmarkNotFoundException;
10use Shaarli\Formatter\BookmarkFormatter; 9use Shaarli\Formatter\BookmarkFormatter;
@@ -14,6 +13,7 @@ use Shaarli\Front\Controller\Admin\FrontAdminControllerMockHelper;
14use Shaarli\Front\Controller\Admin\ManageShaareController; 13use Shaarli\Front\Controller\Admin\ManageShaareController;
15use Shaarli\Http\HttpAccess; 14use Shaarli\Http\HttpAccess;
16use Shaarli\Security\SessionManager; 15use Shaarli\Security\SessionManager;
16use Shaarli\TestCase;
17use Slim\Http\Request; 17use Slim\Http\Request;
18use Slim\Http\Response; 18use Slim\Http\Response;
19 19
diff --git a/tests/front/controller/admin/ManageShaareControllerTest/DeleteBookmarkTest.php b/tests/front/controller/admin/ManageShaareControllerTest/DeleteBookmarkTest.php
index dee622bb..ba774e21 100644
--- a/tests/front/controller/admin/ManageShaareControllerTest/DeleteBookmarkTest.php
+++ b/tests/front/controller/admin/ManageShaareControllerTest/DeleteBookmarkTest.php
@@ -4,7 +4,6 @@ declare(strict_types=1);
4 4
5namespace Shaarli\Front\Controller\Admin\ManageShaareControllerTest; 5namespace Shaarli\Front\Controller\Admin\ManageShaareControllerTest;
6 6
7use PHPUnit\Framework\TestCase;
8use Shaarli\Bookmark\Bookmark; 7use Shaarli\Bookmark\Bookmark;
9use Shaarli\Bookmark\Exception\BookmarkNotFoundException; 8use Shaarli\Bookmark\Exception\BookmarkNotFoundException;
10use Shaarli\Formatter\BookmarkFormatter; 9use Shaarli\Formatter\BookmarkFormatter;
@@ -13,6 +12,7 @@ use Shaarli\Front\Controller\Admin\FrontAdminControllerMockHelper;
13use Shaarli\Front\Controller\Admin\ManageShaareController; 12use Shaarli\Front\Controller\Admin\ManageShaareController;
14use Shaarli\Http\HttpAccess; 13use Shaarli\Http\HttpAccess;
15use Shaarli\Security\SessionManager; 14use Shaarli\Security\SessionManager;
15use Shaarli\TestCase;
16use Slim\Http\Request; 16use Slim\Http\Request;
17use Slim\Http\Response; 17use Slim\Http\Response;
18 18
diff --git a/tests/front/controller/admin/ManageShaareControllerTest/DisplayCreateFormTest.php b/tests/front/controller/admin/ManageShaareControllerTest/DisplayCreateFormTest.php
index 777583d5..2eb95251 100644
--- a/tests/front/controller/admin/ManageShaareControllerTest/DisplayCreateFormTest.php
+++ b/tests/front/controller/admin/ManageShaareControllerTest/DisplayCreateFormTest.php
@@ -4,12 +4,12 @@ declare(strict_types=1);
4 4
5namespace Shaarli\Front\Controller\Admin\ManageShaareControllerTest; 5namespace Shaarli\Front\Controller\Admin\ManageShaareControllerTest;
6 6
7use PHPUnit\Framework\TestCase;
8use Shaarli\Bookmark\Bookmark; 7use Shaarli\Bookmark\Bookmark;
9use Shaarli\Config\ConfigManager; 8use Shaarli\Config\ConfigManager;
10use Shaarli\Front\Controller\Admin\FrontAdminControllerMockHelper; 9use Shaarli\Front\Controller\Admin\FrontAdminControllerMockHelper;
11use Shaarli\Front\Controller\Admin\ManageShaareController; 10use Shaarli\Front\Controller\Admin\ManageShaareController;
12use Shaarli\Http\HttpAccess; 11use Shaarli\Http\HttpAccess;
12use Shaarli\TestCase;
13use Slim\Http\Request; 13use Slim\Http\Request;
14use Slim\Http\Response; 14use Slim\Http\Response;
15 15
@@ -96,12 +96,14 @@ class DisplayCreateFormTest extends TestCase
96 96
97 // Make sure that PluginManager hook is triggered 97 // Make sure that PluginManager hook is triggered
98 $this->container->pluginManager 98 $this->container->pluginManager
99 ->expects(static::at(0)) 99 ->expects(static::atLeastOnce())
100 ->method('executeHooks') 100 ->method('executeHooks')
101 ->withConsecutive(['render_editlink'], ['render_includes'])
101 ->willReturnCallback(function (string $hook, array $data) use ($remoteTitle, $remoteDesc): array { 102 ->willReturnCallback(function (string $hook, array $data) use ($remoteTitle, $remoteDesc): array {
102 static::assertSame('render_editlink', $hook); 103 if ('render_editlink' === $hook) {
103 static::assertSame($remoteTitle, $data['link']['title']); 104 static::assertSame($remoteTitle, $data['link']['title']);
104 static::assertSame($remoteDesc, $data['link']['description']); 105 static::assertSame($remoteDesc, $data['link']['description']);
106 }
105 107
106 return $data; 108 return $data;
107 }) 109 })
diff --git a/tests/front/controller/admin/ManageShaareControllerTest/DisplayEditFormTest.php b/tests/front/controller/admin/ManageShaareControllerTest/DisplayEditFormTest.php
index 1a1cdcf3..2dc3f41c 100644
--- a/tests/front/controller/admin/ManageShaareControllerTest/DisplayEditFormTest.php
+++ b/tests/front/controller/admin/ManageShaareControllerTest/DisplayEditFormTest.php
@@ -4,13 +4,13 @@ declare(strict_types=1);
4 4
5namespace Shaarli\Front\Controller\Admin\ManageShaareControllerTest; 5namespace Shaarli\Front\Controller\Admin\ManageShaareControllerTest;
6 6
7use PHPUnit\Framework\TestCase;
8use Shaarli\Bookmark\Bookmark; 7use Shaarli\Bookmark\Bookmark;
9use Shaarli\Bookmark\Exception\BookmarkNotFoundException; 8use Shaarli\Bookmark\Exception\BookmarkNotFoundException;
10use Shaarli\Front\Controller\Admin\FrontAdminControllerMockHelper; 9use Shaarli\Front\Controller\Admin\FrontAdminControllerMockHelper;
11use Shaarli\Front\Controller\Admin\ManageShaareController; 10use Shaarli\Front\Controller\Admin\ManageShaareController;
12use Shaarli\Http\HttpAccess; 11use Shaarli\Http\HttpAccess;
13use Shaarli\Security\SessionManager; 12use Shaarli\Security\SessionManager;
13use Shaarli\TestCase;
14use Slim\Http\Request; 14use Slim\Http\Request;
15use Slim\Http\Response; 15use Slim\Http\Response;
16 16
diff --git a/tests/front/controller/admin/ManageShaareControllerTest/PinBookmarkTest.php b/tests/front/controller/admin/ManageShaareControllerTest/PinBookmarkTest.php
index 1607b475..50ce7df1 100644
--- a/tests/front/controller/admin/ManageShaareControllerTest/PinBookmarkTest.php
+++ b/tests/front/controller/admin/ManageShaareControllerTest/PinBookmarkTest.php
@@ -4,13 +4,13 @@ declare(strict_types=1);
4 4
5namespace Shaarli\Front\Controller\Admin\ManageShaareControllerTest; 5namespace Shaarli\Front\Controller\Admin\ManageShaareControllerTest;
6 6
7use PHPUnit\Framework\TestCase;
8use Shaarli\Bookmark\Bookmark; 7use Shaarli\Bookmark\Bookmark;
9use Shaarli\Bookmark\Exception\BookmarkNotFoundException; 8use Shaarli\Bookmark\Exception\BookmarkNotFoundException;
10use Shaarli\Front\Controller\Admin\FrontAdminControllerMockHelper; 9use Shaarli\Front\Controller\Admin\FrontAdminControllerMockHelper;
11use Shaarli\Front\Controller\Admin\ManageShaareController; 10use Shaarli\Front\Controller\Admin\ManageShaareController;
12use Shaarli\Http\HttpAccess; 11use Shaarli\Http\HttpAccess;
13use Shaarli\Security\SessionManager; 12use Shaarli\Security\SessionManager;
13use Shaarli\TestCase;
14use Slim\Http\Request; 14use Slim\Http\Request;
15use Slim\Http\Response; 15use Slim\Http\Response;
16 16
diff --git a/tests/front/controller/admin/ManageShaareControllerTest/SaveBookmarkTest.php b/tests/front/controller/admin/ManageShaareControllerTest/SaveBookmarkTest.php
index dabcd60d..f7a68226 100644
--- a/tests/front/controller/admin/ManageShaareControllerTest/SaveBookmarkTest.php
+++ b/tests/front/controller/admin/ManageShaareControllerTest/SaveBookmarkTest.php
@@ -4,7 +4,6 @@ declare(strict_types=1);
4 4
5namespace Shaarli\Front\Controller\Admin\ManageShaareControllerTest; 5namespace Shaarli\Front\Controller\Admin\ManageShaareControllerTest;
6 6
7use PHPUnit\Framework\TestCase;
8use Shaarli\Bookmark\Bookmark; 7use Shaarli\Bookmark\Bookmark;
9use Shaarli\Config\ConfigManager; 8use Shaarli\Config\ConfigManager;
10use Shaarli\Front\Controller\Admin\FrontAdminControllerMockHelper; 9use Shaarli\Front\Controller\Admin\FrontAdminControllerMockHelper;
@@ -12,6 +11,7 @@ use Shaarli\Front\Controller\Admin\ManageShaareController;
12use Shaarli\Front\Exception\WrongTokenException; 11use Shaarli\Front\Exception\WrongTokenException;
13use Shaarli\Http\HttpAccess; 12use Shaarli\Http\HttpAccess;
14use Shaarli\Security\SessionManager; 13use Shaarli\Security\SessionManager;
14use Shaarli\TestCase;
15use Shaarli\Thumbnailer; 15use Shaarli\Thumbnailer;
16use Slim\Http\Request; 16use Slim\Http\Request;
17use Slim\Http\Response; 17use Slim\Http\Response;
@@ -43,7 +43,7 @@ class SaveBookmarkTest extends TestCase
43 'lf_description' => 'Provided description.', 43 'lf_description' => 'Provided description.',
44 'lf_tags' => 'abc def', 44 'lf_tags' => 'abc def',
45 'lf_private' => '1', 45 'lf_private' => '1',
46 'returnurl' => 'http://shaarli.tld/subfolder/admin/add-shaare' 46 'returnurl' => 'http://shaarli/subfolder/admin/add-shaare'
47 ]; 47 ];
48 48
49 $request = $this->createMock(Request::class); 49 $request = $this->createMock(Request::class);
@@ -88,17 +88,18 @@ class SaveBookmarkTest extends TestCase
88 88
89 // Make sure that PluginManager hook is triggered 89 // Make sure that PluginManager hook is triggered
90 $this->container->pluginManager 90 $this->container->pluginManager
91 ->expects(static::at(0)) 91 ->expects(static::atLeastOnce())
92 ->method('executeHooks') 92 ->method('executeHooks')
93 ->withConsecutive(['save_link'])
93 ->willReturnCallback(function (string $hook, array $data) use ($parameters, $id): array { 94 ->willReturnCallback(function (string $hook, array $data) use ($parameters, $id): array {
94 static::assertSame('save_link', $hook); 95 if ('save_link' === $hook) {
95 96 static::assertSame($id, $data['id']);
96 static::assertSame($id, $data['id']); 97 static::assertSame($parameters['lf_url'], $data['url']);
97 static::assertSame($parameters['lf_url'], $data['url']); 98 static::assertSame($parameters['lf_title'], $data['title']);
98 static::assertSame($parameters['lf_title'], $data['title']); 99 static::assertSame($parameters['lf_description'], $data['description']);
99 static::assertSame($parameters['lf_description'], $data['description']); 100 static::assertSame($parameters['lf_tags'], $data['tags']);
100 static::assertSame($parameters['lf_tags'], $data['tags']); 101 static::assertTrue($data['private']);
101 static::assertTrue($data['private']); 102 }
102 103
103 return $data; 104 return $data;
104 }) 105 })
@@ -124,7 +125,7 @@ class SaveBookmarkTest extends TestCase
124 'lf_description' => 'Provided description.', 125 'lf_description' => 'Provided description.',
125 'lf_tags' => 'abc def', 126 'lf_tags' => 'abc def',
126 'lf_private' => '1', 127 'lf_private' => '1',
127 'returnurl' => 'http://shaarli.tld/subfolder/?page=2' 128 'returnurl' => 'http://shaarli/subfolder/?page=2'
128 ]; 129 ];
129 130
130 $request = $this->createMock(Request::class); 131 $request = $this->createMock(Request::class);
@@ -174,17 +175,18 @@ class SaveBookmarkTest extends TestCase
174 175
175 // Make sure that PluginManager hook is triggered 176 // Make sure that PluginManager hook is triggered
176 $this->container->pluginManager 177 $this->container->pluginManager
177 ->expects(static::at(0)) 178 ->expects(static::atLeastOnce())
178 ->method('executeHooks') 179 ->method('executeHooks')
180 ->withConsecutive(['save_link'])
179 ->willReturnCallback(function (string $hook, array $data) use ($parameters, $id): array { 181 ->willReturnCallback(function (string $hook, array $data) use ($parameters, $id): array {
180 static::assertSame('save_link', $hook); 182 if ('save_link' === $hook) {
181 183 static::assertSame($id, $data['id']);
182 static::assertSame($id, $data['id']); 184 static::assertSame($parameters['lf_url'], $data['url']);
183 static::assertSame($parameters['lf_url'], $data['url']); 185 static::assertSame($parameters['lf_title'], $data['title']);
184 static::assertSame($parameters['lf_title'], $data['title']); 186 static::assertSame($parameters['lf_description'], $data['description']);
185 static::assertSame($parameters['lf_description'], $data['description']); 187 static::assertSame($parameters['lf_tags'], $data['tags']);
186 static::assertSame($parameters['lf_tags'], $data['tags']); 188 static::assertTrue($data['private']);
187 static::assertTrue($data['private']); 189 }
188 190
189 return $data; 191 return $data;
190 }) 192 })
@@ -239,6 +241,30 @@ class SaveBookmarkTest extends TestCase
239 } 241 }
240 242
241 /** 243 /**
244 * Test save a bookmark - with ID #0
245 */
246 public function testSaveBookmarkWithIdZero(): void
247 {
248 $parameters = ['lf_id' => '0'];
249
250 $request = $this->createMock(Request::class);
251 $request
252 ->method('getParam')
253 ->willReturnCallback(function (string $key) use ($parameters): ?string {
254 return $parameters[$key] ?? null;
255 })
256 ;
257 $response = new Response();
258
259 $this->container->bookmarkService->expects(static::once())->method('exists')->with(0)->willReturn(true);
260 $this->container->bookmarkService->expects(static::once())->method('get')->with(0)->willReturn(new Bookmark());
261
262 $result = $this->controller->save($request, $response);
263
264 static::assertSame(302, $result->getStatusCode());
265 }
266
267 /**
242 * Change the password with a wrong existing password 268 * Change the password with a wrong existing password
243 */ 269 */
244 public function testSaveBookmarkFromBookmarklet(): void 270 public function testSaveBookmarkFromBookmarklet(): void
diff --git a/tests/front/controller/admin/ManageTagControllerTest.php b/tests/front/controller/admin/ManageTagControllerTest.php
index 09ba0b4b..8a0ff7a9 100644
--- a/tests/front/controller/admin/ManageTagControllerTest.php
+++ b/tests/front/controller/admin/ManageTagControllerTest.php
@@ -4,11 +4,11 @@ declare(strict_types=1);
4 4
5namespace Shaarli\Front\Controller\Admin; 5namespace Shaarli\Front\Controller\Admin;
6 6
7use PHPUnit\Framework\TestCase;
8use Shaarli\Bookmark\Bookmark; 7use Shaarli\Bookmark\Bookmark;
9use Shaarli\Bookmark\BookmarkFilter; 8use Shaarli\Bookmark\BookmarkFilter;
10use Shaarli\Front\Exception\WrongTokenException; 9use Shaarli\Front\Exception\WrongTokenException;
11use Shaarli\Security\SessionManager; 10use Shaarli\Security\SessionManager;
11use Shaarli\TestCase;
12use Slim\Http\Request; 12use Slim\Http\Request;
13use Slim\Http\Response; 13use Slim\Http\Response;
14 14
diff --git a/tests/front/controller/admin/PasswordControllerTest.php b/tests/front/controller/admin/PasswordControllerTest.php
index 9a01089e..58f47b49 100644
--- a/tests/front/controller/admin/PasswordControllerTest.php
+++ b/tests/front/controller/admin/PasswordControllerTest.php
@@ -4,11 +4,11 @@ declare(strict_types=1);
4 4
5namespace Shaarli\Front\Controller\Admin; 5namespace Shaarli\Front\Controller\Admin;
6 6
7use PHPUnit\Framework\TestCase;
8use Shaarli\Config\ConfigManager; 7use Shaarli\Config\ConfigManager;
9use Shaarli\Front\Exception\OpenShaarliPasswordException; 8use Shaarli\Front\Exception\OpenShaarliPasswordException;
10use Shaarli\Front\Exception\WrongTokenException; 9use Shaarli\Front\Exception\WrongTokenException;
11use Shaarli\Security\SessionManager; 10use Shaarli\Security\SessionManager;
11use Shaarli\TestCase;
12use Slim\Http\Request; 12use Slim\Http\Request;
13use Slim\Http\Response; 13use Slim\Http\Response;
14 14
diff --git a/tests/front/controller/admin/PluginsControllerTest.php b/tests/front/controller/admin/PluginsControllerTest.php
index 5b59285c..974d614d 100644
--- a/tests/front/controller/admin/PluginsControllerTest.php
+++ b/tests/front/controller/admin/PluginsControllerTest.php
@@ -4,11 +4,11 @@ declare(strict_types=1);
4 4
5namespace Shaarli\Front\Controller\Admin; 5namespace Shaarli\Front\Controller\Admin;
6 6
7use PHPUnit\Framework\TestCase;
8use Shaarli\Config\ConfigManager; 7use Shaarli\Config\ConfigManager;
9use Shaarli\Front\Exception\WrongTokenException; 8use Shaarli\Front\Exception\WrongTokenException;
10use Shaarli\Plugin\PluginManager; 9use Shaarli\Plugin\PluginManager;
11use Shaarli\Security\SessionManager; 10use Shaarli\Security\SessionManager;
11use Shaarli\TestCase;
12use Slim\Http\Request; 12use Slim\Http\Request;
13use Slim\Http\Response; 13use Slim\Http\Response;
14 14
@@ -32,7 +32,7 @@ class PluginsControllerTest extends TestCase
32 array_map(function (string $plugin) use ($path) { touch($path . '/' . $plugin); }, static::PLUGIN_NAMES); 32 array_map(function (string $plugin) use ($path) { touch($path . '/' . $plugin); }, static::PLUGIN_NAMES);
33 } 33 }
34 34
35 public function tearDown() 35 public function tearDown(): void
36 { 36 {
37 $path = __DIR__ . '/folder'; 37 $path = __DIR__ . '/folder';
38 array_map(function (string $plugin) use ($path) { unlink($path . '/' . $plugin); }, static::PLUGIN_NAMES); 38 array_map(function (string $plugin) use ($path) { unlink($path . '/' . $plugin); }, static::PLUGIN_NAMES);
@@ -125,6 +125,7 @@ class PluginsControllerTest extends TestCase
125 'parameters_form' => true, 125 'parameters_form' => true,
126 'parameter1' => 'blip', 126 'parameter1' => 'blip',
127 'parameter2' => 'blop', 127 'parameter2' => 'blop',
128 'token' => 'this parameter should not be saved'
128 ]; 129 ];
129 130
130 $request = $this->createMock(Request::class); 131 $request = $this->createMock(Request::class);
@@ -143,7 +144,7 @@ class PluginsControllerTest extends TestCase
143 ->with('save_plugin_parameters', $parameters) 144 ->with('save_plugin_parameters', $parameters)
144 ; 145 ;
145 $this->container->conf 146 $this->container->conf
146 ->expects(static::atLeastOnce()) 147 ->expects(static::exactly(2))
147 ->method('set') 148 ->method('set')
148 ->withConsecutive(['plugins.parameter1', 'blip'], ['plugins.parameter2', 'blop']) 149 ->withConsecutive(['plugins.parameter1', 'blip'], ['plugins.parameter2', 'blop'])
149 ; 150 ;
diff --git a/tests/front/controller/admin/SessionFilterControllerTest.php b/tests/front/controller/admin/SessionFilterControllerTest.php
index d306c6e9..712a625b 100644
--- a/tests/front/controller/admin/SessionFilterControllerTest.php
+++ b/tests/front/controller/admin/SessionFilterControllerTest.php
@@ -4,9 +4,9 @@ declare(strict_types=1);
4 4
5namespace Shaarli\Front\Controller\Admin; 5namespace Shaarli\Front\Controller\Admin;
6 6
7use PHPUnit\Framework\TestCase;
8use Shaarli\Security\LoginManager; 7use Shaarli\Security\LoginManager;
9use Shaarli\Security\SessionManager; 8use Shaarli\Security\SessionManager;
9use Shaarli\TestCase;
10use Slim\Http\Request; 10use Slim\Http\Request;
11use Slim\Http\Response; 11use Slim\Http\Response;
12 12
@@ -31,7 +31,7 @@ class SessionFilterControllerTest extends TestCase
31 { 31 {
32 $arg = ['visibility' => 'private']; 32 $arg = ['visibility' => 'private'];
33 33
34 $this->container->environment = ['HTTP_REFERER' => 'http://shaarli/subfolder/controller/?searchtag=abc']; 34 $this->container->environment['HTTP_REFERER'] = 'http://shaarli/subfolder/controller/?searchtag=abc';
35 35
36 $this->container->loginManager->method('isLoggedIn')->willReturn(true); 36 $this->container->loginManager->method('isLoggedIn')->willReturn(true);
37 $this->container->sessionManager 37 $this->container->sessionManager
@@ -57,7 +57,7 @@ class SessionFilterControllerTest extends TestCase
57 { 57 {
58 $arg = ['visibility' => 'private']; 58 $arg = ['visibility' => 'private'];
59 59
60 $this->container->environment = ['HTTP_REFERER' => 'http://shaarli/subfolder/controller/?searchtag=abc']; 60 $this->container->environment['HTTP_REFERER'] = 'http://shaarli/subfolder/controller/?searchtag=abc';
61 61
62 $this->container->loginManager->method('isLoggedIn')->willReturn(true); 62 $this->container->loginManager->method('isLoggedIn')->willReturn(true);
63 $this->container->sessionManager 63 $this->container->sessionManager
@@ -121,7 +121,7 @@ class SessionFilterControllerTest extends TestCase
121 { 121 {
122 $arg = ['visibility' => 'test']; 122 $arg = ['visibility' => 'test'];
123 123
124 $this->container->environment = ['HTTP_REFERER' => 'http://shaarli/subfolder/controller/?searchtag=abc']; 124 $this->container->environment['HTTP_REFERER'] = 'http://shaarli/subfolder/controller/?searchtag=abc';
125 125
126 $this->container->loginManager->method('isLoggedIn')->willReturn(true); 126 $this->container->loginManager->method('isLoggedIn')->willReturn(true);
127 $this->container->sessionManager 127 $this->container->sessionManager
@@ -151,7 +151,7 @@ class SessionFilterControllerTest extends TestCase
151 { 151 {
152 $arg = ['visibility' => 'test']; 152 $arg = ['visibility' => 'test'];
153 153
154 $this->container->environment = ['HTTP_REFERER' => 'http://shaarli/subfolder/controller/?searchtag=abc']; 154 $this->container->environment['HTTP_REFERER'] = 'http://shaarli/subfolder/controller/?searchtag=abc';
155 155
156 $this->container->loginManager = $this->createMock(LoginManager::class); 156 $this->container->loginManager = $this->createMock(LoginManager::class);
157 $this->container->loginManager->method('isLoggedIn')->willReturn(false); 157 $this->container->loginManager->method('isLoggedIn')->willReturn(false);
diff --git a/tests/front/controller/admin/ShaarliAdminControllerTest.php b/tests/front/controller/admin/ShaarliAdminControllerTest.php
index fff427cb..486d5d2d 100644
--- a/tests/front/controller/admin/ShaarliAdminControllerTest.php
+++ b/tests/front/controller/admin/ShaarliAdminControllerTest.php
@@ -4,9 +4,9 @@ declare(strict_types=1);
4 4
5namespace Shaarli\Front\Controller\Admin; 5namespace Shaarli\Front\Controller\Admin;
6 6
7use PHPUnit\Framework\TestCase;
8use Shaarli\Front\Exception\WrongTokenException; 7use Shaarli\Front\Exception\WrongTokenException;
9use Shaarli\Security\SessionManager; 8use Shaarli\Security\SessionManager;
9use Shaarli\TestCase;
10use Slim\Http\Request; 10use Slim\Http\Request;
11 11
12/** 12/**
diff --git a/tests/front/controller/admin/ThumbnailsControllerTest.php b/tests/front/controller/admin/ThumbnailsControllerTest.php
index 0c0c8a83..f4a8acff 100644
--- a/tests/front/controller/admin/ThumbnailsControllerTest.php
+++ b/tests/front/controller/admin/ThumbnailsControllerTest.php
@@ -4,9 +4,9 @@ declare(strict_types=1);
4 4
5namespace Shaarli\Front\Controller\Admin; 5namespace Shaarli\Front\Controller\Admin;
6 6
7use PHPUnit\Framework\TestCase;
8use Shaarli\Bookmark\Bookmark; 7use Shaarli\Bookmark\Bookmark;
9use Shaarli\Bookmark\Exception\BookmarkNotFoundException; 8use Shaarli\Bookmark\Exception\BookmarkNotFoundException;
9use Shaarli\TestCase;
10use Shaarli\Thumbnailer; 10use Shaarli\Thumbnailer;
11use Slim\Http\Request; 11use Slim\Http\Request;
12use Slim\Http\Response; 12use Slim\Http\Response;
diff --git a/tests/front/controller/admin/TokenControllerTest.php b/tests/front/controller/admin/TokenControllerTest.php
index 04b0c0fa..d2f0907f 100644
--- a/tests/front/controller/admin/TokenControllerTest.php
+++ b/tests/front/controller/admin/TokenControllerTest.php
@@ -4,7 +4,7 @@ declare(strict_types=1);
4 4
5namespace Shaarli\Front\Controller\Admin; 5namespace Shaarli\Front\Controller\Admin;
6 6
7use PHPUnit\Framework\TestCase; 7use Shaarli\TestCase;
8use Slim\Http\Request; 8use Slim\Http\Request;
9use Slim\Http\Response; 9use Slim\Http\Response;
10 10
diff --git a/tests/front/controller/admin/ToolsControllerTest.php b/tests/front/controller/admin/ToolsControllerTest.php
index fc756f0f..e82f8b14 100644
--- a/tests/front/controller/admin/ToolsControllerTest.php
+++ b/tests/front/controller/admin/ToolsControllerTest.php
@@ -4,11 +4,11 @@ declare(strict_types=1);
4 4
5namespace Shaarli\Front\Controller\Admin; 5namespace Shaarli\Front\Controller\Admin;
6 6
7use PHPUnit\Framework\TestCase; 7use Shaarli\TestCase;
8use Slim\Http\Request; 8use Slim\Http\Request;
9use Slim\Http\Response; 9use Slim\Http\Response;
10 10
11class ToolsControllerTestControllerTest extends TestCase 11class ToolsControllerTest extends TestCase
12{ 12{
13 use FrontAdminControllerMockHelper; 13 use FrontAdminControllerMockHelper;
14 14
@@ -41,7 +41,7 @@ class ToolsControllerTestControllerTest extends TestCase
41 41
42 static::assertSame(200, $result->getStatusCode()); 42 static::assertSame(200, $result->getStatusCode());
43 static::assertSame('tools', (string) $result->getBody()); 43 static::assertSame('tools', (string) $result->getBody());
44 static::assertSame('https://shaarli', $assignedVariables['pageabsaddr']); 44 static::assertSame('https://shaarli/', $assignedVariables['pageabsaddr']);
45 static::assertTrue($assignedVariables['sslenabled']); 45 static::assertTrue($assignedVariables['sslenabled']);
46 } 46 }
47 47
@@ -63,7 +63,7 @@ class ToolsControllerTestControllerTest extends TestCase
63 63
64 static::assertSame(200, $result->getStatusCode()); 64 static::assertSame(200, $result->getStatusCode());
65 static::assertSame('tools', (string) $result->getBody()); 65 static::assertSame('tools', (string) $result->getBody());
66 static::assertSame('http://shaarli', $assignedVariables['pageabsaddr']); 66 static::assertSame('http://shaarli/', $assignedVariables['pageabsaddr']);
67 static::assertFalse($assignedVariables['sslenabled']); 67 static::assertFalse($assignedVariables['sslenabled']);
68 } 68 }
69} 69}
diff --git a/tests/front/controller/visitor/BookmarkListControllerTest.php b/tests/front/controller/visitor/BookmarkListControllerTest.php
index 5daaa2c4..0c95df97 100644
--- a/tests/front/controller/visitor/BookmarkListControllerTest.php
+++ b/tests/front/controller/visitor/BookmarkListControllerTest.php
@@ -4,11 +4,11 @@ declare(strict_types=1);
4 4
5namespace Shaarli\Front\Controller\Visitor; 5namespace Shaarli\Front\Controller\Visitor;
6 6
7use PHPUnit\Framework\TestCase;
8use Shaarli\Bookmark\Bookmark; 7use Shaarli\Bookmark\Bookmark;
9use Shaarli\Bookmark\Exception\BookmarkNotFoundException; 8use Shaarli\Bookmark\Exception\BookmarkNotFoundException;
10use Shaarli\Config\ConfigManager; 9use Shaarli\Config\ConfigManager;
11use Shaarli\Security\LoginManager; 10use Shaarli\Security\LoginManager;
11use Shaarli\TestCase;
12use Shaarli\Thumbnailer; 12use Shaarli\Thumbnailer;
13use Slim\Http\Request; 13use Slim\Http\Request;
14use Slim\Http\Response; 14use Slim\Http\Response;
diff --git a/tests/front/controller/visitor/DailyControllerTest.php b/tests/front/controller/visitor/DailyControllerTest.php
index b802c62c..fc78bc13 100644
--- a/tests/front/controller/visitor/DailyControllerTest.php
+++ b/tests/front/controller/visitor/DailyControllerTest.php
@@ -4,9 +4,9 @@ declare(strict_types=1);
4 4
5namespace Shaarli\Front\Controller\Visitor; 5namespace Shaarli\Front\Controller\Visitor;
6 6
7use PHPUnit\Framework\TestCase;
8use Shaarli\Bookmark\Bookmark; 7use Shaarli\Bookmark\Bookmark;
9use Shaarli\Feed\CachedPage; 8use Shaarli\Feed\CachedPage;
9use Shaarli\TestCase;
10use Slim\Http\Request; 10use Slim\Http\Request;
11use Slim\Http\Response; 11use Slim\Http\Response;
12 12
@@ -78,19 +78,20 @@ class DailyControllerTest extends TestCase
78 78
79 // Make sure that PluginManager hook is triggered 79 // Make sure that PluginManager hook is triggered
80 $this->container->pluginManager 80 $this->container->pluginManager
81 ->expects(static::at(0)) 81 ->expects(static::atLeastOnce())
82 ->method('executeHooks') 82 ->method('executeHooks')
83 ->withConsecutive(['render_daily'])
83 ->willReturnCallback(function (string $hook, array $data, array $param) use ($currentDay): array { 84 ->willReturnCallback(function (string $hook, array $data, array $param) use ($currentDay): array {
84 static::assertSame('render_daily', $hook); 85 if ('render_daily' === $hook) {
86 static::assertArrayHasKey('linksToDisplay', $data);
87 static::assertCount(3, $data['linksToDisplay']);
88 static::assertSame(1, $data['linksToDisplay'][0]['id']);
89 static::assertSame($currentDay->getTimestamp(), $data['day']);
90 static::assertSame('20200510', $data['previousday']);
91 static::assertSame('20200516', $data['nextday']);
85 92
86 static::assertArrayHasKey('linksToDisplay', $data); 93 static::assertArrayHasKey('loggedin', $param);
87 static::assertCount(3, $data['linksToDisplay']); 94 }
88 static::assertSame(1, $data['linksToDisplay'][0]['id']);
89 static::assertSame($currentDay->getTimestamp(), $data['day']);
90 static::assertSame('20200510', $data['previousday']);
91 static::assertSame('20200516', $data['nextday']);
92
93 static::assertArrayHasKey('loggedin', $param);
94 95
95 return $data; 96 return $data;
96 }) 97 })
@@ -203,19 +204,20 @@ class DailyControllerTest extends TestCase
203 204
204 // Make sure that PluginManager hook is triggered 205 // Make sure that PluginManager hook is triggered
205 $this->container->pluginManager 206 $this->container->pluginManager
206 ->expects(static::at(0)) 207 ->expects(static::atLeastOnce())
207 ->method('executeHooks') 208 ->method('executeHooks')
209 ->withConsecutive(['render_daily'])
208 ->willReturnCallback(function (string $hook, array $data, array $param) use ($currentDay): array { 210 ->willReturnCallback(function (string $hook, array $data, array $param) use ($currentDay): array {
209 static::assertSame('render_daily', $hook); 211 if ('render_daily' === $hook) {
210 212 static::assertArrayHasKey('linksToDisplay', $data);
211 static::assertArrayHasKey('linksToDisplay', $data); 213 static::assertCount(1, $data['linksToDisplay']);
212 static::assertCount(1, $data['linksToDisplay']); 214 static::assertSame(1, $data['linksToDisplay'][0]['id']);
213 static::assertSame(1, $data['linksToDisplay'][0]['id']); 215 static::assertSame($currentDay->getTimestamp(), $data['day']);
214 static::assertSame($currentDay->getTimestamp(), $data['day']); 216 static::assertEmpty($data['previousday']);
215 static::assertEmpty($data['previousday']); 217 static::assertEmpty($data['nextday']);
216 static::assertEmpty($data['nextday']);
217 218
218 static::assertArrayHasKey('loggedin', $param); 219 static::assertArrayHasKey('loggedin', $param);
220 }
219 221
220 return $data; 222 return $data;
221 }); 223 });
@@ -281,7 +283,7 @@ class DailyControllerTest extends TestCase
281 283
282 // Make sure that PluginManager hook is triggered 284 // Make sure that PluginManager hook is triggered
283 $this->container->pluginManager 285 $this->container->pluginManager
284 ->expects(static::at(0)) 286 ->expects(static::atLeastOnce())
285 ->method('executeHooks') 287 ->method('executeHooks')
286 ->willReturnCallback(function (string $hook, array $data, array $param): array { 288 ->willReturnCallback(function (string $hook, array $data, array $param): array {
287 return $data; 289 return $data;
@@ -333,7 +335,7 @@ class DailyControllerTest extends TestCase
333 335
334 // Make sure that PluginManager hook is triggered 336 // Make sure that PluginManager hook is triggered
335 $this->container->pluginManager 337 $this->container->pluginManager
336 ->expects(static::at(0)) 338 ->expects(static::atLeastOnce())
337 ->method('executeHooks') 339 ->method('executeHooks')
338 ->willReturnCallback(function (string $hook, array $data, array $param): array { 340 ->willReturnCallback(function (string $hook, array $data, array $param): array {
339 return $data; 341 return $data;
@@ -392,8 +394,8 @@ class DailyControllerTest extends TestCase
392 static::assertStringContainsString('application/rss', $result->getHeader('Content-Type')[0]); 394 static::assertStringContainsString('application/rss', $result->getHeader('Content-Type')[0]);
393 static::assertSame('dailyrss', (string) $result->getBody()); 395 static::assertSame('dailyrss', (string) $result->getBody());
394 static::assertSame('Shaarli', $assignedVariables['title']); 396 static::assertSame('Shaarli', $assignedVariables['title']);
395 static::assertSame('http://shaarli', $assignedVariables['index_url']); 397 static::assertSame('http://shaarli/subfolder/', $assignedVariables['index_url']);
396 static::assertSame('http://shaarli/daily-rss', $assignedVariables['page_url']); 398 static::assertSame('http://shaarli/subfolder/daily-rss', $assignedVariables['page_url']);
397 static::assertFalse($assignedVariables['hide_timestamps']); 399 static::assertFalse($assignedVariables['hide_timestamps']);
398 static::assertCount(2, $assignedVariables['days']); 400 static::assertCount(2, $assignedVariables['days']);
399 401
@@ -402,7 +404,7 @@ class DailyControllerTest extends TestCase
402 static::assertEquals($dates[0], $day['date']); 404 static::assertEquals($dates[0], $day['date']);
403 static::assertSame($dates[0]->format(\DateTime::RSS), $day['date_rss']); 405 static::assertSame($dates[0]->format(\DateTime::RSS), $day['date_rss']);
404 static::assertSame(format_date($dates[0], false), $day['date_human']); 406 static::assertSame(format_date($dates[0], false), $day['date_human']);
405 static::assertSame('http://shaarli/daily?day='. $dates[0]->format('Ymd'), $day['absolute_url']); 407 static::assertSame('http://shaarli/subfolder/daily?day='. $dates[0]->format('Ymd'), $day['absolute_url']);
406 static::assertCount(1, $day['links']); 408 static::assertCount(1, $day['links']);
407 static::assertSame(1, $day['links'][0]['id']); 409 static::assertSame(1, $day['links'][0]['id']);
408 static::assertSame('http://domain.tld/1', $day['links'][0]['url']); 410 static::assertSame('http://domain.tld/1', $day['links'][0]['url']);
@@ -413,7 +415,7 @@ class DailyControllerTest extends TestCase
413 static::assertEquals($dates[1], $day['date']); 415 static::assertEquals($dates[1], $day['date']);
414 static::assertSame($dates[1]->format(\DateTime::RSS), $day['date_rss']); 416 static::assertSame($dates[1]->format(\DateTime::RSS), $day['date_rss']);
415 static::assertSame(format_date($dates[1], false), $day['date_human']); 417 static::assertSame(format_date($dates[1], false), $day['date_human']);
416 static::assertSame('http://shaarli/daily?day='. $dates[1]->format('Ymd'), $day['absolute_url']); 418 static::assertSame('http://shaarli/subfolder/daily?day='. $dates[1]->format('Ymd'), $day['absolute_url']);
417 static::assertCount(2, $day['links']); 419 static::assertCount(2, $day['links']);
418 420
419 static::assertSame(2, $day['links'][0]['id']); 421 static::assertSame(2, $day['links'][0]['id']);
@@ -468,8 +470,8 @@ class DailyControllerTest extends TestCase
468 static::assertStringContainsString('application/rss', $result->getHeader('Content-Type')[0]); 470 static::assertStringContainsString('application/rss', $result->getHeader('Content-Type')[0]);
469 static::assertSame('dailyrss', (string) $result->getBody()); 471 static::assertSame('dailyrss', (string) $result->getBody());
470 static::assertSame('Shaarli', $assignedVariables['title']); 472 static::assertSame('Shaarli', $assignedVariables['title']);
471 static::assertSame('http://shaarli', $assignedVariables['index_url']); 473 static::assertSame('http://shaarli/subfolder/', $assignedVariables['index_url']);
472 static::assertSame('http://shaarli/daily-rss', $assignedVariables['page_url']); 474 static::assertSame('http://shaarli/subfolder/daily-rss', $assignedVariables['page_url']);
473 static::assertFalse($assignedVariables['hide_timestamps']); 475 static::assertFalse($assignedVariables['hide_timestamps']);
474 static::assertCount(0, $assignedVariables['days']); 476 static::assertCount(0, $assignedVariables['days']);
475 } 477 }
diff --git a/tests/front/controller/visitor/ErrorControllerTest.php b/tests/front/controller/visitor/ErrorControllerTest.php
index e497bfef..75408cf4 100644
--- a/tests/front/controller/visitor/ErrorControllerTest.php
+++ b/tests/front/controller/visitor/ErrorControllerTest.php
@@ -4,8 +4,8 @@ declare(strict_types=1);
4 4
5namespace Shaarli\Front\Controller\Visitor; 5namespace Shaarli\Front\Controller\Visitor;
6 6
7use PHPUnit\Framework\TestCase;
8use Shaarli\Front\Exception\ShaarliFrontException; 7use Shaarli\Front\Exception\ShaarliFrontException;
8use Shaarli\TestCase;
9use Slim\Http\Request; 9use Slim\Http\Request;
10use Slim\Http\Response; 10use Slim\Http\Response;
11 11
diff --git a/tests/front/controller/visitor/ErrorNotFoundControllerTest.php b/tests/front/controller/visitor/ErrorNotFoundControllerTest.php
new file mode 100644
index 00000000..a1cbbecf
--- /dev/null
+++ b/tests/front/controller/visitor/ErrorNotFoundControllerTest.php
@@ -0,0 +1,81 @@
1<?php
2
3declare(strict_types=1);
4
5namespace Shaarli\Front\Controller\Visitor;
6
7use Shaarli\TestCase;
8use Slim\Http\Request;
9use Slim\Http\Response;
10use Slim\Http\Uri;
11
12class ErrorNotFoundControllerTest extends TestCase
13{
14 use FrontControllerMockHelper;
15
16 /** @var ErrorNotFoundController */
17 protected $controller;
18
19 public function setUp(): void
20 {
21 $this->createContainer();
22
23 $this->controller = new ErrorNotFoundController($this->container);
24 }
25
26 /**
27 * Test displaying 404 error
28 */
29 public function testDisplayNotFoundError(): void
30 {
31 $request = $this->createMock(Request::class);
32 $request->expects(static::once())->method('getRequestTarget')->willReturn('/');
33 $request->method('getUri')->willReturnCallback(function (): Uri {
34 $uri = $this->createMock(Uri::class);
35 $uri->method('getBasePath')->willReturn('/subfolder');
36
37 return $uri;
38 });
39
40 $response = new Response();
41
42 // Save RainTPL assigned variables
43 $assignedVariables = [];
44 $this->assignTemplateVars($assignedVariables);
45
46 $result = ($this->controller)(
47 $request,
48 $response
49 );
50
51 static::assertSame(404, $result->getStatusCode());
52 static::assertSame('404', (string) $result->getBody());
53 static::assertSame('Requested page could not be found.', $assignedVariables['error_message']);
54 }
55
56 /**
57 * Test displaying 404 error from REST API
58 */
59 public function testDisplayNotFoundErrorFromAPI(): void
60 {
61 $request = $this->createMock(Request::class);
62 $request->expects(static::once())->method('getRequestTarget')->willReturn('/sufolder/api/v1/links');
63 $request->method('getUri')->willReturnCallback(function (): Uri {
64 $uri = $this->createMock(Uri::class);
65 $uri->method('getBasePath')->willReturn('/subfolder');
66
67 return $uri;
68 });
69
70 $response = new Response();
71
72 // Save RainTPL assigned variables
73 $assignedVariables = [];
74 $this->assignTemplateVars($assignedVariables);
75
76 $result = ($this->controller)($request, $response);
77
78 static::assertSame(404, $result->getStatusCode());
79 static::assertSame([], $assignedVariables);
80 }
81}
diff --git a/tests/front/controller/visitor/FeedControllerTest.php b/tests/front/controller/visitor/FeedControllerTest.php
index fb417e2a..4ae7c925 100644
--- a/tests/front/controller/visitor/FeedControllerTest.php
+++ b/tests/front/controller/visitor/FeedControllerTest.php
@@ -4,8 +4,8 @@ declare(strict_types=1);
4 4
5namespace Shaarli\Front\Controller\Visitor; 5namespace Shaarli\Front\Controller\Visitor;
6 6
7use PHPUnit\Framework\TestCase;
8use Shaarli\Feed\FeedBuilder; 7use Shaarli\Feed\FeedBuilder;
8use Shaarli\TestCase;
9use Slim\Http\Request; 9use Slim\Http\Request;
10use Slim\Http\Response; 10use Slim\Http\Response;
11 11
@@ -45,14 +45,16 @@ class FeedControllerTest extends TestCase
45 45
46 // Make sure that PluginManager hook is triggered 46 // Make sure that PluginManager hook is triggered
47 $this->container->pluginManager 47 $this->container->pluginManager
48 ->expects(static::at(0)) 48 ->expects(static::atLeastOnce())
49 ->method('executeHooks') 49 ->method('executeHooks')
50 ->withConsecutive(['render_feed'])
50 ->willReturnCallback(function (string $hook, array $data, array $param): void { 51 ->willReturnCallback(function (string $hook, array $data, array $param): void {
51 static::assertSame('render_feed', $hook); 52 if ('render_feed' === $hook) {
52 static::assertSame('data', $data['content']); 53 static::assertSame('data', $data['content']);
53 54
54 static::assertArrayHasKey('loggedin', $param); 55 static::assertArrayHasKey('loggedin', $param);
55 static::assertSame('rss', $param['target']); 56 static::assertSame('feed.rss', $param['target']);
57 }
56 }) 58 })
57 ; 59 ;
58 60
@@ -84,14 +86,16 @@ class FeedControllerTest extends TestCase
84 86
85 // Make sure that PluginManager hook is triggered 87 // Make sure that PluginManager hook is triggered
86 $this->container->pluginManager 88 $this->container->pluginManager
87 ->expects(static::at(0)) 89 ->expects(static::atLeastOnce())
88 ->method('executeHooks') 90 ->method('executeHooks')
91 ->withConsecutive(['render_feed'])
89 ->willReturnCallback(function (string $hook, array $data, array $param): void { 92 ->willReturnCallback(function (string $hook, array $data, array $param): void {
90 static::assertSame('render_feed', $hook); 93 if ('render_feed' === $hook) {
91 static::assertSame('data', $data['content']); 94 static::assertSame('data', $data['content']);
92 95
93 static::assertArrayHasKey('loggedin', $param); 96 static::assertArrayHasKey('loggedin', $param);
94 static::assertSame('atom', $param['target']); 97 static::assertSame('feed.atom', $param['target']);
98 }
95 }) 99 })
96 ; 100 ;
97 101
@@ -124,14 +128,16 @@ class FeedControllerTest extends TestCase
124 128
125 // Make sure that PluginManager hook is triggered 129 // Make sure that PluginManager hook is triggered
126 $this->container->pluginManager 130 $this->container->pluginManager
127 ->expects(static::at(0)) 131 ->expects(static::atLeastOnce())
128 ->method('executeHooks') 132 ->method('executeHooks')
133 ->withConsecutive(['render_feed'])
129 ->willReturnCallback(function (string $hook, array $data, array $param): void { 134 ->willReturnCallback(function (string $hook, array $data, array $param): void {
130 static::assertSame('render_feed', $hook); 135 if ('render_feed' === $hook) {
131 static::assertSame('data', $data['content']); 136 static::assertSame('data', $data['content']);
132 137
133 static::assertArrayHasKey('loggedin', $param); 138 static::assertArrayHasKey('loggedin', $param);
134 static::assertSame('atom', $param['target']); 139 static::assertSame('feed.atom', $param['target']);
140 }
135 }) 141 })
136 ; 142 ;
137 143
diff --git a/tests/front/controller/visitor/FrontControllerMockHelper.php b/tests/front/controller/visitor/FrontControllerMockHelper.php
index e0bd4ecf..fc0bb7d1 100644
--- a/tests/front/controller/visitor/FrontControllerMockHelper.php
+++ b/tests/front/controller/visitor/FrontControllerMockHelper.php
@@ -4,7 +4,6 @@ declare(strict_types=1);
4 4
5namespace Shaarli\Front\Controller\Visitor; 5namespace Shaarli\Front\Controller\Visitor;
6 6
7use PHPUnit\Framework\MockObject\MockObject;
8use Shaarli\Bookmark\BookmarkServiceInterface; 7use Shaarli\Bookmark\BookmarkServiceInterface;
9use Shaarli\Config\ConfigManager; 8use Shaarli\Config\ConfigManager;
10use Shaarli\Container\ShaarliTestContainer; 9use Shaarli\Container\ShaarliTestContainer;
@@ -79,8 +78,9 @@ trait FrontControllerMockHelper
79 $this->container->environment = [ 78 $this->container->environment = [
80 'SERVER_NAME' => 'shaarli', 79 'SERVER_NAME' => 'shaarli',
81 'SERVER_PORT' => '80', 80 'SERVER_PORT' => '80',
82 'REQUEST_URI' => '/daily-rss', 81 'REQUEST_URI' => '/subfolder/daily-rss',
83 'REMOTE_ADDR' => '1.2.3.4', 82 'REMOTE_ADDR' => '1.2.3.4',
83 'SCRIPT_NAME' => '/subfolder/index.php',
84 ]; 84 ];
85 85
86 $this->container->basePath = '/subfolder'; 86 $this->container->basePath = '/subfolder';
@@ -94,7 +94,6 @@ trait FrontControllerMockHelper
94 protected function assignTemplateVars(array &$variables): void 94 protected function assignTemplateVars(array &$variables): void
95 { 95 {
96 $this->container->pageBuilder 96 $this->container->pageBuilder
97 ->expects(static::atLeastOnce())
98 ->method('assign') 97 ->method('assign')
99 ->willReturnCallback(function ($key, $value) use (&$variables) { 98 ->willReturnCallback(function ($key, $value) use (&$variables) {
100 $variables[$key] = $value; 99 $variables[$key] = $value;
@@ -115,5 +114,5 @@ trait FrontControllerMockHelper
115 /** 114 /**
116 * Force to be used in PHPUnit context. 115 * Force to be used in PHPUnit context.
117 */ 116 */
118 protected abstract function createMock($originalClassName): MockObject; 117 protected abstract function isInTestsContext(): bool;
119} 118}
diff --git a/tests/front/controller/visitor/InstallControllerTest.php b/tests/front/controller/visitor/InstallControllerTest.php
index 3b855365..345ad544 100644
--- a/tests/front/controller/visitor/InstallControllerTest.php
+++ b/tests/front/controller/visitor/InstallControllerTest.php
@@ -4,10 +4,10 @@ declare(strict_types=1);
4 4
5namespace Shaarli\Front\Controller\Visitor; 5namespace Shaarli\Front\Controller\Visitor;
6 6
7use PHPUnit\Framework\TestCase;
8use Shaarli\Config\ConfigManager; 7use Shaarli\Config\ConfigManager;
9use Shaarli\Front\Exception\AlreadyInstalledException; 8use Shaarli\Front\Exception\AlreadyInstalledException;
10use Shaarli\Security\SessionManager; 9use Shaarli\Security\SessionManager;
10use Shaarli\TestCase;
11use Slim\Http\Request; 11use Slim\Http\Request;
12use Slim\Http\Response; 12use Slim\Http\Response;
13 13
@@ -257,6 +257,39 @@ class InstallControllerTest extends TestCase
257 static::assertSame('/subfolder/login', $result->getHeader('location')[0]); 257 static::assertSame('/subfolder/login', $result->getHeader('location')[0]);
258 258
259 static::assertSame('UTC', $confSettings['general.timezone']); 259 static::assertSame('UTC', $confSettings['general.timezone']);
260 static::assertSame('Shared bookmarks on http://shaarli', $confSettings['general.title']); 260 static::assertSame('Shared bookmarks on http://shaarli/subfolder/', $confSettings['general.title']);
261 }
262
263 /**
264 * Same test as testSaveInstallDefaultValues() but for an instance install in root directory.
265 */
266 public function testSaveInstallDefaultValuesWithoutSubfolder(): void
267 {
268 $confSettings = [];
269
270 $this->container->environment = [
271 'SERVER_NAME' => 'shaarli',
272 'SERVER_PORT' => '80',
273 'REQUEST_URI' => '/install',
274 'REMOTE_ADDR' => '1.2.3.4',
275 'SCRIPT_NAME' => '/index.php',
276 ];
277
278 $this->container->basePath = '';
279
280 $request = $this->createMock(Request::class);
281 $response = new Response();
282
283 $this->container->conf->method('set')->willReturnCallback(function (string $key, $value) use (&$confSettings) {
284 $confSettings[$key] = $value;
285 });
286
287 $result = $this->controller->save($request, $response);
288
289 static::assertSame(302, $result->getStatusCode());
290 static::assertSame('/login', $result->getHeader('location')[0]);
291
292 static::assertSame('UTC', $confSettings['general.timezone']);
293 static::assertSame('Shared bookmarks on http://shaarli/', $confSettings['general.title']);
261 } 294 }
262} 295}
diff --git a/tests/front/controller/visitor/LoginControllerTest.php b/tests/front/controller/visitor/LoginControllerTest.php
index 0a21f938..1312ccb7 100644
--- a/tests/front/controller/visitor/LoginControllerTest.php
+++ b/tests/front/controller/visitor/LoginControllerTest.php
@@ -4,13 +4,13 @@ declare(strict_types=1);
4 4
5namespace Shaarli\Front\Controller\Visitor; 5namespace Shaarli\Front\Controller\Visitor;
6 6
7use PHPUnit\Framework\TestCase;
8use Shaarli\Config\ConfigManager; 7use Shaarli\Config\ConfigManager;
9use Shaarli\Front\Exception\LoginBannedException; 8use Shaarli\Front\Exception\LoginBannedException;
10use Shaarli\Front\Exception\WrongTokenException; 9use Shaarli\Front\Exception\WrongTokenException;
11use Shaarli\Render\TemplatePage; 10use Shaarli\Render\TemplatePage;
12use Shaarli\Security\CookieManager; 11use Shaarli\Security\CookieManager;
13use Shaarli\Security\SessionManager; 12use Shaarli\Security\SessionManager;
13use Shaarli\TestCase;
14use Slim\Http\Request; 14use Slim\Http\Request;
15use Slim\Http\Response; 15use Slim\Http\Response;
16 16
diff --git a/tests/front/controller/visitor/OpenSearchControllerTest.php b/tests/front/controller/visitor/OpenSearchControllerTest.php
index 5f9f5b12..42d876c3 100644
--- a/tests/front/controller/visitor/OpenSearchControllerTest.php
+++ b/tests/front/controller/visitor/OpenSearchControllerTest.php
@@ -4,7 +4,7 @@ declare(strict_types=1);
4 4
5namespace Shaarli\Front\Controller\Visitor; 5namespace Shaarli\Front\Controller\Visitor;
6 6
7use PHPUnit\Framework\TestCase; 7use Shaarli\TestCase;
8use Slim\Http\Request; 8use Slim\Http\Request;
9use Slim\Http\Response; 9use Slim\Http\Response;
10 10
@@ -39,6 +39,6 @@ class OpenSearchControllerTest extends TestCase
39 $result->getHeader('Content-Type')[0] 39 $result->getHeader('Content-Type')[0]
40 ); 40 );
41 static::assertSame('opensearch', (string) $result->getBody()); 41 static::assertSame('opensearch', (string) $result->getBody());
42 static::assertSame('http://shaarli', $assignedVariables['serverurl']); 42 static::assertSame('http://shaarli/subfolder/', $assignedVariables['serverurl']);
43 } 43 }
44} 44}
diff --git a/tests/front/controller/visitor/PictureWallControllerTest.php b/tests/front/controller/visitor/PictureWallControllerTest.php
index 3dc3f292..b868231d 100644
--- a/tests/front/controller/visitor/PictureWallControllerTest.php
+++ b/tests/front/controller/visitor/PictureWallControllerTest.php
@@ -4,10 +4,10 @@ declare(strict_types=1);
4 4
5namespace Shaarli\Front\Controller\Visitor; 5namespace Shaarli\Front\Controller\Visitor;
6 6
7use PHPUnit\Framework\TestCase;
8use Shaarli\Bookmark\Bookmark; 7use Shaarli\Bookmark\Bookmark;
9use Shaarli\Config\ConfigManager; 8use Shaarli\Config\ConfigManager;
10use Shaarli\Front\Exception\ThumbnailsDisabledException; 9use Shaarli\Front\Exception\ThumbnailsDisabledException;
10use Shaarli\TestCase;
11use Shaarli\Thumbnailer; 11use Shaarli\Thumbnailer;
12use Slim\Http\Request; 12use Slim\Http\Request;
13use Slim\Http\Response; 13use Slim\Http\Response;
@@ -67,15 +67,17 @@ class PictureWallControllerTest extends TestCase
67 67
68 // Make sure that PluginManager hook is triggered 68 // Make sure that PluginManager hook is triggered
69 $this->container->pluginManager 69 $this->container->pluginManager
70 ->expects(static::at(0)) 70 ->expects(static::atLeastOnce())
71 ->method('executeHooks') 71 ->method('executeHooks')
72 ->withConsecutive(['render_picwall'])
72 ->willReturnCallback(function (string $hook, array $data, array $param): array { 73 ->willReturnCallback(function (string $hook, array $data, array $param): array {
73 static::assertSame('render_picwall', $hook); 74 if ('render_picwall' === $hook) {
74 static::assertArrayHasKey('linksToDisplay', $data); 75 static::assertArrayHasKey('linksToDisplay', $data);
75 static::assertCount(2, $data['linksToDisplay']); 76 static::assertCount(2, $data['linksToDisplay']);
76 static::assertSame(1, $data['linksToDisplay'][0]['id']); 77 static::assertSame(1, $data['linksToDisplay'][0]['id']);
77 static::assertSame(3, $data['linksToDisplay'][1]['id']); 78 static::assertSame(3, $data['linksToDisplay'][1]['id']);
78 static::assertArrayHasKey('loggedin', $param); 79 static::assertArrayHasKey('loggedin', $param);
80 }
79 81
80 return $data; 82 return $data;
81 }); 83 });
diff --git a/tests/front/controller/visitor/PublicSessionFilterControllerTest.php b/tests/front/controller/visitor/PublicSessionFilterControllerTest.php
index 06352750..7e3b00af 100644
--- a/tests/front/controller/visitor/PublicSessionFilterControllerTest.php
+++ b/tests/front/controller/visitor/PublicSessionFilterControllerTest.php
@@ -4,8 +4,8 @@ declare(strict_types=1);
4 4
5namespace Shaarli\Front\Controller\Visitor; 5namespace Shaarli\Front\Controller\Visitor;
6 6
7use PHPUnit\Framework\TestCase;
8use Shaarli\Security\SessionManager; 7use Shaarli\Security\SessionManager;
8use Shaarli\TestCase;
9use Slim\Http\Request; 9use Slim\Http\Request;
10use Slim\Http\Response; 10use Slim\Http\Response;
11 11
@@ -28,7 +28,7 @@ class PublicSessionFilterControllerTest extends TestCase
28 */ 28 */
29 public function testLinksPerPage(): void 29 public function testLinksPerPage(): void
30 { 30 {
31 $this->container->environment = ['HTTP_REFERER' => 'http://shaarli/subfolder/controller/?searchtag=abc']; 31 $this->container->environment['HTTP_REFERER'] = 'http://shaarli/subfolder/controller/?searchtag=abc';
32 32
33 $request = $this->createMock(Request::class); 33 $request = $this->createMock(Request::class);
34 $request->method('getParam')->with('nb')->willReturn('8'); 34 $request->method('getParam')->with('nb')->willReturn('8');
@@ -74,7 +74,7 @@ class PublicSessionFilterControllerTest extends TestCase
74 */ 74 */
75 public function testUntaggedOnly(): void 75 public function testUntaggedOnly(): void
76 { 76 {
77 $this->container->environment = ['HTTP_REFERER' => 'http://shaarli/subfolder/controller/?searchtag=abc']; 77 $this->container->environment['HTTP_REFERER'] = 'http://shaarli/subfolder/controller/?searchtag=abc';
78 78
79 $request = $this->createMock(Request::class); 79 $request = $this->createMock(Request::class);
80 $response = new Response(); 80 $response = new Response();
@@ -97,7 +97,7 @@ class PublicSessionFilterControllerTest extends TestCase
97 */ 97 */
98 public function testUntaggedOnlyToggleOff(): void 98 public function testUntaggedOnlyToggleOff(): void
99 { 99 {
100 $this->container->environment = ['HTTP_REFERER' => 'http://shaarli/subfolder/controller/?searchtag=abc']; 100 $this->container->environment['HTTP_REFERER'] = 'http://shaarli/subfolder/controller/?searchtag=abc';
101 101
102 $request = $this->createMock(Request::class); 102 $request = $this->createMock(Request::class);
103 $response = new Response(); 103 $response = new Response();
diff --git a/tests/front/controller/visitor/ShaarliVisitorControllerTest.php b/tests/front/controller/visitor/ShaarliVisitorControllerTest.php
index 316ce49c..935ec24e 100644
--- a/tests/front/controller/visitor/ShaarliVisitorControllerTest.php
+++ b/tests/front/controller/visitor/ShaarliVisitorControllerTest.php
@@ -4,8 +4,8 @@ declare(strict_types=1);
4 4
5namespace Shaarli\Front\Controller\Visitor; 5namespace Shaarli\Front\Controller\Visitor;
6 6
7use PHPUnit\Framework\TestCase;
8use Shaarli\Bookmark\BookmarkFilter; 7use Shaarli\Bookmark\BookmarkFilter;
8use Shaarli\TestCase;
9use Slim\Http\Request; 9use Slim\Http\Request;
10use Slim\Http\Response; 10use Slim\Http\Response;
11 11
@@ -110,7 +110,7 @@ class ShaarliVisitorControllerTest extends TestCase
110 */ 110 */
111 public function testRedirectFromRefererDefault(): void 111 public function testRedirectFromRefererDefault(): void
112 { 112 {
113 $this->container->environment['HTTP_REFERER'] = 'http://shaarli.tld/subfolder/controller?query=param&other=2'; 113 $this->container->environment['HTTP_REFERER'] = 'http://shaarli/subfolder/controller?query=param&other=2';
114 114
115 $response = new Response(); 115 $response = new Response();
116 116
@@ -125,7 +125,7 @@ class ShaarliVisitorControllerTest extends TestCase
125 */ 125 */
126 public function testRedirectFromRefererWithUnmatchedLoopTerm(): void 126 public function testRedirectFromRefererWithUnmatchedLoopTerm(): void
127 { 127 {
128 $this->container->environment['HTTP_REFERER'] = 'http://shaarli.tld/subfolder/controller?query=param&other=2'; 128 $this->container->environment['HTTP_REFERER'] = 'http://shaarli/subfolder/controller?query=param&other=2';
129 129
130 $response = new Response(); 130 $response = new Response();
131 131
@@ -140,7 +140,7 @@ class ShaarliVisitorControllerTest extends TestCase
140 */ 140 */
141 public function testRedirectFromRefererWithMatchingLoopTermInPath(): void 141 public function testRedirectFromRefererWithMatchingLoopTermInPath(): void
142 { 142 {
143 $this->container->environment['HTTP_REFERER'] = 'http://shaarli.tld/subfolder/controller?query=param&other=2'; 143 $this->container->environment['HTTP_REFERER'] = 'http://shaarli/subfolder/controller?query=param&other=2';
144 144
145 $response = new Response(); 145 $response = new Response();
146 146
@@ -155,7 +155,7 @@ class ShaarliVisitorControllerTest extends TestCase
155 */ 155 */
156 public function testRedirectFromRefererWithMatchingLoopTermInQueryParam(): void 156 public function testRedirectFromRefererWithMatchingLoopTermInQueryParam(): void
157 { 157 {
158 $this->container->environment['HTTP_REFERER'] = 'http://shaarli.tld/subfolder/controller?query=param&other=2'; 158 $this->container->environment['HTTP_REFERER'] = 'http://shaarli/subfolder/controller?query=param&other=2';
159 159
160 $response = new Response(); 160 $response = new Response();
161 161
@@ -171,7 +171,7 @@ class ShaarliVisitorControllerTest extends TestCase
171 */ 171 */
172 public function testRedirectFromRefererWithMatchingLoopTermInQueryValue(): void 172 public function testRedirectFromRefererWithMatchingLoopTermInQueryValue(): void
173 { 173 {
174 $this->container->environment['HTTP_REFERER'] = 'http://shaarli.tld/subfolder/controller?query=param&other=2'; 174 $this->container->environment['HTTP_REFERER'] = 'http://shaarli/subfolder/controller?query=param&other=2';
175 175
176 $response = new Response(); 176 $response = new Response();
177 177
@@ -187,7 +187,7 @@ class ShaarliVisitorControllerTest extends TestCase
187 */ 187 */
188 public function testRedirectFromRefererWithLoopTermInDomain(): void 188 public function testRedirectFromRefererWithLoopTermInDomain(): void
189 { 189 {
190 $this->container->environment['HTTP_REFERER'] = 'http://shaarli.tld/subfolder/controller?query=param&other=2'; 190 $this->container->environment['HTTP_REFERER'] = 'http://shaarli/subfolder/controller?query=param&other=2';
191 191
192 $response = new Response(); 192 $response = new Response();
193 193
@@ -203,7 +203,7 @@ class ShaarliVisitorControllerTest extends TestCase
203 */ 203 */
204 public function testRedirectFromRefererWithMatchingClearedParam(): void 204 public function testRedirectFromRefererWithMatchingClearedParam(): void
205 { 205 {
206 $this->container->environment['HTTP_REFERER'] = 'http://shaarli.tld/subfolder/controller?query=param&other=2'; 206 $this->container->environment['HTTP_REFERER'] = 'http://shaarli/subfolder/controller?query=param&other=2';
207 207
208 $response = new Response(); 208 $response = new Response();
209 209
@@ -212,4 +212,35 @@ class ShaarliVisitorControllerTest extends TestCase
212 static::assertSame(302, $result->getStatusCode()); 212 static::assertSame(302, $result->getStatusCode());
213 static::assertSame(['/subfolder/controller?other=2'], $result->getHeader('location')); 213 static::assertSame(['/subfolder/controller?other=2'], $result->getHeader('location'));
214 } 214 }
215
216 /**
217 * Test redirectFromReferer() - From another domain -> we ignore the given referrer.
218 */
219 public function testRedirectExternalReferer(): void
220 {
221 $this->container->environment['HTTP_REFERER'] = 'http://other.domain.tld/controller?query=param&other=2';
222
223 $response = new Response();
224
225 $result = $this->controller->redirectFromReferer($this->request, $response, ['query'], ['query']);
226
227 static::assertSame(302, $result->getStatusCode());
228 static::assertSame(['/subfolder/'], $result->getHeader('location'));
229 }
230
231 /**
232 * Test redirectFromReferer() - From another domain -> we ignore the given referrer.
233 */
234 public function testRedirectExternalRefererExplicitDomainName(): void
235 {
236 $this->container->environment['SERVER_NAME'] = 'my.shaarli.tld';
237 $this->container->environment['HTTP_REFERER'] = 'http://your.shaarli.tld/controller?query=param&other=2';
238
239 $response = new Response();
240
241 $result = $this->controller->redirectFromReferer($this->request, $response, ['query'], ['query']);
242
243 static::assertSame(302, $result->getStatusCode());
244 static::assertSame(['/subfolder/'], $result->getHeader('location'));
245 }
215} 246}
diff --git a/tests/front/controller/visitor/TagCloudControllerTest.php b/tests/front/controller/visitor/TagCloudControllerTest.php
index 9a6a4bc0..9305612e 100644
--- a/tests/front/controller/visitor/TagCloudControllerTest.php
+++ b/tests/front/controller/visitor/TagCloudControllerTest.php
@@ -4,8 +4,8 @@ declare(strict_types=1);
4 4
5namespace Shaarli\Front\Controller\Visitor; 5namespace Shaarli\Front\Controller\Visitor;
6 6
7use PHPUnit\Framework\TestCase;
8use Shaarli\Bookmark\BookmarkFilter; 7use Shaarli\Bookmark\BookmarkFilter;
8use Shaarli\TestCase;
9use Slim\Http\Request; 9use Slim\Http\Request;
10use Slim\Http\Response; 10use Slim\Http\Response;
11 11
@@ -53,14 +53,16 @@ class TagCloudControllerTest extends TestCase
53 53
54 // Make sure that PluginManager hook is triggered 54 // Make sure that PluginManager hook is triggered
55 $this->container->pluginManager 55 $this->container->pluginManager
56 ->expects(static::at(0)) 56 ->expects(static::atLeastOnce())
57 ->method('executeHooks') 57 ->method('executeHooks')
58 ->withConsecutive(['render_tagcloud'])
58 ->willReturnCallback(function (string $hook, array $data, array $param): array { 59 ->willReturnCallback(function (string $hook, array $data, array $param): array {
59 static::assertSame('render_tagcloud', $hook); 60 if ('render_tagcloud' === $hook) {
60 static::assertSame('', $data['search_tags']); 61 static::assertSame('', $data['search_tags']);
61 static::assertCount(3, $data['tags']); 62 static::assertCount(3, $data['tags']);
62 63
63 static::assertArrayHasKey('loggedin', $param); 64 static::assertArrayHasKey('loggedin', $param);
65 }
64 66
65 return $data; 67 return $data;
66 }) 68 })
@@ -124,14 +126,16 @@ class TagCloudControllerTest extends TestCase
124 126
125 // Make sure that PluginManager hook is triggered 127 // Make sure that PluginManager hook is triggered
126 $this->container->pluginManager 128 $this->container->pluginManager
127 ->expects(static::at(0)) 129 ->expects(static::atLeastOnce())
128 ->method('executeHooks') 130 ->method('executeHooks')
131 ->withConsecutive(['render_tagcloud'])
129 ->willReturnCallback(function (string $hook, array $data, array $param): array { 132 ->willReturnCallback(function (string $hook, array $data, array $param): array {
130 static::assertSame('render_tagcloud', $hook); 133 if ('render_tagcloud' === $hook) {
131 static::assertSame('ghi def', $data['search_tags']); 134 static::assertSame('ghi def', $data['search_tags']);
132 static::assertCount(1, $data['tags']); 135 static::assertCount(1, $data['tags']);
133 136
134 static::assertArrayHasKey('loggedin', $param); 137 static::assertArrayHasKey('loggedin', $param);
138 }
135 139
136 return $data; 140 return $data;
137 }) 141 })
@@ -175,14 +179,16 @@ class TagCloudControllerTest extends TestCase
175 179
176 // Make sure that PluginManager hook is triggered 180 // Make sure that PluginManager hook is triggered
177 $this->container->pluginManager 181 $this->container->pluginManager
178 ->expects(static::at(0)) 182 ->expects(static::atLeastOnce())
179 ->method('executeHooks') 183 ->method('executeHooks')
184 ->withConsecutive(['render_tagcloud'])
180 ->willReturnCallback(function (string $hook, array $data, array $param): array { 185 ->willReturnCallback(function (string $hook, array $data, array $param): array {
181 static::assertSame('render_tagcloud', $hook); 186 if ('render_tagcloud' === $hook) {
182 static::assertSame('', $data['search_tags']); 187 static::assertSame('', $data['search_tags']);
183 static::assertCount(0, $data['tags']); 188 static::assertCount(0, $data['tags']);
184 189
185 static::assertArrayHasKey('loggedin', $param); 190 static::assertArrayHasKey('loggedin', $param);
191 }
186 192
187 return $data; 193 return $data;
188 }) 194 })
@@ -227,14 +233,16 @@ class TagCloudControllerTest extends TestCase
227 233
228 // Make sure that PluginManager hook is triggered 234 // Make sure that PluginManager hook is triggered
229 $this->container->pluginManager 235 $this->container->pluginManager
230 ->expects(static::at(0)) 236 ->expects(static::atLeastOnce())
231 ->method('executeHooks') 237 ->method('executeHooks')
238 ->withConsecutive(['render_taglist'])
232 ->willReturnCallback(function (string $hook, array $data, array $param): array { 239 ->willReturnCallback(function (string $hook, array $data, array $param): array {
233 static::assertSame('render_taglist', $hook); 240 if ('render_taglist' === $hook) {
234 static::assertSame('', $data['search_tags']); 241 static::assertSame('', $data['search_tags']);
235 static::assertCount(3, $data['tags']); 242 static::assertCount(3, $data['tags']);
236 243
237 static::assertArrayHasKey('loggedin', $param); 244 static::assertArrayHasKey('loggedin', $param);
245 }
238 246
239 return $data; 247 return $data;
240 }) 248 })
@@ -297,14 +305,16 @@ class TagCloudControllerTest extends TestCase
297 305
298 // Make sure that PluginManager hook is triggered 306 // Make sure that PluginManager hook is triggered
299 $this->container->pluginManager 307 $this->container->pluginManager
300 ->expects(static::at(0)) 308 ->expects(static::atLeastOnce())
301 ->method('executeHooks') 309 ->method('executeHooks')
310 ->withConsecutive(['render_taglist'])
302 ->willReturnCallback(function (string $hook, array $data, array $param): array { 311 ->willReturnCallback(function (string $hook, array $data, array $param): array {
303 static::assertSame('render_taglist', $hook); 312 if ('render_taglist' === $hook) {
304 static::assertSame('ghi def', $data['search_tags']); 313 static::assertSame('ghi def', $data['search_tags']);
305 static::assertCount(1, $data['tags']); 314 static::assertCount(1, $data['tags']);
306 315
307 static::assertArrayHasKey('loggedin', $param); 316 static::assertArrayHasKey('loggedin', $param);
317 }
308 318
309 return $data; 319 return $data;
310 }) 320 })
@@ -344,14 +354,16 @@ class TagCloudControllerTest extends TestCase
344 354
345 // Make sure that PluginManager hook is triggered 355 // Make sure that PluginManager hook is triggered
346 $this->container->pluginManager 356 $this->container->pluginManager
347 ->expects(static::at(0)) 357 ->expects(static::atLeastOnce())
348 ->method('executeHooks') 358 ->method('executeHooks')
359 ->withConsecutive(['render_taglist'])
349 ->willReturnCallback(function (string $hook, array $data, array $param): array { 360 ->willReturnCallback(function (string $hook, array $data, array $param): array {
350 static::assertSame('render_taglist', $hook); 361 if ('render_taglist' === $hook) {
351 static::assertSame('', $data['search_tags']); 362 static::assertSame('', $data['search_tags']);
352 static::assertCount(0, $data['tags']); 363 static::assertCount(0, $data['tags']);
353 364
354 static::assertArrayHasKey('loggedin', $param); 365 static::assertArrayHasKey('loggedin', $param);
366 }
355 367
356 return $data; 368 return $data;
357 }) 369 })
diff --git a/tests/front/controller/visitor/TagControllerTest.php b/tests/front/controller/visitor/TagControllerTest.php
index 43076086..750ea02d 100644
--- a/tests/front/controller/visitor/TagControllerTest.php
+++ b/tests/front/controller/visitor/TagControllerTest.php
@@ -4,7 +4,7 @@ declare(strict_types=1);
4 4
5namespace Shaarli\Front\Controller\Visitor; 5namespace Shaarli\Front\Controller\Visitor;
6 6
7use PHPUnit\Framework\TestCase; 7use Shaarli\TestCase;
8use Slim\Http\Request; 8use Slim\Http\Request;
9use Slim\Http\Response; 9use Slim\Http\Response;
10 10
diff --git a/tests/http/HttpUtils/ClientIpIdTest.php b/tests/http/HttpUtils/ClientIpIdTest.php
index 982e57e0..3a0fcf30 100644
--- a/tests/http/HttpUtils/ClientIpIdTest.php
+++ b/tests/http/HttpUtils/ClientIpIdTest.php
@@ -10,7 +10,7 @@ require_once 'application/http/HttpUtils.php';
10/** 10/**
11 * Unitary tests for client_ip_id() 11 * Unitary tests for client_ip_id()
12 */ 12 */
13class ClientIpIdTest extends \PHPUnit\Framework\TestCase 13class ClientIpIdTest extends \Shaarli\TestCase
14{ 14{
15 /** 15 /**
16 * Get a remote client ID based on its IP 16 * Get a remote client ID based on its IP
diff --git a/tests/http/HttpUtils/GetHttpUrlTest.php b/tests/http/HttpUtils/GetHttpUrlTest.php
index 3dc5bc9b..a868ac02 100644
--- a/tests/http/HttpUtils/GetHttpUrlTest.php
+++ b/tests/http/HttpUtils/GetHttpUrlTest.php
@@ -10,7 +10,7 @@ require_once 'application/http/HttpUtils.php';
10/** 10/**
11 * Unitary tests for get_http_response() 11 * Unitary tests for get_http_response()
12 */ 12 */
13class GetHttpUrlTest extends \PHPUnit\Framework\TestCase 13class GetHttpUrlTest extends \Shaarli\TestCase
14{ 14{
15 /** 15 /**
16 * Get an invalid local URL 16 * Get an invalid local URL
diff --git a/tests/http/HttpUtils/GetIpAdressFromProxyTest.php b/tests/http/HttpUtils/GetIpAdressFromProxyTest.php
index fe3a639e..60cdb992 100644
--- a/tests/http/HttpUtils/GetIpAdressFromProxyTest.php
+++ b/tests/http/HttpUtils/GetIpAdressFromProxyTest.php
@@ -7,7 +7,7 @@ require_once 'application/http/HttpUtils.php';
7/** 7/**
8 * Unitary tests for getIpAddressFromProxy() 8 * Unitary tests for getIpAddressFromProxy()
9 */ 9 */
10class GetIpAdressFromProxyTest extends \PHPUnit\Framework\TestCase 10class GetIpAdressFromProxyTest extends \Shaarli\TestCase
11{ 11{
12 12
13 /** 13 /**
diff --git a/tests/http/HttpUtils/IndexUrlTest.php b/tests/http/HttpUtils/IndexUrlTest.php
index 73d33cd4..f283d119 100644
--- a/tests/http/HttpUtils/IndexUrlTest.php
+++ b/tests/http/HttpUtils/IndexUrlTest.php
@@ -5,12 +5,14 @@
5 5
6namespace Shaarli\Http; 6namespace Shaarli\Http;
7 7
8use Shaarli\TestCase;
9
8require_once 'application/http/HttpUtils.php'; 10require_once 'application/http/HttpUtils.php';
9 11
10/** 12/**
11 * Unitary tests for index_url() 13 * Unitary tests for index_url()
12 */ 14 */
13class IndexUrlTest extends \PHPUnit\Framework\TestCase 15class IndexUrlTest extends TestCase
14{ 16{
15 /** 17 /**
16 * If on the main page, remove "index.php" from the URL resource 18 * If on the main page, remove "index.php" from the URL resource
@@ -103,4 +105,36 @@ class IndexUrlTest extends \PHPUnit\Framework\TestCase
103 ) 105 )
104 ); 106 );
105 } 107 }
108
109 /**
110 * The route is stored in REQUEST_URI and subfolder
111 */
112 public function testPageUrlWithRouteUnderSubfolder()
113 {
114 $this->assertEquals(
115 'http://host.tld/subfolder/picture-wall',
116 page_url(
117 array(
118 'HTTPS' => 'Off',
119 'SERVER_NAME' => 'host.tld',
120 'SERVER_PORT' => '80',
121 'SCRIPT_NAME' => '/subfolder/index.php',
122 'REQUEST_URI' => '/subfolder/picture-wall',
123 )
124 )
125 );
126
127 $this->assertEquals(
128 'http://host.tld/subfolder/admin/picture-wall',
129 page_url(
130 array(
131 'HTTPS' => 'Off',
132 'SERVER_NAME' => 'host.tld',
133 'SERVER_PORT' => '80',
134 'SCRIPT_NAME' => '/subfolder/admin/index.php',
135 'REQUEST_URI' => '/subfolder/admin/picture-wall',
136 )
137 )
138 );
139 }
106} 140}
diff --git a/tests/http/HttpUtils/IndexUrlTestWithConstant.php b/tests/http/HttpUtils/IndexUrlTestWithConstant.php
new file mode 100644
index 00000000..ecaea724
--- /dev/null
+++ b/tests/http/HttpUtils/IndexUrlTestWithConstant.php
@@ -0,0 +1,51 @@
1<?php
2
3declare(strict_types=1);
4
5namespace Shaarli\Http;
6
7use Shaarli\TestCase;
8
9/**
10 * Test index_url with SHAARLI_ROOT_URL defined to override automatic retrieval.
11 * This should stay in its dedicated class to make sure to not alter other tests of the suite.
12 */
13class IndexUrlTestWithConstant extends TestCase
14{
15 public static function setUpBeforeClass(): void
16 {
17 define('SHAARLI_ROOT_URL', 'http://other-host.tld/subfolder/');
18 }
19
20 /**
21 * The route is stored in REQUEST_URI and subfolder
22 */
23 public function testIndexUrlWithConstantDefined()
24 {
25 $this->assertEquals(
26 'http://other-host.tld/subfolder/',
27 index_url(
28 array(
29 'HTTPS' => 'Off',
30 'SERVER_NAME' => 'host.tld',
31 'SERVER_PORT' => '80',
32 'SCRIPT_NAME' => '/index.php',
33 'REQUEST_URI' => '/picture-wall',
34 )
35 )
36 );
37
38 $this->assertEquals(
39 'http://other-host.tld/subfolder/',
40 index_url(
41 array(
42 'HTTPS' => 'Off',
43 'SERVER_NAME' => 'host.tld',
44 'SERVER_PORT' => '80',
45 'SCRIPT_NAME' => '/admin/index.php',
46 'REQUEST_URI' => '/admin/picture-wall',
47 )
48 )
49 );
50 }
51}
diff --git a/tests/http/HttpUtils/IsHttpsTest.php b/tests/http/HttpUtils/IsHttpsTest.php
index 348956c6..8b3fd93d 100644
--- a/tests/http/HttpUtils/IsHttpsTest.php
+++ b/tests/http/HttpUtils/IsHttpsTest.php
@@ -9,7 +9,7 @@ require_once 'application/http/HttpUtils.php';
9 * 9 *
10 * Test class for is_https() function. 10 * Test class for is_https() function.
11 */ 11 */
12class IsHttpsTest extends \PHPUnit\Framework\TestCase 12class IsHttpsTest extends \Shaarli\TestCase
13{ 13{
14 14
15 /** 15 /**
diff --git a/tests/http/HttpUtils/PageUrlTest.php b/tests/http/HttpUtils/PageUrlTest.php
index f1991716..ebb3e617 100644
--- a/tests/http/HttpUtils/PageUrlTest.php
+++ b/tests/http/HttpUtils/PageUrlTest.php
@@ -10,7 +10,7 @@ require_once 'application/http/HttpUtils.php';
10/** 10/**
11 * Unitary tests for page_url() 11 * Unitary tests for page_url()
12 */ 12 */
13class PageUrlTest extends \PHPUnit\Framework\TestCase 13class PageUrlTest extends \Shaarli\TestCase
14{ 14{
15 /** 15 /**
16 * If on the main page, remove "index.php" from the URL resource 16 * If on the main page, remove "index.php" from the URL resource
diff --git a/tests/http/HttpUtils/ServerUrlTest.php b/tests/http/HttpUtils/ServerUrlTest.php
index 9caf1049..339664e1 100644
--- a/tests/http/HttpUtils/ServerUrlTest.php
+++ b/tests/http/HttpUtils/ServerUrlTest.php
@@ -10,7 +10,7 @@ require_once 'application/http/HttpUtils.php';
10/** 10/**
11 * Unitary tests for server_url() 11 * Unitary tests for server_url()
12 */ 12 */
13class ServerUrlTest extends \PHPUnit\Framework\TestCase 13class ServerUrlTest extends \Shaarli\TestCase
14{ 14{
15 /** 15 /**
16 * Detect if the server uses SSL 16 * Detect if the server uses SSL
diff --git a/tests/http/UrlTest.php b/tests/http/UrlTest.php
index ae92f73a..c6b39c29 100644
--- a/tests/http/UrlTest.php
+++ b/tests/http/UrlTest.php
@@ -8,7 +8,7 @@ namespace Shaarli\Http;
8/** 8/**
9 * Unitary tests for URL utilities 9 * Unitary tests for URL utilities
10 */ 10 */
11class UrlTest extends \PHPUnit\Framework\TestCase 11class UrlTest extends \Shaarli\TestCase
12{ 12{
13 // base URL for tests 13 // base URL for tests
14 protected static $baseUrl = 'http://domain.tld:3000'; 14 protected static $baseUrl = 'http://domain.tld:3000';
diff --git a/tests/http/UrlUtils/CleanupUrlTest.php b/tests/http/UrlUtils/CleanupUrlTest.php
index 6c4d124b..45690ecf 100644
--- a/tests/http/UrlUtils/CleanupUrlTest.php
+++ b/tests/http/UrlUtils/CleanupUrlTest.php
@@ -7,7 +7,7 @@ namespace Shaarli\Http;
7 7
8require_once 'application/http/UrlUtils.php'; 8require_once 'application/http/UrlUtils.php';
9 9
10class CleanupUrlTest extends \PHPUnit\Framework\TestCase 10class CleanupUrlTest extends \Shaarli\TestCase
11{ 11{
12 /** 12 /**
13 * @var string reference URL 13 * @var string reference URL
diff --git a/tests/http/UrlUtils/GetUrlSchemeTest.php b/tests/http/UrlUtils/GetUrlSchemeTest.php
index 2b97f7be..18a9a5e5 100644
--- a/tests/http/UrlUtils/GetUrlSchemeTest.php
+++ b/tests/http/UrlUtils/GetUrlSchemeTest.php
@@ -7,7 +7,7 @@ namespace Shaarli\Http;
7 7
8require_once 'application/http/UrlUtils.php'; 8require_once 'application/http/UrlUtils.php';
9 9
10class GetUrlSchemeTest extends \PHPUnit\Framework\TestCase 10class GetUrlSchemeTest extends \Shaarli\TestCase
11{ 11{
12 /** 12 /**
13 * Get empty scheme string for empty UrlUtils 13 * Get empty scheme string for empty UrlUtils
diff --git a/tests/http/UrlUtils/UnparseUrlTest.php b/tests/http/UrlUtils/UnparseUrlTest.php
index 040d8c54..5e6246cc 100644
--- a/tests/http/UrlUtils/UnparseUrlTest.php
+++ b/tests/http/UrlUtils/UnparseUrlTest.php
@@ -10,7 +10,7 @@ require_once 'application/http/UrlUtils.php';
10/** 10/**
11 * Unitary tests for unparse_url() 11 * Unitary tests for unparse_url()
12 */ 12 */
13class UnparseUrlTest extends \PHPUnit\Framework\TestCase 13class UnparseUrlTest extends \Shaarli\TestCase
14{ 14{
15 /** 15 /**
16 * Thanks for building nothing 16 * Thanks for building nothing
diff --git a/tests/http/UrlUtils/WhitelistProtocolsTest.php b/tests/http/UrlUtils/WhitelistProtocolsTest.php
index 69512dbd..b8a6baaa 100644
--- a/tests/http/UrlUtils/WhitelistProtocolsTest.php
+++ b/tests/http/UrlUtils/WhitelistProtocolsTest.php
@@ -9,7 +9,7 @@ require_once 'application/http/UrlUtils.php';
9 * 9 *
10 * Test whitelist_protocols() function of UrlUtils. 10 * Test whitelist_protocols() function of UrlUtils.
11 */ 11 */
12class WhitelistProtocolsTest extends \PHPUnit\Framework\TestCase 12class WhitelistProtocolsTest extends \Shaarli\TestCase
13{ 13{
14 /** 14 /**
15 * Test whitelist_protocols() on a note (relative URL). 15 * Test whitelist_protocols() on a note (relative URL).
diff --git a/tests/languages/fr/LanguagesFrTest.php b/tests/languages/fr/LanguagesFrTest.php
index b8b7ca3a..d84feed1 100644
--- a/tests/languages/fr/LanguagesFrTest.php
+++ b/tests/languages/fr/LanguagesFrTest.php
@@ -12,7 +12,7 @@ use Shaarli\Config\ConfigManager;
12 * 12 *
13 * @package Shaarli 13 * @package Shaarli
14 */ 14 */
15class LanguagesFrTest extends \PHPUnit\Framework\TestCase 15class LanguagesFrTest extends \Shaarli\TestCase
16{ 16{
17 /** 17 /**
18 * @var string Config file path (without extension). 18 * @var string Config file path (without extension).
@@ -27,7 +27,7 @@ class LanguagesFrTest extends \PHPUnit\Framework\TestCase
27 /** 27 /**
28 * Init: force French 28 * Init: force French
29 */ 29 */
30 public function setUp() 30 protected function setUp(): void
31 { 31 {
32 $this->conf = new ConfigManager(self::$configFile); 32 $this->conf = new ConfigManager(self::$configFile);
33 $this->conf->set('translation.language', 'fr'); 33 $this->conf->set('translation.language', 'fr');
@@ -36,7 +36,7 @@ class LanguagesFrTest extends \PHPUnit\Framework\TestCase
36 /** 36 /**
37 * Reset the locale since gettext seems to mess with it, making it too long 37 * Reset the locale since gettext seems to mess with it, making it too long
38 */ 38 */
39 public static function tearDownAfterClass() 39 public static function tearDownAfterClass(): void
40 { 40 {
41 if (! empty(getenv('UT_LOCALE'))) { 41 if (! empty(getenv('UT_LOCALE'))) {
42 setlocale(LC_ALL, getenv('UT_LOCALE')); 42 setlocale(LC_ALL, getenv('UT_LOCALE'));
diff --git a/tests/legacy/LegacyControllerTest.php b/tests/legacy/LegacyControllerTest.php
index 759a5b2a..1a2549a3 100644
--- a/tests/legacy/LegacyControllerTest.php
+++ b/tests/legacy/LegacyControllerTest.php
@@ -4,8 +4,8 @@ declare(strict_types=1);
4 4
5namespace Shaarli\Legacy; 5namespace Shaarli\Legacy;
6 6
7use PHPUnit\Framework\TestCase;
8use Shaarli\Front\Controller\Visitor\FrontControllerMockHelper; 7use Shaarli\Front\Controller\Visitor\FrontControllerMockHelper;
8use Shaarli\TestCase;
9use Slim\Http\Request; 9use Slim\Http\Request;
10use Slim\Http\Response; 10use Slim\Http\Response;
11 11
@@ -66,11 +66,11 @@ class LegacyControllerTest extends TestCase
66 { 66 {
67 return [ 67 return [
68 ['post', [], '/admin/shaare', true], 68 ['post', [], '/admin/shaare', true],
69 ['post', [], '/login', false], 69 ['post', [], '/login?returnurl=/subfolder/admin/shaare', false],
70 ['post', ['title' => 'test'], '/admin/shaare?title=test', true], 70 ['post', ['title' => 'test'], '/admin/shaare?title=test', true],
71 ['post', ['title' => 'test'], '/login?title=test', false], 71 ['post', ['title' => 'test'], '/login?returnurl=/subfolder/admin/shaare?title=test', false],
72 ['addlink', [], '/admin/add-shaare', true], 72 ['addlink', [], '/admin/add-shaare', true],
73 ['addlink', [], '/login', false], 73 ['addlink', [], '/login?returnurl=/subfolder/admin/add-shaare', false],
74 ['login', [], '/login', true], 74 ['login', [], '/login', true],
75 ['login', [], '/login', false], 75 ['login', [], '/login', false],
76 ['logout', [], '/admin/logout', true], 76 ['logout', [], '/admin/logout', true],
@@ -94,6 +94,8 @@ class LegacyControllerTest extends TestCase
94 ['opensearch', [], '/open-search', true], 94 ['opensearch', [], '/open-search', true],
95 ['dailyrss', [], '/daily-rss', false], 95 ['dailyrss', [], '/daily-rss', false],
96 ['dailyrss', [], '/daily-rss', true], 96 ['dailyrss', [], '/daily-rss', true],
97 ['configure', [], '/login?returnurl=/subfolder/admin/configure', false],
98 ['configure', [], '/admin/configure', true],
97 ]; 99 ];
98 } 100 }
99} 101}
diff --git a/tests/legacy/LegacyLinkDBTest.php b/tests/legacy/LegacyLinkDBTest.php
index 0884ad03..df2cad62 100644
--- a/tests/legacy/LegacyLinkDBTest.php
+++ b/tests/legacy/LegacyLinkDBTest.php
@@ -18,7 +18,7 @@ require_once 'tests/utils/ReferenceLinkDB.php';
18/** 18/**
19 * Unitary tests for LegacyLinkDBTest 19 * Unitary tests for LegacyLinkDBTest
20 */ 20 */
21class LegacyLinkDBTest extends \PHPUnit\Framework\TestCase 21class LegacyLinkDBTest extends \Shaarli\TestCase
22{ 22{
23 // datastore to test write operations 23 // datastore to test write operations
24 protected static $testDatastore = 'sandbox/datastore.php'; 24 protected static $testDatastore = 'sandbox/datastore.php';
@@ -52,7 +52,7 @@ class LegacyLinkDBTest extends \PHPUnit\Framework\TestCase
52 * 52 *
53 * Resets test data for each test 53 * Resets test data for each test
54 */ 54 */
55 protected function setUp() 55 protected function setUp(): void
56 { 56 {
57 if (file_exists(self::$testDatastore)) { 57 if (file_exists(self::$testDatastore)) {
58 unlink(self::$testDatastore); 58 unlink(self::$testDatastore);
@@ -99,12 +99,12 @@ class LegacyLinkDBTest extends \PHPUnit\Framework\TestCase
99 99
100 /** 100 /**
101 * Attempt to instantiate a LinkDB whereas the datastore is not writable 101 * Attempt to instantiate a LinkDB whereas the datastore is not writable
102 *
103 * @expectedException Shaarli\Exceptions\IOException
104 * @expectedExceptionMessageRegExp /Error accessing "null"/
105 */ 102 */
106 public function testConstructDatastoreNotWriteable() 103 public function testConstructDatastoreNotWriteable()
107 { 104 {
105 $this->expectException(\Shaarli\Exceptions\IOException::class);
106 $this->expectExceptionMessageRegExp('/Error accessing "null"/');
107
108 new LegacyLinkDB('null/store.db', false, false); 108 new LegacyLinkDB('null/store.db', false, false);
109 } 109 }
110 110
@@ -257,7 +257,7 @@ class LegacyLinkDBTest extends \PHPUnit\Framework\TestCase
257 $link = self::$publicLinkDB->getLinkFromUrl('http://mediagoblin.org/'); 257 $link = self::$publicLinkDB->getLinkFromUrl('http://mediagoblin.org/');
258 258
259 $this->assertNotEquals(false, $link); 259 $this->assertNotEquals(false, $link);
260 $this->assertContains( 260 $this->assertContainsPolyfill(
261 'A free software media publishing platform', 261 'A free software media publishing platform',
262 $link['description'] 262 $link['description']
263 ); 263 );
@@ -420,22 +420,22 @@ class LegacyLinkDBTest extends \PHPUnit\Framework\TestCase
420 420
421 /** 421 /**
422 * Test filterHash() with an invalid smallhash. 422 * Test filterHash() with an invalid smallhash.
423 *
424 * @expectedException \Shaarli\Bookmark\Exception\BookmarkNotFoundException
425 */ 423 */
426 public function testFilterHashInValid1() 424 public function testFilterHashInValid1()
427 { 425 {
426 $this->expectException(\Shaarli\Bookmark\Exception\BookmarkNotFoundException::class);
427
428 $request = 'blabla'; 428 $request = 'blabla';
429 self::$publicLinkDB->filterHash($request); 429 self::$publicLinkDB->filterHash($request);
430 } 430 }
431 431
432 /** 432 /**
433 * Test filterHash() with an empty smallhash. 433 * Test filterHash() with an empty smallhash.
434 *
435 * @expectedException \Shaarli\Bookmark\Exception\BookmarkNotFoundException
436 */ 434 */
437 public function testFilterHashInValid() 435 public function testFilterHashInValid()
438 { 436 {
437 $this->expectException(\Shaarli\Bookmark\Exception\BookmarkNotFoundException::class);
438
439 self::$publicLinkDB->filterHash(''); 439 self::$publicLinkDB->filterHash('');
440 } 440 }
441 441
@@ -470,9 +470,9 @@ class LegacyLinkDBTest extends \PHPUnit\Framework\TestCase
470 470
471 $res = $linkDB->renameTag('cartoon', 'Taz'); 471 $res = $linkDB->renameTag('cartoon', 'Taz');
472 $this->assertEquals(3, count($res)); 472 $this->assertEquals(3, count($res));
473 $this->assertContains(' Taz ', $linkDB[4]['tags']); 473 $this->assertContainsPolyfill(' Taz ', $linkDB[4]['tags']);
474 $this->assertContains(' Taz ', $linkDB[1]['tags']); 474 $this->assertContainsPolyfill(' Taz ', $linkDB[1]['tags']);
475 $this->assertContains(' Taz ', $linkDB[0]['tags']); 475 $this->assertContainsPolyfill(' Taz ', $linkDB[0]['tags']);
476 } 476 }
477 477
478 /** 478 /**
@@ -512,7 +512,7 @@ class LegacyLinkDBTest extends \PHPUnit\Framework\TestCase
512 512
513 $res = $linkDB->renameTag('cartoon', null); 513 $res = $linkDB->renameTag('cartoon', null);
514 $this->assertEquals(3, count($res)); 514 $this->assertEquals(3, count($res));
515 $this->assertNotContains('cartoon', $linkDB[4]['tags']); 515 $this->assertNotContainsPolyfill('cartoon', $linkDB[4]['tags']);
516 } 516 }
517 517
518 /** 518 /**
diff --git a/tests/legacy/LegacyLinkFilterTest.php b/tests/legacy/LegacyLinkFilterTest.php
index ba9ec529..45d7754d 100644
--- a/tests/legacy/LegacyLinkFilterTest.php
+++ b/tests/legacy/LegacyLinkFilterTest.php
@@ -10,7 +10,7 @@ use Shaarli\Legacy\LegacyLinkFilter;
10/** 10/**
11 * Class LegacyLinkFilterTest. 11 * Class LegacyLinkFilterTest.
12 */ 12 */
13class LegacyLinkFilterTest extends \PHPUnit\Framework\TestCase 13class LegacyLinkFilterTest extends \Shaarli\TestCase
14{ 14{
15 /** 15 /**
16 * @var string Test datastore path. 16 * @var string Test datastore path.
@@ -34,7 +34,7 @@ class LegacyLinkFilterTest extends \PHPUnit\Framework\TestCase
34 /** 34 /**
35 * Instantiate linkFilter with ReferenceLinkDB data. 35 * Instantiate linkFilter with ReferenceLinkDB data.
36 */ 36 */
37 public static function setUpBeforeClass() 37 public static function setUpBeforeClass(): void
38 { 38 {
39 self::$refDB = new ReferenceLinkDB(true); 39 self::$refDB = new ReferenceLinkDB(true);
40 self::$refDB->write(self::$testDatastore); 40 self::$refDB->write(self::$testDatastore);
@@ -197,21 +197,23 @@ class LegacyLinkFilterTest extends \PHPUnit\Framework\TestCase
197 197
198 /** 198 /**
199 * Use an invalid date format 199 * Use an invalid date format
200 * @expectedException Exception
201 * @expectedExceptionMessageRegExp /Invalid date format/
202 */ 200 */
203 public function testFilterInvalidDayWithChars() 201 public function testFilterInvalidDayWithChars()
204 { 202 {
203 $this->expectException(\Exception::class);
204 $this->expectExceptionMessageRegExp('/Invalid date format/');
205
205 self::$linkFilter->filter(LegacyLinkFilter::$FILTER_DAY, 'Rainy day, dream away'); 206 self::$linkFilter->filter(LegacyLinkFilter::$FILTER_DAY, 'Rainy day, dream away');
206 } 207 }
207 208
208 /** 209 /**
209 * Use an invalid date format 210 * Use an invalid date format
210 * @expectedException Exception
211 * @expectedExceptionMessageRegExp /Invalid date format/
212 */ 211 */
213 public function testFilterInvalidDayDigits() 212 public function testFilterInvalidDayDigits()
214 { 213 {
214 $this->expectException(\Exception::class);
215 $this->expectExceptionMessageRegExp('/Invalid date format/');
216
215 self::$linkFilter->filter(LegacyLinkFilter::$FILTER_DAY, '20'); 217 self::$linkFilter->filter(LegacyLinkFilter::$FILTER_DAY, '20');
216 } 218 }
217 219
@@ -235,11 +237,11 @@ class LegacyLinkFilterTest extends \PHPUnit\Framework\TestCase
235 237
236 /** 238 /**
237 * No link for this hash 239 * No link for this hash
238 *
239 * @expectedException \Shaarli\Bookmark\Exception\BookmarkNotFoundException
240 */ 240 */
241 public function testFilterUnknownSmallHash() 241 public function testFilterUnknownSmallHash()
242 { 242 {
243 $this->expectException(\Shaarli\Bookmark\Exception\BookmarkNotFoundException::class);
244
243 self::$linkFilter->filter(LegacyLinkFilter::$FILTER_HASH, 'Iblaah'); 245 self::$linkFilter->filter(LegacyLinkFilter::$FILTER_HASH, 'Iblaah');
244 } 246 }
245 247
diff --git a/tests/legacy/LegacyRouterTest.php b/tests/legacy/LegacyRouterTest.php
deleted file mode 100644
index c2019ca7..00000000
--- a/tests/legacy/LegacyRouterTest.php
+++ /dev/null
@@ -1,512 +0,0 @@
1<?php
2
3namespace Shaarli\Legacy;
4
5use PHPUnit\Framework\TestCase;
6
7/**
8 * Unit tests for Router
9 */
10class LegacyRouterTest extends TestCase
11{
12 /**
13 * Test findPage: login page output.
14 * Valid: page should be return.
15 *
16 * @return void
17 */
18 public function testFindPageLoginValid()
19 {
20 $this->assertEquals(
21 LegacyRouter::$PAGE_LOGIN,
22 LegacyRouter::findPage('do=login', array(), false)
23 );
24
25 $this->assertEquals(
26 LegacyRouter::$PAGE_LOGIN,
27 LegacyRouter::findPage('do=login', array(), 1)
28 );
29
30 $this->assertEquals(
31 LegacyRouter::$PAGE_LOGIN,
32 LegacyRouter::findPage('do=login&stuff', array(), false)
33 );
34 }
35
36 /**
37 * Test findPage: login page output.
38 * Invalid: page shouldn't be return.
39 *
40 * @return void
41 */
42 public function testFindPageLoginInvalid()
43 {
44 $this->assertNotEquals(
45 LegacyRouter::$PAGE_LOGIN,
46 LegacyRouter::findPage('do=login', array(), true)
47 );
48
49 $this->assertNotEquals(
50 LegacyRouter::$PAGE_LOGIN,
51 LegacyRouter::findPage('do=other', array(), false)
52 );
53 }
54
55 /**
56 * Test findPage: picwall page output.
57 * Valid: page should be return.
58 *
59 * @return void
60 */
61 public function testFindPagePicwallValid()
62 {
63 $this->assertEquals(
64 LegacyRouter::$PAGE_PICWALL,
65 LegacyRouter::findPage('do=picwall', array(), false)
66 );
67
68 $this->assertEquals(
69 LegacyRouter::$PAGE_PICWALL,
70 LegacyRouter::findPage('do=picwall', array(), true)
71 );
72 }
73
74 /**
75 * Test findPage: picwall page output.
76 * Invalid: page shouldn't be return.
77 *
78 * @return void
79 */
80 public function testFindPagePicwallInvalid()
81 {
82 $this->assertEquals(
83 LegacyRouter::$PAGE_PICWALL,
84 LegacyRouter::findPage('do=picwall&stuff', array(), false)
85 );
86
87 $this->assertNotEquals(
88 LegacyRouter::$PAGE_PICWALL,
89 LegacyRouter::findPage('do=other', array(), false)
90 );
91 }
92
93 /**
94 * Test findPage: tagcloud page output.
95 * Valid: page should be return.
96 *
97 * @return void
98 */
99 public function testFindPageTagcloudValid()
100 {
101 $this->assertEquals(
102 LegacyRouter::$PAGE_TAGCLOUD,
103 LegacyRouter::findPage('do=tagcloud', array(), false)
104 );
105
106 $this->assertEquals(
107 LegacyRouter::$PAGE_TAGCLOUD,
108 LegacyRouter::findPage('do=tagcloud', array(), true)
109 );
110
111 $this->assertEquals(
112 LegacyRouter::$PAGE_TAGCLOUD,
113 LegacyRouter::findPage('do=tagcloud&stuff', array(), false)
114 );
115 }
116
117 /**
118 * Test findPage: tagcloud page output.
119 * Invalid: page shouldn't be return.
120 *
121 * @return void
122 */
123 public function testFindPageTagcloudInvalid()
124 {
125 $this->assertNotEquals(
126 LegacyRouter::$PAGE_TAGCLOUD,
127 LegacyRouter::findPage('do=other', array(), false)
128 );
129 }
130
131 /**
132 * Test findPage: linklist page output.
133 * Valid: page should be return.
134 *
135 * @return void
136 */
137 public function testFindPageLinklistValid()
138 {
139 $this->assertEquals(
140 LegacyRouter::$PAGE_LINKLIST,
141 LegacyRouter::findPage('', array(), true)
142 );
143
144 $this->assertEquals(
145 LegacyRouter::$PAGE_LINKLIST,
146 LegacyRouter::findPage('whatever', array(), true)
147 );
148
149 $this->assertEquals(
150 LegacyRouter::$PAGE_LINKLIST,
151 LegacyRouter::findPage('whatever', array(), false)
152 );
153
154 $this->assertEquals(
155 LegacyRouter::$PAGE_LINKLIST,
156 LegacyRouter::findPage('do=tools', array(), false)
157 );
158 }
159
160 /**
161 * Test findPage: tools page output.
162 * Valid: page should be return.
163 *
164 * @return void
165 */
166 public function testFindPageToolsValid()
167 {
168 $this->assertEquals(
169 LegacyRouter::$PAGE_TOOLS,
170 LegacyRouter::findPage('do=tools', array(), true)
171 );
172
173 $this->assertEquals(
174 LegacyRouter::$PAGE_TOOLS,
175 LegacyRouter::findPage('do=tools&stuff', array(), true)
176 );
177 }
178
179 /**
180 * Test findPage: tools page output.
181 * Invalid: page shouldn't be return.
182 *
183 * @return void
184 */
185 public function testFindPageToolsInvalid()
186 {
187 $this->assertNotEquals(
188 LegacyRouter::$PAGE_TOOLS,
189 LegacyRouter::findPage('do=tools', array(), 1)
190 );
191
192 $this->assertNotEquals(
193 LegacyRouter::$PAGE_TOOLS,
194 LegacyRouter::findPage('do=tools', array(), false)
195 );
196
197 $this->assertNotEquals(
198 LegacyRouter::$PAGE_TOOLS,
199 LegacyRouter::findPage('do=other', array(), true)
200 );
201 }
202
203 /**
204 * Test findPage: changepasswd page output.
205 * Valid: page should be return.
206 *
207 * @return void
208 */
209 public function testFindPageChangepasswdValid()
210 {
211 $this->assertEquals(
212 LegacyRouter::$PAGE_CHANGEPASSWORD,
213 LegacyRouter::findPage('do=changepasswd', array(), true)
214 );
215 $this->assertEquals(
216 LegacyRouter::$PAGE_CHANGEPASSWORD,
217 LegacyRouter::findPage('do=changepasswd&stuff', array(), true)
218 );
219 }
220
221 /**
222 * Test findPage: changepasswd page output.
223 * Invalid: page shouldn't be return.
224 *
225 * @return void
226 */
227 public function testFindPageChangepasswdInvalid()
228 {
229 $this->assertNotEquals(
230 LegacyRouter::$PAGE_CHANGEPASSWORD,
231 LegacyRouter::findPage('do=changepasswd', array(), 1)
232 );
233
234 $this->assertNotEquals(
235 LegacyRouter::$PAGE_CHANGEPASSWORD,
236 LegacyRouter::findPage('do=changepasswd', array(), false)
237 );
238
239 $this->assertNotEquals(
240 LegacyRouter::$PAGE_CHANGEPASSWORD,
241 LegacyRouter::findPage('do=other', array(), true)
242 );
243 }
244 /**
245 * Test findPage: configure page output.
246 * Valid: page should be return.
247 *
248 * @return void
249 */
250 public function testFindPageConfigureValid()
251 {
252 $this->assertEquals(
253 LegacyRouter::$PAGE_CONFIGURE,
254 LegacyRouter::findPage('do=configure', array(), true)
255 );
256
257 $this->assertEquals(
258 LegacyRouter::$PAGE_CONFIGURE,
259 LegacyRouter::findPage('do=configure&stuff', array(), true)
260 );
261 }
262
263 /**
264 * Test findPage: configure page output.
265 * Invalid: page shouldn't be return.
266 *
267 * @return void
268 */
269 public function testFindPageConfigureInvalid()
270 {
271 $this->assertNotEquals(
272 LegacyRouter::$PAGE_CONFIGURE,
273 LegacyRouter::findPage('do=configure', array(), 1)
274 );
275
276 $this->assertNotEquals(
277 LegacyRouter::$PAGE_CONFIGURE,
278 LegacyRouter::findPage('do=configure', array(), false)
279 );
280
281 $this->assertNotEquals(
282 LegacyRouter::$PAGE_CONFIGURE,
283 LegacyRouter::findPage('do=other', array(), true)
284 );
285 }
286
287 /**
288 * Test findPage: changetag page output.
289 * Valid: page should be return.
290 *
291 * @return void
292 */
293 public function testFindPageChangetagValid()
294 {
295 $this->assertEquals(
296 LegacyRouter::$PAGE_CHANGETAG,
297 LegacyRouter::findPage('do=changetag', array(), true)
298 );
299
300 $this->assertEquals(
301 LegacyRouter::$PAGE_CHANGETAG,
302 LegacyRouter::findPage('do=changetag&stuff', array(), true)
303 );
304 }
305
306 /**
307 * Test findPage: changetag page output.
308 * Invalid: page shouldn't be return.
309 *
310 * @return void
311 */
312 public function testFindPageChangetagInvalid()
313 {
314 $this->assertNotEquals(
315 LegacyRouter::$PAGE_CHANGETAG,
316 LegacyRouter::findPage('do=changetag', array(), 1)
317 );
318
319 $this->assertNotEquals(
320 LegacyRouter::$PAGE_CHANGETAG,
321 LegacyRouter::findPage('do=changetag', array(), false)
322 );
323
324 $this->assertNotEquals(
325 LegacyRouter::$PAGE_CHANGETAG,
326 LegacyRouter::findPage('do=other', array(), true)
327 );
328 }
329
330 /**
331 * Test findPage: addlink page output.
332 * Valid: page should be return.
333 *
334 * @return void
335 */
336 public function testFindPageAddlinkValid()
337 {
338 $this->assertEquals(
339 LegacyRouter::$PAGE_ADDLINK,
340 LegacyRouter::findPage('do=addlink', array(), true)
341 );
342
343 $this->assertEquals(
344 LegacyRouter::$PAGE_ADDLINK,
345 LegacyRouter::findPage('do=addlink&stuff', array(), true)
346 );
347 }
348
349 /**
350 * Test findPage: addlink page output.
351 * Invalid: page shouldn't be return.
352 *
353 * @return void
354 */
355 public function testFindPageAddlinkInvalid()
356 {
357 $this->assertNotEquals(
358 LegacyRouter::$PAGE_ADDLINK,
359 LegacyRouter::findPage('do=addlink', array(), 1)
360 );
361
362 $this->assertNotEquals(
363 LegacyRouter::$PAGE_ADDLINK,
364 LegacyRouter::findPage('do=addlink', array(), false)
365 );
366
367 $this->assertNotEquals(
368 LegacyRouter::$PAGE_ADDLINK,
369 LegacyRouter::findPage('do=other', array(), true)
370 );
371 }
372
373 /**
374 * Test findPage: export page output.
375 * Valid: page should be return.
376 *
377 * @return void
378 */
379 public function testFindPageExportValid()
380 {
381 $this->assertEquals(
382 LegacyRouter::$PAGE_EXPORT,
383 LegacyRouter::findPage('do=export', array(), true)
384 );
385
386 $this->assertEquals(
387 LegacyRouter::$PAGE_EXPORT,
388 LegacyRouter::findPage('do=export&stuff', array(), true)
389 );
390 }
391
392 /**
393 * Test findPage: export page output.
394 * Invalid: page shouldn't be return.
395 *
396 * @return void
397 */
398 public function testFindPageExportInvalid()
399 {
400 $this->assertNotEquals(
401 LegacyRouter::$PAGE_EXPORT,
402 LegacyRouter::findPage('do=export', array(), 1)
403 );
404
405 $this->assertNotEquals(
406 LegacyRouter::$PAGE_EXPORT,
407 LegacyRouter::findPage('do=export', array(), false)
408 );
409
410 $this->assertNotEquals(
411 LegacyRouter::$PAGE_EXPORT,
412 LegacyRouter::findPage('do=other', array(), true)
413 );
414 }
415
416 /**
417 * Test findPage: import page output.
418 * Valid: page should be return.
419 *
420 * @return void
421 */
422 public function testFindPageImportValid()
423 {
424 $this->assertEquals(
425 LegacyRouter::$PAGE_IMPORT,
426 LegacyRouter::findPage('do=import', array(), true)
427 );
428
429 $this->assertEquals(
430 LegacyRouter::$PAGE_IMPORT,
431 LegacyRouter::findPage('do=import&stuff', array(), true)
432 );
433 }
434
435 /**
436 * Test findPage: import page output.
437 * Invalid: page shouldn't be return.
438 *
439 * @return void
440 */
441 public function testFindPageImportInvalid()
442 {
443 $this->assertNotEquals(
444 LegacyRouter::$PAGE_IMPORT,
445 LegacyRouter::findPage('do=import', array(), 1)
446 );
447
448 $this->assertNotEquals(
449 LegacyRouter::$PAGE_IMPORT,
450 LegacyRouter::findPage('do=import', array(), false)
451 );
452
453 $this->assertNotEquals(
454 LegacyRouter::$PAGE_IMPORT,
455 LegacyRouter::findPage('do=other', array(), true)
456 );
457 }
458
459 /**
460 * Test findPage: editlink page output.
461 * Valid: page should be return.
462 *
463 * @return void
464 */
465 public function testFindPageEditlinkValid()
466 {
467 $this->assertEquals(
468 LegacyRouter::$PAGE_EDITLINK,
469 LegacyRouter::findPage('whatever', array('edit_link' => 1), true)
470 );
471
472 $this->assertEquals(
473 LegacyRouter::$PAGE_EDITLINK,
474 LegacyRouter::findPage('', array('edit_link' => 1), true)
475 );
476
477
478 $this->assertEquals(
479 LegacyRouter::$PAGE_EDITLINK,
480 LegacyRouter::findPage('whatever', array('post' => 1), true)
481 );
482
483 $this->assertEquals(
484 LegacyRouter::$PAGE_EDITLINK,
485 LegacyRouter::findPage('whatever', array('post' => 1, 'edit_link' => 1), true)
486 );
487 }
488
489 /**
490 * Test findPage: editlink page output.
491 * Invalid: page shouldn't be return.
492 *
493 * @return void
494 */
495 public function testFindPageEditlinkInvalid()
496 {
497 $this->assertNotEquals(
498 LegacyRouter::$PAGE_EDITLINK,
499 LegacyRouter::findPage('whatever', array('edit_link' => 1), false)
500 );
501
502 $this->assertNotEquals(
503 LegacyRouter::$PAGE_EDITLINK,
504 LegacyRouter::findPage('whatever', array('edit_link' => 1), 1)
505 );
506
507 $this->assertNotEquals(
508 LegacyRouter::$PAGE_EDITLINK,
509 LegacyRouter::findPage('whatever', array(), true)
510 );
511 }
512}
diff --git a/tests/legacy/LegacyUpdaterTest.php b/tests/legacy/LegacyUpdaterTest.php
index 7c429811..f7391b86 100644
--- a/tests/legacy/LegacyUpdaterTest.php
+++ b/tests/legacy/LegacyUpdaterTest.php
@@ -20,7 +20,7 @@ require_once 'inc/rain.tpl.class.php';
20 * Class UpdaterTest. 20 * Class UpdaterTest.
21 * Runs unit tests against the updater class. 21 * Runs unit tests against the updater class.
22 */ 22 */
23class LegacyUpdaterTest extends \PHPUnit\Framework\TestCase 23class LegacyUpdaterTest extends \Shaarli\TestCase
24{ 24{
25 /** 25 /**
26 * @var string Path to test datastore. 26 * @var string Path to test datastore.
@@ -40,7 +40,7 @@ class LegacyUpdaterTest extends \PHPUnit\Framework\TestCase
40 /** 40 /**
41 * Executed before each test. 41 * Executed before each test.
42 */ 42 */
43 public function setUp() 43 protected function setUp(): void
44 { 44 {
45 copy('tests/utils/config/configJson.json.php', self::$configFile .'.json.php'); 45 copy('tests/utils/config/configJson.json.php', self::$configFile .'.json.php');
46 $this->conf = new ConfigManager(self::$configFile); 46 $this->conf = new ConfigManager(self::$configFile);
@@ -80,23 +80,23 @@ class LegacyUpdaterTest extends \PHPUnit\Framework\TestCase
80 80
81 /** 81 /**
82 * Test errors in UpdaterUtils::write_updates_file(): empty updates file. 82 * Test errors in UpdaterUtils::write_updates_file(): empty updates file.
83 *
84 * @expectedException Exception
85 * @expectedExceptionMessageRegExp /Updates file path is not set(.*)/
86 */ 83 */
87 public function testWriteEmptyUpdatesFile() 84 public function testWriteEmptyUpdatesFile()
88 { 85 {
86 $this->expectException(\Exception::class);
87 $this->expectExceptionMessageRegExp('/Updates file path is not set(.*)/');
88
89 UpdaterUtils::write_updates_file('', array('test')); 89 UpdaterUtils::write_updates_file('', array('test'));
90 } 90 }
91 91
92 /** 92 /**
93 * Test errors in UpdaterUtils::write_updates_file(): not writable updates file. 93 * Test errors in UpdaterUtils::write_updates_file(): not writable updates file.
94 *
95 * @expectedException Exception
96 * @expectedExceptionMessageRegExp /Unable to write(.*)/
97 */ 94 */
98 public function testWriteUpdatesFileNotWritable() 95 public function testWriteUpdatesFileNotWritable()
99 { 96 {
97 $this->expectException(\Exception::class);
98 $this->expectExceptionMessageRegExp('/Unable to write(.*)/');
99
100 $updatesFile = $this->conf->get('resource.data_dir') . '/updates.txt'; 100 $updatesFile = $this->conf->get('resource.data_dir') . '/updates.txt';
101 touch($updatesFile); 101 touch($updatesFile);
102 chmod($updatesFile, 0444); 102 chmod($updatesFile, 0444);
@@ -161,11 +161,11 @@ class LegacyUpdaterTest extends \PHPUnit\Framework\TestCase
161 161
162 /** 162 /**
163 * Test Update failed. 163 * Test Update failed.
164 *
165 * @expectedException \Exception
166 */ 164 */
167 public function testUpdateFailed() 165 public function testUpdateFailed()
168 { 166 {
167 $this->expectException(\Exception::class);
168
169 $updates = array( 169 $updates = array(
170 'updateMethodDummy1', 170 'updateMethodDummy1',
171 'updateMethodDummy2', 171 'updateMethodDummy2',
@@ -723,7 +723,7 @@ $GLOBALS[\'privateLinkByDefault\'] = true;';
723 $this->assertEquals(\Shaarli\Thumbnailer::MODE_ALL, $this->conf->get('thumbnails.mode')); 723 $this->assertEquals(\Shaarli\Thumbnailer::MODE_ALL, $this->conf->get('thumbnails.mode'));
724 $this->assertEquals(125, $this->conf->get('thumbnails.width')); 724 $this->assertEquals(125, $this->conf->get('thumbnails.width'));
725 $this->assertEquals(90, $this->conf->get('thumbnails.height')); 725 $this->assertEquals(90, $this->conf->get('thumbnails.height'));
726 $this->assertContains('You have enabled or changed thumbnails', $_SESSION['warnings'][0]); 726 $this->assertContainsPolyfill('You have enabled or changed thumbnails', $_SESSION['warnings'][0]);
727 } 727 }
728 728
729 /** 729 /**
@@ -754,7 +754,7 @@ $GLOBALS[\'privateLinkByDefault\'] = true;';
754 if (isset($_SESSION['warnings'])) { 754 if (isset($_SESSION['warnings'])) {
755 unset($_SESSION['warnings']); 755 unset($_SESSION['warnings']);
756 } 756 }
757 757
758 $updater = new LegacyUpdater([], [], $this->conf, true, $_SESSION); 758 $updater = new LegacyUpdater([], [], $this->conf, true, $_SESSION);
759 $this->assertTrue($updater->updateMethodWebThumbnailer()); 759 $this->assertTrue($updater->updateMethodWebThumbnailer());
760 $this->assertFalse($this->conf->exists('thumbnail')); 760 $this->assertFalse($this->conf->exists('thumbnail'));
diff --git a/tests/netscape/BookmarkExportTest.php b/tests/netscape/BookmarkExportTest.php
index 509da51d..9b95ccc9 100644
--- a/tests/netscape/BookmarkExportTest.php
+++ b/tests/netscape/BookmarkExportTest.php
@@ -2,12 +2,12 @@
2 2
3namespace Shaarli\Netscape; 3namespace Shaarli\Netscape;
4 4
5use PHPUnit\Framework\TestCase;
6use Shaarli\Bookmark\BookmarkFileService; 5use Shaarli\Bookmark\BookmarkFileService;
7use Shaarli\Config\ConfigManager; 6use Shaarli\Config\ConfigManager;
8use Shaarli\Formatter\BookmarkFormatter; 7use Shaarli\Formatter\BookmarkFormatter;
9use Shaarli\Formatter\FormatterFactory; 8use Shaarli\Formatter\FormatterFactory;
10use Shaarli\History; 9use Shaarli\History;
10use Shaarli\TestCase;
11 11
12require_once 'tests/utils/ReferenceLinkDB.php'; 12require_once 'tests/utils/ReferenceLinkDB.php';
13 13
@@ -54,7 +54,7 @@ class BookmarkExportTest extends TestCase
54 /** 54 /**
55 * Instantiate reference data 55 * Instantiate reference data
56 */ 56 */
57 public static function setUpBeforeClass() 57 public static function setUpBeforeClass(): void
58 { 58 {
59 static::$conf = new ConfigManager('tests/utils/config/configJson'); 59 static::$conf = new ConfigManager('tests/utils/config/configJson');
60 static::$conf->set('resource.datastore', static::$testDatastore); 60 static::$conf->set('resource.datastore', static::$testDatastore);
@@ -77,11 +77,12 @@ class BookmarkExportTest extends TestCase
77 77
78 /** 78 /**
79 * Attempt to export an invalid link selection 79 * Attempt to export an invalid link selection
80 * @expectedException Exception
81 * @expectedExceptionMessageRegExp /Invalid export selection/
82 */ 80 */
83 public function testFilterAndFormatInvalid() 81 public function testFilterAndFormatInvalid()
84 { 82 {
83 $this->expectException(\Exception::class);
84 $this->expectExceptionMessageRegExp('/Invalid export selection/');
85
85 $this->netscapeBookmarkUtils->filterAndFormat( 86 $this->netscapeBookmarkUtils->filterAndFormat(
86 self::$formatter, 87 self::$formatter,
87 'derp', 88 'derp',
diff --git a/tests/netscape/BookmarkImportTest.php b/tests/netscape/BookmarkImportTest.php
index f678e26b..c1e49b5f 100644
--- a/tests/netscape/BookmarkImportTest.php
+++ b/tests/netscape/BookmarkImportTest.php
@@ -3,13 +3,13 @@
3namespace Shaarli\Netscape; 3namespace Shaarli\Netscape;
4 4
5use DateTime; 5use DateTime;
6use PHPUnit\Framework\TestCase;
7use Psr\Http\Message\UploadedFileInterface; 6use Psr\Http\Message\UploadedFileInterface;
8use Shaarli\Bookmark\Bookmark; 7use Shaarli\Bookmark\Bookmark;
9use Shaarli\Bookmark\BookmarkFileService; 8use Shaarli\Bookmark\BookmarkFileService;
10use Shaarli\Bookmark\BookmarkFilter; 9use Shaarli\Bookmark\BookmarkFilter;
11use Shaarli\Config\ConfigManager; 10use Shaarli\Config\ConfigManager;
12use Shaarli\History; 11use Shaarli\History;
12use Shaarli\TestCase;
13use Slim\Http\UploadedFile; 13use Slim\Http\UploadedFile;
14 14
15/** 15/**
@@ -75,7 +75,7 @@ class BookmarkImportTest extends TestCase
75 */ 75 */
76 protected static $defaultTimeZone; 76 protected static $defaultTimeZone;
77 77
78 public static function setUpBeforeClass() 78 public static function setUpBeforeClass(): void
79 { 79 {
80 self::$defaultTimeZone = date_default_timezone_get(); 80 self::$defaultTimeZone = date_default_timezone_get();
81 // Timezone without DST for test consistency 81 // Timezone without DST for test consistency
@@ -85,7 +85,7 @@ class BookmarkImportTest extends TestCase
85 /** 85 /**
86 * Resets test data before each test 86 * Resets test data before each test
87 */ 87 */
88 protected function setUp() 88 protected function setUp(): void
89 { 89 {
90 if (file_exists(self::$testDatastore)) { 90 if (file_exists(self::$testDatastore)) {
91 unlink(self::$testDatastore); 91 unlink(self::$testDatastore);
@@ -104,12 +104,12 @@ class BookmarkImportTest extends TestCase
104 /** 104 /**
105 * Delete history file. 105 * Delete history file.
106 */ 106 */
107 public function tearDown() 107 protected function tearDown(): void
108 { 108 {
109 @unlink(self::$historyFilePath); 109 @unlink(self::$historyFilePath);
110 } 110 }
111 111
112 public static function tearDownAfterClass() 112 public static function tearDownAfterClass(): void
113 { 113 {
114 date_default_timezone_set(self::$defaultTimeZone); 114 date_default_timezone_set(self::$defaultTimeZone);
115 } 115 }
diff --git a/tests/plugins/PluginAddlinkTest.php b/tests/plugins/PluginAddlinkTest.php
index aa5c6988..a3ec9fc9 100644
--- a/tests/plugins/PluginAddlinkTest.php
+++ b/tests/plugins/PluginAddlinkTest.php
@@ -9,12 +9,12 @@ require_once 'plugins/addlink_toolbar/addlink_toolbar.php';
9/** 9/**
10 * Unit test for the Addlink toolbar plugin 10 * Unit test for the Addlink toolbar plugin
11 */ 11 */
12class PluginAddlinkTest extends \PHPUnit\Framework\TestCase 12class PluginAddlinkTest extends \Shaarli\TestCase
13{ 13{
14 /** 14 /**
15 * Reset plugin path. 15 * Reset plugin path.
16 */ 16 */
17 public function setUp() 17 protected function setUp(): void
18 { 18 {
19 PluginManager::$PLUGINS_PATH = 'plugins'; 19 PluginManager::$PLUGINS_PATH = 'plugins';
20 } 20 }
diff --git a/tests/plugins/PluginArchiveorgTest.php b/tests/plugins/PluginArchiveorgTest.php
index b9a67adb..467dc3d0 100644
--- a/tests/plugins/PluginArchiveorgTest.php
+++ b/tests/plugins/PluginArchiveorgTest.php
@@ -1,4 +1,5 @@
1<?php 1<?php
2
2namespace Shaarli\Plugin\Archiveorg; 3namespace Shaarli\Plugin\Archiveorg;
3 4
4/** 5/**
@@ -6,6 +7,7 @@ namespace Shaarli\Plugin\Archiveorg;
6 */ 7 */
7 8
8use Shaarli\Plugin\PluginManager; 9use Shaarli\Plugin\PluginManager;
10use Shaarli\TestCase;
9 11
10require_once 'plugins/archiveorg/archiveorg.php'; 12require_once 'plugins/archiveorg/archiveorg.php';
11 13
@@ -13,20 +15,35 @@ require_once 'plugins/archiveorg/archiveorg.php';
13 * Class PluginArchiveorgTest 15 * Class PluginArchiveorgTest
14 * Unit test for the archiveorg plugin 16 * Unit test for the archiveorg plugin
15 */ 17 */
16class PluginArchiveorgTest extends \PHPUnit\Framework\TestCase 18class PluginArchiveorgTest extends TestCase
17{ 19{
20 protected $savedScriptName;
21
18 /** 22 /**
19 * Reset plugin path 23 * Reset plugin path
20 */ 24 */
21 public function setUp() 25 public function setUp(): void
22 { 26 {
23 PluginManager::$PLUGINS_PATH = 'plugins'; 27 PluginManager::$PLUGINS_PATH = 'plugins';
28
29 // plugins manipulate global vars
30 $_SERVER['SERVER_PORT'] = '80';
31 $_SERVER['SERVER_NAME'] = 'shaarli.shaarli';
32 $this->savedScriptName = $_SERVER['SCRIPT_NAME'] ?? null;
33 $_SERVER['SCRIPT_NAME'] = '/index.php';
34 }
35
36 public function tearDown(): void
37 {
38 unset($_SERVER['SERVER_PORT']);
39 unset($_SERVER['SERVER_NAME']);
40 $_SERVER['SCRIPT_NAME'] = $this->savedScriptName;
24 } 41 }
25 42
26 /** 43 /**
27 * Test render_linklist hook on external bookmarks. 44 * Test render_linklist hook on external bookmarks.
28 */ 45 */
29 public function testArchiveorgLinklistOnExternalLinks() 46 public function testArchiveorgLinklistOnExternalLinks(): void
30 { 47 {
31 $str = 'http://randomstr.com/test'; 48 $str = 'http://randomstr.com/test';
32 49
@@ -56,16 +73,16 @@ class PluginArchiveorgTest extends \PHPUnit\Framework\TestCase
56 /** 73 /**
57 * Test render_linklist hook on internal bookmarks. 74 * Test render_linklist hook on internal bookmarks.
58 */ 75 */
59 public function testArchiveorgLinklistOnInternalLinks() 76 public function testArchiveorgLinklistOnInternalLinks(): void
60 { 77 {
61 $internalLink1 = 'http://shaarli.shaarli/?qvMAqg'; 78 $internalLink1 = 'http://shaarli.shaarli/shaare/qvMAqg';
62 $internalLinkRealURL1 = '?qvMAqg'; 79 $internalLinkRealURL1 = '/shaare/qvMAqg';
63 80
64 $internalLink2 = 'http://shaarli.shaarli/?2_7zww'; 81 $internalLink2 = 'http://shaarli.shaarli/shaare/2_7zww';
65 $internalLinkRealURL2 = '?2_7zww'; 82 $internalLinkRealURL2 = '/shaare/2_7zww';
66 83
67 $internalLink3 = 'http://shaarli.shaarli/?z7u-_Q'; 84 $internalLink3 = 'http://shaarli.shaarli/shaare/z7u-_Q';
68 $internalLinkRealURL3 = '?z7u-_Q'; 85 $internalLinkRealURL3 = '/shaare/z7u-_Q';
69 86
70 $data = array( 87 $data = array(
71 'title' => $internalLink1, 88 'title' => $internalLink1,
diff --git a/tests/plugins/PluginDefaultColorsTest.php b/tests/plugins/PluginDefaultColorsTest.php
index b9951cca..cc844c60 100644
--- a/tests/plugins/PluginDefaultColorsTest.php
+++ b/tests/plugins/PluginDefaultColorsTest.php
@@ -2,11 +2,10 @@
2 2
3namespace Shaarli\Plugin\DefaultColors; 3namespace Shaarli\Plugin\DefaultColors;
4 4
5use DateTime;
6use PHPUnit\Framework\TestCase;
7use Shaarli\Bookmark\LinkDB; 5use Shaarli\Bookmark\LinkDB;
8use Shaarli\Config\ConfigManager; 6use Shaarli\Config\ConfigManager;
9use Shaarli\Plugin\PluginManager; 7use Shaarli\Plugin\PluginManager;
8use Shaarli\TestCase;
10 9
11require_once 'plugins/default_colors/default_colors.php'; 10require_once 'plugins/default_colors/default_colors.php';
12 11
@@ -20,7 +19,7 @@ class PluginDefaultColorsTest extends TestCase
20 /** 19 /**
21 * Reset plugin path 20 * Reset plugin path
22 */ 21 */
23 public function setUp() 22 protected function setUp(): void
24 { 23 {
25 PluginManager::$PLUGINS_PATH = 'sandbox'; 24 PluginManager::$PLUGINS_PATH = 'sandbox';
26 mkdir(PluginManager::$PLUGINS_PATH . '/default_colors/'); 25 mkdir(PluginManager::$PLUGINS_PATH . '/default_colors/');
@@ -33,7 +32,7 @@ class PluginDefaultColorsTest extends TestCase
33 /** 32 /**
34 * Remove sandbox files and folder 33 * Remove sandbox files and folder
35 */ 34 */
36 public function tearDown() 35 protected function tearDown(): void
37 { 36 {
38 if (file_exists('sandbox/default_colors/default_colors.css.template')) { 37 if (file_exists('sandbox/default_colors/default_colors.css.template')) {
39 unlink('sandbox/default_colors/default_colors.css.template'); 38 unlink('sandbox/default_colors/default_colors.css.template');
@@ -57,6 +56,8 @@ class PluginDefaultColorsTest extends TestCase
57 $conf->set('plugins.DEFAULT_COLORS_BACKGROUND', 'value'); 56 $conf->set('plugins.DEFAULT_COLORS_BACKGROUND', 'value');
58 $errors = default_colors_init($conf); 57 $errors = default_colors_init($conf);
59 $this->assertEmpty($errors); 58 $this->assertEmpty($errors);
59
60 $this->assertFileExists($file = 'sandbox/default_colors/default_colors.css');
60 } 61 }
61 62
62 /** 63 /**
@@ -72,9 +73,9 @@ class PluginDefaultColorsTest extends TestCase
72 /** 73 /**
73 * Test the save plugin parameters hook with all colors specified. 74 * Test the save plugin parameters hook with all colors specified.
74 */ 75 */
75 public function testSavePluginParametersAll() 76 public function testGenerateCssFile()
76 { 77 {
77 $post = [ 78 $params = [
78 'other1' => true, 79 'other1' => true,
79 'DEFAULT_COLORS_MAIN' => 'blue', 80 'DEFAULT_COLORS_MAIN' => 'blue',
80 'DEFAULT_COLORS_BACKGROUND' => 'pink', 81 'DEFAULT_COLORS_BACKGROUND' => 'pink',
@@ -82,7 +83,7 @@ class PluginDefaultColorsTest extends TestCase
82 'DEFAULT_COLORS_DARK_MAIN' => 'green', 83 'DEFAULT_COLORS_DARK_MAIN' => 'green',
83 ]; 84 ];
84 85
85 hook_default_colors_save_plugin_parameters($post); 86 default_colors_generate_css_file($params);
86 $this->assertFileExists($file = 'sandbox/default_colors/default_colors.css'); 87 $this->assertFileExists($file = 'sandbox/default_colors/default_colors.css');
87 $content = file_get_contents($file); 88 $content = file_get_contents($file);
88 $expected = ':root { 89 $expected = ':root {
@@ -98,16 +99,16 @@ class PluginDefaultColorsTest extends TestCase
98 /** 99 /**
99 * Test the save plugin parameters hook with only one color specified. 100 * Test the save plugin parameters hook with only one color specified.
100 */ 101 */
101 public function testSavePluginParametersSingle() 102 public function testGenerateCssFileSingle()
102 { 103 {
103 $post = [ 104 $params = [
104 'other1' => true, 105 'other1' => true,
105 'DEFAULT_COLORS_BACKGROUND' => 'pink', 106 'DEFAULT_COLORS_BACKGROUND' => 'pink',
106 'other2' => ['yep'], 107 'other2' => ['yep'],
107 'DEFAULT_COLORS_DARK_MAIN' => '', 108 'DEFAULT_COLORS_DARK_MAIN' => '',
108 ]; 109 ];
109 110
110 hook_default_colors_save_plugin_parameters($post); 111 default_colors_generate_css_file($params);
111 $this->assertFileExists($file = 'sandbox/default_colors/default_colors.css'); 112 $this->assertFileExists($file = 'sandbox/default_colors/default_colors.css');
112 $content = file_get_contents($file); 113 $content = file_get_contents($file);
113 $expected = ':root { 114 $expected = ':root {
@@ -121,9 +122,9 @@ class PluginDefaultColorsTest extends TestCase
121 /** 122 /**
122 * Test the save plugin parameters hook with no color specified. 123 * Test the save plugin parameters hook with no color specified.
123 */ 124 */
124 public function testSavePluginParametersNone() 125 public function testGenerateCssFileNone()
125 { 126 {
126 hook_default_colors_save_plugin_parameters([]); 127 default_colors_generate_css_file([]);
127 $this->assertFileNotExists($file = 'sandbox/default_colors/default_colors.css'); 128 $this->assertFileNotExists($file = 'sandbox/default_colors/default_colors.css');
128 } 129 }
129 130
diff --git a/tests/plugins/PluginIssoTest.php b/tests/plugins/PluginIssoTest.php
index 99477205..16ecf357 100644
--- a/tests/plugins/PluginIssoTest.php
+++ b/tests/plugins/PluginIssoTest.php
@@ -5,6 +5,7 @@ use DateTime;
5use Shaarli\Bookmark\Bookmark; 5use Shaarli\Bookmark\Bookmark;
6use Shaarli\Config\ConfigManager; 6use Shaarli\Config\ConfigManager;
7use Shaarli\Plugin\PluginManager; 7use Shaarli\Plugin\PluginManager;
8use Shaarli\TestCase;
8 9
9require_once 'plugins/isso/isso.php'; 10require_once 'plugins/isso/isso.php';
10 11
@@ -13,12 +14,12 @@ require_once 'plugins/isso/isso.php';
13 * 14 *
14 * Test the Isso plugin (comment system). 15 * Test the Isso plugin (comment system).
15 */ 16 */
16class PluginIssoTest extends \PHPUnit\Framework\TestCase 17class PluginIssoTest extends TestCase
17{ 18{
18 /** 19 /**
19 * Reset plugin path 20 * Reset plugin path
20 */ 21 */
21 public function setUp() 22 public function setUp(): void
22 { 23 {
23 PluginManager::$PLUGINS_PATH = 'plugins'; 24 PluginManager::$PLUGINS_PATH = 'plugins';
24 } 25 }
@@ -26,7 +27,7 @@ class PluginIssoTest extends \PHPUnit\Framework\TestCase
26 /** 27 /**
27 * Test Isso init without errors. 28 * Test Isso init without errors.
28 */ 29 */
29 public function testIssoInitNoError() 30 public function testIssoInitNoError(): void
30 { 31 {
31 $conf = new ConfigManager(''); 32 $conf = new ConfigManager('');
32 $conf->set('plugins.ISSO_SERVER', 'value'); 33 $conf->set('plugins.ISSO_SERVER', 'value');
@@ -37,7 +38,7 @@ class PluginIssoTest extends \PHPUnit\Framework\TestCase
37 /** 38 /**
38 * Test Isso init with errors. 39 * Test Isso init with errors.
39 */ 40 */
40 public function testIssoInitError() 41 public function testIssoInitError(): void
41 { 42 {
42 $conf = new ConfigManager(''); 43 $conf = new ConfigManager('');
43 $errors = isso_init($conf); 44 $errors = isso_init($conf);
@@ -47,7 +48,7 @@ class PluginIssoTest extends \PHPUnit\Framework\TestCase
47 /** 48 /**
48 * Test render_linklist hook with valid settings to display the comment form. 49 * Test render_linklist hook with valid settings to display the comment form.
49 */ 50 */
50 public function testIssoDisplayed() 51 public function testIssoDisplayed(): void
51 { 52 {
52 $conf = new ConfigManager(''); 53 $conf = new ConfigManager('');
53 $conf->set('plugins.ISSO_SERVER', 'value'); 54 $conf->set('plugins.ISSO_SERVER', 'value');
@@ -87,7 +88,7 @@ class PluginIssoTest extends \PHPUnit\Framework\TestCase
87 /** 88 /**
88 * Test isso plugin when multiple bookmarks are displayed (shouldn't be displayed). 89 * Test isso plugin when multiple bookmarks are displayed (shouldn't be displayed).
89 */ 90 */
90 public function testIssoMultipleLinks() 91 public function testIssoMultipleLinks(): void
91 { 92 {
92 $conf = new ConfigManager(''); 93 $conf = new ConfigManager('');
93 $conf->set('plugins.ISSO_SERVER', 'value'); 94 $conf->set('plugins.ISSO_SERVER', 'value');
@@ -115,14 +116,14 @@ class PluginIssoTest extends \PHPUnit\Framework\TestCase
115 116
116 $processed = hook_isso_render_linklist($data, $conf); 117 $processed = hook_isso_render_linklist($data, $conf);
117 // link_plugin should be added for the icon 118 // link_plugin should be added for the icon
118 $this->assertContains('<a href="?'. $short1 .'#isso-thread">', $processed['links'][0]['link_plugin'][0]); 119 $this->assertContainsPolyfill('<a href="/shaare/'. $short1 .'#isso-thread">', $processed['links'][0]['link_plugin'][0]);
119 $this->assertContains('<a href="?'. $short2 .'#isso-thread">', $processed['links'][1]['link_plugin'][0]); 120 $this->assertContainsPolyfill('<a href="/shaare/'. $short2 .'#isso-thread">', $processed['links'][1]['link_plugin'][0]);
120 } 121 }
121 122
122 /** 123 /**
123 * Test isso plugin when using search (shouldn't be displayed). 124 * Test isso plugin when using search (shouldn't be displayed).
124 */ 125 */
125 public function testIssoNotDisplayedWhenSearch() 126 public function testIssoNotDisplayedWhenSearch(): void
126 { 127 {
127 $conf = new ConfigManager(''); 128 $conf = new ConfigManager('');
128 $conf->set('plugins.ISSO_SERVER', 'value'); 129 $conf->set('plugins.ISSO_SERVER', 'value');
@@ -145,13 +146,13 @@ class PluginIssoTest extends \PHPUnit\Framework\TestCase
145 $processed = hook_isso_render_linklist($data, $conf); 146 $processed = hook_isso_render_linklist($data, $conf);
146 147
147 // link_plugin should be added for the icon 148 // link_plugin should be added for the icon
148 $this->assertContains('<a href="?'. $short1 .'#isso-thread">', $processed['links'][0]['link_plugin'][0]); 149 $this->assertContainsPolyfill('<a href="/shaare/'. $short1 .'#isso-thread">', $processed['links'][0]['link_plugin'][0]);
149 } 150 }
150 151
151 /** 152 /**
152 * Test isso plugin without server configuration (shouldn't be displayed). 153 * Test isso plugin without server configuration (shouldn't be displayed).
153 */ 154 */
154 public function testIssoWithoutConf() 155 public function testIssoWithoutConf(): void
155 { 156 {
156 $data = 'abc'; 157 $data = 'abc';
157 $conf = new ConfigManager(''); 158 $conf = new ConfigManager('');
diff --git a/tests/plugins/PluginPlayvideosTest.php b/tests/plugins/PluginPlayvideosTest.php
index b7b6ce53..338d2e35 100644
--- a/tests/plugins/PluginPlayvideosTest.php
+++ b/tests/plugins/PluginPlayvideosTest.php
@@ -14,12 +14,12 @@ require_once 'plugins/playvideos/playvideos.php';
14 * Class PluginPlayvideosTest 14 * Class PluginPlayvideosTest
15 * Unit test for the PlayVideos plugin 15 * Unit test for the PlayVideos plugin
16 */ 16 */
17class PluginPlayvideosTest extends \PHPUnit\Framework\TestCase 17class PluginPlayvideosTest extends \Shaarli\TestCase
18{ 18{
19 /** 19 /**
20 * Reset plugin path 20 * Reset plugin path
21 */ 21 */
22 public function setUp() 22 protected function setUp(): void
23 { 23 {
24 PluginManager::$PLUGINS_PATH = 'plugins'; 24 PluginManager::$PLUGINS_PATH = 'plugins';
25 } 25 }
diff --git a/tests/plugins/PluginPubsubhubbubTest.php b/tests/plugins/PluginPubsubhubbubTest.php
index e66f484e..d3f7b439 100644
--- a/tests/plugins/PluginPubsubhubbubTest.php
+++ b/tests/plugins/PluginPubsubhubbubTest.php
@@ -11,7 +11,7 @@ require_once 'plugins/pubsubhubbub/pubsubhubbub.php';
11 * Class PluginPubsubhubbubTest 11 * Class PluginPubsubhubbubTest
12 * Unit test for the pubsubhubbub plugin 12 * Unit test for the pubsubhubbub plugin
13 */ 13 */
14class PluginPubsubhubbubTest extends \PHPUnit\Framework\TestCase 14class PluginPubsubhubbubTest extends \Shaarli\TestCase
15{ 15{
16 /** 16 /**
17 * @var string Config file path (without extension). 17 * @var string Config file path (without extension).
@@ -21,7 +21,7 @@ class PluginPubsubhubbubTest extends \PHPUnit\Framework\TestCase
21 /** 21 /**
22 * Reset plugin path 22 * Reset plugin path
23 */ 23 */
24 public function setUp() 24 protected function setUp(): void
25 { 25 {
26 PluginManager::$PLUGINS_PATH = 'plugins'; 26 PluginManager::$PLUGINS_PATH = 'plugins';
27 } 27 }
diff --git a/tests/plugins/PluginQrcodeTest.php b/tests/plugins/PluginQrcodeTest.php
index c9f8c733..1d85fba6 100644
--- a/tests/plugins/PluginQrcodeTest.php
+++ b/tests/plugins/PluginQrcodeTest.php
@@ -14,12 +14,12 @@ require_once 'plugins/qrcode/qrcode.php';
14 * Class PluginQrcodeTest 14 * Class PluginQrcodeTest
15 * Unit test for the QR-Code plugin 15 * Unit test for the QR-Code plugin
16 */ 16 */
17class PluginQrcodeTest extends \PHPUnit\Framework\TestCase 17class PluginQrcodeTest extends \Shaarli\TestCase
18{ 18{
19 /** 19 /**
20 * Reset plugin path 20 * Reset plugin path
21 */ 21 */
22 public function setUp() 22 protected function setUp(): void
23 { 23 {
24 PluginManager::$PLUGINS_PATH = 'plugins'; 24 PluginManager::$PLUGINS_PATH = 'plugins';
25 } 25 }
diff --git a/tests/plugins/PluginWallabagTest.php b/tests/plugins/PluginWallabagTest.php
index 79751921..36317215 100644
--- a/tests/plugins/PluginWallabagTest.php
+++ b/tests/plugins/PluginWallabagTest.php
@@ -10,12 +10,12 @@ require_once 'plugins/wallabag/wallabag.php';
10 * Class PluginWallabagTest 10 * Class PluginWallabagTest
11 * Unit test for the Wallabag plugin 11 * Unit test for the Wallabag plugin
12 */ 12 */
13class PluginWallabagTest extends \PHPUnit\Framework\TestCase 13class PluginWallabagTest extends \Shaarli\TestCase
14{ 14{
15 /** 15 /**
16 * Reset plugin path 16 * Reset plugin path
17 */ 17 */
18 public function setUp() 18 protected function setUp(): void
19 { 19 {
20 PluginManager::$PLUGINS_PATH = 'plugins'; 20 PluginManager::$PLUGINS_PATH = 'plugins';
21 } 21 }
diff --git a/tests/plugins/WallabagInstanceTest.php b/tests/plugins/WallabagInstanceTest.php
index a3cd9076..5ef3de1a 100644
--- a/tests/plugins/WallabagInstanceTest.php
+++ b/tests/plugins/WallabagInstanceTest.php
@@ -4,7 +4,7 @@ namespace Shaarli\Plugin\Wallabag;
4/** 4/**
5 * Class WallabagInstanceTest 5 * Class WallabagInstanceTest
6 */ 6 */
7class WallabagInstanceTest extends \PHPUnit\Framework\TestCase 7class WallabagInstanceTest extends \Shaarli\TestCase
8{ 8{
9 /** 9 /**
10 * @var string wallabag url. 10 * @var string wallabag url.
@@ -14,7 +14,7 @@ class WallabagInstanceTest extends \PHPUnit\Framework\TestCase
14 /** 14 /**
15 * Reset plugin path 15 * Reset plugin path
16 */ 16 */
17 public function setUp() 17 protected function setUp(): void
18 { 18 {
19 $this->instance = 'http://some.url'; 19 $this->instance = 'http://some.url';
20 } 20 }
diff --git a/tests/plugins/test/test.php b/tests/plugins/test/test.php
index ae5032dd..03be4f4e 100644
--- a/tests/plugins/test/test.php
+++ b/tests/plugins/test/test.php
@@ -13,6 +13,9 @@ function hook_test_random($data)
13 $data[1] = 'page test'; 13 $data[1] = 'page test';
14 } elseif (isset($data['_LOGGEDIN_']) && $data['_LOGGEDIN_'] === true) { 14 } elseif (isset($data['_LOGGEDIN_']) && $data['_LOGGEDIN_'] === true) {
15 $data[1] = 'loggedin'; 15 $data[1] = 'loggedin';
16 } elseif (array_key_exists('_LOGGEDIN_', $data)) {
17 $data[1] = 'loggedin';
18 $data[2] = $data['_LOGGEDIN_'];
16 } else { 19 } else {
17 $data[1] = $data[0]; 20 $data[1] = $data[0];
18 } 21 }
diff --git a/tests/render/PageCacheManagerTest.php b/tests/render/PageCacheManagerTest.php
index c258f45f..08d4e5ea 100644
--- a/tests/render/PageCacheManagerTest.php
+++ b/tests/render/PageCacheManagerTest.php
@@ -6,8 +6,8 @@
6 6
7namespace Shaarli\Render; 7namespace Shaarli\Render;
8 8
9use PHPUnit\Framework\TestCase;
10use Shaarli\Security\SessionManager; 9use Shaarli\Security\SessionManager;
10use Shaarli\TestCase;
11 11
12/** 12/**
13 * Unitary tests for cached pages 13 * Unitary tests for cached pages
@@ -29,7 +29,7 @@ class PageCacheManagerTest extends TestCase
29 /** 29 /**
30 * Populate the cache with dummy files 30 * Populate the cache with dummy files
31 */ 31 */
32 public function setUp() 32 protected function setUp(): void
33 { 33 {
34 $this->cacheManager = new PageCacheManager(static::$testCacheDir, true); 34 $this->cacheManager = new PageCacheManager(static::$testCacheDir, true);
35 35
@@ -48,7 +48,7 @@ class PageCacheManagerTest extends TestCase
48 /** 48 /**
49 * Remove dummycache folder after each tests. 49 * Remove dummycache folder after each tests.
50 */ 50 */
51 public function tearDown() 51 protected function tearDown(): void
52 { 52 {
53 array_map('unlink', glob(self::$testCacheDir . '/*')); 53 array_map('unlink', glob(self::$testCacheDir . '/*'));
54 rmdir(self::$testCacheDir); 54 rmdir(self::$testCacheDir);
diff --git a/tests/render/ThemeUtilsTest.php b/tests/render/ThemeUtilsTest.php
index 58e3426b..7d841e4d 100644
--- a/tests/render/ThemeUtilsTest.php
+++ b/tests/render/ThemeUtilsTest.php
@@ -7,7 +7,7 @@ namespace Shaarli\Render;
7 * 7 *
8 * @package Shaarli 8 * @package Shaarli
9 */ 9 */
10class ThemeUtilsTest extends \PHPUnit\Framework\TestCase 10class ThemeUtilsTest extends \Shaarli\TestCase
11{ 11{
12 /** 12 /**
13 * Test getThemes() with existing theme directories. 13 * Test getThemes() with existing theme directories.
diff --git a/tests/security/BanManagerTest.php b/tests/security/BanManagerTest.php
index bba7c8ad..698d3d10 100644
--- a/tests/security/BanManagerTest.php
+++ b/tests/security/BanManagerTest.php
@@ -3,8 +3,8 @@
3 3
4namespace Shaarli\Security; 4namespace Shaarli\Security;
5 5
6use PHPUnit\Framework\TestCase;
7use Shaarli\FileUtils; 6use Shaarli\FileUtils;
7use Shaarli\TestCase;
8 8
9/** 9/**
10 * Test coverage for BanManager 10 * Test coverage for BanManager
@@ -32,7 +32,7 @@ class BanManagerTest extends TestCase
32 /** 32 /**
33 * Prepare or reset test resources 33 * Prepare or reset test resources
34 */ 34 */
35 public function setUp() 35 protected function setUp(): void
36 { 36 {
37 if (file_exists($this->banFile)) { 37 if (file_exists($this->banFile)) {
38 unlink($this->banFile); 38 unlink($this->banFile);
diff --git a/tests/security/LoginManagerTest.php b/tests/security/LoginManagerTest.php
index f242be09..d302983d 100644
--- a/tests/security/LoginManagerTest.php
+++ b/tests/security/LoginManagerTest.php
@@ -2,7 +2,7 @@
2 2
3namespace Shaarli\Security; 3namespace Shaarli\Security;
4 4
5use PHPUnit\Framework\TestCase; 5use Shaarli\TestCase;
6 6
7/** 7/**
8 * Test coverage for LoginManager 8 * Test coverage for LoginManager
@@ -63,7 +63,7 @@ class LoginManagerTest extends TestCase
63 /** 63 /**
64 * Prepare or reset test resources 64 * Prepare or reset test resources
65 */ 65 */
66 public function setUp() 66 protected function setUp(): void
67 { 67 {
68 if (file_exists($this->banFile)) { 68 if (file_exists($this->banFile)) {
69 unlink($this->banFile); 69 unlink($this->banFile);
diff --git a/tests/security/SessionManagerTest.php b/tests/security/SessionManagerTest.php
index 60695dcf..3f9c3ef5 100644
--- a/tests/security/SessionManagerTest.php
+++ b/tests/security/SessionManagerTest.php
@@ -2,7 +2,7 @@
2 2
3namespace Shaarli\Security; 3namespace Shaarli\Security;
4 4
5use PHPUnit\Framework\TestCase; 5use Shaarli\TestCase;
6 6
7/** 7/**
8 * Test coverage for SessionManager 8 * Test coverage for SessionManager
@@ -24,7 +24,7 @@ class SessionManagerTest extends TestCase
24 /** 24 /**
25 * Assign reference data 25 * Assign reference data
26 */ 26 */
27 public static function setUpBeforeClass() 27 public static function setUpBeforeClass(): void
28 { 28 {
29 self::$sidHashes = \ReferenceSessionIdHashes::getHashes(); 29 self::$sidHashes = \ReferenceSessionIdHashes::getHashes();
30 } 30 }
@@ -32,7 +32,7 @@ class SessionManagerTest extends TestCase
32 /** 32 /**
33 * Initialize or reset test resources 33 * Initialize or reset test resources
34 */ 34 */
35 public function setUp() 35 protected function setUp(): void
36 { 36 {
37 $this->conf = new \FakeConfigManager([ 37 $this->conf = new \FakeConfigManager([
38 'credentials.login' => 'johndoe', 38 'credentials.login' => 'johndoe',
@@ -207,15 +207,16 @@ class SessionManagerTest extends TestCase
207 'expires_on' => time() + 1000, 207 'expires_on' => time() + 1000,
208 'username' => 'johndoe', 208 'username' => 'johndoe',
209 'visibility' => 'public', 209 'visibility' => 'public',
210 'untaggedonly' => false, 210 'untaggedonly' => true,
211 ]; 211 ];
212 $this->sessionManager->logout(); 212 $this->sessionManager->logout();
213 213
214 $this->assertFalse(isset($this->session['ip'])); 214 $this->assertArrayNotHasKey('ip', $this->session);
215 $this->assertFalse(isset($this->session['expires_on'])); 215 $this->assertArrayNotHasKey('expires_on', $this->session);
216 $this->assertFalse(isset($this->session['username'])); 216 $this->assertArrayNotHasKey('username', $this->session);
217 $this->assertFalse(isset($this->session['visibility'])); 217 $this->assertArrayNotHasKey('visibility', $this->session);
218 $this->assertFalse(isset($this->session['untaggedonly'])); 218 $this->assertArrayHasKey('untaggedonly', $this->session);
219 $this->assertTrue($this->session['untaggedonly']);
219 } 220 }
220 221
221 /** 222 /**
diff --git a/tests/updater/DummyUpdater.php b/tests/updater/DummyUpdater.php
index 07c7f5c4..3403233f 100644
--- a/tests/updater/DummyUpdater.php
+++ b/tests/updater/DummyUpdater.php
@@ -37,7 +37,7 @@ class DummyUpdater extends Updater
37 * 37 *
38 * @return bool true. 38 * @return bool true.
39 */ 39 */
40 final private function updateMethodDummy1() 40 final protected function updateMethodDummy1()
41 { 41 {
42 return true; 42 return true;
43 } 43 }
@@ -47,7 +47,7 @@ class DummyUpdater extends Updater
47 * 47 *
48 * @return bool true. 48 * @return bool true.
49 */ 49 */
50 final private function updateMethodDummy2() 50 final protected function updateMethodDummy2()
51 { 51 {
52 return true; 52 return true;
53 } 53 }
@@ -57,7 +57,7 @@ class DummyUpdater extends Updater
57 * 57 *
58 * @return bool true. 58 * @return bool true.
59 */ 59 */
60 final private function updateMethodDummy3() 60 final protected function updateMethodDummy3()
61 { 61 {
62 return true; 62 return true;
63 } 63 }
@@ -67,7 +67,7 @@ class DummyUpdater extends Updater
67 * 67 *
68 * @throws Exception error. 68 * @throws Exception error.
69 */ 69 */
70 final private function updateMethodException() 70 final protected function updateMethodException()
71 { 71 {
72 throw new Exception('whatever'); 72 throw new Exception('whatever');
73 } 73 }
diff --git a/tests/updater/UpdaterTest.php b/tests/updater/UpdaterTest.php
index a7dd70bf..a6280b8c 100644
--- a/tests/updater/UpdaterTest.php
+++ b/tests/updater/UpdaterTest.php
@@ -2,11 +2,11 @@
2namespace Shaarli\Updater; 2namespace Shaarli\Updater;
3 3
4use Exception; 4use Exception;
5use PHPUnit\Framework\TestCase;
6use Shaarli\Bookmark\BookmarkFileService; 5use Shaarli\Bookmark\BookmarkFileService;
7use Shaarli\Bookmark\BookmarkServiceInterface; 6use Shaarli\Bookmark\BookmarkServiceInterface;
8use Shaarli\Config\ConfigManager; 7use Shaarli\Config\ConfigManager;
9use Shaarli\History; 8use Shaarli\History;
9use Shaarli\TestCase;
10 10
11 11
12/** 12/**
@@ -42,7 +42,7 @@ class UpdaterTest extends TestCase
42 /** 42 /**
43 * Executed before each test. 43 * Executed before each test.
44 */ 44 */
45 public function setUp() 45 protected function setUp(): void
46 { 46 {
47 $this->refDB = new \ReferenceLinkDB(); 47 $this->refDB = new \ReferenceLinkDB();
48 $this->refDB->write(self::$testDatastore); 48 $this->refDB->write(self::$testDatastore);
@@ -87,23 +87,23 @@ class UpdaterTest extends TestCase
87 87
88 /** 88 /**
89 * Test errors in UpdaterUtils::write_updates_file(): empty updates file. 89 * Test errors in UpdaterUtils::write_updates_file(): empty updates file.
90 *
91 * @expectedException Exception
92 * @expectedExceptionMessageRegExp /Updates file path is not set(.*)/
93 */ 90 */
94 public function testWriteEmptyUpdatesFile() 91 public function testWriteEmptyUpdatesFile()
95 { 92 {
93 $this->expectException(\Exception::class);
94 $this->expectExceptionMessageRegExp('/Updates file path is not set(.*)/');
95
96 UpdaterUtils::write_updates_file('', array('test')); 96 UpdaterUtils::write_updates_file('', array('test'));
97 } 97 }
98 98
99 /** 99 /**
100 * Test errors in UpdaterUtils::write_updates_file(): not writable updates file. 100 * Test errors in UpdaterUtils::write_updates_file(): not writable updates file.
101 *
102 * @expectedException Exception
103 * @expectedExceptionMessageRegExp /Unable to write(.*)/
104 */ 101 */
105 public function testWriteUpdatesFileNotWritable() 102 public function testWriteUpdatesFileNotWritable()
106 { 103 {
104 $this->expectException(\Exception::class);
105 $this->expectExceptionMessageRegExp('/Unable to write(.*)/');
106
107 $updatesFile = $this->conf->get('resource.data_dir') . '/updates.txt'; 107 $updatesFile = $this->conf->get('resource.data_dir') . '/updates.txt';
108 touch($updatesFile); 108 touch($updatesFile);
109 chmod($updatesFile, 0444); 109 chmod($updatesFile, 0444);
@@ -168,11 +168,11 @@ class UpdaterTest extends TestCase
168 168
169 /** 169 /**
170 * Test Update failed. 170 * Test Update failed.
171 *
172 * @expectedException \Exception
173 */ 171 */
174 public function testUpdateFailed() 172 public function testUpdateFailed()
175 { 173 {
174 $this->expectException(\Exception::class);
175
176 $updates = array( 176 $updates = array(
177 'updateMethodDummy1', 177 'updateMethodDummy1',
178 'updateMethodDummy2', 178 'updateMethodDummy2',
diff --git a/tpl/default/includes.html b/tpl/default/includes.html
index 227f9b52..09768ac4 100644
--- a/tpl/default/includes.html
+++ b/tpl/default/includes.html
@@ -8,7 +8,7 @@
8<link href="{$asset_path}/img/favicon.png#" rel="shortcut icon" type="image/png" /> 8<link href="{$asset_path}/img/favicon.png#" rel="shortcut icon" type="image/png" />
9<link href="{$asset_path}/img/apple-touch-icon.png#" rel="apple-touch-icon" sizes="180x180" /> 9<link href="{$asset_path}/img/apple-touch-icon.png#" rel="apple-touch-icon" sizes="180x180" />
10<link type="text/css" rel="stylesheet" href="{$asset_path}/css/shaarli.min.css?v={$version_hash}#" /> 10<link type="text/css" rel="stylesheet" href="{$asset_path}/css/shaarli.min.css?v={$version_hash}#" />
11{if="$formatter==='markdown'"} 11{if="strpos($formatter, 'markdown') !== false"}
12 <link type="text/css" rel="stylesheet" href="{$asset_path}/css/markdown.min.css?v={$version_hash}#" /> 12 <link type="text/css" rel="stylesheet" href="{$asset_path}/css/markdown.min.css?v={$version_hash}#" />
13{/if} 13{/if}
14{loop="$plugins_includes.css_files"} 14{loop="$plugins_includes.css_files"}
diff --git a/tpl/default/linklist.html b/tpl/default/linklist.html
index c7617b22..b08773d8 100644
--- a/tpl/default/linklist.html
+++ b/tpl/default/linklist.html
@@ -94,7 +94,7 @@
94 {'tagged'|t} 94 {'tagged'|t}
95 {loop="$exploded_tags"} 95 {loop="$exploded_tags"}
96 <span class="label label-tag" title="{'Remove tag'|t}"> 96 <span class="label label-tag" title="{'Remove tag'|t}">
97 <a href="{$base_path}/remove-tag/{function="urlencode($value)"}" aria-label="{'Remove tag'|t}"> 97 <a href="{$base_path}/remove-tag/{function="$search_tags_url.$key1"}" aria-label="{'Remove tag'|t}">
98 {$value}<span class="remove"><i class="fa fa-times" aria-hidden="true"></i></span> 98 {$value}<span class="remove"><i class="fa fa-times" aria-hidden="true"></i></span>
99 </a> 99 </a>
100 </span> 100 </span>
@@ -183,7 +183,7 @@
183 {$tag_counter=count($value.taglist)} 183 {$tag_counter=count($value.taglist)}
184 {loop="value.taglist"} 184 {loop="value.taglist"}
185 <span class="label label-tag" title="{$strAddTag}"> 185 <span class="label label-tag" title="{$strAddTag}">
186 <a href="{$base_path}/add-tag/{$value|urlencode}">{$value}</a> 186 <a href="{$base_path}/add-tag/{$value1.urlencoded_taglist.$key2}">{$value}</a>
187 </span> 187 </span>
188 {if="$tag_counter - 1 != $counter"}&middot;{/if} 188 {if="$tag_counter - 1 != $counter"}&middot;{/if}
189 {/loop} 189 {/loop}
@@ -272,7 +272,17 @@
272 <i class="fa fa-trash" aria-hidden="true"></i> 272 <i class="fa fa-trash" aria-hidden="true"></i>
273 </a> 273 </a>
274 &middot; 274 &middot;
275 <a href="{$base_path}/admin/shaare/{$value.id}" aria-label="{$strEdit}" title="{$strEdit}"><i class="fa fa-pencil-square-o edit-link" aria-hidden="true"></i></a> 275 <a href="{$base_path}/admin/shaare/{$value.id}" aria-label="{$strEdit}" title="{$strEdit}">
276 <i class="fa fa-pencil-square-o edit-link" aria-hidden="true"></i>
277 </a>
278 &middot;
279 <a href="{$base_path}/admin/shaare/{$value.id}/pin?token={$token}"
280 aria-label="{$strToggleSticky}"
281 title="{$strToggleSticky}"
282 class="pin-link {if="$value.sticky"}pinned-link{/if}"
283 >
284 <i class="fa fa-thumb-tack" aria-hidden="true"></i>
285 </a>
276 {/if} 286 {/if}
277 </div> 287 </div>
278 </div> 288 </div>
diff --git a/tpl/default/linklist.paging.html b/tpl/default/linklist.paging.html
index 7b320eaf..aa637868 100644
--- a/tpl/default/linklist.paging.html
+++ b/tpl/default/linklist.paging.html
@@ -1,27 +1,29 @@
1<div class="linklist-paging"> 1<div class="linklist-paging">
2 <div class="paging pure-g"> 2 <div class="paging pure-g">
3 <div class="linklist-filters pure-u-1-3"> 3 <div class="linklist-filters pure-u-1-3">
4 {if="$is_logged_in or !empty($action_plugin)"} 4 <span class="linklist-filters-text pure-u-0 pure-u-lg-visible">
5 <span class="linklist-filters-text pure-u-0 pure-u-lg-visible"> 5 {'Filters'|t}
6 {'Filters'|t} 6 </span>
7 </span> 7 {if="$is_logged_in"}
8 {if="$is_logged_in"} 8 <a href="{$base_path}/admin/visibility/private" aria-label="{'Only display private links'|t}" title="{'Only display private links'|t}"
9 <a href="{$base_path}/admin/visibility/private" aria-label="{'Only display private links'|t}" title="{'Only display private links'|t}" 9 class="{if="$visibility==='private'"}filter-on{else}filter-off{/if}"
10 class="{if="$visibility==='private'"}filter-on{else}filter-off{/if}" 10 ><i class="fa fa-user-secret" aria-hidden="true"></i></a>
11 ><i class="fa fa-user-secret" aria-hidden="true"></i></a> 11 <a href="{$base_path}/admin/visibility/public" aria-label="{'Only display public links'|t}" title="{'Only display public links'|t}"
12 <a href="{$base_path}/admin/visibility/public" aria-label="{'Only display public links'|t}" title="{'Only display public links'|t}" 12 class="{if="$visibility==='public'"}filter-on{else}filter-off{/if}"
13 class="{if="$visibility==='public'"}filter-on{else}filter-off{/if}" 13 ><i class="fa fa-globe" aria-hidden="true"></i></a>
14 ><i class="fa fa-globe" aria-hidden="true"></i></a> 14 {/if}
15 {/if} 15 <a href="{$base_path}/untagged-only" aria-label="{'Filter untagged links'|t}" title="{'Filter untagged links'|t}"
16 <a href="{$base_path}/untagged-only" aria-label="{'Filter untagged links'|t}" title="{'Filter untagged links'|t}" 16 class={if="$untaggedonly"}"filter-on"{else}"filter-off"{/if}
17 class={if="$untaggedonly"}"filter-on"{else}"filter-off"{/if} 17 ><i class="fa fa-tag" aria-hidden="true"></i></a>
18 ><i class="fa fa-tag" aria-hidden="true"></i></a> 18 {if="$is_logged_in"}
19 <a href="#" aria-label="{'Select all'|t}" title="{'Select all'|t}" 19 <a href="#" aria-label="{'Select all'|t}" title="{'Select all'|t}"
20 class="filter-off select-all-button pure-u-0 pure-u-lg-visible" 20 class="filter-off select-all-button pure-u-0 pure-u-lg-visible"
21 ><i class="fa fa-check-square-o" aria-hidden="true"></i></a> 21 ><i class="fa fa-check-square-o" aria-hidden="true"></i></a>
22 <a href="#" class="filter-off fold-all pure-u-lg-0" aria-label="{'Fold all'|t}" title="{'Fold all'|t}"> 22 {/if}
23 <i class="fa fa-chevron-up" aria-hidden="true"></i> 23 <a href="#" class="filter-off fold-all pure-u-lg-0" aria-label="{'Fold all'|t}" title="{'Fold all'|t}">
24 </a> 24 <i class="fa fa-chevron-up" aria-hidden="true"></i>
25 </a>
26 {if="!empty($action_plugin)"}
25 {loop="$action_plugin"} 27 {loop="$action_plugin"}
26 {$value.attr.class=isset($value.attr.class) ? $value.attr.class : ''} 28 {$value.attr.class=isset($value.attr.class) ? $value.attr.class : ''}
27 {$value.attr.class=!empty($value.on) ? $value.attr.class .' filter-on' : $value.attr.class .' filter-off'} 29 {$value.attr.class=!empty($value.on) ? $value.attr.class .' filter-on' : $value.attr.class .' filter-off'}
@@ -53,11 +55,16 @@
53 55
54 <div class="linksperpage pure-u-1-3"> 56 <div class="linksperpage pure-u-1-3">
55 <div class="pure-u-0 pure-u-lg-visible">{'Links per page'|t}</div> 57 <div class="pure-u-0 pure-u-lg-visible">{'Links per page'|t}</div>
56 <a href="{$base_path}/links-per-page?nb=20">20</a> 58 <a href="{$base_path}/links-per-page?nb=20"
57 <a href="{$base_path}/links-per-page?nb=50">50</a> 59 {if="$links_per_page == 20"}class="selected"{/if}>20</a>
58 <a href="{$base_path}/links-per-page?nb=100">100</a> 60 <a href="{$base_path}/links-per-page?nb=50"
61 {if="$links_per_page == 50"}class="selected"{/if}>50</a>
62 <a href="{$base_path}/links-per-page?nb=100"
63 {if="$links_per_page == 100"}class="selected"{/if}>100</a>
59 <form method="GET" class="pure-u-0 pure-u-lg-visible" action="{$base_path}/links-per-page"> 64 <form method="GET" class="pure-u-0 pure-u-lg-visible" action="{$base_path}/links-per-page">
60 <input type="text" name="nb" placeholder="133"> 65 <input type="text" name="nb" placeholder="133"
66 {if="$links_per_page != 20 && $links_per_page != 50 && $links_per_page != 100"}
67 value="{$links_per_page}"{/if}>
61 </form> 68 </form>
62 <a href="#" class="filter-off fold-all pure-u-0 pure-u-lg-visible" aria-label="{'Fold all'|t}" title="{'Fold all'|t}"> 69 <a href="#" class="filter-off fold-all pure-u-0 pure-u-lg-visible" aria-label="{'Fold all'|t}" title="{'Fold all'|t}">
63 <i class="fa fa-chevron-up" aria-hidden="true"></i> 70 <i class="fa fa-chevron-up" aria-hidden="true"></i>
diff --git a/tpl/default/tag.cloud.html b/tpl/default/tag.cloud.html
index 024882ec..c067e1d4 100644
--- a/tpl/default/tag.cloud.html
+++ b/tpl/default/tag.cloud.html
@@ -15,7 +15,7 @@
15 <h2 class="window-title">{'Tag cloud'|t} - {$countTags} {'tags'|t}</h2> 15 <h2 class="window-title">{'Tag cloud'|t} - {$countTags} {'tags'|t}</h2>
16 {if="!empty($search_tags)"} 16 {if="!empty($search_tags)"}
17 <p class="center"> 17 <p class="center">
18 <a href="{$base_path}/?searchtags={$search_tags|urlencode}" class="pure-button pure-button-shaarli"> 18 <a href="{$base_path}/?searchtags={$search_tags_url}" class="pure-button pure-button-shaarli">
19 {'List all links with those tags'|t} 19 {'List all links with those tags'|t}
20 </a> 20 </a>
21 </p> 21 </p>
@@ -48,8 +48,8 @@
48 48
49 <div id="cloudtag" class="cloudtag-container"> 49 <div id="cloudtag" class="cloudtag-container">
50 {loop="tags"} 50 {loop="tags"}
51 <a href="{$base_path}/?searchtags={$key|urlencode} {$search_tags|urlencode}" style="font-size:{$value.size}em;">{$key}</a 51 <a href="{$base_path}/?searchtags={$tags_url.$key1} {$search_tags_url}" style="font-size:{$value.size}em;">{$key}</a
52 ><a href="{$base_path}/add-tag/{$key|urlencode}" title="{'Filter by tag'|t}" class="count">{$value.count}</a> 52 ><a href="{$base_path}/add-tag/{$tags_url.$key1}" title="{'Filter by tag'|t}" class="count">{$value.count}</a>
53 {loop="$value.tag_plugin"} 53 {loop="$value.tag_plugin"}
54 {$value} 54 {$value}
55 {/loop} 55 {/loop}
diff --git a/tpl/default/tag.list.html b/tpl/default/tag.list.html
index 99ae44d2..96e7fbe0 100644
--- a/tpl/default/tag.list.html
+++ b/tpl/default/tag.list.html
@@ -15,7 +15,7 @@
15 <h2 class="window-title">{'Tag list'|t} - {$countTags} {'tags'|t}</h2> 15 <h2 class="window-title">{'Tag list'|t} - {$countTags} {'tags'|t}</h2>
16 {if="!empty($search_tags)"} 16 {if="!empty($search_tags)"}
17 <p class="center"> 17 <p class="center">
18 <a href="{$base_path}/?searchtags={$search_tags|urlencode}" class="pure-button pure-button-shaarli"> 18 <a href="{$base_path}/?searchtags={$search_tags_url}" class="pure-button pure-button-shaarli">
19 {'List all links with those tags'|t} 19 {'List all links with those tags'|t}
20 </a> 20 </a>
21 </p> 21 </p>
@@ -47,17 +47,17 @@
47 47
48 <div id="taglist" class="taglist-container"> 48 <div id="taglist" class="taglist-container">
49 {loop="tags"} 49 {loop="tags"}
50 <div class="tag-list-item pure-g" data-tag="{$key}"> 50 <div class="tag-list-item pure-g" data-tag="{$key}" data-tag-url="{$tags_url.$key1}">
51 <div class="pure-u-1"> 51 <div class="pure-u-1">
52 {if="$is_logged_in===true"} 52 {if="$is_logged_in===true"}
53 <a href="#" class="delete-tag" aria-label="{'Delete'|t}"><i class="fa fa-trash" aria-hidden="true"></i></a>&nbsp;&nbsp; 53 <a href="#" class="delete-tag" aria-label="{'Delete'|t}"><i class="fa fa-trash" aria-hidden="true"></i></a>&nbsp;&nbsp;
54 <a href="{$base_path}/admin/tags?fromtag={$key|urlencode}" class="rename-tag" aria-label="{'Rename tag'|t}"> 54 <a href="{$base_path}/admin/tags?fromtag={$tags_url.$key1}" class="rename-tag" aria-label="{'Rename tag'|t}">
55 <i class="fa fa-pencil-square-o {$key}" aria-hidden="true"></i> 55 <i class="fa fa-pencil-square-o {$key}" aria-hidden="true"></i>
56 </a> 56 </a>
57 {/if} 57 {/if}
58 58
59 <a href="{$base_path}/add-tag/{$key|urlencode}" title="{'Filter by tag'|t}" class="count">{$value}</a> 59 <a href="{$base_path}/add-tag/{$tags_url.$key1}" title="{'Filter by tag'|t}" class="count">{$value}</a>
60 <a href="{$base_path}/?searchtags={$key|urlencode} {$search_tags|urlencode}" class="tag-link">{$key}</a> 60 <a href="{$base_path}/?searchtags={$tags_url.$key1} {$search_tags_url}" class="tag-link">{$key}</a>
61 61
62 {loop="$value.tag_plugin"} 62 {loop="$value.tag_plugin"}
63 {$value} 63 {$value}
diff --git a/tpl/default/tag.sort.html b/tpl/default/tag.sort.html
index 8718b188..b3764e29 100644
--- a/tpl/default/tag.sort.html
+++ b/tpl/default/tag.sort.html
@@ -1,8 +1,8 @@
1<div class="pure-g"> 1<div class="pure-g">
2 <div class="pure-u-1 pure-alert pure-alert-success tag-sort"> 2 <div class="pure-u-1 pure-alert pure-alert-success tag-sort">
3 {'Sort by:'|t} 3 {'Sort by:'|t}
4 <a href="{$base_path}/tags/cloud">{'Cloud'|t}</a> &middot; 4 <a href="{$base_path}/tags/cloud">{'Cloud'|t}</a>
5 <a href="{$base_path}/tags/list?sort=usage">{'Most used'|t}</a> &middot; 5 <a href="{$base_path}/tags/list?sort=usage">{'Most used'|t}</a>
6 <a href="{$base_path}/tags/list?sort=alpha">{'Alphabetical'|t}</a> 6 <a href="{$base_path}/tags/list?sort=alpha">{'Alphabetical'|t}</a>
7 </div> 7 </div>
8</div> 8</div>
diff --git a/tpl/vintage/editlink.html b/tpl/vintage/editlink.html
index c3671b1f..eb8807b5 100644
--- a/tpl/vintage/editlink.html
+++ b/tpl/vintage/editlink.html
@@ -11,7 +11,6 @@
11 <div id="shaarli_title"><a href="{$titleLink}">{$shaarlititle}</a></div> 11 <div id="shaarli_title"><a href="{$titleLink}">{$shaarlititle}</a></div>
12 <div id="editlinkform"> 12 <div id="editlinkform">
13 <form method="post" name="linkform" action="{$base_path}/admin/shaare"> 13 <form method="post" name="linkform" action="{$base_path}/admin/shaare">
14 <input type="hidden" name="lf_linkdate" value="{$link.linkdate}">
15 {if="isset($link.id)"} 14 {if="isset($link.id)"}
16 <input type="hidden" name="lf_id" value="{$link.id}"> 15 <input type="hidden" name="lf_id" value="{$link.id}">
17 {/if} 16 {/if}
diff --git a/tpl/vintage/linklist.paging.html b/tpl/vintage/linklist.paging.html
index b9396df6..79daf16c 100644
--- a/tpl/vintage/linklist.paging.html
+++ b/tpl/vintage/linklist.paging.html
@@ -32,6 +32,6 @@
32 </form> 32 </form>
33 </div> 33 </div>
34 {if="$previous_page_url"} <a href="{$previous_page_url}" class="paging_older">&#x25C4;Older</a> {/if} 34 {if="$previous_page_url"} <a href="{$previous_page_url}" class="paging_older">&#x25C4;Older</a> {/if}
35 <div class="paging_current">page {$page_current} / {$page_max} </div> 35 {if="$page_max>1"}<div class="paging_current">page {$page_current} / {$page_max} </div>{/if}
36 {if="$next_page_url"} <a href="{$next_page_url}" class="paging_newer">Newer&#x25BA;</a> {/if} 36 {if="$next_page_url"} <a href="{$next_page_url}" class="paging_newer">Newer&#x25BA;</a> {/if}
37</div> 37</div>
diff --git a/webpack.config.js b/webpack.config.js
index 602147e5..a73758cc 100644
--- a/webpack.config.js
+++ b/webpack.config.js
@@ -2,26 +2,21 @@ const path = require('path');
2const glob = require('glob'); 2const glob = require('glob');
3 3
4// Minify JS 4// Minify JS
5const MinifyPlugin = require('babel-minify-webpack-plugin'); 5const TerserPlugin = require('terser-webpack-plugin');
6 6
7// This plugin extracts the CSS into its own file instead of tying it with the JS. 7// This plugin extracts the CSS into its own file instead of tying it with the JS.
8// It prevents: 8// It prevents:
9// - not having styles due to a JS error 9// - not having styles due to a JS error
10// - the flash page without styles during JS loading 10// - the flash page without styles during JS loading
11const ExtractTextPlugin = require("extract-text-webpack-plugin"); 11const MiniCssExtractPlugin = require("mini-css-extract-plugin");
12 12
13const extractCssDefault = new ExtractTextPlugin({ 13const extractCss = new MiniCssExtractPlugin({
14 filename: "../css/[name].min.css", 14 filename: "../css/[name].min.css",
15 publicPath: 'tpl/default/css/',
16});
17
18const extractCssVintage = new ExtractTextPlugin({
19 filename: "../css/[name].min.css",
20 publicPath: 'tpl/vintage/css/',
21}); 15});
22 16
23module.exports = [ 17module.exports = [
24 { 18 {
19 mode: 'production',
25 entry: { 20 entry: {
26 thumbnails: './assets/common/js/thumbnails.js', 21 thumbnails: './assets/common/js/thumbnails.js',
27 thumbnails_update: './assets/common/js/thumbnails-update.js', 22 thumbnails_update: './assets/common/js/thumbnails-update.js',
@@ -45,23 +40,23 @@ module.exports = [
45 loader: 'babel-loader', 40 loader: 'babel-loader',
46 options: { 41 options: {
47 presets: [ 42 presets: [
48 'babel-preset-env', 43 '@babel/preset-env',
49 ] 44 ]
50 } 45 }
51 } 46 }
52 }, 47 },
53 { 48 {
54 test: /\.s?css/, 49 test: /\.s?css/,
55 use: extractCssDefault.extract({ 50 use: [
56 use: [{ 51 {
57 loader: "css-loader", 52 loader: MiniCssExtractPlugin.loader,
58 options: { 53 options: {
59 minimize: true, 54 publicPath: 'tpl/default/css/',
60 } 55 },
61 }, { 56 },
62 loader: "sass-loader" 57 'css-loader',
63 }], 58 'sass-loader',
64 }) 59 ],
65 }, 60 },
66 { 61 {
67 test: /\.(gif|png|jpe?g|svg|ico)$/i, 62 test: /\.(gif|png|jpe?g|svg|ico)$/i,
@@ -81,17 +76,21 @@ module.exports = [
81 options: { 76 options: {
82 name: '../fonts/[name].[ext]', 77 name: '../fonts/[name].[ext]',
83 // do not add a publicPath here because it's already handled by CSS's publicPath 78 // do not add a publicPath here because it's already handled by CSS's publicPath
84 publicPath: '', 79 publicPath: '../default/',
85 } 80 }
86 }, 81 },
87 ], 82 ],
88 }, 83 },
84 optimization: {
85 minimize: true,
86 minimizer: [new TerserPlugin()],
87 },
89 plugins: [ 88 plugins: [
90 new MinifyPlugin(), 89 extractCss,
91 extractCssDefault,
92 ], 90 ],
93 }, 91 },
94 { 92 {
93 mode: 'production',
95 entry: { 94 entry: {
96 shaarli: [ 95 shaarli: [
97 './assets/vintage/js/base.js', 96 './assets/vintage/js/base.js',
@@ -115,21 +114,23 @@ module.exports = [
115 loader: 'babel-loader', 114 loader: 'babel-loader',
116 options: { 115 options: {
117 presets: [ 116 presets: [
118 'babel-preset-env', 117 '@babel/preset-env',
119 ] 118 ]
120 } 119 }
121 } 120 }
122 }, 121 },
123 { 122 {
124 test: /\.css$/, 123 test: /\.css$/,
125 use: extractCssVintage.extract({ 124 use: [
126 use: [{ 125 {
127 loader: "css-loader", 126 loader: MiniCssExtractPlugin.loader,
128 options: { 127 options: {
129 minimize: true, 128 publicPath: 'tpl/vintage/css/',
130 } 129 },
131 }], 130 },
132 }) 131 'css-loader',
132 'sass-loader',
133 ],
133 }, 134 },
134 { 135 {
135 test: /\.(gif|png|jpe?g|svg|ico)$/i, 136 test: /\.(gif|png|jpe?g|svg|ico)$/i,
@@ -145,9 +146,12 @@ module.exports = [
145 }, 146 },
146 ], 147 ],
147 }, 148 },
149 optimization: {
150 minimize: true,
151 minimizer: [new TerserPlugin()],
152 },
148 plugins: [ 153 plugins: [
149 new MinifyPlugin(), 154 extractCss,
150 extractCssVintage,
151 ], 155 ],
152 }, 156 },
153]; 157];
diff --git a/yarn.lock b/yarn.lock
index 96f854c1..0a12820c 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2,1015 +2,1317 @@
2# yarn lockfile v1 2# yarn lockfile v1
3 3
4 4
5abbrev@1: 5"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4":
6 version "1.1.1" 6 version "7.10.4"
7 resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" 7 resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a"
8 integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== 8 integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==
9 dependencies:
10 "@babel/highlight" "^7.10.4"
11
12"@babel/compat-data@^7.10.4", "@babel/compat-data@^7.11.0":
13 version "7.11.0"
14 resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.11.0.tgz#e9f73efe09af1355b723a7f39b11bad637d7c99c"
15 integrity sha512-TPSvJfv73ng0pfnEOh17bYMPQbI95+nGWc71Ss4vZdRBHTDqmM9Z8ZV4rYz8Ks7sfzc95n30k6ODIq5UGnXcYQ==
16 dependencies:
17 browserslist "^4.12.0"
18 invariant "^2.2.4"
19 semver "^5.5.0"
20
21"@babel/core@>=7.9.0", "@babel/core@^7.11.6":
22 version "7.11.6"
23 resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.11.6.tgz#3a9455dc7387ff1bac45770650bc13ba04a15651"
24 integrity sha512-Wpcv03AGnmkgm6uS6k8iwhIwTrcP0m17TL1n1sy7qD0qelDu4XNeW0dN0mHfa+Gei211yDaLoEe/VlbXQzM4Bg==
25 dependencies:
26 "@babel/code-frame" "^7.10.4"
27 "@babel/generator" "^7.11.6"
28 "@babel/helper-module-transforms" "^7.11.0"
29 "@babel/helpers" "^7.10.4"
30 "@babel/parser" "^7.11.5"
31 "@babel/template" "^7.10.4"
32 "@babel/traverse" "^7.11.5"
33 "@babel/types" "^7.11.5"
34 convert-source-map "^1.7.0"
35 debug "^4.1.0"
36 gensync "^1.0.0-beta.1"
37 json5 "^2.1.2"
38 lodash "^4.17.19"
39 resolve "^1.3.2"
40 semver "^5.4.1"
41 source-map "^0.5.0"
42
43"@babel/generator@^7.11.5", "@babel/generator@^7.11.6":
44 version "7.11.6"
45 resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.11.6.tgz#b868900f81b163b4d464ea24545c61cbac4dc620"
46 integrity sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA==
47 dependencies:
48 "@babel/types" "^7.11.5"
49 jsesc "^2.5.1"
50 source-map "^0.5.0"
51
52"@babel/helper-annotate-as-pure@^7.10.4":
53 version "7.10.4"
54 resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz#5bf0d495a3f757ac3bda48b5bf3b3ba309c72ba3"
55 integrity sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==
56 dependencies:
57 "@babel/types" "^7.10.4"
58
59"@babel/helper-builder-binary-assignment-operator-visitor@^7.10.4":
60 version "7.10.4"
61 resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz#bb0b75f31bf98cbf9ff143c1ae578b87274ae1a3"
62 integrity sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==
63 dependencies:
64 "@babel/helper-explode-assignable-expression" "^7.10.4"
65 "@babel/types" "^7.10.4"
66
67"@babel/helper-compilation-targets@^7.10.4":
68 version "7.10.4"
69 resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz#804ae8e3f04376607cc791b9d47d540276332bd2"
70 integrity sha512-a3rYhlsGV0UHNDvrtOXBg8/OpfV0OKTkxKPzIplS1zpx7CygDcWWxckxZeDd3gzPzC4kUT0A4nVFDK0wGMh4MQ==
71 dependencies:
72 "@babel/compat-data" "^7.10.4"
73 browserslist "^4.12.0"
74 invariant "^2.2.4"
75 levenary "^1.1.1"
76 semver "^5.5.0"
77
78"@babel/helper-create-class-features-plugin@^7.10.4":
79 version "7.10.5"
80 resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz#9f61446ba80e8240b0a5c85c6fdac8459d6f259d"
81 integrity sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A==
82 dependencies:
83 "@babel/helper-function-name" "^7.10.4"
84 "@babel/helper-member-expression-to-functions" "^7.10.5"
85 "@babel/helper-optimise-call-expression" "^7.10.4"
86 "@babel/helper-plugin-utils" "^7.10.4"
87 "@babel/helper-replace-supers" "^7.10.4"
88 "@babel/helper-split-export-declaration" "^7.10.4"
89
90"@babel/helper-create-regexp-features-plugin@^7.10.4":
91 version "7.10.4"
92 resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz#fdd60d88524659a0b6959c0579925e425714f3b8"
93 integrity sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g==
94 dependencies:
95 "@babel/helper-annotate-as-pure" "^7.10.4"
96 "@babel/helper-regex" "^7.10.4"
97 regexpu-core "^4.7.0"
98
99"@babel/helper-define-map@^7.10.4":
100 version "7.10.5"
101 resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz#b53c10db78a640800152692b13393147acb9bb30"
102 integrity sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==
103 dependencies:
104 "@babel/helper-function-name" "^7.10.4"
105 "@babel/types" "^7.10.5"
106 lodash "^4.17.19"
107
108"@babel/helper-explode-assignable-expression@^7.10.4":
109 version "7.11.4"
110 resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.11.4.tgz#2d8e3470252cc17aba917ede7803d4a7a276a41b"
111 integrity sha512-ux9hm3zR4WV1Y3xXxXkdG/0gxF9nvI0YVmKVhvK9AfMoaQkemL3sJpXw+Xbz65azo8qJiEz2XVDUpK3KYhH3ZQ==
112 dependencies:
113 "@babel/types" "^7.10.4"
114
115"@babel/helper-function-name@^7.10.4":
116 version "7.10.4"
117 resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz#d2d3b20c59ad8c47112fa7d2a94bc09d5ef82f1a"
118 integrity sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==
119 dependencies:
120 "@babel/helper-get-function-arity" "^7.10.4"
121 "@babel/template" "^7.10.4"
122 "@babel/types" "^7.10.4"
123
124"@babel/helper-get-function-arity@^7.10.4":
125 version "7.10.4"
126 resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz#98c1cbea0e2332f33f9a4661b8ce1505b2c19ba2"
127 integrity sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==
128 dependencies:
129 "@babel/types" "^7.10.4"
130
131"@babel/helper-hoist-variables@^7.10.4":
132 version "7.10.4"
133 resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz#d49b001d1d5a68ca5e6604dda01a6297f7c9381e"
134 integrity sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==
135 dependencies:
136 "@babel/types" "^7.10.4"
137
138"@babel/helper-member-expression-to-functions@^7.10.4", "@babel/helper-member-expression-to-functions@^7.10.5":
139 version "7.11.0"
140 resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz#ae69c83d84ee82f4b42f96e2a09410935a8f26df"
141 integrity sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==
142 dependencies:
143 "@babel/types" "^7.11.0"
144
145"@babel/helper-module-imports@^7.10.4":
146 version "7.10.4"
147 resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz#4c5c54be04bd31670a7382797d75b9fa2e5b5620"
148 integrity sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==
149 dependencies:
150 "@babel/types" "^7.10.4"
151
152"@babel/helper-module-transforms@^7.10.4", "@babel/helper-module-transforms@^7.10.5", "@babel/helper-module-transforms@^7.11.0":
153 version "7.11.0"
154 resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz#b16f250229e47211abdd84b34b64737c2ab2d359"
155 integrity sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==
156 dependencies:
157 "@babel/helper-module-imports" "^7.10.4"
158 "@babel/helper-replace-supers" "^7.10.4"
159 "@babel/helper-simple-access" "^7.10.4"
160 "@babel/helper-split-export-declaration" "^7.11.0"
161 "@babel/template" "^7.10.4"
162 "@babel/types" "^7.11.0"
163 lodash "^4.17.19"
164
165"@babel/helper-optimise-call-expression@^7.10.4":
166 version "7.10.4"
167 resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz#50dc96413d594f995a77905905b05893cd779673"
168 integrity sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==
169 dependencies:
170 "@babel/types" "^7.10.4"
171
172"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3":
173 version "7.10.4"
174 resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375"
175 integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==
176
177"@babel/helper-regex@^7.10.4":
178 version "7.10.5"
179 resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.10.5.tgz#32dfbb79899073c415557053a19bd055aae50ae0"
180 integrity sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==
181 dependencies:
182 lodash "^4.17.19"
183
184"@babel/helper-remap-async-to-generator@^7.10.4":
185 version "7.11.4"
186 resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.11.4.tgz#4474ea9f7438f18575e30b0cac784045b402a12d"
187 integrity sha512-tR5vJ/vBa9wFy3m5LLv2faapJLnDFxNWff2SAYkSE4rLUdbp7CdObYFgI7wK4T/Mj4UzpjPwzR8Pzmr5m7MHGA==
188 dependencies:
189 "@babel/helper-annotate-as-pure" "^7.10.4"
190 "@babel/helper-wrap-function" "^7.10.4"
191 "@babel/template" "^7.10.4"
192 "@babel/types" "^7.10.4"
193
194"@babel/helper-replace-supers@^7.10.4":
195 version "7.10.4"
196 resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz#d585cd9388ea06e6031e4cd44b6713cbead9e6cf"
197 integrity sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==
198 dependencies:
199 "@babel/helper-member-expression-to-functions" "^7.10.4"
200 "@babel/helper-optimise-call-expression" "^7.10.4"
201 "@babel/traverse" "^7.10.4"
202 "@babel/types" "^7.10.4"
203
204"@babel/helper-simple-access@^7.10.4":
205 version "7.10.4"
206 resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz#0f5ccda2945277a2a7a2d3a821e15395edcf3461"
207 integrity sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==
208 dependencies:
209 "@babel/template" "^7.10.4"
210 "@babel/types" "^7.10.4"
211
212"@babel/helper-skip-transparent-expression-wrappers@^7.11.0":
213 version "7.11.0"
214 resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.11.0.tgz#eec162f112c2f58d3af0af125e3bb57665146729"
215 integrity sha512-0XIdiQln4Elglgjbwo9wuJpL/K7AGCY26kmEt0+pRP0TAj4jjyNq1MjoRvikrTVqKcx4Gysxt4cXvVFXP/JO2Q==
216 dependencies:
217 "@babel/types" "^7.11.0"
218
219"@babel/helper-split-export-declaration@^7.10.4", "@babel/helper-split-export-declaration@^7.11.0":
220 version "7.11.0"
221 resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz#f8a491244acf6a676158ac42072911ba83ad099f"
222 integrity sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==
223 dependencies:
224 "@babel/types" "^7.11.0"
225
226"@babel/helper-validator-identifier@^7.10.4":
227 version "7.10.4"
228 resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2"
229 integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==
230
231"@babel/helper-wrap-function@^7.10.4":
232 version "7.10.4"
233 resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz#8a6f701eab0ff39f765b5a1cfef409990e624b87"
234 integrity sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug==
235 dependencies:
236 "@babel/helper-function-name" "^7.10.4"
237 "@babel/template" "^7.10.4"
238 "@babel/traverse" "^7.10.4"
239 "@babel/types" "^7.10.4"
240
241"@babel/helpers@^7.10.4":
242 version "7.10.4"
243 resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.10.4.tgz#2abeb0d721aff7c0a97376b9e1f6f65d7a475044"
244 integrity sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==
245 dependencies:
246 "@babel/template" "^7.10.4"
247 "@babel/traverse" "^7.10.4"
248 "@babel/types" "^7.10.4"
249
250"@babel/highlight@^7.10.4":
251 version "7.10.4"
252 resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143"
253 integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==
254 dependencies:
255 "@babel/helper-validator-identifier" "^7.10.4"
256 chalk "^2.0.0"
257 js-tokens "^4.0.0"
258
259"@babel/parser@^7.10.4", "@babel/parser@^7.11.5":
260 version "7.11.5"
261 resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.5.tgz#c7ff6303df71080ec7a4f5b8c003c58f1cf51037"
262 integrity sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==
9 263
10acorn-dynamic-import@^2.0.0: 264"@babel/plugin-proposal-async-generator-functions@^7.10.4":
11 version "2.0.2" 265 version "7.10.5"
12 resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz#c752bd210bef679501b6c6cb7fc84f8f47158cc4" 266 resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz#3491cabf2f7c179ab820606cec27fed15e0e8558"
13 integrity sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ= 267 integrity sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg==
268 dependencies:
269 "@babel/helper-plugin-utils" "^7.10.4"
270 "@babel/helper-remap-async-to-generator" "^7.10.4"
271 "@babel/plugin-syntax-async-generators" "^7.8.0"
272
273"@babel/plugin-proposal-class-properties@^7.10.4":
274 version "7.10.4"
275 resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz#a33bf632da390a59c7a8c570045d1115cd778807"
276 integrity sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg==
14 dependencies: 277 dependencies:
15 acorn "^4.0.3" 278 "@babel/helper-create-class-features-plugin" "^7.10.4"
16 279 "@babel/helper-plugin-utils" "^7.10.4"
17acorn-jsx@^3.0.0: 280
18 version "3.0.1" 281"@babel/plugin-proposal-dynamic-import@^7.10.4":
19 resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" 282 version "7.10.4"
20 integrity sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s= 283 resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz#ba57a26cb98b37741e9d5bca1b8b0ddf8291f17e"
284 integrity sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ==
285 dependencies:
286 "@babel/helper-plugin-utils" "^7.10.4"
287 "@babel/plugin-syntax-dynamic-import" "^7.8.0"
288
289"@babel/plugin-proposal-export-namespace-from@^7.10.4":
290 version "7.10.4"
291 resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.10.4.tgz#570d883b91031637b3e2958eea3c438e62c05f54"
292 integrity sha512-aNdf0LY6/3WXkhh0Fdb6Zk9j1NMD8ovj3F6r0+3j837Pn1S1PdNtcwJ5EG9WkVPNHPxyJDaxMaAOVq4eki0qbg==
21 dependencies: 293 dependencies:
22 acorn "^3.0.4" 294 "@babel/helper-plugin-utils" "^7.10.4"
295 "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
23 296
24acorn@^3.0.4: 297"@babel/plugin-proposal-json-strings@^7.10.4":
25 version "3.3.0" 298 version "7.10.4"
26 resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" 299 resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz#593e59c63528160233bd321b1aebe0820c2341db"
27 integrity sha1-ReN/s56No/JbruP/U2niu18iAXo= 300 integrity sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw==
301 dependencies:
302 "@babel/helper-plugin-utils" "^7.10.4"
303 "@babel/plugin-syntax-json-strings" "^7.8.0"
28 304
29acorn@^4.0.3: 305"@babel/plugin-proposal-logical-assignment-operators@^7.11.0":
30 version "4.0.13" 306 version "7.11.0"
31 resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" 307 resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.11.0.tgz#9f80e482c03083c87125dee10026b58527ea20c8"
32 integrity sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c= 308 integrity sha512-/f8p4z+Auz0Uaf+i8Ekf1iM7wUNLcViFUGiPxKeXvxTSl63B875YPiVdUDdem7hREcI0E0kSpEhS8tF5RphK7Q==
309 dependencies:
310 "@babel/helper-plugin-utils" "^7.10.4"
311 "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
33 312
34acorn@^5.0.0, acorn@^5.5.0: 313"@babel/plugin-proposal-nullish-coalescing-operator@^7.10.4":
35 version "5.7.3" 314 version "7.10.4"
36 resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" 315 resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz#02a7e961fc32e6d5b2db0649e01bf80ddee7e04a"
37 integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== 316 integrity sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw==
317 dependencies:
318 "@babel/helper-plugin-utils" "^7.10.4"
319 "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0"
38 320
39ajv-keywords@^1.0.0: 321"@babel/plugin-proposal-numeric-separator@^7.10.4":
40 version "1.5.1" 322 version "7.10.4"
41 resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c" 323 resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz#ce1590ff0a65ad12970a609d78855e9a4c1aef06"
42 integrity sha1-MU3QpLM2j609/NxU7eYXG4htrzw= 324 integrity sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA==
325 dependencies:
326 "@babel/helper-plugin-utils" "^7.10.4"
327 "@babel/plugin-syntax-numeric-separator" "^7.10.4"
43 328
44ajv-keywords@^2.1.0: 329"@babel/plugin-proposal-object-rest-spread@^7.11.0":
45 version "2.1.1" 330 version "7.11.0"
46 resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" 331 resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz#bd81f95a1f746760ea43b6c2d3d62b11790ad0af"
47 integrity sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I= 332 integrity sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA==
333 dependencies:
334 "@babel/helper-plugin-utils" "^7.10.4"
335 "@babel/plugin-syntax-object-rest-spread" "^7.8.0"
336 "@babel/plugin-transform-parameters" "^7.10.4"
48 337
49ajv-keywords@^3.1.0: 338"@babel/plugin-proposal-optional-catch-binding@^7.10.4":
50 version "3.4.0" 339 version "7.10.4"
51 resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.0.tgz#4b831e7b531415a7cc518cd404e73f6193c6349d" 340 resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz#31c938309d24a78a49d68fdabffaa863758554dd"
52 integrity sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw== 341 integrity sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g==
342 dependencies:
343 "@babel/helper-plugin-utils" "^7.10.4"
344 "@babel/plugin-syntax-optional-catch-binding" "^7.8.0"
53 345
54ajv@^4.7.0: 346"@babel/plugin-proposal-optional-chaining@^7.11.0":
55 version "4.11.8" 347 version "7.11.0"
56 resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" 348 resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.11.0.tgz#de5866d0646f6afdaab8a566382fe3a221755076"
57 integrity sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY= 349 integrity sha512-v9fZIu3Y8562RRwhm1BbMRxtqZNFmFA2EG+pT2diuU8PT3H6T/KXoZ54KgYisfOFZHV6PfvAiBIZ9Rcz+/JCxA==
58 dependencies: 350 dependencies:
59 co "^4.6.0" 351 "@babel/helper-plugin-utils" "^7.10.4"
60 json-stable-stringify "^1.0.1" 352 "@babel/helper-skip-transparent-expression-wrappers" "^7.11.0"
353 "@babel/plugin-syntax-optional-chaining" "^7.8.0"
61 354
62ajv@^5.0.0, ajv@^5.2.3, ajv@^5.3.0: 355"@babel/plugin-proposal-private-methods@^7.10.4":
63 version "5.5.2" 356 version "7.10.4"
64 resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" 357 resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz#b160d972b8fdba5c7d111a145fc8c421fc2a6909"
65 integrity sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU= 358 integrity sha512-wh5GJleuI8k3emgTg5KkJK6kHNsGEr0uBTDBuQUBJwckk9xs1ez79ioheEVVxMLyPscB0LfkbVHslQqIzWV6Bw==
66 dependencies: 359 dependencies:
67 co "^4.6.0" 360 "@babel/helper-create-class-features-plugin" "^7.10.4"
68 fast-deep-equal "^1.0.0" 361 "@babel/helper-plugin-utils" "^7.10.4"
69 fast-json-stable-stringify "^2.0.0"
70 json-schema-traverse "^0.3.0"
71 362
72ajv@^6.1.0, ajv@^6.5.5: 363"@babel/plugin-proposal-unicode-property-regex@^7.10.4", "@babel/plugin-proposal-unicode-property-regex@^7.4.4":
73 version "6.10.0" 364 version "7.10.4"
74 resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.0.tgz#90d0d54439da587cd7e843bfb7045f50bd22bdf1" 365 resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz#4483cda53041ce3413b7fe2f00022665ddfaa75d"
75 integrity sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg== 366 integrity sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA==
76 dependencies: 367 dependencies:
77 fast-deep-equal "^2.0.1" 368 "@babel/helper-create-regexp-features-plugin" "^7.10.4"
78 fast-json-stable-stringify "^2.0.0" 369 "@babel/helper-plugin-utils" "^7.10.4"
79 json-schema-traverse "^0.4.1"
80 uri-js "^4.2.2"
81 370
82align-text@^0.1.1, align-text@^0.1.3: 371"@babel/plugin-syntax-async-generators@^7.8.0":
83 version "0.1.4" 372 version "7.8.4"
84 resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" 373 resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d"
85 integrity sha1-DNkKVhCT810KmSVsIrcGlDP60Rc= 374 integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==
86 dependencies: 375 dependencies:
87 kind-of "^3.0.2" 376 "@babel/helper-plugin-utils" "^7.8.0"
88 longest "^1.0.1"
89 repeat-string "^1.5.2"
90 377
91alphanum-sort@^1.0.1, alphanum-sort@^1.0.2: 378"@babel/plugin-syntax-class-properties@^7.10.4":
92 version "1.0.2" 379 version "7.10.4"
93 resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" 380 resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz#6644e6a0baa55a61f9e3231f6c9eeb6ee46c124c"
94 integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= 381 integrity sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA==
382 dependencies:
383 "@babel/helper-plugin-utils" "^7.10.4"
95 384
96amdefine@>=0.0.4: 385"@babel/plugin-syntax-dynamic-import@^7.8.0":
97 version "1.0.1" 386 version "7.8.3"
98 resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" 387 resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3"
99 integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= 388 integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==
389 dependencies:
390 "@babel/helper-plugin-utils" "^7.8.0"
100 391
101ansi-escapes@^1.1.0: 392"@babel/plugin-syntax-export-namespace-from@^7.8.3":
102 version "1.4.0" 393 version "7.8.3"
103 resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" 394 resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a"
104 integrity sha1-06ioOzGapneTZisT52HHkRQiMG4= 395 integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==
396 dependencies:
397 "@babel/helper-plugin-utils" "^7.8.3"
105 398
106ansi-escapes@^3.0.0: 399"@babel/plugin-syntax-json-strings@^7.8.0":
107 version "3.2.0" 400 version "7.8.3"
108 resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" 401 resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a"
109 integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== 402 integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==
403 dependencies:
404 "@babel/helper-plugin-utils" "^7.8.0"
110 405
111ansi-regex@^2.0.0: 406"@babel/plugin-syntax-logical-assignment-operators@^7.10.4":
112 version "2.1.1" 407 version "7.10.4"
113 resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 408 resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699"
114 integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= 409 integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==
410 dependencies:
411 "@babel/helper-plugin-utils" "^7.10.4"
115 412
116ansi-regex@^3.0.0: 413"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0":
117 version "3.0.0" 414 version "7.8.3"
118 resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 415 resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9"
119 integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= 416 integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==
417 dependencies:
418 "@babel/helper-plugin-utils" "^7.8.0"
120 419
121ansi-styles@^2.2.1: 420"@babel/plugin-syntax-numeric-separator@^7.10.4":
122 version "2.2.1" 421 version "7.10.4"
123 resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 422 resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97"
124 integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= 423 integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==
424 dependencies:
425 "@babel/helper-plugin-utils" "^7.10.4"
125 426
126ansi-styles@^3.2.1: 427"@babel/plugin-syntax-object-rest-spread@^7.8.0":
127 version "3.2.1" 428 version "7.8.3"
128 resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 429 resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871"
129 integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 430 integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==
130 dependencies: 431 dependencies:
131 color-convert "^1.9.0" 432 "@babel/helper-plugin-utils" "^7.8.0"
132 433
133anymatch@^2.0.0: 434"@babel/plugin-syntax-optional-catch-binding@^7.8.0":
134 version "2.0.0" 435 version "7.8.3"
135 resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" 436 resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1"
136 integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== 437 integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==
137 dependencies: 438 dependencies:
138 micromatch "^3.1.4" 439 "@babel/helper-plugin-utils" "^7.8.0"
139 normalize-path "^2.1.1"
140 440
141aproba@^1.0.3: 441"@babel/plugin-syntax-optional-chaining@^7.8.0":
142 version "1.2.0" 442 version "7.8.3"
143 resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" 443 resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a"
144 integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== 444 integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==
445 dependencies:
446 "@babel/helper-plugin-utils" "^7.8.0"
145 447
146are-we-there-yet@~1.1.2: 448"@babel/plugin-syntax-top-level-await@^7.10.4":
147 version "1.1.5" 449 version "7.10.4"
148 resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" 450 resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz#4bbeb8917b54fcf768364e0a81f560e33a3ef57d"
149 integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== 451 integrity sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ==
150 dependencies: 452 dependencies:
151 delegates "^1.0.0" 453 "@babel/helper-plugin-utils" "^7.10.4"
152 readable-stream "^2.0.6"
153 454
154argparse@^1.0.7: 455"@babel/plugin-transform-arrow-functions@^7.10.4":
155 version "1.0.10" 456 version "7.10.4"
156 resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 457 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz#e22960d77e697c74f41c501d44d73dbf8a6a64cd"
157 integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== 458 integrity sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA==
158 dependencies: 459 dependencies:
159 sprintf-js "~1.0.2" 460 "@babel/helper-plugin-utils" "^7.10.4"
160 461
161arr-diff@^4.0.0: 462"@babel/plugin-transform-async-to-generator@^7.10.4":
162 version "4.0.0" 463 version "7.10.4"
163 resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" 464 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz#41a5017e49eb6f3cda9392a51eef29405b245a37"
164 integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= 465 integrity sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ==
466 dependencies:
467 "@babel/helper-module-imports" "^7.10.4"
468 "@babel/helper-plugin-utils" "^7.10.4"
469 "@babel/helper-remap-async-to-generator" "^7.10.4"
165 470
166arr-flatten@^1.1.0: 471"@babel/plugin-transform-block-scoped-functions@^7.10.4":
167 version "1.1.0" 472 version "7.10.4"
168 resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" 473 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz#1afa595744f75e43a91af73b0d998ecfe4ebc2e8"
169 integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== 474 integrity sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA==
475 dependencies:
476 "@babel/helper-plugin-utils" "^7.10.4"
170 477
171arr-union@^3.1.0: 478"@babel/plugin-transform-block-scoping@^7.10.4":
172 version "3.1.0" 479 version "7.11.1"
173 resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" 480 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.11.1.tgz#5b7efe98852bef8d652c0b28144cd93a9e4b5215"
174 integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= 481 integrity sha512-00dYeDE0EVEHuuM+26+0w/SCL0BH2Qy7LwHuI4Hi4MH5gkC8/AqMN5uWFJIsoXZrAphiMm1iXzBw6L2T+eA0ew==
482 dependencies:
483 "@babel/helper-plugin-utils" "^7.10.4"
175 484
176array-find-index@^1.0.1: 485"@babel/plugin-transform-classes@^7.10.4":
177 version "1.0.2" 486 version "7.10.4"
178 resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" 487 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz#405136af2b3e218bc4a1926228bc917ab1a0adc7"
179 integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= 488 integrity sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA==
489 dependencies:
490 "@babel/helper-annotate-as-pure" "^7.10.4"
491 "@babel/helper-define-map" "^7.10.4"
492 "@babel/helper-function-name" "^7.10.4"
493 "@babel/helper-optimise-call-expression" "^7.10.4"
494 "@babel/helper-plugin-utils" "^7.10.4"
495 "@babel/helper-replace-supers" "^7.10.4"
496 "@babel/helper-split-export-declaration" "^7.10.4"
497 globals "^11.1.0"
180 498
181array-includes@^3.0.3: 499"@babel/plugin-transform-computed-properties@^7.10.4":
182 version "3.0.3" 500 version "7.10.4"
183 resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d" 501 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz#9ded83a816e82ded28d52d4b4ecbdd810cdfc0eb"
184 integrity sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0= 502 integrity sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw==
185 dependencies: 503 dependencies:
186 define-properties "^1.1.2" 504 "@babel/helper-plugin-utils" "^7.10.4"
187 es-abstract "^1.7.0"
188 505
189array-unique@^0.3.2: 506"@babel/plugin-transform-destructuring@^7.10.4":
190 version "0.3.2" 507 version "7.10.4"
191 resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" 508 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz#70ddd2b3d1bea83d01509e9bb25ddb3a74fc85e5"
192 integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= 509 integrity sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA==
510 dependencies:
511 "@babel/helper-plugin-utils" "^7.10.4"
193 512
194asn1.js@^4.0.0: 513"@babel/plugin-transform-dotall-regex@^7.10.4", "@babel/plugin-transform-dotall-regex@^7.4.4":
195 version "4.10.1" 514 version "7.10.4"
196 resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" 515 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz#469c2062105c1eb6a040eaf4fac4b488078395ee"
197 integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== 516 integrity sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA==
198 dependencies: 517 dependencies:
199 bn.js "^4.0.0" 518 "@babel/helper-create-regexp-features-plugin" "^7.10.4"
200 inherits "^2.0.1" 519 "@babel/helper-plugin-utils" "^7.10.4"
201 minimalistic-assert "^1.0.0"
202 520
203asn1@~0.2.3: 521"@babel/plugin-transform-duplicate-keys@^7.10.4":
204 version "0.2.4" 522 version "7.10.4"
205 resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" 523 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz#697e50c9fee14380fe843d1f306b295617431e47"
206 integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== 524 integrity sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA==
207 dependencies: 525 dependencies:
208 safer-buffer "~2.1.0" 526 "@babel/helper-plugin-utils" "^7.10.4"
209 527
210assert-plus@1.0.0, assert-plus@^1.0.0: 528"@babel/plugin-transform-exponentiation-operator@^7.10.4":
211 version "1.0.0" 529 version "7.10.4"
212 resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" 530 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz#5ae338c57f8cf4001bdb35607ae66b92d665af2e"
213 integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= 531 integrity sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw==
532 dependencies:
533 "@babel/helper-builder-binary-assignment-operator-visitor" "^7.10.4"
534 "@babel/helper-plugin-utils" "^7.10.4"
214 535
215assert@^1.1.1: 536"@babel/plugin-transform-for-of@^7.10.4":
216 version "1.5.0" 537 version "7.10.4"
217 resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" 538 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz#c08892e8819d3a5db29031b115af511dbbfebae9"
218 integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== 539 integrity sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ==
219 dependencies: 540 dependencies:
220 object-assign "^4.1.1" 541 "@babel/helper-plugin-utils" "^7.10.4"
221 util "0.10.3"
222 542
223assign-symbols@^1.0.0: 543"@babel/plugin-transform-function-name@^7.10.4":
224 version "1.0.0" 544 version "7.10.4"
225 resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" 545 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz#6a467880e0fc9638514ba369111811ddbe2644b7"
226 integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= 546 integrity sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg==
547 dependencies:
548 "@babel/helper-function-name" "^7.10.4"
549 "@babel/helper-plugin-utils" "^7.10.4"
227 550
228async-each@^1.0.1: 551"@babel/plugin-transform-literals@^7.10.4":
229 version "1.0.3" 552 version "7.10.4"
230 resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" 553 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz#9f42ba0841100a135f22712d0e391c462f571f3c"
231 integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== 554 integrity sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ==
555 dependencies:
556 "@babel/helper-plugin-utils" "^7.10.4"
232 557
233async-foreach@^0.1.3: 558"@babel/plugin-transform-member-expression-literals@^7.10.4":
234 version "0.1.3" 559 version "7.10.4"
235 resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" 560 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz#b1ec44fcf195afcb8db2c62cd8e551c881baf8b7"
236 integrity sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI= 561 integrity sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw==
562 dependencies:
563 "@babel/helper-plugin-utils" "^7.10.4"
237 564
238async@^2.1.2, async@^2.4.1: 565"@babel/plugin-transform-modules-amd@^7.10.4":
239 version "2.6.2" 566 version "7.10.5"
240 resolved "https://registry.yarnpkg.com/async/-/async-2.6.2.tgz#18330ea7e6e313887f5d2f2a904bac6fe4dd5381" 567 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz#1b9cddaf05d9e88b3aad339cb3e445c4f020a9b1"
241 integrity sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg== 568 integrity sha512-elm5uruNio7CTLFItVC/rIzKLfQ17+fX7EVz5W0TMgIHFo1zY0Ozzx+lgwhL4plzl8OzVn6Qasx5DeEFyoNiRw==
242 dependencies: 569 dependencies:
243 lodash "^4.17.11" 570 "@babel/helper-module-transforms" "^7.10.5"
571 "@babel/helper-plugin-utils" "^7.10.4"
572 babel-plugin-dynamic-import-node "^2.3.3"
244 573
245asynckit@^0.4.0: 574"@babel/plugin-transform-modules-commonjs@^7.10.4":
246 version "0.4.0" 575 version "7.10.4"
247 resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 576 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz#66667c3eeda1ebf7896d41f1f16b17105a2fbca0"
248 integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= 577 integrity sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w==
578 dependencies:
579 "@babel/helper-module-transforms" "^7.10.4"
580 "@babel/helper-plugin-utils" "^7.10.4"
581 "@babel/helper-simple-access" "^7.10.4"
582 babel-plugin-dynamic-import-node "^2.3.3"
249 583
250atob@^2.1.1: 584"@babel/plugin-transform-modules-systemjs@^7.10.4":
251 version "2.1.2" 585 version "7.10.5"
252 resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" 586 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.5.tgz#6270099c854066681bae9e05f87e1b9cadbe8c85"
253 integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== 587 integrity sha512-f4RLO/OL14/FP1AEbcsWMzpbUz6tssRaeQg11RH1BP/XnPpRoVwgeYViMFacnkaw4k4wjRSjn3ip1Uw9TaXuMw==
588 dependencies:
589 "@babel/helper-hoist-variables" "^7.10.4"
590 "@babel/helper-module-transforms" "^7.10.5"
591 "@babel/helper-plugin-utils" "^7.10.4"
592 babel-plugin-dynamic-import-node "^2.3.3"
254 593
255autoprefixer@^6.3.1: 594"@babel/plugin-transform-modules-umd@^7.10.4":
256 version "6.7.7" 595 version "7.10.4"
257 resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.7.7.tgz#1dbd1c835658e35ce3f9984099db00585c782014" 596 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz#9a8481fe81b824654b3a0b65da3df89f3d21839e"
258 integrity sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ= 597 integrity sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA==
259 dependencies: 598 dependencies:
260 browserslist "^1.7.6" 599 "@babel/helper-module-transforms" "^7.10.4"
261 caniuse-db "^1.0.30000634" 600 "@babel/helper-plugin-utils" "^7.10.4"
262 normalize-range "^0.1.2"
263 num2fraction "^1.2.2"
264 postcss "^5.2.16"
265 postcss-value-parser "^3.2.3"
266 601
267awesomplete@^1.1.2: 602"@babel/plugin-transform-named-capturing-groups-regex@^7.10.4":
268 version "1.1.4" 603 version "7.10.4"
269 resolved "https://registry.yarnpkg.com/awesomplete/-/awesomplete-1.1.4.tgz#cdfcbbb2391857ff3a3340b5b1ebde7701b355e6" 604 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz#78b4d978810b6f3bcf03f9e318f2fc0ed41aecb6"
270 integrity sha512-AgYrODNlVD3ZJ6Em54YesLnOSusuVCjoRAt0l5bi3L1Oiv5r5dkPdxVPJaG3/wnPlxRUmGcpGnK02VK7N02kCg== 605 integrity sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA==
606 dependencies:
607 "@babel/helper-create-regexp-features-plugin" "^7.10.4"
271 608
272aws-sign2@~0.7.0: 609"@babel/plugin-transform-new-target@^7.10.4":
273 version "0.7.0" 610 version "7.10.4"
274 resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" 611 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz#9097d753cb7b024cb7381a3b2e52e9513a9c6888"
275 integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= 612 integrity sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw==
613 dependencies:
614 "@babel/helper-plugin-utils" "^7.10.4"
276 615
277aws4@^1.8.0: 616"@babel/plugin-transform-object-super@^7.10.4":
278 version "1.8.0" 617 version "7.10.4"
279 resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" 618 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz#d7146c4d139433e7a6526f888c667e314a093894"
280 integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== 619 integrity sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ==
620 dependencies:
621 "@babel/helper-plugin-utils" "^7.10.4"
622 "@babel/helper-replace-supers" "^7.10.4"
623
624"@babel/plugin-transform-parameters@^7.10.4":
625 version "7.10.5"
626 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz#59d339d58d0b1950435f4043e74e2510005e2c4a"
627 integrity sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw==
628 dependencies:
629 "@babel/helper-get-function-arity" "^7.10.4"
630 "@babel/helper-plugin-utils" "^7.10.4"
631
632"@babel/plugin-transform-property-literals@^7.10.4":
633 version "7.10.4"
634 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz#f6fe54b6590352298785b83edd815d214c42e3c0"
635 integrity sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g==
636 dependencies:
637 "@babel/helper-plugin-utils" "^7.10.4"
638
639"@babel/plugin-transform-regenerator@^7.10.4":
640 version "7.10.4"
641 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz#2015e59d839074e76838de2159db421966fd8b63"
642 integrity sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw==
643 dependencies:
644 regenerator-transform "^0.14.2"
645
646"@babel/plugin-transform-reserved-words@^7.10.4":
647 version "7.10.4"
648 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz#8f2682bcdcef9ed327e1b0861585d7013f8a54dd"
649 integrity sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ==
650 dependencies:
651 "@babel/helper-plugin-utils" "^7.10.4"
652
653"@babel/plugin-transform-shorthand-properties@^7.10.4":
654 version "7.10.4"
655 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz#9fd25ec5cdd555bb7f473e5e6ee1c971eede4dd6"
656 integrity sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q==
657 dependencies:
658 "@babel/helper-plugin-utils" "^7.10.4"
659
660"@babel/plugin-transform-spread@^7.11.0":
661 version "7.11.0"
662 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.11.0.tgz#fa84d300f5e4f57752fe41a6d1b3c554f13f17cc"
663 integrity sha512-UwQYGOqIdQJe4aWNyS7noqAnN2VbaczPLiEtln+zPowRNlD+79w3oi2TWfYe0eZgd+gjZCbsydN7lzWysDt+gw==
664 dependencies:
665 "@babel/helper-plugin-utils" "^7.10.4"
666 "@babel/helper-skip-transparent-expression-wrappers" "^7.11.0"
667
668"@babel/plugin-transform-sticky-regex@^7.10.4":
669 version "7.10.4"
670 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz#8f3889ee8657581130a29d9cc91d7c73b7c4a28d"
671 integrity sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ==
672 dependencies:
673 "@babel/helper-plugin-utils" "^7.10.4"
674 "@babel/helper-regex" "^7.10.4"
675
676"@babel/plugin-transform-template-literals@^7.10.4":
677 version "7.10.5"
678 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz#78bc5d626a6642db3312d9d0f001f5e7639fde8c"
679 integrity sha512-V/lnPGIb+KT12OQikDvgSuesRX14ck5FfJXt6+tXhdkJ+Vsd0lDCVtF6jcB4rNClYFzaB2jusZ+lNISDk2mMMw==
680 dependencies:
681 "@babel/helper-annotate-as-pure" "^7.10.4"
682 "@babel/helper-plugin-utils" "^7.10.4"
683
684"@babel/plugin-transform-typeof-symbol@^7.10.4":
685 version "7.10.4"
686 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz#9509f1a7eec31c4edbffe137c16cc33ff0bc5bfc"
687 integrity sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA==
688 dependencies:
689 "@babel/helper-plugin-utils" "^7.10.4"
690
691"@babel/plugin-transform-unicode-escapes@^7.10.4":
692 version "7.10.4"
693 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.4.tgz#feae523391c7651ddac115dae0a9d06857892007"
694 integrity sha512-y5XJ9waMti2J+e7ij20e+aH+fho7Wb7W8rNuu72aKRwCHFqQdhkdU2lo3uZ9tQuboEJcUFayXdARhcxLQ3+6Fg==
695 dependencies:
696 "@babel/helper-plugin-utils" "^7.10.4"
697
698"@babel/plugin-transform-unicode-regex@^7.10.4":
699 version "7.10.4"
700 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz#e56d71f9282fac6db09c82742055576d5e6d80a8"
701 integrity sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A==
702 dependencies:
703 "@babel/helper-create-regexp-features-plugin" "^7.10.4"
704 "@babel/helper-plugin-utils" "^7.10.4"
705
706"@babel/preset-env@^7.11.5":
707 version "7.11.5"
708 resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.11.5.tgz#18cb4b9379e3e92ffea92c07471a99a2914e4272"
709 integrity sha512-kXqmW1jVcnB2cdueV+fyBM8estd5mlNfaQi6lwLgRwCby4edpavgbFhiBNjmWA3JpB/yZGSISa7Srf+TwxDQoA==
710 dependencies:
711 "@babel/compat-data" "^7.11.0"
712 "@babel/helper-compilation-targets" "^7.10.4"
713 "@babel/helper-module-imports" "^7.10.4"
714 "@babel/helper-plugin-utils" "^7.10.4"
715 "@babel/plugin-proposal-async-generator-functions" "^7.10.4"
716 "@babel/plugin-proposal-class-properties" "^7.10.4"
717 "@babel/plugin-proposal-dynamic-import" "^7.10.4"
718 "@babel/plugin-proposal-export-namespace-from" "^7.10.4"
719 "@babel/plugin-proposal-json-strings" "^7.10.4"
720 "@babel/plugin-proposal-logical-assignment-operators" "^7.11.0"
721 "@babel/plugin-proposal-nullish-coalescing-operator" "^7.10.4"
722 "@babel/plugin-proposal-numeric-separator" "^7.10.4"
723 "@babel/plugin-proposal-object-rest-spread" "^7.11.0"
724 "@babel/plugin-proposal-optional-catch-binding" "^7.10.4"
725 "@babel/plugin-proposal-optional-chaining" "^7.11.0"
726 "@babel/plugin-proposal-private-methods" "^7.10.4"
727 "@babel/plugin-proposal-unicode-property-regex" "^7.10.4"
728 "@babel/plugin-syntax-async-generators" "^7.8.0"
729 "@babel/plugin-syntax-class-properties" "^7.10.4"
730 "@babel/plugin-syntax-dynamic-import" "^7.8.0"
731 "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
732 "@babel/plugin-syntax-json-strings" "^7.8.0"
733 "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
734 "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0"
735 "@babel/plugin-syntax-numeric-separator" "^7.10.4"
736 "@babel/plugin-syntax-object-rest-spread" "^7.8.0"
737 "@babel/plugin-syntax-optional-catch-binding" "^7.8.0"
738 "@babel/plugin-syntax-optional-chaining" "^7.8.0"
739 "@babel/plugin-syntax-top-level-await" "^7.10.4"
740 "@babel/plugin-transform-arrow-functions" "^7.10.4"
741 "@babel/plugin-transform-async-to-generator" "^7.10.4"
742 "@babel/plugin-transform-block-scoped-functions" "^7.10.4"
743 "@babel/plugin-transform-block-scoping" "^7.10.4"
744 "@babel/plugin-transform-classes" "^7.10.4"
745 "@babel/plugin-transform-computed-properties" "^7.10.4"
746 "@babel/plugin-transform-destructuring" "^7.10.4"
747 "@babel/plugin-transform-dotall-regex" "^7.10.4"
748 "@babel/plugin-transform-duplicate-keys" "^7.10.4"
749 "@babel/plugin-transform-exponentiation-operator" "^7.10.4"
750 "@babel/plugin-transform-for-of" "^7.10.4"
751 "@babel/plugin-transform-function-name" "^7.10.4"
752 "@babel/plugin-transform-literals" "^7.10.4"
753 "@babel/plugin-transform-member-expression-literals" "^7.10.4"
754 "@babel/plugin-transform-modules-amd" "^7.10.4"
755 "@babel/plugin-transform-modules-commonjs" "^7.10.4"
756 "@babel/plugin-transform-modules-systemjs" "^7.10.4"
757 "@babel/plugin-transform-modules-umd" "^7.10.4"
758 "@babel/plugin-transform-named-capturing-groups-regex" "^7.10.4"
759 "@babel/plugin-transform-new-target" "^7.10.4"
760 "@babel/plugin-transform-object-super" "^7.10.4"
761 "@babel/plugin-transform-parameters" "^7.10.4"
762 "@babel/plugin-transform-property-literals" "^7.10.4"
763 "@babel/plugin-transform-regenerator" "^7.10.4"
764 "@babel/plugin-transform-reserved-words" "^7.10.4"
765 "@babel/plugin-transform-shorthand-properties" "^7.10.4"
766 "@babel/plugin-transform-spread" "^7.11.0"
767 "@babel/plugin-transform-sticky-regex" "^7.10.4"
768 "@babel/plugin-transform-template-literals" "^7.10.4"
769 "@babel/plugin-transform-typeof-symbol" "^7.10.4"
770 "@babel/plugin-transform-unicode-escapes" "^7.10.4"
771 "@babel/plugin-transform-unicode-regex" "^7.10.4"
772 "@babel/preset-modules" "^0.1.3"
773 "@babel/types" "^7.11.5"
774 browserslist "^4.12.0"
775 core-js-compat "^3.6.2"
776 invariant "^2.2.2"
777 levenary "^1.1.1"
778 semver "^5.5.0"
281 779
282babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: 780"@babel/preset-modules@^0.1.3":
283 version "6.26.0" 781 version "0.1.4"
284 resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" 782 resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.4.tgz#362f2b68c662842970fdb5e254ffc8fc1c2e415e"
285 integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= 783 integrity sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==
286 dependencies: 784 dependencies:
287 chalk "^1.1.3" 785 "@babel/helper-plugin-utils" "^7.0.0"
786 "@babel/plugin-proposal-unicode-property-regex" "^7.4.4"
787 "@babel/plugin-transform-dotall-regex" "^7.4.4"
788 "@babel/types" "^7.4.4"
288 esutils "^2.0.2" 789 esutils "^2.0.2"
289 js-tokens "^3.0.2" 790
290 791"@babel/runtime@^7.8.4":
291babel-core@^6.24.1, babel-core@^6.26.0: 792 version "7.11.2"
292 version "6.26.3" 793 resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.11.2.tgz#f549c13c754cc40b87644b9fa9f09a6a95fe0736"
293 resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" 794 integrity sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==
294 integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA== 795 dependencies:
295 dependencies: 796 regenerator-runtime "^0.13.4"
296 babel-code-frame "^6.26.0" 797
297 babel-generator "^6.26.0" 798"@babel/template@^7.10.4":
298 babel-helpers "^6.24.1" 799 version "7.10.4"
299 babel-messages "^6.23.0" 800 resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.4.tgz#3251996c4200ebc71d1a8fc405fba940f36ba278"
300 babel-register "^6.26.0" 801 integrity sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==
301 babel-runtime "^6.26.0" 802 dependencies:
302 babel-template "^6.26.0" 803 "@babel/code-frame" "^7.10.4"
303 babel-traverse "^6.26.0" 804 "@babel/parser" "^7.10.4"
304 babel-types "^6.26.0" 805 "@babel/types" "^7.10.4"
305 babylon "^6.18.0" 806
306 convert-source-map "^1.5.1" 807"@babel/traverse@^7.10.4", "@babel/traverse@^7.11.5":
307 debug "^2.6.9" 808 version "7.11.5"
308 json5 "^0.5.1" 809 resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.11.5.tgz#be777b93b518eb6d76ee2e1ea1d143daa11e61c3"
309 lodash "^4.17.4" 810 integrity sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==
811 dependencies:
812 "@babel/code-frame" "^7.10.4"
813 "@babel/generator" "^7.11.5"
814 "@babel/helper-function-name" "^7.10.4"
815 "@babel/helper-split-export-declaration" "^7.11.0"
816 "@babel/parser" "^7.11.5"
817 "@babel/types" "^7.11.5"
818 debug "^4.1.0"
819 globals "^11.1.0"
820 lodash "^4.17.19"
821
822"@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.11.0", "@babel/types@^7.11.5", "@babel/types@^7.4.4":
823 version "7.11.5"
824 resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.11.5.tgz#d9de577d01252d77c6800cee039ee64faf75662d"
825 integrity sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==
826 dependencies:
827 "@babel/helper-validator-identifier" "^7.10.4"
828 lodash "^4.17.19"
829 to-fast-properties "^2.0.0"
830
831"@eslint/eslintrc@^0.1.3":
832 version "0.1.3"
833 resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.1.3.tgz#7d1a2b2358552cc04834c0979bd4275362e37085"
834 integrity sha512-4YVwPkANLeNtRjMekzux1ci8hIaH5eGKktGqR0d3LWsKNn5B2X/1Z6Trxy7jQXl9EBGE6Yj02O+t09FMeRllaA==
835 dependencies:
836 ajv "^6.12.4"
837 debug "^4.1.1"
838 espree "^7.3.0"
839 globals "^12.1.0"
840 ignore "^4.0.6"
841 import-fresh "^3.2.1"
842 js-yaml "^3.13.1"
843 lodash "^4.17.19"
310 minimatch "^3.0.4" 844 minimatch "^3.0.4"
311 path-is-absolute "^1.0.1" 845 strip-json-comments "^3.1.1"
312 private "^0.1.8"
313 slash "^1.0.0"
314 source-map "^0.5.7"
315
316babel-generator@^6.26.0:
317 version "6.26.1"
318 resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90"
319 integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==
320 dependencies:
321 babel-messages "^6.23.0"
322 babel-runtime "^6.26.0"
323 babel-types "^6.26.0"
324 detect-indent "^4.0.0"
325 jsesc "^1.3.0"
326 lodash "^4.17.4"
327 source-map "^0.5.7"
328 trim-right "^1.0.1"
329
330babel-helper-builder-binary-assignment-operator-visitor@^6.24.1:
331 version "6.24.1"
332 resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664"
333 integrity sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=
334 dependencies:
335 babel-helper-explode-assignable-expression "^6.24.1"
336 babel-runtime "^6.22.0"
337 babel-types "^6.24.1"
338
339babel-helper-call-delegate@^6.24.1:
340 version "6.24.1"
341 resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d"
342 integrity sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=
343 dependencies:
344 babel-helper-hoist-variables "^6.24.1"
345 babel-runtime "^6.22.0"
346 babel-traverse "^6.24.1"
347 babel-types "^6.24.1"
348
349babel-helper-define-map@^6.24.1:
350 version "6.26.0"
351 resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f"
352 integrity sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=
353 dependencies:
354 babel-helper-function-name "^6.24.1"
355 babel-runtime "^6.26.0"
356 babel-types "^6.26.0"
357 lodash "^4.17.4"
358
359babel-helper-evaluate-path@^0.2.0:
360 version "0.2.0"
361 resolved "https://registry.yarnpkg.com/babel-helper-evaluate-path/-/babel-helper-evaluate-path-0.2.0.tgz#0bb2eb01996c0cef53c5e8405e999fe4a0244c08"
362 integrity sha512-0EK9TUKMxHL549hWDPkQoS7R0Ozg1CDLheVBHYds2B2qoAvmr9ejY3zOXFsrICK73TN7bPhU14PBeKc8jcBTwg==
363 846
364babel-helper-explode-assignable-expression@^6.24.1: 847"@nodelib/fs.scandir@2.1.3":
365 version "6.24.1" 848 version "2.1.3"
366 resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" 849 resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b"
367 integrity sha1-8luCz33BBDPFX3BZLVdGQArCLKo= 850 integrity sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==
368 dependencies: 851 dependencies:
369 babel-runtime "^6.22.0" 852 "@nodelib/fs.stat" "2.0.3"
370 babel-traverse "^6.24.1" 853 run-parallel "^1.1.9"
371 babel-types "^6.24.1"
372 854
373babel-helper-flip-expressions@^0.2.0: 855"@nodelib/fs.stat@2.0.3", "@nodelib/fs.stat@^2.0.2":
374 version "0.2.0" 856 version "2.0.3"
375 resolved "https://registry.yarnpkg.com/babel-helper-flip-expressions/-/babel-helper-flip-expressions-0.2.0.tgz#160d2090a3d9f9c64a750905321a0bc218f884ec" 857 resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz#34dc5f4cabbc720f4e60f75a747e7ecd6c175bd3"
376 integrity sha512-rAsPA1pWBc7e2E6HepkP2e1sXugT+Oq/VCqhyuHJ8aJ2d/ifwnJfd4Qxjm21qlW43AN8tqaeByagKK6wECFMSw== 858 integrity sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==
377 859
378babel-helper-function-name@^6.24.1: 860"@nodelib/fs.walk@^1.2.3":
379 version "6.24.1" 861 version "1.2.4"
380 resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" 862 resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz#011b9202a70a6366e436ca5c065844528ab04976"
381 integrity sha1-00dbjAPtmCQqJbSDUasYOZ01gKk= 863 integrity sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==
382 dependencies: 864 dependencies:
383 babel-helper-get-function-arity "^6.24.1" 865 "@nodelib/fs.scandir" "2.1.3"
384 babel-runtime "^6.22.0" 866 fastq "^1.6.0"
385 babel-template "^6.24.1"
386 babel-traverse "^6.24.1"
387 babel-types "^6.24.1"
388 867
389babel-helper-get-function-arity@^6.24.1: 868"@npmcli/move-file@^1.0.1":
390 version "6.24.1" 869 version "1.0.1"
391 resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" 870 resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.0.1.tgz#de103070dac0f48ce49cf6693c23af59c0f70464"
392 integrity sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0= 871 integrity sha512-Uv6h1sT+0DrblvIrolFtbvM1FgWm+/sy4B3pvLp67Zys+thcukzS5ekn7HsZFGpWP4Q3fYJCljbWQE/XivMRLw==
393 dependencies: 872 dependencies:
394 babel-runtime "^6.22.0" 873 mkdirp "^1.0.4"
395 babel-types "^6.24.1"
396 874
397babel-helper-hoist-variables@^6.24.1: 875"@stylelint/postcss-css-in-js@^0.37.2":
398 version "6.24.1" 876 version "0.37.2"
399 resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" 877 resolved "https://registry.yarnpkg.com/@stylelint/postcss-css-in-js/-/postcss-css-in-js-0.37.2.tgz#7e5a84ad181f4234a2480803422a47b8749af3d2"
400 integrity sha1-HssnaJydJVE+rbyZFKc/VAi+enY= 878 integrity sha512-nEhsFoJurt8oUmieT8qy4nk81WRHmJynmVwn/Vts08PL9fhgIsMhk1GId5yAN643OzqEEb5S/6At2TZW7pqPDA==
401 dependencies: 879 dependencies:
402 babel-runtime "^6.22.0" 880 "@babel/core" ">=7.9.0"
403 babel-types "^6.24.1"
404 881
405babel-helper-is-nodes-equiv@^0.0.1: 882"@stylelint/postcss-markdown@^0.36.1":
406 version "0.0.1" 883 version "0.36.1"
407 resolved "https://registry.yarnpkg.com/babel-helper-is-nodes-equiv/-/babel-helper-is-nodes-equiv-0.0.1.tgz#34e9b300b1479ddd98ec77ea0bbe9342dfe39684" 884 resolved "https://registry.yarnpkg.com/@stylelint/postcss-markdown/-/postcss-markdown-0.36.1.tgz#829b87e6c0f108014533d9d7b987dc9efb6632e8"
408 integrity sha1-NOmzALFHnd2Y7HfqC76TQt/jloQ= 885 integrity sha512-iDxMBWk9nB2BPi1VFQ+Dc5+XpvODBHw2n3tYpaBZuEAFQlbtF9If0Qh5LTTwSi/XwdbJ2jt+0dis3i8omyggpw==
886 dependencies:
887 remark "^12.0.0"
888 unist-util-find-all-after "^3.0.1"
409 889
410babel-helper-is-void-0@^0.2.0: 890"@types/color-name@^1.1.1":
411 version "0.2.0" 891 version "1.1.1"
412 resolved "https://registry.yarnpkg.com/babel-helper-is-void-0/-/babel-helper-is-void-0-0.2.0.tgz#6ed0ada8a9b1c5b6e88af6b47c1b3b5c080860eb" 892 resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0"
413 integrity sha512-Axj1AYuD0E3Dl7nT3KxROP7VekEofz3XtEljzURf3fABalLpr8PamtgLFt+zuxtaCxRf9iuZmbAMMYWri5Bazw== 893 integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==
414 894
415babel-helper-mark-eval-scopes@^0.2.0: 895"@types/json-schema@^7.0.5":
416 version "0.2.0" 896 version "7.0.6"
417 resolved "https://registry.yarnpkg.com/babel-helper-mark-eval-scopes/-/babel-helper-mark-eval-scopes-0.2.0.tgz#7648aaf2ec92aae9b09a20ad91e8df5e1fcc94b2" 897 resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.6.tgz#f4c7ec43e81b319a9815115031709f26987891f0"
418 integrity sha512-KJuwrOUcHbvbh6he4xRXZFLaivK9DF9o3CrvpWnK1Wp0B+1ANYABXBMgwrnNFIDK/AvicxQ9CNr8wsgivlp4Aw== 898 integrity sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==
419
420babel-helper-optimise-call-expression@^6.24.1:
421 version "6.24.1"
422 resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257"
423 integrity sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=
424 dependencies:
425 babel-runtime "^6.22.0"
426 babel-types "^6.24.1"
427
428babel-helper-regex@^6.24.1:
429 version "6.26.0"
430 resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72"
431 integrity sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=
432 dependencies:
433 babel-runtime "^6.26.0"
434 babel-types "^6.26.0"
435 lodash "^4.17.4"
436
437babel-helper-remap-async-to-generator@^6.24.1:
438 version "6.24.1"
439 resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b"
440 integrity sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=
441 dependencies:
442 babel-helper-function-name "^6.24.1"
443 babel-runtime "^6.22.0"
444 babel-template "^6.24.1"
445 babel-traverse "^6.24.1"
446 babel-types "^6.24.1"
447
448babel-helper-remove-or-void@^0.2.0:
449 version "0.2.0"
450 resolved "https://registry.yarnpkg.com/babel-helper-remove-or-void/-/babel-helper-remove-or-void-0.2.0.tgz#8e46ad5b30560d57d7510b3fd93f332ee7c67386"
451 integrity sha512-1Z41upf/XR+PwY7Nd+F15Jo5BiQi5205ZXUuKed3yoyQgDkMyoM7vAdjEJS/T+M6jy32sXjskMUgms4zeiVtRA==
452
453babel-helper-replace-supers@^6.24.1:
454 version "6.24.1"
455 resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a"
456 integrity sha1-v22/5Dk40XNpohPKiov3S2qQqxo=
457 dependencies:
458 babel-helper-optimise-call-expression "^6.24.1"
459 babel-messages "^6.23.0"
460 babel-runtime "^6.22.0"
461 babel-template "^6.24.1"
462 babel-traverse "^6.24.1"
463 babel-types "^6.24.1"
464
465babel-helper-to-multiple-sequence-expressions@^0.2.0:
466 version "0.2.0"
467 resolved "https://registry.yarnpkg.com/babel-helper-to-multiple-sequence-expressions/-/babel-helper-to-multiple-sequence-expressions-0.2.0.tgz#d1a419634c6cb301f27858c659167cfee0a9d318"
468 integrity sha512-ij9lpfdP3+Zc/7kNwa+NXbTrUlsYEWPwt/ugmQO0qflzLrveTIkbfOqQztvitk81aG5NblYDQXDlRohzu3oa8Q==
469 899
470babel-helpers@^6.24.1: 900"@types/json5@^0.0.29":
471 version "6.24.1" 901 version "0.0.29"
472 resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" 902 resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee"
473 integrity sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI= 903 integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4=
474 dependencies:
475 babel-runtime "^6.22.0"
476 babel-template "^6.24.1"
477 904
478babel-loader@^7.1.2: 905"@types/minimist@^1.2.0":
479 version "7.1.5" 906 version "1.2.0"
480 resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-7.1.5.tgz#e3ee0cd7394aa557e013b02d3e492bfd07aa6d68" 907 resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.0.tgz#69a23a3ad29caf0097f06eda59b361ee2f0639f6"
481 integrity sha512-iCHfbieL5d1LfOQeeVJEUyD9rTwBcP/fcEbRCfempxTDuqrKpu0AZjLAQHEQa3Yqyj9ORKe2iHfoj4rHLf7xpw== 908 integrity sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY=
482 dependencies:
483 find-cache-dir "^1.0.0"
484 loader-utils "^1.0.2"
485 mkdirp "^0.5.1"
486 909
487babel-messages@^6.23.0: 910"@types/node@*":
488 version "6.23.0" 911 version "14.11.2"
489 resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" 912 resolved "https://registry.yarnpkg.com/@types/node/-/node-14.11.2.tgz#2de1ed6670439387da1c9f549a2ade2b0a799256"
490 integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4= 913 integrity sha512-jiE3QIxJ8JLNcb1Ps6rDbysDhN4xa8DJJvuC9prr6w+1tIh+QAbYyNF3tyiZNLDBIuBCf4KEcV2UvQm/V60xfA==
491 dependencies:
492 babel-runtime "^6.22.0"
493 914
494babel-minify-webpack-plugin@^0.2.0: 915"@types/normalize-package-data@^2.4.0":
495 version "0.2.0" 916 version "2.4.0"
496 resolved "https://registry.yarnpkg.com/babel-minify-webpack-plugin/-/babel-minify-webpack-plugin-0.2.0.tgz#ef9694d11a1b8ab8f3204d89f5c9278dd28fc2a9" 917 resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e"
497 integrity sha512-+5G5Qqm+DIVl7gY4rkHqlFRkaf1FZtz0imzu/Dy9+88AfOIuy7D5MQjkNgQr5gU6/YSZ+rImgxDqFcWkvvrjkQ== 918 integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==
498 dependencies:
499 babel-core "^6.24.1"
500 babel-preset-minify "^0.2.0"
501 webpack-sources "^1.0.1"
502 919
503babel-plugin-check-es2015-constants@^6.22.0: 920"@types/parse-json@^4.0.0":
504 version "6.22.0" 921 version "4.0.0"
505 resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" 922 resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0"
506 integrity sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o= 923 integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==
924
925"@types/unist@^2.0.0", "@types/unist@^2.0.2":
926 version "2.0.3"
927 resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.3.tgz#9c088679876f374eb5983f150d4787aa6fb32d7e"
928 integrity sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==
929
930"@webassemblyjs/ast@1.9.0":
931 version "1.9.0"
932 resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964"
933 integrity sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==
934 dependencies:
935 "@webassemblyjs/helper-module-context" "1.9.0"
936 "@webassemblyjs/helper-wasm-bytecode" "1.9.0"
937 "@webassemblyjs/wast-parser" "1.9.0"
938
939"@webassemblyjs/floating-point-hex-parser@1.9.0":
940 version "1.9.0"
941 resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz#3c3d3b271bddfc84deb00f71344438311d52ffb4"
942 integrity sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==
943
944"@webassemblyjs/helper-api-error@1.9.0":
945 version "1.9.0"
946 resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz#203f676e333b96c9da2eeab3ccef33c45928b6a2"
947 integrity sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==
948
949"@webassemblyjs/helper-buffer@1.9.0":
950 version "1.9.0"
951 resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz#a1442d269c5feb23fcbc9ef759dac3547f29de00"
952 integrity sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==
953
954"@webassemblyjs/helper-code-frame@1.9.0":
955 version "1.9.0"
956 resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz#647f8892cd2043a82ac0c8c5e75c36f1d9159f27"
957 integrity sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==
958 dependencies:
959 "@webassemblyjs/wast-printer" "1.9.0"
960
961"@webassemblyjs/helper-fsm@1.9.0":
962 version "1.9.0"
963 resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz#c05256b71244214671f4b08ec108ad63b70eddb8"
964 integrity sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==
965
966"@webassemblyjs/helper-module-context@1.9.0":
967 version "1.9.0"
968 resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz#25d8884b76839871a08a6c6f806c3979ef712f07"
969 integrity sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==
970 dependencies:
971 "@webassemblyjs/ast" "1.9.0"
972
973"@webassemblyjs/helper-wasm-bytecode@1.9.0":
974 version "1.9.0"
975 resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz#4fed8beac9b8c14f8c58b70d124d549dd1fe5790"
976 integrity sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==
977
978"@webassemblyjs/helper-wasm-section@1.9.0":
979 version "1.9.0"
980 resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz#5a4138d5a6292ba18b04c5ae49717e4167965346"
981 integrity sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==
982 dependencies:
983 "@webassemblyjs/ast" "1.9.0"
984 "@webassemblyjs/helper-buffer" "1.9.0"
985 "@webassemblyjs/helper-wasm-bytecode" "1.9.0"
986 "@webassemblyjs/wasm-gen" "1.9.0"
987
988"@webassemblyjs/ieee754@1.9.0":
989 version "1.9.0"
990 resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz#15c7a0fbaae83fb26143bbacf6d6df1702ad39e4"
991 integrity sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==
992 dependencies:
993 "@xtuc/ieee754" "^1.2.0"
994
995"@webassemblyjs/leb128@1.9.0":
996 version "1.9.0"
997 resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz#f19ca0b76a6dc55623a09cffa769e838fa1e1c95"
998 integrity sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==
999 dependencies:
1000 "@xtuc/long" "4.2.2"
1001
1002"@webassemblyjs/utf8@1.9.0":
1003 version "1.9.0"
1004 resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz#04d33b636f78e6a6813227e82402f7637b6229ab"
1005 integrity sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==
1006
1007"@webassemblyjs/wasm-edit@1.9.0":
1008 version "1.9.0"
1009 resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz#3fe6d79d3f0f922183aa86002c42dd256cfee9cf"
1010 integrity sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==
1011 dependencies:
1012 "@webassemblyjs/ast" "1.9.0"
1013 "@webassemblyjs/helper-buffer" "1.9.0"
1014 "@webassemblyjs/helper-wasm-bytecode" "1.9.0"
1015 "@webassemblyjs/helper-wasm-section" "1.9.0"
1016 "@webassemblyjs/wasm-gen" "1.9.0"
1017 "@webassemblyjs/wasm-opt" "1.9.0"
1018 "@webassemblyjs/wasm-parser" "1.9.0"
1019 "@webassemblyjs/wast-printer" "1.9.0"
1020
1021"@webassemblyjs/wasm-gen@1.9.0":
1022 version "1.9.0"
1023 resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz#50bc70ec68ded8e2763b01a1418bf43491a7a49c"
1024 integrity sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==
1025 dependencies:
1026 "@webassemblyjs/ast" "1.9.0"
1027 "@webassemblyjs/helper-wasm-bytecode" "1.9.0"
1028 "@webassemblyjs/ieee754" "1.9.0"
1029 "@webassemblyjs/leb128" "1.9.0"
1030 "@webassemblyjs/utf8" "1.9.0"
1031
1032"@webassemblyjs/wasm-opt@1.9.0":
1033 version "1.9.0"
1034 resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz#2211181e5b31326443cc8112eb9f0b9028721a61"
1035 integrity sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==
1036 dependencies:
1037 "@webassemblyjs/ast" "1.9.0"
1038 "@webassemblyjs/helper-buffer" "1.9.0"
1039 "@webassemblyjs/wasm-gen" "1.9.0"
1040 "@webassemblyjs/wasm-parser" "1.9.0"
1041
1042"@webassemblyjs/wasm-parser@1.9.0":
1043 version "1.9.0"
1044 resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz#9d48e44826df4a6598294aa6c87469d642fff65e"
1045 integrity sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==
1046 dependencies:
1047 "@webassemblyjs/ast" "1.9.0"
1048 "@webassemblyjs/helper-api-error" "1.9.0"
1049 "@webassemblyjs/helper-wasm-bytecode" "1.9.0"
1050 "@webassemblyjs/ieee754" "1.9.0"
1051 "@webassemblyjs/leb128" "1.9.0"
1052 "@webassemblyjs/utf8" "1.9.0"
1053
1054"@webassemblyjs/wast-parser@1.9.0":
1055 version "1.9.0"
1056 resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz#3031115d79ac5bd261556cecc3fa90a3ef451914"
1057 integrity sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==
1058 dependencies:
1059 "@webassemblyjs/ast" "1.9.0"
1060 "@webassemblyjs/floating-point-hex-parser" "1.9.0"
1061 "@webassemblyjs/helper-api-error" "1.9.0"
1062 "@webassemblyjs/helper-code-frame" "1.9.0"
1063 "@webassemblyjs/helper-fsm" "1.9.0"
1064 "@xtuc/long" "4.2.2"
1065
1066"@webassemblyjs/wast-printer@1.9.0":
1067 version "1.9.0"
1068 resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz#4935d54c85fef637b00ce9f52377451d00d47899"
1069 integrity sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==
1070 dependencies:
1071 "@webassemblyjs/ast" "1.9.0"
1072 "@webassemblyjs/wast-parser" "1.9.0"
1073 "@xtuc/long" "4.2.2"
1074
1075"@xtuc/ieee754@^1.2.0":
1076 version "1.2.0"
1077 resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790"
1078 integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==
1079
1080"@xtuc/long@4.2.2":
1081 version "4.2.2"
1082 resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d"
1083 integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==
1084
1085acorn-jsx@^5.2.0:
1086 version "5.3.1"
1087 resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b"
1088 integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==
1089
1090acorn@^6.4.1:
1091 version "6.4.1"
1092 resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474"
1093 integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==
1094
1095acorn@^7.4.0:
1096 version "7.4.0"
1097 resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.0.tgz#e1ad486e6c54501634c6c397c5c121daa383607c"
1098 integrity sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==
1099
1100aggregate-error@^3.0.0:
1101 version "3.1.0"
1102 resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a"
1103 integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==
507 dependencies: 1104 dependencies:
508 babel-runtime "^6.22.0" 1105 clean-stack "^2.0.0"
1106 indent-string "^4.0.0"
509 1107
510babel-plugin-minify-builtins@^0.2.0: 1108ajv-errors@^1.0.0:
511 version "0.2.0" 1109 version "1.0.1"
512 resolved "https://registry.yarnpkg.com/babel-plugin-minify-builtins/-/babel-plugin-minify-builtins-0.2.0.tgz#317f824b0907210b6348671bb040ca072e2e0c82" 1110 resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d"
513 integrity sha512-4i+8ntaS8gwVUcOz5y+zE+55OVOl2nTbmHV51D4wAIiKcRI8U5K//ip1GHfhsgk/NJrrHK7h97Oy5jpqt0Iixg== 1111 integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==
1112
1113ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2:
1114 version "3.5.2"
1115 resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d"
1116 integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==
1117
1118ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.4:
1119 version "6.12.5"
1120 resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.5.tgz#19b0e8bae8f476e5ba666300387775fb1a00a4da"
1121 integrity sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag==
514 dependencies: 1122 dependencies:
515 babel-helper-evaluate-path "^0.2.0" 1123 fast-deep-equal "^3.1.1"
1124 fast-json-stable-stringify "^2.0.0"
1125 json-schema-traverse "^0.4.1"
1126 uri-js "^4.2.2"
516 1127
517babel-plugin-minify-constant-folding@^0.2.0: 1128ansi-colors@^4.1.1:
518 version "0.2.0" 1129 version "4.1.1"
519 resolved "https://registry.yarnpkg.com/babel-plugin-minify-constant-folding/-/babel-plugin-minify-constant-folding-0.2.0.tgz#8c70b528b2eb7c13e94d95c8789077d4cdbc3970" 1130 resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348"
520 integrity sha512-B3ffQBEUQ8ydlIkYv2MkZtTCbV7FAkWAV7NkyhcXlGpD10PaCxNGQ/B9oguXGowR1m16Q5nGhvNn8Pkn1MO6Hw== 1131 integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==
1132
1133ansi-regex@^4.1.0:
1134 version "4.1.0"
1135 resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997"
1136 integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==
1137
1138ansi-regex@^5.0.0:
1139 version "5.0.0"
1140 resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75"
1141 integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==
1142
1143ansi-styles@^3.2.0, ansi-styles@^3.2.1:
1144 version "3.2.1"
1145 resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
1146 integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
521 dependencies: 1147 dependencies:
522 babel-helper-evaluate-path "^0.2.0" 1148 color-convert "^1.9.0"
523 1149
524babel-plugin-minify-dead-code-elimination@^0.2.0: 1150ansi-styles@^4.0.0, ansi-styles@^4.1.0:
525 version "0.2.0" 1151 version "4.2.1"
526 resolved "https://registry.yarnpkg.com/babel-plugin-minify-dead-code-elimination/-/babel-plugin-minify-dead-code-elimination-0.2.0.tgz#e8025ee10a1e5e4f202633a6928ce892c33747e3" 1152 resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359"
527 integrity sha512-zE7y3pRyzA4zK5nBou0kTcwUTSQ/AiFrynt1cIEYN7vcO2gS9ZFZoI0aO9JYLUdct5fsC1vfB35408yrzTyVfg== 1153 integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==
528 dependencies: 1154 dependencies:
529 babel-helper-evaluate-path "^0.2.0" 1155 "@types/color-name" "^1.1.1"
530 babel-helper-mark-eval-scopes "^0.2.0" 1156 color-convert "^2.0.1"
531 babel-helper-remove-or-void "^0.2.0"
532 lodash.some "^4.6.0"
533 1157
534babel-plugin-minify-flip-comparisons@^0.2.0: 1158anymatch@^2.0.0:
535 version "0.2.0" 1159 version "2.0.0"
536 resolved "https://registry.yarnpkg.com/babel-plugin-minify-flip-comparisons/-/babel-plugin-minify-flip-comparisons-0.2.0.tgz#0c9c8e93155c8f09dedad8118b634c259f709ef5" 1160 resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb"
537 integrity sha512-QOqXSEmD/LhT3LpM1WCyzAGcQZYYKJF7oOHvS6QbpomHenydrV53DMdPX2mK01icBExKZcJAHF209wvDBa+CSg== 1161 integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==
538 dependencies: 1162 dependencies:
539 babel-helper-is-void-0 "^0.2.0" 1163 micromatch "^3.1.4"
1164 normalize-path "^2.1.1"
540 1165
541babel-plugin-minify-guarded-expressions@^0.2.0: 1166anymatch@~3.1.1:
542 version "0.2.0" 1167 version "3.1.1"
543 resolved "https://registry.yarnpkg.com/babel-plugin-minify-guarded-expressions/-/babel-plugin-minify-guarded-expressions-0.2.0.tgz#8a8c950040fce3e258a12e6eb21eab94ad7235ab" 1168 resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142"
544 integrity sha512-5+NSPdRQ9mnrHaA+zFj+D5OzmSiv90EX5zGH6cWQgR/OUqmCHSDqgTRPFvOctgpo8MJyO7Rt7ajs2UfLnlAwYg== 1169 integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==
545 dependencies: 1170 dependencies:
546 babel-helper-flip-expressions "^0.2.0" 1171 normalize-path "^3.0.0"
1172 picomatch "^2.0.4"
547 1173
548babel-plugin-minify-infinity@^0.2.0: 1174aproba@^1.1.1:
549 version "0.2.0" 1175 version "1.2.0"
550 resolved "https://registry.yarnpkg.com/babel-plugin-minify-infinity/-/babel-plugin-minify-infinity-0.2.0.tgz#30960c615ddbc657c045bb00a1d8eb4af257cf03" 1176 resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
551 integrity sha512-U694vrla1lN6vDHWGrR832t3a/A2eh+kyl019LxEE2+sS4VTydyOPRsAOIYAdJegWRA4cMX1lm9azAN0cLIr8g== 1177 integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==
552 1178
553babel-plugin-minify-mangle-names@^0.2.0: 1179argparse@^1.0.7:
554 version "0.2.0" 1180 version "1.0.10"
555 resolved "https://registry.yarnpkg.com/babel-plugin-minify-mangle-names/-/babel-plugin-minify-mangle-names-0.2.0.tgz#719892297ff0106a6ec1a4b0fc062f1f8b6a8529" 1181 resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
556 integrity sha512-Gixuak1/CO7VCdjn15/8Bxe/QsAtDG4zPbnsNoe1mIJGCIH/kcmSjFhMlGJtXDQZd6EKzeMfA5WmX9+jvGRefw== 1182 integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
557 dependencies: 1183 dependencies:
558 babel-helper-mark-eval-scopes "^0.2.0" 1184 sprintf-js "~1.0.2"
559 1185
560babel-plugin-minify-numeric-literals@^0.2.0: 1186arr-diff@^4.0.0:
561 version "0.2.0" 1187 version "4.0.0"
562 resolved "https://registry.yarnpkg.com/babel-plugin-minify-numeric-literals/-/babel-plugin-minify-numeric-literals-0.2.0.tgz#5746e851700167a380c05e93f289a7070459a0d1" 1188 resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
563 integrity sha512-VcLpb+r1YS7+RIOXdRsFVLLqoh22177USpHf+JM/g1nZbzdqENmfd5v534MLAbRErhbz6SyK+NQViVzVtBxu8g== 1189 integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=
564 1190
565babel-plugin-minify-replace@^0.2.0: 1191arr-flatten@^1.1.0:
566 version "0.2.0" 1192 version "1.1.0"
567 resolved "https://registry.yarnpkg.com/babel-plugin-minify-replace/-/babel-plugin-minify-replace-0.2.0.tgz#3c1f06bc4e6d3e301eacb763edc1be611efc39b0" 1193 resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
568 integrity sha512-SEW6zoSVxh3OH6E1LCgyhhTWMnCv+JIRu5h5IlJDA11tU4ZeSF7uPQcO4vN/o52+FssRB26dmzJ/8D+z0QPg5Q== 1194 integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==
569 1195
570babel-plugin-minify-simplify@^0.2.0: 1196arr-union@^3.1.0:
571 version "0.2.0" 1197 version "3.1.0"
572 resolved "https://registry.yarnpkg.com/babel-plugin-minify-simplify/-/babel-plugin-minify-simplify-0.2.0.tgz#21ceec4857100c5476d7cef121f351156e5c9bc0" 1198 resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
573 integrity sha512-Mj3Mwy2zVosMfXDWXZrQH5/uMAyfJdmDQ1NVqit+ArbHC3LlXVzptuyC1JxTyai/wgFvjLaichm/7vSUshkWqw== 1199 integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=
1200
1201array-includes@^3.1.1:
1202 version "3.1.1"
1203 resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.1.tgz#cdd67e6852bdf9c1215460786732255ed2459348"
1204 integrity sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==
574 dependencies: 1205 dependencies:
575 babel-helper-flip-expressions "^0.2.0" 1206 define-properties "^1.1.3"
576 babel-helper-is-nodes-equiv "^0.0.1" 1207 es-abstract "^1.17.0"
577 babel-helper-to-multiple-sequence-expressions "^0.2.0" 1208 is-string "^1.0.5"
578 1209
579babel-plugin-minify-type-constructors@^0.2.0: 1210array-union@^2.1.0:
580 version "0.2.0" 1211 version "2.1.0"
581 resolved "https://registry.yarnpkg.com/babel-plugin-minify-type-constructors/-/babel-plugin-minify-type-constructors-0.2.0.tgz#7f3b6458be0863cfd59e9985bed6d134aa7a2e17" 1212 resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
582 integrity sha512-NiOvvA9Pq6bki6nP4BayXwT5GZadw7DJFDDzHmkpnOQpENWe8RtHtKZM44MG1R6EQ5XxgbLdsdhswIzTkFlO5g== 1213 integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
583 dependencies:
584 babel-helper-is-void-0 "^0.2.0"
585
586babel-plugin-syntax-async-functions@^6.8.0:
587 version "6.13.0"
588 resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95"
589 integrity sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=
590
591babel-plugin-syntax-exponentiation-operator@^6.8.0:
592 version "6.13.0"
593 resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de"
594 integrity sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=
595
596babel-plugin-syntax-trailing-function-commas@^6.22.0:
597 version "6.22.0"
598 resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3"
599 integrity sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=
600
601babel-plugin-transform-async-to-generator@^6.22.0:
602 version "6.24.1"
603 resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761"
604 integrity sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=
605 dependencies:
606 babel-helper-remap-async-to-generator "^6.24.1"
607 babel-plugin-syntax-async-functions "^6.8.0"
608 babel-runtime "^6.22.0"
609
610babel-plugin-transform-es2015-arrow-functions@^6.22.0:
611 version "6.22.0"
612 resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221"
613 integrity sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=
614 dependencies:
615 babel-runtime "^6.22.0"
616
617babel-plugin-transform-es2015-block-scoped-functions@^6.22.0:
618 version "6.22.0"
619 resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141"
620 integrity sha1-u8UbSflk1wy42OC5ToICRs46YUE=
621 dependencies:
622 babel-runtime "^6.22.0"
623
624babel-plugin-transform-es2015-block-scoping@^6.23.0:
625 version "6.26.0"
626 resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f"
627 integrity sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=
628 dependencies:
629 babel-runtime "^6.26.0"
630 babel-template "^6.26.0"
631 babel-traverse "^6.26.0"
632 babel-types "^6.26.0"
633 lodash "^4.17.4"
634
635babel-plugin-transform-es2015-classes@^6.23.0:
636 version "6.24.1"
637 resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db"
638 integrity sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=
639 dependencies:
640 babel-helper-define-map "^6.24.1"
641 babel-helper-function-name "^6.24.1"
642 babel-helper-optimise-call-expression "^6.24.1"
643 babel-helper-replace-supers "^6.24.1"
644 babel-messages "^6.23.0"
645 babel-runtime "^6.22.0"
646 babel-template "^6.24.1"
647 babel-traverse "^6.24.1"
648 babel-types "^6.24.1"
649
650babel-plugin-transform-es2015-computed-properties@^6.22.0:
651 version "6.24.1"
652 resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3"
653 integrity sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=
654 dependencies:
655 babel-runtime "^6.22.0"
656 babel-template "^6.24.1"
657
658babel-plugin-transform-es2015-destructuring@^6.23.0:
659 version "6.23.0"
660 resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d"
661 integrity sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=
662 dependencies:
663 babel-runtime "^6.22.0"
664
665babel-plugin-transform-es2015-duplicate-keys@^6.22.0:
666 version "6.24.1"
667 resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e"
668 integrity sha1-c+s9MQypaePvnskcU3QabxV2Qj4=
669 dependencies:
670 babel-runtime "^6.22.0"
671 babel-types "^6.24.1"
672
673babel-plugin-transform-es2015-for-of@^6.23.0:
674 version "6.23.0"
675 resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691"
676 integrity sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=
677 dependencies:
678 babel-runtime "^6.22.0"
679
680babel-plugin-transform-es2015-function-name@^6.22.0:
681 version "6.24.1"
682 resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b"
683 integrity sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=
684 dependencies:
685 babel-helper-function-name "^6.24.1"
686 babel-runtime "^6.22.0"
687 babel-types "^6.24.1"
688
689babel-plugin-transform-es2015-literals@^6.22.0:
690 version "6.22.0"
691 resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e"
692 integrity sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=
693 dependencies:
694 babel-runtime "^6.22.0"
695
696babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1:
697 version "6.24.1"
698 resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154"
699 integrity sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=
700 dependencies:
701 babel-plugin-transform-es2015-modules-commonjs "^6.24.1"
702 babel-runtime "^6.22.0"
703 babel-template "^6.24.1"
704
705babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1:
706 version "6.26.2"
707 resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3"
708 integrity sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==
709 dependencies:
710 babel-plugin-transform-strict-mode "^6.24.1"
711 babel-runtime "^6.26.0"
712 babel-template "^6.26.0"
713 babel-types "^6.26.0"
714
715babel-plugin-transform-es2015-modules-systemjs@^6.23.0:
716 version "6.24.1"
717 resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23"
718 integrity sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=
719 dependencies:
720 babel-helper-hoist-variables "^6.24.1"
721 babel-runtime "^6.22.0"
722 babel-template "^6.24.1"
723
724babel-plugin-transform-es2015-modules-umd@^6.23.0:
725 version "6.24.1"
726 resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468"
727 integrity sha1-rJl+YoXNGO1hdq22B9YCNErThGg=
728 dependencies:
729 babel-plugin-transform-es2015-modules-amd "^6.24.1"
730 babel-runtime "^6.22.0"
731 babel-template "^6.24.1"
732
733babel-plugin-transform-es2015-object-super@^6.22.0:
734 version "6.24.1"
735 resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d"
736 integrity sha1-JM72muIcuDp/hgPa0CH1cusnj40=
737 dependencies:
738 babel-helper-replace-supers "^6.24.1"
739 babel-runtime "^6.22.0"
740
741babel-plugin-transform-es2015-parameters@^6.23.0:
742 version "6.24.1"
743 resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b"
744 integrity sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=
745 dependencies:
746 babel-helper-call-delegate "^6.24.1"
747 babel-helper-get-function-arity "^6.24.1"
748 babel-runtime "^6.22.0"
749 babel-template "^6.24.1"
750 babel-traverse "^6.24.1"
751 babel-types "^6.24.1"
752
753babel-plugin-transform-es2015-shorthand-properties@^6.22.0:
754 version "6.24.1"
755 resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0"
756 integrity sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=
757 dependencies:
758 babel-runtime "^6.22.0"
759 babel-types "^6.24.1"
760
761babel-plugin-transform-es2015-spread@^6.22.0:
762 version "6.22.0"
763 resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1"
764 integrity sha1-1taKmfia7cRTbIGlQujdnxdG+NE=
765 dependencies:
766 babel-runtime "^6.22.0"
767
768babel-plugin-transform-es2015-sticky-regex@^6.22.0:
769 version "6.24.1"
770 resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc"
771 integrity sha1-AMHNsaynERLN8M9hJsLta0V8zbw=
772 dependencies:
773 babel-helper-regex "^6.24.1"
774 babel-runtime "^6.22.0"
775 babel-types "^6.24.1"
776
777babel-plugin-transform-es2015-template-literals@^6.22.0:
778 version "6.22.0"
779 resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d"
780 integrity sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=
781 dependencies:
782 babel-runtime "^6.22.0"
783
784babel-plugin-transform-es2015-typeof-symbol@^6.23.0:
785 version "6.23.0"
786 resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372"
787 integrity sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=
788 dependencies:
789 babel-runtime "^6.22.0"
790
791babel-plugin-transform-es2015-unicode-regex@^6.22.0:
792 version "6.24.1"
793 resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9"
794 integrity sha1-04sS9C6nMj9yk4fxinxa4frrNek=
795 dependencies:
796 babel-helper-regex "^6.24.1"
797 babel-runtime "^6.22.0"
798 regexpu-core "^2.0.0"
799
800babel-plugin-transform-exponentiation-operator@^6.22.0:
801 version "6.24.1"
802 resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e"
803 integrity sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=
804 dependencies:
805 babel-helper-builder-binary-assignment-operator-visitor "^6.24.1"
806 babel-plugin-syntax-exponentiation-operator "^6.8.0"
807 babel-runtime "^6.22.0"
808
809babel-plugin-transform-inline-consecutive-adds@^0.2.0:
810 version "0.2.0"
811 resolved "https://registry.yarnpkg.com/babel-plugin-transform-inline-consecutive-adds/-/babel-plugin-transform-inline-consecutive-adds-0.2.0.tgz#15dae78921057f4004f8eafd79e15ddc5f12f426"
812 integrity sha512-GlhOuLOQ28ua9prg0hT33HslCrEmz9xWXy9ZNZSACppCyRxxRW+haYtRgm7uYXCcd0q8ggCWD2pfWEJp5iiZfQ==
813 1214
814babel-plugin-transform-member-expression-literals@^6.8.5: 1215array-unique@^0.3.2:
815 version "6.9.4" 1216 version "0.3.2"
816 resolved "https://registry.yarnpkg.com/babel-plugin-transform-member-expression-literals/-/babel-plugin-transform-member-expression-literals-6.9.4.tgz#37039c9a0c3313a39495faac2ff3a6b5b9d038bf" 1217 resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
817 integrity sha1-NwOcmgwzE6OUlfqsL/OmtbnQOL8= 1218 integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=
818 1219
819babel-plugin-transform-merge-sibling-variables@^6.8.6: 1220array.prototype.flat@^1.2.3:
820 version "6.9.4" 1221 version "1.2.3"
821 resolved "https://registry.yarnpkg.com/babel-plugin-transform-merge-sibling-variables/-/babel-plugin-transform-merge-sibling-variables-6.9.4.tgz#85b422fc3377b449c9d1cde44087203532401dae" 1222 resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz#0de82b426b0318dbfdb940089e38b043d37f6c7b"
822 integrity sha1-hbQi/DN3tEnJ0c3kQIcgNTJAHa4= 1223 integrity sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==
1224 dependencies:
1225 define-properties "^1.1.3"
1226 es-abstract "^1.17.0-next.1"
823 1227
824babel-plugin-transform-minify-booleans@^6.8.3: 1228arrify@^1.0.1:
825 version "6.9.4" 1229 version "1.0.1"
826 resolved "https://registry.yarnpkg.com/babel-plugin-transform-minify-booleans/-/babel-plugin-transform-minify-booleans-6.9.4.tgz#acbb3e56a3555dd23928e4b582d285162dd2b198" 1230 resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
827 integrity sha1-rLs+VqNVXdI5KOS1gtKFFi3SsZg= 1231 integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=
828 1232
829babel-plugin-transform-property-literals@^6.8.5: 1233asn1.js@^5.2.0:
830 version "6.9.4" 1234 version "5.4.1"
831 resolved "https://registry.yarnpkg.com/babel-plugin-transform-property-literals/-/babel-plugin-transform-property-literals-6.9.4.tgz#98c1d21e255736573f93ece54459f6ce24985d39" 1235 resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07"
832 integrity sha1-mMHSHiVXNlc/k+zlRFn2ziSYXTk= 1236 integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==
833 dependencies: 1237 dependencies:
834 esutils "^2.0.2" 1238 bn.js "^4.0.0"
1239 inherits "^2.0.1"
1240 minimalistic-assert "^1.0.0"
1241 safer-buffer "^2.1.0"
835 1242
836babel-plugin-transform-regenerator@^6.22.0: 1243assert@^1.1.1:
837 version "6.26.0" 1244 version "1.5.0"
838 resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" 1245 resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb"
839 integrity sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8= 1246 integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==
840 dependencies: 1247 dependencies:
841 regenerator-transform "^0.10.0" 1248 object-assign "^4.1.1"
1249 util "0.10.3"
842 1250
843babel-plugin-transform-regexp-constructors@^0.2.0: 1251assign-symbols@^1.0.0:
844 version "0.2.0" 1252 version "1.0.0"
845 resolved "https://registry.yarnpkg.com/babel-plugin-transform-regexp-constructors/-/babel-plugin-transform-regexp-constructors-0.2.0.tgz#6aa5dd0acc515db4be929bbcec4ed4c946c534a3" 1253 resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
846 integrity sha512-7IsQ6aQx6LAaOqy97/PthTf+5Nx9grZww3r6E62IdWe76Yr8KsuwVjxzqSPQvESJqTE3EMADQ9S0RtwWDGNG9Q== 1254 integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=
847 1255
848babel-plugin-transform-remove-console@^6.8.5: 1256astral-regex@^1.0.0:
849 version "6.9.4" 1257 version "1.0.0"
850 resolved "https://registry.yarnpkg.com/babel-plugin-transform-remove-console/-/babel-plugin-transform-remove-console-6.9.4.tgz#b980360c067384e24b357a588d807d3c83527780" 1258 resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9"
851 integrity sha1-uYA2DAZzhOJLNXpYjYB9PINSd4A= 1259 integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==
852 1260
853babel-plugin-transform-remove-debugger@^6.8.5: 1261astral-regex@^2.0.0:
854 version "6.9.4" 1262 version "2.0.0"
855 resolved "https://registry.yarnpkg.com/babel-plugin-transform-remove-debugger/-/babel-plugin-transform-remove-debugger-6.9.4.tgz#42b727631c97978e1eb2d199a7aec84a18339ef2" 1263 resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31"
856 integrity sha1-QrcnYxyXl44estGZp67IShgznvI= 1264 integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==
857 1265
858babel-plugin-transform-remove-undefined@^0.2.0: 1266async-each@^1.0.1:
859 version "0.2.0" 1267 version "1.0.3"
860 resolved "https://registry.yarnpkg.com/babel-plugin-transform-remove-undefined/-/babel-plugin-transform-remove-undefined-0.2.0.tgz#94f052062054c707e8d094acefe79416b63452b1" 1268 resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf"
861 integrity sha512-O8v57tPMHkp89kA4ZfQEYds/pzgvz/QYerBJjIuL5/Jc7RnvMVRA5gJY9zFKP7WayW8WOSBV4vh8Y8FJRio+ow== 1269 integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==
862 dependencies:
863 babel-helper-evaluate-path "^0.2.0"
864 1270
865babel-plugin-transform-simplify-comparison-operators@^6.8.5: 1271atob@^2.1.2:
866 version "6.9.4" 1272 version "2.1.2"
867 resolved "https://registry.yarnpkg.com/babel-plugin-transform-simplify-comparison-operators/-/babel-plugin-transform-simplify-comparison-operators-6.9.4.tgz#f62afe096cab0e1f68a2d753fdf283888471ceb9" 1273 resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
868 integrity sha1-9ir+CWyrDh9ootdT/fKDiIRxzrk= 1274 integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
869 1275
870babel-plugin-transform-strict-mode@^6.24.1: 1276autoprefixer@^9.8.6:
871 version "6.24.1" 1277 version "9.8.6"
872 resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" 1278 resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.6.tgz#3b73594ca1bf9266320c5acf1588d74dea74210f"
873 integrity sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g= 1279 integrity sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==
874 dependencies: 1280 dependencies:
875 babel-runtime "^6.22.0" 1281 browserslist "^4.12.0"
876 babel-types "^6.24.1" 1282 caniuse-lite "^1.0.30001109"
877 1283 colorette "^1.2.1"
878babel-plugin-transform-undefined-to-void@^6.8.3: 1284 normalize-range "^0.1.2"
879 version "6.9.4" 1285 num2fraction "^1.2.2"
880 resolved "https://registry.yarnpkg.com/babel-plugin-transform-undefined-to-void/-/babel-plugin-transform-undefined-to-void-6.9.4.tgz#be241ca81404030678b748717322b89d0c8fe280" 1286 postcss "^7.0.32"
881 integrity sha1-viQcqBQEAwZ4t0hxcyK4nQyP4oA= 1287 postcss-value-parser "^4.1.0"
882
883babel-preset-env@^1.6.1:
884 version "1.7.0"
885 resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a"
886 integrity sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==
887 dependencies:
888 babel-plugin-check-es2015-constants "^6.22.0"
889 babel-plugin-syntax-trailing-function-commas "^6.22.0"
890 babel-plugin-transform-async-to-generator "^6.22.0"
891 babel-plugin-transform-es2015-arrow-functions "^6.22.0"
892 babel-plugin-transform-es2015-block-scoped-functions "^6.22.0"
893 babel-plugin-transform-es2015-block-scoping "^6.23.0"
894 babel-plugin-transform-es2015-classes "^6.23.0"
895 babel-plugin-transform-es2015-computed-properties "^6.22.0"
896 babel-plugin-transform-es2015-destructuring "^6.23.0"
897 babel-plugin-transform-es2015-duplicate-keys "^6.22.0"
898 babel-plugin-transform-es2015-for-of "^6.23.0"
899 babel-plugin-transform-es2015-function-name "^6.22.0"
900 babel-plugin-transform-es2015-literals "^6.22.0"
901 babel-plugin-transform-es2015-modules-amd "^6.22.0"
902 babel-plugin-transform-es2015-modules-commonjs "^6.23.0"
903 babel-plugin-transform-es2015-modules-systemjs "^6.23.0"
904 babel-plugin-transform-es2015-modules-umd "^6.23.0"
905 babel-plugin-transform-es2015-object-super "^6.22.0"
906 babel-plugin-transform-es2015-parameters "^6.23.0"
907 babel-plugin-transform-es2015-shorthand-properties "^6.22.0"
908 babel-plugin-transform-es2015-spread "^6.22.0"
909 babel-plugin-transform-es2015-sticky-regex "^6.22.0"
910 babel-plugin-transform-es2015-template-literals "^6.22.0"
911 babel-plugin-transform-es2015-typeof-symbol "^6.23.0"
912 babel-plugin-transform-es2015-unicode-regex "^6.22.0"
913 babel-plugin-transform-exponentiation-operator "^6.22.0"
914 babel-plugin-transform-regenerator "^6.22.0"
915 browserslist "^3.2.6"
916 invariant "^2.2.2"
917 semver "^5.3.0"
918 1288
919babel-preset-minify@^0.2.0: 1289awesomplete@^1.1.2:
920 version "0.2.0" 1290 version "1.1.5"
921 resolved "https://registry.yarnpkg.com/babel-preset-minify/-/babel-preset-minify-0.2.0.tgz#006566552d9b83834472273f306c0131062a0acc" 1291 resolved "https://registry.yarnpkg.com/awesomplete/-/awesomplete-1.1.5.tgz#1b2b5dd106d3955595619c03da472a1dc0faf0af"
922 integrity sha512-mR8Q44RmMzm18bM2Lqd9uiPopzk5GDCtVuquNbLFmX6lOKnqWoenaNBxnWW0UhBFC75lEHTIgNGCbnsRI0pJVw== 1292 integrity sha512-UFw1mPW8NaSECDSTC36HbAOTpF9JK2wBUJcNn4MSvlNtK7SZ9N72gB+ajHtA6D1abYXRcszZnBA4nHBwvFwzHw==
923 dependencies:
924 babel-plugin-minify-builtins "^0.2.0"
925 babel-plugin-minify-constant-folding "^0.2.0"
926 babel-plugin-minify-dead-code-elimination "^0.2.0"
927 babel-plugin-minify-flip-comparisons "^0.2.0"
928 babel-plugin-minify-guarded-expressions "^0.2.0"
929 babel-plugin-minify-infinity "^0.2.0"
930 babel-plugin-minify-mangle-names "^0.2.0"
931 babel-plugin-minify-numeric-literals "^0.2.0"
932 babel-plugin-minify-replace "^0.2.0"
933 babel-plugin-minify-simplify "^0.2.0"
934 babel-plugin-minify-type-constructors "^0.2.0"
935 babel-plugin-transform-inline-consecutive-adds "^0.2.0"
936 babel-plugin-transform-member-expression-literals "^6.8.5"
937 babel-plugin-transform-merge-sibling-variables "^6.8.6"
938 babel-plugin-transform-minify-booleans "^6.8.3"
939 babel-plugin-transform-property-literals "^6.8.5"
940 babel-plugin-transform-regexp-constructors "^0.2.0"
941 babel-plugin-transform-remove-console "^6.8.5"
942 babel-plugin-transform-remove-debugger "^6.8.5"
943 babel-plugin-transform-remove-undefined "^0.2.0"
944 babel-plugin-transform-simplify-comparison-operators "^6.8.5"
945 babel-plugin-transform-undefined-to-void "^6.8.3"
946 lodash.isplainobject "^4.0.6"
947
948babel-register@^6.26.0:
949 version "6.26.0"
950 resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071"
951 integrity sha1-btAhFz4vy0htestFxgCahW9kcHE=
952 dependencies:
953 babel-core "^6.26.0"
954 babel-runtime "^6.26.0"
955 core-js "^2.5.0"
956 home-or-tmp "^2.0.0"
957 lodash "^4.17.4"
958 mkdirp "^0.5.1"
959 source-map-support "^0.4.15"
960
961babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0:
962 version "6.26.0"
963 resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
964 integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4=
965 dependencies:
966 core-js "^2.4.0"
967 regenerator-runtime "^0.11.0"
968
969babel-template@^6.24.1, babel-template@^6.26.0:
970 version "6.26.0"
971 resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02"
972 integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=
973 dependencies:
974 babel-runtime "^6.26.0"
975 babel-traverse "^6.26.0"
976 babel-types "^6.26.0"
977 babylon "^6.18.0"
978 lodash "^4.17.4"
979
980babel-traverse@^6.24.1, babel-traverse@^6.26.0:
981 version "6.26.0"
982 resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee"
983 integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=
984 dependencies:
985 babel-code-frame "^6.26.0"
986 babel-messages "^6.23.0"
987 babel-runtime "^6.26.0"
988 babel-types "^6.26.0"
989 babylon "^6.18.0"
990 debug "^2.6.8"
991 globals "^9.18.0"
992 invariant "^2.2.2"
993 lodash "^4.17.4"
994 1293
995babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: 1294babel-loader@^8.1.0:
996 version "6.26.0" 1295 version "8.1.0"
997 resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" 1296 resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.1.0.tgz#c611d5112bd5209abe8b9fa84c3e4da25275f1c3"
998 integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= 1297 integrity sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==
999 dependencies: 1298 dependencies:
1000 babel-runtime "^6.26.0" 1299 find-cache-dir "^2.1.0"
1001 esutils "^2.0.2" 1300 loader-utils "^1.4.0"
1002 lodash "^4.17.4" 1301 mkdirp "^0.5.3"
1003 to-fast-properties "^1.0.3" 1302 pify "^4.0.1"
1303 schema-utils "^2.6.5"
1004 1304
1005babylon@^6.18.0: 1305babel-plugin-dynamic-import-node@^2.3.3:
1006 version "6.18.0" 1306 version "2.3.3"
1007 resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" 1307 resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3"
1008 integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== 1308 integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==
1309 dependencies:
1310 object.assign "^4.1.0"
1009 1311
1010balanced-match@^0.4.2: 1312bail@^1.0.0:
1011 version "0.4.2" 1313 version "1.0.5"
1012 resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" 1314 resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776"
1013 integrity sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg= 1315 integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==
1014 1316
1015balanced-match@^1.0.0: 1317balanced-match@^1.0.0:
1016 version "1.0.0" 1318 version "1.0.0"
@@ -1018,9 +1320,9 @@ balanced-match@^1.0.0:
1018 integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 1320 integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c=
1019 1321
1020base64-js@^1.0.2: 1322base64-js@^1.0.2:
1021 version "1.3.0" 1323 version "1.3.1"
1022 resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" 1324 resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1"
1023 integrity sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw== 1325 integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==
1024 1326
1025base@^0.11.1: 1327base@^0.11.1:
1026 version "0.11.2" 1328 version "0.11.2"
@@ -1035,13 +1337,6 @@ base@^0.11.1:
1035 mixin-deep "^1.2.0" 1337 mixin-deep "^1.2.0"
1036 pascalcase "^0.1.1" 1338 pascalcase "^0.1.1"
1037 1339
1038bcrypt-pbkdf@^1.0.0:
1039 version "1.0.2"
1040 resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e"
1041 integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=
1042 dependencies:
1043 tweetnacl "^0.14.3"
1044
1045big.js@^5.2.2: 1340big.js@^5.2.2:
1046 version "5.2.2" 1341 version "5.2.2"
1047 resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" 1342 resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328"
@@ -1052,22 +1347,37 @@ binary-extensions@^1.0.0:
1052 resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" 1347 resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65"
1053 integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== 1348 integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==
1054 1349
1350binary-extensions@^2.0.0:
1351 version "2.1.0"
1352 resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9"
1353 integrity sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==
1354
1355bindings@^1.5.0:
1356 version "1.5.0"
1357 resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df"
1358 integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==
1359 dependencies:
1360 file-uri-to-path "1.0.0"
1361
1055blazy@^1.8.2: 1362blazy@^1.8.2:
1056 version "1.8.2" 1363 version "1.8.2"
1057 resolved "https://registry.yarnpkg.com/blazy/-/blazy-1.8.2.tgz#50dfd638baaf9003efd6eb3a836aca54184ab6da" 1364 resolved "https://registry.yarnpkg.com/blazy/-/blazy-1.8.2.tgz#50dfd638baaf9003efd6eb3a836aca54184ab6da"
1058 integrity sha1-UN/WOLqvkAPv1us6g2rKVBhKtto= 1365 integrity sha1-UN/WOLqvkAPv1us6g2rKVBhKtto=
1059 1366
1060block-stream@*: 1367bluebird@^3.5.5:
1061 version "0.0.9" 1368 version "3.7.2"
1062 resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" 1369 resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
1063 integrity sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo= 1370 integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==
1064 dependencies:
1065 inherits "~2.0.0"
1066 1371
1067bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: 1372bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.4.0:
1068 version "4.11.8" 1373 version "4.11.9"
1069 resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" 1374 resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.9.tgz#26d556829458f9d1e81fc48952493d0ba3507828"
1070 integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== 1375 integrity sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==
1376
1377bn.js@^5.1.1:
1378 version "5.1.3"
1379 resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.3.tgz#beca005408f642ebebea80b042b4d18d2ac0ee6b"
1380 integrity sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==
1071 1381
1072brace-expansion@^1.1.7: 1382brace-expansion@^1.1.7:
1073 version "1.1.11" 1383 version "1.1.11"
@@ -1093,6 +1403,13 @@ braces@^2.3.1, braces@^2.3.2:
1093 split-string "^3.0.2" 1403 split-string "^3.0.2"
1094 to-regex "^3.0.1" 1404 to-regex "^3.0.1"
1095 1405
1406braces@^3.0.1, braces@~3.0.2:
1407 version "3.0.2"
1408 resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
1409 integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
1410 dependencies:
1411 fill-range "^7.0.1"
1412
1096brorand@^1.0.1: 1413brorand@^1.0.1:
1097 version "1.1.0" 1414 version "1.1.0"
1098 resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" 1415 resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
@@ -1129,7 +1446,7 @@ browserify-des@^1.0.0:
1129 inherits "^2.0.1" 1446 inherits "^2.0.1"
1130 safe-buffer "^5.1.2" 1447 safe-buffer "^5.1.2"
1131 1448
1132browserify-rsa@^4.0.0: 1449browserify-rsa@^4.0.0, browserify-rsa@^4.0.1:
1133 version "4.0.1" 1450 version "4.0.1"
1134 resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" 1451 resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524"
1135 integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= 1452 integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=
@@ -1138,17 +1455,19 @@ browserify-rsa@^4.0.0:
1138 randombytes "^2.0.1" 1455 randombytes "^2.0.1"
1139 1456
1140browserify-sign@^4.0.0: 1457browserify-sign@^4.0.0:
1141 version "4.0.4" 1458 version "4.2.1"
1142 resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" 1459 resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3"
1143 integrity sha1-qk62jl17ZYuqa/alfmMMvXqT0pg= 1460 integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==
1144 dependencies: 1461 dependencies:
1145 bn.js "^4.1.1" 1462 bn.js "^5.1.1"
1146 browserify-rsa "^4.0.0" 1463 browserify-rsa "^4.0.1"
1147 create-hash "^1.1.0" 1464 create-hash "^1.2.0"
1148 create-hmac "^1.1.2" 1465 create-hmac "^1.1.7"
1149 elliptic "^6.0.0" 1466 elliptic "^6.5.3"
1150 inherits "^2.0.1" 1467 inherits "^2.0.4"
1151 parse-asn1 "^5.0.0" 1468 parse-asn1 "^5.1.5"
1469 readable-stream "^3.6.0"
1470 safe-buffer "^5.2.0"
1152 1471
1153browserify-zlib@^0.2.0: 1472browserify-zlib@^0.2.0:
1154 version "0.2.0" 1473 version "0.2.0"
@@ -1157,21 +1476,15 @@ browserify-zlib@^0.2.0:
1157 dependencies: 1476 dependencies:
1158 pako "~1.0.5" 1477 pako "~1.0.5"
1159 1478
1160browserslist@^1.3.6, browserslist@^1.5.2, browserslist@^1.7.6: 1479browserslist@^4.12.0, browserslist@^4.8.5:
1161 version "1.7.7" 1480 version "4.14.3"
1162 resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-1.7.7.tgz#0bd76704258be829b2398bb50e4b62d1a166b0b9" 1481 resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.14.3.tgz#381f9e7f13794b2eb17e1761b4f118e8ae665a53"
1163 integrity sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk= 1482 integrity sha512-GcZPC5+YqyPO4SFnz48/B0YaCwS47Q9iPChRGi6t7HhflKBcINzFrJvRfC+jp30sRMKxF+d4EHGs27Z0XP1NaQ==
1164 dependencies:
1165 caniuse-db "^1.0.30000639"
1166 electron-to-chromium "^1.2.7"
1167
1168browserslist@^3.2.6:
1169 version "3.2.8"
1170 resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6"
1171 integrity sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==
1172 dependencies: 1483 dependencies:
1173 caniuse-lite "^1.0.30000844" 1484 caniuse-lite "^1.0.30001131"
1174 electron-to-chromium "^1.3.47" 1485 electron-to-chromium "^1.3.570"
1486 escalade "^3.1.0"
1487 node-releases "^1.1.61"
1175 1488
1176buffer-from@^1.0.0: 1489buffer-from@^1.0.0:
1177 version "1.1.1" 1490 version "1.1.1"
@@ -1184,9 +1497,9 @@ buffer-xor@^1.0.3:
1184 integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= 1497 integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=
1185 1498
1186buffer@^4.3.0: 1499buffer@^4.3.0:
1187 version "4.9.1" 1500 version "4.9.2"
1188 resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" 1501 resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8"
1189 integrity sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg= 1502 integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==
1190 dependencies: 1503 dependencies:
1191 base64-js "^1.0.2" 1504 base64-js "^1.0.2"
1192 ieee754 "^1.1.4" 1505 ieee754 "^1.1.4"
@@ -1197,6 +1510,50 @@ builtin-status-codes@^3.0.0:
1197 resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" 1510 resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
1198 integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= 1511 integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=
1199 1512
1513cacache@^12.0.2:
1514 version "12.0.4"
1515 resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c"
1516 integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==
1517 dependencies:
1518 bluebird "^3.5.5"
1519 chownr "^1.1.1"
1520 figgy-pudding "^3.5.1"
1521 glob "^7.1.4"
1522 graceful-fs "^4.1.15"
1523 infer-owner "^1.0.3"
1524 lru-cache "^5.1.1"
1525 mississippi "^3.0.0"
1526 mkdirp "^0.5.1"
1527 move-concurrently "^1.0.1"
1528 promise-inflight "^1.0.1"
1529 rimraf "^2.6.3"
1530 ssri "^6.0.1"
1531 unique-filename "^1.1.1"
1532 y18n "^4.0.0"
1533
1534cacache@^15.0.5:
1535 version "15.0.5"
1536 resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.0.5.tgz#69162833da29170d6732334643c60e005f5f17d0"
1537 integrity sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A==
1538 dependencies:
1539 "@npmcli/move-file" "^1.0.1"
1540 chownr "^2.0.0"
1541 fs-minipass "^2.0.0"
1542 glob "^7.1.4"
1543 infer-owner "^1.0.4"
1544 lru-cache "^6.0.0"
1545 minipass "^3.1.1"
1546 minipass-collect "^1.0.2"
1547 minipass-flush "^1.0.5"
1548 minipass-pipeline "^1.2.2"
1549 mkdirp "^1.0.3"
1550 p-map "^4.0.0"
1551 promise-inflight "^1.0.1"
1552 rimraf "^3.0.2"
1553 ssri "^8.0.0"
1554 tar "^6.0.2"
1555 unique-filename "^1.1.1"
1556
1200cache-base@^1.0.1: 1557cache-base@^1.0.1:
1201 version "1.0.1" 1558 version "1.0.1"
1202 resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" 1559 resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
@@ -1212,91 +1569,41 @@ cache-base@^1.0.1:
1212 union-value "^1.0.0" 1569 union-value "^1.0.0"
1213 unset-value "^1.0.0" 1570 unset-value "^1.0.0"
1214 1571
1215caller-path@^0.1.0: 1572callsites@^3.0.0:
1216 version "0.1.0" 1573 version "3.1.0"
1217 resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" 1574 resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
1218 integrity sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8= 1575 integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
1219 dependencies:
1220 callsites "^0.2.0"
1221
1222callsites@^0.2.0:
1223 version "0.2.0"
1224 resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca"
1225 integrity sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=
1226 1576
1227camelcase-keys@^2.0.0: 1577camelcase-keys@^6.2.2:
1228 version "2.1.0" 1578 version "6.2.2"
1229 resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" 1579 resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0"
1230 integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc= 1580 integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==
1231 dependencies: 1581 dependencies:
1232 camelcase "^2.0.0" 1582 camelcase "^5.3.1"
1233 map-obj "^1.0.0" 1583 map-obj "^4.0.0"
1234 1584 quick-lru "^4.0.1"
1235camelcase@^1.0.2:
1236 version "1.2.1"
1237 resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39"
1238 integrity sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=
1239 1585
1240camelcase@^2.0.0: 1586camelcase@^5.0.0, camelcase@^5.3.1:
1241 version "2.1.1" 1587 version "5.3.1"
1242 resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" 1588 resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
1243 integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= 1589 integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
1244 1590
1245camelcase@^3.0.0: 1591camelcase@^6.0.0:
1246 version "3.0.0" 1592 version "6.0.0"
1247 resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" 1593 resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.0.0.tgz#5259f7c30e35e278f1bdc2a4d91230b37cad981e"
1248 integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo= 1594 integrity sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w==
1249 1595
1250camelcase@^4.1.0: 1596caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001131:
1251 version "4.1.0" 1597 version "1.0.30001135"
1252 resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" 1598 resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001135.tgz#995b1eb94404a3c9a0d7600c113c9bb27f2cd8aa"
1253 integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= 1599 integrity sha512-ziNcheTGTHlu9g34EVoHQdIu5g4foc8EsxMGC7Xkokmvw0dqNtX8BS8RgCgFBaAiSp2IdjvBxNdh0ssib28eVQ==
1254 1600
1255caniuse-api@^1.5.2: 1601ccount@^1.0.0:
1256 version "1.6.1" 1602 version "1.0.5"
1257 resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-1.6.1.tgz#b534e7c734c4f81ec5fbe8aca2ad24354b962c6c" 1603 resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.0.5.tgz#ac82a944905a65ce204eb03023157edf29425c17"
1258 integrity sha1-tTTnxzTE+B7F++isoq0kNUuWLGw= 1604 integrity sha512-MOli1W+nfbPLlKEhInaxhRdp7KVLFxLN5ykwzHgLsLI3H3gs5jjFAK4Eoj3OzzcxCtumDaI8onoVDeQyWaNTkw==
1259 dependencies:
1260 browserslist "^1.3.6"
1261 caniuse-db "^1.0.30000529"
1262 lodash.memoize "^4.1.2"
1263 lodash.uniq "^4.5.0"
1264
1265caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639:
1266 version "1.0.30000969"
1267 resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000969.tgz#e6aeca9b1bac88865990913a0b041f587180cd59"
1268 integrity sha512-ttrmwpIXvEL/kg0JSg6Q+xEbMxAEcjZOOgZMGPcMe5JMYgi20Nvs9bqMRGfyIOQtd1jYa6yRWODIR6apj3xPQw==
1269
1270caniuse-lite@^1.0.30000844:
1271 version "1.0.30000969"
1272 resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000969.tgz#7664f571f2072657bde70b00a1fc1ba41f1942a9"
1273 integrity sha512-Kus0yxkoAJgVc0bax7S4gLSlFifCa7MnSZL9p9VuS/HIKEL4seaqh28KIQAAO50cD/rJ5CiJkJFapkdDAlhFxQ==
1274
1275caseless@~0.12.0:
1276 version "0.12.0"
1277 resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
1278 integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=
1279
1280center-align@^0.1.1:
1281 version "0.1.3"
1282 resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad"
1283 integrity sha1-qg0yYptu6XIgBBHL1EYckHvCt60=
1284 dependencies:
1285 align-text "^0.1.3"
1286 lazy-cache "^1.0.3"
1287
1288chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3:
1289 version "1.1.3"
1290 resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
1291 integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=
1292 dependencies:
1293 ansi-styles "^2.2.1"
1294 escape-string-regexp "^1.0.2"
1295 has-ansi "^2.0.0"
1296 strip-ansi "^3.0.0"
1297 supports-color "^2.0.0"
1298 1605
1299chalk@^2.0.0, chalk@^2.1.0, chalk@^2.4.1: 1606chalk@^2.0.0, chalk@^2.4.2:
1300 version "2.4.2" 1607 version "2.4.2"
1301 resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 1608 resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
1302 integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 1609 integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
@@ -1305,15 +1612,53 @@ chalk@^2.0.0, chalk@^2.1.0, chalk@^2.4.1:
1305 escape-string-regexp "^1.0.5" 1612 escape-string-regexp "^1.0.5"
1306 supports-color "^5.3.0" 1613 supports-color "^5.3.0"
1307 1614
1308chardet@^0.4.0: 1615chalk@^4.0.0, chalk@^4.1.0:
1309 version "0.4.2" 1616 version "4.1.0"
1310 resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" 1617 resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a"
1311 integrity sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I= 1618 integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==
1619 dependencies:
1620 ansi-styles "^4.1.0"
1621 supports-color "^7.1.0"
1622
1623character-entities-html4@^1.0.0:
1624 version "1.1.4"
1625 resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-1.1.4.tgz#0e64b0a3753ddbf1fdc044c5fd01d0199a02e125"
1626 integrity sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g==
1627
1628character-entities-legacy@^1.0.0:
1629 version "1.1.4"
1630 resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1"
1631 integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==
1312 1632
1313chokidar@^2.0.2: 1633character-entities@^1.0.0:
1314 version "2.1.6" 1634 version "1.2.4"
1315 resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.6.tgz#b6cad653a929e244ce8a834244164d241fa954c5" 1635 resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b"
1316 integrity sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g== 1636 integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==
1637
1638character-reference-invalid@^1.0.0:
1639 version "1.1.4"
1640 resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560"
1641 integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==
1642
1643"chokidar@>=2.0.0 <4.0.0", chokidar@^3.4.1:
1644 version "3.4.2"
1645 resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.2.tgz#38dc8e658dec3809741eb3ef7bb0a47fe424232d"
1646 integrity sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==
1647 dependencies:
1648 anymatch "~3.1.1"
1649 braces "~3.0.2"
1650 glob-parent "~5.1.0"
1651 is-binary-path "~2.1.0"
1652 is-glob "~4.0.1"
1653 normalize-path "~3.0.0"
1654 readdirp "~3.4.0"
1655 optionalDependencies:
1656 fsevents "~2.1.2"
1657
1658chokidar@^2.1.8:
1659 version "2.1.8"
1660 resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917"
1661 integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==
1317 dependencies: 1662 dependencies:
1318 anymatch "^2.0.0" 1663 anymatch "^2.0.0"
1319 async-each "^1.0.1" 1664 async-each "^1.0.1"
@@ -1330,9 +1675,21 @@ chokidar@^2.0.2:
1330 fsevents "^1.2.7" 1675 fsevents "^1.2.7"
1331 1676
1332chownr@^1.1.1: 1677chownr@^1.1.1:
1333 version "1.1.1" 1678 version "1.1.4"
1334 resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" 1679 resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b"
1335 integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g== 1680 integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==
1681
1682chownr@^2.0.0:
1683 version "2.0.0"
1684 resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece"
1685 integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==
1686
1687chrome-trace-event@^1.0.2:
1688 version "1.0.2"
1689 resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4"
1690 integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==
1691 dependencies:
1692 tslib "^1.9.0"
1336 1693
1337cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: 1694cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
1338 version "1.0.4" 1695 version "1.0.4"
@@ -1342,18 +1699,6 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
1342 inherits "^2.0.1" 1699 inherits "^2.0.1"
1343 safe-buffer "^5.0.1" 1700 safe-buffer "^5.0.1"
1344 1701
1345circular-json@^0.3.1:
1346 version "0.3.3"
1347 resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66"
1348 integrity sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==
1349
1350clap@^1.0.9:
1351 version "1.2.3"
1352 resolved "https://registry.yarnpkg.com/clap/-/clap-1.2.3.tgz#4f36745b32008492557f46412d66d50cb99bce51"
1353 integrity sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==
1354 dependencies:
1355 chalk "^1.1.3"
1356
1357class-utils@^0.3.5: 1702class-utils@^0.3.5:
1358 version "0.3.6" 1703 version "0.3.6"
1359 resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" 1704 resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
@@ -1364,74 +1709,31 @@ class-utils@^0.3.5:
1364 isobject "^3.0.0" 1709 isobject "^3.0.0"
1365 static-extend "^0.1.1" 1710 static-extend "^0.1.1"
1366 1711
1367cli-cursor@^1.0.1: 1712clean-stack@^2.0.0:
1368 version "1.0.2"
1369 resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987"
1370 integrity sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=
1371 dependencies:
1372 restore-cursor "^1.0.1"
1373
1374cli-cursor@^2.1.0:
1375 version "2.1.0"
1376 resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5"
1377 integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=
1378 dependencies:
1379 restore-cursor "^2.0.0"
1380
1381cli-width@^2.0.0:
1382 version "2.2.0" 1713 version "2.2.0"
1383 resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" 1714 resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b"
1384 integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= 1715 integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==
1385
1386cliui@^2.1.0:
1387 version "2.1.0"
1388 resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1"
1389 integrity sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=
1390 dependencies:
1391 center-align "^0.1.1"
1392 right-align "^0.1.1"
1393 wordwrap "0.0.2"
1394
1395cliui@^3.2.0:
1396 version "3.2.0"
1397 resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d"
1398 integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=
1399 dependencies:
1400 string-width "^1.0.1"
1401 strip-ansi "^3.0.1"
1402 wrap-ansi "^2.0.0"
1403 1716
1404clone-deep@^2.0.1: 1717cliui@^5.0.0:
1405 version "2.0.2" 1718 version "5.0.0"
1406 resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-2.0.2.tgz#00db3a1e173656730d1188c3d6aced6d7ea97713" 1719 resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5"
1407 integrity sha512-SZegPTKjCgpQH63E+eN6mVEEPdQBOUzjyJm5Pora4lrwWRFS8I0QAxV/KD6vV/i0WuijHZWQC1fMsPEdxfdVCQ== 1720 integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==
1408 dependencies: 1721 dependencies:
1409 for-own "^1.0.0" 1722 string-width "^3.1.0"
1410 is-plain-object "^2.0.4" 1723 strip-ansi "^5.2.0"
1411 kind-of "^6.0.0" 1724 wrap-ansi "^5.1.0"
1412 shallow-clone "^1.0.0"
1413
1414clone@^1.0.2:
1415 version "1.0.4"
1416 resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
1417 integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4=
1418
1419co@^4.6.0:
1420 version "4.6.0"
1421 resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
1422 integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=
1423 1725
1424coa@~1.0.1: 1726clone-regexp@^2.1.0:
1425 version "1.0.4" 1727 version "2.2.0"
1426 resolved "https://registry.yarnpkg.com/coa/-/coa-1.0.4.tgz#a9ef153660d6a86a8bdec0289a5c684d217432fd" 1728 resolved "https://registry.yarnpkg.com/clone-regexp/-/clone-regexp-2.2.0.tgz#7d65e00885cd8796405c35a737e7a86b7429e36f"
1427 integrity sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0= 1729 integrity sha512-beMpP7BOtTipFuW8hrJvREQ2DrRu3BE7by0ZpibtfBA+qfHYvMGTc2Yb1JMYPKg/JUw0CHYvpg796aNTSW9z7Q==
1428 dependencies: 1730 dependencies:
1429 q "^1.1.2" 1731 is-regexp "^2.0.0"
1430 1732
1431code-point-at@^1.0.0: 1733collapse-white-space@^1.0.2:
1432 version "1.1.0" 1734 version "1.0.6"
1433 resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 1735 resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.6.tgz#e63629c0016665792060dbbeb79c42239d2c5287"
1434 integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= 1736 integrity sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==
1435 1737
1436collection-visit@^1.0.0: 1738collection-visit@^1.0.0:
1437 version "1.0.0" 1739 version "1.0.0"
@@ -1441,64 +1743,39 @@ collection-visit@^1.0.0:
1441 map-visit "^1.0.0" 1743 map-visit "^1.0.0"
1442 object-visit "^1.0.0" 1744 object-visit "^1.0.0"
1443 1745
1444color-convert@^1.3.0, color-convert@^1.9.0: 1746color-convert@^1.9.0:
1445 version "1.9.3" 1747 version "1.9.3"
1446 resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 1748 resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
1447 integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 1749 integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
1448 dependencies: 1750 dependencies:
1449 color-name "1.1.3" 1751 color-name "1.1.3"
1450 1752
1753color-convert@^2.0.1:
1754 version "2.0.1"
1755 resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
1756 integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
1757 dependencies:
1758 color-name "~1.1.4"
1759
1451color-name@1.1.3: 1760color-name@1.1.3:
1452 version "1.1.3" 1761 version "1.1.3"
1453 resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 1762 resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
1454 integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 1763 integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
1455 1764
1456color-name@^1.0.0: 1765color-name@~1.1.4:
1457 version "1.1.4" 1766 version "1.1.4"
1458 resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 1767 resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
1459 integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 1768 integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
1460 1769
1461color-string@^0.3.0: 1770colorette@^1.2.1:
1462 version "0.3.0" 1771 version "1.2.1"
1463 resolved "https://registry.yarnpkg.com/color-string/-/color-string-0.3.0.tgz#27d46fb67025c5c2fa25993bfbf579e47841b991" 1772 resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.1.tgz#4d0b921325c14faf92633086a536db6e89564b1b"
1464 integrity sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE= 1773 integrity sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==
1465 dependencies:
1466 color-name "^1.0.0"
1467
1468color@^0.11.0:
1469 version "0.11.4"
1470 resolved "https://registry.yarnpkg.com/color/-/color-0.11.4.tgz#6d7b5c74fb65e841cd48792ad1ed5e07b904d764"
1471 integrity sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=
1472 dependencies:
1473 clone "^1.0.2"
1474 color-convert "^1.3.0"
1475 color-string "^0.3.0"
1476
1477colormin@^1.0.5:
1478 version "1.1.2"
1479 resolved "https://registry.yarnpkg.com/colormin/-/colormin-1.1.2.tgz#ea2f7420a72b96881a38aae59ec124a6f7298133"
1480 integrity sha1-6i90IKcrlogaOKrlnsEkpvcpgTM=
1481 dependencies:
1482 color "^0.11.0"
1483 css-color-names "0.0.4"
1484 has "^1.0.1"
1485
1486colors@~1.1.2:
1487 version "1.1.2"
1488 resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63"
1489 integrity sha1-FopHAXVran9RoSzgyXv6KMCE7WM=
1490
1491combined-stream@^1.0.6, combined-stream@~1.0.6:
1492 version "1.0.8"
1493 resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
1494 integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
1495 dependencies:
1496 delayed-stream "~1.0.0"
1497 1774
1498commander@^2.8.1: 1775commander@^2.20.0:
1499 version "2.20.0" 1776 version "2.20.3"
1500 resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" 1777 resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
1501 integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ== 1778 integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
1502 1779
1503commondir@^1.0.1: 1780commondir@^1.0.1:
1504 version "1.0.1" 1781 version "1.0.1"
@@ -1515,7 +1792,7 @@ concat-map@0.0.1:
1515 resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 1792 resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
1516 integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 1793 integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
1517 1794
1518concat-stream@^1.4.6, concat-stream@^1.6.0: 1795concat-stream@^1.5.0:
1519 version "1.6.2" 1796 version "1.6.2"
1520 resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" 1797 resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34"
1521 integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== 1798 integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==
@@ -1525,17 +1802,15 @@ concat-stream@^1.4.6, concat-stream@^1.6.0:
1525 readable-stream "^2.2.2" 1802 readable-stream "^2.2.2"
1526 typedarray "^0.0.6" 1803 typedarray "^0.0.6"
1527 1804
1528console-browserify@^1.1.0: 1805confusing-browser-globals@^1.0.9:
1529 version "1.1.0" 1806 version "1.0.9"
1530 resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" 1807 resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz#72bc13b483c0276801681871d4898516f8f54fdd"
1531 integrity sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA= 1808 integrity sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw==
1532 dependencies:
1533 date-now "^0.1.4"
1534 1809
1535console-control-strings@^1.0.0, console-control-strings@~1.1.0: 1810console-browserify@^1.1.0:
1536 version "1.1.0" 1811 version "1.2.0"
1537 resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" 1812 resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336"
1538 integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= 1813 integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==
1539 1814
1540constants-browserify@^1.0.0: 1815constants-browserify@^1.0.0:
1541 version "1.0.0" 1816 version "1.0.0"
@@ -1547,37 +1822,63 @@ contains-path@^0.1.0:
1547 resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" 1822 resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a"
1548 integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= 1823 integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=
1549 1824
1550convert-source-map@^1.5.1: 1825convert-source-map@^1.7.0:
1551 version "1.6.0" 1826 version "1.7.0"
1552 resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" 1827 resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442"
1553 integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== 1828 integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==
1554 dependencies: 1829 dependencies:
1555 safe-buffer "~5.1.1" 1830 safe-buffer "~5.1.1"
1556 1831
1832copy-concurrently@^1.0.0:
1833 version "1.0.5"
1834 resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0"
1835 integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==
1836 dependencies:
1837 aproba "^1.1.1"
1838 fs-write-stream-atomic "^1.0.8"
1839 iferr "^0.1.5"
1840 mkdirp "^0.5.1"
1841 rimraf "^2.5.4"
1842 run-queue "^1.0.0"
1843
1557copy-descriptor@^0.1.0: 1844copy-descriptor@^0.1.0:
1558 version "0.1.1" 1845 version "0.1.1"
1559 resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" 1846 resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
1560 integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= 1847 integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=
1561 1848
1562core-js@^2.4.0, core-js@^2.5.0: 1849core-js-compat@^3.6.2:
1563 version "2.6.5" 1850 version "3.6.5"
1564 resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.5.tgz#44bc8d249e7fb2ff5d00e0341a7ffb94fbf67895" 1851 resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.5.tgz#2a51d9a4e25dfd6e690251aa81f99e3c05481f1c"
1565 integrity sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A== 1852 integrity sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==
1853 dependencies:
1854 browserslist "^4.8.5"
1855 semver "7.0.0"
1566 1856
1567core-util-is@1.0.2, core-util-is@~1.0.0: 1857core-util-is@~1.0.0:
1568 version "1.0.2" 1858 version "1.0.2"
1569 resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 1859 resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
1570 integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= 1860 integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
1571 1861
1862cosmiconfig@^7.0.0:
1863 version "7.0.0"
1864 resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.0.tgz#ef9b44d773959cae63ddecd122de23853b60f8d3"
1865 integrity sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==
1866 dependencies:
1867 "@types/parse-json" "^4.0.0"
1868 import-fresh "^3.2.1"
1869 parse-json "^5.0.0"
1870 path-type "^4.0.0"
1871 yaml "^1.10.0"
1872
1572create-ecdh@^4.0.0: 1873create-ecdh@^4.0.0:
1573 version "4.0.3" 1874 version "4.0.4"
1574 resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" 1875 resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e"
1575 integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw== 1876 integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==
1576 dependencies: 1877 dependencies:
1577 bn.js "^4.1.0" 1878 bn.js "^4.1.0"
1578 elliptic "^6.0.0" 1879 elliptic "^6.5.3"
1579 1880
1580create-hash@^1.1.0, create-hash@^1.1.2: 1881create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0:
1581 version "1.2.0" 1882 version "1.2.0"
1582 resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" 1883 resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196"
1583 integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== 1884 integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==
@@ -1588,7 +1889,7 @@ create-hash@^1.1.0, create-hash@^1.1.2:
1588 ripemd160 "^2.0.1" 1889 ripemd160 "^2.0.1"
1589 sha.js "^2.4.0" 1890 sha.js "^2.4.0"
1590 1891
1591create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: 1892create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7:
1592 version "1.1.7" 1893 version "1.1.7"
1593 resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" 1894 resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff"
1594 integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== 1895 integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==
@@ -1600,22 +1901,25 @@ create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4:
1600 safe-buffer "^5.0.1" 1901 safe-buffer "^5.0.1"
1601 sha.js "^2.4.8" 1902 sha.js "^2.4.8"
1602 1903
1603cross-spawn@^3.0.0: 1904cross-spawn@^6.0.5:
1604 version "3.0.1" 1905 version "6.0.5"
1605 resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982" 1906 resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
1606 integrity sha1-ElYDfsufDF9549bvE14wdwGEuYI= 1907 integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==
1607 dependencies: 1908 dependencies:
1608 lru-cache "^4.0.1" 1909 nice-try "^1.0.4"
1910 path-key "^2.0.1"
1911 semver "^5.5.0"
1912 shebang-command "^1.2.0"
1609 which "^1.2.9" 1913 which "^1.2.9"
1610 1914
1611cross-spawn@^5.0.1, cross-spawn@^5.1.0: 1915cross-spawn@^7.0.2:
1612 version "5.1.0" 1916 version "7.0.3"
1613 resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" 1917 resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
1614 integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= 1918 integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
1615 dependencies: 1919 dependencies:
1616 lru-cache "^4.0.1" 1920 path-key "^3.1.0"
1617 shebang-command "^1.2.0" 1921 shebang-command "^2.0.0"
1618 which "^1.2.9" 1922 which "^2.0.1"
1619 1923
1620crypto-browserify@^3.11.0: 1924crypto-browserify@^3.11.0:
1621 version "3.12.0" 1925 version "3.12.0"
@@ -1634,132 +1938,57 @@ crypto-browserify@^3.11.0:
1634 randombytes "^2.0.0" 1938 randombytes "^2.0.0"
1635 randomfill "^1.0.3" 1939 randomfill "^1.0.3"
1636 1940
1637css-color-names@0.0.4: 1941css-loader@^4.3.0:
1638 version "0.0.4" 1942 version "4.3.0"
1639 resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" 1943 resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-4.3.0.tgz#c888af64b2a5b2e85462c72c0f4a85c7e2e0821e"
1640 integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA= 1944 integrity sha512-rdezjCjScIrsL8BSYszgT4s476IcNKt6yX69t0pHjJVnPUTDpn4WfIpDQTN3wCJvUvfsz/mFjuGOekf3PY3NUg==
1641 1945 dependencies:
1642css-loader@^0.28.9: 1946 camelcase "^6.0.0"
1643 version "0.28.11" 1947 cssesc "^3.0.0"
1644 resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-0.28.11.tgz#c3f9864a700be2711bb5a2462b2389b1a392dab7" 1948 icss-utils "^4.1.1"
1645 integrity sha512-wovHgjAx8ZIMGSL8pTys7edA1ClmzxHeY6n/d97gg5odgsxEgKjULPR0viqyC+FWMCL9sfqoC/QCUBo62tLvPg== 1949 loader-utils "^2.0.0"
1646 dependencies: 1950 postcss "^7.0.32"
1647 babel-code-frame "^6.26.0" 1951 postcss-modules-extract-imports "^2.0.0"
1648 css-selector-tokenizer "^0.7.0" 1952 postcss-modules-local-by-default "^3.0.3"
1649 cssnano "^3.10.0" 1953 postcss-modules-scope "^2.2.0"
1650 icss-utils "^2.1.0" 1954 postcss-modules-values "^3.0.0"
1651 loader-utils "^1.0.2" 1955 postcss-value-parser "^4.1.0"
1652 lodash.camelcase "^4.3.0" 1956 schema-utils "^2.7.1"
1653 object-assign "^4.1.1" 1957 semver "^7.3.2"
1654 postcss "^5.0.6" 1958
1655 postcss-modules-extract-imports "^1.2.0" 1959cssesc@^3.0.0:
1656 postcss-modules-local-by-default "^1.2.0" 1960 version "3.0.0"
1657 postcss-modules-scope "^1.1.0" 1961 resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee"
1658 postcss-modules-values "^1.3.0" 1962 integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==
1659 postcss-value-parser "^3.3.0"
1660 source-list-map "^2.0.0"
1661
1662css-selector-tokenizer@^0.7.0:
1663 version "0.7.1"
1664 resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz#a177271a8bca5019172f4f891fc6eed9cbf68d5d"
1665 integrity sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA==
1666 dependencies:
1667 cssesc "^0.1.0"
1668 fastparse "^1.1.1"
1669 regexpu-core "^1.0.0"
1670
1671cssesc@^0.1.0:
1672 version "0.1.0"
1673 resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-0.1.0.tgz#c814903e45623371a0477b40109aaafbeeaddbb4"
1674 integrity sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=
1675
1676cssnano@^3.10.0:
1677 version "3.10.0"
1678 resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-3.10.0.tgz#4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38"
1679 integrity sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg=
1680 dependencies:
1681 autoprefixer "^6.3.1"
1682 decamelize "^1.1.2"
1683 defined "^1.0.0"
1684 has "^1.0.1"
1685 object-assign "^4.0.1"
1686 postcss "^5.0.14"
1687 postcss-calc "^5.2.0"
1688 postcss-colormin "^2.1.8"
1689 postcss-convert-values "^2.3.4"
1690 postcss-discard-comments "^2.0.4"
1691 postcss-discard-duplicates "^2.0.1"
1692 postcss-discard-empty "^2.0.1"
1693 postcss-discard-overridden "^0.1.1"
1694 postcss-discard-unused "^2.2.1"
1695 postcss-filter-plugins "^2.0.0"
1696 postcss-merge-idents "^2.1.5"
1697 postcss-merge-longhand "^2.0.1"
1698 postcss-merge-rules "^2.0.3"
1699 postcss-minify-font-values "^1.0.2"
1700 postcss-minify-gradients "^1.0.1"
1701 postcss-minify-params "^1.0.4"
1702 postcss-minify-selectors "^2.0.4"
1703 postcss-normalize-charset "^1.1.0"
1704 postcss-normalize-url "^3.0.7"
1705 postcss-ordered-values "^2.1.0"
1706 postcss-reduce-idents "^2.2.2"
1707 postcss-reduce-initial "^1.0.0"
1708 postcss-reduce-transforms "^1.0.3"
1709 postcss-svgo "^2.1.1"
1710 postcss-unique-selectors "^2.0.2"
1711 postcss-value-parser "^3.2.3"
1712 postcss-zindex "^2.0.1"
1713
1714csso@~2.3.1:
1715 version "2.3.2"
1716 resolved "https://registry.yarnpkg.com/csso/-/csso-2.3.2.tgz#ddd52c587033f49e94b71fc55569f252e8ff5f85"
1717 integrity sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=
1718 dependencies:
1719 clap "^1.0.9"
1720 source-map "^0.5.3"
1721
1722currently-unhandled@^0.4.1:
1723 version "0.4.1"
1724 resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea"
1725 integrity sha1-mI3zP+qxke95mmE2nddsF635V+o=
1726 dependencies:
1727 array-find-index "^1.0.1"
1728
1729d@1:
1730 version "1.0.0"
1731 resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f"
1732 integrity sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=
1733 dependencies:
1734 es5-ext "^0.10.9"
1735
1736dashdash@^1.12.0:
1737 version "1.14.1"
1738 resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
1739 integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=
1740 dependencies:
1741 assert-plus "^1.0.0"
1742 1963
1743date-now@^0.1.4: 1964cyclist@^1.0.1:
1744 version "0.1.4" 1965 version "1.0.1"
1745 resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" 1966 resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9"
1746 integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs= 1967 integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=
1747 1968
1748debug@^2.1.1, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: 1969debug@^2.2.0, debug@^2.3.3, debug@^2.6.9:
1749 version "2.6.9" 1970 version "2.6.9"
1750 resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 1971 resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
1751 integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 1972 integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
1752 dependencies: 1973 dependencies:
1753 ms "2.0.0" 1974 ms "2.0.0"
1754 1975
1755debug@^3.1.0, debug@^3.2.6: 1976debug@^4.0.1, debug@^4.1.0, debug@^4.1.1:
1756 version "3.2.6" 1977 version "4.2.0"
1757 resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" 1978 resolved "https://registry.yarnpkg.com/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1"
1758 integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== 1979 integrity sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==
1980 dependencies:
1981 ms "2.1.2"
1982
1983decamelize-keys@^1.1.0:
1984 version "1.1.0"
1985 resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9"
1986 integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=
1759 dependencies: 1987 dependencies:
1760 ms "^2.1.1" 1988 decamelize "^1.1.0"
1989 map-obj "^1.0.0"
1761 1990
1762decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: 1991decamelize@^1.1.0, decamelize@^1.2.0:
1763 version "1.2.0" 1992 version "1.2.0"
1764 resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 1993 resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
1765 integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= 1994 integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=
@@ -1769,17 +1998,12 @@ decode-uri-component@^0.2.0:
1769 resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" 1998 resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
1770 integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= 1999 integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=
1771 2000
1772deep-extend@^0.6.0: 2001deep-is@^0.1.3:
1773 version "0.6.0"
1774 resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
1775 integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==
1776
1777deep-is@~0.1.3:
1778 version "0.1.3" 2002 version "0.1.3"
1779 resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" 2003 resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
1780 integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= 2004 integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=
1781 2005
1782define-properties@^1.1.2: 2006define-properties@^1.1.3:
1783 version "1.1.3" 2007 version "1.1.3"
1784 resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" 2008 resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
1785 integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== 2009 integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==
@@ -1808,40 +2032,18 @@ define-property@^2.0.2:
1808 is-descriptor "^1.0.2" 2032 is-descriptor "^1.0.2"
1809 isobject "^3.0.1" 2033 isobject "^3.0.1"
1810 2034
1811defined@^1.0.0:
1812 version "1.0.0"
1813 resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693"
1814 integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=
1815
1816delayed-stream@~1.0.0:
1817 version "1.0.0"
1818 resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
1819 integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk=
1820
1821delegates@^1.0.0:
1822 version "1.0.0"
1823 resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
1824 integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=
1825
1826des.js@^1.0.0: 2035des.js@^1.0.0:
1827 version "1.0.0" 2036 version "1.0.1"
1828 resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" 2037 resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843"
1829 integrity sha1-wHTS4qpqipoH29YfmhXCzYPsjsw= 2038 integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==
1830 dependencies: 2039 dependencies:
1831 inherits "^2.0.1" 2040 inherits "^2.0.1"
1832 minimalistic-assert "^1.0.0" 2041 minimalistic-assert "^1.0.0"
1833 2042
1834detect-indent@^4.0.0: 2043detect-file@^1.0.0:
1835 version "4.0.0" 2044 version "1.0.0"
1836 resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" 2045 resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7"
1837 integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg= 2046 integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=
1838 dependencies:
1839 repeating "^2.0.0"
1840
1841detect-libc@^1.0.2:
1842 version "1.0.3"
1843 resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
1844 integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=
1845 2047
1846diffie-hellman@^5.0.0: 2048diffie-hellman@^5.0.0:
1847 version "5.0.3" 2049 version "5.0.3"
@@ -1852,7 +2054,14 @@ diffie-hellman@^5.0.0:
1852 miller-rabin "^4.0.0" 2054 miller-rabin "^4.0.0"
1853 randombytes "^2.0.0" 2055 randombytes "^2.0.0"
1854 2056
1855doctrine@1.5.0, doctrine@^1.2.2: 2057dir-glob@^3.0.1:
2058 version "3.0.1"
2059 resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f"
2060 integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==
2061 dependencies:
2062 path-type "^4.0.0"
2063
2064doctrine@1.5.0:
1856 version "1.5.0" 2065 version "1.5.0"
1857 resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" 2066 resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa"
1858 integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= 2067 integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=
@@ -1860,35 +2069,70 @@ doctrine@1.5.0, doctrine@^1.2.2:
1860 esutils "^2.0.2" 2069 esutils "^2.0.2"
1861 isarray "^1.0.0" 2070 isarray "^1.0.0"
1862 2071
1863doctrine@^2.1.0: 2072doctrine@^3.0.0:
1864 version "2.1.0" 2073 version "3.0.0"
1865 resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" 2074 resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961"
1866 integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== 2075 integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==
1867 dependencies: 2076 dependencies:
1868 esutils "^2.0.2" 2077 esutils "^2.0.2"
1869 2078
2079dom-serializer@0:
2080 version "0.2.2"
2081 resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51"
2082 integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==
2083 dependencies:
2084 domelementtype "^2.0.1"
2085 entities "^2.0.0"
2086
1870domain-browser@^1.1.1: 2087domain-browser@^1.1.1:
1871 version "1.2.0" 2088 version "1.2.0"
1872 resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" 2089 resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda"
1873 integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== 2090 integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==
1874 2091
1875ecc-jsbn@~0.1.1: 2092domelementtype@1, domelementtype@^1.3.1:
1876 version "0.1.2" 2093 version "1.3.1"
1877 resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" 2094 resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f"
1878 integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= 2095 integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==
2096
2097domelementtype@^2.0.1:
2098 version "2.0.2"
2099 resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.2.tgz#f3b6e549201e46f588b59463dd77187131fe6971"
2100 integrity sha512-wFwTwCVebUrMgGeAwRL/NhZtHAUyT9n9yg4IMDwf10+6iCMxSkVq9MGCVEH+QZWo1nNidy8kNvwmv4zWHDTqvA==
2101
2102domhandler@^2.3.0:
2103 version "2.4.2"
2104 resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803"
2105 integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==
1879 dependencies: 2106 dependencies:
1880 jsbn "~0.1.0" 2107 domelementtype "1"
1881 safer-buffer "^2.1.0" 2108
2109domutils@^1.5.1:
2110 version "1.7.0"
2111 resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a"
2112 integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==
2113 dependencies:
2114 dom-serializer "0"
2115 domelementtype "1"
2116
2117duplexify@^3.4.2, duplexify@^3.6.0:
2118 version "3.7.1"
2119 resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309"
2120 integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==
2121 dependencies:
2122 end-of-stream "^1.0.0"
2123 inherits "^2.0.1"
2124 readable-stream "^2.0.0"
2125 stream-shift "^1.0.0"
1882 2126
1883electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.47: 2127electron-to-chromium@^1.3.570:
1884 version "1.3.135" 2128 version "1.3.570"
1885 resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.135.tgz#f5799b95f2bcd8de17cde47d63392d83a4477041" 2129 resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.570.tgz#3f5141cc39b4e3892a276b4889980dabf1d29c7f"
1886 integrity sha512-xXLNstRdVsisPF3pL3H9TVZo2XkMILfqtD6RiWIUmDK2sFX1Bjwqmd8LBp0Kuo2FgKO63JXPoEVGm8WyYdwP0Q== 2130 integrity sha512-Y6OCoVQgFQBP5py6A/06+yWxUZHDlNr/gNDGatjH8AZqXl8X0tE4LfjLJsXGz/JmWJz8a6K7bR1k+QzZ+k//fg==
1887 2131
1888elliptic@^6.0.0: 2132elliptic@^6.5.3:
1889 version "6.4.1" 2133 version "6.5.3"
1890 resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.1.tgz#c2d0b7776911b86722c632c3c06c60f2f819939a" 2134 resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.3.tgz#cb59eb2efdaf73a0bd78ccd7015a62ad6e0f93d6"
1891 integrity sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ== 2135 integrity sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==
1892 dependencies: 2136 dependencies:
1893 bn.js "^4.4.0" 2137 bn.js "^4.4.0"
1894 brorand "^1.0.1" 2138 brorand "^1.0.1"
@@ -1898,325 +2142,284 @@ elliptic@^6.0.0:
1898 minimalistic-assert "^1.0.0" 2142 minimalistic-assert "^1.0.0"
1899 minimalistic-crypto-utils "^1.0.0" 2143 minimalistic-crypto-utils "^1.0.0"
1900 2144
1901emojis-list@^2.0.0: 2145emoji-regex@^7.0.1:
1902 version "2.1.0" 2146 version "7.0.3"
1903 resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" 2147 resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156"
1904 integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= 2148 integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==
2149
2150emoji-regex@^8.0.0:
2151 version "8.0.0"
2152 resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
2153 integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
2154
2155emojis-list@^3.0.0:
2156 version "3.0.0"
2157 resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78"
2158 integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==
1905 2159
1906enhanced-resolve@^3.4.0: 2160end-of-stream@^1.0.0, end-of-stream@^1.1.0:
1907 version "3.4.1" 2161 version "1.4.4"
1908 resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz#0421e339fd71419b3da13d129b3979040230476e" 2162 resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
1909 integrity sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24= 2163 integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
2164 dependencies:
2165 once "^1.4.0"
2166
2167enhanced-resolve@^4.1.1, enhanced-resolve@^4.3.0:
2168 version "4.3.0"
2169 resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz#3b806f3bfafc1ec7de69551ef93cca46c1704126"
2170 integrity sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==
1910 dependencies: 2171 dependencies:
1911 graceful-fs "^4.1.2" 2172 graceful-fs "^4.1.2"
1912 memory-fs "^0.4.0" 2173 memory-fs "^0.5.0"
1913 object-assign "^4.0.1" 2174 tapable "^1.0.0"
1914 tapable "^0.2.7" 2175
2176enquirer@^2.3.5:
2177 version "2.3.6"
2178 resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d"
2179 integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==
2180 dependencies:
2181 ansi-colors "^4.1.1"
1915 2182
1916errno@^0.1.3: 2183entities@^1.1.1:
2184 version "1.1.2"
2185 resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56"
2186 integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==
2187
2188entities@^2.0.0:
2189 version "2.0.3"
2190 resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.3.tgz#5c487e5742ab93c15abb5da22759b8590ec03b7f"
2191 integrity sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==
2192
2193errno@^0.1.3, errno@~0.1.7:
1917 version "0.1.7" 2194 version "0.1.7"
1918 resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" 2195 resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618"
1919 integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg== 2196 integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==
1920 dependencies: 2197 dependencies:
1921 prr "~1.0.1" 2198 prr "~1.0.1"
1922 2199
1923error-ex@^1.2.0: 2200error-ex@^1.2.0, error-ex@^1.3.1:
1924 version "1.3.2" 2201 version "1.3.2"
1925 resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" 2202 resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
1926 integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== 2203 integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
1927 dependencies: 2204 dependencies:
1928 is-arrayish "^0.2.1" 2205 is-arrayish "^0.2.1"
1929 2206
1930es-abstract@^1.7.0: 2207es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.5:
1931 version "1.13.0" 2208 version "1.17.6"
1932 resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9" 2209 resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.6.tgz#9142071707857b2cacc7b89ecb670316c3e2d52a"
1933 integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg== 2210 integrity sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==
1934 dependencies: 2211 dependencies:
1935 es-to-primitive "^1.2.0" 2212 es-to-primitive "^1.2.1"
1936 function-bind "^1.1.1" 2213 function-bind "^1.1.1"
1937 has "^1.0.3" 2214 has "^1.0.3"
1938 is-callable "^1.1.4" 2215 has-symbols "^1.0.1"
1939 is-regex "^1.0.4" 2216 is-callable "^1.2.0"
1940 object-keys "^1.0.12" 2217 is-regex "^1.1.0"
1941 2218 object-inspect "^1.7.0"
1942es-to-primitive@^1.2.0: 2219 object-keys "^1.1.1"
1943 version "1.2.0" 2220 object.assign "^4.1.0"
1944 resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" 2221 string.prototype.trimend "^1.0.1"
1945 integrity sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg== 2222 string.prototype.trimstart "^1.0.1"
2223
2224es-abstract@^1.18.0-next.0:
2225 version "1.18.0-next.0"
2226 resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.0.tgz#b302834927e624d8e5837ed48224291f2c66e6fc"
2227 integrity sha512-elZXTZXKn51hUBdJjSZGYRujuzilgXo8vSPQzjGYXLvSlGiCo8VO8ZGV3kjo9a0WNJJ57hENagwbtlRuHuzkcQ==
2228 dependencies:
2229 es-to-primitive "^1.2.1"
2230 function-bind "^1.1.1"
2231 has "^1.0.3"
2232 has-symbols "^1.0.1"
2233 is-callable "^1.2.0"
2234 is-negative-zero "^2.0.0"
2235 is-regex "^1.1.1"
2236 object-inspect "^1.8.0"
2237 object-keys "^1.1.1"
2238 object.assign "^4.1.0"
2239 string.prototype.trimend "^1.0.1"
2240 string.prototype.trimstart "^1.0.1"
2241
2242es-to-primitive@^1.2.1:
2243 version "1.2.1"
2244 resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a"
2245 integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==
1946 dependencies: 2246 dependencies:
1947 is-callable "^1.1.4" 2247 is-callable "^1.1.4"
1948 is-date-object "^1.0.1" 2248 is-date-object "^1.0.1"
1949 is-symbol "^1.0.2" 2249 is-symbol "^1.0.2"
1950 2250
1951es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14: 2251escalade@^3.1.0:
1952 version "0.10.50" 2252 version "3.1.0"
1953 resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.50.tgz#6d0e23a0abdb27018e5ac4fd09b412bc5517a778" 2253 resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.0.tgz#e8e2d7c7a8b76f6ee64c2181d6b8151441602d4e"
1954 integrity sha512-KMzZTPBkeQV/JcSQhI5/z6d9VWJ3EnQ194USTUwIYZ2ZbpN8+SGXQKt1h68EX44+qt+Fzr8DO17vnxrw7c3agw== 2254 integrity sha512-mAk+hPSO8fLDkhV7V0dXazH5pDc6MrjBTPyD3VeKzxnVFjH1MIxbCdqGZB9O8+EwWakZs3ZCbDS4IpRt79V1ig==
1955 dependencies:
1956 es6-iterator "~2.0.3"
1957 es6-symbol "~3.1.1"
1958 next-tick "^1.0.0"
1959
1960es6-iterator@^2.0.1, es6-iterator@~2.0.1, es6-iterator@~2.0.3:
1961 version "2.0.3"
1962 resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7"
1963 integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c=
1964 dependencies:
1965 d "1"
1966 es5-ext "^0.10.35"
1967 es6-symbol "^3.1.1"
1968
1969es6-map@^0.1.3:
1970 version "0.1.5"
1971 resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0"
1972 integrity sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=
1973 dependencies:
1974 d "1"
1975 es5-ext "~0.10.14"
1976 es6-iterator "~2.0.1"
1977 es6-set "~0.1.5"
1978 es6-symbol "~3.1.1"
1979 event-emitter "~0.3.5"
1980
1981es6-set@~0.1.5:
1982 version "0.1.5"
1983 resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1"
1984 integrity sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=
1985 dependencies:
1986 d "1"
1987 es5-ext "~0.10.14"
1988 es6-iterator "~2.0.1"
1989 es6-symbol "3.1.1"
1990 event-emitter "~0.3.5"
1991
1992es6-symbol@3.1.1, es6-symbol@^3.1.1, es6-symbol@~3.1.1:
1993 version "3.1.1"
1994 resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77"
1995 integrity sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=
1996 dependencies:
1997 d "1"
1998 es5-ext "~0.10.14"
1999
2000es6-weak-map@^2.0.1:
2001 version "2.0.2"
2002 resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f"
2003 integrity sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=
2004 dependencies:
2005 d "1"
2006 es5-ext "^0.10.14"
2007 es6-iterator "^2.0.1"
2008 es6-symbol "^3.1.1"
2009 2255
2010escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: 2256escape-string-regexp@^1.0.5:
2011 version "1.0.5" 2257 version "1.0.5"
2012 resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 2258 resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
2013 integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 2259 integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
2014 2260
2015escope@^3.6.0: 2261eslint-config-airbnb-base@^14.2.0:
2016 version "3.6.0" 2262 version "14.2.0"
2017 resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" 2263 resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.0.tgz#fe89c24b3f9dc8008c9c0d0d88c28f95ed65e9c4"
2018 integrity sha1-4Bl16BJ4GhY6ba392AOY3GTIicM= 2264 integrity sha512-Snswd5oC6nJaevs3nZoLSTvGJBvzTfnBqOIArkf3cbyTyq9UD79wOk8s+RiL6bhca0p/eRO6veczhf6A/7Jy8Q==
2019 dependencies:
2020 es6-map "^0.1.3"
2021 es6-weak-map "^2.0.1"
2022 esrecurse "^4.1.0"
2023 estraverse "^4.1.1"
2024
2025eslint-config-airbnb-base@^12.1.0:
2026 version "12.1.0"
2027 resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-12.1.0.tgz#386441e54a12ccd957b0a92564a4bafebd747944"
2028 integrity sha512-/vjm0Px5ZCpmJqnjIzcFb9TKZrKWz0gnuG/7Gfkt0Db1ELJR51xkZth+t14rYdqWgX836XbuxtArbIHlVhbLBA==
2029 dependencies: 2265 dependencies:
2030 eslint-restricted-globals "^0.1.1" 2266 confusing-browser-globals "^1.0.9"
2267 object.assign "^4.1.0"
2268 object.entries "^1.1.2"
2031 2269
2032eslint-import-resolver-node@^0.3.2: 2270eslint-import-resolver-node@^0.3.3:
2033 version "0.3.2" 2271 version "0.3.4"
2034 resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz#58f15fb839b8d0576ca980413476aab2472db66a" 2272 resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz#85ffa81942c25012d8231096ddf679c03042c717"
2035 integrity sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q== 2273 integrity sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==
2036 dependencies: 2274 dependencies:
2037 debug "^2.6.9" 2275 debug "^2.6.9"
2038 resolve "^1.5.0" 2276 resolve "^1.13.1"
2039 2277
2040eslint-module-utils@^2.4.0: 2278eslint-module-utils@^2.6.0:
2041 version "2.4.0" 2279 version "2.6.0"
2042 resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.4.0.tgz#8b93499e9b00eab80ccb6614e69f03678e84e09a" 2280 resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz#579ebd094f56af7797d19c9866c9c9486629bfa6"
2043 integrity sha512-14tltLm38Eu3zS+mt0KvILC3q8jyIAH518MlG+HO0p+yK885Lb1UHTY/UgR91eOyGdmxAPb+OLoW4znqIT6Ndw== 2281 integrity sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==
2044 dependencies: 2282 dependencies:
2045 debug "^2.6.8" 2283 debug "^2.6.9"
2046 pkg-dir "^2.0.0" 2284 pkg-dir "^2.0.0"
2047 2285
2048eslint-plugin-import@^2.8.0: 2286eslint-plugin-import@^2.22.0:
2049 version "2.17.2" 2287 version "2.22.0"
2050 resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.17.2.tgz#d227d5c6dc67eca71eb590d2bb62fb38d86e9fcb" 2288 resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.22.0.tgz#92f7736fe1fde3e2de77623c838dd992ff5ffb7e"
2051 integrity sha512-m+cSVxM7oLsIpmwNn2WXTJoReOF9f/CtLMo7qOVmKd1KntBy0hEcuNZ3erTmWjx+DxRO0Zcrm5KwAvI9wHcV5g== 2289 integrity sha512-66Fpf1Ln6aIS5Gr/55ts19eUuoDhAbZgnr6UxK5hbDx6l/QgQgx61AePq+BV4PP2uXQFClgMVzep5zZ94qqsxg==
2052 dependencies: 2290 dependencies:
2053 array-includes "^3.0.3" 2291 array-includes "^3.1.1"
2292 array.prototype.flat "^1.2.3"
2054 contains-path "^0.1.0" 2293 contains-path "^0.1.0"
2055 debug "^2.6.9" 2294 debug "^2.6.9"
2056 doctrine "1.5.0" 2295 doctrine "1.5.0"
2057 eslint-import-resolver-node "^0.3.2" 2296 eslint-import-resolver-node "^0.3.3"
2058 eslint-module-utils "^2.4.0" 2297 eslint-module-utils "^2.6.0"
2059 has "^1.0.3" 2298 has "^1.0.3"
2060 lodash "^4.17.11"
2061 minimatch "^3.0.4" 2299 minimatch "^3.0.4"
2300 object.values "^1.1.1"
2062 read-pkg-up "^2.0.0" 2301 read-pkg-up "^2.0.0"
2063 resolve "^1.10.0" 2302 resolve "^1.17.0"
2064 2303 tsconfig-paths "^3.9.0"
2065eslint-restricted-globals@^0.1.1:
2066 version "0.1.1"
2067 resolved "https://registry.yarnpkg.com/eslint-restricted-globals/-/eslint-restricted-globals-0.1.1.tgz#35f0d5cbc64c2e3ed62e93b4b1a7af05ba7ed4d7"
2068 integrity sha1-NfDVy8ZMLj7WLpO0saevBbp+1Nc=
2069 2304
2070eslint-scope@^3.7.1: 2305eslint-scope@^4.0.3:
2071 version "3.7.3" 2306 version "4.0.3"
2072 resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.3.tgz#bb507200d3d17f60247636160b4826284b108535" 2307 resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848"
2073 integrity sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA== 2308 integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==
2074 dependencies: 2309 dependencies:
2075 esrecurse "^4.1.0" 2310 esrecurse "^4.1.0"
2076 estraverse "^4.1.1" 2311 estraverse "^4.1.1"
2077 2312
2078eslint-visitor-keys@^1.0.0: 2313eslint-scope@^5.1.0:
2079 version "1.0.0" 2314 version "5.1.1"
2080 resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" 2315 resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c"
2081 integrity sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ== 2316 integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==
2082 2317 dependencies:
2083eslint@^2.7.0: 2318 esrecurse "^4.3.0"
2084 version "2.13.1" 2319 estraverse "^4.1.1"
2085 resolved "https://registry.yarnpkg.com/eslint/-/eslint-2.13.1.tgz#e4cc8fa0f009fb829aaae23855a29360be1f6c11" 2320
2086 integrity sha1-5MyPoPAJ+4KaquI4VaKTYL4fbBE= 2321eslint-utils@^2.1.0:
2087 dependencies: 2322 version "2.1.0"
2088 chalk "^1.1.3" 2323 resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27"
2089 concat-stream "^1.4.6" 2324 integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==
2090 debug "^2.1.1" 2325 dependencies:
2091 doctrine "^1.2.2" 2326 eslint-visitor-keys "^1.1.0"
2092 es6-map "^0.1.3" 2327
2093 escope "^3.6.0" 2328eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0:
2094 espree "^3.1.6" 2329 version "1.3.0"
2095 estraverse "^4.2.0" 2330 resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e"
2096 esutils "^2.0.2" 2331 integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==
2097 file-entry-cache "^1.1.1" 2332
2098 glob "^7.0.3" 2333eslint@^7.9.0:
2099 globals "^9.2.0" 2334 version "7.9.0"
2100 ignore "^3.1.2" 2335 resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.9.0.tgz#522aeccc5c3a19017cf0cb46ebfd660a79acf337"
2101 imurmurhash "^0.1.4" 2336 integrity sha512-V6QyhX21+uXp4T+3nrNfI3hQNBDa/P8ga7LoQOenwrlEFXrEnUEE+ok1dMtaS3b6rmLXhT1TkTIsG75HMLbknA==
2102 inquirer "^0.12.0" 2337 dependencies:
2103 is-my-json-valid "^2.10.0" 2338 "@babel/code-frame" "^7.0.0"
2104 is-resolvable "^1.0.0" 2339 "@eslint/eslintrc" "^0.1.3"
2105 js-yaml "^3.5.1" 2340 ajv "^6.10.0"
2106 json-stable-stringify "^1.0.0" 2341 chalk "^4.0.0"
2107 levn "^0.3.0" 2342 cross-spawn "^7.0.2"
2108 lodash "^4.0.0" 2343 debug "^4.0.1"
2109 mkdirp "^0.5.0" 2344 doctrine "^3.0.0"
2110 optionator "^0.8.1" 2345 enquirer "^2.3.5"
2111 path-is-absolute "^1.0.0" 2346 eslint-scope "^5.1.0"
2112 path-is-inside "^1.0.1" 2347 eslint-utils "^2.1.0"
2113 pluralize "^1.2.1" 2348 eslint-visitor-keys "^1.3.0"
2114 progress "^1.1.8" 2349 espree "^7.3.0"
2115 require-uncached "^1.0.2" 2350 esquery "^1.2.0"
2116 shelljs "^0.6.0"
2117 strip-json-comments "~1.0.1"
2118 table "^3.7.8"
2119 text-table "~0.2.0"
2120 user-home "^2.0.0"
2121
2122eslint@^4.16.0:
2123 version "4.19.1"
2124 resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.19.1.tgz#32d1d653e1d90408854bfb296f076ec7e186a300"
2125 integrity sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==
2126 dependencies:
2127 ajv "^5.3.0"
2128 babel-code-frame "^6.22.0"
2129 chalk "^2.1.0"
2130 concat-stream "^1.6.0"
2131 cross-spawn "^5.1.0"
2132 debug "^3.1.0"
2133 doctrine "^2.1.0"
2134 eslint-scope "^3.7.1"
2135 eslint-visitor-keys "^1.0.0"
2136 espree "^3.5.4"
2137 esquery "^1.0.0"
2138 esutils "^2.0.2" 2351 esutils "^2.0.2"
2139 file-entry-cache "^2.0.0" 2352 file-entry-cache "^5.0.1"
2140 functional-red-black-tree "^1.0.1" 2353 functional-red-black-tree "^1.0.1"
2141 glob "^7.1.2" 2354 glob-parent "^5.0.0"
2142 globals "^11.0.1" 2355 globals "^12.1.0"
2143 ignore "^3.3.3" 2356 ignore "^4.0.6"
2357 import-fresh "^3.0.0"
2144 imurmurhash "^0.1.4" 2358 imurmurhash "^0.1.4"
2145 inquirer "^3.0.6" 2359 is-glob "^4.0.0"
2146 is-resolvable "^1.0.0" 2360 js-yaml "^3.13.1"
2147 js-yaml "^3.9.1"
2148 json-stable-stringify-without-jsonify "^1.0.1" 2361 json-stable-stringify-without-jsonify "^1.0.1"
2149 levn "^0.3.0" 2362 levn "^0.4.1"
2150 lodash "^4.17.4" 2363 lodash "^4.17.19"
2151 minimatch "^3.0.2" 2364 minimatch "^3.0.4"
2152 mkdirp "^0.5.1"
2153 natural-compare "^1.4.0" 2365 natural-compare "^1.4.0"
2154 optionator "^0.8.2" 2366 optionator "^0.9.1"
2155 path-is-inside "^1.0.2"
2156 pluralize "^7.0.0"
2157 progress "^2.0.0" 2367 progress "^2.0.0"
2158 regexpp "^1.0.1" 2368 regexpp "^3.1.0"
2159 require-uncached "^1.0.3" 2369 semver "^7.2.1"
2160 semver "^5.3.0" 2370 strip-ansi "^6.0.0"
2161 strip-ansi "^4.0.0" 2371 strip-json-comments "^3.1.0"
2162 strip-json-comments "~2.0.1" 2372 table "^5.2.3"
2163 table "4.0.2" 2373 text-table "^0.2.0"
2164 text-table "~0.2.0" 2374 v8-compile-cache "^2.0.3"
2165 2375
2166espree@^3.1.6, espree@^3.5.4: 2376espree@^7.3.0:
2167 version "3.5.4" 2377 version "7.3.0"
2168 resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7" 2378 resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.0.tgz#dc30437cf67947cf576121ebd780f15eeac72348"
2169 integrity sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A== 2379 integrity sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw==
2170 dependencies: 2380 dependencies:
2171 acorn "^5.5.0" 2381 acorn "^7.4.0"
2172 acorn-jsx "^3.0.0" 2382 acorn-jsx "^5.2.0"
2173 2383 eslint-visitor-keys "^1.3.0"
2174esprima@^2.6.0:
2175 version "2.7.3"
2176 resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581"
2177 integrity sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=
2178 2384
2179esprima@^4.0.0: 2385esprima@^4.0.0:
2180 version "4.0.1" 2386 version "4.0.1"
2181 resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 2387 resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
2182 integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== 2388 integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
2183 2389
2184esquery@^1.0.0: 2390esquery@^1.2.0:
2185 version "1.0.1" 2391 version "1.3.1"
2186 resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" 2392 resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57"
2187 integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA== 2393 integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==
2188 dependencies: 2394 dependencies:
2189 estraverse "^4.0.0" 2395 estraverse "^5.1.0"
2190 2396
2191esrecurse@^4.1.0: 2397esrecurse@^4.1.0, esrecurse@^4.3.0:
2192 version "4.2.1" 2398 version "4.3.0"
2193 resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" 2399 resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921"
2194 integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== 2400 integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==
2195 dependencies: 2401 dependencies:
2196 estraverse "^4.1.0" 2402 estraverse "^5.2.0"
2197 2403
2198estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: 2404estraverse@^4.1.1:
2199 version "4.2.0" 2405 version "4.3.0"
2200 resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" 2406 resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d"
2201 integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= 2407 integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
2202 2408
2203esutils@^2.0.2: 2409estraverse@^5.1.0, estraverse@^5.2.0:
2204 version "2.0.2" 2410 version "5.2.0"
2205 resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 2411 resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880"
2206 integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= 2412 integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==
2207 2413
2208event-emitter@~0.3.5: 2414esutils@^2.0.2:
2209 version "0.3.5" 2415 version "2.0.3"
2210 resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" 2416 resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
2211 integrity sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk= 2417 integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
2212 dependencies:
2213 d "1"
2214 es5-ext "~0.10.14"
2215 2418
2216events@^3.0.0: 2419events@^3.0.0:
2217 version "3.0.0" 2420 version "3.2.0"
2218 resolved "https://registry.yarnpkg.com/events/-/events-3.0.0.tgz#9a0a0dfaf62893d92b875b8f2698ca4114973e88" 2421 resolved "https://registry.yarnpkg.com/events/-/events-3.2.0.tgz#93b87c18f8efcd4202a461aec4dfc0556b639379"
2219 integrity sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA== 2422 integrity sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==
2220 2423
2221evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: 2424evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
2222 version "1.0.3" 2425 version "1.0.3"
@@ -2226,23 +2429,12 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
2226 md5.js "^1.3.4" 2429 md5.js "^1.3.4"
2227 safe-buffer "^5.1.1" 2430 safe-buffer "^5.1.1"
2228 2431
2229execa@^0.7.0: 2432execall@^2.0.0:
2230 version "0.7.0" 2433 version "2.0.0"
2231 resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" 2434 resolved "https://registry.yarnpkg.com/execall/-/execall-2.0.0.tgz#16a06b5fe5099df7d00be5d9c06eecded1663b45"
2232 integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= 2435 integrity sha512-0FU2hZ5Hh6iQnarpRtQurM/aAvp3RIbfvgLHrcqJYzhXyV2KFruhuChf9NC6waAhiUR7FFtlugkI4p7f2Fqlow==
2233 dependencies: 2436 dependencies:
2234 cross-spawn "^5.0.1" 2437 clone-regexp "^2.1.0"
2235 get-stream "^3.0.0"
2236 is-stream "^1.1.0"
2237 npm-run-path "^2.0.0"
2238 p-finally "^1.0.0"
2239 signal-exit "^3.0.0"
2240 strip-eof "^1.0.0"
2241
2242exit-hook@^1.0.0:
2243 version "1.1.1"
2244 resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8"
2245 integrity sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=
2246 2438
2247expand-brackets@^2.1.4: 2439expand-brackets@^2.1.4:
2248 version "2.1.4" 2440 version "2.1.4"
@@ -2257,6 +2449,13 @@ expand-brackets@^2.1.4:
2257 snapdragon "^0.8.1" 2449 snapdragon "^0.8.1"
2258 to-regex "^3.0.1" 2450 to-regex "^3.0.1"
2259 2451
2452expand-tilde@^2.0.0, expand-tilde@^2.0.2:
2453 version "2.0.2"
2454 resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502"
2455 integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=
2456 dependencies:
2457 homedir-polyfill "^1.0.1"
2458
2260extend-shallow@^2.0.1: 2459extend-shallow@^2.0.1:
2261 version "2.0.1" 2460 version "2.0.1"
2262 resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" 2461 resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
@@ -2272,20 +2471,11 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2:
2272 assign-symbols "^1.0.0" 2471 assign-symbols "^1.0.0"
2273 is-extendable "^1.0.1" 2472 is-extendable "^1.0.1"
2274 2473
2275extend@~3.0.2: 2474extend@^3.0.0:
2276 version "3.0.2" 2475 version "3.0.2"
2277 resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" 2476 resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
2278 integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== 2477 integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
2279 2478
2280external-editor@^2.0.4:
2281 version "2.2.0"
2282 resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5"
2283 integrity sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==
2284 dependencies:
2285 chardet "^0.4.0"
2286 iconv-lite "^0.4.17"
2287 tmp "^0.0.33"
2288
2289extglob@^2.0.4: 2479extglob@^2.0.4:
2290 version "2.0.4" 2480 version "2.0.4"
2291 resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" 2481 resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543"
@@ -2300,81 +2490,56 @@ extglob@^2.0.4:
2300 snapdragon "^0.8.1" 2490 snapdragon "^0.8.1"
2301 to-regex "^3.0.1" 2491 to-regex "^3.0.1"
2302 2492
2303extract-text-webpack-plugin@^3.0.2: 2493fast-deep-equal@^3.1.1:
2304 version "3.0.2" 2494 version "3.1.3"
2305 resolved "https://registry.yarnpkg.com/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.2.tgz#5f043eaa02f9750a9258b78c0a6e0dc1408fb2f7" 2495 resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
2306 integrity sha512-bt/LZ4m5Rqt/Crl2HiKuAl/oqg0psx1tsTLkvWbJen1CtD+fftkZhMaQ9HOtY2gWsl2Wq+sABmMVi9z3DhKWQQ== 2496 integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
2307 dependencies:
2308 async "^2.4.1"
2309 loader-utils "^1.1.0"
2310 schema-utils "^0.3.0"
2311 webpack-sources "^1.0.1"
2312 2497
2313extsprintf@1.3.0: 2498fast-glob@^3.1.1, fast-glob@^3.2.4:
2314 version "1.3.0" 2499 version "3.2.4"
2315 resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" 2500 resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.4.tgz#d20aefbf99579383e7f3cc66529158c9b98554d3"
2316 integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= 2501 integrity sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==
2317 2502 dependencies:
2318extsprintf@^1.2.0: 2503 "@nodelib/fs.stat" "^2.0.2"
2319 version "1.4.0" 2504 "@nodelib/fs.walk" "^1.2.3"
2320 resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" 2505 glob-parent "^5.1.0"
2321 integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= 2506 merge2 "^1.3.0"
2322 2507 micromatch "^4.0.2"
2323fast-deep-equal@^1.0.0: 2508 picomatch "^2.2.1"
2324 version "1.1.0"
2325 resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614"
2326 integrity sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=
2327
2328fast-deep-equal@^2.0.1:
2329 version "2.0.1"
2330 resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49"
2331 integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=
2332 2509
2333fast-json-stable-stringify@^2.0.0: 2510fast-json-stable-stringify@^2.0.0:
2334 version "2.0.0" 2511 version "2.1.0"
2335 resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" 2512 resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
2336 integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= 2513 integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
2337 2514
2338fast-levenshtein@~2.0.4: 2515fast-levenshtein@^2.0.6:
2339 version "2.0.6" 2516 version "2.0.6"
2340 resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 2517 resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
2341 integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= 2518 integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=
2342 2519
2343fastparse@^1.1.1: 2520fastest-levenshtein@^1.0.12:
2344 version "1.1.2" 2521 version "1.0.12"
2345 resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9" 2522 resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz#9990f7d3a88cc5a9ffd1f1745745251700d497e2"
2346 integrity sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ== 2523 integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==
2347
2348figures@^1.3.5:
2349 version "1.7.0"
2350 resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e"
2351 integrity sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=
2352 dependencies:
2353 escape-string-regexp "^1.0.5"
2354 object-assign "^4.1.0"
2355 2524
2356figures@^2.0.0: 2525fastq@^1.6.0:
2357 version "2.0.0" 2526 version "1.8.0"
2358 resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" 2527 resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.8.0.tgz#550e1f9f59bbc65fe185cb6a9b4d95357107f481"
2359 integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= 2528 integrity sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==
2360 dependencies: 2529 dependencies:
2361 escape-string-regexp "^1.0.5" 2530 reusify "^1.0.4"
2362 2531
2363file-entry-cache@^1.1.1: 2532figgy-pudding@^3.5.1:
2364 version "1.3.1" 2533 version "3.5.2"
2365 resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-1.3.1.tgz#44c61ea607ae4be9c1402f41f44270cbfe334ff8" 2534 resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e"
2366 integrity sha1-RMYepgeuS+nBQC9B9EJwy/4zT/g= 2535 integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==
2367 dependencies:
2368 flat-cache "^1.2.1"
2369 object-assign "^4.0.1"
2370 2536
2371file-entry-cache@^2.0.0: 2537file-entry-cache@^5.0.1:
2372 version "2.0.0" 2538 version "5.0.1"
2373 resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" 2539 resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c"
2374 integrity sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E= 2540 integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==
2375 dependencies: 2541 dependencies:
2376 flat-cache "^1.2.1" 2542 flat-cache "^2.0.1"
2377 object-assign "^4.0.1"
2378 2543
2379file-loader@^1.1.6: 2544file-loader@^1.1.6:
2380 version "1.1.11" 2545 version "1.1.11"
@@ -2384,6 +2549,11 @@ file-loader@^1.1.6:
2384 loader-utils "^1.0.2" 2549 loader-utils "^1.0.2"
2385 schema-utils "^0.4.5" 2550 schema-utils "^0.4.5"
2386 2551
2552file-uri-to-path@1.0.0:
2553 version "1.0.0"
2554 resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd"
2555 integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==
2556
2387fill-range@^4.0.0: 2557fill-range@^4.0.0:
2388 version "4.0.0" 2558 version "4.0.0"
2389 resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" 2559 resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
@@ -2394,22 +2564,30 @@ fill-range@^4.0.0:
2394 repeat-string "^1.6.1" 2564 repeat-string "^1.6.1"
2395 to-regex-range "^2.1.0" 2565 to-regex-range "^2.1.0"
2396 2566
2397find-cache-dir@^1.0.0: 2567fill-range@^7.0.1:
2398 version "1.0.0" 2568 version "7.0.1"
2399 resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f" 2569 resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
2400 integrity sha1-kojj6ePMN0hxfTnq3hfPcfww7m8= 2570 integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
2571 dependencies:
2572 to-regex-range "^5.0.1"
2573
2574find-cache-dir@^2.1.0:
2575 version "2.1.0"
2576 resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7"
2577 integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==
2401 dependencies: 2578 dependencies:
2402 commondir "^1.0.1" 2579 commondir "^1.0.1"
2403 make-dir "^1.0.0" 2580 make-dir "^2.0.0"
2404 pkg-dir "^2.0.0" 2581 pkg-dir "^3.0.0"
2405 2582
2406find-up@^1.0.0: 2583find-cache-dir@^3.3.1:
2407 version "1.1.2" 2584 version "3.3.1"
2408 resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" 2585 resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880"
2409 integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= 2586 integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==
2410 dependencies: 2587 dependencies:
2411 path-exists "^2.0.0" 2588 commondir "^1.0.1"
2412 pinkie-promise "^2.0.0" 2589 make-dir "^3.0.2"
2590 pkg-dir "^4.1.0"
2413 2591
2414find-up@^2.0.0, find-up@^2.1.0: 2592find-up@^2.0.0, find-up@^2.1.0:
2415 version "2.1.0" 2593 version "2.1.0"
@@ -2418,57 +2596,63 @@ find-up@^2.0.0, find-up@^2.1.0:
2418 dependencies: 2596 dependencies:
2419 locate-path "^2.0.0" 2597 locate-path "^2.0.0"
2420 2598
2421flat-cache@^1.2.1: 2599find-up@^3.0.0:
2422 version "1.3.4" 2600 version "3.0.0"
2423 resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.4.tgz#2c2ef77525cc2929007dfffa1dd314aa9c9dee6f" 2601 resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73"
2424 integrity sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg== 2602 integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==
2425 dependencies: 2603 dependencies:
2426 circular-json "^0.3.1" 2604 locate-path "^3.0.0"
2427 graceful-fs "^4.1.2"
2428 rimraf "~2.6.2"
2429 write "^0.2.1"
2430 2605
2431flatten@^1.0.2: 2606find-up@^4.0.0, find-up@^4.1.0:
2432 version "1.0.2" 2607 version "4.1.0"
2433 resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782" 2608 resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19"
2434 integrity sha1-2uRqnXj74lKSJYzB54CkHZXAN4I= 2609 integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==
2610 dependencies:
2611 locate-path "^5.0.0"
2612 path-exists "^4.0.0"
2435 2613
2436for-in@^0.1.3: 2614findup-sync@^3.0.0:
2437 version "0.1.8" 2615 version "3.0.0"
2438 resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1" 2616 resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1"
2439 integrity sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE= 2617 integrity sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==
2618 dependencies:
2619 detect-file "^1.0.0"
2620 is-glob "^4.0.0"
2621 micromatch "^3.0.4"
2622 resolve-dir "^1.0.1"
2440 2623
2441for-in@^1.0.1, for-in@^1.0.2: 2624flat-cache@^2.0.1:
2442 version "1.0.2" 2625 version "2.0.1"
2443 resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" 2626 resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0"
2444 integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= 2627 integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==
2628 dependencies:
2629 flatted "^2.0.0"
2630 rimraf "2.6.3"
2631 write "1.0.3"
2445 2632
2446for-own@^1.0.0: 2633flatted@^2.0.0:
2447 version "1.0.0" 2634 version "2.0.2"
2448 resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b" 2635 resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138"
2449 integrity sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs= 2636 integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==
2637
2638flush-write-stream@^1.0.0:
2639 version "1.1.1"
2640 resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8"
2641 integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==
2450 dependencies: 2642 dependencies:
2451 for-in "^1.0.1" 2643 inherits "^2.0.3"
2644 readable-stream "^2.3.6"
2452 2645
2453forever-agent@~0.6.1: 2646for-in@^1.0.2:
2454 version "0.6.1" 2647 version "1.0.2"
2455 resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" 2648 resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
2456 integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= 2649 integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=
2457 2650
2458fork-awesome@^1.1.7: 2651fork-awesome@^1.1.7:
2459 version "1.1.7" 2652 version "1.1.7"
2460 resolved "https://registry.yarnpkg.com/fork-awesome/-/fork-awesome-1.1.7.tgz#1427da1cac3d1713046ee88427e5fcecb9501d21" 2653 resolved "https://registry.yarnpkg.com/fork-awesome/-/fork-awesome-1.1.7.tgz#1427da1cac3d1713046ee88427e5fcecb9501d21"
2461 integrity sha512-IHI7XCSXrKfUIWslse8c/PaaVDT1oBaYge+ju40ihL2ooiQeBpTr4wvIXhgTd2NuhntlvX+M5jYHAPTzNlmv0g== 2654 integrity sha512-IHI7XCSXrKfUIWslse8c/PaaVDT1oBaYge+ju40ihL2ooiQeBpTr4wvIXhgTd2NuhntlvX+M5jYHAPTzNlmv0g==
2462 2655
2463form-data@~2.3.2:
2464 version "2.3.3"
2465 resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6"
2466 integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==
2467 dependencies:
2468 asynckit "^0.4.0"
2469 combined-stream "^1.0.6"
2470 mime-types "^2.1.12"
2471
2472fragment-cache@^0.2.1: 2656fragment-cache@^0.2.1:
2473 version "0.2.1" 2657 version "0.2.1"
2474 resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" 2658 resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
@@ -2476,28 +2660,30 @@ fragment-cache@^0.2.1:
2476 dependencies: 2660 dependencies:
2477 map-cache "^0.2.2" 2661 map-cache "^0.2.2"
2478 2662
2479front-matter@2.1.2: 2663from2@^2.1.0:
2480 version "2.1.2" 2664 version "2.3.0"
2481 resolved "https://registry.yarnpkg.com/front-matter/-/front-matter-2.1.2.tgz#f75983b9f2f413be658c93dfd7bd8ce4078f5cdb" 2665 resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af"
2482 integrity sha1-91mDufL0E75ljJPf172M5AePXNs= 2666 integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=
2483 dependencies: 2667 dependencies:
2484 js-yaml "^3.4.6" 2668 inherits "^2.0.1"
2669 readable-stream "^2.0.0"
2485 2670
2486fs-extra@^3.0.1: 2671fs-minipass@^2.0.0:
2487 version "3.0.1" 2672 version "2.1.0"
2488 resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-3.0.1.tgz#3794f378c58b342ea7dbbb23095109c4b3b62291" 2673 resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb"
2489 integrity sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE= 2674 integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==
2490 dependencies: 2675 dependencies:
2491 graceful-fs "^4.1.2" 2676 minipass "^3.0.0"
2492 jsonfile "^3.0.0"
2493 universalify "^0.1.0"
2494 2677
2495fs-minipass@^1.2.5: 2678fs-write-stream-atomic@^1.0.8:
2496 version "1.2.6" 2679 version "1.0.10"
2497 resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.6.tgz#2c5cc30ded81282bfe8a0d7c7c1853ddeb102c07" 2680 resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9"
2498 integrity sha512-crhvyXcMejjv3Z5d2Fa9sf5xLYVCF5O1c71QxbVnbLsmYMBEvDAftewesN/HhY03YRoA7zOMxjNGrF5svGaaeQ== 2681 integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=
2499 dependencies: 2682 dependencies:
2500 minipass "^2.2.1" 2683 graceful-fs "^4.1.2"
2684 iferr "^0.1.5"
2685 imurmurhash "^0.1.4"
2686 readable-stream "1 || 2"
2501 2687
2502fs.realpath@^1.0.0: 2688fs.realpath@^1.0.0:
2503 version "1.0.0" 2689 version "1.0.0"
@@ -2505,22 +2691,17 @@ fs.realpath@^1.0.0:
2505 integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 2691 integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
2506 2692
2507fsevents@^1.2.7: 2693fsevents@^1.2.7:
2508 version "1.2.9" 2694 version "1.2.13"
2509 resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.9.tgz#3f5ed66583ccd6f400b5a00db6f7e861363e388f" 2695 resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38"
2510 integrity sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw== 2696 integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==
2511 dependencies: 2697 dependencies:
2698 bindings "^1.5.0"
2512 nan "^2.12.1" 2699 nan "^2.12.1"
2513 node-pre-gyp "^0.12.0"
2514 2700
2515fstream@^1.0.0, fstream@^1.0.12: 2701fsevents@~2.1.2:
2516 version "1.0.12" 2702 version "2.1.3"
2517 resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045" 2703 resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e"
2518 integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg== 2704 integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==
2519 dependencies:
2520 graceful-fs "^4.1.2"
2521 inherits "~2.0.0"
2522 mkdirp ">=0.5 0"
2523 rimraf "2"
2524 2705
2525function-bind@^1.1.1: 2706function-bind@^1.1.1:
2526 version "1.1.1" 2707 version "1.1.1"
@@ -2532,68 +2713,26 @@ functional-red-black-tree@^1.0.1:
2532 resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" 2713 resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
2533 integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= 2714 integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=
2534 2715
2535gauge@~2.7.3: 2716gensync@^1.0.0-beta.1:
2536 version "2.7.4" 2717 version "1.0.0-beta.1"
2537 resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" 2718 resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269"
2538 integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= 2719 integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==
2539 dependencies:
2540 aproba "^1.0.3"
2541 console-control-strings "^1.0.0"
2542 has-unicode "^2.0.0"
2543 object-assign "^4.1.0"
2544 signal-exit "^3.0.0"
2545 string-width "^1.0.1"
2546 strip-ansi "^3.0.1"
2547 wide-align "^1.1.0"
2548
2549gaze@^1.0.0:
2550 version "1.1.3"
2551 resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a"
2552 integrity sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==
2553 dependencies:
2554 globule "^1.0.0"
2555 2720
2556generate-function@^2.0.0: 2721get-caller-file@^2.0.1:
2557 version "2.3.1" 2722 version "2.0.5"
2558 resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.3.1.tgz#f069617690c10c868e73b8465746764f97c3479f" 2723 resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
2559 integrity sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ== 2724 integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
2560 dependencies:
2561 is-property "^1.0.2"
2562 2725
2563generate-object-property@^1.1.0: 2726get-stdin@^8.0.0:
2564 version "1.2.0" 2727 version "8.0.0"
2565 resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" 2728 resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-8.0.0.tgz#cbad6a73feb75f6eeb22ba9e01f89aa28aa97a53"
2566 integrity sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA= 2729 integrity sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==
2567 dependencies:
2568 is-property "^1.0.0"
2569
2570get-caller-file@^1.0.1:
2571 version "1.0.3"
2572 resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a"
2573 integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==
2574
2575get-stdin@^4.0.1:
2576 version "4.0.1"
2577 resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe"
2578 integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=
2579
2580get-stream@^3.0.0:
2581 version "3.0.0"
2582 resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
2583 integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=
2584 2730
2585get-value@^2.0.3, get-value@^2.0.6: 2731get-value@^2.0.3, get-value@^2.0.6:
2586 version "2.0.6" 2732 version "2.0.6"
2587 resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" 2733 resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
2588 integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= 2734 integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=
2589 2735
2590getpass@^0.1.1:
2591 version "0.1.7"
2592 resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
2593 integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=
2594 dependencies:
2595 assert-plus "^1.0.0"
2596
2597glob-parent@^3.1.0: 2736glob-parent@^3.1.0:
2598 version "3.1.0" 2737 version "3.1.0"
2599 resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" 2738 resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae"
@@ -2602,10 +2741,17 @@ glob-parent@^3.1.0:
2602 is-glob "^3.1.0" 2741 is-glob "^3.1.0"
2603 path-dirname "^1.0.0" 2742 path-dirname "^1.0.0"
2604 2743
2605glob@^7.0.0, glob@^7.0.3, glob@^7.1.2, glob@^7.1.3, glob@~7.1.1: 2744glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@~5.1.0:
2606 version "7.1.4" 2745 version "5.1.1"
2607 resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" 2746 resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229"
2608 integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== 2747 integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==
2748 dependencies:
2749 is-glob "^4.0.1"
2750
2751glob@^7.1.3, glob@^7.1.4:
2752 version "7.1.6"
2753 resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
2754 integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
2609 dependencies: 2755 dependencies:
2610 fs.realpath "^1.0.0" 2756 fs.realpath "^1.0.0"
2611 inflight "^1.0.4" 2757 inflight "^1.0.4"
@@ -2614,81 +2760,102 @@ glob@^7.0.0, glob@^7.0.3, glob@^7.1.2, glob@^7.1.3, glob@~7.1.1:
2614 once "^1.3.0" 2760 once "^1.3.0"
2615 path-is-absolute "^1.0.0" 2761 path-is-absolute "^1.0.0"
2616 2762
2617globals@^11.0.1: 2763global-modules@^1.0.0:
2618 version "11.12.0" 2764 version "1.0.0"
2619 resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" 2765 resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea"
2620 integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== 2766 integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==
2767 dependencies:
2768 global-prefix "^1.0.1"
2769 is-windows "^1.0.1"
2770 resolve-dir "^1.0.0"
2621 2771
2622globals@^9.18.0, globals@^9.2.0: 2772global-modules@^2.0.0:
2623 version "9.18.0" 2773 version "2.0.0"
2624 resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" 2774 resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780"
2625 integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== 2775 integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==
2776 dependencies:
2777 global-prefix "^3.0.0"
2626 2778
2627globule@^1.0.0: 2779global-prefix@^1.0.1:
2628 version "1.2.1" 2780 version "1.0.2"
2629 resolved "https://registry.yarnpkg.com/globule/-/globule-1.2.1.tgz#5dffb1b191f22d20797a9369b49eab4e9839696d" 2781 resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe"
2630 integrity sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ== 2782 integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=
2631 dependencies: 2783 dependencies:
2632 glob "~7.1.1" 2784 expand-tilde "^2.0.2"
2633 lodash "~4.17.10" 2785 homedir-polyfill "^1.0.1"
2634 minimatch "~3.0.2" 2786 ini "^1.3.4"
2787 is-windows "^1.0.1"
2788 which "^1.2.14"
2635 2789
2636gonzales-pe-sl@^4.2.3: 2790global-prefix@^3.0.0:
2637 version "4.2.3" 2791 version "3.0.0"
2638 resolved "https://registry.yarnpkg.com/gonzales-pe-sl/-/gonzales-pe-sl-4.2.3.tgz#6a868bc380645f141feeb042c6f97fcc71b59fe6" 2792 resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97"
2639 integrity sha1-aoaLw4BkXxQf7rBCxvl/zHG1n+Y= 2793 integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==
2640 dependencies: 2794 dependencies:
2641 minimist "1.1.x" 2795 ini "^1.3.5"
2796 kind-of "^6.0.2"
2797 which "^1.3.1"
2642 2798
2643graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6: 2799globals@^11.1.0:
2644 version "4.1.15" 2800 version "11.12.0"
2645 resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" 2801 resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
2646 integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== 2802 integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
2647 2803
2648har-schema@^2.0.0: 2804globals@^12.1.0:
2649 version "2.0.0" 2805 version "12.4.0"
2650 resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" 2806 resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8"
2651 integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= 2807 integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==
2808 dependencies:
2809 type-fest "^0.8.1"
2652 2810
2653har-validator@~5.1.0: 2811globby@^11.0.1:
2654 version "5.1.3" 2812 version "11.0.1"
2655 resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" 2813 resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.1.tgz#9a2bf107a068f3ffeabc49ad702c79ede8cfd357"
2656 integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== 2814 integrity sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==
2657 dependencies: 2815 dependencies:
2658 ajv "^6.5.5" 2816 array-union "^2.1.0"
2659 har-schema "^2.0.0" 2817 dir-glob "^3.0.1"
2818 fast-glob "^3.1.1"
2819 ignore "^5.1.4"
2820 merge2 "^1.3.0"
2821 slash "^3.0.0"
2660 2822
2661has-ansi@^2.0.0: 2823globjoin@^0.1.4:
2662 version "2.0.0" 2824 version "0.1.4"
2663 resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 2825 resolved "https://registry.yarnpkg.com/globjoin/-/globjoin-0.1.4.tgz#2f4494ac8919e3767c5cbb691e9f463324285d43"
2664 integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= 2826 integrity sha1-L0SUrIkZ43Z8XLtpHp9GMyQoXUM=
2827
2828gonzales-pe@^4.3.0:
2829 version "4.3.0"
2830 resolved "https://registry.yarnpkg.com/gonzales-pe/-/gonzales-pe-4.3.0.tgz#fe9dec5f3c557eead09ff868c65826be54d067b3"
2831 integrity sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==
2665 dependencies: 2832 dependencies:
2666 ansi-regex "^2.0.0" 2833 minimist "^1.2.5"
2667 2834
2668has-flag@^1.0.0: 2835graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2:
2669 version "1.0.0" 2836 version "4.2.4"
2670 resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" 2837 resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb"
2671 integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo= 2838 integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==
2672 2839
2673has-flag@^2.0.0: 2840hard-rejection@^2.1.0:
2674 version "2.0.0" 2841 version "2.1.0"
2675 resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" 2842 resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883"
2676 integrity sha1-6CB68cx7MNRGzHC3NLXovhj4jVE= 2843 integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==
2677 2844
2678has-flag@^3.0.0: 2845has-flag@^3.0.0:
2679 version "3.0.0" 2846 version "3.0.0"
2680 resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 2847 resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
2681 integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 2848 integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
2682 2849
2683has-symbols@^1.0.0: 2850has-flag@^4.0.0:
2684 version "1.0.0" 2851 version "4.0.0"
2685 resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" 2852 resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
2686 integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= 2853 integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
2687 2854
2688has-unicode@^2.0.0: 2855has-symbols@^1.0.1:
2689 version "2.0.1" 2856 version "1.0.1"
2690 resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" 2857 resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8"
2691 integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= 2858 integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==
2692 2859
2693has-value@^0.3.1: 2860has-value@^0.3.1:
2694 version "0.3.1" 2861 version "0.3.1"
@@ -2721,7 +2888,7 @@ has-values@^1.0.0:
2721 is-number "^3.0.0" 2888 is-number "^3.0.0"
2722 kind-of "^4.0.0" 2889 kind-of "^4.0.0"
2723 2890
2724has@^1.0.1, has@^1.0.3: 2891has@^1.0.3:
2725 version "1.0.3" 2892 version "1.0.3"
2726 resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 2893 resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
2727 integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 2894 integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
@@ -2729,12 +2896,13 @@ has@^1.0.1, has@^1.0.3:
2729 function-bind "^1.1.1" 2896 function-bind "^1.1.1"
2730 2897
2731hash-base@^3.0.0: 2898hash-base@^3.0.0:
2732 version "3.0.4" 2899 version "3.1.0"
2733 resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" 2900 resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33"
2734 integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg= 2901 integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==
2735 dependencies: 2902 dependencies:
2736 inherits "^2.0.1" 2903 inherits "^2.0.4"
2737 safe-buffer "^5.0.1" 2904 readable-stream "^3.6.0"
2905 safe-buffer "^5.2.0"
2738 2906
2739hash.js@^1.0.0, hash.js@^1.0.3: 2907hash.js@^1.0.0, hash.js@^1.0.3:
2740 version "1.1.7" 2908 version "1.1.7"
@@ -2753,100 +2921,107 @@ hmac-drbg@^1.0.0:
2753 minimalistic-assert "^1.0.0" 2921 minimalistic-assert "^1.0.0"
2754 minimalistic-crypto-utils "^1.0.1" 2922 minimalistic-crypto-utils "^1.0.1"
2755 2923
2756home-or-tmp@^2.0.0: 2924homedir-polyfill@^1.0.1:
2757 version "2.0.0" 2925 version "1.0.3"
2758 resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" 2926 resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8"
2759 integrity sha1-42w/LSyufXRqhX440Y1fMqeILbg= 2927 integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==
2760 dependencies: 2928 dependencies:
2761 os-homedir "^1.0.0" 2929 parse-passwd "^1.0.0"
2762 os-tmpdir "^1.0.1"
2763 2930
2764hosted-git-info@^2.1.4: 2931hosted-git-info@^2.1.4:
2765 version "2.7.1" 2932 version "2.8.8"
2766 resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" 2933 resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488"
2767 integrity sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w== 2934 integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==
2768
2769html-comment-regex@^1.1.0:
2770 version "1.1.2"
2771 resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7"
2772 integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==
2773 2935
2774http-signature@~1.2.0: 2936html-tags@^3.1.0:
2775 version "1.2.0" 2937 version "3.1.0"
2776 resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" 2938 resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.1.0.tgz#7b5e6f7e665e9fb41f30007ed9e0d41e97fb2140"
2777 integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= 2939 integrity sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==
2778 dependencies: 2940
2779 assert-plus "^1.0.0" 2941htmlparser2@^3.10.0:
2780 jsprim "^1.2.2" 2942 version "3.10.1"
2781 sshpk "^1.7.0" 2943 resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f"
2944 integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==
2945 dependencies:
2946 domelementtype "^1.3.1"
2947 domhandler "^2.3.0"
2948 domutils "^1.5.1"
2949 entities "^1.1.1"
2950 inherits "^2.0.1"
2951 readable-stream "^3.1.1"
2782 2952
2783https-browserify@^1.0.0: 2953https-browserify@^1.0.0:
2784 version "1.0.0" 2954 version "1.0.0"
2785 resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" 2955 resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"
2786 integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= 2956 integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=
2787 2957
2788iconv-lite@^0.4.17, iconv-lite@^0.4.4: 2958icss-utils@^4.0.0, icss-utils@^4.1.1:
2789 version "0.4.24" 2959 version "4.1.1"
2790 resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 2960 resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467"
2791 integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 2961 integrity sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==
2792 dependencies:
2793 safer-buffer ">= 2.1.2 < 3"
2794
2795icss-replace-symbols@^1.1.0:
2796 version "1.1.0"
2797 resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded"
2798 integrity sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=
2799
2800icss-utils@^2.1.0:
2801 version "2.1.0"
2802 resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-2.1.0.tgz#83f0a0ec378bf3246178b6c2ad9136f135b1c962"
2803 integrity sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=
2804 dependencies: 2962 dependencies:
2805 postcss "^6.0.1" 2963 postcss "^7.0.14"
2806 2964
2807ieee754@^1.1.4: 2965ieee754@^1.1.4:
2808 version "1.1.13" 2966 version "1.1.13"
2809 resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" 2967 resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84"
2810 integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== 2968 integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==
2811 2969
2812ignore-walk@^3.0.1: 2970iferr@^0.1.5:
2813 version "3.0.1" 2971 version "0.1.5"
2814 resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" 2972 resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501"
2815 integrity sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ== 2973 integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE=
2974
2975ignore@^4.0.6:
2976 version "4.0.6"
2977 resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc"
2978 integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
2979
2980ignore@^5.1.4, ignore@^5.1.8:
2981 version "5.1.8"
2982 resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57"
2983 integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==
2984
2985import-fresh@^3.0.0, import-fresh@^3.2.1:
2986 version "3.2.1"
2987 resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66"
2988 integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==
2816 dependencies: 2989 dependencies:
2817 minimatch "^3.0.4" 2990 parent-module "^1.0.0"
2991 resolve-from "^4.0.0"
2818 2992
2819ignore@^3.1.2, ignore@^3.3.3: 2993import-lazy@^4.0.0:
2820 version "3.3.10" 2994 version "4.0.0"
2821 resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" 2995 resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-4.0.0.tgz#e8eb627483a0a43da3c03f3e35548be5cb0cc153"
2822 integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== 2996 integrity sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==
2997
2998import-local@^2.0.0:
2999 version "2.0.0"
3000 resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d"
3001 integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==
3002 dependencies:
3003 pkg-dir "^3.0.0"
3004 resolve-cwd "^2.0.0"
2823 3005
2824imurmurhash@^0.1.4: 3006imurmurhash@^0.1.4:
2825 version "0.1.4" 3007 version "0.1.4"
2826 resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 3008 resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
2827 integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= 3009 integrity sha1-khi5srkoojixPcT7a21XbyMUU+o=
2828 3010
2829in-publish@^2.0.0: 3011indent-string@^4.0.0:
2830 version "2.0.0" 3012 version "4.0.0"
2831 resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51" 3013 resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251"
2832 integrity sha1-4g/146KvwmkDILbcVSaCqcf631E= 3014 integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==
2833
2834indent-string@^2.1.0:
2835 version "2.1.0"
2836 resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80"
2837 integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=
2838 dependencies:
2839 repeating "^2.0.0"
2840 3015
2841indexes-of@^1.0.1: 3016indexes-of@^1.0.1:
2842 version "1.0.1" 3017 version "1.0.1"
2843 resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" 3018 resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607"
2844 integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= 3019 integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc=
2845 3020
2846indexof@0.0.1: 3021infer-owner@^1.0.3, infer-owner@^1.0.4:
2847 version "0.0.1" 3022 version "1.0.4"
2848 resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" 3023 resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467"
2849 integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= 3024 integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==
2850 3025
2851inflight@^1.0.4: 3026inflight@^1.0.4:
2852 version "1.0.6" 3027 version "1.0.6"
@@ -2856,82 +3031,38 @@ inflight@^1.0.4:
2856 once "^1.3.0" 3031 once "^1.3.0"
2857 wrappy "1" 3032 wrappy "1"
2858 3033
2859inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: 3034inherits@2, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3:
2860 version "2.0.3" 3035 version "2.0.4"
2861 resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 3036 resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
2862 integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= 3037 integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
2863 3038
2864inherits@2.0.1: 3039inherits@2.0.1:
2865 version "2.0.1" 3040 version "2.0.1"
2866 resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" 3041 resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1"
2867 integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= 3042 integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=
2868 3043
2869ini@~1.3.0: 3044inherits@2.0.3:
3045 version "2.0.3"
3046 resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
3047 integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
3048
3049ini@^1.3.4, ini@^1.3.5:
2870 version "1.3.5" 3050 version "1.3.5"
2871 resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" 3051 resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
2872 integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== 3052 integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==
2873 3053
2874inquirer@^0.12.0: 3054interpret@^1.4.0:
2875 version "0.12.0" 3055 version "1.4.0"
2876 resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.12.0.tgz#1ef2bfd63504df0bc75785fff8c2c41df12f077e" 3056 resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e"
2877 integrity sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34= 3057 integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==
2878 dependencies:
2879 ansi-escapes "^1.1.0"
2880 ansi-regex "^2.0.0"
2881 chalk "^1.0.0"
2882 cli-cursor "^1.0.1"
2883 cli-width "^2.0.0"
2884 figures "^1.3.5"
2885 lodash "^4.3.0"
2886 readline2 "^1.0.1"
2887 run-async "^0.1.0"
2888 rx-lite "^3.1.2"
2889 string-width "^1.0.1"
2890 strip-ansi "^3.0.0"
2891 through "^2.3.6"
2892
2893inquirer@^3.0.6:
2894 version "3.3.0"
2895 resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9"
2896 integrity sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==
2897 dependencies:
2898 ansi-escapes "^3.0.0"
2899 chalk "^2.0.0"
2900 cli-cursor "^2.1.0"
2901 cli-width "^2.0.0"
2902 external-editor "^2.0.4"
2903 figures "^2.0.0"
2904 lodash "^4.3.0"
2905 mute-stream "0.0.7"
2906 run-async "^2.2.0"
2907 rx-lite "^4.0.8"
2908 rx-lite-aggregates "^4.0.8"
2909 string-width "^2.1.0"
2910 strip-ansi "^4.0.0"
2911 through "^2.3.6"
2912
2913interpret@^1.0.0:
2914 version "1.2.0"
2915 resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296"
2916 integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==
2917 3058
2918invariant@^2.2.2: 3059invariant@^2.2.2, invariant@^2.2.4:
2919 version "2.2.4" 3060 version "2.2.4"
2920 resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" 3061 resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
2921 integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== 3062 integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==
2922 dependencies: 3063 dependencies:
2923 loose-envify "^1.0.0" 3064 loose-envify "^1.0.0"
2924 3065
2925invert-kv@^1.0.0:
2926 version "1.0.0"
2927 resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
2928 integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY=
2929
2930is-absolute-url@^2.0.0:
2931 version "2.1.0"
2932 resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6"
2933 integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=
2934
2935is-accessor-descriptor@^0.1.6: 3066is-accessor-descriptor@^0.1.6:
2936 version "0.1.6" 3067 version "0.1.6"
2937 resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" 3068 resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
@@ -2946,6 +3077,24 @@ is-accessor-descriptor@^1.0.0:
2946 dependencies: 3077 dependencies:
2947 kind-of "^6.0.0" 3078 kind-of "^6.0.0"
2948 3079
3080is-alphabetical@^1.0.0:
3081 version "1.0.4"
3082 resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d"
3083 integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==
3084
3085is-alphanumeric@^1.0.0:
3086 version "1.0.0"
3087 resolved "https://registry.yarnpkg.com/is-alphanumeric/-/is-alphanumeric-1.0.0.tgz#4a9cef71daf4c001c1d81d63d140cf53fd6889f4"
3088 integrity sha1-Spzvcdr0wAHB2B1j0UDPU/1oifQ=
3089
3090is-alphanumerical@^1.0.0:
3091 version "1.0.4"
3092 resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf"
3093 integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==
3094 dependencies:
3095 is-alphabetical "^1.0.0"
3096 is-decimal "^1.0.0"
3097
2949is-arrayish@^0.2.1: 3098is-arrayish@^0.2.1:
2950 version "0.2.1" 3099 version "0.2.1"
2951 resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 3100 resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
@@ -2958,15 +3107,27 @@ is-binary-path@^1.0.0:
2958 dependencies: 3107 dependencies:
2959 binary-extensions "^1.0.0" 3108 binary-extensions "^1.0.0"
2960 3109
3110is-binary-path@~2.1.0:
3111 version "2.1.0"
3112 resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
3113 integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
3114 dependencies:
3115 binary-extensions "^2.0.0"
3116
2961is-buffer@^1.1.5: 3117is-buffer@^1.1.5:
2962 version "1.1.6" 3118 version "1.1.6"
2963 resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" 3119 resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
2964 integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== 3120 integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
2965 3121
2966is-callable@^1.1.4: 3122is-buffer@^2.0.0:
2967 version "1.1.4" 3123 version "2.0.4"
2968 resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" 3124 resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623"
2969 integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== 3125 integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==
3126
3127is-callable@^1.1.4, is-callable@^1.2.0:
3128 version "1.2.2"
3129 resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.2.tgz#c7c6715cd22d4ddb48d3e19970223aceabb080d9"
3130 integrity sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==
2970 3131
2971is-data-descriptor@^0.1.4: 3132is-data-descriptor@^0.1.4:
2972 version "0.1.4" 3133 version "0.1.4"
@@ -2983,9 +3144,14 @@ is-data-descriptor@^1.0.0:
2983 kind-of "^6.0.0" 3144 kind-of "^6.0.0"
2984 3145
2985is-date-object@^1.0.1: 3146is-date-object@^1.0.1:
2986 version "1.0.1" 3147 version "1.0.2"
2987 resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" 3148 resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e"
2988 integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY= 3149 integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==
3150
3151is-decimal@^1.0.0, is-decimal@^1.0.2:
3152 version "1.0.4"
3153 resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5"
3154 integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==
2989 3155
2990is-descriptor@^0.1.0: 3156is-descriptor@^0.1.0:
2991 version "0.1.6" 3157 version "0.1.6"
@@ -3022,25 +3188,16 @@ is-extglob@^2.1.0, is-extglob@^2.1.1:
3022 resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 3188 resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
3023 integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 3189 integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
3024 3190
3025is-finite@^1.0.0:
3026 version "1.0.2"
3027 resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa"
3028 integrity sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=
3029 dependencies:
3030 number-is-nan "^1.0.0"
3031
3032is-fullwidth-code-point@^1.0.0:
3033 version "1.0.0"
3034 resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
3035 integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs=
3036 dependencies:
3037 number-is-nan "^1.0.0"
3038
3039is-fullwidth-code-point@^2.0.0: 3191is-fullwidth-code-point@^2.0.0:
3040 version "2.0.0" 3192 version "2.0.0"
3041 resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 3193 resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
3042 integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= 3194 integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=
3043 3195
3196is-fullwidth-code-point@^3.0.0:
3197 version "3.0.0"
3198 resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
3199 integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
3200
3044is-glob@^3.1.0: 3201is-glob@^3.1.0:
3045 version "3.1.0" 3202 version "3.1.0"
3046 resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" 3203 resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a"
@@ -3048,28 +3205,22 @@ is-glob@^3.1.0:
3048 dependencies: 3205 dependencies:
3049 is-extglob "^2.1.0" 3206 is-extglob "^2.1.0"
3050 3207
3051is-glob@^4.0.0: 3208is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1:
3052 version "4.0.1" 3209 version "4.0.1"
3053 resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" 3210 resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc"
3054 integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== 3211 integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==
3055 dependencies: 3212 dependencies:
3056 is-extglob "^2.1.1" 3213 is-extglob "^2.1.1"
3057 3214
3058is-my-ip-valid@^1.0.0: 3215is-hexadecimal@^1.0.0:
3059 version "1.0.0" 3216 version "1.0.4"
3060 resolved "https://registry.yarnpkg.com/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz#7b351b8e8edd4d3995d4d066680e664d94696824" 3217 resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7"
3061 integrity sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ== 3218 integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==
3062 3219
3063is-my-json-valid@^2.10.0: 3220is-negative-zero@^2.0.0:
3064 version "2.20.0" 3221 version "2.0.0"
3065 resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.20.0.tgz#1345a6fca3e8daefc10d0fa77067f54cedafd59a" 3222 resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.0.tgz#9553b121b0fac28869da9ed459e20c7543788461"
3066 integrity sha512-XTHBZSIIxNsIsZXg7XB5l8z/OBFosl1Wao4tXLpeC7eKU4Vm/kdop2azkPqULwnfGQjmeDIyey9g7afMMtdWAA== 3223 integrity sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=
3067 dependencies:
3068 generate-function "^2.0.0"
3069 generate-object-property "^1.1.0"
3070 is-my-ip-valid "^1.0.0"
3071 jsonpointer "^4.0.0"
3072 xtend "^4.0.0"
3073 3224
3074is-number@^3.0.0: 3225is-number@^3.0.0:
3075 version "3.0.0" 3226 version "3.0.0"
@@ -3078,74 +3229,77 @@ is-number@^3.0.0:
3078 dependencies: 3229 dependencies:
3079 kind-of "^3.0.2" 3230 kind-of "^3.0.2"
3080 3231
3081is-plain-obj@^1.0.0: 3232is-number@^7.0.0:
3233 version "7.0.0"
3234 resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
3235 integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
3236
3237is-plain-obj@^1.0.0, is-plain-obj@^1.1.0:
3082 version "1.1.0" 3238 version "1.1.0"
3083 resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" 3239 resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
3084 integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= 3240 integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4=
3085 3241
3086is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: 3242is-plain-obj@^2.0.0:
3243 version "2.1.0"
3244 resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287"
3245 integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==
3246
3247is-plain-object@^2.0.3, is-plain-object@^2.0.4:
3087 version "2.0.4" 3248 version "2.0.4"
3088 resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" 3249 resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
3089 integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== 3250 integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==
3090 dependencies: 3251 dependencies:
3091 isobject "^3.0.1" 3252 isobject "^3.0.1"
3092 3253
3093is-promise@^2.1.0: 3254is-regex@^1.1.0, is-regex@^1.1.1:
3094 version "2.1.0" 3255 version "1.1.1"
3095 resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" 3256 resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.1.tgz#c6f98aacc546f6cec5468a07b7b153ab564a57b9"
3096 integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= 3257 integrity sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==
3097
3098is-property@^1.0.0, is-property@^1.0.2:
3099 version "1.0.2"
3100 resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84"
3101 integrity sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=
3102
3103is-regex@^1.0.4:
3104 version "1.0.4"
3105 resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491"
3106 integrity sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=
3107 dependencies: 3258 dependencies:
3108 has "^1.0.1" 3259 has-symbols "^1.0.1"
3109
3110is-resolvable@^1.0.0:
3111 version "1.1.0"
3112 resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88"
3113 integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==
3114
3115is-stream@^1.1.0:
3116 version "1.1.0"
3117 resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
3118 integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ=
3119 3260
3120is-svg@^2.0.0: 3261is-regexp@^2.0.0:
3121 version "2.1.0" 3262 version "2.1.0"
3122 resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-2.1.0.tgz#cf61090da0d9efbcab8722deba6f032208dbb0e9" 3263 resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-2.1.0.tgz#cd734a56864e23b956bf4e7c66c396a4c0b22c2d"
3123 integrity sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk= 3264 integrity sha512-OZ4IlER3zmRIoB9AqNhEggVxqIH4ofDns5nRrPS6yQxXE1TPCUpFznBfRQmQa8uC+pXqjMnukiJBxCisIxiLGA==
3124 dependencies: 3265
3125 html-comment-regex "^1.1.0" 3266is-string@^1.0.5:
3267 version "1.0.5"
3268 resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6"
3269 integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==
3126 3270
3127is-symbol@^1.0.2: 3271is-symbol@^1.0.2:
3128 version "1.0.2" 3272 version "1.0.3"
3129 resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" 3273 resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937"
3130 integrity sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw== 3274 integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==
3131 dependencies: 3275 dependencies:
3132 has-symbols "^1.0.0" 3276 has-symbols "^1.0.1"
3133 3277
3134is-typedarray@~1.0.0: 3278is-typedarray@^1.0.0:
3135 version "1.0.0" 3279 version "1.0.0"
3136 resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 3280 resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
3137 integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= 3281 integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
3138 3282
3139is-utf8@^0.2.0: 3283is-whitespace-character@^1.0.0:
3140 version "0.2.1" 3284 version "1.0.4"
3141 resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" 3285 resolved "https://registry.yarnpkg.com/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz#0858edd94a95594c7c9dd0b5c174ec6e45ee4aa7"
3142 integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= 3286 integrity sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==
3143 3287
3144is-windows@^1.0.2: 3288is-windows@^1.0.1, is-windows@^1.0.2:
3145 version "1.0.2" 3289 version "1.0.2"
3146 resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" 3290 resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
3147 integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== 3291 integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==
3148 3292
3293is-word-character@^1.0.0:
3294 version "1.0.4"
3295 resolved "https://registry.yarnpkg.com/is-word-character/-/is-word-character-1.0.4.tgz#ce0e73216f98599060592f62ff31354ddbeb0230"
3296 integrity sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==
3297
3298is-wsl@^1.1.0:
3299 version "1.1.0"
3300 resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d"
3301 integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=
3302
3149isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: 3303isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
3150 version "1.0.0" 3304 version "1.0.0"
3151 resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 3305 resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
@@ -3168,99 +3322,58 @@ isobject@^3.0.0, isobject@^3.0.1:
3168 resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" 3322 resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
3169 integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= 3323 integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8=
3170 3324
3171isstream@~0.1.2: 3325jest-worker@^26.3.0:
3172 version "0.1.2" 3326 version "26.3.0"
3173 resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" 3327 resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.3.0.tgz#7c8a97e4f4364b4f05ed8bca8ca0c24de091871f"
3174 integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= 3328 integrity sha512-Vmpn2F6IASefL+DVBhPzI2J9/GJUsqzomdeN+P+dK8/jKxbh8R3BtFnx3FIta7wYlPU62cpJMJQo4kuOowcMnw==
3175 3329 dependencies:
3176js-base64@^2.1.8, js-base64@^2.1.9: 3330 "@types/node" "*"
3177 version "2.5.1" 3331 merge-stream "^2.0.0"
3178 resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.5.1.tgz#1efa39ef2c5f7980bb1784ade4a8af2de3291121" 3332 supports-color "^7.0.0"
3179 integrity sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw==
3180 3333
3181"js-tokens@^3.0.0 || ^4.0.0": 3334"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
3182 version "4.0.0" 3335 version "4.0.0"
3183 resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 3336 resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
3184 integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 3337 integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
3185 3338
3186js-tokens@^3.0.2: 3339js-yaml@^3.13.1:
3187 version "3.0.2" 3340 version "3.14.0"
3188 resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" 3341 resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482"
3189 integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= 3342 integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==
3190
3191js-yaml@^3.4.6, js-yaml@^3.5.1, js-yaml@^3.5.4, js-yaml@^3.9.1:
3192 version "3.13.1"
3193 resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847"
3194 integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==
3195 dependencies: 3343 dependencies:
3196 argparse "^1.0.7" 3344 argparse "^1.0.7"
3197 esprima "^4.0.0" 3345 esprima "^4.0.0"
3198 3346
3199js-yaml@~3.7.0: 3347jsesc@^2.5.1:
3200 version "3.7.0" 3348 version "2.5.2"
3201 resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80" 3349 resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
3202 integrity sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A= 3350 integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
3203 dependencies:
3204 argparse "^1.0.7"
3205 esprima "^2.6.0"
3206
3207jsbn@~0.1.0:
3208 version "0.1.1"
3209 resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
3210 integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM=
3211
3212jsesc@^1.3.0:
3213 version "1.3.0"
3214 resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b"
3215 integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s=
3216 3351
3217jsesc@~0.5.0: 3352jsesc@~0.5.0:
3218 version "0.5.0" 3353 version "0.5.0"
3219 resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" 3354 resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
3220 integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= 3355 integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=
3221 3356
3222json-loader@^0.5.4: 3357json-parse-better-errors@^1.0.2:
3223 version "0.5.7" 3358 version "1.0.2"
3224 resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz#dca14a70235ff82f0ac9a3abeb60d337a365185d" 3359 resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9"
3225 integrity sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w== 3360 integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==
3226 3361
3227json-schema-traverse@^0.3.0: 3362json-parse-even-better-errors@^2.3.0:
3228 version "0.3.1" 3363 version "2.3.1"
3229 resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" 3364 resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d"
3230 integrity sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A= 3365 integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==
3231 3366
3232json-schema-traverse@^0.4.1: 3367json-schema-traverse@^0.4.1:
3233 version "0.4.1" 3368 version "0.4.1"
3234 resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 3369 resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
3235 integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 3370 integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
3236 3371
3237json-schema@0.2.3:
3238 version "0.2.3"
3239 resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
3240 integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=
3241
3242json-stable-stringify-without-jsonify@^1.0.1: 3372json-stable-stringify-without-jsonify@^1.0.1:
3243 version "1.0.1" 3373 version "1.0.1"
3244 resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" 3374 resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
3245 integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= 3375 integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=
3246 3376
3247json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1:
3248 version "1.0.1"
3249 resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af"
3250 integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=
3251 dependencies:
3252 jsonify "~0.0.0"
3253
3254json-stringify-safe@~5.0.1:
3255 version "5.0.1"
3256 resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
3257 integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=
3258
3259json5@^0.5.1:
3260 version "0.5.1"
3261 resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
3262 integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=
3263
3264json5@^1.0.1: 3377json5@^1.0.1:
3265 version "1.0.1" 3378 version "1.0.1"
3266 resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" 3379 resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe"
@@ -3268,32 +3381,12 @@ json5@^1.0.1:
3268 dependencies: 3381 dependencies:
3269 minimist "^1.2.0" 3382 minimist "^1.2.0"
3270 3383
3271jsonfile@^3.0.0: 3384json5@^2.1.2:
3272 version "3.0.1" 3385 version "2.1.3"
3273 resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-3.0.1.tgz#a5ecc6f65f53f662c4415c7675a0331d0992ec66" 3386 resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43"
3274 integrity sha1-pezG9l9T9mLEQVx2daAzHQmS7GY= 3387 integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==
3275 optionalDependencies:
3276 graceful-fs "^4.1.6"
3277
3278jsonify@~0.0.0:
3279 version "0.0.0"
3280 resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"
3281 integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=
3282
3283jsonpointer@^4.0.0:
3284 version "4.0.1"
3285 resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9"
3286 integrity sha1-T9kss04OnbPInIYi7PUfm5eMbLk=
3287
3288jsprim@^1.2.2:
3289 version "1.4.1"
3290 resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"
3291 integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=
3292 dependencies: 3388 dependencies:
3293 assert-plus "1.0.0" 3389 minimist "^1.2.5"
3294 extsprintf "1.3.0"
3295 json-schema "0.2.3"
3296 verror "1.10.0"
3297 3390
3298kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: 3391kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
3299 version "3.2.2" 3392 version "3.2.2"
@@ -3314,46 +3407,45 @@ kind-of@^5.0.0:
3314 resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" 3407 resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d"
3315 integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== 3408 integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==
3316 3409
3317kind-of@^6.0.0, kind-of@^6.0.2: 3410kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3:
3318 version "6.0.2" 3411 version "6.0.3"
3319 resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" 3412 resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
3320 integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== 3413 integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
3321 3414
3322known-css-properties@^0.3.0: 3415klona@^2.0.3:
3323 version "0.3.0" 3416 version "2.0.4"
3324 resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.3.0.tgz#a3d135bbfc60ee8c6eacf2f7e7e6f2d4755e49a4" 3417 resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.4.tgz#7bb1e3affb0cb8624547ef7e8f6708ea2e39dfc0"
3325 integrity sha512-QMQcnKAiQccfQTqtBh/qwquGZ2XK/DXND1jrcN9M8gMMy99Gwla7GQjndVUsEqIaRyP6bsFRuhwRj5poafBGJQ== 3418 integrity sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==
3326 3419
3327lazy-cache@^1.0.3: 3420known-css-properties@^0.19.0:
3328 version "1.0.4" 3421 version "0.19.0"
3329 resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" 3422 resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.19.0.tgz#5d92b7fa16c72d971bda9b7fe295bdf61836ee5b"
3330 integrity sha1-odePw6UEdMuAhF07O24dpJpEbo4= 3423 integrity sha512-eYboRV94Vco725nKMlpkn3nV2+96p9c3gKXRsYqAJSswSENvBhN7n5L+uDhY58xQa0UukWsDMTGELzmD8Q+wTA==
3331 3424
3332lcid@^1.0.0: 3425leven@^3.1.0:
3333 version "1.0.0" 3426 version "3.1.0"
3334 resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" 3427 resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2"
3335 integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= 3428 integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==
3336 dependencies:
3337 invert-kv "^1.0.0"
3338 3429
3339levn@^0.3.0, levn@~0.3.0: 3430levenary@^1.1.1:
3340 version "0.3.0" 3431 version "1.1.1"
3341 resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" 3432 resolved "https://registry.yarnpkg.com/levenary/-/levenary-1.1.1.tgz#842a9ee98d2075aa7faeedbe32679e9205f46f77"
3342 integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= 3433 integrity sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==
3343 dependencies: 3434 dependencies:
3344 prelude-ls "~1.1.2" 3435 leven "^3.1.0"
3345 type-check "~0.3.2"
3346 3436
3347load-json-file@^1.0.0: 3437levn@^0.4.1:
3348 version "1.1.0" 3438 version "0.4.1"
3349 resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" 3439 resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade"
3350 integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= 3440 integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==
3351 dependencies: 3441 dependencies:
3352 graceful-fs "^4.1.2" 3442 prelude-ls "^1.2.1"
3353 parse-json "^2.2.0" 3443 type-check "~0.4.0"
3354 pify "^2.0.0" 3444
3355 pinkie-promise "^2.0.0" 3445lines-and-columns@^1.1.6:
3356 strip-bom "^2.0.0" 3446 version "1.1.6"
3447 resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00"
3448 integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=
3357 3449
3358load-json-file@^2.0.0: 3450load-json-file@^2.0.0:
3359 version "2.0.0" 3451 version "2.0.0"
@@ -3365,20 +3457,29 @@ load-json-file@^2.0.0:
3365 pify "^2.0.0" 3457 pify "^2.0.0"
3366 strip-bom "^3.0.0" 3458 strip-bom "^3.0.0"
3367 3459
3368loader-runner@^2.3.0: 3460loader-runner@^2.4.0:
3369 version "2.4.0" 3461 version "2.4.0"
3370 resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" 3462 resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357"
3371 integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== 3463 integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==
3372 3464
3373loader-utils@^1.0.1, loader-utils@^1.0.2, loader-utils@^1.1.0: 3465loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0:
3374 version "1.2.3" 3466 version "1.4.0"
3375 resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" 3467 resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613"
3376 integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== 3468 integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==
3377 dependencies: 3469 dependencies:
3378 big.js "^5.2.2" 3470 big.js "^5.2.2"
3379 emojis-list "^2.0.0" 3471 emojis-list "^3.0.0"
3380 json5 "^1.0.1" 3472 json5 "^1.0.1"
3381 3473
3474loader-utils@^2.0.0:
3475 version "2.0.0"
3476 resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0"
3477 integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==
3478 dependencies:
3479 big.js "^5.2.2"
3480 emojis-list "^3.0.0"
3481 json5 "^2.1.2"
3482
3382locate-path@^2.0.0: 3483locate-path@^2.0.0:
3383 version "2.0.0" 3484 version "2.0.0"
3384 resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" 3485 resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
@@ -3387,55 +3488,37 @@ locate-path@^2.0.0:
3387 p-locate "^2.0.0" 3488 p-locate "^2.0.0"
3388 path-exists "^3.0.0" 3489 path-exists "^3.0.0"
3389 3490
3390lodash.camelcase@^4.3.0: 3491locate-path@^3.0.0:
3391 version "4.3.0" 3492 version "3.0.0"
3392 resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" 3493 resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e"
3393 integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= 3494 integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==
3394 3495 dependencies:
3395lodash.capitalize@^4.1.0: 3496 p-locate "^3.0.0"
3396 version "4.2.1" 3497 path-exists "^3.0.0"
3397 resolved "https://registry.yarnpkg.com/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz#f826c9b4e2a8511d84e3aca29db05e1a4f3b72a9"
3398 integrity sha1-+CbJtOKoUR2E46yinbBeGk87cqk=
3399
3400lodash.isplainobject@^4.0.6:
3401 version "4.0.6"
3402 resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb"
3403 integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=
3404
3405lodash.kebabcase@^4.0.0:
3406 version "4.1.1"
3407 resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36"
3408 integrity sha1-hImxyw0p/4gZXM7KRI/21swpXDY=
3409
3410lodash.memoize@^4.1.2:
3411 version "4.1.2"
3412 resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
3413 integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=
3414
3415lodash.some@^4.6.0:
3416 version "4.6.0"
3417 resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d"
3418 integrity sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=
3419 3498
3420lodash.tail@^4.1.1: 3499locate-path@^5.0.0:
3421 version "4.1.1" 3500 version "5.0.0"
3422 resolved "https://registry.yarnpkg.com/lodash.tail/-/lodash.tail-4.1.1.tgz#d2333a36d9e7717c8ad2f7cacafec7c32b444664" 3501 resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0"
3423 integrity sha1-0jM6NtnncXyK0vfKyv7HwytERmQ= 3502 integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==
3503 dependencies:
3504 p-locate "^4.1.0"
3424 3505
3425lodash.uniq@^4.5.0: 3506lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20:
3426 version "4.5.0" 3507 version "4.17.20"
3427 resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" 3508 resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52"
3428 integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= 3509 integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==
3429 3510
3430lodash@^4.0.0, lodash@^4.17.11, lodash@^4.17.4, lodash@^4.3.0, lodash@~4.17.10: 3511log-symbols@^4.0.0:
3431 version "4.17.15" 3512 version "4.0.0"
3432 resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" 3513 resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920"
3433 integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== 3514 integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==
3515 dependencies:
3516 chalk "^4.0.0"
3434 3517
3435longest@^1.0.1: 3518longest-streak@^2.0.1:
3436 version "1.0.1" 3519 version "2.0.4"
3437 resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" 3520 resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-2.0.4.tgz#b8599957da5b5dab64dee3fe316fa774597d90e4"
3438 integrity sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc= 3521 integrity sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==
3439 3522
3440loose-envify@^1.0.0: 3523loose-envify@^1.0.0:
3441 version "1.4.0" 3524 version "1.4.0"
@@ -3444,39 +3527,50 @@ loose-envify@^1.0.0:
3444 dependencies: 3527 dependencies:
3445 js-tokens "^3.0.0 || ^4.0.0" 3528 js-tokens "^3.0.0 || ^4.0.0"
3446 3529
3447loud-rejection@^1.0.0: 3530lru-cache@^5.1.1:
3448 version "1.6.0" 3531 version "5.1.1"
3449 resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" 3532 resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920"
3450 integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= 3533 integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==
3451 dependencies: 3534 dependencies:
3452 currently-unhandled "^0.4.1" 3535 yallist "^3.0.2"
3453 signal-exit "^3.0.0"
3454 3536
3455lru-cache@^4.0.1: 3537lru-cache@^6.0.0:
3456 version "4.1.5" 3538 version "6.0.0"
3457 resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" 3539 resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
3458 integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== 3540 integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
3459 dependencies: 3541 dependencies:
3460 pseudomap "^1.0.2" 3542 yallist "^4.0.0"
3461 yallist "^2.1.2"
3462 3543
3463make-dir@^1.0.0: 3544make-dir@^2.0.0:
3464 version "1.3.0" 3545 version "2.1.0"
3465 resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" 3546 resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5"
3466 integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== 3547 integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==
3548 dependencies:
3549 pify "^4.0.1"
3550 semver "^5.6.0"
3551
3552make-dir@^3.0.2:
3553 version "3.1.0"
3554 resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f"
3555 integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==
3467 dependencies: 3556 dependencies:
3468 pify "^3.0.0" 3557 semver "^6.0.0"
3469 3558
3470map-cache@^0.2.2: 3559map-cache@^0.2.2:
3471 version "0.2.2" 3560 version "0.2.2"
3472 resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" 3561 resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
3473 integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= 3562 integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=
3474 3563
3475map-obj@^1.0.0, map-obj@^1.0.1: 3564map-obj@^1.0.0:
3476 version "1.0.1" 3565 version "1.0.1"
3477 resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" 3566 resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d"
3478 integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= 3567 integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=
3479 3568
3569map-obj@^4.0.0:
3570 version "4.1.0"
3571 resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.1.0.tgz#b91221b542734b9f14256c0132c897c5d7256fd5"
3572 integrity sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g==
3573
3480map-visit@^1.0.0: 3574map-visit@^1.0.0:
3481 version "1.0.0" 3575 version "1.0.0"
3482 resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" 3576 resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f"
@@ -3484,10 +3578,22 @@ map-visit@^1.0.0:
3484 dependencies: 3578 dependencies:
3485 object-visit "^1.0.0" 3579 object-visit "^1.0.0"
3486 3580
3487math-expression-evaluator@^1.2.14: 3581markdown-escapes@^1.0.0:
3488 version "1.2.17" 3582 version "1.0.4"
3489 resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz#de819fdbcd84dccd8fae59c6aeb79615b9d266ac" 3583 resolved "https://registry.yarnpkg.com/markdown-escapes/-/markdown-escapes-1.0.4.tgz#c95415ef451499d7602b91095f3c8e8975f78535"
3490 integrity sha1-3oGf282E3M2PrlnGrreWFbnSZqw= 3584 integrity sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==
3585
3586markdown-table@^2.0.0:
3587 version "2.0.0"
3588 resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-2.0.0.tgz#194a90ced26d31fe753d8b9434430214c011865b"
3589 integrity sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==
3590 dependencies:
3591 repeat-string "^1.0.0"
3592
3593mathml-tag-names@^2.1.3:
3594 version "2.1.3"
3595 resolved "https://registry.yarnpkg.com/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz#4ddadd67308e780cf16a47685878ee27b736a0a3"
3596 integrity sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==
3491 3597
3492md5.js@^1.3.4: 3598md5.js@^1.3.4:
3493 version "1.3.5" 3599 version "1.3.5"
@@ -3498,14 +3604,14 @@ md5.js@^1.3.4:
3498 inherits "^2.0.1" 3604 inherits "^2.0.1"
3499 safe-buffer "^5.1.2" 3605 safe-buffer "^5.1.2"
3500 3606
3501mem@^1.1.0: 3607mdast-util-compact@^2.0.0:
3502 version "1.1.0" 3608 version "2.0.1"
3503 resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" 3609 resolved "https://registry.yarnpkg.com/mdast-util-compact/-/mdast-util-compact-2.0.1.tgz#cabc69a2f43103628326f35b1acf735d55c99490"
3504 integrity sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y= 3610 integrity sha512-7GlnT24gEwDrdAwEHrU4Vv5lLWrEer4KOkAiKT9nYstsTad7Oc1TwqT2zIMKRdZF7cTuaf+GA1E4Kv7jJh8mPA==
3505 dependencies: 3611 dependencies:
3506 mimic-fn "^1.0.0" 3612 unist-util-visit "^2.0.0"
3507 3613
3508memory-fs@^0.4.0, memory-fs@~0.4.1: 3614memory-fs@^0.4.1:
3509 version "0.4.1" 3615 version "0.4.1"
3510 resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" 3616 resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552"
3511 integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= 3617 integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=
@@ -3513,28 +3619,42 @@ memory-fs@^0.4.0, memory-fs@~0.4.1:
3513 errno "^0.1.3" 3619 errno "^0.1.3"
3514 readable-stream "^2.0.1" 3620 readable-stream "^2.0.1"
3515 3621
3516meow@^3.7.0: 3622memory-fs@^0.5.0:
3517 version "3.7.0" 3623 version "0.5.0"
3518 resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" 3624 resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c"
3519 integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= 3625 integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==
3520 dependencies: 3626 dependencies:
3521 camelcase-keys "^2.0.0" 3627 errno "^0.1.3"
3522 decamelize "^1.1.2" 3628 readable-stream "^2.0.1"
3523 loud-rejection "^1.0.0"
3524 map-obj "^1.0.1"
3525 minimist "^1.1.3"
3526 normalize-package-data "^2.3.4"
3527 object-assign "^4.0.1"
3528 read-pkg-up "^1.0.1"
3529 redent "^1.0.0"
3530 trim-newlines "^1.0.0"
3531 3629
3532merge@^1.2.0: 3630meow@^7.1.1:
3533 version "1.2.1" 3631 version "7.1.1"
3534 resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145" 3632 resolved "https://registry.yarnpkg.com/meow/-/meow-7.1.1.tgz#7c01595e3d337fcb0ec4e8eed1666ea95903d306"
3535 integrity sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ== 3633 integrity sha512-GWHvA5QOcS412WCo8vwKDlTelGLsCGBVevQB5Kva961rmNfun0PCbv5+xta2kUMFJyR8/oWnn7ddeKdosbAPbA==
3634 dependencies:
3635 "@types/minimist" "^1.2.0"
3636 camelcase-keys "^6.2.2"
3637 decamelize-keys "^1.1.0"
3638 hard-rejection "^2.1.0"
3639 minimist-options "4.1.0"
3640 normalize-package-data "^2.5.0"
3641 read-pkg-up "^7.0.1"
3642 redent "^3.0.0"
3643 trim-newlines "^3.0.0"
3644 type-fest "^0.13.1"
3645 yargs-parser "^18.1.3"
3646
3647merge-stream@^2.0.0:
3648 version "2.0.0"
3649 resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
3650 integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
3651
3652merge2@^1.3.0:
3653 version "1.4.1"
3654 resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
3655 integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
3536 3656
3537micromatch@^3.1.10, micromatch@^3.1.4: 3657micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4:
3538 version "3.1.10" 3658 version "3.1.10"
3539 resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" 3659 resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
3540 integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== 3660 integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==
@@ -3553,6 +3673,14 @@ micromatch@^3.1.10, micromatch@^3.1.4:
3553 snapdragon "^0.8.1" 3673 snapdragon "^0.8.1"
3554 to-regex "^3.0.2" 3674 to-regex "^3.0.2"
3555 3675
3676micromatch@^4.0.2:
3677 version "4.0.2"
3678 resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259"
3679 integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==
3680 dependencies:
3681 braces "^3.0.1"
3682 picomatch "^2.0.5"
3683
3556miller-rabin@^4.0.0: 3684miller-rabin@^4.0.0:
3557 version "4.0.1" 3685 version "4.0.1"
3558 resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" 3686 resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d"
@@ -3561,27 +3689,20 @@ miller-rabin@^4.0.0:
3561 bn.js "^4.0.0" 3689 bn.js "^4.0.0"
3562 brorand "^1.0.1" 3690 brorand "^1.0.1"
3563 3691
3564mime-db@1.40.0: 3692min-indent@^1.0.0:
3565 version "1.40.0" 3693 version "1.0.1"
3566 resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.40.0.tgz#a65057e998db090f732a68f6c276d387d4126c32" 3694 resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869"
3567 integrity sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA== 3695 integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==
3568 3696
3569mime-types@^2.1.12, mime-types@~2.1.19: 3697mini-css-extract-plugin@^0.11.2:
3570 version "2.1.24" 3698 version "0.11.2"
3571 resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81" 3699 resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.11.2.tgz#e3af4d5e04fbcaaf11838ab230510073060b37bf"
3572 integrity sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ== 3700 integrity sha512-h2LknfX4U1kScXxH8xE9LCOqT5B+068EAj36qicMb8l4dqdJoyHcmWmpd+ueyZfgu/POvIn+teoUnTtei2ikug==
3573 dependencies: 3701 dependencies:
3574 mime-db "1.40.0" 3702 loader-utils "^1.1.0"
3575 3703 normalize-url "1.9.1"
3576mime@^1.4.1: 3704 schema-utils "^1.0.0"
3577 version "1.6.0" 3705 webpack-sources "^1.1.0"
3578 resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
3579 integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
3580
3581mimic-fn@^1.0.0:
3582 version "1.2.0"
3583 resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
3584 integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==
3585 3706
3586minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: 3707minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1:
3587 version "1.0.1" 3708 version "1.0.1"
@@ -3593,42 +3714,78 @@ minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1:
3593 resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" 3714 resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
3594 integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= 3715 integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=
3595 3716
3596minimatch@^3.0.2, minimatch@^3.0.4, minimatch@~3.0.2: 3717minimatch@^3.0.4:
3597 version "3.0.4" 3718 version "3.0.4"
3598 resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 3719 resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
3599 integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 3720 integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
3600 dependencies: 3721 dependencies:
3601 brace-expansion "^1.1.7" 3722 brace-expansion "^1.1.7"
3602 3723
3603minimist@0.0.8: 3724minimist-options@4.1.0:
3604 version "0.0.8" 3725 version "4.1.0"
3605 resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 3726 resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619"
3606 integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= 3727 integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==
3728 dependencies:
3729 arrify "^1.0.1"
3730 is-plain-obj "^1.1.0"
3731 kind-of "^6.0.3"
3607 3732
3608minimist@1.1.x: 3733minimist@^1.2.0, minimist@^1.2.5:
3609 version "1.1.3" 3734 version "1.2.5"
3610 resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.1.3.tgz#3bedfd91a92d39016fcfaa1c681e8faa1a1efda8" 3735 resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
3611 integrity sha1-O+39kaktOQFvz6ocaB6Pqhoe/ag= 3736 integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
3612 3737
3613minimist@^1.1.3, minimist@^1.2.0: 3738minipass-collect@^1.0.2:
3614 version "1.2.0" 3739 version "1.0.2"
3615 resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 3740 resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617"
3616 integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= 3741 integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==
3742 dependencies:
3743 minipass "^3.0.0"
3617 3744
3618minipass@^2.2.1, minipass@^2.3.4: 3745minipass-flush@^1.0.5:
3619 version "2.3.5" 3746 version "1.0.5"
3620 resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" 3747 resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373"
3621 integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA== 3748 integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==
3622 dependencies: 3749 dependencies:
3623 safe-buffer "^5.1.2" 3750 minipass "^3.0.0"
3624 yallist "^3.0.0"
3625 3751
3626minizlib@^1.1.1: 3752minipass-pipeline@^1.2.2:
3627 version "1.2.1" 3753 version "1.2.4"
3628 resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614" 3754 resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c"
3629 integrity sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA== 3755 integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==
3756 dependencies:
3757 minipass "^3.0.0"
3758
3759minipass@^3.0.0, minipass@^3.1.1:
3760 version "3.1.3"
3761 resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.3.tgz#7d42ff1f39635482e15f9cdb53184deebd5815fd"
3762 integrity sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==
3763 dependencies:
3764 yallist "^4.0.0"
3765
3766minizlib@^2.1.1:
3767 version "2.1.2"
3768 resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931"
3769 integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==
3630 dependencies: 3770 dependencies:
3631 minipass "^2.2.1" 3771 minipass "^3.0.0"
3772 yallist "^4.0.0"
3773
3774mississippi@^3.0.0:
3775 version "3.0.0"
3776 resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022"
3777 integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==
3778 dependencies:
3779 concat-stream "^1.5.0"
3780 duplexify "^3.4.2"
3781 end-of-stream "^1.1.0"
3782 flush-write-stream "^1.0.0"
3783 from2 "^2.1.0"
3784 parallel-transform "^1.1.0"
3785 pump "^3.0.0"
3786 pumpify "^1.3.3"
3787 stream-each "^1.1.0"
3788 through2 "^2.0.0"
3632 3789
3633mixin-deep@^1.2.0: 3790mixin-deep@^1.2.0:
3634 version "1.3.2" 3791 version "1.3.2"
@@ -3638,45 +3795,44 @@ mixin-deep@^1.2.0:
3638 for-in "^1.0.2" 3795 for-in "^1.0.2"
3639 is-extendable "^1.0.1" 3796 is-extendable "^1.0.1"
3640 3797
3641mixin-object@^2.0.1: 3798mkdirp@^0.5.1, mkdirp@^0.5.3:
3642 version "2.0.1" 3799 version "0.5.5"
3643 resolved "https://registry.yarnpkg.com/mixin-object/-/mixin-object-2.0.1.tgz#4fb949441dab182540f1fe035ba60e1947a5e57e" 3800 resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def"
3644 integrity sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4= 3801 integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==
3645 dependencies: 3802 dependencies:
3646 for-in "^0.1.3" 3803 minimist "^1.2.5"
3647 is-extendable "^0.1.1" 3804
3805mkdirp@^1.0.3, mkdirp@^1.0.4:
3806 version "1.0.4"
3807 resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
3808 integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
3648 3809
3649"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: 3810move-concurrently@^1.0.1:
3650 version "0.5.1" 3811 version "1.0.1"
3651 resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 3812 resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92"
3652 integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= 3813 integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=
3653 dependencies: 3814 dependencies:
3654 minimist "0.0.8" 3815 aproba "^1.1.1"
3816 copy-concurrently "^1.0.0"
3817 fs-write-stream-atomic "^1.0.8"
3818 mkdirp "^0.5.1"
3819 rimraf "^2.5.4"
3820 run-queue "^1.0.3"
3655 3821
3656ms@2.0.0: 3822ms@2.0.0:
3657 version "2.0.0" 3823 version "2.0.0"
3658 resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 3824 resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
3659 integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 3825 integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
3660 3826
3661ms@^2.1.1: 3827ms@2.1.2:
3662 version "2.1.1" 3828 version "2.1.2"
3663 resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" 3829 resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
3664 integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== 3830 integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
3665
3666mute-stream@0.0.5:
3667 version "0.0.5"
3668 resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0"
3669 integrity sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=
3670
3671mute-stream@0.0.7:
3672 version "0.0.7"
3673 resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab"
3674 integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=
3675 3831
3676nan@^2.12.1, nan@^2.13.2: 3832nan@^2.12.1:
3677 version "2.14.0" 3833 version "2.14.1"
3678 resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" 3834 resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.1.tgz#d7be34dfa3105b91494c3147089315eff8874b01"
3679 integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== 3835 integrity sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==
3680 3836
3681nanomatch@^1.2.9: 3837nanomatch@^1.2.9:
3682 version "1.2.13" 3838 version "1.2.13"
@@ -3700,47 +3856,20 @@ natural-compare@^1.4.0:
3700 resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 3856 resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
3701 integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= 3857 integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
3702 3858
3703needle@^2.2.1: 3859neo-async@^2.5.0, neo-async@^2.6.1, neo-async@^2.6.2:
3704 version "2.4.0" 3860 version "2.6.2"
3705 resolved "https://registry.yarnpkg.com/needle/-/needle-2.4.0.tgz#6833e74975c444642590e15a750288c5f939b57c" 3861 resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f"
3706 integrity sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg== 3862 integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==
3707 dependencies:
3708 debug "^3.2.6"
3709 iconv-lite "^0.4.4"
3710 sax "^1.2.4"
3711
3712neo-async@^2.5.0:
3713 version "2.6.1"
3714 resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c"
3715 integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==
3716 3863
3717next-tick@^1.0.0: 3864nice-try@^1.0.4:
3718 version "1.0.0" 3865 version "1.0.5"
3719 resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" 3866 resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
3720 integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= 3867 integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
3721 3868
3722node-gyp@^3.8.0: 3869node-libs-browser@^2.2.1:
3723 version "3.8.0" 3870 version "2.2.1"
3724 resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c" 3871 resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425"
3725 integrity sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA== 3872 integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==
3726 dependencies:
3727 fstream "^1.0.0"
3728 glob "^7.0.3"
3729 graceful-fs "^4.1.2"
3730 mkdirp "^0.5.0"
3731 nopt "2 || 3"
3732 npmlog "0 || 1 || 2 || 3 || 4"
3733 osenv "0"
3734 request "^2.87.0"
3735 rimraf "2"
3736 semver "~5.3.0"
3737 tar "^2.0.0"
3738 which "1"
3739
3740node-libs-browser@^2.0.0:
3741 version "2.2.0"
3742 resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.0.tgz#c72f60d9d46de08a940dedbb25f3ffa2f9bbaa77"
3743 integrity sha512-5MQunG/oyOaBdttrL40dA7bUfPORLRWMUJLQtMg7nluxUvk5XwnLdL9twQHFAjRx/y7mIMkLKT9++qPbbk6BZA==
3744 dependencies: 3873 dependencies:
3745 assert "^1.1.1" 3874 assert "^1.1.1"
3746 browserify-zlib "^0.2.0" 3875 browserify-zlib "^0.2.0"
@@ -3752,7 +3881,7 @@ node-libs-browser@^2.0.0:
3752 events "^3.0.0" 3881 events "^3.0.0"
3753 https-browserify "^1.0.0" 3882 https-browserify "^1.0.0"
3754 os-browserify "^0.3.0" 3883 os-browserify "^0.3.0"
3755 path-browserify "0.0.0" 3884 path-browserify "0.0.1"
3756 process "^0.11.10" 3885 process "^0.11.10"
3757 punycode "^1.2.4" 3886 punycode "^1.2.4"
3758 querystring-es3 "^0.2.0" 3887 querystring-es3 "^0.2.0"
@@ -3764,63 +3893,14 @@ node-libs-browser@^2.0.0:
3764 tty-browserify "0.0.0" 3893 tty-browserify "0.0.0"
3765 url "^0.11.0" 3894 url "^0.11.0"
3766 util "^0.11.0" 3895 util "^0.11.0"
3767 vm-browserify "0.0.4" 3896 vm-browserify "^1.0.1"
3768 3897
3769node-pre-gyp@^0.12.0: 3898node-releases@^1.1.61:
3770 version "0.12.0" 3899 version "1.1.61"
3771 resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz#39ba4bb1439da030295f899e3b520b7785766149" 3900 resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.61.tgz#707b0fca9ce4e11783612ba4a2fcba09047af16e"
3772 integrity sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A== 3901 integrity sha512-DD5vebQLg8jLCOzwupn954fbIiZht05DAZs0k2u8NStSe6h9XdsuIQL8hSRKYiU8WUQRznmSDrKGbv3ObOmC7g==
3773 dependencies:
3774 detect-libc "^1.0.2"
3775 mkdirp "^0.5.1"
3776 needle "^2.2.1"
3777 nopt "^4.0.1"
3778 npm-packlist "^1.1.6"
3779 npmlog "^4.0.2"
3780 rc "^1.2.7"
3781 rimraf "^2.6.1"
3782 semver "^5.3.0"
3783 tar "^4"
3784
3785node-sass@^4.12.0:
3786 version "4.12.0"
3787 resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.12.0.tgz#0914f531932380114a30cc5fa4fa63233a25f017"
3788 integrity sha512-A1Iv4oN+Iel6EPv77/HddXErL2a+gZ4uBeZUy+a8O35CFYTXhgA8MgLCWBtwpGZdCvTvQ9d+bQxX/QC36GDPpQ==
3789 dependencies:
3790 async-foreach "^0.1.3"
3791 chalk "^1.1.1"
3792 cross-spawn "^3.0.0"
3793 gaze "^1.0.0"
3794 get-stdin "^4.0.1"
3795 glob "^7.0.3"
3796 in-publish "^2.0.0"
3797 lodash "^4.17.11"
3798 meow "^3.7.0"
3799 mkdirp "^0.5.1"
3800 nan "^2.13.2"
3801 node-gyp "^3.8.0"
3802 npmlog "^4.0.0"
3803 request "^2.88.0"
3804 sass-graph "^2.2.4"
3805 stdout-stream "^1.4.0"
3806 "true-case-path" "^1.0.2"
3807
3808"nopt@2 || 3":
3809 version "3.0.6"
3810 resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9"
3811 integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k=
3812 dependencies:
3813 abbrev "1"
3814 3902
3815nopt@^4.0.1: 3903normalize-package-data@^2.3.2, normalize-package-data@^2.5.0:
3816 version "4.0.1"
3817 resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d"
3818 integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=
3819 dependencies:
3820 abbrev "1"
3821 osenv "^0.1.4"
3822
3823normalize-package-data@^2.3.2, normalize-package-data@^2.3.4:
3824 version "2.5.0" 3904 version "2.5.0"
3825 resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" 3905 resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8"
3826 integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== 3906 integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==
@@ -3837,7 +3917,7 @@ normalize-path@^2.1.1:
3837 dependencies: 3917 dependencies:
3838 remove-trailing-separator "^1.0.1" 3918 remove-trailing-separator "^1.0.1"
3839 3919
3840normalize-path@^3.0.0: 3920normalize-path@^3.0.0, normalize-path@~3.0.0:
3841 version "3.0.0" 3921 version "3.0.0"
3842 resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 3922 resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
3843 integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 3923 integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
@@ -3847,7 +3927,12 @@ normalize-range@^0.1.2:
3847 resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" 3927 resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942"
3848 integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= 3928 integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=
3849 3929
3850normalize-url@^1.4.0: 3930normalize-selector@^0.2.0:
3931 version "0.2.0"
3932 resolved "https://registry.yarnpkg.com/normalize-selector/-/normalize-selector-0.2.0.tgz#d0b145eb691189c63a78d201dc4fdb1293ef0c03"
3933 integrity sha1-0LFF62kRicY6eNIB3E/bEpPvDAM=
3934
3935normalize-url@1.9.1:
3851 version "1.9.1" 3936 version "1.9.1"
3852 resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" 3937 resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c"
3853 integrity sha1-LMDWazHqIwNkWENuNiDYWVTGbDw= 3938 integrity sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=
@@ -3857,51 +3942,11 @@ normalize-url@^1.4.0:
3857 query-string "^4.1.0" 3942 query-string "^4.1.0"
3858 sort-keys "^1.0.0" 3943 sort-keys "^1.0.0"
3859 3944
3860npm-bundled@^1.0.1:
3861 version "1.0.6"
3862 resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd"
3863 integrity sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==
3864
3865npm-packlist@^1.1.6:
3866 version "1.4.1"
3867 resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.1.tgz#19064cdf988da80ea3cee45533879d90192bbfbc"
3868 integrity sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw==
3869 dependencies:
3870 ignore-walk "^3.0.1"
3871 npm-bundled "^1.0.1"
3872
3873npm-run-path@^2.0.0:
3874 version "2.0.2"
3875 resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
3876 integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=
3877 dependencies:
3878 path-key "^2.0.0"
3879
3880"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.0.2:
3881 version "4.1.2"
3882 resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
3883 integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==
3884 dependencies:
3885 are-we-there-yet "~1.1.2"
3886 console-control-strings "~1.1.0"
3887 gauge "~2.7.3"
3888 set-blocking "~2.0.0"
3889
3890num2fraction@^1.2.2: 3945num2fraction@^1.2.2:
3891 version "1.2.2" 3946 version "1.2.2"
3892 resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" 3947 resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede"
3893 integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= 3948 integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=
3894 3949
3895number-is-nan@^1.0.0:
3896 version "1.0.1"
3897 resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
3898 integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=
3899
3900oauth-sign@~0.9.0:
3901 version "0.9.0"
3902 resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455"
3903 integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==
3904
3905object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: 3950object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1:
3906 version "4.1.1" 3951 version "4.1.1"
3907 resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 3952 resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
@@ -3916,7 +3961,12 @@ object-copy@^0.1.0:
3916 define-property "^0.2.5" 3961 define-property "^0.2.5"
3917 kind-of "^3.0.3" 3962 kind-of "^3.0.3"
3918 3963
3919object-keys@^1.0.12: 3964object-inspect@^1.7.0, object-inspect@^1.8.0:
3965 version "1.8.0"
3966 resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0"
3967 integrity sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==
3968
3969object-keys@^1.0.12, object-keys@^1.1.1:
3920 version "1.1.1" 3970 version "1.1.1"
3921 resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" 3971 resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
3922 integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== 3972 integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
@@ -3928,6 +3978,25 @@ object-visit@^1.0.0:
3928 dependencies: 3978 dependencies:
3929 isobject "^3.0.0" 3979 isobject "^3.0.0"
3930 3980
3981object.assign@^4.1.0:
3982 version "4.1.1"
3983 resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.1.tgz#303867a666cdd41936ecdedfb1f8f3e32a478cdd"
3984 integrity sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==
3985 dependencies:
3986 define-properties "^1.1.3"
3987 es-abstract "^1.18.0-next.0"
3988 has-symbols "^1.0.1"
3989 object-keys "^1.1.1"
3990
3991object.entries@^1.1.2:
3992 version "1.1.2"
3993 resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.2.tgz#bc73f00acb6b6bb16c203434b10f9a7e797d3add"
3994 integrity sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA==
3995 dependencies:
3996 define-properties "^1.1.3"
3997 es-abstract "^1.17.5"
3998 has "^1.0.3"
3999
3931object.pick@^1.3.0: 4000object.pick@^1.3.0:
3932 version "1.3.0" 4001 version "1.3.0"
3933 resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" 4002 resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
@@ -3935,81 +4004,40 @@ object.pick@^1.3.0:
3935 dependencies: 4004 dependencies:
3936 isobject "^3.0.1" 4005 isobject "^3.0.1"
3937 4006
3938once@^1.3.0: 4007object.values@^1.1.1:
4008 version "1.1.1"
4009 resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e"
4010 integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==
4011 dependencies:
4012 define-properties "^1.1.3"
4013 es-abstract "^1.17.0-next.1"
4014 function-bind "^1.1.1"
4015 has "^1.0.3"
4016
4017once@^1.3.0, once@^1.3.1, once@^1.4.0:
3939 version "1.4.0" 4018 version "1.4.0"
3940 resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 4019 resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
3941 integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 4020 integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
3942 dependencies: 4021 dependencies:
3943 wrappy "1" 4022 wrappy "1"
3944 4023
3945onetime@^1.0.0: 4024optionator@^0.9.1:
3946 version "1.1.0" 4025 version "0.9.1"
3947 resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" 4026 resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499"
3948 integrity sha1-ofeDj4MUxRbwXs78vEzP4EtO14k= 4027 integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==
3949
3950onetime@^2.0.0:
3951 version "2.0.1"
3952 resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4"
3953 integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=
3954 dependencies: 4028 dependencies:
3955 mimic-fn "^1.0.0" 4029 deep-is "^0.1.3"
3956 4030 fast-levenshtein "^2.0.6"
3957optionator@^0.8.1, optionator@^0.8.2: 4031 levn "^0.4.1"
3958 version "0.8.2" 4032 prelude-ls "^1.2.1"
3959 resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" 4033 type-check "^0.4.0"
3960 integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q= 4034 word-wrap "^1.2.3"
3961 dependencies:
3962 deep-is "~0.1.3"
3963 fast-levenshtein "~2.0.4"
3964 levn "~0.3.0"
3965 prelude-ls "~1.1.2"
3966 type-check "~0.3.2"
3967 wordwrap "~1.0.0"
3968 4035
3969os-browserify@^0.3.0: 4036os-browserify@^0.3.0:
3970 version "0.3.0" 4037 version "0.3.0"
3971 resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" 4038 resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27"
3972 integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= 4039 integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=
3973 4040
3974os-homedir@^1.0.0:
3975 version "1.0.2"
3976 resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
3977 integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M=
3978
3979os-locale@^1.4.0:
3980 version "1.4.0"
3981 resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9"
3982 integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=
3983 dependencies:
3984 lcid "^1.0.0"
3985
3986os-locale@^2.0.0:
3987 version "2.1.0"
3988 resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2"
3989 integrity sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==
3990 dependencies:
3991 execa "^0.7.0"
3992 lcid "^1.0.0"
3993 mem "^1.1.0"
3994
3995os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.2:
3996 version "1.0.2"
3997 resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
3998 integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
3999
4000osenv@0, osenv@^0.1.4:
4001 version "0.1.5"
4002 resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410"
4003 integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==
4004 dependencies:
4005 os-homedir "^1.0.0"
4006 os-tmpdir "^1.0.0"
4007
4008p-finally@^1.0.0:
4009 version "1.0.0"
4010 resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
4011 integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=
4012
4013p-limit@^1.1.0: 4041p-limit@^1.1.0:
4014 version "1.3.0" 4042 version "1.3.0"
4015 resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" 4043 resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8"
@@ -4017,6 +4045,20 @@ p-limit@^1.1.0:
4017 dependencies: 4045 dependencies:
4018 p-try "^1.0.0" 4046 p-try "^1.0.0"
4019 4047
4048p-limit@^2.0.0, p-limit@^2.2.0:
4049 version "2.3.0"
4050 resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
4051 integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
4052 dependencies:
4053 p-try "^2.0.0"
4054
4055p-limit@^3.0.2:
4056 version "3.0.2"
4057 resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.0.2.tgz#1664e010af3cadc681baafd3e2a437be7b0fb5fe"
4058 integrity sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==
4059 dependencies:
4060 p-try "^2.0.0"
4061
4020p-locate@^2.0.0: 4062p-locate@^2.0.0:
4021 version "2.0.0" 4063 version "2.0.0"
4022 resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" 4064 resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
@@ -4024,28 +4066,81 @@ p-locate@^2.0.0:
4024 dependencies: 4066 dependencies:
4025 p-limit "^1.1.0" 4067 p-limit "^1.1.0"
4026 4068
4069p-locate@^3.0.0:
4070 version "3.0.0"
4071 resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4"
4072 integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==
4073 dependencies:
4074 p-limit "^2.0.0"
4075
4076p-locate@^4.1.0:
4077 version "4.1.0"
4078 resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07"
4079 integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==
4080 dependencies:
4081 p-limit "^2.2.0"
4082
4083p-map@^4.0.0:
4084 version "4.0.0"
4085 resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b"
4086 integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==
4087 dependencies:
4088 aggregate-error "^3.0.0"
4089
4027p-try@^1.0.0: 4090p-try@^1.0.0:
4028 version "1.0.0" 4091 version "1.0.0"
4029 resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" 4092 resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
4030 integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= 4093 integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=
4031 4094
4095p-try@^2.0.0:
4096 version "2.2.0"
4097 resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
4098 integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
4099
4032pako@~1.0.5: 4100pako@~1.0.5:
4033 version "1.0.10" 4101 version "1.0.11"
4034 resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.10.tgz#4328badb5086a426aa90f541977d4955da5c9732" 4102 resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf"
4035 integrity sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw== 4103 integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==
4104
4105parallel-transform@^1.1.0:
4106 version "1.2.0"
4107 resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc"
4108 integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==
4109 dependencies:
4110 cyclist "^1.0.1"
4111 inherits "^2.0.3"
4112 readable-stream "^2.1.5"
4113
4114parent-module@^1.0.0:
4115 version "1.0.1"
4116 resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
4117 integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==
4118 dependencies:
4119 callsites "^3.0.0"
4036 4120
4037parse-asn1@^5.0.0: 4121parse-asn1@^5.0.0, parse-asn1@^5.1.5:
4038 version "5.1.4" 4122 version "5.1.6"
4039 resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.4.tgz#37f6628f823fbdeb2273b4d540434a22f3ef1fcc" 4123 resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4"
4040 integrity sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw== 4124 integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==
4041 dependencies: 4125 dependencies:
4042 asn1.js "^4.0.0" 4126 asn1.js "^5.2.0"
4043 browserify-aes "^1.0.0" 4127 browserify-aes "^1.0.0"
4044 create-hash "^1.1.0"
4045 evp_bytestokey "^1.0.0" 4128 evp_bytestokey "^1.0.0"
4046 pbkdf2 "^3.0.3" 4129 pbkdf2 "^3.0.3"
4047 safe-buffer "^5.1.1" 4130 safe-buffer "^5.1.1"
4048 4131
4132parse-entities@^2.0.0:
4133 version "2.0.0"
4134 resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8"
4135 integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==
4136 dependencies:
4137 character-entities "^1.0.0"
4138 character-entities-legacy "^1.0.0"
4139 character-reference-invalid "^1.0.0"
4140 is-alphanumerical "^1.0.0"
4141 is-decimal "^1.0.0"
4142 is-hexadecimal "^1.0.0"
4143
4049parse-json@^2.2.0: 4144parse-json@^2.2.0:
4050 version "2.2.0" 4145 version "2.2.0"
4051 resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" 4146 resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
@@ -4053,62 +4148,66 @@ parse-json@^2.2.0:
4053 dependencies: 4148 dependencies:
4054 error-ex "^1.2.0" 4149 error-ex "^1.2.0"
4055 4150
4151parse-json@^5.0.0:
4152 version "5.1.0"
4153 resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.1.0.tgz#f96088cdf24a8faa9aea9a009f2d9d942c999646"
4154 integrity sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==
4155 dependencies:
4156 "@babel/code-frame" "^7.0.0"
4157 error-ex "^1.3.1"
4158 json-parse-even-better-errors "^2.3.0"
4159 lines-and-columns "^1.1.6"
4160
4161parse-passwd@^1.0.0:
4162 version "1.0.0"
4163 resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6"
4164 integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=
4165
4056pascalcase@^0.1.1: 4166pascalcase@^0.1.1:
4057 version "0.1.1" 4167 version "0.1.1"
4058 resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" 4168 resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
4059 integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= 4169 integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=
4060 4170
4061path-browserify@0.0.0: 4171path-browserify@0.0.1:
4062 version "0.0.0" 4172 version "0.0.1"
4063 resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" 4173 resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a"
4064 integrity sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo= 4174 integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==
4065 4175
4066path-dirname@^1.0.0: 4176path-dirname@^1.0.0:
4067 version "1.0.2" 4177 version "1.0.2"
4068 resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" 4178 resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0"
4069 integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= 4179 integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=
4070 4180
4071path-exists@^2.0.0:
4072 version "2.1.0"
4073 resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b"
4074 integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=
4075 dependencies:
4076 pinkie-promise "^2.0.0"
4077
4078path-exists@^3.0.0: 4181path-exists@^3.0.0:
4079 version "3.0.0" 4182 version "3.0.0"
4080 resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" 4183 resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
4081 integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= 4184 integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=
4082 4185
4083path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: 4186path-exists@^4.0.0:
4187 version "4.0.0"
4188 resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
4189 integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
4190
4191path-is-absolute@^1.0.0:
4084 version "1.0.1" 4192 version "1.0.1"
4085 resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 4193 resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
4086 integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 4194 integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
4087 4195
4088path-is-inside@^1.0.1, path-is-inside@^1.0.2: 4196path-key@^2.0.1:
4089 version "1.0.2"
4090 resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53"
4091 integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=
4092
4093path-key@^2.0.0:
4094 version "2.0.1" 4197 version "2.0.1"
4095 resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" 4198 resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
4096 integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= 4199 integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=
4097 4200
4201path-key@^3.1.0:
4202 version "3.1.1"
4203 resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
4204 integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
4205
4098path-parse@^1.0.6: 4206path-parse@^1.0.6:
4099 version "1.0.6" 4207 version "1.0.6"
4100 resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" 4208 resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c"
4101 integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== 4209 integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==
4102 4210
4103path-type@^1.0.0:
4104 version "1.1.0"
4105 resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441"
4106 integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=
4107 dependencies:
4108 graceful-fs "^4.1.2"
4109 pify "^2.0.0"
4110 pinkie-promise "^2.0.0"
4111
4112path-type@^2.0.0: 4211path-type@^2.0.0:
4113 version "2.0.0" 4212 version "2.0.0"
4114 resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" 4213 resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73"
@@ -4116,10 +4215,15 @@ path-type@^2.0.0:
4116 dependencies: 4215 dependencies:
4117 pify "^2.0.0" 4216 pify "^2.0.0"
4118 4217
4218path-type@^4.0.0:
4219 version "4.0.0"
4220 resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
4221 integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
4222
4119pbkdf2@^3.0.3: 4223pbkdf2@^3.0.3:
4120 version "3.0.17" 4224 version "3.1.1"
4121 resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" 4225 resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.1.tgz#cb8724b0fada984596856d1a6ebafd3584654b94"
4122 integrity sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA== 4226 integrity sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==
4123 dependencies: 4227 dependencies:
4124 create-hash "^1.1.2" 4228 create-hash "^1.1.2"
4125 create-hmac "^1.1.4" 4229 create-hmac "^1.1.4"
@@ -4127,32 +4231,20 @@ pbkdf2@^3.0.3:
4127 safe-buffer "^5.0.1" 4231 safe-buffer "^5.0.1"
4128 sha.js "^2.4.8" 4232 sha.js "^2.4.8"
4129 4233
4130performance-now@^2.1.0: 4234picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1:
4131 version "2.1.0" 4235 version "2.2.2"
4132 resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" 4236 resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad"
4133 integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= 4237 integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==
4134 4238
4135pify@^2.0.0: 4239pify@^2.0.0:
4136 version "2.3.0" 4240 version "2.3.0"
4137 resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 4241 resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
4138 integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= 4242 integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw=
4139 4243
4140pify@^3.0.0: 4244pify@^4.0.1:
4141 version "3.0.0" 4245 version "4.0.1"
4142 resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" 4246 resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231"
4143 integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= 4247 integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==
4144
4145pinkie-promise@^2.0.0:
4146 version "2.0.1"
4147 resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
4148 integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o=
4149 dependencies:
4150 pinkie "^2.0.0"
4151
4152pinkie@^2.0.0:
4153 version "2.0.4"
4154 resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
4155 integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA=
4156 4248
4157pkg-dir@^2.0.0: 4249pkg-dir@^2.0.0:
4158 version "2.0.0" 4250 version "2.0.0"
@@ -4161,350 +4253,168 @@ pkg-dir@^2.0.0:
4161 dependencies: 4253 dependencies:
4162 find-up "^2.1.0" 4254 find-up "^2.1.0"
4163 4255
4164pluralize@^1.2.1: 4256pkg-dir@^3.0.0:
4165 version "1.2.1" 4257 version "3.0.0"
4166 resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45" 4258 resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3"
4167 integrity sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU= 4259 integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==
4260 dependencies:
4261 find-up "^3.0.0"
4168 4262
4169pluralize@^7.0.0: 4263pkg-dir@^4.1.0:
4170 version "7.0.0" 4264 version "4.2.0"
4171 resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" 4265 resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3"
4172 integrity sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow== 4266 integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==
4267 dependencies:
4268 find-up "^4.0.0"
4173 4269
4174posix-character-classes@^0.1.0: 4270posix-character-classes@^0.1.0:
4175 version "0.1.1" 4271 version "0.1.1"
4176 resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" 4272 resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
4177 integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= 4273 integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=
4178 4274
4179postcss-calc@^5.2.0: 4275postcss-html@^0.36.0:
4180 version "5.3.1" 4276 version "0.36.0"
4181 resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-5.3.1.tgz#77bae7ca928ad85716e2fda42f261bf7c1d65b5e" 4277 resolved "https://registry.yarnpkg.com/postcss-html/-/postcss-html-0.36.0.tgz#b40913f94eaacc2453fd30a1327ad6ee1f88b204"
4182 integrity sha1-d7rnypKK2FcW4v2kLyYb98HWW14= 4278 integrity sha512-HeiOxGcuwID0AFsNAL0ox3mW6MHH5cstWN1Z3Y+n6H+g12ih7LHdYxWwEA/QmrebctLjo79xz9ouK3MroHwOJw==
4183 dependencies:
4184 postcss "^5.0.2"
4185 postcss-message-helpers "^2.0.0"
4186 reduce-css-calc "^1.2.6"
4187
4188postcss-colormin@^2.1.8:
4189 version "2.2.2"
4190 resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-2.2.2.tgz#6631417d5f0e909a3d7ec26b24c8a8d1e4f96e4b"
4191 integrity sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks=
4192 dependencies:
4193 colormin "^1.0.5"
4194 postcss "^5.0.13"
4195 postcss-value-parser "^3.2.3"
4196
4197postcss-convert-values@^2.3.4:
4198 version "2.6.1"
4199 resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz#bbd8593c5c1fd2e3d1c322bb925dcae8dae4d62d"
4200 integrity sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0=
4201 dependencies:
4202 postcss "^5.0.11"
4203 postcss-value-parser "^3.1.2"
4204
4205postcss-discard-comments@^2.0.4:
4206 version "2.0.4"
4207 resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz#befe89fafd5b3dace5ccce51b76b81514be00e3d"
4208 integrity sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0=
4209 dependencies: 4279 dependencies:
4210 postcss "^5.0.14" 4280 htmlparser2 "^3.10.0"
4211 4281
4212postcss-discard-duplicates@^2.0.1: 4282postcss-less@^3.1.4:
4213 version "2.1.0" 4283 version "3.1.4"
4214 resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz#b9abf27b88ac188158a5eb12abcae20263b91932" 4284 resolved "https://registry.yarnpkg.com/postcss-less/-/postcss-less-3.1.4.tgz#369f58642b5928ef898ffbc1a6e93c958304c5ad"
4215 integrity sha1-uavye4isGIFYpesSq8riAmO5GTI= 4285 integrity sha512-7TvleQWNM2QLcHqvudt3VYjULVB49uiW6XzEUFmvwHzvsOEF5MwBrIXZDJQvJNFGjJQTzSzZnDoCJ8h/ljyGXA==
4216 dependencies: 4286 dependencies:
4217 postcss "^5.0.4" 4287 postcss "^7.0.14"
4218 4288
4219postcss-discard-empty@^2.0.1: 4289postcss-media-query-parser@^0.2.3:
4220 version "2.1.0" 4290 version "0.2.3"
4221 resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz#d2b4bd9d5ced5ebd8dcade7640c7d7cd7f4f92b5" 4291 resolved "https://registry.yarnpkg.com/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz#27b39c6f4d94f81b1a73b8f76351c609e5cef244"
4222 integrity sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU= 4292 integrity sha1-J7Ocb02U+Bsac7j3Y1HGCeXO8kQ=
4223 dependencies:
4224 postcss "^5.0.14"
4225
4226postcss-discard-overridden@^0.1.1:
4227 version "0.1.1"
4228 resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz#8b1eaf554f686fb288cd874c55667b0aa3668d58"
4229 integrity sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg=
4230 dependencies:
4231 postcss "^5.0.16"
4232
4233postcss-discard-unused@^2.2.1:
4234 version "2.2.3"
4235 resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz#bce30b2cc591ffc634322b5fb3464b6d934f4433"
4236 integrity sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM=
4237 dependencies:
4238 postcss "^5.0.14"
4239 uniqs "^2.0.0"
4240
4241postcss-filter-plugins@^2.0.0:
4242 version "2.0.3"
4243 resolved "https://registry.yarnpkg.com/postcss-filter-plugins/-/postcss-filter-plugins-2.0.3.tgz#82245fdf82337041645e477114d8e593aa18b8ec"
4244 integrity sha512-T53GVFsdinJhgwm7rg1BzbeBRomOg9y5MBVhGcsV0CxurUdVj1UlPdKtn7aqYA/c/QVkzKMjq2bSV5dKG5+AwQ==
4245 dependencies:
4246 postcss "^5.0.4"
4247
4248postcss-merge-idents@^2.1.5:
4249 version "2.1.7"
4250 resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz#4c5530313c08e1d5b3bbf3d2bbc747e278eea270"
4251 integrity sha1-TFUwMTwI4dWzu/PSu8dH4njuonA=
4252 dependencies:
4253 has "^1.0.1"
4254 postcss "^5.0.10"
4255 postcss-value-parser "^3.1.1"
4256
4257postcss-merge-longhand@^2.0.1:
4258 version "2.0.2"
4259 resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz#23d90cd127b0a77994915332739034a1a4f3d658"
4260 integrity sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg=
4261 dependencies:
4262 postcss "^5.0.4"
4263
4264postcss-merge-rules@^2.0.3:
4265 version "2.1.2"
4266 resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz#d1df5dfaa7b1acc3be553f0e9e10e87c61b5f721"
4267 integrity sha1-0d9d+qexrMO+VT8OnhDofGG19yE=
4268 dependencies:
4269 browserslist "^1.5.2"
4270 caniuse-api "^1.5.2"
4271 postcss "^5.0.4"
4272 postcss-selector-parser "^2.2.2"
4273 vendors "^1.0.0"
4274 4293
4275postcss-message-helpers@^2.0.0: 4294postcss-modules-extract-imports@^2.0.0:
4276 version "2.0.0" 4295 version "2.0.0"
4277 resolved "https://registry.yarnpkg.com/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz#a4f2f4fab6e4fe002f0aed000478cdf52f9ba60e" 4296 resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e"
4278 integrity sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4= 4297 integrity sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==
4279
4280postcss-minify-font-values@^1.0.2:
4281 version "1.0.5"
4282 resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz#4b58edb56641eba7c8474ab3526cafd7bbdecb69"
4283 integrity sha1-S1jttWZB66fIR0qzUmyv17vey2k=
4284 dependencies:
4285 object-assign "^4.0.1"
4286 postcss "^5.0.4"
4287 postcss-value-parser "^3.0.2"
4288
4289postcss-minify-gradients@^1.0.1:
4290 version "1.0.5"
4291 resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz#5dbda11373703f83cfb4a3ea3881d8d75ff5e6e1"
4292 integrity sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE=
4293 dependencies:
4294 postcss "^5.0.12"
4295 postcss-value-parser "^3.3.0"
4296
4297postcss-minify-params@^1.0.4:
4298 version "1.2.2"
4299 resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz#ad2ce071373b943b3d930a3fa59a358c28d6f1f3"
4300 integrity sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM=
4301 dependencies:
4302 alphanum-sort "^1.0.1"
4303 postcss "^5.0.2"
4304 postcss-value-parser "^3.0.2"
4305 uniqs "^2.0.0"
4306
4307postcss-minify-selectors@^2.0.4:
4308 version "2.1.1"
4309 resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz#b2c6a98c0072cf91b932d1a496508114311735bf"
4310 integrity sha1-ssapjAByz5G5MtGkllCBFDEXNb8=
4311 dependencies:
4312 alphanum-sort "^1.0.2"
4313 has "^1.0.1"
4314 postcss "^5.0.14"
4315 postcss-selector-parser "^2.0.0"
4316
4317postcss-modules-extract-imports@^1.2.0:
4318 version "1.2.1"
4319 resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz#dc87e34148ec7eab5f791f7cd5849833375b741a"
4320 integrity sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw==
4321 dependencies:
4322 postcss "^6.0.1"
4323
4324postcss-modules-local-by-default@^1.2.0:
4325 version "1.2.0"
4326 resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069"
4327 integrity sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=
4328 dependencies:
4329 css-selector-tokenizer "^0.7.0"
4330 postcss "^6.0.1"
4331
4332postcss-modules-scope@^1.1.0:
4333 version "1.1.0"
4334 resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90"
4335 integrity sha1-1upkmUx5+XtipytCb75gVqGUu5A=
4336 dependencies: 4298 dependencies:
4337 css-selector-tokenizer "^0.7.0" 4299 postcss "^7.0.5"
4338 postcss "^6.0.1"
4339 4300
4340postcss-modules-values@^1.3.0: 4301postcss-modules-local-by-default@^3.0.3:
4341 version "1.3.0" 4302 version "3.0.3"
4342 resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20" 4303 resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz#bb14e0cc78279d504dbdcbfd7e0ca28993ffbbb0"
4343 integrity sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA= 4304 integrity sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==
4344 dependencies: 4305 dependencies:
4345 icss-replace-symbols "^1.1.0" 4306 icss-utils "^4.1.1"
4346 postcss "^6.0.1" 4307 postcss "^7.0.32"
4308 postcss-selector-parser "^6.0.2"
4309 postcss-value-parser "^4.1.0"
4347 4310
4348postcss-normalize-charset@^1.1.0: 4311postcss-modules-scope@^2.2.0:
4349 version "1.1.1" 4312 version "2.2.0"
4350 resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz#ef9ee71212d7fe759c78ed162f61ed62b5cb93f1" 4313 resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz#385cae013cc7743f5a7d7602d1073a89eaae62ee"
4351 integrity sha1-757nEhLX/nWceO0WL2HtYrXLk/E= 4314 integrity sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==
4352 dependencies: 4315 dependencies:
4353 postcss "^5.0.5" 4316 postcss "^7.0.6"
4317 postcss-selector-parser "^6.0.0"
4354 4318
4355postcss-normalize-url@^3.0.7: 4319postcss-modules-values@^3.0.0:
4356 version "3.0.8" 4320 version "3.0.0"
4357 resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz#108f74b3f2fcdaf891a2ffa3ea4592279fc78222" 4321 resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz#5b5000d6ebae29b4255301b4a3a54574423e7f10"
4358 integrity sha1-EI90s/L82viRov+j6kWSJ5/HgiI= 4322 integrity sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==
4359 dependencies: 4323 dependencies:
4360 is-absolute-url "^2.0.0" 4324 icss-utils "^4.0.0"
4361 normalize-url "^1.4.0" 4325 postcss "^7.0.6"
4362 postcss "^5.0.14"
4363 postcss-value-parser "^3.2.3"
4364 4326
4365postcss-ordered-values@^2.1.0: 4327postcss-resolve-nested-selector@^0.1.1:
4366 version "2.2.3" 4328 version "0.1.1"
4367 resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz#eec6c2a67b6c412a8db2042e77fe8da43f95c11d" 4329 resolved "https://registry.yarnpkg.com/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz#29ccbc7c37dedfac304e9fff0bf1596b3f6a0e4e"
4368 integrity sha1-7sbCpntsQSqNsgQud/6NpD+VwR0= 4330 integrity sha1-Kcy8fDfe36wwTp//C/FZaz9qDk4=
4369 dependencies:
4370 postcss "^5.0.4"
4371 postcss-value-parser "^3.0.1"
4372 4331
4373postcss-reduce-idents@^2.2.2: 4332postcss-safe-parser@^4.0.2:
4374 version "2.4.0" 4333 version "4.0.2"
4375 resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz#c2c6d20cc958284f6abfbe63f7609bf409059ad3" 4334 resolved "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-4.0.2.tgz#a6d4e48f0f37d9f7c11b2a581bf00f8ba4870b96"
4376 integrity sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM= 4335 integrity sha512-Uw6ekxSWNLCPesSv/cmqf2bY/77z11O7jZGPax3ycZMFU/oi2DMH9i89AdHc1tRwFg/arFoEwX0IS3LCUxJh1g==
4377 dependencies: 4336 dependencies:
4378 postcss "^5.0.4" 4337 postcss "^7.0.26"
4379 postcss-value-parser "^3.0.2"
4380 4338
4381postcss-reduce-initial@^1.0.0: 4339postcss-sass@^0.4.4:
4382 version "1.0.1" 4340 version "0.4.4"
4383 resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz#68f80695f045d08263a879ad240df8dd64f644ea" 4341 resolved "https://registry.yarnpkg.com/postcss-sass/-/postcss-sass-0.4.4.tgz#91f0f3447b45ce373227a98b61f8d8f0785285a3"
4384 integrity sha1-aPgGlfBF0IJjqHmtJA343WT2ROo= 4342 integrity sha512-BYxnVYx4mQooOhr+zer0qWbSPYnarAy8ZT7hAQtbxtgVf8gy+LSLT/hHGe35h14/pZDTw1DsxdbrwxBN++H+fg==
4385 dependencies: 4343 dependencies:
4386 postcss "^5.0.4" 4344 gonzales-pe "^4.3.0"
4345 postcss "^7.0.21"
4387 4346
4388postcss-reduce-transforms@^1.0.3: 4347postcss-scss@^2.1.1:
4389 version "1.0.4" 4348 version "2.1.1"
4390 resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz#ff76f4d8212437b31c298a42d2e1444025771ae1" 4349 resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-2.1.1.tgz#ec3a75fa29a55e016b90bf3269026c53c1d2b383"
4391 integrity sha1-/3b02CEkN7McKYpC0uFEQCV3GuE= 4350 integrity sha512-jQmGnj0hSGLd9RscFw9LyuSVAa5Bl1/KBPqG1NQw9w8ND55nY4ZEsdlVuYJvLPpV+y0nwTV5v/4rHPzZRihQbA==
4392 dependencies: 4351 dependencies:
4393 has "^1.0.1" 4352 postcss "^7.0.6"
4394 postcss "^5.0.8"
4395 postcss-value-parser "^3.0.1"
4396 4353
4397postcss-selector-parser@^2.0.0, postcss-selector-parser@^2.2.2: 4354postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2:
4398 version "2.2.3" 4355 version "6.0.3"
4399 resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz#f9437788606c3c9acee16ffe8d8b16297f27bb90" 4356 resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.3.tgz#766d77728728817cc140fa1ac6da5e77f9fada98"
4400 integrity sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A= 4357 integrity sha512-0ClFaY4X1ra21LRqbW6y3rUbWcxnSVkDFG57R7Nxus9J9myPFlv+jYDMohzpkBx0RrjjiqjtycpchQ+PLGmZ9w==
4401 dependencies: 4358 dependencies:
4402 flatten "^1.0.2" 4359 cssesc "^3.0.0"
4403 indexes-of "^1.0.1" 4360 indexes-of "^1.0.1"
4404 uniq "^1.0.1" 4361 uniq "^1.0.1"
4362 util-deprecate "^1.0.2"
4405 4363
4406postcss-svgo@^2.1.1: 4364postcss-syntax@^0.36.2:
4407 version "2.1.6" 4365 version "0.36.2"
4408 resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-2.1.6.tgz#b6df18aa613b666e133f08adb5219c2684ac108d" 4366 resolved "https://registry.yarnpkg.com/postcss-syntax/-/postcss-syntax-0.36.2.tgz#f08578c7d95834574e5593a82dfbfa8afae3b51c"
4409 integrity sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0= 4367 integrity sha512-nBRg/i7E3SOHWxF3PpF5WnJM/jQ1YpY9000OaVXlAQj6Zp/kIqJxEDWIZ67tAd7NLuk7zqN4yqe9nc0oNAOs1w==
4410 dependencies:
4411 is-svg "^2.0.0"
4412 postcss "^5.0.14"
4413 postcss-value-parser "^3.2.3"
4414 svgo "^0.7.0"
4415
4416postcss-unique-selectors@^2.0.2:
4417 version "2.0.2"
4418 resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz#981d57d29ddcb33e7b1dfe1fd43b8649f933ca1d"
4419 integrity sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0=
4420 dependencies:
4421 alphanum-sort "^1.0.1"
4422 postcss "^5.0.4"
4423 uniqs "^2.0.0"
4424
4425postcss-value-parser@^3.0.1, postcss-value-parser@^3.0.2, postcss-value-parser@^3.1.1, postcss-value-parser@^3.1.2, postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0:
4426 version "3.3.1"
4427 resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281"
4428 integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==
4429 4368
4430postcss-zindex@^2.0.1: 4369postcss-value-parser@^4.1.0:
4431 version "2.2.0" 4370 version "4.1.0"
4432 resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-2.2.0.tgz#d2109ddc055b91af67fc4cb3b025946639d2af22" 4371 resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb"
4433 integrity sha1-0hCd3AVbka9n/EyzsCWUZjnSryI= 4372 integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==
4434 dependencies:
4435 has "^1.0.1"
4436 postcss "^5.0.4"
4437 uniqs "^2.0.0"
4438
4439postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0.14, postcss@^5.0.16, postcss@^5.0.2, postcss@^5.0.4, postcss@^5.0.5, postcss@^5.0.6, postcss@^5.0.8, postcss@^5.2.16:
4440 version "5.2.18"
4441 resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5"
4442 integrity sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==
4443 dependencies:
4444 chalk "^1.1.3"
4445 js-base64 "^2.1.9"
4446 source-map "^0.5.6"
4447 supports-color "^3.2.3"
4448 4373
4449postcss@^6.0.1: 4374postcss@^7.0.14, postcss@^7.0.2, postcss@^7.0.21, postcss@^7.0.26, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6:
4450 version "6.0.23" 4375 version "7.0.34"
4451 resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" 4376 resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.34.tgz#f2baf57c36010df7de4009940f21532c16d65c20"
4452 integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag== 4377 integrity sha512-H/7V2VeNScX9KE83GDrDZNiGT1m2H+UTnlinIzhjlLX9hfMUn1mHNnGeX81a1c8JSBdBvqk7c2ZOG6ZPn5itGw==
4453 dependencies: 4378 dependencies:
4454 chalk "^2.4.1" 4379 chalk "^2.4.2"
4455 source-map "^0.6.1" 4380 source-map "^0.6.1"
4456 supports-color "^5.4.0" 4381 supports-color "^6.1.0"
4457 4382
4458prelude-ls@~1.1.2: 4383prelude-ls@^1.2.1:
4459 version "1.1.2" 4384 version "1.2.1"
4460 resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" 4385 resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
4461 integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= 4386 integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
4462 4387
4463prepend-http@^1.0.0: 4388prepend-http@^1.0.0:
4464 version "1.0.4" 4389 version "1.0.4"
4465 resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" 4390 resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc"
4466 integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= 4391 integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=
4467 4392
4468private@^0.1.6, private@^0.1.8:
4469 version "0.1.8"
4470 resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
4471 integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==
4472
4473process-nextick-args@~2.0.0: 4393process-nextick-args@~2.0.0:
4474 version "2.0.0" 4394 version "2.0.1"
4475 resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" 4395 resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
4476 integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== 4396 integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
4477 4397
4478process@^0.11.10: 4398process@^0.11.10:
4479 version "0.11.10" 4399 version "0.11.10"
4480 resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" 4400 resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
4481 integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= 4401 integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI=
4482 4402
4483progress@^1.1.8:
4484 version "1.1.8"
4485 resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be"
4486 integrity sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=
4487
4488progress@^2.0.0: 4403progress@^2.0.0:
4489 version "2.0.3" 4404 version "2.0.3"
4490 resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" 4405 resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
4491 integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== 4406 integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
4492 4407
4408promise-inflight@^1.0.1:
4409 version "1.0.1"
4410 resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3"
4411 integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM=
4412
4493prr@~1.0.1: 4413prr@~1.0.1:
4494 version "1.0.1" 4414 version "1.0.1"
4495 resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" 4415 resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
4496 integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= 4416 integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY=
4497 4417
4498pseudomap@^1.0.2:
4499 version "1.0.2"
4500 resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
4501 integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM=
4502
4503psl@^1.1.24:
4504 version "1.1.31"
4505 resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.31.tgz#e9aa86d0101b5b105cbe93ac6b784cd547276184"
4506 integrity sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==
4507
4508public-encrypt@^4.0.0: 4418public-encrypt@^4.0.0:
4509 version "4.0.3" 4419 version "4.0.3"
4510 resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" 4420 resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0"
@@ -4517,12 +4427,37 @@ public-encrypt@^4.0.0:
4517 randombytes "^2.0.1" 4427 randombytes "^2.0.1"
4518 safe-buffer "^5.1.2" 4428 safe-buffer "^5.1.2"
4519 4429
4430pump@^2.0.0:
4431 version "2.0.1"
4432 resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909"
4433 integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==
4434 dependencies:
4435 end-of-stream "^1.1.0"
4436 once "^1.3.1"
4437
4438pump@^3.0.0:
4439 version "3.0.0"
4440 resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
4441 integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
4442 dependencies:
4443 end-of-stream "^1.1.0"
4444 once "^1.3.1"
4445
4446pumpify@^1.3.3:
4447 version "1.5.1"
4448 resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce"
4449 integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==
4450 dependencies:
4451 duplexify "^3.6.0"
4452 inherits "^2.0.3"
4453 pump "^2.0.0"
4454
4520punycode@1.3.2: 4455punycode@1.3.2:
4521 version "1.3.2" 4456 version "1.3.2"
4522 resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" 4457 resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
4523 integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= 4458 integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=
4524 4459
4525punycode@^1.2.4, punycode@^1.4.1: 4460punycode@^1.2.4:
4526 version "1.4.1" 4461 version "1.4.1"
4527 resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" 4462 resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
4528 integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= 4463 integrity sha1-wNWmOycYgArY4esPpSachN1BhF4=
@@ -4538,19 +4473,9 @@ pure-extras@^1.0.0:
4538 integrity sha1-N+PMNZDLqFCYFFTNpdso4npjhxo= 4473 integrity sha1-N+PMNZDLqFCYFFTNpdso4npjhxo=
4539 4474
4540purecss@^1.0.0: 4475purecss@^1.0.0:
4541 version "1.0.0" 4476 version "1.0.1"
4542 resolved "https://registry.yarnpkg.com/purecss/-/purecss-1.0.0.tgz#3dbcd9e2a7592448a69acb705cce16311bf4b785" 4477 resolved "https://registry.yarnpkg.com/purecss/-/purecss-1.0.1.tgz#c83d84326a10beb5c3b36d20c0254e946e5568a7"
4543 integrity sha512-gfC78WCOWNnfkzulx9aoWwcl+0JflhwKeJ+k9s/ZyIawfYNA4bqBmt0DtfgtQK9iuYMtGfbdE8R2AQMjSWR2VQ== 4478 integrity sha512-mTUc5ZzpzafswEhCmTDfSRMMyRFdLYdd+KywMwnBC/MuA/Th7jug2z0Xso4WkxvtxoU/BS9aRb7WnBNyuA7YJQ==
4544
4545q@^1.1.2:
4546 version "1.5.1"
4547 resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7"
4548 integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=
4549
4550qs@~6.5.2:
4551 version "6.5.2"
4552 resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
4553 integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==
4554 4479
4555query-string@^4.1.0: 4480query-string@^4.1.0:
4556 version "4.3.4" 4481 version "4.3.4"
@@ -4570,7 +4495,12 @@ querystring@0.2.0:
4570 resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" 4495 resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
4571 integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= 4496 integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=
4572 4497
4573randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: 4498quick-lru@^4.0.1:
4499 version "4.0.1"
4500 resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f"
4501 integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==
4502
4503randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0:
4574 version "2.1.0" 4504 version "2.1.0"
4575 resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" 4505 resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
4576 integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== 4506 integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==
@@ -4585,24 +4515,6 @@ randomfill@^1.0.3:
4585 randombytes "^2.0.5" 4515 randombytes "^2.0.5"
4586 safe-buffer "^5.1.0" 4516 safe-buffer "^5.1.0"
4587 4517
4588rc@^1.2.7:
4589 version "1.2.8"
4590 resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
4591 integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==
4592 dependencies:
4593 deep-extend "^0.6.0"
4594 ini "~1.3.0"
4595 minimist "^1.2.0"
4596 strip-json-comments "~2.0.1"
4597
4598read-pkg-up@^1.0.1:
4599 version "1.0.1"
4600 resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02"
4601 integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=
4602 dependencies:
4603 find-up "^1.0.0"
4604 read-pkg "^1.0.0"
4605
4606read-pkg-up@^2.0.0: 4518read-pkg-up@^2.0.0:
4607 version "2.0.0" 4519 version "2.0.0"
4608 resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" 4520 resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be"
@@ -4611,14 +4523,14 @@ read-pkg-up@^2.0.0:
4611 find-up "^2.0.0" 4523 find-up "^2.0.0"
4612 read-pkg "^2.0.0" 4524 read-pkg "^2.0.0"
4613 4525
4614read-pkg@^1.0.0: 4526read-pkg-up@^7.0.1:
4615 version "1.1.0" 4527 version "7.0.1"
4616 resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" 4528 resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507"
4617 integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= 4529 integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==
4618 dependencies: 4530 dependencies:
4619 load-json-file "^1.0.0" 4531 find-up "^4.1.0"
4620 normalize-package-data "^2.3.2" 4532 read-pkg "^5.2.0"
4621 path-type "^1.0.0" 4533 type-fest "^0.8.1"
4622 4534
4623read-pkg@^2.0.0: 4535read-pkg@^2.0.0:
4624 version "2.0.0" 4536 version "2.0.0"
@@ -4629,10 +4541,20 @@ read-pkg@^2.0.0:
4629 normalize-package-data "^2.3.2" 4541 normalize-package-data "^2.3.2"
4630 path-type "^2.0.0" 4542 path-type "^2.0.0"
4631 4543
4632readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6: 4544read-pkg@^5.2.0:
4633 version "2.3.6" 4545 version "5.2.0"
4634 resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" 4546 resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc"
4635 integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== 4547 integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==
4548 dependencies:
4549 "@types/normalize-package-data" "^2.4.0"
4550 normalize-package-data "^2.5.0"
4551 parse-json "^5.0.0"
4552 type-fest "^0.6.0"
4553
4554"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6:
4555 version "2.3.7"
4556 resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57"
4557 integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==
4636 dependencies: 4558 dependencies:
4637 core-util-is "~1.0.0" 4559 core-util-is "~1.0.0"
4638 inherits "~2.0.3" 4560 inherits "~2.0.3"
@@ -4642,6 +4564,15 @@ readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable
4642 string_decoder "~1.1.1" 4564 string_decoder "~1.1.1"
4643 util-deprecate "~1.0.1" 4565 util-deprecate "~1.0.1"
4644 4566
4567readable-stream@^3.1.1, readable-stream@^3.6.0:
4568 version "3.6.0"
4569 resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
4570 integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
4571 dependencies:
4572 inherits "^2.0.3"
4573 string_decoder "^1.1.1"
4574 util-deprecate "^1.0.1"
4575
4645readdirp@^2.2.1: 4576readdirp@^2.2.1:
4646 version "2.2.1" 4577 version "2.2.1"
4647 resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" 4578 resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525"
@@ -4651,57 +4582,44 @@ readdirp@^2.2.1:
4651 micromatch "^3.1.10" 4582 micromatch "^3.1.10"
4652 readable-stream "^2.0.2" 4583 readable-stream "^2.0.2"
4653 4584
4654readline2@^1.0.1: 4585readdirp@~3.4.0:
4655 version "1.0.1" 4586 version "3.4.0"
4656 resolved "https://registry.yarnpkg.com/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35" 4587 resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.4.0.tgz#9fdccdf9e9155805449221ac645e8303ab5b9ada"
4657 integrity sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU= 4588 integrity sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==
4658 dependencies:
4659 code-point-at "^1.0.0"
4660 is-fullwidth-code-point "^1.0.0"
4661 mute-stream "0.0.5"
4662
4663redent@^1.0.0:
4664 version "1.0.0"
4665 resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde"
4666 integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=
4667 dependencies: 4589 dependencies:
4668 indent-string "^2.1.0" 4590 picomatch "^2.2.1"
4669 strip-indent "^1.0.1"
4670 4591
4671reduce-css-calc@^1.2.6: 4592redent@^3.0.0:
4672 version "1.3.0" 4593 version "3.0.0"
4673 resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz#747c914e049614a4c9cfbba629871ad1d2927716" 4594 resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f"
4674 integrity sha1-dHyRTgSWFKTJz7umKYca0dKSdxY= 4595 integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==
4675 dependencies: 4596 dependencies:
4676 balanced-match "^0.4.2" 4597 indent-string "^4.0.0"
4677 math-expression-evaluator "^1.2.14" 4598 strip-indent "^3.0.0"
4678 reduce-function-call "^1.0.1"
4679 4599
4680reduce-function-call@^1.0.1: 4600regenerate-unicode-properties@^8.2.0:
4681 version "1.0.2" 4601 version "8.2.0"
4682 resolved "https://registry.yarnpkg.com/reduce-function-call/-/reduce-function-call-1.0.2.tgz#5a200bf92e0e37751752fe45b0ab330fd4b6be99" 4602 resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec"
4683 integrity sha1-WiAL+S4ON3UXUv5FsKszD9S2vpk= 4603 integrity sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==
4684 dependencies: 4604 dependencies:
4685 balanced-match "^0.4.2" 4605 regenerate "^1.4.0"
4686 4606
4687regenerate@^1.2.1: 4607regenerate@^1.4.0:
4688 version "1.4.0" 4608 version "1.4.1"
4689 resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" 4609 resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.1.tgz#cad92ad8e6b591773485fbe05a485caf4f457e6f"
4690 integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== 4610 integrity sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A==
4691 4611
4692regenerator-runtime@^0.11.0: 4612regenerator-runtime@^0.13.4:
4693 version "0.11.1" 4613 version "0.13.7"
4694 resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" 4614 resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55"
4695 integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== 4615 integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==
4696 4616
4697regenerator-transform@^0.10.0: 4617regenerator-transform@^0.14.2:
4698 version "0.10.1" 4618 version "0.14.5"
4699 resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" 4619 resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4"
4700 integrity sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q== 4620 integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==
4701 dependencies: 4621 dependencies:
4702 babel-runtime "^6.18.0" 4622 "@babel/runtime" "^7.8.4"
4703 babel-types "^6.19.0"
4704 private "^0.1.6"
4705 4623
4706regex-not@^1.0.0, regex-not@^1.0.2: 4624regex-not@^1.0.0, regex-not@^1.0.2:
4707 version "1.0.2" 4625 version "1.0.2"
@@ -4711,41 +4629,86 @@ regex-not@^1.0.0, regex-not@^1.0.2:
4711 extend-shallow "^3.0.2" 4629 extend-shallow "^3.0.2"
4712 safe-regex "^1.1.0" 4630 safe-regex "^1.1.0"
4713 4631
4714regexpp@^1.0.1: 4632regexpp@^3.1.0:
4715 version "1.1.0" 4633 version "3.1.0"
4716 resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-1.1.0.tgz#0e3516dd0b7904f413d2d4193dce4618c3a689ab" 4634 resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2"
4717 integrity sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw== 4635 integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==
4718 4636
4719regexpu-core@^1.0.0: 4637regexpu-core@^4.7.0:
4720 version "1.0.0" 4638 version "4.7.1"
4721 resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz#86a763f58ee4d7c2f6b102e4764050de7ed90c6b" 4639 resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.1.tgz#2dea5a9a07233298fbf0db91fa9abc4c6e0f8ad6"
4722 integrity sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs= 4640 integrity sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==
4723 dependencies: 4641 dependencies:
4724 regenerate "^1.2.1" 4642 regenerate "^1.4.0"
4725 regjsgen "^0.2.0" 4643 regenerate-unicode-properties "^8.2.0"
4726 regjsparser "^0.1.4" 4644 regjsgen "^0.5.1"
4727 4645 regjsparser "^0.6.4"
4728regexpu-core@^2.0.0: 4646 unicode-match-property-ecmascript "^1.0.4"
4729 version "2.0.0" 4647 unicode-match-property-value-ecmascript "^1.2.0"
4730 resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" 4648
4731 integrity sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA= 4649regjsgen@^0.5.1:
4732 dependencies: 4650 version "0.5.2"
4733 regenerate "^1.2.1" 4651 resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733"
4734 regjsgen "^0.2.0" 4652 integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==
4735 regjsparser "^0.1.4"
4736
4737regjsgen@^0.2.0:
4738 version "0.2.0"
4739 resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7"
4740 integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=
4741 4653
4742regjsparser@^0.1.4: 4654regjsparser@^0.6.4:
4743 version "0.1.5" 4655 version "0.6.4"
4744 resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" 4656 resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.4.tgz#a769f8684308401a66e9b529d2436ff4d0666272"
4745 integrity sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw= 4657 integrity sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==
4746 dependencies: 4658 dependencies:
4747 jsesc "~0.5.0" 4659 jsesc "~0.5.0"
4748 4660
4661remark-parse@^8.0.0:
4662 version "8.0.3"
4663 resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-8.0.3.tgz#9c62aa3b35b79a486454c690472906075f40c7e1"
4664 integrity sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==
4665 dependencies:
4666 ccount "^1.0.0"
4667 collapse-white-space "^1.0.2"
4668 is-alphabetical "^1.0.0"
4669 is-decimal "^1.0.0"
4670 is-whitespace-character "^1.0.0"
4671 is-word-character "^1.0.0"
4672 markdown-escapes "^1.0.0"
4673 parse-entities "^2.0.0"
4674 repeat-string "^1.5.4"
4675 state-toggle "^1.0.0"
4676 trim "0.0.1"
4677 trim-trailing-lines "^1.0.0"
4678 unherit "^1.0.4"
4679 unist-util-remove-position "^2.0.0"
4680 vfile-location "^3.0.0"
4681 xtend "^4.0.1"
4682
4683remark-stringify@^8.0.0:
4684 version "8.1.1"
4685 resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-8.1.1.tgz#e2a9dc7a7bf44e46a155ec78996db896780d8ce5"
4686 integrity sha512-q4EyPZT3PcA3Eq7vPpT6bIdokXzFGp9i85igjmhRyXWmPs0Y6/d2FYwUNotKAWyLch7g0ASZJn/KHHcHZQ163A==
4687 dependencies:
4688 ccount "^1.0.0"
4689 is-alphanumeric "^1.0.0"
4690 is-decimal "^1.0.0"
4691 is-whitespace-character "^1.0.0"
4692 longest-streak "^2.0.1"
4693 markdown-escapes "^1.0.0"
4694 markdown-table "^2.0.0"
4695 mdast-util-compact "^2.0.0"
4696 parse-entities "^2.0.0"
4697 repeat-string "^1.5.4"
4698 state-toggle "^1.0.0"
4699 stringify-entities "^3.0.0"
4700 unherit "^1.0.4"
4701 xtend "^4.0.1"
4702
4703remark@^12.0.0:
4704 version "12.0.1"
4705 resolved "https://registry.yarnpkg.com/remark/-/remark-12.0.1.tgz#f1ddf68db7be71ca2bad0a33cd3678b86b9c709f"
4706 integrity sha512-gS7HDonkdIaHmmP/+shCPejCEEW+liMp/t/QwmF0Xt47Rpuhl32lLtDV1uKWvGoq+kxr5jSgg5oAIpGuyULjUw==
4707 dependencies:
4708 remark-parse "^8.0.0"
4709 remark-stringify "^8.0.0"
4710 unified "^9.0.0"
4711
4749remove-trailing-separator@^1.0.1: 4712remove-trailing-separator@^1.0.1:
4750 version "1.1.0" 4713 version "1.1.0"
4751 resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" 4714 resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
@@ -4756,114 +4719,99 @@ repeat-element@^1.1.2:
4756 resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" 4719 resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce"
4757 integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== 4720 integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==
4758 4721
4759repeat-string@^1.5.2, repeat-string@^1.6.1: 4722repeat-string@^1.0.0, repeat-string@^1.5.4, repeat-string@^1.6.1:
4760 version "1.6.1" 4723 version "1.6.1"
4761 resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" 4724 resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
4762 integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= 4725 integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc=
4763 4726
4764repeating@^2.0.0: 4727replace-ext@1.0.0:
4765 version "2.0.1" 4728 version "1.0.0"
4766 resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" 4729 resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb"
4767 integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= 4730 integrity sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=
4768 dependencies:
4769 is-finite "^1.0.0"
4770
4771request@^2.87.0, request@^2.88.0:
4772 version "2.88.0"
4773 resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef"
4774 integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==
4775 dependencies:
4776 aws-sign2 "~0.7.0"
4777 aws4 "^1.8.0"
4778 caseless "~0.12.0"
4779 combined-stream "~1.0.6"
4780 extend "~3.0.2"
4781 forever-agent "~0.6.1"
4782 form-data "~2.3.2"
4783 har-validator "~5.1.0"
4784 http-signature "~1.2.0"
4785 is-typedarray "~1.0.0"
4786 isstream "~0.1.2"
4787 json-stringify-safe "~5.0.1"
4788 mime-types "~2.1.19"
4789 oauth-sign "~0.9.0"
4790 performance-now "^2.1.0"
4791 qs "~6.5.2"
4792 safe-buffer "^5.1.2"
4793 tough-cookie "~2.4.3"
4794 tunnel-agent "^0.6.0"
4795 uuid "^3.3.2"
4796 4731
4797require-directory@^2.1.1: 4732require-directory@^2.1.1:
4798 version "2.1.1" 4733 version "2.1.1"
4799 resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 4734 resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
4800 integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= 4735 integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I=
4801 4736
4802require-main-filename@^1.0.1: 4737require-main-filename@^2.0.0:
4803 version "1.0.1" 4738 version "2.0.0"
4804 resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" 4739 resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b"
4805 integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= 4740 integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==
4806 4741
4807require-uncached@^1.0.2, require-uncached@^1.0.3: 4742resolve-cwd@^2.0.0:
4808 version "1.0.3" 4743 version "2.0.0"
4809 resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" 4744 resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a"
4810 integrity sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM= 4745 integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=
4811 dependencies: 4746 dependencies:
4812 caller-path "^0.1.0" 4747 resolve-from "^3.0.0"
4813 resolve-from "^1.0.0"
4814 4748
4815resolve-from@^1.0.0: 4749resolve-dir@^1.0.0, resolve-dir@^1.0.1:
4816 version "1.0.1" 4750 version "1.0.1"
4817 resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" 4751 resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43"
4818 integrity sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY= 4752 integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=
4753 dependencies:
4754 expand-tilde "^2.0.0"
4755 global-modules "^1.0.0"
4756
4757resolve-from@^3.0.0:
4758 version "3.0.0"
4759 resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748"
4760 integrity sha1-six699nWiBvItuZTM17rywoYh0g=
4761
4762resolve-from@^4.0.0:
4763 version "4.0.0"
4764 resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
4765 integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
4766
4767resolve-from@^5.0.0:
4768 version "5.0.0"
4769 resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69"
4770 integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==
4819 4771
4820resolve-url@^0.2.1: 4772resolve-url@^0.2.1:
4821 version "0.2.1" 4773 version "0.2.1"
4822 resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" 4774 resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
4823 integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= 4775 integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
4824 4776
4825resolve@^1.10.0, resolve@^1.5.0: 4777resolve@^1.10.0, resolve@^1.13.1, resolve@^1.17.0, resolve@^1.3.2:
4826 version "1.11.0" 4778 version "1.17.0"
4827 resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.11.0.tgz#4014870ba296176b86343d50b60f3b50609ce232" 4779 resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444"
4828 integrity sha512-WL2pBDjqT6pGUNSUzMw00o4T7If+z4H2x3Gz893WoUQ5KW8Vr9txp00ykiP16VBaZF5+j/OcXJHZ9+PCvdiDKw== 4780 integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==
4829 dependencies: 4781 dependencies:
4830 path-parse "^1.0.6" 4782 path-parse "^1.0.6"
4831 4783
4832restore-cursor@^1.0.1:
4833 version "1.0.1"
4834 resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541"
4835 integrity sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=
4836 dependencies:
4837 exit-hook "^1.0.0"
4838 onetime "^1.0.0"
4839
4840restore-cursor@^2.0.0:
4841 version "2.0.0"
4842 resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf"
4843 integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368=
4844 dependencies:
4845 onetime "^2.0.0"
4846 signal-exit "^3.0.2"
4847
4848ret@~0.1.10: 4784ret@~0.1.10:
4849 version "0.1.15" 4785 version "0.1.15"
4850 resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" 4786 resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
4851 integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== 4787 integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==
4852 4788
4853right-align@^0.1.1: 4789reusify@^1.0.4:
4854 version "0.1.3" 4790 version "1.0.4"
4855 resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" 4791 resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
4856 integrity sha1-YTObci/mo1FWiSENJOFMlhSGE+8= 4792 integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
4857 dependencies:
4858 align-text "^0.1.1"
4859 4793
4860rimraf@2, rimraf@^2.6.1, rimraf@~2.6.2: 4794rimraf@2.6.3:
4861 version "2.6.3" 4795 version "2.6.3"
4862 resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" 4796 resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab"
4863 integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== 4797 integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==
4864 dependencies: 4798 dependencies:
4865 glob "^7.1.3" 4799 glob "^7.1.3"
4866 4800
4801rimraf@^2.5.4, rimraf@^2.6.3:
4802 version "2.7.1"
4803 resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
4804 integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==
4805 dependencies:
4806 glob "^7.1.3"
4807
4808rimraf@^3.0.2:
4809 version "3.0.2"
4810 resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
4811 integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
4812 dependencies:
4813 glob "^7.1.3"
4814
4867ripemd160@^2.0.0, ripemd160@^2.0.1: 4815ripemd160@^2.0.0, ripemd160@^2.0.1:
4868 version "2.0.2" 4816 version "2.0.2"
4869 resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" 4817 resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c"
@@ -4872,38 +4820,24 @@ ripemd160@^2.0.0, ripemd160@^2.0.1:
4872 hash-base "^3.0.0" 4820 hash-base "^3.0.0"
4873 inherits "^2.0.1" 4821 inherits "^2.0.1"
4874 4822
4875run-async@^0.1.0: 4823run-parallel@^1.1.9:
4876 version "0.1.0" 4824 version "1.1.9"
4877 resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389" 4825 resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679"
4878 integrity sha1-yK1KXhEGYeQCp9IbUw4AnyX444k= 4826 integrity sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==
4879 dependencies:
4880 once "^1.3.0"
4881
4882run-async@^2.2.0:
4883 version "2.3.0"
4884 resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0"
4885 integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA=
4886 dependencies:
4887 is-promise "^2.1.0"
4888 4827
4889rx-lite-aggregates@^4.0.8: 4828run-queue@^1.0.0, run-queue@^1.0.3:
4890 version "4.0.8" 4829 version "1.0.3"
4891 resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" 4830 resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47"
4892 integrity sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74= 4831 integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=
4893 dependencies: 4832 dependencies:
4894 rx-lite "*" 4833 aproba "^1.1.1"
4895
4896rx-lite@*, rx-lite@^4.0.8:
4897 version "4.0.8"
4898 resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444"
4899 integrity sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=
4900 4834
4901rx-lite@^3.1.2: 4835safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0:
4902 version "3.1.2" 4836 version "5.2.1"
4903 resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102" 4837 resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
4904 integrity sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI= 4838 integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
4905 4839
4906safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: 4840safe-buffer@~5.1.0, safe-buffer@~5.1.1:
4907 version "5.1.2" 4841 version "5.1.2"
4908 resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 4842 resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
4909 integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 4843 integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
@@ -4915,63 +4849,28 @@ safe-regex@^1.1.0:
4915 dependencies: 4849 dependencies:
4916 ret "~0.1.10" 4850 ret "~0.1.10"
4917 4851
4918"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: 4852safer-buffer@^2.1.0:
4919 version "2.1.2" 4853 version "2.1.2"
4920 resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 4854 resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
4921 integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 4855 integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
4922 4856
4923sass-graph@^2.2.4: 4857sass-loader@^10.0.2:
4924 version "2.2.4" 4858 version "10.0.2"
4925 resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.4.tgz#13fbd63cd1caf0908b9fd93476ad43a51d1e0b49" 4859 resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-10.0.2.tgz#c7b73010848b264792dd45372eea0b87cba4401e"
4926 integrity sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k= 4860 integrity sha512-wV6NDUVB8/iEYMalV/+139+vl2LaRFlZGEd5/xmdcdzQcgmis+npyco6NsDTVOlNA3y2NV9Gcz+vHyFMIT+ffg==
4927 dependencies:
4928 glob "^7.0.0"
4929 lodash "^4.0.0"
4930 scss-tokenizer "^0.2.3"
4931 yargs "^7.0.0"
4932
4933sass-lint@^1.12.1:
4934 version "1.13.1"
4935 resolved "https://registry.yarnpkg.com/sass-lint/-/sass-lint-1.13.1.tgz#5fd2b2792e9215272335eb0f0dc607f61e8acc8f"
4936 integrity sha512-DSyah8/MyjzW2BWYmQWekYEKir44BpLqrCFsgs9iaWiVTcwZfwXHF586hh3D1n+/9ihUNMfd8iHAyb9KkGgs7Q==
4937 dependencies:
4938 commander "^2.8.1"
4939 eslint "^2.7.0"
4940 front-matter "2.1.2"
4941 fs-extra "^3.0.1"
4942 glob "^7.0.0"
4943 globule "^1.0.0"
4944 gonzales-pe-sl "^4.2.3"
4945 js-yaml "^3.5.4"
4946 known-css-properties "^0.3.0"
4947 lodash.capitalize "^4.1.0"
4948 lodash.kebabcase "^4.0.0"
4949 merge "^1.2.0"
4950 path-is-absolute "^1.0.0"
4951 util "^0.10.3"
4952
4953sass-loader@^6.0.6:
4954 version "6.0.7"
4955 resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-6.0.7.tgz#dd2fdb3e7eeff4a53f35ba6ac408715488353d00"
4956 integrity sha512-JoiyD00Yo1o61OJsoP2s2kb19L1/Y2p3QFcCdWdF6oomBGKVYuZyqHWemRBfQ2uGYsk+CH3eCguXNfpjzlcpaA==
4957 dependencies: 4861 dependencies:
4958 clone-deep "^2.0.1" 4862 klona "^2.0.3"
4959 loader-utils "^1.0.1" 4863 loader-utils "^2.0.0"
4960 lodash.tail "^4.1.1" 4864 neo-async "^2.6.2"
4961 neo-async "^2.5.0" 4865 schema-utils "^2.7.1"
4962 pify "^3.0.0" 4866 semver "^7.3.2"
4963
4964sax@^1.2.4, sax@~1.2.1:
4965 version "1.2.4"
4966 resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
4967 integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
4968 4867
4969schema-utils@^0.3.0: 4868sass@^1.26.11:
4970 version "0.3.0" 4869 version "1.26.11"
4971 resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.3.0.tgz#f5877222ce3e931edae039f17eb3716e7137f8cf" 4870 resolved "https://registry.yarnpkg.com/sass/-/sass-1.26.11.tgz#0f22cc4ab2ba27dad1d4ca30837beb350b709847"
4972 integrity sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8= 4871 integrity sha512-W1l/+vjGjIamsJ6OnTe0K37U2DBO/dgsv2Z4c89XQ8ZOO6l/VwkqwLSqoYzJeJs6CLuGSTRWc91GbQFL3lvrvw==
4973 dependencies: 4872 dependencies:
4974 ajv "^5.0.0" 4873 chokidar ">=2.0.0 <4.0.0"
4975 4874
4976schema-utils@^0.4.5: 4875schema-utils@^0.4.5:
4977 version "0.4.7" 4876 version "0.4.7"
@@ -4981,43 +4880,67 @@ schema-utils@^0.4.5:
4981 ajv "^6.1.0" 4880 ajv "^6.1.0"
4982 ajv-keywords "^3.1.0" 4881 ajv-keywords "^3.1.0"
4983 4882
4984scss-tokenizer@^0.2.3: 4883schema-utils@^1.0.0:
4985 version "0.2.3" 4884 version "1.0.0"
4986 resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1" 4885 resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770"
4987 integrity sha1-jrBtualyMzOCTT9VMGQRSYR85dE= 4886 integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==
4988 dependencies: 4887 dependencies:
4989 js-base64 "^2.1.8" 4888 ajv "^6.1.0"
4990 source-map "^0.4.2" 4889 ajv-errors "^1.0.0"
4890 ajv-keywords "^3.1.0"
4991 4891
4992"semver@2 || 3 || 4 || 5", semver@^5.3.0: 4892schema-utils@^2.6.5, schema-utils@^2.7.1:
4993 version "5.7.0" 4893 version "2.7.1"
4994 resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" 4894 resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7"
4995 integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== 4895 integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==
4896 dependencies:
4897 "@types/json-schema" "^7.0.5"
4898 ajv "^6.12.4"
4899 ajv-keywords "^3.5.2"
4996 4900
4997semver@~5.3.0: 4901"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.6.0:
4998 version "5.3.0" 4902 version "5.7.1"
4999 resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" 4903 resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
5000 integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8= 4904 integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
5001 4905
5002set-blocking@^2.0.0, set-blocking@~2.0.0: 4906semver@7.0.0:
5003 version "2.0.0" 4907 version "7.0.0"
5004 resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 4908 resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e"
5005 integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= 4909 integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==
4910
4911semver@^6.0.0:
4912 version "6.3.0"
4913 resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
4914 integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
5006 4915
5007set-value@^0.4.3: 4916semver@^7.2.1, semver@^7.3.2:
5008 version "0.4.3" 4917 version "7.3.2"
5009 resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" 4918 resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938"
5010 integrity sha1-fbCPnT0i3H945Trzw79GZuzfzPE= 4919 integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==
4920
4921serialize-javascript@^4.0.0:
4922 version "4.0.0"
4923 resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa"
4924 integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==
5011 dependencies: 4925 dependencies:
5012 extend-shallow "^2.0.1" 4926 randombytes "^2.1.0"
5013 is-extendable "^0.1.1"
5014 is-plain-object "^2.0.1"
5015 to-object-path "^0.3.0"
5016 4927
5017set-value@^2.0.0: 4928serialize-javascript@^5.0.1:
4929 version "5.0.1"
4930 resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4"
4931 integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==
4932 dependencies:
4933 randombytes "^2.1.0"
4934
4935set-blocking@^2.0.0:
5018 version "2.0.0" 4936 version "2.0.0"
5019 resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" 4937 resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
5020 integrity sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg== 4938 integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc=
4939
4940set-value@^2.0.0, set-value@^2.0.1:
4941 version "2.0.1"
4942 resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b"
4943 integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==
5021 dependencies: 4944 dependencies:
5022 extend-shallow "^2.0.1" 4945 extend-shallow "^2.0.1"
5023 is-extendable "^0.1.1" 4946 is-extendable "^0.1.1"
@@ -5037,15 +4960,6 @@ sha.js@^2.4.0, sha.js@^2.4.8:
5037 inherits "^2.0.1" 4960 inherits "^2.0.1"
5038 safe-buffer "^5.0.1" 4961 safe-buffer "^5.0.1"
5039 4962
5040shallow-clone@^1.0.0:
5041 version "1.0.0"
5042 resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-1.0.0.tgz#4480cd06e882ef68b2ad88a3ea54832e2c48b571"
5043 integrity sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA==
5044 dependencies:
5045 is-extendable "^0.1.1"
5046 kind-of "^5.0.0"
5047 mixin-object "^2.0.1"
5048
5049shebang-command@^1.2.0: 4963shebang-command@^1.2.0:
5050 version "1.2.0" 4964 version "1.2.0"
5051 resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 4965 resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
@@ -5053,38 +4967,51 @@ shebang-command@^1.2.0:
5053 dependencies: 4967 dependencies:
5054 shebang-regex "^1.0.0" 4968 shebang-regex "^1.0.0"
5055 4969
4970shebang-command@^2.0.0:
4971 version "2.0.0"
4972 resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
4973 integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
4974 dependencies:
4975 shebang-regex "^3.0.0"
4976
5056shebang-regex@^1.0.0: 4977shebang-regex@^1.0.0:
5057 version "1.0.0" 4978 version "1.0.0"
5058 resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 4979 resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
5059 integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= 4980 integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=
5060 4981
5061shelljs@^0.6.0: 4982shebang-regex@^3.0.0:
5062 version "0.6.1" 4983 version "3.0.0"
5063 resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.6.1.tgz#ec6211bed1920442088fe0f70b2837232ed2c8a8" 4984 resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
5064 integrity sha1-7GIRvtGSBEIIj+D3Cyg3Iy7SyKg= 4985 integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
5065
5066signal-exit@^3.0.0, signal-exit@^3.0.2:
5067 version "3.0.2"
5068 resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
5069 integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=
5070 4986
5071slash@^1.0.0: 4987signal-exit@^3.0.2:
5072 version "1.0.0" 4988 version "3.0.3"
5073 resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" 4989 resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c"
5074 integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= 4990 integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==
5075 4991
5076slice-ansi@0.0.4: 4992slash@^3.0.0:
5077 version "0.0.4" 4993 version "3.0.0"
5078 resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" 4994 resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
5079 integrity sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU= 4995 integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
5080 4996
5081slice-ansi@1.0.0: 4997slice-ansi@^2.1.0:
5082 version "1.0.0" 4998 version "2.1.0"
5083 resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" 4999 resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636"
5084 integrity sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg== 5000 integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==
5085 dependencies: 5001 dependencies:
5002 ansi-styles "^3.2.0"
5003 astral-regex "^1.0.0"
5086 is-fullwidth-code-point "^2.0.0" 5004 is-fullwidth-code-point "^2.0.0"
5087 5005
5006slice-ansi@^4.0.0:
5007 version "4.0.0"
5008 resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b"
5009 integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==
5010 dependencies:
5011 ansi-styles "^4.0.0"
5012 astral-regex "^2.0.0"
5013 is-fullwidth-code-point "^3.0.0"
5014
5088snapdragon-node@^2.0.1: 5015snapdragon-node@^2.0.1:
5089 version "2.1.1" 5016 version "2.1.1"
5090 resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" 5017 resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
@@ -5128,70 +5055,69 @@ source-list-map@^2.0.0:
5128 integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== 5055 integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==
5129 5056
5130source-map-resolve@^0.5.0: 5057source-map-resolve@^0.5.0:
5131 version "0.5.2" 5058 version "0.5.3"
5132 resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" 5059 resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a"
5133 integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== 5060 integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==
5134 dependencies: 5061 dependencies:
5135 atob "^2.1.1" 5062 atob "^2.1.2"
5136 decode-uri-component "^0.2.0" 5063 decode-uri-component "^0.2.0"
5137 resolve-url "^0.2.1" 5064 resolve-url "^0.2.1"
5138 source-map-url "^0.4.0" 5065 source-map-url "^0.4.0"
5139 urix "^0.1.0" 5066 urix "^0.1.0"
5140 5067
5141source-map-support@^0.4.15: 5068source-map-support@~0.5.12:
5142 version "0.4.18" 5069 version "0.5.19"
5143 resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" 5070 resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61"
5144 integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA== 5071 integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==
5145 dependencies: 5072 dependencies:
5146 source-map "^0.5.6" 5073 buffer-from "^1.0.0"
5074 source-map "^0.6.0"
5147 5075
5148source-map-url@^0.4.0: 5076source-map-url@^0.4.0:
5149 version "0.4.0" 5077 version "0.4.0"
5150 resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" 5078 resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3"
5151 integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= 5079 integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=
5152 5080
5153source-map@^0.4.2: 5081source-map@^0.5.0, source-map@^0.5.6:
5154 version "0.4.4"
5155 resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b"
5156 integrity sha1-66T12pwNyZneaAMti092FzZSA2s=
5157 dependencies:
5158 amdefine ">=0.0.4"
5159
5160source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1:
5161 version "0.5.7" 5082 version "0.5.7"
5162 resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" 5083 resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
5163 integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= 5084 integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
5164 5085
5165source-map@^0.6.1, source-map@~0.6.1: 5086source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1:
5166 version "0.6.1" 5087 version "0.6.1"
5167 resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 5088 resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
5168 integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 5089 integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
5169 5090
5170spdx-correct@^3.0.0: 5091spdx-correct@^3.0.0:
5171 version "3.1.0" 5092 version "3.1.1"
5172 resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" 5093 resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9"
5173 integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== 5094 integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==
5174 dependencies: 5095 dependencies:
5175 spdx-expression-parse "^3.0.0" 5096 spdx-expression-parse "^3.0.0"
5176 spdx-license-ids "^3.0.0" 5097 spdx-license-ids "^3.0.0"
5177 5098
5178spdx-exceptions@^2.1.0: 5099spdx-exceptions@^2.1.0:
5179 version "2.2.0" 5100 version "2.3.0"
5180 resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" 5101 resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d"
5181 integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== 5102 integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==
5182 5103
5183spdx-expression-parse@^3.0.0: 5104spdx-expression-parse@^3.0.0:
5184 version "3.0.0" 5105 version "3.0.1"
5185 resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" 5106 resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679"
5186 integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== 5107 integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==
5187 dependencies: 5108 dependencies:
5188 spdx-exceptions "^2.1.0" 5109 spdx-exceptions "^2.1.0"
5189 spdx-license-ids "^3.0.0" 5110 spdx-license-ids "^3.0.0"
5190 5111
5191spdx-license-ids@^3.0.0: 5112spdx-license-ids@^3.0.0:
5192 version "3.0.4" 5113 version "3.0.6"
5193 resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz#75ecd1a88de8c184ef015eafb51b5b48bfd11bb1" 5114 resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz#c80757383c28abf7296744998cbc106ae8b854ce"
5194 integrity sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA== 5115 integrity sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw==
5116
5117specificity@^0.4.1:
5118 version "0.4.1"
5119 resolved "https://registry.yarnpkg.com/specificity/-/specificity-0.4.1.tgz#aab5e645012db08ba182e151165738d00887b019"
5120 integrity sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==
5195 5121
5196split-string@^3.0.1, split-string@^3.0.2: 5122split-string@^3.0.1, split-string@^3.0.2:
5197 version "3.1.0" 5123 version "3.1.0"
@@ -5205,20 +5131,24 @@ sprintf-js@~1.0.2:
5205 resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 5131 resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
5206 integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= 5132 integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
5207 5133
5208sshpk@^1.7.0: 5134ssri@^6.0.1:
5209 version "1.16.1" 5135 version "6.0.1"
5210 resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" 5136 resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8"
5211 integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== 5137 integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==
5212 dependencies: 5138 dependencies:
5213 asn1 "~0.2.3" 5139 figgy-pudding "^3.5.1"
5214 assert-plus "^1.0.0" 5140
5215 bcrypt-pbkdf "^1.0.0" 5141ssri@^8.0.0:
5216 dashdash "^1.12.0" 5142 version "8.0.0"
5217 ecc-jsbn "~0.1.1" 5143 resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.0.tgz#79ca74e21f8ceaeddfcb4b90143c458b8d988808"
5218 getpass "^0.1.1" 5144 integrity sha512-aq/pz989nxVYwn16Tsbj1TqFpD5LLrQxHf5zaHuieFV+R0Bbr4y8qUsOA45hXT/N4/9UNXTarBjnjVmjSOVaAA==
5219 jsbn "~0.1.0" 5145 dependencies:
5220 safer-buffer "^2.0.2" 5146 minipass "^3.1.1"
5221 tweetnacl "~0.14.0" 5147
5148state-toggle@^1.0.0:
5149 version "1.0.3"
5150 resolved "https://registry.yarnpkg.com/state-toggle/-/state-toggle-1.0.3.tgz#e123b16a88e143139b09c6852221bc9815917dfe"
5151 integrity sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==
5222 5152
5223static-extend@^0.1.1: 5153static-extend@^0.1.1:
5224 version "0.1.2" 5154 version "0.1.2"
@@ -5228,13 +5158,6 @@ static-extend@^0.1.1:
5228 define-property "^0.2.5" 5158 define-property "^0.2.5"
5229 object-copy "^0.1.0" 5159 object-copy "^0.1.0"
5230 5160
5231stdout-stream@^1.4.0:
5232 version "1.4.1"
5233 resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.1.tgz#5ac174cdd5cd726104aa0c0b2bd83815d8d535de"
5234 integrity sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==
5235 dependencies:
5236 readable-stream "^2.0.1"
5237
5238stream-browserify@^2.0.1: 5161stream-browserify@^2.0.1:
5239 version "2.0.2" 5162 version "2.0.2"
5240 resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" 5163 resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b"
@@ -5243,6 +5166,14 @@ stream-browserify@^2.0.1:
5243 inherits "~2.0.1" 5166 inherits "~2.0.1"
5244 readable-stream "^2.0.2" 5167 readable-stream "^2.0.2"
5245 5168
5169stream-each@^1.1.0:
5170 version "1.2.3"
5171 resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae"
5172 integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==
5173 dependencies:
5174 end-of-stream "^1.1.0"
5175 stream-shift "^1.0.0"
5176
5246stream-http@^2.7.2: 5177stream-http@^2.7.2:
5247 version "2.8.3" 5178 version "2.8.3"
5248 resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" 5179 resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc"
@@ -5254,34 +5185,56 @@ stream-http@^2.7.2:
5254 to-arraybuffer "^1.0.0" 5185 to-arraybuffer "^1.0.0"
5255 xtend "^4.0.0" 5186 xtend "^4.0.0"
5256 5187
5188stream-shift@^1.0.0:
5189 version "1.0.1"
5190 resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d"
5191 integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==
5192
5257strict-uri-encode@^1.0.0: 5193strict-uri-encode@^1.0.0:
5258 version "1.1.0" 5194 version "1.1.0"
5259 resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" 5195 resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
5260 integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= 5196 integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=
5261 5197
5262string-width@^1.0.1, string-width@^1.0.2: 5198string-width@^3.0.0, string-width@^3.1.0:
5263 version "1.0.2" 5199 version "3.1.0"
5264 resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 5200 resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961"
5265 integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= 5201 integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==
5266 dependencies: 5202 dependencies:
5267 code-point-at "^1.0.0" 5203 emoji-regex "^7.0.1"
5268 is-fullwidth-code-point "^1.0.0" 5204 is-fullwidth-code-point "^2.0.0"
5269 strip-ansi "^3.0.0" 5205 strip-ansi "^5.1.0"
5270 5206
5271"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: 5207string-width@^4.2.0:
5272 version "2.1.1" 5208 version "4.2.0"
5273 resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 5209 resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5"
5274 integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== 5210 integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==
5275 dependencies: 5211 dependencies:
5276 is-fullwidth-code-point "^2.0.0" 5212 emoji-regex "^8.0.0"
5277 strip-ansi "^4.0.0" 5213 is-fullwidth-code-point "^3.0.0"
5214 strip-ansi "^6.0.0"
5278 5215
5279string_decoder@^1.0.0: 5216string.prototype.trimend@^1.0.1:
5280 version "1.2.0" 5217 version "1.0.1"
5281 resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d" 5218 resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913"
5282 integrity sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w== 5219 integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==
5283 dependencies: 5220 dependencies:
5284 safe-buffer "~5.1.0" 5221 define-properties "^1.1.3"
5222 es-abstract "^1.17.5"
5223
5224string.prototype.trimstart@^1.0.1:
5225 version "1.0.1"
5226 resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54"
5227 integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==
5228 dependencies:
5229 define-properties "^1.1.3"
5230 es-abstract "^1.17.5"
5231
5232string_decoder@^1.0.0, string_decoder@^1.1.1:
5233 version "1.3.0"
5234 resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
5235 integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
5236 dependencies:
5237 safe-buffer "~5.2.0"
5285 5238
5286string_decoder@~1.1.1: 5239string_decoder@~1.1.1:
5287 version "1.1.1" 5240 version "1.1.1"
@@ -5290,185 +5243,277 @@ string_decoder@~1.1.1:
5290 dependencies: 5243 dependencies:
5291 safe-buffer "~5.1.0" 5244 safe-buffer "~5.1.0"
5292 5245
5293strip-ansi@^3.0.0, strip-ansi@^3.0.1: 5246stringify-entities@^3.0.0:
5294 version "3.0.1" 5247 version "3.0.1"
5295 resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 5248 resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-3.0.1.tgz#32154b91286ab0869ab2c07696223bd23b6dbfc0"
5296 integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= 5249 integrity sha512-Lsk3ISA2++eJYqBMPKcr/8eby1I6L0gP0NlxF8Zja6c05yr/yCYyb2c9PwXjd08Ib3If1vn1rbs1H5ZtVuOfvQ==
5297 dependencies: 5250 dependencies:
5298 ansi-regex "^2.0.0" 5251 character-entities-html4 "^1.0.0"
5252 character-entities-legacy "^1.0.0"
5253 is-alphanumerical "^1.0.0"
5254 is-decimal "^1.0.2"
5255 is-hexadecimal "^1.0.0"
5299 5256
5300strip-ansi@^4.0.0: 5257strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0:
5301 version "4.0.0" 5258 version "5.2.0"
5302 resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 5259 resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae"
5303 integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= 5260 integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==
5304 dependencies: 5261 dependencies:
5305 ansi-regex "^3.0.0" 5262 ansi-regex "^4.1.0"
5306 5263
5307strip-bom@^2.0.0: 5264strip-ansi@^6.0.0:
5308 version "2.0.0" 5265 version "6.0.0"
5309 resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" 5266 resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532"
5310 integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= 5267 integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==
5311 dependencies: 5268 dependencies:
5312 is-utf8 "^0.2.0" 5269 ansi-regex "^5.0.0"
5313 5270
5314strip-bom@^3.0.0: 5271strip-bom@^3.0.0:
5315 version "3.0.0" 5272 version "3.0.0"
5316 resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" 5273 resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
5317 integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= 5274 integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=
5318 5275
5319strip-eof@^1.0.0: 5276strip-indent@^3.0.0:
5320 version "1.0.0" 5277 version "3.0.0"
5321 resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" 5278 resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001"
5322 integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= 5279 integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==
5323
5324strip-indent@^1.0.1:
5325 version "1.0.1"
5326 resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2"
5327 integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=
5328 dependencies: 5280 dependencies:
5329 get-stdin "^4.0.1" 5281 min-indent "^1.0.0"
5330
5331strip-json-comments@~1.0.1:
5332 version "1.0.4"
5333 resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91"
5334 integrity sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=
5335 5282
5336strip-json-comments@~2.0.1: 5283strip-json-comments@^3.1.0, strip-json-comments@^3.1.1:
5337 version "2.0.1" 5284 version "3.1.1"
5338 resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 5285 resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
5339 integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= 5286 integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
5340 5287
5341style-loader@^0.19.1: 5288style-search@^0.1.0:
5342 version "0.19.1" 5289 version "0.1.0"
5343 resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.19.1.tgz#591ffc80bcefe268b77c5d9ebc0505d772619f85" 5290 resolved "https://registry.yarnpkg.com/style-search/-/style-search-0.1.0.tgz#7958c793e47e32e07d2b5cafe5c0bf8e12e77902"
5344 integrity sha512-IRE+ijgojrygQi3rsqT0U4dd+UcPCqcVvauZpCnQrGAlEe+FUIyrK93bUDScamesjP08JlQNsFJU+KmPedP5Og== 5291 integrity sha1-eVjHk+R+MuB9K1yv5cC/jhLneQI=
5345 dependencies:
5346 loader-utils "^1.0.2"
5347 schema-utils "^0.3.0"
5348 5292
5349supports-color@^2.0.0: 5293stylelint-config-recommended@^3.0.0:
5294 version "3.0.0"
5295 resolved "https://registry.yarnpkg.com/stylelint-config-recommended/-/stylelint-config-recommended-3.0.0.tgz#e0e547434016c5539fe2650afd58049a2fd1d657"
5296 integrity sha512-F6yTRuc06xr1h5Qw/ykb2LuFynJ2IxkKfCMf+1xqPffkxh0S09Zc902XCffcsw/XMFq/OzQ1w54fLIDtmRNHnQ==
5297
5298stylelint-config-standard@^20.0.0:
5299 version "20.0.0"
5300 resolved "https://registry.yarnpkg.com/stylelint-config-standard/-/stylelint-config-standard-20.0.0.tgz#06135090c9e064befee3d594289f50e295b5e20d"
5301 integrity sha512-IB2iFdzOTA/zS4jSVav6z+wGtin08qfj+YyExHB3LF9lnouQht//YyB0KZq9gGz5HNPkddHOzcY8HsUey6ZUlA==
5302 dependencies:
5303 stylelint-config-recommended "^3.0.0"
5304
5305stylelint-scss@^3.18.0:
5306 version "3.18.0"
5307 resolved "https://registry.yarnpkg.com/stylelint-scss/-/stylelint-scss-3.18.0.tgz#8f06371c223909bf3f62e839548af1badeed31e9"
5308 integrity sha512-LD7+hv/6/ApNGt7+nR/50ft7cezKP2HM5rI8avIdGaUWre3xlHfV4jKO/DRZhscfuN+Ewy9FMhcTq0CcS0C/SA==
5309 dependencies:
5310 lodash "^4.17.15"
5311 postcss-media-query-parser "^0.2.3"
5312 postcss-resolve-nested-selector "^0.1.1"
5313 postcss-selector-parser "^6.0.2"
5314 postcss-value-parser "^4.1.0"
5315
5316stylelint@^13.7.1:
5317 version "13.7.1"
5318 resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-13.7.1.tgz#bee97ee78d778a3f1dbe3f7397b76414973e263e"
5319 integrity sha512-qzqazcyRxrSRdmFuO0/SZOJ+LyCxYy0pwcvaOBBnl8/2VfHSMrtNIE+AnyJoyq6uKb+mt+hlgmVrvVi6G6XHfQ==
5320 dependencies:
5321 "@stylelint/postcss-css-in-js" "^0.37.2"
5322 "@stylelint/postcss-markdown" "^0.36.1"
5323 autoprefixer "^9.8.6"
5324 balanced-match "^1.0.0"
5325 chalk "^4.1.0"
5326 cosmiconfig "^7.0.0"
5327 debug "^4.1.1"
5328 execall "^2.0.0"
5329 fast-glob "^3.2.4"
5330 fastest-levenshtein "^1.0.12"
5331 file-entry-cache "^5.0.1"
5332 get-stdin "^8.0.0"
5333 global-modules "^2.0.0"
5334 globby "^11.0.1"
5335 globjoin "^0.1.4"
5336 html-tags "^3.1.0"
5337 ignore "^5.1.8"
5338 import-lazy "^4.0.0"
5339 imurmurhash "^0.1.4"
5340 known-css-properties "^0.19.0"
5341 lodash "^4.17.20"
5342 log-symbols "^4.0.0"
5343 mathml-tag-names "^2.1.3"
5344 meow "^7.1.1"
5345 micromatch "^4.0.2"
5346 normalize-selector "^0.2.0"
5347 postcss "^7.0.32"
5348 postcss-html "^0.36.0"
5349 postcss-less "^3.1.4"
5350 postcss-media-query-parser "^0.2.3"
5351 postcss-resolve-nested-selector "^0.1.1"
5352 postcss-safe-parser "^4.0.2"
5353 postcss-sass "^0.4.4"
5354 postcss-scss "^2.1.1"
5355 postcss-selector-parser "^6.0.2"
5356 postcss-syntax "^0.36.2"
5357 postcss-value-parser "^4.1.0"
5358 resolve-from "^5.0.0"
5359 slash "^3.0.0"
5360 specificity "^0.4.1"
5361 string-width "^4.2.0"
5362 strip-ansi "^6.0.0"
5363 style-search "^0.1.0"
5364 sugarss "^2.0.0"
5365 svg-tags "^1.0.0"
5366 table "^6.0.1"
5367 v8-compile-cache "^2.1.1"
5368 write-file-atomic "^3.0.3"
5369
5370sugarss@^2.0.0:
5350 version "2.0.0" 5371 version "2.0.0"
5351 resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 5372 resolved "https://registry.yarnpkg.com/sugarss/-/sugarss-2.0.0.tgz#ddd76e0124b297d40bf3cca31c8b22ecb43bc61d"
5352 integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= 5373 integrity sha512-WfxjozUk0UVA4jm+U1d736AUpzSrNsQcIbyOkoE364GrtWmIrFdk5lksEupgWMD4VaT/0kVx1dobpiDumSgmJQ==
5353
5354supports-color@^3.2.3:
5355 version "3.2.3"
5356 resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6"
5357 integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=
5358 dependencies: 5374 dependencies:
5359 has-flag "^1.0.0" 5375 postcss "^7.0.2"
5360 5376
5361supports-color@^4.2.1: 5377supports-color@^5.3.0:
5362 version "4.5.0"
5363 resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b"
5364 integrity sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=
5365 dependencies:
5366 has-flag "^2.0.0"
5367
5368supports-color@^5.3.0, supports-color@^5.4.0:
5369 version "5.5.0" 5378 version "5.5.0"
5370 resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 5379 resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
5371 integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 5380 integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
5372 dependencies: 5381 dependencies:
5373 has-flag "^3.0.0" 5382 has-flag "^3.0.0"
5374 5383
5375svgo@^0.7.0: 5384supports-color@^6.1.0:
5376 version "0.7.2" 5385 version "6.1.0"
5377 resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5" 5386 resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3"
5378 integrity sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U= 5387 integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==
5379 dependencies: 5388 dependencies:
5380 coa "~1.0.1" 5389 has-flag "^3.0.0"
5381 colors "~1.1.2"
5382 csso "~2.3.1"
5383 js-yaml "~3.7.0"
5384 mkdirp "~0.5.1"
5385 sax "~1.2.1"
5386 whet.extend "~0.9.9"
5387 5390
5388table@4.0.2: 5391supports-color@^7.0.0, supports-color@^7.1.0:
5389 version "4.0.2" 5392 version "7.2.0"
5390 resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36" 5393 resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
5391 integrity sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA== 5394 integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
5392 dependencies:
5393 ajv "^5.2.3"
5394 ajv-keywords "^2.1.0"
5395 chalk "^2.1.0"
5396 lodash "^4.17.4"
5397 slice-ansi "1.0.0"
5398 string-width "^2.1.1"
5399
5400table@^3.7.8:
5401 version "3.8.3"
5402 resolved "https://registry.yarnpkg.com/table/-/table-3.8.3.tgz#2bbc542f0fda9861a755d3947fefd8b3f513855f"
5403 integrity sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=
5404 dependencies:
5405 ajv "^4.7.0"
5406 ajv-keywords "^1.0.0"
5407 chalk "^1.1.1"
5408 lodash "^4.0.0"
5409 slice-ansi "0.0.4"
5410 string-width "^2.0.0"
5411
5412tapable@^0.2.7:
5413 version "0.2.9"
5414 resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.9.tgz#af2d8bbc9b04f74ee17af2b4d9048f807acd18a8"
5415 integrity sha512-2wsvQ+4GwBvLPLWsNfLCDYGsW6xb7aeC6utq2Qh0PFwgEy7K7dsma9Jsmb2zSQj7GvYAyUGSntLtsv++GmgL1A==
5416
5417tar@^2.0.0:
5418 version "2.2.2"
5419 resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.2.tgz#0ca8848562c7299b8b446ff6a4d60cdbb23edc40"
5420 integrity sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==
5421 dependencies: 5395 dependencies:
5422 block-stream "*" 5396 has-flag "^4.0.0"
5423 fstream "^1.0.12"
5424 inherits "2"
5425 5397
5426tar@^4: 5398svg-tags@^1.0.0:
5427 version "4.4.8" 5399 version "1.0.0"
5428 resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.8.tgz#b19eec3fde2a96e64666df9fdb40c5ca1bc3747d" 5400 resolved "https://registry.yarnpkg.com/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764"
5429 integrity sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ== 5401 integrity sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=
5402
5403table@^5.2.3:
5404 version "5.4.6"
5405 resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e"
5406 integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==
5407 dependencies:
5408 ajv "^6.10.2"
5409 lodash "^4.17.14"
5410 slice-ansi "^2.1.0"
5411 string-width "^3.0.0"
5412
5413table@^6.0.1:
5414 version "6.0.3"
5415 resolved "https://registry.yarnpkg.com/table/-/table-6.0.3.tgz#e5b8a834e37e27ad06de2e0fda42b55cfd8a0123"
5416 integrity sha512-8321ZMcf1B9HvVX/btKv8mMZahCjn2aYrDlpqHaBFCfnox64edeH9kEid0vTLTRR8gWR2A20aDgeuTTea4sVtw==
5417 dependencies:
5418 ajv "^6.12.4"
5419 lodash "^4.17.20"
5420 slice-ansi "^4.0.0"
5421 string-width "^4.2.0"
5422
5423tapable@^1.0.0, tapable@^1.1.3:
5424 version "1.1.3"
5425 resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2"
5426 integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==
5427
5428tar@^6.0.2:
5429 version "6.0.5"
5430 resolved "https://registry.yarnpkg.com/tar/-/tar-6.0.5.tgz#bde815086e10b39f1dcd298e89d596e1535e200f"
5431 integrity sha512-0b4HOimQHj9nXNEAA7zWwMM91Zhhba3pspja6sQbgTpynOJf+bkjBnfybNYzbpLbnwXnbyB4LOREvlyXLkCHSg==
5432 dependencies:
5433 chownr "^2.0.0"
5434 fs-minipass "^2.0.0"
5435 minipass "^3.0.0"
5436 minizlib "^2.1.1"
5437 mkdirp "^1.0.3"
5438 yallist "^4.0.0"
5439
5440terser-webpack-plugin@^1.4.3:
5441 version "1.4.5"
5442 resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz#a217aefaea330e734ffacb6120ec1fa312d6040b"
5443 integrity sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==
5444 dependencies:
5445 cacache "^12.0.2"
5446 find-cache-dir "^2.1.0"
5447 is-wsl "^1.1.0"
5448 schema-utils "^1.0.0"
5449 serialize-javascript "^4.0.0"
5450 source-map "^0.6.1"
5451 terser "^4.1.2"
5452 webpack-sources "^1.4.0"
5453 worker-farm "^1.7.0"
5454
5455terser-webpack-plugin@^4.2.2:
5456 version "4.2.2"
5457 resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-4.2.2.tgz#d86200c700053bba637913fe4310ba1bdeb5568e"
5458 integrity sha512-3qAQpykRTD5DReLu5/cwpsg7EZFzP3Q0Hp2XUWJUw2mpq2jfgOKTZr8IZKKnNieRVVo1UauROTdhbQJZveGKtQ==
5459 dependencies:
5460 cacache "^15.0.5"
5461 find-cache-dir "^3.3.1"
5462 jest-worker "^26.3.0"
5463 p-limit "^3.0.2"
5464 schema-utils "^2.7.1"
5465 serialize-javascript "^5.0.1"
5466 source-map "^0.6.1"
5467 terser "^5.3.2"
5468 webpack-sources "^1.4.3"
5469
5470terser@^4.1.2:
5471 version "4.8.0"
5472 resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17"
5473 integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==
5430 dependencies: 5474 dependencies:
5431 chownr "^1.1.1" 5475 commander "^2.20.0"
5432 fs-minipass "^1.2.5" 5476 source-map "~0.6.1"
5433 minipass "^2.3.4" 5477 source-map-support "~0.5.12"
5434 minizlib "^1.1.1"
5435 mkdirp "^0.5.0"
5436 safe-buffer "^5.1.2"
5437 yallist "^3.0.2"
5438 5478
5439text-table@~0.2.0: 5479terser@^5.3.2:
5480 version "5.3.2"
5481 resolved "https://registry.yarnpkg.com/terser/-/terser-5.3.2.tgz#f4bea90eb92945b2a028ceef79181b9bb586e7af"
5482 integrity sha512-H67sydwBz5jCUA32ZRL319ULu+Su1cAoZnnc+lXnenGRYWyLE3Scgkt8mNoAsMx0h5kdo758zdoS0LG9rYZXDQ==
5483 dependencies:
5484 commander "^2.20.0"
5485 source-map "~0.6.1"
5486 source-map-support "~0.5.12"
5487
5488text-table@^0.2.0:
5440 version "0.2.0" 5489 version "0.2.0"
5441 resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 5490 resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
5442 integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= 5491 integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=
5443 5492
5444through@^2.3.6: 5493through2@^2.0.0:
5445 version "2.3.8" 5494 version "2.0.5"
5446 resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 5495 resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd"
5447 integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= 5496 integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==
5497 dependencies:
5498 readable-stream "~2.3.6"
5499 xtend "~4.0.1"
5448 5500
5449timers-browserify@^2.0.4: 5501timers-browserify@^2.0.4:
5450 version "2.0.10" 5502 version "2.0.11"
5451 resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz#1d28e3d2aadf1d5a5996c4e9f95601cd053480ae" 5503 resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.11.tgz#800b1f3eee272e5bc53ee465a04d0e804c31211f"
5452 integrity sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg== 5504 integrity sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==
5453 dependencies: 5505 dependencies:
5454 setimmediate "^1.0.4" 5506 setimmediate "^1.0.4"
5455 5507
5456tmp@^0.0.33:
5457 version "0.0.33"
5458 resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
5459 integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==
5460 dependencies:
5461 os-tmpdir "~1.0.2"
5462
5463to-arraybuffer@^1.0.0: 5508to-arraybuffer@^1.0.0:
5464 version "1.0.1" 5509 version "1.0.1"
5465 resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" 5510 resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
5466 integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= 5511 integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=
5467 5512
5468to-fast-properties@^1.0.3: 5513to-fast-properties@^2.0.0:
5469 version "1.0.3" 5514 version "2.0.0"
5470 resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" 5515 resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
5471 integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= 5516 integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=
5472 5517
5473to-object-path@^0.3.0: 5518to-object-path@^0.3.0:
5474 version "0.3.0" 5519 version "0.3.0"
@@ -5485,6 +5530,13 @@ to-regex-range@^2.1.0:
5485 is-number "^3.0.0" 5530 is-number "^3.0.0"
5486 repeat-string "^1.6.1" 5531 repeat-string "^1.6.1"
5487 5532
5533to-regex-range@^5.0.1:
5534 version "5.0.1"
5535 resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
5536 integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
5537 dependencies:
5538 is-number "^7.0.0"
5539
5488to-regex@^3.0.1, to-regex@^3.0.2: 5540to-regex@^3.0.1, to-regex@^3.0.2:
5489 version "3.0.2" 5541 version "3.0.2"
5490 resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" 5542 resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce"
@@ -5495,108 +5547,194 @@ to-regex@^3.0.1, to-regex@^3.0.2:
5495 regex-not "^1.0.2" 5547 regex-not "^1.0.2"
5496 safe-regex "^1.1.0" 5548 safe-regex "^1.1.0"
5497 5549
5498tough-cookie@~2.4.3: 5550trim-newlines@^3.0.0:
5499 version "2.4.3" 5551 version "3.0.0"
5500 resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" 5552 resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.0.tgz#79726304a6a898aa8373427298d54c2ee8b1cb30"
5501 integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== 5553 integrity sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==
5502 dependencies:
5503 psl "^1.1.24"
5504 punycode "^1.4.1"
5505 5554
5506trim-newlines@^1.0.0: 5555trim-trailing-lines@^1.0.0:
5507 version "1.0.0" 5556 version "1.1.3"
5508 resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" 5557 resolved "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-1.1.3.tgz#7f0739881ff76657b7776e10874128004b625a94"
5509 integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= 5558 integrity sha512-4ku0mmjXifQcTVfYDfR5lpgV7zVqPg6zV9rdZmwOPqq0+Zq19xDqEgagqVbc4pOOShbncuAOIs59R3+3gcF3ZA==
5510 5559
5511trim-right@^1.0.1: 5560trim@0.0.1:
5512 version "1.0.1" 5561 version "0.0.1"
5513 resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" 5562 resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd"
5514 integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= 5563 integrity sha1-WFhUf2spB1fulczMZm+1AITEYN0=
5515 5564
5516"true-case-path@^1.0.2": 5565trough@^1.0.0:
5517 version "1.0.3" 5566 version "1.0.5"
5518 resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.3.tgz#f813b5a8c86b40da59606722b144e3225799f47d" 5567 resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406"
5519 integrity sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew== 5568 integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==
5569
5570tsconfig-paths@^3.9.0:
5571 version "3.9.0"
5572 resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz#098547a6c4448807e8fcb8eae081064ee9a3c90b"
5573 integrity sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==
5520 dependencies: 5574 dependencies:
5521 glob "^7.1.2" 5575 "@types/json5" "^0.0.29"
5576 json5 "^1.0.1"
5577 minimist "^1.2.0"
5578 strip-bom "^3.0.0"
5579
5580tslib@^1.9.0:
5581 version "1.13.0"
5582 resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043"
5583 integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==
5522 5584
5523tty-browserify@0.0.0: 5585tty-browserify@0.0.0:
5524 version "0.0.0" 5586 version "0.0.0"
5525 resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" 5587 resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6"
5526 integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= 5588 integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=
5527 5589
5528tunnel-agent@^0.6.0: 5590type-check@^0.4.0, type-check@~0.4.0:
5529 version "0.6.0" 5591 version "0.4.0"
5530 resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" 5592 resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1"
5531 integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= 5593 integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==
5532 dependencies: 5594 dependencies:
5533 safe-buffer "^5.0.1" 5595 prelude-ls "^1.2.1"
5534 5596
5535tweetnacl@^0.14.3, tweetnacl@~0.14.0: 5597type-fest@^0.13.1:
5536 version "0.14.5" 5598 version "0.13.1"
5537 resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" 5599 resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934"
5538 integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= 5600 integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==
5539 5601
5540type-check@~0.3.2: 5602type-fest@^0.6.0:
5541 version "0.3.2" 5603 version "0.6.0"
5542 resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" 5604 resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b"
5543 integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= 5605 integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==
5606
5607type-fest@^0.8.1:
5608 version "0.8.1"
5609 resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d"
5610 integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==
5611
5612typedarray-to-buffer@^3.1.5:
5613 version "3.1.5"
5614 resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080"
5615 integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==
5544 dependencies: 5616 dependencies:
5545 prelude-ls "~1.1.2" 5617 is-typedarray "^1.0.0"
5546 5618
5547typedarray@^0.0.6: 5619typedarray@^0.0.6:
5548 version "0.0.6" 5620 version "0.0.6"
5549 resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" 5621 resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
5550 integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= 5622 integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
5551 5623
5552uglify-js@^2.8.29: 5624unherit@^1.0.4:
5553 version "2.8.29" 5625 version "1.1.3"
5554 resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" 5626 resolved "https://registry.yarnpkg.com/unherit/-/unherit-1.1.3.tgz#6c9b503f2b41b262330c80e91c8614abdaa69c22"
5555 integrity sha1-KcVzMUgFe7Th913zW3qcty5qWd0= 5627 integrity sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==
5556 dependencies: 5628 dependencies:
5557 source-map "~0.5.1" 5629 inherits "^2.0.0"
5558 yargs "~3.10.0" 5630 xtend "^4.0.0"
5559 optionalDependencies:
5560 uglify-to-browserify "~1.0.0"
5561 5631
5562uglify-to-browserify@~1.0.0: 5632unicode-canonical-property-names-ecmascript@^1.0.4:
5563 version "1.0.2" 5633 version "1.0.4"
5564 resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" 5634 resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818"
5565 integrity sha1-bgkk1r2mta/jSeOabWMoUKD4grc= 5635 integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==
5566 5636
5567uglifyjs-webpack-plugin@^0.4.6: 5637unicode-match-property-ecmascript@^1.0.4:
5568 version "0.4.6" 5638 version "1.0.4"
5569 resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz#b951f4abb6bd617e66f63eb891498e391763e309" 5639 resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c"
5570 integrity sha1-uVH0q7a9YX5m9j64kUmOORdj4wk= 5640 integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==
5571 dependencies: 5641 dependencies:
5572 source-map "^0.5.6" 5642 unicode-canonical-property-names-ecmascript "^1.0.4"
5573 uglify-js "^2.8.29" 5643 unicode-property-aliases-ecmascript "^1.0.4"
5574 webpack-sources "^1.0.1" 5644
5645unicode-match-property-value-ecmascript@^1.2.0:
5646 version "1.2.0"
5647 resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz#0d91f600eeeb3096aa962b1d6fc88876e64ea531"
5648 integrity sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==
5649
5650unicode-property-aliases-ecmascript@^1.0.4:
5651 version "1.1.0"
5652 resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz#dd57a99f6207bedff4628abefb94c50db941c8f4"
5653 integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==
5654
5655unified@^9.0.0:
5656 version "9.2.0"
5657 resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.0.tgz#67a62c627c40589edebbf60f53edfd4d822027f8"
5658 integrity sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==
5659 dependencies:
5660 bail "^1.0.0"
5661 extend "^3.0.0"
5662 is-buffer "^2.0.0"
5663 is-plain-obj "^2.0.0"
5664 trough "^1.0.0"
5665 vfile "^4.0.0"
5575 5666
5576union-value@^1.0.0: 5667union-value@^1.0.0:
5577 version "1.0.0" 5668 version "1.0.1"
5578 resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" 5669 resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847"
5579 integrity sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ= 5670 integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==
5580 dependencies: 5671 dependencies:
5581 arr-union "^3.1.0" 5672 arr-union "^3.1.0"
5582 get-value "^2.0.6" 5673 get-value "^2.0.6"
5583 is-extendable "^0.1.1" 5674 is-extendable "^0.1.1"
5584 set-value "^0.4.3" 5675 set-value "^2.0.1"
5585 5676
5586uniq@^1.0.1: 5677uniq@^1.0.1:
5587 version "1.0.1" 5678 version "1.0.1"
5588 resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" 5679 resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff"
5589 integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= 5680 integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=
5590 5681
5591uniqs@^2.0.0: 5682unique-filename@^1.1.1:
5592 version "2.0.0" 5683 version "1.1.1"
5593 resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" 5684 resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230"
5594 integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI= 5685 integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==
5686 dependencies:
5687 unique-slug "^2.0.0"
5595 5688
5596universalify@^0.1.0: 5689unique-slug@^2.0.0:
5597 version "0.1.2" 5690 version "2.0.2"
5598 resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" 5691 resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c"
5599 integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== 5692 integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==
5693 dependencies:
5694 imurmurhash "^0.1.4"
5695
5696unist-util-find-all-after@^3.0.1:
5697 version "3.0.1"
5698 resolved "https://registry.yarnpkg.com/unist-util-find-all-after/-/unist-util-find-all-after-3.0.1.tgz#95cc62f48812d879b4685a0512bf1b838da50e9a"
5699 integrity sha512-0GICgc++sRJesLwEYDjFVJPJttBpVQaTNgc6Jw0Jhzvfs+jtKePEMu+uD+PqkRUrAvGQqwhpDwLGWo1PK8PDEw==
5700 dependencies:
5701 unist-util-is "^4.0.0"
5702
5703unist-util-is@^4.0.0:
5704 version "4.0.2"
5705 resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.0.2.tgz#c7d1341188aa9ce5b3cff538958de9895f14a5de"
5706 integrity sha512-Ofx8uf6haexJwI1gxWMGg6I/dLnF2yE+KibhD3/diOqY2TinLcqHXCV6OI5gFVn3xQqDH+u0M625pfKwIwgBKQ==
5707
5708unist-util-remove-position@^2.0.0:
5709 version "2.0.1"
5710 resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz#5d19ca79fdba712301999b2b73553ca8f3b352cc"
5711 integrity sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==
5712 dependencies:
5713 unist-util-visit "^2.0.0"
5714
5715unist-util-stringify-position@^2.0.0:
5716 version "2.0.3"
5717 resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz#cce3bfa1cdf85ba7375d1d5b17bdc4cada9bd9da"
5718 integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==
5719 dependencies:
5720 "@types/unist" "^2.0.2"
5721
5722unist-util-visit-parents@^3.0.0:
5723 version "3.1.0"
5724 resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.1.0.tgz#4dd262fb9dcfe44f297d53e882fc6ff3421173d5"
5725 integrity sha512-0g4wbluTF93npyPrp/ymd3tCDTMnP0yo2akFD2FIBAYXq/Sga3lwaU1D8OYKbtpioaI6CkDcQ6fsMnmtzt7htw==
5726 dependencies:
5727 "@types/unist" "^2.0.0"
5728 unist-util-is "^4.0.0"
5729
5730unist-util-visit@^2.0.0:
5731 version "2.0.3"
5732 resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.3.tgz#c3703893146df47203bb8a9795af47d7b971208c"
5733 integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==
5734 dependencies:
5735 "@types/unist" "^2.0.0"
5736 unist-util-is "^4.0.0"
5737 unist-util-visit-parents "^3.0.0"
5600 5738
5601unset-value@^1.0.0: 5739unset-value@^1.0.0:
5602 version "1.0.0" 5740 version "1.0.0"
@@ -5607,14 +5745,14 @@ unset-value@^1.0.0:
5607 isobject "^3.0.0" 5745 isobject "^3.0.0"
5608 5746
5609upath@^1.1.1: 5747upath@^1.1.1:
5610 version "1.1.2" 5748 version "1.2.0"
5611 resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.2.tgz#3db658600edaeeccbe6db5e684d67ee8c2acd068" 5749 resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894"
5612 integrity sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q== 5750 integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==
5613 5751
5614uri-js@^4.2.2: 5752uri-js@^4.2.2:
5615 version "4.2.2" 5753 version "4.4.0"
5616 resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" 5754 resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.0.tgz#aa714261de793e8a82347a7bcc9ce74e86f28602"
5617 integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== 5755 integrity sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==
5618 dependencies: 5756 dependencies:
5619 punycode "^2.1.0" 5757 punycode "^2.1.0"
5620 5758
@@ -5623,15 +5761,6 @@ urix@^0.1.0:
5623 resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" 5761 resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
5624 integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= 5762 integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=
5625 5763
5626url-loader@^0.6.2:
5627 version "0.6.2"
5628 resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-0.6.2.tgz#a007a7109620e9d988d14bce677a1decb9a993f7"
5629 integrity sha512-h3qf9TNn53BpuXTTcpC+UehiRrl0Cv45Yr/xWayApjw6G8Bg2dGke7rIwDQ39piciWCWrC+WiqLjOh3SUp9n0Q==
5630 dependencies:
5631 loader-utils "^1.0.2"
5632 mime "^1.4.1"
5633 schema-utils "^0.3.0"
5634
5635url@^0.11.0: 5764url@^0.11.0:
5636 version "0.11.0" 5765 version "0.11.0"
5637 resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" 5766 resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
@@ -5645,14 +5774,7 @@ use@^3.1.0:
5645 resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" 5774 resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
5646 integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== 5775 integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==
5647 5776
5648user-home@^2.0.0: 5777util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1:
5649 version "2.0.0"
5650 resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f"
5651 integrity sha1-nHC/2Babwdy/SGBODwS4tJzenp8=
5652 dependencies:
5653 os-homedir "^1.0.0"
5654
5655util-deprecate@~1.0.1:
5656 version "1.0.2" 5778 version "1.0.2"
5657 resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 5779 resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
5658 integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= 5780 integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
@@ -5664,13 +5786,6 @@ util@0.10.3:
5664 dependencies: 5786 dependencies:
5665 inherits "2.0.1" 5787 inherits "2.0.1"
5666 5788
5667util@^0.10.3:
5668 version "0.10.4"
5669 resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901"
5670 integrity sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==
5671 dependencies:
5672 inherits "2.0.3"
5673
5674util@^0.11.0: 5789util@^0.11.0:
5675 version "0.11.1" 5790 version "0.11.1"
5676 resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" 5791 resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61"
@@ -5678,10 +5793,10 @@ util@^0.11.0:
5678 dependencies: 5793 dependencies:
5679 inherits "2.0.3" 5794 inherits "2.0.3"
5680 5795
5681uuid@^3.3.2: 5796v8-compile-cache@^2.0.3, v8-compile-cache@^2.1.1:
5682 version "3.3.2" 5797 version "2.1.1"
5683 resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" 5798 resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz#54bc3cdd43317bca91e35dcaf305b1a7237de745"
5684 integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== 5799 integrity sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==
5685 5800
5686validate-npm-package-license@^3.0.1: 5801validate-npm-package-license@^3.0.1:
5687 version "3.0.4" 5802 version "3.0.4"
@@ -5691,214 +5806,222 @@ validate-npm-package-license@^3.0.1:
5691 spdx-correct "^3.0.0" 5806 spdx-correct "^3.0.0"
5692 spdx-expression-parse "^3.0.0" 5807 spdx-expression-parse "^3.0.0"
5693 5808
5694vendors@^1.0.0: 5809vfile-location@^3.0.0:
5695 version "1.0.3" 5810 version "3.1.0"
5696 resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.3.tgz#a6467781abd366217c050f8202e7e50cc9eef8c0" 5811 resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-3.1.0.tgz#81cd8a04b0ac935185f4fce16f270503fc2f692f"
5697 integrity sha512-fOi47nsJP5Wqefa43kyWSg80qF+Q3XA6MUkgi7Hp1HQaKDQW4cQrK2D0P7mmbFtsV1N89am55Yru/nyEwRubcw== 5812 integrity sha512-FCZ4AN9xMcjFIG1oGmZKo61PjwJHRVA+0/tPUP2ul4uIwjGGndIxavEMRpWn5p4xwm/ZsdXp9YNygf1ZyE4x8g==
5698 5813
5699verror@1.10.0: 5814vfile-message@^2.0.0:
5700 version "1.10.0" 5815 version "2.0.4"
5701 resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" 5816 resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a"
5702 integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= 5817 integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==
5703 dependencies: 5818 dependencies:
5704 assert-plus "^1.0.0" 5819 "@types/unist" "^2.0.0"
5705 core-util-is "1.0.2" 5820 unist-util-stringify-position "^2.0.0"
5706 extsprintf "^1.2.0" 5821
5822vfile@^4.0.0:
5823 version "4.2.0"
5824 resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.2.0.tgz#26c78ac92eb70816b01d4565e003b7e65a2a0e01"
5825 integrity sha512-a/alcwCvtuc8OX92rqqo7PflxiCgXRFjdyoGVuYV+qbgCb0GgZJRvIgCD4+U/Kl1yhaRsaTwksF88xbPyGsgpw==
5826 dependencies:
5827 "@types/unist" "^2.0.0"
5828 is-buffer "^2.0.0"
5829 replace-ext "1.0.0"
5830 unist-util-stringify-position "^2.0.0"
5831 vfile-message "^2.0.0"
5832
5833vm-browserify@^1.0.1:
5834 version "1.1.2"
5835 resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0"
5836 integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==
5707 5837
5708vm-browserify@0.0.4: 5838watchpack-chokidar2@^2.0.0:
5709 version "0.0.4" 5839 version "2.0.0"
5710 resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" 5840 resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz#9948a1866cbbd6cb824dea13a7ed691f6c8ddff0"
5711 integrity sha1-XX6kW7755Kb/ZflUOOCofDV9WnM= 5841 integrity sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==
5712 dependencies: 5842 dependencies:
5713 indexof "0.0.1" 5843 chokidar "^2.1.8"
5714 5844
5715watchpack@^1.4.0: 5845watchpack@^1.7.4:
5716 version "1.6.0" 5846 version "1.7.4"
5717 resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" 5847 resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.4.tgz#6e9da53b3c80bb2d6508188f5b200410866cd30b"
5718 integrity sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA== 5848 integrity sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg==
5719 dependencies: 5849 dependencies:
5720 chokidar "^2.0.2"
5721 graceful-fs "^4.1.2" 5850 graceful-fs "^4.1.2"
5722 neo-async "^2.5.0" 5851 neo-async "^2.5.0"
5723 5852 optionalDependencies:
5724webpack-sources@^1.0.1: 5853 chokidar "^3.4.1"
5725 version "1.3.0" 5854 watchpack-chokidar2 "^2.0.0"
5726 resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.3.0.tgz#2a28dcb9f1f45fe960d8f1493252b5ee6530fa85" 5855
5727 integrity sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA== 5856webpack-cli@^3.3.12:
5857 version "3.3.12"
5858 resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.12.tgz#94e9ada081453cd0aa609c99e500012fd3ad2d4a"
5859 integrity sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag==
5860 dependencies:
5861 chalk "^2.4.2"
5862 cross-spawn "^6.0.5"
5863 enhanced-resolve "^4.1.1"
5864 findup-sync "^3.0.0"
5865 global-modules "^2.0.0"
5866 import-local "^2.0.0"
5867 interpret "^1.4.0"
5868 loader-utils "^1.4.0"
5869 supports-color "^6.1.0"
5870 v8-compile-cache "^2.1.1"
5871 yargs "^13.3.2"
5872
5873webpack-sources@^1.1.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1, webpack-sources@^1.4.3:
5874 version "1.4.3"
5875 resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933"
5876 integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==
5728 dependencies: 5877 dependencies:
5729 source-list-map "^2.0.0" 5878 source-list-map "^2.0.0"
5730 source-map "~0.6.1" 5879 source-map "~0.6.1"
5731 5880
5732webpack@^3.10.0: 5881webpack@^4.44.2:
5733 version "3.12.0" 5882 version "4.44.2"
5734 resolved "https://registry.yarnpkg.com/webpack/-/webpack-3.12.0.tgz#3f9e34360370602fcf639e97939db486f4ec0d74" 5883 resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.44.2.tgz#6bfe2b0af055c8b2d1e90ed2cd9363f841266b72"
5735 integrity sha512-Sw7MdIIOv/nkzPzee4o0EdvCuPmxT98+vVpIvwtcwcF1Q4SDSNp92vwcKc4REe7NItH9f1S4ra9FuQ7yuYZ8bQ== 5884 integrity sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q==
5736 dependencies: 5885 dependencies:
5737 acorn "^5.0.0" 5886 "@webassemblyjs/ast" "1.9.0"
5738 acorn-dynamic-import "^2.0.0" 5887 "@webassemblyjs/helper-module-context" "1.9.0"
5739 ajv "^6.1.0" 5888 "@webassemblyjs/wasm-edit" "1.9.0"
5740 ajv-keywords "^3.1.0" 5889 "@webassemblyjs/wasm-parser" "1.9.0"
5741 async "^2.1.2" 5890 acorn "^6.4.1"
5742 enhanced-resolve "^3.4.0" 5891 ajv "^6.10.2"
5743 escope "^3.6.0" 5892 ajv-keywords "^3.4.1"
5744 interpret "^1.0.0" 5893 chrome-trace-event "^1.0.2"
5745 json-loader "^0.5.4" 5894 enhanced-resolve "^4.3.0"
5746 json5 "^0.5.1" 5895 eslint-scope "^4.0.3"
5747 loader-runner "^2.3.0" 5896 json-parse-better-errors "^1.0.2"
5748 loader-utils "^1.1.0" 5897 loader-runner "^2.4.0"
5749 memory-fs "~0.4.1" 5898 loader-utils "^1.2.3"
5750 mkdirp "~0.5.0" 5899 memory-fs "^0.4.1"
5751 node-libs-browser "^2.0.0" 5900 micromatch "^3.1.10"
5752 source-map "^0.5.3" 5901 mkdirp "^0.5.3"
5753 supports-color "^4.2.1" 5902 neo-async "^2.6.1"
5754 tapable "^0.2.7" 5903 node-libs-browser "^2.2.1"
5755 uglifyjs-webpack-plugin "^0.4.6" 5904 schema-utils "^1.0.0"
5756 watchpack "^1.4.0" 5905 tapable "^1.1.3"
5757 webpack-sources "^1.0.1" 5906 terser-webpack-plugin "^1.4.3"
5758 yargs "^8.0.2" 5907 watchpack "^1.7.4"
5759 5908 webpack-sources "^1.4.1"
5760whet.extend@~0.9.9:
5761 version "0.9.9"
5762 resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1"
5763 integrity sha1-+HfVv2SMl+WqVC+twW1qJZucEaE=
5764
5765which-module@^1.0.0:
5766 version "1.0.0"
5767 resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f"
5768 integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=
5769 5909
5770which-module@^2.0.0: 5910which-module@^2.0.0:
5771 version "2.0.0" 5911 version "2.0.0"
5772 resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" 5912 resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
5773 integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= 5913 integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=
5774 5914
5775which@1, which@^1.2.9: 5915which@^1.2.14, which@^1.2.9, which@^1.3.1:
5776 version "1.3.1" 5916 version "1.3.1"
5777 resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" 5917 resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
5778 integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== 5918 integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
5779 dependencies: 5919 dependencies:
5780 isexe "^2.0.0" 5920 isexe "^2.0.0"
5781 5921
5782wide-align@^1.1.0: 5922which@^2.0.1:
5783 version "1.1.3" 5923 version "2.0.2"
5784 resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" 5924 resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
5785 integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== 5925 integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
5786 dependencies: 5926 dependencies:
5787 string-width "^1.0.2 || 2" 5927 isexe "^2.0.0"
5788
5789window-size@0.1.0:
5790 version "0.1.0"
5791 resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d"
5792 integrity sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=
5793 5928
5794wordwrap@0.0.2: 5929word-wrap@^1.2.3:
5795 version "0.0.2" 5930 version "1.2.3"
5796 resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" 5931 resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
5797 integrity sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8= 5932 integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==
5798 5933
5799wordwrap@~1.0.0: 5934worker-farm@^1.7.0:
5800 version "1.0.0" 5935 version "1.7.0"
5801 resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" 5936 resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8"
5802 integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= 5937 integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==
5938 dependencies:
5939 errno "~0.1.7"
5803 5940
5804wrap-ansi@^2.0.0: 5941wrap-ansi@^5.1.0:
5805 version "2.1.0" 5942 version "5.1.0"
5806 resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" 5943 resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09"
5807 integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= 5944 integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==
5808 dependencies: 5945 dependencies:
5809 string-width "^1.0.1" 5946 ansi-styles "^3.2.0"
5810 strip-ansi "^3.0.1" 5947 string-width "^3.0.0"
5948 strip-ansi "^5.0.0"
5811 5949
5812wrappy@1: 5950wrappy@1:
5813 version "1.0.2" 5951 version "1.0.2"
5814 resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 5952 resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
5815 integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 5953 integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
5816 5954
5817write@^0.2.1: 5955write-file-atomic@^3.0.3:
5818 version "0.2.1" 5956 version "3.0.3"
5819 resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" 5957 resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8"
5820 integrity sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c= 5958 integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==
5959 dependencies:
5960 imurmurhash "^0.1.4"
5961 is-typedarray "^1.0.0"
5962 signal-exit "^3.0.2"
5963 typedarray-to-buffer "^3.1.5"
5964
5965write@1.0.3:
5966 version "1.0.3"
5967 resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3"
5968 integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==
5821 dependencies: 5969 dependencies:
5822 mkdirp "^0.5.1" 5970 mkdirp "^0.5.1"
5823 5971
5824xtend@^4.0.0: 5972xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1:
5825 version "4.0.1" 5973 version "4.0.2"
5826 resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" 5974 resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
5827 integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= 5975 integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
5828 5976
5829y18n@^3.2.1: 5977y18n@^4.0.0:
5830 version "3.2.1" 5978 version "4.0.0"
5831 resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" 5979 resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b"
5832 integrity sha1-bRX7qITAhnnA136I53WegR4H+kE= 5980 integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==
5833 5981
5834yallist@^2.1.2: 5982yallist@^3.0.2:
5835 version "2.1.2" 5983 version "3.1.1"
5836 resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" 5984 resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
5837 integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= 5985 integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
5838 5986
5839yallist@^3.0.0, yallist@^3.0.2: 5987yallist@^4.0.0:
5840 version "3.0.3" 5988 version "4.0.0"
5841 resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" 5989 resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
5842 integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== 5990 integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
5843 5991
5844yargs-parser@^5.0.0: 5992yaml@^1.10.0:
5845 version "5.0.0" 5993 version "1.10.0"
5846 resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a" 5994 resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e"
5847 integrity sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo= 5995 integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==
5996
5997yargs-parser@^13.1.2:
5998 version "13.1.2"
5999 resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38"
6000 integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==
5848 dependencies: 6001 dependencies:
5849 camelcase "^3.0.0" 6002 camelcase "^5.0.0"
6003 decamelize "^1.2.0"
5850 6004
5851yargs-parser@^7.0.0: 6005yargs-parser@^18.1.3:
5852 version "7.0.0" 6006 version "18.1.3"
5853 resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" 6007 resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0"
5854 integrity sha1-jQrELxbqVd69MyyvTEA4s+P139k= 6008 integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==
5855 dependencies: 6009 dependencies:
5856 camelcase "^4.1.0" 6010 camelcase "^5.0.0"
5857 6011 decamelize "^1.2.0"
5858yargs@^7.0.0: 6012
5859 version "7.1.0" 6013yargs@^13.3.2:
5860 resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" 6014 version "13.3.2"
5861 integrity sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg= 6015 resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd"
5862 dependencies: 6016 integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==
5863 camelcase "^3.0.0" 6017 dependencies:
5864 cliui "^3.2.0" 6018 cliui "^5.0.0"
5865 decamelize "^1.1.1" 6019 find-up "^3.0.0"
5866 get-caller-file "^1.0.1" 6020 get-caller-file "^2.0.1"
5867 os-locale "^1.4.0"
5868 read-pkg-up "^1.0.1"
5869 require-directory "^2.1.1"
5870 require-main-filename "^1.0.1"
5871 set-blocking "^2.0.0"
5872 string-width "^1.0.2"
5873 which-module "^1.0.0"
5874 y18n "^3.2.1"
5875 yargs-parser "^5.0.0"
5876
5877yargs@^8.0.2:
5878 version "8.0.2"
5879 resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360"
5880 integrity sha1-YpmpBVsc78lp/355wdkY3Osiw2A=
5881 dependencies:
5882 camelcase "^4.1.0"
5883 cliui "^3.2.0"
5884 decamelize "^1.1.1"
5885 get-caller-file "^1.0.1"
5886 os-locale "^2.0.0"
5887 read-pkg-up "^2.0.0"
5888 require-directory "^2.1.1" 6021 require-directory "^2.1.1"
5889 require-main-filename "^1.0.1" 6022 require-main-filename "^2.0.0"
5890 set-blocking "^2.0.0" 6023 set-blocking "^2.0.0"
5891 string-width "^2.0.0" 6024 string-width "^3.0.0"
5892 which-module "^2.0.0" 6025 which-module "^2.0.0"
5893 y18n "^3.2.1" 6026 y18n "^4.0.0"
5894 yargs-parser "^7.0.0" 6027 yargs-parser "^13.1.2"
5895
5896yargs@~3.10.0:
5897 version "3.10.0"
5898 resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1"
5899 integrity sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=
5900 dependencies:
5901 camelcase "^1.0.2"
5902 cliui "^2.1.0"
5903 decamelize "^1.0.0"
5904 window-size "0.1.0"