Compare commits

...

587 Commits
2.1.0 ... 3

Author SHA1 Message Date
github-actions ed0f42a509 Merge branch '3.12' into 3 2024-03-23 12:28:32 +00:00
Michal Kleiner 031545737d
Merge pull request #750 from purplespider/fix-publish-profile-image-2 2024-03-20 23:00:47 +13:00
James Cocker 9fae326927 FIX Use $owns instead of onBeforeWrite hook to publish profile image 2024-03-20 22:54:38 +13:00
github-actions ca0624cc25 Merge branch '3.12' into 3 2024-02-10 12:28:11 +00:00
Guy Sartorelli 95a2808c04
TLN Update translations (#742) 2024-02-07 16:01:34 +13:00
github-actions 3b6a519b39 Merge branch '3.12' into 3 2023-09-30 12:28:23 +00:00
Sabina Talipova 4ca99d07f3
Merge pull request #727 from nathanbrauer/feature/update-for-versioned-1.12
Bugfix: Updating BlogPostFilter::augmentSQL to make use of modern Versioned methods.
2023-09-26 08:51:37 +13:00
Nathan J. Brauer 712812332d Bugfix: Updating BlogPostFilter::augmentSQL to make use of modern Versioned methods.
This resolves an issue with some modules that rely upon get_draft_site_secured, like Elemental and sharedraftcontent
2023-09-19 21:18:06 -07:00
github-actions eb108b8e83 Merge branch '3.12' into 3 2023-08-26 12:28:25 +00:00
Guy Sartorelli 9d3a398901
ENH Update translations (#723) 2023-08-21 12:12:08 +12:00
Steve Boyd 941c2c7b11 Merge branch '3.12' into 3 2023-06-16 11:37:28 +12:00
Guy Sartorelli 92eeafb3b3
Merge pull request #713 from creative-commoners/pulls/3.12/tx-1686724560
ENH Update translations
2023-06-15 10:06:30 +12:00
Steve Boyd cf4452f5e0 ENH Update translations 2023-06-14 18:36:00 +12:00
Steve Boyd 84c93b1c2f Merge branch '3.12' into 3 2023-05-31 14:41:45 +12:00
Sabina Talipova c1349c6200
Merge pull request #711 from creative-commoners/pulls/3.12/tx-1685417378
ENH Update translations
2023-05-31 11:26:53 +12:00
Steve Boyd 09e79fd8a8 ENH Update translations 2023-05-30 15:29:38 +12:00
Guy Sartorelli ba49047d94
Merge branch '3.12' into 3 2023-04-26 12:45:55 +12:00
Guy Sartorelli f60541f18d
MNT Revert erroneous dependency changes (#704) 2023-03-28 17:01:53 +13:00
Maxime Rainville 587379b8b3
Merge pull request #703 from creative-commoners/pulls/3/dispatch-ci
MNT Use gha-dispatch-ci
2023-03-23 12:16:37 +13:00
Steve Boyd 0b231cb2a5 MNT Use gha-dispatch-ci 2023-03-21 12:20:48 +13:00
Guy Sartorelli 160cc023bb
MNT Update development dependencies 2023-03-10 16:32:39 +13:00
Guy Sartorelli 508c985ebe
MNT Update release dependencies 2023-03-10 16:32:36 +13:00
Guy Sartorelli 6edab24e07
MNT Update development dependencies 2023-03-10 12:21:28 +13:00
Guy Sartorelli 0f8aefb092
Merge pull request #701 from creative-commoners/pulls/3/tx-1678079019
ENH Update translations
2023-03-08 10:25:13 +13:00
Steve Boyd b46891a83f ENH Update translations 2023-03-06 18:03:39 +13:00
Guy Sartorelli 6c0ae1f28a
Merge branch '3.11' into 3 2022-12-19 02:06:18 +00:00
Guy Sartorelli 5cd7db79ec
Merge branch '3.11-release' into 3.11 2022-12-19 02:06:14 +00:00
Sabina Talipova 4a51782360
Merge pull request #691 from creative-commoners/pulls/3/stop-using-depr
API Stop using deprecated API
2022-12-05 16:38:39 +13:00
dependabot[bot] 9b36a59112
Merge pull request #692 from silverstripe/dependabot/npm_and_yarn/decode-uri-component-0.2.2 2022-12-04 08:29:03 +00:00
dependabot[bot] c20ebeed6a
Bump decode-uri-component from 0.2.0 to 0.2.2
Bumps [decode-uri-component](https://github.com/SamVerschueren/decode-uri-component) from 0.2.0 to 0.2.2.
- [Release notes](https://github.com/SamVerschueren/decode-uri-component/releases)
- [Commits](https://github.com/SamVerschueren/decode-uri-component/compare/v0.2.0...v0.2.2)

---
updated-dependencies:
- dependency-name: decode-uri-component
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-12-03 05:56:33 +00:00
Steve Boyd 6e020c663b API Stop using deprecated API 2022-11-25 12:43:00 +13:00
Daniel Hensby c407dc0cc2
Merge pull request #690 from passchn/patch-1
Fixed type annotation
2022-11-17 10:45:07 +00:00
Pascal Schneider 20d9f45442
Fixed type annotation
`FeaturedImage()` returns an instance of `SilverStripe\Assets\Image`, not a `Blog`.
2022-11-17 11:14:35 +01:00
Guy Sartorelli 1e647a33e6
Update translations 2022-11-10 01:56:20 +00:00
Guy Sartorelli cb02df3e4a
Merge pull request #687 from creative-commoners/pulls/3/review-behat-tests
ENH Replace ADMIN permissions with less permissions in Behat test
2022-09-14 13:02:18 +12:00
Sabina Talipova c7856961ec ENH Replace ADMIN permissions with less permissions in Behat test 2022-09-13 12:37:39 +12:00
Guy Sartorelli 034fdfe685
Merge pull request #688 from creative-commoners/pulls/3/test-doc-hook
DOC Very minor doc tweak to test netlify hook
2022-09-07 10:45:12 +12:00
Maxime Rainville 3f7e83b4e8 DOC Very minor doc tweak to test netlify hook 2022-09-07 10:42:49 +12:00
Maxime Rainville b88e2cfce7
Merge pull request #686 from creative-commoners/pulls/3/add-userdoc-deploy
MNT Add github action for deploying userdocs
2022-09-07 10:30:36 +12:00
Guy Sartorelli d346600f63
MNT Add github action for deploying userdocs 2022-08-23 15:29:56 +12:00
Guy Sartorelli c05f704a34
Merge pull request #684 from creative-commoners/pulls/3/restore-doc-title
DOC Restore page title
2022-08-22 11:02:16 +12:00
Maxime Rainville b1f5a9d3ad DOC Restore page title 2022-08-20 20:20:20 +12:00
Steve Boyd 3867888320 Merge branch '3.10' into 3 2022-08-02 18:45:11 +12:00
Steve Boyd 071b86c77b Merge branch '3.9' into 3.10 2022-08-02 18:45:07 +12:00
Guy Sartorelli 9be0e32395
Merge pull request #682 from creative-commoners/pulls/3.9/standardise-modules
MNT Standardise modules
2022-08-02 14:53:21 +12:00
Steve Boyd b55cd0458e MNT Standardise modules 2022-08-01 16:21:14 +12:00
Guy Sartorelli 7042bb9f3e
Merge pull request #681 from creative-commoners/pulls/3/update-js
MNT Use update-js action
2022-07-29 17:07:22 +12:00
Steve Boyd 0b9496e025 MNT Use update-js action 2022-07-29 13:07:13 +12:00
Steve Boyd 2c2833674c Merge branch '3.10' into 3 2022-07-25 09:57:32 +12:00
Steve Boyd 787d76154a Merge branch '3.9' into 3.10 2022-07-25 09:57:15 +12:00
Guy Sartorelli 3c5be80f09
Merge pull request #680 from creative-commoners/pulls/3.9/module-standards
MNT Use GitHub Actions CI
2022-07-15 11:04:06 +12:00
Steve Boyd 9a4abb17a6 MNT Use GitHub Actions CI 2022-07-14 11:28:50 +12:00
Steve Boyd 7927a98ca0
Merge pull request #673 from silverstripe/pulls/3/update-js-1648772547
DEP Update JS dependencies
2022-05-31 11:03:39 +12:00
Steve Boyd 8ba96e0c83 Merge branch '3.10' into 3 2022-05-10 21:52:35 +12:00
Steve Boyd 2b5d00b8d2 Update translations 2022-05-04 13:29:41 +12:00
dependabot[bot] 75f33fa845
Merge pull request #677 from silverstripe/dependabot/npm_and_yarn/async-2.6.4 2022-05-03 09:51:04 +00:00
dependabot[bot] 8d6a03bfde
Bump async from 2.6.3 to 2.6.4
Bumps [async](https://github.com/caolan/async) from 2.6.3 to 2.6.4.
- [Release notes](https://github.com/caolan/async/releases)
- [Changelog](https://github.com/caolan/async/blob/v2.6.4/CHANGELOG.md)
- [Commits](https://github.com/caolan/async/compare/v2.6.3...v2.6.4)

---
updated-dependencies:
- dependency-name: async
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-28 19:49:42 +00:00
Guy Sartorelli 2e0ac9e6c0
Merge pull request #675 from creative-commoners/pulls/3/php81
ENH PHP 8.1 compatibility
2022-04-27 09:56:28 +12:00
Steve Boyd 8f3778f77f ENH PHP 8.1 compatibility 2022-04-27 09:31:14 +12:00
Guy Sartorelli f8988ad5c3
Merge pull request #676 from creative-commoners/pulls/3/p81fix
ENH Various fixes for PHP 8.1 compatibility
2022-04-21 12:03:33 +12:00
Steve Boyd 6d8822ca12 ENH Various fixes for PHP 8.1 compatibility 2022-04-14 15:17:20 +12:00
github-actions c96b127d45 DEP Update JS dependencies 2022-04-01 00:22:27 +00:00
Maxime Rainville 214c370d68
Merge pull request #672 from creative-commoners/pulls/3/update-js-deps
MNT Add update JS deps workflow
2022-03-23 16:07:03 +13:00
Steve Boyd 571007d431 MNT Add update JS deps workflow 2022-03-22 12:05:44 +13:00
Michal Kleiner 183c659318
Merge pull request #671 from creative-commoners/pulls/3/unittest
MNT Unit test for add_default_author config
2022-03-09 22:03:32 +13:00
Steve Boyd f74c32a61e MNT Unit test for add_default_author config 2022-03-09 15:51:28 +13:00
Michal Kleiner e9507b7377
Merge pull request #669 from jellygnite/new-branch
ENH Add config to control if a default author is added to posts on creation
2022-03-03 23:33:57 +13:00
Jellygnite b55c7aa80d ENH Add config to control if a default author is added to posts on creation 2022-03-03 18:12:36 +10:00
Daniel Hensby 75d0a7dae6
Merge pull request #666 from creative-commoners/pulls/3/php74
DEP Set PHP 7.4 as the minimum version
2022-02-10 12:06:07 +00:00
Steve Boyd 7508ae626b DEP Set PHP 7.4 as the minimum version 2022-02-10 15:46:11 +13:00
Maxime Rainville 72941a5fe0
Merge pull request #664 from creative-commoners/pulls/3/js
DEP Update JS dependencies
2021-11-24 15:45:45 +13:00
Steve Boyd e77221646d DEP Update JS dependencies 2021-11-22 15:54:20 +13:00
Steve Boyd c35ce5c716
Merge pull request #663 from creative-commoners/pulls/3/fix-behat
MNT Fix behat test
2021-11-22 11:55:09 +13:00
Steve Boyd 9a7397222d MNT Fix behat test 2021-11-19 11:12:44 +13:00
Maxime Rainville 9ce39016ae
Merge pull request #660 from creative-commoners/pulls/3.8/behat
MNT Add behat tests
2021-11-18 17:11:15 +13:00
Steve Boyd cf18b58642 Merge branch '3.8' into 3 2021-11-18 16:58:42 +13:00
Steve Boyd 5d8aefdfcc MNT Require extra modules 2021-11-17 14:46:13 +13:00
Steve Boyd 7fcd354182 MNT Remove workflow 2021-11-16 10:37:57 +13:00
Steve Boyd 30298655e0
MNT Require extra modules 2021-11-14 09:41:28 +13:00
Steve Boyd e55c81ec7c MNT Add behat tests 2021-11-13 20:33:35 +13:00
Steve Boyd 5149c08d38
MNT Add workflow 2021-11-13 20:22:13 +13:00
Maxime Rainville 363a115300
Merge pull request #661 from creative-commoners/pulls/3/sapphire-test-nine
API phpunit9 support
2021-11-01 22:55:00 +13:00
Steve Boyd d8ecb77909 API phpunit9 support 2021-11-01 17:27:30 +13:00
Maxime Rainville 41bf421843 Update translations 2021-10-05 14:25:05 +13:00
Steve Boyd 2da5f45be5 Merge branch '3.8' into 3 2021-09-04 17:20:55 +12:00
Maxime Rainville bb574c7ed3 Update translations 2021-08-27 11:27:34 +12:00
dependabot[bot] d0c077ecb1
Merge pull request #658 from silverstripe/dependabot/npm_and_yarn/ws-6.2.2 2021-06-07 21:58:50 +00:00
dependabot[bot] 3a11155ff4
Bump ws from 6.2.1 to 6.2.2
Bumps [ws](https://github.com/websockets/ws) from 6.2.1 to 6.2.2.
- [Release notes](https://github.com/websockets/ws/releases)
- [Commits](https://github.com/websockets/ws/commits)

---
updated-dependencies:
- dependency-name: ws
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-06-06 17:39:39 +00:00
Steve Boyd 712b45c298 Merge branch '3.7' into 3 2021-05-21 13:42:42 +12:00
dependabot[bot] bf666edf7e
Merge pull request #656 from silverstripe/dependabot/npm_and_yarn/npm-6.14.13 2021-05-17 08:33:41 +00:00
Maxime Rainville 2410cb4a59 Update translations 2021-05-17 15:09:54 +12:00
dependabot[bot] 5e90a4a606
Bump npm from 6.13.0 to 6.14.13
Bumps [npm](https://github.com/npm/cli) from 6.13.0 to 6.14.13.
- [Release notes](https://github.com/npm/cli/releases)
- [Changelog](https://github.com/npm/cli/blob/v6.14.13/CHANGELOG.md)
- [Commits](https://github.com/npm/cli/compare/v6.13.0...v6.14.13)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-15 07:18:55 +00:00
dependabot[bot] a6b36b7689
Merge pull request #642 from silverstripe/dependabot/npm_and_yarn/y18n-3.2.2 2021-05-15 07:18:17 +00:00
dependabot[bot] 25787413a2
Merge pull request #653 from silverstripe/dependabot/npm_and_yarn/hosted-git-info-2.8.9 2021-05-15 07:18:03 +00:00
dependabot[bot] fde34fe80a
Bump hosted-git-info from 2.8.5 to 2.8.9
Bumps [hosted-git-info](https://github.com/npm/hosted-git-info) from 2.8.5 to 2.8.9.
- [Release notes](https://github.com/npm/hosted-git-info/releases)
- [Changelog](https://github.com/npm/hosted-git-info/blob/v2.8.9/CHANGELOG.md)
- [Commits](https://github.com/npm/hosted-git-info/compare/v2.8.5...v2.8.9)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-14 22:48:51 +00:00
dependabot[bot] 8f507d60ea
Bump y18n from 3.2.1 to 3.2.2
Bumps [y18n](https://github.com/yargs/y18n) from 3.2.1 to 3.2.2.
- [Release notes](https://github.com/yargs/y18n/releases)
- [Changelog](https://github.com/yargs/y18n/blob/master/CHANGELOG.md)
- [Commits](https://github.com/yargs/y18n/commits)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-14 22:48:37 +00:00
dependabot[bot] 90902aff19
Merge pull request #645 from silverstripe/dependabot/npm_and_yarn/npm-registry-fetch-4.0.7 2021-05-14 22:47:52 +00:00
dependabot[bot] b89a756c5a
Merge pull request #631 from silverstripe/dependabot/npm_and_yarn/dot-prop-4.2.1 2021-05-14 20:16:14 +00:00
dependabot[bot] a5d1bb97ba
Bump npm-registry-fetch from 4.0.2 to 4.0.7
Bumps [npm-registry-fetch](https://github.com/npm/npm-registry-fetch) from 4.0.2 to 4.0.7.
- [Release notes](https://github.com/npm/npm-registry-fetch/releases)
- [Changelog](https://github.com/npm/npm-registry-fetch/blob/v4.0.7/CHANGELOG.md)
- [Commits](https://github.com/npm/npm-registry-fetch/compare/v4.0.2...v4.0.7)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-14 19:28:36 +00:00
dependabot[bot] f4bcafa7db
Merge pull request #646 from silverstripe/dependabot/npm_and_yarn/node-sass-4.14.1 2021-05-14 19:27:33 +00:00
dependabot[bot] fada57e312
Merge pull request #638 from silverstripe/dependabot/npm_and_yarn/elliptic-6.5.4 2021-05-14 12:55:27 +00:00
dependabot[bot] 04e2d42a4d
Bump node-sass from 4.13.0 to 4.14.1
Bumps [node-sass](https://github.com/sass/node-sass) from 4.13.0 to 4.14.1.
- [Release notes](https://github.com/sass/node-sass/releases)
- [Changelog](https://github.com/sass/node-sass/blob/master/CHANGELOG.md)
- [Commits](https://github.com/sass/node-sass/compare/v4.13.0...v4.14.1)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-14 11:21:35 +00:00
dependabot[bot] efc2ca7fef
Merge pull request #648 from silverstripe/dependabot/npm_and_yarn/bin-links-1.1.8 2021-05-14 11:20:13 +00:00
dependabot[bot] 570e7c42e5
Merge pull request #649 from silverstripe/dependabot/npm_and_yarn/ini-1.3.8 2021-05-14 11:17:09 +00:00
Loz Calver 6ba58755be
Merge pull request #652 from silverstripe/dependabot/npm_and_yarn/ssri-6.0.2
Bump ssri from 6.0.1 to 6.0.2
2021-05-04 09:17:39 +01:00
Steve Boyd f09a1e2d09 Merge branch '3.6' into 3 2021-05-03 14:29:08 +12:00
Dylan Wagstaff 4be03364de
Merge pull request #643 from creative-commoners/pulls/3.6/explain-defaults
DOC Add explanation for default values
2021-05-02 20:54:18 +12:00
dependabot[bot] 45d1b6e55c
Bump ssri from 6.0.1 to 6.0.2
Bumps [ssri](https://github.com/npm/ssri) from 6.0.1 to 6.0.2.
- [Release notes](https://github.com/npm/ssri/releases)
- [Changelog](https://github.com/npm/ssri/blob/v6.0.2/CHANGELOG.md)
- [Commits](https://github.com/npm/ssri/compare/v6.0.1...v6.0.2)

Signed-off-by: dependabot[bot] <support@github.com>
2021-04-29 19:31:11 +00:00
Steve Boyd 7da4a01425 Merge branch '3.6' into 3 2021-04-19 16:40:12 +12:00
Steve Boyd 9f572bc999
Merge pull request #650 from armsofnoodle/featuredImage-doc-block
Add doc blocks
2021-04-09 16:43:28 +12:00
armsofnoodle d6d57d8689 Add doc blocks for featured image and summary 2021-04-09 15:38:15 +12:00
dependabot[bot] ef3d9ec2f6
Merge pull request #625 from silverstripe/dependabot/npm_and_yarn/npm-user-validate-1.0.1 2021-04-07 01:17:00 +00:00
dependabot[bot] d7c4ad9a1b
Bump ini from 1.3.5 to 1.3.8
Bumps [ini](https://github.com/isaacs/ini) from 1.3.5 to 1.3.8.
- [Release notes](https://github.com/isaacs/ini/releases)
- [Commits](https://github.com/isaacs/ini/compare/v1.3.5...v1.3.8)

Signed-off-by: dependabot[bot] <support@github.com>
2021-04-07 00:44:25 +00:00
dependabot[bot] 0a98ad234c
Bump bin-links from 1.1.3 to 1.1.8
Bumps [bin-links](https://github.com/npm/bin-links) from 1.1.3 to 1.1.8.
- [Release notes](https://github.com/npm/bin-links/releases)
- [Changelog](https://github.com/npm/bin-links/blob/v1.1.8/CHANGELOG.md)
- [Commits](https://github.com/npm/bin-links/compare/v1.1.3...v1.1.8)

Signed-off-by: dependabot[bot] <support@github.com>
2021-04-07 00:44:21 +00:00
dependabot[bot] b85e65bd3b
Bump dot-prop from 4.2.0 to 4.2.1
Bumps [dot-prop](https://github.com/sindresorhus/dot-prop) from 4.2.0 to 4.2.1.
- [Release notes](https://github.com/sindresorhus/dot-prop/releases)
- [Commits](https://github.com/sindresorhus/dot-prop/compare/v4.2.0...v4.2.1)

Signed-off-by: dependabot[bot] <support@github.com>
2021-04-07 00:44:09 +00:00
dependabot[bot] 5ecb37f2c6
Bump elliptic from 6.5.3 to 6.5.4
Bumps [elliptic](https://github.com/indutny/elliptic) from 6.5.3 to 6.5.4.
- [Release notes](https://github.com/indutny/elliptic/releases)
- [Commits](https://github.com/indutny/elliptic/compare/v6.5.3...v6.5.4)

Signed-off-by: dependabot[bot] <support@github.com>
2021-04-07 00:44:02 +00:00
dependabot[bot] dfdcaaef4b
Bump npm-user-validate from 1.0.0 to 1.0.1
Bumps [npm-user-validate](https://github.com/npm/npm-user-validate) from 1.0.0 to 1.0.1.
- [Release notes](https://github.com/npm/npm-user-validate/releases)
- [Commits](https://github.com/npm/npm-user-validate/compare/v1.0.0...v1.0.1)

Signed-off-by: dependabot[bot] <support@github.com>
2021-04-07 00:43:59 +00:00
Steve Boyd 65f4c22e84 DOC Add explanation for default values 2021-04-07 12:14:02 +12:00
Steve Boyd 35f3da3483 Merge branch '3.6' into 3 2021-03-20 14:10:07 +13:00
Steve Boyd 53dc1df1aa
Merge pull request #635 from 3Dgoo/patch-2
FIX Ensure pagination start is not a negative number
2021-02-27 14:47:41 +13:00
3Dgoo 6f3bc628a7
Ensure pagination start is not a negative number 2021-02-25 07:25:18 +10:30
Steve Boyd 54f50eb06b
Update build status badge 2021-01-21 16:28:42 +13:00
Steve Boyd 195a9b0f83 Merge branch '3.6' into 3 2021-01-02 18:08:27 +13:00
Andre Kiste b286244a68
Merge pull request #632 from creative-commoners/pulls/3.6/travis-shared
MNT Travis shared config, use sminnee/phpunit
2020-12-21 14:45:47 +13:00
Steve Boyd dca5b11467 MNT Travis shared config, use sminnee/phpunit 2020-12-01 15:44:11 +13:00
Steve Boyd a07c2bb9ca ENH Update translations 2020-11-18 12:56:01 +13:00
Maxime Rainville 5b14e0b1bd Merge branch '3.5' into 3 2020-10-22 22:51:02 +13:00
Daniel Hensby 053660e795
Merge pull request #624 from MarcioBarrientos/614-category-tag-button
Fix category and tag buttons using input groups from bootstrap
2020-10-02 10:07:35 +01:00
Marcio Barrientos fc890d71c1 Fix category and tag buttons using input groups from bootstrap 2020-10-01 13:22:28 -06:00
Serge Latyntsev fc51e77af3
Merge pull request #621 from wernerkrauss/fix-619
FIX forward IDs given by DataList::relation()
2020-09-08 08:15:53 +12:00
wernerkrauss 31a3c3e7d1 FIX forward IDs given by DataList::relation()
This way calling `->relation('BlogPosts')` does not return an UnsavedRelationList

fixes #619
2020-08-28 05:36:15 +02:00
Serge Latyntsev 46f2608cfa
Merge pull request #620 from wernerkrauss/patch-1
FIX: augmentLoadLazyFields doesn't work with renamed tables
2020-08-28 11:26:03 +12:00
wernerkrauss dd8ce8b8dd FIX augmentLoadLazyFields doesn't work with renamed tables
On a project I renamed the table BlogPosts to News_Posts which led to a broken join clause.
2020-08-27 16:36:36 +02:00
Robbie Averill 8096c50130
Merge pull request #612 from creative-commoners/pulls/3.5/travis
Travis 3.5
2020-06-23 10:17:28 -07:00
Steve Boyd 8d5f020ad2 Travis 3.5 2020-06-23 12:27:34 +12:00
Maxime Rainville 92eb4f5da0 Merge branch '3.4' into 3.5 2020-06-12 14:24:02 +12:00
Maxime Rainville 44904cebf8 Merge branch '3.3' into 3.4 2020-06-12 14:21:47 +12:00
Maxime Rainville 7c338c5398 Merge branch '3.2' into 3.3 2020-06-12 14:20:26 +12:00
Maxime Rainville e919071f82 Merge branch '3.1' into 3.2 2020-06-12 14:19:48 +12:00
Maxime Rainville d108ccf883 Merge branch '3.0' into 3.1 2020-06-12 14:19:15 +12:00
Robbie Averill c4d11e2510
Merge pull request #597 from creative-commoners/pulls/3.0/upgrade.widgets
Add missing widget models to db classname remapping
2019-12-13 17:54:48 -08:00
Serge Latyntcev 21c858b9d5 Merge branch '3.4' into 3 2019-11-18 11:21:20 +13:00
Andre Kiste 43861a0347
Merge pull request #598 from creative-commoners/pulls/3/upgrade-dependencies
Upgrading dependencies
2019-11-11 20:10:34 +13:00
Maxime Rainville 69395eaeaa Add jQuery dependency 2019-11-11 14:36:32 +13:00
Maxime Rainville d1e8b518a6 Upgradeing dependencies 2019-11-08 17:33:51 +13:00
Dylan Wagstaff 6e1c77af0b Add missing widget models to db classname remapping
SilverStripe 4 has introduced namespacing, and thus ClassName field in
the database is now referring to classes that no longer exist. However
on a dev/build these will be updated so long as there is configuration
mapping the old class name to the new class name. However Blog module
here is missing the widget classes, which causes problems with
migrations. This will fix that.
2019-11-04 11:31:20 +13:00
Guy Marriott d06fe86d54
Update translations 2019-08-20 16:37:58 +12:00
Robbie Averill 3fa6a1b45f Merge branch '3.4' into 3 2019-08-15 13:51:11 +12:00
Robbie Averill 1216106ad4 Merge branch '3.3' into 3.4 2019-08-15 13:51:04 +12:00
Robbie Averill 40eb69ef62 Use trusty distro in Travis builds 2019-08-15 13:50:58 +12:00
Robbie Averill 8db2e681a2 Merge branch '3.4' into 3 2019-08-15 09:46:26 +12:00
Robbie Averill c134ce44c1 Switch assertions to test the end of the strings 2019-08-15 09:46:05 +12:00
Ryan Potter 14283d88b8 Set docblock for the setButtonName method, and don't invalidate localisation text. 2019-08-15 09:44:51 +12:00
Ryan Potter 651d6c1da9 Remove .idea folder from version control 2019-08-15 09:44:47 +12:00
Ryan Potter ea2fcd0b6e Added a method to set the button name in a GridFieldAddByDBField component 2019-08-15 09:44:40 +12:00
Tim Burt dd18648ed1 Make featured images directory configurable 2019-08-15 09:44:14 +12:00
Robbie Averill a9a7c21751 Merge branch '3.3' into 3 2019-07-01 10:16:09 +12:00
Robbie Averill e2bf714757 Merge branch '3.2' into 3.3 2019-07-01 10:15:47 +12:00
Robbie Averill e6a7a4c8e8 Update SilverStripe versions in Travis builds 2019-07-01 10:15:17 +12:00
Guy Marriott b1c853eafe
UX expand custom summary if field has value (#587)
UX expand custom summary if field has value
2019-05-17 16:51:08 +12:00
Nic Horstmeier 679e690ca5 UX expand custom summary if field has value
resolves #566
2019-05-16 23:27:14 -05:00
Robbie Averill 98183ad677 Update references to text fixtures and SS_List class namespace from cherry-picked SilverStripe 3 commit 2019-05-13 09:18:27 +12:00
3Dgoo 3d9031aaac Adding ansi quote to identifier 2019-05-13 09:14:42 +12:00
3Dgoo 317729604d Adding tests
Adding tests to check that archive widget correctly only shows blog posts from the related blog and not any other blog.
2019-05-13 09:13:52 +12:00
3Dgoo ebd135b029 Adding tests
Adding tests to check that archive widget correctly only shows blog posts from the related blog and not any other blog.
2019-05-13 09:10:47 +12:00
3Dgoo 01c1ead069 Fix blog archive widget bug
Fixes blog archive widget bug to only get the archive months for the blog linked to in this widget.
2019-05-13 09:08:42 +12:00
Robbie Averill 705c2de93f Merge branch '3.3' into 3 2019-05-10 10:01:26 +12:00
Robbie Averill ec116870f5 Update translations 2019-05-10 10:00:21 +12:00
Guy Marriott 3204d25c06
Update translations 2019-05-09 15:44:57 +12:00
Dylan Wagstaff b94e02d56a
Merge pull request #580 from creative-commoners/pulls/3.3/widget-titles
FIX Widget titles may not be defined, in which case having an empty heading element is bad for accessibility
2019-05-02 14:35:50 +12:00
Robbie Averill 04dfad688e FIX Widget titles may not be defined, in which case having an empty heading element is bad for accessibility 2019-05-02 13:46:57 +12:00
Robbie Averill ad320d7d88
Merge pull request #578 from SpeksForks/featured-blog-posts-widget
Featured Blog posts widget
2019-04-15 18:06:22 +12:00
Peter Thaleikis afecae4eba MINOR: tweaking implementation 2019-04-15 15:51:35 +12:00
Robbie Averill c8914cc779 Update src/Model/BlogPostFeaturedExtension.php
Co-Authored-By: spekulatius <spekulatius@users.noreply.github.com>
2019-04-15 15:51:35 +12:00
Peter Thaleikis fdeb101882 MINOR: implementing featured blog posts as a widget 2019-04-15 15:51:35 +12:00
Will Dawber ab8325f965 Compatibility issues with core index (#550)
Making index function compatible with SilverStripe\CMS\Model\RedirectorPageController, this stops issues when module installed and also creating a custom index function in PageController
2019-04-15 15:25:35 +12:00
Stevie Mayhew 8ae3614335 Add index to PublishDate - also see #559 2019-04-15 15:24:59 +12:00
Sacha Judd 765b315fe7 NEW Add font-icon for site tree blog holder and posts 2019-04-15 15:24:45 +12:00
Robbie Averill dd8e401dbf NEW Add tests for blog archive links and tidy up code re-use a little 2019-04-15 15:24:31 +12:00
Peter Thaleikis 078c877cbb MINOR: avoid current blog post being included in the recent posts widget 2019-04-15 15:24:05 +12:00
Robbie Averill 1d775aa664 Merge branch '3.2' into 3 2019-04-15 15:23:13 +12:00
Guy Marriott 23f05ac21e
Merge pull request #573 from creative-commoners/pulls/3.2/multibyte-tag-tests
FIX Categories and tags now respect multibyte url configuration
2019-02-11 09:21:40 +13:00
Robbie Averill d1ea6bb839 FIX Categories and tags now respect multibyte url configuration
Previously multibyte URLs would always work, regardless of URLSegmentFilter::$default_allow_multibyte.
This change means that they will only work when the setting is enabled.
2019-02-07 12:05:32 +03:00
Dylan Wagstaff a2751b46e9
Merge pull request #572 from creative-commoners/pulls/3.2/travis-updates
Add PHP 7.3 and SS 4.3 to Travis builds
2019-02-07 11:42:03 +13:00
Robbie Averill 21772c3f86 Add PHP 7.3 and SS 4.3 to Travis builds 2019-02-06 23:36:05 +03:00
Robbie Averill 5e511538eb
Merge pull request #571 from creative-commoners/pulls/3.2/blog-multibyte-url-tests
FIX Multibyte URL encoding for blog profiles, and encoded params in functional tests
2019-02-06 23:34:10 +03:00
Robbie Averill cbbe8b94db FIX Multibyte URL encoding for blog profiles, and encoded params in functional tests 2019-02-05 16:50:21 +03:00
Robbie Averill 5522ba685f Merge branch '3.2' into 3 2018-12-12 14:54:25 +00:00
Robbie Averill 9c10a86de8 Merge branch '3.1' into 3.2 2018-12-12 14:52:37 +00:00
Robbie Averill ee0077f861 Merge branch '3.0' into 3.1 2018-12-12 14:45:48 +00:00
Robbie Averill d7a2fc5a6c Update translations 2018-12-12 14:44:28 +00:00
Dylan Wagstaff 23ea09261e Merge branch '3.2' into 3 2018-12-07 10:01:11 +13:00
Dylan Wagstaff 19cfe75671 Merge branch '3.1' into 3.2 2018-12-07 10:00:37 +13:00
Dylan Wagstaff 62d628cf62 Merge branch '3.0' into 3.1 2018-12-07 09:59:57 +13:00
Robbie Averill 233a5e6397 FIX Blog profile summary field is always inserted before the profile image field 2018-12-07 09:59:16 +13:00
Guy Marriott 17ed46cddd
Merge pull request #563 from shaunjc/sjc/3.0-date-fix
FIX: Update Blog archive date formats for SS4
2018-11-26 15:22:18 +13:00
Shaun Cockerill c0895803db FIX: Update Blog archive date formats for SS4 2018-11-26 10:03:29 +08:00
stevevu 682e522565 update namespace for blog controllers
more specifically: Blog_Controller, BlogController, BlogPost_Controller, BlogPostController
2018-10-19 20:37:10 +02:00
Guy Marriott 4b1f4b3606
Merge pull request #553 from creative-commoners/pulls/3.2/remove-obsolete-z-index
FIX Remove obsolete z-index values for CMS menus. Fixes fullscreen TinyMCE overlap
2018-09-11 09:48:34 +12:00
Robbie Averill 38a8b77c77 Add yarn lock file 2018-09-10 16:33:33 +02:00
Robbie Averill b41d5c8da4 FIX Remove obsolete z-index values for CMS menus. Fixes fullscreen TinyMCE overlap 2018-09-10 16:33:28 +02:00
Dylan Wagstaff 9d568ecdca
Merge pull request #552 from creative-commoners/pulls/3.2/reorder-fields
FIX Blog profile summary field is always inserted before the profile image field
2018-09-06 09:51:51 +12:00
Robbie Averill fb1b6929a9 FIX Blog profile summary field is always inserted before the profile image field 2018-09-05 14:56:05 +02:00
Robbie Averill a0ef930549 Remove obsolete branch alias 2018-08-27 10:56:24 +12:00
Robbie Averill 7ebae00ad3 Merge branch '3.2' 2018-07-26 14:54:45 +12:00
Dylan Wagstaff 991000dddf
Merge pull request #545 from kinglozzer/removable-tab
FIX: Unable to remove 'Post Options' tab
2018-07-10 09:35:13 +12:00
Loz Calver c3ac001a0a FIX: Unable to remove 'Post Options' tab 2018-07-09 10:58:10 +01:00
Robbie Averill 523bb31070 Rebuild dist files 2018-07-06 18:25:09 +12:00
Daniel Hensby b06659e71a
Merge branch '3.2' 2018-06-19 21:56:22 +01:00
Daniel Hensby 69e39e94e6
Merge branch '3.1' into 3.2 2018-06-19 21:54:39 +01:00
Daniel Hensby 468e0530fd
Merge branch '3.0' into 3.1 2018-06-19 21:51:26 +01:00
Daniel Hensby fcda48175c
Merge branch '2.5' into 3.0 2018-06-19 21:48:59 +01:00
Daniel Hensby 2da2c2927f
Merge branch '2.4' into 2.5 2018-06-19 21:40:41 +01:00
Robbie Averill a4efb3409c
Merge pull request #540 from dhensby/pulls/2.4/fix-multibyte-urlfilter
FIX Make sure `setAllowMultibyte` is on when looking up by URLSegment
2018-06-20 08:24:01 +12:00
Daniel Hensby 3b14436304
TEST Fix regression in tests from new Versioned exceptions 2018-06-19 14:39:17 +01:00
Daniel Hensby d392ca72f1
FIX Make sure `setAllowMultibyte` is on when looking up by URLSegment 2018-06-19 14:23:27 +01:00
Robbie Averill 81e2bfee4a
Merge pull request #538 from creative-commoners/pulls/master/add-supported-module-badge
Add supported module badge to readme
2018-06-18 10:49:47 +12:00
Dylan Wagstaff c605d4cd68 Add supported module badge to readme 2018-06-15 17:31:09 +12:00
Robbie Averill f93895cae1 Update branch alias for 3.x-dev 2018-06-11 12:06:25 +12:00
Robbie Averill fe16afe7b0 Merge branch '3.2' 2018-06-11 12:06:08 +12:00
Robbie Averill 2e605d797c Remove obsolete branch alias 2018-06-11 12:05:46 +12:00
Robbie Averill 14eab5dc5a Merge branch '3.1' into 3.2 2018-06-11 12:02:23 +12:00
Robbie Averill fcf7127f09
Merge pull request #536 from MarcioBarrientos/fix
Call the correct method ->isModifiedOnDraft()
2018-06-07 16:04:38 +12:00
Marcio Barrientos 4e5f25c5eb Call the correct method ->isModifiedOnDraft() 2018-06-07 15:53:39 +12:00
Robbie Averill 06dbb72432
Merge pull request #534 from creative-commoners/docs/new-UI-images
Update images to new SS4 UI
2018-05-31 16:46:12 +12:00
Sacha Judd 4be275a0df Update images to new SS4 UI 2018-05-31 16:45:26 +12:00
Dylan Wagstaff e63c5d4482
Merge pull request #530 from creative-commoners/pulls/3.1/modified-state
FIX Use correct API for determining if record is modified on draft stage
2018-04-20 21:05:50 +12:00
Robbie Averill dc26478e94 FIX Use correct API for determining if record is modified on draft stage 2018-04-20 17:05:29 +12:00
Robbie Averill c83232bd6e Merge branch '3.1' 2018-04-10 15:53:48 +12:00
Robbie Averill db0d4f0f98 Merge branch '3.0' into 3.1 2018-04-10 15:53:04 +12:00
Robbie Averill ae953b9a3c
Update constraints for dependencies 2018-04-10 15:49:44 +12:00
Dylan Wagstaff 50612b4f4c Remove obsolete branch alias 2018-04-10 14:42:51 +12:00
Robbie Averill c344575ef9
Merge pull request #527 from JorisDebonnet/urlsegment-on-main
Bring back BlogPost URLSegment to Main tab
2018-04-10 14:13:50 +12:00
Joris Debonnet 06bcd961ce Bring back BlogPost URLSegment to Main tab 2018-04-10 02:04:44 +02:00
Dylan Wagstaff 2d62251858
Merge pull request #524 from creative-commoners/pulls/3.2/tweaks
Minor tweaks, syntax, namespace imports, docblocks, test improvements
2018-04-09 12:06:34 +12:00
Robbie Averill d520d9dd94 Merge branch '3.1' 2018-04-06 10:29:45 +12:00
Robbie Averill 4c1303bfb5 Remove obsolete branch alias, remove @dev constraints on assets and asset-admin 2018-04-06 10:29:02 +12:00
Robbie Averill 85b297140f Use FQCN in expectedException annotation 2018-04-06 10:27:18 +12:00
Robbie Averill c0695224d6 Switch try/catch for exception to use expected exception and code 2018-04-06 10:24:22 +12:00
Robbie Averill afc1a3dd25 Use SapphireTest::logOut over manually checking Security::getCurrentUser 2018-04-06 10:24:04 +12:00
Robbie Averill 9d26cff23d NEW Add translation support for blog post authors profile summary heading 2018-04-06 10:23:22 +12:00
Robbie Averill 86c0f56620 Use ::class for class_exists checks on Widget, fix setUp/tearDown method visibility 2018-04-06 10:22:58 +12:00
Robbie Averill 7c4574ba78 Switch argument order in FieldList::insertAfter calls 2018-04-06 10:21:43 +12:00
Robbie Averill c123951768 Add missing class imports from docblocks and fix incorrect docblocks 2018-04-06 10:21:26 +12:00
Robbie Averill ba8ad43f41 Add various installer versions to Travis build matrix 2018-04-06 10:19:55 +12:00
Dylan 392b4aafd9 Update translations 2018-04-04 10:17:01 +12:00
Daniel Hensby fdbfa8995c
Merge pull request #520 from creative-commoners/pulls/3.0/remove-add-blog-post
FIX Remove "Add new blog post" button from Blog Posts GridField in a members profile
2018-03-22 13:21:01 +00:00
Robbie Averill fffd2cece3 FIX Remove "Add new blog post" button from Blog Posts GridField in a members profile 2018-03-22 17:17:03 +13:00
Loz Calver 836c7b4c22
Merge pull request #517 from creative-commoners/pulls/3.0/fix-config-reference
FIX Correctly import namespaces in BlogPostNotifications class
2018-03-20 10:03:49 +00:00
Robbie Averill 29154eae4c FIX Correctly import namespaces in BlogPostNotifications class 2018-03-20 16:54:55 +13:00
Dylan Wagstaff 374c3e2893
Merge pull request #515 from DrMartinGonzo/patch-2
Fix bad date formatting
2018-03-20 14:16:03 +13:00
Martin Portevin b483446a45
Fix bad date formatting
`m` returns minute in hour as seen here : http://userguide.icu-project.org/formatparse/datetime
2018-03-20 01:54:08 +01:00
Daniel Hensby 049e77227e
Merge pull request #512 from zanderwar/pulls/enhancement/minutes-to-read
ENHANCEMENT added getMinutesToRead()
2018-03-14 14:27:52 +00:00
zanderwar 3f24858b73 ENHANCEMENT added MinutesToRead() 2018-03-14 18:01:09 +10:00
Dylan c4e06a4b07 Update development dependencies 2018-02-22 18:14:32 +13:00
Daniel Hensby 9cc98c3e19
Merge pull request #511 from dhensby/pull/502
Make Categorization and PostOptions localizable
2018-02-20 12:58:18 +00:00
marcio.barrientos 519fe25da1
Make Categorization and PostOptions localizable
Allow to make localizable Blog Categorization tab and BlogPost Options tab
2018-02-20 11:38:30 +00:00
Robbie Averill 5c1cedeb98 Merge branch '2' 2018-02-20 11:05:54 +13:00
Robbie Averill fbfa5e38c1 Merge branch '2.5' into 2 2018-02-20 11:02:14 +13:00
Robbie Averill c76cbcb0f0 Merge branch '2.4' into 2.5 2018-02-20 11:01:29 +13:00
Robbie Averill 767250435e Remove PHP 5.3 from Travis builds 2018-02-20 11:01:09 +13:00
3Dgoo f948afe271 Fixing non int pagination variable server error
If a user tries to paginate the blog using a value that is not an integer SilverStripe will throw a server error.

Example. Visiting `blog/?start=10.1` will cause the following server error:

```You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '10.1' at line 8```

This change casts the pagination variable to an int before using it.
2018-02-20 11:00:09 +13:00
Dylan Wagstaff b76f1e1840
Merge pull request #509 from 3Dgoo/patch-1
Fixing non int pagination variable server error SS3
2018-02-20 10:56:29 +13:00
3Dgoo 483a384fb1
Fixing non int pagination variable server error
If a user tries to paginate the blog using a value that is not an integer SilverStripe will throw a server error.

Example. Visiting `blog/?start=10.1` will cause the following server error:

```You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '10.1' at line 8```

This change casts the pagination variable to an int before using it.
2018-02-20 07:47:49 +10:30
Robbie Averill b79f3db883
Merge pull request #507 from creative-commoners/pulls/3.0/vendorise-module
Review SS4 update
2018-01-30 11:55:29 +13:00
Raissa North 84ef592297 FIX Update template based requirement calss 2018-01-30 11:31:26 +13:00
Raissa North 8dfb4426a4 Remove unneeded requirement 2018-01-29 16:17:41 +13:00
Raissa North 1feaa52ed7 ENHANCEMENT Update hard reference to png file 2018-01-29 16:16:45 +13:00
Raissa North e437e7ac42 Optimise imports 2018-01-29 16:13:19 +13:00
Raissa North f2ef7a945e FIX Fix line length 2018-01-29 16:10:45 +13:00
Raissa North ba6328f558 Run TextCollector task 2018-01-29 16:08:45 +13:00
Raissa North f131daf5f5 ENHANCEMENT Vendorise module and expose dist and images directory 2018-01-29 16:07:07 +13:00
Raissa North 6ce8871e87 Remove old compiled CSS files, they live in client now 2018-01-29 16:04:18 +13:00
Raissa North 8b005b3251 FIX Javascript and SCSS linting and removed unused images 2018-01-29 16:03:51 +13:00
Raissa North 12e8025e6f Update license year 2018-01-29 16:01:17 +13:00
Raissa North f3c7c402d8 Update readme, editorconfig, phpcs ruleset 2018-01-29 16:01:08 +13:00
Raissa North 12c4b717ed API Remove default values from GridField class constructors 2018-01-29 15:59:46 +13:00
Raissa North b4d7530082 API Rename GridFieldConfig so it has no underscore in the class name 2018-01-29 15:57:17 +13:00
Raissa North ac5a736542 Add PHP 7.2 to Travis build configuration 2018-01-29 15:51:37 +13:00
Raissa North bf13d522a3 FIX Update Requirements references to new build paths 2018-01-29 11:50:39 +13:00
Raissa North 7ef456a1e6 API Convert gulp and Compass builds to use Webpack 2018-01-29 11:46:54 +13:00
Robbie Averill ef2f1165d7
Merge pull request #505 from creative-commoners/pulls/3.0/blogpoststate-icons
FIX Replace jQuery UI icons with admin font icons
2018-01-25 10:54:05 +13:00
Raissa North c122f17d91 FIX Use clock icon for scheduled posts 2018-01-25 08:46:05 +13:00
Raissa North dd66125f3a FIX Remove timer icon image and associated CSS styles 2018-01-24 16:57:09 +13:00
Raissa North f38630c894 FIX Auto publish a Member's profile image when saving 2018-01-24 16:54:56 +13:00
Raissa North b37ad24930 FIX Replace jQuery UI icons with admin font icons 2018-01-24 16:28:12 +13:00
Robbie Averill 649536521d
Merge pull request #500 from dhensby/pulls/test-fixes
Fix regression in tests
2018-01-11 07:40:57 +13:00
Daniel Hensby b7510c8a56
Remove use of deprecated assertDOSContains 2018-01-10 12:27:00 +00:00
Daniel Hensby 0c23c78bfa
Publish test widget explicitly 2018-01-10 12:25:23 +00:00
Daniel Hensby 51edd8d620
Reorganise imports and class detection for WidgetControllers 2018-01-10 09:08:40 +00:00
Daniel Hensby 66531fd95a
Merge pull request #499 from nspyke/fix-widget-templates
#498: Moved widget templates
2018-01-10 08:51:11 +00:00
Nik Spijkerman 59bd411f19 #498: Moved widget templates 2018-01-10 18:47:39 +13:00
Robbie Averill e4d389aeb2
Merge pull request #496 from korthjp17/bugfix/widgetNameSpacing
fixed namespacing for widgets
2018-01-09 10:19:01 +13:00
Jason Korth 64437b974d fixed namespacing for widgets
fixes #495
2018-01-04 14:07:28 -06:00
Daniel Hensby ae72dbe166
Merge pull request #494 from jsirish/bugfix/setTableNames
bugfix - set $table_name for widgets
2017-12-15 15:04:31 +00:00
Jason Irish db071b2692 bugfix - set $table_name for widgets
SilverStripe 4.0.1 throws warnings when the widget module is installed.
2017-12-14 22:24:20 -06:00
Robbie Averill 6929e0178b
Merge pull request #490 from creative-commoners/pulls/2.4/add-missing-translation
FIX Add missing translation for GridFieldBlogPostState
2017-12-01 17:37:24 +13:00
Raissa North 18fe0a96e7 FIX Add missing translation for GridFieldBlogPostState 2017-12-01 16:36:00 +13:00
Robbie Averill 4810e73278 Merge branch '2.5' into 2 2017-11-20 14:32:05 +13:00
Robbie Averill 0efaef958a Update branch alias for 2.6.x-dev 2017-11-20 14:31:48 +13:00
Robbie Averill 1a9cdee0f2 Remove obsolete branch alias 2017-11-20 14:31:23 +13:00
Daniel Hensby 1d6cf1dec6
Merge pull request #486 from zanderwar/pulls/3.0/optional-profiles
Allow a user to disable all profiles
2017-11-06 15:56:55 +00:00
Robbie Averill 271fbfeae7 Merge branch '2' 2017-11-03 15:39:57 +13:00
Robbie Averill ffc0ab7f38 Merge branch '2.4' into 2 2017-11-03 15:35:11 +13:00
Damian Mooyman f2a0c36bd6
Merge pull request #487 from creative-commoners/pulls/2.4/fix-parent-canview
FIX Ensure that draft blog posts are always viewable to users with view draft permission
2017-11-03 15:12:44 +13:00
Robbie Averill c2f58507a0 FIX Ensure that draft blog posts are always viewable to users with view draft permission 2017-11-03 14:00:14 +13:00
zanderwar 99112e6eef Test for disable_profiles option 2017-11-03 08:32:38 +13:00
zanderwar 2e01219e8f Documentation for disabling user profiles 2017-11-03 08:32:25 +13:00
zanderwar 3d8f0941ed Added config option check for disable_profiles and removed linking if it is disabled 2017-11-03 08:32:03 +13:00
zanderwar 54aeb23356 Fixed return tags and values 2017-11-01 22:00:33 +13:00
Daniel Hensby 49744a0a94
Updating travis install steps 2017-10-12 13:28:32 +01:00
Robbie Averill c0b10e450e Merge pull request #482 from creative-commoners/pulls/vendorise-ci
FIX convert CI bootstrap references to new their new locations in vendor
2017-10-05 11:04:12 +13:00
Dylan Wagstaff ee74732b1f FIX convert CI bootstrap references to new their new locations in vendor 2017-10-05 10:07:54 +13:00
Franco Springveldt f972b1cfa6 FIX testArchiveMonthlyWithNewPostsAdded SS4 friendly 2017-09-28 17:37:31 +13:00
Franco Springveldt 993846b98c FIX merge conflicts 2017-09-28 16:53:32 +13:00
Franco Springveldt f29b73f532 Merge branch '2.4' into 2 2017-09-28 16:46:58 +13:00
Franco Springveldt 246b203452 Merge pull request #481 from creative-commoners/pulls/2.4/fix-archive-widget-date-today
FIX Archive widget shows months from posts published that day
2017-09-28 16:40:49 +13:00
Robbie Averill d47648a86d FIX Archive widget shows months from posts published that day 2017-09-28 15:08:30 +13:00
Robbie Averill 427abee8b0 FIX Datetime format for MySQL and Postgres, add widgets to Travis builds 2017-09-27 13:25:03 +13:00
Florian Thoma dae2ba0e5f add meta links for previous and next pages in pagination 2017-09-27 13:14:27 +13:00
Robbie Averill 6525f1c109 FIX Update BlogArchiveWidget and tests for SS4 2017-09-27 11:49:57 +13:00
Robbie Averill 75f5042d60 Merge branch '2' 2017-09-27 11:48:41 +13:00
Robbie Averill 385fe9572a Merge branch '2.4' into 2 2017-09-27 11:25:36 +13:00
Loz Calver 165ef46b64 Merge pull request #480 from creative-commoners/pulls/2.4/archived-widget-years
FIX Display individual years in blog archive widget when set to "Yearly"
2017-09-26 09:13:05 +01:00
Robbie Averill 8e684dea50 FIX BlogArchiveWidget for PostgreSQL compatibility 2017-09-26 17:17:53 +13:00
Robbie Averill 92f6192870 Increase mimumum versioned of SilverStripe to 3.2 and update versions in Travis configuration 2017-09-26 17:05:04 +13:00
Robbie Averill a1e4f3efce Add tests for BlogArchiveWidget 2017-09-26 16:17:41 +13:00
Robbie Averill b1acc1d359 Merge pull request #479 from creative-commoners/pulls/2/fix-help-links
FIX Blog user settings help links displayed incorrectly
2017-09-26 09:28:32 +13:00
Daniel Hensby 311842a69b
Add sass config and compile 2017-09-25 21:00:48 +01:00
Robbie Averill 27044d86a5 FIX Display individual years in blog archive widget when set to "Yearly" 2017-09-22 14:54:44 +12:00
Franco Springveldt 010d751337 FIX Blog user settings help links displayed incorrectly 2017-09-22 12:20:41 +12:00
Robbie Averill 5fb5bc0b2a Merge pull request #476 from creative-commoners/pulls/2/ss4-docs-update
DOC SS4 documentation update
2017-09-21 11:10:14 +12:00
Franco Springveldt 740d252536 Merge branch 'creative-commoners-pulls/2/ss4-docs-update' 2017-09-21 10:38:13 +12:00
Franco Springveldt 38d1fac04d Merge branch 'pulls/2/ss4-docs-update' of https://github.com/creative-commoners/silverstripe-blog into creative-commoners-pulls/2/ss4-docs-update 2017-09-21 10:37:18 +12:00
Franco Springveldt 5d516ea678 FIX namespaced includes 2017-09-21 09:11:37 +12:00
Franco Springveldt 3936ddcaff DOC typos and translations fixed 2017-09-21 09:05:07 +12:00
Franco Springveldt 8e3729de51 SS4 documentation updates 2017-09-20 12:15:19 +12:00
Daniel Hensby 35cbc20d5f Merge pull request #437 from xini/feature-prev-next
add meta links for previous and next pages in paging and post view
2017-09-19 12:03:21 +01:00
Robbie Averill dd31c6fa35 Merge pull request #473 from creative-commoners/pulls/2/further-translations-updates
FIX Language file updates
2017-09-19 12:03:16 +12:00
Franco Springveldt 297e384b85 Removed HTML from lang files 2017-09-19 10:57:02 +12:00
Franco Springveldt 5737881cee Lang updates 2017-09-19 10:50:13 +12:00
Daniel Hensby b83e0e8117 Merge pull request #472 from creative-commoners/pulls/2/updating-translations
FIX updated translations to use namespaces
2017-09-18 10:44:45 +01:00
Robbie Averill 6527cbae16 Revert "Removing translations in preparation for namepsacing them"
This reverts commit 6a16213bc7.
2017-09-18 16:03:08 +12:00
Franco Springveldt dc0e56b49a FIX further translations fixed in templates 2017-09-18 15:59:58 +12:00
Robbie Averill db18b5d31f FIX Update BlogFunctionalTest for SS4 2017-09-18 15:56:31 +12:00
Franco Springveldt 90359e36f8 FIX updated translations to use namespaces 2017-09-18 15:24:33 +12:00
Robbie Averill 7f63681d33 Merge branch '2' 2017-09-14 17:11:45 +12:00
Robbie Averill 9a5690ca3e Merge branch '2.4' into 2 2017-09-14 16:53:42 +12:00
Robbie Averill 4aa468a6ab Merge pull request #470 from creative-commoners/pulls/2/update-translations
Removing translations in preparation for namepsacing them
2017-09-14 15:57:43 +12:00
Franco Springveldt 6a16213bc7 Removing translations in preparation for namepsacing them 2017-09-14 14:00:41 +12:00
Robbie Averill de0e8e0100 Merge pull request #469 from creative-commoners/pulls/3/further-ss4-compat
ENHANCEMENT -  SS4 compatibility
2017-09-14 13:39:42 +12:00
Franco Springveldt 2417863ff8 FIX refactored classes to use Injectable::create() 2017-09-14 11:49:27 +12:00
Franco Springveldt 87e5cfcad7 FIX refactored deprecated DB::getConn() 2017-09-14 11:37:51 +12:00
Franco Springveldt 7823b40b57 FIX replaced magic config() calls to use the config::get() 2017-09-14 11:36:33 +12:00
Franco Springveldt 0b5b71c0fb FIX updated deprecated Member::logout() calls 2017-09-14 11:28:43 +12:00
Franco Springveldt e70e051380 FIX updated traditional array syntax 2017-09-14 10:59:01 +12:00
Franco Springveldt d9d5c01be3 FIX refactored to remove code from _config.php 2017-09-14 10:44:21 +12:00
Franco Springveldt e6cf037369 FIX namespaced _t() calls 2017-09-14 10:27:40 +12:00
Franco Springveldt 7c8866d280 FIX removed @package and @subpackage references 2017-09-14 10:01:45 +12:00
Franco Springveldt 026b64cafb FIX PHP Linter fixes 2017-09-14 09:55:09 +12:00
Franco Springveldt aec1d542b1 FIX updated depreated Member::currentUser() references 2017-09-14 09:53:29 +12:00
Michael Strong 66f8b80943 Merge pull request #466 from robbieaverill/pulls/2.4/multibyte-member-profiles
FIX Encode URLSegment to support multibyte member profile URLs
2017-09-06 09:37:47 +12:00
Robbie Averill 3bb197936f Always use precise on Travis 2017-09-04 06:49:34 +12:00
Robbie Averill 26311750b9 FIX Encode URLSegment to support multibyte member profile URLs 2017-09-03 21:59:15 +12:00
Franco Springveldt a212db35b7 Update translations 2017-08-28 16:35:55 +12:00
Daniel Hensby 619df86693 Merge pull request #446 from creative-commoners/issue/ss-widgets/144
FIX select list not in group-by clause error
2017-08-17 17:44:19 +01:00
Franco Springveldt 236bf6d8fc FIX added date formatting 2017-08-09 09:49:58 +12:00
Michael Strong 58a4693129 Merge pull request #460 from dhensby/pulls/2.4/date-override
FIX If BlogPost has date field, return it in getDate
2017-07-27 11:10:25 +12:00
Daniel Hensby 3a18b9f69b
FIX If BlogPost has date field, return it in getDate 2017-07-26 15:22:36 +01:00
Daniel Hensby b444db1af8
Merge branch '2' 2017-07-20 10:33:52 +01:00
Daniel Hensby c110b4e2e1
Merge branch '2.4' into 2 2017-07-20 10:33:28 +01:00
Daniel Hensby 0b6a2d710a
Merge branch '2.3' into 2.4 2017-07-20 10:33:06 +01:00
Daniel Hensby df68e34398
Merge branch '2.2' into 2.3 2017-07-20 10:31:55 +01:00
Daniel Hensby 7bfe622909
Merge branch '2.1' into 2.2 2017-07-20 10:30:12 +01:00
Daniel Hensby 3a62155f66
Merge branch '2.0' into 2.1 2017-07-20 10:29:50 +01:00
Daniel Hensby bc741fb8b8 Merge pull request #447 from andrewandante/BUGFIX/owns_featuredimage
give BlogPost ownership of FeaturedImage
2017-07-20 10:28:17 +01:00
Andrew Aitken-Fincham 409b4190a3 give BlogPost ownership of FeaturedImage 2017-07-20 10:03:53 +01:00
Daniel Hensby a28861c352 Merge pull request #459 from robbieaverill/pulls/3.0/fix-travis
FIX Update Travis configuration and coverage whitelist
2017-07-20 09:48:13 +01:00
Loz Calver 6f5d4bd658 Merge pull request #458 from dhensby/pulls/2.0/fix-url-segment-generation
FIX Dont generate urlsegments if we dont need to
2017-07-20 09:07:06 +01:00
Robbie Averill 563e33c772 Add phpcs ruleset and fix violations 2017-07-20 10:05:29 +12:00
Robbie Averill ba51a8e8e1 FIX Update Travis configuration and coverage whitelist 2017-07-20 10:05:29 +12:00
Daniel Hensby 34b6191666
Remove HHVM from test builds 2017-07-19 17:47:04 +01:00
Daniel Hensby c29438fd1a
FIX Dont generate urlsegments if we dont need to 2017-07-19 17:42:46 +01:00
Daniel Hensby 84ac94f818
Merge branch '2' 2017-07-05 14:49:34 +01:00
Daniel Hensby ca59af43e8
Merge branch '2.4' into 2 2017-07-05 14:42:23 +01:00
Daniel Hensby 91d9e42ba0 Merge pull request #450 from camfindlay/feature/config-spam-notifications
Config spam notifications
2017-07-05 14:30:24 +01:00
Daniel Hensby 6c1e6a98c4 Merge pull request #451 from andrewandante/FIX/tests
total refactor of blog.yml for tests, use classes properly
2017-07-05 14:09:55 +01:00
Andrew Aitken-Fincham ffc12f53bc total refactor of blog.yml for tests, use classes properly 2017-07-04 18:01:39 +01:00
Cam Findlay d5340a87dc
FEATURE config to disable sending spam notifications 2017-07-03 11:17:30 +01:00
Franco Springveldt 0d6b44aa44 FIX mysql >= 5.7 sql_mode=only_full_group_by error 2017-06-26 10:21:39 +12:00
Daniel Hensby e737cd818b Merge pull request #445 from creative-commoners/pulls/2.4/travis-php7
Add PHP7 + SS3.6 build to Travis configuration
2017-06-18 01:03:00 +01:00
Robbie Averill e5415b1ea8 Remove hhvm from Travis build matrix 2017-06-16 09:11:22 +12:00
Daniel Hensby deb0a098e8 Merge pull request #435 from rasstislav/patch-1
FIX Add translation to some areas of BlogMemberExtension that were missing them
2017-06-15 16:56:31 +01:00
Rastislav Brandobur abe6015a34 added BlogMemberExtension definitions to lang subfolder 2017-06-15 02:00:40 +02:00
Robbie Averill 16d684dcfa Add PHP7 + SS3.6 build to Travis configuration 2017-06-15 09:58:30 +12:00
Daniel Hensby ef67447ad5 Merge pull request #444 from alex-dna/2.4
Prevent user_error when querying object from Solr
2017-06-14 13:05:27 +01:00
Alexandre Saelens bd23bb2f0a Prevent user_error when querying object from Solr 2017-06-14 14:05:40 +12:00
Daniel Hensby a62ce1081a Merge pull request #443 from 3Dgoo/patch-1
Updated license year
2017-06-07 16:35:27 +01:00
3Dgoo 277aa2d222 Updated license year 2017-06-07 21:33:21 +09:30
Florian Thoma 4f1eb3d227 add meta links for previous and next pages in pagination 2017-05-26 09:43:27 +10:00
Daniel Hensby 0132a02cf0 Adding .codecov.yml file 2017-05-25 08:57:47 +01:00
Ingo Schommer 30cac31a78 Merge pull request #438 from sminnee/drop-php55
FIX: updated test suite to cover supported versions
2017-05-11 14:22:55 +12:00
Sam Minnee f5c2537c03 MINOR: Add test to for blog tag urlsegment generation
This behaviour confused me so adding a test to clarify that it’s
intentional.
2017-05-11 12:29:44 +12:00
Sam Minnee 50d928101c FIX: Speed up tests by simplifying fixture
Requires https://github.com/silverstripe/silverstripe-framework/pull/6872
2017-05-11 12:29:41 +12:00
Sam Minnee ff66ad791d FIX: updated test suite to cover supported versions 2017-05-04 18:09:44 +12:00
Daniel Hensby 81c8e6b939 Merge pull request #436 from sol1/ss4-alpha6-fixes
ss4 alpha6 fixes
2017-04-18 16:02:38 +01:00
Andrew Foster d1eb591ea5 setShowCalendar is no longer a method 2017-04-18 17:02:27 +10:00
Andrew Foster 3b45728ff3 Fix reference to re-namespaced Versioned 2017-04-18 17:02:04 +10:00
Rastislav Brandobur 2cd7db9beb FIX Add translation to some areas of BlogMemberExtension that were missing them 2017-04-12 10:33:29 +02:00
Daniel Hensby 1bb7874e7e Merge pull request #433 from andrewandante/patch-2
Update UploadField to one that exists
2017-04-03 14:10:53 +01:00
Andrew Aitken-Fincham 1779fe1f39 Update UploadField to one that exists 2017-04-02 13:16:56 +01:00
Daniel Hensby a5dee40fcb Merge pull request #431 from christopherdarling/patch-1
BlogMigrationTask missing title and description
2017-03-16 11:45:27 +13:00
Christopher Darling fef1462f56 BlogMigrationTask missing title and description
Otherwise shows up in dev/tasks/ as "Database Migrations"
2017-03-15 14:31:18 +00:00
Daniel Hensby b73b20731d Merge pull request #430 from andrewandante/FIX/i18n-nesting-errors
Update i18n nesting for ss4
2017-02-21 14:57:47 +00:00
Andrew Aitken-Fincham 246e51fada Update i18n nesting for ss4 2017-02-20 10:08:47 +00:00
Daniel Hensby 288a669e49 Merge pull request #428 from andrewandante/FIX/datepicker
showcalendar config method change
2017-02-19 15:34:35 +00:00
Andrew Aitken-Fincham 141db8d472 showcalendar config method change 2017-02-17 11:22:39 +00:00
Damian Mooyman 92004f803c Merge pull request #425 from robbieaverill/bugfix/short-class-name-for-translation
FIX Use short class name for translation key, not fully qualified name
2017-01-27 12:17:00 +13:00
Robbie Averill 7362be4015 FIX Use short class name for translation key, not fully qualified name 2017-01-27 11:47:53 +13:00
Daniel Hensby d5a8761acf Merge pull request #421 from robbieaverill/ss4
SilverStripe 4 compatibility
2017-01-26 12:29:33 +00:00
Robbie Averill 8fa9207693 TEST Move coverage build to the start of the matrix, and only post coverage on success 2017-01-27 00:20:25 +13:00
Robbie Averill 2bb61dcfcc TEST Move coverage run to PHP 7.1 (for speed). Remove ocular in favour of codecov. Add default phpunit.xml with coverage whitelist. 2017-01-27 00:10:44 +13:00
Robbie Averill c004bad7b8 FIX Update class imports, fix broken test, add missing multibyte logic back, fix condition for generating URLSegment (also missing) 2017-01-26 21:41:28 +13:00
Robbie Averill ea121e40da FIX Missed GridField import in BlogFilterGridField 2017-01-24 14:11:22 +13:00
Robbie Averill 3da05818af Move BlogFilter_GridField to its own class 2017-01-24 13:45:07 +13:00
Robbie Averill bb08242edb FIX Move upgrade mapping to root folder. Fixes blog classes not being resolved by upgrader. 2017-01-19 17:09:17 +13:00
Robbie Averill 5eb9ec879d API Update Widget implementations in blog 2017-01-18 17:12:06 +13:00
Robbie Averill 98645af960 Implement Blog namespaces 2017-01-17 08:58:00 +13:00
Robbie Averill 077929f8bf Add sidebar back as a separate tab. Fix tag and category routes 2017-01-13 15:55:48 +13:00
Robbie Averill c1cb8576b3 FIX Validation of existing tags, duplicated GridField add button, formatting in categorisation, bootstrapify buttons 2017-01-13 15:33:53 +13:00
Robbie Averill 5f07a3cc23 PSR-2 compat: Change Blog*_Controller to Blog*Controller 2017-01-12 10:56:08 +13:00
Robbie Averill e263ba33ec Update Travis and Scrutinizer configuration, add note to readme 2017-01-12 10:21:50 +13:00
Robbie Averill 98410c7eae TEMPORARY Disable the sidebar. @todo Fix it and put it back. 2017-01-12 10:20:44 +13:00
Robbie Averill df75c6c275 Move admin sidebar template to correct location 2017-01-12 10:20:44 +13:00
Robbie Averill 4e7e1b7975 FIX Base pase constant BLOGGER_DIR 2017-01-12 10:20:44 +13:00
Robbie Averill c927d7e29f FIX Duplicated state in gridfield 2017-01-12 10:20:44 +13:00
Robbie Averill cc17e81952 Remove old PHP $this casting 2017-01-12 10:20:44 +13:00
Robbie Averill de1b947c97 Remove file that popped up during rebasing 2017-01-12 10:20:44 +13:00
Robbie Averill 83db670e14 FIX Path to author profile when blog is the homepage 2017-01-12 10:20:44 +13:00
Robbie Averill f376b1c2f1 Update deprecated image manipulation calls 2017-01-12 10:20:44 +13:00
Robbie Averill 71890778db Move controllers to same namespace as their model 2017-01-12 10:20:44 +13:00
Robbie Averill f35c6049d7 Move blog layouts to namespaced folder location 2017-01-12 10:20:44 +13:00
Robbie Averill 413e94e186 Add legacy class map for migrating ClassName in SiteTree 2017-01-12 10:20:44 +13:00
Robbie Averill 58e5ebb652 Fix controller names, removed Listbox methods, namespacing bugs, template locations 2017-01-12 10:20:43 +13:00
Robbie Averill 72a9f041c2 Fix some incorrect table/model namespace issues 2017-01-12 10:20:43 +13:00
Robbie Averill 13a5badff5 Move "code" to PSR-4 friendly "src" folders. Add namespacing. 2017-01-12 10:20:42 +13:00
Robbie Averill 4313643a0b Add composer alias for 3.x and update requirements for SS4 2017-01-12 10:20:02 +13:00
micmania1 37e5d106d2 FIX right sidebar was being forced to float left 2017-01-12 10:19:40 +13:00
micmania1 1e602a0ac1 Removed compass in favour of gulp 2017-01-12 10:19:40 +13:00
micmania1 f5974d80a2 NEW Moved URLSegmentExtension, BlogTag and BlogCateogry shared functionality into a trait 2017-01-12 10:19:39 +13:00
micmania1 2ae1457068 Upgraded to work with silverstripe 4.x 2017-01-12 10:19:39 +13:00
Daniel Hensby b967860007
Updating master alias 2016-12-20 15:21:06 +00:00
Daniel Hensby 3e298b7b10
Updating composer alias 2016-12-20 15:20:16 +00:00
Damian Mooyman 7583e0bcd5 Update translations 2016-11-17 12:39:49 +13:00
Damian Mooyman b4050a7392 Remove obsolete branch-alias 2016-11-17 10:17:56 +13:00
Damian Mooyman 033a7bb96f Merge pull request #414 from dhensby/pulls/casting-fix
FIX Excerpt should be casted as HTMLText
2016-09-08 22:45:10 +12:00
Daniel Hensby ffab2df9d2
FIX Excerpt should be casted as HTMLText 2016-09-08 11:00:15 +01:00
Loz Calver 0f77789eb5 Merge pull request #412 from dhensby/pulls/cast-date
FIX Cast Date method on BlogPost
2016-08-30 09:07:28 +01:00
Daniel Hensby 91abe1f9f8
FIX Cast Date method on BlogPost 2016-08-27 22:50:45 +01:00
Damian Mooyman 7f7459f769 Update translations 2016-08-17 11:08:00 +12:00
Daniel Hensby 9f09218da2 Merge pull request #411 from lekoala/patch-1
remove i18n formatting in links
2016-07-15 14:16:56 +01:00
Thomas Portelange 2dd5fd8596 remove i18n formatting in links
the getArchiveMonth and getArchiveYear only accepts number in Blog.php. Removing i18n formatting restore the functionnality.
2016-07-15 14:31:11 +02:00
Damian Mooyman 9e117b64ea Merge pull request #406 from TheBnl/entry-meta-multiple-authors-localisation
Localisation for multiple authors
2016-07-05 18:43:25 +12:00
Damian Mooyman 226d8282fd Merge pull request #401 from micmania1/fix-close-p-tags
FIX closing p tag
2016-06-30 10:16:28 +12:00
Damian Mooyman fc6c86fd35 Merge pull request #400 from micmania1/tidy-readme
Tidied the badges on reademe
2016-06-29 17:52:30 +12:00
Damian Mooyman a21b50333d Merge pull request #402 from micmania1/fix-376-url
FIX #376 allow multibyte chars in url segment
2016-06-29 17:51:22 +12:00
Michael Strong 35c5357cc6 Merge pull request #407 from ksdhans/patch-2
Add RSS feeds for categories and tags
2016-06-17 13:13:34 +12:00
ksdhans 29ffaa8295 Minor layout tweak
Correcting indentation of isRSS().
2016-06-15 19:33:29 +12:00
ksdhans ca7f09d0e0 Removed category()/tag() documentation changes
Adding "string" to the possible return types of category()/tag() didn't stop the scrutinizer from raising two new issues, so I've reverted that change. In future tags/categories may be split into separate controllers (it's cleaner that way), so these "issues" may serve as a reminder.

NOTE: This means that the documented return type for rss() is also wrong
2016-06-14 18:20:03 +12:00
ksdhans d42b3ca57c Fixed RSS feed link for category/tag feeds
- The RSS feed link was always the blog's root URL, even for category/tag feeds. FIXED
- Changed the return type documented for category() and tag() to include string for the case where an RSS feed is returned (addresses the "Scrutinizer" issues)
2016-06-14 18:08:31 +12:00
ksdhans 95e14e5496 Performed suggested changes
- Removed hardcoded URL segment (was test code that I forgot to remove)
- Changed if($rss to if(is_string($rss)
- Moved bracket after isRSS() to next line
- Made rssFeed() protected as it's an internal function and shouldn't be part of the public API
2016-06-14 17:38:43 +12:00
ksdhans 073fca5f0d Add RSS feeds for categories and tags
This patch adds RSS feeds for tags and categories. The RSS feeds are at the following URLs:
- */category/<category-name>/rss
- */tag/<tag-name>/rss
2016-06-13 23:20:07 +12:00
Bram de Leeuw 1231d0ca92 added localisation for multiple authors in the entry meta 2016-06-10 13:04:15 +02:00
Daniel Hensby 09bdf60aa4 Merge pull request #403 from micmania1/fix-blog-rss-date
FIX #394 add getDate to proxy publish date in rss template
2016-06-06 12:44:28 +01:00
micmania1 299944fd1f FIX #394 add getDate to proxy publish date in rss template 2016-05-31 14:26:29 +12:00
micmania1 e4c3b879e8 FIX #376 allow multibyte chars in url segment 2016-05-31 14:00:54 +12:00
micmania1 198d3550fc FIX closing p tag 2016-05-31 11:37:26 +12:00
micmania1 f6fef9e77e Tidied the badges on reademe 2016-05-30 17:35:13 +12:00
Loz Calver c1ae82b74b Merge pull request #399 from silverstripe/micmania1-readme-patch-1
DOCS updated installation instructions
2016-05-24 09:09:59 +01:00
Michael Strong 1876ff86d8 DOCS updated installation instructions
Fixes #398
2016-05-24 13:43:04 +12:00
Daniel Hensby dec393d720 Merge pull request #397 from silverstripe/add-helpful-robot-badge
Added Helpful Robot badge
2016-05-21 07:58:44 +01:00
Christopher Pitt 49c3bc6c03 Added Helpful Robot badge 2016-05-21 16:56:53 +12:00
Daniel Hensby a587dcd612 Merge pull request #395 from tractorcow/pulls/fix-widget-tests
BUG Tests don't work in non-root base url.
2016-05-20 20:52:43 +01:00
Damian Mooyman 565502fdf7 Update translations. 2016-05-20 15:23:41 +12:00
Damian Mooyman 451467823d BUG Tests don't work in non-root base url. 2016-05-20 13:18:59 +12:00
Damian Mooyman b5e1d191ce Update changelog for 2.4.2 2016-05-18 17:01:49 +12:00
Damian Mooyman 648aad1e92 Update translations 2016-05-18 16:58:43 +12:00
Damian Mooyman 2b699fd290 Update changelog for 2.4.1 2016-05-18 15:42:33 +12:00
Daniel Hensby cba4bd8b59 Merge pull request #388 from IOTI/patch-1
Added missing title attribute
2016-03-21 00:19:12 +00:00
Ryan McLaren bb1484b45e Added missing title attribute
post-image href was missing title="" attribute
2016-03-20 20:32:03 -03:00
Damian Mooyman 7a59c13b3f Merge pull request #385 from sekjal/Issue384
ENHANCEMENT Format dates in Blog Posts gridfield based on user preferences
2016-03-07 15:33:12 +13:00
Ian Walls 86f5295175 Format dates in Blog Posts gridfield based on user preferences
Instead of always formatting to DD/MM/YYYY as Nice() does, format
the date based on user settings, using FormatFromSettings().

Fixes silverstripe/silverstripe-blog#384
2016-03-04 14:31:22 -05:00
Daniel Hensby 84efcf126b Merge pull request #381 from gordonbanderson/377-no-tags-break
FIX: Ensure tag cloud widget does not break when there are zero tags
2016-02-24 18:09:54 +00:00
Gordon Anderson 515928b8e2 FIX: Ensure tag cloud widget does not break when there are zero tags 2016-02-24 22:01:24 +07:00
Damian Mooyman 96d8adebab Merge pull request #370 from micmania1/210-fix-message-overflow
FIX Success/error message overflow in cms
2016-02-10 10:51:36 +13:00
micmania1 95a76e11de FIX Success/error message overflow in cms 2016-02-09 04:37:14 +00:00
Damian Mooyman e7ef92c4e5 Merge pull request #372 from micmania1/271-prevent-duplicate-tags-categories
FIX Prevent duplicate tags and categories.
2016-02-09 14:56:36 +13:00
Damian Mooyman 067f415f33 Merge pull request #373 from micmania1/296-prevent-future-post-public
FIX Prevent showing future blog posts before their publish date
2016-02-09 14:38:36 +13:00
Damian Mooyman 17429c043f Merge pull request #371 from micmania1/266-fix-cms-hijacking-keypress
FIX Prevent the CMS Hijacking the return keypress in gridfieldaddbydb…
2016-02-09 14:31:50 +13:00
micmania1 8135f67b71 FIX Prevent duplicate tags and categories. 2016-02-05 23:21:13 +00:00
micmania1 f32adf1dd3 FIX Prevent showing future blog posts before their publish date 2016-02-05 22:37:01 +00:00
micmania1 2c0e1a73ed FIX Prevent the CMS Hijacking the return keypress in gridfieldaddbydbfield 2016-02-05 21:48:31 +00:00
Loz Calver 79bc18aacc Merge pull request #369 from micmania1/288-fix-mininnerwidth
FIX minInnerWidth should begin with upper-case M
2016-02-05 09:06:08 +00:00
micmania1 2b2e13f7df FIX minInnerWidth should begin with upper-case M 2016-02-04 22:06:01 +00:00
Damian Mooyman 9526e13e5c Changelog for 2.4.0 2016-02-04 11:44:26 +13:00
Damian Mooyman 1fb4c58071 Update translations 2016-02-04 11:03:41 +13:00
Damian Mooyman 2bece2e741 Merge pull request #248 from gordonbanderson/TAG_CLOUD_WIDGET
Tag cloud widget
2016-01-26 10:08:02 +13:00
Damian Mooyman 2b2e5b2593 Merge pull request #365 from gordonbanderson/patch_364
FIX: Missing Blog Post Title from Comment Notification
2016-01-26 10:05:57 +13:00
Gordon Anderson 687406dea8 FIX: Unit test for BlogPostNotifications identified a missing %s in a sprintf statement, meaning the title of a BlogPost would not show in the subject of a notification email 2016-01-25 18:33:05 +07:00
Daniel Hensby 80cb06f715 Merge pull request #363 from tractorcow/pulls/blog-datefilter
BUG Fix blog date filtering for additional database server types
2016-01-25 10:34:39 +00:00
Gordon Anderson 15b197c284 ENHANCEMENT: Addition of tag cloud widget complete with tests 2016-01-25 14:39:12 +07:00
Damian Mooyman ebba5cc9fc BUG Fix blog date filtering for additional database server types 2016-01-25 11:57:26 +13:00
Daniel Hensby 694b41176a Merge pull request #362 from gordonbanderson/postgresfixes
FIX: Tests now pass in Postgres on 3.1 and 3.2
2016-01-22 17:20:01 +00:00
Gordon Anderson cb45815fbd FIX: Tests now pass in Postgres on 3.1 and 3.2
Problems resolved:
1) Case sensitivy of check on Code field of Group
2) MySQL and Postgres have different date functions
3) When BlogID is empty, explicitly set it to 0.  If not then all tests break under Postgres
2016-01-22 22:48:02 +07:00
Damian Mooyman 7248d21b31 Merge pull request #360 from gordonbanderson/coverage_ss_branch
ENHANCEMENT: Added code coverage and extra badges on the README
2016-01-22 08:40:05 +13:00
Gordon Anderson d8dc1e335c ENHANCEMENT: Added code coverage and extra badges on the home page 2016-01-21 12:22:28 +07:00
Damian Mooyman 2d33c52c1c Merge pull request #357 from lry6003/site-tree-icon
Minor: Changed blog page icon
2016-01-19 16:12:54 +13:00
Luke Ryley a9e0b93f5a Minor: Changed blog page icon 2016-01-19 15:05:36 +13:00
Damian Mooyman ad8a9f1429 Update master alias to 2.3.x-dev 2016-01-08 13:19:05 +13:00
Damian Mooyman 340ff3e737 Merge pull request #349 from camfindlay/feature/docs-userguide
DOCS Rework documentation to have clear user guide and dev docs.
2016-01-08 12:54:55 +13:00
Damian Mooyman 9f864656ac Merge pull request #356 from helpfulrobot/update-license-year
Updated license year
2016-01-05 09:49:57 +13:00
helpfulrobot afb084821d Updated license year 2016-01-01 06:37:39 +13:00
Damian Mooyman 22682b9c4a Merge pull request #348 from steiha/patch-1
fix sql queries // widgets // LastUpdated has to be LastEdited
2015-12-15 16:24:38 +13:00
Damian Mooyman c212c8fc87 Merge pull request #352 from sunnysideup/patch-1
ENHANCEMENT: improved pagination for a long list of blog posts
2015-12-15 16:23:05 +13:00
Cam Findlay 2ac870cd20 DOCS Rework documentation to have clear user guide and dev docs. 2015-12-15 16:07:43 +13:00
Nicolaas 8dd6f2a3dd ENHANCEMENT: improved pagination for blog posts 2015-12-15 15:56:40 +13:00
Michael Strong 428cb742b2 Merge pull request #345 from kinglozzer/patch-1
Change image field label back to “Featured Image” (closes #344)
2015-12-07 09:24:43 +13:00
Stefan Eickhoff c642723694 Update BlogTagsWidget.php 2015-12-05 12:07:38 +01:00
Stefan Eickhoff c0928ffa32 Update BlogCategoriesWidget.php 2015-12-05 12:01:31 +01:00
Loz Calver 34fcafa24a Change image field label back to “Featured Image” (closes #344) 2015-12-04 10:35:47 +00:00
Damian Mooyman be1a502823 Add 2.3.0 changelog 2015-11-23 16:08:22 +13:00
Scott Hutchinson 797c8ee45b Merge pull request #341 from tractorcow/pulls/fix-phpcompat-33
BUG Fix regression in #312 in PHP 5.3
2015-11-23 16:02:34 +13:00
Damian Mooyman 5282ad84f9 BUG Fix regression in #312 in PHP 5.3 2015-11-23 15:45:22 +13:00
Damian Mooyman a4c6e5abb6 Update translations 2015-11-23 11:15:25 +13:00
Damian Mooyman cf18cfcdb1 Merge pull request #338 from lekoala/master
french translation
2015-11-23 11:04:04 +13:00
Damian Mooyman 0a8ee233a6 Merge pull request #331 from helpfulrobot/convert-to-psr-2
Converted to PSR-2
2015-11-23 10:46:41 +13:00
Daniel Hensby 664340bdd3 Merge pull request #339 from helpfulrobot/add-standard-code-of-conduct
Added standard code of conduct
2015-11-21 10:32:25 +00:00
helpfulrobot 834343c9c0 Added standard code of conduct 2015-11-21 20:12:35 +13:00
helpfulrobot f82825d9a6 Converted to PSR-2 2015-11-21 19:17:29 +13:00
Thomas 417277b77a french translation 2015-11-20 11:47:06 +01:00
Daniel Hensby 4785ad0123 Merge pull request #297 from lekoala/master
Allow injection on date
2015-11-20 09:30:06 +00:00
Thomas 4c4afd5b38 allow injection on date 2015-11-20 08:53:20 +01:00
Damian Mooyman 8a877debf2 Merge pull request #337 from scott1702/master
Add changelog for release
2015-11-20 13:22:03 +13:00
scott1702 31b3bb7d73 Add changelog for release 2015-11-20 12:52:01 +13:00
Damian Mooyman 3d6de78df5 Merge pull request #306 from DrMartinGonzo/patch-1
i18n wrong label in BlogPost.php
2015-11-20 12:51:00 +13:00
Damian Mooyman 4d5c63e772 Merge pull request #329 from helpfulrobot/add-standard-scrutinizer-config
Added standard Scrutinizer config
2015-11-20 12:50:09 +13:00
Damian Mooyman 7bddc86ab4 Merge pull request #303 from SilbinaryWolf/fix-changing-blog-pagetype
Fix bug where can't change 'Blog' page type to non-'Blog' page type
2015-11-20 12:49:54 +13:00
David Craig 388b868b89 Merge pull request #333 from assertchris/remove-featured-posts
Removed featured posts
2015-11-20 10:37:24 +13:00
Daniel Hensby 4175e592f7 Merge pull request #335 from helpfulrobot/add-standard-license
Added standard license
2015-11-19 17:26:23 +00:00
Daniel Hensby a5ac85285e Merge pull request #336 from helpfulrobot/add-standard-git-attributes
Added standard git attributes
2015-11-19 09:39:46 +00:00
helpfulrobot 104782f061 Added standard git attributes 2015-11-19 19:11:09 +13:00
helpfulrobot 9dfaae802d Added standard license 2015-11-19 18:29:47 +13:00
Damian Mooyman 1e31fa6b00 Merge pull request #334 from helpfulrobot/add-standard-editor-config
Added standard editor config
2015-11-19 14:13:50 +13:00
helpfulrobot 1b79c4d6b0 Added standard editor config 2015-11-19 13:24:47 +13:00
Christopher Pitt 21e45ce875 Removed featured posts 2015-11-19 10:09:46 +13:00
helpfulrobot 67678944d9 Added standard Scrutinizer config 2015-11-18 15:01:24 +13:00
Damian Mooyman 3ef14a6e1a Merge pull request #328 from silverstripe/add-hook-for-extension-filters-on-tag-blog-posts
Added hook for extension filters on tag blog posts
2015-11-17 16:37:23 +13:00
Damian Mooyman 974e5636c4 Merge pull request #327 from silverstripe/add-hook-for-extension-filters-on-category-blog-posts
Added hook for extension filters on category blog posts
2015-11-17 16:37:03 +13:00
Christopher Pitt 040fb95eb6 Added hook for extension filters on tag blog posts 2015-11-17 16:09:31 +13:00
Damian Mooyman a5b98a4244 Update translations 2015-11-17 16:07:37 +13:00
Christopher Pitt 34a45e21a7 Added hook for extension filters on category blog posts 2015-11-17 16:06:19 +13:00
Christopher Pitt 3f23add5af Merge pull request #318 from unclecheese/patch-1
BUGFIX: Dropdowns do not use unique IDs
2015-11-17 11:52:48 +13:00
Damian Mooyman bc151e1591 Merge pull request #325 from assertchris/add-featured-posts
Added featured posts to CMS
2015-11-13 15:36:45 +13:00
Christopher Pitt 6d059806ea Added featured posts to CMS 2015-11-13 15:06:29 +13:00
Damian Mooyman ee9cca0788 Merge pull request #322 from camfindlay/hotfix/fix-titlebug
FIX Title bug due to #320
2015-11-10 11:25:41 +13:00
Cam Findlay 12674edb87 FIX Title bug due to #320 2015-11-10 10:20:12 +13:00
Damian Mooyman 01091ee20b Merge pull request #321 from silverstripe/fix-archive-year-test
FIX Hardcode the year to the current year in setUp()
2015-11-09 16:51:13 +13:00
Michael Strong 930074c2a2 FIX Hardcode the year to the current year in setUp() 2015-11-09 15:52:21 +13:00
Michael Strong a27dd892f6 Merge pull request #319 from tractorcow/pulls/fix-paginated-filter
BUG Fix tag / category filters not being filtered in PaginatedList()
2015-11-09 15:30:25 +13:00
Damian Mooyman b45a573fac BUG Fix tag / category filters not being filtered in PaginatedList() 2015-11-09 15:22:57 +13:00
Damian Mooyman dd33bbfa50 Merge pull request #320 from camfindlay/feature/defaultarchiveyear
ENHANCEMENT Default archive year
2015-11-09 14:30:02 +13:00
Cam Findlay 43bb2248a5 ENHANCEMENT Default archive year
If no year is passed, rather than 404 it should grab the latest years posts.
2015-11-09 13:56:50 +13:00
unclecheese 454d31910a BUGFIX: Dropdowns do not use unique IDs
Solves problem where `DOMXPath` was throwing (in `ShortcodeParser`) due to invalid HTML
2015-11-05 12:02:00 +13:00
Christopher Pitt a87e0f77e6 Merge pull request #317 from tractorcow/pulls/fix-nonblog-parent
BUG Fix crash if parent page isn't Blog type
2015-11-05 11:44:03 +13:00
Damian Mooyman e04be4cde4 BUG Fix crash if parent page isn't Blog type 2015-11-05 11:31:55 +13:00
Damian Mooyman 336a9b4d3a Merge pull request #312 from camfindlay/fix-largesitesupport
ENHANCEMENT filtering for large user base sites.
2015-11-04 14:32:35 +13:00
Cam Findlay d6c2593d61 ENHANCEMENT filtering for large user base sites. 2015-11-04 12:44:15 +13:00
Damian Mooyman adbbf1ab00 Merge pull request #308 from silverstripe/fix-postsperpagemigration
FIX Explicitly set the PostsPerPage during migration
2015-10-30 13:23:08 +13:00
Cam Findlay 8a5c52a204 FIX Explicitly set the PostsPerPage during migration
Tested against the silverstripe.org codebase, BlogHolder migration fails unless you set this.
2015-10-29 13:10:10 +13:00
Michael Strong dde32209f8 Merge pull request #301 from JorisDebonnet/patch-1
Bugfix: avoid calling "new PaginatedList(null)"
2015-10-27 13:26:16 +13:00
DrMartinGonzo a5d242006f i18n wrong label in BlogPost.php
Wrong Description label for additional credits description, uses PublishDate_Description.
2015-10-26 15:43:21 +01:00
JorisDebonnet 2c59e50a1c Bugfix: avoid feeding null to PaginatedList constructor 2015-10-23 19:33:41 +02:00
Damian Mooyman 6321417bc4 Merge pull request #302 from JorisDebonnet/patch-2
Sort BlogPosts in the CMS by PublishDate
2015-10-23 17:35:56 +13:00
JorisDebonnet f311305efb Default PublishDate to NULL for drafts and sort them at the top 2015-10-23 00:40:25 +02:00
Michael Strong 19ea1a8847 Merge pull request #304 from muskie9/patch-1
Update README to include additional requirements
2015-10-22 15:39:14 +13:00
Nic 11af6efbae Update README to include additional requirements
This adds the additional requirements listed in the `composer.json` file.
2015-10-16 10:24:29 -05:00
Jake Bentvelzen c3b0401ee5 Fixed a bug where an error occurred when attempting to change the page type of 'Blog' 2015-10-14 14:00:24 +11:00
228 changed files with 19147 additions and 5719 deletions

17
.editorconfig Normal file
View File

@ -0,0 +1,17 @@
# For more information about the properties used in this file,
# please see the EditorConfig documentation:
# http://editorconfig.org
[*]
charset = utf-8
end_of_line = lf
indent_size = 4
indent_style = space
insert_final_newline = true
trim_trailing_whitespace = true
[{*.yml,*.scss,*.js,package.json}]
indent_size = 2
# The indent size used in the package.json file cannot be changed:
# https://github.com/npm/npm/pull/3180#issuecomment-16336516

2
.eslintignore Normal file
View File

@ -0,0 +1,2 @@
client/dist/
client/lang/

1
.eslintrc.js Normal file
View File

@ -0,0 +1 @@
module.exports = require('@silverstripe/eslint-config/.eslintrc');

7
.gitattributes vendored Normal file
View File

@ -0,0 +1,7 @@
/tests export-ignore
/docs export-ignore
/.gitattributes export-ignore
/.gitignore export-ignore
/.travis.yml export-ignore
/.scrutinizer.yml export-ignore
/codecov.yml export-ignore

11
.github/workflows/ci.yml vendored Normal file
View File

@ -0,0 +1,11 @@
name: CI
on:
push:
pull_request:
workflow_dispatch:
jobs:
ci:
name: CI
uses: silverstripe/gha-ci/.github/workflows/ci.yml@v1

View File

@ -0,0 +1,16 @@
name: Deploy Userhelp Docs
on:
push:
branches:
- '4'
- '3'
- '2'
paths:
- 'docs/en/userguide/**'
jobs:
deploy:
name: deploy-userhelp-docs
runs-on: ubuntu-latest
steps:
- name: Run build hook
run: curl -X POST -d {} https://api.netlify.com/build_hooks/${{ secrets.NETLIFY_BUILD_HOOK }}

16
.github/workflows/dispatch-ci.yml vendored Normal file
View File

@ -0,0 +1,16 @@
name: Dispatch CI
on:
# At 12:20 PM UTC, only on Tuesday and Wednesday
schedule:
- cron: '20 12 * * 2,3'
jobs:
dispatch-ci:
name: Dispatch CI
# Only run cron on the silverstripe account
if: (github.event_name == 'schedule' && github.repository_owner == 'silverstripe') || (github.event_name != 'schedule')
runs-on: ubuntu-latest
steps:
- name: Dispatch CI
uses: silverstripe/gha-dispatch-ci@v1

17
.github/workflows/keepalive.yml vendored Normal file
View File

@ -0,0 +1,17 @@
name: Keepalive
on:
workflow_dispatch:
# The 4th of every month at 10:50am UTC
schedule:
- cron: '50 10 4 * *'
jobs:
keepalive:
name: Keepalive
# Only run cron on the silverstripe account
if: (github.event_name == 'schedule' && github.repository_owner == 'silverstripe') || (github.event_name != 'schedule')
runs-on: ubuntu-latest
steps:
- name: Keepalive
uses: silverstripe/gha-keepalive@v1

17
.github/workflows/update-js.yml vendored Normal file
View File

@ -0,0 +1,17 @@
name: Update JS
on:
workflow_dispatch:
# Run on a schedule of once per quarter
schedule:
- cron: '0 0 1 */3 *'
jobs:
update-js:
name: Update JS
# Only run cron on the silverstripe account
if: (github.event_name == 'schedule' && github.repository_owner == 'silverstripe') || (github.event_name != 'schedule')
runs-on: ubuntu-latest
steps:
- name: Update JS
uses: silverstripe/gha-update-js@v1

8
.gitignore vendored
View File

@ -1,5 +1,5 @@
.ssh/*
.bash*
.profile
vendor/*
/vendor/*
.sass-cache/*
/node_modules/
**/*.js.map
**/*.css.map

1
.nvmrc Normal file
View File

@ -0,0 +1 @@
10

179
.sass-lint.yml Normal file
View File

@ -0,0 +1,179 @@
# sass-lint config to match the AirBNB style guide
# See silverstripe-admin
files:
include: '**/client/src/**/*.scss'
ignore:
- 'client/src/styles/legacy/*'
- 'src/**/*'
options:
formatter: stylish
merge-default-rules: false
rules:
# Warnings
# Things that require actual refactoring are marked as warnings
class-name-format:
- 1
- convention: hyphenatedbem
placeholder-name-format:
- 1
- convention: hyphenatedlowercase
nesting-depth:
- 1
- max-depth: 3
no-ids: 1
no-important: 1
no-misspelled-properties:
- 1
- extra-properties:
- "-moz-border-radius-topleft"
- "-moz-border-radius-topright"
- "-moz-border-radius-bottomleft"
- "-moz-border-radius-bottomright"
variable-name-format:
- 1
- allow-leading-underscore: true
convention: hyphenatedlowercase
no-extends: 1
# Warnings: these things are preferential rather than mandatory
no-css-comments: 1
# Errors
# Things that can be easily fixed are marked as errors
indentation:
- 2
- size: 2
final-newline:
- 2
- include: true
no-trailing-whitespace: 2
border-zero:
- 2
- convention: '0'
brace-style:
- 2
- allow-single-line: true
clean-import-paths:
- 2
- filename-extension: false
leading-underscore: false
no-debug: 2
no-empty-rulesets: 2
no-invalid-hex: 2
no-mergeable-selectors: 2
# no-qualifying-elements:
# - 1
# - allow-element-with-attribute: false
# allow-element-with-class: false
# allow-element-with-id: false
no-trailing-zero: 2
no-url-protocols: 2
quotes:
- 2
- style: double
space-after-bang:
- 2
- include: false
space-after-colon:
- 2
- include: true
space-after-comma:
- 2
- include: true
space-before-bang:
- 2
- include: true
space-before-brace:
- 2
- include: true
space-before-colon: 2
space-between-parens:
- 2
- include: false
trailing-semicolon: 2
url-quotes: 2
zero-unit: 2
single-line-per-selector: 2
one-declaration-per-line: 2
empty-line-between-blocks:
- 2
- ignore-single-line-rulesets: true
# Missing rules
# There are no sass-lint rules for the following AirBNB style items, but thess
# - Put comments on their own line
# - Put property delcarations before mixins
# Disabled rules
# These are other rules that we may wish to consider using in the future
# They are not part of the AirBNB CSS standard but they would introduce some strictness
# bem-depth: 0
# variable-for-property: 0
# no-transition-all: 0
# hex-length:
# - 1
# - style: short
# hex-notation:
# - 1
# - style: lowercase
# property-units:
# - 1
# - global:
# - ch
# - em
# - ex
# - rem
# - cm
# - in
# - mm
# - pc
# - pt
# - px
# - q
# - vh
# - vw
# - vmin
# - vmax
# - deg
# - grad
# - rad
# - turn
# - ms
# - s
# - Hz
# - kHz
# - dpi
# - dpcm
# - dppx
# - '%'
# per-property: {}
# force-attribute-nesting: 1
# force-element-nesting: 1
# force-pseudo-nesting: 1
# function-name-format:
# - 1
# - allow-leading-underscore: true
# convention: hyphenatedlowercase
# no-color-literals: 1
# no-duplicate-properties: 1
# mixin-name-format:
# - 1
# - allow-leading-underscore: true
# convention: hyphenatedlowercase
# shorthand-values:
# - 1
# - allowed-shorthands:
# - 1
# - 2
# - 3
# leading-zero:
# - 1
# - include: false
# no-vendor-prefixes:
# - 1
# - additional-identifiers: []
# excluded-identifiers: []
# placeholder-in-extend: 1
# no-color-keywords: 2

View File

@ -1 +0,0 @@
inherit: true

View File

@ -1,39 +0,0 @@
language: php
sudo: false
addons:
apt:
packages:
- tidy
env:
global:
- DB=MYSQL CORE_RELEASE=3.1
matrix:
allow_failures:
- php: hhvm-nightly
include:
- php: 5.6
env: DB=MYSQL
- php: 5.5
env: DB=MYSQL
- php: 5.4
env: DB=MYSQL
- php: 5.3
env: DB=MYSQL
- php: hhvm
env: DB=MYSQL
before_install:
before_script:
- phpenv rehash
- composer self-update || true
- git clone git://github.com/silverstripe-labs/silverstripe-travis-support.git ~/travis-support
- php ~/travis-support/travis_setup.php --source `pwd` --target ~/builds/ss
- cd ~/builds/ss
script:
- vendor/bin/phpunit blog/tests/

View File

@ -1,8 +1,9 @@
[main]
host = https://www.transifex.com
[silverstripe-blog.master-v2]
[o:silverstripe:p:silverstripe-blog:r:master-v2]
file_filter = lang/<lang>.yml
source_file = lang/en.yml
source_lang = en
type = YML
type = YML

33
.upgrade.yml Normal file
View File

@ -0,0 +1,33 @@
mappings:
GridFieldCategorisationConfig: SilverStripe\Blog\Admin\GridFieldCategorisationConfig
GridFieldFormAction: SilverStripe\Blog\Admin\GridFieldFormAction
GridFieldMergeAction: SilverStripe\Blog\Admin\GridFieldMergeAction
BlogCommentExtension: SilverStripe\Blog\Model\BlogCommentExtension
BlogFilter: SilverStripe\Blog\Model\BlogFilter
BlogFilter_GridField: SilverStripe\Blog\Model\BlogFilter\BlogFilterGridField
BlogMemberExtension: SilverStripe\Blog\Model\BlogMemberExtension
BlogPostFilter: SilverStripe\Blog\Model\BlogPostFilter
BlogPostNotifications: SilverStripe\Blog\Model\BlogPostNotifications
Blog: SilverStripe\Blog\Model\Blog
Blog_Controller: SilverStripe\Blog\Model\BlogController
BlogController: SilverStripe\Blog\Model\BlogController
BlogCategory: SilverStripe\Blog\Model\BlogCategory
BlogPost: SilverStripe\Blog\Model\BlogPost
BlogPost_Controller: SilverStripe\Blog\Model\BlogPostController
BlogPostController: SilverStripe\Blog\Model\BlogPostController
BlogTag: SilverStripe\Blog\Model\BlogTag
CategorisationObject: SilverStripe\Blog\Model\CategorisationObject
BlogAdminSidebar: SilverStripe\Blog\Forms\BlogAdminSidebar
GridFieldAddByDBField: SilverStripe\Blog\Forms\GridField\GridFieldAddByDBField
GridFieldBlogPostState: SilverStripe\Blog\Forms\GridField\GridFieldBlogPostState
GridFieldConfig_BlogPost: SilverStripe\Blog\Forms\GridField\GridFieldConfigBlogPost
BlogArchiveWidget: SilverStripe\Blog\Widgets\BlogArchiveWidget
BlogArchiveWidget_Controller: SilverStripe\Blog\Widgets\BlogArchiveWidgetController
BlogCategoriesWidget: SilverStripe\Blog\Widgets\BlogCategoriesWidget
BlogCategoriesWidget_Controller: SilverStripe\Blog\Widgets\BlogCategoriesWidgetController
BlogRecentPostsWidget: SilverStripe\Blog\Widgets\BlogRecentPostsWidget
BlogRecentPostsWidget_Controller: SilverStripe\Blog\Widgets\BlogRecentPostsWidgetController
BlogTagsCloudWidget: SilverStripe\Blog\Widgets\BlogTagsCloudWidget
BlogTagsCloudWidget_Controller: SilverStripe\Blog\Widgets\BlogTagsCloudWidgetController
BlogTagsWidget: SilverStripe\Blog\Widgets\BlogTagsWidget
BlogTagsWidget_Controller: SilverStripe\Blog\Widgets\BlogTagsWidgetController

23
LICENSE
View File

@ -1,23 +0,0 @@
Copyright (c) 2013, Michael Strong
All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
Redistributions in binary form must reproduce the above copyright notice, this
list of conditions and the following disclaimer in the documentation and/or
other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

View File

@ -1,53 +1,40 @@
# SilverStripe Blog Module
# Silverstripe Blog Module
[![Build Status](https://travis-ci.org/silverstripe/silverstripe-blog.png?branch=master)](https://travis-ci.org/silverstripe/silverstripe-blog) [![Latest Stable Version](https://poser.pugx.org/silverstripe/blog/v/stable.svg)](https://packagist.org/packages/silverstripe/blog) [![Total Downloads](https://poser.pugx.org/silverstripe/blog/downloads.svg)](https://packagist.org/packages/silverstripe/blog) [![Latest Unstable Version](https://poser.pugx.org/silverstripe/blog/v/unstable.svg)](https://packagist.org/silverstripe/silverstripe/blog) [![License](https://poser.pugx.org/silverstripe/blog/license.svg)](https://packagist.org/packages/silverstripe/blog)
[![CI](https://github.com/silverstripe/silverstripe-blog/actions/workflows/ci.yml/badge.svg)](https://github.com/silverstripe/silverstripe-blog/actions/workflows/ci.yml)
[![Silverstripe supported module](https://img.shields.io/badge/silverstripe-supported-0071C4.svg)](https://www.silverstripe.org/software/addons/silverstripe-commercially-supported-module-list/)
## Features
## Documentation
* [User roles](docs/en/roles.md)
* [Tags and categories](docs/en/tags-and-categories.md)
* [Custom publish dates](docs/en/custom-publish-dates.md)
* [RSS Feed](docs/en/rss-feed.md)
* [Widgets](docs/en/widgets.md) (optional)
* [Custom pagination](docs/en/pagination.md)
* [Minimal design reduces SiteTree clutter](#usage)
* [User guide](docs/en/userguide/index.md)
* [Developer documentation](docs/en/index.md)
## Requirements
```
silverstripe/cms: ~3.1
```
* Silverstripe CMS 4.0+
* Silverstripe Lumberjack Module 2.0+
* Silverstripe Tag Field Module 2.0+
* Silverstripe Assets 1.0+
* Silverstripe Asset Admin Module 1.0+
Note: this version is compatible with Silverstripe 4. For Silverstripe 3, please see [the 2.x release line](https://github.com/silverstripe/silverstripe-blog/tree/2).
### Suggested Modules
```
silverstripe/widgets: *
silverstripe/comments: *
```
* Silverstripe Widgets Module
* Silverstripe Comments Module
## Installation
```
composer require silverstripe/blog 2.0.x-dev
composer require silverstripe/blog
```
## Upgrading legacy blog to 2.0
## Upgrading
If you're upgrading from blog version 1.0 to 2.0 you will need to run the `BlogMigrationTask`. Run the task using `dev/tasks/BlogMigrationTask` either via the browser or sake CLI to migrate your legacy blog to the new version data structure.
### Upgrading from 2.x to 3.x
## Usage
Aside from the framework and CMS upgrades required the blog module should not require anything extra to be completed.
Because your blog is part of the SiteTree, usage is the same as any other page.
### Upgrading legacy blog to 2.x
By default, blog posts don't appear in the SiteTree, to avoid clutter. Instead they appear inside your blog as a GridField.
![](docs/en/_images/blog-post-management.png)
If you'd rather display your posts within the SiteTree, you can do so using SilverStripe config.
In mysite/_config/settings.yml
```yaml
BlogPost:
show_in_sitetree: true
```
If you're upgrading from blog version 1.0 to 2.x you will need to run the `BlogMigrationTask`. Run the task using `dev/tasks/BlogMigrationTask` either via the browser or sake CLI to migrate your legacy blog to the new version data structure.

View File

@ -1,8 +1 @@
<?php
/**
* Fetches the name of the current module folder name.
*
* @return string
**/
define('BLOGGER_DIR', ltrim(Director::makeRelative(realpath(__DIR__)), DIRECTORY_SEPARATOR));
<?php

View File

@ -3,15 +3,15 @@ Name: blogcommentsconfig
Only:
moduleexists: comments
---
Comment:
SilverStripe\Comments\Model\Comment:
extensions:
- BlogCommentExtension
- SilverStripe\Blog\Model\BlogCommentExtension
---
Name: blogcommentnotifications
Only:
moduleexists: 'comment-notifications'
---
BlogPost:
SilverStripe\Blog\Model\BlogPost:
extensions:
- BlogPostNotifications
- SilverStripe\Blog\Model\BlogPostNotifications

View File

@ -1,6 +1,15 @@
---
Name: blogconfig
---
Member:
SilverStripe\Security\Member:
extensions:
- BlogMemberExtension
- SilverStripe\Blog\Model\BlogMemberExtension
---
Name: featuredpostswidget
Only:
moduleexists: silverstripe/widgets
---
SilverStripe\Blog\Model\BlogPost:
extensions:
- SilverStripe\Blog\Model\BlogPostFeaturedExtension

14
_config/legacy.yml Normal file
View File

@ -0,0 +1,14 @@
---
Name: bloglegacy
---
SilverStripe\ORM\DatabaseAdmin:
classname_value_remapping:
Blog: SilverStripe\Blog\Model\Blog
BlogCategory: SilverStripe\Blog\Model\BlogCategory
BlogPost: SilverStripe\Blog\Model\BlogPost
BlogTag: SilverStripe\Blog\Model\BlogTag
BlogArchiveWidget: SilverStripe\Blog\Widgets\BlogArchiveWidget
BlogCategoriesWidget: SilverStripe\Blog\Widgets\BlogCategoriesWidget
BlogRecentPostsWidget: SilverStripe\Blog\Widgets\BlogRecentPostsWidget
BlogTagsCloudWidget: SilverStripe\Blog\Widgets\BlogTagsCloudWidget
BlogTagsWidget: SilverStripe\Blog\Widgets\BlogTagsWidget

29
behat.yml Normal file
View File

@ -0,0 +1,29 @@
default:
suites:
blog:
paths:
- "%paths.modules.blog%/tests/behat/features"
contexts:
- SilverStripe\Admin\Tests\Behat\Context\AdminContext
- SilverStripe\BehatExtension\Context\BasicContext
- SilverStripe\BehatExtension\Context\EmailContext
- SilverStripe\BehatExtension\Context\LoginContext
- SilverStripe\Framework\Tests\Behaviour\CmsFormsContext
- SilverStripe\Framework\Tests\Behaviour\CmsUiContext
- SilverStripe\Blog\Tests\Behat\Context\FeatureContext
- SilverStripe\Blog\Tests\Behat\Context\FixtureContext
-
SilverStripe\Blog\Tests\Behat\Context\FixtureContext:
- "%paths.modules.blog%/tests/behat/files/"
extensions:
SilverStripe\BehatExtension\MinkExtension:
default_session: facebook_web_driver
javascript_session: facebook_web_driver
facebook_web_driver:
browser: chrome
wd_host: "http://127.0.0.1:9515"
SilverStripe\BehatExtension\Extension:
screenshot_path: "%paths.base%/artifacts/screenshots"
bootstrap_file: vendor/silverstripe/framework/tests/behat/serve-bootstrap.php

62
changelog.md Normal file
View File

@ -0,0 +1,62 @@
# Changelog
All notable changes to this project will be documented in this file.
This project adheres to [Semantic Versioning](http://semver.org/).
## [2.4.2]
* Update translations
## [2.4.1]
* Added missing title attribute
* Format dates in Blog Posts gridfield based on user preferences
* FIX Ensure tag cloud widget does not break when there are zero tags
* FIX Success/error message overflow in cms
* FIX Prevent duplicate tags and categories
* FIX Prevent showing future blog posts before their publish date
* FIX Prevent the CMS Hijacking the return keypress in gridfieldaddbydbfield
* FIX minInnerWidth should begin with upper-case M
## [2.4.0]
* Add BlogTagsCloudWidget
* Added code coverage and extra badges on the home page
* Changed blog page icon
* Change image field label back to “Featured Image”
* Rework documentation to have clear user guide and dev docs.
* Fix blog date filtering for additional database server types
* Tests now pass in Postgres on 3.1 and 3.2
* improved pagination for blog posts
## [2.3.0]
* Allow injection on date
* Added standard code of conduct
* Converted to PSR-2
* Update translations
* BUG Fix regression in [#312](https://github.com/silverstripe/silverstripe-blog/pull/312) in PHP 5.3
## [2.2.0]
* Changelog added.
* Added standard git attributes
* Added standard license
* Added standard editor config
* Added hook for extension filters on tag blog posts
* Update translations
* Added hook for extension filters on category blog posts
* FIX Title bug due to [#320](https://github.com/silverstripe/silverstripe-blog/pull/320)
* FIX Hardcode the year to the current year in setUp()
* BUG Fix tag / category filters not being filtered in PaginatedList()
* ENHANCEMENT Default archive year
* BUGFIX: Dropdowns do not use unique IDs
* BUG Fix crash if parent page isn't Blog type
* ENHANCEMENT filtering for large user base sites.
* FIX Explicitly set the PostsPerPage during migration
* i18n wrong label in BlogPost.php
* Bugfix: avoid feeding null to PaginatedList constructor
* Default PublishDate to NULL for drafts and sort them at the top
* Update README to include additional requirements
* Fixed a bug where an error occurred when attempting to change the page type of 'Blog'

1
client/dist/js/main.bundle.js vendored Normal file
View File

@ -0,0 +1 @@
!function(t){function e(i){if(n[i])return n[i].exports;var o=n[i]={i:i,l:!1,exports:{}};return t[i].call(o.exports,o,o.exports,e),o.l=!0,o.exports}var n={};e.m=t,e.c=n,e.i=function(t){return t},e.d=function(t,n,i){e.o(t,n)||Object.defineProperty(t,n,{configurable:!1,enumerable:!0,get:i})},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,"a",n),n},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="",e(e.s="./client/src/main.js")}({"./client/src/bundles/cms.js":function(t,e,n){"use strict";var i=n(0);n.n(i).a.entwine("ss",function(t){t(".cms-content-fields > #Form_EditForm_error").entwine({onadd:function(){var e=t(".blog-admin-outer");1===e.length&&e.prepend(this)}}),t(".toggle-description").entwine({onadd:function(){var e=t(this);if(!e.hasClass("toggle-description-enabled")){e.addClass("toggle-description-enabled");var n=!1,i=e.closest(".field").find(".form-text");e.on("click",function(){i[n?"hide":"show"](),e.toggleClass("toggle-description-shown"),n=!n}),i.hide(),e.parent().addClass("toggle-description-correct-right"),e.parent().prev(".middleColumn").addClass("toggle-description-correct-middle"),e.parent().next(".description").addClass("toggle-description-correct-description")}}}),t(".MergeAction").entwine({onadd:function(){var e=t(this);e.on("click","select",function(){return!1}),e.children("button").each(function(e,n){var i=t(n),o=i.prev("select");i.before('<input type="hidden" name="'+i.attr("data-target")+'" value="'+o.val()+'" />')}),e.on("change","select",function(e){var n=t(e.target);n.next("input").val(n.val())}),e.children("button, select").hide(),e.on("click",".MergeActionReveal",function(e){var n=t(e.target);return n.parent().children("button, select").show(),n.hide(),!1})}}),t(".blog-admin-sidebar.cms-panel").entwine({MinInnerWidth:620,onadd:function(){var e=this;this._super(),this.updateLayout(),!this.hasClass("collapsed")&&t(".blog-admin-outer").width()<this.getMinInnerWidth()&&this.collapsePanel();var n=function(){e.updateLayout()};n.bind(this),window.onresize=n},togglePanel:function(t,e){this._super(t,e),this.updateLayout()},updateLayout:function(){t(this).css("height","100%");var e=t(this).outerHeight(),n=t(".cms-content-actions").eq(0).outerHeight();t(this).css("height",e-n+"px"),t(this).css("bottom",n+"px"),t(".cms-container").updateLayoutOptions({minContentWidth:820+this.width()})}})})},"./client/src/bundles/gridfieldaddbydbfield.js":function(t,e,n){"use strict";var i=n(0);n.n(i).a.entwine("ss",function(t){t(".add-existing-autocompleter input.text").entwine({onkeydown:function(e){13===e.which&&(t(this).parents(".add-existing-autocompleter").find('button[type="submit"]').click(),e.preventDefault())}})})},"./client/src/main.js":function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),n("./client/src/bundles/cms.js"),n("./client/src/bundles/gridfieldaddbydbfield.js")},0:function(t,e){t.exports=jQuery}});

1
client/dist/styles/main.css vendored Normal file
View File

@ -0,0 +1 @@
.no-sidebar .content-container.size3of4{width:75%}.blog-entry .post-image img{width:98.75%}.blog-sidebar .WidgetHolder ul{margin-left:0}.blog-sidebar .WidgetHolder ul li,ul.blogTagCloud{list-style-type:none}ul.blogTagCloud{clear:both}ul.blogTagCloud li{float:left;display:inline;padding-right:8px}ul.blogTagCloud li a span{float:left;line-height:30px;text-align:center;padding:0}ul.blogTagCloud .tagCount10{font-size:26pt}ul.blogTagCloud .tagCount9{font-size:24pt}ul.blogTagCloud .tagCount8{font-size:22pt}ul.blogTagCloud .tagCount7{font-size:20pt}ul.blogTagCloud .tagCount6{font-size:18pt}ul.blogTagCloud .tagCount5{font-size:16pt}ul.blogTagCloud .tagCount4{font-size:14pt}ul.blogTagCloud .tagCount3{font-size:12pt}ul.blogTagCloud .tagCount2{font-size:10pt}ul.blogTagCloud .tagCount1{font-size:8pt}#FeaturedImage .middleColumn{clear:none;float:left}.has-panel .cms-content-tools.blog-admin-sidebar{width:280px;border-right:0;border-left:1px solid #c0c0c2;position:absolute!important;right:0;top:0;height:100%}.has-panel .cms-content-tools.blog-admin-sidebar .cms-panel-toggle a{text-align:left;margin:0}.has-panel .cms-content-tools.blog-admin-sidebar .cms-panel-toggle.south{border-top:1px solid #aaa}.has-panel .cms-content-tools.blog-admin-sidebar~.blog-admin-outer{width:100%;padding-right:280px;position:absolute;height:100%;overflow-y:hidden;overflow-x:hidden;-webkit-box-sizing:border-box;box-sizing:border-box}.has-panel .cms-content-tools.blog-admin-sidebar~.blog-admin-outer>.ss-tabset{position:relative;overflow:auto;height:100%;width:100%}.has-panel .cms-content-tools.blog-admin-sidebar~.blog-admin-outer>.ss-tabset #Title label{float:none}.has-panel .cms-content-tools.blog-admin-sidebar~.blog-admin-outer>.ss-tabset #Title .middleColumn,.has-panel .cms-content-tools.blog-admin-sidebar~.blog-admin-outer>.ss-tabset #Title input{width:100%;max-width:100%;margin-left:0}.has-panel .cms-content-tools.blog-admin-sidebar .cms-content-view>.field+.field{margin-top:10px}.has-panel .cms-content-tools.blog-admin-sidebar .cms-content-view>.field.urlsegment .preview{padding-top:0;line-height:25px}.has-panel .cms-content-tools.blog-admin-sidebar .cms-content-view>.field.urlsegment .edit{float:right}.has-panel .cms-content-tools.blog-admin-sidebar .cms-content-view>.field.datetime>.middleColumn>.date{width:60%}.has-panel .cms-content-tools.blog-admin-sidebar .cms-content-view>.field.datetime>.middleColumn>.time{width:36%;float:right}.has-panel .cms-content-tools.blog-admin-sidebar .cms-content-view>.field.datetime>.middleColumn .middleColumn,.has-panel .cms-content-tools.blog-admin-sidebar .cms-content-view>.field.datetime>.middleColumn input{width:100%}.has-panel .cms-content-tools.blog-admin-sidebar.collapsed~.blog-admin-outer{padding-right:41px}.has-panel .cms-content-tools.blog-admin-sidebar.collapsed~.blog-admin-outer #Root_Main{margin-right:15px}.has-panel .cms-content-tools.blog-admin-sidebar.cms-content-tools .cms-panel-content{width:auto}.toggle-description{display:inline-block;font-size:1.2rem;width:20px;height:20px;margin-top:1px;cursor:pointer}.middleColumn.toggle-description-correct-middle{margin-left:0;float:left;width:416px}.tab-content .field p.toggle-description-correct-right{display:inline-block;margin-left:0;padding-left:0;clear:none;float:left}.description.toggle-description-correct-description{width:416px;padding:12px 0}.custom-summary .ui-accordion-content,.custom-summary .ui-accordion-content .field{padding:0}.custom-summary .ui-icon-triangle-1-e{background-position:-16px -128px}.cms table.ss-gridfield-table tr td.MergeAction{width:225px}.cms table.ss-gridfield-table tr td.MergeAction a{display:block;height:100%;width:100%}.cms table.ss-gridfield-table tr td.MergeAction select{width:150px}.blog-cms-categorisation .toolbar--content{margin-top:0}.blog-cms-categorisation .MergeActionReveal:after{content:"@";font-family:silverstripe;display:inline-block;position:relative;margin-left:10px;top:3px}.blog-cms-categorisation .blog-merge-action{margin-top:5px}

BIN
client/images/site-tree-icon.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 550 B

142
client/src/bundles/cms.js Normal file
View File

@ -0,0 +1,142 @@
/* global window */
import jQuery from 'jquery';
jQuery.entwine('ss', ($) => {
/**
* The page success/error message sits outside of the html block
* containing the sidebar and cms fields. This means it overflows
* underneath the sidebar.
*
* @see https://github.com/silverstripe/silverstripe-blog/issues/210
*/
$('.cms-content-fields > #Form_EditForm_error').entwine({
onadd() {
const $target = $('.blog-admin-outer');
if ($target.length === 1) {
$target.prepend(this);
}
}
});
/**
* Register expandable help text functions with fields.
*/
$('.toggle-description').entwine({
onadd() {
const $this = $(this);
/**
* Prevent multiple events being added.
*/
if ($this.hasClass('toggle-description-enabled')) {
return;
}
$this.addClass('toggle-description-enabled');
/**
* Toggle next description when button is clicked.
*/
let shown = false;
const $helpInfo = $this.closest('.field').find('.form-text');
$this.on('click', () => {
$helpInfo[shown ? 'hide' : 'show']();
$this.toggleClass('toggle-description-shown');
shown = !shown;
});
/**
* Hide next description by default.
*/
$helpInfo.hide();
/**
* Add classes to correct inherited layout issues in a small context.
*/
$this.parent().addClass('toggle-description-correct-right');
$this.parent().prev('.middleColumn').addClass('toggle-description-correct-middle');
$this.parent().next('.description').addClass('toggle-description-correct-description');
}
});
/**
* Custom merge actions for tags and categories
*/
$('.MergeAction').entwine({
onadd() {
const $this = $(this);
$this.on('click', 'select', () => false);
$this.children('button').each((i, button) => {
const $button = $(button);
const $select = $button.prev('select');
$button.before(`<input type="hidden" name="${$button.attr('data-target')}" value="${$select.val()}" />`);
});
$this.on('change', 'select', (e) => {
const $target = $(e.target);
$target.next('input').val($target.val());
});
$this.children('button, select').hide();
$this.on('click', '.MergeActionReveal', (e) => {
const $target = $(e.target);
$target.parent().children('button, select').show();
$target.hide();
return false;
});
}
});
/**
* Customise the cms-panel behaviour for blog sidebar
*
* see LeftAndMain.Panel.js for base behaviour
*/
$('.blog-admin-sidebar.cms-panel').entwine({
MinInnerWidth: 620,
onadd() {
this._super();
this.updateLayout();
// Contract panel if it's open and the left hand column is smaller than the minimum
if (!this.hasClass('collapsed') && ($('.blog-admin-outer').width() < this.getMinInnerWidth())) {
this.collapsePanel();
}
const onresize = () => {
this.updateLayout();
};
onresize.bind(this);
window.onresize = onresize;
},
togglePanel(bool, silent) {
this._super(bool, silent);
this.updateLayout();
},
/**
* Adjust minimum width of content to account for extra panel
*
* @returns {undefined}
*/
updateLayout() {
$(this).css('height', '100%');
const currentHeight = $(this).outerHeight();
const bottomHeight = $('.cms-content-actions').eq(0).outerHeight();
$(this).css('height', `${currentHeight - bottomHeight}px`);
$(this).css('bottom', `${bottomHeight}px`);
$('.cms-container').updateLayoutOptions({
minContentWidth: 820 + this.width()
});
}
});
});

View File

@ -0,0 +1,16 @@
import jQuery from 'jquery';
jQuery.entwine('ss', ($) => {
/**
* Prevent the CMS hijacking the return key
*/
$('.add-existing-autocompleter input.text').entwine({
onkeydown(e) {
if (e.which === 13) {
const $parent = $(this).parents('.add-existing-autocompleter');
$parent.find('button[type="submit"]').click();
e.preventDefault();
}
}
});
});

2
client/src/main.js Normal file
View File

@ -0,0 +1,2 @@
import 'bundles/cms';
import 'bundles/gridfieldaddbydbfield';

2
client/src/main.scss Normal file
View File

@ -0,0 +1,2 @@
@import "styles/blog";
@import "styles/cms";

View File

@ -0,0 +1,76 @@
.no-sidebar .content-container.size3of4 {
width: 75%;
}
.blog-entry .post-image img {
width: 98.75%;
}
.blog-sidebar .WidgetHolder ul {
margin-left: 0;
li {
list-style-type: none;
}
}
// tag cloud related
$base_tag_font_size: 4pt;
ul.blogTagCloud {
list-style-type: none;
clear: both;
li {
float: left;
display: inline;
padding-right: 8px;
a span {
float: left;
line-height: 30px;
text-align: center;
padding: 0;
}
}
.tagCount10 {
font-size: $base_tag_font_size + 22pt;
}
.tagCount9 {
font-size: $base_tag_font_size + 20pt;
}
.tagCount8 {
font-size: $base_tag_font_size + 18pt;
}
.tagCount7 {
font-size: $base_tag_font_size + 16pt;
}
.tagCount6 {
font-size: $base_tag_font_size + 14pt;
}
.tagCount5 {
font-size: $base_tag_font_size + 12pt;
}
.tagCount4 {
font-size: $base_tag_font_size + 10pt;
}
.tagCount3 {
font-size: $base_tag_font_size + 8pt;
}
.tagCount2 {
font-size: $base_tag_font_size + 6pt;
}
.tagCount1 {
font-size: $base_tag_font_size + 4pt;
}
}

185
client/src/styles/cms.scss Executable file
View File

@ -0,0 +1,185 @@
/**
* CMS Styles
*/
#FeaturedImage .middleColumn {
clear: none;
float: left;
}
.has-panel .cms-content-tools.blog-admin-sidebar {
width: 280px;
border-right: 0;
border-left: 1px solid #C0C0C2;
position: absolute !important; /* overrides cms !imporant style */
right: 0;
top: 0;
height: 100%;
.cms-panel-toggle a {
text-align: left;
margin: 0;
}
.cms-panel-toggle.south {
border-top: 1px solid #aaaaaa;
}
~ .blog-admin-outer {
width: 100%;
padding-right: 280px;
position: absolute;
height: 100%;
overflow-y: hidden;
overflow-x: hidden;
box-sizing: border-box;
> .ss-tabset {
position: relative;
overflow: auto;
height: 100%;
width: 100%;
#Title {
label {
float: none;
}
.middleColumn,
input {
width: 100%;
max-width: 100%;
margin-left: 0;
}
}
}
}
.cms-content-view {
> .field {
+ .field {
margin-top: 10px;
}
&.urlsegment {
.preview {
padding-top: 0;
line-height: 25px;
}
.edit {
float: right;
}
}
&.datetime {
> .middleColumn {
> .date {
width: 60%;
}
> .time {
width: 36%;
float: right;
}
.middleColumn,
input {
width: 100%;
}
}
}
}
}
&.collapsed {
~ .blog-admin-outer {
padding-right: 41px;
#Root_Main {
margin-right: 15px;
}
}
}
&.cms-content-tools {
.cms-panel-content {
width: auto;
}
}
}
.toggle-description {
display: inline-block;
font-size: 1.2rem;
width: 20px;
height: 20px;
margin-top: 1px;
cursor: pointer;
}
.middleColumn.toggle-description-correct-middle {
margin-left: 0;
float: left;
width: 416px;
}
.tab-content .field p.toggle-description-correct-right {
display: inline-block;
margin-left: 0;
padding-left: 0;
clear: none;
float: left;
}
.description.toggle-description-correct-description {
width: 416px;
padding: 12px 0;
}
.custom-summary {
.ui-accordion-content,
.ui-accordion-content .field {
padding: 0;
}
// Change the caret to a plus icon
.ui-icon-triangle-1-e {
background-position: -16px -128px;
}
}
.cms table.ss-gridfield-table {
tr td.MergeAction {
width: 225px;
a {
display: block;
height: 100%;
width: 100%;
}
select {
width: 150px;
}
}
}
.blog-cms-categorisation {
.toolbar--content {
margin-top: 0;
}
.MergeActionReveal:after {
content: "@";
font-family: silverstripe;
display: inline-block;
position: relative;
margin-left: 10px;
top: 3px;
}
.blog-merge-action {
margin-top: 5px;
}
}

1
code-of-conduct.md Normal file
View File

@ -0,0 +1 @@
When having discussions about this module in issues or pull request please adhere to the [SilverStripe Community Code of Conduct](https://docs.silverstripe.org/en/contributing/code_of_conduct).

View File

@ -1,54 +0,0 @@
<?php
class GridFieldCategorisationConfig extends GridFieldConfig_RecordEditor {
/**
* @param int $itemsPerPage
* @param array|SS_List $mergeRecords
* @param string $parentType
* @param string $parentMethod
* @param string $childMethod
*/
public function __construct($itemsPerPage = 15, $mergeRecords, $parentType, $parentMethod, $childMethod) {
parent::__construct($itemsPerPage);
$this->removeComponentsByType('GridFieldAddNewButton');
$this->addComponent(
new GridFieldAddByDBField('buttons-before-left')
);
$this->addComponent(
new GridFieldMergeAction($mergeRecords, $parentType, $parentMethod, $childMethod)
);
/**
* @var GridFieldDataColumns $columns
*/
$columns = $this->getComponentByType('GridFieldDataColumns');
$columns->setFieldFormatting(array(
'BlogPostsCount' => function ($value, CategorisationObject $item) {
return $item->BlogPosts()->Count();
}
));
$this->changeColumnOrder();
}
/**
* Reorders GridField columns so that Actions is last.
*/
protected function changeColumnOrder() {
/**
* @var GridFieldDataColumns $columns
*/
$columns = $this->getComponentByType('GridFieldDataColumns');
$columns->setDisplayFields(array(
'Title' => 'Title',
'BlogPostsCount' => 'Posts',
'MergeAction' => 'MergeAction',
'Actions' => 'Actions',
));
}
}

View File

@ -1,27 +0,0 @@
<?php
class GridFieldFormAction extends GridField_FormAction {
/**
* @var array
*/
protected $extraAttributes = array();
/**
* @param array $attributes
*/
public function setExtraAttributes(array $attributes) {
$this->extraAttributes = $attributes;
}
/**
* @return array
*/
public function getAttributes() {
$attributes = parent::getAttributes();
return array_merge(
$attributes,
$this->extraAttributes
);
}
}

View File

@ -1,140 +0,0 @@
<?php
class GridFieldMergeAction implements GridField_ColumnProvider, GridField_ActionProvider {
/**
* List of records to show in the MergeAction column.
*
* @var array|SS_List
*/
protected $records;
/**
* Type of parent DataObject (i.e BlogTag, BlogCategory).
*
* @var string
*/
protected $parentType;
/**
* Relationship method to reference parent (i.e BlogTags).
*
* @var string
*/
protected $parentMethod;
/**
* Relationship method to reference child (i.e BlogPosts).
*
* @var string
*/
protected $childMethod;
/**
* @param array|SS_List $records
* @param string $parentType
* @param string $parentMethod
* @param string $childMethod
*/
public function __construct($records = array(), $parentType, $parentMethod, $childMethod) {
$this->records = $records;
$this->parentType = $parentType;
$this->parentMethod = $parentMethod;
$this->childMethod = $childMethod;
}
/**
* {@inheritdoc}
*/
public function augmentColumns($gridField, &$columns) {
if(!in_array('MergeAction', $columns)) {
$columns[] = 'MergeAction';
}
return $columns;
}
/**
* {@inheritdoc}
*/
public function getColumnsHandled($gridField) {
return array('MergeAction');
}
/**
* {@inheritdoc}
*/
public function getColumnContent($gridField, $record, $columnName) {
if($columnName === 'MergeAction' && $record->{$this->childMethod}()->Count() > 0) {
$dropdown = new DropdownField('Target', 'Target', $this->records->exclude('ID', $record->ID)->map());
$prefix = strtolower($this->parentMethod . '-' . $this->childMethod);
$action = GridFieldFormAction::create(
$gridField,
'MergeAction' . $record->ID,
'Move',
'merge',
array(
'record' => $record->ID,
'target' => $prefix . '-target-record-' . $record->ID,
)
);
$action->setExtraAttributes(array(
'data-target' => $prefix . '-target-record-' . $record->ID
));
return $dropdown->Field() . $action->Field() . '<a title="Move posts to" class="MergeActionReveal">move posts to</a>';
}
return null;
}
/**
* {@inheritdoc}
*/
public function getColumnAttributes($gridField, $record, $columnName) {
return array('class' => 'MergeAction');
}
/**
* {@inheritdoc}
*/
public function getColumnMetadata($gridField, $columnName) {
return array('title' => 'Move posts to');
}
/**
* {@inheritdoc}
*/
public function getActions($gridField) {
return array('merge');
}
/**
* {@inheritdoc}
*/
public function handleAction(GridField $gridField, $actionName, $arguments, $data) {
if($actionName === 'merge') {
$controller = Controller::curr();
$request = $controller->getRequest();
$target = $request->requestVar($arguments["target"]);
$parentType = $this->parentType;
$fromParent = $parentType::get()->byId($arguments['record']);
$toParent = $parentType::get()->byId($target);
$posts = $fromParent->{$this->childMethod}();
foreach($posts as $post) {
$relationship = $post->{$this->parentMethod}();
$relationship->remove($fromParent);
$relationship->add($toParent);
}
}
}
}

View File

@ -1,112 +0,0 @@
<?php
/**
* @deprecated since version 2.0
*
* @property int $ParentID
* @property string $Date
* @property string $PublishDate
* @property string $Tags
*/
class BlogEntry extends BlogPost implements MigratableObject {
/**
* @var string
*/
private static $hide_ancestor = 'BlogEntry';
/**
* @var array
*/
private static $db = array(
'Date' => 'SS_Datetime',
'Author' => 'Text',
'Tags' => 'Text',
);
/**
* {@inheritdoc}
*/
public function canCreate($member = null) {
return false;
}
/**
* {@inheritdoc}
*/
public function up() {
//Migrate comma separated tags into BlogTag objects.
foreach($this->TagNames() as $tag) {
$existingTag = BlogTag::get()->filter(array('Title' => $tag, 'BlogID' => $this->ParentID));
if($existingTag->count()) {
//if tag already exists we will simply add it to this post.
$tagObject = $existingTag->First();
} else {
//if the tag is now we create it and add it to this post.
$tagObject = new BlogTag();
$tagObject->Title = $tag;
$tagObject->BlogID = $this->ParentID;
$tagObject->write();
}
if($tagObject){
$this->Tags()->add($tagObject);
}
}
//Store if the original entity was published or not (draft)
$published = $this->IsPublished();
// If a user has subclassed BlogEntry, it should not be turned into a BlogPost.
if($this->ClassName === 'BlogEntry') {
$this->ClassName = 'BlogPost';
$this->RecordClassName = 'BlogPost';
}
//Migrate these key data attributes
$this->PublishDate = $this->Date;
$this->AuthorNames = $this->Author;
$this->InheritSideBar = true;
//Write and additionally publish the item if it was published before.
$this->write();
if($published){
$this->publish('Stage','Live');
$message = "PUBLISHED: ";
} else {
$message = "DRAFT: ";
}
return $message . $this->Title;
}
/**
* Safely split and parse all distinct tags assigned to this BlogEntry.
*
* @deprecated since version 2.0
*
* @return array
*/
public function TagNames() {
$tags = preg_split('/\s*,\s*/', trim($this->Tags));
$results = array();
foreach($tags as $tag) {
if($tag) $results[mb_strtolower($tag)] = $tag;
}
return $results;
}
}
/**
* @deprecated since version 2.0
*/
class BlogEntry_Controller extends BlogPost_Controller {
}

View File

@ -1,72 +0,0 @@
<?php
/**
* @deprecated since version 2.0
*/
class BlogHolder extends BlogTree implements MigratableObject {
/**
* @var string
*/
private static $hide_ancestor = 'BlogHolder';
/**
* @var array
*/
private static $db = array(
'AllowCustomAuthors' => 'Boolean',
'ShowFullEntry' => 'Boolean',
);
/**
* @var array
*/
private static $has_one = array(
'Owner' => 'Member',
);
/**
* {@inheritdoc}
*/
public function canCreate($member = null) {
return false;
}
//Overload these to stop the Uncaught Exception: Object->__call(): the method 'parent' does not exist on 'BlogHolder' error.
public function validURLSegment() {
return true;
}
public function syncLinkTracking() {
return null;
}
/**
* {@inheritdoc}
*/
public function up() {
$published = $this->IsPublished();
if($this->ClassName === 'BlogHolder') {
$this->ClassName = 'Blog';
$this->RecordClassName = 'Blog';
$this->write();
}
if($published){
$this->publish('Stage','Live');
$message = "PUBLISHED: ";
} else {
$message = "DRAFT: ";
}
return $message . $this->Title;
}
}
/**
* @deprecated since version 2.0
*/
class BlogHolder_Controller extends BlogTree_Controller {
}

View File

@ -1,53 +0,0 @@
<?php
/**
* @deprecated since version 2.0
*/
class BlogTree extends Page implements MigratableObject {
/**
* @var string
*/
private static $hide_ancestor = 'BlogTree';
/**
* @var array
*/
private static $db = array(
'Name' => 'Varchar(255)',
'LandingPageFreshness' => 'Varchar',
);
/**
* {@inheritdoc}
*/
public function canCreate($member = null) {
return false;
}
/**
* {@inheritdoc}
*/
public function up() {
$published = $this->IsPublished();
if($this->ClassName === 'BlogTree') {
$this->ClassName = 'Page';
$this->RecordClassName = 'Page';
$this->write();
}
if($published){
$this->publish('Stage','Live');
$message = "PUBLISHED: ";
} else {
$message = "DRAFT: ";
}
return $message . $this->Title;
}
}
/**
* @deprecated since version 2.0
*/
class BlogTree_Controller extends Page_Controller {
}

View File

@ -1,89 +0,0 @@
<?php
class BlogMigrationTask extends MigrationTask {
/**
* Should this task be invoked automatically via dev/build?
*
* @config
*
* @var bool
*/
private static $run_during_dev_build = true;
/**
* {@inheritdoc}
*/
public function up() {
$classes = ClassInfo::implementorsOf('MigratableObject');
$this->message('Migrating legacy blog records');
foreach($classes as $class) {
$this->upClass($class);
}
}
/**
* @param string $text
*/
protected function message($text) {
if(Controller::curr() instanceof DatabaseAdmin) {
DB::alteration_message($text, 'obsolete');
} else {
echo $text . "<br/>";
}
}
/**
* Migrate records of a single class
*
* @param string $class
* @param null|string $stage
*/
protected function upClass($class) {
if(!class_exists($class)) {
return;
}
if(is_subclass_of($class, 'SiteTree')) {
$items = SiteTree::get()->filter('ClassName', $class);
} else {
$items = $class::get();
}
if($count = $items->count()) {
$this->message(
sprintf(
'Migrating %s legacy %s records.',
$count,
$class
)
);
foreach($items as $item) {
$cancel = $item->extend('onBeforeUp');
if($cancel && min($cancel) === false) {
continue;
}
/**
* @var MigratableObject $item
*/
$result = $item->up();
$this->message($result);
$item->extend('onAfterUp');
}
}
}
/**
* {@inheritdoc}
*/
public function down() {
$this->message('BlogMigrationTask::down() not implemented');
}
}

View File

@ -1,8 +0,0 @@
<?php
interface MigratableObject {
/**
* Migrate the object up to the current version.
*/
public function up();
}

View File

@ -1,52 +0,0 @@
<?php
if(!class_exists('Widget')) {
return;
}
/**
* @deprecated since version 2.0
*
* @property string $DisplayMode
* @property string $ArchiveType
*/
class ArchiveWidget extends BlogArchiveWidget implements MigratableObject {
/**
* @var array
*/
private static $db = array(
'DisplayMode' => 'Varchar',
);
/**
* @var array
*/
private static $only_available_in = array(
'none',
);
/**
* {@inheritdoc}
*/
public function canCreate($member = null) {
return false;
}
/**
* {@inheritdoc}
*/
public function up() {
if($this->DisplayMode) {
$this->ArchiveType = 'Monthly';
if($this->DisplayMode === 'year') {
$this->ArchiveType = 'Yearly';
}
}
$this->ClassName = 'BlogArchiveWidget';
$this->write();
return "Migrated " . $this->ArchiveType . " archive widget";
}
}

View File

@ -1,44 +0,0 @@
<?php
if(!class_exists('Widget')) {
return;
}
/**
* A list of tags associated with blog posts.
*
* @package blog
*/
class TagCloudWidget extends BlogTagsWidget implements MigratableObject {
/**
* @var array
*/
private static $db = array(
'Title' => 'Varchar',
'Limit' => 'Int',
'Sortby' => 'Varchar',
);
/**
* @var array
*/
private static $only_available_in = array(
'none',
);
/**
* {@inheritdoc}
*/
public function canCreate($member = null) {
return false;
}
/**
* {@inheritdoc}
*/
public function up() {
$this->ClassName = 'BlogTagsWidget';
$this->write();
return "Migrated " . $this->Title . " widget";
}
}

View File

@ -1,23 +0,0 @@
<?php
/**
* Adds Blog specific behaviour to Comment.
*/
class BlogCommentExtension extends DataExtension {
/**
* Extra CSS classes for styling different comment types.
*
* @return string
*/
public function getExtraClass() {
$blogPost = $this->owner->getParent();
if($blogPost instanceof BlogPost) {
if($blogPost->isAuthor($this->owner->Author())) {
return 'author-comment';
}
}
return '';
}
}

View File

@ -1,106 +0,0 @@
<?php
/**
* This class is responsible for filtering the SiteTree when necessary and also overlaps into
* filtering only published posts.
*
* @package silverstripe
* @subpackage blog
*/
class BlogFilter extends Lumberjack {
/**
* {@inheritdoc}
*/
public function stageChildren($showAll = false) {
$staged = parent::stageChildren($showAll);
if(!$this->shouldFilter() && $this->subclassForBlog() && !Permission::check('VIEW_DRAFT_CONTENT')) {
$stage = Versioned::current_stage();
if($stage == 'Stage') {
$stage = '';
} elseif($stage) {
$stage = '_' . $stage;
}
$dataQuery = $staged->dataQuery()
->innerJoin('BlogPost', sprintf('"BlogPost%s"."ID" = "SiteTree%s"."ID"', $stage, $stage))
->where(sprintf('"PublishDate" < \'%s\'', Convert::raw2sql(SS_Datetime::now())));
$staged = $staged->setDataQuery($dataQuery);
}
return $staged;
}
/**
* @return bool
*/
protected function subclassForBlog() {
return in_array(get_class($this->owner), ClassInfo::subClassesFor('Blog'));
}
/**
* {@inheritdoc}
*/
public function liveChildren($showAll = false, $onlyDeletedFromStage = false) {
$staged = parent::liveChildren($showAll, $onlyDeletedFromStage);
if(!$this->shouldFilter() && $this->isBlog() && !Permission::check('VIEW_DRAFT_CONTENT')) {
$dataQuery = $staged->dataQuery()
->innerJoin('BlogPost', '"BlogPost_Live"."ID" = "SiteTree_Live"."ID"')
->where(sprintf('"PublishDate" < \'%s\'', Convert::raw2sql(SS_Datetime::now())));
$staged = $staged->setDataQuery($dataQuery);
}
return $staged;
}
/**
* @return bool
*/
protected function isBlog() {
return $this->owner instanceof Blog;
}
/**
* {@inheritdoc}
*/
public function updateCMSFields(FieldList $fields) {
$excluded = $this->owner->getExcludedSiteTreeClassNames();
if(!empty($excluded)) {
$pages = SiteTree::get()->filter(array(
'ParentID' => $this->owner->ID,
'ClassName' => $excluded
))->sort('"SiteTree"."Created" DESC');
$gridField = new BlogFilter_GridField(
'ChildPages',
$this->getLumberjackTitle(),
$pages,
$this->getLumberjackGridFieldConfig()
);
$tab = new Tab('ChildPages', $this->getLumberjackTitle(), $gridField);
$fields->insertBefore($tab, 'Main');
}
}
}
/**
* Enables children of non-editable pages to be edited.
*/
class BlogFilter_GridField extends GridField {
/**
* @param FormTransformation $transformation
*
* @return $this
*/
public function transform(FormTransformation $transformation) {
return $this;
}
}

View File

@ -1,110 +0,0 @@
<?php
/**
* This class is responsible for add Blog specific behaviour to Members.
*
* @package silverstripe
* @subpackage blog
*/
class BlogMemberExtension extends DataExtension {
/**
* @var array
*/
private static $db = array(
'URLSegment' => 'Varchar',
'BlogProfileSummary' => 'Text',
);
/**
* @var array
*/
private static $has_one = array(
'BlogProfileImage' => 'Image',
);
/**
* @var array
*/
private static $belongs_many_many = array(
'BlogPosts' => 'BlogPost',
);
/**
* {@inheritdoc}
*/
public function onBeforeWrite() {
$count = 1;
$this->owner->URLSegment = $this->generateURLSegment();
while(!$this->validURLSegment()) {
$this->owner->URLSegment = preg_replace('/-[0-9]+$/', null, $this->owner->URLSegment) . '-' . $count;
$count++;
}
}
/**
* Generate a unique URL segment based on the Member's name.
*
* @return string
*/
public function generateURLSegment() {
$filter = URLSegmentFilter::create();
$name = $this->owner->FirstName . ' ' . $this->owner->Surname;
$urlSegment = $filter->filter($name);
if(!$urlSegment || $urlSegment == '-' || $urlSegment == '-1') {
$urlSegment = 'profile-' . $this->owner->ID;
}
return $urlSegment;
}
/**
* Returns TRUE if this object has a URL segment value that does not conflict with any other
* objects.
*
* @return bool
*/
public function validURLSegment() {
$conflict = Member::get()->filter('URLSegment', $this->owner->URLSegment);
if($this->owner->ID) {
$conflict = $conflict->exclude('ID', $this->owner->ID);
}
return $conflict->count() == 0;
}
/**
* {@inheritdoc}
*/
public function updateCMSFields(FieldList $fields) {
$fields->removeByName('URLSegment');
// Remove the automatically-generated posts tab.
$fields->removeFieldFromTab('Root', 'BlogPosts');
// Construct a better posts tab.
Requirements::css(BLOGGER_DIR . '/css/cms.css');
Requirements::javascript(BLOGGER_DIR . '/js/cms.js');
$tab = new Tab('BlogPosts', 'Blog Posts');
$gridField = new GridField(
'BlogPosts',
'Blog Posts',
$this->owner->BlogPosts(),
new GridFieldConfig_BlogPost()
);
$tab->Fields()->add($gridField);
$fields->addFieldToTab('Root', $tab);
return $fields;
}
}

View File

@ -1,42 +0,0 @@
<?php
/**
* This is responsible for filtering only published posts to users who do not have permission to
* view non-published posts.
*
* @package silverstripe
* @subpackage blog
*/
class BlogPostFilter extends DataExtension {
/**
* Augment queries so that we don't fetch unpublished articles.
*
* @param SQLQuery $query
*/
public function augmentSQL(SQLQuery &$query) {
$stage = Versioned::current_stage();
if (Controller::curr() instanceof LeftAndMain) {
return;
}
if($stage == 'Live' || !Permission::check('VIEW_DRAFT_CONTENT')) {
$query->addWhere(sprintf('"PublishDate" < \'%s\'', Convert::raw2sql(SS_Datetime::now())));
}
}
/**
* This is a fix so that when we try to fetch subclasses of BlogPost, lazy loading includes the
* BlogPost table in its query. Leaving this table out means the default sort order column
* PublishDate causes an error.
*
* @see https://github.com/silverstripe/silverstripe-framework/issues/1682
*
* @param SQLQuery $query
* @param mixed $dataQuery
* @param mixed $parent
*/
public function augmentLoadLazyFields(SQLQuery &$query, &$dataQuery, $parent) {
$dataQuery->innerJoin('BlogPost', '"SiteTree"."ID" = "BlogPost"."ID"');
}
}

View File

@ -1,29 +0,0 @@
<?php
/**
* Customise blog post to support comment notifications.
*
* Extends {@see BlogPost} with extensions to {@see CommentNotifiable}.
*/
class BlogPostNotifications extends DataExtension {
/**
* Notify all authors of notifications.
*
* @param SS_List $list
* @param mixed $comment
*/
public function updateNotificationRecipients(&$list, &$comment) {
$list = $this->owner->Authors();
}
/**
* Update comment to include the page title.
*
* @param string $subject
* @param Comment $comment
* @param Member|string $recipient
*/
public function updateNotificationSubject(&$subject, &$comment, &$recipient) {
$subject = sprintf('A new comment has been posted on ', $this->owner->Title);
}
}

View File

@ -1,61 +0,0 @@
<?php
/**
* Adds URLSegment functionality to Tags & Categories.
*
* @package silverstripe
* @subpackage blog
*/
class URLSegmentExtension extends DataExtension {
/**
* @var array
*/
private static $db = array(
'URLSegment' => 'Varchar(255)',
);
/**
* {@inheritdoc}
*/
public function onBeforeWrite() {
$this->owner->generateURLSegment();
}
/**
* Generates a unique URLSegment from the title.
*
* @param int $increment
*
* @return string
*/
public function generateURLSegment($increment = null) {
$filter = new URLSegmentFilter();
$this->owner->URLSegment = $filter->filter($this->owner->Title);
if(is_int($increment)) {
$this->owner->URLSegment .= '-' . $increment;
}
$duplicate = DataList::create($this->owner->ClassName)->filter(array(
'URLSegment' => $this->owner->URLSegment,
'BlogID' => $this->owner->BlogID,
));
if($this->owner->ID) {
$duplicate = $duplicate->exclude('ID', $this->owner->ID);
}
if($duplicate->count() > 0) {
if(is_int($increment)) {
$increment += 1;
} else {
$increment = 0;
}
$this->owner->generateURLSegment((int) $increment);
}
return $this->owner->URLSegment;
}
}

View File

@ -1,16 +0,0 @@
<?php
class BlogAdminSidebar extends FieldGroup {
/**
* @return bool
*/
public function isOpen() {
$sidebar = Cookie::get('blog-admin-sidebar');
if($sidebar == 1 || is_null($sidebar)) {
return true;
}
return false;
}
}

View File

@ -1,193 +0,0 @@
<?php
/**
* Adds a component which allows a user to add a new DataObject by database field.
*
* @package silverstripe
* @subpackage blog
*/
class GridFieldAddByDBField implements GridField_ActionProvider, GridField_HTMLProvider {
/**
* HTML Fragment to render the field.
*
* @var string
*/
protected $targetFragment;
/**
* Default field to create the DataObject by should be Title.
*
* @var string
*/
protected $dataObjectField = 'Title';
/**
* Creates a text field and add button which allows the user to directly create a new
* DataObject by just entering the title.
*
* @param string $targetFragment
* @param string $dataObjectField
*/
public function __construct($targetFragment = 'before', $dataObjectField = 'Title') {
$this->targetFragment = $targetFragment;
$this->dataObjectField = (string) $dataObjectField;
}
/**
* Provide actions to this component.
*
* @param GridField $gridField
*
* @return array
*/
public function getActions($gridField) {
return array(
'add',
);
}
/**
* Handles the add action for the given DataObject.
*
* @param $gridField GridField
* @param $actionName string
* @param $arguments mixed
* @param $data array
*
* @return null|SS_HTTPResponse
*
* @throws UnexpectedValueException
*/
public function handleAction(GridField $gridField, $actionName, $arguments, $data) {
if($actionName == 'add') {
$dbField = $this->getDataObjectField();
$objClass = $gridField->getModelClass();
/**
* @var DataObject $obj
*/
$obj = new $objClass();
if($obj->hasField($dbField)) {
$obj->setCastedField($dbField, $data['gridfieldaddbydbfield'][$obj->ClassName][$dbField]);
if($obj->canCreate()) {
$id = $gridField->getList()->add($obj);
if(!$id) {
$gridField->setError(
_t(
'GridFieldAddByDBField.AddFail',
'Unable to save {class} to the database.',
'Unable to add the DataObject.',
array(
'class' => get_class($obj),
)
),
'error'
);
}
} else {
return Security::permissionFailure(
Controller::curr(),
_t(
'GridFieldAddByDBField.PermissionFail',
'You don\'t have permission to create a {class}.',
'Unable to add the DataObject.',
array(
'class' => get_class($obj)
)
)
);
}
} else {
throw new UnexpectedValueException(
sprintf(
'Invalid field (%s) on %s.',
$dbField,
$obj->ClassName
)
);
}
}
return null;
}
/**
* Returns the database field for which we'll add the new data object.
*
* @return string
*/
public function getDataObjectField() {
return $this->dataObjectField;
}
/**
* Set the database field.
*
* @param $field string
*/
public function setDataObjectField($field) {
$this->dataObjectField = (string) $field;
}
/**
* Renders the TextField and add button to the GridField.
*
* @param $gridField GridField
*
* @return string
*/
public function getHTMLFragments($gridField) {
/**
* @var DataList $dataList
*/
$dataList = $gridField->getList();
$dataClass = $dataList->dataClass();
$obj = singleton($dataClass);
if(!$obj->canCreate()) {
return "";
}
$dbField = $this->getDataObjectField();
$textField = TextField::create(
sprintf(
"gridfieldaddbydbfield[%s][%s]",
$obj->ClassName,
Convert::raw2htmlatt($dbField)
)
)
->setAttribute('placeholder', $obj->fieldLabel($dbField))
->addExtraClass('no-change-track');
$addAction = new GridField_FormAction(
$gridField,
'add',
_t('GridFieldAddByDBField.Add',
'Add {name}', "Add button text",
array(
'name' => $obj->i18n_singular_name(),
)
),
'add',
'add'
);
$addAction->setAttribute('data-icon', 'add');
$forTemplate = new ArrayData(array());
$forTemplate->Fields = new ArrayList();
$forTemplate->Fields->push($textField);
$forTemplate->Fields->push($addAction);
return array(
$this->targetFragment => $forTemplate->renderWith('GridFieldAddByDBField')
);
}
}

View File

@ -1,94 +0,0 @@
<?php
/**
* Provides a component to the {@link GridField} which tells the user whether or not a blog post
* has been published and when.
*
* @package silverstripe
* @subpackage blog
*/
class GridFieldBlogPostState extends GridFieldSiteTreeState {
/**
* {@inheritdoc}
*/
public function getColumnContent($gridField, $record, $columnName) {
if($columnName == 'State') {
Requirements::css(BLOGGER_DIR . '/css/cms.css');
if($record instanceof BlogPost) {
$modifiedLabel = '';
if($record->isModifiedOnStage) {
$modifiedLabel = '<span class="modified">' . _t('GridFieldBlogPostState.Modified') . '</span>';
}
if(!$record->isPublished()) {
/**
* @var SS_Datetime $lastEdited
*/
$lastEdited = $record->dbObject('LastEdited');
return _t(
'GridFieldBlogPostState.Draft',
'<i class="btn-icon gridfield-icon btn-icon-pencil"></i> Saved as Draft on {date}',
'State for when a post is saved.',
array(
'date' => $lastEdited->Nice(),
)
);
}
/**
* @var SS_Datetime $publishDate
*/
$publishDate = $record->dbObject('PublishDate');
if(strtotime($record->PublishDate) > time()) {
return _t(
'GridFieldBlogPostState.Timer',
'<i class="gridfield-icon blog-icon-timer"></i> Publish at {date}',
'State for when a post is published.',
array(
'date' => $publishDate->Nice(),
)
) . $modifiedLabel;
}
return _t(
'GridFieldBlogPostState.Published',
'<i class="btn-icon gridfield-icon btn-icon-accept"></i> Published on {date}',
'State for when a post is published.',
array(
'date' => $publishDate->Nice(),
)
) . $modifiedLabel;
}
}
return '';
}
/**
* {@inheritdoc}
*/
public function getColumnAttributes($gridField, $record, $columnName) {
if($columnName == 'State') {
if($record instanceof BlogPost) {
$published = $record->isPublished();
if(!$published) {
$class = 'gridfield-icon draft';
} else if(strtotime($record->PublishDate) > time()) {
$class = 'gridfield-icon timer';
} else {
$class = 'gridfield-icon published';
}
return array(
'class' => $class,
);
}
}
return array();
}
}

View File

@ -1,19 +0,0 @@
<?php
/**
* GridField config necessary for managing a SiteTree object.
*
* @package silverstripe
* @subpackage blog
*/
class GridFieldConfig_BlogPost extends GridFieldConfig_Lumberjack {
/**
* @param null|int $itemsPerPage
*/
public function __construct($itemsPerPage = null) {
parent::__construct($itemsPerPage);
$this->removeComponentsByType('GridFieldSiteTreeState');
$this->addComponent(new GridFieldBlogPostState());
}
}

View File

@ -1,1039 +0,0 @@
<?php
/**
* Blog Holder
*
* @package silverstripe
* @subpackage blog
*
* @method HasManyList Tags() List of tags in this blog
* @method HasManyList Categories() List of categories in this blog
* @method ManyManyList Editors() List of editors
* @method ManyManyList Writers() List of writers
* @method ManyManyList Contributors() List of contributors
*/
class Blog extends Page implements PermissionProvider {
/**
* Permission for user management.
*
* @var string
*/
const MANAGE_USERS = 'BLOG_MANAGE_USERS';
/**
* If true, users assigned as editor, writer, or contributor will be automatically granted
* CMS_ACCESS_CMSMain permission. If false, only users with this permission already may be
* assigned.
*
* @config
*
* @var boolean
*/
private static $grant_user_access = true;
/**
* Permission to either require, or grant to users assigned to work on this blog.
*
* @config
*
* @var string
*/
private static $grant_user_permission = 'CMS_ACCESS_CMSMain';
/**
* Group code to assign newly granted users to.
*
* @config
*
* @var string
*/
private static $grant_user_group = 'blog-users';
/**
* @var array
*/
private static $db = array(
'PostsPerPage' => 'Int',
);
/**
* @var array
*/
private static $has_many = array(
'Tags' => 'BlogTag',
'Categories' => 'BlogCategory',
);
/**
* @var array
*/
private static $many_many = array(
'Editors' => 'Member',
'Writers' => 'Member',
'Contributors' => 'Member',
);
/**
* @var array
*/
private static $allowed_children = array(
'BlogPost',
);
/**
* @var array
*/
private static $extensions = array(
'BlogFilter',
);
/**
* @var array
*/
private static $defaults = array(
'ProvideComments' => false,
'PostsPerPage' => 10,
);
/**
* @var string
*/
private static $description = 'Adds a blog to your website.';
/**
* {@inheritdoc}
*/
public function getCMSFields() {
Requirements::css(BLOGGER_DIR . '/css/cms.css');
Requirements::javascript(BLOGGER_DIR . '/js/cms.js');
$self =& $this;
$this->beforeUpdateCMSFields(function ($fields) use ($self) {
if(!$self->canEdit()) {
return;
}
$categories = GridField::create(
'Categories',
_t('Blog.Categories', 'Categories'),
$self->Categories(),
GridFieldCategorisationConfig::create(15, $self->Categories()->sort('Title'), 'BlogCategory', 'Categories', 'BlogPosts')
);
$tags = GridField::create(
'Tags',
_t('Blog.Tags', 'Tags'),
$self->Tags(),
GridFieldCategorisationConfig::create(15, $self->Tags()->sort('Title'), 'BlogTag', 'Tags', 'BlogPosts')
);
/**
* @var FieldList $fields
*/
$fields->addFieldsToTab('Root.Categorisation', array(
$categories,
$tags
));
$fields->findOrMakeTab('Root.Categorisation')->addExtraClass('blog-cms-categorisation');
});
return parent::getCMSFields();
}
/**
* {@inheritdoc}
*/
public function canEdit($member = null) {
$member = $this->getMember($member);
if($this->isEditor($member)) {
return true;
}
return parent::canEdit($member);
}
/**
* @param null|int|Member $member
*
* @return null|Member
*/
protected function getMember($member = null) {
if(!$member) {
$member = Member::currentUser();
}
if(is_numeric($member)) {
$member = Member::get()->byID($member);
}
return $member;
}
/**
* Check if this member is an editor of the blog.
*
* @param Member $member
*
* @return bool
*/
public function isEditor($member) {
$isEditor = $this->isMemberOf($member, $this->Editors());
$this->extend('updateIsEditor', $isEditor, $member);
return $isEditor;
}
/**
* Determine if the given member belongs to the given relation.
*
* @param Member $member
* @param DataList $relation
*
* @return bool
*/
protected function isMemberOf($member, $relation) {
if(!$member || !$member->exists()) {
return false;
}
if($relation instanceof UnsavedRelationList) {
return in_array($member->ID, $relation->getIDList());
}
return $relation->byID($member->ID) !== null;
}
/**
* Determine the role of the given member.
*
* Call be called via template to determine the current user.
*
* @example "Hello $RoleOf($CurrentMember.ID)"
*
* @param int|Member $member
*
* @return null|string
*/
public function RoleOf($member) {
if(is_numeric($member)) {
$member = DataObject::get_by_id('Member', $member);
}
if(!$member) {
return null;
}
if($this->isEditor($member)) {
return _t('Blog.EDITOR', 'Editor');
}
if($this->isWriter($member)) {
return _t('Blog.WRITER', 'Writer');
}
if($this->isContributor($member)) {
return _t('Blog.CONTRIBUTOR', 'Contributor');
}
return null;
}
/**
* Check if this member is a writer of the blog.
*
* @param Member $member
*
* @return bool
*/
public function isWriter($member) {
$isWriter = $this->isMemberOf($member, $this->Writers());
$this->extend('updateIsWriter', $isWriter, $member);
return $isWriter;
}
/**
* Check if this member is a contributor of the blog.
*
* @param Member $member
*
* @return bool
*/
public function isContributor($member) {
$isContributor = $this->isMemberOf($member, $this->Contributors());
$this->extend('updateIsContributor', $isContributor, $member);
return $isContributor;
}
/**
* {@inheritdoc}
*/
public function canAddChildren($member = null) {
$member = $this->getMember($member);
if($this->isEditor($member) || $this->isWriter($member) || $this->isContributor($member)) {
return true;
}
return parent::canAddChildren($member);
}
/**
* {@inheritdoc}
*/
public function getSettingsFields() {
$fields = parent::getSettingsFields();
$fields->addFieldToTab('Root.Settings',
NumericField::create('PostsPerPage', _t('Blog.PostsPerPage', 'Posts Per Page'))
);
$members = $this->getCandidateUsers()->map()->toArray();
$editorField = ListboxField::create('Editors', 'Editors', $members)
->setMultiple(true)
->setRightTitle('<a class="toggle-description">help</a>')
->setDescription('
An editor has control over specific Blogs, and all posts included within it. Short of being able to assign other editors to a blog, they are able to handle most changes to their assigned blog.<br />
<br />
Editors have these permissions:<br />
<br />
Update or publish any BlogPost in their Blog<br />
Update or publish their Blog<br />
Assign/unassign writers to their Blog<br />
Assign/unassign contributors to their Blog<br />
Assign/unassign any member as an author of a particular BlogPost
');
if(!$this->canEditEditors()) {
$editorField = $editorField->performDisabledTransformation();
}
$writerField = ListboxField::create('Writers', 'Writers', $members)
->setMultiple(true)
->setRightTitle('<a class="toggle-description">help</a>')
->setDescription('
A writer has full control over creating, editing and publishing BlogPosts they have authored or have been assigned to. Writers are unable to edit BlogPosts to which they are not assigned.<br />
<br />
Writers have these permissions:<br />
<br />
Update or publish any BlogPost they have authored or have been assigned to<br />
Assign/unassign any member as an author of a particular BlogPost they have authored or have been assigned to
');
if(!$this->canEditWriters()) {
$writerField = $writerField->performDisabledTransformation();
}
$contributorField = ListboxField::create('Contributors', 'Contributors', $members)
->setMultiple(true)
->setRightTitle('<a class="toggle-description">help</a>')
->setDescription('
Contributors have the ability to create or edit BlogPosts, but are unable to publish without authorisation of an editor. They are also unable to assign other contributing authors to any of their BlogPosts.<br />
<br />
Contributors have these permissions:<br />
<br />
Update any BlogPost they have authored or have been assigned to
');
if(!$this->canEditContributors()) {
$contributorField = $contributorField->performDisabledTransformation();
}
$fields->addFieldsToTab('Root.Users', array(
$editorField,
$writerField,
$contributorField
));
return $fields;
}
/**
* Gets the list of user candidates to be assigned to assist with this blog.
*
* @return SS_List
*/
protected function getCandidateUsers() {
if($this->config()->grant_user_access) {
return Member::get();
} else {
return Permission::get_members_by_permission(
$this->config()->grant_user_permission
);
}
}
/**
* Determine if this user can edit the editors list.
*
* @param int|Member $member
*
* @return bool
*/
public function canEditEditors($member = null) {
$member = $this->getMember($member);
$extended = $this->extendedCan('canEditEditors', $member);
if($extended !== null) {
return $extended;
}
return Permission::checkMember($member, self::MANAGE_USERS);
}
/**
* Determine if this user can edit writers list.
*
* @param int|Member $member
*
* @return boolean
*/
public function canEditWriters($member = null) {
$member = $this->getMember($member);
$extended = $this->extendedCan('canEditWriters', $member);
if($extended !== null) {
return $extended;
}
if($this->isEditor($member)) {
return true;
}
return Permission::checkMember($member, self::MANAGE_USERS);
}
/**
* Determines if this user can edit the contributors list.
*
* @param int|Member $member
*
* @return boolean
*/
public function canEditContributors($member = null) {
$member = $this->getMember($member);
$extended = $this->extendedCan('canEditContributors', $member);
if($extended !== null) {
return $extended;
}
if($this->isEditor($member)) {
return true;
}
return Permission::checkMember($member, self::MANAGE_USERS);
}
/**
* Returns BlogPosts for a given date period.
*
* @param int $year
* @param null|int $month
* @param null|int $day
*
* @return DataList
*/
public function getArchivedBlogPosts($year, $month = null, $day = null) {
$query = $this->getBlogPosts()->dataQuery();
$stage = $query->getQueryParam('Versioned.stage');
if($stage) {
$stage = '_' . $stage;
}
$query->innerJoin('BlogPost', sprintf('"SiteTree%s"."ID" = "BlogPost%s"."ID"', $stage, $stage));
$query->where(sprintf('YEAR("PublishDate") = \'%s\'', Convert::raw2sql($year)));
if($month) {
$query->where(sprintf('MONTH("PublishDate") = \'%s\'', Convert::raw2sql($month)));
if($day) {
$query->where(sprintf('DAY("PublishDate") = \'%s\'', Convert::raw2sql($day)));
}
}
return $this->getBlogPosts()->setDataQuery($query);
}
/**
* Return blog posts.
*
* @return DataList of BlogPost objects
*/
public function getBlogPosts() {
$blogPosts = BlogPost::get()->filter('ParentID', $this->ID);
$this->extend('updateGetBlogPosts', $blogPosts);
return $blogPosts;
}
/**
* Get a link to a Member profile.
*
* @param string $urlSegment
*
* @return string
*/
public function ProfileLink($urlSegment) {
return Controller::join_links($this->Link(), 'profile', $urlSegment);
}
/**
* This sets the title for our gridfield.
*
* @return string
*/
public function getLumberjackTitle() {
return _t('Blog.LumberjackTitle', 'Blog Posts');
}
/**
* This overwrites lumberjacks default gridfield config.
*
* @return GridFieldConfig
*/
public function getLumberjackGridFieldConfig() {
return GridFieldConfig_BlogPost::create();
}
/**
* {@inheritdoc}
*/
public function providePermissions() {
return array(
Blog::MANAGE_USERS => array(
'name' => _t(
'Blog.PERMISSION_MANAGE_USERS_DESCRIPTION',
'Manage users for individual blogs'
),
'help' => _t(
'Blog.PERMISSION_MANAGE_USERS_HELP',
'Allow assignment of Editors, Writers, or Contributors to blogs'
),
'category' => _t('Blog.PERMISSIONS_CATEGORY', 'Blog permissions'),
'sort' => 100
)
);
}
/**
* {@inheritdoc}
*/
protected function onBeforeWrite() {
parent::onBeforeWrite();
$this->assignGroup();
}
/**
* Assign users as necessary to the blog group.
*/
protected function assignGroup() {
if(!$this->config()->grant_user_access) {
return;
}
$group = $this->getUserGroup();
foreach(array($this->Editors(), $this->Writers(), $this->Contributors()) as $levels) {
foreach($levels as $user) {
if(!$user->inGroup($group)) {
$user->Groups()->add($group);
}
}
}
}
/**
* Gets or creates the group used to assign CMS access.
*
* @return Group
*/
protected function getUserGroup() {
$code = $this->config()->grant_user_group;
$group = Group::get()->filter('Code', $code)->first();
if($group) {
return $group;
}
$group = new Group();
$group->Title = 'Blog users';
$group->Code = $code;
$group->write();
$permission = new Permission();
$permission->Code = $this->config()->grant_user_permission;
$group->Permissions()->add($permission);
return $group;
}
}
/**
* @package silverstripe
* @subpackage blog
*/
class Blog_Controller extends Page_Controller {
/**
* @var array
*/
private static $allowed_actions = array(
'archive',
'tag',
'category',
'rss',
'profile',
);
/**
* @var array
*/
private static $url_handlers = array(
'tag/$Tag!' => 'tag',
'category/$Category!' => 'category',
'archive/$Year!/$Month/$Day' => 'archive',
'profile/$URLSegment!' => 'profile',
);
/**
* @var array
*/
private static $casting = array(
'MetaTitle' => 'Text',
'FilterDescription' => 'Text',
);
/**
* The current Blog Post DataList query.
*
* @var DataList
*/
protected $blogPosts;
/**
* @return string
*/
public function index() {
/**
* @var Blog $dataRecord
*/
$dataRecord = $this->dataRecord;
$this->blogPosts = $dataRecord->getBlogPosts();
return $this->render();
}
/**
* Renders a Blog Member's profile.
*
* @return SS_HTTPResponse
*/
public function profile() {
$profile = $this->getCurrentProfile();
if(!$profile) {
return $this->httpError(404, 'Not Found');
}
$this->blogPosts = $this->getCurrentProfilePosts();
return $this->render();
}
/**
* Get the Member associated with the current URL segment.
*
* @return null|Member
*/
public function getCurrentProfile() {
$urlSegment = $this->request->param('URLSegment');
if($urlSegment) {
return Member::get()
->filter('URLSegment', $urlSegment)
->first();
}
return null;
}
/**
* Get posts related to the current Member profile.
*
* @return null|DataList
*/
public function getCurrentProfilePosts() {
$profile = $this->getCurrentProfile();
if($profile) {
return $profile->BlogPosts()->filter('ParentID', $this->ID);
}
return null;
}
/**
* Renders an archive for a specified date. This can be by year or year/month.
*
* @return null|SS_HTTPResponse
*/
public function archive() {
/**
* @var Blog $dataRecord
*/
$dataRecord = $this->dataRecord;
$year = $this->getArchiveYear();
$month = $this->getArchiveMonth();
$day = $this->getArchiveDay();
if($this->request->param('Month') && !$month) {
$this->httpError(404, 'Not Found');
}
if($month && $this->request->param('Day') && !$day) {
$this->httpError(404, 'Not Found');
}
if($year) {
$this->blogPosts = $dataRecord->getArchivedBlogPosts($year, $month, $day);
return $this->render();
}
$this->httpError(404, 'Not Found');
return null;
}
/**
* Fetches the archive year from the url.
*
* @return null|int
*/
public function getArchiveYear() {
$year = $this->request->param('Year');
if(preg_match('/^[0-9]{4}$/', $year)) {
return (int) $year;
}
return null;
}
/**
* Fetches the archive money from the url.
*
* @return null|int
*/
public function getArchiveMonth() {
$month = $this->request->param('Month');
if(preg_match('/^[0-9]{1,2}$/', $month)) {
if($month > 0 && $month < 13) {
if(checkdate($month, 01, $this->getArchiveYear())) {
return (int) $month;
}
}
}
return null;
}
/**
* Fetches the archive day from the url.
*
* @return null|int
*/
public function getArchiveDay() {
$day = $this->request->param('Day');
if(preg_match('/^[0-9]{1,2}$/', $day)) {
if(checkdate($this->getArchiveMonth(), $day, $this->getArchiveYear())) {
return (int) $day;
}
}
return null;
}
/**
* Renders the blog posts for a given tag.
*
* @return null|SS_HTTPResponse
*/
public function tag() {
$tag = $this->getCurrentTag();
if($tag) {
$this->blogPosts = $tag->BlogPosts();
return $this->render();
}
$this->httpError(404, 'Not Found');
return null;
}
/**
* Tag Getter for use in templates.
*
* @return null|BlogTag
*/
public function getCurrentTag() {
/**
* @var Blog $dataRecord
*/
$dataRecord = $this->dataRecord;
$tag = $this->request->param('Tag');
if($tag) {
return $dataRecord->Tags()
->filter('URLSegment', array($tag, rawurlencode($tag)))
->first();
}
return null;
}
/**
* Renders the blog posts for a given category.
*
* @return null|SS_HTTPResponse
*/
public function category() {
$category = $this->getCurrentCategory();
if($category) {
$this->blogPosts = $category->BlogPosts();
return $this->render();
}
$this->httpError(404, 'Not Found');
return null;
}
/**
* Category Getter for use in templates.
*
* @return null|BlogCategory
*/
public function getCurrentCategory() {
/**
* @var Blog $dataRecord
*/
$dataRecord = $this->dataRecord;
$category = $this->request->param('Category');
if($category) {
return $dataRecord->Categories()
->filter('URLSegment', array($category, rawurlencode($category)))
->first();
}
return null;
}
/**
* Get the meta title for the current action.
*
* @return string
*/
public function getMetaTitle() {
$title = $this->data()->getTitle();
$filter = $this->getFilterDescription();
if($filter) {
$title = sprintf('%s - %s', $title, $filter);
}
$this->extend('updateMetaTitle', $title);
return $title;
}
/**
* Returns a description of the current filter.
*
* @return string
*/
public function getFilterDescription() {
$items = array();
$list = $this->PaginatedList();
$currentPage = $list->CurrentPage();
if($currentPage > 1) {
$items[] = _t(
'Blog.FILTERDESCRIPTION_PAGE',
'Page {page}',
null,
array(
'page' => $currentPage,
)
);
}
if($author = $this->getCurrentProfile()) {
$items[] = _t(
'Blog.FILTERDESCRIPTION_AUTHOR',
'By {author}',
null,
array(
'author' => $author->Title,
)
);
}
if($tag = $this->getCurrentTag()) {
$items[] = _t(
'Blog.FILTERDESCRIPTION_TAG',
'Tagged with {tag}',
null,
array(
'tag' => $tag->Title,
)
);
}
if($category = $this->getCurrentCategory()) {
$items[] = _t(
'Blog.FILTERDESCRIPTION_CATEGORY',
'In category {category}',
null,
array(
'category' => $category->Title,
)
);
}
if($this->owner->getArchiveYear()) {
if($this->owner->getArchiveDay()) {
$date = $this->owner->getArchiveDate()->Nice();
} elseif($this->owner->getArchiveMonth()) {
$date = $this->owner->getArchiveDate()->format('F, Y');
} else {
$date = $this->owner->getArchiveDate()->format('Y');
}
$items[] = _t(
'Blog.FILTERDESCRIPTION_DATE',
'In {date}',
null,
array(
'date' => $date,
)
);
}
$result = '';
if($items) {
$result = implode(', ', $items);
}
$this->extend('updateFilterDescription', $result);
return $result;
}
/**
* Returns a list of paginated blog posts based on the BlogPost dataList.
*
* @return PaginatedList
*/
public function PaginatedList() {
/**
* @var Blog $dataRecord
*/
$dataRecord = $this->dataRecord;
$posts = new PaginatedList($this->blogPosts);
if($this->PostsPerPage > 0) {
$posts->setPageLength($this->PostsPerPage);
} else {
$pageSize = 99999;
if($count = $dataRecord->getBlogPosts()->count()) {
$pageSize = $count;
}
$posts->setPageLength($pageSize);
}
$start = $this->request->getVar($posts->getPaginationGetVar());
$posts->setPageStart($start);
return $posts;
}
/**
* Displays an RSS feed of blog posts.
*
* @return string
*/
public function rss() {
/**
* @var Blog $dataRecord
*/
$dataRecord = $this->dataRecord;
$rss = new RSSFeed($dataRecord->getBlogPosts(), $this->Link(), $this->MetaTitle, $this->MetaDescription);
$this->extend('updateRss', $rss);
return $rss->outputToBrowser();
}
/**
* Returns the current archive date.
*
* @return null|Date
*/
public function getArchiveDate() {
$year = $this->getArchiveYear();
$month = $this->getArchiveMonth();
$day = $this->getArchiveDay();
if($year) {
if($month) {
$date = sprintf('%s-%s-01', $year, $month);
if($day) {
$date = sprintf('%s-%s-%s', $year, $month, $day);
}
} else {
$date = sprintf('%s-01-01', $year);
}
return DBField::create_field('Date', $date);
}
return null;
}
/**
* Returns a link to the RSS feed.
*
* @return string
*/
public function getRSSLink() {
return $this->Link('rss');
}
}

View File

@ -1,135 +0,0 @@
<?php
/**
* A blog category for generalising blog posts.
*
* @package silverstripe
* @subpackage blog
*
* @method Blog Blog()
* @method ManyManyList BlogPosts()
*
* @property string $URLSegment
* @property int $BlogID
*/
class BlogCategory extends DataObject implements CategorisationObject {
/**
* @var array
*/
private static $db = array(
'Title' => 'Varchar(255)',
);
/**
* @var array
*/
private static $has_one = array(
'Blog' => 'Blog',
);
/**
* @var array
*/
private static $belongs_many_many = array(
'BlogPosts' => 'BlogPost',
);
/**
* @var array
*/
private static $extensions = array(
'URLSegmentExtension',
);
/**
* {@inheritdoc}
*/
public function getCMSFields() {
$fields = new FieldList(
TextField::create('Title', _t('BlogCategory.Title', 'Title'))
);
$this->extend('updateCMSFields', $fields);
return $fields;
}
/**
* Returns a relative link to this category.
*
* @return string
*/
public function getLink() {
return Controller::join_links($this->Blog()->Link(), 'category', $this->URLSegment);
}
/**
* Inherits from the parent blog or can be overwritten using a DataExtension.
*
* @param null|Member $member
*
* @return bool
*/
public function canView($member = null) {
$extended = $this->extendedCan(__FUNCTION__, $member);
if($extended !== null) {
return $extended;
}
return $this->Blog()->canView($member);
}
/**
* Inherits from the parent blog or can be overwritten using a DataExtension.
*
* @param null|Member $member
*
* @return bool
*/
public function canCreate($member = null) {
$extended = $this->extendedCan(__FUNCTION__, $member);
if($extended !== null) {
return $extended;
}
$permission = Blog::config()->grant_user_permission;
return Permission::checkMember($member, $permission);
}
/**
* Inherits from the parent blog or can be overwritten using a DataExtension.
*
* @param null|Member $member
*
* @return bool
*/
public function canDelete($member = null) {
$extended = $this->extendedCan(__FUNCTION__, $member);
if($extended !== null) {
return $extended;
}
return $this->Blog()->canEdit($member);
}
/**
* Inherits from the parent blog or can be overwritten using a DataExtension.
*
* @param null|Member $member
*
* @return bool
*/
public function canEdit($member = null) {
$extended = $this->extendedCan(__FUNCTION__, $member);
if($extended !== null) {
return $extended;
}
return $this->Blog()->canEdit($member);
}
}

View File

@ -1,644 +0,0 @@
<?php
/**
* An individual blog post.
*
* @package silverstripe
* @subpackage blog
*
* @method ManyManyList Categories()
* @method ManyManyList Tags()
* @method ManyManyList Authors()
* @method Blog Parent()
*
* @property string $PublishDate
* @property string $AuthorNames
* @property int $ParentID
*/
class BlogPost extends Page {
/**
* @var array
*/
private static $db = array(
'PublishDate' => 'SS_Datetime',
'AuthorNames' => 'Varchar(1024)',
'Summary' => 'HTMLText',
);
/**
* @var array
*/
private static $has_one = array(
'FeaturedImage' => 'Image',
);
/**
* @var array
*/
private static $many_many = array(
'Categories' => 'BlogCategory',
'Tags' => 'BlogTag',
'Authors' => 'Member',
);
/**
* @var array
*/
private static $defaults = array(
'ShowInMenus' => false,
'InheritSideBar' => true,
'ProvideComments' => true,
);
/**
* @var array
*/
private static $extensions = array(
'BlogPostFilter',
);
/**
* @var array
*/
private static $searchable_fields = array(
'Title',
);
/**
* @var array
*/
private static $summary_fields = array(
'Title',
);
/**
* @var array
*/
private static $casting = array(
'Excerpt' => 'Text',
);
/**
* @var array
*/
private static $allowed_children = array();
/**
* @var string
*/
private static $default_sort = 'PublishDate DESC';
/**
* @var bool
*/
private static $can_be_root = false;
/**
* This will display or hide the current class from the SiteTree. This variable can be
* configured using YAML.
*
* @var bool
*/
private static $show_in_sitetree = false;
/**
* Determine the role of the given member.
*
* Call be called via template to determine the current user.
*
* @example "Hello $RoleOf($CurrentMember.ID)"
*
* @param null|int|Member $member
*
* @return null|string
*/
public function RoleOf($member = null) {
$member = $this->getMember($member);
if(!$member) {
return null;
}
if($this->isAuthor($member)) {
return _t('BlogPost.AUTHOR', 'Author');
}
$parent = $this->Parent();
if($parent instanceof Blog) {
return $parent->RoleOf($member);
}
return null;
}
/**
* Determine if the given member is an author of this post.
*
* @param null|Member $member
*
* @return bool
*/
public function isAuthor($member = null) {
if(!$member || !$member->exists()) {
return false;
}
$list = $this->Authors();
if($list instanceof UnsavedRelationList) {
return in_array($member->ID, $list->getIDList());
}
return $list->byID($member->ID) !== null;
}
/**
* {@inheritdoc}
*/
public function getCMSFields() {
Requirements::css(BLOGGER_DIR . '/css/cms.css');
Requirements::javascript(BLOGGER_DIR . '/js/cms.js');
$self =& $this;
$this->beforeUpdateCMSFields(function ($fields) use ($self) {
$uploadField = UploadField::create('FeaturedImage', _t('BlogPost.FeaturedImage', 'Featured Image'));
$uploadField->getValidator()->setAllowedExtensions(array('jpg', 'jpeg', 'png', 'gif'));
/**
* @var FieldList $fields
*/
$fields->insertAfter($uploadField, 'Content');
$summary = HtmlEditorField::create('Summary', false);
$summary->setRows(5);
$summary->setDescription(_t(
'BlogPost.SUMMARY_DESCRIPTION',
'If no summary is specified the first 30 words will be used.'
));
$summaryHolder = ToggleCompositeField::create(
'CustomSummary',
_t('BlogPost.CUSTOMSUMMARY', 'Add A Custom Summary'),
array(
$summary,
)
);
$summaryHolder->setHeadingLevel(4);
$summaryHolder->addExtraClass('custom-summary');
$fields->insertAfter($summaryHolder, 'FeaturedImage');
$fields->push(HiddenField::create('MenuTitle'));
$urlSegment = $fields->dataFieldByName('URLSegment');
$urlSegment->setURLPrefix($self->Parent()->RelativeLink());
$fields->removeFieldsFromTab('Root.Main', array(
'MenuTitle',
'URLSegment',
));
$authorField = ListboxField::create(
'Authors',
_t('BlogPost.Authors', 'Authors'),
Member::get()->map()->toArray()
)->setMultiple(true);
$authorNames = TextField::create(
'AuthorNames',
_t('BlogPost.AdditionalCredits', 'Additional Credits'),
null,
1024
);
$authorNames->setDescription('If some authors of this post don\'t have CMS access, enter their name(s) here. You can separate multiple names with a comma.');
if(!$self->canEditAuthors()) {
$authorField = $authorField->performDisabledTransformation();
$authorNames = $authorNames->performDisabledTransformation();
}
$publishDate = DatetimeField::create('PublishDate', _t('BlogPost.PublishDate', 'Publish Date'));
$publishDate->getDateField()->setConfig('showcalendar', true);
// Get categories and tags
$parent = $self->Parent();
$categories = $parent instanceof Blog
? $parent->Categories()
: BlogCategory::get();
$tags = $parent instanceof Blog
? $parent->Tags()
: BlogTag::get();
$options = BlogAdminSidebar::create(
$publishDate,
$urlSegment,
TagField::create(
'Categories',
_t('BlogPost.Categories', 'Categories'),
$categories,
$self->Categories()
)
->setCanCreate($self->canCreateCategories())
->setShouldLazyLoad(true),
TagField::create(
'Tags',
_t('BlogPost.Tags', 'Tags'),
$tags,
$self->Tags()
)
->setCanCreate($self->canCreateTags())
->setShouldLazyLoad(true),
$authorField,
$authorNames
)->setTitle('Post Options');
$fields->insertBefore($options, 'Root');
});
$fields = parent::getCMSFields();
$fields->fieldByName('Root')->setTemplate('TabSet_holder');
return $fields;
}
/**
* Determine if this user can edit the authors list.
*
* @param null|int|Member $member
*
* @return bool
*/
public function canEditAuthors($member = null) {
$member = $this->getMember($member);
$extended = $this->extendedCan('canEditAuthors', $member);
if($extended !== null) {
return $extended;
}
$parent = $this->Parent();
if($parent instanceof Blog && $parent->exists()) {
if($parent->isEditor($member)) {
return true;
}
if($parent->isWriter($member) && $this->isAuthor($member)) {
return true;
}
}
return Permission::checkMember($member, Blog::MANAGE_USERS);
}
/**
* @param null|int|Member $member
*
* @return null|Member
*/
protected function getMember($member = null) {
if(!$member) {
$member = Member::currentUser();
}
if(is_numeric($member)) {
$member = Member::get()->byID($member);
}
return $member;
}
/**
* Determine whether user can create new categories.
*
* @param null|int|Member $member
*
* @return bool
*/
public function canCreateCategories($member = null) {
$member = $this->getMember($member);
$parent = $this->Parent();
if(!$parent || !$parent->exists() || !($parent instanceof Blog)) {
return false;
}
if($parent->isEditor($member)) {
return true;
}
return Permission::checkMember($member, 'ADMIN');
}
/**
* Determine whether user can create new tags.
*
* @param null|int|Member $member
*
* @return bool
*/
public function canCreateTags($member = null) {
$member = $this->getMember($member);
$parent = $this->Parent();
if(!$parent || !$parent->exists() || !($parent instanceof Blog)) {
return false;
}
if($parent->isEditor($member)) {
return true;
}
if($parent->isWriter($member)) {
return true;
}
return Permission::checkMember($member, 'ADMIN');
}
/**
* {@inheritdoc}
*
* Update the PublishDate to now, if being published for the first time, and the date hasn't
* been set to the future.
*/
public function onBeforePublish() {
/**
* @var SS_Datetime $publishDate
*/
$publishDate = $this->dbObject('PublishDate');
if($publishDate->InPast() && !$this->isPublished()) {
$this->PublishDate = SS_Datetime::now()->getValue();
$this->write();
}
}
/**
* {@inheritdoc}
*
* Sets blog relationship on all categories and tags assigned to this post.
*/
public function onAfterWrite() {
parent::onAfterWrite();
foreach($this->Categories() as $category) {
/**
* @var BlogCategory $category
*/
$category->BlogID = $this->ParentID;
$category->write();
}
foreach($this->Tags() as $tag) {
/**
* @var BlogTag $tag
*/
$tag->BlogID = $this->ParentID;
$tag->write();
}
}
/**
* {@inheritdoc}
*/
public function canView($member = null) {
$member = $this->getMember($member);
if(!parent::canView($member)) {
return false;
}
/**
* @var SS_Datetime $publishDate
*/
$publishDate = $this->dbObject('PublishDate');
// Show past posts
if(!$publishDate->exists() || !$publishDate->InFuture()) {
return true;
}
// Anyone that can edit this page can view it
return $this->canEdit($member);
}
/**
* {@inheritdoc}
*/
public function canPublish($member = null) {
$member = $this->getMember($member);
if(Permission::checkMember($member, 'ADMIN')) {
return true;
}
$extended = $this->extendedCan('canPublish', $member);
if($extended !== null) {
return $extended;
}
$parent = $this->Parent();
if($parent instanceof Blog && $parent->exists()) {
if($parent->isEditor($member)) {
return true;
}
if($parent->isWriter($member) && $this->isAuthor($member)) {
return true;
}
if($parent->isContributor($member)) {
return parent::canEdit($member);
}
}
return $this->canEdit($member);
}
/**
* {@inheritdoc}
*/
public function canEdit($member = null) {
$member = $this->getMember($member);
if(parent::canEdit($member)) {
return true;
}
$parent = $this->Parent();
if(!$parent || !$parent->exists() || !($parent instanceof Blog)) {
return false;
}
if($parent->isEditor($member)) {
return true;
}
if(!$parent->isWriter($member) && !$parent->isContributor($member)) {
return false;
}
return $this->isAuthor($member);
}
/**
* Returns the post excerpt.
*
* @param int $wordsToDisplay
*
* @return string
*/
public function Excerpt($wordsToDisplay = 30) {
/**
* @var Text $content
*/
$content = $this->dbObject('Content');
return $content->Summary($wordsToDisplay);
}
/**
* Returns a monthly archive link for the current blog post.
*
* @param string $type
*
* @return string
*/
public function getMonthlyArchiveLink($type = 'day') {
/**
* @var SS_Datetime $date
*/
$date = $this->dbObject('PublishDate');
if($type != 'year') {
if($type == 'day') {
return Controller::join_links(
$this->Parent()->Link('archive'),
$date->format('Y'),
$date->format('m'),
$date->format('d')
);
}
return Controller::join_links($this->Parent()->Link('archive'), $date->format('Y'), $date->format('m'));
}
return Controller::join_links($this->Parent()->Link('archive'), $date->format('Y'));
}
/**
* Returns a yearly archive link for the current blog post.
*
* @return string
*/
public function getYearlyArchiveLink() {
/**
* @var SS_Datetime $date
*/
$date = $this->dbObject('PublishDate');
return Controller::join_links($this->Parent()->Link('archive'), $date->format('Y'));
}
/**
* Resolves static and dynamic authors linked to this post.
*
* @return ArrayList
*/
public function getCredits() {
$list = new ArrayList();
$list->merge($this->getDynamicCredits());
$list->merge($this->getStaticCredits());
return $list->sort('Name');
}
/**
* Resolves dynamic authors linked to this post.
*
* @return ArrayList
*/
protected function getDynamicCredits() {
$items = new ArrayList();
foreach($this->Authors() as $author) {
$items->push(
$author->customise(array(
'URL' => $this->Parent->ProfileLink($author->URLSegment),
))
);
}
return $items;
}
/**
* Resolves static authors linked to this post.
*
* @return ArrayList
*/
protected function getStaticCredits() {
$items = new ArrayList();
$authors = array_filter(preg_split('/\s*,\s*/', $this->AuthorNames));
foreach($authors as $author) {
$item = new ArrayData(array(
'Name' => $author,
));
$items->push($item);
}
return $items;
}
/**
* Sets the label for BlogPost.Title to 'Post Title' (Rather than 'Page name').
*
* @param bool $includeRelations
*
* @return array
*/
public function fieldLabels($includeRelations = true) {
$labels = parent::fieldLabels($includeRelations);
$labels['Title'] = _t('BlogPost.PageTitleLabel', "Post Title");
return $labels;
}
/**
* {@inheritdoc}
*/
protected function onBeforeWrite() {
parent::onBeforeWrite();
if(!$this->PublishDate) {
$this->PublishDate = SS_Datetime::now()->getValue();
}
if(!$this->exists() && ($member = Member::currentUser())) {
$this->Authors()->add($member);
}
}
}
/**
* @package silverstripe
* @subpackage blog
*/
class BlogPost_Controller extends Page_Controller {
}

View File

@ -1,136 +0,0 @@
<?php
/**
* A blog tag for keyword descriptions of a blog post.
*
* @package silverstripe
* @subpackage blog
*
* @method Blog Blog()
* @method ManyManyList BlogPosts
*
* @property string $Title
* @property string $URLSegment
* @property int $BlogID
*/
class BlogTag extends DataObject implements CategorisationObject {
/**
* @var array
*/
private static $db = array(
'Title' => 'Varchar(255)',
);
/**
* @var array
*/
private static $has_one = array(
'Blog' => 'Blog',
);
/**
* @var array
*/
private static $belongs_many_many = array(
'BlogPosts' => 'BlogPost',
);
/**
* @var array
*/
private static $extensions = array(
'URLSegmentExtension',
);
/**
* {@inheritdoc}
*/
public function getCMSFields() {
$fields = new FieldList(
TextField::create('Title', _t('BlogTag.Title', 'Title'))
);
$this->extend('updateCMSFields', $fields);
return $fields;
}
/**
* Returns a relative URL for the tag link.
*
* @return string
*/
public function getLink() {
return Controller::join_links($this->Blog()->Link(), 'tag', $this->URLSegment);
}
/**
* Inherits from the parent blog or can be overwritten using a DataExtension.
*
* @param null|Member $member
*
* @return bool
*/
public function canView($member = null) {
$extended = $this->extendedCan(__FUNCTION__, $member);
if($extended !== null) {
return $extended;
}
return $this->Blog()->canView($member);
}
/**
* Inherits from the parent blog or can be overwritten using a DataExtension.
*
* @param null|Member $member
*
* @return bool
*/
public function canCreate($member = null) {
$extended = $this->extendedCan(__FUNCTION__, $member);
if($extended !== null) {
return $extended;
}
$permission = Blog::config()->grant_user_permission;
return Permission::checkMember($member, $permission);
}
/**
* Inherits from the parent blog or can be overwritten using a DataExtension.
*
* @param null|Member $member
*
* @return bool
*/
public function canDelete($member = null) {
$extended = $this->extendedCan(__FUNCTION__, $member);
if($extended !== null) {
return $extended;
}
return $this->Blog()->canEdit($member);
}
/**
* Inherits from the parent blog or can be overwritten using a DataExtension.
*
* @param null|Member $member
*
* @return bool
*/
public function canEdit($member = null) {
$extended = $this->extendedCan(__FUNCTION__, $member);
if($extended !== null) {
return $extended;
}
return $this->Blog()->canEdit($member);
}
}

View File

@ -1,8 +0,0 @@
<?php
/**
* @method ManyManyList BlogPosts
*/
interface CategorisationObject {
}

View File

@ -1,135 +0,0 @@
<?php
if(!class_exists('Widget')) {
return;
}
/**
* @method Blog Blog()
*
* @property string $ArchiveType
* @property int $NumberToDisplay
*/
class BlogArchiveWidget extends Widget {
/**
* @var string
*/
private static $title = 'Archive';
/**
* @var string
*/
private static $cmsTitle = 'Archive';
/**
* @var string
*/
private static $description = 'Displays an archive list of posts.';
/**
* @var array
*/
private static $db = array(
'NumberToDisplay' => 'Int',
'ArchiveType' => 'Enum(\'Monthly,Yearly\', \'Monthly\')',
);
/**
* @var array
*/
private static $defaults = array(
'NumberOfMonths' => 12,
);
/**
* @var array
*/
private static $has_one = array(
'Blog' => 'Blog',
);
/**
* {@inheritdoc}
*/
public function getCMSFields() {
$self =& $this;
$this->beforeUpdateCMSFields(function ($fields) use ($self) {
/**
* @var Enum $archiveType
*/
$archiveType = $self->dbObject('ArchiveType');
$type = $archiveType->enumValues();
foreach($type as $k => $v) {
$type[$k] = _t('BlogArchiveWidget.' . ucfirst(strtolower($v)), $v);
}
/**
* @var FieldList $fields
*/
$fields->merge(array(
DropdownField::create('BlogID', _t('BlogArchiveWidget.Blog', 'Blog'), Blog::get()->map()),
DropdownField::create('ArchiveType', _t('BlogArchiveWidget.ArchiveType', 'ArchiveType'), $type),
NumericField::create('NumberToDisplay', _t('BlogArchiveWidget.NumberToDisplay', 'No. to Display'))
));
});
return parent::getCMSFields();
}
/**
* Returns a list of months where blog posts are present.
*
* @return DataList
*/
public function getArchive() {
$query = $this->Blog()->getBlogPosts()->dataQuery();
if($this->ArchiveType == 'Yearly') {
$query->groupBy('DATE_FORMAT("PublishDate", \'%Y\')');
} else {
$query->groupBy('DATE_FORMAT("PublishDate", \'%Y-%M\')');
}
$posts = $this->Blog()->getBlogPosts()->setDataQuery($query);
if($this->NumberToDisplay > 0) {
$posts = $posts->limit($this->NumberToDisplay);
}
$archive = new ArrayList();
if($posts->count() > 0) {
foreach($posts as $post) {
/**
* @var BlogPost $post
*/
$date = new Date();
$date->setValue($post->PublishDate);
if($this->ArchiveType == 'Yearly') {
$year = $date->FormatI18N("%Y");
$month = null;
$title = $year;
} else {
$year = $date->FormatI18N("%Y");
$month = $date->FormatI18N("%m");
$title = $date->FormatI18N("%B %Y");
}
$archive->push(new ArrayData(array(
'Title' => $title,
'Link' => Controller::join_links($this->Blog()->Link('archive'), $year, $month)
)));
}
}
return $archive;
}
}
class BlogArchiveWidget_Controller extends Widget_Controller {
}

View File

@ -1,97 +0,0 @@
<?php
if(!class_exists("Widget")) {
return;
}
/**
* @method Blog Blog()
*/
class BlogCategoriesWidget extends Widget {
/**
* @var string
*/
private static $title = 'Categories';
/**
* @var string
*/
private static $cmsTitle = 'Blog Categories';
/**
* @var string
*/
private static $description = 'Displays a list of blog categories.';
/**
* @var array
*/
private static $db = array(
'Limit' => 'Int',
'Order' => 'Varchar',
'Direction' => 'Varchar',
);
/**
* @var array
*/
private static $has_one = array(
'Blog' => 'Blog',
);
/**
* {@inheritdoc}
*/
public function getCMSFields() {
$this->beforeUpdateCMSFields(function (FieldList $fields) {
$fields[] = DropdownField::create(
'BlogID', _t('BlogCategoriesWidget.Blog', 'Blog'), Blog::get()->map()
);
$fields[] = NumericField::create(
'Limit', _t('BlogCategoriesWidget.Limit.Label', 'Limit'), 0
)
->setDescription(_t('BlogCategoriesWidget.Limit.Description', 'Limit the number of categories shown by this widget (set to 0 to show all categories).'))
->setMaxLength(3);
$fields[] = DropdownField::create(
'Order', _t('BlogCategoriesWidget.Sort.Label', 'Sort'), array('Title' => 'Title', 'Created' => 'Created', 'LastUpdated' => 'Updated')
)
->setDescription(_t('BlogCategoriesWidget.Sort.Description', 'Change the order of categories shown by this widget.'));
$fields[] = DropdownField::create(
'Direction', _t('BlogCategoriesWidget.Direction.Label', 'Direction'), array('ASC' => 'Ascending', 'DESC' => 'Descending')
)
->setDescription(_t('BlogCategoriesWidget.Direction.Description', 'Change the direction of ordering of categories shown by this widget.'));
});
return parent::getCMSFields();
}
/**
* @return DataList
*/
public function getCategories() {
$blog = $this->Blog();
if (!$blog) {
return array();
}
$query = $blog->Categories();
if ($this->Limit) {
$query = $query->limit(Convert::raw2sql($this->Limit));
}
if ($this->Order && $this->Direction) {
$query = $query->sort(Convert::raw2sql($this->Order), Convert::raw2sql($this->Direction));
}
return $query;
}
}
class BlogCategoriesWidget_Controller extends Widget_Controller {
}

View File

@ -1,77 +0,0 @@
<?php
if(!class_exists("Widget")) {
return;
}
/**
* @method Blog Blog()
*
* @property int $NumberOfPosts
*/
class BlogRecentPostsWidget extends Widget {
/**
* @var string
*/
private static $title = 'Recent Posts';
/**
* @var string
*/
private static $cmsTitle = 'Recent Posts';
/**
* @var string
*/
private static $description = 'Displays a list of recent blog posts.';
/**
* @var array
*/
private static $db = array(
'NumberOfPosts' => 'Int',
);
/**
* @var array
*/
private static $has_one = array(
'Blog' => 'Blog',
);
/**
* {@inheritdoc}
*/
public function getCMSFields() {
$this->beforeUpdateCMSFields(function ($fields) {
/**
* @var FieldList $fields
*/
$fields->merge(array(
DropdownField::create('BlogID', _t('BlogRecentPostsWidget.Blog', 'Blog'), Blog::get()->map()),
NumericField::create('NumberOfPosts', _t('BlogRecentPostsWidget.NumberOfPosts', 'Number of Posts'))
));
});
return parent::getCMSFields();
}
/**
* @return array
*/
public function getPosts() {
$blog = $this->Blog();
if($blog) {
return $blog->getBlogPosts()
->sort('"PublishDate" DESC')
->limit($this->NumberOfPosts);
}
return array();
}
}
class BlogRecentPostsWidget_Controller extends Widget_Controller {
}

View File

@ -1,97 +0,0 @@
<?php
if(!class_exists("Widget")) {
return;
}
/**
* @method Blog Blog()
*/
class BlogTagsWidget extends Widget {
/**
* @var string
*/
private static $title = 'Tags';
/**
* @var string
*/
private static $cmsTitle = 'Blog Tags';
/**
* @var string
*/
private static $description = 'Displays a list of blog tags.';
/**
* @var array
*/
private static $db = array(
'Limit' => 'Int',
'Order' => 'Varchar',
'Direction' => 'Varchar',
);
/**
* @var array
*/
private static $has_one = array(
'Blog' => 'Blog',
);
/**
* {@inheritdoc}
*/
public function getCMSFields() {
$this->beforeUpdateCMSFields(function (Fieldlist $fields) {
$fields[] = DropdownField::create(
'BlogID', _t('BlogTagsWidget.Blog', 'Blog'), Blog::get()->map()
);
$fields[] = NumericField::create(
'Limit', _t('BlogTagsWidget.Limit.Label', 'Limit'), 0
)
->setDescription(_t('BlogTagsWidget.Limit.Description', 'Limit the number of tags shown by this widget (set to 0 to show all tags).'))
->setMaxLength(3);
$fields[] = DropdownField::create(
'Order', _t('BlogTagsWidget.Sort.Label', 'Sort'), array('Title' => 'Title', 'Created' => 'Created', 'LastUpdated' => 'Updated')
)
->setDescription(_t('BlogTagsWidget.Sort.Description', 'Change the order of tags shown by this widget.'));
$fields[] = DropdownField::create(
'Direction', _t('BlogTagsWidget.Direction.Label', 'Direction'), array('ASC' => 'Ascending', 'DESC' => 'Descending')
)
->setDescription(_t('BlogTagsWidget.Direction.Description', 'Change the direction of ordering of tags shown by this widget.'));
});
return parent::getCMSFields();
}
/**
* @return DataList
*/
public function getTags() {
$blog = $this->Blog();
if (!$blog) {
return array();
}
$query = $blog->Tags();
if ($this->Limit) {
$query = $query->limit(Convert::raw2sql($this->Limit));
}
if ($this->Order && $this->Direction) {
$query = $query->sort(Convert::raw2sql($this->Order), Convert::raw2sql($this->Direction));
}
return $query;
}
}
class BlogTagsWidget_Controller extends Widget_Controller {
}

View File

@ -1,39 +1,58 @@
{
"name": "silverstripe/blog",
"description": "A fresh take on blogging in Silverstripe set out to tackle the issue of a cluttered Site Tree.",
"keywords": [
"silverstripe",
"blog",
"news"
],
"type": "silverstripe-module",
"require": {
"silverstripe/cms": ">=3.1.0",
"silverstripe/lumberjack": "~1.1",
"silverstripe/tagfield": "^1.0"
},
"require-dev": {
"phpunit/PHPUnit": "~3.7@stable"
},
"extra": {
"branch-alias": {
"dev-master": "2.0.x-dev"
}
},
"license": "BSD-2-Clause",
"authors": [
{
"name": "Michael Strong",
"email": "github@michaelstrong.co.uk"
}
],
"suggest": {
"silverstripe/widgets": "Some widgets come with the blog which are compatible with the widgets module.",
"silverstripe/comments": "This module adds comments to your blog."
},
"replace": {
"micmania1/silverstripe-blog": "*"
},
"minimum-stability": "dev",
"prefer-stable": true
}
"name": "silverstripe/blog",
"description": "A fresh take on blogging in Silverstripe set out to tackle the issue of a cluttered Site Tree.",
"keywords": [
"silverstripe",
"blog",
"news"
],
"type": "silverstripe-vendormodule",
"require": {
"php": "^7.4 || ^8.0",
"silverstripe/cms": "^4.0",
"silverstripe/lumberjack": "^2.0",
"silverstripe/tagfield": "^2.0",
"silverstripe/assets": "^1.0",
"silverstripe/asset-admin": "^1.0"
},
"require-dev": {
"silverstripe/recipe-testing": "^2",
"squizlabs/php_codesniffer": "^3.0",
"silverstripe/widgets": "^2",
"silverstripe/comments": "^3.7",
"silverstripe/content-widget": "^2"
},
"extra": {
"expose": [
"client/dist",
"client/images"
]
},
"autoload": {
"psr-4": {
"SilverStripe\\Blog\\": "src/",
"SilverStripe\\Blog\\Tests\\": "tests/php/",
"SilverStripe\\Blog\\Tests\\Behat\\Context\\": "tests/behat/src/"
}
},
"license": "BSD-2-Clause",
"authors": [
{
"name": "Michael Strong",
"email": "github@michaelstrong.co.uk"
}
],
"suggest": {
"silverstripe/widgets": "Some widgets come with the blog which are compatible with the widgets module.",
"silverstripe/comments": "This module adds comments to your blog."
},
"scripts": {
"lint": "vendor/bin/phpcs src/ tests/",
"lint-clean": "vendor/bin/phpcbf src/ tests/"
},
"replace": {
"micmania1/silverstripe-blog": "*"
},
"minimum-stability": "dev",
"prefer-stable": true
}

View File

@ -1,23 +0,0 @@
# Require any additional compass plugins here.
# Set this to the root of your project when deployed:
http_path = "/"
css_dir = "css"
sass_dir = "scss"
javascripts_dir = "javascript"
# You can select your preferred output style here (can be overridden via the command line):
# output_style = :expanded or :nested or :compact or :compressed
# To enable relative paths to assets via compass helper functions. Uncomment:
relative_assets = true
# To disable debugging comments that display the original location of your selectors. Uncomment:
line_comments = false
# If you prefer the indented syntax, you might want to regenerate this
# project again passing --syntax sass, or you can uncomment this:
# preferred_syntax = :sass
# and then run:
# sass-convert -R --from scss --to sass scss scss && rm -rf sass && mv scss sass

View File

@ -1,14 +0,0 @@
.no-sidebar .content-container.size3of4 {
width: 75%;
}
.blog-entry .post-image img {
width: 98.75%;
}
.blog-sidebar .WidgetHolder ul {
margin-left: 0;
}
.blog-sidebar .WidgetHolder ul li {
list-style-type: none;
}

View File

@ -1,151 +0,0 @@
/**
* CMS Styles
*/
/**
* Include Compass framework
*/
/*
* Sprite maps & Icons
*/
.blog-icon-sprite, .gridfield-icon .blog-icon-timer {
background-image: url('../images/blog-icon-s0a5ab5f851.png');
background-repeat: no-repeat;
}
.gridfield-icon .blog-icon-timer {
background-position: 0 0;
}
#FeaturedImage .middleColumn {
clear: none;
float: left;
}
.blog-admin-sidebar {
width: 280px;
border-right: none;
border-left: 1px solid #C0C0C2;
position: absolute;
right: 0px;
bottom: 0px;
height: 100%;
}
.blog-admin-sidebar .cms-panel-toggle a {
text-align: left;
}
.blog-admin-sidebar ~ .blog-admin-outer {
width: 100%;
padding-right: 280px;
position: absolute;
height: 100%;
overflow-y: hidden;
overflow-x: hidden;
box-sizing: border-box;
}
.blog-admin-sidebar ~ .blog-admin-outer > .ss-tabset {
position: relative;
overflow: auto;
height: 100%;
width: 100%;
}
.blog-admin-sidebar ~ .blog-admin-outer > .ss-tabset #Title label {
float: none;
}
.blog-admin-sidebar ~ .blog-admin-outer > .ss-tabset #Title .middleColumn, .blog-admin-sidebar ~ .blog-admin-outer > .ss-tabset #Title input {
width: 100%;
max-width: 100%;
margin-left: 0;
}
.blog-admin-sidebar .cms-content-view > .field + .field {
margin-top: 10px;
}
.blog-admin-sidebar .cms-content-view > .field.urlsegment .preview {
padding-top: 0;
line-height: 25px;
}
.blog-admin-sidebar .cms-content-view > .field.urlsegment .edit {
float: right;
}
.blog-admin-sidebar .cms-content-view > .field.datetime > .middleColumn > .date {
width: 60%;
}
.blog-admin-sidebar .cms-content-view > .field.datetime > .middleColumn > .time {
width: 36%;
float: right;
}
.blog-admin-sidebar .cms-content-view > .field.datetime > .middleColumn .middleColumn, .blog-admin-sidebar .cms-content-view > .field.datetime > .middleColumn input {
width: 100%;
}
.blog-admin-sidebar.collapsed ~ .blog-admin-outer {
padding-right: 41px;
}
.blog-admin-sidebar.cms-content-tools .cms-panel-content {
width: auto;
}
.toggle-description {
text-indent: -1000000px;
display: inline-block;
background: url("../images/information.png") no-repeat center center;
width: 20px;
height: 20px;
margin-left: 4px;
}
.middleColumn.toggle-description-correct-middle {
margin-left: 0;
float: left;
width: 416px;
}
label.right.toggle-description-correct-right {
display: inline-block;
margin-left: 0;
clear: none;
float: left;
}
.description.toggle-description-correct-description {
width: 416px;
padding: 12px 0;
}
.custom-summary .ui-accordion-content .field {
margin: 0;
}
.custom-summary .ui-accordion-content,
.custom-summary .ui-accordion-content .field {
padding: 0;
}
.custom-summary .ui-icon-triangle-1-e {
background-position: -16px -128px;
}
.cms table.ss-gridfield-table tr td.MergeAction {
width: 225px;
}
.cms table.ss-gridfield-table tr td.MergeAction a {
display: block;
height: 100%;
width: 100%;
}
.cms table.ss-gridfield-table tr td.MergeAction select {
width: 150px;
}
.cms-content-actions,
.cms-preview-controls {
z-index: 999;
}
.blog-cms-categorisation .MergeActionReveal {
margin-left: 10px;
}
.blog-cms-categorisation .MergeActionReveal:after {
content: '';
background: url("../images/move-icon.png");
display: inline-block;
height: 16px;
width: 16px;
margin-left: 4px;
}

BIN
docs/en/_images/blog-post-management.png Executable file → Normal file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

View File

@ -0,0 +1,16 @@
## Configuring blog posts in SiteTree
Because your blog is part of the SiteTree, usage is the same as any other page.
By default, blog posts don't appear in the SiteTree, to avoid clutter. Instead they appear inside your blog as a GridField.
![](_images/blog-post-management.png)
If you'd rather display your posts within the SiteTree, you can do so using SilverStripe config.
In mysite/_config/settings.yml
```yaml
SilverStripe\Blog\Model\BlogPost:
show_in_sitetree: true
```

View File

@ -0,0 +1,13 @@
## Configuring featured images
By default, featured images for the blog are uploaded to the default SilverStripe location.
If you prefer, you can specify a directory into which featured images will be uploaded by adding the following to your project's config:
```yaml
SilverStripe\Blog\Model\BlogPost:
featured_images_directory: 'blog-images'
```
replacing 'blog-images' with the name of the directory you wish to use.

View File

@ -0,0 +1,76 @@
# Configuring Blog for large user bases
By default the blog module user and author selection form fields include all users in your website as
candidates for writers, editors and contributors. Additionally, when adding a blog post, again all users are selectable.
This can cause issues with websites that store a large number of users in the database.
In this case you may need to restrict the number of user accounts that are eligible for selection.
This module has some useful configuration options for this that can be added to your projects config.yml
## Restricting blog managers to a permission setting
Default is to list all users and when one is selected, they are added to a `blog-users` group with `CMS_ACCESS_CMSMain` permissions.
To only include those already having these permissions you can set in your `config.yml`:
```yaml
SilverStripe\Blog\Model\Blog:
grant_user_access: false
```
Note: depending on the inclusion order of your config.yml you may need to clear the config setting
before updating it. In this case use the following in your `mysite/_config.php`:
```php
SilverStripe\Core\Config\Config::modify()->remove(SilverStripe\Blog\Model\Blog::class, 'grant_user_access');
```
If you create your own permissions and want to ensure the pool of possible selectable users includes
those with this permission you can set the checked permission in `config.yml` with:
```yaml
SilverStripe\Blog\Model\Blog:
grant_user_permission: SOME_PERMISSION_HERE
```
## Restricting blog post authors selection to a known group
In a blog post when selecting an author it will default to you (the logged in person creating the post),
however you may be posting on behalf of another person. In this case the selection form field will offer
all users as potential blog authors. Again for large websites with many thousands of users this can cause
the site to be slow or non-responsive. We can turn on a filter so that authors need to be in a defined
user group to be able to be selected as an author.
Enable this in your `config.yml` by adding a group code:
```yaml
SilverStripe\Blog\Model\BlogPost:
restrict_authors_to_group: 'group_code'
```
## Extension points in Blog and BlogPost users and how to use
Both Blog and BlogPost have methods which return the list of candidate users or authors. If the previously
mentioned methods of reducing this list are not suitable or you wish to roll your own, you can utilise a
DataExtension to get the control you require.
For example in BlogPost:
```php
protected function getCandidateAuthors()
{
if ($restrictedGroup = $this->config()->get('restrict_authors_to_group')) {
if ($group = Group::get()->filter('Code', $restrictedGroup)->first()) {
return $group->Members();
}
} else {
$list = Member::get();
$this->extend('updateCandidateAuthors', $list);
return $list;
}
}
```
Note the line `$this->extend('updateCandidateAuthors', $list);` which allows you to call a
`updateCandidateAuthors` method in a DataExtension to the Blog Post class if you have not set a
`restrict_authors_to_group` config, further filters the passed
in Member list before it gets sent back to the form field.
See the documentation on [DataExtension](https://docs.silverstripe.org/en/developer_guides/extending/extensions/) for further implementation notes.

View File

@ -0,0 +1,17 @@
# Configuring notifications
## Configuring whether notifications will send to authors of blogs if comments are spam
Default behaviour using the `silverstripe/comment-notifications` module is to send notifications of comments to
authors regardless of whether they are spam or not.
In some cases you may wish to not send a notification email to an author if the comment is spam,
this is a configurable option.
Add the following into your yaml config:
```
SilverStripe\Blog\Model\BlogPostNotifications:
notification_on_spam: false
```

View File

@ -0,0 +1,5 @@
# Configuring pagination
To customise the look and feel of the pagination component, simply override the template located
at `/blog/templates/SilverStripe/Blog/Includes/Pagination.ss`
If you have comments enabled, comment pagination is configurable via the [SilverStripe Comments Module configuration](https://github.com/silverstripe/silverstripe-comments/blob/master/docs/en/Configuration.md).

View File

@ -0,0 +1,12 @@
## Configuring user profiles
This module ships with User Profiles enabled by default.
If you'd prefer to disable this functionality and instead return a 404 for the `/profile/` page, you can do so using SilverStripe config.
In mysite/_config/settings.yml
```yaml
SilverStripe\Blog\Model\BlogController:
disable_profiles: true
```

View File

@ -0,0 +1,18 @@
# Configuring Widgets
The blog module comes bundled with some useful widgets. To take advantage of them, you'll need to install the
[SilverStripe widgets module](https://github.com/silverstripe/silverstripe-widgets). Widgets are totally optional -
so your blog will work just fine without having widgets installed.
You can enable the widgets by adding the following YML config:
```yaml
SilverStripe\Blog\Model\Blog:
extensions:
- SilverStripe\Widgets\Extensions\WidgetPageExtension
SilverStripe\Blog\Model\BlogPost:
extensions:
- SilverStripe\Widgets\Extensions\WidgetPageExtension
```
Once you have widgets installed you'll see the "Widgets" tab in the content section of your blog.

12
docs/en/index.md Normal file
View File

@ -0,0 +1,12 @@
# Blog documentation
## Development
* [Configuring blog posts in Sitetree](configuring-blog-posts.md)
* [Configuring blog when on large websites](configuring-large-websites.md)
* [Configuring widgets](configuring-widgets.md)
* [Configuring pagination](configuring-pagination.md)
* [Configuring featured image uploads](configuring-featured-images.md)
## CMS user help
* [User guide](userguide/index.md)

View File

@ -1,9 +0,0 @@
# Pagination
By default your Blog will display ten posts per page. The number of posts per page is configurable via the "Settings" tab. Setting posts per page to zero will disable pagination, displaying all of your posts on a single page.
![](_images/blog-settings-pagination.png)
To customise the look and feel of the pagination component, simply override the template located at `/blog/templates/Includes/Pagination.ss`
If you have comments enabled, comment pagination is configurable via the [SilverStripe Comments Module configuration](https://github.com/silverstripe/silverstripe-comments/blob/master/docs/en/Configuration.md).

View File

@ -1,7 +0,0 @@
# Tags and categories
Quickly add new tags and categories to your posts.
![](_images/blogpost-add-tags-categories.png)
We use the [SilverStripe TagField module](https://github.com/silverstripe-labs/silverstripe-tagfield) to allow easy management of tags and categories, on the fly.

Binary file not shown.

After

Width:  |  Height:  |  Size: 326 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 125 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 161 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB

View File

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB

View File

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

View File

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB

View File

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

View File

Before

Width:  |  Height:  |  Size: 82 KiB

After

Width:  |  Height:  |  Size: 82 KiB

View File

@ -0,0 +1,32 @@
---
title: Adding a blog post
summary: How to add a new blog post.
---
# Adding a blog post
## Creating a new blog
On the top of the Contents pane, you will find a button marked "Add new." Click it, and a drop-down menu will show up. Select "Blog" from the STEP 2, then hit the "Create" button.
You will notice that a new blog page has been created, with the name of "New Blog". Rename this to "Blog" (or whatever you wish to call this page) and then you can later reorder where this is in your website tree.
Click on the new blog page to start creating posts.
![Adding a blog](_images/blogging-add-blog.png)
## Creating a blog post
To create a blog post, click on your Blog page in the Page Tree in the site-tree Pane. You will see a list of past blog posts and a green button reading "Add new Blog Post", click this to add a new post.
![Adding a blog post](_images/blogging-add-blog-post.png)
Fill out your blog post content as you would any page in the CMS.
You can also include a banner images and a custom summary description (if this is omitted the first 30 words of your post content will be used when displaying your posts's abstract).
![Banner image and summary](_images/blogging-banner-summary.png)
From the tab labelled "Post Options" you can set a publish date, categories, tags and authors.
![Setting blog options](_images/blogging-options.png)

View File

@ -1,3 +1,7 @@
---
title: Custom publish dates
---
# Custom publish dates
Sometimes to want to write a post now, and have it published automatically, some time in the future.

View File

@ -0,0 +1,20 @@
---
title: Blogging
summary: Working with blogging and comments in SilverStripe CMS.
---
# Blogging in SilverStripe CMS
## Before we begin
Make sure that your SilverStripe CMS installation has the [Blog](https://addons.silverstripe.org/add-ons/silverstripe/blog/) module and optional, [Widgets](https://addons.silverstripe.org/add-ons/silverstripe/widgets/) and [Comments](https://addons.silverstripe.org/add-ons/silverstripe/comments/) modules installed.
## Blogging features
* [Adding blog posts](adding-blog-posts.md)
* [Custom publishing dates](custom-publish-dates.md)
* [Pagination](pagination.md)
* [Roles](roles.md)
* [RSS Feed](rss-feed.md)
* [Tags and categories](tags-and-categories.md)
* [Using widgets](using-widgets.md)
* [Managing comments](managing-comments.md)

View File

@ -0,0 +1,14 @@
---
title: Managing comments
---
# Managing comments
**This guide assumes you have the optional [Comments](https://addons.silverstripe.org/add-ons/silverstripe/comments/) module installed**
If comments have been enabled on your website you will be able to moderate comments. You can access all comments through the left navigation
item title "Comments" or on a per blog post basis in the "Comments" tab when editing a blog post.
As new comments are made they show in the "New" tab. From here you can opt to approve comments or mark a comment as spam.
![Comments interface](_images/comments.png)

View File

@ -0,0 +1,9 @@
---
title: Pagination
---
# Pagination
By default your Blog will display ten posts per page. The number of posts per page is configurable via the "Settings" tab. Setting posts per page to zero will disable pagination, displaying all of your posts on a single page.
![](_images/blog-settings-pagination.png)

View File

@ -1,3 +1,7 @@
---
title: Roles
---
# Roles
Blog authoring and management can be delegated to users at up to three different levels. Users assigned to a blog

View File

@ -1,3 +1,7 @@
---
title: RSS feed
---
# RSS feed
Each blog you create comes with it's own RSS feed. Access your blog's RSS feed by adding '/rss' to the end of the URL. For example http://yoursite.com/yourblog/rss/

View File

@ -0,0 +1,9 @@
---
title: Tags and categories
---
# Tags and categories
Quickly add new tags and categories to your posts.
![](_images/blogpost-add-tags-categories.png)

View File

@ -1,20 +1,10 @@
# Widgets
---
title: Using widgets
---
The blog module comes bundled with some useful widgets. To take advantage of them, you'll need to install the [SilverStripe widgets module](https://github.com/silverstripe/silverstripe-widgets). Widgets are totally optional - so your blog will work just fine without having widgets installed.
# Using Widgets
You can enable the widgets by adding the following YML config:
```yml
Blog:
extensions:
- WidgetPageExtension
BlogPost:
extensions:
- WidgetPageExtension
```
Once you have widgets installed you'll see the "Widgets" tab in the content section of your blog.
**This guide assumes you have the optional [Widgets](https://addons.silverstripe.org/add-ons/silverstripe/widgets/) module installed**
![](_images/widgets.png)
@ -22,26 +12,37 @@ To add a widget - simply click the *plus* icon and the widget will be appear in
After you've finished adding widgets, publish your blog, and your freshly minted widgets will appear in your blog's sidebar.
## Archive
## Available blog widgets
### Archive
The archive widget helps you keep historical content relevant, by generating a list of posts, ordered by month or year.
![](_images/widgets-archive.png)
## Blog Categories
### Blog Categories
The blog categories widget lets your readers easily find the content they're interested in.
![](_images/widgets-categories.png)
## Recent Posts
### Recent Posts
The recent posts widget is great for providing quick links to your latest content.
![](_images/widgets-recent-posts.png)
## Blog Tags
### Blog Tags
Similar to the blog categories widget, blog tags help your readers find relevant content, at more fine grained level.
![](_images/widgets-tags.png)
## Optional extra widgets
Additional widgets can be installed alongside your blog.
* [Content Widget - Display HTML content in a widget](https://github.com/silverstripe-labs/silverstripe-content-widget)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 680 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 844 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 778 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

118
js/cms.js
View File

@ -1,118 +0,0 @@
(function ($) {
$.entwine('ss', function ($) {
/**
* Register expandable help text functions with fields.
*/
$('.toggle-description').entwine({
'onadd': function () {
var $this = $(this);
/**
* Prevent multiple events being added.
*/
if ($this.hasClass('toggle-description-enabled')) {
return;
}
$this.addClass('toggle-description-enabled');
/**
* Toggle next description when button is clicked.
*/
var shown = false;
$this.on('click', function() {
$this.parent().next('.description')[shown ? 'hide' : 'show']();
$this.toggleClass('toggle-description-shown');
shown = !shown;
});
/**
* Hide next description by default.
*/
$this.parent().next('.description').hide();
/**
* Add classes to correct inherited layout issues in a small context.
*/
$this.parent().addClass('toggle-description-correct-right');
$this.parent().prev('.middleColumn').addClass('toggle-description-correct-middle');
$this.parent().next('.description').addClass('toggle-description-correct-description');
}
});
/**
* Custom merge actions for tags and categories
*/
$('.MergeAction').entwine({
'onadd': function() {
var $this = $(this);
$this.on('click', 'select', function() {
return false;
});
$this.children('button').each(function(i, button) {
var $button = $(button);
var $select = $button.prev('select');
$button.before('<input type="hidden" name="' + $button.attr('data-target') + '" value="' + $select.val() + '" />');
});
$this.on('change', 'select', function(e) {
var $target = $(e.target);
$target.next('input').val($target.val());
});
$this.children('button, select').hide();
$this.on('click', '.MergeActionReveal', function(e) {
var $target = $(e.target);
$target.parent().children('button, select').show();
$target.hide();
return false;
});
}
});
/**
* Customise the cms-panel behaviour for blog sidebar
*
* see LeftAndMain.Panel.js for base behaviour
*/
$('.blog-admin-sidebar.cms-panel').entwine({
minInnerWidth: 620,
onadd: function() {
this._super();
this.updateLayout();
// If this panel is open and the left hand column is smaller than the minimum, contract it instead
if(!this.hasClass('collapsed') && ($(".blog-admin-outer").width() < this.getminInnerWidth())) {
this.collapsePanel();
}
},
togglePanel: function(bool, silent) {
this._super(bool, silent);
this.updateLayout();
},
/**
* Adjust minimum width of content to account for extra panel
*
* @returns {undefined}
*/
updateLayout: function() {
$('.cms-container').updateLayoutOptions({
minContentWidth: 820 + this.width()
});
}
});
});
})(jQuery);

29
lang/ar.yml Normal file
View File

@ -0,0 +1,29 @@
ar:
SilverStripe\Blog\Admin\GridFieldCategorisationConfig:
Posts: المواضيع
Title: عنوان
SilverStripe\Blog\Forms\GridField\GridFieldAddByDBField:
Add: 'إضافة {اسم}'
SilverStripe\Blog\Forms\GridField\GridFieldBlogPostState:
Modified: 'تم التعديل'
SilverStripe\Blog\Model:
Title: عنوان
SilverStripe\Blog\Model\Blog:
Archive: أرشفة
By: بواسطة
Comments: التعليقات
PLURALNAME: 'الصفحات الأساسية'
Tags: البطاقات
has_many_Tags: البطاقات
SilverStripe\Blog\Model\BlogCategory:
db_Title: عنوان
SilverStripe\Blog\Model\BlogObject:
Title: عنوان
SilverStripe\Blog\Model\BlogPost:
AUTHOR: الكاتب
FeaturedImage: 'صورة مميزة'
PLURALNAME: 'الصفحات الأساسية'
Tags: البطاقات
many_many_Tags: البطاقات
SilverStripe\Blog\Model\BlogTag:
db_Title: عنوان

29
lang/da.yml Normal file
View File

@ -0,0 +1,29 @@
da:
SilverStripe\Blog\Admin\GridFieldCategorisationConfig:
Title: Titel
SilverStripe\Blog\Forms\GridField\GridFieldAddByDBField:
Add: 'Tilføj {name}'
SilverStripe\Blog\Forms\GridField\GridFieldBlogPostState:
Modified: Ændret
SilverStripe\Blog\Model:
Title: Titel
SilverStripe\Blog\Model\Blog:
AND: og
Archive: Arkiv
Comments: Kommentarer
Tags: Tags
has_many_Tags: Tags
SilverStripe\Blog\Model\BlogCategory:
db_Title: Titel
db_URLSegment: 'URL adresse'
SilverStripe\Blog\Model\BlogMemberExtension:
db_URLSegment: 'URL adresse'
SilverStripe\Blog\Model\BlogObject:
Title: Titel
SilverStripe\Blog\Model\BlogPost:
AUTHOR: Forfatter
Tags: Tags
many_many_Tags: Tags
SilverStripe\Blog\Model\BlogTag:
db_Title: Titel
db_URLSegment: 'URL adresse'

View File

@ -1,54 +1,156 @@
de:
Blog:
SilverStripe\Blog\Admin\GridFieldCategorisationConfig:
Posts: Beiträge
Title: Titel
SilverStripe\Blog\Admin\GridFieldMergeAction:
MovePostsTo: 'Verschiebe Beiträge zu'
SilverStripe\Blog\Forms\GridField\GridFieldAddByDBField:
Add: '{name} hinzufügen'
AddFail: 'Kann Klasse {class} nicht in der Datenbank speichern.'
PermissionFail: 'Sie haben keine Berechtigungen, um {class} zu erstellen.'
SilverStripe\Blog\Forms\GridField\GridFieldBlogPostState:
Draft: 'Als Entwurf am {date} gespeichert'
Modified: Bearbeitet
Published: 'Veröffentlicht am {date}'
Timer: 'Am {date} veröffentlichen'
SilverStripe\Blog\Model:
Title: Titel
SilverStripe\Blog\Model\Blog:
AND: und
Archive: Archiv
By: von
CONTRIBUTOR: Mitwirkende
Categories: Kategorien
Categorisation: Kategorisierung
Category: Kategorie
Comments: Kommentare
DESCRIPTION: 'Fügt einen Blog zu Ihrer Webseite hinzu'
LumberjackTitle: 'Blog-Einträge'
EDITOR: Verfasser
FILTERDESCRIPTION_AUTHOR: 'Von {author}'
FILTERDESCRIPTION_CATEGORY: 'In Kategorie {category}'
FILTERDESCRIPTION_DATE: 'Am {date}'
FILTERDESCRIPTION_PAGE: 'Seite {page}'
FILTERDESCRIPTION_TAG: 'Verschlagwortet mit {tag}'
LessThanAMinuteToRead: 'Weniger als eine Minute zum Lesen'
LumberjackTitle: Blog-Einträge
MinutesToRead: 'Minute(n) zum Lesen'
NoPosts: 'Keine Blog-Einträge vorhanden'
PLURALNAME: Blogs
PERMISSIONS_CATEGORY: 'Blog Berechtigungen'
PERMISSION_MANAGE_USERS_DESCRIPTION: 'Benutzer für einzelne Blog-Einträge verwalten'
PERMISSION_MANAGE_USERS_HELP: 'Erlaubt, Editoren, Autoren und Mitwirkende zum Blog hinzuzufügen'
PLURALNAME: 'Basis Seiten'
PLURALS:
one: 'Ein Blog'
other: '{count} Blogs'
Posted: Veröffentlicht
PostedIn: 'Veröffentlicht in'
PostsPerPage: 'Einträge pro Seite'
ReadMoreAbout: 'Lesen Sie mehr über ''{title}'''
SINGULARNAME: Blog
Tag: Schlagwort
Tagged: Verschlagwortet
Tags: Schlagworte
By: von
EDITOR: Verfasser
FILTERDESCRIPTION_AUTHOR: 'Von {author}'
FILTERDESCRIPTION_CATEGORY: 'In Kategorie {category}'
FILTERDESCRIPTION_DATE: 'Am {date}'
FILTERDESCRIPTION_PAGE: 'Seite {page}'
PERMISSIONS_CATEGORY: 'Blog Berechtigungen'
PERMISSION_MANAGE_USERS_DESCRIPTION: 'Benutzer für einzelne Blog-Einträge verwalten'
BlogArchiveWidget:
Blog: Blog
ArchiveType: Typ
BlogCategoriesWidget:
Blog: Blog
BlogCategory:
PLURALNAME: 'Kategorien'
SINGULARNAME: 'Kategorie'
WRITER: Autor
has_many_Categories: Kategorien
has_many_Tags: Schlagwörter
SilverStripe\Blog\Model\BlogCategory:
Duplicate: 'Eine Blog Kategorie mit diesem Namen existiert bereits.'
PLURALNAME: 'Blog Kategorien'
PLURALS:
one: 'Eine Blog Kategorie'
other: '{count} Blog Kategorien'
SINGULARNAME: 'Blog Kategorie'
db_Title: Titel
db_URLSegment: URL-Segment
has_one_Blog: Blog
SilverStripe\Blog\Model\BlogMemberExtension:
BLOGPOSTS: Blogbeiträge
TABBLOGPOSTS: Blogbeiträge
db_URLSegment: URL-Segment
SilverStripe\Blog\Model\BlogObject:
Title: Titel
BlogPost:
Categories: Kategorien
DESCRIPTION: 'Allgemeine Inhaltsseite'
PLURALNAME: 'Blog-Einträge'
PageTitleLabel: 'Titel'
PublishDate: 'Datum der Veröffentlichung'
SINGULARNAME: 'Blog-Eintrag'
Tags: Schlagworte
SilverStripe\Blog\Model\BlogPost:
AUTHOR: Autor
AdditionalCredits: 'Zusätzliche Credits'
AdditionalCredits_Description: 'Wenn Autoren dieses Eintrags keinen Zugang zum CMS haben, können Sie die Namen hier mit Kommas getrennt eintragen.'
Authors: Autoren
BlogRecentPostsWidget:
CUSTOMSUMMARY: Zusammenfassung
Categories: Kategorien
FeaturedImage: Titelbild
PLURALNAME: 'Basis Seiten'
PLURALS:
one: 'Ein Blogbeitrag'
other: '{count} Blogbeiträge'
PageTitleLabel: Titel
PostOptions: Einstellungen
PublishDate: 'Datum der Veröffentlichung'
PublishDate_Description: 'Jetzt, wenn nichts eingegeben wird.'
SINGULARNAME: Blog-Eintrag
SUMMARY_DESCRIPTION: 'Wenn keine Zusammenfassung angegeben wird, werden die ersten 30 Wörter verwendet.'
Tags: Schlagworte
many_many_Authors: Autoren
many_many_Categories: Kategorien
many_many_Tags: Schlagwörter
SilverStripe\Blog\Model\BlogTag:
Duplicate: 'Ein Blog Tag mit diesem Namen existiert bereits.'
PLURALNAME: 'Blog Schlagworte'
PLURALS:
one: 'Ein Blog Schlagwort'
other: '{count} Blog Schlagworte'
SINGULARNAME: 'Blog Schlagwort'
db_Title: Titel
db_URLSegment: URL-Segment
has_one_Blog: Blog
SilverStripe\Blog\Widgets\BlogArchiveWidget:
ArchiveType: Archivtyp
Blog: Blog
NumberToDisplay: 'Anzahl anzeigen'
PLURALNAME: 'Blog Archiv Widgets'
PLURALS:
one: 'Ein Blog Archiv Widget'
other: '{count} Blog Archiv Widgets'
SINGULARNAME: 'Blog Archiv Widget'
SilverStripe\Blog\Widgets\BlogCategoriesWidget:
Blog: Blog
Direction: Richtung
Direction_Description: 'Ändern Sie die Sortierreihenfolge der Kategorien, die von diesem Widget angezeigt werden.'
Limit: Begrenzen
Limit_Description: 'Begrenzen Sie die Anzahl der angezeigten Kategorien (0 zeigt alle Kategorien)'
PLURALNAME: 'Blog Kategorien Widgets'
PLURALS:
one: 'Ein Blog Kategorien Widget'
other: '{count} Blog Kategorien Widgets'
SINGULARNAME: 'Blog Kategorien Widget'
Sort: Sortierung
Sort_Description: 'Ändern Sie die Sortierung der Kategorien, die von diesem Widget angezeigt werden.'
SilverStripe\Blog\Widgets\BlogFeaturedPostsWidget:
Blog: Blog
NumberOfPosts: 'Anzahl der Einträge'
BlogTag:
PLURALNAME: 'Schlagworte'
SINGULARNAME: 'Schlagwort'
Title: Titel
BlogTagsWidget:
SilverStripe\Blog\Widgets\BlogRecentPostsWidget:
Blog: Blog
GridFieldAddByDBField:
Add: '{name} hinzufügen'
NumberOfPosts: 'Anzahl der Einträge'
PLURALNAME: 'Aktuelle Blog Einträge Widgets'
PLURALS:
one: 'Ein Aktuelle Blog Einträge Widget'
other: '{count} Aktuelle Blog Einträge Widgets'
SINGULARNAME: 'Aktuelle Blog Einträge Widget'
SilverStripe\Blog\Widgets\BlogTagsCloudWidget:
Blog: Blog
PLURALNAME: Blog-Tag-Cloud-Widgets
PLURALS:
one: 'Ein Blog-Tag-Cloud-Widget'
other: '{count} Blog-Tag-Cloud-Widgets'
SINGULARNAME: Blog-Tag-Cloud-Widget
SilverStripe\Blog\Widgets\BlogTagsWidget:
Blog: Blog
Direction: Richtung
Direction_Description: 'Ändern Sie die Sortierreihenfolge der Schlagworte, die von diesem Widget angezeigt werden.'
Limit: Begrenzen
Limit_Description: 'Begrenzen Sie die Anzahl der angezeigten Schlagworte (0 zeigt alle Schlagworte)'
PLURALNAME: 'Blog Tags Widgets'
PLURALS:
one: 'Ein Blog Tags Widget'
other: '{count} Blog Tags Widgets'
SINGULARNAME: 'Blog Tags Widget'
Sort: Sortierung
Sort_Description: 'Ändern Sie die Sortierung der Schlagworte, die von diesem Widget angezeigt werden.'

209
lang/en.yml Executable file → Normal file
View File

@ -1,12 +1,28 @@
en:
ArchiveWidget:
PLURALNAME: 'Archive Widgets'
SINGULARNAME: 'Archive Widget'
Blog:
SilverStripe\Blog\Admin\GridFieldCategorisationConfig:
Posts: Posts
Title: Title
SilverStripe\Blog\Admin\GridFieldMergeAction:
MovePostsTo: 'Move posts to'
SilverStripe\Blog\Forms\GridField\GridFieldAddByDBField:
Add: 'Add {name}'
AddFail: 'Unable to save {class} to the database.'
ButtonName: '{name}'
PermissionFail: 'You don''t have permission to create a {class}.'
SilverStripe\Blog\Forms\GridField\GridFieldBlogPostState:
Draft: 'Saved as Draft on {date}'
Modified: Modified
Published: 'Published on {date}'
Timer: 'Publish at {date}'
SilverStripe\Blog\Model:
Title: Title
SilverStripe\Blog\Model\Blog:
AND: and
Archive: Archive
By: by
CONTRIBUTOR: Contributor
Categories: Categories
Categorisation: Categorisation
Category: Category
Comments: Comments
DESCRIPTION: 'Adds a blog to your website.'
@ -16,100 +32,151 @@ en:
FILTERDESCRIPTION_DATE: 'In {date}'
FILTERDESCRIPTION_PAGE: 'Page {page}'
FILTERDESCRIPTION_TAG: 'Tagged with {tag}'
LessThanAMinuteToRead: 'Less than a minute to read'
LumberjackTitle: 'Blog Posts'
MinutesToRead: 'Minute(s) to read'
NoPosts: 'There are no posts'
PERMISSIONS_CATEGORY: 'Blog permissions'
PERMISSION_MANAGE_USERS_DESCRIPTION: 'Manage users for individual blogs'
PERMISSION_MANAGE_USERS_HELP: 'Allow assignment of Editors, Writers, or Contributors to blogs'
PLURALNAME: 'Base Pages'
PLURALS:
one: 'A Blog'
other: '{count} Base Pages'
Posted: Posted
PostedIn: 'Posted in'
PostsByUser: 'Posts by {firstname} {surname} for {title}'
PostsPerPage: 'Posts Per Page'
ReadMoreAbout: 'Read more about ''{title}''...'
SINGULARNAME: Blog
Tag: Tag
Tagged: Tagged
Tags: Tags
UsersContributorsFieldDescription: "Contributors have the ability to create or edit BlogPosts, but are unable to publish without\n authorisation of an editor. They are also unable to assign other contributing authors to any of\n their BlogPosts.<br />\n <br />\n Contributors have these permissions:<br />\n <br />\n Update any BlogPost they have authored or have been assigned to"
UsersEditorsFieldDescription: "An editor has control over specific Blogs, and all posts included within it.\n Short of being able to assign other editors to a blog, they are able to handle most changes to\n their assigned blog. <br /><br />\n Editors have these permissions:<br />\n <br />\n Update or publish any BlogPost in their Blog<br />\n Update or publish their Blog<br />\n Assign/unassign writers to their Blog<br />\n Assign/unassign contributors to their Blog<br />\n Assign/unassign any member as an author of a particular BlogPost"
UsersWritersFieldDescription: "A writer has full control over creating, editing and publishing BlogPosts they have authored\n or have been assigned to. Writers are unable to edit BlogPosts to which they are not assigned.\n <br /><br />\n Writers have these permissions:<br />\n <br />\n Update or publish any BlogPost they have authored or have been assigned to<br />\n Assign/unassign any member as an author of a particular BlogPost they have authored or have been\n assigned to"
WRITER: Writer
BlogArchiveWidget:
db_PostsPerPage: 'Posts per page'
has_many_Categories: Categories
has_many_Tags: Tags
many_many_Contributors: Contributors
many_many_Editors: Editors
many_many_Writers: Writers
SilverStripe\Blog\Model\BlogCategory:
Duplicate: 'A blog category already exists with that name.'
PLURALNAME: 'Blog Categories'
PLURALS:
one: 'A Blog Category'
other: '{count} Blog Categories'
SINGULARNAME: 'Blog Category'
belongs_many_many_BlogPosts: 'Blog posts'
db_Title: Title
db_URLSegment: 'URL segment'
has_one_Blog: Blog
SilverStripe\Blog\Model\BlogMemberExtension:
BLOGPOSTS: 'Blog Posts'
TABBLOGPOSTS: 'Blog Posts'
belongs_many_many_BlogPosts: 'Blog posts'
db_BlogProfileSummary: 'Blog profile summary'
db_URLSegment: 'URL segment'
has_one_BlogProfileImage: 'Blog profile image'
SilverStripe\Blog\Model\BlogObject:
Title: Title
SilverStripe\Blog\Model\BlogPost:
AUTHOR: Author
AdditionalCredits: 'Additional Credits'
AdditionalCredits_Description: 'If some authors of this post don''t have CMS access, enter their name(s) here. You can separate multiple names with a comma.'
Authors: Authors
CUSTOMSUMMARY: 'Add A Custom Summary'
Categories: Categories
FeaturedImage: 'Featured Image'
PLURALNAME: 'Base Pages'
PLURALS:
one: 'A Blog Post'
other: '{count} Base Pages'
PageTitleLabel: 'Post Title'
PostOptions: 'Post Options'
PublishDate: 'Publish Date'
PublishDate_Description: 'Will be set to "now" if published without a value.'
SINGULARNAME: 'Blog Post'
SUMMARY_DESCRIPTION: 'If no summary is specified the first 30 words will be used.'
Tags: Tags
db_AuthorNames: 'Author names'
db_PublishDate: 'Publish date'
db_Summary: Summary
has_one_FeaturedImage: 'Featured image'
many_many_Authors: Authors
many_many_Categories: Categories
many_many_Tags: Tags
SilverStripe\Blog\Model\BlogPostFeaturedExtension:
FEATURED: 'Include Post in Feature Widget'
db_FeaturedInWidget: 'Featured in widget'
SilverStripe\Blog\Model\BlogTag:
Duplicate: 'A blog tag already exists with that name.'
PLURALNAME: 'Blog Tags'
PLURALS:
one: 'A Blog Tag'
other: '{count} Blog Tags'
SINGULARNAME: 'Blog Tag'
belongs_many_many_BlogPosts: 'Blog posts'
db_Title: Title
db_URLSegment: 'URL segment'
has_one_Blog: Blog
SilverStripe\Blog\Widgets\BlogArchiveWidget:
ArchiveType: ArchiveType
Blog: Blog
NumberToDisplay: 'No. to Display'
PLURALNAME: 'Blog Archive Widgets'
PLURALS:
one: 'A Blog Archive Widget'
other: '{count} Blog Archive Widgets'
SINGULARNAME: 'Blog Archive Widget'
BlogCategoriesWidget:
SilverStripe\Blog\Widgets\BlogCategoriesWidget:
Blog: Blog
Direction:
Description: 'Change the direction of ordering of categories shown by this widget.'
Label: Direction
Limit:
Description: 'Limit the number of categories shown by this widget (set to 0 to show all categories).'
Label: Limit
Direction: Direction
Direction_Description: 'Change the direction of ordering of categories shown by this widget.'
Limit: Limit
Limit_Description: 'Limit the number of categories shown by this widget (set to 0 to show all categories).'
PLURALNAME: 'Blog Categories Widgets'
PLURALS:
one: 'A Blog Categories Widget'
other: '{count} Blog Categories Widgets'
SINGULARNAME: 'Blog Categories Widget'
Sort:
Description: 'Change the order of categories shown by this widget.'
Label: Sort
BlogCategory:
PLURALNAME: 'Blog Categories'
SINGULARNAME: 'Blog Category'
Title: Title
BlogEntry:
DESCRIPTION: 'Generic content page'
PLURALNAME: 'Base Pages'
SINGULARNAME: 'Blog Entry'
BlogHolder:
DESCRIPTION: 'Generic content page'
PLURALNAME: 'Base Pages'
SINGULARNAME: 'Blog Holder'
BlogPost:
AUTHOR: Author
AdditionalCredits: 'Additional Credits'
Authors: Authors
CUSTOMSUMMARY: 'Add A Custom Summary'
Categories: Categories
DESCRIPTION: 'Generic content page'
FeaturedImage: 'Featured Image'
PLURALNAME: 'Base Pages'
PageTitleLabel: 'Post Title'
PublishDate: 'Publish Date'
SINGULARNAME: 'Blog Post'
SUMMARY_DESCRIPTION: 'If no summary is specified the first 30 words will be used.'
Tags: Tags
BlogRecentPostsWidget:
Sort: Sort
Sort_Description: 'Change the order of categories shown by this widget.'
SilverStripe\Blog\Widgets\BlogFeaturedPostsWidget:
Blog: Blog
NumberOfPosts: 'Number of Posts'
PLURALNAME: 'Blog Featured Posts Widgets'
PLURALS:
one: 'A Blog Featured Posts Widget'
other: '{count} Blog Featured Posts Widgets'
SINGULARNAME: 'Blog Featured Posts Widget'
SilverStripe\Blog\Widgets\BlogRecentPostsWidget:
Blog: Blog
NumberOfPosts: 'Number of Posts'
PLURALNAME: 'Blog Recent Posts Widgets'
PLURALS:
one: 'A Blog Recent Posts Widget'
other: '{count} Blog Recent Posts Widgets'
SINGULARNAME: 'Blog Recent Posts Widget'
BlogTag:
PLURALNAME: 'Blog Tags'
SINGULARNAME: 'Blog Tag'
Title: Title
BlogTagsWidget:
SilverStripe\Blog\Widgets\BlogTagsCloudWidget:
Blog: Blog
Direction:
Description: 'Change the direction of ordering of tags shown by this widget.'
Label: Direction
Limit:
Description: 'Limit the number of tags shown by this widget (set to 0 to show all tags).'
Label: Limit
PLURALNAME: 'Blog Tags Cloud Widgets'
PLURALS:
one: 'A Blog Tags Cloud Widget'
other: '{count} Blog Tags Cloud Widgets'
SINGULARNAME: 'Blog Tags Cloud Widget'
SilverStripe\Blog\Widgets\BlogTagsWidget:
Blog: Blog
Direction: Direction
Direction_Description: 'Change the direction of ordering of tags shown by this widget.'
Limit: Limit
Limit_Description: 'Limit the number of tags shown by this widget (set to 0 to show all tags).'
PLURALNAME: 'Blog Tags Widgets'
PLURALS:
one: 'A Blog Tags Widget'
other: '{count} Blog Tags Widgets'
SINGULARNAME: 'Blog Tags Widget'
Sort:
Description: 'Change the order of tags shown by this widget.'
Label: Sort
BlogTree:
DESCRIPTION: 'Generic content page'
PLURALNAME: 'Base Pages'
SINGULARNAME: 'Blog Tree'
GridFieldAddByDBField:
Add: 'Add {name}'
AddFail: 'Unable to save {class} to the database.'
PermissionFail: 'You don''t have permission to create a {class}.'
GridFieldBlogPostState:
Draft: '<i class="btn-icon gridfield-icon btn-icon-pencil"></i> Saved as Draft on {date}'
Published: '<i class="btn-icon gridfield-icon btn-icon-accept"></i> Published on {date}'
Timer: '<i class="gridfield-icon blog-icon-timer"></i> Publish at {date}'
TagCloudWidget:
PLURALNAME: 'Tag Cloud Widgets'
SINGULARNAME: 'Tag Cloud Widget'
Sort: Sort
Sort_Description: 'Change the order of tags shown by this widget.'

View File

@ -1,79 +1,182 @@
eo:
Blog:
SilverStripe\Blog\Admin\GridFieldCategorisationConfig:
Posts: Afiŝoj
Title: Titolo
SilverStripe\Blog\Admin\GridFieldMergeAction:
MovePostsTo: 'Movi afiŝojn al'
SilverStripe\Blog\Forms\GridField\GridFieldAddByDBField:
Add: 'Aldoni {name}'
AddFail: '{klaso} ne estas konservebla al la datumbazo.'
ButtonName: '{name}'
PermissionFail: 'Vi ne havas permeson krei je {klaso}.'
SilverStripe\Blog\Forms\GridField\GridFieldBlogPostState:
Draft: 'Konservita kiel malneto je {dato}'
Modified: Ŝanĝita
Published: 'Publikigita je {dato}'
Timer: 'Publikigi je {dato}'
SilverStripe\Blog\Model:
Title: Titolo
SilverStripe\Blog\Model\Blog:
AND: kaj
Archive: Arkivo
By: de
CONTRIBUTOR: Kontribuinto
Categories: Kategorioj
Categorisation: Kategoriigi
Category: Kategorio
Comments: Komentoj
DESCRIPTION: 'Aldonas blogon al via retejo.'
LumberjackTitle: 'Blogaj afiŝoj'
NoPosts: 'Mankas afiŝoj'
PLURALNAME: Blogaĵoj
Posted: Afiŝita
PostedIn: 'Afiŝita en'
PostsPerPage: 'Afiŝoj en ĉiu paĝo'
ReadMoreAbout: 'Legi plu pri ''{title}''...'
SINGULARNAME: Blogo
Tag: Etikedo
Tagged: Havas etikedon
Tags: Etikedoj
By: de
CONTRIBUTOR: Kontribuinto
EDITOR: Redaktinto
FILTERDESCRIPTION_AUTHOR: 'De {aŭtoro}'
FILTERDESCRIPTION_CATEGORY: 'En kategorio {kategorio}'
FILTERDESCRIPTION_DATE: 'En {dato}'
FILTERDESCRIPTION_PAGE: 'Paĝo {paĝo}'
FILTERDESCRIPTION_TAG: 'Etikedo {etikedo}'
LessThanAMinuteToRead: 'Malpli ol minuto por legi'
LumberjackTitle: 'Blogaj afiŝoj'
MinutesToRead: 'Minuto(j) por legi'
NoPosts: 'Mankas afiŝoj'
PERMISSIONS_CATEGORY: 'Blogaj permesoj'
PERMISSION_MANAGE_USERS_DESCRIPTION: 'Administri uzantojn por specifaj blogaĵoj'
PERMISSION_MANAGE_USERS_HELP: 'Permesi agordi redaktantojn, verkantojn, aŭ kontribuantojn al blogoj'
PLURALNAME: 'Bazaj paĝoj'
PLURALS:
one: '1 baza paĝo'
other: '{count} bazaj paĝoj'
Posted: Afiŝita
PostedIn: 'Afiŝita en'
PostsByUser: 'Afiŝoj laŭ {firstname} {surname} por {title}'
PostsPerPage: 'Afiŝoj en ĉiu paĝo'
ReadMoreAbout: 'Legi plu pri ''{title}''...'
SINGULARNAME: Blogo
Tag: Etikedo
Tagged: 'Havas etikedon'
Tags: Etikedoj
UsersContributorsFieldDescription: "Kontribuantoj rajtas krei aŭ redakti BlogAfiŝojn, sed ne publikigi sen \npermeso de redaktanto, Ankaŭ ili ne rajtas asigni aliajn kontribuantajn aŭtorojn al iu el \n siaj BlogAfiŝoj.<br />\n <br />\n Kontribuantoj rajtas:<br />\n <br />\n Ĝisdatigi iun BlogAfiŝon kiun ili aŭtoris aŭ al kiu li/ŝi estas asignita."
UsersEditorsFieldDescription: "Redaktanto regas specifajn BlogAfiŝojn, kaj ĉiujn afiŝojn en ĉiu.\n Malpli ol asigni aliajn redaktantojn al blogo, ili rajtas trakti plejmultajn ŝanĝojn al\n sia asignita blogo. <br /><br />\n Redaktantoj havas ĉi tiujn permesojn:<br />\n <br />\n Ĝisdatigi aŭ publikigi ajnan BlogAfiŝon en sia Blogo<br />\n Ĝisdatigi aŭ publikigi sian Blogon<br />\n Asigni/malasigni verkantojn al sia Blogo<br />\n Asigni/malasigni kontribuantojn al sia Blogo<br />\n Asigni/malasigni ajnan membron aŭtoro de specifa BlogAfiŝo"
UsersWritersFieldDescription: "Verkanto tute regas krei, redakti kaj publikigi BlogAfiŝojn kiujn ili verkis\n aŭ al kiuj ili estas asignitaj. Verkantoj ne rajtas redakti BlogAfiŝon al kiu ili ne estas asignitaj.\n <br /><br />\n Verkantoj havas la jenajn permesojn:<br />\n <br />\n Ĝisdatigi aŭ publikigi ajnan BlogAfiŝon kiun ili verkis, aŭ al kiu ili estas asignitaj<br />\n Asigni/malasigni ajnan membron aŭtoro de specifa BlogAfiŝo kiun ili verkis aŭ al kiu ili estas asignita."
WRITER: Verkanto
BlogArchiveWidget:
db_PostsPerPage: 'Afiŝoj en ĉiu paĝo'
has_many_Categories: Kategorioj
has_many_Tags: Etikedoj
many_many_Contributors: Kontribuintoj
many_many_Editors: Redaktantoj
many_many_Writers: Verkantoj
SilverStripe\Blog\Model\BlogCategory:
Duplicate: 'Bloga kategorio jam ekzistas kun tiu nomo'
PLURALNAME: 'Blogaj kategorioj'
PLURALS:
one: 'Unu bloga kategorio'
other: '{count} blogaj kategorioj'
SINGULARNAME: 'Bloga kategorio'
belongs_many_many_BlogPosts: 'Blogaj afiŝoj'
db_Title: Titolo
db_URLSegment: URL-segmento
has_one_Blog: Blogo
SilverStripe\Blog\Model\BlogMemberExtension:
BLOGPOSTS: 'Blogaj afiŝoj'
TABBLOGPOSTS: 'Blogaj afiŝoj'
belongs_many_many_BlogPosts: 'Blogaj afiŝoj'
db_BlogProfileSummary: 'Bloga profila resumo'
db_URLSegment: URL-segmento
has_one_BlogProfileImage: 'Bloga profila bildo'
SilverStripe\Blog\Model\BlogObject:
Title: Titolo
SilverStripe\Blog\Model\BlogPost:
AUTHOR: Aŭtoro
AdditionalCredits: 'Kromaj agnoskoj'
AdditionalCredits_Description: 'Se iuj aŭtoroj de ĉi tiu afiŝo ne havas CMS-aliron, enigu iliajn nomo(j)n ĉi tie. Vi povas apartigi plurajn nomojn per komo.'
Authors: Aŭtoroj
CUSTOMSUMMARY: 'Aldoni propran resumon'
Categories: Kategorioj
FeaturedImage: 'Prezentita bildo'
PLURALNAME: 'Bazaj paĝoj'
PLURALS:
one: '1 baza paĝo'
other: '{count} bazaj paĝoj'
PageTitleLabel: 'Titolo de afiŝo'
PostOptions: 'Afiŝaj agordoj'
PublishDate: 'Dato de publikigo'
PublishDate_Description: 'Agordiĝos al "nun", se publikigita sen valoro'
SINGULARNAME: Blogaĵo
SUMMARY_DESCRIPTION: 'Se resumo ne estas agordita, la unuaj 30 vortoj uziĝos.'
Tags: Etikedoj
db_AuthorNames: 'Nomoj de aŭtoroj'
db_PublishDate: 'Dato de publikigo'
db_Summary: Resumo
has_one_FeaturedImage: 'Prezentita bildo'
many_many_Authors: Aŭtoroj
many_many_Categories: Kategorioj
many_many_Tags: Etikedoj
SilverStripe\Blog\Model\BlogPostFeaturedExtension:
FEATURED: 'Inkludi afiŝon en elstara fenestraĵo'
db_FeaturedInWidget: 'Prezentita en fenestraĵo'
SilverStripe\Blog\Model\BlogTag:
Duplicate: 'Blogaj etikedoj jam ekzistas kun tiu nomo'
PLURALNAME: 'Blogaj etikedoj'
PLURALS:
one: 'Unu bloga etikedo'
other: '{count} blogaj etikedoj'
SINGULARNAME: 'Bloga etikedo'
belongs_many_many_BlogPosts: 'Blogaj afiŝoj'
db_Title: Titolo
db_URLSegment: URL-segmento
has_one_Blog: Blogo
SilverStripe\Blog\Widgets\BlogArchiveWidget:
ArchiveType: ArkivoTipo
Blog: Blogo
NumberToDisplay: 'Nombro vidigotaj'
PLURALNAME: 'Fenestraĵoj por bloga arkivo'
PLURALS:
one: 'Unu fenestraĵo por bloga arkivo'
other: '{count} fenestraĵoj por bloga arkivo'
SINGULARNAME: 'Fenestraĵo por bloga arkivo'
ArchiveType: Tipo
BlogCategoriesWidget:
SilverStripe\Blog\Widgets\BlogCategoriesWidget:
Blog: Blogo
Direction: Direkto
Direction_Description: 'Ŝanĝi la direkton de ordigo de kategorioj vidigotaj de tiu fenestraĵo.'
Limit: Limigi
Limit_Description: 'Limigu la nombron da kategorioj vidigotaj de tiu fenestraĵo (agordu al 0 por vidigi ĉiujn kategoriojn).'
PLURALNAME: 'Fenestraĵoj por blogaj kategorioj'
PLURALS:
one: 'Unu fenestraĵo por blogaj kategorioj'
other: '{count} fenestraĵoj por blogaj kategorioj'
SINGULARNAME: 'Fenestraĵo por blogaj kategorioj'
BlogCategory:
PLURALNAME: 'Kategorioj'
SINGULARNAME: 'Kategorio'
Title: Titolo
BlogPost:
Categories: Kategorioj
DESCRIPTION: 'Komuna enhavpaĝo'
FeaturedImage: 'Prezentita bildo'
PLURALNAME: 'Blogaj afiŝoj'
PageTitleLabel: 'Titolo de afiŝo'
PublishDate: 'Dato de publikigo'
SINGULARNAME: 'Blogaĵo'
Tags: Etikedoj
AUTHOR: Aŭtoro
AdditionalCredits: 'Kromaj agnoskoj'
Authors: Aŭtoroj
CUSTOMSUMMARY: 'Aldoni propran resumon'
SUMMARY_DESCRIPTION: 'Se resumo ne estas agordita, la unuaj 30 vortoj uziĝos.'
BlogRecentPostsWidget:
Sort: Ordigi
Sort_Description: 'Ŝanĝi la ordon de kategorioj vidigotaj de tiu fenestraĵo.'
SilverStripe\Blog\Widgets\BlogFeaturedPostsWidget:
Blog: Blogo
NumberOfPosts: 'Nombro da afiŝoj'
PLURALNAME: 'Fenestraĵoj de lastatempaj blogaĵoj'
PLURALS:
one: 'Unu fenestraĵo de lastatempa blogaĵo'
other: '{count} fenestraĵoj de lastatempaj blogaĵoj'
SINGULARNAME: 'Fenestraĵo de lastatempa blogaĵo'
SilverStripe\Blog\Widgets\BlogRecentPostsWidget:
Blog: Blog
NumberOfPosts: 'Nombro da afiŝoj'
PLURALNAME: 'Fenestraĵoj de lastaj blogaĵoj'
PLURALNAME: 'Fenestraĵoj de lastatempaj blogaĵoj'
PLURALS:
one: 'Unu fenestraĵo de lastatempaj blogaĵoj'
other: '{count} fenestraĵoj de lastatempaj blogaĵoj'
SINGULARNAME: 'Fenestraĵo de lastaj blogaĵoj'
BlogTag:
PLURALNAME: 'Etikedoj'
SINGULARNAME: 'Etikedo'
Title: Titolo
BlogTagsWidget:
SilverStripe\Blog\Widgets\BlogTagsCloudWidget:
Blog: Blogo
PLURALNAME: 'Nubaj fenestraĵoj por blogaj etikedoj'
PLURALS:
one: 'Unu nuba fenestraĵo por blogaj etikedoj'
other: '{count} nubaj fenestraĵoj por blogaj etikedoj'
SINGULARNAME: 'Nuba fenestraĵo por blogaj etikedoj'
SilverStripe\Blog\Widgets\BlogTagsWidget:
Blog: Blog
Direction: Direkto
Direction_Description: 'Ŝanĝi la direkton de ordigo de etikedoj vidigotaj de tiu fenestraĵo.'
Limit: Limigi
Limit_Description: 'Limigu la nombron da etikedoj vidigotaj de tiu fenestraĵo (agordu al 0 por vidigi ĉiujn etikedojn).'
PLURALNAME: 'Fenestraĵoj por blogaj etikedoj'
PLURALS:
one: 'Unu fenestraĵo por blogaj etikedoj'
other: '{count} fenestraĵoj por blogaj etikedoj'
SINGULARNAME: 'Fenestraĵo por blogaj etikedoj'
GridFieldAddByDBField:
Add: 'Aldoni {name}'
AddFail: '{klaso} ne estas konservebla al la datumbazo.'
PermissionFail: 'Vi ne havas permeson krei je {klaso}.'
GridFieldBlogPostState:
Draft: '<i class="btn-icon gridfield-icon btn-icon-pencil"></i> Konservita kiel malneto je {dato}'
Published: '<i class="btn-icon gridfield-icon btn-icon-accept"></i> Publikigita je {dato}'
Timer: '<i class="gridfield-icon blog-icon-timer"></i> Publikigi je {dato}'
Sort: Ordigi
Sort_Description: 'Ŝanĝi la ordon de etikedoj vidigotaj de tiu fenestraĵo.'

130
lang/es.yml Normal file
View File

@ -0,0 +1,130 @@
es:
SilverStripe\Blog\Admin\GridFieldCategorisationConfig:
Posts: Artículos
Title: Título
SilverStripe\Blog\Admin\GridFieldMergeAction:
MovePostsTo: 'Mover artículos a'
SilverStripe\Blog\Forms\GridField\GridFieldAddByDBField:
Add: 'Agregar {name}'
AddFail: 'No se pudo guardar {class} en la base de datos.'
PermissionFail: 'No tienes los permisos para crear {class}.'
SilverStripe\Blog\Forms\GridField\GridFieldBlogPostState:
Draft: 'Guardado como Borrador el {date}'
Modified: Modificado
Published: 'Publicado el {date}'
Timer: 'Se publicará el {date}'
SilverStripe\Blog\Model:
Title: Título
SilverStripe\Blog\Model\Blog:
AND: 'y'
Archive: Archivo
By: Por
CONTRIBUTOR: Contribuidor
Categories: Categorías
Categorisation: Categorización
Category: Categoría
Comments: Comentarios
DESCRIPTION: 'Agrega un blog al sitio web.'
EDITOR: Editor
FILTERDESCRIPTION_AUTHOR: 'Por {author}'
FILTERDESCRIPTION_CATEGORY: 'En la categoría {category}'
FILTERDESCRIPTION_DATE: 'En {date}'
FILTERDESCRIPTION_PAGE: 'Página {page}'
FILTERDESCRIPTION_TAG: 'Etiquetado con {tag}'
LessThanAMinuteToRead: 'Menos de un minuto para leer'
LumberjackTitle: 'Artículos del blog'
MinutesToRead: 'Minuto(s) para leer'
NoPosts: 'No hay artículos'
PERMISSIONS_CATEGORY: 'Permisos del blog'
PERMISSION_MANAGE_USERS_DESCRIPTION: 'Administrar usuarios para blogs individuales'
PERMISSION_MANAGE_USERS_HELP: 'Permitir de asignación de Editores, Escritores o Contribuidores a los blogs'
PLURALNAME: 'Páginas base'
PLURALS:
one: 'Un blog'
other: '{count} Blogs'
Posted: Publicado
PostedIn: 'Publicado en'
PostsPerPage: 'Artículos por página'
ReadMoreAbout: 'Leer más sobre ''{title}''...'
SINGULARNAME: Blog
Tag: Etiqueta
Tagged: Etiquetado
Tags: Etiquetas
WRITER: Escritor
has_many_Categories: Categorías
has_many_Tags: Etiquetas
SilverStripe\Blog\Model\BlogCategory:
Duplicate: 'Ya existe una categoría con el mismo nombre.'
PLURALNAME: 'Categorías del Blog'
PLURALS:
many: '{count} Categorías de blog'
one: 'Una categoría de blog'
other: '{count} Categorías de blog'
SINGULARNAME: 'Categoría del blog'
db_Title: Título
has_one_Blog: Blog
SilverStripe\Blog\Model\BlogMemberExtension:
BLOGPOSTS: 'Artículos del blog'
TABBLOGPOSTS: 'Artículos del blog'
SilverStripe\Blog\Model\BlogObject:
Title: Título
SilverStripe\Blog\Model\BlogPost:
AUTHOR: Autor
AdditionalCredits: 'Créditos adicionales'
AdditionalCredits_Description: 'Si algunos autores de este artículo no tienen acceso al CMS, agregue aquí su(s) nombres. Puedes agregar varios nombres utilizando una coma.'
Authors: Autores
CUSTOMSUMMARY: 'Agregar un resumen personalizado'
Categories: Categorías
FeaturedImage: 'Imagen Destacada'
PLURALNAME: 'Páginas base'
PLURALS:
one: 'Un artículo del blog'
other: '{count} Artículos del blog'
PageTitleLabel: 'Título del artículo'
PostOptions: 'Opciones del artículo'
PublishDate: 'Fecha de publicación'
PublishDate_Description: 'Se usara la fecha "actual" si se publica sin un valor.'
SINGULARNAME: 'Artículo del blog'
SUMMARY_DESCRIPTION: 'Si no se especifica un resumen se usarán las primeras 30 palabras.'
Tags: Etiquetas
many_many_Authors: Autores
many_many_Categories: Categorías
many_many_Tags: Etiquetas
SilverStripe\Blog\Model\BlogTag:
Duplicate: 'Ya existe una etiqueta con este nombre.'
PLURALNAME: 'Etiquetas del Blog'
PLURALS:
many: '{count} Etiquetas de blog'
one: 'Una etiqueta de blog'
other: '{count} Etiquetas de blog'
SINGULARNAME: 'Etiqueta del Blog'
db_Title: Título
has_one_Blog: Blog
SilverStripe\Blog\Widgets\BlogArchiveWidget:
ArchiveType: 'Tipo de archivo'
Blog: Blog
NumberToDisplay: 'No. a mostrar'
SilverStripe\Blog\Widgets\BlogCategoriesWidget:
Blog: Blog
Direction: Dirección
Direction_Description: 'Cambia la dirección de ordenamiento de las categorías mostradas por este widget.'
Limit: Limite
Limit_Description: 'Limita el número de categorías mostradas por este widget (use 0 para mostrar todas las categorías) '
Sort: Ordenar
Sort_Description: 'Cambia el orden de las categorías mostradas por este widget.'
SilverStripe\Blog\Widgets\BlogFeaturedPostsWidget:
Blog: Blog
NumberOfPosts: 'Numero de artículos'
SilverStripe\Blog\Widgets\BlogRecentPostsWidget:
Blog: Blog
NumberOfPosts: 'Numero de artículos'
SilverStripe\Blog\Widgets\BlogTagsCloudWidget:
Blog: Blog
SilverStripe\Blog\Widgets\BlogTagsWidget:
Blog: Blog
Direction: Dirección
Direction_Description: 'Cambia la dirección del orden de las etiquetas mostradas por este widget.'
Limit: Limit
Limit_Description: 'Limita el número de etiquetas mostradas por este widget (use 0 para mostrar todas las etiquetas).'
Sort: Ordenar
Sort_Description: 'Cambiar el orden de las etiquetas mostradas por este widget'

114
lang/fa_IR.yml Normal file
View File

@ -0,0 +1,114 @@
fa_IR:
SilverStripe\Blog\Admin\GridFieldCategorisationConfig:
Title: عنوان
SilverStripe\Blog\Forms\GridField\GridFieldAddByDBField:
Add: 'افزودن {name}'
AddFail: 'ناتوان از ذخیره‌سازی {class} در بانک داده'
PermissionFail: 'شما دسترسی لازم جهت ایجاد یک {class} را ندارید.'
SilverStripe\Blog\Forms\GridField\GridFieldBlogPostState:
Modified: 'تغییر یافته'
SilverStripe\Blog\Model:
Title: عنوان
SilverStripe\Blog\Model\Blog:
AND: و
Archive: بایگانی
By: توسط
CONTRIBUTOR: مشارکت‌کننده
Categories: مجموعه‌ها
Category: مجموعه
Comments: دیدگاه‌ها
DESCRIPTION: 'یک وبلاگ به سایت شما می‌افزاید.'
EDITOR: ویرایشگر
FILTERDESCRIPTION_AUTHOR: 'توسط {author}'
FILTERDESCRIPTION_CATEGORY: 'در مجموعه‌ی {category}'
FILTERDESCRIPTION_DATE: 'در {date}'
FILTERDESCRIPTION_PAGE: 'صفحه‌ی {page}'
FILTERDESCRIPTION_TAG: 'تگ‌شده با {tag}'
LumberjackTitle: 'ارسال‌های وبلاگ'
NoPosts: 'هیچ ارسالی وجود ندارد'
PERMISSIONS_CATEGORY: 'دسترسی‌های وبلاگ'
PERMISSION_MANAGE_USERS_DESCRIPTION: 'مدیریت کاربران برای بلاگ‌های انفرادی'
PERMISSION_MANAGE_USERS_HELP: 'تعیین اجازه‌ی دسترسی ویرایش‌گران، نویسندگان یا مشارکت‌کنندگان به وبلاگ'
PLURALNAME: 'صفحه اصلی'
Posted: 'ارسال شده'
PostedIn: 'ارسال شده در'
PostsPerPage: 'تعداد ارسال در صفحه'
ReadMoreAbout: 'درباره ''{title}'' بیشتر بخوانید...'
SINGULARNAME: وبلاگ
Tag: تگ
Tagged: تگ‌شده
Tags: تگ‌ها
WRITER: نویسنده
has_many_Categories: مجموعه‌ها
has_many_Tags: تگ‌ها
SilverStripe\Blog\Model\BlogCategory:
PLURALNAME: 'مجموعه‌های وبلاگ'
SINGULARNAME: 'مجموعه وبلاگ'
db_Title: عنوان
has_one_Blog: وبلاگ
SilverStripe\Blog\Model\BlogMemberExtension:
BLOGPOSTS: 'صفحات پایه‌ای'
TABBLOGPOSTS: 'صفحات پایه‌ای'
SilverStripe\Blog\Model\BlogObject:
Title: عنوان
SilverStripe\Blog\Model\BlogPost:
AUTHOR: نگارنده
AdditionalCredits: 'دیگر مشارکت‌کنندگان'
AdditionalCredits_Description: 'اگر برخی از نگارندگان این ارسال دسترسی به سی‌ام‌اس ندارند، نام آن‌ها را اینجا وارد نمایید. می‌توانید نام‌ها را با علامت ویرگول از هم جدا کنید.'
Authors: نگارندگان
CUSTOMSUMMARY: 'افزودن یک خلاصه دلخواه'
Categories: مجموعه‌ها
FeaturedImage: 'تصویر برجسته'
PLURALNAME: 'صفحه اصلی'
PageTitleLabel: 'عنوان ارسال'
PublishDate: 'تاریخ انتشار'
PublishDate_Description: 'اگر بدون داده‌ای منتشر شود به "اکنون" تنظیم خواهد شد.'
SINGULARNAME: 'ارسال وبلاگ'
SUMMARY_DESCRIPTION: 'اگر هیچ خلاصه‌ای معرفی نشود ۳۰ کلمه‌ی آغازین استفاده خواهد شد.'
Tags: تگ‌ها
many_many_Authors: نگارندگان
many_many_Categories: مجموعه‌ها
many_many_Tags: تگ‌ها
SilverStripe\Blog\Model\BlogTag:
PLURALNAME: 'تگ‌های وبلاگ'
SINGULARNAME: 'تگ وبلاگ'
db_Title: عنوان
has_one_Blog: وبلاگ
SilverStripe\Blog\Widgets\BlogArchiveWidget:
ArchiveType: 'نوع بایگانی'
Blog: وبلاگ
NumberToDisplay: 'شمار در نمایش'
PLURALNAME: 'ویجت‌های بایگانی بلاگ'
SINGULARNAME: 'ویجت بایگانی بلاگ'
SilverStripe\Blog\Widgets\BlogCategoriesWidget:
Blog: وبلاگ
Direction: جهت
Direction_Description: 'تغییر جهت ترتیب مجموعه‌های نمایش داده‌‌شده توسط این ویجت'
Limit: 'محدود کردن'
Limit_Description: 'محدود کردن تعداد مجموعه‌های نمایش داده شده توسط این ویجت (روی 0 بگذارید تا همه به نمایش دربیایند)'
PLURALNAME: 'ویجت‌های مجموعه‌های بلاگ'
SINGULARNAME: 'ویجت‌ مجموعه‌های بلاگ'
Sort: مرتب‌سازی
Sort_Description: 'تغییر ترتیب مجموعه‌های نمایش داده‌‌شده توسط این ویجت'
SilverStripe\Blog\Widgets\BlogFeaturedPostsWidget:
Blog: وبلاگ
NumberOfPosts: 'شمار ارسال‌ها'
SilverStripe\Blog\Widgets\BlogRecentPostsWidget:
Blog: وبلاگ
NumberOfPosts: 'شمار ارسال‌ها'
PLURALNAME: 'ویجت‌های جدیدترین ارسال‌های بلاگ'
SINGULARNAME: 'ویجت جدیدترین ارسال‌های بلاگ'
SilverStripe\Blog\Widgets\BlogTagsCloudWidget:
Blog: وبلاگ
PLURALNAME: 'ویجت ابر تگ‌های وبلاگ'
SINGULARNAME: 'ویجت‌های ابر تگ‌های وبلاگ'
SilverStripe\Blog\Widgets\BlogTagsWidget:
Blog: وبلاگ
Direction: جهت
Direction_Description: 'تغییر جهت ترتیب تگ‌های نمایش داده‌‌شده توسط این ویجت'
Limit: 'محدود کردن'
Limit_Description: 'محدود کردن تعداد تگ‌های نمایش داده شده توسط این ویجت (روی 0 بگذارید تا همه به نمایش دربیایند)'
PLURALNAME: 'ویجت‌های تگ‌های وبلاگ'
SINGULARNAME: 'ویجت تگ‌های وبلاگ'
Sort: مرتب‌سازی
Sort_Description: 'تغییر ترتیب تگ‌های نمایش داده‌‌شده توسط این ویجت'

View File

@ -1,79 +1,164 @@
fi:
Blog:
SilverStripe\Blog\Admin\GridFieldCategorisationConfig:
Posts: Artikkelit
Title: Otsikko
SilverStripe\Blog\Admin\GridFieldMergeAction:
MovePostsTo: 'Siirrä artikkeli kohteeseen'
SilverStripe\Blog\Forms\GridField\GridFieldAddByDBField:
Add: 'Lisää {name}'
AddFail: '{class} ei voida tallentaa tietokantaan.'
PermissionFail: 'Sinulla ei ole oikeuksia luoda {class}.'
SilverStripe\Blog\Forms\GridField\GridFieldBlogPostState:
Draft: 'Versio tallennettu {date}'
Modified: Muokattu
Published: 'Julkaistu {date}'
Timer: 'Julkaistaan {date}'
SilverStripe\Blog\Model:
Title: Otsikko
SilverStripe\Blog\Model\Blog:
AND: ja
Archive: Arkisto
By: kirjoittanut
CONTRIBUTOR: Avustaja
Categories: Kategoriat
Categorisation: Kategoriointi
Category: Kategoria
Comments: Kommentit
DESCRIPTION: 'Lisää blogin nettisivuillesi.'
LumberjackTitle: 'Blogikirjoitukset'
NoPosts: 'Ei kirjoituksia'
PLURALNAME: Blogit
Posted: Kirjoitettu
PostedIn: 'Kirjoitettu:'
PostsPerPage: 'Kirjoitusta per sivu'
ReadMoreAbout: 'Lue lisää kirjoituksesta ''{title}''...'
SINGULARNAME: Blogi
Tag: Avainsana
Tagged: Merkitty
Tags: Avainsanat
By: kirjoittanut
CONTRIBUTOR: Avustaja
EDITOR: Toimittaja
FILTERDESCRIPTION_AUTHOR: 'Kirjoittanut {author}'
FILTERDESCRIPTION_CATEGORY: 'Kategoriassa: {category}'
FILTERDESCRIPTION_DATE: 'Pvm: {date}'
FILTERDESCRIPTION_PAGE: 'Sivu {page}'
FILTERDESCRIPTION_TAG: 'Avainsanat: {tag}'
LessThanAMinuteToRead: 'Lukemiseen kuluu alle minuutti'
LumberjackTitle: Blogikirjoitukset
MinutesToRead: 'Minuutti(a) lukemiseen'
NoPosts: 'Ei kirjoituksia'
PERMISSIONS_CATEGORY: 'Blogin oikeudet'
PERMISSION_MANAGE_USERS_DESCRIPTION: 'Hallinnoi käyttäjiä yksittäisissä blogeissa'
PERMISSION_MANAGE_USERS_HELP: 'Salli toimittajien, kirjoittajien tai avustajien kiinnittäminen blogeihin'
WRITER: Kirjoittaja
BlogArchiveWidget:
Blog: Blogi
NumberToDisplay: 'Näytetään'
PLURALNAME: 'Blogiarkisto-vimpaimet'
SINGULARNAME: 'Blogiarkisto-vimpain'
ArchiveType: Tyyppi
BlogCategoriesWidget:
Blog: Blogi
PLURALNAME: 'Blogikategoriat-vimpaimet'
SINGULARNAME: 'Blogikategoriat-vimpain'
BlogCategory:
PLURALNAME: 'Kategoriat'
SINGULARNAME: 'Kategoria'
Title: Otsikko
BlogPost:
Categories: Kategoriat
DESCRIPTION: 'Yleinen sisältösivu'
FeaturedImage: 'Pääkuvitus'
PLURALNAME: 'Blogikirjoitukset'
PageTitleLabel: 'Otsikko'
PublishDate: 'Julkaisupäivä'
SINGULARNAME: 'Blogikirjoitus'
PLURALNAME: Pohjasivut
PLURALS:
one: Blogi
other: '{count} blogia'
Posted: Kirjoitettu
PostedIn: 'Kirjoitettu:'
PostsByUser: 'Postaukset kirjoittajalta {firstname} {surname} otsikolla {title}'
PostsPerPage: 'Kirjoitusta per sivu'
ReadMoreAbout: 'Lue lisää kirjoituksesta ''{title}''...'
SINGULARNAME: Blogi
Tag: Avainsana
Tagged: Merkitty
Tags: Avainsanat
WRITER: Kirjoittaja
has_many_Categories: Kategoriat
has_many_Tags: Avainsanat
SilverStripe\Blog\Model\BlogCategory:
Duplicate: 'Tämä blogikategoria on jo olemassa'
PLURALNAME: Blogikategoriat
PLURALS:
one: 'Blogin kategoria'
other: '{count} blogin kategoriaa'
SINGULARNAME: Blogikategoria
db_Title: Otsikko
db_URLSegment: 'URL-osoitteen osio'
has_one_Blog: Blogi
SilverStripe\Blog\Model\BlogMemberExtension:
BLOGPOSTS: Artikkelit
TABBLOGPOSTS: Artikkelit
db_URLSegment: 'URL-osoitteen osio'
SilverStripe\Blog\Model\BlogObject:
Title: Otsikko
SilverStripe\Blog\Model\BlogPost:
AUTHOR: Kirjoittaja
AdditionalCredits: 'Lisäkiitokset'
AdditionalCredits: Lisäkiitokset
AdditionalCredits_Description: 'Mikäli kaikilla artikkelin kirjoittajilla ei ole pääsyä sisällönhallintajärjestelmään, syötä heidän nimensä (nimi) tähän. Erota useampi pilkulla.'
Authors: Kirjoittajat
CUSTOMSUMMARY: 'Lisää tiivistelmä'
Categories: Kategoriat
FeaturedImage: Kuvanosto
PLURALNAME: Pohjasivut
PLURALS:
one: Blogipostaus
other: '{count} Blogipostausta'
PageTitleLabel: Otsikko
PostOptions: 'Artikkelin asetukset'
PublishDate: Julkaisupäivä
PublishDate_Description: 'Asetetaan "nyt", mikäli arvo jätetään asettamatta.'
SINGULARNAME: Blogikirjoitus
SUMMARY_DESCRIPTION: 'Mikäli tiivistelmää ei ole kirjoitettu, käytetään 30 ensimmäistä sanaa kirjoituksesta.'
BlogRecentPostsWidget:
Tags: Avainsanat
many_many_Authors: Kirjoittajat
many_many_Categories: Kategoriat
many_many_Tags: Avainsanat
SilverStripe\Blog\Model\BlogPostFeaturedExtension:
FEATURED: 'Sisällytä postaus pääjutuksi'
SilverStripe\Blog\Model\BlogTag:
Duplicate: 'Tämä blogin avainsana on jo olemassa'
PLURALNAME: 'Blogin avainsanat'
PLURALS:
one: 'Blogin avainsana'
other: '{count} blogin avainsanaa'
SINGULARNAME: 'Blogin avainsana'
db_Title: Otsikko
db_URLSegment: 'URL-osoitteen osio'
has_one_Blog: Blogi
SilverStripe\Blog\Widgets\BlogArchiveWidget:
ArchiveType: Arkistotyyppi
Blog: Blogi
NumberToDisplay: Näytetään
PLURALNAME: Blogiarkisto-vimpaimet
PLURALS:
one: Blogiarkisto-vimpain
other: '{count} Blogiarkisto-vimpaimet'
SINGULARNAME: Blogiarkisto-vimpain
SilverStripe\Blog\Widgets\BlogCategoriesWidget:
Blog: Blogi
Direction: Suunta
Direction_Description: 'Vaihda vimpaimen näytettävien kategorioiden järjestyksen suunta.'
Limit: Rajoita
Limit_Description: 'Rajoita näytettävien kategorioiden määrää tässä vimpaimessa (aseta arvoksi 0, jos haluat näyttää kaikki kategoriat).'
PLURALNAME: Blogikategoria-vimpaimet
PLURALS:
one: 'Blogin kategoria-vimpain'
other: '{count} blogikategoria-vimpainta'
SINGULARNAME: Blogikategoriat-vimpain
Sort: Järjestä
Sort_Description: 'Vaihda vimpaimen näytettävien kategorioiden järjestys.'
SilverStripe\Blog\Widgets\BlogFeaturedPostsWidget:
Blog: Blogi
NumberOfPosts: 'Postausten määrä'
PLURALNAME: 'Blogin pääjutut-vimpaimet'
PLURALS:
one: 'Blogin pääjutut-vimpain'
other: '{count} blogin pääjutut vimpainta'
SINGULARNAME: 'Blogin pääjutut-vimpain'
SilverStripe\Blog\Widgets\BlogRecentPostsWidget:
Blog: Blogi
NumberOfPosts: 'Kirjoituksien määrä'
PLURALNAME: 'Viimeisimmät blogikirjoitukset -vimpaimet'
SINGULARNAME: 'Viimeisimmät blogikirjoitukset -vimpain'
BlogTag:
PLURALNAME: 'Avainsanat'
SINGULARNAME: 'Avainsana'
Title: Otsikko
BlogTagsWidget:
PLURALNAME: 'Äskettäiset julkaisut vimpain'
PLURALS:
one: 'Blogin äskettäiset julkaisut -vimpain'
other: '{count} blogin äskettäiset julkaisut -vimpainta'
SINGULARNAME: 'Äskettäin julkaistut artikkelit -vimpain'
SilverStripe\Blog\Widgets\BlogTagsCloudWidget:
Blog: Blogi
PLURALNAME: 'Avainsanat-vimpaimet'
SINGULARNAME: 'Avainsanat-vimpain'
GridFieldAddByDBField:
Add: 'Lisää {name}'
AddFail: '{class} ei voida tallentaa tietokantaan.'
PermissionFail: 'Sinulla ei ole oikeuksia luoda {class}.'
GridFieldBlogPostState:
Draft: '<i class="btn-icon blog-icon btn-icon-pencil"></i> Versio tallennettu {date}'
Published: '<i class="btn-icon blog-icon btn-icon-accept"></i> Julkaistu {date}'
Timer: '<i class="blog-icon blog-icon-timer"></i> Julkaistaan {date}'
PLURALNAME: Avainsanapilvi-vimpaimet
PLURALS:
one: Avainsanapilvi-vimpain
other: '{count} avainsanapilvi-vimpainta'
SINGULARNAME: 'Blogin avainanapilvivimpain'
SilverStripe\Blog\Widgets\BlogTagsWidget:
Blog: Blogi
Direction: Suunta
Direction_Description: 'Vaihda vimpaimen näytettävien avainsanojen järjestyksen suunta'
Limit: Rajoita
Limit_Description: 'Rajoita vimpaimella näytettävien avainsanojen määrää (aseta arvoksi 0, jos haluat näyttää kaikki avainsanat).'
PLURALNAME: 'Blogin avainsanavimpain'
PLURALS:
one: 'Blogin avainsanavimpain'
other: '{count} blogin avainsanavimpainta'
SINGULARNAME: 'Blogin avainsanavimpain'
Sort: Järjestä
Sort_Description: 'Vaihda vimpaimella näytettävien avainsanojen järjestystä.'

33
lang/fi_FI.yml Normal file
View File

@ -0,0 +1,33 @@
fi_FI:
SilverStripe\Blog\Admin\GridFieldCategorisationConfig:
Posts: Postaukset
Title: Otsikko
SilverStripe\Blog\Admin\GridFieldMergeAction:
MovePostsTo: 'Siirrä postaus kohteeseen'
SilverStripe\Blog\Forms\GridField\GridFieldAddByDBField:
Add: 'Lisää {name}'
SilverStripe\Blog\Forms\GridField\GridFieldBlogPostState:
Modified: Muokattu
SilverStripe\Blog\Model:
Title: Otsikko
SilverStripe\Blog\Model\Blog:
AND: ja
Archive: Arkistoi
Comments: Kommentit
FILTERDESCRIPTION_PAGE: 'Sivu {page}'
LumberjackTitle: Pohjasivut
PLURALNAME: Pohjasivut
SilverStripe\Blog\Model\BlogCategory:
Title: Otsikko
db_Title: Otsikko
SilverStripe\Blog\Model\BlogMemberExtension:
BLOGPOSTS: Pohjasivut
TABBLOGPOSTS: Pohjasivut
SilverStripe\Blog\Model\BlogObject:
Title: Otsikko
SilverStripe\Blog\Model\BlogPost:
AUTHOR: Kirjoittaja
PLURALNAME: Pohjasivut
SilverStripe\Blog\Model\BlogTag:
Title: Otsikko
db_Title: Otsikko

117
lang/fr.yml Normal file
View File

@ -0,0 +1,117 @@
fr:
SilverStripe\Blog\Admin\GridFieldCategorisationConfig:
Posts: Messages
Title: Titre
SilverStripe\Blog\Forms\GridField\GridFieldAddByDBField:
Add: 'Ajouter {name}'
AddFail: 'Impossible de sauvegarder {class} dans la base de données.'
PermissionFail: 'Vous n''avez pas la permission de créer {class}.'
SilverStripe\Blog\Forms\GridField\GridFieldBlogPostState:
Draft: 'Enregistré comme brouillon à {date}'
Modified: Modifié
Published: 'Publié le {date}'
Timer: 'Publier le {date}'
SilverStripe\Blog\Model:
Title: Titre
SilverStripe\Blog\Model\Blog:
AND: et
Archive: Archive
By: par
CONTRIBUTOR: Contributeur
Categories: Catégories
Category: Catégorie
Comments: Commentaires
DESCRIPTION: 'Ajouter un blog à votre site web.'
EDITOR: Editeur
FILTERDESCRIPTION_AUTHOR: 'Par {author}'
FILTERDESCRIPTION_CATEGORY: 'Dans la catégorie {category}'
FILTERDESCRIPTION_DATE: 'A {date}'
FILTERDESCRIPTION_PAGE: 'Page {page}'
FILTERDESCRIPTION_TAG: 'Taggé avec {tag}'
LumberjackTitle: 'Billets du blog'
NoPosts: 'Il n''y a pas de billets'
PERMISSIONS_CATEGORY: 'Permissions du blog'
PERMISSION_MANAGE_USERS_DESCRIPTION: 'Gérer les utilisateurs pour un blog'
PERMISSION_MANAGE_USERS_HELP: 'Autoriser l''assignation d''éditeurs, auteurs ou contributeurs au blog'
PLURALNAME: 'Base Pages'
Posted: Publié
PostedIn: 'Publié dans'
PostsPerPage: 'Billets par page'
ReadMoreAbout: 'Lire plus à propos de ''{title}''...'
SINGULARNAME: Blog
Tag: Tag
Tagged: Taggé
Tags: Tags
WRITER: Auteur
has_many_Categories: Catégories
has_many_Tags: Tags
SilverStripe\Blog\Model\BlogCategory:
PLURALNAME: 'Catégories du blog'
SINGULARNAME: 'Catégorie du blog'
db_Title: Titre
db_URLSegment: 'Segment d''URL'
has_one_Blog: Blog
SilverStripe\Blog\Model\BlogMemberExtension:
BLOGPOSTS: Billets
TABBLOGPOSTS: Billets
db_URLSegment: 'Segment d''URL'
SilverStripe\Blog\Model\BlogObject:
Title: Titre
SilverStripe\Blog\Model\BlogPost:
AUTHOR: Auteur
AdditionalCredits: 'Mentions additionnelles'
Authors: Auteurs
CUSTOMSUMMARY: 'Ajouter un sommaire personnalisé'
Categories: Catégories
PLURALNAME: 'Base Pages'
PageTitleLabel: 'Titre du billet'
PublishDate: 'Date de publication'
PublishDate_Description: 'Sera mis à "maintenant" si publié sans valeur.'
SINGULARNAME: Billet
SUMMARY_DESCRIPTION: 'Si aucun sommaire, les 30 premiers mots seront utilisés.'
Tags: Tags
many_many_Authors: Auteurs
many_many_Categories: Catégories
many_many_Tags: Tags
SilverStripe\Blog\Model\BlogTag:
PLURALNAME: 'Tags du blog'
SINGULARNAME: 'Tag du blog'
db_Title: Titre
db_URLSegment: 'Segment d''URL'
has_one_Blog: Blog
SilverStripe\Blog\Widgets\BlogArchiveWidget:
ArchiveType: ArchiveType
Blog: Blog
NumberToDisplay: 'Num. à afficher'
PLURALNAME: 'Widgets archive du blog'
SINGULARNAME: 'Widget archive du blog'
SilverStripe\Blog\Widgets\BlogCategoriesWidget:
Blog: Blog
Direction: Direction
Direction_Description: 'Changer la direction du tri de ce widget.'
Limit: Limite
Limit_Description: 'Limiter le nombre (mettre 0 pour tout montrer).'
PLURALNAME: 'Widgets catégories du blog'
SINGULARNAME: 'Widget catégories du blog'
Sort: Tri
Sort_Description: 'Changer l''ordre de tri pour ce widget.'
SilverStripe\Blog\Widgets\BlogFeaturedPostsWidget:
Blog: Blog
NumberOfPosts: 'Nombre de billets'
SilverStripe\Blog\Widgets\BlogRecentPostsWidget:
Blog: Blog
NumberOfPosts: 'Nombre de billets'
PLURALNAME: 'Widgets billets récents'
SINGULARNAME: 'Widget billet récent'
SilverStripe\Blog\Widgets\BlogTagsCloudWidget:
Blog: Blog
SilverStripe\Blog\Widgets\BlogTagsWidget:
Blog: Blog
Direction: Direction
Direction_Description: 'Changer la direction du tri de ce widget.'
Limit: Limite
Limit_Description: 'Limiter le nombre (mettre 0 pour tout montrer).'
PLURALNAME: 'Widgets tags du blog'
SINGULARNAME: 'Widget tag du blog'
Sort: Tri
Sort_Description: 'Changer l''ordre de tri pour ce widget.'

82
lang/hr.yml Normal file
View File

@ -0,0 +1,82 @@
hr:
SilverStripe\Blog\Admin\GridFieldCategorisationConfig:
Title: Naslov
SilverStripe\Blog\Forms\GridField\GridFieldAddByDBField:
Add: 'Dodaj {name}'
SilverStripe\Blog\Forms\GridField\GridFieldBlogPostState:
Modified: Izmjenjeno
SilverStripe\Blog\Model:
Title: Naslov
SilverStripe\Blog\Model\Blog:
AND: i
Archive: Arhiva
By: od
CONTRIBUTOR: Suradnik
Categories: Kategorije
Category: Kategorija
Comments: Komentari
DESCRIPTION: 'Dodaje blog na Vašu web stranicu.'
EDITOR: Urednik
FILTERDESCRIPTION_AUTHOR: 'od {author}'
FILTERDESCRIPTION_CATEGORY: 'U kategoriji {category}'
FILTERDESCRIPTION_DATE: 'od {date}'
FILTERDESCRIPTION_PAGE: 'Stranica {page} '
FILTERDESCRIPTION_TAG: 'Tagiran s {tag}'
LumberjackTitle: 'Blog zapisi'
NoPosts: 'Nema zapisa'
PERMISSIONS_CATEGORY: 'Blog dozvole'
PERMISSION_MANAGE_USERS_DESCRIPTION: 'Upravljaj korisnike za pojedinačne blogove'
PLURALNAME: 'Osnovne stranice'
Posted: Objavljeno
PostedIn: 'Objavljeno u'
PostsPerPage: 'Postova po stranici'
ReadMoreAbout: 'Pročitaj više o ''{title}''...'
SINGULARNAME: Blog
Tag: Tag
Tagged: Tagirano
Tags: Tagovi
WRITER: Pisac
has_many_Categories: Kategorije
has_many_Tags: Tagovi
SilverStripe\Blog\Model\BlogCategory:
db_Title: Naslov
has_one_Blog: Blog
SilverStripe\Blog\Model\BlogMemberExtension:
BLOGPOSTS: 'Bazna stranica'
TABBLOGPOSTS: 'Bazna stranica'
SilverStripe\Blog\Model\BlogObject:
Title: Naslov
SilverStripe\Blog\Model\BlogPost:
AUTHOR: Autor
Authors: Autori
Categories: Kategorije
FeaturedImage: 'Izdvojena slika'
PLURALNAME: 'Osnovne stranice'
PageTitleLabel: 'Naslov posta'
PublishDate: 'Datum objave'
SINGULARNAME: 'Blog zapis'
Tags: Tagovi
many_many_Authors: Autori
many_many_Categories: Kategorije
many_many_Tags: Tagovi
SilverStripe\Blog\Model\BlogTag:
db_Title: Naslov
has_one_Blog: Blog
SilverStripe\Blog\Widgets\BlogArchiveWidget:
ArchiveType: 'Tip arhive'
Blog: Blog
NumberToDisplay: 'Broj za prikaz'
SilverStripe\Blog\Widgets\BlogCategoriesWidget:
Blog: Blog
Limit: Limit
SilverStripe\Blog\Widgets\BlogFeaturedPostsWidget:
Blog: Blog
NumberOfPosts: 'Broj zapisa'
SilverStripe\Blog\Widgets\BlogRecentPostsWidget:
Blog: Blog
NumberOfPosts: 'Broj zapisa'
SilverStripe\Blog\Widgets\BlogTagsCloudWidget:
Blog: Blog
SilverStripe\Blog\Widgets\BlogTagsWidget:
Blog: Blog
Limit: Limit

27
lang/id.yml Normal file
View File

@ -0,0 +1,27 @@
id:
SilverStripe\Blog\Admin\GridFieldCategorisationConfig:
Title: Judul
SilverStripe\Blog\Forms\GridField\GridFieldAddByDBField:
Add: 'Tambah {name}'
SilverStripe\Blog\Forms\GridField\GridFieldBlogPostState:
Modified: Diubah
SilverStripe\Blog\Model:
Title: Judul
SilverStripe\Blog\Model\Blog:
Archive: Arsip
By: oleh
Comments: Komentar
PLURALNAME: 'Laman Dasar'
Tags: Penanda
has_many_Tags: Penanda
SilverStripe\Blog\Model\BlogCategory:
db_Title: Judul
SilverStripe\Blog\Model\BlogObject:
Title: Judul
SilverStripe\Blog\Model\BlogPost:
AUTHOR: Penulis
PLURALNAME: 'Laman Dasar'
Tags: Penanda
many_many_Tags: Penanda
SilverStripe\Blog\Model\BlogTag:
db_Title: Judul

View File

@ -1,13 +1,39 @@
it:
Blog:
SilverStripe\Blog\Admin\GridFieldCategorisationConfig:
Posts: Messaggi
Title: Titolo
SilverStripe\Blog\Forms\GridField\GridFieldAddByDBField:
Add: 'Aggiungi {name}'
AddFail: 'Impossibile salvare {class} nel database.'
PermissionFail: 'Non hai i permessi per creare un {class}.'
SilverStripe\Blog\Forms\GridField\GridFieldBlogPostState:
Draft: 'Salvato come bozza il {date}'
Modified: Modificato
Published: 'Pubblicato il {date}'
Timer: 'Pubblicare al {date}'
SilverStripe\Blog\Model:
Title: Titolo
SilverStripe\Blog\Model\Blog:
AND: e
Archive: Archivia
By: di
CONTRIBUTOR: Collaboratore
Categories: Categorie
Category: Categoria
Comments: Commenti
DESCRIPTION: 'Aggiungi un blog al tuo sito.'
EDITOR: Editore
FILTERDESCRIPTION_AUTHOR: 'Di {author}'
FILTERDESCRIPTION_CATEGORY: 'Nella categoria {category}'
FILTERDESCRIPTION_DATE: 'Il {date}'
FILTERDESCRIPTION_PAGE: 'Pagina {page}'
FILTERDESCRIPTION_TAG: 'Etichettato con {tag}'
LumberjackTitle: 'Articoli del Blog'
NoPosts: 'Non ci sono articoli'
PLURALNAME: Blog
PERMISSIONS_CATEGORY: 'Permessi del blog'
PERMISSION_MANAGE_USERS_DESCRIPTION: 'Gestire utenti per i singoli blog'
PERMISSION_MANAGE_USERS_HELP: 'Consenti l''assegnazione di Editori, Scrittori o Collaboratori ai blog'
PLURALNAME: 'Pagine Base'
Posted: Inserito
PostedIn: 'Inserito il'
PostsPerPage: 'Articoli Per Pagina'
@ -16,64 +42,80 @@ it:
Tag: Etichetta
Tagged: Etichettato
Tags: Etichette
By: di
CONTRIBUTOR: Collaboratore
EDITOR: Editore
FILTERDESCRIPTION_AUTHOR: 'Di {author}'
FILTERDESCRIPTION_CATEGORY: 'Nella categoria {category}'
FILTERDESCRIPTION_DATE: 'Il {date}'
FILTERDESCRIPTION_PAGE: 'Pagina {page}'
FILTERDESCRIPTION_TAG: 'Etichettato con {tag}'
PERMISSIONS_CATEGORY: 'Permessi del blog'
PERMISSION_MANAGE_USERS_DESCRIPTION: 'Gestire utenti per i singoli blog'
PERMISSION_MANAGE_USERS_HELP: 'Consenti l''assegnazione di Editori, Scrittori o Collaboratori ai blog'
WRITER: Scrittore
BlogArchiveWidget:
has_many_Categories: Categorie
has_many_Tags: Etichette
SilverStripe\Blog\Model\BlogCategory:
PLURALNAME: 'Categorie Blog'
SINGULARNAME: 'Categoria Blog'
db_Title: Titolo
db_URLSegment: 'Segmento URL'
has_one_Blog: Blog
SilverStripe\Blog\Model\BlogMemberExtension:
BLOGPOSTS: 'Articoli del Blog'
TABBLOGPOSTS: 'Articoli del Blog'
db_URLSegment: 'Segmento URL'
SilverStripe\Blog\Model\BlogObject:
Title: Titolo
SilverStripe\Blog\Model\BlogPost:
AUTHOR: Autore
AdditionalCredits: 'Riconoscimenti Aggiuntivi'
AdditionalCredits_Description: 'Se l''autore di questo articolo non ha accesso al CMS inserire qui il suo nome(i). Separare nomi multipli con la virgola.'
Authors: Autori
CUSTOMSUMMARY: 'Aggiungi una Sintesi Personalizzata'
Categories: Categorie
FeaturedImage: 'Immagine in Evidenza'
PLURALNAME: 'Pagine Base'
PageTitleLabel: 'Titolo Articolo'
PublishDate: 'Data Pubblicazione'
PublishDate_Description: 'Sarà impostato a "now" se pubblicato senza un valore.'
SINGULARNAME: 'Articolo del Blog'
SUMMARY_DESCRIPTION: 'Se non è specificata una sintesi saranno usate le prime 30 parole.'
Tags: Etichette
many_many_Authors: Autori
many_many_Categories: Categorie
many_many_Tags: Etichette
SilverStripe\Blog\Model\BlogTag:
PLURALNAME: 'Etichette Blog'
SINGULARNAME: 'Etichetta Blog'
db_Title: Titolo
db_URLSegment: 'Segmento URL'
has_one_Blog: Blog
SilverStripe\Blog\Widgets\BlogArchiveWidget:
ArchiveType: TipoArchiviazione
Blog: Blog
NumberToDisplay: 'N. da Visualizzare'
PLURALNAME: 'Widget Archiviazione Blog'
SINGULARNAME: 'Widget Archiviazione Blog'
ArchiveType: Tipo
BlogCategoriesWidget:
SilverStripe\Blog\Widgets\BlogCategoriesWidget:
Blog: Blog
Direction: Direzione
Direction_Description: 'Modificare la direzione di ordinamento delle categorie mostrate da questo widget.'
Limit: Limite
Limit_Description: 'Limitare il numero di categorie mostrate da questo widget (impostare a 0 per mostrare tutte le categorie).'
PLURALNAME: 'Widget Categorie Blog'
SINGULARNAME: 'Widget Categorie Blog'
BlogCategory:
PLURALNAME: 'Categorie'
SINGULARNAME: 'Categoria'
Title: Titolo
BlogPost:
Categories: Categorie
DESCRIPTION: 'Pagina di contenuto generico'
FeaturedImage: 'Immagine in primo piano'
PLURALNAME: 'Articoli del Blog'
PageTitleLabel: 'Titolo Articolo'
PublishDate: 'Data Pubblicazione'
SINGULARNAME: 'Articolo del Blog'
Tags: Etichette
AUTHOR: Autore
AdditionalCredits: 'Riconoscimenti Aggiuntivi'
Authors: Autori
CUSTOMSUMMARY: 'Aggiungi una Sintesi Personalizzata'
SUMMARY_DESCRIPTION: 'Se non è specificata una sintesi saranno usate le prime 30 parole.'
BlogRecentPostsWidget:
Sort: Ordine
Sort_Description: 'Modificare l''ordine delle categorie mostrate da questo widget.'
SilverStripe\Blog\Widgets\BlogFeaturedPostsWidget:
Blog: Blog
NumberOfPosts: 'Numero di Articoli'
SilverStripe\Blog\Widgets\BlogRecentPostsWidget:
Blog: Blog
NumberOfPosts: 'Numero di Articoli'
PLURALNAME: 'Widget Articoli Blog Recenti'
SINGULARNAME: 'Widget Articoli Blog Recenti'
BlogTag:
PLURALNAME: 'Etichette'
SINGULARNAME: 'Etichetta'
Title: Titolo
BlogTagsWidget:
SilverStripe\Blog\Widgets\BlogTagsCloudWidget:
Blog: Blog
PLURALNAME: 'Widget Tag Cloud del Blog'
SINGULARNAME: 'Widget Tag Cloud del Blog'
SilverStripe\Blog\Widgets\BlogTagsWidget:
Blog: Blog
Direction: Direzione
Direction_Description: 'Modificare la direzione di ordinamento delle etichette mostrate da questo widget.'
Limit: Limite
Limit_Description: 'Limitare il numero di etichette mostrate da questo widget (impostare a 0 per mostrare tutte le etichette).'
PLURALNAME: 'Widget Etichette Blog'
SINGULARNAME: 'Widget Etichette Blog'
GridFieldAddByDBField:
Add: 'Aggiungi {name}'
AddFail: 'Impossibile salvare {class} nel database.'
PermissionFail: 'Non hai i permessi per creare un {class}.'
GridFieldBlogPostState:
Draft: '<i class="btn-icon gridfield-icon btn-icon-pencil"></i> Salvato come bozza il {date}'
Published: '<i class="btn-icon gridfield-icon btn-icon-accept"></i> Pubblicato il {date}'
Timer: '<i class="gridfield-icon blog-icon-timer"></i> Pubblicare al {date}'
Sort: Ordine
Sort_Description: 'Modificare l''ordine delle etichette mostrate da questo widget.'

27
lang/it_IT.yml Normal file
View File

@ -0,0 +1,27 @@
it_IT:
SilverStripe\Blog\Forms\GridField\GridFieldBlogPostState:
Draft: 'Salva come Bozza in {date}'
Published: 'Pubblicato in {date}'
Timer: 'Pubblica il {date}'
SilverStripe\Blog\Model\Blog:
Categories: Categorie
Category: Categoria
Comments: Commenti
DESCRIPTION: 'Aggiunti un blog al tuo website'
EDITOR: Editor
FILTERDESCRIPTION_AUTHOR: 'Di {author}'
FILTERDESCRIPTION_CATEGORY: 'In categoria {category}'
FILTERDESCRIPTION_DATE: 'Il {date}'
FILTERDESCRIPTION_PAGE: 'Pagina {page}'
FILTERDESCRIPTION_TAG: 'Taggato con {tag}'
LumberjackTitle: 'Blog Posts'
NoPosts: 'Non ci sono post'
PERMISSIONS_CATEGORY: 'Permessi Blog'
Tagged: Taggato
has_many_Categories: Categorie
SilverStripe\Blog\Model\BlogMemberExtension:
BLOGPOSTS: 'Blog Posts'
TABBLOGPOSTS: 'Blog Posts'
SilverStripe\Blog\Model\BlogPost:
Categories: Categorie
many_many_Categories: Categorie

32
lang/lt.yml Normal file
View File

@ -0,0 +1,32 @@
lt:
SilverStripe\Blog\Admin\GridFieldCategorisationConfig:
Title: Pavadinimas
SilverStripe\Blog\Forms\GridField\GridFieldBlogPostState:
Modified: Pakeistas
SilverStripe\Blog\Model:
Title: Pavadinimas
SilverStripe\Blog\Model\Blog:
AND: ir
Archive: Archyvuoti
Comments: Komentarai
LumberjackTitle: 'Baziniai puslapiai'
PLURALNAME: 'Baziniai puslapiai'
Tags: Žymos
has_many_Tags: Žymos
SilverStripe\Blog\Model\BlogCategory:
Title: Pavadinimas
db_Title: Pavadinimas
SilverStripe\Blog\Model\BlogMemberExtension:
BLOGPOSTS: 'Baziniai puslapiai'
TABBLOGPOSTS: 'Baziniai puslapiai'
SilverStripe\Blog\Model\BlogObject:
Title: Pavadinimas
SilverStripe\Blog\Model\BlogPost:
AUTHOR: Autorius
DESCRIPTION: 'Standartinio turinio puslapis'
PLURALNAME: 'Baziniai puslapiai'
Tags: Žymos
many_many_Tags: Žymos
SilverStripe\Blog\Model\BlogTag:
Title: Pavadinimas
db_Title: Pavadinimas

26
lang/nb.yml Normal file
View File

@ -0,0 +1,26 @@
nb:
SilverStripe\Blog\Admin\GridFieldCategorisationConfig:
Posts: Meldinger
Title: Tittel
SilverStripe\Blog\Forms\GridField\GridFieldAddByDBField:
Add: 'Legg til {name}'
SilverStripe\Blog\Forms\GridField\GridFieldBlogPostState:
Modified: Endret
SilverStripe\Blog\Model:
Title: Tittel
SilverStripe\Blog\Model\Blog:
Archive: Arkiver
By: av
Comments: Kommentarer
Tags: Tags
has_many_Tags: Tags
SilverStripe\Blog\Model\BlogCategory:
db_Title: Tittel
SilverStripe\Blog\Model\BlogObject:
Title: Tittel
SilverStripe\Blog\Model\BlogPost:
AUTHOR: Forfatter
Tags: Tags
many_many_Tags: Tags
SilverStripe\Blog\Model\BlogTag:
db_Title: Tittel

168
lang/nl.yml Normal file
View File

@ -0,0 +1,168 @@
nl:
SilverStripe\Blog\Admin\GridFieldCategorisationConfig:
Posts: Artikels
Title: Titel
SilverStripe\Blog\Admin\GridFieldMergeAction:
MovePostsTo: 'Artikels verplaatsen naar'
SilverStripe\Blog\Forms\GridField\GridFieldAddByDBField:
Add: 'Voeg {name} toe'
AddFail: 'Kon geen {class} opslaan in de database.'
ButtonName: '{name}'
PermissionFail: 'Je hebt geen permissie om een {class} aan te maken.'
SilverStripe\Blog\Forms\GridField\GridFieldBlogPostState:
Draft: 'Opgeslagen als concept op {date}'
Modified: Aangepast
Published: 'Gepubliceerd op {date}'
Timer: 'Publiceer op {date}'
SilverStripe\Blog\Model:
Title: Titel
SilverStripe\Blog\Model\Blog:
AND: en
Archive: Archief
By: door
CONTRIBUTOR: Co-auteur
Categories: Categorieën
Categorisation: Categorisatie
Category: Categorie
Comments: Reacties
DESCRIPTION: 'Voegt een blog toe aan je site.'
EDITOR: Redacteur
FILTERDESCRIPTION_AUTHOR: 'Door {author}'
FILTERDESCRIPTION_CATEGORY: 'In categorie {category}'
FILTERDESCRIPTION_DATE: 'In {date}'
FILTERDESCRIPTION_PAGE: 'Pagina {page}'
FILTERDESCRIPTION_TAG: 'Getagd met {tag}'
LessThanAMinuteToRead: 'Minder dan een minuut om te lezen'
LumberjackTitle: 'Blog Artikelen'
MinutesToRead: 'Minuten om te lezen'
NoPosts: 'Er zijn geen blog artikelen'
PERMISSIONS_CATEGORY: 'Blog rechten'
PERMISSION_MANAGE_USERS_DESCRIPTION: 'Beheer gebruikers voor individuele blogs'
PERMISSION_MANAGE_USERS_HELP: 'Laat toewijzing toe van Redacteurs, Auteurs en Co-auteurs'
PLURALNAME: Blog
PLURALS:
one: 'Eén blogpagina'
other: '{count} blogpagina''s'
Posted: Geplaatst
PostedIn: 'Geplaatst in'
PostsByUser: 'Berichten van {firstname} {surname} bij {title}'
PostsPerPage: 'Artikelen per pagina'
ReadMoreAbout: 'Lees meer over ''{title}''...'
SINGULARNAME: Blog
Tag: Tag
Tagged: Getagd
Tags: Tags
UsersContributorsFieldDescription: "Co-auteurs hebben de mogelijkheid om artikelen te maken en te bewerken, maar niet te publiceren\n zonder toestemming van een Auteur. Het is ook niet mogelijk om andere auteur toe te kennen\n aan hun artikelen.<br />\n <br />\n Co-auteurs hebben deze rechten:<br />\n <br />\n Bewerken van artikelen die ze zelf geschreven hebben of aan toegekend zijn"
UsersEditorsFieldDescription: "Een Redacteur heeft het beheer over specifieke blogs (en alle artikelen die daaronder vallen).\n Behalve dat ze andere Redacteuren aan een blog kunnen toewijzen, kunnen ze de meeste instellingen\n van hun blog zelf beheren. <br /><br />\n Redacteuren hebben deze rechten:<br />\n <br />\n Bijwerken en publiceren van artikelen in hun blog<br />\n Aanpassen en publiceren van hun blog<br />\n Auteurs (ont)koppelen aan hun blog\n Co-auteurs (ont)koppelen aan hun blog<br />\n Een gebruiker instellen als auteur van een artikel"
UsersWritersFieldDescription: "Een Auteur heeft volledig beheer over artikelen die zij geschreven hebben of aan gekoppeld zijn. \nAuteurs kunnen geen artikelen beheren waar zij niet aan gekoppeld zijn.\n <br /><br />\n Auteurs hebben deze rechten:<br />\n <br />\n Bewerken of publiceren van artikelen die zij geschreven hebben of aan gekoppeld zijn<br />\n Een gebruiker (ont)koppelen als auteur van een artikel die zij geschreven hebben of aan gekoppeld zijn"
WRITER: Auteur
has_many_Categories: Categorieën
has_many_Tags: Tags
SilverStripe\Blog\Model\BlogCategory:
Duplicate: 'Een blog categorie met dezelfde naam bestaat al'
PLURALNAME: 'Blog Categorieën'
PLURALS:
one: 'Een Blog Categorie'
other: '{count} Blog Categorieën'
SINGULARNAME: 'Blog Categorie'
db_Title: Titel
db_URLSegment: 'URL segment'
has_one_Blog: Blog
SilverStripe\Blog\Model\BlogMemberExtension:
BLOGPOSTS: 'Blog Artikelen'
TABBLOGPOSTS: 'Blog Artikel'
db_URLSegment: 'URL segment'
SilverStripe\Blog\Model\BlogObject:
Title: Titel
SilverStripe\Blog\Model\BlogPost:
AUTHOR: Auteur
AdditionalCredits: Dankbetuigingen
AdditionalCredits_Description: 'Indien enkele van de auteurs geen toegang hebben tot dit CMS, kunnen ze hier worden toegevoegd. Scheid namen door middel van komma''s.'
Authors: Auteurs
CUSTOMSUMMARY: 'Voeg een eigen samenvatting toe'
Categories: Categorieën
FeaturedImage: 'Prominente Afbeelding'
PLURALNAME: Artikel
PLURALS:
one: 'Eén artikel'
other: '{count} artikelen'
PageTitleLabel: 'Artikel Titel'
PostOptions: 'Artikel opties'
PublishDate: Publicatiedatum
PublishDate_Description: 'Wordt op "nu" gezet indien gepubliceerd zonder waarde.'
SINGULARNAME: 'Blog Artikel'
SUMMARY_DESCRIPTION: 'Als er geen samenvatting ingevoerd wordt, dan worden de eerste 30 woorden gebruikt.'
Tags: Tags
many_many_Authors: Auteurs
many_many_Categories: Categorieën
many_many_Tags: Tags
SilverStripe\Blog\Model\BlogPostFeaturedExtension:
FEATURED: 'Dit artikel tonen in de Uitgelicht-widget'
SilverStripe\Blog\Model\BlogTag:
Duplicate: 'Een blog tag met dezelfde naam bestaat al.'
PLURALNAME: 'Blog Tags'
PLURALS:
one: 'Een Blog Tag'
other: '{count} Blog Tags'
SINGULARNAME: 'Blog Tag'
db_Title: Titel
db_URLSegment: 'URL segment'
has_one_Blog: Blog
SilverStripe\Blog\Widgets\BlogArchiveWidget:
ArchiveType: ArchiveType
Blog: Blog
NumberToDisplay: 'Aantal te tonen'
PLURALNAME: 'Blog Archief-widgets'
PLURALS:
one: 'Een Blog Archief-widget'
other: '{count} Blog Archief-widgets'
SINGULARNAME: 'Blog Archief-widget'
SilverStripe\Blog\Widgets\BlogCategoriesWidget:
Blog: Blog
Direction: Sorteerrichting
Direction_Description: 'Verander de sorteerrichting van categoriën getoond door deze widget.'
Limit: Limiet
Limit_Description: 'Limiteer het aantal categorieën getoond door deze widget (stel in op 0 om alle categorieën te tonen).'
PLURALNAME: 'Blog Categorie-widgets'
PLURALS:
one: 'Blog Categorie-widget'
other: '{count} Blog Categorie-widgets'
SINGULARNAME: 'Blog Categorie-widget'
Sort: Volgorde
Sort_Description: 'Verander de volgorde van categorieën getoond door deze widget.'
SilverStripe\Blog\Widgets\BlogFeaturedPostsWidget:
Blog: Blog
NumberOfPosts: 'Aantal berichten'
PLURALNAME: 'Uitgelichte berichten widgets'
PLURALS:
one: 'Een uitgelicht bericht widget'
other: '{count} uitgelichte berichten widgets'
SINGULARNAME: 'Uitgelicht bericht widget'
SilverStripe\Blog\Widgets\BlogRecentPostsWidget:
Blog: Blog
NumberOfPosts: 'Aantal Artikelen'
PLURALNAME: 'Blog Recente Artikelen-widgets'
PLURALS:
one: 'Een Blog Recente Artikelen-widget'
other: '{count} Blog Recente Artikelen-widgets'
SINGULARNAME: 'Blog Recente Artikelen-widget'
SilverStripe\Blog\Widgets\BlogTagsCloudWidget:
Blog: Blog
PLURALNAME: 'Blog Tags Cloud-widgets'
PLURALS:
one: 'Een Blog Tags Cloud-widget'
other: '{count} Blog Tags Cloud-widgets'
SINGULARNAME: 'Blog Tags Cloud-widget'
SilverStripe\Blog\Widgets\BlogTagsWidget:
Blog: Blog
Direction: Volgorde
Direction_Description: 'Verander de volgorde van tags getoond door deze widget.'
Limit: Limiet
Limit_Description: 'Limiteer het aantal tags getoond door deze widget (stel in op 0 om alle tags te tonen).'
PLURALNAME: 'Blog Tags-widgets'
PLURALS:
one: 'Een Blog Tags-widget'
other: '{count} Blog Tags-widgets'
SINGULARNAME: 'Blog Tags-widget'
Sort: Volgorde
Sort_Description: 'Verander de volgorde van tags getoond door deze widget.'

33
lang/pl.yml Normal file
View File

@ -0,0 +1,33 @@
pl:
SilverStripe\Blog\Admin\GridFieldCategorisationConfig:
Posts: Posty
Title: Tytuł
SilverStripe\Blog\Forms\GridField\GridFieldAddByDBField:
Add: 'Dodaj {name}'
SilverStripe\Blog\Forms\GridField\GridFieldBlogPostState:
Modified: Zmodyfikowany
SilverStripe\Blog\Model:
Title: Tytuł
SilverStripe\Blog\Model\Blog:
AND: i
Archive: Archiwizuj
By: przez
Comments: Komentarze
PLURALNAME: 'Podstawowe strony'
Tags: 'Tagi:'
has_many_Tags: 'Tagi:'
SilverStripe\Blog\Model\BlogCategory:
db_Title: Tytuł
db_URLSegment: URL
SilverStripe\Blog\Model\BlogMemberExtension:
db_URLSegment: URL
SilverStripe\Blog\Model\BlogObject:
Title: Tytuł
SilverStripe\Blog\Model\BlogPost:
AUTHOR: Autor
PLURALNAME: 'Podstawowe strony'
Tags: 'Tagi:'
many_many_Tags: 'Tagi:'
SilverStripe\Blog\Model\BlogTag:
db_Title: Tytuł
db_URLSegment: URL

25
lang/pl_PL.yml Normal file
View File

@ -0,0 +1,25 @@
pl_PL:
SilverStripe\Blog\Admin\GridFieldCategorisationConfig:
Title: Tytuł
SilverStripe\Blog\Forms\GridField\GridFieldBlogPostState:
Modified: Zmodyfikowano
SilverStripe\Blog\Model:
Title: Tytuł
SilverStripe\Blog\Model\Blog:
Archive: Archiwizuj
Comments: Komentarze
FILTERDESCRIPTION_PAGE: 'Strona {page}'
PLURALNAME: 'Podstawowa strona'
SilverStripe\Blog\Model\BlogCategory:
db_Title: Tytuł
db_URLSegment: URL
SilverStripe\Blog\Model\BlogMemberExtension:
db_URLSegment: URL
SilverStripe\Blog\Model\BlogObject:
Title: Tytuł
SilverStripe\Blog\Model\BlogPost:
AUTHOR: Autor
PLURALNAME: 'Podstawowa strona'
SilverStripe\Blog\Model\BlogTag:
db_Title: Tytuł
db_URLSegment: URL

View File

@ -1,45 +1,118 @@
ru:
Blog:
SilverStripe\Blog\Admin\GridFieldCategorisationConfig:
Posts: Сообщения
Title: Заголовок
SilverStripe\Blog\Forms\GridField\GridFieldAddByDBField:
Add: 'Добавить {name}'
AddFail: 'Не удалось сохранить {class} в базе данных.'
PermissionFail: 'У вас нет прав для создания элемента {class}.'
SilverStripe\Blog\Forms\GridField\GridFieldBlogPostState:
Draft: 'Черновик сохранен {date}'
Modified: Измененные
Published: 'Опубликовано {date}'
Timer: 'Опубликовать {date}'
SilverStripe\Blog\Model:
Title: Заголовок
SilverStripe\Blog\Model\Blog:
AND: и
Archive: Архив
By: 'автор:'
CONTRIBUTOR: Автор
Categories: Категории
Category: Категория
Comments: Комментарии
DESCRIPTION: 'Добавляет к сайту блог.'
PLURALNAME: Блоги
Posted: Отправлено
SINGULARNAME: Блог
Tag: Метка
Tagged: Метки
Tags: Метки
By: 'автор:'
EDITOR: Редактор
FILTERDESCRIPTION_AUTHOR: 'Автор: {author}'
FILTERDESCRIPTION_CATEGORY: 'В категории: {category}'
FILTERDESCRIPTION_DATE: 'Дата: {date}'
FILTERDESCRIPTION_PAGE: 'Страница {page}'
FILTERDESCRIPTION_TAG: 'С метками {tag}'
BlogPost:
SINGULARNAME: 'Запись в блоге'
LumberjackTitle: 'Записи в блоге'
NoPosts: 'В блоге нет записей'
PERMISSIONS_CATEGORY: 'Права доступа к содержимому блога'
PERMISSION_MANAGE_USERS_DESCRIPTION: 'Управление пользователями для индивидуальных блогов'
PERMISSION_MANAGE_USERS_HELP: 'Разрешить назначать Редакторов, Писателей и Авторов к блогам'
PLURALNAME: 'Базовые страницы'
Posted: Отправлено
PostedIn: Отправлено
PostsPerPage: 'Записей на странице'
ReadMoreAbout: 'Узнать больше о ''{title}''...'
SINGULARNAME: Блог
Tag: Метка
Tagged: Метки
Tags: Метки
WRITER: Автор
has_many_Categories: Категории
has_many_Tags: Метки
SilverStripe\Blog\Model\BlogCategory:
PLURALNAME: 'Категории Блога'
SINGULARNAME: 'Категория Блога'
db_Title: Заголовок
has_one_Blog: Блог
SilverStripe\Blog\Model\BlogMemberExtension:
BLOGPOSTS: 'Базовые страницы'
TABBLOGPOSTS: 'Базовые страницы'
SilverStripe\Blog\Model\BlogObject:
Title: Заголовок
SilverStripe\Blog\Model\BlogPost:
AUTHOR: Автор
AdditionalCredits: 'Дополнительные сведения'
AdditionalCredits_Description: 'Если некоторые авторы этого сообщения не имеют доступа к админке укажите их имена здесь. Для разделения имён используется запятая.'
Authors: Авторы
BlogRecentPostsWidget:
CUSTOMSUMMARY: 'Добавить уникальное описание'
Categories: Категории
FeaturedImage: Изображение
PLURALNAME: 'Базовые страницы'
PageTitleLabel: 'Заголовок Сообщения'
PublishDate: 'Дата публикации'
PublishDate_Description: 'Будет использована текущая дата если не будет указанно значение.'
SINGULARNAME: 'Запись в блоге'
SUMMARY_DESCRIPTION: 'Если не указанно описание будут использованы первые 30 слов.'
Tags: Метки
many_many_Authors: Авторы
many_many_Categories: Категории
many_many_Tags: Метки
SilverStripe\Blog\Model\BlogTag:
PLURALNAME: 'Тэги Блога'
SINGULARNAME: 'Тэг Блога'
db_Title: Заголовок
has_one_Blog: Блог
SilverStripe\Blog\Widgets\BlogArchiveWidget:
ArchiveType: 'Тип архива'
Blog: Блог
NumberToDisplay: 'Отображать:'
PLURALNAME: 'Виджеты архива'
SINGULARNAME: 'Виджет архива'
SilverStripe\Blog\Widgets\BlogCategoriesWidget:
Blog: Блог
Direction: Направление
Direction_Description: 'Изменять направление сортировки категорий отображаемых в этом блоке.'
Limit: Ограничение
Limit_Description: 'Ограничить количество категорий отображаемых в этом блоке (укажите 0 чтобы отображать все категории).'
PLURALNAME: 'Блоки категорий блога'
SINGULARNAME: 'Блок категорий блога'
Sort: Сортировать
Sort_Description: 'Изменить порядок категорий в этом блоке.'
SilverStripe\Blog\Widgets\BlogFeaturedPostsWidget:
Blog: Блог
NumberOfPosts: 'Количество записей'
BlogTag:
PLURALNAME: 'Метки'
SINGULARNAME: 'Метка'
Title: Заголовок
BlogTagsWidget:
SilverStripe\Blog\Widgets\BlogRecentPostsWidget:
Blog: Блог
NumberOfPosts: 'Количество записей'
PLURALNAME: 'Блоки последних сообщений блога'
SINGULARNAME: 'Блок последних сообщений блога'
SilverStripe\Blog\Widgets\BlogTagsCloudWidget:
Blog: Блог
PLURALNAME: 'Блоки облака тэгов'
SINGULARNAME: 'Блок облака тэгов'
SilverStripe\Blog\Widgets\BlogTagsWidget:
Blog: Блог
Direction: Направление
Direction_Description: 'Изменить направление сортировки тэгов отображаемых в этом блоке.'
Limit: Ограничение
Limit_Description: 'Ограничить количество тэгов в этом блоке (укажите 0 чтобы отобразить все тэги).'
PLURALNAME: 'Виджеты для меток блога'
SINGULARNAME: 'Виджет для меток блога'
GridFieldAddByDBField:
Add: 'Добавить {name}'
AddFail: 'Не удалось сохранить {class} в базе данных.'
PermissionFail: 'У вас нет прав для создания элемента {class}.'
GridFieldBlogPostState:
Draft: '<i class="btn-icon gridfield-icon btn-icon-pencil"></i> Черновик сохранен {date}'
Published: '<i class="btn-icon gridfield-icon btn-icon-accept"></i> Опубликовано {date}'
Timer: '<i class="gridfield-icon blog-icon-timer"></i> Опубликовать {date}'
Sort: Сортировать
Sort_Description: 'Изменить порядок тэгов в этом блоке.'

125
lang/sk.yml Normal file
View File

@ -0,0 +1,125 @@
sk:
SilverStripe\Blog\Admin\GridFieldCategorisationConfig:
Title: Názov
SilverStripe\Blog\Forms\GridField\GridFieldAddByDBField:
Add: 'Pridať {name}'
AddFail: 'Nie je možné uložiť {class} do databázy.'
PermissionFail: 'Nemáte oprávnenie na vytvorenie {class}.'
SilverStripe\Blog\Forms\GridField\GridFieldBlogPostState:
Modified: Zmenené
SilverStripe\Blog\Model:
Title: Názov
SilverStripe\Blog\Model\Blog:
AND: a
Archive: Archív
By: ' od'
CONTRIBUTOR: Prispievateľ
Categories: Kategórie
Category: Kategória
Comments: Komentáre
DESCRIPTION: 'Pridá blog na stránku.'
EDITOR: Vydavateľ
FILTERDESCRIPTION_AUTHOR: '{author}'
FILTERDESCRIPTION_CATEGORY: 'V kategórii {category}'
FILTERDESCRIPTION_DATE: '{date}'
FILTERDESCRIPTION_PAGE: 'Strana {page}'
FILTERDESCRIPTION_TAG: 'Štítkovaný {tag}'
LumberjackTitle: 'Základné stránky'
NoPosts: 'Žiadne príspevky'
PERMISSIONS_CATEGORY: 'Práva blogu'
PERMISSION_MANAGE_USERS_DESCRIPTION: 'Správa užívateľov pre jednotlivé blogy'
PERMISSION_MANAGE_USERS_HELP: 'Umožniť priradenie vydavateľov, spisovateľov alebo prispievateľov do blogu.'
PLURALNAME: 'Základné stránky'
Posted: Uverejnené
PostedIn: 'Uverejnené v'
PostsPerPage: 'Príspevky na stránke'
ReadMoreAbout: 'Čítať viac o ''{title}''...'
SINGULARNAME: Blog
Tag: Štítok
Tagged: Oštítkované
Tags: Štítky
WRITER: Spisovateľ
has_many_Categories: Kategórie
has_many_Tags: Štítky
SilverStripe\Blog\Model\BlogCategory:
PLURALNAME: 'Kategórie blogu'
SINGULARNAME: 'Kategória blogu'
Title: Názov
belongs_many_many_BlogPosts: 'Príspevky v blogu'
db_Title: Názov
db_URLSegment: 'Časť URL'
has_one_Blog: Blog
SilverStripe\Blog\Model\BlogMemberExtension:
BLOGPOSTS: 'Základné stránky'
TABBLOGPOSTS: 'Základné stránky'
belongs_many_many_BlogPosts: 'Príspevky v blogu'
db_BlogProfileSummary: 'Prehľad profilu blogu'
db_URLSegment: 'Časť URL'
has_one_BlogProfileImage: 'Profilový obrázok blogu'
SilverStripe\Blog\Model\BlogObject:
Title: Názov
SilverStripe\Blog\Model\BlogPost:
AUTHOR: Autor
AdditionalCredits: 'Doplnkoví autori'
AdditionalCredits_Description: 'Ak niektorí autori tohto príspevku nemajú prístup k CMS, zadajte ich mená sem. Viacero autorov môžete oddeliť čiarkou.'
Authors: 'Ak niektorí autori tohto príspevku nemajú prístup k CMS, zadajte ich mená sem. Viacero autorov môžete oddeliť čiarkou.'
CUSTOMSUMMARY: 'Pridať vlastné zhrnutie'
Categories: Kategórie
DESCRIPTION: 'Obyčajná jednoduchá stránka s vlastným obsahom.'
FeaturedImage: 'Hlavný obrázok'
PLURALNAME: 'Základné stránky'
PageTitleLabel: 'Názov príspevku'
PublishDate: 'Dátum publikovania'
PublishDate_Description: 'V prípade zverejnenia bez hodnoty bude nastavený aktuálny dátum a čas.'
SINGULARNAME: 'Príspevok v blogu'
SUMMARY_DESCRIPTION: 'Ak zhrnutie nie je uvedené, bude použitých prvých 30 slov z obsahu.'
Tags: Štítky
many_many_Authors: 'Ak niektorí autori tohto príspevku nemajú prístup k CMS, zadajte ich mená sem. Viacero autorov môžete oddeliť čiarkou.'
many_many_Categories: Kategórie
many_many_Tags: Štítky
SilverStripe\Blog\Model\BlogTag:
PLURALNAME: 'Štítky blogu'
SINGULARNAME: 'Štítok blogu'
Title: Názov
belongs_many_many_BlogPosts: 'Príspevky v blogu'
db_Title: Názov
db_URLSegment: 'Časť URL'
has_one_Blog: Blog
SilverStripe\Blog\Widgets\BlogArchiveWidget:
ArchiveType: 'Typ archívu'
Blog: Blog
NumberToDisplay: 'Počet na zobrazenie'
PLURALNAME: 'Widgety archívu blogu'
SINGULARNAME: 'Widget archívu blogu'
SilverStripe\Blog\Widgets\BlogCategoriesWidget:
Blog: Blog
Direction: Smer
Direction_Description: 'Zmení smer usporiadania kategórií na tomto widgete.'
Limit: 'Max. počet'
Limit_Description: 'Obmedzí počet zobrazených kategórií na tomto widgete (nastavením na 0 sa zobrazujú všetky kategórie).'
PLURALNAME: 'Widgety kategórií blogu'
SINGULARNAME: 'Widget kategórií blogu'
Sort: Usporiadanie
Sort_Description: 'Zmení usporiadanie kategórií na tomto widgete.'
SilverStripe\Blog\Widgets\BlogFeaturedPostsWidget:
Blog: Blog
NumberOfPosts: 'Počet príspevkov'
SilverStripe\Blog\Widgets\BlogRecentPostsWidget:
Blog: Blog
NumberOfPosts: 'Počet príspevkov'
PLURALNAME: 'Widgety nedávnych príspevkov blogu'
SINGULARNAME: 'Widget nedávnych príspevkov blogu'
SilverStripe\Blog\Widgets\BlogTagsCloudWidget:
Blog: Blog
PLURALNAME: 'Widgety používaných štítkov blogu'
SINGULARNAME: 'Widget používaných štítkov blogu'
SilverStripe\Blog\Widgets\BlogTagsWidget:
Blog: Blog
Direction: Smer
Direction_Description: 'Zmení smer usporiadania štítkov na tomto widgete.'
Limit: 'Max. počet'
Limit_Description: 'Obmedzí počet zobrazených štítkov na tomto widgete (nastavením na 0 sa zobrazujú všetky štítky).'
PLURALNAME: 'Widgety štítkov blogu'
SINGULARNAME: 'Widget štítkov blogu'
Sort: Usporiadanie
Sort_Description: 'Zmení usporiadanie štítkov na tomto widgete.'

112
lang/sk_SK.yml Normal file
View File

@ -0,0 +1,112 @@
sk_SK:
SilverStripe\Blog\Admin\GridFieldCategorisationConfig:
Title: Názov
SilverStripe\Blog\Forms\GridField\GridFieldAddByDBField:
Add: 'Pridať {name}'
AddFail: 'Nie je možné uložiť {class} do databázy.'
PermissionFail: 'Nemáte oprávnenie na vytvorenie {class}.'
SilverStripe\Blog\Model:
Title: Názov
SilverStripe\Blog\Model\Blog:
AND: a
Archive: Archív
By: ' od'
CONTRIBUTOR: Prispievateľ
Categories: Kategórie
Category: Kategória
Comments: Komentáre
DESCRIPTION: 'Pridá blog na stránku.'
EDITOR: Vydavateľ
FILTERDESCRIPTION_AUTHOR: '{author}'
FILTERDESCRIPTION_CATEGORY: 'V kategórii {category}'
FILTERDESCRIPTION_DATE: '{date}'
FILTERDESCRIPTION_PAGE: 'Stránka {page}'
FILTERDESCRIPTION_TAG: 'Štítkovaný {tag}'
LumberjackTitle: 'Príspevky v blogu'
NoPosts: 'Žiadne príspevky'
PERMISSIONS_CATEGORY: 'Práva blogu'
PERMISSION_MANAGE_USERS_DESCRIPTION: 'Správa užívateľov pre jednotlivé blogy'
PERMISSION_MANAGE_USERS_HELP: 'Umožniť priradenie vydavateľov, spisovateľov alebo prispievateľov do blogu.'
PLURALNAME: 'Základné stránky'
Posted: Uverejnené
PostedIn: 'Uverejnené v'
PostsPerPage: 'Príspevky na stránke'
ReadMoreAbout: 'Čítať viac o ''{title}''...'
SINGULARNAME: Blog
Tag: Štítok
Tagged: Oštítkované
Tags: Štítky
WRITER: Spisovateľ
has_many_Categories: Kategórie
has_many_Tags: Štítky
SilverStripe\Blog\Model\BlogCategory:
PLURALNAME: 'Kategórie blogu'
SINGULARNAME: 'Kategória blogu'
db_Title: Názov
has_one_Blog: Blog
SilverStripe\Blog\Model\BlogMemberExtension:
BLOGPOSTS: 'Príspevky v blogu'
TABBLOGPOSTS: 'Príspevky v blogu'
SilverStripe\Blog\Model\BlogObject:
Title: Názov
SilverStripe\Blog\Model\BlogPost:
AUTHOR: Autor
AdditionalCredits: 'Doplnkoví autori'
AdditionalCredits_Description: 'Ak niektorí autori tohto príspevku nemajú prístup k CMS, zadajte ich mená sem. Viacero autorov môžete oddeliť čiarkou.'
Authors: Autori
CUSTOMSUMMARY: 'Pridať vlastné zhrnutie'
Categories: Kategórie
FeaturedImage: 'Hlavný obrázok'
PLURALNAME: 'Základné stránky'
PageTitleLabel: 'Názov príspevku'
PublishDate: 'Dátum publikovania'
PublishDate_Description: 'V prípade zverejnenia bez hodnoty bude nastavený aktuálny dátum a čas.'
SINGULARNAME: 'Príspevok v blogu'
SUMMARY_DESCRIPTION: 'Ak zhrnutie nie je uvedené, bude použitých prvých 30 slov z obsahu.'
Tags: Štítky
many_many_Authors: Autori
many_many_Categories: Kategórie
many_many_Tags: Štítky
SilverStripe\Blog\Model\BlogTag:
PLURALNAME: 'Štítky blogu'
SINGULARNAME: 'Štítok blogu'
db_Title: Názov
has_one_Blog: Blog
SilverStripe\Blog\Widgets\BlogArchiveWidget:
ArchiveType: 'Typ archívu'
Blog: Blog
NumberToDisplay: 'Počet na zobrazenie'
PLURALNAME: 'Widgety archívu blogu'
SINGULARNAME: 'Widget archívu blogu'
SilverStripe\Blog\Widgets\BlogCategoriesWidget:
Blog: Blog
Direction: Smer
Direction_Description: 'Zmení smer usporiadania kategórií na tomto widgete.'
Limit: 'Max. počet'
Limit_Description: 'Obmedzí počet zobrazených kategórií na tomto widgete (nastavením na 0 sa zobrazujú všetky kategórie).'
PLURALNAME: 'Widgety kategórií blogu'
SINGULARNAME: 'Widget kategórií blogu'
Sort: Usporiadanie
Sort_Description: 'Zmení usporiadanie kategórií na tomto widgete.'
SilverStripe\Blog\Widgets\BlogFeaturedPostsWidget:
Blog: Blog
NumberOfPosts: 'Počet príspevkov'
SilverStripe\Blog\Widgets\BlogRecentPostsWidget:
Blog: Blog
NumberOfPosts: 'Počet príspevkov'
PLURALNAME: 'Widgety nedávnych príspevkov blogu'
SINGULARNAME: 'Widget nedávnych príspevkov blogu'
SilverStripe\Blog\Widgets\BlogTagsCloudWidget:
Blog: Blog
PLURALNAME: 'Widgety používaných štítkov blogu'
SINGULARNAME: 'Widget používaných štítkov blogu'
SilverStripe\Blog\Widgets\BlogTagsWidget:
Blog: Blog
Direction: Smer
Direction_Description: 'Zmení smer usporiadania štítkov na tomto widgete.'
Limit: 'Max. počet'
Limit_Description: 'Obmedzí počet zobrazených štítkov na tomto widgete (nastavením na 0 sa zobrazujú všetky štítky).'
PLURALNAME: 'Widgety štítkov blogu'
SINGULARNAME: 'Widget štítkov blogu'
Sort: Usporiadanie
Sort_Description: 'Zmení usporiadanie štítkov na tomto widgete.'

37
lang/sl.yml Normal file
View File

@ -0,0 +1,37 @@
sl:
SilverStripe\Blog\Admin\GridFieldCategorisationConfig:
Title: Naziv
SilverStripe\Blog\Forms\GridField\GridFieldAddByDBField:
Add: 'Dodaj {name}'
SilverStripe\Blog\Forms\GridField\GridFieldBlogPostState:
Modified: Spremenjeno
SilverStripe\Blog\Model:
Title: Naziv
SilverStripe\Blog\Model\Blog:
AND: in
Archive: Arhiv
Comments: Komentarji
FILTERDESCRIPTION_PAGE: 'Stran {page}'
PLURALNAME: 'Izvorna stran'
SilverStripe\Blog\Model\BlogCategory:
belongs_many_many_BlogPosts: 'Zapisi na blogu'
db_Title: Naziv
db_URLSegment: 'Naslov URL'
SilverStripe\Blog\Model\BlogMemberExtension:
belongs_many_many_BlogPosts: 'Zapisi na blogu'
db_BlogProfileSummary: 'Povzetek blogerskega profila'
db_URLSegment: 'Naslov URL'
has_one_BlogProfileImage: 'Osebna podoba'
SilverStripe\Blog\Model\BlogObject:
Title: Naziv
SilverStripe\Blog\Model\BlogPost:
AUTHOR: Avtor
PLURALNAME: 'Izvorna stran'
SilverStripe\Blog\Model\BlogTag:
belongs_many_many_BlogPosts: 'Zapisi na blogu'
db_Title: Naziv
db_URLSegment: 'Naslov URL'
SilverStripe\Blog\Widgets\BlogCategoriesWidget:
Sort: Razvrščanje
SilverStripe\Blog\Widgets\BlogTagsWidget:
Sort: Razvrščanje

120
lang/sv.yml Normal file
View File

@ -0,0 +1,120 @@
sv:
SilverStripe\Blog\Admin\GridFieldCategorisationConfig:
Posts: Inlägg
Title: Titel
SilverStripe\Blog\Forms\GridField\GridFieldAddByDBField:
Add: 'Lägg till {name}'
AddFail: 'Det går inte att spara {class} till databasen .'
PermissionFail: 'Du har inte behörighet att skapa en {class} .'
SilverStripe\Blog\Forms\GridField\GridFieldBlogPostState:
Draft: 'Sparad som utkast den {date}'
Modified: Ändrad
Published: 'Publicerad den {date}'
Timer: 'Publicerad den {date}'
SilverStripe\Blog\Model:
Title: Titel
SilverStripe\Blog\Model\Blog:
AND: och
Archive: Arkiv
By: av
CONTRIBUTOR: Bidragsgivare
Categories: Kategorier
Category: Kategori
Comments: Kommentarer
DESCRIPTION: 'Lägger till en blog på din hemsida.'
EDITOR: Redaktör
FILTERDESCRIPTION_AUTHOR: 'Av {author}'
FILTERDESCRIPTION_CATEGORY: 'I kategori {category}'
FILTERDESCRIPTION_DATE: 'På {date}'
FILTERDESCRIPTION_PAGE: 'Sida {page}'
FILTERDESCRIPTION_TAG: 'Taggat med {tag}'
LumberjackTitle: Bloginlägg
NoPosts: 'Det finns inga bloginlägg'
PERMISSIONS_CATEGORY: 'Blogg rättigheter'
PERMISSION_MANAGE_USERS_DESCRIPTION: 'Hantera användare för enskilda bloggar'
PERMISSION_MANAGE_USERS_HELP: 'Tillåt tilldelning av redaktörer , författare , eller bidragsgivare till bloggar'
PLURALNAME: Bas-sidor
Posted: Postat
PostedIn: 'Postat den'
PostsPerPage: 'Blogginlägg per sida'
ReadMoreAbout: 'Läs mer om ''{title}''...'
SINGULARNAME: Blogg
Tag: Tagg
Tagged: Taggad
Tags: Taggar
WRITER: Författare
has_many_Categories: Kategorier
has_many_Tags: Taggar
SilverStripe\Blog\Model\BlogCategory:
Duplicate: 'En bloggkategori finns redan med det namnet.'
PLURALNAME: 'Blogg Kategorier'
SINGULARNAME: 'Blogg Kategori'
db_Title: Titel
has_one_Blog: Blogg
SilverStripe\Blog\Model\BlogMemberExtension:
BLOGPOSTS: Blogginlägg
TABBLOGPOSTS: Blogginlägg
SilverStripe\Blog\Model\BlogObject:
Title: Titel
SilverStripe\Blog\Model\BlogPost:
AUTHOR: Författare
AdditionalCredits: 'Ytterligare erkännanden'
AdditionalCredits_Description: 'Om vissa författare till det här inlägget inte har CMS-åtkomst anger du deras namn (en) här. Du kan separera flera namn med komma.'
Authors: Författare
CUSTOMSUMMARY: 'Lägg till en anpassad sammanfattning'
Categories: Kategorier
FeaturedImage: 'Utvald bild'
PLURALNAME: Bas-sidor
PageTitleLabel: Blogginläggstitel
PublishDate: 'Publicerat datum'
PublishDate_Description: 'Kommer att sättas till "nu" om publiceras utan ett värde .'
SINGULARNAME: Bloginlägg
SUMMARY_DESCRIPTION: 'Om ingen sammanfattning anges, kommer de första 30 orden att användas .'
Tags: Taggar
many_many_Authors: Författare
many_many_Categories: Kategorier
many_many_Tags: Taggar
SilverStripe\Blog\Model\BlogTag:
Duplicate: 'En tag med det här namnet är redan tillagd'
PLURALNAME: 'Blogg taggar'
SINGULARNAME: 'Blogg tag'
db_Title: Titel
has_one_Blog: Blogg
SilverStripe\Blog\Widgets\BlogArchiveWidget:
ArchiveType: ArkivTyp
Blog: Blogg
NumberToDisplay: 'Antal att visa'
PLURALNAME: 'Blogg Arkiv-Widgets'
SINGULARNAME: 'Blogg Arkiv-Widget'
SilverStripe\Blog\Widgets\BlogCategoriesWidget:
Blog: Blogg
Direction: Ordning
Direction_Description: 'Ändra ordningen av kategorier som visas av denna widget.'
Limit: Begränsa
Limit_Description: 'Begränsa antalet kategorier som visas av denna widget (sätt till 0 för att visa alla kategorier).'
PLURALNAME: 'Blogg Kategorier-Widgets'
SINGULARNAME: 'Blogg Kategori-Widget'
Sort: Sortera
Sort_Description: 'Ändra ordningen av kategorier som visas av denna widget.'
SilverStripe\Blog\Widgets\BlogFeaturedPostsWidget:
Blog: Blogg
NumberOfPosts: 'Antal inlägg'
SilverStripe\Blog\Widgets\BlogRecentPostsWidget:
Blog: Blogg
NumberOfPosts: 'Antal inlägg'
PLURALNAME: 'Blogg Senaste Inläggs-Widget'
SINGULARNAME: 'Blogg Senaste Inläggs-Widget'
SilverStripe\Blog\Widgets\BlogTagsCloudWidget:
Blog: Blogg
PLURALNAME: 'Cloud-widgets för taggar'
SINGULARNAME: 'Cloud-widget för tagg'
SilverStripe\Blog\Widgets\BlogTagsWidget:
Blog: Blogg
Direction: Ordning
Direction_Description: 'Ändra riktningen av ordningen av taggar som visas av denna widget.'
Limit: Begränsa
Limit_Description: 'Begränsa antalet taggar som visas av denna widget (sätt till 0 för att visa alla taggar).'
PLURALNAME: 'Blogg taggar Widgets'
SINGULARNAME: 'Blogg taggar Widget'
Sort: Sortera
Sort_Description: 'Ändra ordningen av taggar som visas av denna widget.'

27
lang/zh.yml Normal file
View File

@ -0,0 +1,27 @@
zh:
SilverStripe\Blog\Admin\GridFieldCategorisationConfig:
Title: 题目
SilverStripe\Blog\Forms\GridField\GridFieldAddByDBField:
Add: '添加 {name}'
SilverStripe\Blog\Forms\GridField\GridFieldBlogPostState:
Modified: 已修改
SilverStripe\Blog\Model:
Title: 题目
SilverStripe\Blog\Model\Blog:
Archive: 归档
Comments: 评论
PLURALNAME: 基本页面
Tags: 标签
has_many_Tags: 标签
SilverStripe\Blog\Model\BlogCategory:
db_Title: 题目
SilverStripe\Blog\Model\BlogObject:
Title: 题目
SilverStripe\Blog\Model\BlogPost:
AUTHOR: 作者
FeaturedImage: 特色图片
PLURALNAME: 基本页面
Tags: 标签
many_many_Tags: 标签
SilverStripe\Blog\Model\BlogTag:
db_Title: 题目

10
license.md Normal file
View File

@ -0,0 +1,10 @@
Copyright (c) 2018, Michael Strong
All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

38
package.json Normal file
View File

@ -0,0 +1,38 @@
{
"name": "silverstripe-blog",
"version": "3.0.0",
"description": "A fresh take on blogging in Silverstripe set out to tackle the issue of a cluttered Site Tree",
"scripts": {
"build": "yarn && yarn lint && NODE_ENV=production webpack -p --bail --progress",
"dev": "NODE_ENV=development webpack --progress",
"watch": "NODE_ENV=development webpack --watch --progress",
"css": "WEBPACK_CHILD=css npm run build",
"lint": "yarn lint-js && yarn lint-sass",
"lint-js": "eslint client/src",
"lint-js-fix": "eslint client/src --fix",
"lint-sass": "sass-lint client/src",
"test": "true"
},
"repository": {
"type": "git",
"url": "git+https://github.com/silverstripe/silverstripe-blog.git"
},
"keywords": [
"silverstripe",
"blog"
],
"author": "SilverStripe Ltd",
"license": "BSD-2-Clause",
"bugs": {
"url": "https://github.com/silverstripe/silverstripe-blog/issues"
},
"homepage": "https://github.com/silverstripe/silverstripe-blog#readme",
"dependencies": {},
"peerDependencies": {
"jquery": "^3"
},
"devDependencies": {
"@silverstripe/eslint-config": "^0.0.5",
"@silverstripe/webpack-config": "^1.3"
}
}

15
phpcs.xml.dist Normal file
View File

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<ruleset name="SilverStripe">
<description>CodeSniffer ruleset for SilverStripe coding conventions.</description>
<file>src</file>
<file>tests</file>
<!-- base rules are PSR-2 -->
<rule ref="PSR2" >
<!-- Current exclusions -->
<exclude name="PSR1.Methods.CamelCapsMethodName" />
<exclude name="PSR1.Files.SideEffects.FoundWithSymbols" />
</rule>
</ruleset>

16
phpunit.xml.dist Normal file
View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<phpunit bootstrap="vendor/silverstripe/cms/tests/bootstrap.php" colors="true">
<testsuites>
<testsuite name="blog">
<directory>tests/</directory>
</testsuite>
</testsuites>
<filter>
<whitelist addUncoveredFilesFromWhitelist="true">
<directory suffix=".php">src/</directory>
<exclude>
<directory suffix=".php">tests/</directory>
</exclude>
</whitelist>
</filter>
</phpunit>

View File

@ -1,15 +0,0 @@
.no-sidebar .content-container.size3of4 {
width: 75%;
}
.blog-entry .post-image img {
width: 98.75%;
}
.blog-sidebar .WidgetHolder ul {
margin-left: 0;
li {
list-style-type: none;
}
}

View File

@ -1,191 +0,0 @@
/**
* CMS Styles
*/
/**
* Include Compass framework
*/
@import "compass";
/*
* Sprite maps & Icons
*/
@import "compass/utilities/sprites/base";
@import "blog-icon/*.png";
// buttons
.gridfield-icon {
@include all-blog-icon-sprites;
}
#FeaturedImage .middleColumn {
clear: none;
float: left;
}
.blog-admin-sidebar {
width: 280px;
border-right: none;
border-left: 1px solid #C0C0C2;
position: absolute;
right: 0px;
bottom: 0px;
height: 100%;
.cms-panel-toggle a {
text-align: left;
}
~ .blog-admin-outer {
width: 100%;
padding-right: 280px;
position: absolute;
height: 100%;
overflow-y: hidden;
overflow-x: hidden;
box-sizing: border-box;
> .ss-tabset {
position: relative;
overflow: auto;
height: 100%;
width: 100%;
#Title {
label {
float: none;
}
.middleColumn, input {
width: 100%;
max-width: 100%;
margin-left: 0;
}
}
}
}
.cms-content-view {
> .field {
+ .field {
margin-top: 10px;
}
&.urlsegment {
.preview {
padding-top: 0;
line-height: 25px;
}
.edit {
float: right;
}
}
&.datetime {
> .middleColumn {
> .date {
width: 60%;
}
> .time {
width: 36%;
float: right;
}
.middleColumn, input {
width: 100%;
}
}
}
}
}
&.collapsed {
~ .blog-admin-outer {
padding-right: 41px;
}
}
&.cms-content-tools {
.cms-panel-content {
width: auto;
}
}
}
.toggle-description {
text-indent: -1000000px;
display: inline-block;
background: url("../images/information.png") no-repeat center center;
width: 20px;
height: 20px;
margin-left: 4px;
}
.middleColumn.toggle-description-correct-middle {
margin-left: 0;
float: left;
width: 416px;
}
label.right.toggle-description-correct-right {
display: inline-block;
margin-left: 0;
clear: none;
float: left;
}
.description.toggle-description-correct-description {
width: 416px;
padding: 12px 0;
}
.custom-summary {
.ui-accordion-content .field {
margin: 0;
}
.ui-accordion-content,
.ui-accordion-content .field {
padding: 0;
}
.ui-icon-triangle-1-e {
background-position: -16px -128px;
}
}
.cms table.ss-gridfield-table {
tr td.MergeAction {
width: 225px;
a {
display: block;
height: 100%;
width: 100%;
}
select {
width: 150px;
}
}
}
.cms-content-actions,
.cms-preview-controls {
z-index: 999;
}
.blog-cms-categorisation {
.MergeActionReveal {
margin-left: 10px;
}
.MergeActionReveal:after {
content: '';
background: url('../images/move-icon.png');
display: inline-block;
height: 16px;
width: 16px;
margin-left: 4px;
}
}

View File

@ -0,0 +1,70 @@
<?php
namespace SilverStripe\Blog\Admin;
use SilverStripe\Blog\Forms\GridField\GridFieldAddByDBField;
use SilverStripe\Blog\Model\CategorisationObject;
use SilverStripe\Forms\GridField\GridFieldAddNewButton;
use SilverStripe\Forms\GridField\GridFieldConfig_RecordEditor;
use SilverStripe\Forms\GridField\GridFieldDataColumns;
use SilverStripe\ORM\SS_List;
class GridFieldCategorisationConfig extends GridFieldConfig_RecordEditor
{
/**
* @param int $itemsPerPage
* @param array|SS_List $mergeRecords
* @param string $parentType
* @param string $parentMethod
* @param string $childMethod
*/
public function __construct($itemsPerPage, $mergeRecords, $parentType, $parentMethod, $childMethod)
{
parent::__construct($itemsPerPage);
$this->removeComponentsByType(GridFieldAddNewButton::class);
$this->addComponent(
GridFieldAddByDBField::create('buttons-before-left')
);
$this->addComponent(
GridFieldMergeAction::create($mergeRecords, $parentType, $parentMethod, $childMethod)
);
/**
* @var GridFieldDataColumns $columns
*/
$columns = $this->getComponentByType(GridFieldDataColumns::class);
$columns->setFieldFormatting(
[
'BlogPostsCount' => function ($value, CategorisationObject $item) {
return $item->BlogPosts()->Count();
}
]
);
$this->changeColumnOrder();
}
/**
* Reorders GridField columns so that Actions is last.
*/
protected function changeColumnOrder()
{
/**
* @var GridFieldDataColumns $columns
*/
$columns = $this->getComponentByType(GridFieldDataColumns::class);
$columns->setDisplayFields(
[
'Title' => _t(__CLASS__ . '.Title', 'Title'),
'BlogPostsCount' => _t(__CLASS__ . '.Posts', 'Posts'),
'MergeAction' => 'MergeAction',
'Actions' => 'Actions'
]
);
}
}

View File

@ -0,0 +1,34 @@
<?php
namespace SilverStripe\Blog\Admin;
use SilverStripe\Forms\GridField\GridField_FormAction;
class GridFieldFormAction extends GridField_FormAction
{
/**
* @var array
*/
protected $extraAttributes = [];
/**
* @param array $attributes
*/
public function setExtraAttributes(array $attributes)
{
$this->extraAttributes = $attributes;
}
/**
* @return array
*/
public function getAttributes()
{
$attributes = parent::getAttributes();
return array_merge(
$attributes,
$this->extraAttributes
);
}
}

View File

@ -0,0 +1,165 @@
<?php
namespace SilverStripe\Blog\Admin;
use SilverStripe\Control\Controller;
use SilverStripe\Core\Injector\Injectable;
use Silverstripe\Forms\DropdownField;
use SilverStripe\Forms\GridField\GridField;
use SilverStripe\Forms\GridField\GridField_ActionProvider;
use SilverStripe\Forms\GridField\GridField_ColumnProvider;
use SilverStripe\ORM\SS_List;
class GridFieldMergeAction implements GridField_ColumnProvider, GridField_ActionProvider
{
use Injectable;
/**
* List of records to show in the MergeAction column.
*
* @var array|SS_List
*/
protected $records;
/**
* Type of parent DataObject (i.e BlogTag, BlogCategory).
*
* @var string
*/
protected $parentType;
/**
* Relationship method to reference parent (i.e BlogTags).
*
* @var string
*/
protected $parentMethod;
/**
* Relationship method to reference child (i.e BlogPosts).
*
* @var string
*/
protected $childMethod;
/**
* @param array|SS_List $records
* @param string $parentType
* @param string $parentMethod
* @param string $childMethod
*/
public function __construct($records, $parentType, $parentMethod, $childMethod)
{
$this->records = $records;
$this->parentType = $parentType;
$this->parentMethod = $parentMethod;
$this->childMethod = $childMethod;
}
/**
* {@inheritdoc}
*/
public function augmentColumns($gridField, &$columns)
{
if (!in_array('MergeAction', $columns ?? [])) {
$columns[] = 'MergeAction';
}
return $columns;
}
/**
* {@inheritdoc}
*/
public function getColumnsHandled($gridField)
{
return ['MergeAction'];
}
/**
* {@inheritdoc}
*/
public function getColumnContent($gridField, $record, $columnName)
{
if ($columnName === 'MergeAction' && $record->{$this->childMethod}()->Count() > 0) {
$dropdown = DropdownField::create('Target', 'Target', $this->records->exclude('ID', $record->ID)->map());
$dropdown->setAttribute('id', 'Target_'.$record->ID);
$prefix = strtolower($this->parentMethod . '-' . $this->childMethod);
$action = GridFieldFormAction::create(
$gridField,
'MergeAction' . $record->ID,
'Move',
'merge',
[
'record' => $record->ID,
'target' => $prefix . '-target-record-' . $record->ID,
]
);
$action->setExtraAttributes([
'data-target' => $prefix . '-target-record-' . $record->ID
]);
$action->addExtraClass('btn btn-primary btn-sm blog-merge-action');
$MovePostsTo = _t(__CLASS__ . '.MovePostsTo', 'Move posts to');
$MergeActionReveal = '<a title="' . $MovePostsTo . '" class="MergeActionReveal">' . $MovePostsTo . '</a>';
return $dropdown->Field() . $action->Field() . $MergeActionReveal;
}
return null;
}
/**
* {@inheritdoc}
*/
public function getColumnAttributes($gridField, $record, $columnName)
{
return ['class' => 'MergeAction'];
}
/**
* {@inheritdoc}
*/
public function getColumnMetadata($gridField, $columnName)
{
return ['title' => _t(__CLASS__ . '.MovePostsTo', 'Move posts to')];
}
/**
* {@inheritdoc}
*/
public function getActions($gridField)
{
return ['merge'];
}
/**
* {@inheritdoc}
*/
public function handleAction(GridField $gridField, $actionName, $arguments, $data)
{
if ($actionName === 'merge') {
$controller = Controller::curr();
$request = $controller->getRequest();
$target = $request->requestVar($arguments["target"]);
$parentType = $this->parentType;
$fromParent = $parentType::get()->byId($arguments['record']);
$toParent = $parentType::get()->byId($target);
$posts = $fromParent->{$this->childMethod}();
foreach ($posts as $post) {
$relationship = $post->{$this->parentMethod}();
$relationship->remove($fromParent);
$relationship->add($toParent);
}
}
}
}

View File

@ -0,0 +1,23 @@
<?php
namespace SilverStripe\Blog\Forms;
use SilverStripe\Control\Cookie;
use SilverStripe\Forms\FieldGroup;
class BlogAdminSidebar extends FieldGroup
{
/**
* @return bool
*/
public function isOpen()
{
$sidebar = Cookie::get('blog-admin-sidebar');
if ($sidebar == 1 || is_null($sidebar)) {
return true;
}
return false;
}
}

View File

@ -0,0 +1,240 @@
<?php
namespace SilverStripe\Blog\Forms\GridField;
use SilverStripe\Control\Controller;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\Core\Convert;
use SilverStripe\Core\Injector\Injectable;
use SilverStripe\Forms\GridField\GridField;
use SilverStripe\Forms\GridField\GridField_ActionProvider;
use SilverStripe\Forms\GridField\GridField_FormAction;
use SilverStripe\Forms\GridField\GridField_HTMLProvider;
use SilverStripe\Forms\TextField;
use SilverStripe\ORM\ArrayList;
use SilverStripe\ORM\DataList;
use SilverStripe\ORM\DataObject;
use SilverStripe\Security\Security;
use SilverStripe\View\ArrayData;
use SilverStripe\View\Requirements;
use UnexpectedValueException;
class GridFieldAddByDBField implements GridField_ActionProvider, GridField_HTMLProvider
{
use Injectable;
/**
* HTML Fragment to render the field.
*
* @var string
*/
protected $targetFragment;
/**
* Default field to create the DataObject by should be Title.
*
* @var string
*/
protected $dataObjectField = 'Title';
/**
* Name for the buttons displayed in the CMS
*
* @var string
*/
protected $buttonName;
/**
* Creates a text field and add button which allows the user to directly create a new
* DataObject by just entering the title.
*
* @param string $targetFragment
* @param string $dataObjectField
*/
public function __construct($targetFragment = 'before', $dataObjectField = 'Title')
{
$this->targetFragment = $targetFragment;
$this->dataObjectField = (string) $dataObjectField;
}
/**
* Provide actions to this component.
*
* @param GridField $gridField
*
* @return array
*/
public function getActions($gridField)
{
return [
'add',
];
}
/**
* Handles the add action for the given DataObject.
*
* @param $gridField GridField
* @param $actionName string
* @param $arguments mixed
* @param $data array
*
* @return null|HTTPResponse
*
* @throws UnexpectedValueException
*/
public function handleAction(GridField $gridField, $actionName, $arguments, $data)
{
if ($actionName == 'add') {
$dbField = $this->getDataObjectField();
$objClass = $gridField->getModelClass();
/**
* @var DataObject $obj
*/
$obj = $objClass::create();
if ($obj->hasField($dbField)) {
$obj->setCastedField($dbField, $data['gridfieldaddbydbfield'][$obj->ClassName][$dbField]);
if ($obj->canCreate()) {
$id = $gridField->getList()->add($obj);
if (!$id) {
$gridField->setCustomValidationMessage(
_t(
__CLASS__ . '.AddFail',
'Unable to save {class} to the database.',
'Unable to add the DataObject.',
[
'class' => get_class($obj),
]
)
);
}
} else {
return Security::permissionFailure(
Controller::curr(),
_t(
__CLASS__ . '.PermissionFail',
'You don\'t have permission to create a {class}.',
'Unable to add the DataObject.',
[
'class' => get_class($obj)
]
)
);
}
} else {
throw new UnexpectedValueException(
sprintf(
'Invalid field (%s) on %s.',
$dbField,
$obj->ClassName
)
);
}
}
return null;
}
/**
* Returns the database field for which we'll add the new data object.
*
* @return string
*/
public function getDataObjectField()
{
return $this->dataObjectField;
}
/**
* Set the button name
*
* @param $name string
* @return $this
*/
public function setButtonName($name)
{
$this->buttonName = $name;
return $this;
}
/**
* Set the database field.
*
* @param $field string
*/
public function setDataObjectField($field)
{
$this->dataObjectField = (string) $field;
}
/**
* Renders the TextField and add button to the GridField.
*
* @param $gridField GridField
*
* @return string[]
*/
public function getHTMLFragments($gridField)
{
Requirements::javascript('silverstripe/blog:client/dist/js/main.bundle.js');
/**
* @var DataList $dataList
*/
$dataList = $gridField->getList();
$dataClass = $dataList->dataClass();
$obj = singleton($dataClass);
if (!$obj->canCreate()) {
return [];
}
$dbField = $this->getDataObjectField();
$textField = TextField::create(
sprintf(
"gridfieldaddbydbfield[%s][%s]",
$obj->ClassName,
Convert::raw2htmlatt($dbField)
)
)
->setAttribute('placeholder', $obj->fieldLabel($dbField))
->addExtraClass('no-change-track');
if (!$this->buttonName) {
// provide a default button name, can be changed by calling {@link setButtonName()} on this component
$objectName = $obj->i18n_singular_name();
$this->buttonName = _t(__CLASS__ . '.ButtonName', '{name}', ['name' => $objectName]);
}
$addAction = GridField_FormAction::create(
$gridField,
'add',
_t(
__CLASS__ . '.Add',
'Add {name}',
'Add button text',
['name' => $this->buttonName]
),
'add',
'add'
);
$addAction->setAttribute('data-icon', 'add');
$addAction->addExtraClass('btn btn-primary');
$forTemplate = ArrayData::create([]);
$forTemplate->Fields = ArrayList::create();
$forTemplate->Fields->push($textField);
$forTemplate->Fields->push($addAction);
return [$this->targetFragment => $forTemplate->renderWith(self::class)];
}
}

View File

@ -0,0 +1,100 @@
<?php
namespace SilverStripe\Blog\Forms\GridField;
use SilverStripe\Blog\Model\BlogPost;
use SilverStripe\Lumberjack\Forms\GridFieldSiteTreeState;
use SilverStripe\ORM\FieldType\DBDatetime;
/**
* Provides a component to the {@link GridField} which tells the user whether or not a blog post
* has been published and when.
*
*/
class GridFieldBlogPostState extends GridFieldSiteTreeState
{
/**
* {@inheritdoc}
*/
public function getColumnContent($gridField, $record, $columnName)
{
if ($columnName == 'State') {
if ($record instanceof BlogPost) {
$modifiedLabel = '';
if ($record->isModifiedOnDraft()) {
$modifiedLabel = '<span class="modified">' . _t(__CLASS__ . '.Modified', 'Modified') . '</span>';
}
if (!$record->isPublished()) {
/**
* @var DBDatetime $lastEdited
*/
$lastEdited = $record->dbObject('LastEdited');
return '<i class="font-icon-edit mr-2"></i> ' . _t(
__CLASS__ . '.Draft',
'Saved as Draft on {date}',
'State for when a post is saved.',
[
'date' => $lastEdited->FormatFromSettings(),
]
);
}
/**
* @var DBDatetime $publishDate
*/
$publishDate = $record->dbObject('PublishDate');
if (strtotime($record->PublishDate ?? '') > time()) {
return '<i class="font-icon-clock mr-2"></i> ' . _t(
__CLASS__ . '.Timer',
'Publish at {date}',
'State for when a post is published.',
[
'date' => $publishDate->FormatFromSettings(),
]
) . $modifiedLabel;
}
return '<i class="font-icon-check-mark-circle text-success mr-2"></i> ' . _t(
__CLASS__ . '.Published',
'Published on {date}',
'State for when a post is published.',
[
'date' => $publishDate->FormatFromSettings(),
]
) . $modifiedLabel;
}
}
return '';
}
/**
* {@inheritdoc}
*/
public function getColumnAttributes($gridField, $record, $columnName)
{
if ($columnName == 'State') {
if ($record instanceof BlogPost) {
$published = $record->isPublished();
if (!$published) {
$class = 'gridfield-icon draft';
} elseif (strtotime($record->PublishDate ?? '') > time()) {
$class = 'gridfield-icon timer';
} else {
$class = 'gridfield-icon published';
}
return [
'class' => $class,
];
}
}
return [];
}
}

View File

@ -0,0 +1,25 @@
<?php
namespace SilverStripe\Blog\Forms\GridField;
use SilverStripe\Core\Injector\Injector;
use SilverStripe\Lumberjack\Forms\GridFieldConfig_Lumberjack;
use SilverStripe\Lumberjack\Forms\GridFieldSiteTreeState;
/**
* GridField config necessary for managing a SiteTree object.
*
*/
class GridFieldConfigBlogPost extends GridFieldConfig_Lumberjack
{
/**
* @param null|int $itemsPerPage
*/
public function __construct($itemsPerPage = null)
{
parent::__construct($itemsPerPage);
$this->removeComponentsByType(GridFieldSiteTreeState::class);
$this->addComponent(Injector::inst()->create(GridFieldBlogPostState::class));
}
}

707
src/Model/Blog.php Normal file
View File

@ -0,0 +1,707 @@
<?php
namespace SilverStripe\Blog\Model;
use Page;
use SilverStripe\Blog\Admin\GridFieldCategorisationConfig;
use SilverStripe\Blog\Forms\GridField\GridFieldConfigBlogPost;
use SilverStripe\CMS\Controllers\RootURLController;
use SilverStripe\Control\Controller;
use SilverStripe\Core\Convert;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\GridField\GridField;
use SilverStripe\Forms\GridField\GridFieldConfig;
use SilverStripe\Forms\ListboxField;
use SilverStripe\Forms\LiteralField;
use SilverStripe\Forms\NumericField;
use SilverStripe\ORM\DataList;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\DB;
use SilverStripe\ORM\HasManyList;
use SilverStripe\ORM\ManyManyList;
use SilverStripe\ORM\SS_List;
use SilverStripe\ORM\UnsavedRelationList;
use SilverStripe\Security\Group;
use SilverStripe\Security\Member;
use SilverStripe\Security\Permission;
use SilverStripe\Security\PermissionProvider;
use SilverStripe\Security\Security;
use SilverStripe\View\Requirements;
/**
* Blog Holder
*
* @method HasManyList Tags() List of tags in this blog
* @method HasManyList Categories() List of categories in this blog
* @method ManyManyList Editors() List of editors
* @method ManyManyList Writers() List of writers
* @method ManyManyList Contributors() List of contributors
*/
class Blog extends Page implements PermissionProvider
{
/**
* Permission for user management.
*
* @var string
*/
const MANAGE_USERS = 'BLOG_MANAGE_USERS';
/**
* If true, users assigned as editor, writer, or contributor will be automatically granted
* CMS_ACCESS_CMSMain permission. If false, only users with this permission already may be
* assigned.
*
* @config
*
* @var boolean
*/
private static $grant_user_access = true;
/**
* Permission to either require, or grant to users assigned to work on this blog.
*
* @config
*
* @var string
*/
private static $grant_user_permission = 'CMS_ACCESS_CMSMain';
/**
* Group code to assign newly granted users to.
*
* @config
*
* @var string
*/
private static $grant_user_group = 'blog-users';
/**
* {@inheritDoc}
* @var string
*/
private static $table_name = 'Blog';
/**
* @var array
*/
private static $db = [
'PostsPerPage' => 'Int',
];
/**
* @var array
*/
private static $has_many = [
'Tags' => BlogTag::class,
'Categories' => BlogCategory::class,
];
/**
* @var array
*/
private static $many_many = [
'Editors' => Member::class,
'Writers' => Member::class,
'Contributors' => Member::class,
];
/**
* @var array
*/
private static $allowed_children = [
BlogPost::class,
];
/**
* @var array
*/
private static $extensions = [
BlogFilter::class,
];
/**
* The ProvideComments db column is defined in the silverstripe/comments module
*
* @var array
*/
private static $defaults = [
'ProvideComments' => false,
'PostsPerPage' => 10
];
/**
* @var string
*/
private static $description = 'Adds a blog to your website.';
private static $icon_class = 'font-icon-p-posts';
/**
* {@inheritdoc}
*/
public function getCMSFields()
{
$this->addCMSRequirements();
$this->beforeUpdateCMSFields(function ($fields) {
if (!$this->canEdit()) {
return;
}
$categories = GridField::create(
'Categories',
_t(__CLASS__ . '.Categories', 'Categories'),
$this->Categories(),
GridFieldCategorisationConfig::create(
15,
$this->Categories()->sort('Title'),
BlogCategory::class,
'Categories',
'BlogPosts'
)
);
$tags = GridField::create(
'Tags',
_t(__CLASS__ . '.Tags', 'Tags'),
$this->Tags(),
GridFieldCategorisationConfig::create(
15,
$this->Tags()->sort('Title'),
BlogTag::class,
'Tags',
'BlogPosts'
)
);
/**
* @var FieldList $fields
*/
$fields->addFieldsToTab(
'Root.Categorisation',
[
$categories,
$tags
]
);
$fields->fieldByName('Root.Categorisation')
->addExtraClass('blog-cms-categorisation')
->setTitle(_t(__CLASS__ . '.Categorisation', 'Categorisation'));
});
return parent::getCMSFields();
}
/**
* Adds CMS related css and js overrides
*/
protected function addCMSRequirements()
{
Requirements::css('silverstripe/blog:client/dist/styles/main.css');
Requirements::javascript('silverstripe/blog:client/dist/js/main.bundle.js');
}
/**
* {@inheritdoc}
*/
public function canEdit($member = null)
{
$member = $this->getMember($member);
if ($this->isEditor($member)) {
return true;
}
return parent::canEdit($member);
}
/**
* @param null|int|Member $member
*
* @return null|Member
*/
protected function getMember($member = null)
{
if (!$member) {
$member = Security::getCurrentUser();
}
if (is_numeric($member)) {
$member = Member::get()->byID($member);
}
return $member;
}
/**
* Check if this member is an editor of the blog.
*
* @param Member $member
*
* @return bool
*/
public function isEditor($member)
{
$isEditor = $this->isMemberOf($member, $this->Editors());
$this->extend('updateIsEditor', $isEditor, $member);
return $isEditor;
}
/**
* Determine if the given member belongs to the given relation.
*
* @param Member $member
* @param DataList $relation
*
* @return bool
*/
protected function isMemberOf($member, $relation)
{
if (!$member || !$member->exists()) {
return false;
}
if ($relation instanceof UnsavedRelationList) {
return in_array($member->ID, $relation->getIDList() ?? []);
}
return $relation->byID($member->ID) !== null;
}
/**
* Determine the role of the given member.
*
* Call be called via template to determine the current user.
*
* @example "Hello $RoleOf($CurrentMember.ID)"
*
* @param int|Member $member
*
* @return null|string
*/
public function RoleOf($member)
{
if (is_numeric($member)) {
$member = Member::get()->byId($member);
}
if (!$member) {
return null;
}
if ($this->isEditor($member)) {
return _t(__CLASS__ . '.EDITOR', 'Editor');
}
if ($this->isWriter($member)) {
return _t(__CLASS__ . '.WRITER', 'Writer');
}
if ($this->isContributor($member)) {
return _t(__CLASS__ . '.CONTRIBUTOR', 'Contributor');
}
return null;
}
/**
* Check if this member is a writer of the blog.
*
* @param Member $member
*
* @return bool
*/
public function isWriter($member)
{
$isWriter = $this->isMemberOf($member, $this->Writers());
$this->extend('updateIsWriter', $isWriter, $member);
return $isWriter;
}
/**
* Check if this member is a contributor of the blog.
*
* @param Member $member
*
* @return bool
*/
public function isContributor($member)
{
$isContributor = $this->isMemberOf($member, $this->Contributors());
$this->extend('updateIsContributor', $isContributor, $member);
return $isContributor;
}
/**
* {@inheritdoc}
*/
public function canAddChildren($member = null)
{
$member = $this->getMember($member);
if ($this->isEditor($member) || $this->isWriter($member) || $this->isContributor($member)) {
return true;
}
return parent::canAddChildren($member);
}
/**
* {@inheritdoc}
*/
public function getSettingsFields()
{
$this->addCMSRequirements();
$fields = parent::getSettingsFields();
$fields->addFieldToTab(
'Root.Settings',
NumericField::create('PostsPerPage', _t(__CLASS__ . '.PostsPerPage', 'Posts Per Page'))
);
$members = $this->getCandidateUsers()->map()->toArray();
$toggleButton = LiteralField::create(
'ToggleButton',
'<a class="font-icon-info-circled toggle-description"></a>'
);
$editorField = ListboxField::create('Editors', 'Editors', $members)
->setRightTitle($toggleButton)
->setDescription(
_t(
__CLASS__ . '.UsersEditorsFieldDescription',
'An editor has control over specific Blogs, and all posts included within it.
Short of being able to assign other editors to a blog, they are able to handle most changes to
their assigned blog. <br /><br />
Editors have these permissions:<br />
<br />
Update or publish any BlogPost in their Blog<br />
Update or publish their Blog<br />
Assign/unassign writers to their Blog<br />
Assign/unassign contributors to their Blog<br />
Assign/unassign any member as an author of a particular BlogPost'
)
);
if (!$this->canEditEditors()) {
$editorField = $editorField->performDisabledTransformation();
}
$writerField = ListboxField::create('Writers', 'Writers', $members)
->setRightTitle($toggleButton)
->setDescription(
_t(
__CLASS__ . '.UsersWritersFieldDescription',
'A writer has full control over creating, editing and publishing BlogPosts they have authored
or have been assigned to. Writers are unable to edit BlogPosts to which they are not assigned.
<br /><br />
Writers have these permissions:<br />
<br />
Update or publish any BlogPost they have authored or have been assigned to<br />
Assign/unassign any member as an author of a particular BlogPost they have authored or have been
assigned to'
)
);
if (!$this->canEditWriters()) {
$writerField = $writerField->performDisabledTransformation();
}
$contributorField = ListboxField::create('Contributors', 'Contributors', $members)
// ->setMultiple(true)
->setRightTitle($toggleButton)
->setDescription(
_t(
__CLASS__ . '.UsersContributorsFieldDescription',
'Contributors have the ability to create or edit BlogPosts, but are unable to publish without
authorisation of an editor. They are also unable to assign other contributing authors to any of
their BlogPosts.<br />
<br />
Contributors have these permissions:<br />
<br />
Update any BlogPost they have authored or have been assigned to'
)
);
if (!$this->canEditContributors()) {
$contributorField = $contributorField->performDisabledTransformation();
}
$fields->addFieldsToTab(
'Root.Users',
[
$editorField,
$writerField,
$contributorField
]
);
return $fields;
}
/**
* Gets the list of user candidates to be assigned to assist with this blog.
*
* @return SS_List
*/
protected function getCandidateUsers()
{
if ($this->config()->get('grant_user_access')) {
$list = Member::get();
$this->extend('updateCandidateUsers', $list);
return $list;
}
return Permission::get_members_by_permission(
$this->config()->get('grant_user_permission')
);
}
/**
* Determine if this user can edit the editors list.
*
* @param int|Member $member
*
* @return bool
*/
public function canEditEditors($member = null)
{
$member = $this->getMember($member);
$extended = $this->extendedCan('canEditEditors', $member);
if ($extended !== null) {
return $extended;
}
return Permission::checkMember($member, self::MANAGE_USERS);
}
/**
* Determine if this user can edit writers list.
*
* @param int|Member $member
*
* @return boolean
*/
public function canEditWriters($member = null)
{
$member = $this->getMember($member);
$extended = $this->extendedCan('canEditWriters', $member);
if ($extended !== null) {
return $extended;
}
if ($this->isEditor($member)) {
return true;
}
return Permission::checkMember($member, self::MANAGE_USERS);
}
/**
* Determines if this user can edit the contributors list.
*
* @param int|Member $member
*
* @return boolean
*/
public function canEditContributors($member = null)
{
$member = $this->getMember($member);
$extended = $this->extendedCan('canEditContributors', $member);
if ($extended !== null) {
return $extended;
}
if ($this->isEditor($member)) {
return true;
}
return Permission::checkMember($member, self::MANAGE_USERS);
}
/**
* Returns BlogPosts for a given date period.
*
* @param int $year
* @param null|int $month
* @param null|int $day
*
* @return DataList
*/
public function getArchivedBlogPosts($year, $month = null, $day = null)
{
$query = $this->getBlogPosts()->dataQuery();
$stage = $query->getQueryParam('Versioned.stage');
if ($stage) {
$stage = '_' . $stage;
}
$query->innerJoin(
DataObject::getSchema()->tableName(BlogPost::class),
sprintf('"SiteTree%s"."ID" = "BlogPost%s"."ID"', $stage, $stage)
);
$conn = DB::get_conn();
// Filter by year
$yearCond = $conn->formattedDatetimeClause('"BlogPost"."PublishDate"', '%Y');
$query->where(sprintf('%s = \'%04d\'', $yearCond, Convert::raw2sql($year)));
// Filter by month (if given)
if ($month) {
$monthCond = $conn->formattedDatetimeClause('"BlogPost"."PublishDate"', '%m');
$query->where(sprintf('%s = \'%02d\'', $monthCond, Convert::raw2sql($month)));
if ($day) {
$dayCond = $conn->formattedDatetimeClause('"BlogPost"."PublishDate"', '%d');
$query->where(sprintf('%s = \'%02d\'', $dayCond, Convert::raw2sql($day)));
}
}
return $this->getBlogPosts()->setDataQuery($query);
}
/**
* Return blog posts.
*
* @return DataList of BlogPost objects
*/
public function getBlogPosts()
{
$blogPosts = BlogPost::get()->filter('ParentID', $this->ID);
$this->extend('updateGetBlogPosts', $blogPosts);
return $blogPosts;
}
/**
* Get a link to a Member profile.
*
* @param string $urlSegment
*
* @return string
*/
public function ProfileLink($urlSegment)
{
$baseLink = $this->Link();
if ($baseLink === '/') {
// Handle homepage blogs
$baseLink = RootURLController::get_homepage_link();
}
return Controller::join_links($baseLink, 'profile', $urlSegment);
}
/**
* This sets the title for our gridfield.
*
* @return string
*/
public function getLumberjackTitle()
{
return _t(__CLASS__ . '.LumberjackTitle', 'Blog Posts');
}
/**
* This overwrites lumberjacks default gridfield config.
*
* @return GridFieldConfig
*/
public function getLumberjackGridFieldConfig()
{
return GridFieldConfigBlogPost::create();
}
/**
* {@inheritdoc}
*/
public function providePermissions()
{
return [
Blog::MANAGE_USERS => [
'name' => _t(
__CLASS__ . '.PERMISSION_MANAGE_USERS_DESCRIPTION',
'Manage users for individual blogs'
),
'help' => _t(
__CLASS__ . '.PERMISSION_MANAGE_USERS_HELP',
'Allow assignment of Editors, Writers, or Contributors to blogs'
),
'category' => _t(__CLASS__ . '.PERMISSIONS_CATEGORY', 'Blog permissions'),
'sort' => 100
]
];
}
/**
* {@inheritdoc}
*/
protected function onBeforeWrite()
{
parent::onBeforeWrite();
$this->assignGroup();
}
/**
* Assign users as necessary to the blog group.
*/
protected function assignGroup()
{
if (!$this->config()->get('grant_user_access')) {
return;
}
$group = $this->getUserGroup();
// Must check if the method exists or else an error occurs when changing page type
if ($this->hasMethod('Editors')) {
foreach ([$this->Editors(), $this->Writers(), $this->Contributors()] as $levels) {
foreach ($levels as $user) {
if (!$user->inGroup($group)) {
$user->Groups()->add($group);
}
}
}
}
}
/**
* Gets or creates the group used to assign CMS access.
*
* @return Group
*/
protected function getUserGroup()
{
$code = $this->config()->get('grant_user_group');
$group = Group::get()->filter('Code', $code)->first();
if ($group) {
return $group;
}
$group = Group::create();
$group->Title = 'Blog users';
$group->Code = $code;
$group->write();
$permission = Permission::create();
$permission->Code = $this->config()->get('grant_user_permission');
$group->Permissions()->add($permission);
return $group;
}
}

View File

@ -0,0 +1,73 @@
<?php
namespace SilverStripe\Blog\Model;
use SilverStripe\ORM\DataObject;
/**
* A blog category for generalising blog posts.
*
*
* @method Blog Blog()
*
* @property string $Title
* @property string $URLSegment
* @property int $BlogID
*/
class BlogCategory extends DataObject implements CategorisationObject
{
use BlogObject;
/**
* Use an exception code so that attempted writes can continue on
* duplicate errors.
*
* @const string
* This must be a string because ValidationException has decided we can't use int
*/
const DUPLICATE_EXCEPTION = 'DUPLICATE';
/**
* {@inheritDoc}
* @var string
*/
private static $table_name = 'BlogCategory';
/**
* @var array
*/
private static $db = [
'Title' => 'Varchar(255)',
'URLSegment' => 'Varchar(255)'
];
/**
* @var array
*/
private static $has_one = [
'Blog' => Blog::class,
];
/**
* @var array
*/
private static $belongs_many_many = [
'BlogPosts' => BlogPost::class,
];
/**
* {@inheritdoc}
*/
protected function getListUrlSegment()
{
return 'category';
}
/**
* {@inheritdoc}
*/
protected function getDuplicateError()
{
return _t(__CLASS__ . '.Duplicate', 'A blog category already exists with that name.');
}
}

View File

@ -0,0 +1,29 @@
<?php
namespace SilverStripe\Blog\Model;
use SilverStripe\ORM\DataExtension;
/**
* Adds Blog specific behaviour to Comment.
*/
class BlogCommentExtension extends DataExtension
{
/**
* Extra CSS classes for styling different comment types.
*
* @return string
*/
public function getExtraClass()
{
$blogPost = $this->owner->Parent();
if ($blogPost instanceof BlogPost) {
if ($blogPost->isAuthor($this->owner->Author())) {
return 'author-comment';
}
}
return '';
}
}

View File

@ -0,0 +1,587 @@
<?php
namespace SilverStripe\Blog\Model;
use PageController;
use SilverStripe\Control\Director;
use SilverStripe\Control\HTTPResponse_Exception;
use SilverStripe\Control\RSS\RSSFeed;
use SilverStripe\ORM\ArrayList;
use SilverStripe\ORM\DataList;
use SilverStripe\ORM\FieldType\DBDatetime;
use SilverStripe\ORM\PaginatedList;
use SilverStripe\Security\Member;
use SilverStripe\View\Parsers\URLSegmentFilter;
use SilverStripe\Control\HTTPRequest;
class BlogController extends PageController
{
/**
* @var array
*/
private static $allowed_actions = [
'archive',
'tag',
'category',
'rss',
'profile'
];
/**
* @var array
*/
private static $url_handlers = [
'tag/$Tag!/$Rss' => 'tag',
'category/$Category!/$Rss' => 'category',
'archive/$Year!/$Month/$Day' => 'archive',
'profile/$URLSegment!' => 'profile'
];
/**
* @var array
*/
private static $casting = [
'MetaTitle' => 'Text',
'FilterDescription' => 'Text'
];
/**
* If enabled, blog author profiles will be turned off for this site
*
* @config
* @var bool
*/
private static $disable_profiles = false;
/**
* The current Blog Post DataList query.
*
* @var DataList
*/
protected $blogPosts;
/**
* @return string
*/
public function index(HTTPRequest $request)
{
/**
* @var Blog $dataRecord
*/
$dataRecord = $this->dataRecord;
$this->blogPosts = $dataRecord->getBlogPosts();
return $this->render();
}
/**
* Renders a Blog Member's profile.
*
* @throws HTTPResponse_Exception
*
* @return string
*/
public function profile()
{
if ($this->config()->get('disable_profiles')) {
$this->httpError(404, 'Not Found');
}
$profile = $this->getCurrentProfile();
if (!$profile) {
return $this->httpError(404, 'Not Found');
}
$this->blogPosts = $this->getCurrentProfilePosts();
return $this->render();
}
/**
* Get the Member associated with the current URL segment.
*
* @return null|Member
*/
public function getCurrentProfile()
{
$urlSegment = $this->request->param('URLSegment');
if ($urlSegment) {
$filter = URLSegmentFilter::create();
// url encode unless it's multibyte (already pre-encoded in the database)
// see https://github.com/silverstripe/silverstripe-cms/pull/2384
if (!$filter->getAllowMultibyte()) {
$urlSegment = rawurlencode($urlSegment ?? '');
}
return Member::get()
->filter('URLSegment', $urlSegment)
->first();
}
return null;
}
/**
* Get posts related to the current Member profile.
*
* @return null|DataList
*/
public function getCurrentProfilePosts()
{
$profile = $this->getCurrentProfile();
if ($profile) {
return $profile->BlogPosts()->filter('ParentID', $this->ID);
}
return null;
}
/**
* Renders an archive for a specified date. This can be by year or year/month.
*
* @return null|string
*/
public function archive()
{
/**
* @var Blog $dataRecord
*/
$dataRecord = $this->dataRecord;
$year = $this->getArchiveYear();
$month = $this->getArchiveMonth();
$day = $this->getArchiveDay();
if ($this->request->param('Month') && !$month) {
$this->httpError(404, 'Not Found');
}
if ($month && $this->request->param('Day') && !$day) {
$this->httpError(404, 'Not Found');
}
if ($year) {
$this->blogPosts = $dataRecord->getArchivedBlogPosts($year, $month, $day);
return $this->render();
}
$this->httpError(404, 'Not Found');
return null;
}
/**
* Fetches the archive year from the url.
*
* @return int
*/
public function getArchiveYear()
{
if ($this->request->param('Year')) {
if (preg_match('/^[0-9]{4}$/', $year = $this->request->param('Year'))) {
return (int) $year;
}
} elseif ($this->request->param('Action') == 'archive') {
return DBDatetime::now()->Year();
}
return null;
}
/**
* Fetches the archive money from the url.
*
* @return null|int
*/
public function getArchiveMonth()
{
$month = $this->request->param('Month');
if (preg_match('/^[0-9]{1,2}$/', $month ?? '')) {
if ($month > 0 && $month < 13) {
if (checkdate($month ?? 0, 01, $this->getArchiveYear() ?? 0)) {
return (int) $month;
}
}
}
return null;
}
/**
* Fetches the archive day from the url.
*
* @return null|int
*/
public function getArchiveDay()
{
$day = $this->request->param('Day');
if (preg_match('/^[0-9]{1,2}$/', $day ?? '')) {
if (checkdate($this->getArchiveMonth() ?? 0, $day ?? 0, $this->getArchiveYear() ?? 0)) {
return (int) $day;
}
}
return null;
}
/**
* Renders the blog posts for a given tag.
*
* @return null|string
*/
public function tag()
{
$tag = $this->getCurrentTag();
if ($tag) {
$this->blogPosts = $tag->BlogPosts();
if ($this->isRSS()) {
return $this->rssFeed($this->blogPosts, $tag->getLink());
} else {
return $this->render();
}
}
$this->httpError(404, 'Not Found');
return null;
}
/**
* Tag Getter for use in templates.
*
* @return null|BlogTag
*/
public function getCurrentTag()
{
/**
* @var Blog $dataRecord
*/
$dataRecord = $this->dataRecord;
$tag = $this->request->param('Tag');
if ($tag) {
$filter = URLSegmentFilter::create();
// url encode unless it's multibyte (already pre-encoded in the database)
// see https://github.com/silverstripe/silverstripe-cms/pull/2384
if (!$filter->getAllowMultibyte()) {
$tag = rawurlencode($tag ?? '');
}
return $dataRecord->Tags()
->filter('URLSegment', $tag)
->first();
}
return null;
}
/**
* Renders the blog posts for a given category.
*
* @return null|string
*/
public function category()
{
$category = $this->getCurrentCategory();
if ($category) {
$this->blogPosts = $category->BlogPosts();
if ($this->isRSS()) {
return $this->rssFeed($this->blogPosts, $category->getLink());
}
return $this->render();
}
$this->httpError(404, 'Not Found');
return null;
}
/**
* Category Getter for use in templates.
*
* @return null|BlogCategory
*/
public function getCurrentCategory()
{
/**
* @var Blog $dataRecord
*/
$dataRecord = $this->dataRecord;
$category = $this->request->param('Category');
if ($category) {
$filter = URLSegmentFilter::create();
// url encode unless it's multibyte (already pre-encoded in the database)
// see https://github.com/silverstripe/silverstripe-cms/pull/2384
if (!$filter->getAllowMultibyte()) {
$category = rawurlencode($category ?? '');
}
return $dataRecord->Categories()
->filter('URLSegment', $category)
->first();
}
return null;
}
/**
* Get the meta title for the current action.
*
* @return string
*/
public function getMetaTitle()
{
$title = $this->data()->getTitle();
$filter = $this->getFilterDescription();
if ($filter) {
$title = sprintf('%s - %s', $title, $filter);
}
$this->extend('updateMetaTitle', $title);
return $title;
}
/**
* Returns a description of the current filter.
*
* @return string
*/
public function getFilterDescription()
{
$items = [];
$list = $this->PaginatedList();
$currentPage = $list->CurrentPage();
if ($currentPage > 1) {
$items[] = _t(
'SilverStripe\\Blog\\Model\\Blog.FILTERDESCRIPTION_PAGE',
'Page {page}',
null,
[
'page' => $currentPage
]
);
}
if ($author = $this->getCurrentProfile()) {
$items[] = _t(
'SilverStripe\\Blog\\Model\\Blog.FILTERDESCRIPTION_AUTHOR',
'By {author}',
null,
[
'author' => $author->Title
]
);
}
if ($tag = $this->getCurrentTag()) {
$items[] = _t(
'SilverStripe\\Blog\\Model\\Blog.FILTERDESCRIPTION_TAG',
'Tagged with {tag}',
null,
[
'tag' => $tag->Title
]
);
}
if ($category = $this->getCurrentCategory()) {
$items[] = _t(
'SilverStripe\\Blog\\Model\\Blog.FILTERDESCRIPTION_CATEGORY',
'In category {category}',
null,
[
'category' => $category->Title
]
);
}
if ($this->owner->getArchiveYear()) {
if ($this->owner->getArchiveDay()) {
$date = $this->owner->getArchiveDate()->Nice();
} elseif ($this->owner->getArchiveMonth()) {
$date = $this->owner->getArchiveDate()->format('MMMM, y');
} else {
$date = $this->owner->getArchiveDate()->format('y');
}
$items[] = _t(
'SilverStripe\\Blog\\Model\\Blog.FILTERDESCRIPTION_DATE',
'In {date}',
null,
[
'date' => $date,
]
);
}
$result = '';
if ($items) {
$result = implode(', ', $items);
}
$this->extend('updateFilterDescription', $result);
return $result;
}
/**
* Returns a list of paginated blog posts based on the BlogPost dataList.
*
* @return PaginatedList
*/
public function PaginatedList()
{
$allPosts = $this->blogPosts ?: ArrayList::create();
$posts = PaginatedList::create($allPosts);
// Set appropriate page size
if ($this->PostsPerPage > 0) {
$pageSize = $this->PostsPerPage;
} elseif ($count = $allPosts->count()) {
$pageSize = $count;
} else {
$pageSize = 99999;
}
$posts->setPageLength($pageSize);
// Set current page
$start = max(0, (int)$this->request->getVar($posts->getPaginationGetVar()));
$posts->setPageStart($start);
return $posts;
}
/**
* Returns the absolute link to the next page for use in the page meta tags. This helps search engines
* find the pagination and index all pages properly.
*
* @example "<% if $PaginationAbsoluteNextLink %><link rel="next" href="$PaginationAbsoluteNextLink"><% end_if %>"
*
* @return string|null
*/
public function PaginationAbsoluteNextLink()
{
$posts = $this->PaginatedList();
if ($posts->NotLastPage()) {
return Director::absoluteURL($posts->NextLink());
}
return null;
}
/**
* Returns the absolute link to the previous page for use in the page meta tags. This helps search engines
* find the pagination and index all pages properly.
*
* @example "<% if $PaginationAbsolutePrevLink %><link rel="prev" href="$PaginationAbsolutePrevLink"><% end_if %>"
*
* @return string|null
*/
public function PaginationAbsolutePrevLink()
{
$posts = $this->PaginatedList();
if ($posts->NotFirstPage()) {
return Director::absoluteURL($posts->PrevLink());
}
return null;
}
/**
* Displays an RSS feed of blog posts.
*
* @return string
*/
public function rss()
{
/**
* @var Blog $dataRecord
*/
$dataRecord = $this->dataRecord;
$this->blogPosts = $dataRecord->getBlogPosts();
return $this->rssFeed($this->blogPosts, $this->Link());
}
/**
* Returns the current archive date.
*
* @return null|DBDatetime
*/
public function getArchiveDate()
{
$year = $this->getArchiveYear();
$month = $this->getArchiveMonth();
$day = $this->getArchiveDay();
if ($year) {
if ($month) {
$date = sprintf('%s-%s-01', $year, $month);
if ($day) {
$date = sprintf('%s-%s-%s', $year, $month, $day);
}
} else {
$date = sprintf('%s-01-01', $year);
}
$obj = DBDatetime::create('date');
$obj->setValue($date);
return $obj;
}
return null;
}
/**
* Returns a link to the RSS feed.
*
* @return string
*/
public function getRSSLink()
{
return $this->Link('rss');
}
/**
* Displays an RSS feed of the given blog posts.
*
* @param DataList $blogPosts
* @param string $link
*
* @return string
*/
protected function rssFeed($blogPosts, $link)
{
$rss = RSSFeed::create($blogPosts, $link, $this->MetaTitle, $this->MetaDescription);
$this->extend('updateRss', $rss);
return $rss->outputToBrowser();
}
/**
* Returns true if the $Rss sub-action for categories/tags has been set to "rss"
*
* @return bool
*/
protected function isRSS()
{
$rss = $this->request->param('Rss');
return (is_string($rss) && strcasecmp($rss ?? '', 'rss') == 0);
}
}

114
src/Model/BlogFilter.php Normal file
View File

@ -0,0 +1,114 @@
<?php
namespace SilverStripe\Blog\Model;
use SilverStripe\Blog\Model\BlogFilter\BlogFilterGridField;
use SilverStripe\Core\ClassInfo;
use SilverStripe\Core\Convert;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\Tab;
use SilverStripe\Lumberjack\Model\Lumberjack;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\FieldType\DBDatetime;
use SilverStripe\Security\Permission;
use SilverStripe\Versioned\Versioned;
/**
* This class is responsible for filtering the SiteTree when necessary and also overlaps into
* filtering only published posts.
*
*/
class BlogFilter extends Lumberjack
{
/**
* {@inheritdoc}
*/
public function stageChildren($showAll = false)
{
$staged = parent::stageChildren($showAll);
if (!$this->shouldFilter() && $this->subclassForBlog() && !Permission::check('VIEW_DRAFT_CONTENT')) {
$stage = Versioned::get_stage();
if ($stage == 'Stage') {
$stage = '';
} elseif ($stage) {
$stage = '_' . $stage;
}
$dataQuery = $staged->dataQuery()
->innerJoin(
DataObject::getSchema()->tableName(BlogPost::class),
sprintf('"BlogPost%s"."ID" = "SiteTree%s"."ID"', $stage, $stage)
)
->where(sprintf('"PublishDate" < \'%s\'', Convert::raw2sql(DBDatetime::now())));
$staged = $staged->setDataQuery($dataQuery);
}
return $staged;
}
/**
* @return bool
*/
protected function subclassForBlog()
{
return in_array(get_class($this->owner), ClassInfo::subclassesFor(Blog::class) ?? []);
}
/**
* {@inheritdoc}
*/
public function liveChildren($showAll = false, $onlyDeletedFromStage = false)
{
$staged = parent::liveChildren($showAll, $onlyDeletedFromStage);
if (!$this->shouldFilter() && $this->isBlog() && !Permission::check('VIEW_DRAFT_CONTENT')) {
$dataQuery = $staged->dataQuery()
->innerJoin(
DataObject::getSchema()->tableName(BlogPost::class),
'"BlogPost_Live"."ID" = "SiteTree_Live"."ID"'
)
->where(sprintf('"PublishDate" < \'%s\'', Convert::raw2sql(DBDatetime::now())));
$staged = $staged->setDataQuery($dataQuery);
}
return $staged;
}
/**
* @return bool
*/
protected function isBlog()
{
return $this->owner instanceof Blog;
}
/**
* {@inheritdoc}
*/
public function updateCMSFields(FieldList $fields)
{
$excluded = $this->owner->getExcludedSiteTreeClassNames();
if (!empty($excluded)) {
$pages = BlogPost::get()->filter([
'ParentID' => $this->owner->ID,
'ClassName' => $excluded
]);
$gridField = BlogFilterGridField::create(
'ChildPages',
$this->getLumberjackTitle(),
$pages,
$this->getLumberjackGridFieldConfig()
);
$tab = Tab::create('ChildPages', $this->getLumberjackTitle(), $gridField);
$fields->insertBefore('Main', $tab);
}
}
}

View File

@ -0,0 +1,22 @@
<?php
namespace SilverStripe\Blog\Model\BlogFilter;
use SilverStripe\Forms\FormTransformation;
use SilverStripe\Forms\GridField\GridField;
/**
* Enables children of non-editable pages to be edited.
*/
class BlogFilterGridField extends GridField
{
/**
* @param FormTransformation $transformation
*
* @return $this
*/
public function transform(FormTransformation $transformation)
{
return $this;
}
}

View File

@ -0,0 +1,142 @@
<?php
namespace SilverStripe\Blog\Model;
use SilverStripe\Assets\Image;
use SilverStripe\Blog\Forms\GridField\GridFieldConfigBlogPost;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\GridField\GridField;
use SilverStripe\Forms\GridField\GridFieldAddNewButton;
use SilverStripe\Forms\Tab;
use SilverStripe\Forms\TextareaField;
use SilverStripe\ORM\DataExtension;
use SilverStripe\Security\Member;
use SilverStripe\View\Parsers\URLSegmentFilter;
use SilverStripe\View\Requirements;
/**
* This class is responsible for add Blog specific behaviour to Members.
*
*/
class BlogMemberExtension extends DataExtension
{
/**
* @var array
*/
private static $db = [
'URLSegment' => 'Varchar(255)',
'BlogProfileSummary' => 'Text'
];
/**
* @var array
*/
private static $has_one = [
'BlogProfileImage' => Image::class
];
private static array $owns = [
'BlogProfileImage',
];
/**
* @var array
*/
private static $belongs_many_many = [
'BlogPosts' => BlogPost::class
];
/**
* {@inheritdoc}
*/
public function onBeforeWrite()
{
$count = 1;
if ($this->owner->URLSegment && !$this->owner->isChanged('FirstName') && !$this->owner->isChanged('Surname')) {
return;
}
$this->owner->URLSegment = $this->generateURLSegment();
while (!$this->validURLSegment()) {
$this->owner->URLSegment = preg_replace('/-[0-9]+$/', '', $this->owner->URLSegment ?? '') . '-' . $count;
$count++;
}
}
/**
* Generate a unique URL segment based on the Member's name.
*
* @return string
*/
public function generateURLSegment()
{
$filter = URLSegmentFilter::create();
$name = $this->owner->FirstName . ' ' . $this->owner->Surname;
$urlSegment = $filter->filter($name);
if (!$urlSegment || $urlSegment == '-' || $urlSegment == '-1') {
$urlSegment = 'profile-' . $this->owner->ID;
}
return $urlSegment;
}
/**
* Returns TRUE if this object has a URL segment value that does not conflict with any other
* objects.
*
* @return bool
*/
public function validURLSegment()
{
$conflict = Member::get()->filter('URLSegment', $this->owner->URLSegment);
if ($this->owner->ID) {
$conflict = $conflict->exclude('ID', $this->owner->ID);
}
return $conflict->count() == 0;
}
/**
* {@inheritdoc}
*/
public function updateCMSFields(FieldList $fields)
{
$fields->removeByName('URLSegment');
// Remove the automatically-generated posts tab.
$fields->removeFieldFromTab('Root', 'BlogPosts');
// Construct a better posts tab.
Requirements::css('silverstripe/blog:client/dist/styles/main.css');
Requirements::javascript('silverstripe/blog:client/dist/js/main.bundle.js');
$tab = Tab::create('BlogPosts', _t(__CLASS__ . '.TABBLOGPOSTS', 'Blog Posts'));
$gridField = GridField::create(
'BlogPosts',
_t(__CLASS__ . '.BLOGPOSTS', 'Blog Posts'),
$this->owner->BlogPosts(),
$gridFieldConfig = GridFieldConfigBlogPost::create()
);
// Remove the "add new blog post" action from a member's profile
$gridFieldConfig->removeComponentsByType(GridFieldAddNewButton::class);
$tab->Fields()->add($gridField);
$fields->addFieldToTab('Root', $tab);
// Ensure blog fields are added after defaults
$fields->addFieldToTab(
'Root.Main',
TextareaField::create('BlogProfileSummary'),
'BlogProfileImage'
);
return $fields;
}
}

247
src/Model/BlogObject.php Normal file
View File

@ -0,0 +1,247 @@
<?php
namespace SilverStripe\Blog\Model;
use SilverStripe\Control\Controller;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\Tab;
use SilverStripe\Forms\TabSet;
use SilverStripe\Forms\TextField;
use SilverStripe\ORM\DataList;
use SilverStripe\ORM\ValidationResult;
use SilverStripe\Security\Member;
use SilverStripe\Security\Permission;
use SilverStripe\View\Parsers\URLSegmentFilter;
/**
* An object shared by BlogTag and BlogCategory.
*
*/
trait BlogObject
{
/**
* @param int|array|null $id Optional ID(s) for parent of this relation, if not the current record
* @return DataList
*/
public function BlogPosts($id = null)
{
$blogPosts = parent::BlogPosts($id);
$this->extend('updateGetBlogPosts', $blogPosts);
return $blogPosts;
}
/**
* {@inheritdoc}
*/
public function getCMSFields()
{
$fields = TabSet::create(
'Root',
Tab::create(
'Main',
TextField::create('Title', _t(__CLASS__ . '.Title', 'Title'))
)
);
$fields = FieldList::create($fields);
$this->extend('updateCMSFields', $fields);
return $fields;
}
/**
* {@inheritdoc}
* @return ValidationResult
*/
public function validate()
{
/** @var ValidationResult $validation */
$validation = parent::validate();
if (!$validation->isValid()) {
return $validation;
}
$blog = $this->Blog();
if (!$blog || !$blog->exists()) {
return $validation;
}
if ($this->getDuplicatesByField('Title')->count() > 0) {
$validation->addError($this->getDuplicateError(), self::DUPLICATE_EXCEPTION);
}
return $validation;
}
/**
* Returns a relative link to this category.
*
* @return string
*/
public function getLink()
{
return Controller::join_links(
$this->Blog()->Link(),
$this->getListUrlSegment(),
$this->URLSegment
);
}
/**
* Inherits from the parent blog or can be overwritten using a DataExtension.
*
* @param null|Member $member
*
* @return bool
*/
public function canView($member = null)
{
$extended = $this->extendedCan(__FUNCTION__, $member);
if ($extended !== null) {
return $extended;
}
return $this->Blog()->canView($member);
}
/**
* {@inheritdoc}
*/
public function canCreate($member = null, $context = [])
{
$extended = $this->extendedCan(__FUNCTION__, $member);
if ($extended !== null) {
return $extended;
}
$permission = Blog::config()->grant_user_permission;
return Permission::checkMember($member, $permission);
}
/**
* Inherits from the parent blog or can be overwritten using a DataExtension.
*
* @param null|Member $member
*
* @return bool
*/
public function canDelete($member = null)
{
$extended = $this->extendedCan(__FUNCTION__, $member);
if ($extended !== null) {
return $extended;
}
return $this->Blog()->canDelete($member);
}
/**
* Inherits from the parent blog or can be overwritten using a DataExtension.
*
* @param null|Member $member
*
* @return bool
*/
public function canEdit($member = null)
{
$extended = $this->extendedCan(__FUNCTION__, $member);
if ($extended !== null) {
return $extended;
}
return $this->Blog()->canEdit($member);
}
/**
* {@inheritdoc}
*/
protected function onBeforeWrite()
{
parent::onBeforeWrite();
if ($this->exists() || empty($this->URLSegment)) {
return $this->generateURLSegment();
}
}
/**
* Generates a unique URLSegment from the title.
*
* @param int $increment
*
* @return string
*/
public function generateURLSegment($increment = 0)
{
$increment = (int) $increment;
$filter = URLSegmentFilter::create();
// Setting this to on. Because of the UI flow, it would be quite a lot of work
// to support turning this off. (ie. the add by title flow would not work).
// If this becomes a problem we can approach it then.
// @see https://github.com/silverstripe/silverstripe-blog/issues/376
$filter->setAllowMultibyte(true);
$this->URLSegment = $filter->filter($this->Title);
if ($increment > 0) {
$this->URLSegment .= '-' . $increment;
}
if ($this->getDuplicatesByField('URLSegment')->count() > 0) {
$this->generateURLSegment($increment + 1);
}
return $this->URLSegment;
}
/**
* Looks for objects o the same type and the same value by the given Field
*
* @param string $field E.g. URLSegment or Title
* @return DataList
*/
protected function getDuplicatesByField($field)
{
$duplicates = DataList::create(self::class)
->filter(
[
$field => $this->$field,
'BlogID' => (int) $this->BlogID
]
);
if ($this->ID) {
$duplicates = $duplicates->exclude('ID', $this->ID);
}
return $duplicates;
}
/**
* This returns the url segment for the listing page.
* eg. 'categories' in /my-blog/categories/category-url
*
* This is not editable at the moment, but a method is being used incase we want
* to make it editable in the future. We can use this method to provide logic
* without replacing multiple areas of the code base. We're also not being opinionated
* about how the segment should be obtained at the moment and allowing for the
* implementation to decide.
*
* @return string
*/
abstract protected function getListUrlSegment();
/**
* Returns an error message for this object when it tries to write a duplicate.
*
* @return string
*/
abstract protected function getDuplicateError();
}

832
src/Model/BlogPost.php Normal file
View File

@ -0,0 +1,832 @@
<?php
namespace SilverStripe\Blog\Model;
use Page;
use SilverStripe\AssetAdmin\Forms\UploadField;
use SilverStripe\Assets\Image;
use SilverStripe\Control\Controller;
use SilverStripe\Core\Config\Config;
use SilverStripe\Forms\DatetimeField;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\HTMLEditor\HTMLEditorField;
use SilverStripe\Forms\ListboxField;
use SilverStripe\Forms\TextField;
use SilverStripe\Forms\ToggleCompositeField;
use SilverStripe\ORM\ArrayList;
use SilverStripe\ORM\FieldType\DBDatetime;
use SilverStripe\ORM\FieldType\DBHTMLText;
use SilverStripe\ORM\ManyManyList;
use SilverStripe\ORM\SS_List;
use SilverStripe\ORM\UnsavedRelationList;
use SilverStripe\Security\Group;
use SilverStripe\Security\Member;
use SilverStripe\Security\Permission;
use SilverStripe\Security\Security;
use SilverStripe\TagField\TagField;
use SilverStripe\Versioned\Versioned;
use SilverStripe\View\ArrayData;
use SilverStripe\View\Requirements;
/**
* An individual blog post.
*
* @method ManyManyList Categories()
* @method ManyManyList Tags()
* @method ManyManyList Authors()
* @method Blog Parent()
* @method Image FeaturedImage()
*
* @property string $PublishDate
* @property string $AuthorNames
* @property string $Summary
* @property int $ParentID
* @property int $FeaturedImageID
*/
class BlogPost extends Page
{
/**
* Same as above, but for list of users that can be
* given credit in the author field for blog posts
* @var string|bool false or group code
*/
private static $restrict_authors_to_group = false;
/**
* {@inheritDoc}
* @var string
*/
private static $table_name = 'BlogPost';
/**
* @var string
*/
private static $icon_class = 'font-icon-p-post';
/**
* @var array
*/
private static $db = [
'PublishDate' => 'Datetime',
'AuthorNames' => 'Varchar(1024)',
'Summary' => 'HTMLText'
];
/**
* @var array
*/
private static $indexes = [
'PublishDate' => true,
];
/**
* @var array
*/
private static $has_one = [
'FeaturedImage' => Image::class
];
/**
* @var array
*/
private static $owns = [
'FeaturedImage',
];
/**
* @var array
*/
private static $many_many = [
'Categories' => BlogCategory::class,
'Tags' => BlogTag::class,
'Authors' => Member::class
];
/**
* The ProvideComments db column is defined in the silverstripe/comments module
* The InheritSideBar db column is defined in the silverstripe/widgets module
*
* @var array
*/
private static $defaults = [
'ShowInMenus' => false,
'InheritSideBar' => true,
'ProvideComments' => true
];
/**
* @var array
*/
private static $extensions = [
BlogPostFilter::class
];
/**
* @var array
*/
private static $searchable_fields = [
'Title'
];
/**
* @var array
*/
private static $summary_fields = [
'Title'
];
/**
* @var array
*/
private static $casting = [
'Excerpt' => 'HTMLText',
'Date' => 'DBDatetime'
];
/**
* @var array
*/
private static $allowed_children = [];
/**
* The default sorting lists BlogPosts with an empty PublishDate at the top.
*
* @var string
*/
private static $default_sort = '"PublishDate" IS NULL DESC, "PublishDate" DESC';
/**
* @var bool
*/
private static $can_be_root = false;
/**
* This will display or hide the current class from the SiteTree. This variable can be
* configured using YAML.
*
* @var bool
*/
private static $show_in_sitetree = false;
/**
* This helps estimate how long an article will take to read, if your target audience
* is elderly then you should lower this value. See {@link getMinutesToRead()}
*
* @var int
*/
private static $minutes_to_read_wpm = 200;
/**
* Control whether the current member is added to list of authors when a post is created
*
* @var bool
*/
private static $add_default_author = true;
/**
* Sets the upload directory for featured images to help keep your files organised
*
* @config
* @var string
*/
private static $featured_images_directory = null;
/**
* Determine the role of the given member.
*
* Call be called via template to determine the current user.
*
* @example "Hello $RoleOf($CurrentMember.ID)"
*
* @param null|int|Member $member
*
* @return null|string
*/
public function RoleOf($member = null)
{
$member = $this->getMember($member);
if (!$member) {
return null;
}
if ($this->isAuthor($member)) {
return _t(__CLASS__ . '.AUTHOR', 'Author');
}
$parent = $this->Parent();
if ($parent instanceof Blog) {
return $parent->RoleOf($member);
}
return null;
}
/**
* Determine if the given member is an author of this post.
*
* @param null|Member $member
*
* @return bool
*/
public function isAuthor($member = null)
{
if (!$member || !$member->exists()) {
return false;
}
$list = $this->Authors();
if ($list instanceof UnsavedRelationList) {
return in_array($member->ID, $list->getIDList() ?? []);
}
return $list->byID($member->ID) !== null;
}
/**
* {@inheritdoc}
*/
public function getCMSFields()
{
Requirements::css('silverstripe/blog:client/dist/styles/main.css');
Requirements::javascript('silverstripe/blog:client/dist/js/main.bundle.js');
$this->beforeUpdateCMSFields(function ($fields) {
$uploadField = UploadField::create('FeaturedImage', _t(__CLASS__ . '.FeaturedImage', 'Featured Image'));
$uploadField->getValidator()->setAllowedExtensions(['jpg', 'jpeg', 'png', 'gif']);
$uploadDirectory = $this->config()->get('featured_images_directory');
if ($uploadDirectory != '') {
$uploadField->setFolderName($uploadDirectory);
}
/**
* @var FieldList $fields
*/
$fields->insertAfter('Content', $uploadField);
$summary = HtmlEditorField::create('Summary', false);
$summary->setRows(5);
$summary->setDescription(_t(
__CLASS__ . '.SUMMARY_DESCRIPTION',
'If no summary is specified the first 30 words will be used.'
));
$summaryHolder = ToggleCompositeField::create(
'CustomSummary',
_t(__CLASS__ . '.CUSTOMSUMMARY', 'Add A Custom Summary'),
[
$summary,
]
);
$summaryHolder->setHeadingLevel(4);
$summaryHolder->addExtraClass('custom-summary');
if ($this->Summary) {
$summaryHolder->setStartClosed(false);
}
$fields->insertAfter('FeaturedImage', $summaryHolder);
$authorField = ListboxField::create(
'Authors',
_t(__CLASS__ . '.Authors', 'Authors'),
$this->getCandidateAuthors()->map()->toArray()
);
$authorNames = TextField::create(
'AuthorNames',
_t(__CLASS__ . '.AdditionalCredits', 'Additional Credits'),
null,
1024
)->setDescription(
_t(
__CLASS__ . '.AdditionalCredits_Description',
'If some authors of this post don\'t have CMS access, enter their name(s) here. '.
'You can separate multiple names with a comma.'
)
);
if (!$this->canEditAuthors()) {
$authorField = $authorField->performDisabledTransformation();
$authorNames = $authorNames->performDisabledTransformation();
}
$publishDate = DatetimeField::create('PublishDate', _t(__CLASS__ . '.PublishDate', 'Publish Date'));
if (!$this->PublishDate) {
$publishDate->setDescription(
_t(
__CLASS__ . '.PublishDate_Description',
'Will be set to "now" if published without a value.'
)
);
}
// Get categories and tags
$parent = $this->Parent();
$categories = $parent instanceof Blog
? $parent->Categories()
: BlogCategory::get();
$tags = $parent instanceof Blog
? $parent->Tags()
: BlogTag::get();
// @todo: Reimplement the sidebar
// $options = BlogAdminSidebar::create(
$fields->addFieldsToTab(
'Root.PostOptions',
[
$publishDate,
TagField::create(
'Categories',
_t(__CLASS__ . '.Categories', 'Categories'),
$categories,
$this->Categories()
)
->setCanCreate($this->canCreateCategories())
->setShouldLazyLoad(true),
TagField::create(
'Tags',
_t(__CLASS__ . '.Tags', 'Tags'),
$tags,
$this->Tags()
)
->setCanCreate($this->canCreateTags())
->setShouldLazyLoad(true),
$authorField,
$authorNames
]
);
// )->setTitle('Post Options');
// $options->setName('blog-admin-sidebar');
// $fields->insertBefore($options, 'Root');
$fields->fieldByName('Root.PostOptions')
->setTitle(_t(__CLASS__ . '.PostOptions', 'Post Options'));
});
$fields = parent::getCMSFields();
$fields->fieldByName('Root')->setTemplate('TabSet_holder');
return $fields;
}
/**
* Gets the list of author candidates to be assigned as authors of this blog post.
*
* @return SS_List
*/
public function getCandidateAuthors()
{
if ($this->config()->get('restrict_authors_to_group')) {
return Group::get()->filter('Code', $this->config()->get('restrict_authors_to_group'))->first()->Members();
}
$list = Member::get();
$this->extend('updateCandidateAuthors', $list);
return $list;
}
/**
* Determine if this user can edit the authors list.
*
* @param null|int|Member $member
*
* @return bool
*/
public function canEditAuthors($member = null)
{
$member = $this->getMember($member);
$extended = $this->extendedCan('canEditAuthors', $member);
if ($extended !== null) {
return $extended;
}
$parent = $this->Parent();
if ($parent instanceof Blog && $parent->exists()) {
if ($parent->isEditor($member)) {
return true;
}
if ($parent->isWriter($member) && $this->isAuthor($member)) {
return true;
}
}
return Permission::checkMember($member, Blog::MANAGE_USERS);
}
/**
* @param null|int|Member $member
*
* @return null|Member
*/
protected function getMember($member = null)
{
if (!$member) {
$member = Security::getCurrentUser();
}
if (is_numeric($member)) {
$member = Member::get()->byID($member);
}
return $member;
}
/**
* Determine whether user can create new categories.
*
* @param null|int|Member $member
*
* @return bool
*/
public function canCreateCategories($member = null)
{
$member = $this->getMember($member);
$parent = $this->Parent();
if (!$parent || !$parent->exists() || !($parent instanceof Blog)) {
return false;
}
if ($parent->isEditor($member)) {
return true;
}
return Permission::checkMember($member, 'ADMIN');
}
/**
* Determine whether user can create new tags.
*
* @param null|int|Member $member
*
* @return bool
*/
public function canCreateTags($member = null)
{
$member = $this->getMember($member);
$parent = $this->Parent();
if (!$parent || !$parent->exists() || !($parent instanceof Blog)) {
return false;
}
if ($parent->isEditor($member)) {
return true;
}
if ($parent->isWriter($member)) {
return true;
}
return Permission::checkMember($member, 'ADMIN');
}
/**
* {@inheritdoc}
*
* Update the PublishDate to now if the BlogPost would otherwise be published without a date.
*/
public function onBeforePublish()
{
/**
* @var DBDatetime $publishDate
*/
$publishDate = $this->dbObject('PublishDate');
if (!$publishDate->getValue()) {
$this->PublishDate = DBDatetime::now()->getValue();
$this->write();
}
}
/**
* {@inheritdoc}
*
* Sets blog relationship on all categories and tags assigned to this post.
*/
public function onAfterWrite()
{
parent::onAfterWrite();
foreach ($this->Categories() as $category) {
/**
* @var BlogCategory $category
*/
$category->BlogID = $this->ParentID;
$category->write();
}
foreach ($this->Tags() as $tag) {
/**
* @var BlogTag $tag
*/
$tag->BlogID = $this->ParentID;
$tag->write();
}
}
/**
* {@inheritdoc}
*/
public function canView($member = null)
{
$member = $this->getMember($member);
if (!parent::canView($member)) {
return false;
}
if ($this->canEdit($member)) {
return true;
}
// If on draft stage, user has permission to view draft, so show it
if (Versioned::get_stage() === Versioned::DRAFT) {
return true;
}
/**
* @var DBDatetime $publishDate
*/
$publishDate = $this->dbObject('PublishDate');
if (!$publishDate->exists()) {
return false;
}
return !$publishDate->InFuture();
}
/**
* {@inheritdoc}
*/
public function canPublish($member = null)
{
$member = $this->getMember($member);
if (Permission::checkMember($member, 'ADMIN')) {
return true;
}
$extended = $this->extendedCan('canPublish', $member);
if ($extended !== null) {
return $extended;
}
$parent = $this->Parent();
if ($parent instanceof Blog && $parent->exists()) {
if ($parent->isEditor($member)) {
return true;
}
if ($parent->isWriter($member) && $this->isAuthor($member)) {
return true;
}
if ($parent->isContributor($member)) {
return parent::canEdit($member);
}
}
return $this->canEdit($member);
}
/**
* {@inheritdoc}
*/
public function canEdit($member = null)
{
$member = $this->getMember($member);
if (parent::canEdit($member)) {
return true;
}
$parent = $this->Parent();
if (!$parent || !$parent->exists() || !($parent instanceof Blog)) {
return false;
}
if ($parent->isEditor($member)) {
return true;
}
if (!$parent->isWriter($member) && !$parent->isContributor($member)) {
return false;
}
return $this->isAuthor($member);
}
/**
* Returns the post excerpt.
*
* @param int $wordsToDisplay
*
* @return string
*/
public function Excerpt($wordsToDisplay = 30)
{
/** @var DBHTMLText $content */
$content = $this->dbObject('Content');
return $content->Summary($wordsToDisplay);
}
/**
* Returns a monthly archive link for the current blog post.
*
* @param string $type
* @return string
*/
public function getMonthlyArchiveLink($type = 'day')
{
/** @var DBDatetime $date */
$date = $this->dbObject('PublishDate');
if ($type !== 'year') {
if ($type === 'day') {
return Controller::join_links(
$this->Parent()->Link('archive'),
$date->format('Y'),
$date->format('M'),
$date->format('d')
);
}
return Controller::join_links($this->Parent()->Link('archive'), $date->format('Y'), $date->format('M'));
}
return Controller::join_links($this->Parent()->Link('archive'), $date->format('Y'));
}
/**
* Returns a yearly archive link for the current blog post.
*
* @return string
*/
public function getYearlyArchiveLink()
{
return $this->getMonthlyArchiveLink('year');
}
/**
* Resolves static and dynamic authors linked to this post.
*
* @return ArrayList
*/
public function getCredits()
{
$list = ArrayList::create();
$list->merge($this->getDynamicCredits());
$list->merge($this->getStaticCredits());
return $list->sort('Name');
}
/**
* Resolves dynamic authors linked to this post.
*
* @return ArrayList
*/
protected function getDynamicCredits()
{
// Find best page to host user profiles
$parent = $this->Parent();
if (! ($parent instanceof Blog)) {
$parent = Blog::get()->first();
}
// If there is no parent blog, return list undecorated
if (!$parent) {
$items = $this->Authors()->toArray();
return ArrayList::create($items);
}
// Update all authors
$items = ArrayList::create();
foreach ($this->Authors() as $author) {
// Add link for each author
$author = $author->customise([
'URL' => $parent->ProfileLink($author->URLSegment),
]);
$items->push($author);
}
return $items;
}
/**
* Resolves static authors linked to this post.
*
* @return ArrayList
*/
protected function getStaticCredits()
{
$items = ArrayList::create();
$authors = array_filter(preg_split('/\s*,\s*/', $this->AuthorNames ?? '') ?? []);
foreach ($authors as $author) {
$item = ArrayData::create([
'Name' => $author,
]);
$items->push($item);
}
return $items;
}
/**
* Checks to see if User Profiles has been disabled via config
*
* @return bool
*/
public function getProfilesDisabled()
{
return Config::inst()->get(BlogController::class, 'disable_profiles');
}
/**
* Sets the label for BlogPost.Title to 'Post Title' (Rather than 'Page name').
*
* @param bool $includeRelations
*
* @return array
*/
public function fieldLabels($includeRelations = true)
{
$labels = parent::fieldLabels($includeRelations);
$labels['Title'] = _t(__CLASS__ . '.PageTitleLabel', 'Post Title');
return $labels;
}
/**
* Proxy method for displaying the publish date in rss feeds.
* @see https://github.com/silverstripe/silverstripe-blog/issues/394
*
* @return string|null
*/
public function getDate()
{
if ($this->hasDatabaseField('Date')) {
return $this->getField('Date');
}
return !empty($this->PublishDate) ? $this->PublishDate : null;
}
/**
* Provides a rough estimate of how long this post will take to read based on wikipedias answer to "How fast can a
* human read" of 200wpm. Source https://en.wikipedia.org/wiki/Speed_reading
*
* @param null|integer $wpm
*
* @return string
*/
public function MinutesToRead($wpm = null)
{
$wpm = $wpm ?: $this->config()->get('minutes_to_read_wpm');
if (!is_numeric($wpm)) {
throw new \InvalidArgumentException(sprintf("Expecting integer but got %s instead", gettype($wpm)));
}
$wordCount = str_word_count(strip_tags($this->Content ?? ''));
if ($wordCount < $wpm) {
return 0;
}
return round($wordCount / $wpm, 0);
}
/**
* {@inheritdoc}
*/
protected function onBeforeWrite()
{
parent::onBeforeWrite();
if (!$this->exists() && $this->config()->get('add_default_author') && ($member = Security::getCurrentUser())) {
$this->Authors()->add($member);
}
}
}

View File

@ -0,0 +1,10 @@
<?php
namespace SilverStripe\Blog\Model;
use PageController;
class BlogPostController extends PageController
{
}

View File

@ -0,0 +1,32 @@
<?php
namespace SilverStripe\Blog\Model;
use SilverStripe\ORM\DataExtension;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\CheckboxField;
/**
* Adds a checkbox field for featured blog posts widget.
*/
class BlogPostFeaturedExtension extends DataExtension
{
/**
* @var array
*/
private static $db = [
'FeaturedInWidget' => 'Boolean',
];
/**
* {@inheritdoc}
*/
public function updateCMSFields(FieldList $fields)
{
// Add the checkbox in.
$fields->addFieldToTab(
'Root.PostOptions',
CheckboxField::create('FeaturedInWidget', _t(__CLASS__ . '.FEATURED', 'Include Post in Feature Widget'))
);
}
}

View File

@ -0,0 +1,70 @@
<?php
namespace SilverStripe\Blog\Model;
use SilverStripe\Admin\LeftAndMain;
use SilverStripe\Control\Controller;
use SilverStripe\Core\Convert;
use SilverStripe\ORM\DataExtension;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\DataQuery;
use SilverStripe\ORM\FieldType\DBDatetime;
use SilverStripe\ORM\Queries\SQLSelect;
use SilverStripe\Security\Permission;
use SilverStripe\Versioned\Versioned;
/**
* This is responsible for filtering only published posts to users who do not have permission to
* view non-published posts.
*
*/
class BlogPostFilter extends DataExtension
{
/**
* Augment queries so that we don't fetch unpublished articles.
*
* @param SQLSelect $query
* @param DataQuery $query
*/
public function augmentSQL(SQLSelect $query, DataQuery $dataQuery = null)
{
if (Controller::has_curr() && Controller::curr() instanceof LeftAndMain) {
return;
}
if (Versioned::get_stage() === Versioned::LIVE ||
(
Versioned::get_draft_site_secured() &&
!Permission::check('VIEW_DRAFT_CONTENT')
)
) {
$query->addWhere(sprintf(
'"PublishDate" < \'%s\'',
Convert::raw2sql(DBDatetime::now())
));
}
}
/**
* {@inheritDoc}
*
* This is a fix so that when we try to fetch subclasses of BlogPost, lazy loading includes the
* BlogPost table in its query. Leaving this table out means the default sort order column
* PublishDate causes an error.
*
* @see https://github.com/silverstripe/silverstripe-framework/issues/1682
*
* @param SQLSelect $query
* @param DataQuery $dataQuery
* @param DataObject $dataObject
*/
public function augmentLoadLazyFields(SQLSelect &$query, DataQuery &$dataQuery = null, $dataObject)
{
$blogPostTable = DataObject::getSchema()->tableName(BlogPost::class);
$dataQuery->innerJoin(
$blogPostTable,
'"SiteTree"."ID" = "' . $blogPostTable . '"."ID"'
);
}
}

View File

@ -0,0 +1,54 @@
<?php
namespace SilverStripe\Blog\Model;
use SilverStripe\Comments\Model\Comment;
use SilverStripe\Core\Config\Config;
use SilverStripe\ORM\DataExtension;
use SilverStripe\ORM\SS_List;
use SilverStripe\Security\Member;
/**
* Customise blog post to support comment notifications.
*
* Extends {@see BlogPost} with extensions to {@see CommentNotifiable}.
*/
class BlogPostNotifications extends DataExtension
{
/**
* Configure whether to send notifications even for spam comments
*
* @config
* @var boolean
*/
private static $notification_on_spam = true;
/**
* Notify all authors of notifications.
*
* @param SS_List $list
* @param mixed $comment
*/
public function updateNotificationRecipients(&$list, &$comment)
{
//default is notification is on regardless of spam status
$list = $this->owner->Authors();
// If comment is spam and notification are set to not send on spam clear the recipient list
if (Config::inst()->get(__CLASS__, 'notification_on_spam') == false && $comment->IsSpam) {
$list = [];
}
}
/**
* Update comment to include the page title.
*
* @param string $subject
* @param Comment $comment
* @param Member|string $recipient
*/
public function updateNotificationSubject(&$subject, &$comment, &$recipient)
{
$subject = sprintf('A new comment has been posted on %s', $this->owner->Title);
}
}

73
src/Model/BlogTag.php Normal file
View File

@ -0,0 +1,73 @@
<?php
namespace SilverStripe\Blog\Model;
use SilverStripe\ORM\DataObject;
/**
* A blog tag for keyword descriptions of a blog post.
*
*
* @method Blog Blog()
*
* @property string $Title
* @property string $URLSegment
* @property int $BlogID
*/
class BlogTag extends DataObject implements CategorisationObject
{
use BlogObject;
/**
* Use an exception code so that attempted writes can continue on
* duplicate errors.
*
* @const string
* This must be a string because ValidationException has decided we can't use int
*/
const DUPLICATE_EXCEPTION = 'DUPLICATE';
/**
* {@inheritDoc}
* @var string
*/
private static $table_name = 'BlogTag';
/**
* @var array
*/
private static $db = [
'Title' => 'Varchar(255)',
'URLSegment' => 'Varchar(255)'
];
/**
* @var array
*/
private static $has_one = [
'Blog' => Blog::class
];
/**
* @var array
*/
private static $belongs_many_many = [
'BlogPosts' => BlogPost::class
];
/**
* {@inheritdoc}
*/
protected function getListUrlSegment()
{
return 'tag';
}
/**
* {@inheritdoc}
*/
protected function getDuplicateError()
{
return _t(__CLASS__ . '.Duplicate', 'A blog tag already exists with that name.');
}
}

View File

@ -0,0 +1,11 @@
<?php
namespace SilverStripe\Blog\Model;
/**
* @method ManyManyList BlogPosts
*/
interface CategorisationObject
{
}

View File

@ -0,0 +1,159 @@
<?php
namespace SilverStripe\Blog\Widgets;
use SilverStripe\Blog\Model\Blog;
use SilverStripe\Control\Controller;
use SilverStripe\Forms\DropdownField;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\NumericField;
use SilverStripe\ORM\ArrayList;
use SilverStripe\ORM\DB;
use SilverStripe\ORM\FieldType\DBDate;
use SilverStripe\ORM\FieldType\DBDatetime;
use SilverStripe\ORM\FieldType\DBEnum;
use SilverStripe\ORM\Queries\SQLSelect;
use SilverStripe\Versioned\Versioned;
use SilverStripe\View\ArrayData;
use SilverStripe\Widgets\Model\Widget;
if (!class_exists(Widget::class)) {
return;
}
/**
* @method Blog Blog()
*
* @property string $ArchiveType
* @property int $NumberToDisplay
*/
class BlogArchiveWidget extends Widget
{
/**
* @var string
*/
private static $title = 'Archive';
/**
* @var string
*/
private static $cmsTitle = 'Archive';
/**
* @var string
*/
private static $description = 'Displays an archive list of posts.';
/**
* @var array
*/
private static $db = [
'NumberToDisplay' => 'Int',
'ArchiveType' => 'Enum(\'Monthly,Yearly\', \'Monthly\')',
];
/**
* @var array
*/
private static $defaults = [
'NumberOfMonths' => 12,
];
/**
* @var array
*/
private static $has_one = [
'Blog' => Blog::class,
];
/**
* @var string
*/
private static $table_name = 'BlogArchiveWidget';
/**
* {@inheritdoc}
*/
public function getCMSFields()
{
$this->beforeUpdateCMSFields(function ($fields) {
/**
* @var DBEnum $archiveType
*/
$archiveType = $this->dbObject('ArchiveType');
$type = $archiveType->enumValues();
foreach ($type as $k => $v) {
$type[$k] = _t(__CLASS__ .'.' . ucfirst(strtolower($v ?? '')), $v);
}
/**
* @var FieldList $fields
*/
$fields->merge([
DropdownField::create(
'BlogID',
_t(__CLASS__ . '.Blog', 'Blog'),
Blog::get()->map()
),
DropdownField::create('ArchiveType', _t(__CLASS__ . '.ArchiveType', 'ArchiveType'), $type),
NumericField::create('NumberToDisplay', _t(__CLASS__ . '.NumberToDisplay', 'No. to Display'))
]);
});
return parent::getCMSFields();
}
/**
* Returns a list of months where blog posts are present.
*
* @return ArrayList
*/
public function getArchive()
{
$format = ($this->ArchiveType == 'Yearly') ? '%Y' : '%Y-%m';
$publishDate = DB::get_conn()->formattedDatetimeClause('"PublishDate"', $format);
$fields = [
'PublishDate' => $publishDate,
'Total' => "COUNT('\"PublishDate\"')"
];
$stage = Versioned::get_stage();
$suffix = ($stage === Versioned::LIVE) ? '_' . Versioned::LIVE : '';
$query = SQLSelect::create($fields, '"BlogPost' . $suffix . '"')
->addGroupBy($publishDate)
->addOrderBy('"PublishDate" DESC')
->addLeftJoin('SiteTree' . $suffix, '"SiteTree' . $suffix . '"."ID" = "BlogPost' . $suffix . '"."ID"')
->addWhere([
'"PublishDate" <= ?' => DBDatetime::now()->Format(DBDatetime::ISO_DATETIME),
'"SiteTree' . $suffix . '"."ParentID"' => $this->BlogID,
]);
$posts = $query->execute();
$result = ArrayList::create();
foreach ($posts as $post) {
if ($this->ArchiveType == 'Yearly') {
$year = $post['PublishDate'];
$month = null;
$title = $year;
} else {
$date = DBDate::create();
$date->setValue(strtotime($post['PublishDate'] ?? ''));
$year = $date->Format('y');
$month = $date->Format('MM');
$title = $date->Format('MMMM y');
}
$result->push(ArrayData::create([
'Title' => $title,
'Link' => Controller::join_links($this->Blog()->Link('archive'), $year, $month)
]));
}
$this->extend('updateGetArchive', $result);
return $result;
}
}

View File

@ -0,0 +1,14 @@
<?php
namespace SilverStripe\Blog\Widgets;
use SilverStripe\Widgets\Model\WidgetController;
if (!class_exists(WidgetController::class)) {
return;
}
class BlogArchiveWidgetController extends WidgetController
{
}

View File

@ -0,0 +1,131 @@
<?php
namespace SilverStripe\Blog\Widgets;
use SilverStripe\Blog\Model\Blog;
use SilverStripe\Core\Convert;
use SilverStripe\Forms\DropdownField;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\NumericField;
use SilverStripe\ORM\DataList;
use SilverStripe\Widgets\Model\Widget;
if (!class_exists(Widget::class)) {
return;
}
/**
* @method Blog Blog()
*/
class BlogCategoriesWidget extends Widget
{
/**
* @var string
*/
private static $title = 'Categories';
/**
* @var string
*/
private static $cmsTitle = 'Blog Categories';
/**
* @var string
*/
private static $description = 'Displays a list of blog categories.';
/**
* @var array
*/
private static $db = [
'Limit' => 'Int',
'Order' => 'Varchar',
'Direction' => 'Varchar',
];
/**
* @var array
*/
private static $has_one = [
'Blog' => Blog::class,
];
/**
* @var string
*/
private static $table_name = 'BlogCategoriesWidget';
/**
* {@inheritdoc}
*/
public function getCMSFields()
{
$this->beforeUpdateCMSFields(function (FieldList $fields) {
$fields[] = DropdownField::create(
'BlogID',
_t(__CLASS__ . '.Blog', 'Blog'),
Blog::get()->map()
);
$fields[] = NumericField::create(
'Limit',
_t(__CLASS__ . '.Limit', 'Limit'),
0
)
->setDescription(
_t(
__CLASS__ . '.Limit_Description',
'Limit the number of categories shown by this widget (set to 0 to show all categories).'
)
)
->setMaxLength(3);
$fields[] = DropdownField::create(
'Order',
_t(__CLASS__ . '.Sort', 'Sort'),
['Title' => 'Title', 'Created' => 'Created', 'LastEdited' => 'Updated']
)
->setDescription(
_t(__CLASS__ . '.Sort_Description', 'Change the order of categories shown by this widget.')
);
$fields[] = DropdownField::create(
'Direction',
_t(__CLASS__ . '.Direction', 'Direction'),
['ASC' => 'Ascending', 'DESC' => 'Descending']
)
->setDescription(
_t(
__CLASS__ . '.Direction_Description',
'Change the direction of ordering of categories shown by this widget.'
)
);
});
return parent::getCMSFields();
}
/**
* @return DataList
*/
public function getCategories()
{
$blog = $this->Blog();
if (!$blog) {
return [];
}
$query = $blog->Categories();
if ($this->Limit) {
$query = $query->limit(Convert::raw2sql($this->Limit));
}
if ($this->Order && $this->Direction) {
$query = $query->sort(Convert::raw2sql($this->Order), Convert::raw2sql($this->Direction));
}
return $query;
}
}

View File

@ -0,0 +1,14 @@
<?php
namespace SilverStripe\Blog\Widgets;
use SilverStripe\Widgets\Model\WidgetController;
if (!class_exists(WidgetController::class)) {
return;
}
class BlogCategoriesWidgetController extends WidgetController
{
}

View File

@ -0,0 +1,93 @@
<?php
namespace SilverStripe\Blog\Widgets;
use SilverStripe\Blog\Model\Blog;
use SilverStripe\Control\Director;
use SilverStripe\Forms\DropdownField;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\NumericField;
use SilverStripe\ORM\DataList;
use SilverStripe\Widgets\Model\Widget;
if (!class_exists(Widget::class)) {
return;
}
/**
* @method Blog Blog()
*
* @property int $NumberOfPosts
*/
class BlogFeaturedPostsWidget extends Widget
{
/**
* @var string
*/
private static $title = 'Featured Posts';
/**
* @var string
*/
private static $cmsTitle = 'Featured Posts';
/**
* @var string
*/
private static $description = 'Displays a list of featured blog posts.';
/**
* @var array
*/
private static $db = [
'NumberOfPosts' => 'Int',
];
/**
* @var array
*/
private static $has_one = [
'Blog' => Blog::class,
];
/**
* @var string
*/
private static $table_name = 'BlogFeaturedPostsWidget';
/**
* {@inheritdoc}
*/
public function getCMSFields()
{
$this->beforeUpdateCMSFields(function ($fields) {
/**
* @var FieldList $fields
*/
$fields->merge([
DropdownField::create('BlogID', _t(__CLASS__ . '.Blog', 'Blog'), Blog::get()->map()),
NumericField::create('NumberOfPosts', _t(__CLASS__ . '.NumberOfPosts', 'Number of Posts'))
]);
});
return parent::getCMSFields();
}
/**
* @return array|DataList
*/
public function getPosts()
{
$blog = $this->Blog();
if ($blog) {
return $blog->getBlogPosts()
->filter('ID:not', Director::get_current_page()->ID)
->filter('FeaturedInWidget', true)
->sort('RAND()')
->limit($this->NumberOfPosts);
}
return [];
}
}

View File

@ -0,0 +1,92 @@
<?php
namespace SilverStripe\Blog\Widgets;
use SilverStripe\Blog\Model\Blog;
use SilverStripe\Control\Director;
use SilverStripe\Forms\DropdownField;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\NumericField;
use SilverStripe\ORM\DataList;
use SilverStripe\Widgets\Model\Widget;
if (!class_exists(Widget::class)) {
return;
}
/**
* @method Blog Blog()
*
* @property int $NumberOfPosts
*/
class BlogRecentPostsWidget extends Widget
{
/**
* @var string
*/
private static $title = 'Recent Posts';
/**
* @var string
*/
private static $cmsTitle = 'Recent Posts';
/**
* @var string
*/
private static $description = 'Displays a list of recent blog posts.';
/**
* @var array
*/
private static $db = [
'NumberOfPosts' => 'Int',
];
/**
* @var array
*/
private static $has_one = [
'Blog' => Blog::class,
];
/**
* @var string
*/
private static $table_name = 'BlogRecentPostsWidget';
/**
* {@inheritdoc}
*/
public function getCMSFields()
{
$this->beforeUpdateCMSFields(function ($fields) {
/**
* @var FieldList $fields
*/
$fields->merge([
DropdownField::create('BlogID', _t(__CLASS__ . '.Blog', 'Blog'), Blog::get()->map()),
NumericField::create('NumberOfPosts', _t(__CLASS__ . '.NumberOfPosts', 'Number of Posts'))
]);
});
return parent::getCMSFields();
}
/**
* @return array|DataList
*/
public function getPosts()
{
$blog = $this->Blog();
if ($blog) {
return $blog->getBlogPosts()
->filter('ID:not', Director::get_current_page()->ID)
->sort('"PublishDate" DESC')
->limit($this->NumberOfPosts);
}
return [];
}
}

View File

@ -0,0 +1,14 @@
<?php
namespace SilverStripe\Blog\Widgets;
use SilverStripe\Widgets\Model\WidgetController;
if (!class_exists(WidgetController::class)) {
return;
}
class BlogRecentPostsWidgetController extends WidgetController
{
}

View File

@ -0,0 +1,125 @@
<?php
namespace SilverStripe\Blog\Widgets;
use SilverStripe\Blog\Model\Blog;
use SilverStripe\Core\Convert;
use SilverStripe\Forms\DropdownField;
use SilverStripe\ORM\ArrayList;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\DB;
use SilverStripe\Widgets\Model\Widget;
if (!class_exists(Widget::class)) {
return;
}
/**
* @method Blog Blog()
*/
class BlogTagsCloudWidget extends Widget
{
/**
* @var string
*/
private static $title = 'Tags Cloud';
/**
* @var string
*/
private static $cmsTitle = 'Blog Tags Cloud';
/**
* @var string
*/
private static $description = 'Displays a tag cloud for this blog.';
/**
* @var array
*/
private static $db = [];
/**
* @var array
*/
private static $has_one = [
'Blog' => Blog::class,
];
/**
* @var string
*/
private static $table_name = 'BlogTagsCloudWidget';
/**
* {@inheritdoc}
*/
public function getCMSFields()
{
$this->beforeUpdateCMSFields(function ($fields) {
/*
* @var FieldList $fields
*/
$fields->push(
DropdownField::create(
'BlogID',
_t(__CLASS__ . '.Blog', 'Blog'),
Blog::get()->map()
)
);
});
return parent::getCMSFields();
}
/**
* @return array
*/
public function getTags()
{
if ($blog = $this->Blog()) {
$escapedID = Convert::raw2sql($blog->ID);
$sql = 'SELECT DISTINCT "BlogTag"."URLSegment","BlogTag"."Title",Count("BlogTagID") AS "TagCount"
from "BlogPost_Tags"
INNER JOIN "BlogPost"
ON "BlogPost"."ID" = "BlogPost_Tags"."BlogPostID"
INNER JOIN "BlogTag"
ON "BlogTag"."ID" = "BlogPost_Tags"."BlogTagID"
WHERE "BlogID" = ' . $escapedID
. ' GROUP By "BlogTag"."URLSegment","BlogTag"."Title"
ORDER BY "Title"';
$records = DB::query($sql);
$bloglink = $blog->Link();
$maxTagCount = 0;
// create DataObjects that can be used to render the tag cloud
$tags = ArrayList::create();
foreach ($records as $record) {
$tag = DataObject::create();
$tag->TagName = $record['Title'];
$link = $bloglink.'tag/'.$record['URLSegment'];
$tag->Link = $link;
if ($record['TagCount'] > $maxTagCount) {
$maxTagCount = $record['TagCount'];
}
$tag->TagCount = $record['TagCount'];
$tags->push($tag);
}
// normalize the tag counts from 1 to 10
if ($maxTagCount) {
$tagfactor = 10 / $maxTagCount;
foreach ($tags->getIterator() as $tag) {
$normalized = round($tagfactor * ($tag->TagCount));
$tag->NormalizedTag = $normalized;
}
}
return $tags;
}
return [];
}
}

View File

@ -0,0 +1,13 @@
<?php
namespace SilverStripe\Blog\Widgets;
use SilverStripe\Widgets\Model\WidgetController;
if (!class_exists(WidgetController::class)) {
return;
}
class BlogTagsCloudWidgetController extends WidgetController
{
}

View File

@ -0,0 +1,131 @@
<?php
namespace SilverStripe\Blog\Widgets;
use SilverStripe\Blog\Model\Blog;
use SilverStripe\Core\Convert;
use SilverStripe\Forms\DropdownField;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\NumericField;
use SilverStripe\ORM\DataList;
use SilverStripe\Widgets\Model\Widget;
if (!class_exists(Widget::class)) {
return;
}
/**
* @method Blog Blog()
*/
class BlogTagsWidget extends Widget
{
/**
* @var string
*/
private static $title = 'Tags';
/**
* @var string
*/
private static $cmsTitle = 'Blog Tags';
/**
* @var string
*/
private static $description = 'Displays a list of blog tags.';
/**
* @var array
*/
private static $db = [
'Limit' => 'Int',
'Order' => 'Varchar',
'Direction' => 'Varchar',
];
/**
* @var array
*/
private static $has_one = [
'Blog' => Blog::class
];
/**
* @var string
*/
private static $table_name = 'BlogTagsWidget';
/**
* {@inheritdoc}
*/
public function getCMSFields()
{
$this->beforeUpdateCMSFields(function (Fieldlist $fields) {
$fields[] = DropdownField::create(
'BlogID',
_t(__CLASS__ . '.Blog', 'Blog'),
Blog::get()->map()
);
$fields[] = NumericField::create(
'Limit',
_t(__CLASS__ . '.Limit', 'Limit'),
0
)
->setDescription(
_t(
__CLASS__ . '.Limit_Description',
'Limit the number of tags shown by this widget (set to 0 to show all tags).'
)
)
->setMaxLength(3);
$fields[] = DropdownField::create(
'Order',
_t(__CLASS__ . '.Sort', 'Sort'),
['Title' => 'Title', 'Created' => 'Created', 'LastEdited' => 'Updated']
)
->setDescription(
_t(__CLASS__ . '.Sort_Description', 'Change the order of tags shown by this widget.')
);
$fields[] = DropdownField::create(
'Direction',
_t(__CLASS__ . '.Direction', 'Direction'),
['ASC' => 'Ascending', 'DESC' => 'Descending']
)
->setDescription(
_t(
__CLASS__ . '.Direction_Description',
'Change the direction of ordering of tags shown by this widget.'
)
);
});
return parent::getCMSFields();
}
/**
* @return DataList
*/
public function getTags()
{
$blog = $this->Blog();
if (!$blog) {
return [];
}
$query = $blog->Tags();
if ($this->Limit) {
$query = $query->limit(Convert::raw2sql($this->Limit));
}
if ($this->Order && $this->Direction) {
$query = $query->sort(Convert::raw2sql($this->Order), Convert::raw2sql($this->Direction));
}
return $query;
}
}

View File

@ -0,0 +1,14 @@
<?php
namespace SilverStripe\Blog\Widgets;
use SilverStripe\Widgets\Model\WidgetController;
if (!class_exists(WidgetController::class)) {
return;
}
class BlogTagsWidgetController extends WidgetController
{
}

View File

@ -1,20 +0,0 @@
<div class="cms-content-tools east cms-panel cms-panel-layout blog-admin-sidebar<% if $isOpen %> open<% end_if %>"
data-expandOnClick="true"
data-layout-type="border"
id="blog-admin-sidebar">
<div class="cms-panel-content center">
<div class="cms-content-view cms-tree-view-sidebar" id="blog-admin-content">
<h3 class="cms-panel-header">$Title</h3>
<% loop $Children %>
$FieldHolder
<% end_loop %>
</div>
</div>
<div class="cms-panel-content-collapsed">
<h3 class="cms-panel-header">$Title</h3>
</div>
<div class="cms-panel-toggle south">
<a class="toggle-expand" href="#"><span>&laquo;</span></a>
<a class="toggle-collapse" href="#"><span>&raquo;</span></a>
</div>
</div>

View File

@ -1,5 +0,0 @@
<div class="add-existing-autocompleter">
<% loop $Fields %>
<span>$Field</span>
<% end_loop %>
</div>

View File

@ -1,5 +0,0 @@
<% if $SideBarView %>
<div class="blog-sidebar typography unit size1of4 lastUnit">
$SideBarView
</div>
<% end_if %>

View File

@ -1,31 +0,0 @@
<p class="blog-post-meta">
<% if $Categories.exists %>
<%t Blog.PostedIn "Posted in" %>
<% loop $Categories %>
<a href="$Link" title="$Title">$Title</a><% if not Last %>, <% else %>;<% end_if %>
<% end_loop %>
<% end_if %>
<% if $Tags.exists %>
<%t Blog.Tagged "Tagged" %>
<% loop $Tags %>
<a href="$Link" title="$Title">$Title</a><% if not Last %>, <% else %>;<% end_if %>
<% end_loop %>
<% end_if %>
<% if $Comments.exists %>
<a href="{$Link}#comments-holder">
<%t Blog.Comments "Comments" %>
$Comments.count
</a>;
<% end_if %>
<%t Blog.Posted "Posted" %>
<a href="$MonthlyArchiveLink">$PublishDate.ago</a>
<% if $Credits %>
<%t Blog.By "by" %>
<% loop $Credits %><% if not $First && not $Last %>, <% end_if %><% if not $First && $Last %> and <% end_if %><% if $URLSegment %><a href="$URL">$Name.XML</a><% else %>$Name.XML<% end_if %><% end_loop %>
<% end_if %>
</p>

View File

@ -1,13 +0,0 @@
<section>
<h1>$CurrentProfile.FirstName $CurrentProfile.Surname</h1>
<div>
<% if $CurrentProfile.BlogProfileImage %>
<div class="profile-image">
$CurrentProfile.BlogProfileImage.setWidth(180)
</div>
<% end_if %>
<div class="profile-summary">
<p>$CurrentProfile.BlogProfileSummary</p>
</div>
</div>
</section>

View File

@ -1,25 +0,0 @@
<%-- NOTE: Before including this, you will need to wrap the include in a with block --%>
<% if $MoreThanOnePage %>
<p class="pagination">
<% if $NotFirstPage %>
<a class="prev" href="{$PrevLink}">&larr;</a>
<% end_if %>
<% loop $Pages %>
<% if $CurrentBool %>
<span>$PageNum</span>
<% else %>
<% if $Link %>
<a href="$Link">$PageNum</a>
<% else %>
<span>...</span>
<% end_if %>
<% end_if %>
<% end_loop %>
<% if $NotLastPage %>
<a class="next" href="{$NextLink}">&rarr;</a>
<% end_if %>
</p>
<% end_if %>

View File

@ -1,26 +0,0 @@
<div class="post-summary">
<h2>
<a href="$Link" title="<%t Blog.ReadMoreAbout "Read more about '{title}'..." title=$Title %>">
<% if $MenuTitle %>$MenuTitle
<% else %>$Title<% end_if %>
</a>
</h2>
<p class="post-image">
<a href="$Link" <%t Blog.ReadMoreAbout "Read more about '{title}'..." title=$Title %>>
$FeaturedImage.setWidth(795)
</a>
</p>
<% if $Summary %>
<p>$Summary
<% else %>
<p>$Excerpt
<% end_if %>
<a href="$Link">
<%t Blog.ReadMoreAbout "Read more about '{title}'..." title=$Title %>
</a>
</p>
<% include EntryMeta %>
</div>

View File

@ -1,44 +0,0 @@
<% require themedCSS('blog', 'blog') %>
<div class="blog-entry content-container <% if $SideBarView %>unit size3of4<% end_if %>">
<article>
<h1>
<% if $ArchiveYear %>
<%t Blog.Archive "Archive" %>:
<% if $ArchiveDay %>
$ArchiveDate.Nice
<% else_if $ArchiveMonth %>
$ArchiveDate.format("F, Y")
<% else %>
$ArchiveDate.format("Y")
<% end_if %>
<% else_if $CurrentTag %>
<%t Blog.Tag "Tag" %>: $CurrentTag.Title
<% else_if $CurrentCategory %>
<%t Blog.Category "Category" %>: $CurrentCategory.Title
<% else %>
$Title
<% end_if %>
</h1>
<div class="content">$Content</div>
<% if $PaginatedList.Exists %>
<% loop $PaginatedList %>
<% include PostSummary %>
<% end_loop %>
<% else %>
<p><%t Blog.NoPosts "There are no posts" %></p>
<% end_if %>
</article>
$Form
$CommentsForm
<% with $PaginatedList %>
<% include Pagination %>
<% end_with %>
</div>
<% include BlogSideBar %>

View File

@ -1,20 +0,0 @@
<% require themedCSS('blog', 'blog') %>
<div class="blog-entry content-container <% if $SideBarView %>unit size3of4<% end_if %>">
<article>
<h1>$Title</h1>
<% if $FeaturedImage %>
<p class="post-image">$FeaturedImage.setWidth(795)</p>
<% end_if %>
<div class="content">$Content</div>
<% include EntryMeta %>
</article>
$Form
$CommentsForm
</div>
<% include BlogSideBar %>

View File

@ -1,23 +0,0 @@
<% require themedCSS('blog', 'blog') %>
<div class="blog-entry content-container <% if $SideBarView %>unit size3of4<% end_if %>">
<% include MemberDetails %>
<% if $PaginatedList.Exists %>
<h2>Posts by $CurrentProfile.FirstName $CurrentProfile.Surname for $Title:</h2>
<% loop $PaginatedList %>
<% include PostSummary %>
<% end_loop %>
<% end_if %>
$Form
$CommentsForm
<% with $PaginatedList %>
<% include Pagination %>
<% end_with %>
</div>
<% include BlogSideBar %>

View File

@ -0,0 +1,20 @@
<div class="cms-content-tools east cms-panel cms-panel-layout blog-admin-sidebar<% if $isOpen %> open<% end_if %>"
data-expandOnClick="true"
data-layout-type="border"
id="blog-admin-sidebar">
<div class="cms-panel-content center">
<div class="cms-content-view cms-tree-view-sidebar" id="blog-admin-content">
<h3 class="cms-panel-header">$Title</h3>
<% loop $Children %>
$FieldHolder
<% end_loop %>
</div>
</div>
<div class="cms-panel-content-collapsed">
<h3 class="cms-panel-header">$Title</h3>
</div>
<div class="cms-panel-toggle south">
<a class="toggle-expand" href="#"><span>&laquo;</span></a>
<a class="toggle-collapse" href="#"><span>&raquo;</span></a>
</div>
</div>

View File

@ -0,0 +1,13 @@
<div class="add-existing-autocompleter">
<div class="input-group">
<% loop $Fields %>
<% if $Type == 'action' %>
<div class="input-group-append">
$Field
</div>
<% else %>
$Field
<% end_if %>
<% end_loop %>
</div>
</div>

View File

@ -1,4 +1,4 @@
<div class="blog-admin-outer">
<%-- this resets ths template (from TabSet_holder) and renders using forTemplate --%>
$setTemplate('')
</div>
<div class="blog-admin-outer">
<%-- this resets ths template (from TabSet_holder) and renders using forTemplate --%>
$setTemplate('')
</div>

View File

@ -0,0 +1,5 @@
<% if $SideBarView %>
<div class="blog-sidebar typography unit size1of4 lastUnit">
$SideBarView
</div>
<% end_if %>

View File

@ -0,0 +1,45 @@
<p class="blog-post-meta">
<% if $Categories.exists %>
<%t SilverStripe\\Blog\\Model\\Blog.PostedIn "Posted in" %>
<% loop $Categories %>
<a href="$Link" title="$Title">$Title</a><% if not $IsLast %>, <% else %>;<% end_if %>
<% end_loop %>
<% end_if %>
<% if $Tags.exists %>
<%t SilverStripe\\Blog\\Model\\Blog.Tagged "Tagged" %>
<% loop $Tags %>
<a href="$Link" title="$Title">$Title</a><% if not $IsLast %>, <% else %>;<% end_if %>
<% end_loop %>
<% end_if %>
<% if $Comments.exists %>
<a href="{$Link}#comments-holder">
<%t SilverStripe\\Blog\\Model\\Blog.Comments "Comments" %>
$Comments.count
</a>;
<% end_if %>
<%t SilverStripe\\Blog\\Model\\Blog.Posted "Posted" %>
<a href="$MonthlyArchiveLink">$PublishDate.ago</a>
<% if $Credits %>
<%t SilverStripe\\Blog\\Model\\Blog.By "by" %>
<% loop $Credits %>
<% if not $IsFirst && not $IsLast %>, <% end_if %>
<% if not $IsFirst && $IsLast %> <%t SilverStripe\\Blog\\Model\\Blog.AND "and" %> <% end_if %>
<% if $URLSegment && not $Up.ProfilesDisabled %>
<a href="$URL">$Name.XML</a>
<% else %>
$Name.XML
<% end_if %>
<% end_loop %>
<% end_if %>
<% if $MinutesToRead < 1 %>
<%t SilverStripe\\Blog\\Model\\Blog.LessThanAMinuteToRead "Less than a minute to read" %>
<% else %>
$MinutesToRead <%t SilverStripe\\Blog\\Model\\Blog.MinutesToRead "Minute(s) to read" %>
<% end_if %>
</p>

View File

@ -0,0 +1,13 @@
<section>
<h1>$CurrentProfile.FirstName $CurrentProfile.Surname</h1>
<div>
<% if $CurrentProfile.BlogProfileImage %>
<div class="profile-image">
$CurrentProfile.BlogProfileImage.ScaleWidth(180)
</div>
<% end_if %>
<div class="profile-summary">
<p>$CurrentProfile.BlogProfileSummary</p>
</div>
</div>
</section>

View File

@ -0,0 +1,25 @@
<%-- NOTE: Before including this, you will need to wrap the include in a with block --%>
<% if $MoreThanOnePage %>
<p class="pagination">
<% if $NotFirstPage %>
<a class="prev" href="{$PrevLink}">&larr;</a>
<% end_if %>
<% loop $PaginationSummary(4) %>
<% if $CurrentBool %>
<span>$PageNum</span>
<% else %>
<% if $Link %>
<a href="$Link">$PageNum</a>
<% else %>
<span>...</span>
<% end_if %>
<% end_if %>
<% end_loop %>
<% if $NotLastPage %>
<a class="next" href="{$NextLink}">&rarr;</a>
<% end_if %>
</p>
<% end_if %>

View File

@ -0,0 +1,27 @@
<div class="post-summary">
<h2>
<a href="$Link" title="<%t SilverStripe\\Blog\\Model\\Blog.ReadMoreAbout "Read more about '{title}'..." title=$Title %>">
<% if $MenuTitle %>$MenuTitle
<% else %>$Title<% end_if %>
</a>
</h2>
<p class="post-image">
<a href="$Link" title="<%t SilverStripe\\Blog\\Model\\Blog.ReadMoreAbout "Read more about '{title}'..." title=$Title %>">
$FeaturedImage.ScaleWidth(795)
</a>
</p>
<% if $Summary %>
$Summary
<% else %>
<p>$Excerpt</p>
<% end_if %>
<p>
<a href="$Link">
<%t SilverStripe\\Blog\\Model\\Blog.ReadMoreAbout "Read more about '{title}'..." title=$Title %>
</a>
</p>
<% include SilverStripe\\Blog\\EntryMeta %>
</div>

View File

@ -0,0 +1,44 @@
<% require css('silverstripe/blog: client/dist/styles/main.css') %>
<div class="blog-entry content-container <% if $SideBarView %>unit size3of4<% end_if %>">
<article>
<h1>
<% if $ArchiveYear %>
<%t SilverStripe\\Blog\\Model\\Blog.Archive 'Archive' %>:
<% if $ArchiveDay %>
$ArchiveDate.Nice
<% else_if $ArchiveMonth %>
$ArchiveDate.format('MMMM, y')
<% else %>
$ArchiveDate.format('y')
<% end_if %>
<% else_if $CurrentTag %>
<%t SilverStripe\\Blog\\Model\\Blog.Tag 'Tag' %>: $CurrentTag.Title
<% else_if $CurrentCategory %>
<%t SilverStripe\\Blog\\Model\\Blog.Category 'Category' %>: $CurrentCategory.Title
<% else %>
$Title
<% end_if %>
</h1>
<div class="content">$Content</div>
<% if $PaginatedList.Exists %>
<% loop $PaginatedList %>
<% include SilverStripe\\Blog\\PostSummary %>
<% end_loop %>
<% else %>
<p><%t SilverStripe\\Blog\\Model\\Blog.NoPosts 'There are no posts' %></p>
<% end_if %>
</article>
$Form
$CommentsForm
<% with $PaginatedList %>
<% include SilverStripe\\Blog\\Pagination %>
<% end_with %>
</div>
<% include SilverStripe\\Blog\\BlogSideBar %>

View File

@ -0,0 +1,20 @@
<% require css('silverstripe/blog: client/dist/styles/main.css') %>
<div class="blog-entry content-container <% if $SideBarView %>unit size3of4<% end_if %>">
<article>
<h1>$Title</h1>
<% if $FeaturedImage %>
<p class="post-image">$FeaturedImage.ScaleWidth(795)</p>
<% end_if %>
<div class="content">$Content</div>
<% include SilverStripe\\Blog\\EntryMeta %>
</article>
$Form
$CommentsForm
</div>
<% include SilverStripe\\Blog\\BlogSideBar %>

View File

@ -0,0 +1,23 @@
<% require css('silverstripe/blog: client/dist/styles/main.css') %>
<div class="blog-entry content-container <% if $SideBarView %>unit size3of4<% end_if %>">
<% include SilverStripe\\Blog\\MemberDetails %>
<% if $PaginatedList.Exists %>
<h2><%t SilverStripe\\Blog\\Model\\Blog.PostsByUser 'Posts by {firstname} {surname} for {title}' firstname=$CurrentProfile.FirstName surname=$CurrentProfile.Surname title=$Title %></h2>
<% loop $PaginatedList %>
<% include SilverStripe\\Blog\\PostSummary %>
<% end_loop %>
<% end_if %>
$Form
$CommentsForm
<% with $PaginatedList %>
<% include SilverStripe\\Blog\\Pagination %>
<% end_with %>
</div>
<% include SilverStripe\\Blog\\BlogSideBar %>

View File

@ -1,12 +1,12 @@
<% if $Archive %>
<ul>
<% loop $Archive %>
<li>
<a href="$Link" title="$Title">
<span class="arrow">&rarr;</span>
<span class="text">$Title</span>
</a>
</li>
<% end_loop %>
</ul>
<% end_if %>
<% if $Archive %>
<ul>
<% loop $Archive %>
<li>
<a href="$Link" title="$Title">
<span class="arrow">&rarr;</span>
<span class="text">$Title</span>
</a>
</li>
<% end_loop %>
</ul>
<% end_if %>

View File

@ -1,12 +1,12 @@
<% if $Categories %>
<ul>
<% loop $Categories %>
<li>
<a href="$Link" title="$Title">
<span class="arrow">&rarr;</span>
<span class="text">$Title</span>
</a>
</li>
<% end_loop %>
</ul>
<% if $Categories %>
<ul>
<% loop $Categories %>
<li>
<a href="$Link" title="$Title">
<span class="arrow">&rarr;</span>
<span class="text">$Title</span>
</a>
</li>
<% end_loop %>
</ul>
<% end_if %>

View File

@ -0,0 +1,12 @@
<% if $Posts %>
<ul>
<% loop $Posts %>
<li>
<a href="$Link" title="$Title">
<span class="arrow">&rarr;</span>
<span class="text">$Title</span>
</a>
</li>
<% end_loop %>
</ul>
<% end_if %>

View File

@ -1,12 +1,12 @@
<% if $Posts %>
<ul>
<% loop $Posts %>
<li>
<a href="$Link" title="$Title">
<span class="arrow">&rarr;</span>
<span class="text">$Title</span>
</a>
</li>
<% end_loop %>
</ul>
<% if $Posts %>
<ul>
<% loop $Posts %>
<li>
<a href="$Link" title="$Title">
<span class="arrow">&rarr;</span>
<span class="text">$Title</span>
</a>
</li>
<% end_loop %>
</ul>
<% end_if %>

View File

@ -0,0 +1,12 @@
<% if $Tags %>
<ul class="blogTagCloud">
<% loop $Tags %>
<li>
<a href="$Link" title="$TagName">
<span class="text tagCount{$NormalizedTag}">$TagName</span>
</a>
</li>
<% end_loop %>
</ul>
<div style="clear: both;"></div>
<% end_if %>

View File

@ -1,12 +1,12 @@
<% if $Tags %>
<ul>
<% loop $Tags %>
<li>
<a href="$Link" title="$Title">
<span class="arrow">&rarr;</span>
<span class="text">$Title</span>
</a>
</li>
<% end_loop %>
</ul>
<% if $Tags %>
<ul>
<% loop $Tags %>
<li>
<a href="$Link" title="$Title">
<span class="arrow">&rarr;</span>
<span class="text">$Title</span>
</a>
</li>
<% end_loop %>
</ul>
<% end_if %>

View File

@ -1,4 +1,4 @@
<nav class="secondary">
<h3>$Title</h3>
$Content
</nav>
<nav class="secondary">
<% if $Title %><h3>$Title</h3><% end_if %>
$Content
</nav>

View File

@ -1,118 +0,0 @@
<?php
/**
* @mixin PHPUnit_Framework_TestCase
*/
class BlogCategoryTest extends FunctionalTest {
/**
* @var string
*/
static $fixture_file = 'blog.yml';
/**
* {@inheritdoc}
*/
public function setUp() {
parent::setUp();
SS_Datetime::set_mock_now('2013-10-10 20:00:00');
}
/**
* {@inheritdoc}
*/
public function tearDown() {
SS_Datetime::clear_mock_now();
parent::tearDown();
}
/**
* Tests that any blog posts returned from $category->BlogPosts() many_many are published,
* both by normal 'save & publish' functionality and by publish date.
*/
public function testBlogPosts() {
$member = Member::currentUser();
if($member) {
$member->logout();
}
$this->objFromFixture('BlogPost', 'FirstBlogPost');
/**
* @var BlogCategory $category
*/
$category = $this->objFromFixture('BlogCategory', 'FirstCategory');
$this->assertEquals(1, $category->BlogPosts()->count(), 'Category blog post count');
}
public function testCanView() {
$this->useDraftSite();
$this->objFromFixture('Member', 'Admin');
$editor = $this->objFromFixture('Member', 'Editor');
$category = $this->objFromFixture('BlogCategory', 'SecondCategory');
$this->assertFalse($category->canView($editor), 'Editor should not be able to view category.');
}
/**
* The first blog can be viewed by anybody.
*/
public function testCanEdit() {
$this->useDraftSite();
$admin = $this->objFromFixture('Member', 'Admin');
$editor = $this->objFromFixture('Member', 'Editor');
$category = $this->objFromFixture('BlogCategory', 'FirstCategory');
$this->assertTrue($category->canEdit($admin), 'Admin should be able to edit category.');
$this->assertTrue($category->canEdit($editor), 'Editor should be able to edit category.');
$category = $this->objFromFixture('BlogCategory', 'SecondCategory');
$this->assertTrue($category->canEdit($admin), 'Admin should be able to edit category.');
$this->assertFalse($category->canEdit($editor), 'Editor should not be able to edit category.');
$category = $this->objFromFixture('BlogCategory', 'ThirdCategory');
$this->assertTrue($category->canEdit($admin), 'Admin should always be able to edit category.');
$this->assertTrue($category->canEdit($editor), 'Editor should be able to edit category.');
}
public function testCanCreate() {
$this->useDraftSite();
$admin = $this->objFromFixture('Member', 'Admin');
$editor = $this->objFromFixture('Member', 'Editor');
$category = singleton('BlogCategory');
$this->assertTrue($category->canCreate($admin), 'Admin should be able to create category.');
$this->assertTrue($category->canCreate($editor), 'Editor should be able to create category.');
}
public function testCanDelete() {
$this->useDraftSite();
$admin = $this->objFromFixture('Member', 'Admin');
$editor = $this->objFromFixture('Member', 'Editor');
$category = $this->objFromFixture('BlogCategory', 'FirstCategory');
$this->assertTrue($category->canDelete($admin), 'Admin should be able to delete category.');
$this->assertTrue($category->canDelete($editor), 'Editor should be able to category category.');
$category = $this->objFromFixture('BlogCategory', 'SecondCategory');
$this->assertTrue($category->canDelete($admin), 'Admin should be able to delete category.');
$this->assertFalse($category->canDelete($editor), 'Editor should not be able to delete category.');
$category = $this->objFromFixture('BlogCategory', 'ThirdCategory');
$this->assertTrue($category->canDelete($admin), 'Admin should always be able to delete category.');
$this->assertTrue($category->canDelete($editor), 'Editor should be able to delete category.');
}
}

View File

@ -1,42 +0,0 @@
<?php
/**
* @mixin PHPUnit_Framework_TestCase
*/
class BlogPostFilterTest extends SapphireTest {
/**
* @var string
*/
static $fixture_file = 'blog.yml';
public function setUp() {
parent::setUp();
SS_Datetime::set_mock_now('2013-10-10 20:00:00');
}
public function tearDown() {
SS_Datetime::clear_mock_now();
parent::tearDown();
}
public function testFilter() {
$member = Member::currentUser();
if($member) {
$member->logout();
}
/**
* @var Blog $blog
*/
$blog = $this->objFromFixture('Blog', 'FirstBlog');
$this->assertEquals(3, $blog->AllChildren()->Count(), 'Filtered blog posts');
SS_Datetime::set_mock_now('2020-01-01 00:00:00');
$this->assertEquals(5, $blog->AllChildren()->Count(), 'Unfiltered blog posts');
}
}

View File

@ -1,66 +0,0 @@
<?php
class BlogPostTest extends SapphireTest {
/**
* @var string
*/
static $fixture_file = 'blog.yml';
/**
* {@inheritdoc}
*/
public function setUp() {
parent::setUp();
}
/**
* {@inheritdoc}
*/
public function tearDown() {
SS_Datetime::clear_mock_now();
parent::tearDown();
}
/**
* @dataProvider canViewProvider
*/
public function testCanView($date, $user, $page, $canView) {
$userRecord = $this->objFromFixture('Member', $user);
$pageRecord = $this->objFromFixture('BlogPost', $page);
SS_Datetime::set_mock_now($date);
$this->assertEquals($canView, $pageRecord->canView($userRecord));
}
public function canViewProvider() {
$someFutureDate = '2013-10-10 20:00:00';
$somePastDate = '2009-10-10 20:00:00';
return array(
// Check this post given the date has passed
array($someFutureDate, 'Editor', 'PostA', true),
array($someFutureDate, 'Contributor', 'PostA', true),
array($someFutureDate, 'BlogEditor', 'PostA', true),
array($someFutureDate, 'Writer', 'PostA', true),
// Check unpublished pages
array($somePastDate, 'Editor', 'PostA', true),
array($somePastDate, 'Contributor', 'PostA', true),
array($somePastDate, 'BlogEditor', 'PostA', true),
array($somePastDate, 'Writer', 'PostA', true),
// Test a page that was authored by another user
// Check this post given the date has passed
array($someFutureDate, 'Editor', 'FirstBlogPost', true),
array($someFutureDate, 'Contributor', 'FirstBlogPost', true),
array($someFutureDate, 'BlogEditor', 'FirstBlogPost', true),
array($someFutureDate, 'Writer', 'FirstBlogPost', true),
// Check future pages - non-editors shouldn't be able to see this
array($somePastDate, 'Editor', 'FirstBlogPost', true),
array($somePastDate, 'Contributor', 'FirstBlogPost', false),
array($somePastDate, 'BlogEditor', 'FirstBlogPost', false),
array($somePastDate, 'Writer', 'FirstBlogPost', false),
);
}
}

View File

@ -1,126 +0,0 @@
<?php
/**
* @mixin PHPUnit_Framework_TestCase
*/
class BlogTagTest extends FunctionalTest {
/**
* @var string
*/
static $fixture_file = 'blog.yml';
/**
* {@inheritdoc}
*/
public function setUp() {
parent::setUp();
SS_Datetime::set_mock_now('2013-10-10 20:00:00');
}
/**
* {@inheritdoc}
*/
public function tearDown() {
SS_Datetime::clear_mock_now();
parent::tearDown();
}
/**
* Tests that any blog posts returned from $tag->BlogPosts() many_many are published, both by
* normal 'save & publish' functionality and by publish date.
*/
public function testBlogPosts() {
$member = Member::currentUser();
if($member) {
$member->logout();
}
$this->objFromFixture('BlogPost', 'FirstBlogPost');
/**
* @var BlogTag $tag
*/
$tag = $this->objFromFixture('BlogTag', 'FirstTag');
$this->assertEquals(1, $tag->BlogPosts()->count(), 'Tag blog post count');
}
/**
* The first blog can be viewed by anybody.
*/
public function testCanView() {
$this->useDraftSite();
$admin = $this->objFromFixture('Member', 'Admin');
$editor = $this->objFromFixture('Member', 'Editor');
$tag = $this->objFromFixture('BlogTag', 'FirstTag');
$this->assertTrue($tag->canView($admin), 'Admin should be able to view tag.');
$this->assertTrue($tag->canView($editor), 'Editor should be able to view tag.');
$tag = $this->objFromFixture('BlogTag', 'SecondTag');
$this->assertTrue($tag->canView($admin), 'Admin should be able to view tag.');
$this->assertFalse($tag->canView($editor), 'Editor should not be able to view tag.');
}
public function testCanEdit() {
$this->useDraftSite();
$admin = $this->objFromFixture('Member', 'Admin');
$editor = $this->objFromFixture('Member', 'Editor');
$tag = $this->objFromFixture('BlogTag', 'FirstTag');
$this->assertTrue($tag->canEdit($admin), 'Admin should be able to edit tag.');
$this->assertTrue($tag->canEdit($editor), 'Editor should be able to edit tag.');
$tag = $this->objFromFixture('BlogTag', 'SecondTag');
$this->assertTrue($tag->canEdit($admin), 'Admin should be able to edit tag.');
$this->assertFalse($tag->canEdit($editor), 'Editor should not be able to edit tag.');
$tag = $this->objFromFixture('BlogTag', 'ThirdTag');
$this->assertTrue($tag->canEdit($admin), 'Admin should always be able to edit tags.');
$this->assertTrue($tag->canEdit($editor), 'Editor should be able to edit tag.');
}
public function testCanCreate() {
$this->useDraftSite();
$admin = $this->objFromFixture('Member', 'Admin');
$editor = $this->objFromFixture('Member', 'Editor');
$tag = singleton('BlogTag');
$this->assertTrue($tag->canCreate($admin), 'Admin should be able to create tag.');
$this->assertTrue($tag->canCreate($editor), 'Editor should be able to create tag.');
}
public function testCanDelete() {
$this->useDraftSite();
$admin = $this->objFromFixture('Member', 'Admin');
$editor = $this->objFromFixture('Member', 'Editor');
$tag = $this->objFromFixture('BlogTag', 'FirstTag');
$this->assertTrue($tag->canDelete($admin), 'Admin should be able to delete tag.');
$this->assertTrue($tag->canDelete($editor), 'Editor should be able to delete tag.');
$tag = $this->objFromFixture('BlogTag', 'SecondTag');
$this->assertTrue($tag->canDelete($admin), 'Admin should be able to delete tag.');
$this->assertFalse($tag->canDelete($editor), 'Editor should not be able to delete tag.');
$tag = $this->objFromFixture('BlogTag', 'ThirdTag');
$this->assertTrue($tag->canDelete($admin), 'Admin should always be able to delete tags.');
$this->assertTrue($tag->canDelete($editor), 'Editor should be able to delete tag.');
}
}

View File

@ -1,256 +0,0 @@
<?php
/**
* @mixin PHPUnit_Framework_TestCase
*/
class BlogTest extends SapphireTest {
/**
* @var string
*/
static $fixture_file = 'blog.yml';
/**
* {@inheritdoc}
*/
public function setUp() {
parent::setUp();
Config::nest();
SS_Datetime::set_mock_now('2013-10-10 20:00:00');
/**
* @var Blog $blog
*/
$blog = $this->objFromFixture('Blog', 'FirstBlog');
$blog->publish('Stage', 'Live');
}
/**
* {@inheritdoc}
*/
public function tearDown() {
SS_Datetime::clear_mock_now();
Config::unnest();
parent::tearDown();
}
public function testGetExcludedSiteTreeClassNames() {
$member = Member::currentUser();
if($member) {
$member->logout();
}
/**
* @var Blog $blog
*/
$blog = $this->objFromFixture('Blog', 'FirstBlog');
Config::inst()->update('BlogPost', 'show_in_sitetree', true);
$classes = $blog->getExcludedSiteTreeClassNames();
$this->assertNotContains('BlogPost', $classes, 'BlogPost class should be hidden.');
Config::inst()->update('BlogPost', 'show_in_sitetree', false);
$classes = $blog->getExcludedSiteTreeClassNames();
$this->assertContains('BlogPost', $classes, 'BlogPost class should be hidden.');
}
public function testGetArchivedBlogPosts() {
$member = Member::currentUser();
if($member) {
$member->logout();
}
/**
* @var Blog $blog
*/
$blog = $this->objFromFixture('Blog', 'FirstBlog');
$archive = $blog->getArchivedBlogPosts(2013);
$this->assertEquals(2, $archive->count(), 'Incorrect Yearly Archive count for 2013');
$this->assertEquals('First Post', $archive->first()->Title, 'Incorrect First Blog post');
$this->assertEquals('Second Post', $archive->last()->Title, 'Incorrect Last Blog post');
$archive = $blog->getArchivedBlogPosts(2013, 10);
$this->assertEquals(1, $archive->count(), 'Incorrect monthly archive count.');
$archive = $blog->getArchivedBlogPosts(2013, 10, 01);
$this->assertEquals(1, $archive->count(), 'Incorrect daily archive count.');
}
public function testArchiveLinks() {
/**
* @var Blog $blog
*/
$blog = $this->objFromFixture('Blog', 'FirstBlog');
$link = Controller::join_links($blog->Link('archive'), '2013', '10', '01');
$this->assertEquals(200, $this->getStatusOf($link), 'HTTP Status should be 200');
$link = Controller::join_links($blog->Link('archive'), '2013', '10');
$this->assertEquals(200, $this->getStatusOf($link), 'HTTP Status should be 200');
$link = Controller::join_links($blog->Link('archive'), '2013');
$this->assertEquals(200, $this->getStatusOf($link), 'HTTP Status should be 200');
$link = Controller::join_links($blog->Link('archive'), '2011', '10', '01');
$this->assertEquals(200, $this->getStatusOf($link), 'HTTP Status should be 200');
$link = Controller::join_links($blog->Link('archive'));
$this->assertEquals(404, $this->getStatusOf($link), 'HTTP Status should be 404');
$link = Controller::join_links($blog->Link('archive'), 'invalid-year');
$this->assertEquals(404, $this->getStatusOf($link), 'HTTP Status should be 404');
$link = Controller::join_links($blog->Link('archive'), '2013', '99');
$this->assertEquals(404, $this->getStatusOf($link), 'HTTP Status should be 404');
$link = Controller::join_links($blog->Link('archive'), '2013', '10', '99');
$this->assertEquals(404, $this->getStatusOf($link), 'HTTP Status should be 404');
}
/**
* @param string $link
*
* @return int
*/
protected function getStatusOf($link) {
return Director::test($link)->getStatusCode();
}
public function testRoles() {
/**
* @var Blog $firstBlog
*/
$firstBlog = $this->objFromFixture('Blog', 'FirstBlog');
/**
* @var Blog $fourthBlog
*/
$fourthBlog = $this->objFromFixture('Blog', 'FourthBlog');
/**
* @var BlogPost $postA
*/
$postA = $this->objFromFixture('BlogPost', 'PostA');
/**
* @var BlogPost $postB
*/
$postB = $this->objFromFixture('BlogPost', 'PostB');
/**
* @var BlogPost $postC
*/
$postC = $this->objFromFixture('BlogPost', 'PostC');
/**
* @var Member $editor
*/
$editor = $this->objFromFixture('Member', 'BlogEditor');
/**
* @var Member $writer
*/
$writer = $this->objFromFixture('Member', 'Writer');
/**
* @var Member $contributor
*/
$contributor = $this->objFromFixture('Member', 'Contributor');
/**
* @var Member $visitor
*/
$visitor = $this->objFromFixture('Member', 'Visitor');
$this->assertEquals('Editor', $fourthBlog->RoleOf($editor));
$this->assertEquals('Contributor', $fourthBlog->RoleOf($contributor));
$this->assertEquals('Writer', $fourthBlog->RoleOf($writer));
$this->assertEmpty($fourthBlog->RoleOf($visitor));
$this->assertEquals('Author', $postA->RoleOf($writer));
$this->assertEquals('Author', $postA->RoleOf($contributor));
$this->assertEquals('Editor', $postA->RoleOf($editor));
$this->assertEmpty($postA->RoleOf($visitor));
// Test RoleOf with string values given
$this->assertEquals('Editor', $fourthBlog->RoleOf((string)(int)$editor->ID));
$this->assertEquals('Contributor', $fourthBlog->RoleOf((string)(int)$contributor->ID));
$this->assertEquals('Writer', $fourthBlog->RoleOf((string)(int)$writer->ID));
$this->assertEmpty($fourthBlog->RoleOf((string)(int)$visitor->ID));
$this->assertEquals('Author', $postA->RoleOf((string)(int)$writer->ID));
$this->assertEquals('Author', $postA->RoleOf((string)(int)$contributor->ID));
$this->assertEquals('Editor', $postA->RoleOf((string)(int)$editor->ID));
$this->assertEmpty($postA->RoleOf((string)(int)$visitor->ID));
// Test RoleOf with int values given
$this->assertEquals('Editor', $fourthBlog->RoleOf((int)$editor->ID));
$this->assertEquals('Contributor', $fourthBlog->RoleOf((int)$contributor->ID));
$this->assertEquals('Writer', $fourthBlog->RoleOf((int)$writer->ID));
$this->assertEmpty($fourthBlog->RoleOf((int)$visitor->ID));
$this->assertEquals('Author', $postA->RoleOf((int)$writer->ID));
$this->assertEquals('Author', $postA->RoleOf((int)$contributor->ID));
$this->assertEquals('Editor', $postA->RoleOf((int)$editor->ID));
$this->assertEmpty($postA->RoleOf((int)$visitor->ID));
$this->assertTrue($fourthBlog->canEdit($editor));
$this->assertFalse($firstBlog->canEdit($editor));
$this->assertTrue($fourthBlog->canAddChildren($editor));
$this->assertFalse($firstBlog->canAddChildren($editor));
$this->assertTrue($postA->canEdit($editor));
$this->assertTrue($postB->canEdit($editor));
$this->assertTrue($postC->canEdit($editor));
$this->assertTrue($postA->canPublish($editor));
$this->assertTrue($postB->canPublish($editor));
$this->assertTrue($postC->canPublish($editor));
$this->assertFalse($fourthBlog->canEdit($writer));
$this->assertFalse($firstBlog->canEdit($writer));
$this->assertTrue($fourthBlog->canAddChildren($writer));
$this->assertFalse($firstBlog->canAddChildren($writer));
$this->assertTrue($postA->canEdit($writer));
$this->assertFalse($postB->canEdit($writer));
$this->assertTrue($postC->canEdit($writer));
$this->assertTrue($postA->canPublish($writer));
$this->assertFalse($postB->canPublish($writer));
$this->assertTrue($postC->canPublish($writer));
$this->assertFalse($fourthBlog->canEdit($contributor));
$this->assertFalse($firstBlog->canEdit($contributor));
$this->assertTrue($fourthBlog->canAddChildren($contributor));
$this->assertFalse($firstBlog->canAddChildren($contributor));
$this->assertTrue($postA->canEdit($contributor));
$this->assertFalse($postB->canEdit($contributor));
$this->assertTrue($postC->canEdit($contributor));
$this->assertFalse($postA->canPublish($contributor));
$this->assertFalse($postB->canPublish($contributor));
$this->assertFalse($postC->canPublish($contributor));
$this->assertFalse($fourthBlog->canEdit($visitor));
$this->assertFalse($firstBlog->canEdit($visitor));
$this->assertFalse($fourthBlog->canAddChildren($visitor));
$this->assertFalse($firstBlog->canAddChildren($visitor));
$this->assertFalse($postA->canEdit($visitor));
$this->assertFalse($postB->canEdit($visitor));
$this->assertFalse($postC->canEdit($visitor));
$this->assertFalse($postA->canPublish($visitor));
$this->assertFalse($postB->canPublish($visitor));
$this->assertFalse($postC->canPublish($visitor));
}
}

View File

@ -0,0 +1,126 @@
Feature: Create a blog
As a website user
I want to create a blog
Background:
Given the "group" "EDITOR" has permissions "CMS_ACCESS_CMSMain"
And I add an extension "SilverStripe\Widgets\Extensions\WidgetPageExtension" to the "Page" class
And I add an extension "SilverStripe\Comments\Extensions\CommentsExtension" to the "Page" class
And an "image" "Uploads/file1.jpg"
And I am logged in as a member of "EDITOR" group
# Create a new blog called "New Blog"
When I go to "/admin/pages"
And I press the "Add new" button
And I select the "Blog" radio button
And I press the "Create" button
# Add widgets
And I click the "Widgets" CMS tab
And I uncheck "Inherit Sidebar From Parent"
And I add the "Content" widget
And I add the "Archive" widget
And I add the "Blog Tags" widget
And I fill in the "Content" widget field "Title" with "My content widget title"
And I fill in the "Content" widget HTML field "Content" with "<p>Content widget content</p>"
And I fill in the "Archive" widget field "Title" with "My archive widget title"
And I fill in the "Blog Tags" widget field "Title" with "My blog tags widget title"
And I press the "Save" button
# Logout
And I go to "/Security/login"
And I press the "Log in as someone else" button
And I am logged in with "ADMIN" permissions
# Add EDITOR as an Editor
When I go to "/admin/pages"
And I follow "New Blog"
And I click the "Settings" CMS tab
And I click the "Users" CMS tab
And I wait for 3 seconds
And I select "EDITOR" from "Editors"
And I press the "Publish" button
# Logout
And I go to "/Security/login"
And I press the "Log in as someone else" button
Scenario: Create a blog post
Given I am logged in as a member of "EDITOR" group
# Create a new blog post called "New Post"
When I go to "/admin/pages"
And I follow "New Blog"
And I click the "Blog Posts" CMS tab
And I press the "Add new Blog Post" button
And I fill in "Post Title" with "New Post"
# Add a "Featured image"
And I press the "Choose existing" button
# Select file1.jpg - asset-admin FeatureContext is not available here so use css selector
And I click on the ".gallery__files .gallery-item" element
And I press the "Insert" button
# Add categories and tags
And I click the "Post Options" CMS tab
And I add "My Category" to the "Categories" tag field
And I add "My Tag" to the "Tags" tag field
# Publish the blog post and logout
And I press the "Publish" button
And I go to "/Security/login"
And I press the "Log in as someone else" button
# Test the frontend
When I go to "/new-blog"
Then I should see "New Blog"
And I should see "New Post"
# Widgets
And I should see "My content widget title"
And the rendered HTML should contain "<p>Content widget content</p>"
And I should see "My blog tags widget title"
# Hyperlink to "New Post"
Then the rendered HTML should contain "href=\"/new-blog/new-post"
# Category
And the rendered HTML should contain "href=\"/new-blog/category/my-category\""
# Tag
And the rendered HTML should contain "href=\"/new-blog/tag/my-tag\""
# Test that blog post shows in category view
When I go to "/new-blog/category/my-category"
Then I should see "New Post"
# Test that blog post shows in tag view
When I go to "/new-blog/tag/my-tag"
Then I should see "New Post"
# Commenting
When I click "New Post" in the ".post-summary" element
Then I should see "New Post"
When I fill in "Your name" with "My Name"
And I fill in "Email" with "hello@example.com"
And I fill in "Comments" with "My comments"
When I press the "Post" button
Then I should see "New Post"
# Commenting is bizarly not working in behat, even though it works during manual testing on my local
# Moderation
# When I am logged in as a member of "EDITOR" group
# When I go to "/admin/pages"
# And I follow "New Blog"
# And I click the "Blog Posts" CMS tab
# And I click on the ".ss-gridfield-item" element
# And I click the "Comments" CMS tab
# Then I should see "New (1)"
# When I click the "New (1)" CMS tab
# Then I should see "hello@example.com"
# When I click on the ".action-menu__toggle" element
# And I press the "Spam" button
# And I wait for 2 seconds
# Then I should not see "hello@example.com"

BIN
tests/behat/files/file1.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@ -0,0 +1,105 @@
<?php
namespace SilverStripe\Blog\Tests\Behat\Context;
use SilverStripe\BehatExtension\Context\SilverStripeContext;
use Behat\Mink\Element\NodeElement;
use PHPUnit\Framework\Assert;
class FeatureContext extends SilverStripeContext
{
/**
* Adds a widget to the blog
*
* @Then /^I add the "([^"]+)" widget$/
* @param $widgetTitle e.g. "Content"
*/
public function iAddTheWidget($widgetTitle)
{
$page = $this->getSession()->getPage();
$h3s = $page->findAll('css', '.availableWidgetsHolder h3');
$found = false;
foreach ($h3s as $h3) {
if ($h3->getText() !== $widgetTitle) {
continue;
}
$found = true;
$h3->click();
}
Assert::assertTrue($found, "Widget {$widgetTitle} was not found");
}
/**
* Fills in a field within a widget
*
* @Then /^I fill in the "([^"]+)" widget field "([^"]+)" with "([^"]+)"$/
* @param $widgetTitle e.g. "Content"
* @param $htmlFragment e.g. "Title"
* @param $value e.g. "Lorem ipsum"
*/
public function iFillInTheWidgetField($widgetTitle, $fieldTitle, $value)
{
$page = $this->getSession()->getPage();
$widget = $this->getWidget($widgetTitle);
$field = $widget->findField($fieldTitle);
Assert::assertNotNull($field, "Widget field {$fieldTitle} was not found");
$field->setValue($value);
}
/**
* Adapated from framework CmsFormsContext stepIFillInTheHtmlFieldWith
*
* @When /^I fill in the "([^"]+)" widget HTML field "([^"]+)" with "([^"]+)"$/
*/
public function stepIFillInTheHtmlFieldWith($widgetTitle, $fieldTitle, $value)
{
$widget = $this->getWidget($widgetTitle);
$field = $this->getDescendantHtmlField($widget, $fieldTitle);
$this->getSession()->evaluateScript(sprintf(
"jQuery('#%s').entwine('ss').getEditor().setContent('%s')",
$field->getAttribute('id'),
addcslashes($value ?? '', "'")
));
$this->getSession()->evaluateScript(sprintf(
"jQuery('#%s').entwine('ss').getEditor().save()",
$field->getAttribute('id')
));
}
/**
* @return NodeElement|null
*/
private function getWidget($widgetTitle)
{
$ret = null;
$widgets = $this->getSession()->getPage()->findAll('css', '.usedWidgets .Widget');
foreach ($widgets as $widget) {
$h3 = $widget->find('css', 'h3');
if (!$h3 || $h3->getText() !== $widgetTitle) {
continue;
}
$ret = $widget;
break;
}
Assert::assertNotNull($ret, "Widget edit form for {$widgetTitle} was not found");
return $ret;
}
/**
* @param NodeElement $ancestor
* @param string $locator
* @return NodeElement|null
*/
private function getDescendantHtmlField($element, $locator)
{
$textarea = $element->find('css', "textarea.htmleditor[name='{$locator}']");
if (is_null($textarea)) {
$labels = $element->findAll('xpath', "//label[contains(text(), '{$locator}')]");
Assert::assertCount(1, $labels, "Found more than one html field label containing the phrase '{$locator}}'");
$label = array_shift($labels);
$textarea = $element->find('css', '#' . $label->getAttribute('for'));
}
Assert::assertNotNull($textarea, "HTML field {$locator} not found");
return $textarea;
}
}

View File

@ -0,0 +1,9 @@
<?php
namespace SilverStripe\Blog\Tests\Behat\Context;
use SilverStripe\BehatExtension\Context\FixtureContext as BaseFixtureContext;
class FixtureContext extends BaseFixtureContext
{
}

View File

@ -1,148 +0,0 @@
# Mock date is set to 2013-10-01 20:00:00
Group:
Administrators:
Title: Administrators
Editors:
Title: Editors
BlogUsers:
Title: Blog Users
Code: BlogUsers
Permission:
Administrators:
Code: ADMIN
Group: =>Group.Administrators
Editors:
Code: CMS_ACCESS_CMSMain
Group: =>Group.Editors
BlogUsers:
Code: CMS_ACCESS_CMSMain
Group: =>Group.BlogUsers
SiteConfig:
Default:
CanEditType: 'OnlyTheseUsers'
CanCreateTopLevelType: 'OnlyTheseUsers'
EditorGroups: =>Group.Administrators,=>Group.Editors
CreateTopLevelGroups: =>Group.Administrators,=>Group.Editors
Member:
Admin:
FirstName: Test
Surname: Administrator
Groups: =>Group.Administrators
Editor:
FirstName: Test
Surname: Editor
Groups: =>Group.Editors
BlogEditor:
FirstName: Blog
Surname: Editor
Groups: =>Group.BlogUsers
Writer:
FirstName: Blog
Surname: Writer
Groups: =>Group.BlogUsers
Contributor:
FirstName: Blog
Surname: Contributor
Groups: =>Group.BlogUsers
Visitor:
FirstName: Blog
Surname: Visitor
Blog:
FirstBlog:
Title: 'First Blog'
SecondBlog:
Title: 'Second Blog'
CanViewType: 'OnlyTheseUsers'
CanEditType: 'OnlyTheseUsers'
ViewerGroups: =>Group.Administrators
EditorGroups: =>Group.Administrators
ThirdBlog:
Title: 'Third Blog'
CanEditType: 'OnlyTheseUsers'
EditorGroups: =>Group.Editors
FourthBlog:
Title: 'Fourth Blog'
Editors: =>Member.BlogEditor
Writers: =>Member.Writer
Contributors: =>Member.Contributor
BlogTag:
FirstTag:
Title: 'First Tag'
URLSegment: 'first-tag'
Blog: =>Blog.FirstBlog
SecondTag:
Title: 'Second Tag'
URLSegment: 'second-tag'
Blog: =>Blog.SecondBlog
ThirdTag:
Title: 'Third Tag'
URLSegment: 'third-tag'
Blog: =>Blog.ThirdBlog
BlogCategory:
FirstCategory:
Title: 'First Category'
URLSegment: 'first-category'
Blog: =>Blog.FirstBlog
SecondCategory:
Title: 'Second Category'
URLSegment: 'second-category'
Blog: =>Blog.SecondBlog
ThirdCategory:
Title: 'Third Category'
URLSegment: 'third-category'
Blog: =>Blog.ThirdBlog
BlogPost:
FirstBlogPost:
Title: 'First Post'
URLSegment: first-post
PublishDate: '2013-10-01 15:00:00'
Parent: =>Blog.FirstBlog
Tags: =>BlogTag.FirstTag
Categories: =>BlogCategory.FirstCategory
SecondBlogPost:
Title: 'Second Post'
URLSegment: second-post
PublishDate: '2013-09-01 15:00:00'
Parent: =>Blog.FirstBlog
ThirdBlogPost:
Title: 'Old Post'
URLSegment: old-post
PublishDate: '2012-01-09 15:00:00'
Parent: =>Blog.FirstBlog
FirstFutureBlogPost:
Title: 'Future Post'
URLSegment: future-post
PublishDate: '2015-01-01 00:00:00'
Tags: =>BlogTag.FirstTag
Categories: =>BlogCategory.FirstCategory
Parent: =>Blog.FirstBlog
SecondFutureBlogPost:
Title: 'Future Post 2'
URLSegment: future-post-2
PublishDate: '2013-11-01 00:00:00'
Tags: =>BlogTag.FirstTag
Categories: =>BlogCategory.FirstCategory
Parent: =>Blog.FirstBlog
PostA:
Title: 'One Post'
PublishDate: '2012-01-09 15:00:00'
Parent: =>Blog.FourthBlog
Authors: =>Member.Writer,=>Member.Contributor
PostB:
Title: 'Second Post'
PublishDate: '2012-01-09 15:00:00'
Parent: =>Blog.FourthBlog
Authors: =>Member.BlogEditor
PostC:
Title: 'Third Post'
PublishDate: '2012-01-09 15:00:00'
Parent: =>Blog.FourthBlog
Authors: =>Member.BlogEditor,=>Member.Writer,=>Member.Contributor

170
tests/php/BlogCategoryTest.php Executable file
View File

@ -0,0 +1,170 @@
<?php
namespace SilverStripe\Blog\Tests;
use SilverStripe\Blog\Model\Blog;
use SilverStripe\Blog\Model\BlogCategory;
use SilverStripe\Blog\Model\BlogPost;
use SilverStripe\Blog\Model\BlogTag;
use SilverStripe\Control\Controller;
use SilverStripe\Dev\FunctionalTest;
use SilverStripe\ORM\FieldType\DBDatetime;
use SilverStripe\ORM\ValidationException;
use SilverStripe\Security\Member;
use SilverStripe\Security\Security;
class BlogCategoryTest extends FunctionalTest
{
/**
* @var string
*/
protected static $fixture_file = 'blog.yml';
/**
* {@inheritdoc}
*/
protected function setUp(): void
{
parent::setUp();
DBDatetime::set_mock_now('2013-10-10 20:00:00');
}
/**
* {@inheritdoc}
*/
protected function tearDown(): void
{
DBDatetime::clear_mock_now();
parent::tearDown();
}
/**
* Tests that any blog posts returned from $category->BlogPosts() many_many are published,
* both by normal 'save & publish' functionality and by publish date.
*/
public function testBlogPosts()
{
$member = Security::getCurrentUser();
if ($member) {
Security::setCurrentUser(null);
}
$this->objFromFixture(BlogPost::class, 'FirstBlogPost');
/**
* @var BlogCategory $category
*/
$category = $this->objFromFixture(BlogCategory::class, 'FirstCategory');
$this->assertEquals(5, $category->BlogPosts()->count(), 'Category blog post count');
}
/**
* @see https://github.com/silverstripe/silverstripe-blog/issues/376
*/
public function testAllowMultibyteUrlSegment()
{
$blog = $this->objFromFixture(Blog::class, 'FirstBlog');
$cat = new BlogCategory();
$cat->BlogID = $blog->ID;
$cat->Title = 'تست';
$cat->write();
// urlencoded
$this->assertEquals('%D8%AA%D8%B3%D8%AA', $cat->URLSegment);
$link = Controller::join_links($cat->Blog()->Link(), 'category', '%D8%AA%D8%B3%D8%AA');
$this->assertEquals($link, $cat->getLink());
}
public function testCanView()
{
$this->objFromFixture(Member::class, 'Admin');
$editor = $this->objFromFixture(Member::class, 'Editor');
$category = $this->objFromFixture(BlogCategory::class, 'SecondCategory');
$this->assertFalse($category->canView($editor), 'Editor should not be able to view category.');
}
/**
* The first blog can be viewed by anybody.
*/
public function testCanEdit()
{
$admin = $this->objFromFixture(Member::class, 'Admin');
$editor = $this->objFromFixture(Member::class, 'Editor');
$category = $this->objFromFixture(BlogCategory::class, 'FirstCategory');
$this->assertTrue($category->canEdit($admin), 'Admin should be able to edit category.');
$this->assertTrue($category->canEdit($editor), 'Editor should be able to edit category.');
$category = $this->objFromFixture(BlogCategory::class, 'SecondCategory');
$this->assertTrue($category->canEdit($admin), 'Admin should be able to edit category.');
$this->assertFalse($category->canEdit($editor), 'Editor should not be able to edit category.');
$category = $this->objFromFixture(BlogCategory::class, 'ThirdCategory');
$this->assertTrue($category->canEdit($admin), 'Admin should always be able to edit category.');
$this->assertTrue($category->canEdit($editor), 'Editor should be able to edit category.');
}
public function testCanCreate()
{
$admin = $this->objFromFixture(Member::class, 'Admin');
$editor = $this->objFromFixture(Member::class, 'Editor');
$category = singleton(BlogCategory::class);
$this->assertTrue($category->canCreate($admin), 'Admin should be able to create category.');
$this->assertTrue($category->canCreate($editor), 'Editor should be able to create category.');
}
public function testCanDelete()
{
$admin = $this->objFromFixture(Member::class, 'Admin');
$editor = $this->objFromFixture(Member::class, 'Editor');
$category = $this->objFromFixture(BlogCategory::class, 'FirstCategory');
$this->assertTrue($category->canDelete($admin), 'Admin should be able to delete category.');
$this->assertTrue($category->canDelete($editor), 'Editor should be able to category category.');
$category = $this->objFromFixture(BlogCategory::class, 'SecondCategory');
$this->assertTrue($category->canDelete($admin), 'Admin should be able to delete category.');
$this->assertFalse($category->canDelete($editor), 'Editor should not be able to delete category.');
$category = $this->objFromFixture(BlogCategory::class, 'ThirdCategory');
$this->assertTrue($category->canDelete($admin), 'Admin should always be able to delete category.');
$this->assertTrue($category->canDelete($editor), 'Editor should be able to delete category.');
}
public function testDuplicateCategories()
{
$blog = new Blog();
$blog->Title = 'Testing for duplicate categories';
$blog->write();
$category = new BlogCategory();
$category->Title = 'Test';
$category->BlogID = $blog->ID;
$category->URLSegment = 'test';
$category->write();
$category = new BlogCategory();
$category->Title = 'Test';
$category->URLSegment = 'test';
$category->BlogID = $blog->ID;
try {
$category->write();
$this->fail('Duplicate BlogCategory written');
} catch (ValidationException $e) {
$messages = $e->getResult()->getMessages();
$this->assertCount(1, $messages);
$this->assertEquals(BlogTag::DUPLICATE_EXCEPTION, $messages[0]['messageType']);
}
}
}

View File

@ -0,0 +1,46 @@
<?php
namespace SilverStripe\Blog\Tests;
use SilverStripe\Core\Config\Config;
use SilverStripe\Dev\FunctionalTest;
use SilverStripe\i18n\i18n;
use SilverStripe\View\Parsers\URLSegmentFilter;
class BlogFunctionalTest extends FunctionalTest
{
protected static $fixture_file = 'BlogFunctionalTest.yml';
protected static $use_draft_site = true;
protected function setUp(): void
{
Config::modify()->set(URLSegmentFilter::class, 'default_allow_multibyte', true);
i18n::set_locale('fa_IR');
parent::setUp();
}
public function testBlogWithMultibyteUrl()
{
$result = $this->get(rawurlencode('آبید'));
$this->assertEquals(200, $result->getStatusCode());
}
public function testMemberProfileWithMultibyteUrlAndName()
{
$result = $this->get(rawurlencode('آبید') . '/profile/' . rawurlencode('عبّاس-آبان'));
$this->assertEquals(200, $result->getStatusCode());
$this->assertStringContainsString('My Blog Post', $result->getBody());
}
public function testMemberProfileWithMultibyteUrlAndEnglishName()
{
$result = $this->get(rawurlencode('آبید') . '/profile/bob-jones');
$this->assertEquals(200, $result->getStatusCode());
$this->assertStringContainsString('My Blog Post', $result->getBody());
}
}

View File

@ -0,0 +1,24 @@
SilverStripe\Security\Member:
member_a:
FirstName: عبّاس
Surname: آبان
Email: foo@example.com
member_b:
FirstName: Bob
Surname: Jones
Email: bobjones@example.com
SilverStripe\Blog\Model\Blog:
blog_a:
URLSegment: آبید
Title: My Blog
SilverStripe\Blog\Model\BlogPost:
blogpost_a:
Title: My Blog Post
URLSegment: آبیدآبید
PublishDate: 2017-08-01 00:00:00
Parent: =>SilverStripe\Blog\Model\Blog.blog_a
Authors:
- =>SilverStripe\Security\Member.member_a
- =>SilverStripe\Security\Member.member_b

View File

@ -0,0 +1,57 @@
<?php
namespace SilverStripe\Blog\Tests;
use SilverStripe\Blog\Model\Blog;
use SilverStripe\Dev\SapphireTest;
use SilverStripe\ORM\FieldType\DBDatetime;
use SilverStripe\Security\Security;
/**
* @coversDefaultClass \SilverStripe\Blog\Model\BlogPostFilter
*/
class BlogPostFilterTest extends SapphireTest
{
/**
* @var string
*/
protected static $fixture_file = 'blog.yml';
protected function setUp(): void
{
parent::setUp();
DBDatetime::set_mock_now('2013-10-10 20:00:00');
}
protected function tearDown(): void
{
DBDatetime::clear_mock_now();
parent::tearDown();
}
/**
* Tests that unpublished articles are not returned
* @covers ::augmentSQL
*/
public function testFilter()
{
$member = Security::getCurrentUser();
if ($member) {
Security::setCurrentUser(null);
}
/**
* @var Blog $blog
*/
$blog = $this->objFromFixture(Blog::class, 'FirstBlog');
$this->assertEquals(3, $blog->AllChildren()->Count(), 'Filtered blog posts');
DBDatetime::set_mock_now('2020-01-01 00:00:00');
$this->assertEquals(5, $blog->AllChildren()->Count(), 'Unfiltered blog posts');
}
}

View File

@ -0,0 +1,58 @@
<?php
namespace SilverStripe\Blog\Tests;
use SilverStripe\Blog\Model\BlogPost;
use SilverStripe\CommentNotifications\Extensions\CommentNotifier;
use SilverStripe\Comments\Model\Comment;
use SilverStripe\Dev\SapphireTest;
class BlogPostNotificationsTest extends SapphireTest
{
protected static $fixture_file = 'blog.yml';
public function testUpdateNotificationRecipients()
{
if (!class_exists(CommentNotifier::class)) {
$this->markTestSkipped('Comments Notification module is not installed');
}
$blogPost = $this->objFromFixture(BlogPost::class, 'PostC');
$comment = new Comment();
$comment->Comment = 'This is a comment';
$comment->write();
$recipients = $blogPost->notificationRecipients(
$comment
)->toArray();
$segments = [];
foreach ($recipients as $recipient) {
array_push($segments, $recipient->URLSegment);
}
sort($segments);
$this->assertEquals(
['blog-contributor', 'blog-editor', 'blog-writer'],
$segments
);
}
public function testUpdateNotificationSubject()
{
if (!class_exists(CommentNotifier::class)) {
$this->markTestSkipped('Comments Notification module is not installed');
}
$blogPost = $this->objFromFixture(BlogPost::class, 'PostC');
$comment = new Comment();
$comment->Comment = 'This is a comment';
$comment->write();
$recipients = $blogPost->notificationRecipients(
$comment
)->toArray();
$subject = $blogPost->notificationSubject($comment, $recipients[0]);
$this->assertEquals(
'A new comment has been posted on Third Post',
$subject
);
}
}

208
tests/php/BlogPostTest.php Normal file
View File

@ -0,0 +1,208 @@
<?php
namespace SilverStripe\Blog\Tests;
use SilverStripe\Blog\Model\BlogPost;
use SilverStripe\Core\Config\Config;
use SilverStripe\CMS\Model\SiteTree;
use SilverStripe\Dev\SapphireTest;
use SilverStripe\ORM\FieldType\DBDatetime;
use SilverStripe\Security\Member;
use SilverStripe\Security\Security;
use SilverStripe\Versioned\Versioned;
class BlogPostTest extends SapphireTest
{
protected static $fixture_file = 'blog.yml';
protected function tearDown(): void
{
DBDatetime::clear_mock_now();
parent::tearDown();
}
/**
* @dataProvider canViewProvider
*/
public function testCanView($date, $user, $page, $canView, $stage)
{
$userRecord = $this->objFromFixture(Member::class, $user);
$pageRecord = $this->objFromFixture(BlogPost::class, $page);
DBDatetime::set_mock_now($date);
if ($stage === 'Live') {
$pageRecord->publishSingle();
}
Versioned::set_stage($stage);
$this->assertEquals($canView, $pageRecord->canView($userRecord));
}
/**
* @return array Format:
* - mock now date
* - user role (see fixture)
* - blog post fixture ID
* - expected result
* - versioned stage
*/
public function canViewProvider()
{
$someFutureDate = '2013-10-10 20:00:00';
$somePastDate = '2009-10-10 20:00:00';
return [
// Check this post given the date has passed
[$someFutureDate, 'Editor', 'PostA', true, 'Stage'],
[$someFutureDate, 'Contributor', 'PostA', true, 'Stage'],
[$someFutureDate, 'BlogEditor', 'PostA', true, 'Stage'],
[$someFutureDate, 'Writer', 'PostA', true, 'Stage'],
// Check unpublished pages
[$somePastDate, 'Editor', 'PostA', true, 'Stage'],
[$somePastDate, 'Contributor', 'PostA', true, 'Stage'],
[$somePastDate, 'BlogEditor', 'PostA', true, 'Stage'],
[$somePastDate, 'Writer', 'PostA', true, 'Stage'],
// Test a page that was authored by another user
// Check this post given the date has passed
[$someFutureDate, 'Editor', 'FirstBlogPost', true, 'Stage'],
[$someFutureDate, 'Contributor', 'FirstBlogPost', true, 'Stage'],
[$someFutureDate, 'BlogEditor', 'FirstBlogPost', true, 'Stage'],
[$someFutureDate, 'Writer', 'FirstBlogPost', true, 'Stage'],
// Check future pages in draft stage - users with "view draft pages" permission should
// be able to see this, but visitors should not
[$somePastDate, 'Editor', 'FirstBlogPost', true, 'Stage'],
[$somePastDate, 'Contributor', 'FirstBlogPost', true, 'Stage'],
[$somePastDate, 'BlogEditor', 'FirstBlogPost', true, 'Stage'],
[$somePastDate, 'Writer', 'FirstBlogPost', true, 'Stage'],
[$somePastDate, 'Visitor', 'FirstBlogPost', false, 'Stage'],
// No future pages in live stage should be visible, even to users that can edit them (in draft)
[$somePastDate, 'Editor', 'FirstBlogPost', false, 'Live'],
[$somePastDate, 'Contributor', 'FirstBlogPost', false, 'Live'],
[$somePastDate, 'BlogEditor', 'FirstBlogPost', false, 'Live'],
[$somePastDate, 'Writer', 'FirstBlogPost', false, 'Live'],
[$somePastDate, 'Visitor', 'FirstBlogPost', false, 'Live'],
];
}
public function testCandidateAuthors()
{
$blogpost = $this->objFromFixture(BlogPost::class, 'PostC');
$this->assertEquals(7, $blogpost->getCandidateAuthors()->count());
//Set the group to draw Members from
Config::inst()->set(BlogPost::class, 'restrict_authors_to_group', 'blogusers');
$this->assertEquals(3, $blogpost->getCandidateAuthors()->count());
// Test cms field is generated
$fields = $blogpost->getCMSFields();
$this->assertNotEmpty($fields->dataFieldByName('Authors'));
}
public function testCanViewFuturePost()
{
$blogPost = $this->objFromFixture(BlogPost::class, 'NullPublishDate');
$editor = $this->objFromFixture(Member::class, 'BlogEditor');
$this->assertTrue($blogPost->canView($editor));
$visitor = $this->objFromFixture(Member::class, 'Visitor');
$this->assertFalse($blogPost->canView($visitor));
}
/**
* The purpose of getDate() is to act as a proxy for PublishDate in the default RSS
* template, rather than copying the entire template.
*/
public function testGetDate()
{
$blogPost = $this->objFromFixture(BlogPost::class, 'NullPublishDate');
$this->assertNull($blogPost->getDate());
$blogPost = $this->objFromFixture(BlogPost::class, 'PostA');
$this->assertEquals('2012-01-09 15:00:00', $blogPost->getDate());
}
public function testMinutesToRead()
{
/** @var BlogPost $blogPost */
$blogPost = $this->objFromFixture(BlogPost::class, 'FirstBlogPost');
// over 400 words, should take slightly longer than 2 minutes
$this->assertEquals(2, $blogPost->MinutesToRead());
$blogPost = $this->objFromFixture(BlogPost::class, 'SecondBlogPost');
// over 200 words, should take slighter longer than 1 minute
$this->assertEquals(1, $blogPost->MinutesToRead());
$blogPost = $this->objFromFixture(BlogPost::class, 'ThirdBlogPost');
// less than 200 words, should take less than a minute thus return an integer of 0 (zero)
$this->assertEquals(0, $blogPost->MinutesToRead());
$this->expectException(\InvalidArgumentException::class);
$blogPost->MinutesToRead('not-a-number');
}
/**
* @param string $type
* @param string $expected
* @dataProvider monthlyArchiveLinkProvider
* @group wip
*/
public function testGetMonthlyArchiveLink($type, $expected)
{
/** @var BlogPost $blogPost */
$blogPost = $this->objFromFixture(BlogPost::class, 'FirstBlogPost');
$archiveLink = $blogPost->getMonthlyArchiveLink($type);
$this->assertStringContainsString('archive/', $archiveLink);
$this->assertStringEndsWith($expected, $archiveLink);
}
/**
* @return array[]
*/
public function monthlyArchiveLinkProvider()
{
return [
['day', '/2013/10/1'],
['month', '/2013/10'],
['year', '/2013'],
];
}
public function testGetYearlyArchiveLink()
{
/** @var BlogPost $blogPost */
$blogPost = $this->objFromFixture(BlogPost::class, 'FirstBlogPost');
$archiveLink = $blogPost->getYearlyArchiveLink();
$this->assertStringContainsString('archive/', $archiveLink);
$this->assertStringEndsWith('/2013', $archiveLink);
}
public function testAddDefaultAuthor()
{
$member = Security::getCurrentUser();
$rootPage = SiteTree::create();
$rootPage->write();
$blogPost = BlogPost::create(['ParentID' => $rootPage->ID]);
$this->assertSame(0, $blogPost->Authors()->count());
$blogPost->write();
$this->assertSame(1, $blogPost->Authors()->count());
$this->assertSame($member->ID, $blogPost->Authors()->first()->ID);
BlogPost::config()->set('add_default_author', false);
$blogPost2 = BlogPost::create(['ParentID' => $rootPage->ID]);
$this->assertSame(0, $blogPost2->Authors()->count());
$blogPost2->write();
$this->assertSame(0, $blogPost2->Authors()->count());
}
}

198
tests/php/BlogTagTest.php Executable file
View File

@ -0,0 +1,198 @@
<?php
namespace SilverStripe\Blog\Tests;
use SilverStripe\Blog\Model\Blog;
use SilverStripe\Blog\Model\BlogPost;
use SilverStripe\Blog\Model\BlogTag;
use SilverStripe\Control\Controller;
use SilverStripe\Dev\FunctionalTest;
use SilverStripe\ORM\FieldType\DBDatetime;
use SilverStripe\ORM\ValidationException;
use SilverStripe\Security\Member;
use SilverStripe\Security\Security;
class BlogTagTest extends FunctionalTest
{
protected static $fixture_file = 'blog.yml';
protected function setUp(): void
{
parent::setUp();
DBDatetime::set_mock_now('2013-10-10 20:00:00');
}
protected function tearDown(): void
{
DBDatetime::clear_mock_now();
parent::tearDown();
}
/**
* Tests that any blog posts returned from $tag->BlogPosts() many_many are published, both by
* normal 'save & publish' functionality and by publish date.
*/
public function testBlogPosts()
{
$member = Security::getCurrentUser();
if ($member) {
Security::setCurrentUser(null);
}
$this->objFromFixture(BlogPost::class, 'FirstBlogPost');
/**
* @var BlogTag $tag
*/
$tag = $this->objFromFixture(BlogTag::class, 'FirstTag');
$this->assertEquals(1, $tag->BlogPosts()->count(), 'Tag blog post count');
}
/**
* @see https://github.com/silverstripe/silverstripe-blog/issues/376
*/
public function testAllowMultibyteUrlSegment()
{
$blog = $this->objFromFixture(Blog::class, 'FirstBlog');
$tag = new BlogTag();
$tag->BlogID = $blog->ID;
$tag->Title = 'تست';
$tag->write();
// urlencoded
$this->assertEquals('%D8%AA%D8%B3%D8%AA', $tag->URLSegment);
$link = Controller::join_links($tag->Blog()->Link(), 'tag', '%D8%AA%D8%B3%D8%AA');
$this->assertEquals($link, $tag->getLink());
}
/**
* The first blog can be viewed by anybody.
*/
public function testCanView()
{
$admin = $this->objFromFixture(Member::class, 'Admin');
$editor = $this->objFromFixture(Member::class, 'Editor');
$tag = $this->objFromFixture(BlogTag::class, 'FirstTag');
$this->assertTrue($tag->canView($admin), 'Admin should be able to view tag.');
$this->assertTrue($tag->canView($editor), 'Editor should be able to view tag.');
$tag = $this->objFromFixture(BlogTag::class, 'SecondTag');
$this->assertTrue($tag->canView($admin), 'Admin should be able to view tag.');
$this->assertFalse($tag->canView($editor), 'Editor should not be able to view tag.');
}
public function testCanEdit()
{
$admin = $this->objFromFixture(Member::class, 'Admin');
$editor = $this->objFromFixture(Member::class, 'Editor');
$tag = $this->objFromFixture(BlogTag::class, 'FirstTag');
$this->assertTrue($tag->canEdit($admin), 'Admin should be able to edit tag.');
$this->assertTrue($tag->canEdit($editor), 'Editor should be able to edit tag.');
$tag = $this->objFromFixture(BlogTag::class, 'SecondTag');
$this->assertTrue($tag->canEdit($admin), 'Admin should be able to edit tag.');
$this->assertFalse($tag->canEdit($editor), 'Editor should not be able to edit tag.');
$tag = $this->objFromFixture(BlogTag::class, 'ThirdTag');
$this->assertTrue($tag->canEdit($admin), 'Admin should always be able to edit tags.');
$this->assertTrue($tag->canEdit($editor), 'Editor should be able to edit tag.');
}
public function testCanCreate()
{
$admin = $this->objFromFixture(Member::class, 'Admin');
$editor = $this->objFromFixture(Member::class, 'Editor');
$tag = singleton(BlogTag::class);
$this->assertTrue($tag->canCreate($admin), 'Admin should be able to create tag.');
$this->assertTrue($tag->canCreate($editor), 'Editor should be able to create tag.');
}
public function testCanDelete()
{
$admin = $this->objFromFixture(Member::class, 'Admin');
$editor = $this->objFromFixture(Member::class, 'Editor');
$tag = $this->objFromFixture(BlogTag::class, 'FirstTag');
$this->assertTrue($tag->canDelete($admin), 'Admin should be able to delete tag.');
$this->assertTrue($tag->canDelete($editor), 'Editor should be able to delete tag.');
$tag = $this->objFromFixture(BlogTag::class, 'SecondTag');
$this->assertTrue($tag->canDelete($admin), 'Admin should be able to delete tag.');
$this->assertFalse($tag->canDelete($editor), 'Editor should not be able to delete tag.');
$tag = $this->objFromFixture(BlogTag::class, 'ThirdTag');
$this->assertTrue($tag->canDelete($admin), 'Admin should always be able to delete tags.');
$this->assertTrue($tag->canDelete($editor), 'Editor should be able to delete tag.');
}
public function testDuplicateTagsForURLSegment()
{
$blog = new Blog();
$blog->Title = 'Testing for duplicates blog';
$blog->write();
$tag1 = new BlogTag();
$tag1->Title = 'cat-test';
$tag1->BlogID = $blog->ID;
$tag1->write();
$this->assertEquals('cat-test', $tag1->URLSegment);
$tag2 = new BlogTag();
$tag2->Title = 'cat test';
$tag2->BlogID = $blog->ID;
$tag2->write();
$this->assertEquals('cat-test-1', $tag2->URLSegment);
}
public function testDuplicateTags()
{
$blog = new Blog();
$blog->Title = 'Testing for duplicate tags';
$blog->write();
$tag = new BlogTag();
$tag->Title = 'Test';
$tag->BlogID = $blog->ID;
$tag->URLSegment = 'test';
$tag->write();
$tag = new BlogTag();
$tag->Title = 'Test';
$tag->URLSegment = 'test';
$tag->BlogID = $blog->ID;
try {
$tag->write();
$this->fail('Duplicate BlogTag written');
} catch (ValidationException $e) {
$messages = $e->getResult()->getMessages();
$this->assertCount(1, $messages);
$this->assertEquals(BlogTag::DUPLICATE_EXCEPTION, $messages[0]['messageType']);
}
}
public function testBlogTagUrlSegmentsAreAutomaticallyUpdated()
{
$tag = new BlogTag;
$tag->Title = "a test";
$tag->write();
$this->assertEquals($tag->URLSegment, "a-test");
$tag->Title = "another test";
$tag->write();
$this->assertEquals($tag->URLSegment, "another-test");
}
}

View File

@ -0,0 +1,71 @@
<?php
namespace SilverStripe\Blog\Tests;
use SilverStripe\Blog\Model\Blog;
use SilverStripe\Blog\Widgets\BlogTagsCloudWidget;
use SilverStripe\Dev\SapphireTest;
use SilverStripe\Control\Controller;
use SilverStripe\Control\Director;
use SilverStripe\Widgets\Model\Widget;
class BlogTagsCloudWidgetTest extends SapphireTest
{
/**
* @var string
*/
protected static $fixture_file = 'blog.yml';
public function testGetCMSFields()
{
if (!class_exists(Widget::class)) {
$this->markTestSkipped('Widgets module not installed');
}
$widget = new BlogTagsCloudWidget();
$fields = $widget->getCMSFields();
$names = [];
foreach ($fields as $field) {
array_push($names, $field->getName());
}
$expected = ['Title', 'Enabled', 'BlogID'];
$this->assertEquals($expected, $names);
}
public function testGetTags()
{
if (!class_exists(Widget::class)) {
$this->markTestSkipped('Widgets module not installed');
}
$widget = new BlogTagsCloudWidget();
$blog = $this->objFromFixture(Blog::class, 'FourthBlog');
$widget->BlogID = $blog->ID;
$widget->write();
$tags = $widget->getTags()->toArray();
$tag = $tags[0];
$this->assertEquals('Cat', $tag->TagName);
$this->assertEquals(Controller::join_links(Director::baseURL(), 'fourth-blog/tag/cat'), $tag->Link);
$this->assertEquals(2, $tag->TagCount);
$this->assertEquals(5, $tag->NormalizedTag);
$tag = $tags[1];
$this->assertEquals('Cool', $tag->TagName);
$this->assertEquals(Controller::join_links(Director::baseURL(), 'fourth-blog/tag/cool'), $tag->Link);
$this->assertEquals(3, $tag->TagCount);
$this->assertEquals(8, $tag->NormalizedTag);
$tag = $tags[2];
$this->assertEquals('Kiwi', $tag->TagName);
$this->assertEquals(Controller::join_links(Director::baseURL(), 'fourth-blog/tag/kiwi'), $tag->Link);
$this->assertEquals(1, $tag->TagCount);
$this->assertEquals(3, $tag->NormalizedTag);
$tag = $tags[3];
$this->assertEquals('Popular', $tag->TagName);
$this->assertEquals(Controller::join_links(Director::baseURL(), 'fourth-blog/tag/popular'), $tag->Link);
$this->assertEquals(4, $tag->TagCount);
$this->assertEquals(10, $tag->NormalizedTag);
}
}

376
tests/php/BlogTest.php Executable file
View File

@ -0,0 +1,376 @@
<?php
namespace SilverStripe\Blog\Tests;
use SilverStripe\Control\HTTPResponse_Exception;
use SilverStripe\Blog\Model\Blog;
use SilverStripe\Blog\Model\BlogController;
use SilverStripe\Blog\Model\BlogPost;
use SilverStripe\CMS\Controllers\ContentController;
use SilverStripe\Control\Controller;
use SilverStripe\Control\Director;
use SilverStripe\Control\HTTPRequest;
use SilverStripe\Control\Session;
use SilverStripe\Core\Config\Config;
use SilverStripe\Dev\SapphireTest;
use SilverStripe\ORM\FieldType\DBDatetime;
use SilverStripe\ORM\SS_List;
use SilverStripe\Security\Member;
class BlogTest extends SapphireTest
{
protected static $fixture_file = 'blog.yml';
protected function setUp(): void
{
parent::setUp();
DBDatetime::set_mock_now('2013-10-10 20:00:00');
/**
* @var Blog $blog
*/
$blog = $this->objFromFixture(Blog::class, 'FirstBlog');
$blog->publishRecursive();
}
protected function tearDown(): void
{
DBDatetime::clear_mock_now();
parent::tearDown();
}
public function testGetExcludedSiteTreeClassNames()
{
$this->logOut();
/**
* @var Blog $blog
*/
$blog = $this->objFromFixture(Blog::class, 'FirstBlog');
Config::inst()->set(BlogPost::class, 'show_in_sitetree', true);
$classes = $blog->getExcludedSiteTreeClassNames();
$this->assertNotContains(BlogPost::class, $classes, 'BlogPost class should be hidden.');
Config::inst()->set(BlogPost::class, 'show_in_sitetree', false);
$classes = $blog->getExcludedSiteTreeClassNames();
$this->assertContains(BlogPost::class, $classes, 'BlogPost class should be hidden.');
}
public function testGetArchivedBlogPosts()
{
$this->logOut();
/**
* @var Blog $blog
*/
$blog = $this->objFromFixture(Blog::class, 'FirstBlog');
$archive = $blog->getArchivedBlogPosts(2013);
$this->assertEquals(2, $archive->count(), 'Incorrect Yearly Archive count for 2013');
$this->assertEquals('First Post', $archive->first()->Title, 'Incorrect First Blog post');
$this->assertEquals('Second Post', $archive->last()->Title, 'Incorrect Last Blog post');
$archive = $blog->getArchivedBlogPosts(2013, 10);
$this->assertEquals(1, $archive->count(), 'Incorrect monthly archive count.');
$archive = $blog->getArchivedBlogPosts(2013, 10, 01);
$this->assertEquals(1, $archive->count(), 'Incorrect daily archive count.');
}
public function testArchiveLinks()
{
/**
* @var Blog $blog
*/
$blog = $this->objFromFixture(Blog::class, 'FirstBlog');
$link = Controller::join_links($blog->Link('archive'), '2013', '10', '01');
$this->assertEquals(200, $this->getStatusOf($link), 'HTTP Status should be 200');
$link = Controller::join_links($blog->Link('archive'), '2013', '10');
$this->assertEquals(200, $this->getStatusOf($link), 'HTTP Status should be 200');
$link = Controller::join_links($blog->Link('archive'), '2013');
$this->assertEquals(200, $this->getStatusOf($link), 'HTTP Status should be 200');
$link = Controller::join_links($blog->Link('archive'), '2011', '10', '01');
$this->assertEquals(200, $this->getStatusOf($link), 'HTTP Status should be 200');
$link = Controller::join_links($blog->Link('archive'));
$this->assertEquals(200, $this->getStatusOf($link), 'HTTP Status should be 200');
$link = Controller::join_links($blog->Link('archive'), 'invalid-year');
$this->assertEquals(404, $this->getStatusOf($link), 'HTTP Status should be 404');
$link = Controller::join_links($blog->Link('archive'), '2013', '99');
$this->assertEquals(404, $this->getStatusOf($link), 'HTTP Status should be 404');
$link = Controller::join_links($blog->Link('archive'), '2013', '10', '99');
$this->assertEquals(404, $this->getStatusOf($link), 'HTTP Status should be 404');
}
/*
* Test archive year
*/
public function testArchiveYear()
{
$blog = $this->objFromFixture(Blog::class, 'FirstBlog');
$controller = new BlogController($blog);
$this->requestURL($controller, 'first-post/archive/');
$this->assertEquals(2013, $controller->getArchiveYear(), 'getArchiveYear should return 2013');
}
/**
* @param string $link
*
* @return int
*/
protected function getStatusOf($link)
{
return Director::test($link)->getStatusCode();
}
public function testRoles()
{
/**
* @var Blog $firstBlog
*/
$firstBlog = $this->objFromFixture(Blog::class, 'FirstBlog');
/**
* @var Blog $fourthBlog
*/
$fourthBlog = $this->objFromFixture(Blog::class, 'FourthBlog');
/**
* @var BlogPost $postA
*/
$postA = $this->objFromFixture(BlogPost::class, 'PostA');
/**
* @var BlogPost $postB
*/
$postB = $this->objFromFixture(BlogPost::class, 'PostB');
/**
* @var BlogPost $postC
*/
$postC = $this->objFromFixture(BlogPost::class, 'PostC');
/**
* @var Member $editor
*/
$editor = $this->objFromFixture(Member::class, 'BlogEditor');
/**
* @var Member $writer
*/
$writer = $this->objFromFixture(Member::class, 'Writer');
/**
* @var Member $contributor
*/
$contributor = $this->objFromFixture(Member::class, 'Contributor');
/**
* @var Member $visitor
*/
$visitor = $this->objFromFixture(Member::class, 'Visitor');
$this->assertEquals('Editor', $fourthBlog->RoleOf($editor));
$this->assertEquals('Contributor', $fourthBlog->RoleOf($contributor));
$this->assertEquals('Writer', $fourthBlog->RoleOf($writer));
$this->assertEmpty($fourthBlog->RoleOf($visitor));
$this->assertEquals('Author', $postA->RoleOf($writer));
$this->assertEquals('Author', $postA->RoleOf($contributor));
$this->assertEquals('Editor', $postA->RoleOf($editor));
$this->assertEmpty($postA->RoleOf($visitor));
// Test RoleOf with string values given
$this->assertEquals('Editor', $fourthBlog->RoleOf((string)(int)$editor->ID));
$this->assertEquals('Contributor', $fourthBlog->RoleOf((string)(int)$contributor->ID));
$this->assertEquals('Writer', $fourthBlog->RoleOf((string)(int)$writer->ID));
$this->assertEmpty($fourthBlog->RoleOf((string)(int)$visitor->ID));
$this->assertEquals('Author', $postA->RoleOf((string)(int)$writer->ID));
$this->assertEquals('Author', $postA->RoleOf((string)(int)$contributor->ID));
$this->assertEquals('Editor', $postA->RoleOf((string)(int)$editor->ID));
$this->assertEmpty($postA->RoleOf((string)(int)$visitor->ID));
// Test RoleOf with int values given
$this->assertEquals('Editor', $fourthBlog->RoleOf((int)$editor->ID));
$this->assertEquals('Contributor', $fourthBlog->RoleOf((int)$contributor->ID));
$this->assertEquals('Writer', $fourthBlog->RoleOf((int)$writer->ID));
$this->assertEmpty($fourthBlog->RoleOf((int)$visitor->ID));
$this->assertEquals('Author', $postA->RoleOf((int)$writer->ID));
$this->assertEquals('Author', $postA->RoleOf((int)$contributor->ID));
$this->assertEquals('Editor', $postA->RoleOf((int)$editor->ID));
$this->assertEmpty($postA->RoleOf((int)$visitor->ID));
$this->assertTrue($fourthBlog->canEdit($editor));
$this->assertFalse($firstBlog->canEdit($editor));
$this->assertTrue($fourthBlog->canAddChildren($editor));
$this->assertFalse($firstBlog->canAddChildren($editor));
$this->assertTrue($postA->canEdit($editor));
$this->assertTrue($postB->canEdit($editor));
$this->assertTrue($postC->canEdit($editor));
$this->assertTrue($postA->canPublish($editor));
$this->assertTrue($postB->canPublish($editor));
$this->assertTrue($postC->canPublish($editor));
$this->assertFalse($fourthBlog->canEdit($writer));
$this->assertFalse($firstBlog->canEdit($writer));
$this->assertTrue($fourthBlog->canAddChildren($writer));
$this->assertFalse($firstBlog->canAddChildren($writer));
$this->assertTrue($postA->canEdit($writer));
$this->assertFalse($postB->canEdit($writer));
$this->assertTrue($postC->canEdit($writer));
$this->assertTrue($postA->canPublish($writer));
$this->assertFalse($postB->canPublish($writer));
$this->assertTrue($postC->canPublish($writer));
$this->assertFalse($fourthBlog->canEdit($contributor));
$this->assertFalse($firstBlog->canEdit($contributor));
$this->assertTrue($fourthBlog->canAddChildren($contributor));
$this->assertFalse($firstBlog->canAddChildren($contributor));
$this->assertTrue($postA->canEdit($contributor));
$this->assertFalse($postB->canEdit($contributor));
$this->assertTrue($postC->canEdit($contributor));
$this->assertFalse($postA->canPublish($contributor));
$this->assertFalse($postB->canPublish($contributor));
$this->assertFalse($postC->canPublish($contributor));
$this->assertFalse($fourthBlog->canEdit($visitor));
$this->assertFalse($firstBlog->canEdit($visitor));
$this->assertFalse($fourthBlog->canAddChildren($visitor));
$this->assertFalse($firstBlog->canAddChildren($visitor));
$this->assertFalse($postA->canEdit($visitor));
$this->assertFalse($postB->canEdit($visitor));
$this->assertFalse($postC->canEdit($visitor));
$this->assertFalse($postA->canPublish($visitor));
$this->assertFalse($postB->canPublish($visitor));
$this->assertFalse($postC->canPublish($visitor));
}
public function testFilteredCategoriesRoot()
{
$blog = $this->objFromFixture(Blog::class, 'FirstBlog');
$controller = new BlogController($blog);
$this->requestURL($controller, 'first-post');
$this->assertIDsEquals(
$blog->AllChildren()->column('ID'),
$controller->PaginatedList()->column('ID')
);
}
public function testFilteredCategoriesRSS()
{
$blog = $this->objFromFixture(Blog::class, 'FirstBlog');
$controller = new BlogController($blog);
$this->requestURL($controller, 'first-post/rss');
$this->assertIDsEquals(
$blog->AllChildren()->column('ID'),
$controller->PaginatedList()->column('ID')
);
}
public function testFilteredCategoriesTags()
{
$blog = $this->objFromFixture(Blog::class, 'FirstBlog');
$controller = new BlogController($blog);
// Posts
$firstPostID = $this->idFromFixture(BlogPost::class, 'FirstBlogPost');
$firstFuturePostID = $this->idFromFixture(BlogPost::class, 'FirstFutureBlogPost');
$secondFuturePostID = $this->idFromFixture(BlogPost::class, 'SecondFutureBlogPost');
// Request first tag
$this->requestURL($controller, 'first-post/tag/first-tag');
$this->assertIDsEquals(
[$firstPostID, $firstFuturePostID, $secondFuturePostID],
$controller->PaginatedList()
);
}
public function testFilteredCategoriesArchive()
{
$blog = $this->objFromFixture(Blog::class, 'FirstBlog');
$controller = new BlogController($blog);
// Posts
$firstPostID = $this->idFromFixture(BlogPost::class, 'FirstBlogPost');
$secondPostID = $this->idFromFixture(BlogPost::class, 'SecondBlogPost');
$secondFuturePostID = $this->idFromFixture(BlogPost::class, 'SecondFutureBlogPost');
// Request 2013 posts
$this->requestURL($controller, 'first-post/archive/2013');
$this->assertIDsEquals(
[$firstPostID, $secondPostID, $secondFuturePostID],
$controller->PaginatedList()
);
}
public function testDisabledProfiles()
{
$this->expectException(HTTPResponse_Exception::class);
$this->expectExceptionCode(404);
Config::modify()->set(BlogController::class, 'disable_profiles', true);
$controller = BlogController::create();
$controller->setRequest(Controller::curr()->getRequest());
$controller->profile();
}
/**
* Mock a request against a given controller
*
* @param ContentController $controller
* @param string $url
*/
protected function requestURL(ContentController $controller, $url)
{
$request = new HTTPRequest('get', $url);
$request->match('$URLSegment//$Action/$ID/$OtherID');
$request->shift();
$session = new Session(null);
$session->start($request);
$request->setSession($session);
$controller->doInit();
$controller->handleRequest($request);
$session->clearAll();
$session->destroy();
}
/**
* Assert these id lists match
*
* @param array|SS_List $left
* @param array|SS_List $right
*/
protected function assertIDsEquals($left, $right)
{
if ($left instanceof SS_List) {
$left = $left->column('ID');
}
if ($right instanceof SS_List) {
$right = $right->column('ID');
}
asort($left);
asort($right);
$this->assertEquals(array_values($left ?? []), array_values($right ?? []));
}
}

View File

@ -0,0 +1,39 @@
<?php
namespace SilverStripe\Blog\Tests\Model;
use SilverStripe\Core\Config\Config;
use SilverStripe\Dev\FunctionalTest;
use SilverStripe\i18n\i18n;
use SilverStripe\View\Parsers\URLSegmentFilter;
class BlogControllerFunctionalTest extends FunctionalTest
{
protected static $fixture_file = 'BlogControllerFunctionalTest.yml';
protected static $use_draft_site = true;
protected function setUp(): void
{
Config::modify()->set(URLSegmentFilter::class, 'default_allow_multibyte', true);
i18n::set_locale('fa_IR');
parent::setUp();
}
public function testGetCategoriesWithMultibyteUrl()
{
$result = $this->get('my-blog/category/' . rawurlencode('آبید'));
$this->assertEquals(200, $result->getStatusCode());
$this->assertStringContainsString('آبید', $result->getBody());
}
public function testGetTagsWithMultibyteUrl()
{
$result = $this->get('my-blog/tag/' . rawurlencode('برتراند'));
$this->assertEquals(200, $result->getStatusCode());
$this->assertStringContainsString('برتراند', $result->getBody());
}
}

View File

@ -0,0 +1,29 @@
SilverStripe\Blog\Model\BlogCategory:
category_a:
Title: آبید
URLSegment: آبید
SilverStripe\Blog\Model\BlogTag:
tag_a:
Title: برتراند
URLSegment: برتراند
SilverStripe\Blog\Model\Blog:
blog_a:
URLSegment: my-blog
Title: My Blog
Categories:
- =>SilverStripe\Blog\Model\BlogCategory.category_a
Tags:
- =>SilverStripe\Blog\Model\BlogTag.tag_a
SilverStripe\Blog\Model\BlogPost:
blogpost_a:
Title: My Blog Post
URLSegment: آبیدآبید
PublishDate: 2017-08-01 00:00:00
Parent: =>SilverStripe\Blog\Model\Blog.blog_a
Categories:
- =>SilverStripe\Blog\Model\BlogCategory.category_a
Tags:
- =>SilverStripe\Blog\Model\BlogTag.tag_a

View File

@ -0,0 +1,131 @@
<?php
namespace SilverStripe\Blog\Tests;
use SilverStripe\Blog\Model\Blog;
use SilverStripe\Blog\Model\BlogPost;
use SilverStripe\Blog\Widgets\BlogArchiveWidget;
use SilverStripe\Dev\SapphireTest;
use SilverStripe\ORM\FieldType\DBDatetime;
use SilverStripe\ORM\SS_List;
use SilverStripe\Versioned\Versioned;
use SilverStripe\Widgets\Model\Widget;
class BlogArchiveWidgetTest extends SapphireTest
{
protected static $fixture_file = 'BlogArchiveWidgetTest.yml';
protected function setUp(): void
{
if (!class_exists(Widget::class)) {
self::$fixture_file = null;
parent::setUp();
$this->markTestSkipped('Test requires silverstripe/widgets to be installed.');
}
DBDatetime::set_mock_now('2017-09-20 12:00:00');
parent::setUp();
}
protected function tearDown(): void
{
parent::tearDown();
DBDatetime::clear_mock_now();
}
public function testArchiveMonthlyFromStage()
{
$widgetA = $this->objFromFixture(BlogArchiveWidget::class, 'archive-monthly-a');
$archiveA = $widgetA->getArchive();
$this->assertInstanceOf(SS_List::class, $archiveA);
$this->assertCount(3, $archiveA);
$this->assertListContains([
['Title' => 'August 2017'],
['Title' => 'September 2017'],
['Title' => 'May 2015'],
], $archiveA);
$widgetB = $this->objFromFixture(BlogArchiveWidget::class, 'archive-monthly-b');
$archiveB = $widgetB->getArchive();
$this->assertInstanceOf(SS_List::class, $archiveB);
$this->assertCount(2, $archiveB);
$this->assertListContains([
['Title' => 'March 2016'],
['Title' => 'June 2016'],
], $archiveB);
}
public function testArchiveMonthlyFromLive()
{
$original = Versioned::get_stage();
$this->objFromFixture(BlogPost::class, 'post-b')->publishRecursive();
$this->objFromFixture(BlogArchiveWidget::class, 'archive-monthly-a')->publishRecursive();
Versioned::set_stage(Versioned::LIVE);
$widget = $this->objFromFixture(BlogArchiveWidget::class, 'archive-monthly-a');
$archive = $widget->getArchive();
$this->assertCount(1, $archive);
$this->assertListContains([
['Title' => 'August 2017'],
], $archive);
if ($original) {
Versioned::set_stage($original);
}
}
public function testArchiveYearly()
{
$widgetA = $this->objFromFixture(BlogArchiveWidget::class, 'archive-yearly-a');
$archiveA = $widgetA->getArchive();
$this->assertInstanceOf(SS_List::class, $archiveA);
$this->assertCount(2, $archiveA);
$this->assertListContains([
['Title' => '2017'],
['Title' => '2015'],
], $archiveA);
$widgetB = $this->objFromFixture(BlogArchiveWidget::class, 'archive-yearly-b');
$archiveB = $widgetB->getArchive();
$this->assertInstanceOf(SS_List::class, $archiveB);
$this->assertCount(1, $archiveB);
$this->assertListContains([
['Title' => '2016'],
], $archiveB);
}
public function testArchiveMonthlyWithNewPostsAdded()
{
$original = Versioned::get_stage();
Versioned::set_stage('Stage');
$widget = $this->objFromFixture(BlogArchiveWidget::class, 'archive-monthly-a');
$archive = $widget->getArchive();
$this->assertCount(3, $archive, 'Three months are shown in the blog archive list from fixtures');
DBDatetime::set_mock_now('2018-01-01 12:00:00');
$newPost = new BlogPost;
$newPost->ParentID = $this->objFromFixture(Blog::class, 'blog-a')->ID;
$newPost->Title = 'My new blog post';
$newPost->PublishDate = '2018-01-01 08:00:00'; // Same day as the mocked now, but slightly earlier
$newPost->write();
$archive = $widget->getArchive();
$this->assertCount(4, $archive, 'Four months are shown in the blog archive list after new post added');
if ($original) {
Versioned::set_stage($original);
}
}
}

View File

@ -0,0 +1,45 @@
SilverStripe\Blog\Model\Blog:
blog-a:
Title: Blog A
blog-b:
Title: Blog B
SilverStripe\Blog\Model\BlogPost:
post-a:
Title: September Digest
PublishDate: 2017-09-01 00:00:00
ParentID: =>SilverStripe\Blog\Model\Blog.blog-a
post-b:
Title: August is Awesome
PublishDate: 2017-08-01 00:00:00
ParentID: =>SilverStripe\Blog\Model\Blog.blog-a
post-c:
Title: 2015 is so two years ago
PublishDate: 2015-05-02 00:01:02
ParentID: =>SilverStripe\Blog\Model\Blog.blog-a
post-d:
Title: Blog post on Blog B
PublishDate: 2016-03-13 21:05:36
ParentID: =>SilverStripe\Blog\Model\Blog.blog-b
post-e:
Title: Blog post 2 on Blog B
PublishDate: 2016-06-15 10:00:00
ParentID: =>SilverStripe\Blog\Model\Blog.blog-b
SilverStripe\Blog\Widgets\BlogArchiveWidget:
archive-monthly-a:
NumberToDisplay: 5
ArchiveType: Monthly
BlogID: =>SilverStripe\Blog\Model\Blog.blog-a
archive-monthly-b:
NumberToDisplay: 5
ArchiveType: Monthly
BlogID: =>SilverStripe\Blog\Model\Blog.blog-b
archive-yearly-a:
NumberToDisplay: 5
ArchiveType: Yearly
BlogID: =>SilverStripe\Blog\Model\Blog.blog-a
archive-yearly-b:
NumberToDisplay: 5
ArchiveType: Yearly
BlogID: =>SilverStripe\Blog\Model\Blog.blog-b

245
tests/php/blog.yml Executable file
View File

@ -0,0 +1,245 @@
# Mock date is set to 2013-10-01 20:00:00
# Write to tables rather than dataobjects for performance
SilverStripe\Security\Member:
Admin:
FirstName: Test
Surname: Administrator
Editor:
FirstName: Test
Surname: Editor
BlogEditor:
FirstName: Blog
Surname: Editor
Writer:
FirstName: Blog
Surname: Writer
Contributor:
FirstName: Blog
Surname: Contributor
Visitor:
FirstName: Blog
Surname: Visitor
SilverStripe\Security\Group:
Administrators:
Title: Administrators
Members:
- =>SilverStripe\Security\Member.Admin
Editors:
Title: Editors
Members:
- =>SilverStripe\Security\Member.Editor
BlogUsers:
Title: Blog Users
Code: blogusers
Members:
- =>SilverStripe\Security\Member.BlogEditor
- =>SilverStripe\Security\Member.Writer
- =>SilverStripe\Security\Member.Contributor
SilverStripe\Security\Permission:
Administrators:
Code: ADMIN
Group: =>SilverStripe\Security\Group.Administrators
Editors:
Code: CMS_ACCESS_CMSMain
Group: =>SilverStripe\Security\Group.Editors
BlogUsers:
Code: CMS_ACCESS_CMSMain
Group: =>SilverStripe\Security\Group.BlogUsers
SilverStripe\SiteConfig\SiteConfig:
Default:
CanEditType: 'OnlyTheseUsers'
CanCreateTopLevelType: 'OnlyTheseUsers'
EditorGroups:
- =>SilverStripe\Security\Group.Administrators
- =>SilverStripe\Security\Group.Editors
CreateTopLevelGroups:
- =>SilverStripe\Security\Group.Administrators
- =>SilverStripe\Security\Group.Editors
SilverStripe\Blog\Model\Blog:
FirstBlog:
ClassName: SilverStripe\Blog\Model\Blog
Title: 'First Blog'
URLSegment: 'first-blog'
SecondBlog:
ClassName: SilverStripe\Blog\Model\Blog
Title: 'Second Blog'
CanViewType: 'OnlyTheseUsers'
CanEditType: 'OnlyTheseUsers'
URLSegment: 'second-blog'
ViewerGroups:
- =>SilverStripe\Security\Group.Administrators
EditorGroups:
- =>SilverStripe\Security\Group.Administrators
ThirdBlog:
ClassName: SilverStripe\Blog\Model\Blog
Title: 'Third Blog'
CanEditType: 'OnlyTheseUsers'
URLSegment: 'third-blog'
EditorGroups:
- =>SilverStripe\Security\Group.Editors
FourthBlog:
ClassName: SilverStripe\Blog\Model\Blog
Title: 'Fourth Blog'
URLSegment: 'fourth-blog'
Editors: =>SilverStripe\Security\Member.BlogEditor
Writers: =>SilverStripe\Security\Member.Writer
Contributors: =>SilverStripe\Security\Member.Contributor
SilverStripe\Blog\Model\BlogCategory:
FirstCategory:
Title: 'First Category'
URLSegment: 'first-category'
BlogID: =>SilverStripe\Blog\Model\Blog.FirstBlog
SecondCategory:
Title: 'Second Category'
URLSegment: 'second-category'
BlogID: =>SilverStripe\Blog\Model\Blog.SecondBlog
ThirdCategory:
Title: 'Third Category'
URLSegment: 'third-category'
BlogID: =>SilverStripe\Blog\Model\Blog.ThirdBlog
SilverStripe\Blog\Model\BlogTag:
FirstTag:
Title: 'First Tag'
URLSegment: 'first-tag'
BlogID: =>SilverStripe\Blog\Model\Blog.FirstBlog
SecondTag:
Title: 'Second Tag'
URLSegment: 'second-tag'
BlogID: =>SilverStripe\Blog\Model\Blog.SecondBlog
ThirdTag:
Title: 'Third Tag'
URLSegment: 'third-tag'
BlogID: =>SilverStripe\Blog\Model\Blog.ThirdBlog
#Tags for Tag Cloud widget
PopularTag:
Title: 'Popular'
URLSegment: 'popular'
BlogID: =>SilverStripe\Blog\Model\Blog.FourthBlog
CoolTag:
Title: 'Cool'
URLSegment: 'cool'
BlogID: =>SilverStripe\Blog\Model\Blog.FourthBlog
CatTag:
Title: 'Cat'
URLSegment: 'cat'
BlogID: =>SilverStripe\Blog\Model\Blog.FourthBlog
KiwiTag:
Title: 'Kiwi'
URLSegment: 'kiwi'
BlogID: =>SilverStripe\Blog\Model\Blog.FourthBlog
SilverStripe\Blog\Model\BlogPost:
FirstBlogPost:
ClassName: SilverStripe\Blog\Model\BlogPost
Title: 'First Post'
URLSegment: first-post
ParentID: =>SilverStripe\Blog\Model\Blog.FirstBlog
PublishDate: '2013-10-01 15:00:00'
Tags: =>SilverStripe\Blog\Model\BlogTag.FirstTag
Categories: =>SilverStripe\Blog\Model\BlogCategory.FirstCategory
Content: >
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent commodo tristique ipsum. Vestibulum ut sagittis elit. Curabitur accumsan dui ac iaculis fermentum. Suspendisse consectetur sapien a dignissim porta. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nam mollis, est quis mollis posuere, purus diam interdum magna, vel tempus libero nibh a nunc. Duis enim lectus, consectetur dapibus interdum quis, dignissim at neque. Maecenas efficitur nibh et ipsum mattis molestie. Sed id euismod risus, a efficitur nibh. Nullam erat nibh, aliquam non ante quis, euismod facilisis dui. Fusce eget tellus nec mi accumsan iaculis vitae id neque. Ut rhoncus, felis id venenatis porttitor, ex nibh varius turpis, in pulvinar sem ligula at odio. Suspendisse molestie eros et elit sagittis, nec condimentum quam scelerisque. Donec maximus ligula nec nunc mattis imperdiet. Vestibulum maximus mauris quis pulvinar iaculis.</p>
<p>Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Morbi non sapien eget elit venenatis tristique. Nunc mollis ante eu metus iaculis tempus. Nulla at nibh nisl. Phasellus a lacus urna. Fusce vulputate elit eu aliquet fringilla. Donec vitae efficitur ex, et rutrum nunc. Quisque sed sem at dui congue venenatis vel sit amet lectus.</p>
<p>Fusce fermentum sapien massa, in vehicula massa faucibus ultrices. In tempor nunc at sodales pellentesque. Proin nunc elit, faucibus non vestibulum sed, varius a felis. Maecenas in justo ut ante mollis mattis. Nam placerat mi nec justo semper blandit. Ut pretium nibh justo, sit amet molestie lorem tempus vitae. Integer vehicula eget purus sed mattis. Nam sit amet lobortis quam. Vestibulum nisl diam, commodo eget maximus at, interdum non quam. Praesent et lorem consequat, ornare nulla id, ultricies odio. Ut porta dapibus metus ut fringilla. Vivamus sit amet elit eu dolor varius blandit. Morbi pharetra a odio id tempus.</p>
<p>Phasellus at ipsum faucibus, auctor nisi eu, vestibulum diam. Cras viverra ut massa eleifend volutpat. Ut vel sapien et mi pharetra tempor. Nam at scelerisque orci. Pellentesque pulvinar in dui ut scelerisque. Sed ultrices mauris nec commodo faucibus. Sed urna erat, faucibus quis sem non, auctor tincidunt mauris. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent ac tellus orci. Vivamus tincidunt turpis a sem ullamcorper, eu porttitor mauris condimentum. Aliquam auctor nisl quis massa sodales, nec venenatis metus facilisis. Duis posuere, ante at tristique tristique, sapien ligula sollicitudin purus, ut vehicula tellus mi sed mi. Fusce tortor mi, imperdiet non sollicitudin.</p>
<p>Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Morbi non sapien eget elit venenatis tristique. Nunc mollis ante eu metus iaculis tempus. Nulla at nibh nisl. Phasellus a lacus urna. Fusce vulputate elit eu aliquet fringilla. Donec vitae efficitur ex, et rutrum nunc. Quisque sed sem at dui congue venenatis vel sit amet lectus.</p>
SecondBlogPost:
ClassName: SilverStripe\Blog\Model\BlogPost
Title: 'Second Post'
URLSegment: second-post
ParentID: =>SilverStripe\Blog\Model\Blog.FirstBlog
PublishDate: '2013-09-01 15:00:00'
Content: >
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas nec accumsan dolor, at viverra nibh. Vivamus lectus magna, interdum sit amet libero non, fermentum semper nunc. Nunc eu arcu euismod mauris auctor venenatis. Integer sem lorem, varius iaculis congue et, blandit eget nisi. Quisque ullamcorper laoreet sagittis. Nulla enim metus, viverra ut commodo ut, imperdiet et velit. Sed tincidunt mi condimentum, sodales lectus id, dictum neque. Suspendisse placerat, nibh at mattis volutpat, mauris augue congue dui, lobortis tempor diam magna vitae ligula. Proin sed turpis quis enim maximus sodales sit amet id diam. Proin sollicitudin elementum suscipit.</p>
<p>Nullam at odio eget orci porttitor pharetra. Proin scelerisque mauris quam, non laoreet lectus tempor sed. Curabitur eleifend vel augue et vulputate. In porta magna vitae felis rutrum, et sodales elit ultricies. Proin ac justo nec sem maximus ultrices. Praesent nibh turpis, congue non malesuada id, tincidunt id augue. Aenean vulputate ullamcorper dapibus. Maecenas tincidunt sapien in dolor feugiat porta. Aenean venenatis nibh nunc, ut lacinia dolor luctus at. Integer viverra velit nec tincidunt venenatis. Duis congue blandit ante et convallis. Donec id convallis lorem. Vestibulum vel pellentesque nisl. Nunc accumsan non nisi vitae ultricies. Nam tempus elit at ornare volutpat. Nullam et.</p>
ThirdBlogPost:
ClassName: SilverStripe\Blog\Model\BlogPost
Title: 'Old Post'
URLSegment: old-post
ParentID: =>SilverStripe\Blog\Model\Blog.FirstBlog
PublishDate: '2012-01-09 15:00:00'
Content: >
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas nec accumsan dolor, at viverra nibh. Vivamus lectus magna, interdum sit amet libero non, fermentum semper nunc. Nunc eu arcu euismod mauris auctor venenatis. Integer sem lorem, varius iaculis congue et, blandit eget nisi. Quisque ullamcorper laoreet sagittis. Nulla enim metus, viverra ut commodo ut, imperdiet et velit. Sed tincidunt mi condimentum, sodales lectus id, dictum neque. Suspendisse placerat, nibh at mattis volutpat, mauris augue congue dui, lobortis tempor diam magna vitae ligula. Proin sed turpis quis enim maximus sodales sit amet id diam. Proin sollicitudin elementum suscipit.</p>
FirstFutureBlogPost:
ClassName: SilverStripe\Blog\Model\BlogPost
Title: 'Future Post'
URLSegment: future-post
ParentID: =>SilverStripe\Blog\Model\Blog.FirstBlog
PublishDate: '2015-01-01 00:00:00'
Tags: =>SilverStripe\Blog\Model\BlogTag.FirstTag
Categories: =>SilverStripe\Blog\Model\BlogCategory.FirstCategory
SecondFutureBlogPost:
ClassName: SilverStripe\Blog\Model\BlogPost
Title: 'Future Post 2'
URLSegment: future-post-2
ParentID: =>SilverStripe\Blog\Model\Blog.FirstBlog
PublishDate: '2013-11-01 00:00:00'
Tags: =>SilverStripe\Blog\Model\BlogTag.FirstTag
Categories: =>SilverStripe\Blog\Model\BlogCategory.FirstCategory
PostA:
ClassName: SilverStripe\Blog\Model\BlogPost
Title: 'One Post'
ParentID: =>SilverStripe\Blog\Model\Blog.FourthBlog
Authors: =>SilverStripe\Security\Member.Writer,=>SilverStripe\Security\Member.Contributor
PublishDate: '2012-01-09 15:00:00'
PostB:
ClassName: SilverStripe\Blog\Model\BlogPost
Title: 'Second Post'
ParentID: =>SilverStripe\Blog\Model\Blog.FourthBlog
Authors: =>SilverStripe\Security\Member.BlogEditor
PublishDate: '2012-01-09 15:00:00'
PostC:
ClassName: SilverStripe\Blog\Model\BlogPost
Title: 'Third Post'
ParentID: =>SilverStripe\Blog\Model\Blog.FourthBlog
Authors: =>SilverStripe\Security\Member.Writer,=>SilverStripe\Security\Member.Contributor,=>SilverStripe\Security\Member.BlogEditor
PublishDate: '2012-01-09 15:00:00'
NullPublishDate:
ClassName: SilverStripe\Blog\Model\BlogPost
Title: 'No publish date'
ParentID: =>SilverStripe\Blog\Model\Blog.FourthBlog
Authors: =>SilverStripe\Security\Member.Writer,=>SilverStripe\Security\Member.Contributor,=>SilverStripe\Security\Member.BlogEditor
PublishDate: null
#Posts for the tag cloud widget test
TaggedPost1:
ClassName: SilverStripe\Blog\Model\BlogPost
Title: 'Tagged Post 1'
URLSegment: tagged-post-1
ParentID: =>SilverStripe\Blog\Model\Blog.FourthBlog
PublishDate: '2012-01-09 15:00:00'
Tags: =>SilverStripe\Blog\Model\BlogTag.PopularTag,=>SilverStripe\Blog\Model\BlogTag.CoolTag
Categories: =>SilverStripe\Blog\Model\BlogCategory.FirstCategory
TaggedPost2:
ClassName: SilverStripe\Blog\Model\BlogPost
Title: 'Tagged Post 2'
URLSegment: tagged-post-2
ParentID: =>SilverStripe\Blog\Model\Blog.FourthBlog
PublishDate: '2012-01-09 15:00:00'
Tags: =>SilverStripe\Blog\Model\BlogTag.PopularTag,=>SilverStripe\Blog\Model\BlogTag.CoolTag,=>SilverStripe\Blog\Model\BlogTag.CatTag
Categories: =>SilverStripe\Blog\Model\BlogCategory.FirstCategory
TaggedPost3:
ClassName: SilverStripe\Blog\Model\BlogPost
Title: 'Tagged Post 3'
URLSegment: tagged-post-3
ParentID: =>SilverStripe\Blog\Model\Blog.FourthBlog
PublishDate: '2012-01-09 17:20:00'
Tags: =>SilverStripe\Blog\Model\BlogTag.PopularTag,=>SilverStripe\Blog\Model\BlogTag.CoolTag,=>SilverStripe\Blog\Model\BlogTag.CatTag,=>SilverStripe\Blog\Model\BlogTag.KiwiTag
Categories: =>SilverStripe\Blog\Model\BlogCategory.FirstCategory
TaggedPost4:
ClassName: SilverStripe\Blog\Model\BlogPost
Title: 'Tagged Post 4'
URLSegment: tagged-post-4
ParentID: =>SilverStripe\Blog\Model\Blog.FourthBlog
PublishDate: '2012-04-09 15:00:00'
Tags: =>SilverStripe\Blog\Model\BlogTag.PopularTag
Categories: =>SilverStripe\Blog\Model\BlogCategory.FirstCategory

55
webpack.config.js Normal file
View File

@ -0,0 +1,55 @@
const Path = require('path');
const webpack = require('webpack');
// Import the core config
const webpackConfig = require('@silverstripe/webpack-config');
const {
resolveJS,
externalJS,
moduleJS,
pluginJS,
moduleCSS,
pluginCSS,
} = webpackConfig;
const ENV = process.env.NODE_ENV;
const PATHS = {
ROOT: Path.resolve(),
MODULES: 'node_modules',
FILES_PATH: '../',
THIRDPARTY: 'thirdparty',
SRC: Path.resolve('client/src'),
DIST: Path.resolve('client/dist'),
};
const config = [
{
name: 'bundle',
entry: {
main: `${PATHS.SRC}/main.js`
},
output: {
path: PATHS.DIST,
filename: 'js/[name].bundle.js',
},
devtool: (ENV !== 'production') ? 'source-map' : '',
resolve: resolveJS(ENV, PATHS),
externals: externalJS(ENV, PATHS),
module: moduleJS(ENV, PATHS),
plugins: pluginJS(ENV, PATHS),
},
{
name: 'bundle',
entry: {
main: `${PATHS.SRC}/main.scss`
},
output: {
path: PATHS.DIST,
filename: 'styles/[name].css'
},
devtool: (ENV !== 'production') ? 'source-map' : '',
module: moduleCSS(ENV, PATHS),
plugins: pluginCSS(ENV, PATHS),
},
];
module.exports = config;

9021
yarn.lock Normal file
View File

@ -0,0 +1,9021 @@
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
"@iarna/cli@^1.2.0":
version "1.2.0"
resolved "https://registry.yarnpkg.com/@iarna/cli/-/cli-1.2.0.tgz#0f7af5e851afe895104583c4ca07377a8094d641"
integrity sha512-ukITQAqVs2n9HGmn3car/Ir7d3ta650iXhrG7pjr3EWdFmJuuOVWgYsu7ftsSe5VifEFFhjxVuX9+8F7L8hwcA==
dependencies:
signal-exit "^3.0.2"
update-notifier "^2.2.0"
yargs "^8.0.2"
"@silverstripe/eslint-config@^0.0.5":
version "0.0.5"
resolved "https://registry.yarnpkg.com/@silverstripe/eslint-config/-/eslint-config-0.0.5.tgz#ab94d58e6f328d4efbcc1910572fdff5d85fc4ec"
integrity sha512-3wpbmrK3trKpTaJhEZuh5mEKkP7fBtQ5D61nJ1BvoNUZ2CFM16pXgKHe9NQM+ct/sQxL1Ag7dANq3jjnn6OM+w==
dependencies:
eslint "^4.6.1"
eslint-config-airbnb "^15.1.0"
eslint-config-airbnb-base "^12.0.0"
eslint-loader "^1.7.1"
eslint-plugin-import "^2.7.0"
eslint-plugin-jsx-a11y "^5.1.1"
eslint-plugin-react "^7.3.0"
"@silverstripe/webpack-config@^1.3":
version "1.7.0"
resolved "https://registry.yarnpkg.com/@silverstripe/webpack-config/-/webpack-config-1.7.0.tgz#1fed0775d95c9120e4fc2031a611c50dc6c4b3f0"
integrity sha512-lwtiEW+4oRQzNL24fKRnTffIPE5FCKJCCL2IuOIDdrIDoxxm381fzkcwWuWfhK7Oxbjz9A49UIDfzkUQ1/oW5g==
dependencies:
autoprefixer "^6.4.0"
babel-core "^6.24.1"
babel-loader "^7.0.0"
babel-plugin-transform-object-rest-spread "^6.26.0"
babel-preset-env "^1.6.0"
babel-preset-react "^6.24.1"
css-loader "^0.28.1"
expose-loader "^0.7.3"
extract-text-webpack-plugin "^2.1.0"
file-loader "^0.11.1"
imports-loader "^0.6.5"
json-loader "^0.5.4"
modernizr "^3.6.0"
modernizr-loader "^1.0.1"
node-sass "^4.5.3"
npm "^6.0.0"
postcss-custom-properties "^8.0.10"
postcss-load-config "^1.2.0"
postcss-loader "^2.0.5"
resolve-url-loader "^2.0.2"
sass-lint "^1.11.1"
sass-loader "^6.0.5"
script-loader "^0.7.0"
url-loader "^0.6.2"
webpack "^2.6.1"
webpack-bundle-analyzer "^3.6.0"
"@types/json5@^0.0.29":
version "0.0.29"
resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee"
integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4=
JSONStream@^1.3.4, JSONStream@^1.3.5:
version "1.3.5"
resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0"
integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==
dependencies:
jsonparse "^1.2.0"
through ">=2.2.7 <3"
abbrev@1, abbrev@~1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==
accepts@~1.3.8:
version "1.3.8"
resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e"
integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==
dependencies:
mime-types "~2.1.34"
negotiator "0.6.3"
acorn-dynamic-import@^2.0.0:
version "2.0.2"
resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz#c752bd210bef679501b6c6cb7fc84f8f47158cc4"
integrity sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=
dependencies:
acorn "^4.0.3"
acorn-jsx@^3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b"
integrity sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=
dependencies:
acorn "^3.0.4"
acorn-walk@^7.1.1:
version "7.2.0"
resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc"
integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==
acorn@^3.0.4:
version "3.3.0"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a"
integrity sha1-ReN/s56No/JbruP/U2niu18iAXo=
acorn@^4.0.3:
version "4.0.13"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787"
integrity sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=
acorn@^5.0.0, acorn@^5.5.0:
version "5.7.4"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e"
integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==
acorn@^7.1.1:
version "7.4.1"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa"
integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==
adjust-sourcemap-loader@^1.1.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/adjust-sourcemap-loader/-/adjust-sourcemap-loader-1.2.0.tgz#e33fde95e50db9f2a802e3647e311d2fc5000c69"
integrity sha512-958oaHHVEXMvsY7v7cC5gEkNIcoaAVIhZ4mBReYVZJOTP9IgKmzLjIOhTtzpLMu+qriXvLsVjJ155EeInp45IQ==
dependencies:
assert "^1.3.0"
camelcase "^1.2.1"
loader-utils "^1.1.0"
lodash.assign "^4.0.1"
lodash.defaults "^3.1.2"
object-path "^0.9.2"
regex-parser "^2.2.9"
agent-base@4, agent-base@^4.3.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee"
integrity sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==
dependencies:
es6-promisify "^5.0.0"
agent-base@~4.2.1:
version "4.2.1"
resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9"
integrity sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==
dependencies:
es6-promisify "^5.0.0"
agentkeepalive@^3.4.1:
version "3.5.2"
resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-3.5.2.tgz#a113924dd3fa24a0bc3b78108c450c2abee00f67"
integrity sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==
dependencies:
humanize-ms "^1.2.1"
ajv-keywords@^1.0.0, ajv-keywords@^1.1.1:
version "1.5.1"
resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c"
integrity sha1-MU3QpLM2j609/NxU7eYXG4htrzw=
ajv-keywords@^2.1.0:
version "2.1.1"
resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762"
integrity sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=
ajv-keywords@^3.1.0:
version "3.5.2"
resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d"
integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==
ajv@^4.7.0:
version "4.11.8"
resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536"
integrity sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=
dependencies:
co "^4.6.0"
json-stable-stringify "^1.0.1"
ajv@^5.0.0, ajv@^5.2.3, ajv@^5.3.0:
version "5.5.2"
resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965"
integrity sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=
dependencies:
co "^4.6.0"
fast-deep-equal "^1.0.0"
fast-json-stable-stringify "^2.0.0"
json-schema-traverse "^0.3.0"
ajv@^6.1.0, ajv@^6.12.3:
version "6.12.6"
resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
dependencies:
fast-deep-equal "^3.1.1"
fast-json-stable-stringify "^2.0.0"
json-schema-traverse "^0.4.1"
uri-js "^4.2.2"
align-text@^0.1.1, align-text@^0.1.3:
version "0.1.4"
resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117"
integrity sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=
dependencies:
kind-of "^3.0.2"
longest "^1.0.1"
repeat-string "^1.5.2"
alphanum-sort@^1.0.1, alphanum-sort@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3"
integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=
amdefine@>=0.0.4:
version "1.0.1"
resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5"
integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=
ansi-align@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f"
integrity sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=
dependencies:
string-width "^2.0.0"
ansi-escapes@^1.1.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e"
integrity sha1-06ioOzGapneTZisT52HHkRQiMG4=
ansi-escapes@^3.0.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b"
integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==
ansi-regex@^2.0.0:
version "2.1.1"
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8=
ansi-regex@^3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1"
integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==
ansi-regex@^4.1.0:
version "4.1.1"
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed"
integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==
ansi-regex@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
ansi-styles@^2.2.1:
version "2.2.1"
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=
ansi-styles@^3.2.0, ansi-styles@^3.2.1:
version "3.2.1"
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
dependencies:
color-convert "^1.9.0"
ansi-styles@^4.0.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
dependencies:
color-convert "^2.0.1"
ansicolors@~0.3.2:
version "0.3.2"
resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.3.2.tgz#665597de86a9ffe3aa9bfbe6cae5c6ea426b4979"
integrity sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=
ansistyles@~0.1.3:
version "0.1.3"
resolved "https://registry.yarnpkg.com/ansistyles/-/ansistyles-0.1.3.tgz#5de60415bda071bb37127854c864f41b23254539"
integrity sha1-XeYEFb2gcbs3EnhUyGT0GyMlRTk=
anymatch@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb"
integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==
dependencies:
micromatch "^3.1.4"
normalize-path "^2.1.1"
anymatch@~3.1.2:
version "3.1.2"
resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716"
integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==
dependencies:
normalize-path "^3.0.0"
picomatch "^2.0.4"
aproba@^1.0.3, aproba@^1.1.1, aproba@^1.1.2:
version "1.2.0"
resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==
"aproba@^1.1.2 || 2", aproba@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc"
integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==
archy@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40"
integrity sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=
are-we-there-yet@~1.1.2:
version "1.1.7"
resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz#b15474a932adab4ff8a50d9adfa7e4e926f21146"
integrity sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==
dependencies:
delegates "^1.0.0"
readable-stream "^2.0.6"
argparse@^1.0.7:
version "1.0.10"
resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
dependencies:
sprintf-js "~1.0.2"
argparse@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
aria-query@^0.7.0:
version "0.7.1"
resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-0.7.1.tgz#26cbb5aff64144b0a825be1846e0b16cfa00b11e"
integrity sha1-Jsu1r/ZBRLCoJb4YRuCxbPoAsR4=
dependencies:
ast-types-flow "0.0.7"
commander "^2.11.0"
arr-diff@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=
arr-flatten@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==
arr-union@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=
array-find-index@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1"
integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=
array-flatten@1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=
array-includes@^3.0.3, array-includes@^3.1.4:
version "3.1.4"
resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.4.tgz#f5b493162c760f3539631f005ba2bb46acb45ba9"
integrity sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==
dependencies:
call-bind "^1.0.2"
define-properties "^1.1.3"
es-abstract "^1.19.1"
get-intrinsic "^1.1.1"
is-string "^1.0.7"
array-unique@^0.3.2:
version "0.3.2"
resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=
array.prototype.flat@^1.2.5:
version "1.2.5"
resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz#07e0975d84bbc7c48cd1879d609e682598d33e13"
integrity sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==
dependencies:
call-bind "^1.0.2"
define-properties "^1.1.3"
es-abstract "^1.19.0"
array.prototype.flatmap@^1.2.5:
version "1.2.5"
resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.2.5.tgz#908dc82d8a406930fdf38598d51e7411d18d4446"
integrity sha512-08u6rVyi1Lj7oqWbS9nUxliETrtIROT4XGTA4D/LWGten6E3ocm7cy9SIrmNHOL5XVbVuckUp3X6Xyg8/zpvHA==
dependencies:
call-bind "^1.0.0"
define-properties "^1.1.3"
es-abstract "^1.19.0"
asap@^2.0.0:
version "2.0.6"
resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46"
integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=
asn1.js@^5.2.0:
version "5.4.1"
resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07"
integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==
dependencies:
bn.js "^4.0.0"
inherits "^2.0.1"
minimalistic-assert "^1.0.0"
safer-buffer "^2.1.0"
asn1@~0.2.3:
version "0.2.6"
resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d"
integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==
dependencies:
safer-buffer "~2.1.0"
assert-plus@1.0.0, assert-plus@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=
assert@^1.1.1, assert@^1.3.0:
version "1.5.0"
resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb"
integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==
dependencies:
object-assign "^4.1.1"
util "0.10.3"
assign-symbols@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=
ast-types-flow@0.0.7:
version "0.0.7"
resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad"
integrity sha1-9wtzXGvKGlycItmCw+Oef+ujva0=
async-each@^1.0.1:
version "1.0.3"
resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf"
integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==
async-foreach@^0.1.3:
version "0.1.3"
resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542"
integrity sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=
async-limiter@~1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd"
integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==
async@^2.1.2:
version "2.6.4"
resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221"
integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==
dependencies:
lodash "^4.17.14"
asynckit@^0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
integrity sha1-x57Zf380y48robyXkLzDZkdLS3k=
atob@^2.1.2:
version "2.1.2"
resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
autoprefixer@^6.3.1, autoprefixer@^6.4.0:
version "6.7.7"
resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.7.7.tgz#1dbd1c835658e35ce3f9984099db00585c782014"
integrity sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=
dependencies:
browserslist "^1.7.6"
caniuse-db "^1.0.30000634"
normalize-range "^0.1.2"
num2fraction "^1.2.2"
postcss "^5.2.16"
postcss-value-parser "^3.2.3"
aws-sign2@~0.7.0:
version "0.7.0"
resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=
aws4@^1.8.0:
version "1.11.0"
resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59"
integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==
axobject-query@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-0.1.0.tgz#62f59dbc59c9f9242759ca349960e7a2fe3c36c0"
integrity sha1-YvWdvFnJ+SQnWco0mWDnov48NsA=
dependencies:
ast-types-flow "0.0.7"
babel-code-frame@^6.22.0, babel-code-frame@^6.26.0:
version "6.26.0"
resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"
integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=
dependencies:
chalk "^1.1.3"
esutils "^2.0.2"
js-tokens "^3.0.2"
babel-core@^6.24.1, babel-core@^6.26.0:
version "6.26.3"
resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207"
integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==
dependencies:
babel-code-frame "^6.26.0"
babel-generator "^6.26.0"
babel-helpers "^6.24.1"
babel-messages "^6.23.0"
babel-register "^6.26.0"
babel-runtime "^6.26.0"
babel-template "^6.26.0"
babel-traverse "^6.26.0"
babel-types "^6.26.0"
babylon "^6.18.0"
convert-source-map "^1.5.1"
debug "^2.6.9"
json5 "^0.5.1"
lodash "^4.17.4"
minimatch "^3.0.4"
path-is-absolute "^1.0.1"
private "^0.1.8"
slash "^1.0.0"
source-map "^0.5.7"
babel-generator@^6.26.0:
version "6.26.1"
resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90"
integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==
dependencies:
babel-messages "^6.23.0"
babel-runtime "^6.26.0"
babel-types "^6.26.0"
detect-indent "^4.0.0"
jsesc "^1.3.0"
lodash "^4.17.4"
source-map "^0.5.7"
trim-right "^1.0.1"
babel-helper-builder-binary-assignment-operator-visitor@^6.24.1:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664"
integrity sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=
dependencies:
babel-helper-explode-assignable-expression "^6.24.1"
babel-runtime "^6.22.0"
babel-types "^6.24.1"
babel-helper-builder-react-jsx@^6.24.1:
version "6.26.0"
resolved "https://registry.yarnpkg.com/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz#39ff8313b75c8b65dceff1f31d383e0ff2a408a0"
integrity sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA=
dependencies:
babel-runtime "^6.26.0"
babel-types "^6.26.0"
esutils "^2.0.2"
babel-helper-call-delegate@^6.24.1:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d"
integrity sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=
dependencies:
babel-helper-hoist-variables "^6.24.1"
babel-runtime "^6.22.0"
babel-traverse "^6.24.1"
babel-types "^6.24.1"
babel-helper-define-map@^6.24.1:
version "6.26.0"
resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f"
integrity sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=
dependencies:
babel-helper-function-name "^6.24.1"
babel-runtime "^6.26.0"
babel-types "^6.26.0"
lodash "^4.17.4"
babel-helper-explode-assignable-expression@^6.24.1:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa"
integrity sha1-8luCz33BBDPFX3BZLVdGQArCLKo=
dependencies:
babel-runtime "^6.22.0"
babel-traverse "^6.24.1"
babel-types "^6.24.1"
babel-helper-function-name@^6.24.1:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9"
integrity sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=
dependencies:
babel-helper-get-function-arity "^6.24.1"
babel-runtime "^6.22.0"
babel-template "^6.24.1"
babel-traverse "^6.24.1"
babel-types "^6.24.1"
babel-helper-get-function-arity@^6.24.1:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d"
integrity sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=
dependencies:
babel-runtime "^6.22.0"
babel-types "^6.24.1"
babel-helper-hoist-variables@^6.24.1:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76"
integrity sha1-HssnaJydJVE+rbyZFKc/VAi+enY=
dependencies:
babel-runtime "^6.22.0"
babel-types "^6.24.1"
babel-helper-optimise-call-expression@^6.24.1:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257"
integrity sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=
dependencies:
babel-runtime "^6.22.0"
babel-types "^6.24.1"
babel-helper-regex@^6.24.1:
version "6.26.0"
resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72"
integrity sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=
dependencies:
babel-runtime "^6.26.0"
babel-types "^6.26.0"
lodash "^4.17.4"
babel-helper-remap-async-to-generator@^6.24.1:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b"
integrity sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=
dependencies:
babel-helper-function-name "^6.24.1"
babel-runtime "^6.22.0"
babel-template "^6.24.1"
babel-traverse "^6.24.1"
babel-types "^6.24.1"
babel-helper-replace-supers@^6.24.1:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a"
integrity sha1-v22/5Dk40XNpohPKiov3S2qQqxo=
dependencies:
babel-helper-optimise-call-expression "^6.24.1"
babel-messages "^6.23.0"
babel-runtime "^6.22.0"
babel-template "^6.24.1"
babel-traverse "^6.24.1"
babel-types "^6.24.1"
babel-helpers@^6.24.1:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2"
integrity sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=
dependencies:
babel-runtime "^6.22.0"
babel-template "^6.24.1"
babel-loader@^7.0.0:
version "7.1.5"
resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-7.1.5.tgz#e3ee0cd7394aa557e013b02d3e492bfd07aa6d68"
integrity sha512-iCHfbieL5d1LfOQeeVJEUyD9rTwBcP/fcEbRCfempxTDuqrKpu0AZjLAQHEQa3Yqyj9ORKe2iHfoj4rHLf7xpw==
dependencies:
find-cache-dir "^1.0.0"
loader-utils "^1.0.2"
mkdirp "^0.5.1"
babel-messages@^6.23.0:
version "6.23.0"
resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e"
integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=
dependencies:
babel-runtime "^6.22.0"
babel-plugin-check-es2015-constants@^6.22.0:
version "6.22.0"
resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a"
integrity sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=
dependencies:
babel-runtime "^6.22.0"
babel-plugin-syntax-async-functions@^6.8.0:
version "6.13.0"
resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95"
integrity sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=
babel-plugin-syntax-exponentiation-operator@^6.8.0:
version "6.13.0"
resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de"
integrity sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=
babel-plugin-syntax-flow@^6.18.0:
version "6.18.0"
resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d"
integrity sha1-TDqyCiryaqIM0lmVw5jE63AxDI0=
babel-plugin-syntax-jsx@^6.3.13, babel-plugin-syntax-jsx@^6.8.0:
version "6.18.0"
resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946"
integrity sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=
babel-plugin-syntax-object-rest-spread@^6.8.0:
version "6.13.0"
resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5"
integrity sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=
babel-plugin-syntax-trailing-function-commas@^6.22.0:
version "6.22.0"
resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3"
integrity sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=
babel-plugin-transform-async-to-generator@^6.22.0:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761"
integrity sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=
dependencies:
babel-helper-remap-async-to-generator "^6.24.1"
babel-plugin-syntax-async-functions "^6.8.0"
babel-runtime "^6.22.0"
babel-plugin-transform-es2015-arrow-functions@^6.22.0:
version "6.22.0"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221"
integrity sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=
dependencies:
babel-runtime "^6.22.0"
babel-plugin-transform-es2015-block-scoped-functions@^6.22.0:
version "6.22.0"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141"
integrity sha1-u8UbSflk1wy42OC5ToICRs46YUE=
dependencies:
babel-runtime "^6.22.0"
babel-plugin-transform-es2015-block-scoping@^6.23.0:
version "6.26.0"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f"
integrity sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=
dependencies:
babel-runtime "^6.26.0"
babel-template "^6.26.0"
babel-traverse "^6.26.0"
babel-types "^6.26.0"
lodash "^4.17.4"
babel-plugin-transform-es2015-classes@^6.23.0:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db"
integrity sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=
dependencies:
babel-helper-define-map "^6.24.1"
babel-helper-function-name "^6.24.1"
babel-helper-optimise-call-expression "^6.24.1"
babel-helper-replace-supers "^6.24.1"
babel-messages "^6.23.0"
babel-runtime "^6.22.0"
babel-template "^6.24.1"
babel-traverse "^6.24.1"
babel-types "^6.24.1"
babel-plugin-transform-es2015-computed-properties@^6.22.0:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3"
integrity sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=
dependencies:
babel-runtime "^6.22.0"
babel-template "^6.24.1"
babel-plugin-transform-es2015-destructuring@^6.23.0:
version "6.23.0"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d"
integrity sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=
dependencies:
babel-runtime "^6.22.0"
babel-plugin-transform-es2015-duplicate-keys@^6.22.0:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e"
integrity sha1-c+s9MQypaePvnskcU3QabxV2Qj4=
dependencies:
babel-runtime "^6.22.0"
babel-types "^6.24.1"
babel-plugin-transform-es2015-for-of@^6.23.0:
version "6.23.0"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691"
integrity sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=
dependencies:
babel-runtime "^6.22.0"
babel-plugin-transform-es2015-function-name@^6.22.0:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b"
integrity sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=
dependencies:
babel-helper-function-name "^6.24.1"
babel-runtime "^6.22.0"
babel-types "^6.24.1"
babel-plugin-transform-es2015-literals@^6.22.0:
version "6.22.0"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e"
integrity sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=
dependencies:
babel-runtime "^6.22.0"
babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154"
integrity sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=
dependencies:
babel-plugin-transform-es2015-modules-commonjs "^6.24.1"
babel-runtime "^6.22.0"
babel-template "^6.24.1"
babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1:
version "6.26.2"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3"
integrity sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==
dependencies:
babel-plugin-transform-strict-mode "^6.24.1"
babel-runtime "^6.26.0"
babel-template "^6.26.0"
babel-types "^6.26.0"
babel-plugin-transform-es2015-modules-systemjs@^6.23.0:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23"
integrity sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=
dependencies:
babel-helper-hoist-variables "^6.24.1"
babel-runtime "^6.22.0"
babel-template "^6.24.1"
babel-plugin-transform-es2015-modules-umd@^6.23.0:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468"
integrity sha1-rJl+YoXNGO1hdq22B9YCNErThGg=
dependencies:
babel-plugin-transform-es2015-modules-amd "^6.24.1"
babel-runtime "^6.22.0"
babel-template "^6.24.1"
babel-plugin-transform-es2015-object-super@^6.22.0:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d"
integrity sha1-JM72muIcuDp/hgPa0CH1cusnj40=
dependencies:
babel-helper-replace-supers "^6.24.1"
babel-runtime "^6.22.0"
babel-plugin-transform-es2015-parameters@^6.23.0:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b"
integrity sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=
dependencies:
babel-helper-call-delegate "^6.24.1"
babel-helper-get-function-arity "^6.24.1"
babel-runtime "^6.22.0"
babel-template "^6.24.1"
babel-traverse "^6.24.1"
babel-types "^6.24.1"
babel-plugin-transform-es2015-shorthand-properties@^6.22.0:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0"
integrity sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=
dependencies:
babel-runtime "^6.22.0"
babel-types "^6.24.1"
babel-plugin-transform-es2015-spread@^6.22.0:
version "6.22.0"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1"
integrity sha1-1taKmfia7cRTbIGlQujdnxdG+NE=
dependencies:
babel-runtime "^6.22.0"
babel-plugin-transform-es2015-sticky-regex@^6.22.0:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc"
integrity sha1-AMHNsaynERLN8M9hJsLta0V8zbw=
dependencies:
babel-helper-regex "^6.24.1"
babel-runtime "^6.22.0"
babel-types "^6.24.1"
babel-plugin-transform-es2015-template-literals@^6.22.0:
version "6.22.0"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d"
integrity sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=
dependencies:
babel-runtime "^6.22.0"
babel-plugin-transform-es2015-typeof-symbol@^6.23.0:
version "6.23.0"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372"
integrity sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=
dependencies:
babel-runtime "^6.22.0"
babel-plugin-transform-es2015-unicode-regex@^6.22.0:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9"
integrity sha1-04sS9C6nMj9yk4fxinxa4frrNek=
dependencies:
babel-helper-regex "^6.24.1"
babel-runtime "^6.22.0"
regexpu-core "^2.0.0"
babel-plugin-transform-exponentiation-operator@^6.22.0:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e"
integrity sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=
dependencies:
babel-helper-builder-binary-assignment-operator-visitor "^6.24.1"
babel-plugin-syntax-exponentiation-operator "^6.8.0"
babel-runtime "^6.22.0"
babel-plugin-transform-flow-strip-types@^6.22.0:
version "6.22.0"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz#84cb672935d43714fdc32bce84568d87441cf7cf"
integrity sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=
dependencies:
babel-plugin-syntax-flow "^6.18.0"
babel-runtime "^6.22.0"
babel-plugin-transform-object-rest-spread@^6.26.0:
version "6.26.0"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06"
integrity sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=
dependencies:
babel-plugin-syntax-object-rest-spread "^6.8.0"
babel-runtime "^6.26.0"
babel-plugin-transform-react-display-name@^6.23.0:
version "6.25.0"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz#67e2bf1f1e9c93ab08db96792e05392bf2cc28d1"
integrity sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE=
dependencies:
babel-runtime "^6.22.0"
babel-plugin-transform-react-jsx-self@^6.22.0:
version "6.22.0"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz#df6d80a9da2612a121e6ddd7558bcbecf06e636e"
integrity sha1-322AqdomEqEh5t3XVYvL7PBuY24=
dependencies:
babel-plugin-syntax-jsx "^6.8.0"
babel-runtime "^6.22.0"
babel-plugin-transform-react-jsx-source@^6.22.0:
version "6.22.0"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz#66ac12153f5cd2d17b3c19268f4bf0197f44ecd6"
integrity sha1-ZqwSFT9c0tF7PBkmj0vwGX9E7NY=
dependencies:
babel-plugin-syntax-jsx "^6.8.0"
babel-runtime "^6.22.0"
babel-plugin-transform-react-jsx@^6.24.1:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz#840a028e7df460dfc3a2d29f0c0d91f6376e66a3"
integrity sha1-hAoCjn30YN/DotKfDA2R9jduZqM=
dependencies:
babel-helper-builder-react-jsx "^6.24.1"
babel-plugin-syntax-jsx "^6.8.0"
babel-runtime "^6.22.0"
babel-plugin-transform-regenerator@^6.22.0:
version "6.26.0"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f"
integrity sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=
dependencies:
regenerator-transform "^0.10.0"
babel-plugin-transform-strict-mode@^6.24.1:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758"
integrity sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=
dependencies:
babel-runtime "^6.22.0"
babel-types "^6.24.1"
babel-preset-env@^1.6.0:
version "1.7.0"
resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a"
integrity sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==
dependencies:
babel-plugin-check-es2015-constants "^6.22.0"
babel-plugin-syntax-trailing-function-commas "^6.22.0"
babel-plugin-transform-async-to-generator "^6.22.0"
babel-plugin-transform-es2015-arrow-functions "^6.22.0"
babel-plugin-transform-es2015-block-scoped-functions "^6.22.0"
babel-plugin-transform-es2015-block-scoping "^6.23.0"
babel-plugin-transform-es2015-classes "^6.23.0"
babel-plugin-transform-es2015-computed-properties "^6.22.0"
babel-plugin-transform-es2015-destructuring "^6.23.0"
babel-plugin-transform-es2015-duplicate-keys "^6.22.0"
babel-plugin-transform-es2015-for-of "^6.23.0"
babel-plugin-transform-es2015-function-name "^6.22.0"
babel-plugin-transform-es2015-literals "^6.22.0"
babel-plugin-transform-es2015-modules-amd "^6.22.0"
babel-plugin-transform-es2015-modules-commonjs "^6.23.0"
babel-plugin-transform-es2015-modules-systemjs "^6.23.0"
babel-plugin-transform-es2015-modules-umd "^6.23.0"
babel-plugin-transform-es2015-object-super "^6.22.0"
babel-plugin-transform-es2015-parameters "^6.23.0"
babel-plugin-transform-es2015-shorthand-properties "^6.22.0"
babel-plugin-transform-es2015-spread "^6.22.0"
babel-plugin-transform-es2015-sticky-regex "^6.22.0"
babel-plugin-transform-es2015-template-literals "^6.22.0"
babel-plugin-transform-es2015-typeof-symbol "^6.23.0"
babel-plugin-transform-es2015-unicode-regex "^6.22.0"
babel-plugin-transform-exponentiation-operator "^6.22.0"
babel-plugin-transform-regenerator "^6.22.0"
browserslist "^3.2.6"
invariant "^2.2.2"
semver "^5.3.0"
babel-preset-flow@^6.23.0:
version "6.23.0"
resolved "https://registry.yarnpkg.com/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz#e71218887085ae9a24b5be4169affb599816c49d"
integrity sha1-5xIYiHCFrpoktb5Baa/7WZgWxJ0=
dependencies:
babel-plugin-transform-flow-strip-types "^6.22.0"
babel-preset-react@^6.24.1:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-preset-react/-/babel-preset-react-6.24.1.tgz#ba69dfaea45fc3ec639b6a4ecea6e17702c91380"
integrity sha1-umnfrqRfw+xjm2pOzqbhdwLJE4A=
dependencies:
babel-plugin-syntax-jsx "^6.3.13"
babel-plugin-transform-react-display-name "^6.23.0"
babel-plugin-transform-react-jsx "^6.24.1"
babel-plugin-transform-react-jsx-self "^6.22.0"
babel-plugin-transform-react-jsx-source "^6.22.0"
babel-preset-flow "^6.23.0"
babel-register@^6.26.0:
version "6.26.0"
resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071"
integrity sha1-btAhFz4vy0htestFxgCahW9kcHE=
dependencies:
babel-core "^6.26.0"
babel-runtime "^6.26.0"
core-js "^2.5.0"
home-or-tmp "^2.0.0"
lodash "^4.17.4"
mkdirp "^0.5.1"
source-map-support "^0.4.15"
babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0:
version "6.26.0"
resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4=
dependencies:
core-js "^2.4.0"
regenerator-runtime "^0.11.0"
babel-template@^6.24.1, babel-template@^6.26.0:
version "6.26.0"
resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02"
integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=
dependencies:
babel-runtime "^6.26.0"
babel-traverse "^6.26.0"
babel-types "^6.26.0"
babylon "^6.18.0"
lodash "^4.17.4"
babel-traverse@^6.24.1, babel-traverse@^6.26.0:
version "6.26.0"
resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee"
integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=
dependencies:
babel-code-frame "^6.26.0"
babel-messages "^6.23.0"
babel-runtime "^6.26.0"
babel-types "^6.26.0"
babylon "^6.18.0"
debug "^2.6.8"
globals "^9.18.0"
invariant "^2.2.2"
lodash "^4.17.4"
babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0:
version "6.26.0"
resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497"
integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=
dependencies:
babel-runtime "^6.26.0"
esutils "^2.0.2"
lodash "^4.17.4"
to-fast-properties "^1.0.3"
babylon@^6.18.0:
version "6.18.0"
resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3"
integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==
balanced-match@^0.4.2:
version "0.4.2"
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838"
integrity sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=
balanced-match@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
base64-js@^1.0.2:
version "1.5.1"
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
base@^0.11.1:
version "0.11.2"
resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f"
integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==
dependencies:
cache-base "^1.0.1"
class-utils "^0.3.5"
component-emitter "^1.2.1"
define-property "^1.0.0"
isobject "^3.0.1"
mixin-deep "^1.2.0"
pascalcase "^0.1.1"
bcrypt-pbkdf@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e"
integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=
dependencies:
tweetnacl "^0.14.3"
bfj@^6.1.1:
version "6.1.2"
resolved "https://registry.yarnpkg.com/bfj/-/bfj-6.1.2.tgz#325c861a822bcb358a41c78a33b8e6e2086dde7f"
integrity sha512-BmBJa4Lip6BPRINSZ0BPEIfB1wUY/9rwbwvIHQA1KjX9om29B6id0wnWXq7m3bn5JrUVjeOTnVuhPT1FiHwPGw==
dependencies:
bluebird "^3.5.5"
check-types "^8.0.3"
hoopy "^0.1.4"
tryer "^1.0.1"
big.js@^3.1.3:
version "3.2.0"
resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e"
integrity sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==
big.js@^5.2.2:
version "5.2.2"
resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328"
integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==
bin-links@^1.1.2, bin-links@^1.1.8:
version "1.1.8"
resolved "https://registry.yarnpkg.com/bin-links/-/bin-links-1.1.8.tgz#bd39aadab5dc4bdac222a07df5baf1af745b2228"
integrity sha512-KgmVfx+QqggqP9dA3iIc5pA4T1qEEEL+hOhOhNPaUm77OTrJoOXE/C05SJLNJe6m/2wUK7F1tDSou7n5TfCDzQ==
dependencies:
bluebird "^3.5.3"
cmd-shim "^3.0.0"
gentle-fs "^2.3.0"
graceful-fs "^4.1.15"
npm-normalize-package-bin "^1.0.0"
write-file-atomic "^2.3.0"
binary-extensions@^1.0.0:
version "1.13.1"
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65"
integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==
binary-extensions@^2.0.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
bindings@^1.5.0:
version "1.5.0"
resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df"
integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==
dependencies:
file-uri-to-path "1.0.0"
block-stream@*:
version "0.0.9"
resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a"
integrity sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=
dependencies:
inherits "~2.0.0"
bluebird@^3.5.1, bluebird@^3.5.3, bluebird@^3.5.5:
version "3.7.2"
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==
bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9:
version "4.12.0"
resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88"
integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==
bn.js@^5.0.0, bn.js@^5.1.1:
version "5.2.0"
resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002"
integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==
body-parser@1.19.2:
version "1.19.2"
resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.2.tgz#4714ccd9c157d44797b8b5607d72c0b89952f26e"
integrity sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==
dependencies:
bytes "3.1.2"
content-type "~1.0.4"
debug "2.6.9"
depd "~1.1.2"
http-errors "1.8.1"
iconv-lite "0.4.24"
on-finished "~2.3.0"
qs "6.9.7"
raw-body "2.4.3"
type-is "~1.6.18"
boxen@^1.2.1:
version "1.3.0"
resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b"
integrity sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==
dependencies:
ansi-align "^2.0.0"
camelcase "^4.0.0"
chalk "^2.0.1"
cli-boxes "^1.0.0"
string-width "^2.0.0"
term-size "^1.2.0"
widest-line "^2.0.0"
brace-expansion@^1.1.7:
version "1.1.11"
resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
dependencies:
balanced-match "^1.0.0"
concat-map "0.0.1"
braces@^2.3.1, braces@^2.3.2:
version "2.3.2"
resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729"
integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==
dependencies:
arr-flatten "^1.1.0"
array-unique "^0.3.2"
extend-shallow "^2.0.1"
fill-range "^4.0.0"
isobject "^3.0.1"
repeat-element "^1.1.2"
snapdragon "^0.8.1"
snapdragon-node "^2.0.1"
split-string "^3.0.2"
to-regex "^3.0.1"
braces@~3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
dependencies:
fill-range "^7.0.1"
brorand@^1.0.1, brorand@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=
browserify-aes@^1.0.0, browserify-aes@^1.0.4:
version "1.2.0"
resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48"
integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==
dependencies:
buffer-xor "^1.0.3"
cipher-base "^1.0.0"
create-hash "^1.1.0"
evp_bytestokey "^1.0.3"
inherits "^2.0.1"
safe-buffer "^5.0.1"
browserify-cipher@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0"
integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==
dependencies:
browserify-aes "^1.0.4"
browserify-des "^1.0.0"
evp_bytestokey "^1.0.0"
browserify-des@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c"
integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==
dependencies:
cipher-base "^1.0.1"
des.js "^1.0.0"
inherits "^2.0.1"
safe-buffer "^5.1.2"
browserify-rsa@^4.0.0, browserify-rsa@^4.0.1:
version "4.1.0"
resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d"
integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==
dependencies:
bn.js "^5.0.0"
randombytes "^2.0.1"
browserify-sign@^4.0.0:
version "4.2.1"
resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3"
integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==
dependencies:
bn.js "^5.1.1"
browserify-rsa "^4.0.1"
create-hash "^1.2.0"
create-hmac "^1.1.7"
elliptic "^6.5.3"
inherits "^2.0.4"
parse-asn1 "^5.1.5"
readable-stream "^3.6.0"
safe-buffer "^5.2.0"
browserify-zlib@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f"
integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==
dependencies:
pako "~1.0.5"
browserslist@^1.3.6, browserslist@^1.5.2, browserslist@^1.7.6:
version "1.7.7"
resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-1.7.7.tgz#0bd76704258be829b2398bb50e4b62d1a166b0b9"
integrity sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=
dependencies:
caniuse-db "^1.0.30000639"
electron-to-chromium "^1.2.7"
browserslist@^3.2.6:
version "3.2.8"
resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6"
integrity sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==
dependencies:
caniuse-lite "^1.0.30000844"
electron-to-chromium "^1.3.47"
buffer-from@^1.0.0:
version "1.1.2"
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==
buffer-xor@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=
buffer@^4.3.0:
version "4.9.2"
resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8"
integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==
dependencies:
base64-js "^1.0.2"
ieee754 "^1.1.4"
isarray "^1.0.0"
builtin-status-codes@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=
builtins@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88"
integrity sha1-y5T662HIaWRR2zZTThQi+U8K7og=
byline@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/byline/-/byline-5.0.0.tgz#741c5216468eadc457b03410118ad77de8c1ddb1"
integrity sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE=
byte-size@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/byte-size/-/byte-size-5.0.1.tgz#4b651039a5ecd96767e71a3d7ed380e48bed4191"
integrity sha512-/XuKeqWocKsYa/cBY1YbSJSWWqTi4cFgr9S6OyM7PBaPbr9zvNGwWP33vt0uqGhwDdN+y3yhbXVILEUpnwEWGw==
bytes@3.1.2:
version "3.1.2"
resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5"
integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==
cacache@^12.0.0, cacache@^12.0.2, cacache@^12.0.3:
version "12.0.4"
resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c"
integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==
dependencies:
bluebird "^3.5.5"
chownr "^1.1.1"
figgy-pudding "^3.5.1"
glob "^7.1.4"
graceful-fs "^4.1.15"
infer-owner "^1.0.3"
lru-cache "^5.1.1"
mississippi "^3.0.0"
mkdirp "^0.5.1"
move-concurrently "^1.0.1"
promise-inflight "^1.0.1"
rimraf "^2.6.3"
ssri "^6.0.1"
unique-filename "^1.1.1"
y18n "^4.0.0"
cache-base@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==
dependencies:
collection-visit "^1.0.0"
component-emitter "^1.2.1"
get-value "^2.0.6"
has-value "^1.0.0"
isobject "^3.0.1"
set-value "^2.0.0"
to-object-path "^0.3.0"
union-value "^1.0.0"
unset-value "^1.0.0"
call-bind@^1.0.0, call-bind@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c"
integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==
dependencies:
function-bind "^1.1.1"
get-intrinsic "^1.0.2"
call-limit@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/call-limit/-/call-limit-1.1.1.tgz#ef15f2670db3f1992557e2d965abc459e6e358d4"
integrity sha512-5twvci5b9eRBw2wCfPtN0GmlR2/gadZqyFpPhOK6CvMFoFgA+USnZ6Jpu1lhG9h85pQ3Ouil3PfXWRD4EUaRiQ==
caller-callsite@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134"
integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=
dependencies:
callsites "^2.0.0"
caller-path@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f"
integrity sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=
dependencies:
callsites "^0.2.0"
caller-path@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4"
integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=
dependencies:
caller-callsite "^2.0.0"
callsites@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca"
integrity sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=
callsites@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50"
integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=
camelcase-keys@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7"
integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc=
dependencies:
camelcase "^2.0.0"
map-obj "^1.0.0"
camelcase@^1.0.2, camelcase@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39"
integrity sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=
camelcase@^2.0.0:
version "2.1.1"
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f"
integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=
camelcase@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a"
integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo=
camelcase@^4.0.0, camelcase@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=
camelcase@^5.0.0:
version "5.3.1"
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
caniuse-api@^1.5.2:
version "1.6.1"
resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-1.6.1.tgz#b534e7c734c4f81ec5fbe8aca2ad24354b962c6c"
integrity sha1-tTTnxzTE+B7F++isoq0kNUuWLGw=
dependencies:
browserslist "^1.3.6"
caniuse-db "^1.0.30000529"
lodash.memoize "^4.1.2"
lodash.uniq "^4.5.0"
caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639:
version "1.0.30001323"
resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30001323.tgz#4399d177506202f69206a7c3438d960620272dbc"
integrity sha512-dz5Ecu+vYmlkks9nWf0B7uKhnypK8kbHzDT5qCaH8l0rSCDkn9MqveART0BBu32ZvwIG3yDqHdgCR4yKBKdrKw==
caniuse-lite@^1.0.30000844:
version "1.0.30001323"
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001323.tgz#a451ff80dec7033016843f532efda18f02eec011"
integrity sha512-e4BF2RlCVELKx8+RmklSEIVub1TWrmdhvA5kEUueummz1XyySW0DVk+3x9HyhU9MuWTa2BhqLgEuEmUwASAdCA==
capture-stack-trace@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d"
integrity sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==
caseless@~0.12.0:
version "0.12.0"
resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=
center-align@^0.1.1:
version "0.1.3"
resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad"
integrity sha1-qg0yYptu6XIgBBHL1EYckHvCt60=
dependencies:
align-text "^0.1.3"
lazy-cache "^1.0.3"
chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=
dependencies:
ansi-styles "^2.2.1"
escape-string-regexp "^1.0.2"
has-ansi "^2.0.0"
strip-ansi "^3.0.0"
supports-color "^2.0.0"
chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.1:
version "2.4.2"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
dependencies:
ansi-styles "^3.2.1"
escape-string-regexp "^1.0.5"
supports-color "^5.3.0"
chardet@^0.4.0:
version "0.4.2"
resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2"
integrity sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=
check-types@^8.0.3:
version "8.0.3"
resolved "https://registry.yarnpkg.com/check-types/-/check-types-8.0.3.tgz#3356cca19c889544f2d7a95ed49ce508a0ecf552"
integrity sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ==
chokidar@^2.1.8:
version "2.1.8"
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917"
integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==
dependencies:
anymatch "^2.0.0"
async-each "^1.0.1"
braces "^2.3.2"
glob-parent "^3.1.0"
inherits "^2.0.3"
is-binary-path "^1.0.0"
is-glob "^4.0.0"
normalize-path "^3.0.0"
path-is-absolute "^1.0.0"
readdirp "^2.2.1"
upath "^1.1.1"
optionalDependencies:
fsevents "^1.2.7"
chokidar@^3.4.1:
version "3.5.3"
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd"
integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==
dependencies:
anymatch "~3.1.2"
braces "~3.0.2"
glob-parent "~5.1.2"
is-binary-path "~2.1.0"
is-glob "~4.0.1"
normalize-path "~3.0.0"
readdirp "~3.6.0"
optionalDependencies:
fsevents "~2.3.2"
chownr@^1.1.1, chownr@^1.1.2, chownr@^1.1.4:
version "1.1.4"
resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b"
integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==
ci-info@^1.5.0:
version "1.6.0"
resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497"
integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==
ci-info@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46"
integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==
cidr-regex@^2.0.10:
version "2.0.10"
resolved "https://registry.yarnpkg.com/cidr-regex/-/cidr-regex-2.0.10.tgz#af13878bd4ad704de77d6dc800799358b3afa70d"
integrity sha512-sB3ogMQXWvreNPbJUZMRApxuRYd+KoIo4RGQ81VatjmMW6WJPo+IJZ2846FGItr9VzKo5w7DXzijPLGtSd0N3Q==
dependencies:
ip-regex "^2.1.0"
cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
version "1.0.4"
resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==
dependencies:
inherits "^2.0.1"
safe-buffer "^5.0.1"
circular-json@^0.3.1:
version "0.3.3"
resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66"
integrity sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==
clap@^1.0.9:
version "1.2.3"
resolved "https://registry.yarnpkg.com/clap/-/clap-1.2.3.tgz#4f36745b32008492557f46412d66d50cb99bce51"
integrity sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==
dependencies:
chalk "^1.1.3"
class-utils@^0.3.5:
version "0.3.6"
resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==
dependencies:
arr-union "^3.1.0"
define-property "^0.2.5"
isobject "^3.0.0"
static-extend "^0.1.1"
cli-boxes@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143"
integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM=
cli-columns@^3.1.2:
version "3.1.2"
resolved "https://registry.yarnpkg.com/cli-columns/-/cli-columns-3.1.2.tgz#6732d972979efc2ae444a1f08e08fa139c96a18e"
integrity sha1-ZzLZcpee/CrkRKHwjgj6E5yWoY4=
dependencies:
string-width "^2.0.0"
strip-ansi "^3.0.1"
cli-cursor@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987"
integrity sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=
dependencies:
restore-cursor "^1.0.1"
cli-cursor@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5"
integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=
dependencies:
restore-cursor "^2.0.0"
cli-table3@^0.5.0, cli-table3@^0.5.1:
version "0.5.1"
resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.5.1.tgz#0252372d94dfc40dbd8df06005f48f31f656f202"
integrity sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==
dependencies:
object-assign "^4.1.0"
string-width "^2.1.1"
optionalDependencies:
colors "^1.1.2"
cli-width@^2.0.0:
version "2.2.1"
resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48"
integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==
cliui@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1"
integrity sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=
dependencies:
center-align "^0.1.1"
right-align "^0.1.1"
wordwrap "0.0.2"
cliui@^3.2.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d"
integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=
dependencies:
string-width "^1.0.1"
strip-ansi "^3.0.1"
wrap-ansi "^2.0.0"
cliui@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5"
integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==
dependencies:
string-width "^3.1.0"
strip-ansi "^5.2.0"
wrap-ansi "^5.1.0"
cliui@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1"
integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==
dependencies:
string-width "^4.2.0"
strip-ansi "^6.0.0"
wrap-ansi "^6.2.0"
clone-deep@^2.0.1:
version "2.0.2"
resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-2.0.2.tgz#00db3a1e173656730d1188c3d6aced6d7ea97713"
integrity sha512-SZegPTKjCgpQH63E+eN6mVEEPdQBOUzjyJm5Pora4lrwWRFS8I0QAxV/KD6vV/i0WuijHZWQC1fMsPEdxfdVCQ==
dependencies:
for-own "^1.0.0"
is-plain-object "^2.0.4"
kind-of "^6.0.0"
shallow-clone "^1.0.0"
clone@^1.0.2:
version "1.0.4"
resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4=
cmd-shim@^3.0.0, cmd-shim@^3.0.3:
version "3.0.3"
resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-3.0.3.tgz#2c35238d3df37d98ecdd7d5f6b8dc6b21cadc7cb"
integrity sha512-DtGg+0xiFhQIntSBRzL2fRQBnmtAVwXIDo4Qq46HPpObYquxMaZS4sb82U9nH91qJrlosC1wa9gwr0QyL/HypA==
dependencies:
graceful-fs "^4.1.2"
mkdirp "~0.5.0"
co@^4.6.0:
version "4.6.0"
resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=
coa@~1.0.1:
version "1.0.4"
resolved "https://registry.yarnpkg.com/coa/-/coa-1.0.4.tgz#a9ef153660d6a86a8bdec0289a5c684d217432fd"
integrity sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=
dependencies:
q "^1.1.2"
code-point-at@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=
collection-visit@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0"
integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=
dependencies:
map-visit "^1.0.0"
object-visit "^1.0.0"
color-convert@^1.3.0, color-convert@^1.9.0:
version "1.9.3"
resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
dependencies:
color-name "1.1.3"
color-convert@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
dependencies:
color-name "~1.1.4"
color-name@1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
color-name@^1.0.0, color-name@~1.1.4:
version "1.1.4"
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
color-string@^0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/color-string/-/color-string-0.3.0.tgz#27d46fb67025c5c2fa25993bfbf579e47841b991"
integrity sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=
dependencies:
color-name "^1.0.0"
color@^0.11.0:
version "0.11.4"
resolved "https://registry.yarnpkg.com/color/-/color-0.11.4.tgz#6d7b5c74fb65e841cd48792ad1ed5e07b904d764"
integrity sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=
dependencies:
clone "^1.0.2"
color-convert "^1.3.0"
color-string "^0.3.0"
colormin@^1.0.5:
version "1.1.2"
resolved "https://registry.yarnpkg.com/colormin/-/colormin-1.1.2.tgz#ea2f7420a72b96881a38aae59ec124a6f7298133"
integrity sha1-6i90IKcrlogaOKrlnsEkpvcpgTM=
dependencies:
color "^0.11.0"
css-color-names "0.0.4"
has "^1.0.1"
colors@^1.1.2:
version "1.4.0"
resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78"
integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==
colors@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63"
integrity sha1-FopHAXVran9RoSzgyXv6KMCE7WM=
columnify@~1.5.4:
version "1.5.4"
resolved "https://registry.yarnpkg.com/columnify/-/columnify-1.5.4.tgz#4737ddf1c7b69a8a7c340570782e947eec8e78bb"
integrity sha1-Rzfd8ce2mop8NAVweC6UfuyOeLs=
dependencies:
strip-ansi "^3.0.0"
wcwidth "^1.0.0"
combined-stream@^1.0.6, combined-stream@~1.0.6:
version "1.0.8"
resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
dependencies:
delayed-stream "~1.0.0"
commander@^2.11.0, commander@^2.18.0, commander@^2.8.1:
version "2.20.3"
resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
commondir@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=
component-emitter@^1.2.1:
version "1.3.0"
resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0"
integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==
concat-map@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
concat-stream@^1.4.6, concat-stream@^1.5.0, concat-stream@^1.6.0:
version "1.6.2"
resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34"
integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==
dependencies:
buffer-from "^1.0.0"
inherits "^2.0.3"
readable-stream "^2.2.2"
typedarray "^0.0.6"
config-chain@^1.1.12:
version "1.1.13"
resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4"
integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==
dependencies:
ini "^1.3.4"
proto-list "~1.2.1"
configstore@^3.0.0:
version "3.1.5"
resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.5.tgz#e9af331fadc14dabd544d3e7e76dc446a09a530f"
integrity sha512-nlOhI4+fdzoK5xmJ+NY+1gZK56bwEaWZr8fYuXohZ9Vkc1o3a4T/R3M+yE/w7x/ZVJ1zF8c+oaOvF0dztdUgmA==
dependencies:
dot-prop "^4.2.1"
graceful-fs "^4.1.2"
make-dir "^1.0.0"
unique-string "^1.0.0"
write-file-atomic "^2.0.0"
xdg-basedir "^3.0.0"
console-browserify@^1.1.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336"
integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==
console-control-strings@^1.0.0, console-control-strings@^1.1.0, console-control-strings@~1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=
constants-browserify@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=
content-disposition@0.5.4:
version "0.5.4"
resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe"
integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==
dependencies:
safe-buffer "5.2.1"
content-type@~1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==
convert-source-map@^0.3.3:
version "0.3.5"
resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-0.3.5.tgz#f1d802950af7dd2631a1febe0596550c86ab3190"
integrity sha1-8dgClQr33SYxof6+BZZVDIarMZA=
convert-source-map@^1.5.1:
version "1.8.0"
resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369"
integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==
dependencies:
safe-buffer "~5.1.1"
cookie-signature@1.0.6:
version "1.0.6"
resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw=
cookie@0.4.2:
version "0.4.2"
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432"
integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==
copy-concurrently@^1.0.0:
version "1.0.5"
resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0"
integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==
dependencies:
aproba "^1.1.1"
fs-write-stream-atomic "^1.0.8"
iferr "^0.1.5"
mkdirp "^0.5.1"
rimraf "^2.5.4"
run-queue "^1.0.0"
copy-descriptor@^0.1.0:
version "0.1.1"
resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=
core-js@^2.4.0, core-js@^2.5.0:
version "2.6.12"
resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec"
integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==
core-util-is@1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
core-util-is@~1.0.0:
version "1.0.3"
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85"
integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==
cosmiconfig@^2.1.0, cosmiconfig@^2.1.1:
version "2.2.2"
resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-2.2.2.tgz#6173cebd56fac042c1f4390edf7af6c07c7cb892"
integrity sha512-GiNXLwAFPYHy25XmTPpafYvn3CLAkJ8FLsscq78MQd1Kh0OU6Yzhn4eV2MVF4G9WEQZoWEGltatdR+ntGPMl5A==
dependencies:
is-directory "^0.3.1"
js-yaml "^3.4.3"
minimist "^1.2.0"
object-assign "^4.1.0"
os-homedir "^1.0.1"
parse-json "^2.2.0"
require-from-string "^1.1.0"
cosmiconfig@^5.0.0:
version "5.2.1"
resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a"
integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==
dependencies:
import-fresh "^2.0.0"
is-directory "^0.3.1"
js-yaml "^3.13.1"
parse-json "^4.0.0"
create-ecdh@^4.0.0:
version "4.0.4"
resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e"
integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==
dependencies:
bn.js "^4.1.0"
elliptic "^6.5.3"
create-error-class@^3.0.0:
version "3.0.2"
resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6"
integrity sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=
dependencies:
capture-stack-trace "^1.0.0"
create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196"
integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==
dependencies:
cipher-base "^1.0.1"
inherits "^2.0.1"
md5.js "^1.3.4"
ripemd160 "^2.0.1"
sha.js "^2.4.0"
create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7:
version "1.1.7"
resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff"
integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==
dependencies:
cipher-base "^1.0.3"
create-hash "^1.1.0"
inherits "^2.0.1"
ripemd160 "^2.0.0"
safe-buffer "^5.0.1"
sha.js "^2.4.8"
cross-spawn@^3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982"
integrity sha1-ElYDfsufDF9549bvE14wdwGEuYI=
dependencies:
lru-cache "^4.0.1"
which "^1.2.9"
cross-spawn@^5.0.1, cross-spawn@^5.1.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=
dependencies:
lru-cache "^4.0.1"
shebang-command "^1.2.0"
which "^1.2.9"
crypto-browserify@^3.11.0:
version "3.12.0"
resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec"
integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==
dependencies:
browserify-cipher "^1.0.0"
browserify-sign "^4.0.0"
create-ecdh "^4.0.0"
create-hash "^1.1.0"
create-hmac "^1.1.0"
diffie-hellman "^5.0.0"
inherits "^2.0.1"
pbkdf2 "^3.0.3"
public-encrypt "^4.0.0"
randombytes "^2.0.0"
randomfill "^1.0.3"
crypto-random-string@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e"
integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=
css-color-names@0.0.4:
version "0.0.4"
resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0"
integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=
css-loader@^0.28.1:
version "0.28.11"
resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-0.28.11.tgz#c3f9864a700be2711bb5a2462b2389b1a392dab7"
integrity sha512-wovHgjAx8ZIMGSL8pTys7edA1ClmzxHeY6n/d97gg5odgsxEgKjULPR0viqyC+FWMCL9sfqoC/QCUBo62tLvPg==
dependencies:
babel-code-frame "^6.26.0"
css-selector-tokenizer "^0.7.0"
cssnano "^3.10.0"
icss-utils "^2.1.0"
loader-utils "^1.0.2"
lodash.camelcase "^4.3.0"
object-assign "^4.1.1"
postcss "^5.0.6"
postcss-modules-extract-imports "^1.2.0"
postcss-modules-local-by-default "^1.2.0"
postcss-modules-scope "^1.1.0"
postcss-modules-values "^1.3.0"
postcss-value-parser "^3.3.0"
source-list-map "^2.0.0"
css-selector-tokenizer@^0.7.0:
version "0.7.3"
resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz#735f26186e67c749aaf275783405cf0661fae8f1"
integrity sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg==
dependencies:
cssesc "^3.0.0"
fastparse "^1.1.2"
css@^2.0.0:
version "2.2.4"
resolved "https://registry.yarnpkg.com/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929"
integrity sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==
dependencies:
inherits "^2.0.3"
source-map "^0.6.1"
source-map-resolve "^0.5.2"
urix "^0.1.0"
cssesc@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee"
integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==
cssnano@^3.10.0:
version "3.10.0"
resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-3.10.0.tgz#4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38"
integrity sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg=
dependencies:
autoprefixer "^6.3.1"
decamelize "^1.1.2"
defined "^1.0.0"
has "^1.0.1"
object-assign "^4.0.1"
postcss "^5.0.14"
postcss-calc "^5.2.0"
postcss-colormin "^2.1.8"
postcss-convert-values "^2.3.4"
postcss-discard-comments "^2.0.4"
postcss-discard-duplicates "^2.0.1"
postcss-discard-empty "^2.0.1"
postcss-discard-overridden "^0.1.1"
postcss-discard-unused "^2.2.1"
postcss-filter-plugins "^2.0.0"
postcss-merge-idents "^2.1.5"
postcss-merge-longhand "^2.0.1"
postcss-merge-rules "^2.0.3"
postcss-minify-font-values "^1.0.2"
postcss-minify-gradients "^1.0.1"
postcss-minify-params "^1.0.4"
postcss-minify-selectors "^2.0.4"
postcss-normalize-charset "^1.1.0"
postcss-normalize-url "^3.0.7"
postcss-ordered-values "^2.1.0"
postcss-reduce-idents "^2.2.2"
postcss-reduce-initial "^1.0.0"
postcss-reduce-transforms "^1.0.3"
postcss-svgo "^2.1.1"
postcss-unique-selectors "^2.0.2"
postcss-value-parser "^3.2.3"
postcss-zindex "^2.0.1"
csso@~2.3.1:
version "2.3.2"
resolved "https://registry.yarnpkg.com/csso/-/csso-2.3.2.tgz#ddd52c587033f49e94b71fc55569f252e8ff5f85"
integrity sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=
dependencies:
clap "^1.0.9"
source-map "^0.5.3"
currently-unhandled@^0.4.1:
version "0.4.1"
resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea"
integrity sha1-mI3zP+qxke95mmE2nddsF635V+o=
dependencies:
array-find-index "^1.0.1"
cyclist@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9"
integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=
d@1, d@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a"
integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==
dependencies:
es5-ext "^0.10.50"
type "^1.0.1"
damerau-levenshtein@^1.0.0:
version "1.0.8"
resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7"
integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==
dashdash@^1.12.0:
version "1.14.1"
resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=
dependencies:
assert-plus "^1.0.0"
debug@2.6.9, debug@^2.1.1, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9:
version "2.6.9"
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
dependencies:
ms "2.0.0"
debug@3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==
dependencies:
ms "2.0.0"
debug@^3.1.0, debug@^3.2.7:
version "3.2.7"
resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a"
integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==
dependencies:
ms "^2.1.1"
debuglog@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492"
integrity sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=
decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2, decamelize@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=
decode-uri-component@^0.2.0:
version "0.2.2"
resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9"
integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==
deep-extend@^0.6.0:
version "0.6.0"
resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==
deep-is@~0.1.3:
version "0.1.4"
resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831"
integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
defaults@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d"
integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=
dependencies:
clone "^1.0.2"
define-properties@^1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==
dependencies:
object-keys "^1.0.12"
define-property@^0.2.5:
version "0.2.5"
resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116"
integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=
dependencies:
is-descriptor "^0.1.0"
define-property@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6"
integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY=
dependencies:
is-descriptor "^1.0.0"
define-property@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d"
integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==
dependencies:
is-descriptor "^1.0.2"
isobject "^3.0.1"
defined@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693"
integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=
delayed-stream@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk=
delegates@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=
depd@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=
des.js@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843"
integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==
dependencies:
inherits "^2.0.1"
minimalistic-assert "^1.0.0"
destroy@~1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=
detect-indent@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208"
integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg=
dependencies:
repeating "^2.0.0"
detect-indent@~5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d"
integrity sha1-OHHMCmoALow+Wzz38zYmRnXwa50=
detect-newline@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2"
integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=
dezalgo@^1.0.0, dezalgo@~1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.3.tgz#7f742de066fc748bc8db820569dddce49bf0d456"
integrity sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=
dependencies:
asap "^2.0.0"
wrappy "1"
diffie-hellman@^5.0.0:
version "5.0.3"
resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875"
integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==
dependencies:
bn.js "^4.1.0"
miller-rabin "^4.0.0"
randombytes "^2.0.0"
doctrine@^1.2.2:
version "1.5.0"
resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa"
integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=
dependencies:
esutils "^2.0.2"
isarray "^1.0.0"
doctrine@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d"
integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==
dependencies:
esutils "^2.0.2"
doctrine@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961"
integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==
dependencies:
esutils "^2.0.2"
domain-browser@^1.1.1:
version "1.2.0"
resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda"
integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==
dot-prop@^4.2.1:
version "4.2.1"
resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.1.tgz#45884194a71fc2cda71cbb4bceb3a4dd2f433ba4"
integrity sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==
dependencies:
is-obj "^1.0.0"
dotenv@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-5.0.1.tgz#a5317459bd3d79ab88cff6e44057a6a3fbb1fcef"
integrity sha512-4As8uPrjfwb7VXC+WnLCbXK7y+Ueb2B3zgNCePYfhxS1PYeaO1YTeplffTEcbfLhvFNGLAz90VvJs9yomG7bow==
duplexer3@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=
duplexer@^0.1.1:
version "0.1.2"
resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6"
integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==
duplexify@^3.4.2, duplexify@^3.6.0:
version "3.7.1"
resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309"
integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==
dependencies:
end-of-stream "^1.0.0"
inherits "^2.0.1"
readable-stream "^2.0.0"
stream-shift "^1.0.0"
ecc-jsbn@~0.1.1:
version "0.1.2"
resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9"
integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=
dependencies:
jsbn "~0.1.0"
safer-buffer "^2.1.0"
editor@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/editor/-/editor-1.0.0.tgz#60c7f87bd62bcc6a894fa8ccd6afb7823a24f742"
integrity sha1-YMf4e9YrzGqJT6jM1q+3gjok90I=
ee-first@1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
ejs@^2.6.1:
version "2.7.4"
resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba"
integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==
electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.47:
version "1.4.103"
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.103.tgz#abfe376a4d70fa1e1b4b353b95df5d6dfd05da3a"
integrity sha512-c/uKWR1Z/W30Wy/sx3dkZoj4BijbXX85QKWu9jJfjho3LBAXNEGAEW3oWiGb+dotA6C6BzCTxL2/aLes7jlUeg==
elliptic@^6.5.3:
version "6.5.4"
resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb"
integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==
dependencies:
bn.js "^4.11.9"
brorand "^1.1.0"
hash.js "^1.0.0"
hmac-drbg "^1.0.1"
inherits "^2.0.4"
minimalistic-assert "^1.0.1"
minimalistic-crypto-utils "^1.0.1"
emoji-regex@^6.1.0:
version "6.5.1"
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-6.5.1.tgz#9baea929b155565c11ea41c6626eaa65cef992c2"
integrity sha512-PAHp6TxrCy7MGMFidro8uikr+zlJJKJ/Q6mm2ExZ7HwkyR9lSVFfE3kt36qcwa24BQL7y0G9axycGjK1A/0uNQ==
emoji-regex@^7.0.1:
version "7.0.3"
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156"
integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==
emoji-regex@^8.0.0:
version "8.0.0"
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
emojis-list@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389"
integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k=
emojis-list@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78"
integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==
encodeurl@~1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=
encoding@^0.1.11:
version "0.1.13"
resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9"
integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==
dependencies:
iconv-lite "^0.6.2"
end-of-stream@^1.0.0, end-of-stream@^1.1.0:
version "1.4.4"
resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
dependencies:
once "^1.4.0"
enhanced-resolve@^3.3.0:
version "3.4.1"
resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz#0421e339fd71419b3da13d129b3979040230476e"
integrity sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=
dependencies:
graceful-fs "^4.1.2"
memory-fs "^0.4.0"
object-assign "^4.0.1"
tapable "^0.2.7"
entities@~2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/entities/-/entities-2.1.0.tgz#992d3129cf7df6870b96c57858c249a120f8b8b5"
integrity sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==
env-paths@^2.2.0:
version "2.2.1"
resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2"
integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==
err-code@^1.0.0:
version "1.1.2"
resolved "https://registry.yarnpkg.com/err-code/-/err-code-1.1.2.tgz#06e0116d3028f6aef4806849eb0ea6a748ae6960"
integrity sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=
errno@^0.1.3, errno@~0.1.7:
version "0.1.8"
resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f"
integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==
dependencies:
prr "~1.0.1"
error-ex@^1.2.0, error-ex@^1.3.1:
version "1.3.2"
resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
dependencies:
is-arrayish "^0.2.1"
es-abstract@^1.19.0, es-abstract@^1.19.1:
version "1.19.2"
resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.2.tgz#8f7b696d8f15b167ae3640b4060670f3d054143f"
integrity sha512-gfSBJoZdlL2xRiOCy0g8gLMryhoe1TlimjzU99L/31Z8QEGIhVQI+EWwt5lT+AuU9SnorVupXFqqOGqGfsyO6w==
dependencies:
call-bind "^1.0.2"
es-to-primitive "^1.2.1"
function-bind "^1.1.1"
get-intrinsic "^1.1.1"
get-symbol-description "^1.0.0"
has "^1.0.3"
has-symbols "^1.0.3"
internal-slot "^1.0.3"
is-callable "^1.2.4"
is-negative-zero "^2.0.2"
is-regex "^1.1.4"
is-shared-array-buffer "^1.0.1"
is-string "^1.0.7"
is-weakref "^1.0.2"
object-inspect "^1.12.0"
object-keys "^1.1.1"
object.assign "^4.1.2"
string.prototype.trimend "^1.0.4"
string.prototype.trimstart "^1.0.4"
unbox-primitive "^1.0.1"
es-to-primitive@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a"
integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==
dependencies:
is-callable "^1.1.4"
is-date-object "^1.0.1"
is-symbol "^1.0.2"
es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@~0.10.14:
version "0.10.59"
resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.59.tgz#71038939730eb6f4f165f1421308fb60be363bc6"
integrity sha512-cOgyhW0tIJyQY1Kfw6Kr0viu9ZlUctVchRMZ7R0HiH3dxTSp5zJDLecwxUqPUrGKMsgBI1wd1FL+d9Jxfi4cLw==
dependencies:
es6-iterator "^2.0.3"
es6-symbol "^3.1.3"
next-tick "^1.1.0"
es6-iterator@^2.0.3, es6-iterator@~2.0.1:
version "2.0.3"
resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7"
integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c=
dependencies:
d "1"
es5-ext "^0.10.35"
es6-symbol "^3.1.1"
es6-map@^0.1.3:
version "0.1.5"
resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0"
integrity sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=
dependencies:
d "1"
es5-ext "~0.10.14"
es6-iterator "~2.0.1"
es6-set "~0.1.5"
es6-symbol "~3.1.1"
event-emitter "~0.3.5"
es6-promise@^4.0.3:
version "4.2.8"
resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a"
integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==
es6-promisify@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203"
integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=
dependencies:
es6-promise "^4.0.3"
es6-set@~0.1.5:
version "0.1.5"
resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1"
integrity sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=
dependencies:
d "1"
es5-ext "~0.10.14"
es6-iterator "~2.0.1"
es6-symbol "3.1.1"
event-emitter "~0.3.5"
es6-symbol@3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77"
integrity sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=
dependencies:
d "1"
es5-ext "~0.10.14"
es6-symbol@^3.1.1, es6-symbol@^3.1.3, es6-symbol@~3.1.1:
version "3.1.3"
resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18"
integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==
dependencies:
d "^1.0.1"
ext "^1.1.2"
es6-weak-map@^2.0.1:
version "2.0.3"
resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.3.tgz#b6da1f16cc2cc0d9be43e6bdbfc5e7dfcdf31d53"
integrity sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==
dependencies:
d "1"
es5-ext "^0.10.46"
es6-iterator "^2.0.3"
es6-symbol "^3.1.1"
escape-html@~1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=
escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
escope@^3.6.0:
version "3.6.0"
resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3"
integrity sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=
dependencies:
es6-map "^0.1.3"
es6-weak-map "^2.0.1"
esrecurse "^4.1.0"
estraverse "^4.1.1"
eslint-config-airbnb-base@^11.3.0:
version "11.3.2"
resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-11.3.2.tgz#8703b11abe3c88ac7ec2b745b7fdf52e00ae680a"
integrity sha512-/fhjt/VqzBA2SRsx7ErDtv6Ayf+XLw9LIOqmpBuHFCVwyJo2EtzGWMB9fYRFBoWWQLxmNmCpenNiH0RxyeS41w==
dependencies:
eslint-restricted-globals "^0.1.1"
eslint-config-airbnb-base@^12.0.0:
version "12.1.0"
resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-12.1.0.tgz#386441e54a12ccd957b0a92564a4bafebd747944"
integrity sha512-/vjm0Px5ZCpmJqnjIzcFb9TKZrKWz0gnuG/7Gfkt0Db1ELJR51xkZth+t14rYdqWgX836XbuxtArbIHlVhbLBA==
dependencies:
eslint-restricted-globals "^0.1.1"
eslint-config-airbnb@^15.1.0:
version "15.1.0"
resolved "https://registry.yarnpkg.com/eslint-config-airbnb/-/eslint-config-airbnb-15.1.0.tgz#fd432965a906e30139001ba830f58f73aeddae8e"
integrity sha512-m0q9fiMBzDAIbirlGnpJNWToIhdhJmXXnMG+IFflYzzod9231ZhtmGKegKg8E9T8F1YuVaDSU1FnCm5b9iXVhQ==
dependencies:
eslint-config-airbnb-base "^11.3.0"
eslint-import-resolver-node@^0.3.6:
version "0.3.6"
resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd"
integrity sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==
dependencies:
debug "^3.2.7"
resolve "^1.20.0"
eslint-loader@^1.7.1:
version "1.9.0"
resolved "https://registry.yarnpkg.com/eslint-loader/-/eslint-loader-1.9.0.tgz#7e1be9feddca328d3dcfaef1ad49d5beffe83a13"
integrity sha512-40aN976qSNPyb9ejTqjEthZITpls1SVKtwguahmH1dzGCwQU/vySE+xX33VZmD8csU0ahVNCtFlsPgKqRBiqgg==
dependencies:
loader-fs-cache "^1.0.0"
loader-utils "^1.0.2"
object-assign "^4.0.1"
object-hash "^1.1.4"
rimraf "^2.6.1"
eslint-module-utils@^2.7.2:
version "2.7.3"
resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz#ad7e3a10552fdd0642e1e55292781bd6e34876ee"
integrity sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==
dependencies:
debug "^3.2.7"
find-up "^2.1.0"
eslint-plugin-import@^2.7.0:
version "2.25.4"
resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.25.4.tgz#322f3f916a4e9e991ac7af32032c25ce313209f1"
integrity sha512-/KJBASVFxpu0xg1kIBn9AUa8hQVnszpwgE7Ld0lKAlx7Ie87yzEzCgSkekt+le/YVhiaosO4Y14GDAOc41nfxA==
dependencies:
array-includes "^3.1.4"
array.prototype.flat "^1.2.5"
debug "^2.6.9"
doctrine "^2.1.0"
eslint-import-resolver-node "^0.3.6"
eslint-module-utils "^2.7.2"
has "^1.0.3"
is-core-module "^2.8.0"
is-glob "^4.0.3"
minimatch "^3.0.4"
object.values "^1.1.5"
resolve "^1.20.0"
tsconfig-paths "^3.12.0"
eslint-plugin-jsx-a11y@^5.1.1:
version "5.1.1"
resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-5.1.1.tgz#5c96bb5186ca14e94db1095ff59b3e2bd94069b1"
integrity sha512-5I9SpoP7gT4wBFOtXT8/tXNPYohHBVfyVfO17vkbC7r9kEIxYJF12D3pKqhk8+xnk12rfxKClS3WCFpVckFTPQ==
dependencies:
aria-query "^0.7.0"
array-includes "^3.0.3"
ast-types-flow "0.0.7"
axobject-query "^0.1.0"
damerau-levenshtein "^1.0.0"
emoji-regex "^6.1.0"
jsx-ast-utils "^1.4.0"
eslint-plugin-react@^7.3.0:
version "7.29.4"
resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.29.4.tgz#4717de5227f55f3801a5fd51a16a4fa22b5914d2"
integrity sha512-CVCXajliVh509PcZYRFyu/BoUEz452+jtQJq2b3Bae4v3xBUWPLCmtmBM+ZinG4MzwmxJgJ2M5rMqhqLVn7MtQ==
dependencies:
array-includes "^3.1.4"
array.prototype.flatmap "^1.2.5"
doctrine "^2.1.0"
estraverse "^5.3.0"
jsx-ast-utils "^2.4.1 || ^3.0.0"
minimatch "^3.1.2"
object.entries "^1.1.5"
object.fromentries "^2.0.5"
object.hasown "^1.1.0"
object.values "^1.1.5"
prop-types "^15.8.1"
resolve "^2.0.0-next.3"
semver "^6.3.0"
string.prototype.matchall "^4.0.6"
eslint-restricted-globals@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/eslint-restricted-globals/-/eslint-restricted-globals-0.1.1.tgz#35f0d5cbc64c2e3ed62e93b4b1a7af05ba7ed4d7"
integrity sha1-NfDVy8ZMLj7WLpO0saevBbp+1Nc=
eslint-scope@^3.7.1:
version "3.7.3"
resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.3.tgz#bb507200d3d17f60247636160b4826284b108535"
integrity sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA==
dependencies:
esrecurse "^4.1.0"
estraverse "^4.1.1"
eslint-visitor-keys@^1.0.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e"
integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==
eslint@^2.7.0:
version "2.13.1"
resolved "https://registry.yarnpkg.com/eslint/-/eslint-2.13.1.tgz#e4cc8fa0f009fb829aaae23855a29360be1f6c11"
integrity sha1-5MyPoPAJ+4KaquI4VaKTYL4fbBE=
dependencies:
chalk "^1.1.3"
concat-stream "^1.4.6"
debug "^2.1.1"
doctrine "^1.2.2"
es6-map "^0.1.3"
escope "^3.6.0"
espree "^3.1.6"
estraverse "^4.2.0"
esutils "^2.0.2"
file-entry-cache "^1.1.1"
glob "^7.0.3"
globals "^9.2.0"
ignore "^3.1.2"
imurmurhash "^0.1.4"
inquirer "^0.12.0"
is-my-json-valid "^2.10.0"
is-resolvable "^1.0.0"
js-yaml "^3.5.1"
json-stable-stringify "^1.0.0"
levn "^0.3.0"
lodash "^4.0.0"
mkdirp "^0.5.0"
optionator "^0.8.1"
path-is-absolute "^1.0.0"
path-is-inside "^1.0.1"
pluralize "^1.2.1"
progress "^1.1.8"
require-uncached "^1.0.2"
shelljs "^0.6.0"
strip-json-comments "~1.0.1"
table "^3.7.8"
text-table "~0.2.0"
user-home "^2.0.0"
eslint@^4.6.1:
version "4.19.1"
resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.19.1.tgz#32d1d653e1d90408854bfb296f076ec7e186a300"
integrity sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==
dependencies:
ajv "^5.3.0"
babel-code-frame "^6.22.0"
chalk "^2.1.0"
concat-stream "^1.6.0"
cross-spawn "^5.1.0"
debug "^3.1.0"
doctrine "^2.1.0"
eslint-scope "^3.7.1"
eslint-visitor-keys "^1.0.0"
espree "^3.5.4"
esquery "^1.0.0"
esutils "^2.0.2"
file-entry-cache "^2.0.0"
functional-red-black-tree "^1.0.1"
glob "^7.1.2"
globals "^11.0.1"
ignore "^3.3.3"
imurmurhash "^0.1.4"
inquirer "^3.0.6"
is-resolvable "^1.0.0"
js-yaml "^3.9.1"
json-stable-stringify-without-jsonify "^1.0.1"
levn "^0.3.0"
lodash "^4.17.4"
minimatch "^3.0.2"
mkdirp "^0.5.1"
natural-compare "^1.4.0"
optionator "^0.8.2"
path-is-inside "^1.0.2"
pluralize "^7.0.0"
progress "^2.0.0"
regexpp "^1.0.1"
require-uncached "^1.0.3"
semver "^5.3.0"
strip-ansi "^4.0.0"
strip-json-comments "~2.0.1"
table "4.0.2"
text-table "~0.2.0"
espree@^3.1.6, espree@^3.5.4:
version "3.5.4"
resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7"
integrity sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==
dependencies:
acorn "^5.5.0"
acorn-jsx "^3.0.0"
esprima@^2.6.0:
version "2.7.3"
resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581"
integrity sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=
esprima@^4.0.0:
version "4.0.1"
resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
esquery@^1.0.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5"
integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==
dependencies:
estraverse "^5.1.0"
esrecurse@^4.1.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921"
integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==
dependencies:
estraverse "^5.2.0"
estraverse@^4.1.1, estraverse@^4.2.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d"
integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0:
version "5.3.0"
resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123"
integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
esutils@^2.0.2:
version "2.0.3"
resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
etag@~1.8.1:
version "1.8.1"
resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
event-emitter@~0.3.5:
version "0.3.5"
resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39"
integrity sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=
dependencies:
d "1"
es5-ext "~0.10.14"
events@^3.0.0:
version "3.3.0"
resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400"
integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02"
integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==
dependencies:
md5.js "^1.3.4"
safe-buffer "^5.1.1"
execa@^0.7.0:
version "0.7.0"
resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777"
integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=
dependencies:
cross-spawn "^5.0.1"
get-stream "^3.0.0"
is-stream "^1.1.0"
npm-run-path "^2.0.0"
p-finally "^1.0.0"
signal-exit "^3.0.0"
strip-eof "^1.0.0"
exit-hook@^1.0.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8"
integrity sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=
expand-brackets@^2.1.4:
version "2.1.4"
resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI=
dependencies:
debug "^2.3.3"
define-property "^0.2.5"
extend-shallow "^2.0.1"
posix-character-classes "^0.1.0"
regex-not "^1.0.0"
snapdragon "^0.8.1"
to-regex "^3.0.1"
expose-loader@^0.7.3:
version "0.7.5"
resolved "https://registry.yarnpkg.com/expose-loader/-/expose-loader-0.7.5.tgz#e29ea2d9aeeed3254a3faa1b35f502db9f9c3f6f"
integrity sha512-iPowgKUZkTPX5PznYsmifVj9Bob0w2wTHVkt/eYNPSzyebkUgIedmskf/kcfEIWpiWjg3JRjnW+a17XypySMuw==
express@^4.16.3:
version "4.17.3"
resolved "https://registry.yarnpkg.com/express/-/express-4.17.3.tgz#f6c7302194a4fb54271b73a1fe7a06478c8f85a1"
integrity sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==
dependencies:
accepts "~1.3.8"
array-flatten "1.1.1"
body-parser "1.19.2"
content-disposition "0.5.4"
content-type "~1.0.4"
cookie "0.4.2"
cookie-signature "1.0.6"
debug "2.6.9"
depd "~1.1.2"
encodeurl "~1.0.2"
escape-html "~1.0.3"
etag "~1.8.1"
finalhandler "~1.1.2"
fresh "0.5.2"
merge-descriptors "1.0.1"
methods "~1.1.2"
on-finished "~2.3.0"
parseurl "~1.3.3"
path-to-regexp "0.1.7"
proxy-addr "~2.0.7"
qs "6.9.7"
range-parser "~1.2.1"
safe-buffer "5.2.1"
send "0.17.2"
serve-static "1.14.2"
setprototypeof "1.2.0"
statuses "~1.5.0"
type-is "~1.6.18"
utils-merge "1.0.1"
vary "~1.1.2"
ext@^1.1.2:
version "1.6.0"
resolved "https://registry.yarnpkg.com/ext/-/ext-1.6.0.tgz#3871d50641e874cc172e2b53f919842d19db4c52"
integrity sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==
dependencies:
type "^2.5.0"
extend-shallow@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=
dependencies:
is-extendable "^0.1.0"
extend-shallow@^3.0.0, extend-shallow@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8"
integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=
dependencies:
assign-symbols "^1.0.0"
is-extendable "^1.0.1"
extend@~3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
external-editor@^2.0.4:
version "2.2.0"
resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5"
integrity sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==
dependencies:
chardet "^0.4.0"
iconv-lite "^0.4.17"
tmp "^0.0.33"
extglob@^2.0.4:
version "2.0.4"
resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543"
integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==
dependencies:
array-unique "^0.3.2"
define-property "^1.0.0"
expand-brackets "^2.1.4"
extend-shallow "^2.0.1"
fragment-cache "^0.2.1"
regex-not "^1.0.0"
snapdragon "^0.8.1"
to-regex "^3.0.1"
extract-text-webpack-plugin@^2.1.0:
version "2.1.2"
resolved "https://registry.yarnpkg.com/extract-text-webpack-plugin/-/extract-text-webpack-plugin-2.1.2.tgz#756ef4efa8155c3681833fbc34da53b941746d6c"
integrity sha1-dW7076gVXDaBgz+8NNpTuUF0bWw=
dependencies:
async "^2.1.2"
loader-utils "^1.0.2"
schema-utils "^0.3.0"
webpack-sources "^1.0.1"
extsprintf@1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=
extsprintf@^1.2.0:
version "1.4.1"
resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07"
integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==
fast-deep-equal@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614"
integrity sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=
fast-deep-equal@^3.1.1:
version "3.1.3"
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
fast-json-stable-stringify@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
fast-levenshtein@~2.0.6:
version "2.0.6"
resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=
fastparse@^1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9"
integrity sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==
figgy-pudding@^3.4.1, figgy-pudding@^3.5.1:
version "3.5.2"
resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e"
integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==
figures@^1.3.5:
version "1.7.0"
resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e"
integrity sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=
dependencies:
escape-string-regexp "^1.0.5"
object-assign "^4.1.0"
figures@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962"
integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=
dependencies:
escape-string-regexp "^1.0.5"
file-entry-cache@^1.1.1:
version "1.3.1"
resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-1.3.1.tgz#44c61ea607ae4be9c1402f41f44270cbfe334ff8"
integrity sha1-RMYepgeuS+nBQC9B9EJwy/4zT/g=
dependencies:
flat-cache "^1.2.1"
object-assign "^4.0.1"
file-entry-cache@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361"
integrity sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=
dependencies:
flat-cache "^1.2.1"
object-assign "^4.0.1"
file-loader@^0.11.1:
version "0.11.2"
resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-0.11.2.tgz#4ff1df28af38719a6098093b88c82c71d1794a34"
integrity sha512-N+uhF3mswIFeziHQjGScJ/yHXYt3DiLBeC+9vWW+WjUBiClMSOlV1YrXQi+7KM2aA3Rn4Bybgv+uXFQbfkzpvg==
dependencies:
loader-utils "^1.0.2"
file-uri-to-path@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd"
integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==
file@^0.2.2:
version "0.2.2"
resolved "https://registry.yarnpkg.com/file/-/file-0.2.2.tgz#c3dfd8f8cf3535ae455c2b423c2e52635d76b4d3"
integrity sha1-w9/Y+M81Na5FXCtCPC5SY112tNM=
filesize@^3.6.1:
version "3.6.1"
resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317"
integrity sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==
fill-range@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=
dependencies:
extend-shallow "^2.0.1"
is-number "^3.0.0"
repeat-string "^1.6.1"
to-regex-range "^2.1.0"
fill-range@^7.0.1:
version "7.0.1"
resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
dependencies:
to-regex-range "^5.0.1"
filter-obj@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-1.1.0.tgz#9b311112bc6c6127a16e016c6c5d7f19e0805c5b"
integrity sha1-mzERErxsYSehbgFsbF1/GeCAXFs=
finalhandler@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d"
integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==
dependencies:
debug "2.6.9"
encodeurl "~1.0.2"
escape-html "~1.0.3"
on-finished "~2.3.0"
parseurl "~1.3.3"
statuses "~1.5.0"
unpipe "~1.0.0"
find-cache-dir@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9"
integrity sha1-yN765XyKUqinhPnjHFfHQumToLk=
dependencies:
commondir "^1.0.1"
mkdirp "^0.5.1"
pkg-dir "^1.0.0"
find-cache-dir@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f"
integrity sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=
dependencies:
commondir "^1.0.1"
make-dir "^1.0.0"
pkg-dir "^2.0.0"
find-npm-prefix@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/find-npm-prefix/-/find-npm-prefix-1.0.2.tgz#8d8ce2c78b3b4b9e66c8acc6a37c231eb841cfdf"
integrity sha512-KEftzJ+H90x6pcKtdXZEPsQse8/y/UnvzRKrOSQFprnrGaFuJ62fVkP34Iu2IYuMvyauCyoLTNkJZgrrGA2wkA==
find-up@^1.0.0:
version "1.1.2"
resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=
dependencies:
path-exists "^2.0.0"
pinkie-promise "^2.0.0"
find-up@^2.0.0, find-up@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c=
dependencies:
locate-path "^2.0.0"
find-up@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73"
integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==
dependencies:
locate-path "^3.0.0"
find-up@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19"
integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==
dependencies:
locate-path "^5.0.0"
path-exists "^4.0.0"
flat-cache@^1.2.1:
version "1.3.4"
resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.4.tgz#2c2ef77525cc2929007dfffa1dd314aa9c9dee6f"
integrity sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==
dependencies:
circular-json "^0.3.1"
graceful-fs "^4.1.2"
rimraf "~2.6.2"
write "^0.2.1"
flatten@^1.0.2:
version "1.0.3"
resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b"
integrity sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==
flush-write-stream@^1.0.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8"
integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==
dependencies:
inherits "^2.0.3"
readable-stream "^2.3.6"
for-in@^0.1.3:
version "0.1.8"
resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1"
integrity sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=
for-in@^1.0.1, for-in@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=
for-own@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b"
integrity sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=
dependencies:
for-in "^1.0.1"
forever-agent@~0.6.1:
version "0.6.1"
resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=
form-data@~2.3.2:
version "2.3.3"
resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6"
integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==
dependencies:
asynckit "^0.4.0"
combined-stream "^1.0.6"
mime-types "^2.1.12"
forwarded@0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811"
integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==
fragment-cache@^0.2.1:
version "0.2.1"
resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=
dependencies:
map-cache "^0.2.2"
fresh@0.5.2:
version "0.5.2"
resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=
from2@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/from2/-/from2-1.3.0.tgz#88413baaa5f9a597cfde9221d86986cd3c061dfd"
integrity sha1-iEE7qqX5pZfP3pIh2GmGzTwGHf0=
dependencies:
inherits "~2.0.1"
readable-stream "~1.1.10"
from2@^2.1.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af"
integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=
dependencies:
inherits "^2.0.1"
readable-stream "^2.0.0"
front-matter@2.1.2:
version "2.1.2"
resolved "https://registry.yarnpkg.com/front-matter/-/front-matter-2.1.2.tgz#f75983b9f2f413be658c93dfd7bd8ce4078f5cdb"
integrity sha1-91mDufL0E75ljJPf172M5AePXNs=
dependencies:
js-yaml "^3.4.6"
fs-extra@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-3.0.1.tgz#3794f378c58b342ea7dbbb23095109c4b3b62291"
integrity sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=
dependencies:
graceful-fs "^4.1.2"
jsonfile "^3.0.0"
universalify "^0.1.0"
fs-minipass@^1.2.7:
version "1.2.7"
resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7"
integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==
dependencies:
minipass "^2.6.0"
fs-vacuum@^1.2.10, fs-vacuum@~1.2.10:
version "1.2.10"
resolved "https://registry.yarnpkg.com/fs-vacuum/-/fs-vacuum-1.2.10.tgz#b7629bec07a4031a2548fdf99f5ecf1cc8b31e36"
integrity sha1-t2Kb7AekAxolSP35n17PHMizHjY=
dependencies:
graceful-fs "^4.1.2"
path-is-inside "^1.0.1"
rimraf "^2.5.2"
fs-write-stream-atomic@^1.0.8, fs-write-stream-atomic@~1.0.10:
version "1.0.10"
resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9"
integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=
dependencies:
graceful-fs "^4.1.2"
iferr "^0.1.5"
imurmurhash "^0.1.4"
readable-stream "1 || 2"
fs.realpath@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
fsevents@^1.2.7:
version "1.2.13"
resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38"
integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==
dependencies:
bindings "^1.5.0"
nan "^2.12.1"
fsevents@~2.3.2:
version "2.3.2"
resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
fstream@^1.0.0, fstream@^1.0.12:
version "1.0.12"
resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045"
integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==
dependencies:
graceful-fs "^4.1.2"
inherits "~2.0.0"
mkdirp ">=0.5 0"
rimraf "2"
function-bind@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
functional-red-black-tree@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=
gauge@~2.7.3:
version "2.7.4"
resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=
dependencies:
aproba "^1.0.3"
console-control-strings "^1.0.0"
has-unicode "^2.0.0"
object-assign "^4.1.0"
signal-exit "^3.0.0"
string-width "^1.0.1"
strip-ansi "^3.0.1"
wide-align "^1.1.0"
gaze@^1.0.0:
version "1.1.3"
resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a"
integrity sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==
dependencies:
globule "^1.0.0"
generate-function@^2.0.0:
version "2.3.1"
resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.3.1.tgz#f069617690c10c868e73b8465746764f97c3479f"
integrity sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==
dependencies:
is-property "^1.0.2"
generate-object-property@^1.1.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0"
integrity sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=
dependencies:
is-property "^1.0.0"
genfun@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/genfun/-/genfun-5.0.0.tgz#9dd9710a06900a5c4a5bf57aca5da4e52fe76537"
integrity sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==
gentle-fs@^2.3.0, gentle-fs@^2.3.1:
version "2.3.1"
resolved "https://registry.yarnpkg.com/gentle-fs/-/gentle-fs-2.3.1.tgz#11201bf66c18f930ddca72cf69460bdfa05727b1"
integrity sha512-OlwBBwqCFPcjm33rF2BjW+Pr6/ll2741l+xooiwTCeaX2CA1ZuclavyMBe0/KlR21/XGsgY6hzEQZ15BdNa13Q==
dependencies:
aproba "^1.1.2"
chownr "^1.1.2"
cmd-shim "^3.0.3"
fs-vacuum "^1.2.10"
graceful-fs "^4.1.11"
iferr "^0.1.5"
infer-owner "^1.0.4"
mkdirp "^0.5.1"
path-is-inside "^1.0.2"
read-cmd-shim "^1.0.1"
slide "^1.1.6"
get-caller-file@^1.0.1:
version "1.0.3"
resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a"
integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==
get-caller-file@^2.0.1:
version "2.0.5"
resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6"
integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==
dependencies:
function-bind "^1.1.1"
has "^1.0.3"
has-symbols "^1.0.1"
get-stdin@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe"
integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=
get-stream@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=
get-stream@^4.0.0, get-stream@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5"
integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==
dependencies:
pump "^3.0.0"
get-symbol-description@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6"
integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==
dependencies:
call-bind "^1.0.2"
get-intrinsic "^1.1.1"
get-value@^2.0.3, get-value@^2.0.6:
version "2.0.6"
resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=
getpass@^0.1.1:
version "0.1.7"
resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=
dependencies:
assert-plus "^1.0.0"
glob-parent@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae"
integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=
dependencies:
is-glob "^3.1.0"
path-dirname "^1.0.0"
glob-parent@~5.1.2:
version "5.1.2"
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
dependencies:
is-glob "^4.0.1"
glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6:
version "7.2.0"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023"
integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==
dependencies:
fs.realpath "^1.0.0"
inflight "^1.0.4"
inherits "2"
minimatch "^3.0.4"
once "^1.3.0"
path-is-absolute "^1.0.0"
glob@~7.1.1:
version "7.1.7"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90"
integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==
dependencies:
fs.realpath "^1.0.0"
inflight "^1.0.4"
inherits "2"
minimatch "^3.0.4"
once "^1.3.0"
path-is-absolute "^1.0.0"
global-dirs@^0.1.0:
version "0.1.1"
resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445"
integrity sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=
dependencies:
ini "^1.3.4"
globals@^11.0.1:
version "11.12.0"
resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
globals@^9.18.0, globals@^9.2.0:
version "9.18.0"
resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a"
integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==
globule@^1.0.0:
version "1.3.3"
resolved "https://registry.yarnpkg.com/globule/-/globule-1.3.3.tgz#811919eeac1ab7344e905f2e3be80a13447973c2"
integrity sha512-mb1aYtDbIjTu4ShMB85m3UzjX9BVKe9WCzsnfMSZk+K5GpIbBOexgg4PPCt5eHDEG5/ZQAUX2Kct02zfiPLsKg==
dependencies:
glob "~7.1.1"
lodash "~4.17.10"
minimatch "~3.0.2"
gonzales-pe-sl@^4.2.3:
version "4.2.3"
resolved "https://registry.yarnpkg.com/gonzales-pe-sl/-/gonzales-pe-sl-4.2.3.tgz#6a868bc380645f141feeb042c6f97fcc71b59fe6"
integrity sha1-aoaLw4BkXxQf7rBCxvl/zHG1n+Y=
dependencies:
minimist "1.1.x"
got@^6.7.1:
version "6.7.1"
resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0"
integrity sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=
dependencies:
create-error-class "^3.0.0"
duplexer3 "^0.1.4"
get-stream "^3.0.0"
is-redirect "^1.0.0"
is-retry-allowed "^1.0.0"
is-stream "^1.0.0"
lowercase-keys "^1.0.0"
safe-buffer "^5.0.1"
timed-out "^4.0.0"
unzip-response "^2.0.1"
url-parse-lax "^1.0.0"
graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.2, graceful-fs@^4.2.4:
version "4.2.9"
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96"
integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==
gzip-size@^5.0.0:
version "5.1.1"
resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.1.1.tgz#cb9bee692f87c0612b232840a873904e4c135274"
integrity sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==
dependencies:
duplexer "^0.1.1"
pify "^4.0.1"
har-schema@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92"
integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=
har-validator@~5.1.3:
version "5.1.5"
resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd"
integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==
dependencies:
ajv "^6.12.3"
har-schema "^2.0.0"
has-ansi@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=
dependencies:
ansi-regex "^2.0.0"
has-bigints@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113"
integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==
has-flag@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa"
integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=
has-flag@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8"
integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==
has-tostringtag@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25"
integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==
dependencies:
has-symbols "^1.0.2"
has-unicode@^2.0.0, has-unicode@~2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=
has-value@^0.3.1:
version "0.3.1"
resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f"
integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=
dependencies:
get-value "^2.0.3"
has-values "^0.1.4"
isobject "^2.0.0"
has-value@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177"
integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=
dependencies:
get-value "^2.0.6"
has-values "^1.0.0"
isobject "^3.0.0"
has-values@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771"
integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E=
has-values@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f"
integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=
dependencies:
is-number "^3.0.0"
kind-of "^4.0.0"
has@^1.0.1, has@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
dependencies:
function-bind "^1.1.1"
hash-base@^3.0.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33"
integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==
dependencies:
inherits "^2.0.4"
readable-stream "^3.6.0"
safe-buffer "^5.2.0"
hash.js@^1.0.0, hash.js@^1.0.3:
version "1.1.7"
resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42"
integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==
dependencies:
inherits "^2.0.3"
minimalistic-assert "^1.0.1"
hmac-drbg@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=
dependencies:
hash.js "^1.0.3"
minimalistic-assert "^1.0.0"
minimalistic-crypto-utils "^1.0.1"
home-or-tmp@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8"
integrity sha1-42w/LSyufXRqhX440Y1fMqeILbg=
dependencies:
os-homedir "^1.0.0"
os-tmpdir "^1.0.1"
hoopy@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d"
integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==
hosted-git-info@^2.1.4, hosted-git-info@^2.7.1, hosted-git-info@^2.8.9:
version "2.8.9"
resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9"
integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==
html-comment-regex@^1.1.0:
version "1.1.2"
resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7"
integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==
http-cache-semantics@^3.8.1:
version "3.8.1"
resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2"
integrity sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==
http-errors@1.8.1:
version "1.8.1"
resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c"
integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==
dependencies:
depd "~1.1.2"
inherits "2.0.4"
setprototypeof "1.2.0"
statuses ">= 1.5.0 < 2"
toidentifier "1.0.1"
http-proxy-agent@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405"
integrity sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==
dependencies:
agent-base "4"
debug "3.1.0"
http-signature@~1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=
dependencies:
assert-plus "^1.0.0"
jsprim "^1.2.2"
sshpk "^1.7.0"
https-browserify@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"
integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=
https-proxy-agent@^2.2.3:
version "2.2.4"
resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz#4ee7a737abd92678a293d9b34a1af4d0d08c787b"
integrity sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==
dependencies:
agent-base "^4.3.0"
debug "^3.1.0"
humanize-ms@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed"
integrity sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=
dependencies:
ms "^2.0.0"
iconv-lite@0.4.24, iconv-lite@^0.4.17:
version "0.4.24"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
dependencies:
safer-buffer ">= 2.1.2 < 3"
iconv-lite@^0.6.2:
version "0.6.3"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501"
integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==
dependencies:
safer-buffer ">= 2.1.2 < 3.0.0"
icss-replace-symbols@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded"
integrity sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=
icss-utils@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-2.1.0.tgz#83f0a0ec378bf3246178b6c2ad9136f135b1c962"
integrity sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=
dependencies:
postcss "^6.0.1"
ieee754@^1.1.4:
version "1.2.1"
resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
iferr@^0.1.5:
version "0.1.5"
resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501"
integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE=
iferr@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/iferr/-/iferr-1.0.2.tgz#e9fde49a9da06dc4a4194c6c9ed6d08305037a6d"
integrity sha512-9AfeLfji44r5TKInjhz3W9DyZI1zR1JAf2hVBMGhddAKPqBsupb89jGfbCTHIGZd6fGZl9WlHdn4AObygyMKwg==
ignore-walk@^3.0.1:
version "3.0.4"
resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.4.tgz#c9a09f69b7c7b479a5d74ac1a3c0d4236d2a6335"
integrity sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==
dependencies:
minimatch "^3.0.4"
ignore@^3.1.2, ignore@^3.3.3:
version "3.3.10"
resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043"
integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==
import-cwd@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9"
integrity sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=
dependencies:
import-from "^2.1.0"
import-fresh@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546"
integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY=
dependencies:
caller-path "^2.0.0"
resolve-from "^3.0.0"
import-from@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1"
integrity sha1-M1238qev/VOqpHHUuAId7ja387E=
dependencies:
resolve-from "^3.0.0"
import-lazy@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43"
integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=
imports-loader@^0.6.5:
version "0.6.5"
resolved "https://registry.yarnpkg.com/imports-loader/-/imports-loader-0.6.5.tgz#ae74653031d59e37b3c2fb2544ac61aeae3530a6"
integrity sha1-rnRlMDHVnjezwvslRKxhrq41MKY=
dependencies:
loader-utils "0.2.x"
source-map "0.1.x"
imurmurhash@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
integrity sha1-khi5srkoojixPcT7a21XbyMUU+o=
in-publish@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.1.tgz#948b1a535c8030561cea522f73f78f4be357e00c"
integrity sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ==
indent-string@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80"
integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=
dependencies:
repeating "^2.0.0"
indexes-of@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607"
integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc=
infer-owner@^1.0.3, infer-owner@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467"
integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==
inflight@^1.0.4, inflight@~1.0.6:
version "1.0.6"
resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
dependencies:
once "^1.3.0"
wrappy "1"
inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3:
version "2.0.4"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
inherits@2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1"
integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=
inherits@2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
ini@^1.3.4, ini@^1.3.5, ini@^1.3.8, ini@~1.3.0:
version "1.3.8"
resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c"
integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==
init-package-json@^1.10.3:
version "1.10.3"
resolved "https://registry.yarnpkg.com/init-package-json/-/init-package-json-1.10.3.tgz#45ffe2f610a8ca134f2bd1db5637b235070f6cbe"
integrity sha512-zKSiXKhQveNteyhcj1CoOP8tqp1QuxPIPBl8Bid99DGLFqA1p87M6lNgfjJHSBoWJJlidGOv5rWjyYKEB3g2Jw==
dependencies:
glob "^7.1.1"
npm-package-arg "^4.0.0 || ^5.0.0 || ^6.0.0"
promzard "^0.3.0"
read "~1.0.1"
read-package-json "1 || 2"
semver "2.x || 3.x || 4 || 5"
validate-npm-package-license "^3.0.1"
validate-npm-package-name "^3.0.0"
inquirer@^0.12.0:
version "0.12.0"
resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.12.0.tgz#1ef2bfd63504df0bc75785fff8c2c41df12f077e"
integrity sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=
dependencies:
ansi-escapes "^1.1.0"
ansi-regex "^2.0.0"
chalk "^1.0.0"
cli-cursor "^1.0.1"
cli-width "^2.0.0"
figures "^1.3.5"
lodash "^4.3.0"
readline2 "^1.0.1"
run-async "^0.1.0"
rx-lite "^3.1.2"
string-width "^1.0.1"
strip-ansi "^3.0.0"
through "^2.3.6"
inquirer@^3.0.6:
version "3.3.0"
resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9"
integrity sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==
dependencies:
ansi-escapes "^3.0.0"
chalk "^2.0.0"
cli-cursor "^2.1.0"
cli-width "^2.0.0"
external-editor "^2.0.4"
figures "^2.0.0"
lodash "^4.3.0"
mute-stream "0.0.7"
run-async "^2.2.0"
rx-lite "^4.0.8"
rx-lite-aggregates "^4.0.8"
string-width "^2.1.0"
strip-ansi "^4.0.0"
through "^2.3.6"
internal-slot@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c"
integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==
dependencies:
get-intrinsic "^1.1.0"
has "^1.0.3"
side-channel "^1.0.4"
interpret@^1.0.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e"
integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==
invariant@^2.2.2:
version "2.2.4"
resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==
dependencies:
loose-envify "^1.0.0"
invert-kv@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY=
ip-regex@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9"
integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=
ip@1.1.5:
version "1.1.5"
resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a"
integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=
ipaddr.js@1.9.1:
version "1.9.1"
resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3"
integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==
is-absolute-url@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6"
integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=
is-accessor-descriptor@^0.1.6:
version "0.1.6"
resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=
dependencies:
kind-of "^3.0.2"
is-accessor-descriptor@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656"
integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==
dependencies:
kind-of "^6.0.0"
is-arrayish@^0.2.1:
version "0.2.1"
resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=
is-bigint@^1.0.1:
version "1.0.4"
resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3"
integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==
dependencies:
has-bigints "^1.0.1"
is-binary-path@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=
dependencies:
binary-extensions "^1.0.0"
is-binary-path@~2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
dependencies:
binary-extensions "^2.0.0"
is-boolean-object@^1.1.0:
version "1.1.2"
resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719"
integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==
dependencies:
call-bind "^1.0.2"
has-tostringtag "^1.0.0"
is-buffer@^1.1.5:
version "1.1.6"
resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
is-callable@^1.1.4, is-callable@^1.2.4:
version "1.2.4"
resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945"
integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==
is-ci@^1.0.10:
version "1.2.1"
resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c"
integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==
dependencies:
ci-info "^1.5.0"
is-cidr@^3.0.0:
version "3.1.1"
resolved "https://registry.yarnpkg.com/is-cidr/-/is-cidr-3.1.1.tgz#e92ef121bdec2782271a77ce487a8b8df3718ab7"
integrity sha512-Gx+oErgq1j2jAKCR2Kbq0b3wbH0vQKqZ0wOlHxm0o56nq51Cs/DZA8oz9dMDhbHyHEGgJ86eTeVudtgMMOx3Mw==
dependencies:
cidr-regex "^2.0.10"
is-core-module@^2.2.0, is-core-module@^2.8.0, is-core-module@^2.8.1:
version "2.8.1"
resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211"
integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==
dependencies:
has "^1.0.3"
is-data-descriptor@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=
dependencies:
kind-of "^3.0.2"
is-data-descriptor@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7"
integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==
dependencies:
kind-of "^6.0.0"
is-date-object@^1.0.1:
version "1.0.5"
resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f"
integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==
dependencies:
has-tostringtag "^1.0.0"
is-descriptor@^0.1.0:
version "0.1.6"
resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca"
integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==
dependencies:
is-accessor-descriptor "^0.1.6"
is-data-descriptor "^0.1.4"
kind-of "^5.0.0"
is-descriptor@^1.0.0, is-descriptor@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec"
integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==
dependencies:
is-accessor-descriptor "^1.0.0"
is-data-descriptor "^1.0.0"
kind-of "^6.0.2"
is-directory@^0.3.1:
version "0.3.1"
resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1"
integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=
is-extendable@^0.1.0, is-extendable@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=
is-extendable@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4"
integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==
dependencies:
is-plain-object "^2.0.4"
is-extglob@^2.1.0, is-extglob@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
is-finite@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3"
integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==
is-fullwidth-code-point@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs=
dependencies:
number-is-nan "^1.0.0"
is-fullwidth-code-point@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=
is-fullwidth-code-point@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
is-glob@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a"
integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=
dependencies:
is-extglob "^2.1.0"
is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1:
version "4.0.3"
resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
dependencies:
is-extglob "^2.1.1"
is-installed-globally@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80"
integrity sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=
dependencies:
global-dirs "^0.1.0"
is-path-inside "^1.0.0"
is-my-ip-valid@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/is-my-ip-valid/-/is-my-ip-valid-1.0.1.tgz#f7220d1146257c98672e6fba097a9f3f2d348442"
integrity sha512-jxc8cBcOWbNK2i2aTkCZP6i7wkHF1bqKFrwEHuN5Jtg5BSaZHUZQ/JTOJwoV41YvHnOaRyWWh72T/KvfNz9DJg==
is-my-json-valid@^2.10.0:
version "2.20.6"
resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.20.6.tgz#a9d89e56a36493c77bda1440d69ae0dc46a08387"
integrity sha512-1JQwulVNjx8UqkPE/bqDaxtH4PXCe/2VRh/y3p99heOV87HG4Id5/VfDswd+YiAfHcRTfDlWgISycnHuhZq1aw==
dependencies:
generate-function "^2.0.0"
generate-object-property "^1.1.0"
is-my-ip-valid "^1.0.0"
jsonpointer "^5.0.0"
xtend "^4.0.0"
is-negative-zero@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150"
integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==
is-npm@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4"
integrity sha1-8vtjpl5JBbQGyGBydloaTceTufQ=
is-number-object@^1.0.4:
version "1.0.6"
resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0"
integrity sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==
dependencies:
has-tostringtag "^1.0.0"
is-number@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=
dependencies:
kind-of "^3.0.2"
is-number@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
is-obj@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f"
integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8=
is-path-inside@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036"
integrity sha1-jvW33lBDej/cprToZe96pVy0gDY=
dependencies:
path-is-inside "^1.0.1"
is-plain-obj@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4=
is-plain-object@^2.0.3, is-plain-object@^2.0.4:
version "2.0.4"
resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==
dependencies:
isobject "^3.0.1"
is-property@^1.0.0, is-property@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84"
integrity sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=
is-redirect@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24"
integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=
is-regex@^1.1.4:
version "1.1.4"
resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958"
integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==
dependencies:
call-bind "^1.0.2"
has-tostringtag "^1.0.0"
is-resolvable@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88"
integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==
is-retry-allowed@^1.0.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4"
integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==
is-shared-array-buffer@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6"
integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==
is-stream@^1.0.0, is-stream@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ=
is-string@^1.0.5, is-string@^1.0.7:
version "1.0.7"
resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd"
integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==
dependencies:
has-tostringtag "^1.0.0"
is-svg@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-2.1.0.tgz#cf61090da0d9efbcab8722deba6f032208dbb0e9"
integrity sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk=
dependencies:
html-comment-regex "^1.1.0"
is-symbol@^1.0.2, is-symbol@^1.0.3:
version "1.0.4"
resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c"
integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==
dependencies:
has-symbols "^1.0.2"
is-typedarray@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
is-utf8@^0.2.0:
version "0.2.1"
resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=
is-weakref@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2"
integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==
dependencies:
call-bind "^1.0.2"
is-windows@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==
isarray@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=
isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
isexe@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
isobject@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=
dependencies:
isarray "1.0.0"
isobject@^3.0.0, isobject@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8=
isstream@~0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=
js-base64@^2.1.8, js-base64@^2.1.9:
version "2.6.4"
resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.6.4.tgz#f4e686c5de1ea1f867dbcad3d46d969428df98c4"
integrity sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==
"js-tokens@^3.0.0 || ^4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
js-tokens@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls=
js-yaml@^3.13.1, js-yaml@^3.4.3, js-yaml@^3.4.6, js-yaml@^3.5.1, js-yaml@^3.5.4, js-yaml@^3.9.1:
version "3.14.1"
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537"
integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==
dependencies:
argparse "^1.0.7"
esprima "^4.0.0"
js-yaml@~3.7.0:
version "3.7.0"
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80"
integrity sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=
dependencies:
argparse "^1.0.7"
esprima "^2.6.0"
jsbn@~0.1.0:
version "0.1.1"
resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM=
jsesc@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b"
integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s=
jsesc@~0.5.0:
version "0.5.0"
resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=
json-loader@^0.5.4:
version "0.5.7"
resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz#dca14a70235ff82f0ac9a3abeb60d337a365185d"
integrity sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==
json-parse-better-errors@^1.0.0, json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9"
integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==
json-parse-even-better-errors@^2.3.0:
version "2.3.1"
resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d"
integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==
json-schema-traverse@^0.3.0:
version "0.3.1"
resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340"
integrity sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=
json-schema-traverse@^0.4.1:
version "0.4.1"
resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
json-schema@0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5"
integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==
json-stable-stringify-without-jsonify@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=
json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af"
integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=
dependencies:
jsonify "~0.0.0"
json-stringify-safe@~5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=
json5@^0.5.0, json5@^0.5.1:
version "0.5.1"
resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=
json5@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe"
integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==
dependencies:
minimist "^1.2.0"
jsonfile@^3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-3.0.1.tgz#a5ecc6f65f53f662c4415c7675a0331d0992ec66"
integrity sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=
optionalDependencies:
graceful-fs "^4.1.6"
jsonify@~0.0.0:
version "0.0.0"
resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"
integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=
jsonparse@^1.2.0:
version "1.3.1"
resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280"
integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=
jsonpointer@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-5.0.0.tgz#f802669a524ec4805fa7389eadbc9921d5dc8072"
integrity sha512-PNYZIdMjVIvVgDSYKTT63Y+KZ6IZvGRNNWcxwD+GNnUz1MKPfv30J8ueCjdwcN0nDx2SlshgyB7Oy0epAzVRRg==
jsprim@^1.2.2:
version "1.4.2"
resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb"
integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==
dependencies:
assert-plus "1.0.0"
extsprintf "1.3.0"
json-schema "0.4.0"
verror "1.10.0"
jsx-ast-utils@^1.4.0:
version "1.4.1"
resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz#3867213e8dd79bf1e8f2300c0cfc1efb182c0df1"
integrity sha1-OGchPo3Xm/Ho8jAMDPwe+xgsDfE=
"jsx-ast-utils@^2.4.1 || ^3.0.0":
version "3.2.2"
resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.2.2.tgz#6ab1e52c71dfc0c0707008a91729a9491fe9f76c"
integrity sha512-HDAyJ4MNQBboGpUnHAVUNJs6X0lh058s6FuixsFGP7MgJYpD6Vasd6nzSG5iIfXu1zAYlHJ/zsOKNlrenTUBnw==
dependencies:
array-includes "^3.1.4"
object.assign "^4.1.2"
kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
version "3.2.2"
resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=
dependencies:
is-buffer "^1.1.5"
kind-of@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57"
integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc=
dependencies:
is-buffer "^1.1.5"
kind-of@^5.0.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d"
integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==
kind-of@^6.0.0, kind-of@^6.0.2:
version "6.0.3"
resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
known-css-properties@^0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.3.0.tgz#a3d135bbfc60ee8c6eacf2f7e7e6f2d4755e49a4"
integrity sha512-QMQcnKAiQccfQTqtBh/qwquGZ2XK/DXND1jrcN9M8gMMy99Gwla7GQjndVUsEqIaRyP6bsFRuhwRj5poafBGJQ==
latest-version@^3.0.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15"
integrity sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=
dependencies:
package-json "^4.0.0"
lazy-cache@^1.0.3:
version "1.0.4"
resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e"
integrity sha1-odePw6UEdMuAhF07O24dpJpEbo4=
lazy-property@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/lazy-property/-/lazy-property-1.0.0.tgz#84ddc4b370679ba8bd4cdcfa4c06b43d57111147"
integrity sha1-hN3Es3Bnm6i9TNz6TAa0PVcREUc=
lcid@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=
dependencies:
invert-kv "^1.0.0"
levn@^0.3.0, levn@~0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=
dependencies:
prelude-ls "~1.1.2"
type-check "~0.3.2"
libcipm@^4.0.8:
version "4.0.8"
resolved "https://registry.yarnpkg.com/libcipm/-/libcipm-4.0.8.tgz#dcea4919e10dfbce420327e63901613b9141bc89"
integrity sha512-IN3hh2yDJQtZZ5paSV4fbvJg4aHxCCg5tcZID/dSVlTuUiWktsgaldVljJv6Z5OUlYspx6xQkbR0efNodnIrOA==
dependencies:
bin-links "^1.1.2"
bluebird "^3.5.1"
figgy-pudding "^3.5.1"
find-npm-prefix "^1.0.2"
graceful-fs "^4.1.11"
ini "^1.3.5"
lock-verify "^2.1.0"
mkdirp "^0.5.1"
npm-lifecycle "^3.0.0"
npm-logical-tree "^1.2.1"
npm-package-arg "^6.1.0"
pacote "^9.1.0"
read-package-json "^2.0.13"
rimraf "^2.6.2"
worker-farm "^1.6.0"
libnpm@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/libnpm/-/libnpm-3.0.1.tgz#0be11b4c9dd4d1ffd7d95c786e92e55d65be77a2"
integrity sha512-d7jU5ZcMiTfBqTUJVZ3xid44fE5ERBm9vBnmhp2ECD2Ls+FNXWxHSkO7gtvrnbLO78gwPdNPz1HpsF3W4rjkBQ==
dependencies:
bin-links "^1.1.2"
bluebird "^3.5.3"
find-npm-prefix "^1.0.2"
libnpmaccess "^3.0.2"
libnpmconfig "^1.2.1"
libnpmhook "^5.0.3"
libnpmorg "^1.0.1"
libnpmpublish "^1.1.2"
libnpmsearch "^2.0.2"
libnpmteam "^1.0.2"
lock-verify "^2.0.2"
npm-lifecycle "^3.0.0"
npm-logical-tree "^1.2.1"
npm-package-arg "^6.1.0"
npm-profile "^4.0.2"
npm-registry-fetch "^4.0.0"
npmlog "^4.1.2"
pacote "^9.5.3"
read-package-json "^2.0.13"
stringify-package "^1.0.0"
libnpmaccess@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/libnpmaccess/-/libnpmaccess-3.0.2.tgz#8b2d72345ba3bef90d3b4f694edd5c0417f58923"
integrity sha512-01512AK7MqByrI2mfC7h5j8N9V4I7MHJuk9buo8Gv+5QgThpOgpjB7sQBDDkeZqRteFb1QM/6YNdHfG7cDvfAQ==
dependencies:
aproba "^2.0.0"
get-stream "^4.0.0"
npm-package-arg "^6.1.0"
npm-registry-fetch "^4.0.0"
libnpmconfig@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/libnpmconfig/-/libnpmconfig-1.2.1.tgz#c0c2f793a74e67d4825e5039e7a02a0044dfcbc0"
integrity sha512-9esX8rTQAHqarx6qeZqmGQKBNZR5OIbl/Ayr0qQDy3oXja2iFVQQI81R6GZ2a02bSNZ9p3YOGX1O6HHCb1X7kA==
dependencies:
figgy-pudding "^3.5.1"
find-up "^3.0.0"
ini "^1.3.5"
libnpmhook@^5.0.3:
version "5.0.3"
resolved "https://registry.yarnpkg.com/libnpmhook/-/libnpmhook-5.0.3.tgz#4020c0f5edbf08ebe395325caa5ea01885b928f7"
integrity sha512-UdNLMuefVZra/wbnBXECZPefHMGsVDTq5zaM/LgKNE9Keyl5YXQTnGAzEo+nFOpdRqTWI9LYi4ApqF9uVCCtuA==
dependencies:
aproba "^2.0.0"
figgy-pudding "^3.4.1"
get-stream "^4.0.0"
npm-registry-fetch "^4.0.0"
libnpmorg@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/libnpmorg/-/libnpmorg-1.0.1.tgz#5d2503f6ceb57f33dbdcc718e6698fea6d5ad087"
integrity sha512-0sRUXLh+PLBgZmARvthhYXQAWn0fOsa6T5l3JSe2n9vKG/lCVK4nuG7pDsa7uMq+uTt2epdPK+a2g6btcY11Ww==
dependencies:
aproba "^2.0.0"
figgy-pudding "^3.4.1"
get-stream "^4.0.0"
npm-registry-fetch "^4.0.0"
libnpmpublish@^1.1.2:
version "1.1.3"
resolved "https://registry.yarnpkg.com/libnpmpublish/-/libnpmpublish-1.1.3.tgz#e3782796722d79eef1a0a22944c117e0c4ca4280"
integrity sha512-/3LsYqVc52cHXBmu26+J8Ed7sLs/hgGVFMH1mwYpL7Qaynb9RenpKqIKu0sJ130FB9PMkpMlWjlbtU8A4m7CQw==
dependencies:
aproba "^2.0.0"
figgy-pudding "^3.5.1"
get-stream "^4.0.0"
lodash.clonedeep "^4.5.0"
normalize-package-data "^2.4.0"
npm-package-arg "^6.1.0"
npm-registry-fetch "^4.0.0"
semver "^5.5.1"
ssri "^6.0.1"
libnpmsearch@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/libnpmsearch/-/libnpmsearch-2.0.2.tgz#9a4f059102d38e3dd44085bdbfe5095f2a5044cf"
integrity sha512-VTBbV55Q6fRzTdzziYCr64+f8AopQ1YZ+BdPOv16UegIEaE8C0Kch01wo4s3kRTFV64P121WZJwgmBwrq68zYg==
dependencies:
figgy-pudding "^3.5.1"
get-stream "^4.0.0"
npm-registry-fetch "^4.0.0"
libnpmteam@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/libnpmteam/-/libnpmteam-1.0.2.tgz#8b48bcbb6ce70dd8150c950fcbdbf3feb6eec820"
integrity sha512-p420vM28Us04NAcg1rzgGW63LMM6rwe+6rtZpfDxCcXxM0zUTLl7nPFEnRF3JfFBF5skF/yuZDUthTsHgde8QA==
dependencies:
aproba "^2.0.0"
figgy-pudding "^3.4.1"
get-stream "^4.0.0"
npm-registry-fetch "^4.0.0"
libnpx@^10.2.4:
version "10.2.4"
resolved "https://registry.yarnpkg.com/libnpx/-/libnpx-10.2.4.tgz#ef0e3258e29aef2ec7ee3276115e20e67f67d4ee"
integrity sha512-BPc0D1cOjBeS8VIBKUu5F80s6njm0wbVt7CsGMrIcJ+SI7pi7V0uVPGpEMH9H5L8csOcclTxAXFE2VAsJXUhfA==
dependencies:
dotenv "^5.0.1"
npm-package-arg "^6.0.0"
rimraf "^2.6.2"
safe-buffer "^5.1.0"
update-notifier "^2.3.0"
which "^1.3.0"
y18n "^4.0.0"
yargs "^14.2.3"
linkify-it@^3.0.1:
version "3.0.3"
resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-3.0.3.tgz#a98baf44ce45a550efb4d49c769d07524cc2fa2e"
integrity sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==
dependencies:
uc.micro "^1.0.1"
load-json-file@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=
dependencies:
graceful-fs "^4.1.2"
parse-json "^2.2.0"
pify "^2.0.0"
pinkie-promise "^2.0.0"
strip-bom "^2.0.0"
load-json-file@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8"
integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=
dependencies:
graceful-fs "^4.1.2"
parse-json "^2.2.0"
pify "^2.0.0"
strip-bom "^3.0.0"
loader-fs-cache@^1.0.0:
version "1.0.3"
resolved "https://registry.yarnpkg.com/loader-fs-cache/-/loader-fs-cache-1.0.3.tgz#f08657646d607078be2f0a032f8bd69dd6f277d9"
integrity sha512-ldcgZpjNJj71n+2Mf6yetz+c9bM4xpKtNds4LbqXzU/PTdeAX0g3ytnU1AJMEcTk2Lex4Smpe3Q/eCTsvUBxbA==
dependencies:
find-cache-dir "^0.1.1"
mkdirp "^0.5.1"
loader-runner@^2.3.0:
version "2.4.0"
resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357"
integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==
loader-utils@0.2.x, loader-utils@^0.2.16:
version "0.2.17"
resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348"
integrity sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=
dependencies:
big.js "^3.1.3"
emojis-list "^2.0.0"
json5 "^0.5.0"
object-assign "^4.0.1"
loader-utils@^1.0.1, loader-utils@^1.0.2, loader-utils@^1.1.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613"
integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==
dependencies:
big.js "^5.2.2"
emojis-list "^3.0.0"
json5 "^1.0.1"
locate-path@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=
dependencies:
p-locate "^2.0.0"
path-exists "^3.0.0"
locate-path@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e"
integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==
dependencies:
p-locate "^3.0.0"
path-exists "^3.0.0"
locate-path@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0"
integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==
dependencies:
p-locate "^4.1.0"
lock-verify@^2.0.2, lock-verify@^2.1.0:
version "2.2.1"
resolved "https://registry.yarnpkg.com/lock-verify/-/lock-verify-2.2.1.tgz#81107948c51ed16f97b96ff8b60675affb243fc1"
integrity sha512-n0Zw2DVupKfZMazy/HIFVNohJ1z8fIoZ77WBnyyBGG6ixw83uJNyrbiJvvHWe1QKkGiBCjj8RCPlymltliqEww==
dependencies:
"@iarna/cli" "^1.2.0"
npm-package-arg "^6.1.0"
semver "^5.4.1"
lockfile@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/lockfile/-/lockfile-1.0.4.tgz#07f819d25ae48f87e538e6578b6964a4981a5609"
integrity sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA==
dependencies:
signal-exit "^3.0.2"
lodash._baseassign@^3.0.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e"
integrity sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=
dependencies:
lodash._basecopy "^3.0.0"
lodash.keys "^3.0.0"
lodash._basecopy@^3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36"
integrity sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=
lodash._baseuniq@~4.6.0:
version "4.6.0"
resolved "https://registry.yarnpkg.com/lodash._baseuniq/-/lodash._baseuniq-4.6.0.tgz#0ebb44e456814af7905c6212fa2c9b2d51b841e8"
integrity sha1-DrtE5FaBSveQXGIS+iybLVG4Qeg=
dependencies:
lodash._createset "~4.0.0"
lodash._root "~3.0.0"
lodash._bindcallback@^3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e"
integrity sha1-5THCdkTPi1epnhftlbNcdIeJOS4=
lodash._createassigner@^3.0.0:
version "3.1.1"
resolved "https://registry.yarnpkg.com/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz#838a5bae2fdaca63ac22dee8e19fa4e6d6970b11"
integrity sha1-g4pbri/aymOsIt7o4Z+k5taXCxE=
dependencies:
lodash._bindcallback "^3.0.0"
lodash._isiterateecall "^3.0.0"
lodash.restparam "^3.0.0"
lodash._createset@~4.0.0:
version "4.0.3"
resolved "https://registry.yarnpkg.com/lodash._createset/-/lodash._createset-4.0.3.tgz#0f4659fbb09d75194fa9e2b88a6644d363c9fe26"
integrity sha1-D0ZZ+7CddRlPqeK4imZE02PJ/iY=
lodash._getnative@^3.0.0:
version "3.9.1"
resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5"
integrity sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=
lodash._isiterateecall@^3.0.0:
version "3.0.9"
resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c"
integrity sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=
lodash._root@~3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692"
integrity sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=
lodash.assign@^3.0.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-3.2.0.tgz#3ce9f0234b4b2223e296b8fa0ac1fee8ebca64fa"
integrity sha1-POnwI0tLIiPilrj6CsH+6OvKZPo=
dependencies:
lodash._baseassign "^3.0.0"
lodash._createassigner "^3.0.0"
lodash.keys "^3.0.0"
lodash.assign@^4.0.1:
version "4.2.0"
resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7"
integrity sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=
lodash.camelcase@^4.3.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6"
integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY=
lodash.capitalize@^4.1.0:
version "4.2.1"
resolved "https://registry.yarnpkg.com/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz#f826c9b4e2a8511d84e3aca29db05e1a4f3b72a9"
integrity sha1-+CbJtOKoUR2E46yinbBeGk87cqk=
lodash.clonedeep@^4.5.0, lodash.clonedeep@~4.5.0:
version "4.5.0"
resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef"
integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=
lodash.defaults@^3.1.2:
version "3.1.2"
resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-3.1.2.tgz#c7308b18dbf8bc9372d701a73493c61192bd2e2c"
integrity sha1-xzCLGNv4vJNy1wGnNJPGEZK9Liw=
dependencies:
lodash.assign "^3.0.0"
lodash.restparam "^3.0.0"
lodash.defaults@^4.0.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c"
integrity sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=
lodash.isarguments@^3.0.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a"
integrity sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=
lodash.isarray@^3.0.0:
version "3.0.4"
resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55"
integrity sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=
lodash.kebabcase@^4.0.0:
version "4.1.1"
resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36"
integrity sha1-hImxyw0p/4gZXM7KRI/21swpXDY=
lodash.keys@^3.0.0:
version "3.1.2"
resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a"
integrity sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=
dependencies:
lodash._getnative "^3.0.0"
lodash.isarguments "^3.0.0"
lodash.isarray "^3.0.0"
lodash.memoize@^4.1.2:
version "4.1.2"
resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=
lodash.restparam@^3.0.0:
version "3.6.1"
resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805"
integrity sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=
lodash.tail@^4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/lodash.tail/-/lodash.tail-4.1.1.tgz#d2333a36d9e7717c8ad2f7cacafec7c32b444664"
integrity sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=
lodash.union@~4.6.0:
version "4.6.0"
resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88"
integrity sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=
lodash.uniq@^4.5.0, lodash.uniq@~4.5.0:
version "4.5.0"
resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=
lodash.without@~4.4.0:
version "4.4.0"
resolved "https://registry.yarnpkg.com/lodash.without/-/lodash.without-4.4.0.tgz#3cd4574a00b67bae373a94b748772640507b7aac"
integrity sha1-PNRXSgC2e643OpS3SHcmQFB7eqw=
lodash@^4.0.0, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.3.0, lodash@~4.17.10:
version "4.17.21"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
longest@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097"
integrity sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=
loose-envify@^1.0.0, loose-envify@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
dependencies:
js-tokens "^3.0.0 || ^4.0.0"
loud-rejection@^1.0.0:
version "1.6.0"
resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f"
integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=
dependencies:
currently-unhandled "^0.4.1"
signal-exit "^3.0.0"
lowercase-keys@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f"
integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==
lru-cache@^4.0.1:
version "4.1.5"
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd"
integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==
dependencies:
pseudomap "^1.0.2"
yallist "^2.1.2"
lru-cache@^5.1.1:
version "5.1.1"
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920"
integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==
dependencies:
yallist "^3.0.2"
make-dir@^1.0.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c"
integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==
dependencies:
pify "^3.0.0"
make-fetch-happen@^5.0.0:
version "5.0.2"
resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-5.0.2.tgz#aa8387104f2687edca01c8687ee45013d02d19bd"
integrity sha512-07JHC0r1ykIoruKO8ifMXu+xEU8qOXDFETylktdug6vJDACnP+HKevOu3PXyNPzFyTSlz8vrBYlBO1JZRe8Cag==
dependencies:
agentkeepalive "^3.4.1"
cacache "^12.0.0"
http-cache-semantics "^3.8.1"
http-proxy-agent "^2.1.0"
https-proxy-agent "^2.2.3"
lru-cache "^5.1.1"
mississippi "^3.0.0"
node-fetch-npm "^2.0.2"
promise-retry "^1.1.1"
socks-proxy-agent "^4.0.0"
ssri "^6.0.0"
map-cache@^0.2.2:
version "0.2.2"
resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=
map-obj@^1.0.0, map-obj@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d"
integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=
map-visit@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f"
integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=
dependencies:
object-visit "^1.0.0"
markdown-it@^12.3.2:
version "12.3.2"
resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-12.3.2.tgz#bf92ac92283fe983fe4de8ff8abfb5ad72cd0c90"
integrity sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==
dependencies:
argparse "^2.0.1"
entities "~2.1.0"
linkify-it "^3.0.1"
mdurl "^1.0.1"
uc.micro "^1.0.5"
math-expression-evaluator@^1.2.14:
version "1.3.14"
resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.3.14.tgz#0ebeaccf65fea0f6f5a626f88df41814e5fcd9bf"
integrity sha512-M6AMrvq9bO8uL42KvQHPA2/SbAobA0R7gviUmPrcTcGfdwpaLitz4q2Euzx2lP9Oy88vxK3HOrsISgSwKsYS4A==
md5.js@^1.3.4:
version "1.3.5"
resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f"
integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==
dependencies:
hash-base "^3.0.0"
inherits "^2.0.1"
safe-buffer "^5.1.2"
mdurl@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e"
integrity sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=
meant@^1.0.2:
version "1.0.3"
resolved "https://registry.yarnpkg.com/meant/-/meant-1.0.3.tgz#67769af9de1d158773e928ae82c456114903554c"
integrity sha512-88ZRGcNxAq4EH38cQ4D85PM57pikCwS8Z99EWHODxN7KBY+UuPiqzRTtZzS8KTXO/ywSWbdjjJST2Hly/EQxLw==
media-typer@0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=
mem@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76"
integrity sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=
dependencies:
mimic-fn "^1.0.0"
memory-fs@^0.4.0, memory-fs@~0.4.1:
version "0.4.1"
resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552"
integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=
dependencies:
errno "^0.1.3"
readable-stream "^2.0.1"
meow@^3.7.0:
version "3.7.0"
resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb"
integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=
dependencies:
camelcase-keys "^2.0.0"
decamelize "^1.1.2"
loud-rejection "^1.0.0"
map-obj "^1.0.1"
minimist "^1.1.3"
normalize-package-data "^2.3.4"
object-assign "^4.0.1"
read-pkg-up "^1.0.1"
redent "^1.0.0"
trim-newlines "^1.0.0"
merge-descriptors@1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=
merge@^1.2.0:
version "1.2.1"
resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145"
integrity sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==
methods@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=
micromatch@^3.1.10, micromatch@^3.1.4:
version "3.1.10"
resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==
dependencies:
arr-diff "^4.0.0"
array-unique "^0.3.2"
braces "^2.3.1"
define-property "^2.0.2"
extend-shallow "^3.0.2"
extglob "^2.0.4"
fragment-cache "^0.2.1"
kind-of "^6.0.2"
nanomatch "^1.2.9"
object.pick "^1.3.0"
regex-not "^1.0.0"
snapdragon "^0.8.1"
to-regex "^3.0.2"
miller-rabin@^4.0.0:
version "4.0.1"
resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d"
integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==
dependencies:
bn.js "^4.0.0"
brorand "^1.0.1"
mime-db@1.52.0:
version "1.52.0"
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
mime-types@^2.1.12, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34:
version "2.1.35"
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
dependencies:
mime-db "1.52.0"
mime@1.6.0, mime@^1.4.1:
version "1.6.0"
resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
mimic-fn@^1.0.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==
minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==
minimalistic-crypto-utils@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=
minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.1.2:
version "3.1.2"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
dependencies:
brace-expansion "^1.1.7"
minimatch@~3.0.2:
version "3.0.8"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.8.tgz#5e6a59bd11e2ab0de1cfb843eb2d82e546c321c1"
integrity sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==
dependencies:
brace-expansion "^1.1.7"
minimist@1.1.x:
version "1.1.3"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.1.3.tgz#3bedfd91a92d39016fcfaa1c681e8faa1a1efda8"
integrity sha1-O+39kaktOQFvz6ocaB6Pqhoe/ag=
minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6:
version "1.2.6"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44"
integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==
minipass@^2.3.5, minipass@^2.6.0, minipass@^2.9.0:
version "2.9.0"
resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6"
integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==
dependencies:
safe-buffer "^5.1.2"
yallist "^3.0.0"
minizlib@^1.3.3:
version "1.3.3"
resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d"
integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==
dependencies:
minipass "^2.9.0"
mississippi@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022"
integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==
dependencies:
concat-stream "^1.5.0"
duplexify "^3.4.2"
end-of-stream "^1.1.0"
flush-write-stream "^1.0.0"
from2 "^2.1.0"
parallel-transform "^1.1.0"
pump "^3.0.0"
pumpify "^1.3.3"
stream-each "^1.1.0"
through2 "^2.0.0"
mixin-deep@^1.2.0:
version "1.3.2"
resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566"
integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==
dependencies:
for-in "^1.0.2"
is-extendable "^1.0.1"
mixin-object@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/mixin-object/-/mixin-object-2.0.1.tgz#4fb949441dab182540f1fe035ba60e1947a5e57e"
integrity sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=
dependencies:
for-in "^0.1.3"
is-extendable "^0.1.1"
mkdirp@0.5.5:
version "0.5.5"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def"
integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==
dependencies:
minimist "^1.2.5"
"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.5, mkdirp@~0.5.0, mkdirp@~0.5.1:
version "0.5.6"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6"
integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==
dependencies:
minimist "^1.2.6"
modernizr-loader@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/modernizr-loader/-/modernizr-loader-1.0.1.tgz#e52a6f9a12578b944abbd6cbd65c863ea4a83f49"
integrity sha1-5SpvmhJXi5RKu9bL1lyGPqSoP0k=
modernizr@^3.6.0:
version "3.12.0"
resolved "https://registry.yarnpkg.com/modernizr/-/modernizr-3.12.0.tgz#38b1aa96eea48d90fe433f2803a8246acd2fefa9"
integrity sha512-i5f5xfnxMOb3cePoBpwk4bWjVAyIB3hgm7QrDvZx/R7zUUS8PO9zlyQF7vJKn8kCVxEvL0nRWeZ0PPqVbY31sw==
dependencies:
doctrine "^3.0.0"
file "^0.2.2"
lodash "^4.17.21"
markdown-it "^12.3.2"
mkdirp "0.5.5"
requirejs "^2.3.6"
yargs "^15.4.1"
move-concurrently@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92"
integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=
dependencies:
aproba "^1.1.1"
copy-concurrently "^1.0.0"
fs-write-stream-atomic "^1.0.8"
mkdirp "^0.5.1"
rimraf "^2.5.4"
run-queue "^1.0.3"
ms@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
ms@2.1.3, ms@^2.0.0, ms@^2.1.1:
version "2.1.3"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
mute-stream@0.0.5:
version "0.0.5"
resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0"
integrity sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=
mute-stream@0.0.7:
version "0.0.7"
resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab"
integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=
mute-stream@~0.0.4:
version "0.0.8"
resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d"
integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==
nan@^2.12.1, nan@^2.13.2:
version "2.15.0"
resolved "https://registry.yarnpkg.com/nan/-/nan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee"
integrity sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==
nanomatch@^1.2.9:
version "1.2.13"
resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==
dependencies:
arr-diff "^4.0.0"
array-unique "^0.3.2"
define-property "^2.0.2"
extend-shallow "^3.0.2"
fragment-cache "^0.2.1"
is-windows "^1.0.2"
kind-of "^6.0.2"
object.pick "^1.3.0"
regex-not "^1.0.0"
snapdragon "^0.8.1"
to-regex "^3.0.1"
natural-compare@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
negotiator@0.6.3:
version "0.6.3"
resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd"
integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==
neo-async@^2.5.0:
version "2.6.2"
resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f"
integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==
next-tick@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb"
integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==
node-fetch-npm@^2.0.2:
version "2.0.4"
resolved "https://registry.yarnpkg.com/node-fetch-npm/-/node-fetch-npm-2.0.4.tgz#6507d0e17a9ec0be3bec516958a497cec54bf5a4"
integrity sha512-iOuIQDWDyjhv9qSDrj9aq/klt6F9z1p2otB3AV7v3zBDcL/x+OfGsvGQZZCcMZbUf4Ujw1xGNQkjvGnVT22cKg==
dependencies:
encoding "^0.1.11"
json-parse-better-errors "^1.0.0"
safe-buffer "^5.1.1"
node-gyp@^3.8.0:
version "3.8.0"
resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c"
integrity sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==
dependencies:
fstream "^1.0.0"
glob "^7.0.3"
graceful-fs "^4.1.2"
mkdirp "^0.5.0"
nopt "2 || 3"
npmlog "0 || 1 || 2 || 3 || 4"
osenv "0"
request "^2.87.0"
rimraf "2"
semver "~5.3.0"
tar "^2.0.0"
which "1"
node-gyp@^5.0.2, node-gyp@^5.1.0:
version "5.1.1"
resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-5.1.1.tgz#eb915f7b631c937d282e33aed44cb7a025f62a3e"
integrity sha512-WH0WKGi+a4i4DUt2mHnvocex/xPLp9pYt5R6M2JdFB7pJ7Z34hveZ4nDTGTiLXCkitA9T8HFZjhinBCiVHYcWw==
dependencies:
env-paths "^2.2.0"
glob "^7.1.4"
graceful-fs "^4.2.2"
mkdirp "^0.5.1"
nopt "^4.0.1"
npmlog "^4.1.2"
request "^2.88.0"
rimraf "^2.6.3"
semver "^5.7.1"
tar "^4.4.12"
which "^1.3.1"
node-libs-browser@^2.0.0:
version "2.2.1"
resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425"
integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==
dependencies:
assert "^1.1.1"
browserify-zlib "^0.2.0"
buffer "^4.3.0"
console-browserify "^1.1.0"
constants-browserify "^1.0.0"
crypto-browserify "^3.11.0"
domain-browser "^1.1.1"
events "^3.0.0"
https-browserify "^1.0.0"
os-browserify "^0.3.0"
path-browserify "0.0.1"
process "^0.11.10"
punycode "^1.2.4"
querystring-es3 "^0.2.0"
readable-stream "^2.3.3"
stream-browserify "^2.0.1"
stream-http "^2.7.2"
string_decoder "^1.0.0"
timers-browserify "^2.0.4"
tty-browserify "0.0.0"
url "^0.11.0"
util "^0.11.0"
vm-browserify "^1.0.1"
node-sass@^4.5.3:
version "4.14.1"
resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.14.1.tgz#99c87ec2efb7047ed638fb4c9db7f3a42e2217b5"
integrity sha512-sjCuOlvGyCJS40R8BscF5vhVlQjNN069NtQ1gSxyK1u9iqvn6tf7O1R4GNowVZfiZUCRt5MmMs1xd+4V/7Yr0g==
dependencies:
async-foreach "^0.1.3"
chalk "^1.1.1"
cross-spawn "^3.0.0"
gaze "^1.0.0"
get-stdin "^4.0.1"
glob "^7.0.3"
in-publish "^2.0.0"
lodash "^4.17.15"
meow "^3.7.0"
mkdirp "^0.5.1"
nan "^2.13.2"
node-gyp "^3.8.0"
npmlog "^4.0.0"
request "^2.88.0"
sass-graph "2.2.5"
stdout-stream "^1.4.0"
"true-case-path" "^1.0.2"
"nopt@2 || 3":
version "3.0.6"
resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9"
integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k=
dependencies:
abbrev "1"
nopt@^4.0.1, nopt@^4.0.3:
version "4.0.3"
resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48"
integrity sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==
dependencies:
abbrev "1"
osenv "^0.1.4"
normalize-package-data@^2.0.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.4.0, normalize-package-data@^2.5.0:
version "2.5.0"
resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8"
integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==
dependencies:
hosted-git-info "^2.1.4"
resolve "^1.10.0"
semver "2 || 3 || 4 || 5"
validate-npm-package-license "^3.0.1"
normalize-path@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=
dependencies:
remove-trailing-separator "^1.0.1"
normalize-path@^3.0.0, normalize-path@~3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
normalize-range@^0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942"
integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=
normalize-url@^1.4.0:
version "1.9.1"
resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c"
integrity sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=
dependencies:
object-assign "^4.0.1"
prepend-http "^1.0.0"
query-string "^4.1.0"
sort-keys "^1.0.0"
npm-audit-report@^1.3.3:
version "1.3.3"
resolved "https://registry.yarnpkg.com/npm-audit-report/-/npm-audit-report-1.3.3.tgz#8226deeb253b55176ed147592a3995442f2179ed"
integrity sha512-8nH/JjsFfAWMvn474HB9mpmMjrnKb1Hx/oTAdjv4PT9iZBvBxiZ+wtDUapHCJwLqYGQVPaAfs+vL5+5k9QndXw==
dependencies:
cli-table3 "^0.5.0"
console-control-strings "^1.1.0"
npm-bundled@^1.0.1:
version "1.1.2"
resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.2.tgz#944c78789bd739035b70baa2ca5cc32b8d860bc1"
integrity sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==
dependencies:
npm-normalize-package-bin "^1.0.1"
npm-cache-filename@~1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/npm-cache-filename/-/npm-cache-filename-1.0.2.tgz#ded306c5b0bfc870a9e9faf823bc5f283e05ae11"
integrity sha1-3tMGxbC/yHCp6fr4I7xfKD4FrhE=
npm-install-checks@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-3.0.2.tgz#ab2e32ad27baa46720706908e5b14c1852de44d9"
integrity sha512-E4kzkyZDIWoin6uT5howP8VDvkM+E8IQDcHAycaAxMbwkqhIg5eEYALnXOl3Hq9MrkdQB/2/g1xwBINXdKSRkg==
dependencies:
semver "^2.3.0 || 3.x || 4 || 5"
npm-lifecycle@^3.0.0, npm-lifecycle@^3.1.5:
version "3.1.5"
resolved "https://registry.yarnpkg.com/npm-lifecycle/-/npm-lifecycle-3.1.5.tgz#9882d3642b8c82c815782a12e6a1bfeed0026309"
integrity sha512-lDLVkjfZmvmfvpvBzA4vzee9cn+Me4orq0QF8glbswJVEbIcSNWib7qGOffolysc3teCqbbPZZkzbr3GQZTL1g==
dependencies:
byline "^5.0.0"
graceful-fs "^4.1.15"
node-gyp "^5.0.2"
resolve-from "^4.0.0"
slide "^1.1.6"
uid-number "0.0.6"
umask "^1.1.0"
which "^1.3.1"
npm-logical-tree@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/npm-logical-tree/-/npm-logical-tree-1.2.1.tgz#44610141ca24664cad35d1e607176193fd8f5b88"
integrity sha512-AJI/qxDB2PWI4LG1CYN579AY1vCiNyWfkiquCsJWqntRu/WwimVrC8yXeILBFHDwxfOejxewlmnvW9XXjMlYIg==
npm-normalize-package-bin@^1.0.0, npm-normalize-package-bin@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2"
integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==
"npm-package-arg@^4.0.0 || ^5.0.0 || ^6.0.0", npm-package-arg@^6.0.0, npm-package-arg@^6.1.0, npm-package-arg@^6.1.1:
version "6.1.1"
resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-6.1.1.tgz#02168cb0a49a2b75bf988a28698de7b529df5cb7"
integrity sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==
dependencies:
hosted-git-info "^2.7.1"
osenv "^0.1.5"
semver "^5.6.0"
validate-npm-package-name "^3.0.0"
npm-packlist@^1.1.12, npm-packlist@^1.4.8:
version "1.4.8"
resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e"
integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==
dependencies:
ignore-walk "^3.0.1"
npm-bundled "^1.0.1"
npm-normalize-package-bin "^1.0.1"
npm-pick-manifest@^3.0.0, npm-pick-manifest@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-3.0.2.tgz#f4d9e5fd4be2153e5f4e5f9b7be8dc419a99abb7"
integrity sha512-wNprTNg+X5nf+tDi+hbjdHhM4bX+mKqv6XmPh7B5eG+QY9VARfQPfCEH013H5GqfNj6ee8Ij2fg8yk0mzps1Vw==
dependencies:
figgy-pudding "^3.5.1"
npm-package-arg "^6.0.0"
semver "^5.4.1"
npm-profile@^4.0.2, npm-profile@^4.0.4:
version "4.0.4"
resolved "https://registry.yarnpkg.com/npm-profile/-/npm-profile-4.0.4.tgz#28ee94390e936df6d084263ee2061336a6a1581b"
integrity sha512-Ta8xq8TLMpqssF0H60BXS1A90iMoM6GeKwsmravJ6wYjWwSzcYBTdyWa3DZCYqPutacBMEm7cxiOkiIeCUAHDQ==
dependencies:
aproba "^1.1.2 || 2"
figgy-pudding "^3.4.1"
npm-registry-fetch "^4.0.0"
npm-registry-fetch@^4.0.0, npm-registry-fetch@^4.0.7:
version "4.0.7"
resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-4.0.7.tgz#57951bf6541e0246b34c9f9a38ab73607c9449d7"
integrity sha512-cny9v0+Mq6Tjz+e0erFAB+RYJ/AVGzkjnISiobqP8OWj9c9FLoZZu8/SPSKJWE17F1tk4018wfjV+ZbIbqC7fQ==
dependencies:
JSONStream "^1.3.4"
bluebird "^3.5.1"
figgy-pudding "^3.4.1"
lru-cache "^5.1.1"
make-fetch-happen "^5.0.0"
npm-package-arg "^6.1.0"
safe-buffer "^5.2.0"
npm-run-path@^2.0.0:
version "2.0.2"
resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=
dependencies:
path-key "^2.0.0"
npm-user-validate@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/npm-user-validate/-/npm-user-validate-1.0.1.tgz#31428fc5475fe8416023f178c0ab47935ad8c561"
integrity sha512-uQwcd/tY+h1jnEaze6cdX/LrhWhoBxfSknxentoqmIuStxUExxjWd3ULMLFPiFUrZKbOVMowH6Jq2FRWfmhcEw==
npm@^6.0.0:
version "6.14.16"
resolved "https://registry.yarnpkg.com/npm/-/npm-6.14.16.tgz#a882d6b0b32d5212461f0c58719152add1a7b99a"
integrity sha512-LMiLGYsVNJfVPlQg7v2NYjG7iRIapcLv+oMunlq7fkXVx0BATCjRu7XyWl0G+iuZzHy4CjtM32QB8ox8juTgaw==
dependencies:
JSONStream "^1.3.5"
abbrev "~1.1.1"
ansicolors "~0.3.2"
ansistyles "~0.1.3"
aproba "^2.0.0"
archy "~1.0.0"
bin-links "^1.1.8"
bluebird "^3.5.5"
byte-size "^5.0.1"
cacache "^12.0.3"
call-limit "^1.1.1"
chownr "^1.1.4"
ci-info "^2.0.0"
cli-columns "^3.1.2"
cli-table3 "^0.5.1"
cmd-shim "^3.0.3"
columnify "~1.5.4"
config-chain "^1.1.12"
detect-indent "~5.0.0"
detect-newline "^2.1.0"
dezalgo "~1.0.3"
editor "~1.0.0"
figgy-pudding "^3.5.1"
find-npm-prefix "^1.0.2"
fs-vacuum "~1.2.10"
fs-write-stream-atomic "~1.0.10"
gentle-fs "^2.3.1"
glob "^7.1.6"
graceful-fs "^4.2.4"
has-unicode "~2.0.1"
hosted-git-info "^2.8.9"
iferr "^1.0.2"
infer-owner "^1.0.4"
inflight "~1.0.6"
inherits "^2.0.4"
ini "^1.3.8"
init-package-json "^1.10.3"
is-cidr "^3.0.0"
json-parse-better-errors "^1.0.2"
lazy-property "~1.0.0"
libcipm "^4.0.8"
libnpm "^3.0.1"
libnpmaccess "^3.0.2"
libnpmhook "^5.0.3"
libnpmorg "^1.0.1"
libnpmsearch "^2.0.2"
libnpmteam "^1.0.2"
libnpx "^10.2.4"
lock-verify "^2.1.0"
lockfile "^1.0.4"
lodash._baseuniq "~4.6.0"
lodash.clonedeep "~4.5.0"
lodash.union "~4.6.0"
lodash.uniq "~4.5.0"
lodash.without "~4.4.0"
lru-cache "^5.1.1"
meant "^1.0.2"
mississippi "^3.0.0"
mkdirp "^0.5.5"
move-concurrently "^1.0.1"
node-gyp "^5.1.0"
nopt "^4.0.3"
normalize-package-data "^2.5.0"
npm-audit-report "^1.3.3"
npm-cache-filename "~1.0.2"
npm-install-checks "^3.0.2"
npm-lifecycle "^3.1.5"
npm-package-arg "^6.1.1"
npm-packlist "^1.4.8"
npm-pick-manifest "^3.0.2"
npm-profile "^4.0.4"
npm-registry-fetch "^4.0.7"
npm-user-validate "^1.0.1"
npmlog "~4.1.2"
once "~1.4.0"
opener "^1.5.2"
osenv "^0.1.5"
pacote "^9.5.12"
path-is-inside "~1.0.2"
promise-inflight "~1.0.1"
qrcode-terminal "^0.12.0"
query-string "^6.8.2"
qw "~1.0.1"
read "~1.0.7"
read-cmd-shim "^1.0.5"
read-installed "~4.0.3"
read-package-json "^2.1.1"
read-package-tree "^5.3.1"
readable-stream "^3.6.0"
readdir-scoped-modules "^1.1.0"
request "^2.88.0"
retry "^0.12.0"
rimraf "^2.7.1"
safe-buffer "^5.1.2"
semver "^5.7.1"
sha "^3.0.0"
slide "~1.1.6"
sorted-object "~2.0.1"
sorted-union-stream "~2.1.3"
ssri "^6.0.2"
stringify-package "^1.0.1"
tar "^4.4.19"
text-table "~0.2.0"
tiny-relative-date "^1.3.0"
uid-number "0.0.6"
umask "~1.1.0"
unique-filename "^1.1.1"
unpipe "~1.0.0"
update-notifier "^2.5.0"
uuid "^3.3.3"
validate-npm-package-license "^3.0.4"
validate-npm-package-name "~3.0.0"
which "^1.3.1"
worker-farm "^1.7.0"
write-file-atomic "^2.4.3"
"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.1.2, npmlog@~4.1.2:
version "4.1.2"
resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==
dependencies:
are-we-there-yet "~1.1.2"
console-control-strings "~1.1.0"
gauge "~2.7.3"
set-blocking "~2.0.0"
num2fraction@^1.2.2:
version "1.2.2"
resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede"
integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=
number-is-nan@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=
oauth-sign@~0.9.0:
version "0.9.0"
resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455"
integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==
object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
object-copy@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c"
integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw=
dependencies:
copy-descriptor "^0.1.0"
define-property "^0.2.5"
kind-of "^3.0.3"
object-hash@^1.1.4:
version "1.3.1"
resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.3.1.tgz#fde452098a951cb145f039bb7d455449ddc126df"
integrity sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==
object-inspect@^1.12.0, object-inspect@^1.9.0:
version "1.12.0"
resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0"
integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==
object-keys@^1.0.12, object-keys@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
object-path@^0.9.2:
version "0.9.2"
resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.9.2.tgz#0fd9a74fc5fad1ae3968b586bda5c632bd6c05a5"
integrity sha1-D9mnT8X60a45aLWGvaXGMr1sBaU=
object-visit@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb"
integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=
dependencies:
isobject "^3.0.0"
object.assign@^4.1.2:
version "4.1.2"
resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940"
integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==
dependencies:
call-bind "^1.0.0"
define-properties "^1.1.3"
has-symbols "^1.0.1"
object-keys "^1.1.1"
object.entries@^1.1.5:
version "1.1.5"
resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.5.tgz#e1acdd17c4de2cd96d5a08487cfb9db84d881861"
integrity sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==
dependencies:
call-bind "^1.0.2"
define-properties "^1.1.3"
es-abstract "^1.19.1"
object.fromentries@^2.0.5:
version "2.0.5"
resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.5.tgz#7b37b205109c21e741e605727fe8b0ad5fa08251"
integrity sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==
dependencies:
call-bind "^1.0.2"
define-properties "^1.1.3"
es-abstract "^1.19.1"
object.getownpropertydescriptors@^2.0.3:
version "2.1.3"
resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz#b223cf38e17fefb97a63c10c91df72ccb386df9e"
integrity sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw==
dependencies:
call-bind "^1.0.2"
define-properties "^1.1.3"
es-abstract "^1.19.1"
object.hasown@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.0.tgz#7232ed266f34d197d15cac5880232f7a4790afe5"
integrity sha512-MhjYRfj3GBlhSkDHo6QmvgjRLXQ2zndabdf3nX0yTyZK9rPfxb6uRpAac8HXNLy1GpqWtZ81Qh4v3uOls2sRAg==
dependencies:
define-properties "^1.1.3"
es-abstract "^1.19.1"
object.pick@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=
dependencies:
isobject "^3.0.1"
object.values@^1.1.5:
version "1.1.5"
resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac"
integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==
dependencies:
call-bind "^1.0.2"
define-properties "^1.1.3"
es-abstract "^1.19.1"
on-finished@~2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=
dependencies:
ee-first "1.1.1"
once@^1.3.0, once@^1.3.1, once@^1.4.0, once@~1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
dependencies:
wrappy "1"
onetime@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789"
integrity sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=
onetime@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4"
integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=
dependencies:
mimic-fn "^1.0.0"
opener@^1.5.1, opener@^1.5.2:
version "1.5.2"
resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598"
integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==
optionator@^0.8.1, optionator@^0.8.2:
version "0.8.3"
resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495"
integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==
dependencies:
deep-is "~0.1.3"
fast-levenshtein "~2.0.6"
levn "~0.3.0"
prelude-ls "~1.1.2"
type-check "~0.3.2"
word-wrap "~1.2.3"
os-browserify@^0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27"
integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=
os-homedir@^1.0.0, os-homedir@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M=
os-locale@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9"
integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=
dependencies:
lcid "^1.0.0"
os-locale@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2"
integrity sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==
dependencies:
execa "^0.7.0"
lcid "^1.0.0"
mem "^1.1.0"
os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
osenv@0, osenv@^0.1.4, osenv@^0.1.5:
version "0.1.5"
resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410"
integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==
dependencies:
os-homedir "^1.0.0"
os-tmpdir "^1.0.0"
p-finally@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=
p-limit@^1.1.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8"
integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==
dependencies:
p-try "^1.0.0"
p-limit@^2.0.0, p-limit@^2.2.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
dependencies:
p-try "^2.0.0"
p-locate@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=
dependencies:
p-limit "^1.1.0"
p-locate@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4"
integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==
dependencies:
p-limit "^2.0.0"
p-locate@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07"
integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==
dependencies:
p-limit "^2.2.0"
p-try@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=
p-try@^2.0.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
package-json@^4.0.0:
version "4.0.1"
resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed"
integrity sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=
dependencies:
got "^6.7.1"
registry-auth-token "^3.0.1"
registry-url "^3.0.3"
semver "^5.1.0"
pacote@^9.1.0, pacote@^9.5.12, pacote@^9.5.3:
version "9.5.12"
resolved "https://registry.yarnpkg.com/pacote/-/pacote-9.5.12.tgz#1e11dd7a8d736bcc36b375a9804d41bb0377bf66"
integrity sha512-BUIj/4kKbwWg4RtnBncXPJd15piFSVNpTzY0rysSr3VnMowTYgkGKcaHrbReepAkjTr8lH2CVWRi58Spg2CicQ==
dependencies:
bluebird "^3.5.3"
cacache "^12.0.2"
chownr "^1.1.2"
figgy-pudding "^3.5.1"
get-stream "^4.1.0"
glob "^7.1.3"
infer-owner "^1.0.4"
lru-cache "^5.1.1"
make-fetch-happen "^5.0.0"
minimatch "^3.0.4"
minipass "^2.3.5"
mississippi "^3.0.0"
mkdirp "^0.5.1"
normalize-package-data "^2.4.0"
npm-normalize-package-bin "^1.0.0"
npm-package-arg "^6.1.0"
npm-packlist "^1.1.12"
npm-pick-manifest "^3.0.0"
npm-registry-fetch "^4.0.0"
osenv "^0.1.5"
promise-inflight "^1.0.1"
promise-retry "^1.1.1"
protoduck "^5.0.1"
rimraf "^2.6.2"
safe-buffer "^5.1.2"
semver "^5.6.0"
ssri "^6.0.1"
tar "^4.4.10"
unique-filename "^1.1.1"
which "^1.3.1"
pako@~1.0.5:
version "1.0.11"
resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf"
integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==
parallel-transform@^1.1.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc"
integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==
dependencies:
cyclist "^1.0.1"
inherits "^2.0.3"
readable-stream "^2.1.5"
parse-asn1@^5.0.0, parse-asn1@^5.1.5:
version "5.1.6"
resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4"
integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==
dependencies:
asn1.js "^5.2.0"
browserify-aes "^1.0.0"
evp_bytestokey "^1.0.0"
pbkdf2 "^3.0.3"
safe-buffer "^5.1.1"
parse-json@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=
dependencies:
error-ex "^1.2.0"
parse-json@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0"
integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=
dependencies:
error-ex "^1.3.1"
json-parse-better-errors "^1.0.1"
parseurl@~1.3.3:
version "1.3.3"
resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
pascalcase@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=
path-browserify@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a"
integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==
path-dirname@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0"
integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=
path-exists@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b"
integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=
dependencies:
pinkie-promise "^2.0.0"
path-exists@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=
path-exists@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
path-is-absolute@^1.0.0, path-is-absolute@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
path-is-inside@^1.0.1, path-is-inside@^1.0.2, path-is-inside@~1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53"
integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=
path-key@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=
path-parse@^1.0.6, path-parse@^1.0.7:
version "1.0.7"
resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
path-to-regexp@0.1.7:
version "0.1.7"
resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=
path-type@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441"
integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=
dependencies:
graceful-fs "^4.1.2"
pify "^2.0.0"
pinkie-promise "^2.0.0"
path-type@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73"
integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=
dependencies:
pify "^2.0.0"
pbkdf2@^3.0.3:
version "3.1.2"
resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075"
integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==
dependencies:
create-hash "^1.1.2"
create-hmac "^1.1.4"
ripemd160 "^2.0.1"
safe-buffer "^5.0.1"
sha.js "^2.4.8"
performance-now@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=
picocolors@^0.2.1:
version "0.2.1"
resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f"
integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==
picomatch@^2.0.4, picomatch@^2.2.1:
version "2.3.1"
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
pify@^2.0.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw=
pify@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=
pify@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231"
integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==
pinkie-promise@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o=
dependencies:
pinkie "^2.0.0"
pinkie@^2.0.0:
version "2.0.4"
resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA=
pkg-dir@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4"
integrity sha1-ektQio1bstYp1EcFb/TpyTFM89Q=
dependencies:
find-up "^1.0.0"
pkg-dir@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b"
integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=
dependencies:
find-up "^2.1.0"
pluralize@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45"
integrity sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=
pluralize@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777"
integrity sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==
posix-character-classes@^0.1.0:
version "0.1.1"
resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=
postcss-calc@^5.2.0:
version "5.3.1"
resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-5.3.1.tgz#77bae7ca928ad85716e2fda42f261bf7c1d65b5e"
integrity sha1-d7rnypKK2FcW4v2kLyYb98HWW14=
dependencies:
postcss "^5.0.2"
postcss-message-helpers "^2.0.0"
reduce-css-calc "^1.2.6"
postcss-colormin@^2.1.8:
version "2.2.2"
resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-2.2.2.tgz#6631417d5f0e909a3d7ec26b24c8a8d1e4f96e4b"
integrity sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks=
dependencies:
colormin "^1.0.5"
postcss "^5.0.13"
postcss-value-parser "^3.2.3"
postcss-convert-values@^2.3.4:
version "2.6.1"
resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz#bbd8593c5c1fd2e3d1c322bb925dcae8dae4d62d"
integrity sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0=
dependencies:
postcss "^5.0.11"
postcss-value-parser "^3.1.2"
postcss-custom-properties@^8.0.10:
version "8.0.11"
resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz#2d61772d6e92f22f5e0d52602df8fae46fa30d97"
integrity sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==
dependencies:
postcss "^7.0.17"
postcss-values-parser "^2.0.1"
postcss-discard-comments@^2.0.4:
version "2.0.4"
resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz#befe89fafd5b3dace5ccce51b76b81514be00e3d"
integrity sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0=
dependencies:
postcss "^5.0.14"
postcss-discard-duplicates@^2.0.1:
version "2.1.0"
resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz#b9abf27b88ac188158a5eb12abcae20263b91932"
integrity sha1-uavye4isGIFYpesSq8riAmO5GTI=
dependencies:
postcss "^5.0.4"
postcss-discard-empty@^2.0.1:
version "2.1.0"
resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz#d2b4bd9d5ced5ebd8dcade7640c7d7cd7f4f92b5"
integrity sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU=
dependencies:
postcss "^5.0.14"
postcss-discard-overridden@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz#8b1eaf554f686fb288cd874c55667b0aa3668d58"
integrity sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg=
dependencies:
postcss "^5.0.16"
postcss-discard-unused@^2.2.1:
version "2.2.3"
resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz#bce30b2cc591ffc634322b5fb3464b6d934f4433"
integrity sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM=
dependencies:
postcss "^5.0.14"
uniqs "^2.0.0"
postcss-filter-plugins@^2.0.0:
version "2.0.3"
resolved "https://registry.yarnpkg.com/postcss-filter-plugins/-/postcss-filter-plugins-2.0.3.tgz#82245fdf82337041645e477114d8e593aa18b8ec"
integrity sha512-T53GVFsdinJhgwm7rg1BzbeBRomOg9y5MBVhGcsV0CxurUdVj1UlPdKtn7aqYA/c/QVkzKMjq2bSV5dKG5+AwQ==
dependencies:
postcss "^5.0.4"
postcss-load-config@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-1.2.0.tgz#539e9afc9ddc8620121ebf9d8c3673e0ce50d28a"
integrity sha1-U56a/J3chiASHr+djDZz4M5Q0oo=
dependencies:
cosmiconfig "^2.1.0"
object-assign "^4.1.0"
postcss-load-options "^1.2.0"
postcss-load-plugins "^2.3.0"
postcss-load-config@^2.0.0:
version "2.1.2"
resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.1.2.tgz#c5ea504f2c4aef33c7359a34de3573772ad7502a"
integrity sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==
dependencies:
cosmiconfig "^5.0.0"
import-cwd "^2.0.0"
postcss-load-options@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/postcss-load-options/-/postcss-load-options-1.2.0.tgz#b098b1559ddac2df04bc0bb375f99a5cfe2b6d8c"
integrity sha1-sJixVZ3awt8EvAuzdfmaXP4rbYw=
dependencies:
cosmiconfig "^2.1.0"
object-assign "^4.1.0"
postcss-load-plugins@^2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/postcss-load-plugins/-/postcss-load-plugins-2.3.0.tgz#745768116599aca2f009fad426b00175049d8d92"
integrity sha1-dFdoEWWZrKLwCfrUJrABdQSdjZI=
dependencies:
cosmiconfig "^2.1.1"
object-assign "^4.1.0"
postcss-loader@^2.0.5:
version "2.1.6"
resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-2.1.6.tgz#1d7dd7b17c6ba234b9bed5af13e0bea40a42d740"
integrity sha512-hgiWSc13xVQAq25cVw80CH0l49ZKlAnU1hKPOdRrNj89bokRr/bZF2nT+hebPPF9c9xs8c3gw3Fr2nxtmXYnNg==
dependencies:
loader-utils "^1.1.0"
postcss "^6.0.0"
postcss-load-config "^2.0.0"
schema-utils "^0.4.0"
postcss-merge-idents@^2.1.5:
version "2.1.7"
resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz#4c5530313c08e1d5b3bbf3d2bbc747e278eea270"
integrity sha1-TFUwMTwI4dWzu/PSu8dH4njuonA=
dependencies:
has "^1.0.1"
postcss "^5.0.10"
postcss-value-parser "^3.1.1"
postcss-merge-longhand@^2.0.1:
version "2.0.2"
resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz#23d90cd127b0a77994915332739034a1a4f3d658"
integrity sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg=
dependencies:
postcss "^5.0.4"
postcss-merge-rules@^2.0.3:
version "2.1.2"
resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz#d1df5dfaa7b1acc3be553f0e9e10e87c61b5f721"
integrity sha1-0d9d+qexrMO+VT8OnhDofGG19yE=
dependencies:
browserslist "^1.5.2"
caniuse-api "^1.5.2"
postcss "^5.0.4"
postcss-selector-parser "^2.2.2"
vendors "^1.0.0"
postcss-message-helpers@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz#a4f2f4fab6e4fe002f0aed000478cdf52f9ba60e"
integrity sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4=
postcss-minify-font-values@^1.0.2:
version "1.0.5"
resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz#4b58edb56641eba7c8474ab3526cafd7bbdecb69"
integrity sha1-S1jttWZB66fIR0qzUmyv17vey2k=
dependencies:
object-assign "^4.0.1"
postcss "^5.0.4"
postcss-value-parser "^3.0.2"
postcss-minify-gradients@^1.0.1:
version "1.0.5"
resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz#5dbda11373703f83cfb4a3ea3881d8d75ff5e6e1"
integrity sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE=
dependencies:
postcss "^5.0.12"
postcss-value-parser "^3.3.0"
postcss-minify-params@^1.0.4:
version "1.2.2"
resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz#ad2ce071373b943b3d930a3fa59a358c28d6f1f3"
integrity sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM=
dependencies:
alphanum-sort "^1.0.1"
postcss "^5.0.2"
postcss-value-parser "^3.0.2"
uniqs "^2.0.0"
postcss-minify-selectors@^2.0.4:
version "2.1.1"
resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz#b2c6a98c0072cf91b932d1a496508114311735bf"
integrity sha1-ssapjAByz5G5MtGkllCBFDEXNb8=
dependencies:
alphanum-sort "^1.0.2"
has "^1.0.1"
postcss "^5.0.14"
postcss-selector-parser "^2.0.0"
postcss-modules-extract-imports@^1.2.0:
version "1.2.1"
resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz#dc87e34148ec7eab5f791f7cd5849833375b741a"
integrity sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw==
dependencies:
postcss "^6.0.1"
postcss-modules-local-by-default@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069"
integrity sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=
dependencies:
css-selector-tokenizer "^0.7.0"
postcss "^6.0.1"
postcss-modules-scope@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90"
integrity sha1-1upkmUx5+XtipytCb75gVqGUu5A=
dependencies:
css-selector-tokenizer "^0.7.0"
postcss "^6.0.1"
postcss-modules-values@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20"
integrity sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=
dependencies:
icss-replace-symbols "^1.1.0"
postcss "^6.0.1"
postcss-normalize-charset@^1.1.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz#ef9ee71212d7fe759c78ed162f61ed62b5cb93f1"
integrity sha1-757nEhLX/nWceO0WL2HtYrXLk/E=
dependencies:
postcss "^5.0.5"
postcss-normalize-url@^3.0.7:
version "3.0.8"
resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz#108f74b3f2fcdaf891a2ffa3ea4592279fc78222"
integrity sha1-EI90s/L82viRov+j6kWSJ5/HgiI=
dependencies:
is-absolute-url "^2.0.0"
normalize-url "^1.4.0"
postcss "^5.0.14"
postcss-value-parser "^3.2.3"
postcss-ordered-values@^2.1.0:
version "2.2.3"
resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz#eec6c2a67b6c412a8db2042e77fe8da43f95c11d"
integrity sha1-7sbCpntsQSqNsgQud/6NpD+VwR0=
dependencies:
postcss "^5.0.4"
postcss-value-parser "^3.0.1"
postcss-reduce-idents@^2.2.2:
version "2.4.0"
resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz#c2c6d20cc958284f6abfbe63f7609bf409059ad3"
integrity sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM=
dependencies:
postcss "^5.0.4"
postcss-value-parser "^3.0.2"
postcss-reduce-initial@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz#68f80695f045d08263a879ad240df8dd64f644ea"
integrity sha1-aPgGlfBF0IJjqHmtJA343WT2ROo=
dependencies:
postcss "^5.0.4"
postcss-reduce-transforms@^1.0.3:
version "1.0.4"
resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz#ff76f4d8212437b31c298a42d2e1444025771ae1"
integrity sha1-/3b02CEkN7McKYpC0uFEQCV3GuE=
dependencies:
has "^1.0.1"
postcss "^5.0.8"
postcss-value-parser "^3.0.1"
postcss-selector-parser@^2.0.0, postcss-selector-parser@^2.2.2:
version "2.2.3"
resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz#f9437788606c3c9acee16ffe8d8b16297f27bb90"
integrity sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=
dependencies:
flatten "^1.0.2"
indexes-of "^1.0.1"
uniq "^1.0.1"
postcss-svgo@^2.1.1:
version "2.1.6"
resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-2.1.6.tgz#b6df18aa613b666e133f08adb5219c2684ac108d"
integrity sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0=
dependencies:
is-svg "^2.0.0"
postcss "^5.0.14"
postcss-value-parser "^3.2.3"
svgo "^0.7.0"
postcss-unique-selectors@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz#981d57d29ddcb33e7b1dfe1fd43b8649f933ca1d"
integrity sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0=
dependencies:
alphanum-sort "^1.0.1"
postcss "^5.0.4"
uniqs "^2.0.0"
postcss-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:
version "3.3.1"
resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281"
integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==
postcss-values-parser@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz#da8b472d901da1e205b47bdc98637b9e9e550e5f"
integrity sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==
dependencies:
flatten "^1.0.2"
indexes-of "^1.0.1"
uniq "^1.0.1"
postcss-zindex@^2.0.1:
version "2.2.0"
resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-2.2.0.tgz#d2109ddc055b91af67fc4cb3b025946639d2af22"
integrity sha1-0hCd3AVbka9n/EyzsCWUZjnSryI=
dependencies:
has "^1.0.1"
postcss "^5.0.4"
uniqs "^2.0.0"
postcss@^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:
version "5.2.18"
resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5"
integrity sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==
dependencies:
chalk "^1.1.3"
js-base64 "^2.1.9"
source-map "^0.5.6"
supports-color "^3.2.3"
postcss@^6.0.0, postcss@^6.0.1:
version "6.0.23"
resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324"
integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==
dependencies:
chalk "^2.4.1"
source-map "^0.6.1"
supports-color "^5.4.0"
postcss@^7.0.17:
version "7.0.39"
resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.39.tgz#9624375d965630e2e1f2c02a935c82a59cb48309"
integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==
dependencies:
picocolors "^0.2.1"
source-map "^0.6.1"
prelude-ls@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=
prepend-http@^1.0.0, prepend-http@^1.0.1:
version "1.0.4"
resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc"
integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=
private@^0.1.6, private@^0.1.8:
version "0.1.8"
resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==
process-nextick-args@~2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
process@^0.11.10:
version "0.11.10"
resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI=
progress@^1.1.8:
version "1.1.8"
resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be"
integrity sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=
progress@^2.0.0:
version "2.0.3"
resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
promise-inflight@^1.0.1, promise-inflight@~1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3"
integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM=
promise-retry@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-1.1.1.tgz#6739e968e3051da20ce6497fb2b50f6911df3d6d"
integrity sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0=
dependencies:
err-code "^1.0.0"
retry "^0.10.0"
promzard@^0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/promzard/-/promzard-0.3.0.tgz#26a5d6ee8c7dee4cb12208305acfb93ba382a9ee"
integrity sha1-JqXW7ox97kyxIggwWs+5O6OCqe4=
dependencies:
read "1"
prop-types@^15.8.1:
version "15.8.1"
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5"
integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==
dependencies:
loose-envify "^1.4.0"
object-assign "^4.1.1"
react-is "^16.13.1"
proto-list@~1.2.1:
version "1.2.4"
resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849"
integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=
protoduck@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/protoduck/-/protoduck-5.0.1.tgz#03c3659ca18007b69a50fd82a7ebcc516261151f"
integrity sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg==
dependencies:
genfun "^5.0.0"
proxy-addr@~2.0.7:
version "2.0.7"
resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025"
integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==
dependencies:
forwarded "0.2.0"
ipaddr.js "1.9.1"
prr@~1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY=
pseudomap@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM=
psl@^1.1.28:
version "1.8.0"
resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24"
integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==
public-encrypt@^4.0.0:
version "4.0.3"
resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0"
integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==
dependencies:
bn.js "^4.1.0"
browserify-rsa "^4.0.0"
create-hash "^1.1.0"
parse-asn1 "^5.0.0"
randombytes "^2.0.1"
safe-buffer "^5.1.2"
pump@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909"
integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==
dependencies:
end-of-stream "^1.1.0"
once "^1.3.1"
pump@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
dependencies:
end-of-stream "^1.1.0"
once "^1.3.1"
pumpify@^1.3.3:
version "1.5.1"
resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce"
integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==
dependencies:
duplexify "^3.6.0"
inherits "^2.0.3"
pump "^2.0.0"
punycode@1.3.2:
version "1.3.2"
resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=
punycode@^1.2.4:
version "1.4.1"
resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
integrity sha1-wNWmOycYgArY4esPpSachN1BhF4=
punycode@^2.1.0, punycode@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
q@^1.1.2:
version "1.5.1"
resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7"
integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=
qrcode-terminal@^0.12.0:
version "0.12.0"
resolved "https://registry.yarnpkg.com/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz#bb5b699ef7f9f0505092a3748be4464fe71b5819"
integrity sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ==
qs@6.9.7:
version "6.9.7"
resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.7.tgz#4610846871485e1e048f44ae3b94033f0e675afe"
integrity sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==
qs@~6.5.2:
version "6.5.3"
resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad"
integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==
query-string@^4.1.0:
version "4.3.4"
resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb"
integrity sha1-u7aTucqRXCMlFbIosaArYJBD2+s=
dependencies:
object-assign "^4.1.0"
strict-uri-encode "^1.0.0"
query-string@^6.8.2:
version "6.14.1"
resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.14.1.tgz#7ac2dca46da7f309449ba0f86b1fd28255b0c86a"
integrity sha512-XDxAeVmpfu1/6IjyT/gXHOl+S0vQ9owggJ30hhWKdHAsNPOcasn5o9BW0eejZqL2e4vMjhAxoW3jVHcD6mbcYw==
dependencies:
decode-uri-component "^0.2.0"
filter-obj "^1.1.0"
split-on-first "^1.0.0"
strict-uri-encode "^2.0.0"
querystring-es3@^0.2.0:
version "0.2.1"
resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73"
integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=
querystring@0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=
qw@~1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/qw/-/qw-1.0.2.tgz#0c31a6f810320a91c58b05198679427103b03c4a"
integrity sha512-1PhZ/iLKwlVNq45dnerTMKFjMof49uqli7/0QsvPNbX5OJ3IZ8msa9lUpvPheVdP+IYYPrf6cOaVil7S35joVA==
randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5:
version "2.1.0"
resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==
dependencies:
safe-buffer "^5.1.0"
randomfill@^1.0.3:
version "1.0.4"
resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458"
integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==
dependencies:
randombytes "^2.0.5"
safe-buffer "^5.1.0"
range-parser@~1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
raw-body@2.4.3:
version "2.4.3"
resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.3.tgz#8f80305d11c2a0a545c2d9d89d7a0286fcead43c"
integrity sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==
dependencies:
bytes "3.1.2"
http-errors "1.8.1"
iconv-lite "0.4.24"
unpipe "1.0.0"
raw-loader@~0.5.1:
version "0.5.1"
resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-0.5.1.tgz#0c3d0beaed8a01c966d9787bf778281252a979aa"
integrity sha1-DD0L6u2KAclm2Xh793goElKpeao=
rc@^1.0.1, rc@^1.1.6:
version "1.2.8"
resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==
dependencies:
deep-extend "^0.6.0"
ini "~1.3.0"
minimist "^1.2.0"
strip-json-comments "~2.0.1"
react-is@^16.13.1:
version "16.13.1"
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
read-cmd-shim@^1.0.1, read-cmd-shim@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-1.0.5.tgz#87e43eba50098ba5a32d0ceb583ab8e43b961c16"
integrity sha512-v5yCqQ/7okKoZZkBQUAfTsQ3sVJtXdNfbPnI5cceppoxEVLYA3k+VtV2omkeo8MS94JCy4fSiUwlRBAwCVRPUA==
dependencies:
graceful-fs "^4.1.2"
read-installed@~4.0.3:
version "4.0.3"
resolved "https://registry.yarnpkg.com/read-installed/-/read-installed-4.0.3.tgz#ff9b8b67f187d1e4c29b9feb31f6b223acd19067"
integrity sha1-/5uLZ/GH0eTCm5/rMfayI6zRkGc=
dependencies:
debuglog "^1.0.1"
read-package-json "^2.0.0"
readdir-scoped-modules "^1.0.0"
semver "2 || 3 || 4 || 5"
slide "~1.1.3"
util-extend "^1.0.1"
optionalDependencies:
graceful-fs "^4.1.2"
"read-package-json@1 || 2", read-package-json@^2.0.0, read-package-json@^2.0.13, read-package-json@^2.1.1:
version "2.1.2"
resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-2.1.2.tgz#6992b2b66c7177259feb8eaac73c3acd28b9222a"
integrity sha512-D1KmuLQr6ZSJS0tW8hf3WGpRlwszJOXZ3E8Yd/DNRaM5d+1wVRZdHlpGBLAuovjr28LbWvjpWkBHMxpRGGjzNA==
dependencies:
glob "^7.1.1"
json-parse-even-better-errors "^2.3.0"
normalize-package-data "^2.0.0"
npm-normalize-package-bin "^1.0.0"
read-package-tree@^5.3.1:
version "5.3.1"
resolved "https://registry.yarnpkg.com/read-package-tree/-/read-package-tree-5.3.1.tgz#a32cb64c7f31eb8a6f31ef06f9cedf74068fe636"
integrity sha512-mLUDsD5JVtlZxjSlPPx1RETkNjjvQYuweKwNVt1Sn8kP5Jh44pvYuUHCp6xSVDZWbNxVxG5lyZJ921aJH61sTw==
dependencies:
read-package-json "^2.0.0"
readdir-scoped-modules "^1.0.0"
util-promisify "^2.1.0"
read-pkg-up@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02"
integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=
dependencies:
find-up "^1.0.0"
read-pkg "^1.0.0"
read-pkg-up@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be"
integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=
dependencies:
find-up "^2.0.0"
read-pkg "^2.0.0"
read-pkg@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28"
integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=
dependencies:
load-json-file "^1.0.0"
normalize-package-data "^2.3.2"
path-type "^1.0.0"
read-pkg@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8"
integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=
dependencies:
load-json-file "^2.0.0"
normalize-package-data "^2.3.2"
path-type "^2.0.0"
read@1, read@~1.0.1, read@~1.0.7:
version "1.0.7"
resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4"
integrity sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=
dependencies:
mute-stream "~0.0.4"
"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, 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:
version "2.3.7"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57"
integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==
dependencies:
core-util-is "~1.0.0"
inherits "~2.0.3"
isarray "~1.0.0"
process-nextick-args "~2.0.0"
safe-buffer "~5.1.1"
string_decoder "~1.1.1"
util-deprecate "~1.0.1"
readable-stream@^3.6.0:
version "3.6.0"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
dependencies:
inherits "^2.0.3"
string_decoder "^1.1.1"
util-deprecate "^1.0.1"
readable-stream@~1.1.10:
version "1.1.14"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9"
integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk=
dependencies:
core-util-is "~1.0.0"
inherits "~2.0.1"
isarray "0.0.1"
string_decoder "~0.10.x"
readdir-scoped-modules@^1.0.0, readdir-scoped-modules@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz#8d45407b4f870a0dcaebc0e28670d18e74514309"
integrity sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==
dependencies:
debuglog "^1.0.1"
dezalgo "^1.0.0"
graceful-fs "^4.1.2"
once "^1.3.0"
readdirp@^2.2.1:
version "2.2.1"
resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525"
integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==
dependencies:
graceful-fs "^4.1.11"
micromatch "^3.1.10"
readable-stream "^2.0.2"
readdirp@~3.6.0:
version "3.6.0"
resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==
dependencies:
picomatch "^2.2.1"
readline2@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35"
integrity sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=
dependencies:
code-point-at "^1.0.0"
is-fullwidth-code-point "^1.0.0"
mute-stream "0.0.5"
redent@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde"
integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=
dependencies:
indent-string "^2.1.0"
strip-indent "^1.0.1"
reduce-css-calc@^1.2.6:
version "1.3.0"
resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz#747c914e049614a4c9cfbba629871ad1d2927716"
integrity sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=
dependencies:
balanced-match "^0.4.2"
math-expression-evaluator "^1.2.14"
reduce-function-call "^1.0.1"
reduce-function-call@^1.0.1:
version "1.0.3"
resolved "https://registry.yarnpkg.com/reduce-function-call/-/reduce-function-call-1.0.3.tgz#60350f7fb252c0a67eb10fd4694d16909971300f"
integrity sha512-Hl/tuV2VDgWgCSEeWMLwxLZqX7OK59eU1guxXsRKTAyeYimivsKdtcV4fu3r710tpG5GmDKDhQ0HSZLExnNmyQ==
dependencies:
balanced-match "^1.0.0"
regenerate@^1.2.1:
version "1.4.2"
resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a"
integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==
regenerator-runtime@^0.11.0:
version "0.11.1"
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==
regenerator-transform@^0.10.0:
version "0.10.1"
resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd"
integrity sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==
dependencies:
babel-runtime "^6.18.0"
babel-types "^6.19.0"
private "^0.1.6"
regex-not@^1.0.0, regex-not@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c"
integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==
dependencies:
extend-shallow "^3.0.2"
safe-regex "^1.1.0"
regex-parser@^2.2.9:
version "2.2.11"
resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.11.tgz#3b37ec9049e19479806e878cabe7c1ca83ccfe58"
integrity sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==
regexp.prototype.flags@^1.4.1:
version "1.4.1"
resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.1.tgz#b3f4c0059af9e47eca9f3f660e51d81307e72307"
integrity sha512-pMR7hBVUUGI7PMA37m2ofIdQCsomVnas+Jn5UPGAHQ+/LlwKm/aTLJHdasmHRzlfeZwHiAOaRSo2rbBDm3nNUQ==
dependencies:
call-bind "^1.0.2"
define-properties "^1.1.3"
regexpp@^1.0.1:
version "1.1.0"
resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-1.1.0.tgz#0e3516dd0b7904f413d2d4193dce4618c3a689ab"
integrity sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==
regexpu-core@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240"
integrity sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=
dependencies:
regenerate "^1.2.1"
regjsgen "^0.2.0"
regjsparser "^0.1.4"
registry-auth-token@^3.0.1:
version "3.4.0"
resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.4.0.tgz#d7446815433f5d5ed6431cd5dca21048f66b397e"
integrity sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==
dependencies:
rc "^1.1.6"
safe-buffer "^5.0.1"
registry-url@^3.0.3:
version "3.1.0"
resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942"
integrity sha1-PU74cPc93h138M+aOBQyRE4XSUI=
dependencies:
rc "^1.0.1"
regjsgen@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7"
integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=
regjsparser@^0.1.4:
version "0.1.5"
resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c"
integrity sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=
dependencies:
jsesc "~0.5.0"
remove-trailing-separator@^1.0.1:
version "1.1.0"
resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8=
repeat-element@^1.1.2:
version "1.1.4"
resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9"
integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==
repeat-string@^1.5.2, repeat-string@^1.6.1:
version "1.6.1"
resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc=
repeating@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda"
integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=
dependencies:
is-finite "^1.0.0"
request@^2.87.0, request@^2.88.0:
version "2.88.2"
resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3"
integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==
dependencies:
aws-sign2 "~0.7.0"
aws4 "^1.8.0"
caseless "~0.12.0"
combined-stream "~1.0.6"
extend "~3.0.2"
forever-agent "~0.6.1"
form-data "~2.3.2"
har-validator "~5.1.3"
http-signature "~1.2.0"
is-typedarray "~1.0.0"
isstream "~0.1.2"
json-stringify-safe "~5.0.1"
mime-types "~2.1.19"
oauth-sign "~0.9.0"
performance-now "^2.1.0"
qs "~6.5.2"
safe-buffer "^5.1.2"
tough-cookie "~2.5.0"
tunnel-agent "^0.6.0"
uuid "^3.3.2"
require-directory@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I=
require-from-string@^1.1.0:
version "1.2.1"
resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-1.2.1.tgz#529c9ccef27380adfec9a2f965b649bbee636418"
integrity sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=
require-main-filename@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=
require-main-filename@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b"
integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==
require-uncached@^1.0.2, require-uncached@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3"
integrity sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=
dependencies:
caller-path "^0.1.0"
resolve-from "^1.0.0"
requirejs@^2.3.6:
version "2.3.6"
resolved "https://registry.yarnpkg.com/requirejs/-/requirejs-2.3.6.tgz#e5093d9601c2829251258c0b9445d4d19fa9e7c9"
integrity sha512-ipEzlWQe6RK3jkzikgCupiTbTvm4S0/CAU5GlgptkN5SO6F3u0UD0K18wy6ErDqiCyP4J4YYe1HuAShvsxePLg==
resolve-from@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226"
integrity sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=
resolve-from@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748"
integrity sha1-six699nWiBvItuZTM17rywoYh0g=
resolve-from@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
resolve-url-loader@^2.0.2:
version "2.3.2"
resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-2.3.2.tgz#83bb9ebc392b66c563795eef22f078970357a26e"
integrity sha512-sc/UVgiADdoTc+4cGPB7cUCnlEkzlxD1NXHw4oa9qA0fp30H8mAQ2ePJBP9MQ029DUuhEPouhNdvzT37pBCV0g==
dependencies:
adjust-sourcemap-loader "^1.1.0"
camelcase "^4.1.0"
convert-source-map "^1.5.1"
loader-utils "^1.1.0"
lodash.defaults "^4.0.0"
rework "^1.0.1"
rework-visit "^1.0.0"
source-map "^0.5.7"
urix "^0.1.0"
resolve-url@^0.2.1:
version "0.2.1"
resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
resolve@^1.10.0, resolve@^1.20.0:
version "1.22.0"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198"
integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==
dependencies:
is-core-module "^2.8.1"
path-parse "^1.0.7"
supports-preserve-symlinks-flag "^1.0.0"
resolve@^2.0.0-next.3:
version "2.0.0-next.3"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.3.tgz#d41016293d4a8586a39ca5d9b5f15cbea1f55e46"
integrity sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==
dependencies:
is-core-module "^2.2.0"
path-parse "^1.0.6"
restore-cursor@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541"
integrity sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=
dependencies:
exit-hook "^1.0.0"
onetime "^1.0.0"
restore-cursor@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf"
integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368=
dependencies:
onetime "^2.0.0"
signal-exit "^3.0.2"
ret@~0.1.10:
version "0.1.15"
resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==
retry@^0.10.0:
version "0.10.1"
resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4"
integrity sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=
retry@^0.12.0:
version "0.12.0"
resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b"
integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=
rework-visit@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/rework-visit/-/rework-visit-1.0.0.tgz#9945b2803f219e2f7aca00adb8bc9f640f842c9a"
integrity sha1-mUWygD8hni96ygCtuLyfZA+ELJo=
rework@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/rework/-/rework-1.0.1.tgz#30806a841342b54510aa4110850cd48534144aa7"
integrity sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc=
dependencies:
convert-source-map "^0.3.3"
css "^2.0.0"
right-align@^0.1.1:
version "0.1.3"
resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef"
integrity sha1-YTObci/mo1FWiSENJOFMlhSGE+8=
dependencies:
align-text "^0.1.1"
rimraf@2, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3, rimraf@^2.7.1:
version "2.7.1"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==
dependencies:
glob "^7.1.3"
rimraf@~2.6.2:
version "2.6.3"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab"
integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==
dependencies:
glob "^7.1.3"
ripemd160@^2.0.0, ripemd160@^2.0.1:
version "2.0.2"
resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c"
integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==
dependencies:
hash-base "^3.0.0"
inherits "^2.0.1"
run-async@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389"
integrity sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=
dependencies:
once "^1.3.0"
run-async@^2.2.0:
version "2.4.1"
resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455"
integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==
run-queue@^1.0.0, run-queue@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47"
integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=
dependencies:
aproba "^1.1.1"
rx-lite-aggregates@^4.0.8:
version "4.0.8"
resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be"
integrity sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=
dependencies:
rx-lite "*"
rx-lite@*, rx-lite@^4.0.8:
version "4.0.8"
resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444"
integrity sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=
rx-lite@^3.1.2:
version "3.1.2"
resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102"
integrity sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=
safe-buffer@5.2.1, safe-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.1, safe-buffer@~5.2.0:
version "5.2.1"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
safe-buffer@~5.1.0, safe-buffer@~5.1.1:
version "5.1.2"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
safe-regex@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4=
dependencies:
ret "~0.1.10"
"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
version "2.1.2"
resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
sass-graph@2.2.5:
version "2.2.5"
resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.5.tgz#a981c87446b8319d96dce0671e487879bd24c2e8"
integrity sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag==
dependencies:
glob "^7.0.0"
lodash "^4.0.0"
scss-tokenizer "^0.2.3"
yargs "^13.3.2"
sass-lint@^1.11.1:
version "1.13.1"
resolved "https://registry.yarnpkg.com/sass-lint/-/sass-lint-1.13.1.tgz#5fd2b2792e9215272335eb0f0dc607f61e8acc8f"
integrity sha512-DSyah8/MyjzW2BWYmQWekYEKir44BpLqrCFsgs9iaWiVTcwZfwXHF586hh3D1n+/9ihUNMfd8iHAyb9KkGgs7Q==
dependencies:
commander "^2.8.1"
eslint "^2.7.0"
front-matter "2.1.2"
fs-extra "^3.0.1"
glob "^7.0.0"
globule "^1.0.0"
gonzales-pe-sl "^4.2.3"
js-yaml "^3.5.4"
known-css-properties "^0.3.0"
lodash.capitalize "^4.1.0"
lodash.kebabcase "^4.0.0"
merge "^1.2.0"
path-is-absolute "^1.0.0"
util "^0.10.3"
sass-loader@^6.0.5:
version "6.0.7"
resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-6.0.7.tgz#dd2fdb3e7eeff4a53f35ba6ac408715488353d00"
integrity sha512-JoiyD00Yo1o61OJsoP2s2kb19L1/Y2p3QFcCdWdF6oomBGKVYuZyqHWemRBfQ2uGYsk+CH3eCguXNfpjzlcpaA==
dependencies:
clone-deep "^2.0.1"
loader-utils "^1.0.1"
lodash.tail "^4.1.1"
neo-async "^2.5.0"
pify "^3.0.0"
sax@~1.2.1:
version "1.2.4"
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
schema-utils@^0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.3.0.tgz#f5877222ce3e931edae039f17eb3716e7137f8cf"
integrity sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=
dependencies:
ajv "^5.0.0"
schema-utils@^0.4.0:
version "0.4.7"
resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.7.tgz#ba74f597d2be2ea880131746ee17d0a093c68187"
integrity sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==
dependencies:
ajv "^6.1.0"
ajv-keywords "^3.1.0"
script-loader@^0.7.0:
version "0.7.2"
resolved "https://registry.yarnpkg.com/script-loader/-/script-loader-0.7.2.tgz#2016db6f86f25f5cf56da38915d83378bb166ba7"
integrity sha512-UMNLEvgOAQuzK8ji8qIscM3GIrRCWN6MmMXGD4SD5l6cSycgGsCo0tX5xRnfQcoghqct0tjHjcykgI1PyBE2aA==
dependencies:
raw-loader "~0.5.1"
scss-tokenizer@^0.2.3:
version "0.2.3"
resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1"
integrity sha1-jrBtualyMzOCTT9VMGQRSYR85dE=
dependencies:
js-base64 "^2.1.8"
source-map "^0.4.2"
semver-diff@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36"
integrity sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=
dependencies:
semver "^5.0.3"
"semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", "semver@^2.3.0 || 3.x || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.1, semver@^5.6.0, semver@^5.7.1:
version "5.7.1"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
semver@^6.3.0:
version "6.3.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
semver@~5.3.0:
version "5.3.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f"
integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8=
send@0.17.2:
version "0.17.2"
resolved "https://registry.yarnpkg.com/send/-/send-0.17.2.tgz#926622f76601c41808012c8bf1688fe3906f7820"
integrity sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==
dependencies:
debug "2.6.9"
depd "~1.1.2"
destroy "~1.0.4"
encodeurl "~1.0.2"
escape-html "~1.0.3"
etag "~1.8.1"
fresh "0.5.2"
http-errors "1.8.1"
mime "1.6.0"
ms "2.1.3"
on-finished "~2.3.0"
range-parser "~1.2.1"
statuses "~1.5.0"
serve-static@1.14.2:
version "1.14.2"
resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.2.tgz#722d6294b1d62626d41b43a013ece4598d292bfa"
integrity sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==
dependencies:
encodeurl "~1.0.2"
escape-html "~1.0.3"
parseurl "~1.3.3"
send "0.17.2"
set-blocking@^2.0.0, set-blocking@~2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc=
set-value@^2.0.0, set-value@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b"
integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==
dependencies:
extend-shallow "^2.0.1"
is-extendable "^0.1.1"
is-plain-object "^2.0.3"
split-string "^3.0.1"
setimmediate@^1.0.4:
version "1.0.5"
resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=
setprototypeof@1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424"
integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==
sha.js@^2.4.0, sha.js@^2.4.8:
version "2.4.11"
resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7"
integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==
dependencies:
inherits "^2.0.1"
safe-buffer "^5.0.1"
sha@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/sha/-/sha-3.0.0.tgz#b2f2f90af690c16a3a839a6a6c680ea51fedd1ae"
integrity sha512-DOYnM37cNsLNSGIG/zZWch5CKIRNoLdYUQTQlcgkRkoYIUwDYjqDyye16YcDZg/OPdcbUgTKMjc4SY6TB7ZAPw==
dependencies:
graceful-fs "^4.1.2"
shallow-clone@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-1.0.0.tgz#4480cd06e882ef68b2ad88a3ea54832e2c48b571"
integrity sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA==
dependencies:
is-extendable "^0.1.1"
kind-of "^5.0.0"
mixin-object "^2.0.1"
shebang-command@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=
dependencies:
shebang-regex "^1.0.0"
shebang-regex@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=
shelljs@^0.6.0:
version "0.6.1"
resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.6.1.tgz#ec6211bed1920442088fe0f70b2837232ed2c8a8"
integrity sha1-7GIRvtGSBEIIj+D3Cyg3Iy7SyKg=
side-channel@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf"
integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==
dependencies:
call-bind "^1.0.0"
get-intrinsic "^1.0.2"
object-inspect "^1.9.0"
signal-exit@^3.0.0, signal-exit@^3.0.2:
version "3.0.7"
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
slash@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=
slice-ansi@0.0.4:
version "0.0.4"
resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35"
integrity sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=
slice-ansi@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d"
integrity sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==
dependencies:
is-fullwidth-code-point "^2.0.0"
slide@^1.1.6, slide@~1.1.3, slide@~1.1.6:
version "1.1.6"
resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707"
integrity sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=
smart-buffer@^4.1.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae"
integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==
snapdragon-node@^2.0.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==
dependencies:
define-property "^1.0.0"
isobject "^3.0.0"
snapdragon-util "^3.0.1"
snapdragon-util@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2"
integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==
dependencies:
kind-of "^3.2.0"
snapdragon@^0.8.1:
version "0.8.2"
resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d"
integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==
dependencies:
base "^0.11.1"
debug "^2.2.0"
define-property "^0.2.5"
extend-shallow "^2.0.1"
map-cache "^0.2.2"
source-map "^0.5.6"
source-map-resolve "^0.5.0"
use "^3.1.0"
socks-proxy-agent@^4.0.0:
version "4.0.2"
resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz#3c8991f3145b2799e70e11bd5fbc8b1963116386"
integrity sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==
dependencies:
agent-base "~4.2.1"
socks "~2.3.2"
socks@~2.3.2:
version "2.3.3"
resolved "https://registry.yarnpkg.com/socks/-/socks-2.3.3.tgz#01129f0a5d534d2b897712ed8aceab7ee65d78e3"
integrity sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==
dependencies:
ip "1.1.5"
smart-buffer "^4.1.0"
sort-keys@^1.0.0:
version "1.1.2"
resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad"
integrity sha1-RBttTTRnmPG05J6JIK37oOVD+a0=
dependencies:
is-plain-obj "^1.0.0"
sorted-object@~2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/sorted-object/-/sorted-object-2.0.1.tgz#7d631f4bd3a798a24af1dffcfbfe83337a5df5fc"
integrity sha1-fWMfS9OnmKJK8d/8+/6DM3pd9fw=
sorted-union-stream@~2.1.3:
version "2.1.3"
resolved "https://registry.yarnpkg.com/sorted-union-stream/-/sorted-union-stream-2.1.3.tgz#c7794c7e077880052ff71a8d4a2dbb4a9a638ac7"
integrity sha1-x3lMfgd4gAUv9xqNSi27Sppjisc=
dependencies:
from2 "^1.3.0"
stream-iterate "^1.1.0"
source-list-map@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34"
integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==
source-map-resolve@^0.5.0, source-map-resolve@^0.5.2:
version "0.5.3"
resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a"
integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==
dependencies:
atob "^2.1.2"
decode-uri-component "^0.2.0"
resolve-url "^0.2.1"
source-map-url "^0.4.0"
urix "^0.1.0"
source-map-support@^0.4.15:
version "0.4.18"
resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f"
integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==
dependencies:
source-map "^0.5.6"
source-map-url@^0.4.0:
version "0.4.1"
resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56"
integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==
source-map@0.1.x:
version "0.1.43"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346"
integrity sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=
dependencies:
amdefine ">=0.0.4"
source-map@^0.4.2:
version "0.4.4"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b"
integrity sha1-66T12pwNyZneaAMti092FzZSA2s=
dependencies:
amdefine ">=0.0.4"
source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1:
version "0.5.7"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
source-map@^0.6.1, source-map@~0.6.1:
version "0.6.1"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
spdx-correct@^3.0.0:
version "3.1.1"
resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9"
integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==
dependencies:
spdx-expression-parse "^3.0.0"
spdx-license-ids "^3.0.0"
spdx-exceptions@^2.1.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d"
integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==
spdx-expression-parse@^3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679"
integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==
dependencies:
spdx-exceptions "^2.1.0"
spdx-license-ids "^3.0.0"
spdx-license-ids@^3.0.0:
version "3.0.11"
resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz#50c0d8c40a14ec1bf449bae69a0ea4685a9d9f95"
integrity sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==
split-on-first@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f"
integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==
split-string@^3.0.1, split-string@^3.0.2:
version "3.1.0"
resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==
dependencies:
extend-shallow "^3.0.0"
sprintf-js@~1.0.2:
version "1.0.3"
resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
sshpk@^1.7.0:
version "1.17.0"
resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5"
integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==
dependencies:
asn1 "~0.2.3"
assert-plus "^1.0.0"
bcrypt-pbkdf "^1.0.0"
dashdash "^1.12.0"
ecc-jsbn "~0.1.1"
getpass "^0.1.1"
jsbn "~0.1.0"
safer-buffer "^2.0.2"
tweetnacl "~0.14.0"
ssri@^6.0.0, ssri@^6.0.1, ssri@^6.0.2:
version "6.0.2"
resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.2.tgz#157939134f20464e7301ddba3e90ffa8f7728ac5"
integrity sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==
dependencies:
figgy-pudding "^3.5.1"
static-extend@^0.1.1:
version "0.1.2"
resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=
dependencies:
define-property "^0.2.5"
object-copy "^0.1.0"
"statuses@>= 1.5.0 < 2", statuses@~1.5.0:
version "1.5.0"
resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=
stdout-stream@^1.4.0:
version "1.4.1"
resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.1.tgz#5ac174cdd5cd726104aa0c0b2bd83815d8d535de"
integrity sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==
dependencies:
readable-stream "^2.0.1"
stream-browserify@^2.0.1:
version "2.0.2"
resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b"
integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==
dependencies:
inherits "~2.0.1"
readable-stream "^2.0.2"
stream-each@^1.1.0:
version "1.2.3"
resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae"
integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==
dependencies:
end-of-stream "^1.1.0"
stream-shift "^1.0.0"
stream-http@^2.7.2:
version "2.8.3"
resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc"
integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==
dependencies:
builtin-status-codes "^3.0.0"
inherits "^2.0.1"
readable-stream "^2.3.6"
to-arraybuffer "^1.0.0"
xtend "^4.0.0"
stream-iterate@^1.1.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/stream-iterate/-/stream-iterate-1.2.0.tgz#2bd7c77296c1702a46488b8ad41f79865eecd4e1"
integrity sha1-K9fHcpbBcCpGSIuK1B95hl7s1OE=
dependencies:
readable-stream "^2.1.5"
stream-shift "^1.0.0"
stream-shift@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d"
integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==
strict-uri-encode@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=
strict-uri-encode@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546"
integrity sha1-ucczDHBChi9rFC3CdLvMWGbONUY=
string-width@^1.0.1, string-width@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=
dependencies:
code-point-at "^1.0.0"
is-fullwidth-code-point "^1.0.0"
strip-ansi "^3.0.0"
"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0:
version "4.2.3"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
dependencies:
emoji-regex "^8.0.0"
is-fullwidth-code-point "^3.0.0"
strip-ansi "^6.0.1"
string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==
dependencies:
is-fullwidth-code-point "^2.0.0"
strip-ansi "^4.0.0"
string-width@^3.0.0, string-width@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961"
integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==
dependencies:
emoji-regex "^7.0.1"
is-fullwidth-code-point "^2.0.0"
strip-ansi "^5.1.0"
string.prototype.matchall@^4.0.6:
version "4.0.7"
resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz#8e6ecb0d8a1fb1fda470d81acecb2dba057a481d"
integrity sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==
dependencies:
call-bind "^1.0.2"
define-properties "^1.1.3"
es-abstract "^1.19.1"
get-intrinsic "^1.1.1"
has-symbols "^1.0.3"
internal-slot "^1.0.3"
regexp.prototype.flags "^1.4.1"
side-channel "^1.0.4"
string.prototype.trimend@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80"
integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==
dependencies:
call-bind "^1.0.2"
define-properties "^1.1.3"
string.prototype.trimstart@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed"
integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==
dependencies:
call-bind "^1.0.2"
define-properties "^1.1.3"
string_decoder@^1.0.0, string_decoder@^1.1.1:
version "1.3.0"
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
dependencies:
safe-buffer "~5.2.0"
string_decoder@~0.10.x:
version "0.10.31"
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=
string_decoder@~1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
dependencies:
safe-buffer "~5.1.0"
stringify-package@^1.0.0, stringify-package@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/stringify-package/-/stringify-package-1.0.1.tgz#e5aa3643e7f74d0f28628b72f3dad5cecfc3ba85"
integrity sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg==
strip-ansi@^3.0.0, strip-ansi@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=
dependencies:
ansi-regex "^2.0.0"
strip-ansi@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8=
dependencies:
ansi-regex "^3.0.0"
strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae"
integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==
dependencies:
ansi-regex "^4.1.0"
strip-ansi@^6.0.0, strip-ansi@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
dependencies:
ansi-regex "^5.0.1"
strip-bom@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e"
integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=
dependencies:
is-utf8 "^0.2.0"
strip-bom@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=
strip-eof@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=
strip-indent@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2"
integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=
dependencies:
get-stdin "^4.0.1"
strip-json-comments@~1.0.1:
version "1.0.4"
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91"
integrity sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=
strip-json-comments@~2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
supports-color@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=
supports-color@^3.1.0, supports-color@^3.2.3:
version "3.2.3"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6"
integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=
dependencies:
has-flag "^1.0.0"
supports-color@^5.3.0, supports-color@^5.4.0:
version "5.5.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
dependencies:
has-flag "^3.0.0"
supports-preserve-symlinks-flag@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
svgo@^0.7.0:
version "0.7.2"
resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5"
integrity sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U=
dependencies:
coa "~1.0.1"
colors "~1.1.2"
csso "~2.3.1"
js-yaml "~3.7.0"
mkdirp "~0.5.1"
sax "~1.2.1"
whet.extend "~0.9.9"
table@4.0.2:
version "4.0.2"
resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36"
integrity sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==
dependencies:
ajv "^5.2.3"
ajv-keywords "^2.1.0"
chalk "^2.1.0"
lodash "^4.17.4"
slice-ansi "1.0.0"
string-width "^2.1.1"
table@^3.7.8:
version "3.8.3"
resolved "https://registry.yarnpkg.com/table/-/table-3.8.3.tgz#2bbc542f0fda9861a755d3947fefd8b3f513855f"
integrity sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=
dependencies:
ajv "^4.7.0"
ajv-keywords "^1.0.0"
chalk "^1.1.1"
lodash "^4.0.0"
slice-ansi "0.0.4"
string-width "^2.0.0"
tapable@^0.2.7, tapable@~0.2.5:
version "0.2.9"
resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.9.tgz#af2d8bbc9b04f74ee17af2b4d9048f807acd18a8"
integrity sha512-2wsvQ+4GwBvLPLWsNfLCDYGsW6xb7aeC6utq2Qh0PFwgEy7K7dsma9Jsmb2zSQj7GvYAyUGSntLtsv++GmgL1A==
tar@^2.0.0:
version "2.2.2"
resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.2.tgz#0ca8848562c7299b8b446ff6a4d60cdbb23edc40"
integrity sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==
dependencies:
block-stream "*"
fstream "^1.0.12"
inherits "2"
tar@^4.4.10, tar@^4.4.12, tar@^4.4.19:
version "4.4.19"
resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.19.tgz#2e4d7263df26f2b914dee10c825ab132123742f3"
integrity sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==
dependencies:
chownr "^1.1.4"
fs-minipass "^1.2.7"
minipass "^2.9.0"
minizlib "^1.3.3"
mkdirp "^0.5.5"
safe-buffer "^5.2.1"
yallist "^3.1.1"
term-size@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69"
integrity sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=
dependencies:
execa "^0.7.0"
text-table@~0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=
through2@^2.0.0:
version "2.0.5"
resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd"
integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==
dependencies:
readable-stream "~2.3.6"
xtend "~4.0.1"
"through@>=2.2.7 <3", through@^2.3.6:
version "2.3.8"
resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
timed-out@^4.0.0:
version "4.0.1"
resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f"
integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=
timers-browserify@^2.0.4:
version "2.0.12"
resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee"
integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==
dependencies:
setimmediate "^1.0.4"
tiny-relative-date@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/tiny-relative-date/-/tiny-relative-date-1.3.0.tgz#fa08aad501ed730f31cc043181d995c39a935e07"
integrity sha512-MOQHpzllWxDCHHaDno30hhLfbouoYlOI8YlMNtvKe1zXbjEVhbcEovQxvZrPvtiYW630GQDoMMarCnjfyfHA+A==
tmp@^0.0.33:
version "0.0.33"
resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==
dependencies:
os-tmpdir "~1.0.2"
to-arraybuffer@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=
to-fast-properties@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47"
integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=
to-object-path@^0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af"
integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=
dependencies:
kind-of "^3.0.2"
to-regex-range@^2.1.0:
version "2.1.1"
resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38"
integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=
dependencies:
is-number "^3.0.0"
repeat-string "^1.6.1"
to-regex-range@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
dependencies:
is-number "^7.0.0"
to-regex@^3.0.1, to-regex@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce"
integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==
dependencies:
define-property "^2.0.2"
extend-shallow "^3.0.2"
regex-not "^1.0.2"
safe-regex "^1.1.0"
toidentifier@1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35"
integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==
tough-cookie@~2.5.0:
version "2.5.0"
resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2"
integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==
dependencies:
psl "^1.1.28"
punycode "^2.1.1"
trim-newlines@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613"
integrity sha1-WIeWa7WCpFA6QetST301ARgVphM=
trim-right@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=
"true-case-path@^1.0.2":
version "1.0.3"
resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.3.tgz#f813b5a8c86b40da59606722b144e3225799f47d"
integrity sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==
dependencies:
glob "^7.1.2"
tryer@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8"
integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==
tsconfig-paths@^3.12.0:
version "3.14.1"
resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a"
integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==
dependencies:
"@types/json5" "^0.0.29"
json5 "^1.0.1"
minimist "^1.2.6"
strip-bom "^3.0.0"
tty-browserify@0.0.0:
version "0.0.0"
resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6"
integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=
tunnel-agent@^0.6.0:
version "0.6.0"
resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=
dependencies:
safe-buffer "^5.0.1"
tweetnacl@^0.14.3, tweetnacl@~0.14.0:
version "0.14.5"
resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=
type-check@~0.3.2:
version "0.3.2"
resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=
dependencies:
prelude-ls "~1.1.2"
type-is@~1.6.18:
version "1.6.18"
resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==
dependencies:
media-typer "0.3.0"
mime-types "~2.1.24"
type@^1.0.1:
version "1.2.0"
resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0"
integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==
type@^2.5.0:
version "2.6.0"
resolved "https://registry.yarnpkg.com/type/-/type-2.6.0.tgz#3ca6099af5981d36ca86b78442973694278a219f"
integrity sha512-eiDBDOmkih5pMbo9OqsqPRGMljLodLcwd5XD5JbtNB0o89xZAwynY9EdCDsJU7LtcVCClu9DvM7/0Ep1hYX3EQ==
typedarray@^0.0.6:
version "0.0.6"
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
uc.micro@^1.0.1, uc.micro@^1.0.5:
version "1.0.6"
resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac"
integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==
uglify-js@^2.8.27:
version "2.8.29"
resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd"
integrity sha1-KcVzMUgFe7Th913zW3qcty5qWd0=
dependencies:
source-map "~0.5.1"
yargs "~3.10.0"
optionalDependencies:
uglify-to-browserify "~1.0.0"
uglify-to-browserify@~1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7"
integrity sha1-bgkk1r2mta/jSeOabWMoUKD4grc=
uid-number@0.0.6:
version "0.0.6"
resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81"
integrity sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=
umask@^1.1.0, umask@~1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/umask/-/umask-1.1.0.tgz#f29cebf01df517912bb58ff9c4e50fde8e33320d"
integrity sha1-8pzr8B31F5ErtY/5xOUP3o4zMg0=
unbox-primitive@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471"
integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==
dependencies:
function-bind "^1.1.1"
has-bigints "^1.0.1"
has-symbols "^1.0.2"
which-boxed-primitive "^1.0.2"
union-value@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847"
integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==
dependencies:
arr-union "^3.1.0"
get-value "^2.0.6"
is-extendable "^0.1.1"
set-value "^2.0.1"
uniq@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff"
integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=
uniqs@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02"
integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI=
unique-filename@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230"
integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==
dependencies:
unique-slug "^2.0.0"
unique-slug@^2.0.0:
version "2.0.2"
resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c"
integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==
dependencies:
imurmurhash "^0.1.4"
unique-string@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a"
integrity sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=
dependencies:
crypto-random-string "^1.0.0"
universalify@^0.1.0:
version "0.1.2"
resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
unpipe@1.0.0, unpipe@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=
unset-value@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"
integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=
dependencies:
has-value "^0.3.1"
isobject "^3.0.0"
unzip-response@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97"
integrity sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=
upath@^1.1.1:
version "1.2.0"
resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894"
integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==
update-notifier@^2.2.0, update-notifier@^2.3.0, update-notifier@^2.5.0:
version "2.5.0"
resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6"
integrity sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==
dependencies:
boxen "^1.2.1"
chalk "^2.0.1"
configstore "^3.0.0"
import-lazy "^2.1.0"
is-ci "^1.0.10"
is-installed-globally "^0.1.0"
is-npm "^1.0.0"
latest-version "^3.0.0"
semver-diff "^2.0.0"
xdg-basedir "^3.0.0"
uri-js@^4.2.2:
version "4.4.1"
resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"
integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
dependencies:
punycode "^2.1.0"
urix@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=
url-loader@^0.6.2:
version "0.6.2"
resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-0.6.2.tgz#a007a7109620e9d988d14bce677a1decb9a993f7"
integrity sha512-h3qf9TNn53BpuXTTcpC+UehiRrl0Cv45Yr/xWayApjw6G8Bg2dGke7rIwDQ39piciWCWrC+WiqLjOh3SUp9n0Q==
dependencies:
loader-utils "^1.0.2"
mime "^1.4.1"
schema-utils "^0.3.0"
url-parse-lax@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73"
integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=
dependencies:
prepend-http "^1.0.1"
url@^0.11.0:
version "0.11.0"
resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=
dependencies:
punycode "1.3.2"
querystring "0.2.0"
use@^3.1.0:
version "3.1.1"
resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==
user-home@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f"
integrity sha1-nHC/2Babwdy/SGBODwS4tJzenp8=
dependencies:
os-homedir "^1.0.0"
util-deprecate@^1.0.1, util-deprecate@~1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
util-extend@^1.0.1:
version "1.0.3"
resolved "https://registry.yarnpkg.com/util-extend/-/util-extend-1.0.3.tgz#a7c216d267545169637b3b6edc6ca9119e2ff93f"
integrity sha1-p8IW0mdUUWljeztu3GypEZ4v+T8=
util-promisify@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/util-promisify/-/util-promisify-2.1.0.tgz#3c2236476c4d32c5ff3c47002add7c13b9a82a53"
integrity sha1-PCI2R2xNMsX/PEcAKt18E7moKlM=
dependencies:
object.getownpropertydescriptors "^2.0.3"
util@0.10.3:
version "0.10.3"
resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9"
integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk=
dependencies:
inherits "2.0.1"
util@^0.10.3:
version "0.10.4"
resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901"
integrity sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==
dependencies:
inherits "2.0.3"
util@^0.11.0:
version "0.11.1"
resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61"
integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==
dependencies:
inherits "2.0.3"
utils-merge@1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=
uuid@^3.3.2, uuid@^3.3.3:
version "3.4.0"
resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"
integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==
validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.4:
version "3.0.4"
resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a"
integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==
dependencies:
spdx-correct "^3.0.0"
spdx-expression-parse "^3.0.0"
validate-npm-package-name@^3.0.0, validate-npm-package-name@~3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e"
integrity sha1-X6kS2B630MdK/BQN5zF/DKffQ34=
dependencies:
builtins "^1.0.3"
vary@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=
vendors@^1.0.0:
version "1.0.4"
resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e"
integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==
verror@1.10.0:
version "1.10.0"
resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=
dependencies:
assert-plus "^1.0.0"
core-util-is "1.0.2"
extsprintf "^1.2.0"
vm-browserify@^1.0.1:
version "1.1.2"
resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0"
integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==
watchpack-chokidar2@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz#38500072ee6ece66f3769936950ea1771be1c957"
integrity sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==
dependencies:
chokidar "^2.1.8"
watchpack@^1.3.1:
version "1.7.5"
resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.5.tgz#1267e6c55e0b9b5be44c2023aed5437a2c26c453"
integrity sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==
dependencies:
graceful-fs "^4.1.2"
neo-async "^2.5.0"
optionalDependencies:
chokidar "^3.4.1"
watchpack-chokidar2 "^2.0.1"
wcwidth@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8"
integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=
dependencies:
defaults "^1.0.3"
webpack-bundle-analyzer@^3.6.0:
version "3.9.0"
resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.9.0.tgz#f6f94db108fb574e415ad313de41a2707d33ef3c"
integrity sha512-Ob8amZfCm3rMB1ScjQVlbYYUEJyEjdEtQ92jqiFUYt5VkEeO2v5UMbv49P/gnmCZm3A6yaFQzCBvpZqN4MUsdA==
dependencies:
acorn "^7.1.1"
acorn-walk "^7.1.1"
bfj "^6.1.1"
chalk "^2.4.1"
commander "^2.18.0"
ejs "^2.6.1"
express "^4.16.3"
filesize "^3.6.1"
gzip-size "^5.0.0"
lodash "^4.17.19"
mkdirp "^0.5.1"
opener "^1.5.1"
ws "^6.0.0"
webpack-sources@^1.0.1:
version "1.4.3"
resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933"
integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==
dependencies:
source-list-map "^2.0.0"
source-map "~0.6.1"
webpack@^2.6.1:
version "2.7.0"
resolved "https://registry.yarnpkg.com/webpack/-/webpack-2.7.0.tgz#b2a1226804373ffd3d03ea9c6bd525067034f6b1"
integrity sha512-MjAA0ZqO1ba7ZQJRnoCdbM56mmFpipOPUv/vQpwwfSI42p5PVDdoiuK2AL2FwFUVgT859Jr43bFZXRg/LNsqvg==
dependencies:
acorn "^5.0.0"
acorn-dynamic-import "^2.0.0"
ajv "^4.7.0"
ajv-keywords "^1.1.1"
async "^2.1.2"
enhanced-resolve "^3.3.0"
interpret "^1.0.0"
json-loader "^0.5.4"
json5 "^0.5.1"
loader-runner "^2.3.0"
loader-utils "^0.2.16"
memory-fs "~0.4.1"
mkdirp "~0.5.0"
node-libs-browser "^2.0.0"
source-map "^0.5.3"
supports-color "^3.1.0"
tapable "~0.2.5"
uglify-js "^2.8.27"
watchpack "^1.3.1"
webpack-sources "^1.0.1"
yargs "^6.0.0"
whet.extend@~0.9.9:
version "0.9.9"
resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1"
integrity sha1-+HfVv2SMl+WqVC+twW1qJZucEaE=
which-boxed-primitive@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6"
integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==
dependencies:
is-bigint "^1.0.1"
is-boolean-object "^1.1.0"
is-number-object "^1.0.4"
is-string "^1.0.5"
is-symbol "^1.0.3"
which-module@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f"
integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=
which-module@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=
which@1, which@^1.2.9, which@^1.3.0, which@^1.3.1:
version "1.3.1"
resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
dependencies:
isexe "^2.0.0"
wide-align@^1.1.0:
version "1.1.5"
resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3"
integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==
dependencies:
string-width "^1.0.2 || 2 || 3 || 4"
widest-line@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc"
integrity sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==
dependencies:
string-width "^2.1.1"
window-size@0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d"
integrity sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=
word-wrap@~1.2.3:
version "1.2.3"
resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==
wordwrap@0.0.2:
version "0.0.2"
resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f"
integrity sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=
worker-farm@^1.6.0, worker-farm@^1.7.0:
version "1.7.0"
resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8"
integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==
dependencies:
errno "~0.1.7"
wrap-ansi@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=
dependencies:
string-width "^1.0.1"
strip-ansi "^3.0.1"
wrap-ansi@^5.1.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09"
integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==
dependencies:
ansi-styles "^3.2.0"
string-width "^3.0.0"
strip-ansi "^5.0.0"
wrap-ansi@^6.2.0:
version "6.2.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53"
integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==
dependencies:
ansi-styles "^4.0.0"
string-width "^4.1.0"
strip-ansi "^6.0.0"
wrappy@1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
write-file-atomic@^2.0.0, write-file-atomic@^2.3.0, write-file-atomic@^2.4.3:
version "2.4.3"
resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481"
integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==
dependencies:
graceful-fs "^4.1.11"
imurmurhash "^0.1.4"
signal-exit "^3.0.2"
write@^0.2.1:
version "0.2.1"
resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757"
integrity sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=
dependencies:
mkdirp "^0.5.1"
ws@^6.0.0:
version "6.2.2"
resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.2.tgz#dd5cdbd57a9979916097652d78f1cc5faea0c32e"
integrity sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==
dependencies:
async-limiter "~1.0.0"
xdg-basedir@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4"
integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=
xtend@^4.0.0, xtend@~4.0.1:
version "4.0.2"
resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
y18n@^3.2.1:
version "3.2.2"
resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.2.tgz#85c901bd6470ce71fc4bb723ad209b70f7f28696"
integrity sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==
y18n@^4.0.0:
version "4.0.3"
resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf"
integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==
yallist@^2.1.2:
version "2.1.2"
resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=
yallist@^3.0.0, yallist@^3.0.2, yallist@^3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
yargs-parser@^13.1.2:
version "13.1.2"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38"
integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==
dependencies:
camelcase "^5.0.0"
decamelize "^1.2.0"
yargs-parser@^15.0.1:
version "15.0.3"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-15.0.3.tgz#316e263d5febe8b38eef61ac092b33dfcc9b1115"
integrity sha512-/MVEVjTXy/cGAjdtQf8dW3V9b97bPN7rNn8ETj6BmAQL7ibC7O1Q9SPJbGjgh3SlwoBNXMzj/ZGIj8mBgl12YA==
dependencies:
camelcase "^5.0.0"
decamelize "^1.2.0"
yargs-parser@^18.1.2:
version "18.1.3"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0"
integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==
dependencies:
camelcase "^5.0.0"
decamelize "^1.2.0"
yargs-parser@^4.2.0:
version "4.2.1"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c"
integrity sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=
dependencies:
camelcase "^3.0.0"
yargs-parser@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9"
integrity sha1-jQrELxbqVd69MyyvTEA4s+P139k=
dependencies:
camelcase "^4.1.0"
yargs@^13.3.2:
version "13.3.2"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd"
integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==
dependencies:
cliui "^5.0.0"
find-up "^3.0.0"
get-caller-file "^2.0.1"
require-directory "^2.1.1"
require-main-filename "^2.0.0"
set-blocking "^2.0.0"
string-width "^3.0.0"
which-module "^2.0.0"
y18n "^4.0.0"
yargs-parser "^13.1.2"
yargs@^14.2.3:
version "14.2.3"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-14.2.3.tgz#1a1c3edced1afb2a2fea33604bc6d1d8d688a414"
integrity sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==
dependencies:
cliui "^5.0.0"
decamelize "^1.2.0"
find-up "^3.0.0"
get-caller-file "^2.0.1"
require-directory "^2.1.1"
require-main-filename "^2.0.0"
set-blocking "^2.0.0"
string-width "^3.0.0"
which-module "^2.0.0"
y18n "^4.0.0"
yargs-parser "^15.0.1"
yargs@^15.4.1:
version "15.4.1"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8"
integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==
dependencies:
cliui "^6.0.0"
decamelize "^1.2.0"
find-up "^4.1.0"
get-caller-file "^2.0.1"
require-directory "^2.1.1"
require-main-filename "^2.0.0"
set-blocking "^2.0.0"
string-width "^4.2.0"
which-module "^2.0.0"
y18n "^4.0.0"
yargs-parser "^18.1.2"
yargs@^6.0.0:
version "6.6.0"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208"
integrity sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=
dependencies:
camelcase "^3.0.0"
cliui "^3.2.0"
decamelize "^1.1.1"
get-caller-file "^1.0.1"
os-locale "^1.4.0"
read-pkg-up "^1.0.1"
require-directory "^2.1.1"
require-main-filename "^1.0.1"
set-blocking "^2.0.0"
string-width "^1.0.2"
which-module "^1.0.0"
y18n "^3.2.1"
yargs-parser "^4.2.0"
yargs@^8.0.2:
version "8.0.2"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360"
integrity sha1-YpmpBVsc78lp/355wdkY3Osiw2A=
dependencies:
camelcase "^4.1.0"
cliui "^3.2.0"
decamelize "^1.1.1"
get-caller-file "^1.0.1"
os-locale "^2.0.0"
read-pkg-up "^2.0.0"
require-directory "^2.1.1"
require-main-filename "^1.0.1"
set-blocking "^2.0.0"
string-width "^2.0.0"
which-module "^2.0.0"
y18n "^3.2.1"
yargs-parser "^7.0.0"
yargs@~3.10.0:
version "3.10.0"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1"
integrity sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=
dependencies:
camelcase "^1.0.2"
cliui "^2.1.0"
decamelize "^1.0.0"
window-size "0.1.0"